ruby-prawn-1.0.0~rc2.orig/0000755000000000000000000000000012114176157014065 5ustar rootrootruby-prawn-1.0.0~rc2.orig/spec/0000755000000000000000000000000012114176157015017 5ustar rootrootruby-prawn-1.0.0~rc2.orig/spec/outline_spec.rb0000644000000000000000000003215312114176157020041 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "Outline" do before(:each) do @pdf = Prawn::Document.new() do text "Page 1. This is the first Chapter. " start_new_page text "Page 2. More in the first Chapter. " start_new_page outline.define do section 'Chapter 1', :destination => 1, :closed => true do page :destination => 1, :title => 'Page 1' page :destination => 2, :title => 'Page 2' end end end end if RUBY_VERSION >= "1.9" describe "outline encoding" do it "should store all outline titles as UTF-16" do render_and_find_objects @hash.values.each do |obj| if obj.is_a?(Hash) && obj[:Title] title = obj[:Title].dup title.force_encoding("UTF-16LE") title.valid_encoding?.should == true end end end end end describe "#generate_outline" do before(:each) do render_and_find_objects end it "should create a root outline dictionary item" do @outline_root.should_not be_nil end it "should set the first and last top items of the root outline dictionary item" do referenced_object(@outline_root[:First]).should == @section_1 referenced_object(@outline_root[:Last]).should == @section_1 end describe "#create_outline_item" do it "should create outline items for each section and page" do [@section_1, @page_1, @page_2].each {|item| item.should_not be_nil} end end describe "#set_relations, #set_variables_for_block, and #reset_parent" do it "should link sibling items" do referenced_object(@page_1[:Next]).should == @page_2 referenced_object(@page_2[:Prev]).should == @page_1 end it "should link child items to parent item" do [@page_1, @page_2].each {|page| referenced_object(page[:Parent]).should == @section_1 } end it "should set the first and last child items for parent item" do referenced_object(@section_1[:First]).should == @page_1 referenced_object(@section_1[:Last]).should == @page_2 end end describe "#increase_count" do it "should add the count of all descendant items" do @outline_root[:Count].should == 3 @section_1[:Count].abs.should == 2 @page_1[:Count].should == 0 @page_2[:Count].should == 0 end end describe "closed option" do it "should set the item's integer count to negative" do @section_1[:Count].should == -2 end end end describe "addding a section later with outline#section" do before(:each) do @pdf.start_new_page @pdf.text "Page 3. An added section " @pdf.outline.update do section 'Added Section', :destination => 3 do page :destination => 3, :title => 'Page 3' end end render_and_find_objects end it "should add new outline items to document" do [@section_2, @page_3].each { |item| item.should_not be_nil} end it "should reset the last items for root outline dictionary" do referenced_object(@outline_root[:First]).should == @section_1 referenced_object(@outline_root[:Last]).should == @section_2 end it "should reset the next relation for the previous last top level item" do referenced_object(@section_1[:Next]).should == @section_2 end it "should set the previous relation of the addded to section" do referenced_object(@section_2[:Prev]).should == @section_1 end it "should increase the count of root outline dictionary" do @outline_root[:Count].should == 5 end end describe "#outline.add_subsection_to" do context "positioned last" do before(:each) do @pdf.start_new_page @pdf.text "Page 3. An added subsection " @pdf.outline.update do add_subsection_to 'Chapter 1' do section 'Added SubSection', :destination => 3 do page :destination => 3, :title => 'Added Page 3' end end end render_and_find_objects end it "should add new outline items to document" do [@subsection, @added_page_3].each { |item| item.should_not be_nil} end it "should reset the last item for parent item dictionary" do referenced_object(@section_1[:First]).should == @page_1 referenced_object(@section_1[:Last]).should == @subsection end it "should set the prev relation for the new subsection to its parent's old last item" do referenced_object(@subsection[:Prev]).should == @page_2 end it "the subsection should become the next relation for its parent's old last item" do referenced_object(@page_2[:Next]).should == @subsection end it "should set the first relation for the new subsection" do referenced_object(@subsection[:First]).should == @added_page_3 end it "should set the correct last relation of the added to section" do referenced_object(@subsection[:Last]).should == @added_page_3 end it "should increase the count of root outline dictionary" do @outline_root[:Count].should == 5 end end context "positioned first" do before(:each) do @pdf.start_new_page @pdf.text "Page 3. An added subsection " @pdf.outline.update do add_subsection_to 'Chapter 1', :first do section 'Added SubSection', :destination => 3 do page :destination => 3, :title => 'Added Page 3' end end end render_and_find_objects end it "should add new outline items to document" do [@subsection, @added_page_3].each { |item| item.should_not be_nil} end it "should reset the first item for parent item dictionary" do referenced_object(@section_1[:First]).should == @subsection referenced_object(@section_1[:Last]).should == @page_2 end it "should set the next relation for the new subsection to its parent's old first item" do referenced_object(@subsection[:Next]).should == @page_1 end it "the subsection should become the prev relation for its parent's old first item" do referenced_object(@page_1[:Prev]).should == @subsection end it "should set the first relation for the new subsection" do referenced_object(@subsection[:First]).should == @added_page_3 end it "should set the correct last relation of the added to section" do referenced_object(@subsection[:Last]).should == @added_page_3 end it "should increase the count of root outline dictionary" do @outline_root[:Count].should == 5 end end it "should require an existing title" do lambda do @pdf.go_to_page 1 @pdf.start_new_page @pdf.text "Inserted Page" @pdf.outline.update do add_subsection_to 'Wrong page' do page page_number, :title => "Inserted Page" end end render_and_find_objects end.should raise_error(Prawn::Errors::UnknownOutlineTitle) end end describe "#outline.insert_section_after" do describe "inserting in the middle of another section" do before(:each) do @pdf.go_to_page 1 @pdf.start_new_page @pdf.text "Inserted Page" @pdf.outline.update do insert_section_after 'Page 1' do page :destination => page_number, :title => "Inserted Page" end end end it "should insert new outline items to document" do render_and_find_objects @inserted_page.should_not be_nil end it "should adjust the count of all ancestors" do render_and_find_objects @outline_root[:Count].should == 4 @section_1[:Count].abs.should == 3 end describe "#adjust_relations" do it "should reset the sibling relations of adjoining items to inserted item" do render_and_find_objects referenced_object(@page_1[:Next]).should == @inserted_page referenced_object(@page_2[:Prev]).should == @inserted_page end it "should set the sibling relation of added item to adjoining items" do render_and_find_objects referenced_object(@inserted_page[:Next]).should == @page_2 referenced_object(@inserted_page[:Prev]).should == @page_1 end it "should not affect the first and last relations of parent item" do render_and_find_objects referenced_object(@section_1[:First]).should == @page_1 referenced_object(@section_1[:Last]).should == @page_2 end end context "when adding another section afterwards" do it "should have reset the root position so that a new section is added at the end of root sections" do @pdf.start_new_page @pdf.text "Another Inserted Page" @pdf.outline.update do section 'Added Section' do page :destination => page_number, :title => "Inserted Page" end end render_and_find_objects referenced_object(@outline_root[:Last]).should == @section_2 referenced_object(@section_1[:Next]).should == @section_2 end end end describe "inserting at the end of another section" do before(:each) do @pdf.go_to_page 2 @pdf.start_new_page @pdf.text "Inserted Page" @pdf.outline.update do insert_section_after 'Page 2' do page :destination => page_number, :title => "Inserted Page" end end render_and_find_objects end describe "#adjust_relations" do it "should reset the sibling relations of adjoining item to inserted item" do referenced_object(@page_2[:Next]).should == @inserted_page end it "should set the sibling relation of added item to adjoining items" do referenced_object(@inserted_page[:Next]).should be_nil referenced_object(@inserted_page[:Prev]).should == @page_2 end it "should adjust the last relation of parent item" do referenced_object(@section_1[:Last]).should == @inserted_page end end end it "should require an existing title" do lambda do @pdf.go_to_page 1 @pdf.start_new_page @pdf.text "Inserted Page" @pdf.outline.update do insert_section_after 'Wrong page' do page :destination => page_number, :title => "Inserted Page" end end render_and_find_objects end.should raise_error(Prawn::Errors::UnknownOutlineTitle) end end describe "#page" do it "should require a title option to be set" do lambda do @pdf = Prawn::Document.new() do text "Page 1. This is the first Chapter. " outline.define do page :destination => 1, :title => nil end end end.should raise_error(Prawn::Errors::RequiredOption) end end end describe "foreign character encoding" do before(:each) do pdf = Prawn::Document.new() do outline.define do section 'La pomme croquée', :destination => 1, :closed => true end end @hash = PDF::Reader::ObjectHash.new(StringIO.new(pdf.render, 'r+')) end it "should handle other encodings for the title" do object = find_by_title('La pomme croquée') object.should_not == nil end end describe "with optimize_objects option" do before(:each) do @pdf = Prawn::Document.new(:optimize_objects => true) do outline.define do section 'Chapter 1', :destination => 1, :closed => true do page :destination => 1, :title => 'Page 1' end end end render_and_find_objects end it "should generate an outline" do @section_1.should_not be_nil @page_1.should_not be_nil end end def render_and_find_objects output = StringIO.new(@pdf.render, 'r+') @hash = PDF::Reader::ObjectHash.new(output) @outline_root = @hash.values.find {|obj| obj.is_a?(Hash) && obj[:Type] == :Outlines} @pages = @hash.values.find {|obj| obj.is_a?(Hash) && obj[:Type] == :Pages}[:Kids] @section_1 = find_by_title('Chapter 1') @page_1 = find_by_title('Page 1') @page_2 = find_by_title('Page 2') @section_2 = find_by_title('Added Section') @page_3 = find_by_title('Page 3') @inserted_page = find_by_title('Inserted Page') @subsection = find_by_title('Added SubSection') @added_page_3 = find_by_title('Added Page 3') end # Outline titles are stored as UTF-16. This method accepts a UTF-8 outline title # and returns the PDF Object that contains an outline with that name def find_by_title(title) @hash.values.find {|obj| if obj.is_a?(Hash) && obj[:Title] title_codepoints = obj[:Title].unpack("n*") title_codepoints.shift utf8_title = title_codepoints.pack("U*") utf8_title == title ? obj : nil end } end def referenced_object(reference) @hash[reference] end ruby-prawn-1.0.0~rc2.orig/spec/formatted_text_box_spec.rb0000644000000000000000000005761412114176157022274 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "Text::Formatted::Box wrapping" do before(:each) do create_pdf end it "should not wrap between two fragments" do texts = [ {:text => "Hello "}, {:text => "World"}, {:text => "2", :styles => [:superscript]}, ] text_box = Prawn::Text::Formatted::Box.new(texts, :document => @pdf, :width => @pdf.width_of("Hello World")) text_box.render text_box.text.should == "Hello\nWorld2" end it "should_not raise_error Encoding::CompatibilityError when keeping a TTF and an " + "AFM font together" do ruby_19 do file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf" @pdf.font_families["Kai"] = { :normal => { :file => file, :font => "Kai" } } texts = [{ :text => "Hello " }, { :text => "再见", :font => "Kai"}, { :text => "World" }] text_box = Prawn::Text::Formatted::Box.new(texts, :document => @pdf, :width => @pdf.width_of("Hello World")) lambda { text_box.render }.should_not raise_error(Encoding::CompatibilityError) end end it "should wrap between two fragments when the preceding fragment ends with white space" do texts = [ {:text => "Hello "}, {:text => "World "}, {:text => "2", :styles => [:superscript]}, ] text_box = Prawn::Text::Formatted::Box.new(texts, :document => @pdf, :width => @pdf.width_of("Hello World")) text_box.render text_box.text.should == "Hello World\n2" texts = [ {:text => "Hello "}, {:text => "World\n"}, {:text => "2", :styles => [:superscript]}, ] text_box = Prawn::Text::Formatted::Box.new(texts, :document => @pdf, :width => @pdf.width_of("Hello World")) text_box.render text_box.text.should == "Hello World\n2" end it "should wrap between two fragments when the final fragment begins with white space" do texts = [ {:text => "Hello "}, {:text => "World"}, {:text => " 2", :styles => [:superscript]}, ] text_box = Prawn::Text::Formatted::Box.new(texts, :document => @pdf, :width => @pdf.width_of("Hello World")) text_box.render text_box.text.should == "Hello World\n2" texts = [ {:text => "Hello "}, {:text => "World"}, {:text => "\n2", :styles => [:superscript]}, ] text_box = Prawn::Text::Formatted::Box.new(texts, :document => @pdf, :width => @pdf.width_of("Hello World")) text_box.render text_box.text.should == "Hello World\n2" end it "should properly handle empty slices using default encoding" do texts = [{ :text => "Noua Delineatio Geographica generalis | Apostolicarum peregrinationum | S FRANCISCI XAUERII | Indiarum & Iaponiæ Apostoli", :font => 'Courier', :size => 10 }] text_box = Prawn::Text::Formatted::Box.new(texts, :document => @pdf, :width => @pdf.width_of("Noua Delineatio Geographica gen")) lambda { text_box.render }.should_not raise_error text_box.text.should == "Noua Delineatio Geographica\ngeneralis | Apostolicarum\nperegrinationum | S FRANCISCI\nXAUERII | Indiarum & Iaponi\346\nApostoli" end describe "Unicode" do before do if RUBY_VERSION < '1.9' @reset_value = $KCODE $KCODE='u' else @reset_value = [Encoding.default_external, Encoding.default_internal] Encoding.default_external = Encoding::UTF_8 Encoding.default_internal = Encoding::UTF_8 end end after do if RUBY_VERSION < '1.9' $KCODE=@reset_value else Encoding.default_external = @reset_value[0] Encoding.default_internal = @reset_value[1] end end it "should properly handle empty slices using Unicode encoding" do texts = [{ :text => "Noua Delineatio Geographica generalis | Apostolicarum peregrinationum | S FRANCISCI XAUERII | Indiarum & Iaponiæ Apostoli", :font => 'Courier', :size => 10 }] text_box = Prawn::Text::Formatted::Box.new(texts, :document => @pdf, :width => @pdf.width_of("Noua Delineatio Geographica gen")) lambda { text_box.render }.should_not raise_error text_box.text.should == "Noua Delineatio Geographica\ngeneralis | Apostolicarum\nperegrinationum | S FRANCISCI\nXAUERII | Indiarum & Iaponi\346\nApostoli" end end end describe "Text::Formatted::Box with :fallback_fonts option that includes" + "a Chinese font and set of Chinese glyphs not in the current font" do it "should change the font to the Chinese font for the Chinese glyphs" do create_pdf file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf" @pdf.font_families["Kai"] = { :normal => { :file => file, :font => "Kai" } } formatted_text = [{ :text => "hello你好" }, { :text => "再见goodbye" }] @pdf.formatted_text_box(formatted_text, :fallback_fonts => ["Kai"]) text = PDF::Inspector::Text.analyze(@pdf.render) fonts_used = text.font_settings.map { |e| e[:name] } fonts_used.length.should == 4 fonts_used[0].should == :"Helvetica" fonts_used[1].to_s.should =~ /GBZenKai-Medium/ fonts_used[2].to_s.should =~ /GBZenKai-Medium/ fonts_used[3].should == :"Helvetica" text.strings[0].should == "hello" text.strings[1].should == "你好" text.strings[2].should == "再见" text.strings[3].should == "goodbye" end end describe "Text::Formatted::Box with :fallback_fonts option that includes" + "an AFM font and Win-Ansi glyph not in the current Chinese font" do it "should change the font to the AFM font for the Win-Ansi glyph" do create_pdf file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf" @pdf.font_families["Kai"] = { :normal => { :file => file, :font => "Kai" } } @pdf.font("Kai") formatted_text = [{ :text => "hello你好" }, { :text => "再见€" }] @pdf.formatted_text_box(formatted_text, :fallback_fonts => ["Helvetica"]) text = PDF::Inspector::Text.analyze(@pdf.render) fonts_used = text.font_settings.map { |e| e[:name] } fonts_used.length.should == 4 fonts_used[0].to_s.should =~ /GBZenKai-Medium/ fonts_used[1].to_s.should =~ /GBZenKai-Medium/ fonts_used[2].to_s.should =~ /GBZenKai-Medium/ fonts_used[3].should == :"Helvetica" text.strings[0].should == "hello" text.strings[1].should == "你好" text.strings[2].should == "再见" text.strings[3].should == "€" end end describe "Text::Formatted::Box with :fallback_fonts option and fragment " + "level font" do it "should use the fragment level font except for glyphs not in that font" do create_pdf file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf" @pdf.font_families["Kai"] = { :normal => { :file => file, :font => "Kai" } } formatted_text = [{ :text => "hello你好" }, { :text => "再见goodbye", :font => "Times-Roman" }] @pdf.formatted_text_box(formatted_text, :fallback_fonts => ["Kai"]) text = PDF::Inspector::Text.analyze(@pdf.render) fonts_used = text.font_settings.map { |e| e[:name] } fonts_used.length.should == 4 fonts_used[0].should == :"Helvetica" fonts_used[1].to_s.should =~ /GBZenKai-Medium/ fonts_used[2].to_s.should =~ /GBZenKai-Medium/ fonts_used[3].should == :"Times-Roman" text.strings[0].should == "hello" text.strings[1].should == "你好" text.strings[2].should == "再见" text.strings[3].should == "goodbye" end end describe "Text::Formatted::Box" do before(:each) do create_pdf file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf" @pdf.font_families["Kai"] = { :normal => { :file => file, :font => "Kai" } } @formatted_text = [{ :text => "hello你好" }] @pdf.fallback_fonts(["Kai"]) @pdf.fallback_fonts = ["Kai"] end it "#fallback_fonts should return the document-wide fallback fonts" do @pdf.fallback_fonts.should == ["Kai"] end it "should be able to set text fallback_fonts document-wide" do @pdf.formatted_text_box(@formatted_text) text = PDF::Inspector::Text.analyze(@pdf.render) fonts_used = text.font_settings.map { |e| e[:name] } fonts_used.length.should == 2 fonts_used[0].should == :"Helvetica" fonts_used[1].to_s.should =~ /GBZenKai-Medium/ end it "should be able to override document-wide fallback_fonts" do @pdf.formatted_text_box(@formatted_text, :fallback_fonts => ["Courier"]) text = PDF::Inspector::Text.analyze(@pdf.render) fonts_used = text.font_settings.map { |e| e[:name] } fonts_used.length.should == 1 fonts_used[0].should == :"Helvetica" end it "should omit the fallback fonts overhead when passing an empty array " + "as the :fallback_fonts" do box = Prawn::Text::Formatted::Box.new(@formatted_text, :document => @pdf, :fallback_fonts => []) box.expects(:process_fallback_fonts).never box.render end it "should be able to clear document-wide fallback_fonts" do @pdf.fallback_fonts([]) box = Prawn::Text::Formatted::Box.new(@formatted_text, :document => @pdf) box.expects(:process_fallback_fonts).never box.render end end describe "Text::Formatted::Box with :fallback_fonts option " + "with glyphs not in the primary or the fallback fonts" do it "should use the primary font" do create_pdf formatted_text = [{ :text => "hello world. 世界你好。" }] @pdf.formatted_text_box(formatted_text, :fallback_fonts => ["Helvetica"]) text = PDF::Inspector::Text.analyze(@pdf.render) fonts_used = text.font_settings.map { |e| e[:name] } fonts_used.length.should == 1 fonts_used[0].should == :"Helvetica" end end describe "Text::Formatted::Box#extensions" do it "should be able to override default line wrapping" do create_pdf Prawn::Text::Formatted::Box.extensions << TestFormattedWrapOverride @pdf.formatted_text_box([{ :text => "hello world" }], {}) Prawn::Text::Formatted::Box.extensions.delete(TestFormattedWrapOverride) text = PDF::Inspector::Text.analyze(@pdf.render) text.strings[0].should == "all your base are belong to us" end it "overriding Text::Formatted::Box line wrapping should not affect " + "Text::Box wrapping" do create_pdf Prawn::Text::Formatted::Box.extensions << TestFormattedWrapOverride @pdf.text_box("hello world", {}) Prawn::Text::Formatted::Box.extensions.delete(TestFormattedWrapOverride) text = PDF::Inspector::Text.analyze(@pdf.render) text.strings[0].should == "hello world" end it "overriding Text::Box line wrapping should override Text::Box wrapping" do create_pdf Prawn::Text::Box.extensions << TestFormattedWrapOverride @pdf.text_box("hello world", {}) Prawn::Text::Box.extensions.delete(TestFormattedWrapOverride) text = PDF::Inspector::Text.analyze(@pdf.render) text.strings[0].should == "all your base are belong to us" end end describe "Text::Formatted::Box#render" do it "should handle newlines" do create_pdf array = [{ :text => "hello\nworld"}] options = { :document => @pdf } text_box = Prawn::Text::Formatted::Box.new(array, options) text_box.render text_box.text.should == "hello\nworld" end it "should omit spaces from the beginning of the line" do create_pdf array = [{ :text => " hello\n world"}] options = { :document => @pdf } text_box = Prawn::Text::Formatted::Box.new(array, options) text_box.render text_box.text.should == "hello\nworld" end it "should be okay printing a line of whitespace" do create_pdf array = [{ :text => "hello\n \nworld"}] options = { :document => @pdf } text_box = Prawn::Text::Formatted::Box.new(array, options) text_box.render text_box.text.should == "hello\n\nworld" array = [{ :text => "hello" + " " * 500}, { :text => " " * 500 }, { :text => " " * 500 + "\n"}, { :text => "world"}] options = { :document => @pdf } text_box = Prawn::Text::Formatted::Box.new(array, options) text_box.render text_box.text.should == "hello\n\nworld" end it "should enable fragment level direction setting" do create_pdf number_of_hellos = 18 array = [ { :text => "hello " * number_of_hellos }, { :text => "world", :direction => :ltr }, { :text => ", how are you?" } ] options = { :document => @pdf, :direction => :rtl } text_box = Prawn::Text::Formatted::Box.new(array, options) text_box.render text = PDF::Inspector::Text.analyze(@pdf.render) text.strings[0].should == "era woh ," text.strings[1].should == "world" text.strings[2].should == " olleh" * number_of_hellos text.strings[3].should == "?uoy" end end describe "Text::Formatted::Box#render" do it "should be able to perform fragment callbacks" do create_pdf callback_object = TestFragmentCallback.new("something", 7, :document => @pdf) callback_object.expects(:render_behind).with( kind_of(Prawn::Text::Formatted::Fragment)) callback_object.expects(:render_in_front).with( kind_of(Prawn::Text::Formatted::Fragment)) array = [{ :text => "hello world " }, { :text => "callback now", :callback => callback_object }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render end it "should be able to perform fragment callbacks on multiple objects" do create_pdf callback_object = TestFragmentCallback.new("something", 7, :document => @pdf) callback_object.expects(:render_behind).with( kind_of(Prawn::Text::Formatted::Fragment)) callback_object.expects(:render_in_front).with( kind_of(Prawn::Text::Formatted::Fragment)) callback_object2 = TestFragmentCallback.new("something else", 14, :document => @pdf) callback_object2.expects(:render_behind).with( kind_of(Prawn::Text::Formatted::Fragment)) callback_object2.expects(:render_in_front).with( kind_of(Prawn::Text::Formatted::Fragment)) array = [{ :text => "hello world " }, { :text => "callback now", :callback => [callback_object, callback_object2] }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render end it "fragment callbacks should be able to define only the callback they need" do create_pdf behind = TestFragmentCallbackBehind.new("something", 7, :document => @pdf) in_front = TestFragmentCallbackInFront.new("something", 7, :document => @pdf) array = [{ :text => "hello world " }, { :text => "callback now", :callback => [behind, in_front] }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) lambda { text_box.render }.should_not raise_error(NoMethodError) end it "should be able to set the font" do create_pdf array = [{ :text => "this contains " }, { :text => "Times-Bold", :styles => [:bold], :font => "Times-Roman" }, { :text => " text" }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render contents = PDF::Inspector::Text.analyze(@pdf.render) fonts = contents.font_settings.map { |e| e[:name] } fonts.should == [:Helvetica, :"Times-Bold", :Helvetica] contents.strings[0].should == "this contains " contents.strings[1].should == "Times-Bold" contents.strings[2].should == " text" end it "should be able to set bold" do create_pdf array = [{ :text => "this contains " }, { :text => "bold", :styles => [:bold] }, { :text => " text" }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render contents = PDF::Inspector::Text.analyze(@pdf.render) fonts = contents.font_settings.map { |e| e[:name] } fonts.should == [:Helvetica, :"Helvetica-Bold", :Helvetica] contents.strings[0].should == "this contains " contents.strings[1].should == "bold" contents.strings[2].should == " text" end it "should be able to set italics" do create_pdf array = [{ :text => "this contains " }, { :text => "italic", :styles => [:italic] }, { :text => " text" }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render contents = PDF::Inspector::Text.analyze(@pdf.render) fonts = contents.font_settings.map { |e| e[:name] } fonts.should == [:Helvetica, :"Helvetica-Oblique", :Helvetica] end it "should be able to set subscript" do create_pdf array = [{ :text => "this contains " }, { :text => "subscript", :size => 18, :styles => [:subscript] }, { :text => " text" }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render contents = PDF::Inspector::Text.analyze(@pdf.render) contents.font_settings[0][:size].should == 12 contents.font_settings[1][:size].should be_within(0.0001).of(18 * 0.583) end it "should be able to set superscript" do create_pdf array = [{ :text => "this contains " }, { :text => "superscript", :size => 18, :styles => [:superscript] }, { :text => " text" }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render contents = PDF::Inspector::Text.analyze(@pdf.render) contents.font_settings[0][:size].should == 12 contents.font_settings[1][:size].should be_within(0.0001).of(18 * 0.583) end it "should be able to set compound bold and italic text" do create_pdf array = [{ :text => "this contains " }, { :text => "bold italic", :styles => [:bold, :italic] }, { :text => " text" }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render contents = PDF::Inspector::Text.analyze(@pdf.render) fonts = contents.font_settings.map { |e| e[:name] } fonts.should == [:Helvetica, :"Helvetica-BoldOblique", :Helvetica] end it "should be able to underline" do create_pdf array = [{ :text => "this contains " }, { :text => "underlined", :styles => [:underline] }, { :text => " text" }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render line_drawing = PDF::Inspector::Graphics::Line.analyze(@pdf.render) line_drawing.points.length.should == 2 end it "should be able to strikethrough" do create_pdf array = [{ :text => "this contains " }, { :text => "struckthrough", :styles => [:strikethrough] }, { :text => " text" }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render line_drawing = PDF::Inspector::Graphics::Line.analyze(@pdf.render) line_drawing.points.length.should == 2 end it "should be able to add URL links" do create_pdf @pdf.expects(:link_annotation).with(kind_of(Array), :Border => [0,0,0], :A => { :Type => :Action, :S => :URI, :URI => "http://example.com" }) array = [{ :text => "click " }, { :text => "here", :link => "http://example.com" }, { :text => " to visit" }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render end it "should be able to add destination links" do create_pdf @pdf.expects(:link_annotation).with(kind_of(Array), :Border => [0,0,0], :Dest => "ToC") array = [{ :text => "Go to the " }, { :text => "Table of Contents", :anchor => "ToC" }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render end it "should be able to set font size" do create_pdf array = [{ :text => "this contains " }, { :text => "sized", :size => 24 }, { :text => " text" }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render contents = PDF::Inspector::Text.analyze(@pdf.render) contents.font_settings[0][:size].should == 12 contents.font_settings[1][:size].should == 24 end it "should set the baseline based on the tallest fragment on a given line" do create_pdf array = [{ :text => "this contains " }, { :text => "sized", :size => 24 }, { :text => " text" }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render @pdf.font_size(24) do text_box.height.should be_within(0.001).of(@pdf.font.ascender + @pdf.font.descender) end end it "should be able to set color via an rgb hex string" do create_pdf array = [{ :text => "rgb", :color => "ff0000" }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render colors = PDF::Inspector::Graphics::Color.analyze(@pdf.render) colors.fill_color_count.should == 2 colors.stroke_color_count.should == 2 end it "should be able to set color using a cmyk array" do create_pdf array = [{ :text => "cmyk", :color => [100, 0, 0, 0] }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render colors = PDF::Inspector::Graphics::Color.analyze(@pdf.render) colors.fill_color_count.should == 2 colors.stroke_color_count.should == 2 end end describe "Text::Formatted::Box#render with fragment level :character_spacing option" do it "should draw the character spacing to the document" do create_pdf array = [{ :text => "hello world", :character_spacing => 7 }] options = { :document => @pdf } text_box = Prawn::Text::Formatted::Box.new(array, options) text_box.render contents = PDF::Inspector::Text.analyze(@pdf.render) contents.character_spacing[0].should == 7 end it "should draw the character spacing to the document" do create_pdf array = [{ :text => "hello world", :font => "Courier", :character_spacing => 10 }] options = { :document => @pdf, :width => 100, :overflow => :expand } text_box = Prawn::Text::Formatted::Box.new(array, options) text_box.render text_box.text.should == "hello\nworld" end end describe "Text::Formatted::Box#render with :align => :justify" do it "should not justify the last line of a paragraph" do create_pdf array = [{ :text => "hello world " }, { :text => "\n" }, { :text => "goodbye" }] options = { :document => @pdf, :align => :justify } text_box = Prawn::Text::Formatted::Box.new(array, options) text_box.render contents = PDF::Inspector::Text.analyze(@pdf.render) contents.word_spacing.should be_empty end end class TestFragmentCallback def initialize(string, number, options) @document = options[:document] end def render_behind(fragment) end def render_in_front(fragment) end end class TestFragmentCallbackBehind def initialize(string, number, options) @document = options[:document] end def render_behind(fragment) end end class TestFragmentCallbackInFront def initialize(string, number, options) @document = options[:document] end def render_in_front(fragment) end end module TestFormattedWrapOverride def wrap(array) initialize_wrap([{ :text => 'all your base are belong to us' }]) line_to_print = @line_wrap.wrap_line(:document => @document, :kerning => @kerning, :width => 10000, :arranger => @arranger) fragment = @arranger.retrieve_fragment format_and_draw_fragment(fragment, 0, @line_wrap.width, 0) [] end end ruby-prawn-1.0.0~rc2.orig/spec/formatted_text_fragment_spec.rb0000644000000000000000000002340112114176157023272 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "Text::Formatted::Fragment#space_count" do it "should return the number of spaces in the fragment" do create_pdf format_state = { } fragment = Prawn::Text::Formatted::Fragment.new("hello world ", format_state, @pdf) fragment.space_count.should == 2 end it "should exclude trailing spaces from the count when " + ":exclude_trailing_white_space => true" do create_pdf format_state = { :exclude_trailing_white_space => true } fragment = Prawn::Text::Formatted::Fragment.new("hello world ", format_state, @pdf) fragment.space_count.should == 1 end end describe "Text::Formatted::Fragment#include_trailing_white_space!" do it "should make the fragment include trailing white space" do create_pdf format_state = { :exclude_trailing_white_space => true } fragment = Prawn::Text::Formatted::Fragment.new("hello world ", format_state, @pdf) fragment.space_count.should == 1 fragment.include_trailing_white_space! fragment.space_count.should == 2 end end describe "Text::Formatted::Fragment#text" do it "should return the fragment text" do create_pdf format_state = { } fragment = Prawn::Text::Formatted::Fragment.new("hello world ", format_state, @pdf) fragment.text.should == "hello world " end it "should return the fragment text without trailing spaces when " + ":exclude_trailing_white_space => true" do create_pdf format_state = { :exclude_trailing_white_space => true } fragment = Prawn::Text::Formatted::Fragment.new("hello world ", format_state, @pdf) fragment.text.should == "hello world" end end describe "Text::Formatted::Fragment#word_spacing=" do before(:each) do create_pdf format_state = { :styles => [:bold, :italic], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => nil } @fragment = Prawn::Text::Formatted::Fragment.new("hello world", format_state, @pdf) @fragment.width = 100 @fragment.left = 50 @fragment.baseline = 200 @fragment.line_height = 27 @fragment.descender = 7 @fragment.ascender = 17 @fragment.word_spacing = 10 end it "should account for word_spacing in #width" do @fragment.width.should == 110 end it "should account for word_spacing in #bounding_box" do target_box = [50, 193, 160, 217] @fragment.bounding_box.should == target_box end it "should account for word_spacing in #absolute_bounding_box" do target_box = [50, 193, 160, 217] target_box[0] += @pdf.bounds.absolute_left target_box[1] += @pdf.bounds.absolute_bottom target_box[2] += @pdf.bounds.absolute_left target_box[3] += @pdf.bounds.absolute_bottom @fragment.absolute_bounding_box.should == target_box end it "should account for word_spacing in #underline_points" do y = 198.75 target_points = [[50, y], [160, y]] @fragment.underline_points.should == target_points end it "should account for word_spacing in #strikethrough_points" do y = 200 + @fragment.ascender * 0.3 target_points = [[50, y], [160, y]] @fragment.strikethrough_points.should == target_points end end describe "Text::Formatted::Fragment" do before(:each) do create_pdf format_state = { :styles => [:bold, :italic], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => nil } @fragment = Prawn::Text::Formatted::Fragment.new("hello world", format_state, @pdf) @fragment.width = 100 @fragment.left = 50 @fragment.baseline = 200 @fragment.line_height = 27 @fragment.descender = 7 @fragment.ascender = 17 end describe "#width" do it "should return the width" do @fragment.width.should == 100 end end describe "#styles" do it "should return the styles array" do @fragment.styles.should == [:bold, :italic] end it "should never return nil" do format_state = { :styles => nil, :color => nil, :link => nil, :anchor => nil, :font => nil, :size => nil } fragment = Prawn::Text::Formatted::Fragment.new("hello world", format_state, @pdf) fragment.styles.should == [] end end describe "#line_height" do it "should return the line_height" do @fragment.line_height.should == 27 end end describe "#ascender" do it "should return the ascender" do @fragment.ascender.should == 17 end end describe "#descender" do it "should return the descender" do @fragment.descender.should == 7 end end describe "#y_offset" do it "should be zero" do @fragment.y_offset.should == 0 end end describe "#bounding_box" do it "should return the bounding box surrounding the fragment" do target_box = [50, 193, 150, 217] @fragment.bounding_box.should == target_box end end describe "#absolute_bounding_box" do it "should return the bounding box surrounding the fragment" + " in absolute coordinates" do target_box = [50, 193, 150, 217] target_box[0] += @pdf.bounds.absolute_left target_box[1] += @pdf.bounds.absolute_bottom target_box[2] += @pdf.bounds.absolute_left target_box[3] += @pdf.bounds.absolute_bottom @fragment.absolute_bounding_box.should == target_box end end describe "#underline_points" do it "should define a line under the fragment" do y = 198.75 target_points = [[50, y], [150, y]] @fragment.underline_points.should == target_points end end describe "#strikethrough_points" do it "should define a line through the fragment" do y = 200 + @fragment.ascender * 0.3 target_points = [[50, y], [150, y]] @fragment.strikethrough_points.should == target_points end end end describe "Text::Formatted::Fragment that is a subscript" do before(:each) do create_pdf format_state = { :styles => [:subscript], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => nil } @fragment = Prawn::Text::Formatted::Fragment.new("hello world", format_state, @pdf) @fragment.line_height = 27 @fragment.descender = 7 @fragment.ascender = 17 end describe "#subscript?" do it "should be_true" do @fragment.should be_subscript end end describe "#y_offset" do it "should return a negative value" do @fragment.y_offset.should be < 0 end end end describe "Text::Formatted::Fragment that is a superscript" do before(:each) do create_pdf format_state = { :styles => [:superscript], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => nil } @fragment = Prawn::Text::Formatted::Fragment.new("hello world", format_state, @pdf) @fragment.line_height = 27 @fragment.descender = 7 @fragment.ascender = 17 end describe "#superscript?" do it "should be_true" do @fragment.should be_superscript end end describe "#y_offset" do it "should return a positive value" do @fragment.y_offset.should be > 0 end end end describe "Text::Formatted::Fragment with :direction => :rtl" do it "#text should be reversed" do create_pdf format_state = { :direction => :rtl } fragment = Prawn::Text::Formatted::Fragment.new("hello world", format_state, @pdf) fragment.text.should == "dlrow olleh" end end describe "Text::Formatted::Fragment default_direction=" do it "should set the direction if there is no fragment level direction " + "specification" do create_pdf format_state = { } fragment = Prawn::Text::Formatted::Fragment.new("hello world", format_state, @pdf) fragment.default_direction = :rtl fragment.direction.should == :rtl end it "should not set the direction if there is a fragment level direction " + "specification" do create_pdf format_state = { :direction => :rtl } fragment = Prawn::Text::Formatted::Fragment.new("hello world", format_state, @pdf) fragment.default_direction = :ltr fragment.direction.should == :rtl end end ruby-prawn-1.0.0~rc2.orig/spec/annotations_spec.rb0000644000000000000000000000431012114176157020711 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") class PageAnnotations attr_reader :pages def self.parse(document) receiver = new PDF::Reader.string(document.render, receiver) return receiver end def initialize @pages = [] end def begin_page(params) @pages << params end end describe "When creating annotations" do before(:each) { create_pdf } it "should append annotation to current page" do @pdf.start_new_page @pdf.annotate(:Rect => [0,0,10,10], :Subtype => :Text, :Contents => "Hello world!") obj = PageAnnotations.parse(@pdf) obj.pages[0][:Annots].nil?.should == true obj.pages[1][:Annots].length.should == 1 end it "should force :Type to be :Annot" do opts = @pdf.annotate(:Rect => [0,0,10,10], :Subtype => :Text, :Contents => "Hello world!") opts[:Type].should == :Annot opts = @pdf.annotate(:Type => :Bogus, :Rect => [0,0,10,10], :Subtype => :Text, :Contents => "Hello world!") opts[:Type].should == :Annot end end describe "When creating text annotations" do before(:each) do @rect = [0,0,10,10] @content = "Hello, world!" create_pdf end it "should build appropriate annotation" do opts = @pdf.text_annotation(@rect, @content) opts[:Type].should == :Annot opts[:Subtype].should == :Text opts[:Rect].should == @rect opts[:Contents].should == @content end it "should merge extra options" do opts = @pdf.text_annotation(@rect, @content, :Open => true, :Subtype => :Bogus) opts[:Subtype].should == :Text opts[:Open].should == true end end describe "When creating link annotations" do before(:each) do @rect = [0,0,10,10] @dest = "home" create_pdf end it "should build appropriate annotation" do opts = @pdf.link_annotation(@rect, :Dest => @dest) opts[:Type].should == :Annot opts[:Subtype].should == :Link opts[:Rect].should == @rect opts[:Dest].should == @dest end it "should merge extra options" do opts = @pdf.link_annotation(@rect, :Dest => @dest, :Subtype => :Bogus) opts[:Subtype].should == :Link opts[:Dest].should == @dest end end ruby-prawn-1.0.0~rc2.orig/spec/graphics_spec.rb0000644000000000000000000005073512114176157020170 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "When drawing a line" do before(:each) { create_pdf } it "should draw a line from (100,600) to (100,500)" do @pdf.line([100,600],[100,500]) line_drawing = PDF::Inspector::Graphics::Line.analyze(@pdf.render) line_drawing.points.should == [[100,600],[100,500]] end it "should draw two lines at (100,600) to (100,500) " + "and (75,100) to (50,125)" do @pdf.line(100,600,100,500) @pdf.line(75,100,50,125) line_drawing = PDF::Inspector::Graphics::Line.analyze(@pdf.render) line_drawing.points.should == [[100.0, 600.0], [100.0, 500.0], [75.0, 100.0], [50.0, 125.0]] end it "should properly set line width via line_width=" do @pdf.line_width = 10 line = PDF::Inspector::Graphics::Line.analyze(@pdf.render) line.widths.first.should == 10 end it "should properly set line width via line_width(width)" do @pdf.line_width(10) line = PDF::Inspector::Graphics::Line.analyze(@pdf.render) line.widths.first.should == 10 end it "should carry the current line width settings over to new pages" do @pdf.line_width(10) @pdf.start_new_page line = PDF::Inspector::Graphics::Line.analyze(@pdf.render) line.widths.length.should == 2 line.widths[1].should == 10 end describe "(Horizontally)" do it "should draw from [x1,pdf.y],[x2,pdf.y]" do @pdf.horizontal_line(100,150) @line = PDF::Inspector::Graphics::Line.analyze(@pdf.render) @line.points.should == [[100.0 + @pdf.bounds.absolute_left, @pdf.y], [150.0 + @pdf.bounds.absolute_left, @pdf.y]] end it "should draw a line from (200, 250) to (300, 250)" do @pdf.horizontal_line(200,300,:at => 250) line_drawing = PDF::Inspector::Graphics::Line.analyze(@pdf.render) line_drawing.points.should == [[200,250],[300,250]] end end describe "(Vertically)" do it "should draw a line from (350, 300) to (350, 400)" do @pdf.vertical_line(300,400,:at => 350) line_drawing = PDF::Inspector::Graphics::Line.analyze(@pdf.render) line_drawing.points.should == [[350,300],[350,400]] end it "should require a y coordinate" do lambda { @pdf.vertical_line(400,500) }. should raise_error(ArgumentError) end end end describe "When drawing a polygon" do before(:each) { create_pdf } it "should draw each line passed to polygon()" do @pdf.polygon([100,500],[100,400],[200,400]) line_drawing = PDF::Inspector::Graphics::Line.analyze(@pdf.render) line_drawing.points.should == [[100,500],[100,400],[200,400],[100,500]] end end describe "When drawing a rectangle" do before(:each) { create_pdf } it "should use a point, width, and height for coords" do @pdf.rectangle [200,200], 50, 100 rectangles = PDF::Inspector::Graphics::Rectangle. analyze(@pdf.render).rectangles # PDF uses bottom left corner rectangles[0][:point].should == [200,100] rectangles[0][:width].should == 50 rectangles[0][:height].should == 100 end end describe "When drawing a curve" do before(:each) { create_pdf } it "should draw a bezier curve from 50,50 to 100,100" do @pdf.move_to [50,50] @pdf.curve_to [100,100],:bounds => [[20,90], [90,70]] curve = PDF::Inspector::Graphics::Curve.analyze(@pdf.render) curve.coords.should == [50.0, 50.0, 20.0, 90.0, 90.0, 70.0, 100.0, 100.0] end it "should draw a bezier curve from 100,100 to 50,50" do @pdf.curve [100,100], [50,50], :bounds => [[20,90], [90,75]] curve = PDF::Inspector::Graphics::Curve.analyze(@pdf.render) curve.coords.should == [100.0, 100.0, 20.0, 90.0, 90.0, 75.0, 50.0, 50.0] end end describe "When drawing a rounded rectangle" do before(:each) do create_pdf @pdf.rounded_rectangle([50, 550], 50, 100, 10) curve = PDF::Inspector::Graphics::Curve.analyze(@pdf.render) curve_points = [] curve.coords.each_slice(2) {|p| curve_points << p} @original_point = curve_points.shift curves = [] curve_points.each_slice(3) {|c| curves << c} line_points = PDF::Inspector::Graphics::Line.analyze(@pdf.render).points line_points.shift @all_coords = [] line_points.zip(curves).flatten.each_slice(2) {|p| @all_coords << p } @all_coords.unshift @original_point end it "should draw a rectangle by connecting lines with rounded bezier curves" do @all_coords.should == [[60.0, 550.0],[90.0, 550.0], [95.523, 550.0], [100.0, 545.523], [100.0, 540.0], [100.0, 460.0], [100.0, 454.477], [95.523, 450.0], [90.0, 450.0], [60.0, 450.0], [54.477, 450.0], [50.0, 454.477], [50.0, 460.0], [50.0, 540.0], [50.0, 545.523], [54.477, 550.0], [60.0, 550.0]] end it "should start and end with the same point" do @original_point.should == @all_coords.last end end describe "When drawing an ellipse" do before(:each) do create_pdf @pdf.ellipse [100,100], 25, 50 @curve = PDF::Inspector::Graphics::Curve.analyze(@pdf.render) end it "should use a Bézier approximation" do @curve.coords.should == [125.0, 100.0, 125.0, 127.614, 113.807, 150, 100.0, 150.0, 86.193, 150.0, 75.0, 127.614, 75.0, 100.0, 75.0, 72.386, 86.193, 50.0, 100.0, 50.0, 113.807, 50.0, 125.0, 72.386, 125.0, 100.0, 100.0, 100.0] end it "should move the pointer to the center of the ellipse after drawing" do @curve.coords[-2..-1].should == [100,100] end end describe "When drawing a circle" do before(:each) do create_pdf @pdf.circle [100,100], 25 @pdf.ellipse [100,100], 25, 25 @curve = PDF::Inspector::Graphics::Curve.analyze(@pdf.render) end it "should stroke the same path as the equivalent ellipse" do middle = @curve.coords.length / 2 @curve.coords[0...middle].should == @curve.coords[middle..-1] end end describe "When filling" do before(:each) { create_pdf } it "should default to the f operator (nonzero winding number rule)" do @pdf.expects(:add_content).with("f") @pdf.fill end it "should use f* for :fill_rule => :even_odd" do @pdf.expects(:add_content).with("f*") @pdf.fill(:fill_rule => :even_odd) end it "should use b by default for fill_and_stroke (nonzero winding number)" do @pdf.expects(:add_content).with("b") @pdf.fill_and_stroke end it "should use b* for fill_and_stroke(:fill_rule => :even_odd)" do @pdf.expects(:add_content).with("b*") @pdf.fill_and_stroke(:fill_rule => :even_odd) end end describe "When setting colors" do before(:each) { create_pdf } it "should set stroke colors" do @pdf.stroke_color "ffcccc" colors = PDF::Inspector::Graphics::Color.analyze(@pdf.render) # 100% red, 80% green, 80% blue colors.stroke_color.should == [1.0, 0.8, 0.8] end it "should set fill colors" do @pdf.fill_color "ccff00" colors = PDF::Inspector::Graphics::Color.analyze(@pdf.render) # 80% red, 100% green, 0% blue colors.fill_color.should == [0.8,1.0,0] end it "should reset the colors on each new page if they have been defined" do @pdf.fill_color "ccff00" #colors = PDF::Inspector::Graphics::Color.analyze(@pdf.render) # colors.fill_color_count.should == 2 # colors.stroke_color_count.should == 1 @pdf.start_new_page @pdf.stroke_color "ff00cc" #colors = PDF::Inspector::Graphics::Color.analyze(@pdf.render) # colors.fill_color_count.should == 3 @pdf.start_new_page colors = PDF::Inspector::Graphics::Color.analyze(@pdf.render) colors.fill_color_count.should == 3 colors.stroke_color_count.should == 2 colors.fill_color.should == [0.8,1.0,0.0] colors.stroke_color.should == [1.0,0.0,0.8] end it "should set the color space when setting colors on new pages to please fussy readers" do @pdf.stroke_color "000000" @pdf.stroke { @pdf.rectangle([10, 10], 10, 10) } @pdf.start_new_page @pdf.stroke_color "000000" @pdf.stroke { @pdf.rectangle([10, 10], 10, 10) } colors = PDF::Inspector::Graphics::Color.analyze(@pdf.render) colors.stroke_color_space_count[:DeviceRGB].should == 2 end end describe "Patterns" do before(:each) { create_pdf } describe 'linear gradients' do it "should create a /Pattern resource" do @pdf.fill_gradient [0, @pdf.bounds.height], [@pdf.bounds.width, @pdf.bounds.height], 'FF0000', '0000FF' grad = PDF::Inspector::Graphics::Pattern.analyze(@pdf.render) pattern = grad.patterns.values.first pattern.should_not be_nil pattern[:Shading][:ShadingType].should == 2 pattern[:Shading][:Coords].should == [0, 0, @pdf.bounds.width, 0] pattern[:Shading][:Function][:C0].zip([1, 0, 0]).all?{ |x1, x2| (x1-x2).abs < 0.01 }.should be_true pattern[:Shading][:Function][:C1].zip([0, 0, 1]).all?{ |x1, x2| (x1-x2).abs < 0.01 }.should be_true end it "fill_gradient should set fill color to the pattern" do @pdf.fill_gradient [0, @pdf.bounds.height], [@pdf.bounds.width, @pdf.bounds.height], 'FF0000', '0000FF' str = @pdf.render str.should =~ %r{/Pattern\s+cs\s*/SP-?\d+\s+scn} end it "stroke_gradient should set stroke color to the pattern" do @pdf.stroke_gradient [0, @pdf.bounds.height], [@pdf.bounds.width, @pdf.bounds.height], 'FF0000', '0000FF' str = @pdf.render str.should =~ %r{/Pattern\s+CS\s*/SP-?\d+\s+SCN} end end describe 'radial gradients' do it "should create a /Pattern resource" do @pdf.fill_gradient [0, @pdf.bounds.height], 10, [@pdf.bounds.width, @pdf.bounds.height], 20, 'FF0000', '0000FF' grad = PDF::Inspector::Graphics::Pattern.analyze(@pdf.render) pattern = grad.patterns.values.first pattern.should_not be_nil pattern[:Shading][:ShadingType].should == 3 pattern[:Shading][:Coords].should == [0, 0, 10, @pdf.bounds.width, 0, 20] pattern[:Shading][:Function][:C0].zip([1, 0, 0]).all?{ |x1, x2| (x1-x2).abs < 0.01 }.should be_true pattern[:Shading][:Function][:C1].zip([0, 0, 1]).all?{ |x1, x2| (x1-x2).abs < 0.01 }.should be_true end it "fill_gradient should set fill color to the pattern" do @pdf.fill_gradient [0, @pdf.bounds.height], 10, [@pdf.bounds.width, @pdf.bounds.height], 20, 'FF0000', '0000FF' str = @pdf.render str.should =~ %r{/Pattern\s+cs\s*/SP-?\d+\s+scn} end it "stroke_gradient should set stroke color to the pattern" do @pdf.stroke_gradient [0, @pdf.bounds.height], 10, [@pdf.bounds.width, @pdf.bounds.height], 20, 'FF0000', '0000FF' str = @pdf.render str.should =~ %r{/Pattern\s+CS\s*/SP-?\d+\s+SCN} end end end describe "When using painting shortcuts" do before(:each) { create_pdf } it "should convert stroke_some_method(args) into some_method(args); stroke" do @pdf.expects(:line_to).with([100,100]) @pdf.expects(:stroke) @pdf.stroke_line_to [100,100] end it "should convert fill_some_method(args) into some_method(args); fill" do @pdf.expects(:line_to).with([100,100]) @pdf.expects(:fill) @pdf.fill_line_to [100,100] end it "should not break method_missing" do lambda { @pdf.i_have_a_pretty_girlfriend_named_jia }. should raise_error(NoMethodError) end end describe "When using graphics states" do before(:each) { create_pdf } it "should add the right content on save_graphics_state" do @pdf.expects(:add_content).with('q') @pdf.save_graphics_state end it "should add the right content on restore_graphics_state" do @pdf.expects(:add_content).with('Q') @pdf.restore_graphics_state end it "should save and restore when save_graphics_state is used with a block" do state = sequence "state" @pdf.expects(:add_content).with('q').in_sequence(state) @pdf.expects(:foo).in_sequence(state) @pdf.expects(:add_content).with('Q').in_sequence(state) @pdf.save_graphics_state do @pdf.foo end end it "should add the previous color space when restoring to a graphic state with different color space" do @pdf.stroke_color '000000' @pdf.save_graphics_state @pdf.stroke_color 0, 0, 0, 0 @pdf.restore_graphics_state @pdf.stroke_color 0, 0, 100, 0 @pdf.graphic_state.color_space.should == {:stroke=>:DeviceCMYK} colors = PDF::Inspector::Graphics::Color.analyze(@pdf.render) colors.color_space.should == :DeviceCMYK colors.stroke_color_space_count[:DeviceCMYK].should == 2 end it "should use the correct dash setting after restoring and starting new page" do @pdf.dash 5 @pdf.save_graphics_state @pdf.dash 10 @pdf.graphic_state.dash[:dash].should == 10 @pdf.restore_graphics_state @pdf.start_new_page @pdf.graphic_state.dash[:dash].should == 5 end it "the current graphic state should keep track of previous unchanged settings" do @pdf.stroke_color '000000' @pdf.save_graphics_state @pdf.dash 5 @pdf.save_graphics_state @pdf.cap_style :round @pdf.save_graphics_state @pdf.fill_color 0, 0, 100, 0 @pdf.save_graphics_state @pdf.graphic_state.stroke_color.should == "000000" @pdf.graphic_state.join_style.should == :miter @pdf.graphic_state.fill_color.should == [0, 0, 100, 0] @pdf.graphic_state.cap_style.should == :round @pdf.graphic_state.color_space.should == {:fill=>:DeviceCMYK, :stroke=>:DeviceRGB} @pdf.graphic_state.dash.should == {:space=>5, :phase=>0, :dash=>5} @pdf.graphic_state.line_width.should == 1 end it "should not add extra graphic space closings when rendering multiple times" do @pdf.render state = PDF::Inspector::Graphics::State.analyze(@pdf.render) state.save_graphics_state_count.should == 1 state.restore_graphics_state_count.should == 1 end it "should add extra graphic state enclosings when content is added on multiple renderings" do @pdf.render @pdf.text "Adding a bit more content" state = PDF::Inspector::Graphics::State.analyze(@pdf.render) state.save_graphics_state_count.should == 2 state.restore_graphics_state_count.should == 2 end it "adds extra graphic state enclosings when new settings are applied on multiple renderings" do @pdf.render @pdf.stroke_color 0, 0, 0, 0 state = PDF::Inspector::Graphics::State.analyze(@pdf.render) state.save_graphics_state_count.should == 2 state.restore_graphics_state_count.should == 2 end it "should raise_error error if closing an empty graphic stack" do lambda { @pdf.render @pdf.restore_graphics_state }.should raise_error(Prawn::Errors::EmptyGraphicStateStack) end end describe "When using transformation matrix" do before(:each) { create_pdf } # Note: The (approximate) number of significant decimal digits of precision in fractional # part is 5 (PDF Reference, Third Edition, p. 706) it "should send the right content on transformation_matrix" do @pdf.expects(:add_content).with('1.00000 0.00000 0.12346 -1.00000 5.50000 20.00000 cm') @pdf.transformation_matrix 1, 0, 0.123456789, -1.0, 5.5, 20 end it "should use fixed digits with very small number" do values = Array.new(6, 0.000000000001) string = Array.new(6, "0.00000").join " " @pdf.expects(:add_content).with("#{string} cm") @pdf.transformation_matrix *values end it "should be received by the inspector" do @pdf.transformation_matrix 1, 0, 0, -1, 5.5, 20 matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render) matrices.matrices.should == [[1, 0, 0, -1, 5.5, 20]] end it "should save the graphics state inside the given block" do values = Array.new(6, 0.000000000001) string = Array.new(6, "0.00000").join " " process = sequence "process" @pdf.expects(:save_graphics_state).with().in_sequence(process) @pdf.expects(:add_content).with("#{string} cm").in_sequence(process) @pdf.expects(:do_something).with().in_sequence(process) @pdf.expects(:restore_graphics_state).with().in_sequence(process) @pdf.transformation_matrix(*values) do @pdf.do_something end end end describe "When using transformations shortcuts" do before(:each) do create_pdf @x, @y = 12, 54.32 @angle = 12.32 @cos = Math.cos(@angle * Math::PI / 180) @sin = Math.sin(@angle * Math::PI / 180) @factor = 0.12 end describe "#rotate" do it "should rotate" do @pdf.expects(:transformation_matrix).with(@cos, @sin, -@sin, @cos, 0, 0) @pdf.rotate(@angle) end end describe "#rotate with :origin option" do it "should rotate around the origin" do x_prime = @x * @cos - @y * @sin y_prime = @x * @sin + @y * @cos @pdf.rotate(@angle, :origin => [@x, @y]) { @pdf.text('hello world') } matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render) matrices.matrices[0].should == [1, 0, 0, 1, reduce_precision(@x - x_prime), reduce_precision(@y - y_prime)] matrices.matrices[1].should == [reduce_precision(@cos), reduce_precision(@sin), reduce_precision(-@sin), reduce_precision(@cos), 0, 0] end it "should rotate around the origin in a document with a margin" do @pdf = Prawn::Document.new @pdf.rotate(@angle, :origin => [@x, @y]) { @pdf.text('hello world') } x = @x + @pdf.bounds.absolute_left y = @y + @pdf.bounds.absolute_bottom x_prime = x * @cos - y * @sin y_prime = x * @sin + y * @cos matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render) matrices.matrices[0].should == [1, 0, 0, 1, reduce_precision(x - x_prime), reduce_precision(y - y_prime)] matrices.matrices[1].should == [reduce_precision(@cos), reduce_precision(@sin), reduce_precision(-@sin), reduce_precision(@cos), 0, 0] end it "should raise_error BlockRequired if no block is given" do lambda { @pdf.rotate(@angle, :origin => [@x, @y]) }.should raise_error(Prawn::Errors::BlockRequired) end def reduce_precision(float) ("%.5f" % float).to_f end end describe "#translate" do it "should translate" do x, y = 12, 54.32 @pdf.expects(:transformation_matrix).with(1, 0, 0, 1, x, y) @pdf.translate(x, y) end end describe "#scale" do it "should scale" do @pdf.expects(:transformation_matrix).with(@factor, 0, 0, @factor, 0, 0) @pdf.scale(@factor) end end describe "#scale with :origin option" do it "should scale from the origin" do x_prime = @factor * @x y_prime = @factor * @y @pdf.scale(@factor, :origin => [@x, @y]) { @pdf.text('hello world') } matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render) matrices.matrices[0].should == [1, 0, 0, 1, reduce_precision(@x - x_prime), reduce_precision(@y - y_prime)] matrices.matrices[1].should == [@factor, 0, 0, @factor, 0, 0] end it "should scale from the origin in a document with a margin" do @pdf = Prawn::Document.new x = @x + @pdf.bounds.absolute_left y = @y + @pdf.bounds.absolute_bottom x_prime = @factor * x y_prime = @factor * y @pdf.scale(@factor, :origin => [@x, @y]) { @pdf.text('hello world') } matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render) matrices.matrices[0].should == [1, 0, 0, 1, reduce_precision(x - x_prime), reduce_precision(y - y_prime)] matrices.matrices[1].should == [@factor, 0, 0, @factor, 0, 0] end it "should raise_error BlockRequired if no block is given" do lambda { @pdf.scale(@factor, :origin => [@x, @y]) }.should raise_error(Prawn::Errors::BlockRequired) end def reduce_precision(float) ("%.5f" % float).to_f end end # describe "skew" do # it "should skew" do # a, b = 30, 50.2 # @pdf.expects(:transformation_matrix).with(1, Math.tan(a * Math::PI / 180), Math.tan(b * Math::PI / 180), 1, 0, 0) # @pdf.skew(a, b) # end # end end ruby-prawn-1.0.0~rc2.orig/spec/font_spec.rb0000644000000000000000000003321512114176157017330 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") require 'pathname' describe "Font behavior" do it "should default to Helvetica if no font is specified" do @pdf = Prawn::Document.new @pdf.font.name.should == "Helvetica" end end describe "#width_of" do it "should take character spacing into account" do create_pdf original_width = @pdf.width_of("hello world") @pdf.character_spacing(7) do @pdf.width_of("hello world").should == original_width + 11 * 7 end end it "should exclude newlines" do create_pdf # Use a TTF font that has a non-zero width for \n @pdf.font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf") @pdf.width_of("\nhello world\n").should == @pdf.width_of("hello world") end it "should take formatting into account" do create_pdf normal_hello = @pdf.width_of("hello") inline_bold_hello = @pdf.width_of("hello", :inline_format => true) @pdf.font("Helvetica", :style => :bold) { @bold_hello = @pdf.width_of("hello") } inline_bold_hello.should be > normal_hello inline_bold_hello.should == @bold_hello end it "should accept :style as an argument" do create_pdf styled_bold_hello = @pdf.width_of("hello", :style => :bold) @pdf.font("Helvetica", :style => :bold) { @bold_hello = @pdf.width_of("hello") } styled_bold_hello.should == @bold_hello end end describe "#font_size" do it "should allow setting font size in DSL style" do create_pdf @pdf.font_size 20 @pdf.font_size.should == 20 end end describe "font style support" do before(:each) { create_pdf } it "should complain if there is no @current_page" do pdf_without_page = Prawn::Document.new(:skip_page_creation => true) lambda{ pdf_without_page.font "Helvetica" }. should raise_error(Prawn::Errors::NotOnPage) end it "should allow specifying font style by style name and font family" do @pdf.font "Courier", :style => :bold @pdf.text "In Courier bold" @pdf.font "Courier", :style => :bold_italic @pdf.text "In Courier bold-italic" @pdf.font "Courier", :style => :italic @pdf.text "In Courier italic" @pdf.font "Courier", :style => :normal @pdf.text "In Normal Courier" @pdf.font "Helvetica" @pdf.text "In Normal Helvetica" text = PDF::Inspector::Text.analyze(@pdf.render) text.font_settings.map { |e| e[:name] }.should == [:"Courier-Bold", :"Courier-BoldOblique", :"Courier-Oblique", :Courier, :Helvetica] end it "should allow font familes to be defined in a single dfont" do file = "#{Prawn::DATADIR}/fonts/Action Man.dfont" @pdf.font_families["Action Man"] = { :normal => { :file => file, :font => "ActionMan" }, :italic => { :file => file, :font => "ActionMan-Italic" }, :bold => { :file => file, :font => "ActionMan-Bold" }, :bold_italic => { :file => file, :font => "ActionMan-BoldItalic" } } @pdf.font "Action Man", :style => :italic @pdf.text "In ActionMan-Italic" text = PDF::Inspector::Text.analyze(@pdf.render) name = text.font_settings.map { |e| e[:name] }.first.to_s name = name.sub(/\w+\+/, "subset+") name.should == "subset+ActionMan-Italic" end it "should accept Pathname objects for font files" do file = Pathname.new( "#{Prawn::DATADIR}/fonts/Chalkboard.ttf" ) @pdf.font_families["Chalkboard"] = { :normal => file } @pdf.font "Chalkboard" @pdf.text "In Chalkboard" text = PDF::Inspector::Text.analyze(@pdf.render) name = text.font_settings.map { |e| e[:name] }.first.to_s name = name.sub(/\w+\+/, "subset+") name.should == "subset+Chalkboard" end end describe "Transactional font handling" do before(:each) { create_pdf } it "should allow setting of size directly when font is created" do @pdf.font "Courier", :size => 16 @pdf.font_size.should == 16 end it "should allow temporary setting of a new font using a transaction" do @pdf.font "Helvetica", :size => 12 @pdf.font "Courier", :size => 16 do @pdf.font.name.should == "Courier" @pdf.font_size.should == 16 end @pdf.font.name.should == "Helvetica" @pdf.font_size.should == 12 end it "should mask font size when using a transacation" do @pdf.font "Courier", :size => 16 do @pdf.font_size.should == 16 end @pdf.font "Times-Roman" @pdf.font "Courier" @pdf.font_size.should == 12 end end describe "Document#page_fonts" do before(:each) { create_pdf } it "should register fonts properly by page" do @pdf.font "Courier"; @pdf.text("hello") @pdf.font "Helvetica"; @pdf.text("hello") @pdf.font "Times-Roman"; @pdf.text("hello") ["Courier","Helvetica","Times-Roman"].each { |f| page_should_include_font(f) } @pdf.start_new_page @pdf.font "Helvetica"; @pdf.text("hello") page_should_include_font("Helvetica") page_should_not_include_font("Courier") page_should_not_include_font("Times-Roman") end def page_includes_font?(font) @pdf.page.fonts.values.map { |e| e.data[:BaseFont] }.include?(font.to_sym) end def page_should_include_font(font) page_includes_font?(font).should be_true end def page_should_not_include_font(font) page_includes_font?(font).should be_false end end describe "AFM fonts" do before do create_pdf @times = @pdf.find_font "Times-Roman" end it "should calculate string width taking into account accented characters" do input = win1252_string("\xE9")# é in win-1252 @times.compute_width_of(input, :size => 12).should == @times.compute_width_of("e", :size => 12) end it "should calculate string width taking into account kerning pairs" do @times.compute_width_of(win1252_string("To"), :size => 12).should == 13.332 @times.compute_width_of(win1252_string("To"), :size => 12, :kerning => true).should == 12.372 input = win1252_string("T\xF6") # Tö in win-1252 @times.compute_width_of(input, :size => 12, :kerning => true).should == 12.372 end it "should encode text without kerning by default" do @times.encode_text(win1252_string("To")).should == [[0, "To"]] input = win1252_string("T\xE9l\xE9") # Télé in win-1252 @times.encode_text(input).should == [[0, input]] @times.encode_text(win1252_string("Technology")).should == [[0, "Technology"]] @times.encode_text(win1252_string("Technology...")).should == [[0, "Technology..."]] end it "should encode text with kerning if requested" do @times.encode_text(win1252_string("To"), :kerning => true).should == [[0, ["T", 80, "o"]]] input = win1252_string("T\xE9l\xE9") # Télé in win-1252 output = win1252_string("\xE9l\xE9") # élé in win-1252 @times.encode_text(input, :kerning => true).should == [[0, ["T", 70, output]]] @times.encode_text(win1252_string("Technology"), :kerning => true).should == [[0, ["T", 70, "echnology"]]] @times.encode_text(win1252_string("Technology..."), :kerning => true).should == [[0, ["T", 70, "echnology", 65, "..."]]] end describe "when normalizing encoding" do it "should not modify the original string when normalize_encoding() is used" do original = "Foo" normalized = @times.normalize_encoding(original) original.equal?(normalized).should be_false end it "should modify the original string when normalize_encoding!() is used" do original = "Foo" normalized = @times.normalize_encoding!(original) original.equal?(normalized).should be_true end end it "should omit /Encoding for symbolic fonts" do zapf = @pdf.find_font "ZapfDingbats" font_dict = zapf.send(:register, nil) font_dict.data[:Encoding].should == nil end end describe "#glyph_present" do before(:each) { create_pdf } it "should return true when present in an AFM font" do font = @pdf.find_font("Helvetica") font.glyph_present?("H").should be_true end it "should return false when absent in an AFM font" do font = @pdf.find_font("Helvetica") font.glyph_present?("再").should be_false end it "should return true when present in a TTF font" do font = @pdf.find_font("#{Prawn::DATADIR}/fonts/Activa.ttf") font.glyph_present?("H").should be_true end it "should return false when absent in a TTF font" do font = @pdf.find_font("#{Prawn::DATADIR}/fonts/Activa.ttf") font.glyph_present?("再").should be_false font = @pdf.find_font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf") font.glyph_present?("€").should be_false end end describe "TTF fonts" do before do create_pdf @activa = @pdf.find_font "#{Prawn::DATADIR}/fonts/Activa.ttf" end it "should calculate string width taking into account accented characters" do @activa.compute_width_of("é", :size => 12).should == @activa.compute_width_of("e", :size => 12) end it "should calculate string width taking into account kerning pairs" do @activa.compute_width_of("To", :size => 12).should == 15.228 @activa.compute_width_of("To", :size => 12, :kerning => true).should == 12.996 end it "should encode text without kerning by default" do @activa.encode_text("To").should == [[0, "To"]] tele = "T\216l\216" result = @activa.encode_text("Télé") result.length.should == 1 result[0][0].should == 0 result[0][1].bytes.to_a.should == tele.bytes.to_a @activa.encode_text("Technology").should == [[0, "Technology"]] @activa.encode_text("Technology...").should == [[0, "Technology..."]] @activa.encode_text("Teχnology...").should == [[0, "Te"], [1, "!"], [0, "nology..."]] end it "should encode text with kerning if requested" do @activa.encode_text("To", :kerning => true).should == [[0, ["T", 186.0, "o"]]] @activa.encode_text("To", :kerning => true).should == [[0, ["T", 186.0, "o"]]] @activa.encode_text("Technology", :kerning => true).should == [[0, ["T", 186.0, "echnology"]]] @activa.encode_text("Technology...", :kerning => true).should == [[0, ["T", 186.0, "echnology", 88.0, "..."]]] @activa.encode_text("Teχnology...", :kerning => true).should == [[0, ["T", 186.0, "e"]], [1, "!"], [0, ["nology", 88.0, "..."]]] end it "should use the ascender, descender, and cap height from the TTF verbatim" do # These metrics are relative to the font's own bbox. They should not be # scaled with font size. ref = @pdf.ref!({}) @activa.send :embed, ref, 0 # Pull out the embedded font descriptor descriptor = ref.data[:FontDescriptor].data descriptor[:Ascent].should == 804 descriptor[:Descent].should == -195 descriptor[:CapHeight].should == 804 end describe "when normalizing encoding" do it "should not modify the original string when normalize_encoding() is used" do original = "Foo" normalized = @activa.normalize_encoding(original) original.equal?(normalized).should be_false end it "should modify the original string when normalize_encoding!() is used" do original = "Foo" normalized = @activa.normalize_encoding!(original) original.equal?(normalized).should be_true end end describe "when used with snapshots or transactions" do it "should allow TTF fonts to be used alongside document transactions" do lambda { Prawn::Document.new do font "#{Prawn::DATADIR}/fonts/DejaVuSans.ttf" text "Hi there" transaction { text "Nice, thank you" } end }.should_not raise_error end it "should allow TTF fonts to be used inside transactions" do pdf = Prawn::Document.new do transaction do font "#{Prawn::DATADIR}/fonts/DejaVuSans.ttf" text "Hi there" end end text = PDF::Inspector::Text.analyze(pdf.render) name = text.font_settings.map { |e| e[:name] }.first.to_s name = name.sub(/\w+\+/, "subset+") name.should == "subset+DejaVuSans" end end end describe "DFont fonts" do before do create_pdf @file = "#{Prawn::DATADIR}/fonts/Action Man.dfont" end it "should list all named fonts" do list = Prawn::Font::DFont.named_fonts(@file) list.sort.should == %w(ActionMan ActionMan-Italic ActionMan-Bold ActionMan-BoldItalic).sort end it "should count the number of fonts in the file" do Prawn::Font::DFont.font_count(@file).should == 4 end it "should default selected font to the first one if not specified" do font = @pdf.find_font(@file) font.basename.should == "ActionMan" end it "should allow font to be selected by index" do font = @pdf.find_font(@file, :font => 2) font.basename.should == "ActionMan-Italic" end it "should allow font to be selected by name" do font = @pdf.find_font(@file, :font => "ActionMan-BoldItalic") font.basename.should == "ActionMan-BoldItalic" end it "should cache font object based on selected font" do f1 = @pdf.find_font(@file, :font => "ActionMan") f2 = @pdf.find_font(@file, :font => "ActionMan-Bold") f2.object_id.should_not == f1.object_id @pdf.find_font(@file, :font => "ActionMan").object_id.should == f1.object_id @pdf.find_font(@file, :font => "ActionMan-Bold").object_id.should == f2.object_id end end describe "#character_count(text)" do it "should work on TTF fonts" do create_pdf @pdf.font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf") @pdf.font.character_count("こんにちは世界").should == 7 @pdf.font.character_count("Hello, world!").should == 13 end it "should work on AFM fonts" do create_pdf @pdf.font.character_count("Hello, world!").should == 13 end end ruby-prawn-1.0.0~rc2.orig/spec/span_spec.rb0000644000000000000000000000216012114176157017316 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "drawing span" do before do Prawn.debug = false create_pdf end after do Prawn.debug = true end it "should only accept :position as option in debug mode" do Prawn.debug = true lambda { @pdf.span(350, {:x => 3}) {} }.should raise_error(Prawn::Errors::UnknownOption) end it "should have raise an error if :position is invalid" do lambda { @pdf.span(350, :position => :x) {} }.should raise_error(ArgumentError) end it "should restore the margin box when bounding box exits" do margin_box = @pdf.bounds @pdf.span(350, :position => :center) do @pdf.text "Here's some centered text in a 350 point column. " * 100 end @pdf.bounds.should == margin_box end it "should do create a margin box" do y = @pdf.y margin_box = @pdf.span(350, :position => :center) do @pdf.text "Here's some centered text in a 350 point column. " * 100 end margin_box.top.should == 792.0 margin_box.bottom.should == 0 end end ruby-prawn-1.0.0~rc2.orig/spec/column_box_spec.rb0000644000000000000000000000170212114176157020523 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "A column box" do it "has sensible left and right values" do create_pdf @pdf.column_box [0, @pdf.cursor], :width => @pdf.bounds.width, :height => 200, :columns => 3, :spacer => 25 do left = @pdf.bounds.left right = @pdf.bounds.right @pdf.bounds.move_past_bottom # next column @pdf.bounds.left.should be > left @pdf.bounds.left.should be > right @pdf.bounds.right.should be > @pdf.bounds.left end end it "includes spacers between columns but not at the end" do create_pdf @pdf.column_box [0, @pdf.cursor], :width => 500, :height => 200, :columns => 3, :spacer => 25 do @pdf.bounds.width.should == 150 # (500 - (25 * 2)) / 3 @pdf.bounds.move_past_bottom @pdf.bounds.move_past_bottom @pdf.bounds.right.should == 500 end end end ruby-prawn-1.0.0~rc2.orig/spec/soft_mask_spec.rb0000644000000000000000000000577712114176157020364 0ustar rootrootrequire File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") module SoftMaskHelper def make_soft_mask @pdf.save_graphics_state do @pdf.soft_mask do if block_given? yield else @pdf.fill_color '808080' @pdf.fill_rectangle [100, 100], 200, 200 end end @pdf.fill_color '000000' @pdf.fill_rectangle [0, 0], 200, 200 end end end describe "Document with soft masks" do include SoftMaskHelper it "should have PDF version at least 1.4" do create_pdf make_soft_mask str = @pdf.render str[0,8].should == "%PDF-1.4" end it "should create a new extended graphics state for each unique soft mask" do create_pdf make_soft_mask do @pdf.fill_color '808080' @pdf.fill_rectangle [100, 100], 200, 200 end make_soft_mask do @pdf.fill_color '808080' @pdf.fill_rectangle [10, 10], 200, 200 end extgstates = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates extgstates.length.should == 2 end it "a new extended graphics state should contain soft mask with drawing instructions" do create_pdf make_soft_mask do @pdf.fill_color '808080' @pdf.fill_rectangle [100, 100], 200, 200 end extgstate = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates.first extgstate[:soft_mask][:G].data.should == "q\n/DeviceRGB cs\n0.000 0.000 0.000 scn\n/DeviceRGB CS\n0.000 0.000 0.000 SCN\n1 w\n0 J\n0 j\n[ ] 0 d\n/DeviceRGB cs\n0.502 0.502 0.502 scn\n100.000 -100.000 200.000 200.000 re\nf\nQ\n" end it "should not create duplicate extended graphics states" do create_pdf make_soft_mask do @pdf.fill_color '808080' @pdf.fill_rectangle [100, 100], 200, 200 end make_soft_mask do @pdf.fill_color '808080' @pdf.fill_rectangle [100, 100], 200, 200 end extgstates = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates extgstates.length.should == 1 end it "should not have objects that are not used for extended graphic state" do @pdf = Prawn::Document.new(:margin => 0, :optimize_objects => true) make_soft_mask do @pdf.fill_color '808080' @pdf.fill_rectangle [100, 100], 200, 200 end make_soft_mask do @pdf.fill_color '808080' @pdf.fill_rectangle [100, 100], 200, 200 end reader = PDF::Reader.new(StringIO.open(@pdf.render)) groups = reader.objects.select { |obj| o = obj[1] o.is_a?(Hash) && o[:Type] == :Group } groups.length.should == 1 forms = reader.objects.select { |obj| o = obj[1] o.is_a?(PDF::Reader::Stream) && o.hash[:Type] == :XObject && o.hash[:Subtype] == :Form } forms.length.should == 1 masks = reader.objects.select { |obj| o = obj[1] o.is_a?(Hash) && o[:Type] == :Mask } masks.length.should == 1 ext_g_states = reader.objects.select { |obj| o = obj[1] o.is_a?(Hash) && o[:Type] == :ExtGState } ext_g_states.length.should == 1 end end ruby-prawn-1.0.0~rc2.orig/spec/table_spec.rb0000644000000000000000000011635312114176157017456 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") require 'set' describe "Prawn::Table" do describe "converting data to Cell objects" do before(:each) do @pdf = Prawn::Document.new @table = @pdf.table([%w[R0C0 R0C1], %w[R1C0 R1C1]]) end it "should return a Prawn::Table" do @table.should be_a_kind_of Prawn::Table end it "should flatten the data into the @cells array in row-major order" do @table.cells.map { |c| c.content }.should == %w[R0C0 R0C1 R1C0 R1C1] end it "should add row and column numbers to each cell" do c = @table.cells.to_a.first c.row.should == 0 c.column.should == 0 end it "should allow empty fields" do lambda { data = [["foo","bar"],["baz",""]] @pdf.table(data) }.should_not raise_error end it "should allow a table with a header but no body" do lambda { @pdf.table([["Header"]], :header => true) }.should_not raise_error end it "should accurately count columns from data" do # First data row may contain colspan which would hide true column count data = [["Name:", {:content => "Some very long name", :colspan => 5}]] pdf = Prawn::Document.new table = Prawn::Table.new data, pdf table.column_widths.length.should == 6 end end describe "#initialize" do before(:each) do @pdf = Prawn::Document.new end it "should instance_eval a 0-arg block" do initializer = mock() initializer.expects(:kick).once @pdf.table([["a"]]){ initializer.kick } end it "should call a 1-arg block with the document as the argument" do initializer = mock() initializer.expects(:kick).once @pdf.table([["a"]]){ |doc| doc.should be_a_kind_of(Prawn::Table); initializer.kick } end it "should proxy cell methods to #cells" do table = @pdf.table([["a"]], :cell_style => { :padding => 11 }) table.cells[0, 0].padding.should == [11, 11, 11, 11] end it "should set row and column length" do table = @pdf.table([["a", "b", "c"], ["d", "e", "f"]]) table.row_length.should == 2 table.column_length.should == 3 end it "should generate a text cell based on a String" do t = @pdf.table([["foo"]]) t.cells[0,0].should be_a_kind_of(Prawn::Table::Cell::Text) end it "should pass through a text cell" do c = Prawn::Table::Cell::Text.new(@pdf, [0,0], :content => "foo") t = @pdf.table([[c]]) t.cells[0,0].should == c end end describe "cell accessors" do before(:each) do @pdf = Prawn::Document.new @table = @pdf.table([%w[R0C0 R0C1], %w[R1C0 R1C1]]) end it "should select rows by number or range" do Set.new(@table.row(0).map { |c| c.content }).should == Set.new(%w[R0C0 R0C1]) Set.new(@table.rows(0..1).map { |c| c.content }).should == Set.new(%w[R0C0 R0C1 R1C0 R1C1]) end it "should select rows by array" do Set.new(@table.rows([0, 1]).map { |c| c.content }).should == Set.new(%w[R0C0 R0C1 R1C0 R1C1]) end it "should allow negative row selectors" do Set.new(@table.row(-1).map { |c| c.content }).should == Set.new(%w[R1C0 R1C1]) Set.new(@table.rows(-2..-1).map { |c| c.content }).should == Set.new(%w[R0C0 R0C1 R1C0 R1C1]) Set.new(@table.rows(0..-1).map { |c| c.content }).should == Set.new(%w[R0C0 R0C1 R1C0 R1C1]) end it "should select columns by number or range" do Set.new(@table.column(0).map { |c| c.content }).should == Set.new(%w[R0C0 R1C0]) Set.new(@table.columns(0..1).map { |c| c.content }).should == Set.new(%w[R0C0 R0C1 R1C0 R1C1]) end it "should select columns by array" do Set.new(@table.columns([0, 1]).map { |c| c.content }).should == Set.new(%w[R0C0 R0C1 R1C0 R1C1]) end it "should allow negative column selectors" do Set.new(@table.column(-1).map { |c| c.content }).should == Set.new(%w[R0C1 R1C1]) Set.new(@table.columns(-2..-1).map { |c| c.content }).should == Set.new(%w[R0C0 R0C1 R1C0 R1C1]) Set.new(@table.columns(0..-1).map { |c| c.content }).should == Set.new(%w[R0C0 R0C1 R1C0 R1C1]) end it "should allow rows and columns to be combined" do @table.row(0).column(1).map { |c| c.content }.should == ["R0C1"] end it "should accept a filter block, returning a cell proxy" do @table.cells.filter { |c| c.content =~ /R0/ }.column(1).map{ |c| c.content }.should == ["R0C1"] end it "should accept the [] method, returning a Cell or nil" do @table.cells[0, 0].content.should == "R0C0" @table.cells[12, 12].should be_nil end it "should proxy unknown methods to the cells" do @table.cells.height = 200 @table.row(1).height = 100 @table.cells[0, 0].height.should == 200 @table.cells[1, 0].height.should == 100 end it "should ignore non-setter methods" do lambda { @table.cells.content_width }.should raise_error(NoMethodError) end it "skips cells that don't respond to the given method" do table = @pdf.make_table([[{:content => "R0", :colspan => 2}], %w[R1C0 R1C1]]) lambda { table.row(0).font_style = :bold }.should_not raise_error end it "should accept the style method, proxying its calls to the cells" do @table.cells.style(:height => 200, :width => 200) @table.column(0).style(:width => 100) @table.cells[0, 1].width.should == 200 @table.cells[1, 0].height.should == 200 @table.cells[1, 0].width.should == 100 end it "style method should accept a block, passing each cell to be styled" do @table.cells.style { |c| c.height = 200 } @table.cells[0, 1].height.should == 200 end it "should return the width of selected columns for #width" do c0_width = @table.column(0).map{ |c| c.width }.max c1_width = @table.column(1).map{ |c| c.width }.max @table.column(0).width.should == c0_width @table.column(1).width.should == c1_width @table.columns(0..1).width.should == c0_width + c1_width @table.cells.width.should == c0_width + c1_width end it "should return the height of selected rows for #height" do r0_height = @table.row(0).map{ |c| c.height }.max r1_height = @table.row(1).map{ |c| c.height }.max @table.row(0).height.should == r0_height @table.row(1).height.should == r1_height @table.rows(0..1).height.should == r0_height + r1_height @table.cells.height.should == r0_height + r1_height end end describe "layout" do before(:each) do @pdf = Prawn::Document.new @long_text = "The quick brown fox jumped over the lazy dogs. " * 5 end describe "width" do it "should raise_error an error if the given width is outside of range" do lambda do @pdf.table([["foo"]], :width => 1) end.should raise_error(Prawn::Errors::CannotFit) lambda do @pdf.table([[@long_text]], :width => @pdf.bounds.width + 100) end.should raise_error(Prawn::Errors::CannotFit) end it "should accept the natural width for small tables" do pad = 10 # default padding @table = @pdf.table([["a"]]) @table.width.should == @table.cells[0, 0].natural_content_width + pad end it "width should == sum(column_widths)" do table = Prawn::Table.new([%w[ a b c ], %w[d e f]], @pdf) do column(0).width = 50 column(1).width = 100 column(2).width = 150 end table.width.should == 300 end it "should accept Numeric for column_widths" do table = Prawn::Table.new([%w[ a b c ], %w[d e f]], @pdf) do |t| t.column_widths = 50 end table.width.should == 150 end it "should calculate unspecified column widths as "+ "(max(string_width) + 2*horizontal_padding)" do hpad, fs = 3, 12 columns = 2 table = Prawn::Table.new( [%w[ foo b ], %w[d foobar]], @pdf, :cell_style => { :padding => hpad, :size => fs } ) col0_width = @pdf.width_of("foo", :size => fs) col1_width = @pdf.width_of("foobar", :size => fs) table.width.should == col0_width + col1_width + 2*columns*hpad end it "should allow mixing autocalculated and preset"+ "column widths within a single table" do hpad, fs = 10, 6 stretchy_columns = 2 col0_width = 50 col1_width = @pdf.width_of("foo", :size => fs) col2_width = @pdf.width_of("foobar", :size => fs) col3_width = 150 table = Prawn::Table.new( [%w[snake foo b apple], %w[kitten d foobar banana]], @pdf, :cell_style => { :padding => hpad, :size => fs }) do column(0).width = col0_width column(3).width = col3_width end table.width.should == col1_width + col2_width + 2*stretchy_columns*hpad + col0_width + col3_width end it "should preserve all manually requested column widths" do col0_width = 50 col1_width = 20 col3_width = 60 table = Prawn::Table.new( [["snake", "foo", "b", "some long, long text that will wrap"], %w[kitten d foobar banana]], @pdf, :width => 150) do column(0).width = col0_width column(1).width = col1_width column(3).width = col3_width end table.draw table.column(0).width.should == col0_width table.column(1).width.should == col1_width table.column(3).width.should == col3_width end it "should_not exceed the maximum width of the margin_box" do expected_width = @pdf.margin_box.width data = [ ['This is a column with a lot of text that should comfortably exceed '+ 'the width of a normal document margin_box width', 'Some more text', 'and then some more', 'Just a bit more to be extra sure'] ] table = Prawn::Table.new(data, @pdf) table.width.should == expected_width end it "should_not exceed the maximum width of the margin_box even with" + "manual widths specified" do expected_width = @pdf.margin_box.width data = [ ['This is a column with a lot of text that should comfortably exceed '+ 'the width of a normal document margin_box width', 'Some more text', 'and then some more', 'Just a bit more to be extra sure'] ] table = Prawn::Table.new(data, @pdf) { column(1).width = 100 } table.width.should == expected_width end it "scales down only the non-preset column widths when the natural width" + "exceeds the maximum width of the margin_box" do expected_width = @pdf.margin_box.width data = [ ['This is a column with a lot of text that should comfortably exceed '+ 'the width of a normal document margin_box width', 'Some more text', 'and then some more', 'Just a bit more to be extra sure'] ] table = Prawn::Table.new(data, @pdf) { column(1).width = 100; column(3).width = 50 } table.width.should == expected_width table.column_widths[1].should == 100 table.column_widths[3].should == 50 end it "should allow width to be reset even after it has been calculated" do @table = @pdf.table([[@long_text]]) @table.width @table.width = 100 @table.width.should == 100 end it "should shrink columns evenly when two equal columns compete" do @table = @pdf.table([["foo", @long_text], [@long_text, "foo"]]) @table.cells[0, 0].width.should == @table.cells[0, 1].width end it "should grow columns evenly when equal deficient columns compete" do @table = @pdf.table([["foo", "foobar"], ["foobar", "foo"]], :width => 500) @table.cells[0, 0].width.should == @table.cells[0, 1].width end it "should respect manual widths" do @table = @pdf.table([%w[foo bar baz], %w[baz bar foo]], :width => 500) do column(1).width = 60 end @table.column(1).width.should == 60 @table.column(0).width.should == @table.column(2).width end it "should allow table cells to be resized in block" do lambda do @pdf.table([%w[1 2 3 4 5]]) do |t| t.width = 40 t.cells.size = 8 t.cells.padding = 0 end end.should_not raise_error(Prawn::Errors::CannotFit) end it "should be the width of the :width parameter" do expected_width = 300 table = Prawn::Table.new( [%w[snake foo b apple], %w[kitten d foobar banana]], @pdf, :width => expected_width) table.width.should == expected_width end it "should_not exceed the :width option" do expected_width = 400 data = [ ['This is a column with a lot of text that should comfortably exceed '+ 'the width of a normal document margin_box width', 'Some more text', 'and then some more', 'Just a bit more to be extra sure'] ] table = Prawn::Table.new(data, @pdf, :width => expected_width) table.width.should == expected_width end it "should_not exceed the :width option even with manual widths specified" do expected_width = 400 data = [ ['This is a column with a lot of text that should comfortably exceed '+ 'the width of a normal document margin_box width', 'Some more text', 'and then some more', 'Just a bit more to be extra sure'] ] table = Prawn::Table.new(data, @pdf, :width => expected_width) do column(1).width = 100 end table.width.should == expected_width end it "should calculate unspecified column widths even " + "with colspan cells declared" do pdf = Prawn::Document.new hpad, fs = 3, 5 columns = 3 data = [ [ { :content => 'foo', :colspan => 2 }, "foobar" ], [ "foo", "foo", "foo" ] ] table = Prawn::Table.new( data, pdf, :cell_style => { :padding_left => hpad, :padding_right => hpad, :size => fs }) col0_width = pdf.width_of("foo", :size => fs) # cell 1, 0 col1_width = pdf.width_of("foo", :size => fs) # cell 1, 1 col2_width = pdf.width_of("foobar", :size => fs) # cell 0, 1 (at col 2) table.width.should == col0_width + col1_width + col2_width + 2*columns*hpad end end describe "height" do it "should set all cells in a row to the same height" do @table = @pdf.table([["foo", @long_text]]) @table.cells[0, 0].height.should == @table.cells[0, 1].height end it "should move y-position to the bottom of the table after drawing" do old_y = @pdf.y table = @pdf.table([["foo"]]) @pdf.y.should == old_y - table.height end it "should_not wrap unnecessarily" do # Test for FP errors and glitches t = @pdf.table([["Bender Bending Rodriguez"]]) h = @pdf.height_of("one line") (t.height - 10).should be < h*1.5 end it "should have a height of n rows" do data = [["foo"],["bar"],["baaaz"]] vpad = 4 origin = @pdf.y @pdf.table data, :cell_style => { :padding => vpad } table_height = origin - @pdf.y font_height = @pdf.font.height line_gap = @pdf.font.line_gap num_rows = data.length table_height.should be_within(0.001).of( num_rows * font_height + 2*vpad*num_rows ) end end describe "position" do it "should center tables with :position => :center" do @pdf.expects(:bounding_box).with do |(x, y), opts| expected = (@pdf.bounds.width - 500) / 2.0 (x - expected).abs < 0.001 end @pdf.table([["foo"]], :column_widths => 500, :position => :center) end it "should right-align tables with :position => :right" do @pdf.expects(:bounding_box).with do |(x, y), opts| expected = @pdf.bounds.width - 500 (x - expected).abs < 0.001 end @pdf.table([["foo"]], :column_widths => 500, :position => :right) end it "should accept a Numeric" do @pdf.expects(:bounding_box).with do |(x, y), opts| expected = 123 (x - expected).abs < 0.001 end @pdf.table([["foo"]], :column_widths => 500, :position => 123) end it "should raise_error an ArgumentError on unknown :position" do lambda do @pdf.table([["foo"]], :position => :bratwurst) end.should raise_error(ArgumentError) end end end describe "Multi-page tables" do it "should flow to the next page when hitting the bottom of the bounds" do Prawn::Document.new { table([["foo"]] * 30) }.page_count.should == 1 Prawn::Document.new { table([["foo"]] * 31) }.page_count.should == 2 Prawn::Document.new { table([["foo"]] * 31); table([["foo"]] * 35) }. page_count.should == 3 end it "should respect the containing bounds" do Prawn::Document.new do bounding_box([0, cursor], :width => bounds.width, :height => 72) do table([["foo"]] * 4) end end.page_count.should == 2 end it "should_not start a new page before finishing out a row" do Prawn::Document.new do table([[ (1..80).map{ |i| "Line #{i}" }.join("\n"), "Column 2" ]]) end.page_count.should == 1 end it "should only start new page on long cells if it would gain us height" do Prawn::Document.new do text "Hello" table([[ (1..80).map{ |i| "Line #{i}" }.join("\n"), "Column 2" ]]) end.page_count.should == 2 end it "should_not start a new page to gain height when at the top of " + "a bounding box, even if stretchy" do Prawn::Document.new do bounding_box([bounds.left, bounds.top - 20], :width => 400) do table([[ (1..80).map{ |i| "Line #{i}" }.join("\n"), "Column 2" ]]) end end.page_count.should == 1 end it "should still break to the next page if in a stretchy bounding box " + "but not at the top" do Prawn::Document.new do bounding_box([bounds.left, bounds.top - 20], :width => 400) do text "Hello" table([[ (1..80).map{ |i| "Line #{i}" }.join("\n"), "Column 2" ]]) end end.page_count.should == 2 end it "should only draw first-page header if the first body row fits" do pdf = Prawn::Document.new pdf.y = 60 # not enough room for a table row pdf.table [["Header"], ["Body"]], :header => true output = PDF::Inspector::Page.analyze(pdf.render) # Ensure we only drew the header once, on the second page output.pages[0][:strings].should be_empty output.pages[1][:strings].should == ["Header", "Body"] end it "should draw background before borders, but only within pages" do seq = sequence("drawing_order") @pdf = Prawn::Document.new # give enough room for only the first row @pdf.y = @pdf.bounds.absolute_bottom + 30 t = @pdf.make_table([["A", "B"], ["C", "D"]], :cell_style => {:background_color => 'ff0000'}) ca = t.cells[0, 0] cb = t.cells[0, 1] cc = t.cells[1, 0] cd = t.cells[1, 1] # All backgrounds should draw before any borders on page 1... ca.expects(:draw_background).in_sequence(seq) cb.expects(:draw_background).in_sequence(seq) ca.expects(:draw_borders).in_sequence(seq) cb.expects(:draw_borders).in_sequence(seq) # ...and page 2 @pdf.expects(:start_new_page).in_sequence(seq) cc.expects(:draw_background).in_sequence(seq) cd.expects(:draw_background).in_sequence(seq) cc.expects(:draw_borders).in_sequence(seq) cd.expects(:draw_borders).in_sequence(seq) t.draw end describe "before_rendering_page callback" do before(:each) { @pdf = Prawn::Document.new } it "is passed all cells to be rendered on that page" do kicked = 0 @pdf.table([["foo"]] * 100) do |t| t.before_rendering_page do |page| page.row_count.should == ((kicked < 3) ? 30 : 10) page.column_count.should == 1 page.row(0).first.content.should == "foo" page.row(-1).first.content.should == "foo" kicked += 1 end end kicked.should == 4 end it "numbers cells relative to their position on page" do @pdf.table([["foo"]] * 100) do |t| t.before_rendering_page do |page| page[0, 0].content.should == "foo" end end end it "changing cells in the callback affects their rendering" do seq = sequence("render order") t = @pdf.make_table([["foo"]] * 40) do |table| table.before_rendering_page do |page| page[0, 0].background_color = "ff0000" end end t.cells[30, 0].stubs(:draw_background).checking do |xy| t.cells[30, 0].background_color.should == 'ff0000' end t.cells[31, 0].stubs(:draw_background).checking do |xy| t.cells[31, 0].background_color.should == nil end t.draw end it "passes headers on page 2+" do @pdf.table([["header"]] + [["foo"]] * 100, :header => true) do |t| t.before_rendering_page do |page| page[0, 0].content.should == "header" end end end it "allows headers to be changed" do seq = sequence("render order") @pdf.expects(:draw_text!).with { |t, _| t == "hdr1"}.in_sequence(seq) @pdf.expects(:draw_text!).with { |t, _| t == "foo"}.times(29).in_sequence(seq) # Verify that the changed cell doesn't mutate subsequent pages @pdf.expects(:draw_text!).with { |t, _| t == "header"}.in_sequence(seq) @pdf.expects(:draw_text!).with { |t, _| t == "foo"}.times(11).in_sequence(seq) set_first_page_headers = false @pdf.table([["header"]] + [["foo"]] * 40, :header => true) do |t| t.before_rendering_page do |page| # only change first page header page[0, 0].content = "hdr1" unless set_first_page_headers set_first_page_headers = true end end end end end describe "#style" do it "should send #style to its first argument, passing the style hash and" + " block" do stylable = stub() stylable.expects(:style).with(:foo => :bar).once.yields block = stub() block.expects(:kick).once Prawn::Document.new do table([["x"]]) { style(stylable, :foo => :bar) { block.kick } } end end it "should default to {} for the hash argument" do stylable = stub() stylable.expects(:style).with({}).once Prawn::Document.new do table([["x"]]) { style(stylable) } end end end describe "row_colors" do it "should allow array syntax for :row_colors" do data = [["foo"], ["bar"], ["baz"]] pdf = Prawn::Document.new t = pdf.table(data, :row_colors => ['cccccc', 'ffffff']) t.cells.map{|x| x.background_color}.should == %w[cccccc ffffff cccccc] end it "should ignore headers" do data = [["header"], ["foo"], ["bar"], ["baz"]] pdf = Prawn::Document.new t = pdf.table(data, :header => true, :row_colors => ['cccccc', 'ffffff']) do row(0).background_color = '333333' end t.cells.map{|x| x.background_color}.should == %w[333333 cccccc ffffff cccccc] end it "stripes rows consistently from page to page, skipping header rows" do data = [["header"]] + [["foo"]] * 70 pdf = Prawn::Document.new t = pdf.make_table(data, :header => true, :row_colors => ['cccccc', 'ffffff']) do cells.padding = 0 cells.size = 9 row(0).size = 11 end # page 1: header + 67 cells (odd number -- verifies that the next # page disrupts the even/odd coloring, since both the last data cell # on this page and the first one on the next are colored cccccc) Prawn::Table::Cell.expects(:draw_cells).with do |cells| cells.map { |c, (x, y)| c.background_color } == [nil] + (%w[cccccc ffffff] * 33) + %w[cccccc] end # page 2: header and 3 data cells Prawn::Table::Cell.expects(:draw_cells).with do |cells| cells.map { |c, (x, y)| c.background_color } == [nil] + %w[cccccc ffffff cccccc] end t.draw end it "should_not override an explicit background_color" do data = [["foo"], ["bar"], ["baz"]] pdf = Prawn::Document.new table = pdf.table(data, :row_colors => ['cccccc', 'ffffff']) { |t| t.cells[0, 0].background_color = 'dddddd' } table.cells.map{|x| x.background_color}.should == %w[dddddd ffffff cccccc] end end describe "inking" do before(:each) do @pdf = Prawn::Document.new end it "should set the x-position of each cell based on widths" do @table = @pdf.table([["foo", "bar", "baz"]]) x = 0 (0..2).each do |col| cell = @table.cells[0, col] cell.x.should == x x += cell.width end end it "should set the y-position of each cell based on heights" do y = 0 @table = @pdf.make_table([["foo"], ["bar"], ["baz"]]) (0..2).each do |row| cell = @table.cells[row, 0] cell.y.should be_within(0.01).of(y) y -= cell.height end end it "should output content cell by cell, row by row" do data = [["foo","bar"],["baz","bang"]] @pdf = Prawn::Document.new @pdf.table(data) output = PDF::Inspector::Text.analyze(@pdf.render) output.strings.should == data.flatten end it "should_not cause an error if rendering the very first row causes a " + "page break" do Prawn::Document.new do |pdf| arr = Array(1..5).collect{|i| ["cell #{i}"] } pdf.move_down( pdf.y - (pdf.bounds.absolute_bottom + 3) ) lambda { pdf.table(arr) }.should_not raise_error end end it "should draw all backgrounds before any borders" do # lest backgrounds overlap borders: # https://github.com/sandal/prawn/pull/226 seq = sequence("drawing_order") t = @pdf.make_table([["A", "B"]], :cell_style => {:background_color => 'ff0000'}) ca = t.cells[0, 0] cb = t.cells[0, 1] # XXX Not a perfectly general test, because it would still be acceptable # if we drew B then A ca.expects(:draw_background).in_sequence(seq) cb.expects(:draw_background).in_sequence(seq) ca.expects(:draw_borders).in_sequence(seq) cb.expects(:draw_borders).in_sequence(seq) t.draw end it "should allow multiple inkings of the same table" do pdf = Prawn::Document.new t = Prawn::Table.new([["foo"]], pdf) pdf.expects(:bounding_box).with{|(x, y), options| y.to_i == 495}.yields pdf.expects(:bounding_box).with{|(x, y), options| y.to_i == 395}.yields pdf.expects(:draw_text!).with{ |text, options| text == 'foo' }.twice pdf.move_cursor_to(500) t.draw pdf.move_cursor_to(400) t.draw end describe "in stretchy bounding boxes" do it "should draw all cells on a row at the same y-position" do pdf = Prawn::Document.new text_y = pdf.y.to_i - 5 # text starts 5pt below current y pos (padding) pdf.bounding_box([0, pdf.cursor], :width => pdf.bounds.width) do pdf.expects(:draw_text!).checking { |text, options| pdf.bounds.absolute_top.should == text_y }.times(3) pdf.table([%w[a b c]]) end end end end describe "headers" do it "should add headers to output when specified" do data = [["a", "b"], ["foo","bar"],["baz","bang"]] @pdf = Prawn::Document.new @pdf.table(data, :header => true) output = PDF::Inspector::Text.analyze(@pdf.render) output.strings.should == data.flatten end it "should repeat headers across pages" do data = [["foo","bar"]] * 30 headers = ["baz","foobar"] @pdf = Prawn::Document.new @pdf.table([headers] + data, :header => true) output = PDF::Inspector::Text.analyze(@pdf.render) output.strings.should == headers + data.flatten[0..-3] + headers + data.flatten[-2..-1] end it "draws headers at the correct position" do data = [["header"]] + [["foo"]] * 40 Prawn::Table::Cell.expects(:draw_cells).times(2).checking do |cells| cells.each do |cell, pt| if cell.content == "header" # Assert that header text is drawn at the same location on each page if @header_location pt.should == @header_location else @header_location = pt end end end end @pdf = Prawn::Document.new @pdf.table(data, :header => true) end it "should_not draw header twice when starting new page" do @pdf = Prawn::Document.new @pdf.y = 0 @pdf.table([["Header"], ["Body"]], :header => true) output = PDF::Inspector::Text.analyze(@pdf.render) output.strings.should == ["Header", "Body"] end end describe "nested tables" do before(:each) do @pdf = Prawn::Document.new @subtable = Prawn::Table.new([["foo"]], @pdf) @table = @pdf.table([[@subtable, "bar"]]) end it "can be created from an Array" do cell = Prawn::Table::Cell.make(@pdf, [["foo"]]) cell.should be_a_kind_of(Prawn::Table::Cell::Subtable) cell.subtable.should be_a_kind_of(Prawn::Table) end it "defaults its padding to zero" do @table.cells[0, 0].padding.should == [0, 0, 0, 0] end it "has a subtable accessor" do @table.cells[0, 0].subtable.should == @subtable end it "determines its dimensions from the subtable" do @table.cells[0, 0].width.should == @subtable.width @table.cells[0, 0].height.should == @subtable.height end end describe "An invalid table" do before(:each) do @pdf = Prawn::Document.new @bad_data = ["Single Nested Array"] end it "should raise_error error when invalid table data is given" do lambda { @pdf.table(@bad_data) }.should raise_error(Prawn::Errors::InvalidTableData) end it "should raise_error an EmptyTableError with empty table data" do lambda { data = [] @pdf = Prawn::Document.new @pdf.table(data) }.should raise_error( Prawn::Errors::EmptyTable ) end it "should raise_error an EmptyTableError with nil table data" do lambda { data = nil @pdf = Prawn::Document.new @pdf.table(data) }.should raise_error( Prawn::Errors::EmptyTable ) end end end describe "colspan / rowspan" do before(:each) { create_pdf } it "doesn't raise an error" do lambda { @pdf.table([[{:content => "foo", :colspan => 2, :rowspan => 2}]]) }.should_not raise_error end it "colspan is properly counted" do t = @pdf.make_table([[{:content => "foo", :colspan => 2}]]) t.column_length.should == 2 end it "rowspan is properly counted" do t = @pdf.make_table([[{:content => "foo", :rowspan => 2}]]) t.row_length.should == 2 end it "raises if colspan or rowspan are called after layout" do lambda { @pdf.table([["foo"]]) { cells[0, 0].colspan = 2 } }.should raise_error(Prawn::Errors::InvalidTableSpan) lambda { @pdf.table([["foo"]]) { cells[0, 0].rowspan = 2 } }.should raise_error(Prawn::Errors::InvalidTableSpan) end it "raises when spans overlap" do lambda { @pdf.table([["foo", {:content => "bar", :rowspan => 2}], [{:content => "baz", :colspan => 2}]]) }.should raise_error(Prawn::Errors::InvalidTableSpan) end it "table and cell width account for colspan" do t = @pdf.table([["a", {:content => "b", :colspan => 2}]], :column_widths => [100, 100, 100]) spanned = t.cells[0, 1] spanned.colspan.should == 2 t.width.should == 300 t.cells.min_width.should == 300 t.cells.max_width.should == 300 spanned.width.should == 200 end it "table and cell height account for rowspan" do t = @pdf.table([["a"], [{:content => "b", :rowspan => 2}]]) do row(0..2).height = 100 end spanned = t.cells[1, 0] spanned.rowspan.should == 2 t.height.should == 300 spanned.height.should == 200 end it "provides the full content_width as drawing space" do w = @pdf.make_table([["foo"]]).cells[0, 0].content_width t = @pdf.make_table([[{:content => "foo", :colspan => 2}]]) t.cells[0, 0].spanned_content_width.should == w end it "dummy cells are not drawn" do # make a fake master cell for the dummy cell to slave to t = @pdf.make_table([[{:content => "foo", :colspan => 2}]]) # drawing just a dummy cell should_not ink @pdf.expects(:stroke_line).never @pdf.expects(:draw_text!).never Prawn::Table::Cell.draw_cells([t.cells[0, 1]]) end it "dummy cells do not add any height or width" do t1 = @pdf.table([["foo"]]) t2 = @pdf.table([[{:content => "foo", :colspan => 2}]]) t2.width.should == t1.width t3 = @pdf.table([[{:content => "foo", :rowspan => 2}]]) t3.height.should == t1.height end it "dummy cells ignored by #style" do t = @pdf.table([[{:content => "blah", :colspan => 2}]], :cell_style => { :size => 9 }) t.cells[0, 0].size.should == 9 end context "inheriting master cell styles from dummy cell" do # Relatively full coverage for all these attributes that should be # inherited. [["border_X_width", 20], ["border_X_color", "123456"], ["padding_X", 20]].each do |attribute, val| attribute_right = attribute.sub("X", "right") attribute_left = attribute.sub("X", "left") attribute_bottom = attribute.sub("X", "bottom") attribute_top = attribute.sub("X", "top") specify "#{attribute_right} of right column is inherited" do t = @pdf.table([[{:content => "blah", :colspan => 2}]]) do |table| table.column(1).send("#{attribute_right}=", val) end t.cells[0, 0].send(attribute_right).should == val end specify "#{attribute_bottom} of bottom row is inherited" do t = @pdf.table([[{:content => "blah", :rowspan => 2}]]) do |table| table.row(1).send("#{attribute_bottom}=", val) end t.cells[0, 0].send(attribute_bottom).should == val end specify "#{attribute_left} of right column is not inherited" do t = @pdf.table([[{:content => "blah", :colspan => 2}]]) do |table| table.column(1).send("#{attribute_left}=", val) end t.cells[0, 0].send(attribute_left).should_not == val end specify "#{attribute_right} of interior column is not inherited" do t = @pdf.table([[{:content => "blah", :colspan => 3}]]) do |table| table.column(1).send("#{attribute_right}=", val) end t.cells[0, 0].send(attribute_right).should_not == val end specify "#{attribute_bottom} of interior row is not inherited" do t = @pdf.table([[{:content => "blah", :rowspan => 3}]]) do |table| table.row(1).send("#{attribute_bottom}=", val) end t.cells[0, 0].send(attribute_bottom).should_not == val end specify "#{attribute_top} of bottom row is not inherited" do t = @pdf.table([[{:content => "blah", :rowspan => 2}]]) do |table| table.row(1).send("#{attribute_top}=", val) end t.cells[0, 0].send(attribute_top).should_not == val end end end it "splits natural width between cols in the group" do t = @pdf.table([[{:content => "foo", :colspan => 2}]]) widths = t.column_widths widths[0].should == widths[1] end it "splits natural width between cols when width is increased" do t = @pdf.table([[{:content => "foo", :colspan => 2}]], :width => @pdf.bounds.width) widths = t.column_widths widths[0].should == widths[1] end it "splits min-width between cols in the group" do # Since column_widths, when reducing column widths, reduces proportional to # the remaining width after each column's min width, we must ensure that the # min-width is split proportionally in order to ensure the width is still # split evenly when the width is reduced. (See "splits natural width between # cols when width is reduced".) t = @pdf.table([[{:content => "foo", :colspan => 2}]], :width => 20) t.column(0).min_width.should == t.column(1).min_width end it "splits natural width between cols when width is reduced" do t = @pdf.table([[{:content => "foo", :colspan => 2}]], :width => 20) widths = t.column_widths widths[0].should == widths[1] end it "honors a large, explicitly set table width" do t = @pdf.table([[{:content => "AAAAAAAAAA", :colspan => 3}], ["A", "B", "C"]], :width => 400) t.column_widths.inject(0) { |sum, w| sum + w }. should be_within(0.01).of(400) end it "honors a small, explicitly set table width" do t = @pdf.table([[{:content => "Lorem ipsum dolor sit amet " * 20, :colspan => 3}], ["A", "B", "C"]], :width => 200) t.column_widths.inject(0) { |sum, w| sum + w }. should be_within(0.01).of(200) end it "splits natural_content_height between rows in the group" do t = @pdf.table([[{:content => "foo", :rowspan => 2}]]) heights = t.row_heights heights[0].should == heights[1] end it "skips column numbers that have been col-spanned" do t = @pdf.table([["a", "b", {:content => "c", :colspan => 3}, "d"]]) t.cells[0, 0].content.should == "a" t.cells[0, 1].content.should == "b" t.cells[0, 2].content.should == "c" t.cells[0, 3].should be_a_kind_of(Prawn::Table::Cell::SpanDummy) t.cells[0, 4].should be_a_kind_of(Prawn::Table::Cell::SpanDummy) t.cells[0, 5].content.should == "d" end it "skips row/col positions that have been row-spanned" do t = @pdf.table([["a", {:content => "b", :colspan => 2, :rowspan => 2}, "c"], ["d", "e"], ["f", "g", "h", "i"]]) t.cells[0, 0].content.should == "a" t.cells[0, 1].content.should == "b" t.cells[0, 2].should be_a_kind_of(Prawn::Table::Cell::SpanDummy) t.cells[0, 3].content.should == "c" t.cells[1, 0].content.should == "d" t.cells[1, 1].should be_a_kind_of(Prawn::Table::Cell::SpanDummy) t.cells[1, 2].should be_a_kind_of(Prawn::Table::Cell::SpanDummy) t.cells[1, 3].content.should == "e" t.cells[2, 0].content.should == "f" t.cells[2, 1].content.should == "g" t.cells[2, 2].content.should == "h" t.cells[2, 3].content.should == "i" end end ruby-prawn-1.0.0~rc2.orig/spec/extensions/0000755000000000000000000000000012114176157017216 5ustar rootrootruby-prawn-1.0.0~rc2.orig/spec/extensions/encoding_helpers.rb0000644000000000000000000000016612114176157023056 0ustar rootrootmodule EncodingHelpers def win1252_string(str) ruby_19 { str.force_encoding("Windows-1252") } str end end ruby-prawn-1.0.0~rc2.orig/spec/extensions/mocha.rb0000644000000000000000000000226612114176157020640 0ustar rootroot# Allow speccing things when an expectation matcher runs. Similar to #with, but # always succeeds. # # @pdf.expects(:stroke_line).checking do |from, to| # @pdf.map_to_absolute(from).should == [0, 0] # end # # Note that the outer expectation does *not* fail only because the inner one # does; in the above example, the outer expectation would only fail if # stroke_line were not called. class ParameterChecker < Mocha::ParametersMatcher def initialize(&matching_block) @expected_parameters = [Mocha::ParameterMatchers::AnyParameters.new] @matching_block = matching_block end def match?(actual_parameters = []) @matching_block.call(*actual_parameters) true # always succeed end end class Mocha::Expectation def checking(&block) @parameters_matcher = ParameterChecker.new(&block) self end end # Equivalent to expects(method_name).at_least(0). More useful when combined # with parameter matchers to ignore certain calls for the sake of parameter # matching. # # @pdf.ignores(:stroke_color=).with("000000") # @pdf.expects(:stroke_color=).with("ff0000") # module Mocha::ObjectMethods def ignores(method_name) expects(method_name).at_least(0) end end ruby-prawn-1.0.0~rc2.orig/spec/name_tree_spec.rb0000644000000000000000000001030112114176157020310 0ustar rootrootrequire File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") def tree_dump(tree) if tree.is_a?(Prawn::Core::NameTree::Node) "[" + tree.children.map { |child| tree_dump(child) }.join(",") + "]" else "#{tree.name}=#{tree.value}" end end def tree_add(tree, *args) args.each do |(name, value)| tree.add(name, value) end end def tree_value(name, value) Prawn::Core::NameTree::Value.new(name, value) end class RefExposingDocument < Prawn::Document def object_store state.store end end describe "Name Tree" do before(:each) { create_pdf(RefExposingDocument) } it "should have no children when first initialized" do node = Prawn::Core::NameTree::Node.new(@pdf, 3) node.children.length.should == 0 end it "should have no subtrees while child limit is not reached" do node = Prawn::Core::NameTree::Node.new(@pdf, 3) tree_add(node, ["one", 1], ["two", 2], ["three", 3]) tree_dump(node).should == "[one=1,three=3,two=2]" end it "should split into subtrees when limit is exceeded" do node = Prawn::Core::NameTree::Node.new(@pdf, 3) tree_add(node, ["one", 1], ["two", 2], ["three", 3], ["four", 4]) tree_dump(node).should == "[[four=4,one=1],[three=3,two=2]]" end it "should create a two new references when root is split" do ref_count = @pdf.object_store.length node = Prawn::Core::NameTree::Node.new(@pdf, 3) tree_add(node, ["one", 1], ["two", 2], ["three", 3], ["four", 4]) @pdf.object_store.length.should == ref_count+2 end it "should create a one new reference when subtree is split" do node = Prawn::Core::NameTree::Node.new(@pdf, 3) tree_add(node, ["one", 1], ["two", 2], ["three", 3], ["four", 4]) ref_count = @pdf.object_store.length # save when root is split tree_add(node, ["five", 5], ["six", 6], ["seven", 7]) tree_dump(node).should == "[[five=5,four=4,one=1],[seven=7,six=6],[three=3,two=2]]" @pdf.object_store.length.should == ref_count+1 end it "should keep tree balanced when subtree split cascades to root" do node = Prawn::Core::NameTree::Node.new(@pdf, 3) tree_add(node, ["one", 1], ["two", 2], ["three", 3], ["four", 4]) tree_add(node, ["five", 5], ["six", 6], ["seven", 7], ["eight", 8]) tree_dump(node).should == "[[[eight=8,five=5],[four=4,one=1]],[[seven=7,six=6],[three=3,two=2]]]" end it "should maintain order of already properly ordered nodes" do node = Prawn::Core::NameTree::Node.new(@pdf, 3) tree_add(node, ["eight", 8], ["five", 5], ["four", 4], ["one", 1]) tree_add(node, ['seven', 7], ['six', 6], ['three', 3], ['two', 2]) tree_dump(node).should == "[[[eight=8,five=5],[four=4,one=1]],[[seven=7,six=6],[three=3,two=2]]]" end it "should emit only :Names key with to_hash if root is only node" do node = Prawn::Core::NameTree::Node.new(@pdf, 3) tree_add(node, ["one", 1], ["two", 2], ["three", 3]) node.to_hash.should ==( { :Names => [tree_value("one", 1), tree_value("three", 3), tree_value("two", 2)] } ) end it "should emit only :Kids key with to_hash if root has children" do node = Prawn::Core::NameTree::Node.new(@pdf, 3) tree_add(node, ["one", 1], ["two", 2], ["three", 3], ["four", 4]) node.to_hash.should ==({ :Kids => node.children.map { |child| child.ref } }) end it "should emit :Limits and :Names keys with to_hash for leaf node" do node = Prawn::Core::NameTree::Node.new(@pdf, 3) tree_add(node, ["one", 1], ["two", 2], ["three", 3], ["four", 4]) node.children.first.to_hash.should ==( { :Limits => %w(four one), :Names => [tree_value("four", 4), tree_value("one", 1)] } ) end it "should emit :Limits and :Kids keys with to_hash for inner node" do node = Prawn::Core::NameTree::Node.new(@pdf, 3) tree_add(node, ["one", 1], ["two", 2], ["three", 3], ["four", 4]) tree_add(node, ["five", 5], ["six", 6], ["seven", 7], ["eight", 8]) tree_add(node, ["nine", 9], ["ten", 10], ["eleven", 11], ["twelve", 12]) tree_add(node, ["thirteen", 13], ["fourteen", 14], ["fifteen", 15], ["sixteen", 16]) node.children.first.to_hash.should ==( { :Limits => %w(eight one), :Kids => node.children.first.children.map { |child| child.ref } } ) end end ruby-prawn-1.0.0~rc2.orig/spec/text_box_spec.rb0000644000000000000000000010560612114176157020222 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "Text::Box#nothing_printed?" do it "should be_true when nothing printed" do create_pdf string = "Hello world, how are you?\nI'm fine, thank you." text_box = Prawn::Text::Box.new(string, :height => 2, :document => @pdf) text_box.render text_box.nothing_printed?.should be_true end it "should be_false when something printed" do create_pdf string = "Hello world, how are you?\nI'm fine, thank you." text_box = Prawn::Text::Box.new(string, :height => 14, :document => @pdf) text_box.render text_box.nothing_printed?.should be_false end end describe "Text::Box#everything_printed?" do it "should be_false when not everything printed" do create_pdf string = "Hello world, how are you?\nI'm fine, thank you." text_box = Prawn::Text::Box.new(string, :height => 14, :document => @pdf) text_box.render text_box.everything_printed?.should be_false end it "should be_true when everything printed" do create_pdf string = "Hello world, how are you?\nI'm fine, thank you." text_box = Prawn::Text::Box.new(string, :document => @pdf) text_box.render text_box.everything_printed?.should be_true end end describe "Text::Box#line_gap" do it "should == the line gap of the font when using a single " + "font and font size" do create_pdf string = "Hello world, how are you?\nI'm fine, thank you." text_box = Prawn::Text::Box.new(string, :document => @pdf) text_box.render text_box.line_gap.should be_within(0.0001).of(@pdf.font.line_gap) end end describe "Text::Box" do it "should be able to set text direction document-wide" do create_pdf @pdf.text_direction(:rtl) @pdf.text_direction = :rtl string = "Hello world, how are you?\nI'm fine, thank you." text_box = Prawn::Text::Box.new(string, :document => @pdf) text_box.render text = PDF::Inspector::Text.analyze(@pdf.render) text.strings[0].should == "?uoy era woh ,dlrow olleH" text.strings[1].should == ".uoy knaht ,enif m'I" end it "should be able to reverse multi-byte text" do create_pdf @pdf.text_direction(:rtl) @pdf.text_direction = :rtl @pdf.text_direction = :rtl @pdf.font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf", :size => 16) do @pdf.text "写个小" end text = PDF::Inspector::Text.analyze(@pdf.render) text.strings[0].should == "小个写" end it "option should be able to override document-wide text direction" do create_pdf @pdf.text_direction = :rtl string = "Hello world, how are you?\nI'm fine, thank you." text_box = Prawn::Text::Box.new(string, :document => @pdf, :direction => :ltr) text_box.render text = PDF::Inspector::Text.analyze(@pdf.render) text.strings[0].should == "Hello world, how are you?" text.strings[1].should == "I'm fine, thank you." end end describe "Text::Box" do it "should be able to set leading document-wide" do create_pdf @pdf.default_leading(7) @pdf.default_leading = 7 text_box = Prawn::Text::Box.new("hello world", :document => @pdf) text_box.leading.should == 7 end it "option should be able to override document-wide leading" do create_pdf @pdf.default_leading = 7 text_box = Prawn::Text::Box.new("hello world", :document => @pdf, :leading => 20) text_box.leading.should == 20 end it "should default to document-wide leading if no" + "leading option is provided" do end end describe "Text::Box#render with :align => :justify" do it "should draw the word spacing to the document" do create_pdf string = "hello world " * 20 options = { :document => @pdf, :align => :justify } text_box = Prawn::Text::Box.new(string, options) text_box.render contents = PDF::Inspector::Text.analyze(@pdf.render) contents.word_spacing[0].should be > 0 end it "should not justify the last line of a paragraph" do create_pdf string = "hello world " options = { :document => @pdf, :align => :justify } text_box = Prawn::Text::Box.new(string, options) text_box.render contents = PDF::Inspector::Text.analyze(@pdf.render) contents.word_spacing.should be_empty end end describe "Text::Box" do it "should only require enough space for the descender and the ascender " + "when determining whether a line can fit" do create_pdf text = "Oh hai text rect" options = { :document => @pdf, :height => @pdf.font.ascender + @pdf.font.descender } text_box = Prawn::Text::Box.new(text, options) text_box.render text_box.text.should == "Oh hai text rect" text = "Oh hai text rect\nOh hai text rect" options = { :document => @pdf, :height => @pdf.font.height + @pdf.font.ascender + @pdf.font.descender } text_box = Prawn::Text::Box.new(text, options) text_box.render text_box.text.should == "Oh hai text rect\nOh hai text rect" end end describe "Text::Box#height without leading" do it "should == the sum of the height of each line, " + "not including the space below the last line" do create_pdf text = "Oh hai text rect.\nOh hai text rect." options = { :document => @pdf } text_box = Prawn::Text::Box.new(text, options) text_box.render text_box.height.should be_within(0.001).of(@pdf.font.height * 2 - @pdf.font.line_gap) end end describe "Text::Box#height with leading" do it "should == the sum of the height of each line plus leading, " + "but not including the space below the last line" do create_pdf text = "Oh hai text rect.\nOh hai text rect." leading = 12 options = { :document => @pdf, :leading => leading } text_box = Prawn::Text::Box.new(text, options) text_box.render text_box.height.should be_within(0.001).of((@pdf.font.height + leading) * 2 - @pdf.font.line_gap - leading) end end describe "Text::Box with :draw_text_callback" do before(:each) { create_pdf } it "hits the callback whenever text is drawn" do draw_block = stub() draw_block.expects(:kick).with("this text is long enough to") draw_block.expects(:kick).with("span two lines") @pdf.text_box "this text is long enough to span two lines", :width => 150, :draw_text_callback => lambda { |text, _| draw_block.kick(text) } end it "hits the callback once per fragment for :inline_format" do draw_block = stub() draw_block.expects(:kick).with("this text has ") draw_block.expects(:kick).with("fancy") draw_block.expects(:kick).with(" formatting") @pdf.text_box "this text has fancy formatting", :inline_format => true, :width => 500, :draw_text_callback => lambda { |text, _| draw_block.kick(text) } end it "does not call #draw_text!" do @pdf.expects(:draw_text!).never @pdf.text_box "some text", :width => 500, :draw_text_callback => lambda { |_, _| } end end describe "Text::Box#valid_options" do it "should return an array" do create_pdf text_box = Prawn::Text::Box.new("", :document => @pdf) text_box.valid_options.should be_a_kind_of(Array) end end describe "Text::Box#render" do it "should not fail if height is smaller than 1 line" do create_pdf @text = "Oh hai text rect. " * 10 @options = { :height => @pdf.font.height * 0.5, :document => @pdf } text_box = Prawn::Text::Box.new(@text, @options) text_box.render text_box.text.should == "" end it "should draw content to the page" do create_pdf @text = "Oh hai text rect. " * 10 @options = { :document => @pdf } text_box = Prawn::Text::Box.new(@text, @options) text_box.render text = PDF::Inspector::Text.analyze(@pdf.render) text.strings.should_not be_empty end it "should not draw a transformation matrix" do create_pdf @text = "Oh hai text rect. " * 10 @options = { :document => @pdf } text_box = Prawn::Text::Box.new(@text, @options) text_box.render matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render) matrices.matrices.length.should == 0 end end describe "Text::Box#render(:single_line => true)" do it "should draw only one line to the page" do create_pdf @text = "Oh hai text rect. " * 10 @options = { :document => @pdf, :single_line => true } text_box = Prawn::Text::Box.new(@text, @options) text_box.render text = PDF::Inspector::Text.analyze(@pdf.render) text.strings.length.should == 1 end end describe "Text::Box#render(:dry_run => true)" do it "should not draw any content to the page" do create_pdf @text = "Oh hai text rect. " * 10 @options = { :document => @pdf } text_box = Prawn::Text::Box.new(@text, @options) text_box.render(:dry_run => true) text = PDF::Inspector::Text.analyze(@pdf.render) text.strings.should be_empty end it "subsequent calls to render should_not raise_error an ArgumentError exception" do create_pdf @text = "™©" @options = { :document => @pdf } text_box = Prawn::Text::Box.new(@text, @options) text_box.render(:dry_run => true) lambda { text_box.render }.should_not raise_error( Prawn::Errors::IncompatibleStringEncoding) end end describe "Text::Box#render(:valign => :bottom)" do it "#at should be the same from one dry run to the next" do create_pdf text = "this is center text " * 12 options = { :width => 162, :valign => :bottom, :document => @pdf } text_box = Prawn::Text::Box.new(text, options) text_box.render(:dry_run => true) original_at = text_box.at.dup text_box.render(:dry_run => true) text_box.at.should == original_at end end describe "Text::Box#render(:valign => :center)" do it "#at should be the same from one dry run to the next" do create_pdf text = "this is center text " * 12 options = { :width => 162, :valign => :center, :document => @pdf } text_box = Prawn::Text::Box.new(text, options) text_box.render(:dry_run => true) original_at = text_box.at.dup text_box.render(:dry_run => true) text_box.at.should == original_at end end describe "Text::Box#render with :rotate option of 30)" do before(:each) do create_pdf rotate = 30 @x = 300 @y = 70 @width = 100 @height = 50 @cos = Math.cos(rotate * Math::PI / 180) @sin = Math.sin(rotate * Math::PI / 180) @text = "Oh hai text rect. " * 10 @options = { :document => @pdf, :rotate => rotate, :at => [@x, @y], :width => @width, :height => @height } end context ":rotate_around option of :center" do it "should draw content to the page rotated about the center of the text" do @options[:rotate_around] = :center text_box = Prawn::Text::Box.new(@text, @options) text_box.render matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render) x = @x + @width / 2 y = @y - @height / 2 x_prime = x * @cos - y * @sin y_prime = x * @sin + y * @cos matrices.matrices[0].should == [1, 0, 0, 1, reduce_precision(x - x_prime), reduce_precision(y - y_prime)] matrices.matrices[1].should == [reduce_precision(@cos), reduce_precision(@sin), reduce_precision(-@sin), reduce_precision(@cos), 0, 0] text = PDF::Inspector::Text.analyze(@pdf.render) text.strings.should_not be_empty end end context ":rotate_around option of :upper_left" do it "should draw content to the page rotated about the upper left corner of the text" do @options[:rotate_around] = :upper_left text_box = Prawn::Text::Box.new(@text, @options) text_box.render matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render) x = @x y = @y x_prime = x * @cos - y * @sin y_prime = x * @sin + y * @cos matrices.matrices[0].should == [1, 0, 0, 1, reduce_precision(x - x_prime), reduce_precision(y - y_prime)] matrices.matrices[1].should == [reduce_precision(@cos), reduce_precision(@sin), reduce_precision(-@sin), reduce_precision(@cos), 0, 0] text = PDF::Inspector::Text.analyze(@pdf.render) text.strings.should_not be_empty end end context "default :rotate_around" do it "should draw content to the page rotated about the upper left corner of the text" do text_box = Prawn::Text::Box.new(@text, @options) text_box.render matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render) x = @x y = @y x_prime = x * @cos - y * @sin y_prime = x * @sin + y * @cos matrices.matrices[0].should == [1, 0, 0, 1, reduce_precision(x - x_prime), reduce_precision(y - y_prime)] matrices.matrices[1].should == [reduce_precision(@cos), reduce_precision(@sin), reduce_precision(-@sin), reduce_precision(@cos), 0, 0] text = PDF::Inspector::Text.analyze(@pdf.render) text.strings.should_not be_empty end end context ":rotate_around option of :upper_right" do it "should draw content to the page rotated about the upper right corner of the text" do @options[:rotate_around] = :upper_right text_box = Prawn::Text::Box.new(@text, @options) text_box.render matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render) x = @x + @width y = @y x_prime = x * @cos - y * @sin y_prime = x * @sin + y * @cos matrices.matrices[0].should == [1, 0, 0, 1, reduce_precision(x - x_prime), reduce_precision(y - y_prime)] matrices.matrices[1].should == [reduce_precision(@cos), reduce_precision(@sin), reduce_precision(-@sin), reduce_precision(@cos), 0, 0] text = PDF::Inspector::Text.analyze(@pdf.render) text.strings.should_not be_empty end end context ":rotate_around option of :lower_right" do it "should draw content to the page rotated about the lower right corner of the text" do @options[:rotate_around] = :lower_right text_box = Prawn::Text::Box.new(@text, @options) text_box.render matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render) x = @x + @width y = @y - @height x_prime = x * @cos - y * @sin y_prime = x * @sin + y * @cos matrices.matrices[0].should == [1, 0, 0, 1, reduce_precision(x - x_prime), reduce_precision(y - y_prime)] matrices.matrices[1].should == [reduce_precision(@cos), reduce_precision(@sin), reduce_precision(-@sin), reduce_precision(@cos), 0, 0] text = PDF::Inspector::Text.analyze(@pdf.render) text.strings.should_not be_empty end end context ":rotate_around option of :lower_left" do it "should draw content to the page rotated about the lower left corner of the text" do @options[:rotate_around] = :lower_left text_box = Prawn::Text::Box.new(@text, @options) text_box.render matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render) x = @x y = @y - @height x_prime = x * @cos - y * @sin y_prime = x * @sin + y * @cos matrices.matrices[0].should == [1, 0, 0, 1, reduce_precision(x - x_prime), reduce_precision(y - y_prime)] matrices.matrices[1].should == [reduce_precision(@cos), reduce_precision(@sin), reduce_precision(-@sin), reduce_precision(@cos), 0, 0] text = PDF::Inspector::Text.analyze(@pdf.render) text.strings.should_not be_empty end end end describe "Text::Box default height" do before(:each) { create_pdf } it "should be the height from the bottom bound to document.y" do target_height = @pdf.y - @pdf.bounds.bottom @text = "Oh hai\n" * 60 text_box = Prawn::Text::Box.new(@text, :document => @pdf) text_box.render text_box.height.should be_within(@pdf.font.height).of(target_height) end it "should use the margin-box bottom if only in a stretchy bbox" do @pdf.bounding_box([0, @pdf.cursor], :width => @pdf.bounds.width) do target_height = @pdf.y - @pdf.bounds.bottom @text = "Oh hai\n" * 60 text_box = Prawn::Text::Box.new(@text, :document => @pdf) text_box.render text_box.height.should be_within(@pdf.font.height).of(target_height) end end it "should use the parent-box bottom if in a stretchy bbox and " + "overflow is :expand, even with an explicit height"do @pdf.bounding_box([0, @pdf.cursor], :width => @pdf.bounds.width) do target_height = @pdf.y - @pdf.bounds.bottom @text = "Oh hai\n" * 60 text_box = Prawn::Text::Box.new(@text, :document => @pdf, :height => 100, :overflow => :expand) text_box.render text_box.height.should be_within(@pdf.font.height).of(target_height) end end it "should use the innermost non-stretchy bbox, not the margin box" do @pdf.bounding_box([0, @pdf.cursor], :width => @pdf.bounds.width, :height => 200) do @pdf.bounding_box([0, @pdf.cursor], :width => @pdf.bounds.width) do @text = "Oh hai\n" * 60 text_box = Prawn::Text::Box.new(@text, :document => @pdf) text_box.render text_box.height.should be_within(@pdf.font.height).of(200) end end end end describe "Text::Box default at" do it "should be the left corner of the bounds, and the current document.y" do create_pdf target_at = [@pdf.bounds.left, @pdf.y] @text = "Oh hai text rect. " * 100 @options = { :document => @pdf } text_box = Prawn::Text::Box.new(@text, @options) text_box.render text_box.at.should == target_at end end describe "Text::Box with text than can fit in the box" do before(:each) do create_pdf @text = "Oh hai text rect. " * 10 @options = { :width => 162.0, :height => 162.0, :document => @pdf } end it "printed text should match requested text, except that preceding and " + "trailing white space will be stripped from each line, and newlines may " + "be inserted" do text_box = Prawn::Text::Box.new(" " + @text, @options) text_box.render text_box.text.gsub("\n", " ").should == @text.strip end it "render should return an empty string because no text remains unprinted" do text_box = Prawn::Text::Box.new(@text, @options) text_box.render.should == "" end it "should be truncated when the leading is set high enough to prevent all the lines from being printed" do @options[:leading] = 40 text_box = Prawn::Text::Box.new(@text, @options) text_box.render text_box.text.gsub("\n", " ").should_not == @text.strip end end describe "Text::Box with text that fits exactly in the box" do before(:each) do create_pdf @lines = 3 @interlines = @lines - 1 @text = (1..@lines).to_a.join("\n") @options = { :width => 162.0, :height => @pdf.font.ascender + @pdf.font.height * @interlines + @pdf.font.descender, :document => @pdf } end it "should have the expected height" do expected_height = @options.delete(:height) text_box = Prawn::Text::Box.new(@text, @options) text_box.render text_box.height.should be_within(0.0001).of(expected_height) end it "should print everything" do text_box = Prawn::Text::Box.new(@text, @options) text_box.render text_box.text.should == @text end describe "with leading" do before(:each) do @options[:leading] = 15 end it "should not overflow when enough height is added" do @options[:height] += @options[:leading] * @interlines text_box = Prawn::Text::Box.new(@text, @options) text_box.render text_box.text.should == @text end it "should overflow when insufficient height is added" do @options[:height] += @options[:leading] * @interlines - 1 text_box = Prawn::Text::Box.new(@text, @options) text_box.render text_box.text.should_not == @text end end describe "with negative leading" do before(:each) do @options[:leading] = -4 end it "should not overflow when enough height is removed" do @options[:height] += @options[:leading] * @interlines text_box = Prawn::Text::Box.new(@text, @options) text_box.render text_box.text.should == @text end it "should overflow when too much height is removed" do @options[:height] += @options[:leading] * @interlines - 1 text_box = Prawn::Text::Box.new(@text, @options) text_box.render text_box.text.should_not == @text end end end describe "Text::Box printing UTF-8 string with higher bit characters" do before(:each) do create_pdf @text = "©" # not enough height to print any text, so we can directly compare against # the input string bounding_height = 1.0 options = { :height => bounding_height, :document => @pdf } file = "#{Prawn::DATADIR}/fonts/Action Man.dfont" @pdf.font_families["Action Man"] = { :normal => { :file => file, :font => "ActionMan" }, :italic => { :file => file, :font => "ActionMan-Italic" }, :bold => { :file => file, :font => "ActionMan-Bold" }, :bold_italic => { :file => file, :font => "ActionMan-BoldItalic" } } @text_box = Prawn::Text::Box.new(@text, options) end describe "when using a TTF font" do it "unprinted text should be in UTF-8 encoding" do @pdf.font("Action Man") remaining_text = @text_box.render remaining_text.should == @text end it "subsequent calls to Text::Box need not include the" + " :skip_encoding => true option" do @pdf.font("Action Man") remaining_text = @text_box.render lambda { @pdf.text_box(remaining_text, :document => @pdf) }.should_not raise_error(Prawn::Errors::IncompatibleStringEncoding) end end describe "when using an AFM font" do it "unprinted text should be in WinAnsi encoding" do remaining_text = @text_box.render remaining_text.should == @pdf.font.normalize_encoding(@text) end it "subsequent calls to Text::Box must include the" + " :skip_encoding => true option" do remaining_text = @text_box.render lambda { @pdf.text_box(remaining_text, :document => @pdf) }.should raise_error(Prawn::Errors::IncompatibleStringEncoding) lambda { @pdf.text_box(remaining_text, :skip_encoding => true, :document => @pdf) }.should_not raise_error(Prawn::Errors::IncompatibleStringEncoding) end end end describe "Text::Box with more text than can fit in the box" do before(:each) do create_pdf @text = "Oh hai text rect. " * 30 @bounding_height = 162.0 @options = { :width => 162.0, :height => @bounding_height, :document => @pdf } end context "truncated overflow" do before(:each) do @options[:overflow] = :truncate @text_box = Prawn::Text::Box.new(@text, @options) end it "should be truncated" do @text_box.render @text_box.text.gsub("\n", " ").should_not == @text.strip end it "render should not return an empty string because some text remains unprinted" do @text_box.render.should_not be_empty end it "#height should be no taller than the specified height" do @text_box.render @text_box.height.should be <= @bounding_height end it "#height should be within one font height of the specified height" do @text_box.render @bounding_height.should be_within(@pdf.font.height).of(@text_box.height) end context "with :rotate option" do it "unrendered text should be the same as when not rotated" do remaining_text = @text_box.render rotate = 30 x = 300 y = 70 width = @options[:width] height = @options[:height] @options[:document] = @pdf @options[:rotate] = rotate @options[:at] = [x, y] rotated_text_box = Prawn::Text::Box.new(@text, @options) rotated_text_box.render.should == remaining_text end end end context "truncated with text and size taken from the manual" do it "should return the right text" do @text = "This is the beginning of the text. It will be cut somewhere and " + "the rest of the text will procede to be rendered this time by " + "calling another method." + " . " * 50 @options[:width] = 300 @options[:height] = 50 @options[:size] = 18 @text_box = Prawn::Text::Box.new(@text, @options) remaining_text = @text_box.render remaining_text.should == "text will procede to be rendered this time by calling another method. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . " end end context "expand overflow" do before(:each) do @options[:overflow] = :expand @text_box = Prawn::Text::Box.new(@text, @options) end it "height should expand to encompass all the text (but not exceed the height of the page)" do @text_box.render @text_box.height.should > @bounding_height end it "should display the entire string (as long as there was space remaining on the page to print all the text)" do @text_box.render @text_box.text.gsub("\n", " ").should == @text.strip end it "render should return an empty string because no text remains unprinted(as long as there was space remaining on the page to print all the text)" do @text_box.render.should == "" end end context "shrink_to_fit overflow" do before(:each) do @options[:overflow] = :shrink_to_fit @options[:min_font_size] = 2 @text_box = Prawn::Text::Box.new(@text, @options) end it "should display the entire text" do @text_box.render @text_box.text.gsub("\n", " ").should == @text.strip end it "render should return an empty string because no text remains unprinted" do @text_box.render.should == "" end end context "shrink_to_fit overflow" do it "should not drop below the minimum font size" do @options[:overflow] = :shrink_to_fit @options[:min_font_size] = 10.1 @text_box = Prawn::Text::Box.new(@text, @options) @text_box.render text = PDF::Inspector::Text.analyze(@pdf.render) text.font_settings[0][:size].should == 10.1 end end end describe "Text::Box with enough space to fit the text but using the " + "shrink_to_fit overflow" do it "should not shrink the text when there is no need to" do create_pdf @bounding_height = 162.0 @options = { :width => 162.0, :height => @bounding_height, :overflow => :shrink_to_fit, :min_font_size => 5, :document => @pdf } @text_box = Prawn::Text::Box.new("hello\nworld", @options) @text_box.render text = PDF::Inspector::Text.analyze(@pdf.render) text.font_settings[0][:size].should == 12 end end describe "Text::Box with a solid block of Chinese characters" do it "printed text should match requested text, except for newlines" do create_pdf @text = "写中国字" * 10 @options = { :width => 162.0, :height => 162.0, :document => @pdf } @pdf.font "#{Prawn::DATADIR}/fonts/gkai00mp.ttf" @options[:overflow] = :truncate text_box = Prawn::Text::Box.new(@text, @options) text_box.render text_box.text.gsub("\n", "").should == @text end end describe "drawing bounding boxes" do before(:each) { create_pdf } it "should restore the margin box when bounding box exits" do margin_box = @pdf.bounds @pdf.text_box "Oh hai text box. " * 11, :height => @pdf.font.height * 10 @pdf.bounds.should == margin_box end end describe "Text::Box#render with :character_spacing option" do it "should draw the character spacing to the document" do create_pdf string = "hello world" options = { :document => @pdf, :character_spacing => 10 } text_box = Prawn::Text::Box.new(string, options) text_box.render contents = PDF::Inspector::Text.analyze(@pdf.render) contents.character_spacing[0].should == 10 end it "should take character spacing into account when wrapping" do create_pdf @pdf.font "Courier" text_box = Prawn::Text::Box.new("hello world", :width => 100, :overflow => :expand, :character_spacing => 10, :document => @pdf) text_box.render text_box.text.should == "hello\nworld" end end describe "Text::Box wrapping" do before(:each) do create_pdf end it "should wrap text" do text = "Please wrap this text about HERE. More text that should be wrapped" expect = "Please wrap this text about\nHERE. More text that should be\nwrapped" @pdf.font "Courier" text_box = Prawn::Text::Box.new(text, :width => 220, :overflow => :expand, :document => @pdf) text_box.render text_box.text.should == expect end # white space was being stripped after the entire line was generated, meaning # that leading white space characters reduced the amount of space on the line # for other characters, so wrapping "hello hello" resulted in # "hello\n\nhello", rather than "hello\nhello" # it "white space at beginning of line should not be taken into account when" + " computing line width" do text = "hello hello" expect = "hello\nhello" @pdf.font "Courier" text_box = Prawn::Text::Box.new(text, :width => 40, :overflow => :expand, :document => @pdf) text_box.render text_box.text.should == expect end it "should respect end of line when wrapping text" do text = "Please wrap only before\nTHIS word. Don't wrap this" expect = text @pdf.font "Courier" text_box = Prawn::Text::Box.new(text, :width => 220, :overflow => :expand, :document => @pdf) text_box.render text_box.text.should == expect end it "should respect multiple newlines when wrapping text" do text = "Please wrap only before THIS\n\nword. Don't wrap this" expect= "Please wrap only before\nTHIS\n\nword. Don't wrap this" @pdf.font "Courier" text_box = Prawn::Text::Box.new(text, :width => 200, :overflow => :expand, :document => @pdf) text_box.render text_box.text.should == expect end it "should respect multiple newlines when wrapping text when those newlines coincide with a line break" do text = "Please wrap only before\n\nTHIS word. Don't wrap this" expect = text @pdf.font "Courier" text_box = Prawn::Text::Box.new(text, :width => 220, :overflow => :expand, :document => @pdf) text_box.render text_box.text.should == expect end it "should respect initial newlines" do text = "\nThis should be on line 2" expect = text @pdf.font "Courier" text_box = Prawn::Text::Box.new(text, :width => 220, :overflow => :expand, :document => @pdf) text_box.render text_box.text.should == expect end it "should wrap lines comprised of a single word of the bounds when wrapping text" do text = "You_can_wrap_this_text_HERE" expect = "You_can_wrap_this_text_HE\nRE" @pdf.font "Courier" text_box = Prawn::Text::Box.new(text, :width => 180, :overflow => :expand, :document => @pdf) text_box.render text_box.text.should == expect end it "should wrap lines comprised of a single word of the bounds when wrapping text" do text = "©" * 30 @pdf.font "Courier" text_box = Prawn::Text::Box.new(text, :width => 180, :overflow => :expand, :document => @pdf) text_box.render expected = "©" * 25 + "\n" + "©" * 5 @pdf.font.normalize_encoding!(expected) expected = expected.force_encoding("utf-8") if expected.respond_to?(:force_encoding) text_box.text.should == expected end it "should wrap non-unicode strings using single-byte word-wrapping" do text = "continúa esforzandote " * 5 text_box = Prawn::Text::Box.new(text, :width => 180, :document => @pdf) text_box.render results_with_accent = text_box.text text = "continua esforzandote " * 5 text_box = Prawn::Text::Box.new(text, :width => 180, :document => @pdf) text_box.render results_without_accent = text_box.text results_with_accent.first_line.length.should == results_without_accent.first_line.length end end describe "Text::Box#render with :mode option" do it "should alter the text rendering mode of the document" do create_pdf string = "hello world" options = { :document => @pdf, :mode => :fill_stroke } text_box = Prawn::Text::Box.new(string, options) text_box.render contents = PDF::Inspector::Text.analyze(@pdf.render) contents.text_rendering_mode.should == [2,0] end end def reduce_precision(float) ("%.5f" % float).to_f end ruby-prawn-1.0.0~rc2.orig/spec/text_spec.rb0000644000000000000000000003424512114176157017352 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "Prawn::Text::NBSP" do it "should be defined" do Prawn::Text::NBSP.should == " " end end describe "#height_of" do before(:each) { create_pdf } it "should return the height that would be required to print a" + "particular string of text" do original_y = @pdf.y @pdf.text("Foo") new_y = @pdf.y @pdf.height_of("Foo").should be_within(0.0001).of(original_y - new_y) end it "should omit the gap below the last descender if :final_gap => false " + "is given" do original_y = @pdf.y @pdf.text("Foo", :final_gap => false) new_y = @pdf.y @pdf.height_of("Foo", :final_gap => false).should be_within(0.0001).of(original_y - new_y) end it "should raise_error CannotFit if a too-small width is given" do lambda do @pdf.height_of("text", :width => 1) end.should raise_error(Prawn::Errors::CannotFit) end it "should raise_error NotImplementedError if :indent_paragraphs option is provided" do lambda { @pdf.height_of("hai", :width => 300, :indent_paragraphs => 60) }.should raise_error(NotImplementedError) end it "should_not raise_error Prawn::Errors::UnknownOption if :final_gap option is provided" do lambda { @pdf.height_of("hai", :width => 300, :final_gap => true) }.should_not raise_error(Prawn::Errors::UnknownOption) end end describe "#text" do before(:each) { create_pdf } it "should not fail when @output is nil when Prawn::Core::Text::LineWrap#finalize_line is called" do # need a document with margins for these particulars to produce the # condition that was throwing the error pdf = Prawn::Document.new lambda { pdf.text "transparency " * 150, :size => 18 }.should_not raise_error(TypeError) end it "should allow drawing empty strings to the page" do @pdf.text " " text = PDF::Inspector::Text.analyze(@pdf.render) # If anything is rendered to the page, it should be whitespace. text.strings.each { |str| str.should =~ /\A\s*\z/ } end it "should ignore call when string is nil" do @pdf.text(nil).should be_false end it "should correctly render empty paragraphs" do @pdf.text "text\n\ntext" text = PDF::Inspector::Text.analyze(@pdf.render) @pdf.page_count.should == 1 text.strings.reject{ |s| s.empty? }.should == ["text", "text"] end it "should correctly render empty paragraphs with :indent_paragraphs" do @pdf.text "text\n\ntext", :indent_paragraphs => 5 text = PDF::Inspector::Text.analyze(@pdf.render) @pdf.page_count.should == 1 text.strings.reject{ |s| s.empty? }.should == ["text", "text"] end it "should correctly render strings ending with empty paragraphs and " + ":inline_format and :indent_paragraphs" do @pdf.text "text\n\n", :inline_format => true, :indent_paragraphs => 5 text = PDF::Inspector::Text.analyze(@pdf.render) @pdf.page_count.should == 1 text.strings.should == ["text"] end it "should default to use kerning information" do @pdf.text "hello world" text = PDF::Inspector::Text.analyze(@pdf.render) text.kerned[0].should be_true end it "should be able to disable kerning with an option" do @pdf.text "hello world", :kerning => false text = PDF::Inspector::Text.analyze(@pdf.render) text.kerned[0].should be_false end it "should be able to disable kerning document-wide" do @pdf.default_kerning(false) @pdf.default_kerning = false @pdf.text "hello world" text = PDF::Inspector::Text.analyze(@pdf.render) text.kerned[0].should be_false end it "option should be able to override document-wide kerning disabling" do @pdf.default_kerning = false @pdf.text "hello world", :kerning => true text = PDF::Inspector::Text.analyze(@pdf.render) text.kerned[0].should be_true end it "should raise_error ArgumentError if :at option included" do lambda { @pdf.text("hai", :at => [0, 0]) }.should raise_error(ArgumentError) end it "should advance down the document based on font_height" do position = @pdf.y @pdf.text "Foo" @pdf.y.should be_within(0.0001).of(position - @pdf.font.height) position = @pdf.y @pdf.text "Foo\nBar\nBaz" @pdf.y.should be_within(0.0001).of(position - 3*@pdf.font.height) end it "should advance down the document based on font_height" + " with size option" do position = @pdf.y @pdf.text "Foo", :size => 15 @pdf.font_size = 15 @pdf.y.should be_within(0.0001).of(position - @pdf.font.height) position = @pdf.y @pdf.text "Foo\nBar\nBaz" @pdf.y.should be_within(0.0001).of(position - 3 * @pdf.font.height) end it "should advance down the document based on font_height" + " with leading option" do position = @pdf.y leading = 2 @pdf.text "Foo", :leading => leading @pdf.y.should be_within(0.0001).of(position - @pdf.font.height - leading) position = @pdf.y @pdf.text "Foo\nBar\nBaz" @pdf.y.should be_within(0.0001).of(position - 3*@pdf.font.height) end it "should advance only to the bottom of the final descender "+ "if final_gap is false" do position = @pdf.y @pdf.text "Foo", :final_gap => false @pdf.y.should be_within(0.0001).of(position - @pdf.font.ascender - @pdf.font.descender) position = @pdf.y @pdf.text "Foo\nBar\nBaz", :final_gap => false @pdf.y.should be_within(0.0001).of(position - 2*@pdf.font.height - @pdf.font.ascender - @pdf.font.descender) end it "should be able to print text starting at the last line of a page" do @pdf.move_cursor_to(@pdf.font.height) @pdf.text("hello world") pages = PDF::Inspector::Page.analyze(@pdf.render).pages pages.size.should == 1 end it "should default to 12 point helvetica" do @pdf.text "Blah" text = PDF::Inspector::Text.analyze(@pdf.render) text.font_settings[0][:name].should == :Helvetica text.font_settings[0][:size].should == 12 text.strings.first.should == "Blah" end it "should allow setting font size" do @pdf.text "Blah", :size => 16 text = PDF::Inspector::Text.analyze(@pdf.render) text.font_settings[0][:size].should == 16 end it "should allow setting a default font size" do @pdf.font_size = 16 @pdf.text "Blah" text = PDF::Inspector::Text.analyze(@pdf.render) text.font_settings[0][:size].should == 16 end it "should allow overriding default font for a single instance" do @pdf.font_size = 16 @pdf.text "Blah", :size => 11 @pdf.text "Blaz" text = PDF::Inspector::Text.analyze(@pdf.render) text.font_settings[0][:size].should == 11 text.font_settings[1][:size].should == 16 end it "should allow setting a font size transaction with a block" do @pdf.font_size 16 do @pdf.text 'Blah' end @pdf.text 'blah' text = PDF::Inspector::Text.analyze(@pdf.render) text.font_settings[0][:size].should == 16 text.font_settings[1][:size].should == 12 end it "should allow manual setting the font size " + "when in a font size block" do @pdf.font_size(16) do @pdf.text 'Foo' @pdf.text 'Blah', :size => 11 @pdf.text 'Blaz' end text = PDF::Inspector::Text.analyze(@pdf.render) text.font_settings[0][:size].should == 16 text.font_settings[1][:size].should == 11 text.font_settings[2][:size].should == 16 end it "should allow registering of built-in font_settings on the fly" do @pdf.font "Times-Roman" @pdf.text "Blah" @pdf.font "Courier" @pdf.text "Blaz" text = PDF::Inspector::Text.analyze(@pdf.render) text.font_settings[0][:name].should == :"Times-Roman" text.font_settings[1][:name].should == :Courier end it "should utilise the same default font across multiple pages" do @pdf.text "Blah" @pdf.start_new_page @pdf.text "Blaz" text = PDF::Inspector::Text.analyze(@pdf.render) text.font_settings.size.should == 2 text.font_settings[0][:name].should == :Helvetica text.font_settings[1][:name].should == :Helvetica end it "should raise_error an exception when an unknown font is used" do lambda { @pdf.font "Pao bu" }.should raise_error(Prawn::Errors::UnknownFont) end it "should_not raise_error an exception when providing Pathname instance as font" do lambda { @pdf.font Pathname.new("#{Prawn::DATADIR}/fonts/comicsans.ttf") }.should_not raise_error(Prawn::Errors::UnknownFont) end it "should correctly render a utf-8 string when using a built-in font" do str = "©" # copyright symbol @pdf.text str # grab the text from the rendered PDF and ensure it matches text = PDF::Inspector::Text.analyze(@pdf.render) text.strings.first.should == str end it "should correctly render a utf-8 string when using a TTF font" do str = "©" # copyright symbol @pdf.font "#{Prawn::DATADIR}/fonts/DejaVuSans.ttf" @pdf.text str # grab the text from the rendered PDF and ensure it matches text = PDF::Inspector::Text.analyze(@pdf.render) text.strings.first.should == str end it "should correctly render a string with higher bit characters across" + " a page break when using a built-in font" do str = "©" @pdf.move_cursor_to(@pdf.font.height) @pdf.text(str + "\n" + str) pages = PDF::Inspector::Page.analyze(@pdf.render).pages pages.size.should == 2 pages[0][:strings].should == [str] pages[1][:strings].should == [str] end it "should correctly render a string with higher bit characters across" + " a page break when using a built-in font and :indent_paragraphs option" do str = "©" @pdf.move_cursor_to(@pdf.font.height) @pdf.text(str + "\n" + str, :indent_paragraphs => 20) pages = PDF::Inspector::Page.analyze(@pdf.render).pages pages.size.should == 2 pages[0][:strings].should == [str] pages[1][:strings].should == [str] end if "spec".respond_to?(:encode!) # Handle non utf-8 string encodings in a sane way on M17N aware VMs it "should raise_error an exception when a utf-8 incompatible string is rendered" do str = "Blah \xDD" str.force_encoding("ASCII-8BIT") lambda { @pdf.text str }.should raise_error( Prawn::Errors::IncompatibleStringEncoding) end it "should_not raise_error an exception when a shift-jis string is rendered" do datafile = "#{Prawn::DATADIR}/shift_jis_text.txt" sjis_str = File.open(datafile, "r:shift_jis") { |f| f.gets } @pdf.font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf") lambda { @pdf.text sjis_str }.should_not raise_error( Prawn::Errors::IncompatibleStringEncoding) end else # Handle non utf-8 string encodings in a sane way on non-M17N aware VMs it "should raise_error an exception when a corrupt utf-8 string is rendered" do str = "Blah \xDD" lambda { @pdf.text str }.should raise_error( Prawn::Errors::IncompatibleStringEncoding) end it "should raise_error an exception when a shift-jis string is rendered" do sjis_str = File.read("#{Prawn::DATADIR}/shift_jis_text.txt") lambda { @pdf.text sjis_str }.should raise_error( Prawn::Errors::IncompatibleStringEncoding) end end it "should call move_past_bottom when printing more text than can fit" + " between the current document.y and bounds.bottom" do @pdf.y = @pdf.font.height @pdf.text "Hello" @pdf.text "World" pages = PDF::Inspector::Page.analyze(@pdf.render).pages pages.size.should == 2 pages[0][:strings].should == ["Hello"] pages[1][:strings].should == ["World"] end describe "with :indent_paragraphs option" do it "should indent the paragraphs" do hello = "hello " * 50 hello2 = "hello " * 50 @pdf.text(hello + "\n" + hello2, :indent_paragraphs => 60) text = PDF::Inspector::Text.analyze(@pdf.render) text.strings[0].should == ("hello " * 19).strip text.strings[1].should == ("hello " * 21).strip text.strings[3].should == ("hello " * 19).strip text.strings[4].should == ("hello " * 21).strip end describe "when wrap to new page, and first line of new page" + " is not the start of a new paragraph, that line should" + " not be indented" do it "should indent the paragraphs" do hello = "hello " * 50 hello2 = "hello " * 50 @pdf.move_cursor_to(@pdf.font.height) @pdf.text(hello + "\n" + hello2, :indent_paragraphs => 60) text = PDF::Inspector::Text.analyze(@pdf.render) text.strings[0].should == ("hello " * 19).strip text.strings[1].should == ("hello " * 21).strip text.strings[3].should == ("hello " * 19).strip text.strings[4].should == ("hello " * 21).strip end end describe "when wrap to new page, and first line of new page" + " is the start of a new paragraph, that line should" + " be indented" do it "should indent the paragraphs" do hello = "hello " * 50 hello2 = "hello " * 50 @pdf.move_cursor_to(@pdf.font.height * 3) @pdf.text(hello + "\n" + hello2, :indent_paragraphs => 60) text = PDF::Inspector::Text.analyze(@pdf.render) text.strings[0].should == ("hello " * 19).strip text.strings[1].should == ("hello " * 21).strip text.strings[3].should == ("hello " * 19).strip text.strings[4].should == ("hello " * 21).strip end end end describe "kerning" do it "should respect text kerning setting (document default)" do create_pdf @pdf.font.expects(:compute_width_of).with do |str, options| str == "VAT" && options[:kerning] == true end.at_least_once.returns(10) @pdf.text "VAT" end it "should respect text kerning setting (kerning=true)" do create_pdf @pdf.font.expects(:compute_width_of).with do |str, options| str == "VAT" && options[:kerning] == true end.at_least_once.returns(10) @pdf.text "VAT", :kerning => true end it "should respect text kerning setting (kerning=false)" do create_pdf @pdf.font.expects(:compute_width_of).with do |str, options| str == "VAT" && options[:kerning] == false end.at_least_once.returns(10) @pdf.text "VAT", :kerning => false end end end ruby-prawn-1.0.0~rc2.orig/spec/cell_spec.rb0000644000000000000000000004357512114176157017313 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") module CellHelpers # Build, but do not draw, a cell on @pdf. def cell(options={}) at = options[:at] || [0, @pdf.cursor] Prawn::Table::Cell::Text.new(@pdf, at, options) end end describe "Prawn::Table::Cell" do before(:each) do @pdf = Prawn::Document.new end describe "Prawn::Document#cell" do include CellHelpers it "should draw the cell" do Prawn::Table::Cell::Text.any_instance.expects(:draw).once @pdf.cell(:content => "text") end it "should return a Cell" do @pdf.cell(:content => "text").should be_a_kind_of Prawn::Table::Cell end it "accepts :content => nil in a hash" do @pdf.cell(:content => nil).should be_a_kind_of(Prawn::Table::Cell::Text) @pdf.make_cell(:content => nil).should be_a_kind_of(Prawn::Table::Cell::Text) end it "should convert nil, Numeric, and Date values to strings" do [nil, 123, 123.45, Date.today].each do |value| c = @pdf.cell(:content => value) c.should be_a_kind_of Prawn::Table::Cell::Text c.content.should == value.to_s end end it "should allow inline styling with a hash argument" do # used for table([[{:text => "...", :font_style => :bold, ...}, ...]]) c = Prawn::Table::Cell.make(@pdf, {:content => 'hello', :font_style => :bold}) c.should be_a_kind_of Prawn::Table::Cell::Text c.content.should == "hello" c.font.name.should == 'Helvetica-Bold' end it "should draw text at the given point plus padding, with the given " + "size and style" do @pdf.expects(:bounding_box).yields @pdf.expects(:move_down) @pdf.expects(:draw_text!).with { |text, options| text == "hello world" } @pdf.cell(:content => "hello world", :at => [10, 20], :padding => [30, 40], :size => 7, :font_style => :bold) end end describe "Prawn::Document#make_cell" do it "should not draw the cell" do Prawn::Table::Cell::Text.any_instance.expects(:draw).never @pdf.make_cell("text") end it "should return a Cell" do @pdf.make_cell("text", :size => 7).should be_a_kind_of Prawn::Table::Cell end end describe "#style" do include CellHelpers it "should set each property in turn" do c = cell(:content => "text") c.expects(:padding=).with(50) c.expects(:size=).with(7) c.style(:padding => 50, :size => 7) end end describe "cell width" do include CellHelpers it "should be calculated for text" do c = cell(:content => "text") c.width.should == @pdf.width_of("text") + c.padding[1] + c.padding[3] end it "should be overridden by manual :width" do c = cell(:content => "text", :width => 400) c.width.should == 400 end it "should incorporate padding when specified" do c = cell(:content => "text", :padding => [1, 2, 3, 4]) c.width.should be_within(0.01).of(@pdf.width_of("text") + 6) end it "should allow width to be reset after it has been calculated" do # to ensure that if we memoize width, it can still be overridden c = cell(:content => "text") c.width c.width = 400 c.width.should == 400 end it "should return proper width with size set" do text = "text " * 4 c = cell(:content => text, :size => 7) c.width.should == @pdf.width_of(text, :size => 7) + c.padding[1] + c.padding[3] end it "content_width should exclude padding" do c = cell(:content => "text", :padding => 10) c.content_width.should == @pdf.width_of("text") end it "content_width should exclude padding even with manual :width" do c = cell(:content => "text", :padding => 10, :width => 400) c.content_width.should be_within(0.01).of(380) end it "should have a reasonable minimum width that can fit @content" do c = cell(:content => "text", :padding => 10) min_content_width = c.min_width - c.padding[1] - c.padding[3] lambda { @pdf.height_of("text", :width => min_content_width) }. should_not raise_error(Prawn::Errors::CannotFit) @pdf.height_of("text", :width => min_content_width).should be < (5 * @pdf.height_of("text")) end it "should defer min_width's evaluation of padding" do c = cell(:content => "text", :padding => 100) c.padding = 0 # Make sure we use the new value of padding in calculating min_width c.min_width.should be < 100 end it "should defer min_width's evaluation of size" do c = cell(:content => "text", :size => 50) c.size = 8 c.padding = 0 c.min_width.should be < 10 end end describe "cell height" do include CellHelpers it "should be calculated for text" do c = cell(:content => "text") c.height.should == @pdf.height_of("text", :width => @pdf.width_of("text")) + c.padding[0] + c.padding[3] end it "should be overridden by manual :height" do c = cell(:content => "text", :height => 400) c.height.should == 400 end it "should incorporate :padding when specified" do c = cell(:content => "text", :padding => [1, 2, 3, 4]) c.height.should be_within(0.01).of(1 + 3 + @pdf.height_of("text", :width => @pdf.width_of("text"))) end it "should allow height to be reset after it has been calculated" do # to ensure that if we memoize height, it can still be overridden c = cell(:content => "text") c.height c.height = 400 c.height.should == 400 end it "should return proper height for blocks of text" do content = "words " * 10 c = cell(:content => content, :width => 100) c.height.should == @pdf.height_of(content, :width => 100) + c.padding[0] + c.padding[2] end it "should return proper height for blocks of text with size set" do content = "words " * 10 c = cell(:content => content, :width => 100, :size => 7) correct_content_height = nil @pdf.font_size(7) do correct_content_height = @pdf.height_of(content, :width => 100) end c.height.should == correct_content_height + c.padding[0] + c.padding[2] end it "content_height should exclude padding" do c = cell(:content => "text", :padding => 10) c.content_height.should == @pdf.height_of("text") end it "content_height should exclude padding even with manual :height" do c = cell(:content => "text", :padding => 10, :height => 400) c.content_height.should be_within(0.01).of(380) end end describe "cell padding" do include CellHelpers it "should default to zero" do c = cell(:content => "text") c.padding.should == [5, 5, 5, 5] end it "should accept a numeric value, setting all padding" do c = cell(:content => "text", :padding => 10) c.padding.should == [10, 10, 10, 10] end it "should accept [v,h]" do c = cell(:content => "text", :padding => [20, 30]) c.padding.should == [20, 30, 20, 30] end it "should accept [t,h,b]" do c = cell(:content => "text", :padding => [10, 20, 30]) c.padding.should == [10, 20, 30, 20] end it "should accept [t,l,b,r]" do c = cell(:content => "text", :padding => [10, 20, 30, 40]) c.padding.should == [10, 20, 30, 40] end it "should reject other formats" do lambda{ cell(:content => "text", :padding => [10]) }.should raise_error(ArgumentError) end end describe "background_color" do include CellHelpers it "should fill a rectangle with the given background color" do @pdf.stubs(:mask).yields @pdf.expects(:mask).with(:fill_color).yields @pdf.stubs(:fill_color) @pdf.expects(:fill_color).with('123456') @pdf.expects(:fill_rectangle).checking do |(x, y), w, h| x.should be_within(0.01).of(0) y.should be_within(0.01).of(@pdf.cursor) w.should be_within(0.01).of(29.344) h.should be_within(0.01).of(23.872) end @pdf.cell(:content => "text", :background_color => '123456') end it "should draw the background in the right place if cell is drawn at a " + "different location" do @pdf.stubs(:mask).yields @pdf.expects(:mask).with(:fill_color).yields @pdf.stubs(:fill_color) @pdf.expects(:fill_color).with('123456') @pdf.expects(:fill_rectangle).checking do |(x, y), w, h| x.should be_within(0.01).of(12.0) y.should be_within(0.01).of(34.0) w.should be_within(0.01).of(29.344) h.should be_within(0.01).of(23.872) end c = @pdf.make_cell(:content => "text", :background_color => '123456') c.draw([12.0, 34.0]) end end describe "color" do it "should set fill color when :text_color is provided" do pdf = Prawn::Document.new pdf.stubs(:fill_color) pdf.expects(:fill_color).with('555555') pdf.cell :content => 'foo', :text_color => '555555' end it "should reset the fill color to the original one" do pdf = Prawn::Document.new pdf.fill_color = '333333' pdf.cell :content => 'foo', :text_color => '555555' pdf.fill_color.should == '333333' end end describe "Borders" do it "should draw all borders by default" do @pdf.expects(:stroke_line).times(4) @pdf.cell(:content => "text") end it "should draw all borders when requested" do @pdf.expects(:stroke_line).times(4) @pdf.cell(:content => "text", :borders => [:top, :right, :bottom, :left]) end # Only roughly verifying the integer coordinates so that we don't have to # do any FP closeness arithmetic. Can plug in that math later if this goes # wrong. it "should draw top border when requested" do @pdf.expects(:stroke_line).checking do |from, to| @pdf.map_to_absolute(from).map{|x| x.round}.should == [36, 756] @pdf.map_to_absolute(to).map{|x| x.round}.should == [65, 756] end @pdf.cell(:content => "text", :borders => [:top]) end it "should draw bottom border when requested" do @pdf.expects(:stroke_line).checking do |from, to| @pdf.map_to_absolute(from).map{|x| x.round}.should == [36, 732] @pdf.map_to_absolute(to).map{|x| x.round}.should == [65, 732] end @pdf.cell(:content => "text", :borders => [:bottom]) end it "should draw left border when requested" do @pdf.expects(:stroke_line).checking do |from, to| @pdf.map_to_absolute(from).map{|x| x.round}.should == [36, 756] @pdf.map_to_absolute(to).map{|x| x.round}.should == [36, 732] end @pdf.cell(:content => "text", :borders => [:left]) end it "should draw right border when requested" do @pdf.expects(:stroke_line).checking do |from, to| @pdf.map_to_absolute(from).map{|x| x.round}.should == [65, 756] @pdf.map_to_absolute(to).map{|x| x.round}.should == [65, 732] end @pdf.cell(:content => "text", :borders => [:right]) end it "should draw borders at the same location when in or out of bbox" do @pdf.expects(:stroke_line).checking do |from, to| @pdf.map_to_absolute(from).map{|x| x.round}.should == [36, 756] @pdf.map_to_absolute(to).map{|x| x.round}.should == [65, 756] end @pdf.bounding_box([0, @pdf.cursor], :width => @pdf.bounds.width) do @pdf.cell(:content => "text", :borders => [:top]) end end it "should set border color with :border_..._color" do @pdf.ignores(:stroke_color=).with("000000") @pdf.expects(:stroke_color=).with("ff0000") c = @pdf.cell(:content => "text", :border_top_color => "ff0000") c.border_top_color.should == "ff0000" c.border_colors[0].should == "ff0000" end it "should set border colors with :border_color" do @pdf.ignores(:stroke_color=).with("000000") @pdf.expects(:stroke_color=).with("ff0000") @pdf.expects(:stroke_color=).with("00ff00") @pdf.expects(:stroke_color=).with("0000ff") @pdf.expects(:stroke_color=).with("ff00ff") c = @pdf.cell(:content => "text", :border_color => %w[ff0000 00ff00 0000ff ff00ff]) c.border_colors.should == %w[ff0000 00ff00 0000ff ff00ff] end it "border_..._width should return 0 if border not selected" do c = @pdf.cell(:content => "text", :borders => [:top]) c.border_bottom_width.should == 0 end it "should set border width with :border_..._width" do @pdf.ignores(:line_width=).with(1) @pdf.expects(:line_width=).with(2) c = @pdf.cell(:content => "text", :border_bottom_width => 2) c.border_bottom_width.should == 2 c.border_widths[2].should == 2 end it "should set border widths with :border_width" do @pdf.ignores(:line_width=).with(1) @pdf.expects(:line_width=).with(2) @pdf.expects(:line_width=).with(3) @pdf.expects(:line_width=).with(4) @pdf.expects(:line_width=).with(5) c = @pdf.cell(:content => "text", :border_width => [2, 3, 4, 5]) c.border_widths.should == [2, 3, 4, 5] end it "should set default border lines to :solid" do c = @pdf.cell(:content => "text") c.border_top_line.should == :solid c.border_right_line.should == :solid c.border_bottom_line.should == :solid c.border_left_line.should == :solid c.border_lines.should == [:solid] * 4 end it "should set border line with :border_..._line" do c = @pdf.cell(:content => "text", :border_bottom_line => :dotted) c.border_bottom_line.should == :dotted c.border_lines[2].should == :dotted end it "should set border lines with :border_lines" do c = @pdf.cell(:content => "text", :border_lines => [:solid, :dotted, :dashed, :solid]) c.border_lines.should == [:solid, :dotted, :dashed, :solid] end end describe "Text cell attributes" do include CellHelpers it "should pass through text options like :align to Text::Box" do c = cell(:content => "text", :align => :right) box = Prawn::Text::Box.new("text", :document => @pdf) Prawn::Text::Box.expects(:new).checking do |text, options| text.should == "text" options[:align].should == :right end.at_least_once.returns(box) c.draw end it "should use font_style for Text::Box#style" do c = cell(:content => "text", :font_style => :bold) box = Prawn::Text::Box.new("text", :document => @pdf) Prawn::Text::Box.expects(:new).checking do |text, options| text.should == "text" options[:style].should == :bold end.at_least_once.returns(box) c.draw end it "should allow inline formatting in cells" do c = cell(:content => "foo bar baz", :inline_format => true) box = Prawn::Text::Formatted::Box.new([], :document => @pdf) Prawn::Text::Formatted::Box.expects(:new).checking do |array, options| array[0][:text].should == "foo " array[0][:styles].should == [] array[1][:text].should == "bar" array[1][:styles].should == [:bold] array[2][:text].should == " baz" array[2][:styles].should == [] end.at_least_once.returns(box) c.draw end end describe "Font handling" do include CellHelpers it "should allow only :font_style to be specified, defaulting to the " + "document's font" do c = cell(:content => "text", :font_style => :bold) c.font.name.should == 'Helvetica-Bold' end it "should accept a font name for :font" do c = cell(:content => "text", :font => 'Helvetica-Bold') c.font.name.should == 'Helvetica-Bold' end it "should allow style to be changed after initialize" do c = cell(:content => "text") c.font_style = :bold c.font.name.should == 'Helvetica-Bold' end it "should default to the document's font, if none is specified" do c = cell(:content => "text") c.font.should == @pdf.font end it "should use the metrics of the selected font (even if it is a variant " + "of the document's font) to calculate width" do c = cell(:content => "text", :font_style => :bold) font = @pdf.find_font('Helvetica-Bold') c.content_width.should == font.compute_width_of("text") end it "should properly calculate inline-formatted text" do c = cell(:content => "text", :inline_format => true) font = @pdf.find_font('Helvetica-Bold') c.content_width.should == font.compute_width_of("text") end end end describe "Image cells" do before(:each) do create_pdf end describe "with default options" do before(:each) do @cell = Prawn::Table::Cell.make(@pdf, :image => "#{Prawn::DATADIR}/images/prawn.png") end it "should create a Cell::Image" do @cell.should be_a_kind_of(Prawn::Table::Cell::Image) end it "should pull the natural width and height from the image" do @cell.natural_content_width.should == 141 @cell.natural_content_height.should == 142 end end describe "hash syntax" do before(:each) do @table = @pdf.make_table([[{ :image => "#{Prawn::DATADIR}/images/prawn.png", :scale => 2, :fit => [100, 200], :image_width => 123, :image_height => 456, :position => :center, :vposition => :center }]]) @cell = @table.cells[0, 0] end it "should create a Cell::Image" do @cell.should be_a_kind_of(Prawn::Table::Cell::Image) end it "should pass through image options" do @pdf.expects(:embed_image).checking do |_, _, options| options[:scale].should == 2 options[:fit].should == [100, 200] options[:width].should == 123 options[:height].should == 456 options[:position].should == :center options[:vposition].should == :center end @table.draw end end end ruby-prawn-1.0.0~rc2.orig/spec/text_rendering_mode_spec.rb0000644000000000000000000000304312114176157022403 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "#text_rendering_mode" do it "should draw the text rendering mode to the document" do create_pdf @pdf.text_rendering_mode(:stroke) do @pdf.text("hello world") end contents = PDF::Inspector::Text.analyze(@pdf.render) contents.text_rendering_mode.first.should == 1 end it "should not draw the text rendering mode to the document" + " when the new mode matches the old" do create_pdf @pdf.text_rendering_mode(:fill) do @pdf.text("hello world") end contents = PDF::Inspector::Text.analyze(@pdf.render) contents.text_rendering_mode.should be_empty end it "should restore character spacing to 0" do create_pdf @pdf.text_rendering_mode(:stroke) do @pdf.text("hello world") end contents = PDF::Inspector::Text.analyze(@pdf.render) contents.text_rendering_mode.should == [1,0] end it "should function as an accessor when no parameter given" do create_pdf @pdf.text_rendering_mode(:fill_stroke) do @pdf.text("hello world") @pdf.text_rendering_mode.should == :fill_stroke end @pdf.text_rendering_mode.should == :fill end it "should raise_error an exception when passed an invalid mode" do create_pdf lambda { @pdf.text_rendering_mode(-1) }.should raise_error(ArgumentError) lambda { @pdf.text_rendering_mode(8) }.should raise_error(ArgumentError) lambda { @pdf.text_rendering_mode(:flil) }.should raise_error(ArgumentError) end end ruby-prawn-1.0.0~rc2.orig/spec/grid_spec.rb0000644000000000000000000000570312114176157017310 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "A document's grid" do before do @pdf = Prawn::Document.new end it "should allow definition of a grid" do @pdf.define_grid(:columns => 5, :rows => 8, :gutter => 0.1) @pdf.grid.columns.should == 5 @pdf.grid.rows.should == 8 @pdf.grid.gutter.should == 0.1 end describe "when a grid is defined" do before do @num_columns = 5 @num_rows = 8 @gutter = 10.0 @pdf.define_grid( :columns => @num_columns, :rows => @num_rows, :gutter => @gutter ) end it "should compute the column width" do (@pdf.grid.column_width * @num_columns.to_f + @gutter * (@num_columns - 1).to_f).should == @pdf.bounds.width end it "should compute the row height" do (@pdf.grid.row_height * @num_rows.to_f + @gutter * (@num_rows - 1).to_f).should == @pdf.bounds.height end it "should give the edges of a grid box" do grid_width = (@pdf.bounds.width.to_f - (@gutter * (@num_columns - 1).to_f )) / @num_columns.to_f grid_height = (@pdf.bounds.height.to_f - (@gutter * (@num_rows - 1).to_f ))/ @num_rows.to_f exp_tl_x = (grid_width + @gutter.to_f) * 4.0 exp_tl_y = @pdf.bounds.height.to_f - (grid_height + @gutter.to_f) @pdf.grid(1,4).top_left.should == [exp_tl_x, exp_tl_y] @pdf.grid(1,4).top_right.should == [exp_tl_x + grid_width, exp_tl_y] @pdf.grid(1,4).bottom_left.should == [exp_tl_x, exp_tl_y - grid_height] @pdf.grid(1,4).bottom_right.should == [exp_tl_x + grid_width, exp_tl_y - grid_height] end it "should give the edges of a multiple grid boxes" do # Hand verified. Cheating a bit. Don't tell. @pdf.grid([1,3], [2,5]).top_left.should == [330.0, 628.75] @pdf.grid([1,3], [2,5]).top_right.should == [650.0, 628.75] @pdf.grid([1,3], [2,5]).bottom_left.should == [330.0, 456.25] @pdf.grid([1,3], [2,5]).bottom_right.should == [650.0, 456.25] end it "should draw outlines without changing global default colors to grid color" do @pdf.grid.show_all('cccccc') colors = PDF::Inspector::Graphics::Color.analyze(@pdf.render) colors.fill_color.should_not == [0.8,0.8,0.8] colors.stroke_color.should_not == [0.8,0.8,0.8] # Hardcoded default color as I haven't been able to come up with a stable converter # between fill_color without lots code. #colors.fill_color.should == [0.0,0.0,0.0] colors.stroke_color.should == [0.0,0.0,0.0] end it "should draw outlines without curent color settings" do @pdf.fill_color "ccff00" @pdf.stroke_color "ffcc00" @pdf.grid.show_all colors = PDF::Inspector::Graphics::Color.analyze(@pdf.render) colors.fill_color.should == [0.8,1.0,0.0] colors.stroke_color.should == [1.0,0.8,0.0] end end end ruby-prawn-1.0.0~rc2.orig/spec/text_spacing_spec.rb0000644000000000000000000000551612114176157021055 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "#character_spacing" do it "should draw the character spacing to the document" do create_pdf @pdf.character_spacing(10.555555) do @pdf.text("hello world") end contents = PDF::Inspector::Text.analyze(@pdf.render) contents.character_spacing.first.should == 10.556 end it "should not draw the character spacing to the document" + " when the new character spacing matches the old" do create_pdf @pdf.character_spacing(0) do @pdf.text("hello world") end contents = PDF::Inspector::Text.analyze(@pdf.render) contents.character_spacing.should be_empty end it "should restore character spacing to 0" do create_pdf @pdf.character_spacing(10.555555) do @pdf.text("hello world") end contents = PDF::Inspector::Text.analyze(@pdf.render) contents.character_spacing.last.should == 0 end it "should function as an accessor when no parameter given" do create_pdf @pdf.character_spacing(10.555555) do @pdf.text("hello world") @pdf.character_spacing.should == 10.555555 end @pdf.character_spacing.should == 0 end # ensure that we properly internationalize by using the number of characters # in a string, not the number of bytes, to insert character spaces # it "should calculate character spacing widths by characters, not bytes" do create_pdf @pdf.font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf") str = "こんにちは世界" @pdf.character_spacing(0) do @raw_width = @pdf.width_of(str) end @pdf.character_spacing(10) do # the new width should include seven 10-pt character spaces. @pdf.width_of(str).should be_within(0.001).of(@raw_width + (10 * 7)) end end end describe "#word_spacing" do it "should draw the word spacing to the document" do create_pdf @pdf.word_spacing(10.555555) do @pdf.text("hello world") end contents = PDF::Inspector::Text.analyze(@pdf.render) contents.word_spacing.first.should == 10.556 end it "should draw the word spacing to the document" + " when the new word spacing matches the old" do create_pdf @pdf.word_spacing(0) do @pdf.text("hello world") end contents = PDF::Inspector::Text.analyze(@pdf.render) contents.word_spacing.should be_empty end it "should restore word spacing to 0" do create_pdf @pdf.word_spacing(10.555555) do @pdf.text("hello world") end contents = PDF::Inspector::Text.analyze(@pdf.render) contents.word_spacing.last.should == 0 end it "should function as an accessor when no parameter given" do create_pdf @pdf.word_spacing(10.555555) do @pdf.text("hello world") @pdf.word_spacing.should == 10.555555 end @pdf.word_spacing.should == 0 end end ruby-prawn-1.0.0~rc2.orig/spec/repeater_spec.rb0000644000000000000000000001065112114176157020170 0ustar rootrootrequire File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "Repeaters" do it "creates a stamp and increments Prawn::Repeater.count on initialize" do orig_count = Prawn::Repeater.count doc = sample_document doc.expects(:create_stamp).with("prawn_repeater(#{orig_count})") r = repeater(doc, :all) { :do_nothing } Prawn::Repeater.count.should == orig_count + 1 end it "must provide an :all filter" do doc = sample_document r = repeater(doc, :all) { :do_nothing } (1..doc.page_count).all? { |i| r.match?(i) }.should be_true end it "must provide an :odd filter" do doc = sample_document r = repeater(doc, :odd) { :do_nothing } odd, even = (1..doc.page_count).partition { |e| e % 2 == 1 } odd.all? { |i| r.match?(i) }.should be_true even.any? { |i| r.match?(i) }.should be_false end it "must be able to filter by an array of page numbers" do doc = sample_document r = repeater(doc, [1,2,7]) { :do_nothing } (1..10).select { |i| r.match?(i) }.should == [1,2,7] end it "must be able to filter by a range of page numbers" do doc = sample_document r = repeater(doc, 2..4) { :do_nothing } (1..10).select { |i| r.match?(i) }.should == [2,3,4] end it "must be able to filter by an arbitrary proc" do doc = sample_document r = repeater(doc, lambda { |x| x == 1 or x % 3 == 0 }) (1..10).select { |i| r.match?(i) }.should == [1,3,6,9] end it "must try to run a stamp if the page number matches" do doc = sample_document doc.expects(:stamp) repeater(doc, :odd).run(3) end it "must not try to run a stamp unless the page number matches" do doc = sample_document doc.expects(:stamp).never repeater(doc, :odd).run(2) end it "must not try to run a stamp if dynamic is selected" do doc = sample_document doc.expects(:stamp).never (1..10).each { |p| repeater(doc, :all, true){:do_nothing}.run(p) } end it "must try to run a block if the page number matches" do doc = sample_document doc.expects(:draw_text).twice (1..10).each { |p| repeater(doc, [1,2], true){doc.draw_text "foo"}.run(p) } end it "must not try to run a block unless the page number matches" do doc = sample_document doc.expects(:draw_text).never repeater(doc, :odd, true){doc.draw_text "foo"}.run(2) end it "must treat any block as a closure" do doc = sample_document @page = "Page" # ensure access to ivars doc.repeat(:all, :dynamic => true) do doc.draw_text "#@page #{doc.page_number}", :at => [500, 0] end text = PDF::Inspector::Text.analyze(doc.render) text.strings.should == (1..10).to_a.map{|p| "Page #{p}"} end it "must treat any block as a closure (Document.new instance_eval form)" do doc = Prawn::Document.new(:skip_page_creation => true) do 10.times { start_new_page } @page = "Page" repeat(:all, :dynamic => true) do # ensure self is accessible here draw_text "#@page #{page_number}", :at => [500, 0] end end text = PDF::Inspector::Text.analyze(doc.render) text.strings.should == (1..10).to_a.map{|p| "Page #{p}"} end def sample_document doc = Prawn::Document.new(:skip_page_creation => true) 10.times { |e| doc.start_new_page } doc end def repeater(*args, &b) Prawn::Repeater.new(*args,&b) end context "graphic state" do it "should not alter the graphic state stack color space" do create_pdf starting_color_space = @pdf.state.page.graphic_state.color_space.dup @pdf.repeat :all do @pdf.text "Testing", :size => 24, :style => :bold end @pdf.state.page.graphic_state.color_space.should == starting_color_space end context "dynamic repeaters" do it "should preserve the graphic state at creation time" do create_pdf @pdf.repeat :all, :dynamic => true do @pdf.text "fill_color: #{@pdf.graphic_state.fill_color}" @pdf.text "cap_style: #{@pdf.graphic_state.cap_style}" end @pdf.fill_color "666666" @pdf.cap_style :round text = PDF::Inspector::Text.analyze(@pdf.render) text.strings.include?("fill_color: 666666").should == false text.strings.include?("fill_color: 000000").should == true text.strings.include?("cap_style: round").should == false text.strings.include?("cap_style: butt").should == true end end end end ruby-prawn-1.0.0~rc2.orig/spec/destinations_spec.rb0000644000000000000000000000053712114176157021067 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "When creating destinations" do before(:each) { create_pdf } it "should add entry to Dests name tree" do @pdf.dests.data.empty?.should == true @pdf.add_dest "candy", "chocolate" @pdf.dests.data.size.should == 1 end end ruby-prawn-1.0.0~rc2.orig/spec/transparency_spec.rb0000644000000000000000000000543212114176157021073 0ustar rootrootrequire File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") module TransparencyHelper def make_transparent(opacity, stroke_opacity=opacity) @pdf.transparent(opacity, stroke_opacity) do yield if block_given? end end end describe "Document with transparency" do include TransparencyHelper it "the PDF version should be at least 1.4" do create_pdf make_transparent(0.5) str = @pdf.render str[0,8].should == "%PDF-1.4" end it "a new extended graphics state should be created for "+ "each unique transparency setting" do create_pdf make_transparent(0.5, 0.2) do make_transparent(0.5, 0.75) end extgstates = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates extgstates.length.should == 2 end it "a new extended graphics state should not be created for "+ "each duplicate transparency setting" do create_pdf make_transparent(0.5, 0.75) do make_transparent(0.5, 0.75) end extgstates = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates extgstates.length.should == 1 end it "setting the transparency with only one parameter sets the transparency"+ " for both the fill and the stroke" do create_pdf make_transparent(0.5) extgstate = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates[0] extgstate[:opacity].should == 0.5 extgstate[:stroke_opacity].should == 0.5 end it "setting the transparency with a numerical parameter and "+ "a :stroke should set the fill transparency to the numerical parameter "+ "and the stroke transparency to the option" do create_pdf make_transparent(0.5, 0.2) extgstate = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates[0] extgstate[:opacity].should == 0.5 extgstate[:stroke_opacity].should == 0.2 end it "should enforce the valid range of 0.0 to 1.0" do create_pdf make_transparent(-0.5, -0.2) extgstate = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates[0] extgstate[:opacity].should == 0.0 extgstate[:stroke_opacity].should == 0.0 create_pdf make_transparent(2.0, 3.0) extgstate = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates[0] extgstate[:opacity].should == 1.0 extgstate[:stroke_opacity].should == 1.0 end describe "with more than one page" do include TransparencyHelper it "the extended graphic state resource should be added to both pages" do create_pdf make_transparent(0.5, 0.2) @pdf.start_new_page make_transparent(0.5, 0.2) extgstates = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates extgstate = extgstates[0] extgstates.length.should == 2 extgstate[:opacity].should == 0.5 extgstate[:stroke_opacity].should == 0.2 end end end ruby-prawn-1.0.0~rc2.orig/spec/measurement_units_spec.rb0000644000000000000000000000116112114176157022124 0ustar rootrootrequire File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") require "prawn/measurement_extensions" describe "Measurement units" do it "should convert units to PostScriptPoints" do 1.mm.should be_within(0.000000001).of(2.834645669) 1.mm.should == (72 / 25.4) 2.mm.should == (2 * 72 / 25.4) 3.mm.should == 3 * 72 / 25.4 -3.mm.should == -3 * 72/25.4 1.cm.should == 10 * 72 / 25.4 1.dm.should == 100 * 72 / 25.4 1.m.should == 1000 * 72 / 25.4 1.in.should == 72 1.ft.should == 72 * 12 1.yd.should == 72 * 12 * 3 1.pt.should == 1 end end ruby-prawn-1.0.0~rc2.orig/spec/jpg_spec.rb0000644000000000000000000000126212114176157017137 0ustar rootroot# encoding: utf-8 # Spec'ing the PNG class. Not complete yet - still needs to check the # contents of palette and transparency to ensure they're correct. # Need to find files that have these sections first. require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "When reading a JPEG file" do before(:each) do @filename = "#{Prawn::DATADIR}/images/pigs.jpg" @img_data = File.open(@filename, "rb") { |f| f.read } end it "should read the basic attributes correctly" do jpg = Prawn::Images::JPG.new(@img_data) jpg.width.should == 604 jpg.height.should == 453 jpg.bits.should == 8 jpg.channels.should == 3 end end ruby-prawn-1.0.0~rc2.orig/spec/line_wrap_spec.rb0000644000000000000000000003165612114176157020351 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "Core::Text::Formatted::LineWrap#wrap_line" do before(:each) do create_pdf @arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf) @line_wrap = Prawn::Core::Text::Formatted::LineWrap.new @one_word_width = 50 end it "should strip leading and trailing spaces" do array = [{ :text => " hello world, " }, { :text => "goodbye ", :style => [:bold] }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => 300, :document => @pdf) string.should == "hello world, goodbye" end it "should strip trailing spaces when a white-space-only fragment was" + " successfully pushed onto the end of a line but no other non-white" + " space fragment fits after it" do array = [{ :text => "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa " }, { :text => " ", :style => [:bold] }, { :text => " bbbbbbbbbbbbbbbbbbbbbbbbbbbb" }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => 300, :document => @pdf) string.should == "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" end it "should raise_error CannotFit if a too-small width is given" do array = [{ :text => " hello world, " }, { :text => "goodbye ", :style => [:bold] }] @arranger.format_array = array lambda do @line_wrap.wrap_line(:arranger => @arranger, :width => 1, :document => @pdf) end.should raise_error(Prawn::Errors::CannotFit) end it "should break on space" do array = [{ :text => "hello world" }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) string.should == "hello" end it "should break on zero-width space" do @pdf.font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf") array = [{ :text => "hello#{Prawn::Text::ZWSP}world" }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) string.should == "hello" end it "should not display zero-width space" do @pdf.font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf") array = [{ :text => "hello#{Prawn::Text::ZWSP}world" }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => 300, :document => @pdf) string.should == "helloworld" end it "should break on tab" do array = [{ :text => "hello\tworld" }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) string.should == "hello" end it "should break on hyphens" do array = [{ :text => "hello-world" }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) string.should == "hello-" end it "should not break after a hyphen that follows white space and" + "precedes a word" do array = [{ :text => "hello -" }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) string.should == "hello -" array = [{ :text => "hello -world" }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) string.should == "hello" end it "should break on a soft hyphen" do string = @pdf.font.normalize_encoding("hello#{Prawn::Text::SHY}world") array = [{ :text => string }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) expected = @pdf.font.normalize_encoding("hello#{Prawn::Text::SHY}") expected.force_encoding("utf-8") if "".respond_to?(:force_encoding) string.should == expected @pdf.font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf") @line_wrap = Prawn::Core::Text::Formatted::LineWrap.new string = "hello#{Prawn::Text::SHY}world" array = [{ :text => string }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) string.should == "hello#{Prawn::Text::SHY}" end it "should not display soft hyphens except at the end of a line" do string = @pdf.font.normalize_encoding("hello#{Prawn::Text::SHY}world") array = [{ :text => string }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => 300, :document => @pdf) string.should == "helloworld" @pdf.font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf") @line_wrap = Prawn::Core::Text::Formatted::LineWrap.new string = "hello#{Prawn::Text::SHY}world" array = [{ :text => string }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => 300, :document => @pdf) string.should == "helloworld" end it "should not break before a hard hyphen that follows a word" do enough_width_for_hello_world = 60 array = [{ :text => "hello world" }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => enough_width_for_hello_world, :document => @pdf) string.should == "hello world" array = [{ :text => "hello world-" }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => enough_width_for_hello_world, :document => @pdf) string.should == "hello" @pdf.font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf") @line_wrap = Prawn::Core::Text::Formatted::LineWrap.new enough_width_for_hello_world = 68 array = [{ :text => "hello world" }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => enough_width_for_hello_world, :document => @pdf) string.should == "hello world" array = [{ :text => "hello world-" }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => enough_width_for_hello_world, :document => @pdf) string.should == "hello" end it "should not break after a hard hyphen that follows a soft hyphen and" + "precedes a word" do string = @pdf.font.normalize_encoding("hello#{Prawn::Text::SHY}-") array = [{ :text => string }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) string.should == "hello-" string = @pdf.font.normalize_encoding("hello#{Prawn::Text::SHY}-world") array = [{ :text => string }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) expected = @pdf.font.normalize_encoding("hello#{Prawn::Text::SHY}") expected.force_encoding("utf-8") if "".respond_to?(:force_encoding) string.should == expected @pdf.font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf") @line_wrap = Prawn::Core::Text::Formatted::LineWrap.new string = "hello#{Prawn::Text::SHY}-" array = [{ :text => string }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) string.should == "hello-" string = "hello#{Prawn::Text::SHY}-world" array = [{ :text => string }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) string.should == "hello#{Prawn::Text::SHY}" end end describe "Core::Text::Formatted::LineWrap#space_count" do before(:each) do create_pdf @arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf) @line_wrap = Prawn::Core::Text::Formatted::LineWrap.new end it "should return the number of spaces in the last wrapped line" do array = [{ :text => "hello world, " }, { :text => "goodbye", :style => [:bold] }] @arranger.format_array = array @line_wrap.wrap_line(:arranger => @arranger, :width => 300, :document => @pdf) @line_wrap.space_count.should == 2 end it "should exclude preceding and trailing spaces from the count" do array = [{ :text => " hello world, " }, { :text => "goodbye ", :style => [:bold] }] @arranger.format_array = array @line_wrap.wrap_line(:arranger => @arranger, :width => 300, :document => @pdf) @line_wrap.space_count.should == 2 end end describe "Core::Text::Formatted::LineWrap" do before(:each) do create_pdf @arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello\nworld\n\n\nhow are you?" }, { :text => "\n" }, { :text => "\n" }, { :text => "" }, { :text => "fine, thanks. " * 4 }, { :text => "" }, { :text => "\n" }, { :text => "" }] @arranger.format_array = array @line_wrap = Prawn::Core::Text::Formatted::LineWrap.new end it "should only return an empty string if nothing fit or there" + "was nothing to wrap" do 8.times do line = @line_wrap.wrap_line(:arranger => @arranger, :width => 200, :document => @pdf) line.should_not be_empty end line = @line_wrap.wrap_line(:arranger => @arranger, :width => 200, :document => @pdf) line.should be_empty end end describe "Core::Text::Formatted::LineWrap#paragraph_finished?" do before(:each) do create_pdf @arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf) @line_wrap = Prawn::Core::Text::Formatted::LineWrap.new @one_word_width = 50 end it "should be_false when the last printed line is not the end of the paragraph" do array = [{ :text => "hello world" }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) @line_wrap.paragraph_finished?.should == false end it "should be_true when the last printed line is the last fragment to print" do array = [{ :text => "hello world" }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) @line_wrap.paragraph_finished?.should == true end it "should be_true when a newline exists on the current line" do array = [{ :text => "hello\n world" }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) @line_wrap.paragraph_finished?.should == true end it "should be_true when a newline exists in the next fragment" do array = [{ :text => "hello " }, { :text => " \n" }, { :text => "world" }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) @line_wrap.paragraph_finished?.should == true end end ruby-prawn-1.0.0~rc2.orig/spec/png_spec.rb0000644000000000000000000001715612114176157017154 0ustar rootroot# encoding: ASCII-8BIT # Spec'ing the PNG class. Not complete yet - still needs to check the # contents of palette and transparency to ensure they're correct. # Need to find files that have these sections first. # # see http://www.w3.org/TR/PNG/ for a detailed description of the PNG spec, # particuarly Table 11.1 for the different color types require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "When reading a greyscale PNG file (color type 0)" do before(:each) do @filename = "#{Prawn::DATADIR}/images/web-links.png" @data_filename = "#{Prawn::DATADIR}/images/web-links.dat" @img_data = File.binread(@filename) end it "should read the attributes from the header chunk correctly" do png = Prawn::Images::PNG.new(@img_data) png.width.should == 21 png.height.should == 14 png.bits.should == 8 png.color_type.should == 0 png.compression_method.should == 0 png.filter_method.should == 0 png.interlace_method.should == 0 end it "should read the image data chunk correctly" do png = Prawn::Images::PNG.new(@img_data) data = File.binread(@data_filename) png.img_data.should == data end end describe "When reading a greyscale PNG file with transparency (color type 0)" do before(:each) do @filename = "#{Prawn::DATADIR}/images/ruport_type0.png" @img_data = File.binread(@filename) end # In a greyscale type 0 PNG image, the tRNS chunk should contain a single value # that indicates the color that should be interpreted as transparent. # # http://www.w3.org/TR/PNG/#11tRNS it "should read the tRNS chunk correctly" do png = Prawn::Images::PNG.new(@img_data) png.transparency[:grayscale].should == 255 end end describe "When reading an RGB PNG file (color type 2)" do before(:each) do @filename = "#{Prawn::DATADIR}/images/ruport.png" @data_filename = "#{Prawn::DATADIR}/images/ruport_data.dat" @img_data = File.binread(@filename) end it "should read the attributes from the header chunk correctly" do png = Prawn::Images::PNG.new(@img_data) png.width.should == 258 png.height.should == 105 png.bits.should == 8 png.color_type.should == 2 png.compression_method.should == 0 png.filter_method.should == 0 png.interlace_method.should == 0 end it "should read the image data chunk correctly" do png = Prawn::Images::PNG.new(@img_data) data = File.binread(@data_filename) png.img_data.should == data end end describe "When reading an RGB PNG file with transparency (color type 2)" do before(:each) do @filename = "#{Prawn::DATADIR}/images/arrow2.png" @img_data = File.binread(@filename) end # In a RGB type 2 PNG image, the tRNS chunk should contain a single RGB value # that indicates the color that should be interpreted as transparent. In this # case it's green. # # http://www.w3.org/TR/PNG/#11tRNS it "should read the tRNS chunk correctly" do png = Prawn::Images::PNG.new(@img_data) png.transparency[:rgb].should == [0, 255, 0] end end # TODO: describe "When reading an indexed color PNG file wiih transparency (color type 3)" describe "When reading an indexed color PNG file (color type 3)" do before(:each) do @filename = "#{Prawn::DATADIR}/images/rails.png" @data_filename = "#{Prawn::DATADIR}/images/rails.dat" @img_data = File.binread(@filename) end it "should read the attributes from the header chunk correctly" do png = Prawn::Images::PNG.new(@img_data) png.width.should == 50 png.height.should == 64 png.bits.should == 8 png.color_type.should == 3 png.compression_method.should == 0 png.filter_method.should == 0 png.interlace_method.should == 0 end it "should read the image data chunk correctly" do png = Prawn::Images::PNG.new(@img_data) data = File.binread(@data_filename) png.img_data.should == data end end describe "When reading a greyscale+alpha PNG file (color type 4)" do before(:each) do @filename = "#{Prawn::DATADIR}/images/page_white_text.png" @data_filename = "#{Prawn::DATADIR}/images/page_white_text.dat" @alpha_data_filename = "#{Prawn::DATADIR}/images/page_white_text.alpha" @img_data = File.binread(@filename) end it "should read the attributes from the header chunk correctly" do png = Prawn::Images::PNG.new(@img_data) png.width.should == 16 png.height.should == 16 png.bits.should == 8 png.color_type.should == 4 png.compression_method.should == 0 png.filter_method.should == 0 png.interlace_method.should == 0 end it "should correctly return the raw image data (with no alpha channel) from the image data chunk" do png = Prawn::Images::PNG.new(@img_data) png.split_alpha_channel! data = File.binread(@data_filename) png.img_data.should == data end it "should correctly extract the alpha channel data from the image data chunk" do png = Prawn::Images::PNG.new(@img_data) png.split_alpha_channel! data = File.binread(@alpha_data_filename) png.alpha_channel.should == data end end describe "When reading an RGB+alpha PNG file (color type 6)" do before(:each) do @filename = "#{Prawn::DATADIR}/images/dice.png" @data_filename = "#{Prawn::DATADIR}/images/dice.dat" @alpha_data_filename = "#{Prawn::DATADIR}/images/dice.alpha" @img_data = File.binread(@filename) end it "should read the attributes from the header chunk correctly" do png = Prawn::Images::PNG.new(@img_data) png.width.should == 320 png.height.should == 240 png.bits.should == 8 png.color_type.should == 6 png.compression_method.should == 0 png.filter_method.should == 0 png.interlace_method.should == 0 end it "should correctly return the raw image data (with no alpha channel) from the image data chunk" do png = Prawn::Images::PNG.new(@img_data) png.split_alpha_channel! data = File.binread(@data_filename) # compare decompressed rather than compressed image data # because JRuby's implementation of Zlib is different from MRI -- # both generate valid gzipped data, but not bit-identical to each other Zlib::Inflate.inflate(png.img_data).should == Zlib::Inflate.inflate(data) end it "should correctly extract the alpha channel data from the image data chunk" do png = Prawn::Images::PNG.new(@img_data) png.split_alpha_channel! data = File.binread(@alpha_data_filename) Zlib::Inflate.inflate(png.alpha_channel).should == Zlib::Inflate.inflate(data) end end describe "When reading a 16bit RGB+alpha PNG file (color type 6)" do before(:each) do @filename = "#{Prawn::DATADIR}/images/16bit.png" @data_filename = "#{Prawn::DATADIR}/images/16bit.dat" # alpha channel truncated to 8-bit @alpha_data_filename = "#{Prawn::DATADIR}/images/16bit.alpha" @img_data = File.binread(@filename) end it "should read the attributes from the header chunk correctly" do png = Prawn::Images::PNG.new(@img_data) png.width.should == 32 png.height.should == 32 png.bits.should == 16 png.color_type.should == 6 png.compression_method.should == 0 png.filter_method.should == 0 png.interlace_method.should == 0 end it "should correctly return the raw image data (with no alpha channel) from the image data chunk" do png = Prawn::Images::PNG.new(@img_data) png.split_alpha_channel! data = File.binread(@data_filename) png.img_data.should == data end it "should correctly extract the alpha channel data from the image data chunk" do png = Prawn::Images::PNG.new(@img_data) png.split_alpha_channel! data = File.binread(@alpha_data_filename) png.alpha_channel.should == data end end ruby-prawn-1.0.0~rc2.orig/spec/stamp_spec.rb0000644000000000000000000001201312114176157017477 0ustar rootrootrequire File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "create_stamp before any page is added" do it "should work with the font class" do @pdf = Prawn::Document.new(:skip_page_creation => true) lambda { @pdf.create_stamp("my_stamp") do @pdf.font.height end }.should_not raise_error(Prawn::Errors::NotOnPage) end it "should work with setting color" do @pdf = Prawn::Document.new(:skip_page_creation => true) lambda { @pdf.create_stamp("my_stamp") do @pdf.fill_color = 'ff0000' end }.should_not raise_error(Prawn::Errors::NotOnPage) end end describe "#stamp_at" do it "should work" do create_pdf @pdf.create_stamp("MyStamp") @pdf.stamp_at("MyStamp", [100, 200]) # I had modified PDF::Inspector::XObject to receive the # invoke_xobject message and count the number of times it was # called, but it was only called once, so I reverted checking the # output with a regular expression @pdf.render.should =~ /\/Stamp1 Do.*?/m end end describe "Document with a stamp" do it "should raise_error NameTaken error when attempt to create stamp "+ "with same name as an existing stamp" do create_pdf @pdf.create_stamp("MyStamp") lambda { @pdf.create_stamp("MyStamp") }.should raise_error(Prawn::Errors::NameTaken) end it "should raise_error InvalidName error when attempt to create "+ "stamp with a blank name" do create_pdf lambda { @pdf.create_stamp("") }.should raise_error(Prawn::Errors::InvalidName) end it "a new XObject should be defined for each stamp created" do create_pdf @pdf.create_stamp("MyStamp") @pdf.create_stamp("AnotherStamp") @pdf.stamp("MyStamp") @pdf.stamp("AnotherStamp") inspector = PDF::Inspector::XObject.analyze(@pdf.render) xobjects = inspector.page_xobjects.last xobjects.length.should == 2 end it "calling stamp with a name that does not match an existing stamp "+ "should raise_error UndefinedObjectName" do create_pdf @pdf.create_stamp("MyStamp") lambda { @pdf.stamp("OtherStamp") }.should raise_error(Prawn::Errors::UndefinedObjectName) end it "stamp should be drawn into the document each time stamp is called" do create_pdf @pdf.create_stamp("MyStamp") @pdf.stamp("MyStamp") @pdf.stamp("MyStamp") @pdf.stamp("MyStamp") # I had modified PDF::Inspector::XObject to receive the # invoke_xobject message and count the number of times it was # called, but it was only called once, so I reverted checking the # output with a regular expression @pdf.render.should =~ /(\/Stamp1 Do.*?){3}/m end it "resources added during stamp creation should be added to the "+ "stamp XObject, not the page" do create_pdf @pdf.create_stamp("MyStamp") do @pdf.transparent(0.5) { @pdf.circle([100, 100], 10)} end @pdf.stamp("MyStamp") # Inspector::XObject does not give information about resources, so # resorting to string matching output = @pdf.render objects = output.split("endobj") objects.each do |object| if object =~ /\/Type \/Page$/ object.should_not =~ /\/ExtGState/ elsif object =~ /\/Type \/XObject$/ object.should =~ /\/ExtGState/ end end end it "stamp stream should be wrapped in a graphic state" do create_pdf @pdf.create_stamp("MyStamp") do @pdf.text "This should have a 'q' before it and a 'Q' after it" end @pdf.stamp("MyStamp") stamps = PDF::Inspector::XObject.analyze(@pdf.render) stamps.xobject_streams[:Stamp1].data.chomp.should =~ /q(.|\s)*Q\Z/ end it "should not add to the page graphic state stack " do create_pdf @pdf.state.page.stack.stack.size.should == 1 @pdf.create_stamp("MyStamp") do @pdf.save_graphics_state @pdf.save_graphics_state @pdf.save_graphics_state @pdf.text "This should have a 'q' before it and a 'Q' after it" @pdf.restore_graphics_state end @pdf.state.page.stack.stack.size.should == 1 end it "should be able to change fill and stroke colors within the stamp stream" do create_pdf @pdf.create_stamp("MyStamp") do @pdf.fill_color(100, 100, 20, 0) @pdf.stroke_color(100, 100, 20, 0) end @pdf.stamp("MyStamp") stamps = PDF::Inspector::XObject.analyze(@pdf.render) stamp_stream = stamps.xobject_streams[:Stamp1].data stamp_stream.should include("/DeviceCMYK cs\n1.000 1.000 0.200 0.000 scn") stamp_stream.should include("/DeviceCMYK CS\n1.000 1.000 0.200 0.000 SCN") end it "should save the color space even when same as current page color space" do create_pdf @pdf.stroke_color(100, 100, 20, 0) @pdf.create_stamp("MyStamp") do @pdf.stroke_color(100, 100, 20, 0) end @pdf.stamp("MyStamp") stamps = PDF::Inspector::XObject.analyze(@pdf.render) stamp_stream = stamps.xobject_streams[:Stamp1].data stamp_stream.should include("/DeviceCMYK CS\n1.000 1.000 0.200 0.000 SCN") end end ruby-prawn-1.0.0~rc2.orig/spec/template_spec.rb0000644000000000000000000002751212114176157020200 0ustar rootrootrequire File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "Document built from a template" do it "should have the same page count as the source document" do filename = "#{Prawn::BASEDIR}/spec/data/curves.pdf" @pdf = Prawn::Document.new(:template => filename) page_counter = PDF::Inspector::Page.analyze(@pdf.render) page_counter.pages.size.should == 1 end it "should not set the template page's parent to the document pages catalog (especially with nested pages)" do filename = "#{Prawn::DATADIR}/pdfs/nested_pages.pdf" @pdf = Prawn::Document.new(:template => filename, :skip_page_creation => true) @pdf.state.page.dictionary.data[:Parent].should_not == @pdf.state.store.pages end it "should have start with the Y cursor at the top of the document" do filename = "#{Prawn::BASEDIR}/spec/data/curves.pdf" @pdf = Prawn::Document.new(:template => filename) (@pdf.y == nil).should == false end it "should respect margins set by Prawn" do filename = "#{Prawn::BASEDIR}/spec/data/curves.pdf" @pdf = Prawn::Document.new(:template => filename, :margin => 0) @pdf.page.margins.should == { :left => 0, :right => 0, :top => 0, :bottom => 0 } @pdf = Prawn::Document.new(:template => filename, :left_margin => 0) @pdf.page.margins.should == { :left => 0, :right => 36, :top => 36, :bottom => 36 } @pdf.start_new_page(:right_margin => 0) @pdf.page.margins.should == { :left => 0, :right => 0, :top => 36, :bottom => 36 } end it "should not add an extra restore_graphics_state operator to the end of any content stream" do filename = "#{Prawn::BASEDIR}/spec/data/curves.pdf" @pdf = Prawn::Document.new(:template => filename) output = StringIO.new(@pdf.render) hash = PDF::Reader::ObjectHash.new(output) hash.each_value do |obj| next unless obj.kind_of?(PDF::Reader::Stream) data = obj.data.tr(" \n\r","") data.include?("QQ").should == false end end it "should have a single page object if importing a single page template" do filename = "#{Prawn::DATADIR}/pdfs/hexagon.pdf" @pdf = Prawn::Document.new(:template => filename) output = StringIO.new(@pdf.render) hash = PDF::Reader::ObjectHash.new(output) pages = hash.values.select { |obj| obj.kind_of?(Hash) && obj[:Type] == :Page } pages.size.should == 1 end it "should have two content streams if importing a single page template" do filename = "#{Prawn::DATADIR}/pdfs/hexagon.pdf" @pdf = Prawn::Document.new(:template => filename) output = StringIO.new(@pdf.render) hash = PDF::Reader::ObjectHash.new(output) streams = hash.values.select { |obj| obj.kind_of?(PDF::Reader::Stream) } streams.size.should == 2 end it "should not die if using this PDF as a template" do filename = "#{Prawn::DATADIR}/pdfs/complex_template.pdf" lambda { @pdf = Prawn::Document.new(:template => filename) }.should_not raise_error end it "should have balance q/Q operators on all content streams" do filename = "#{Prawn::DATADIR}/pdfs/hexagon.pdf" @pdf = Prawn::Document.new(:template => filename) output = StringIO.new(@pdf.render) hash = PDF::Reader::ObjectHash.new(output) streams = hash.values.select { |obj| obj.kind_of?(PDF::Reader::Stream) } streams.each do |stream| data = stream.unfiltered_data data.scan("q").size.should == 1 data.scan("Q").size.should == 1 end end it "should allow text to be added to a single page template" do filename = "#{Prawn::DATADIR}/pdfs/hexagon.pdf" @pdf = Prawn::Document.new(:template => filename) @pdf.text "Adding some text" text = PDF::Inspector::Text.analyze(@pdf.render) text.strings.first.should == "Adding some text" end it "should allow PDFs with page resources behind an indirect object to be used as templates" do filename = "#{Prawn::DATADIR}/pdfs/resources_as_indirect_object.pdf" @pdf = Prawn::Document.new(:template => filename) @pdf.text "Adding some text" text = PDF::Inspector::Text.analyze(@pdf.render) all_text = text.strings.join all_text.include?("Adding some text").should == true end it "should copy the PDF version from the template file" do filename = "#{Prawn::DATADIR}/pdfs/version_1_6.pdf" @pdf = Prawn::Document.new(:template => filename) str = @pdf.render str[0,8].should == "%PDF-1.6" end it "should correctly add a TTF font to a template that has existing fonts" do filename = "#{Prawn::DATADIR}/pdfs/contains_ttf_font.pdf" @pdf = Prawn::Document.new(:template => filename) @pdf.font "#{Prawn::DATADIR}/fonts/Chalkboard.ttf" @pdf.move_down(40) @pdf.text "Hi There" output = StringIO.new(@pdf.render) hash = PDF::Reader::ObjectHash.new(output) page_dict = hash.values.detect{ |obj| obj.is_a?(Hash) && obj[:Type] == :Page } resources = page_dict[:Resources] fonts = resources[:Font] fonts.size.should == 2 end it "should correctly import a template file that is missing a MediaBox entry" do filename = "#{Prawn::DATADIR}/pdfs/page_without_mediabox.pdf" @pdf = Prawn::Document.new(:template => filename) str = @pdf.render str[0,4].should == "%PDF" end context "with the template as a stream" do it "should correctly import a template file from a stream" do filename = "#{Prawn::DATADIR}/pdfs/hexagon.pdf" io = StringIO.new(File.binread(filename)) @pdf = Prawn::Document.new(:template => io) str = @pdf.render str[0,4].should == "%PDF" end end it "merges metadata info" do filename = "#{Prawn::DATADIR}/pdfs/hexagon.pdf" info = { :Title => "Sample METADATA", :Author => "Me", :Subject => "Not Working", :CreationDate => Time.now } @pdf = Prawn::Document.new(:template => filename, :info => info) output = StringIO.new(@pdf.render) hash = PDF::Reader::ObjectHash.new(output) info.keys.each { |k| hash[hash.trailer[:Info]].keys.include?(k).should == true } end end describe "Document#start_new_page with :template option" do filename = "#{Prawn::BASEDIR}/spec/data/curves.pdf" it "should set the imported page's parent to the document pages catalog" do @pdf = Prawn::Document.new() @pdf.start_new_page(:template => filename) @pdf.state.page.dictionary.data[:Parent].should == @pdf.state.store.pages end it "should set start the Y cursor at the top of the page" do @pdf = Prawn::Document.new() @pdf.start_new_page(:template => filename) (@pdf.y == nil).should == false end it "should respect margins set by Prawn" do @pdf = Prawn::Document.new(:margin => 0) @pdf.start_new_page(:template => filename) @pdf.page.margins.should == { :left => 0, :right => 0, :top => 0, :bottom => 0 } @pdf = Prawn::Document.new(:left_margin => 0) @pdf.start_new_page(:template => filename) @pdf.page.margins.should == { :left => 0, :right => 36, :top => 36, :bottom => 36 } @pdf.start_new_page(:template => filename, :right_margin => 0) @pdf.page.margins.should == { :left => 0, :right => 0, :top => 36, :bottom => 36 } end it "should not add an extra restore_graphics_state operator to the end of any content stream" do @pdf = Prawn::Document.new @pdf.start_new_page(:template => filename) output = StringIO.new(@pdf.render) hash = PDF::Reader::ObjectHash.new(output) hash.each_value do |obj| next unless obj.kind_of?(PDF::Reader::Stream) data = obj.data.tr(" \n\r","") data.include?("QQ").should == false end end it "should have two content streams if importing a single page template" do filename = "#{Prawn::DATADIR}/pdfs/hexagon.pdf" @pdf = Prawn::Document.new() @pdf.start_new_page(:template => filename) output = StringIO.new(@pdf.render) hash = PDF::Reader::ObjectHash.new(output) pages = hash.values.find {|obj| obj.is_a?(Hash) && obj[:Type] == :Pages}[:Kids] template_page = hash[pages[1]] template_page[:Contents].size.should == 2 end it "should have balance q/Q operators on all content streams" do filename = "#{Prawn::DATADIR}/pdfs/hexagon.pdf" @pdf = Prawn::Document.new() @pdf.start_new_page(:template => filename) output = StringIO.new(@pdf.render) hash = PDF::Reader::ObjectHash.new(output) streams = hash.values.select { |obj| obj.kind_of?(PDF::Reader::Stream) } streams.each do |stream| data = stream.unfiltered_data data.scan("q").size.should == 1 data.scan("Q").size.should == 1 end end it "should allow text to be added to a single page template" do @pdf = Prawn::Document.new() @pdf.start_new_page(:template => filename) @pdf.text "Adding some text" text = PDF::Inspector::Text.analyze(@pdf.render) text.strings.first.should == "Adding some text" end it "should allow PDFs with page resources behind an indirect object to be used as templates" do filename = "#{Prawn::DATADIR}/pdfs/resources_as_indirect_object.pdf" @pdf = Prawn::Document.new() @pdf.start_new_page(:template => filename) @pdf.text "Adding some text" text = PDF::Inspector::Text.analyze(@pdf.render) all_text = text.strings.join all_text.include?("Adding some text").should == true end it "should correctly add a TTF font to a template that has existing fonts" do filename = "#{Prawn::DATADIR}/pdfs/contains_ttf_font.pdf" @pdf = Prawn::Document.new() @pdf.start_new_page(:template => filename) @pdf.font "#{Prawn::DATADIR}/fonts/Chalkboard.ttf" @pdf.move_down(40) @pdf.text "Hi There" output = StringIO.new(@pdf.render) hash = PDF::Reader::ObjectHash.new(output) hash = PDF::Reader::ObjectHash.new(output) pages = hash.values.find {|obj| obj.is_a?(Hash) && obj[:Type] == :Pages}[:Kids] template_page = hash[pages[1]] resources = template_page[:Resources] fonts = resources[:Font] fonts.size.should == 2 end it "indexes template pages when used multiple times" do filename = "#{Prawn::DATADIR}/pdfs/multipage_template.pdf" @repeated_pdf = Prawn::Document.new() 3.times { @repeated_pdf.start_new_page(:template => filename) } repeated_hash = PDF::Reader::ObjectHash.new(StringIO.new(@repeated_pdf.render)) @sequential_pdf = Prawn::Document.new() (1..3).each { |p| @sequential_pdf.start_new_page(:template => filename, :template_page => p ) } sequential_hash = PDF::Reader::ObjectHash.new(StringIO.new(@sequential_pdf.render)) (repeated_hash.size < sequential_hash.size).should == true end context "with the template as a stream" do it "should correctly import a template file from a stream" do filename = "#{Prawn::DATADIR}/pdfs/hexagon.pdf" io = StringIO.new(File.binread(filename)) @pdf = Prawn::Document.new() @pdf.start_new_page(:template => io) str = @pdf.render str[0,4].should == "%PDF" end end context "using template_page option" do it "uses the specified page option" do filename = "#{Prawn::DATADIR}/pdfs/multipage_template.pdf" @pdf = Prawn::Document.new() @pdf.start_new_page(:template => filename, :template_page => 2) text = PDF::Inspector::Text.analyze(@pdf.render) text.strings.first.should == "This is template page 2" end end end ruby-prawn-1.0.0~rc2.orig/spec/object_store_spec.rb0000644000000000000000000001366712114176157021055 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "Prawn::ObjectStore" do before(:each) do @store = Prawn::Core::ObjectStore.new end it "should create required roots by default, including info passed to new" do store = Prawn::Core::ObjectStore.new(:info => {:Test => 3}) store.size.should == 3 # 3 default roots store.info.data[:Test].should == 3 store.pages.data[:Count].should == 0 store.root.data[:Pages].should == store.pages end it "should import objects from an existing PDF" do filename = "#{Prawn::BASEDIR}/spec/data/curves.pdf" store = Prawn::Core::ObjectStore.new(:template => filename) store.size.should == 5 end it "should point to existing roots when importing objects from an existing PDF" do filename = "#{Prawn::BASEDIR}/spec/data/curves.pdf" store = Prawn::Core::ObjectStore.new(:template => filename) store.info.class.should == Prawn::Core::Reference store.root.class.should == Prawn::Core::Reference end it "should initialize with pages when importing objects from an existing PDF" do filename = "#{Prawn::BASEDIR}/spec/data/curves.pdf" store = Prawn::Core::ObjectStore.new(:template => filename) store.pages.data[:Count].should == 1 end it "should import all objects from a PDF that has an indirect reference in a stream dict" do filename = "#{Prawn::DATADIR}/pdfs/indirect_reference.pdf" store = Prawn::Core::ObjectStore.new(:template => filename) store.size.should == 8 end it "should raise_error ArgumentError when given a file that doesn exist as a template" do filename = "not_really_there.pdf" lambda { Prawn::Core::ObjectStore.new(:template => filename) }.should raise_error(ArgumentError) end it "should raise_error Prawn::Errors::TemplateError when given a non PDF as a template" do filename = "#{Prawn::DATADIR}/images/dice.png" lambda { Prawn::Core::ObjectStore.new(:template => filename) }.should raise_error(Prawn::Errors::TemplateError) end it "should raise_error Prawn::Errors::TemplateError when given an encrypted PDF as a template" do filename = "#{Prawn::DATADIR}/pdfs/encrypted.pdf" lambda { Prawn::Core::ObjectStore.new(:template => filename) }.should raise_error(Prawn::Errors::TemplateError) end it "should add to its objects when ref() is called" do count = @store.size @store.ref("blah") @store.size.should == count + 1 end it "should accept push with a Prawn::Reference" do r = Prawn::Core::Reference(123, "blah") @store.push(r) @store[r.identifier].should == r end it "should accept arbitrary data and use it to create a Prawn::Reference" do @store.push(123, "blahblah") @store[123].data.should == "blahblah" end it "should be Enumerable, yielding in order of submission" do # higher IDs to bypass the default roots [10, 11, 12].each do |id| @store.push(id, "some data #{id}") end @store.map{|ref| ref.identifier}[-3..-1].should == [10, 11, 12] end end describe "Prawn::ObjectStore#compact" do it "should do nothing to an ObjectStore with all live refs" do store = Prawn::Core::ObjectStore.new store.info.data[:Blah] = store.ref(:some => "structure") old_size = store.size store.compact store.size.should == old_size end it "should remove dead objects, renumbering live objects from 1" do store = Prawn::Core::ObjectStore.new store.ref(:some => "structure") old_size = store.size store.compact store.size.should be < old_size store.map{ |o| o.identifier }.should == (1..store.size).to_a end it "should detect and remove dead objects that were once live" do store = Prawn::Core::ObjectStore.new store.info.data[:Blah] = store.ref(:some => "structure") store.info.data[:Blah] = :overwritten old_size = store.size store.compact store.size.should be < old_size store.map{ |o| o.identifier }.should == (1..store.size).to_a end end describe "Prawn::ObjectStorie#object_id_for_page" do it "should return the object ID of an imported template page" do filename = "#{Prawn::DATADIR}/pdfs/hexagon.pdf" store = Prawn::Core::ObjectStore.new(:template => filename) store.object_id_for_page(0).should == 4 end it "should return the object ID of the first imported template page" do filename = "#{Prawn::DATADIR}/pdfs/two_hexagons.pdf" store = Prawn::Core::ObjectStore.new(:template => filename) store.object_id_for_page(1).should == 4 end it "should return the object ID of the last imported template page" do filename = "#{Prawn::DATADIR}/pdfs/two_hexagons.pdf" store = Prawn::Core::ObjectStore.new(:template => filename) store.object_id_for_page(-1).should == 6 end it "should return the object ID of the first page of a template that uses nested Pages" do filename = "#{Prawn::DATADIR}/pdfs/nested_pages.pdf" store = Prawn::Core::ObjectStore.new(:template => filename) store.object_id_for_page(1).should == 5 end it "should return the object ID of the last page of a template that uses nested Pages" do filename = "#{Prawn::DATADIR}/pdfs/nested_pages.pdf" store = Prawn::Core::ObjectStore.new(:template => filename) store.object_id_for_page(-1).should == 8 end it "should return nil if given an invalid page number" do filename = "#{Prawn::DATADIR}/pdfs/hexagon.pdf" store = Prawn::Core::ObjectStore.new(:template => filename) store.object_id_for_page(10).should == nil end it "should return nil if given an invalid page number" do store = Prawn::Core::ObjectStore.new store.object_id_for_page(10).should == nil end it "should accept a stream instead of a filename" do example = Prawn::Document.new() example.text "An example doc, created in memory" example.start_new_page StringIO.open(example.render) do |stream| @pdf = Prawn::Core::ObjectStore.new(:template => stream) end @pdf.page_count.should == 2 end end ruby-prawn-1.0.0~rc2.orig/spec/images_spec.rb0000644000000000000000000001060212114176157017622 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") require 'set' require 'pathname' describe "the image() function" do before(:each) do @filename = "#{Prawn::DATADIR}/images/pigs.jpg" create_pdf end it "should only embed an image once, even if it's added multiple times" do @pdf.image @filename, :at => [100,100] @pdf.image @filename, :at => [300,300] output = @pdf.render images = PDF::Inspector::XObject.analyze(output) # there should be 2 images in the page resources images.page_xobjects.first.size.should == 2 # but only 1 image xobject output.scan(/\/Type \/XObject/).size.should == 1 end it "should return the image info object" do info = @pdf.image(@filename) info.should be_a_kind_of(Prawn::Images::JPG) info.height.should == 453 end it "should accept IO objects" do file = File.open(@filename, "rb") info = @pdf.image(file) info.height.should == 453 end it "rewinds IO objects to be able to embed them multiply" do file = File.open(@filename, "rb") @pdf.image(file) info = @pdf.image(file) info.height.should == 453 end it "should accept Pathname objects" do info = @pdf.image(Pathname.new(@filename)) info.height.should == 453 end it "should raise_error an UnsupportedImageType if passed a BMP" do filename = "#{Prawn::DATADIR}/images/tru256.bmp" lambda { @pdf.image filename, :at => [100,100] }.should raise_error(Prawn::Errors::UnsupportedImageType) end it "should raise_error an UnsupportedImageType if passed an interlaced PNG" do filename = "#{Prawn::DATADIR}/images/dice_interlaced.png" lambda { @pdf.image filename, :at => [100,100] }.should raise_error(Prawn::Errors::UnsupportedImageType) end it "should bump PDF version to 1.5 or greater on embedding 16-bit PNGs" do @pdf.image "#{Prawn::DATADIR}/images/16bit.png" @pdf.state.version.should >= 1.5 end # to support Adobe Reader, which apparently doesn't handle 16-bit alpha # channels. Verified experimentally [BE] but not confirmed in documentation # or anything. OS X Preview handles those files just fine. # it "should embed 8-bit alpha channels for 16-bit PNGs" do @pdf.image "#{Prawn::DATADIR}/images/16bit.png" output = @pdf.render output.should =~ /\/BitsPerComponent 16/ output.should =~ /\/BitsPerComponent 8/ end it "should flow an image to a new page if it will not fit on a page" do @pdf.image @filename, :fit => [600, 600] @pdf.image @filename, :fit => [600, 600] output = StringIO.new(@pdf.render, 'r+') hash = PDF::Reader::ObjectHash.new(output) pages = hash.values.find {|obj| obj.is_a?(Hash) && obj[:Type] == :Pages}[:Kids] pages.size.should == 2 hash[pages[0]][:Resources][:XObject].keys.should == [:I1] hash[pages[1]][:Resources][:XObject].keys.should == [:I2] end it "should not flow an image to a new page if it will fit on one page" do @pdf.image @filename, :fit => [400, 400] @pdf.image @filename, :fit => [400, 400] output = StringIO.new(@pdf.render, 'r+') hash = PDF::Reader::ObjectHash.new(output) pages = hash.values.find {|obj| obj.is_a?(Hash) && obj[:Type] == :Pages}[:Kids] pages.size.should == 1 Set.new(hash[pages[0]][:Resources][:XObject].keys).should == Set.new([:I1, :I2]) end it "should not start a new page just for a stretchy bounding box" do @pdf.expects(:start_new_page).times(0) @pdf.bounding_box([0, @pdf.cursor], :width => @pdf.bounds.width) do @pdf.image @filename end end describe ":fit option" do it "should fit inside the defined constraints" do info = @pdf.image @filename, :fit => [100,400] info.scaled_width.should <= 100 info.scaled_height.should <= 400 info = @pdf.image @filename, :fit => [400,100] info.scaled_width.should <= 400 info.scaled_height.should <= 100 info = @pdf.image @filename, :fit => [604,453] info.scaled_width.should == 604 info.scaled_height.should == 453 end it "should move text position" do @y = @pdf.y info = @pdf.image @filename, :fit => [100,400] @pdf.y.should < @y end end describe ":at option" do it "should not move text position" do @y = @pdf.y info = @pdf.image @filename, :at => [100,400] @pdf.y.should == @y end end end ruby-prawn-1.0.0~rc2.orig/spec/stroke_styles_spec.rb0000644000000000000000000001267212114176157021300 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "When stroking with default settings" do before(:each) { create_pdf } it "cap_style should be :butt" do @pdf.cap_style.should == :butt end it "join_style should be :miter" do @pdf.join_style.should == :miter end it "dashed? should be_false" do @pdf.should_not be_dashed end end describe "Cap styles" do before(:each) { create_pdf } it "should be able to use assignment operator" do @pdf.cap_style = :round @pdf.cap_style.should == :round end describe "#cap_style(:butt)" do it "rendered PDF should include butt style cap" do @pdf.cap_style(:butt) cap_style = PDF::Inspector::Graphics::CapStyle.analyze(@pdf.render).cap_style cap_style.should == 0 end end describe "#cap_style(:round)" do it "rendered PDF should include round style cap" do @pdf.cap_style(:round) cap_style = PDF::Inspector::Graphics::CapStyle.analyze(@pdf.render).cap_style cap_style.should == 1 end end describe "#cap_style(:projecting_square)" do it "rendered PDF should include projecting_square style cap" do @pdf.cap_style(:projecting_square) cap_style = PDF::Inspector::Graphics::CapStyle.analyze(@pdf.render).cap_style cap_style.should == 2 end end it "should carry the current cap style settings over to new pages" do @pdf.cap_style(:round) @pdf.start_new_page cap_styles = PDF::Inspector::Graphics::CapStyle.analyze(@pdf.render) cap_styles.cap_style_count.should == 2 cap_styles.cap_style.should == 1 end end describe "Join styles" do before(:each) { create_pdf } it "should be able to use assignment operator" do @pdf.join_style = :round @pdf.join_style.should == :round end describe "#join_style(:miter)" do it "rendered PDF should include miter style join" do @pdf.join_style(:miter) join_style = PDF::Inspector::Graphics::JoinStyle.analyze(@pdf.render).join_style join_style.should == 0 end end describe "#join_style(:round)" do it "rendered PDF should include round style join" do @pdf.join_style(:round) join_style = PDF::Inspector::Graphics::JoinStyle.analyze(@pdf.render).join_style join_style.should == 1 end end describe "#join_style(:bevel)" do it "rendered PDF should include bevel style join" do @pdf.join_style(:bevel) join_style = PDF::Inspector::Graphics::JoinStyle.analyze(@pdf.render).join_style join_style.should == 2 end end it "should carry the current join style settings over to new pages" do @pdf.join_style(:round) @pdf.start_new_page join_styles = PDF::Inspector::Graphics::JoinStyle.analyze(@pdf.render) join_styles.join_style_count.should == 2 join_styles.join_style.should == 1 end end describe "Dashes" do before(:each) { create_pdf } it "should be able to use assignment operator" do @pdf.dash = 2 @pdf.should be_dashed end describe "setting a dash" do it "dashed? should be_true" do @pdf.dash(2) @pdf.should be_dashed end it "rendered PDF should include a stroked dash" do @pdf.dash(2) dashes = PDF::Inspector::Graphics::Dash.analyze(@pdf.render) dashes.stroke_dash.should == [[2, 2], 0] end end describe "setting a dash by passing a single argument" do it "space between dashes should be the same length as the dash in the rendered PDF" do @pdf.dash(2) dashes = PDF::Inspector::Graphics::Dash.analyze(@pdf.render) dashes.stroke_dash.should == [[2, 2], 0] end end describe "with a space option that differs from the first argument" do it "space between dashes in the rendered PDF should be different length than the length of the dash" do @pdf.dash(2, :space => 3) dashes = PDF::Inspector::Graphics::Dash.analyze(@pdf.render) dashes.stroke_dash.should == [[2, 3], 0] end end describe "with a non-zero phase option" do it "rendered PDF should include a non-zero phase" do @pdf.dash(2, :phase => 1) dashes = PDF::Inspector::Graphics::Dash.analyze(@pdf.render) dashes.stroke_dash.should == [[2, 2], 1] end end describe "clearing stroke dash" do it "should restore solid line" do @pdf.dash(2) @pdf.undash dashes = PDF::Inspector::Graphics::Dash.analyze(@pdf.render) dashes.stroke_dash.should == [[], 0] end end it "should carry the current dash settings over to new pages" do @pdf.dash(2) @pdf.start_new_page dashes = PDF::Inspector::Graphics::Dash.analyze(@pdf.render) dashes.stroke_dash_count.should == 2 dashes.stroke_dash.should == [[2, 2], 0] end describe "#dashed?" do it "an initial document should not be dashed" do @pdf.dashed?.should == false end it "should return true if any of the currently active settings are dashed" do @pdf.dash(2) @pdf.save_graphics_state @pdf.dashed?.should == true end it "should return false if the document was most recently undashed" do @pdf.dash(2) @pdf.save_graphics_state @pdf.undash @pdf.save_graphics_state @pdf.dashed?.should == false end it "should return true when restoring to a state that was dashed" do @pdf.dash(2) @pdf.save_graphics_state @pdf.undash @pdf.restore_graphics_state @pdf.dashed?.should == true end end end ruby-prawn-1.0.0~rc2.orig/spec/pdf_object_spec.rb0000644000000000000000000001555712114176157020472 0ustar rootroot# encoding: ASCII-8BIT require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") # See PDF Reference, Sixth Edition (1.7) pp51-60 for details describe "PDF Object Serialization" do it "should convert Ruby's nil to PDF null" do Prawn::Core::PdfObject(nil).should == "null" end it "should convert Ruby booleans to PDF booleans" do Prawn::Core::PdfObject(true).should == "true" Prawn::Core::PdfObject(false).should == "false" end it "should convert a Ruby number to PDF number" do Prawn::Core::PdfObject(1).should == "1" Prawn::Core::PdfObject(1.214112421).should == "1.214112421" # scientific notation is not valid in PDF Prawn::Core::PdfObject(0.000005).should == "0.000005" end it "should convert a Ruby time object to a PDF timestamp" do t = Time.now Prawn::Core::PdfObject(t).should == t.strftime("(D:%Y%m%d%H%M%S%z").chop.chop + "'00')" end it "should convert a Ruby string to PDF string when inside a content stream" do s = "I can has a string" PDF::Inspector.parse(Prawn::Core::PdfObject(s, true)).should == s end it "should convert a Ruby string to a UTF-16 PDF string when outside a content stream" do s = "I can has a string" s_utf16 = "\xFE\xFF" + s.unpack("U*").pack("n*") PDF::Inspector.parse(Prawn::Core::PdfObject(s, false)).should == s_utf16 end it "should convert a Ruby string with characters outside the BMP to its " + "UTF-16 representation with a BOM" do # U+10192 ROMAN SEMUNCIA SIGN semuncia = [65938].pack("U") Prawn::Core::PdfObject(semuncia, false).upcase.should == "" end it "should pass through bytes regardless of content stream status for ByteString" do Prawn::Core::PdfObject(Prawn::Core::ByteString.new("\xDE\xAD\xBE\xEF")).upcase. should == "" end it "should escape parens when converting from Ruby string to PDF" do s = 'I )(can has a string' PDF::Inspector.parse(Prawn::Core::PdfObject(s, true)).should == s end it "should handle ruby escaped parens when converting to PDF string" do s = 'I can \\)( has string' PDF::Inspector.parse(Prawn::Core::PdfObject(s, true)).should == s end it "should escape various strings correctly when converting a LiteralString" do ls = Prawn::Core::LiteralString.new("abc") Prawn::Core::PdfObject(ls).should == "(abc)" ls = Prawn::Core::LiteralString.new("abc\x0Ade") # should escape \n Prawn::Core::PdfObject(ls).should == "(abc\x5C\x0Ade)" ls = Prawn::Core::LiteralString.new("abc\x0Dde") # should escape \r Prawn::Core::PdfObject(ls).should == "(abc\x5C\x0Dde)" ls = Prawn::Core::LiteralString.new("abc\x09de") # should escape \t Prawn::Core::PdfObject(ls).should == "(abc\x5C\x09de)" ls = Prawn::Core::LiteralString.new("abc\x08de") # should escape \b Prawn::Core::PdfObject(ls).should == "(abc\x5C\x08de)" ls = Prawn::Core::LiteralString.new("abc\x0Cde") # should escape \f Prawn::Core::PdfObject(ls).should == "(abc\x5C\x0Cde)" ls = Prawn::Core::LiteralString.new("abc(de") # should escape \( Prawn::Core::PdfObject(ls).should == "(abc\x5C(de)" ls = Prawn::Core::LiteralString.new("abc)de") # should escape \) Prawn::Core::PdfObject(ls).should == "(abc\x5C)de)" ls = Prawn::Core::LiteralString.new("abc\x5Cde") # should escape \\ Prawn::Core::PdfObject(ls).should == "(abc\x5C\x5Cde)" Prawn::Core::PdfObject(ls).size.should == 9 end it "should escape strings correctly when converting a LiteralString that is not utf-8" do data = "\x43\xaf\xc9\x7f\xef\xf\xe6\xa8\xcb\x5c\xaf\xd0" ls = Prawn::Core::LiteralString.new(data) Prawn::Core::PdfObject(ls).should == "(\x43\xaf\xc9\x7f\xef\xf\xe6\xa8\xcb\x5c\x5c\xaf\xd0)" end it "should convert a Ruby symbol to PDF name" do Prawn::Core::PdfObject(:my_symbol).should == "/my_symbol" Prawn::Core::PdfObject(:"A;Name_With-Various***Characters?").should == "/A;Name_With-Various***Characters?" end it "should convert a whitespace or delimiter containing Ruby symbol to a PDF name" do Prawn::Core::PdfObject(:"my symbol").should == "/my#20symbol" Prawn::Core::PdfObject(:"my#symbol").should == "/my#23symbol" Prawn::Core::PdfObject(:"my/symbol").should == "/my#2Fsymbol" Prawn::Core::PdfObject(:"my(symbol").should == "/my#28symbol" Prawn::Core::PdfObject(:"my)symbol").should == "/my#29symbol" Prawn::Core::PdfObject(:"mysymbol").should == "/my#3Esymbol" end it "should convert a Ruby array to PDF Array when inside a content stream" do Prawn::Core::PdfObject([1,2,3]).should == "[1 2 3]" PDF::Inspector.parse(Prawn::Core::PdfObject([[1,2],:foo,"Bar"], true)).should == [[1,2],:foo, "Bar"] end it "should convert a Ruby array to PDF Array when outside a content stream" do bar = "\xFE\xFF" + "Bar".unpack("U*").pack("n*") Prawn::Core::PdfObject([1,2,3]).should == "[1 2 3]" PDF::Inspector.parse(Prawn::Core::PdfObject([[1,2],:foo,"Bar"], false)).should == [[1,2],:foo, bar] end it "should convert a Ruby hash to a PDF Dictionary when inside a content stream" do dict = Prawn::Core::PdfObject( {:foo => :bar, "baz" => [1,2,3], :bang => {:a => "what", :b => [:you, :say] }}, true ) res = PDF::Inspector.parse(dict) res[:foo].should == :bar res[:baz].should == [1,2,3] res[:bang].should == { :a => "what", :b => [:you, :say] } end it "should convert a Ruby hash to a PDF Dictionary when outside a content stream" do what = "\xFE\xFF" + "what".unpack("U*").pack("n*") dict = Prawn::Core::PdfObject( {:foo => :bar, "baz" => [1,2,3], :bang => {:a => "what", :b => [:you, :say] }}, false ) res = PDF::Inspector.parse(dict) res[:foo].should == :bar res[:baz].should == [1,2,3] res[:bang].should == { :a => what, :b => [:you, :say] } end it "should not allow keys other than strings or symbols for PDF dicts" do lambda { Prawn::Core::PdfObject(:foo => :bar, :baz => :bang, 1 => 4) }. should raise_error(Prawn::Errors::FailedObjectConversion) end it "should convert a Prawn::Reference to a PDF indirect object reference" do ref = Prawn::Core::Reference(1,true) Prawn::Core::PdfObject(ref).should == ref.to_s end it "should convert a NameTree::Node to a PDF hash" do node = Prawn::Core::NameTree::Node.new(Prawn::Document.new, 10) node.add "hello", 1.0 node.add "world", 2.0 data = Prawn::Core::PdfObject(node) res = PDF::Inspector.parse(data) res.should == {:Names => ["hello", 1.0, "world", 2.0]} end end ruby-prawn-1.0.0~rc2.orig/spec/text_with_inline_formatting_spec.rb0000644000000000000000000000216312114176157024167 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "#formatted_text" do it "should draw text" do create_pdf string = "hello world" format_array = [:text => string] @pdf.formatted_text(format_array) # grab the text from the rendered PDF and ensure it matches text = PDF::Inspector::Text.analyze(@pdf.render) text.strings.first.should == string end end describe "#text with inline styling" do before(:each) { create_pdf } it "should automatically move to a new page if the tallest fragment" + " on the next line won't fit in the available space" do create_pdf @pdf.move_cursor_to(@pdf.font.height) formatted = "this contains sized text" @pdf.text(formatted, :inline_format => true) pages = PDF::Inspector::Page.analyze(@pdf.render).pages pages.size.should == 2 end it "should embed links as literal strings" do @pdf.text "wiki", :inline_format => true @pdf.render.should =~ %r{/URI\s+\(http://wiki\.github\.com} end end ruby-prawn-1.0.0~rc2.orig/spec/inline_formatted_text_parser_spec.rb0000644000000000000000000005007312114176157024326 0ustar rootroot# -*- coding: utf-8 -*- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "Text::Formatted::Parser#to_array" do it "should handle sup" do string = "superscript" array = Prawn::Text::Formatted::Parser.to_array(string) array[0].should == { :text => "superscript", :styles => [:superscript], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => nil, :character_spacing => nil } end it "should handle sub" do string = "subscript" array = Prawn::Text::Formatted::Parser.to_array(string) array[0].should == { :text => "subscript", :styles => [:subscript], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => nil, :character_spacing => nil } end it "should handle rgb" do string = "red text" array = Prawn::Text::Formatted::Parser.to_array(string) array[0].should == { :text => "red text", :styles => [], :color => "ff0000", :link => nil, :anchor => nil, :font => nil, :size => nil, :character_spacing => nil } end it "# should be optional in rgb" do string = "red text" array = Prawn::Text::Formatted::Parser.to_array(string) array[0].should == { :text => "red text", :styles => [], :color => "ff0000", :link => nil, :anchor => nil, :font => nil, :size => nil, :character_spacing => nil } end it "should handle cmyk" do string = "magenta text" array = Prawn::Text::Formatted::Parser.to_array(string) array[0].should == { :text => "magenta text", :styles => [], :color => [0, 100, 0, 0], :link => nil, :anchor => nil, :font => nil, :size => nil, :character_spacing => nil } end it "should handle fonts" do string = "Courier text" array = Prawn::Text::Formatted::Parser.to_array(string) array[0].should == { :text => "Courier text", :styles => [], :color => nil, :link => nil, :anchor => nil, :font => "Courier", :size => nil, :character_spacing => nil } end it "should handle size" do string = "14 point text" array = Prawn::Text::Formatted::Parser.to_array(string) array[0].should == { :text => "14 point text", :styles => [], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => 14, :character_spacing => nil } end it "should handle character_spacing" do string = "extra character spacing" array = Prawn::Text::Formatted::Parser.to_array(string) array[0].should == { :text => "extra character spacing", :styles => [], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => nil, :character_spacing => 2.5 } end it "should handle links" do string = "external link" array = Prawn::Text::Formatted::Parser.to_array(string) array[0].should == { :text => "external link", :styles => [], :color => nil, :link => "http://example.com", :anchor => nil, :font => nil, :size => nil, :character_spacing => nil } end it "should handle anchors" do string = "internal link" array = Prawn::Text::Formatted::Parser.to_array(string) array[0].should == { :text => "internal link", :styles => [], :color => nil, :link => nil, :anchor => "ToC", :font => nil, :size => nil, :character_spacing => nil } end it "should handle higher order characters properly" do string = "©\n©" array = Prawn::Text::Formatted::Parser.to_array(string) array[0].should == { :text => "©", :styles => [:bold], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => nil, :character_spacing => nil } array[1].should == { :text => "\n", :styles => [:bold], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => nil, :character_spacing => nil } array[2].should == { :text => "©", :styles => [:bold], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => nil, :character_spacing => nil } end it "should convert < >, and & to <, >, and &, respectively" do string = "hello <, >, and &" array = Prawn::Text::Formatted::Parser.to_array(string) array[1].should == { :text => "<, >, and &", :styles => [:bold], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => nil, :character_spacing => nil } end it "should handle double qoutes around tag attributes" do string = 'some sized text' array = Prawn::Text::Formatted::Parser.to_array(string) array[1].should == { :text => "sized", :styles => [], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => 14, :character_spacing => nil } end it "should handle single qoutes around tag attributes" do string = "some sized text" array = Prawn::Text::Formatted::Parser.to_array(string) array[1].should == { :text => "sized", :styles => [], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => 14, :character_spacing => nil } end it "should construct a formatted text array from a string" do string = "hello world\nhow are you?" array = Prawn::Text::Formatted::Parser.to_array(string) array[0].should == { :text => "hello ", :styles => [], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => nil, :character_spacing => nil } array[1].should == { :text => "world", :styles => [:bold], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => nil, :character_spacing => nil } array[2].should == { :text => "\n", :styles => [:bold], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => nil, :character_spacing => nil } array[3].should == { :text => "how ", :styles => [:bold], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => nil, :character_spacing => nil } array[4].should == { :text => "are", :styles => [:bold, :italic], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => nil, :character_spacing => nil } array[5].should == { :text => " you?", :styles => [], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => nil, :character_spacing => nil } end it "should accept as an alternative to " do string = "bold not bold" array = Prawn::Text::Formatted::Parser.to_array(string) array[0].should == { :text => "bold", :styles => [:bold], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => nil, :character_spacing => nil } array[1].should == { :text => " not bold", :styles => [], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => nil, :character_spacing => nil } end it "should accept as an alternative to " do string = "italic not italic" array = Prawn::Text::Formatted::Parser.to_array(string) array[0].should == { :text => "italic", :styles => [:italic], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => nil, :character_spacing => nil } array[1].should == { :text => " not italic", :styles => [], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => nil, :character_spacing => nil } end it "should accept as an alternative to " do string = "link not a link" array = Prawn::Text::Formatted::Parser.to_array(string) array[0].should == { :text => "link", :styles => [], :color => nil, :link => "http://example.com", :anchor => nil, :font => nil, :size => nil, :character_spacing => nil } array[1].should == { :text => " not a link", :styles => [], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => nil, :character_spacing => nil } end it "should turn
,
into newline" do array = Prawn::Text::Formatted::Parser.to_array("hello
big
world") array.map { |frag| frag[:text] }.join.should == "hello\nbig\nworld" end end describe "Text::Formatted::Parser#to_string" do it "should handle sup" do string = "superscript" array = [{ :text => "superscript", :styles => [:superscript], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => nil, :character_spacing => nil }] Prawn::Text::Formatted::Parser.to_string(array).should == string end it "should handle sub" do string = "subscript" array = [{ :text => "subscript", :styles => [:subscript], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => nil, :character_spacing => nil }] Prawn::Text::Formatted::Parser.to_string(array).should == string end it "should handle rgb" do string = "red text" array = [{ :text => "red text", :styles => [], :color => "ff0000", :link => nil, :anchor => nil, :font => nil, :size => nil, :character_spacing => nil }] Prawn::Text::Formatted::Parser.to_string(array).should == string end it "should handle cmyk" do string = "magenta text" array = [{ :text => "magenta text", :styles => [], :color => [0, 100, 0, 0], :link => nil, :anchor => nil, :font => nil, :size => nil, :character_spacing => nil }] Prawn::Text::Formatted::Parser.to_string(array).should == string end it "should handle fonts" do string = "Courier text" array = [{ :text => "Courier text", :styles => [], :color => nil, :link => nil, :anchor => nil, :font => "Courier", :size => nil, :character_spacing => nil }] Prawn::Text::Formatted::Parser.to_string(array).should == string end it "should handle size" do string = "14 point text" array = [{ :text => "14 point text", :styles => [], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => 14, :character_spacing => nil }] Prawn::Text::Formatted::Parser.to_string(array).should == string end it "should handle character spacing" do string = "2.5 extra character spacing" array = [{ :text => "2.5 extra character spacing", :styles => [], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => nil, :character_spacing => 2.5 }] Prawn::Text::Formatted::Parser.to_string(array).should == string end it "should handle links" do array = [{ :text => "external link", :styles => [], :color => nil, :link => "http://example.com", :anchor => nil, :font => nil, :size => nil, :character_spacing => nil }] string = "external link" Prawn::Text::Formatted::Parser.to_string(array).should == string end it "should handle anchors" do array = [{ :text => "internal link", :styles => [], :color => nil, :link => nil, :anchor => "ToC", :font => nil, :size => nil, :character_spacing => nil }] string = "internal link" Prawn::Text::Formatted::Parser.to_string(array).should == string end it "should convert <, >, and & to < >, and &, respectively" do array = [{ :text => "hello ", :styles => [], :color => nil, :link => nil, :font => nil, :size => nil, :character_spacing => nil }, { :text => "<, >, and &", :styles => [:bold], :color => nil, :link => nil, :font => nil, :size => nil, :character_spacing => nil }] string = "hello <, >, and &" Prawn::Text::Formatted::Parser.to_string(array).should == string end it "should construct an HTML-esque string from a formatted" + " text array" do array = [ { :text => "hello ", :styles => [], :color => nil, :link => nil, :font => nil, :size => 14, :character_spacing => nil }, { :text => "world", :styles => [:bold], :color => nil, :link => nil, :font => nil, :size => nil, :character_spacing => nil }, { :text => "\n", :styles => [:bold], :color => nil, :link => nil, :font => nil, :size => nil, :character_spacing => nil }, { :text => "how ", :styles => [:bold], :color => nil, :link => nil, :font => nil, :size => nil, :character_spacing => nil }, { :text => "are", :styles => [:bold, :italic], :color => nil, :link => nil, :font => nil, :size => nil, :character_spacing => nil }, { :text => " you?", :styles => [], :color => nil, :link => nil, :font => nil, :size => nil, :character_spacing => nil } ] string = "hello world\nhow are you?" Prawn::Text::Formatted::Parser.to_string(array).should == string end end describe "Text::Formatted::Parser#array_paragraphs" do it "should group fragments separated by newlines" do array = [{ :text => "\nhello\nworld" }, { :text => "\n\n" }, { :text => "how" }, { :text => "are" }, { :text => "you" }] target = [[{ :text => "\n"}], [{ :text => "hello" }], [{ :text => "world" }], [{ :text => "\n"}], [{ :text => "how" }, { :text => "are" }, { :text => "you" }]] Prawn::Text::Formatted::Parser.array_paragraphs(array).should == target end it "should work properly if ending in an empty paragraph" do array = [{ :text => "\nhello\nworld\n" }] target = [[{ :text => "\n" }], [{ :text => "hello" }], [{ :text => "world" }]] Prawn::Text::Formatted::Parser.array_paragraphs(array).should == target end end ruby-prawn-1.0.0~rc2.orig/spec/document_spec.rb0000644000000000000000000005354112114176157020204 0ustar rootroot# encoding: utf-8 require "tempfile" require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "Prawn::Document.new" do it "should not modify its argument" do options = {:page_layout => :landscape} Prawn::Document.new(options) options.should == {:page_layout => :landscape} end end describe "The cursor" do it "should == pdf.y - bounds.absolute_bottom" do pdf = Prawn::Document.new pdf.cursor.should == pdf.bounds.top pdf.y = 300 pdf.cursor.should == pdf.y - pdf.bounds.absolute_bottom end it "should be able to move relative to the bottom margin" do pdf = Prawn::Document.new pdf.move_cursor_to(10) pdf.cursor.should == 10 pdf.y.should == pdf.cursor + pdf.bounds.absolute_bottom end end describe "when generating a document from a subclass" do it "should be an instance of the subclass" do custom_document = Class.new(Prawn::Document) custom_document.generate(Tempfile.new("generate_test").path) do |e| e.class.should == custom_document e.should be_a_kind_of(Prawn::Document) end end it "should retain any extensions found on Prawn::Document" do mod1 = Module.new { attr_reader :test_extensions1 } mod2 = Module.new { attr_reader :test_extensions2 } Prawn::Document.extensions << mod1 << mod2 custom_document = Class.new(Prawn::Document) custom_document.extensions.should == [mod1, mod2] # remove the extensions we added to prawn document Prawn::Document.extensions.delete(mod1) Prawn::Document.extensions.delete(mod2) Prawn::Document.new.respond_to?(:test_extensions1).should be_false Prawn::Document.new.respond_to?(:test_extensions2).should be_false # verify these still exist on custom class custom_document.extensions.should == [mod1, mod2] custom_document.new.respond_to?(:test_extensions1).should be_true custom_document.new.respond_to?(:test_extensions2).should be_true end end describe "When creating multi-page documents" do before(:each) { create_pdf } it "should initialize with a single page" do page_counter = PDF::Inspector::Page.analyze(@pdf.render) page_counter.pages.size.should == 1 @pdf.page_count.should == 1 end it "should provide an accurate page_count" do 3.times { @pdf.start_new_page } page_counter = PDF::Inspector::Page.analyze(@pdf.render) page_counter.pages.size.should == 4 @pdf.page_count.should == 4 end end describe "When beginning each new page" do describe "Background template feature" do before(:each) do @filename = "#{Prawn::DATADIR}/images/pigs.jpg" @pdf = Prawn::Document.new(:background => @filename) end it "should place a background image if it is in options block" do output = @pdf.render images = PDF::Inspector::XObject.analyze(output) # there should be 2 images in the page resources images.page_xobjects.first.size.should == 1 end it "should place a background image if it is in options block" do @pdf.instance_variable_defined?(:@background).should == true @pdf.instance_variable_get(:@background).should == @filename end end end describe "Prawn::Document#float" do it "should restore the original y-position" do create_pdf orig_y = @pdf.y @pdf.float { @pdf.text "Foo" } @pdf.y.should == orig_y end it "should teleport across pages if necessary" do create_pdf @pdf.float do @pdf.text "Foo" @pdf.start_new_page @pdf.text "Bar" end @pdf.text "Baz" pages = PDF::Inspector::Page.analyze(@pdf.render).pages pages.size.should == 2 pages[0][:strings].should == ["Foo", "Baz"] pages[1][:strings].should == ["Bar"] end end describe "The page_number method" do it "should be 1 for a new document" do pdf = Prawn::Document.new pdf.page_number.should == 1 end it "should be 0 for documents with no pages" do pdf = Prawn::Document.new(:skip_page_creation => true) pdf.page_number.should == 0 end it "should be changed by go_to_page" do pdf = Prawn::Document.new 10.times { pdf.start_new_page } pdf.go_to_page 3 pdf.page_number.should == 3 end end describe "on_page_create callback" do before do create_pdf end it "should be invoked with document" do called_with = nil @pdf.on_page_create { |*args| called_with = args } @pdf.start_new_page called_with.should == [@pdf] end it "should be invoked for each new page" do trigger = mock() trigger.expects(:fire).times(5) @pdf.on_page_create { trigger.fire } 5.times { @pdf.start_new_page } end it "should be replaceable" do trigger1 = mock() trigger1.expects(:fire).times(1) trigger2 = mock() trigger2.expects(:fire).times(1) @pdf.on_page_create { trigger1.fire } @pdf.start_new_page @pdf.on_page_create { trigger2.fire } @pdf.start_new_page end it "should be clearable by calling on_page_create without a block" do trigger = mock() trigger.expects(:fire).times(1) @pdf.on_page_create { trigger.fire } @pdf.start_new_page @pdf.on_page_create @pdf.start_new_page end end describe "Document compression" do it "should not compress the page content stream if compression is disabled" do pdf = Prawn::Document.new(:compress => false) pdf.page.content.stubs(:compress_stream).returns(true) pdf.page.content.expects(:compress_stream).never pdf.text "Hi There" * 20 pdf.render end it "should compress the page content stream if compression is enabled" do pdf = Prawn::Document.new(:compress => true) pdf.page.content.stubs(:compress_stream).returns(true) pdf.page.content.expects(:compress_stream).once pdf.text "Hi There" * 20 pdf.render end it "should result in a smaller file size when compressed" do doc_uncompressed = Prawn::Document.new doc_compressed = Prawn::Document.new(:compress => true) [doc_compressed, doc_uncompressed].each do |pdf| pdf.font "#{Prawn::DATADIR}/fonts/gkai00mp.ttf" pdf.text "更可怕的是,同质化竞争对手可以按照URL中后面这个ID来遍历" * 10 end doc_compressed.render.length.should be < doc_uncompressed.render.length end end describe "Document metadata" do it "should output strings as UTF-16 with a byte order mark" do pdf = Prawn::Document.new(:info => {:Author => "Lóránt"}) pdf.state.store.info.object.should =~ # UTF-16: BOM L ó r á n t %r{/Author\s*}i end end describe "When reopening pages" do it "should modify the content stream size" do @pdf = Prawn::Document.new do |pdf| pdf.text "Page 1" pdf.start_new_page pdf.text "Page 2" pdf.go_to_page 1 pdf.text "More for page 1" end # MalformedPDFError raised if content stream actual length does not match # dictionary length lambda{ PDF::Inspector::Page.analyze(@pdf.render) }. should_not raise_error(PDF::Reader::MalformedPDFError) end it "should insert pages after the current page when calling start_new_page" do pdf = Prawn::Document.new 3.times { |i| pdf.text "Old page #{i+1}"; pdf.start_new_page } pdf.go_to_page 1 pdf.start_new_page pdf.text "New page 2" pdf.page_number.should == 2 pages = PDF::Inspector::Page.analyze(pdf.render).pages pages.size.should == 5 pages[1][:strings].should == ["New page 2"] pages[2][:strings].should == ["Old page 2"] end it "should update the bounding box to the new page's margin box" do Prawn::Document.new do start_new_page :layout => :landscape lsize = [bounds.width, bounds.height] go_to_page 1 [bounds.width, bounds.height].should == lsize.reverse end end end describe "When setting page size" do it "should default to LETTER" do @pdf = Prawn::Document.new pages = PDF::Inspector::Page.analyze(@pdf.render).pages pages.first[:size].should == Prawn::Document::PageGeometry::SIZES["LETTER"] end (Prawn::Document::PageGeometry::SIZES.keys - ["LETTER"]).each do |k| it "should provide #{k} geometry" do @pdf = Prawn::Document.new(:page_size => k) pages = PDF::Inspector::Page.analyze(@pdf.render).pages pages.first[:size].should == Prawn::Document::PageGeometry::SIZES[k] end end it "should allow custom page size" do @pdf = Prawn::Document.new(:page_size => [1920, 1080] ) pages = PDF::Inspector::Page.analyze(@pdf.render).pages pages.first[:size].should == [1920, 1080] end it "should retain page size by default when starting a new page" do @pdf = Prawn::Document.new(:page_size => "LEGAL") @pdf.start_new_page pages = PDF::Inspector::Page.analyze(@pdf.render).pages pages.each do |page| page[:size].should == Prawn::Document::PageGeometry::SIZES["LEGAL"] end end end describe "When setting page layout" do it "should reverse coordinates for landscape" do @pdf = Prawn::Document.new(:page_size => "A4", :page_layout => :landscape) pages = PDF::Inspector::Page.analyze(@pdf.render).pages pages.first[:size].should == Prawn::Document::PageGeometry::SIZES["A4"].reverse end it "should retain page layout by default when starting a new page" do @pdf = Prawn::Document.new(:page_layout => :landscape) @pdf.start_new_page(:trace => true) pages = PDF::Inspector::Page.analyze(@pdf.render).pages pages.each do |page| page[:size].should == Prawn::Document::PageGeometry::SIZES["LETTER"].reverse end end it "should swap the bounds when starting a new page with different layout" do @pdf = Prawn::Document.new size = [@pdf.bounds.width, @pdf.bounds.height] @pdf.start_new_page(:layout => :landscape) [@pdf.bounds.width, @pdf.bounds.height].should == size.reverse end end describe "The mask() feature" do it "should allow transactional restoration of attributes" do @pdf = Prawn::Document.new y, line_width = @pdf.y, @pdf.line_width @pdf.mask(:y, :line_width) do @pdf.y = y + 1 @pdf.line_width = line_width + 1 @pdf.y.should_not == y @pdf.line_width.should_not == line_width end @pdf.y.should == y @pdf.line_width.should == line_width end end describe "The group() feature" do it "should return a true value if the content fits on one page" do pdf = Prawn::Document.new do val = group { text "Hello"; text "World" } (!!val).should == true end end it "should group a simple block on a single page" do pdf = Prawn::Document.new do self.y = 50 val = group do text "Hello" text "World" end # group should return a false value since a new page was started (!!val).should == false end pages = PDF::Inspector::Page.analyze(pdf.render).pages pages.size.should == 2 pages[0][:strings].should == [] pages[1][:strings].should == ["Hello", "World"] end it "should raise_error CannotGroup if the content is too tall" do lambda { Prawn::Document.new do group do 100.times { text "Too long" } end end.render }.should raise_error(Prawn::Errors::CannotGroup) end it "should group within individual column boxes" do pdf = Prawn::Document.new do # Set up columns with grouped blocks of 0..49. 0 to 49 is slightly short # of the height of one page / column, so each column should get its own # group (every column should start with zero). column_box([0, bounds.top], :width => bounds.width, :columns => 7) do 10.times do group { 50.times { |i| text(i.to_s) } } end end end # Second page should start with a 0 because it's a new group. pages = PDF::Inspector::Page.analyze(pdf.render).pages pages.size.should == 2 pages[1][:strings].first.should == '0' end end describe "The render() feature" do if "spec".respond_to?(:encode!) it "should return a 8 bit encoded string on a m17n aware VM" do @pdf = Prawn::Document.new(:page_size => "A4", :page_layout => :landscape) @pdf.line [100,100], [200,200] str = @pdf.render str.encoding.to_s.should == "ASCII-8BIT" end end it "should trigger before_render callbacks just before rendering" do pdf = Prawn::Document.new seq = sequence("callback_order") # Verify the order: finalize -> fire callbacks -> render body pdf.expects(:finalize_all_page_contents).in_sequence(seq) trigger = mock() trigger.expects(:fire).in_sequence(seq) # Store away the render_body method to be called below render_body = pdf.method(:render_body) pdf.expects(:render_body).in_sequence(seq) pdf.before_render{ trigger.fire } # Render the body to set up object offsets render_body.call(StringIO.new) pdf.render end it "should be idempotent" do pdf = Prawn::Document.new contents = pdf.render contents2 = pdf.render contents2.should == contents end end describe "The :optimize_objects option" do before(:all) do @wasteful_doc = lambda do |pdf| pdf.transaction do pdf.start_new_page pdf.text "Hidden text" pdf.rollback end pdf.text "Hello world" end end it "should result in fewer objects when enabled" do wasteful_pdf = Prawn::Document.new(&@wasteful_doc) frugal_pdf = Prawn::Document.new(:optimize_objects => true, &@wasteful_doc) frugal_pdf.render.size.should be < wasteful_pdf.render.size end it "should default to :false" do default_pdf = Prawn::Document.new(&@wasteful_doc) wasteful_pdf = Prawn::Document.new(:optimize_objects => false, &@wasteful_doc) default_pdf.render.size.should == wasteful_pdf.render.size end end describe "PDF file versions" do it "should default to 1.3" do @pdf = Prawn::Document.new str = @pdf.render str[0,8].should == "%PDF-1.3" end it "should allow the default to be changed" do @pdf = Prawn::Document.new @pdf.__send__(:min_version, 1.4) str = @pdf.render str[0,8].should == "%PDF-1.4" end end describe "Documents that use go_to_page" do it "should have 2 pages after calling start_new_page and go_to_page" do @pdf = Prawn::Document.new @pdf.text "James" @pdf.start_new_page @pdf.text "Anthony" @pdf.go_to_page(1) @pdf.text "Healy" page_counter = PDF::Inspector::Page.analyze(@pdf.render) page_counter.pages.size.should == 2 end it "should correctly add text to pages" do @pdf = Prawn::Document.new @pdf.text "James" @pdf.start_new_page @pdf.text "Anthony" @pdf.go_to_page(1) @pdf.text "Healy" text = PDF::Inspector::Text.analyze(@pdf.render) text.strings.size.should == 3 text.strings.include?("James").should == true text.strings.include?("Anthony").should == true text.strings.include?("Healy").should == true end end describe "content stream characteristics" do it "should have 1 single content stream for a single page PDF with no templates" do @pdf = Prawn::Document.new @pdf.text "James" output = StringIO.new(@pdf.render) hash = PDF::Reader::ObjectHash.new(output) streams = hash.values.select { |obj| obj.kind_of?(PDF::Reader::Stream) } streams.size.should == 1 end it "should have 1 single content stream for a single page PDF with no templates, even if go_to_page is used" do @pdf = Prawn::Document.new @pdf.text "James" @pdf.go_to_page(1) @pdf.text "Healy" output = StringIO.new(@pdf.render) hash = PDF::Reader::ObjectHash.new(output) streams = hash.values.select { |obj| obj.kind_of?(PDF::Reader::Stream) } streams.size.should == 1 end end describe "The number_pages method" do before do @pdf = Prawn::Document.new(:skip_page_creation => true) end it "replaces the '' string with the proper page number" do @pdf.start_new_page @pdf.expects(:text_box).with("1, test", { :height => 50 }) @pdf.number_pages ", test", {:page_filter => :all} end it "replaces the '' string with the total page count" do @pdf.start_new_page @pdf.expects(:text_box).with("test, 1", { :height => 50 }) @pdf.number_pages "test, ", {:page_filter => :all} end it "must print each page if given the :all page_filter" do 10.times { @pdf.start_new_page } @pdf.expects(:text_box).times(10) @pdf.number_pages "test", {:page_filter => :all} end it "must print each page if no :page_filter is specified" do 10.times { @pdf.start_new_page } @pdf.expects(:text_box).times(10) @pdf.number_pages "test" end it "must not print the page number if given a nil filter" do 10.times { @pdf.start_new_page } @pdf.expects(:text_box).never @pdf.number_pages "test", {:page_filter => nil} end context "start_count_at option" do [1, 2].each do |startat| context "equal to #{startat}" do it "increments the pages" do 2.times { @pdf.start_new_page } options = {:page_filter => :all, :start_count_at => startat} @pdf.expects(:text_box).with("#{startat} 2", { :height => 50 }) @pdf.expects(:text_box).with("#{startat+1} 2", { :height => 50 }) @pdf.number_pages " ", options end end end [0, nil].each do |val| context "equal to #{val}" do it "defaults to start at page 1" do 3.times { @pdf.start_new_page } options = {:page_filter => :all, :start_count_at => val} @pdf.expects(:text_box).with("1 3", { :height => 50 }) @pdf.expects(:text_box).with("2 3", { :height => 50 }) @pdf.expects(:text_box).with("3 3", { :height => 50 }) @pdf.number_pages " ", options end end end end context "total_pages option" do it "allows the total pages count to be overridden" do 2.times { @pdf.start_new_page } @pdf.expects(:text_box).with("1 10", { :height => 50 }) @pdf.expects(:text_box).with("2 10", { :height => 50 }) @pdf.number_pages " ", :page_filter => :all, :total_pages => 10 end end context "special page filter" do context "such as :odd" do it "increments the pages" do 3.times { @pdf.start_new_page } @pdf.expects(:text_box).with("1 3", { :height => 50 }) @pdf.expects(:text_box).with("3 3", { :height => 50 }) @pdf.expects(:text_box).with("2 3", { :height => 50 }).never @pdf.number_pages " ", :page_filter => :odd end end context "missing" do it "does not print any page numbers" do 3.times { @pdf.start_new_page } @pdf.expects(:text_box).never @pdf.number_pages " ", :page_filter => nil end end end context "given both a special page filter and a start_count_at parameter" do context "such as :odd and 7" do it "increments the pages" do 3.times { @pdf.start_new_page } @pdf.expects(:text_box).with("1 3", { :height => 50 }).never @pdf.expects(:text_box).with("5 3", { :height => 50 }) # page 1 @pdf.expects(:text_box).with("6 3", { :height => 50 }).never # page 2 @pdf.expects(:text_box).with("7 3", { :height => 50 }) # page 3 @pdf.number_pages " ", :page_filter => :odd, :start_count_at => 5 end end context "some crazy proc and 2" do it "increments the pages" do 6.times { @pdf.start_new_page } options = {:page_filter => lambda {|p| p != 2 && p != 5}, :start_count_at => 4} @pdf.expects(:text_box).with("4 6", { :height => 50 }) # page 1 @pdf.expects(:text_box).with("5 6", { :height => 50 }).never # page 2 @pdf.expects(:text_box).with("6 6", { :height => 50 }) # page 3 @pdf.expects(:text_box).with("7 6", { :height => 50 }) # page 4 @pdf.expects(:text_box).with("8 6", { :height => 50 }).never # page 5 @pdf.expects(:text_box).with("9 6", { :height => 50 }) # page 6 @pdf.number_pages " ", options end end end context "height option" do before do @pdf.start_new_page end it "with 10 height" do @pdf.expects(:text_box).with("1 1", { :height => 10 }) @pdf.number_pages " ", :height => 10 end it "with nil height" do @pdf.expects(:text_box).with("1 1", { :height => nil }) @pdf.number_pages " ", :height => nil end it "with no height" do @pdf.expects(:text_box).with("1 1", { :height => 50 }) @pdf.number_pages " " end end end describe "The page_match? method" do before do @pdf = Prawn::Document.new(:skip_page_creation => true) 10.times {@pdf.start_new_page} end it "returns nil given no filter" do @pdf.page_match?(:nil, 1).should be_false end it "must provide an :all filter" do (1..@pdf.page_count).all? { |i| @pdf.page_match?(:all, i) }.should be_true end it "must provide an :odd filter" do odd, even = (1..@pdf.page_count).partition { |e| e % 2 == 1 } odd.all? { |i| @pdf.page_match?(:odd, i) }.should be_true even.any? { |i| @pdf.page_match?(:odd, i) }.should be_false end it "must be able to filter by an array of page numbers" do fltr = [1,2,7] (1..10).select { |i| @pdf.page_match?(fltr, i) }.should == [1,2,7] end it "must be able to filter by a range of page numbers" do fltr = 2..4 (1..10).select { |i| @pdf.page_match?(fltr, i) }.should == [2,3,4] end it "must be able to filter by an arbitrary proc" do fltr = lambda { |x| x == 1 or x % 3 == 0 } (1..10).select { |i| @pdf.page_match?(fltr, i) }.should == [1,3,6,9] end end ruby-prawn-1.0.0~rc2.orig/spec/text_at_spec.rb0000644000000000000000000001134312114176157020030 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "#draw_text" do before(:each) { create_pdf } it "should raise_error ArgumentError if :at option omitted" do lambda { @pdf.draw_text("hai", { }) }.should raise_error(ArgumentError) end it "should raise_error ArgumentError if :align option included" do lambda { @pdf.draw_text("hai", :at => [0, 0], :align => :center) }.should raise_error(ArgumentError) end it "should allow drawing empty strings to the page" do @pdf.draw_text(" ", :at => [100,100]) text = PDF::Inspector::Text.analyze(@pdf.render) text.strings.first.should == " " end it "should default to 12 point helvetica" do @pdf.draw_text("Blah", :at => [100,100]) text = PDF::Inspector::Text.analyze(@pdf.render) text.font_settings[0][:name].should == :Helvetica text.font_settings[0][:size].should == 12 text.strings.first.should == "Blah" end it "should allow setting font size" do @pdf.draw_text("Blah", :at => [100,100], :size => 16) text = PDF::Inspector::Text.analyze(@pdf.render) text.font_settings[0][:size].should == 16 end it "should allow setting a default font size" do @pdf.font_size = 16 @pdf.draw_text("Blah", :at => [0, 0]) text = PDF::Inspector::Text.analyze(@pdf.render) text.font_settings[0][:size].should == 16 end it "should allow overriding default font for a single instance" do @pdf.font_size = 16 @pdf.draw_text("Blah", :size => 11, :at => [0, 0]) @pdf.draw_text("Blaz", :at => [0, 0]) text = PDF::Inspector::Text.analyze(@pdf.render) text.font_settings[0][:size].should == 11 text.font_settings[1][:size].should == 16 end it "should allow setting a font size transaction with a block" do @pdf.font_size 16 do @pdf.draw_text('Blah', :at => [0, 0]) end @pdf.draw_text('blah', :at => [0, 0]) text = PDF::Inspector::Text.analyze(@pdf.render) text.font_settings[0][:size].should == 16 text.font_settings[1][:size].should == 12 end it "should allow manual setting the font size " + "when in a font size block" do @pdf.font_size(16) do @pdf.draw_text('Foo', :at => [0, 0]) @pdf.draw_text('Blah', :size => 11, :at => [0, 0]) @pdf.draw_text('Blaz', :at => [0, 0]) end text = PDF::Inspector::Text.analyze(@pdf.render) text.font_settings[0][:size].should == 16 text.font_settings[1][:size].should == 11 text.font_settings[2][:size].should == 16 end it "should allow registering of built-in font_settings on the fly" do @pdf.font "Times-Roman" @pdf.draw_text("Blah", :at => [100,100], :at => [0, 0]) @pdf.font "Courier" @pdf.draw_text("Blaz", :at => [150,150], :at => [0, 0]) text = PDF::Inspector::Text.analyze(@pdf.render) text.font_settings[0][:name].should == :"Times-Roman" text.font_settings[1][:name].should == :Courier end it "should raise_error an exception when an unknown font is used" do lambda { @pdf.font "Pao bu" }.should raise_error(Prawn::Errors::UnknownFont) end it "should correctly render a utf-8 string when using a built-in font" do str = "©" # copyright symbol @pdf.draw_text(str, :at => [0, 0]) # grab the text from the rendered PDF and ensure it matches text = PDF::Inspector::Text.analyze(@pdf.render) text.strings.first.should == str end if "spec".respond_to?(:encode!) # Handle non utf-8 string encodings in a sane way on M17N aware VMs it "should raise_error an exception when a utf-8 incompatible string is rendered" do str = "Blah \xDD" str.force_encoding("ASCII-8BIT") lambda { @pdf.draw_text(str, :at => [0, 0]) }.should raise_error( Prawn::Errors::IncompatibleStringEncoding) end it "should_not raise_error an exception when a shift-jis string is rendered" do datafile = "#{Prawn::DATADIR}/shift_jis_text.txt" sjis_str = File.open(datafile, "r:shift_jis") { |f| f.gets } @pdf.font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf") lambda { @pdf.draw_text(sjis_str, :at => [0, 0]) }.should_not raise_error( Prawn::Errors::IncompatibleStringEncoding) end else # Handle non utf-8 string encodings in a sane way on non-M17N aware VMs it "should raise_error an exception when a corrupt utf-8 string is rendered" do str = "Blah \xDD" lambda { @pdf.draw_text(str, :at => [0, 0]) }.should raise_error( Prawn::Errors::IncompatibleStringEncoding) end it "should raise_error an exception when a shift-jis string is rendered" do sjis_str = File.read("#{Prawn::DATADIR}/shift_jis_text.txt") lambda { @pdf.draw_text(sjis_str, :at => [0, 0]) }.should raise_error( Prawn::Errors::IncompatibleStringEncoding) end end end ruby-prawn-1.0.0~rc2.orig/spec/formatted_text_arranger_spec.rb0000644000000000000000000003574212114176157023303 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "Core::Text::Formatted::Arranger#format_array" do it "should populate unconsumed array" do create_pdf arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world how ", :styles => [:bold] }, { :text => "are", :styles => [:bold, :italic] }, { :text => " you?" }] arranger.format_array = array arranger.unconsumed[0].should == { :text => "hello " } arranger.unconsumed[1].should == { :text => "world how ", :styles => [:bold] } arranger.unconsumed[2].should == { :text => "are", :styles => [:bold, :italic] } arranger.unconsumed[3].should == { :text => " you?" } end it "should split newlines into their own elements" do create_pdf arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "\nhello\nworld" }] arranger.format_array = array arranger.unconsumed[0].should == { :text => "\n" } arranger.unconsumed[1].should == { :text => "hello" } arranger.unconsumed[2].should == { :text => "\n" } arranger.unconsumed[3].should == { :text => "world" } end end describe "Core::Text::Formatted::Arranger#preview_next_string" do it "should not populate the consumed array" do create_pdf arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello" }] arranger.format_array = array arranger.preview_next_string arranger.consumed.should == [] end it "should not consumed array" do create_pdf arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello" }] arranger.format_array = array arranger.preview_next_string.should == "hello" end end describe "Core::Text::Formatted::Arranger#next_string" do before(:each) do create_pdf @arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world how ", :styles => [:bold] }, { :text => "are", :styles => [:bold, :italic] }, { :text => " you?" }] @arranger.format_array = array end it "should raise_error an error if called after a line was finalized and" + " before a new line was initialized" do @arranger.finalize_line lambda do @arranger.next_string end.should raise_error(RuntimeError) end it "should populate consumed array" do while string = @arranger.next_string end @arranger.consumed[0].should == { :text => "hello " } @arranger.consumed[1].should == { :text => "world how ", :styles => [:bold] } @arranger.consumed[2].should == { :text => "are", :styles => [:bold, :italic] } @arranger.consumed[3].should == { :text => " you?" } end it "should populate current_format_state array" do create_pdf arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world how ", :styles => [:bold] }, { :text => "are", :styles => [:bold, :italic] }, { :text => " you?" }] arranger.format_array = array counter = 0 while string = arranger.next_string case counter when 0 arranger.current_format_state.should == { } when 1 arranger.current_format_state.should == { :styles => [:bold] } when 2 arranger.current_format_state.should == { :styles => [:bold, :italic] } when 3 arranger.current_format_state.should == { } end counter += 1 end end end describe "Core::Text::Formatted::Arranger#retrieve_fragment" do it "should raise_error an error if called before finalize_line was called" do create_pdf arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world how ", :styles => [:bold] }, { :text => "are", :styles => [:bold, :italic] }, { :text => " you?" }] arranger.format_array = array while string = arranger.next_string end lambda do arranger.retrieve_fragment end.should raise_error(RuntimeError) end it "should return the consumed fragments in order of consumption" + " and update" do create_pdf arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world how ", :styles => [:bold] }, { :text => "are", :styles => [:bold, :italic] }, { :text => " you?" }] arranger.format_array = array while string = arranger.next_string end arranger.finalize_line arranger.retrieve_fragment.text.should == "hello " arranger.retrieve_fragment.text.should == "world how " arranger.retrieve_fragment.text.should == "are" arranger.retrieve_fragment.text.should == " you?" end it "should never return a fragment whose text is an empty string" do create_pdf arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello\nworld\n\n\nhow are you?" }, { :text => "\n" }, { :text => "\n" }, { :text => "\n" }, { :text => "" }, { :text => "fine, thanks." }, { :text => "" }, { :text => "\n" }, { :text => "" }] arranger.format_array = array while string = arranger.next_string end arranger.finalize_line while fragment = arranger.retrieve_fragment fragment.text.should_not be_empty end end it "should not alter the current font style" do create_pdf arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world how ", :styles => [:bold] }, { :text => "are", :styles => [:bold, :italic] }, { :text => " you?" }] arranger.format_array = array while string = arranger.next_string end arranger.finalize_line arranger.retrieve_fragment arranger.current_format_state[:styles].should be_nil end end describe "Core::Text::Formatted::Arranger#update_last_string" do it "should update the last retrieved string with what actually fit on" + "the line and the list of unconsumed with what did not" do create_pdf arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world how ", :styles => [:bold] }, { :text => "are", :styles => [:bold, :italic] }, { :text => " you now?", :styles => [:bold, :italic] }] arranger.format_array = array while string = arranger.next_string end arranger.update_last_string(" you", " now?", nil) arranger.consumed[3].should == { :text => " you", :styles => [:bold, :italic] } arranger.unconsumed.should == [{ :text => " now?", :styles => [:bold, :italic] }] end it "should set the format state to the previously processed fragment" do create_pdf arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world how ", :styles => [:bold] }, { :text => "are", :styles => [:bold, :italic] }, { :text => " you now?" }] arranger.format_array = array 3.times { arranger.next_string } arranger.current_format_state.should == { :styles => [:bold, :italic] } arranger.update_last_string("", "are", "-") arranger.current_format_state.should == { :styles => [:bold] } end context "when the entire string was used" do it "should not push empty string onto unconsumed" do create_pdf arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world how ", :styles => [:bold] }, { :text => "are", :styles => [:bold, :italic] }, { :text => " you now?" }] arranger.format_array = array while string = arranger.next_string end arranger.update_last_string(" you now?", "", nil) arranger.unconsumed.should == [] end end end describe "Core::Text::Formatted::Arranger#space_count" do before(:each) do create_pdf @arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world how ", :styles => [:bold] }, { :text => "are", :styles => [:bold, :italic] }, { :text => " you?" }] @arranger.format_array = array while string = @arranger.next_string end end it "should raise_error an error if called before finalize_line was called" do lambda do @arranger.space_count end.should raise_error(RuntimeError) end it "should return the total number of spaces in all fragments" do @arranger.finalize_line @arranger.space_count.should == 4 end end describe "Core::Text::Formatted::Arranger#finalize_line" do it "should make it so that all trailing white space fragments " + "exclude trailing white space" do create_pdf arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world how ", :styles => [:bold] }, { :text => " ", :styles => [:bold, :italic] }] arranger.format_array = array while string = arranger.next_string end arranger.finalize_line arranger.fragments.length.should == 3 fragment = arranger.retrieve_fragment fragment.text.should == "hello " fragment = arranger.retrieve_fragment fragment.text.should == "world how" fragment = arranger.retrieve_fragment fragment.text.should == "" end end describe "Core::Text::Formatted::Arranger#line_width" do before(:each) do create_pdf @arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world", :styles => [:bold] }] @arranger.format_array = array while string = @arranger.next_string end end it "should raise_error an error if called before finalize_line was called" do lambda do @arranger.line_width end.should raise_error(RuntimeError) end it "should return the width of the complete line" do @arranger.finalize_line @arranger.line_width.should be > 0 end end describe "Core::Text::Formatted::Arranger#line_width with character_spacing > 0" do it "should return a width greater than a line without a character_spacing" do create_pdf arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world", :styles => [:bold] }] arranger.format_array = array while string = arranger.next_string end arranger.finalize_line base_line_width = arranger.line_width array = [{ :text => "hello " }, { :text => "world", :styles => [:bold], :character_spacing => 7}] arranger.format_array = array while string = arranger.next_string end arranger.finalize_line arranger.line_width.should be > base_line_width end end describe "Core::Text::Formatted::Arranger#line" do before(:each) do create_pdf @arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world", :styles => [:bold] }] @arranger.format_array = array while string = @arranger.next_string end end it "should raise_error an error if called before finalize_line was called" do lambda do @arranger.line end.should raise_error(RuntimeError) end it "should return the complete line" do @arranger.finalize_line @arranger.line.should == "hello world" end end describe "Core::Text::Formatted::Arranger#unconsumed" do it "should return the original array if nothing was consumed" do create_pdf arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world how ", :styles => [:bold] }, { :text => "are", :styles => [:bold, :italic] }, { :text => " you now?" }] arranger.format_array = array arranger.unconsumed.should == array end it "should return an empty array if everything was consumed" do create_pdf arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world how ", :styles => [:bold] }, { :text => "are", :styles => [:bold, :italic] }, { :text => " you now?" }] arranger.format_array = array while string = arranger.next_string end arranger.unconsumed.should == [] end end describe "Core::Text::Formatted::Arranger#finished" do it "should be_false if anything was not printed" do create_pdf arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world how ", :styles => [:bold] }, { :text => "are", :styles => [:bold, :italic] }, { :text => " you now?" }] arranger.format_array = array while string = arranger.next_string end arranger.update_last_string(" you", "now?", nil) arranger.should_not be_finished end it "should be_false if everything was printed" do create_pdf arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world how ", :styles => [:bold] }, { :text => "are", :styles => [:bold, :italic] }, { :text => " you now?" }] arranger.format_array = array while string = arranger.next_string end arranger.should be_finished end end describe "Core::Text::Formatted::Arranger.max_line_height" do it "should be the height of the maximum consumed fragment" do create_pdf arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world how ", :styles => [:bold] }, { :text => "are", :styles => [:bold, :italic], :size => 28 }, { :text => " you now?" }] arranger.format_array = array while string = arranger.next_string end arranger.finalize_line arranger.max_line_height.should be_within(0.0001).of(33.32) end end describe "Core::Text::Formatted::Arranger#repack_unretrieved" do it "should restore part of the original string" do create_pdf arranger = Prawn::Core::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world how ", :styles => [:bold] }, { :text => "are", :styles => [:bold, :italic] }, { :text => " you now?" }] arranger.format_array = array while string = arranger.next_string end arranger.finalize_line arranger.retrieve_fragment arranger.retrieve_fragment arranger.repack_unretrieved arranger.unconsumed.should == [ { :text => "are", :styles => [:bold, :italic] }, { :text => " you now?" }] end end ruby-prawn-1.0.0~rc2.orig/spec/data/0000755000000000000000000000000012114176157015730 5ustar rootrootruby-prawn-1.0.0~rc2.orig/spec/data/curves.pdf0000644000000000000000000000167512114176157017743 0ustar rootroot%PDF-1.3 % 1 0 obj << /Creator (Prawn) /Producer (Prawn) >> endobj 2 0 obj << /Type /Pages /Count 1 /Kids [5 0 R] >> endobj 3 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 4 0 obj << /Length 380 >> stream /DeviceRGB cs 0.000 0.000 0.000 scn /DeviceRGB CS 0.000 0.000 0.000 SCN q 136.000 136.000 m 96.000 126.000 96.000 126.000 86.000 86.000 c S 246.000 236.000 m 246.000 241.523 241.523 246.000 236.000 246.000 c 230.477 246.000 226.000 241.523 226.000 236.000 c 226.000 230.477 230.477 226.000 236.000 226.000 c 241.523 226.000 246.000 230.477 246.000 236.000 c 236.000 236.000 m f Q endstream endobj 5 0 obj << /Type /Page /Parent 2 0 R /MediaBox [0 0 612.0 792.0] /Contents 4 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] >> >> endobj xref 0 6 0000000000 65535 f 0000000015 00000 n 0000000071 00000 n 0000000128 00000 n 0000000177 00000 n 0000000608 00000 n trailer << /Size 6 /Root 3 0 R /Info 1 0 R >> startxref 762 %%EOF ruby-prawn-1.0.0~rc2.orig/spec/reference_spec.rb0000644000000000000000000000615212114176157020320 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "A Reference object" do it "should produce a PDF reference on #to_s call" do ref = Prawn::Core::Reference(1,true) ref.to_s.should == "1 0 R" end it "should allow changing generation number" do ref = Prawn::Core::Reference(1,true) ref.gen = 1 ref.to_s.should == "1 1 R" end it "should generate a valid PDF object for the referenced data" do ref = Prawn::Core::Reference(2,[1,"foo"]) ref.object.should == "2 0 obj\n#{Prawn::Core::PdfObject([1,"foo"])}\nendobj\n" end it "should automatically open a stream when #<< is used" do ref = Prawn::Core::Reference(1, :Length => 41) ref << "BT\n/F1 12 Tf\n72 712 Td\n( A stream ) Tj\nET" ref.object.should == "1 0 obj\n<< /Length 41\n>>\nstream"+ "\nBT\n/F1 12 Tf\n72 712 Td\n( A stream ) Tj\nET" + "\nendstream\nendobj\n" end it "should compress a stream upon request" do ref = Prawn::Core::Reference(2,{}) ref << "Hi There " * 20 cref = Prawn::Core::Reference(2,{}) cref << "Hi There " * 20 cref.compress_stream cref.stream.size.should be < ref.stream.size, "compressed stream expected to be smaller than source but wasn't" cref.data[:Filter].should == :FlateDecode end it "should copy the data and stream from another ref on #replace" do from = Prawn::Core::Reference(3, {:foo => 'bar'}) from << "has a stream too" to = Prawn::Core::Reference(4, {:foo => 'baz'}) to.replace from # should preserve identifier but copy data and stream to.identifier.should == 4 to.data.should == from.data to.stream.should == from.stream end it "should copy a compressed stream from a compressed ref on #replace" do from = Prawn::Core::Reference(5, {:foo => 'bar'}) from << "has a stream too " * 20 from.compress_stream to = Prawn::Core::Reference(6, {:foo => 'baz'}) to.replace from to.identifier.should == 6 to.data.should == from.data to.stream.should == from.stream to.compressed?.should == true end it "should have Length if stream present" do ref = Prawn::Core::Reference(7, {}) ref << "Hello" ref.data[:Length].should == 5 end it "should update Length when stream is updated" do ref = Prawn::Core::Reference(7, {}) ref << "Hello" ref.data[:Length].should == 5 ref << " world" ref.data[:Length].should == 11 end describe "generated via Prawn::Document" do it "should return a proper reference on ref!" do pdf = Prawn::Document.new pdf.ref!({}).is_a?(Prawn::Core::Reference).should == true end it "should return an identifier on ref" do pdf = Prawn::Document.new r = pdf.ref({}) r.is_a?(Integer).should == true end it "should have :Length of stream if it has one when compression disabled" do pdf = Prawn::Document.new :compress => false ref = pdf.ref!({}) ref << 'Hello' ref.data[:Length].should == 5 end end end ruby-prawn-1.0.0~rc2.orig/spec/spec_helper.rb0000644000000000000000000000143212114176157017635 0ustar rootroot# encoding: utf-8 puts "Prawn specs: Running on Ruby Version: #{RUBY_VERSION}" require "bundler" Bundler.setup $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib') require "prawn" Prawn.debug = true #require "test/spec" require "rspec" require "mocha/api" require "pdf/reader" require "pdf/inspector" # Requires supporting ruby files with custom matchers and macros, etc, # in spec/extensions/ and its subdirectories. Dir[File.dirname(__FILE__) + "/extensions/**/*.rb"].each {|f| require f } RSpec.configure do |config| config.mock_framework = :mocha config.include EncodingHelpers end def create_pdf(klass=Prawn::Document) @pdf = klass.new(:margin => 0) end # Make some methods public to assist in testing module Prawn::Graphics public :map_to_absolute end ruby-prawn-1.0.0~rc2.orig/spec/bounding_box_spec.rb0000644000000000000000000003422212114176157021036 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "A bounding box" do before(:each) do @x = 100 @y = 125 @width = 50 @height = 75 @box = Prawn::Document::BoundingBox.new(nil, nil, [@x,@y], :width => @width, :height => @height ) end it "should have an anchor at (x, y - height)" do @box.anchor.should == [@x,@y-@height] end it "should have a left boundary of 0" do @box.left.should == 0 end it "should have a right boundary equal to the width" do @box.right.should == @width end it "should have a top boundary of height" do @box.top.should == @height end it "should have a bottom boundary of 0" do @box.bottom.should == 0 end it "should have a top-left of [0,height]" do @box.top_left.should == [0,@height] end it "should have a top-right of [width,height]" do @box.top_right.should == [@width,@height] end it "should have a bottom-left of [0,0]" do @box.bottom_left.should == [0,0] end it "should have a bottom-right of [width,0]" do @box.bottom_right.should == [@width,0] end it "should have an absolute left boundary of x" do @box.absolute_left.should == @x end it "should have an absolute right boundary of x + width" do @box.absolute_right.should == @x + @width end it "should have an absolute top boundary of y" do @box.absolute_top.should == @y end it "should have an absolute bottom boundary of y - height" do @box.absolute_bottom.should == @y - @height end it "should have an absolute bottom-left of [x,y-height]" do @box.absolute_bottom_left.should == [@x, @y - @height] end it "should have an absolute bottom-right of [x+width,y-height]" do @box.absolute_bottom_right.should == [@x + @width , @y - @height] end it "should have an absolute top-left of [x,y]" do @box.absolute_top_left.should == [@x, @y] end it "should have an absolute top-right of [x+width,y]" do @box.absolute_top_right.should == [@x + @width, @y] end it "should require width to be set" do lambda do Prawn::Document::BoundingBox.new(nil, nil, [100,100]) end.should raise_error(ArgumentError) end it "should raise_error an ArgumentError if a block is not passed" do pdf = Prawn::Document.new lambda do pdf.bounding_box([0, 0], :width => 200) end.should raise_error(ArgumentError) end end describe "drawing bounding boxes" do before(:each) { create_pdf } it "should not stomp on the arguments to bounding_box" do pdf = Prawn::Document.new x = [100, 500] pdf.bounding_box x, :width => 100 do pdf.text "bork-bork-bork" end x.should == [100, 500] end it "should restore the margin box when bounding box exits" do margin_box = @pdf.bounds @pdf.bounding_box [100,500], :width => 100 do #nothing end @pdf.bounds.should == margin_box end it "should restore the parent bounding box when calls are nested" do @pdf.bounding_box [100,500], :width => 300, :height => 300 do @pdf.bounds.absolute_top.should == 500 + @pdf.margin_box.absolute_bottom @pdf.bounds.absolute_left.should == 100 + @pdf.margin_box.absolute_left parent_box = @pdf.bounds @pdf.bounding_box [50,200], :width => 100, :height => 100 do @pdf.bounds.absolute_top.should == 200 + parent_box.absolute_bottom @pdf.bounds.absolute_left.should == 50 + parent_box.absolute_left end @pdf.bounds.absolute_top.should == 500 + @pdf.margin_box.absolute_bottom @pdf.bounds.absolute_left.should == 100 + @pdf.margin_box.absolute_left end end it "should calculate a height if none is specified" do @pdf.bounding_box([100, 500], :width => 100) do @pdf.text "The rain in Spain falls mainly on the plains." end @pdf.y.should be_within(0.001).of(458.384) end it "should keep track of the max height the box was stretched to" do box = @pdf.bounding_box(@pdf.bounds.top_left, :width => 100) do @pdf.move_down 100 @pdf.move_up 15 end box.height.should == 100 end it "should advance the y-position by bbox.height by default" do orig_y = @pdf.y @pdf.bounding_box [0, @pdf.cursor], :width => @pdf.bounds.width, :height => 30 do @pdf.text "hello" end @pdf.y.should be_within(0.001).of(orig_y - 30) end it "should not advance y-position if passed :hold_position => true" do orig_y = @pdf.y @pdf.bounding_box [0, @pdf.cursor], :width => @pdf.bounds.width, :hold_position => true do @pdf.text "hello" end # y only advances by height of one line ("hello") @pdf.y.should be_within(0.001).of(orig_y - @pdf.height_of("hello")) end it "should not advance y-position of a stretchy bbox if it would stretch " + "the bbox further" do bottom = @pdf.y = @pdf.margin_box.absolute_bottom @pdf.bounding_box [0, @pdf.margin_box.top], :width => @pdf.bounds.width do @pdf.y = bottom @pdf.text "hello" # starts a new page end @pdf.page_count.should == 2 # Restoring the position (to the absolute bottom) would stretch the bbox to # the bottom of the page, which we don't want. This should be equivalent to # a bbox with :hold_position => true, where we only advance by the amount # that was actually drawn. @pdf.y.should be_within(0.001).of( @pdf.margin_box.absolute_top - @pdf.height_of("hello") ) end end describe "Indentation" do before(:each) { create_pdf } it "should temporarily shift the x coordinate and width" do @pdf.bounding_box([100,100], :width => 200) do @pdf.indent(20) do @pdf.bounds.absolute_left.should == 120 @pdf.bounds.width.should == 180 end end end it "should restore the x coordinate and width after block exits" do @pdf.bounding_box([100,100], :width => 200) do @pdf.indent(20) do # no-op end @pdf.bounds.absolute_left.should == 100 @pdf.bounds.width.should == 200 end end it "should restore the x coordinate and width on error" do @pdf.bounding_box([100,100], :width => 200) do begin @pdf.indent(20) { raise } rescue @pdf.bounds.absolute_left.should == 100 @pdf.bounds.width.should == 200 end end end it "should maintain left indentation across a page break" do original_left = @pdf.bounds.absolute_left @pdf.indent(20) do @pdf.bounds.absolute_left.should == original_left + 20 @pdf.start_new_page @pdf.bounds.absolute_left.should == original_left + 20 end @pdf.bounds.absolute_left.should == original_left end it "should maintain right indentation across a page break" do original_width = @pdf.bounds.width @pdf.indent(0, 20) do @pdf.bounds.width.should == original_width - 20 @pdf.start_new_page @pdf.bounds.width.should == original_width - 20 end @pdf.bounds.width.should == original_width end it "optionally allows adjustment of the right bound as well" do @pdf.bounding_box([100,100], :width => 200) do @pdf.indent(20, 30) do @pdf.bounds.absolute_left.should == 120 @pdf.bounds.width.should == 150 end @pdf.bounds.absolute_left.should == 100 @pdf.bounds.width.should == 200 end end describe "in a ColumnBox" do it "should subtract the given indentation from the available width" do @pdf.column_box([0, @pdf.cursor], :width => @pdf.bounds.width, :height => 200, :columns => 2, :spacer => 20) do width = @pdf.bounds.width @pdf.indent(20) do @pdf.bounds.width.should be_within(0.01).of(width - 20) end end end it "should subtract right padding from the available width" do @pdf.column_box([0, @pdf.cursor], :width => @pdf.bounds.width, :height => 200, :columns => 2, :spacer => 20) do width = @pdf.bounds.width @pdf.indent(20, 30) do @pdf.bounds.width.should be_within(0.01).of(width - 50) end end end it "should maintain the same left indentation across column breaks" do @pdf.column_box([0, @pdf.cursor], :width => @pdf.bounds.width, :columns => 3, :spacer => 15) do 3.times do |column| x = @pdf.bounds.left_side @pdf.indent(20) do @pdf.bounds.left_side.should == x+20 end @pdf.bounds.move_past_bottom end end end it "should not change the right margin if only left indentation is requested" do @pdf.column_box([0, @pdf.cursor], :width => @pdf.bounds.width, :columns => 3, :spacer => 15) do 3.times do |column| x = @pdf.bounds.right_side @pdf.indent(20) do @pdf.bounds.right_side.should == x end @pdf.bounds.move_past_bottom end end end it "should maintain the same right indentation across columns" do @pdf.column_box([0, @pdf.cursor], :width => @pdf.bounds.width, :columns => 3, :spacer => 15) do 3.times do |column| x = @pdf.bounds.right_side @pdf.indent(20, 10) do @pdf.bounds.right_side.should == x-10 end @pdf.bounds.move_past_bottom end end end it "should keep the right indentation after nesting indents" do @pdf.column_box([0, @pdf.cursor], :width => @pdf.bounds.width, :columns => 3, :spacer => 15) do 3.times do |column| # I am giving a right indent of 10... @pdf.indent(20, 10) do x = @pdf.bounds.right_side # ...and no right indent here... @pdf.indent(20) do # right indent is inherited from the parent! @pdf.bounds.right_side.should == x end end @pdf.bounds.move_past_bottom end end end it "should revert the right indentation if negative indent is given in nested indent" do @pdf.column_box([0, @pdf.cursor], :width => @pdf.bounds.width, :columns => 3, :spacer => 15) do 3.times do |column| x = @pdf.bounds.right_side @pdf.indent(20, 10) do # requesting a negative right-indent of equivalent size... @pdf.indent(20, -10) do # ...resets the right margin to that of the column! @pdf.bounds.right_side.should == x end end @pdf.bounds.move_past_bottom end end end it "should reduce the available column width by the sum of all nested indents" do @pdf.column_box([0, @pdf.cursor], :width => @pdf.bounds.width, :columns => 3, :spacer => 15) do 3.times do |column| w = @pdf.bounds.width @pdf.indent(20, 10) do @pdf.indent(20, 10) do @pdf.bounds.width.should == w - 60 end end @pdf.bounds.move_past_bottom end end end end end describe "A canvas" do before(:each) { create_pdf } it "should use whatever the last set y position is" do @pdf.canvas do @pdf.bounding_box([100,500],:width => 200) { @pdf.move_down 50 } end @pdf.y.should == 450 end end describe "Deep-copying" do it "should create a new object that does not copy @document" do Prawn::Document.new do |pdf| orig = pdf.bounds copy = orig.deep_copy copy.should_not == pdf.bounds copy.document.should be_nil end end it "should deep-copy parent bounds" do Prawn::Document.new do |pdf| outside = pdf.bounds pdf.bounding_box [100, 100], :width => 100 do copy = pdf.bounds.deep_copy # the parent bounds should have the same parameters copy.parent.width.should == outside.width copy.parent.height.should == outside.height # but should not be the same object copy.parent.should_not == outside end end end end describe "Prawn::Document#reference_bounds" do before(:each) { create_pdf } it "should return self for non-stretchy bounds" do @pdf.bounding_box([0, @pdf.cursor], :width => 100, :height => 100) do @pdf.reference_bounds.should == @pdf.bounds end end it "should return the parent bounds if in a stretchy box" do @pdf.bounding_box([0, @pdf.cursor], :width => 100, :height => 100) do correct_bounds = @pdf.bounds @pdf.bounding_box([0, @pdf.cursor], :width => 100) do @pdf.reference_bounds.should == correct_bounds end end end it "should find the non-stretchy box through 2 levels" do @pdf.bounding_box([0, @pdf.cursor], :width => 100, :height => 100) do correct_bounds = @pdf.bounds @pdf.bounding_box([0, @pdf.cursor], :width => 100) do @pdf.bounding_box([0, @pdf.cursor], :width => 100) do @pdf.reference_bounds.should == correct_bounds end end end end it "should return the margin box if there's no explicit bbox" do @pdf.reference_bounds.should == @pdf.margin_box @pdf.bounding_box([0, @pdf.cursor], :width => 100) do @pdf.reference_bounds.should == @pdf.margin_box end end it "should return the canvas box if we're in a canvas" do @pdf.canvas do canvas_box = @pdf.bounds @pdf.reference_bounds.should == canvas_box @pdf.bounding_box([0, @pdf.cursor], :width => 100) do @pdf.reference_bounds.should == canvas_box end end end end describe "BoundingBox#move_past_bottom" do before(:each) { create_pdf } it "should ordinarily start a new page" do @pdf.bounds.move_past_bottom @pdf.text "Foo" pages = PDF::Inspector::Page.analyze(@pdf.render).pages pages.size.should == 2 pages[0][:strings].should == [] pages[1][:strings].should == ["Foo"] end it "should move to the top of the next page if it exists already" do # save away the y-position at the top of a page top_y = @pdf.y # create a blank page but go to the page before it @pdf.start_new_page @pdf.go_to_page 1 @pdf.text "Foo" @pdf.bounds.move_past_bottom @pdf.y.should be_within(0.001).of(top_y) @pdf.text "Bar" pages = PDF::Inspector::Page.analyze(@pdf.render).pages pages.size.should == 2 pages[0][:strings].should == ["Foo"] pages[1][:strings].should == ["Bar"] end end ruby-prawn-1.0.0~rc2.orig/spec/security_spec.rb0000644000000000000000000000763312114176157020236 0ustar rootroot# encoding: utf-8 require "tempfile" require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "Document encryption" do describe "Password padding" do include Prawn::Document::Security it "should truncate long passwords" do pw = "Long long string" * 30 padded = pad_password(pw) padded.length.should == 32 padded.should == pw[0, 32] end it "should pad short passwords" do pw = "abcd" padded = pad_password(pw) padded.length.should == 32 padded.should == pw + Prawn::Document::Security::PasswordPadding[0, 28] end it "should fully pad null passwords" do pw = "" padded = pad_password(pw) padded.length.should == 32 padded.should == Prawn::Document::Security::PasswordPadding end end describe "Setting permissions" do def doc_with_permissions(permissions) pdf = Prawn::Document.new class << pdf # Make things easier to test public :permissions_value end pdf.encrypt_document(:permissions => permissions) pdf end it "should default to full permissions" do doc_with_permissions({}).permissions_value.should == 0xFFFFFFFF doc_with_permissions(:print_document => true, :modify_contents => true, :copy_contents => true, :modify_annotations => true).permissions_value. should == 0xFFFFFFFF end it "should clear the appropriate bits for each permission flag" do doc_with_permissions(:print_document => false).permissions_value. should == 0b1111_1111_1111_1111_1111_1111_1111_1011 doc_with_permissions(:modify_contents => false).permissions_value. should == 0b1111_1111_1111_1111_1111_1111_1111_0111 doc_with_permissions(:copy_contents => false).permissions_value. should == 0b1111_1111_1111_1111_1111_1111_1110_1111 doc_with_permissions(:modify_annotations => false).permissions_value. should == 0b1111_1111_1111_1111_1111_1111_1101_1111 end it "should raise_error ArgumentError if invalid option is provided" do lambda { doc_with_permissions(:modify_document => false) }.should raise_error(ArgumentError) end end describe "Encryption keys" do # Since PDF::Reader doesn't read encrypted PDF files, we just take the # roundabout method of verifying each step of the encryption. This works # fine because the encryption method is deterministic. before(:each) do @pdf = Prawn::Document.new class << @pdf public :owner_password_hash, :user_password_hash, :user_encryption_key end @pdf.encrypt_document :user_password => 'foo', :owner_password => 'bar', :permissions => { :print_document => false } end it "should calculate the correct owner hash" do @pdf.owner_password_hash.unpack("H*").first.should match(/^61CA855012/i) end it "should calculate the correct user hash" do @pdf.user_password_hash.unpack("H*").first.should =~ /^6BC8C51031/i end it "should calculate the correct user_encryption_key" do @pdf.user_encryption_key.unpack("H*").first.upcase.should == "B100AB6429" end end describe "EncryptedPdfObject" do it "should delegate to PdfObject for simple types" do Prawn::Core::EncryptedPdfObject(true, nil, nil, nil).should == "true" Prawn::Core::EncryptedPdfObject(42, nil, nil, nil).should == "42" end it "should encrypt strings properly" do Prawn::Core::EncryptedPdfObject("foo", "12345", 123, 0).should == "<4ad6e3>" end it "should properly handle compound types" do Prawn::Core::EncryptedPdfObject({:Bar => "foo"}, "12345", 123, 0).should == "<< /Bar <4ad6e3>\n>>" Prawn::Core::EncryptedPdfObject(["foo", "bar"], "12345", 123, 0).should == "[<4ad6e3> <4ed8fe>]" end end end ruby-prawn-1.0.0~rc2.orig/spec/snapshot_spec.rb0000644000000000000000000001141212114176157020214 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "Prawn::Document#transaction" do it "should properly commit if no error is raised" do pdf = Prawn::Document.new do transaction do text "This is shown" end end text = PDF::Inspector::Text.analyze(pdf.render) text.strings.should == ["This is shown"] end it "should not display text if transaction is rolled back" do pdf = Prawn::Document.new do transaction do text "This is not shown" rollback end end text = PDF::Inspector::Text.analyze(pdf.render) text.strings.should == [] end it "should return true/false value indicating success of the transaction" do Prawn::Document.new do success = transaction { } success.should == true success = transaction { rollback } success.should == false end end it "should support nested transactions" do pdf = Prawn::Document.new do transaction do text "This is shown" transaction do text "and this is not" rollback end text "and this is" end end text = PDF::Inspector::Text.analyze(pdf.render) text.strings.should == ["This is shown", "and this is"] end it "should allow rollback of multiple pages" do pdf = Prawn::Document.new do transaction do 5.times { start_new_page } text "way out there and will never be shown" rollback end text "This is the real text, only one page" end pages = PDF::Inspector::Page.analyze(pdf.render).pages pages.size.should == 1 end it "should not propagate a RollbackTransaction outside its bounds" do def add_lines(pdf) 100.times { |i| pdf.text "Line #{i}" } end Prawn::Document.new do |pdf| lambda do begin pdf.group { add_lines(pdf) } rescue Prawn::Errors::CannotGroup add_lines(pdf) end end.should_not raise_error#(Prawn::Document::Snapshot::RollbackTransaction) end end # Because the Pages object, when restored, points to the snapshotted pages # by identifier, we have to restore the snapshot into the same page objects, # or else old pages will appear in the post-rollback document. it "should restore the pages into the same objects" do Prawn::Document.new do old_page_object_id = state.page.dictionary.identifier old_page_content_id = state.page.content.identifier transaction do start_new_page rollback end state.page.dictionary.identifier.should == old_page_object_id state.page.content.identifier.should == old_page_content_id end end it "page object should refer to the page_content object after restore" do Prawn::Document.new do transaction do start_new_page rollback end # should be the exact same object, not a clone state.page.dictionary.data[:Contents].should == state.page.content end end it "should restore bounds on rollback" do Prawn::Document.new(:page_layout => :landscape) do size = [bounds.width, bounds.height] transaction do start_new_page :layout => :portrait rollback end [bounds.width, bounds.height].should == size end end it "should set new bounding box on start_new_page with different layout" do Prawn::Document.new(:page_layout => :landscape) do size = [bounds.width, bounds.height] transaction do start_new_page rollback end start_new_page :layout => :portrait [bounds.width, bounds.height].should == size.reverse end end it "should work with dests" do Prawn::Document.new do |pdf| pdf.add_dest("dest", pdf.dest_fit_horizontally(pdf.cursor, pdf.page)) pdf.text("Hello world") lambda { pdf.transaction{} }.should_not raise_error end end describe "with a stamp dictionary present" do it "should properly commit if no error is raised" do pdf = Prawn::Document.new do create_stamp("test_stamp") { draw_text "This is shown", :at => [0,0] } transaction do stamp("test_stamp") end end pdf.render.should =~ /\/Stamp1 Do/ end it "should properly rollback when #rollback is called" do pdf = Prawn::Document.new do create_stamp("test_stamp") { draw_text "This is not shown", :at => [0,0] } transaction do stamp("test_stamp") rollback end end pdf.render.should_not =~ /\/Stamp1 Do/ end end it "should restore page_number on rollback" do Prawn::Document.new do transaction do 5.times { start_new_page } rollback end page_number.should == 1 end end end ruby-prawn-1.0.0~rc2.orig/bugs/0000755000000000000000000000000012114176157015025 5ustar rootrootruby-prawn-1.0.0~rc2.orig/bugs/resolved/0000755000000000000000000000000012114176157016650 5ustar rootrootruby-prawn-1.0.0~rc2.orig/bugs/resolved/stamp_color_issues.rb0000644000000000000000000000134312114176157023113 0ustar rootroot# encoding: utf-8 # # $LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib') require 'rubygems' require 'prawn' ## # This bug was reported in comments in issue #200 # When the bug is fixed the stamp text and shape color should be set to a blue CMYK color pdf = Prawn::Document.generate("stamp_color_issues.pdf", :margin => [40, 45, 50, 45]) do text "Page text starts out with RGB black color" create_stamp("logo") do fill_color(100, 100, 20, 0) stroke_color(100, 100, 20, 0) move_down 50 text "But in a stamp I can create CMYK colored text and shapes" fill_and_stroke_rounded_rectangle([200, 550], 50, 100, 10) end stamp('logo') draw_text "And non stamped text is not affected", :at => [10, 400] end ruby-prawn-1.0.0~rc2.orig/bugs/resolved/transaction_page_number_issue_79.rb0000644000000000000000000000070512114176157025617 0ustar rootroot# As of 2010.01.12, we have confirmed that page_number is not properly set on # transaction rollback, resulting in an error from the code sample below. # # Resolved in 7c62bbf. # $LOAD_PATH << File.join(File.dirname(__FILE__), '..','lib') require "prawn/core" Prawn::Document.generate("transaction_rollback_pagenumber.pdf") do text "Hello world" transaction do text "hello " * 1000 rollback end start_new_page text "hi there" end ruby-prawn-1.0.0~rc2.orig/bugs/resolved/ttf_fails_in_transactions.rb0000644000000000000000000000155512114176157024434 0ustar rootroot# http://github.com/sandal/prawn/issues#issue/56 # # As of f952055d03f9b21b78ec2844bd873cf62005d00a # Transactions fail when using TTF fonts. # # This is because we use an on_encode Proc that gets included in the # @current_page object, which breaks snapshots. We can surely write # around this to either split out the Proc into non-marshalled data # or set up some sort of callback that is indicated by something that # can be safely marshalled. # # But whoever tackles this patch should take care to ensure we # don't break TTF subsetting support, adding specs if necessary. # # Resolved in 36ef89c2bc21e504df623f61d918c5bfdc1fdab1. $LOAD_PATH << File.join(File.dirname(__FILE__), '..', '..','lib') require 'prawn/core' Prawn::Document.generate("err.pdf") do font "#{Prawn::DATADIR}/fonts/DejaVuSans.ttf" text "Hi there" transaction { text "Nice, thank you" } end ruby-prawn-1.0.0~rc2.orig/bugs/resolved/multiple_rendering.rb0000644000000000000000000000055312114176157023070 0ustar rootroot# encoding: utf-8 # # $LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib') require 'rubygems' require 'prawn' pdf = Prawn::Document.new(:page_layout => :landscape) do text "here is the first rendering" end pdf.render_file("multiple_rendering.pdf") pdf.move_down 10 pdf.text "here is another rendering" pdf.render_file("multiple_rendering_2.pdf") ruby-prawn-1.0.0~rc2.orig/bugs/resolved/looks_blank.rb0000644000000000000000000000057512114176157021502 0ustar rootroot$LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib') require 'rubygems' require 'bundler' require 'prawn' Bundler.require ## # When this is fixed then Testing should appear with normal default black color in Acrobat reader Prawn::Document.generate("looks_blank.pdf") do repeat :all do text "Testing", :size => 24, :style => :bold end fill_color '662255' end ruby-prawn-1.0.0~rc2.orig/bugs/resolved/save_graphics_state.rb0000644000000000000000000000136412114176157023217 0ustar rootroot# encoding: utf-8 # # $LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib') require 'rubygems' require 'prawn' ## # This bug is taken from issue #102 including the comments. # When the bug is fixed then the third rectangle should be yellow and not green. pdf = Prawn::Document.generate("graphics_state.pdf", :page_layout => :landscape) do fill_color '000000' # Prawn thinks color space is RGB fill { rectangle([10, bounds.top], 10, 10) } save_graphics_state fill_color 0, 0, 0, 0 # Prawn thinks color space is CMYK fill { rectangle([20, bounds.top], 10, 10) } restore_graphics_state # Oops, now PDF thinks color space is RGB again fill_color 0, 0, 100, 0 # This won't work! fill { rectangle([ 30, bounds.top ], 10, 10) } endruby-prawn-1.0.0~rc2.orig/bugs/resolved/dash_stamp_issue.rb0000644000000000000000000000076212114176157022535 0ustar rootroot# encoding: utf-8 # # $LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib') require 'rubygems' require 'prawn' ## # When resolved the second page circle should not be dashed pdf = Prawn::Document.generate("stamp_dash_issues.pdf", :margin => [40, 45, 50, 45]) do text "The stamped circle might be dashed" create_stamp("stamp_circle") do dash(5) stroke_circle [0, 0], 10 end stamp("stamp_circle") text "but the nonstamped circle should not" stroke_circle [10, 10], 10 endruby-prawn-1.0.0~rc2.orig/bugs/resolved/color_space_issues.rb0000644000000000000000000000077712114176157023074 0ustar rootroot# encoding: utf-8 # # $LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib') require 'rubygems' require 'prawn' ## # This bug is simplification of issue #183. # When the bug is fixed then a rectangle should show on both pages in Acrobat Reader. pdf = Prawn::Document.generate("color_space_issues.pdf", :page_layout => :landscape) do stroke_color "000000" stroke { rectangle([10, bounds.top], 10, 10) } start_new_page stroke_color "000000" stroke { rectangle([10, bounds.top], 10, 10) } end ruby-prawn-1.0.0~rc2.orig/bugs/resolved/png_barcode_issue.rb0000644000000000000000000000051112114176157022645 0ustar rootroot# encoding: utf-8 # # As of 200fc36455fa3bee0e1e3bb25d1b5bf73dbf3b52, # the following code does not correctly render a PNG image # $LOAD_PATH << File.join(File.dirname(__FILE__), '..', '..','lib') require "prawn/core" Prawn::Document.generate('png_barcode_issue.pdf') do image "#{Prawn::DATADIR}/images/barcode_issue.png" end ruby-prawn-1.0.0~rc2.orig/bugs/resolved/layout/0000755000000000000000000000000012114176157020165 5ustar rootrootruby-prawn-1.0.0~rc2.orig/bugs/resolved/layout/table_header_overrun.rb0000644000000000000000000000175212114176157024676 0ustar rootroot# Text was overflowing into following cells because of some issues with # floating point numbers in naive wrap. # # Resolved in: 9c357bc488d26e7bbc2e442606106106d349e232 # $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib') require "rubygems" require "prawn" require "prawn/layout" @prawn_document_options = { :page_layout => :landscape, :left_margin => 36, :right_margin => 36, :top_margin => 36, :bottom_margin => 36} Prawn::Document.generate("table_header_overrun.pdf", @prawn_document_options) do headers = [ "Customer", "Grand\nHijynx", "Kh", "Red\nCorvette", "Rushmore", "bPnr", "lGh", "retail\nPantaloons", "sRsm", "Total\nBoxes"] data = [[1,0,1,0,1,0,1,0,1,0], [0,1,0,1,0,1,0,1,0,1]] table(data, :headers => headers, :font_size => 16, :horizontal_padding => 5, :vertical_padding => 3, :border => 2, :position => :center) start_new_page table [['MyString']], :headers=>['Field1'] end ruby-prawn-1.0.0~rc2.orig/bugs/resolved/layout/cell_width_miscalculation.rb0000644000000000000000000000133312114176157025717 0ustar rootroot# encoding: utf-8 # # As of 40c7bde9690e5174b6a958a5df6b2aabc6b8b041 this code produces an extra # empty line of text in row 2. # # Simple rounding of string_width floats seems to fix this issue, see the patch # in 09c837466c31bb715f1276118c606e20477577df. # $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib') require "rubygems" require "prawn" require "prawn/layout" Prawn::Document.generate("broken_table.pdf") do font "#{Prawn::DATADIR}/fonts/comicsans.ttf" table [["foo", "baaar", "1" ], ["This is","a sample", "2" ], ["Table", "dont\ncha\nknow?", "3" ]], :font_size => 30, :padding => 10, :border => 2, :position => :center end ruby-prawn-1.0.0~rc2.orig/bugs/resolved/layout/table_ignores_align_headers.rb0000644000000000000000000000172312114176157026177 0ustar rootroot# As of fadb65c303ff129d0b25a929d3b9d1f915b2f98d, # Prawn ignores :align_headers property in tables # when :border_style => :grid is present (Lighthouse issue #119). # # NOTES: # # * This issue can only be reproduced when :border_style => :grid is used # # Resolved as of 47297900dcf3f16c4765ca817f17c53fb0a5a079 # I think a bad merge created issues in edge, and this code fixes previous # problems that are present in stable. # $DEBUG = true $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib') require "rubygems" require "prawn" require "prawn/layout" Prawn::Document.generate("table_ignores_align_headers.pdf") do left = "Left justified" left2 = "left" center = "centered" table [[left, left], [left2, left2]], :headers => [center, center], :align => :left, :align_headers => :center, :border_style => :grid end ruby-prawn-1.0.0~rc2.orig/bugs/resolved/layout/table_suppress_newline.rb0000644000000000000000000000103612114176157025266 0ustar rootroot# As of bbe1df6530455dff41768bcc329bdc7cfdfaded1 (and earlier), # Prawn does not properly display cells with newlines in tables. # # Fixed in e28cf53b5d05e6cb343e8dd5265c57d5f24ef4da [#76] # $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib') require "rubygems" require "prawn" require "prawn/layout" Prawn::Document.generate("table_supresses_newlines.pdf") do table [["test\n\naaaa","test\n\nbbbb"], ["test\n\ncccc", "test\n\ndddd"]], :border_style => :grid cell [100,100], :text => "test\n\naaaa" end ruby-prawn-1.0.0~rc2.orig/bugs/resolved/layout/table_in_bounding_box_without_height.rb0000644000000000000000000000141012114176157030133 0ustar rootroot# encoding: utf-8 # # Issue with tables within stretchy bounding boxes. Changes to the way # bounding boxes work caused tables to not properly render within stretchy # bounding boxes. # # A fix in 200fc36455fa3bee0e1e3bb25d1b5bf73dbf3b52 makes it so the bottom # of the margin_box will be used as the page boundary in stretchy bounding # boxes. Ideally, this would instead use the nesting bounding box dimensions # [#80] , but this works for now. # $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib') require "rubygems" require "prawn" require "prawn/layout" Prawn::Document.generate("table_in_bounding_box_without_height.pdf") do bounding_box bounds.top_left, :width => 200 do table [%w(These should all be), %w(on the same page)] end end ruby-prawn-1.0.0~rc2.orig/bugs/resolved/layout/table_row_background_color_issue.rb0000644000000000000000000000450212114176157027276 0ustar rootroot# As of 96f660660345c7c22923ba51d0124022a3a189ab, table is currently not taking # in account border widths when filling in rows with background coloring. This # means the larger the border, the larger the visible gap between rows. # # This problem was fixed in 97d9bf083fd9423d17fd1efca36ea675ff34a6d7, but # there remains a very minor issue when the border size is 1 for the headers. # Because this almost appears to be a feature display-wise, we will leave it # alone for now. # $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib') require "rubygems" require "prawn" require "prawn/layout" Prawn::Document.generate("table_with_background_color_problems.pdf") do font "#{Prawn::DATADIR}/fonts/DejaVuSans.ttf" table [["ὕαλον ϕαγεῖν", "baaar", "1" ], ["This is","a sample", "2" ], ["Table", "dont\ncha\nknow?", "3" ], [ "It", "Rules", "4" ], [ "It", "Rules", "4" ], [ "It", "Rules", "4" ], [ "It", "Rules", "4" ], [ "It", "Rules", "4" ], [ "It", "Rules", "4" ], [ "It", "Rules", "4" ], [ "It", "Rules", "4" ], [ "It", "Rules", "4" ], [ "It", "Rules\nwith an iron fist", "x" ], [ "It", "Rules", "4" ], [ "It", "Rules", "4" ], [ "It", "Rules", "4" ], [ "It", "Rules", "4" ], [ "It", "Rules", "4" ], [ "It", "Rules", "4" ], [ "It", "Rules", "4" ], [ "It", "Rules", "4" ], [ "It", "Rules", "4" ]], :font_size => 10, :horizontal_padding => 10, :vertical_padding => 3, :border => 1, :position => :center, :headers => ["Column A","Column B","#"], :row_colors => ["cccccc"] pad(20) do text "This should appear in the original font size" end table [[ "Wide", "columns", "streeetch"], ["are","mighty fine", "streeeeeeeech"]], :column_widths => { 0 => 200, 1 => 250 }, :position => 5 end ruby-prawn-1.0.0~rc2.orig/bugs/resolved/layout/fill_color.rb0000644000000000000000000000055712114176157022645 0ustar rootroot# encoding: utf-8 # # As of 9e48a6 (2009.01.03), this code fails to recognize fill_color in tables. # Resolved in 664760 (2009.01.05) # $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', '..','lib') require "prawn/core" require "prawn/layout" Prawn::Document.generate("fill_color.pdf") do fill_color "ff0000" table [%w[1 2 3],%w[4 5 6],%w[7 8 9]], end ruby-prawn-1.0.0~rc2.orig/bugs/resolved/canvas_sets_y_to_0.rb0000644000000000000000000000077412114176157022767 0ustar rootroot# As of 7e94d25828021732f7872934cb91430ef798cd86, Document#canvas # sets pdf.y to 0 after executing a block, which is probably not useful for # anyone. It should retain the y position present at the end of the block. # # This was resolved in 998a5c3fad40c9e0a79e1468e3a83815ed948a74 [#88] # $LOAD_PATH << File.join(File.dirname(__FILE__), '..', '..','lib') require "prawn/core" Prawn::Document.generate("canvas_sets_y_to_0.pdf") do canvas { text "blah" } text "Here's my sentence. by satoko" end ruby-prawn-1.0.0~rc2.orig/bugs/indentation_across_pagebreaks.rb0000644000000000000000000000051312114176157023423 0ustar rootroot# As of 2009.02.13, indentation does not work across page breaks. [#86] $LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib') require "prawn/core" Prawn::Document.generate("indent_page_breaks.pdf") do text "heading", :size => 14, :style => :bold indent(20) do 100.times do text "test" end end end ruby-prawn-1.0.0~rc2.orig/bugs/png_alpha_channel_filter.rb0000644000000000000000000000053612114176157022344 0ustar rootroot$LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib') require 'prawn' image_file = File.expand_path('../../data/images/prawn.png', __FILE__) pdf = Prawn::Document.new pdf.image image_file pdf.render_file("works.pdf") require 'mathn' # Re-defines '/' operation ! pdf = Prawn::Document.new pdf.image image_file pdf.render_file("broken.pdf") ruby-prawn-1.0.0~rc2.orig/.gitignore0000644000000000000000000000013212114176157016051 0ustar rootroot.*.sw? nbproject pkg .rvmrc .bundle Gemfile.lock drop_to_console.rb manual.pdf /doc /bin ruby-prawn-1.0.0~rc2.orig/Rakefile0000644000000000000000000000217012114176157015532 0ustar rootrootrequire "bundler" Bundler.setup require 'rake' require 'rspec/core/rake_task' require 'rdoc/task' require 'rubygems/package_task' task :default => [:spec] desc "Run all rspec files" RSpec::Core::RakeTask.new("spec") desc "Show library's code statistics" task :stats do require 'code_statistics' CodeStatistics::TEST_TYPES << "Specs" CodeStatistics.new( ["Prawn", "lib"], ["Specs", "spec"] ).to_s end desc "genrates documentation" RDoc::Task.new do |rdoc| rdoc.rdoc_files.include( "README", "COPYING", "LICENSE", "HACKING", "lib/" ) rdoc.main = "README" rdoc.rdoc_dir = "doc/html" rdoc.title = "Prawn Documentation" end desc "Generate the 'Prawn by Example' manual" task :manual do puts "Building manual..." require File.expand_path(File.join(File.dirname(__FILE__), %w[manual manual manual])) puts "The Prawn manual is available at manual.pdf. Happy Prawning!" end spec = Gem::Specification.load "prawn.gemspec" Gem::PackageTask.new(spec) do |pkg| pkg.need_zip = true pkg.need_tar = true end ruby-prawn-1.0.0~rc2.orig/prawn.gemspec0000644000000000000000000000336412114176157016567 0ustar rootrootGem::Specification.new do |spec| spec.name = "prawn" spec.version = File.read(File.expand_path('VERSION', File.dirname(__FILE__))).strip spec.platform = Gem::Platform::RUBY spec.summary = "A fast and nimble PDF generator for Ruby" spec.files = Dir.glob("{examples,lib,spec,data,manual}/**/**/*") + ["Rakefile", "prawn.gemspec", "COPYING", "LICENSE", "GPLv2", "GPLv3", "Gemfile"] spec.require_path = "lib" spec.required_ruby_version = '>= 1.8.7' spec.required_rubygems_version = ">= 1.3.6" spec.test_files = Dir[ "spec/*_spec.rb" ] spec.extra_rdoc_files = %w{README.md LICENSE COPYING GPLv2 GPLv3} spec.rdoc_options << '--title' << 'Prawn Documentation' << '--main' << 'README.md' << '-q' spec.authors = ["Gregory Brown","Brad Ediger","Daniel Nelson","Jonathan Greenberg","James Healy"] spec.email = ["gregory.t.brown@gmail.com","brad@bradediger.com","dnelson@bluejade.com","greenberg@entryway.net","jimmy@deefa.com"] spec.rubyforge_project = "prawn" spec.add_dependency('pdf-reader', '>=0.9.0', '<2.0') spec.add_dependency('ttfunk', '~>1.0.3') spec.add_dependency('ruby-rc4') spec.add_dependency('afm') spec.add_development_dependency('pdf-inspector', '~> 1.0.1') spec.add_development_dependency('coderay', '~> 1.0.7') spec.add_development_dependency('rdoc') spec.homepage = "http://prawn.majesticseacreature.com" spec.description = < Feel free to post any Prawn related question there, our community is very responsive and will be happy to help you figure out how to use Prawn, or help you determine whether it's the right tool for the task you are working on. Please make your posts to the list as specific as possible, including code samples and output where relevant. Do not post any information that should not be shared publicly, and be sure to reduce your example code as much as possible so that those who are responding to your question can more easily see what the issue might be. ## Contributing If you've found a bug, want to submit a patch, or have a feature request, please enter a ticket into our github tracker: We strongly encourage bug reports to come with failing tests or at least a reduced example that demonstrates the problem. Similarly, patches should include tests, API documentation, and an update to the manual where relevant. Feel free to send a pull request early though, if you just want some feedback or a code review before preparing your code to be merged. If you are unsure about whether or not you've found a bug, or want to check to see whether we'd be interested in the feature you want to add before you start working on it, feel free to post to our mailing list. ## Authorship Prawn was originally developed by Gregory Brown, under the auspices of the Ruby Mendicant Project, a grassroots initiative in which the Ruby community collectively provided funding so that Gregory could take several months off of work to focus on this project. Over the last several years, we've received code contributions from over 50 people, which is amazing considering the low-level nature of this project. In 2010, Gregory officially handed the project off to the Prawn core team. Currently active maintainers include Brad Ediger, Daniel Nelson, James Healy, and Jonathan Greenberg. While he was only with us for a short time before moving on to other things, we'd also like to thank Prawn core team emeritus Jamis Buck for his contributions. He was responsible for introducing font subsetting as well as the first implementation of our inline formatting support. You can find the full list of folks who have at least one patch accepted to Prawn on github at https://github.com/prawnpdf/prawn/contributors ## License Prawn is released under a slightly modified form of the License of Ruby, allowing you to choose between Matz's terms, the GPLv2, or GPLv3. For details, please see the LICENSE, GPLv2, and GPLv3 files. If you wish to contribute to Prawn, you will retain your own copyright but must agree to license your code under the same terms as the project itself. ruby-prawn-1.0.0~rc2.orig/COPYING0000644000000000000000000000017212114176157015120 0ustar rootrootPrawn may be used under Matz's terms for Ruby, or GPLv2 or GPLv3. See LICENSE for Matz's terms, or GPLv2 and GPLv3 files. ruby-prawn-1.0.0~rc2.orig/GPLv30000644000000000000000000010451312114176157014707 0ustar rootroot GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ruby-prawn-1.0.0~rc2.orig/VERSION0000644000000000000000000000001212114176157015126 0ustar rootroot1.0.0.rc2 ruby-prawn-1.0.0~rc2.orig/manual/0000755000000000000000000000000012114176157015342 5ustar rootrootruby-prawn-1.0.0~rc2.orig/manual/security/0000755000000000000000000000000012114176157017211 5ustar rootrootruby-prawn-1.0.0~rc2.orig/manual/security/security.rb0000644000000000000000000000155512114176157021413 0ustar rootroot# encoding: utf-8 # # Examples for document encryption. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) Prawn::Example.generate("security.pdf", :page_size => "FOLIO") do package "security" do |p| p.example "encryption", :eval_source => false, :full_source => true p.example "permissions", :eval_source => false, :full_source => true p.intro do prose("Security lets you control who can read the document by defining a password. The examples include:") list( "How to encrypt the document without the need for a password", "How to configure the regular user permitions", "How to require a password for the regular user", "How to set a owner password that bypass the document permissions" ) end end end ruby-prawn-1.0.0~rc2.orig/manual/security/encryption.rb0000644000000000000000000000222712114176157021733 0ustar rootroot# encoding: utf-8 # # The encrypt_document method, as you might have already guessed, # is used to encrypt the PDF document. # # Once encrypted whoever is using the document will need the user password to # read the document. This password can be set with the # :user_password option. If this is not set the document will be # encrypted but a password will not be needed to read the document. # # There are some caveats when encrypting your PDFs. Be sure to read the source # documentation (you can find it here: # https://github.com/prawnpdf/prawn/blob/master/lib/prawn/security.rb ) before # using this for anything super serious. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) # Bare encryption. No password needed. Prawn::Example.generate("bare_encryption.pdf") do text "See, no password was asked but the document is still encrypted." encrypt_document end # Simple password. All permissions granted. Prawn::Example.generate("simple_password.pdf") do text "You was asked for a password." encrypt_document(:user_password => 'foo', :owner_password => 'bar') end ruby-prawn-1.0.0~rc2.orig/manual/security/permissions.rb0000644000000000000000000000332412114176157022113 0ustar rootroot# encoding: utf-8 # # Some permissions may be set for the regular user with the following options: # :print_document, :modify_contents, # :copy_contents, :modify_annotations. All this # options default to true, so if you'd like to revoke just set them to false. # # A user may bypass all permissions if he provides the owner password which # may be set with the :owner_password option. This option may be # set to :random so that users will never be able to bypass # permissions. # # There are some caveats when encrypting your PDFs. Be sure to read the source # documentation (you can find it here: # https://github.com/prawnpdf/prawn/blob/master/lib/prawn/security.rb ) before # using this for anything super serious. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) # User cannot print the document. Prawn::Example.generate("cannot_print.pdf") do text "If you used the user password you won't be able to print the doc." encrypt_document(:user_password => 'foo', :owner_password => 'bar', :permissions => { :print_document => false }) end # All permissions revoked and owner password set to random Prawn::Example.generate("no_permissions.pdf") do text "You may only view this and won't be able to use the owner password." encrypt_document(:user_password => 'foo', :owner_password => :random, :permissions => { :print_document => false, :modify_contents => false, :copy_contents => false, :modify_annotations => false }) end ruby-prawn-1.0.0~rc2.orig/manual/syntax_highlight.rb0000644000000000000000000000242612114176157021250 0ustar rootroot# encoding: utf-8 require "coderay" # Registers a to_prawn method on CodeRay. It returns an array of hashes to be # used with formatted_text. # # Usage: # # CodeRay.scan(string, :ruby).to_prawn # class PrawnEncoder < CodeRay::Encoders::Encoder register_for :to_prawn COLORS = { :default => "FFFFFF", :comment => "AEAEAE", :constant => "88A5D2", :instance_variable => "E8ED97", :integer => "C8FF0E", :float => "C8FF0E", :inline_delimiter => "EF804F", # #{} within a string :keyword => "FEE100", # BUG: There appear to be some problem with this token. Method # definitions are considered as ident tokens # :method => "FF5C00", :string => "56D65E", :symbol => "C8FF0E" } def setup(options) super @out = [] @open = [] end def text_token(text, kind) color = COLORS[kind] || COLORS[@open.last] || COLORS[:default] @out << {:text => text, :color => color} end def begin_group(kind) @open << kind end def end_group(kind) @open.pop end end ruby-prawn-1.0.0~rc2.orig/manual/graphics/0000755000000000000000000000000012114176157017142 5ustar rootrootruby-prawn-1.0.0~rc2.orig/manual/graphics/color.rb0000644000000000000000000000126712114176157020613 0ustar rootroot# encoding: utf-8 # # We can change the stroke and fill colors providing an HTML rgb 6 digit color # code string ("AB1234") or 4 values for CMYK. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do stroke_axis # Fill with Yellow using RGB fill_color "FFFFCC" fill_polygon [50, 150], [150, 200], [250, 150], [250, 50], [150, 0], [50, 50] # Stroke with Purple using CMYK stroke_color 50, 100, 0, 0 stroke_rectangle [300, 300], 200, 100 # Both together fill_and_stroke_circle [400, 100], 50 end ruby-prawn-1.0.0~rc2.orig/manual/graphics/circle_and_ellipse.rb0000644000000000000000000000121412114176157023265 0ustar rootroot# encoding: utf-8 # # To define a circle all you need is the center point and the # radius. # # To define an ellipse you provide the center point and two radii # (or axes) values. If the second radius value is ommitted, both radii will be # equal and you will end up drawing a circle. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do stroke_axis stroke_circle [100, 300], 100 fill_ellipse [200, 100], 100, 50 fill_ellipse [400, 100], 50 end ruby-prawn-1.0.0~rc2.orig/manual/graphics/translate.rb0000644000000000000000000000143712114176157021471 0ustar rootroot# encoding: utf-8 # # This transformation is used to translate the user space. Just provide the # x and y coordinates for the new origin. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do stroke_axis 1.upto(3) do |i| x = i * 50 y = i * 100 translate(x, y) do # Draw a point on the new origin fill_circle [0, 0], 2 draw_text "New origin after translation to [#{x}, #{y}]", :at => [5, -2], :size => 8 stroke_rectangle [100, 75], 100, 50 text_box "Top left corner at [100,75]", :at => [110, 65], :width => 80, :size => 8 end end end ruby-prawn-1.0.0~rc2.orig/manual/graphics/fill_and_stroke.rb0000644000000000000000000000237312114176157022633 0ustar rootroot# encoding: utf-8 # # There are two drawing primitives in Prawn: fill and # stroke. # # These are the methods that actually draw stuff on the document. All the other # drawing shapes like rectangle, circle or # line_to define drawing paths. These paths need to be either # stroked or filled to gain form on the document. # # Calling these methods without a block will act on the drawing path that # has been defined prior to the call. # # Calling with a block will act on the drawing path set within the # block. # # Most of the methods which define drawing paths have methods of the same name # starting with stroke_ and fill_ which create the drawing path and then stroke # or fill it. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do stroke_axis # No block line [0, 200], [100, 150] stroke rectangle [0, 100], 100, 100 fill # With block stroke { line [200, 200], [300, 150] } fill { rectangle [200, 100], 100, 100 } # Method hook stroke_line [400, 200], [500, 150] fill_rectangle [400, 100], 100, 100 end ruby-prawn-1.0.0~rc2.orig/manual/graphics/graphics.rb0000644000000000000000000000344412114176157021274 0ustar rootroot# encoding: utf-8 # # Examples for the Graphics package. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) Prawn::Example.generate("graphics.pdf", :page_size => "FOLIO") do package "graphics" do |p| p.section "Basics" do |s| s.example "helper" s.example "fill_and_stroke" end p.section "Shapes" do |s| s.example "lines_and_curves" s.example "common_lines" s.example "rectangle" s.example "polygon" s.example "circle_and_ellipse" end p.section "Fill and Stroke settings" do |s| s.example "line_width" s.example "stroke_cap" s.example "stroke_join" s.example "stroke_dash" s.example "color" s.example "gradients" s.example "transparency" s.example "soft_masks" s.example "fill_rules" end p.section "Transformations" do |s| s.example "rotate" s.example "translate" s.example "scale" end p.intro do prose("Here we show all the drawing methods provided by Prawn. Use them to draw the most beautiful imaginable things. Most of the content that you'll add to your pdf document will use the graphics package. Even text is rendered on a page just like a rectangle so even if you never use any of the shapes described here you should at least read the basic examples. The examples show:") list( "All the possible ways that you can fill or stroke shapes on a page", "How to draw all the shapes that Prawn has to offer from a measly line to a mighty polygon or ellipse", "The configuration options for stroking lines and filling shapes", "How to apply transformations to your drawing space" ) end end end ruby-prawn-1.0.0~rc2.orig/manual/graphics/rectangle.rb0000644000000000000000000000111712114176157021433 0ustar rootroot# encoding: utf-8 # # To draw a rectangle, just provide the upper-left corner, width and height to # the rectangle method. # # There's also rounded_rectangle. Just provide an additional radius # value for the rounded corners. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do stroke_axis stroke do rectangle [100, 300], 100, 200 rounded_rectangle [300, 300], 100, 200, 20 end end ruby-prawn-1.0.0~rc2.orig/manual/graphics/common_lines.rb0000644000000000000000000000146112114176157022153 0ustar rootroot# encoding: utf-8 # # Prawn provides helpers for drawing some commonly used lines: # # vertical_line and horizontal_line do just what their # names imply. Specify the start and end point at a fixed coordinate to define # the line. # # horizontal_rule draws a horizontal line on the current bounding # box from border to border, using the current y position. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do stroke_axis stroke do # just lower the current y position move_down 50 horizontal_rule vertical_line 100, 300, :at => 50 horizontal_line 200, 500, :at => 150 end end ruby-prawn-1.0.0~rc2.orig/manual/graphics/stroke_cap.rb0000644000000000000000000000203012114176157021614 0ustar rootroot# encoding: utf-8 # # The cap style defines how the edge of a line or curve will be drawn. There are # three types: :butt (the default), :round and # :projecting_square # # The difference is better seen with thicker lines. With :butt # lines are drawn starting and ending at the exact points provided. With both # :round and :projecting_square the line is projected # beyond the start and end points. # # Just like line_width= the cap_style= method needs an # explicit receiver to work. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do stroke_axis self.line_width = 25 [:butt, :round, :projecting_square].each_with_index do |cap, i| self.cap_style = cap y = 250 - i*100 stroke_horizontal_line 100, 300, :at => y stroke_circle [400, y], 15 end end ruby-prawn-1.0.0~rc2.orig/manual/graphics/scale.rb0000644000000000000000000000234212114176157020557 0ustar rootroot# encoding: utf-8 # # This transformation is used to scale the user space. Give it an scale factor # and an :origin point and everything inside the block will be # scaled using the origin point as reference. # # If you omit the :origin option the page origin will be used. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do stroke_axis width = 100 height = 50 x = 50 y = 200 stroke_rectangle [x, y], width, height text_box "reference rectangle", :at => [x + 10, y - 10], :width => width - 20 scale(2, :origin => [x, y]) do stroke_rectangle [x, y], width, height text_box "rectangle scaled from upper-left corner", :at => [x, y - height - 5], :width => width end x = 350 stroke_rectangle [x, y], width, height text_box "reference rectangle", :at => [x + 10, y - 10], :width => width - 20 scale(2, :origin => [x + width / 2, y - height / 2]) do stroke_rectangle [x, y], width, height text_box "rectangle scaled from center", :at => [x, y - height - 5], :width => width end end ruby-prawn-1.0.0~rc2.orig/manual/graphics/lines_and_curves.rb0000644000000000000000000000243412114176157023015 0ustar rootroot# encoding: utf-8 # # Prawn supports drawing both lines and curves starting either at the current # position, or from a specified starting position. # # line_to and curve_to set the drawing path from the # current drawing position to the specified point. The initial drawing position # can be set with move_to. They are useful when you want to chain # successive calls because the drawing position will be set to the specified # point afterwards. # # line and curve set the drawing path between the two # specified points. # # Both curve methods define a Bezier curve bounded by two aditional points # provided as the :bounds param. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do stroke_axis # line_to and curve_to stroke do move_to 0, 0 line_to 100, 100 line_to 0, 100 curve_to [150, 250], :bounds => [[20, 200], [120, 200]] curve_to [200, 0], :bounds => [[150, 200], [450, 10]] end # line and curve stroke do line [300,200], [400,50] curve [500, 0], [400, 200], :bounds => [[600, 300], [300, 390]] end end ruby-prawn-1.0.0~rc2.orig/manual/graphics/stroke_join.rb0000644000000000000000000000146212114176157022020 0ustar rootroot# encoding: utf-8 # # The join style defines how the intersection between two lines is drawn. There # are three types: :miter (the default), :round and # :bevel # # Just like cap_style, the difference between styles is better # seen with thicker lines. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do stroke_axis self.line_width = 25 [:miter, :round, :bevel].each_with_index do |style, i| self.join_style = style y = 200 - i*100 stroke do move_to(100, y) line_to(200, y + 100) line_to(300, y) end stroke_rectangle [400, y + 75], 50, 50 end end ruby-prawn-1.0.0~rc2.orig/manual/graphics/transparency.rb0000644000000000000000000000200112114176157022171 0ustar rootroot# encoding: utf-8 # # Although the name of the method is transparency, what we are # actually setting is the opacity for fill and stroke. So 0 means # completely transparent and 1.0 means completely opaque # # You may call it providing one or two values. The first value sets fill opacity # and the second value sets stroke opacity. If the second value is omitted fill # and stroke will have the same opacity. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do stroke_axis self.line_width = 5 fill_color "ff0000" fill_rectangle [0, 100], 500, 100 fill_color "000000" stroke_color "ffffff" base_x = 100 [[0.5, 1], 0.5, [1, 0.5]].each do |args| transparent(*args) do fill_circle [base_x, 100], 50 stroke_rectangle [base_x - 20, 100], 40, 80 end base_x += 150 end end ruby-prawn-1.0.0~rc2.orig/manual/graphics/soft_masks.rb0000644000000000000000000000260212114176157021640 0ustar rootroot# encoding: utf-8 # # Soft masks are user for more complex alpha channel manipulations. You can use # arbitrary drawing functions for creation of soft masks. The resulting alpha # channel is made of greyscale version of the drawing (luminosity channel to be # precise). So while you can use any combination of colors for soft masks it's # easier to use greyscales. Black will result in full transparency and white # will make region fully opaque. # # Soft mask is a part of page graphic state. So if you want to apply soft mask # only to a part of page you need to enclose drawing instructions in # save_graphics_state block. require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do save_graphics_state do soft_mask do 0.upto 15 do |i| fill_color 0, 0, 0, 100.0 / 16.0 * (15 - i) fill_circle [75 + i * 25, 100], 60 end end fill_color '009ddc' fill_rectangle [0, 60], 600, 20 fill_color '963d97' fill_rectangle [0, 80], 600, 20 fill_color 'e03a3e' fill_rectangle [0, 100], 600, 20 fill_color 'f5821f' fill_rectangle [0, 120], 600, 20 fill_color 'fdb827' fill_rectangle [0, 140], 600, 20 fill_color '61bb46' fill_rectangle [0, 160], 600, 20 end end ruby-prawn-1.0.0~rc2.orig/manual/graphics/stroke_dash.rb0000644000000000000000000000233012114176157021773 0ustar rootroot# encoding: utf-8 # # This sets the dashed pattern for lines and curves. # # The (dash) length defines how long each dash will be. # # The :space option defines the length of the space between the # dashes. # # The :phase option defines the start point of the sequence of # dashes and spaces. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do stroke_axis base_y = 210 24.times do |i| length = (i / 4) + 1 space = length # space between dashes same length as dash phase = 0 # start with dash case i % 4 when 0 base_y -= 5 when 1 phase = length # start with space between dashes when 2 space = length * 0.5 # space between dashes half as long as dash when 3 space = length * 0.5 # space between dashes half as long as dash phase = length # start with space between dashes end base_y -= 5 dash(length, :space => space, :phase => phase) stroke_horizontal_line 50, 500, :at => base_y - (2 * i) end end ruby-prawn-1.0.0~rc2.orig/manual/graphics/rotate.rb0000644000000000000000000000145412114176157020771 0ustar rootroot# encoding: utf-8 # # This transformation is used to rotate the user space. Give it an angle # and an :origin point about which to rotate and a block. # Everything inside the block will be drawn with the rotated coordinates. # # The angle is in degrees. # # If you omit the :origin option the page origin will be used. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do stroke_axis fill_circle [250, 200], 2 12.times do |i| rotate(i * 30, :origin => [250, 200]) do stroke_rectangle [350, 225], 100, 50 draw_text "Rotated #{i * 30}°", :size => 10, :at => [360, 205] end end end ruby-prawn-1.0.0~rc2.orig/manual/graphics/gradients.rb0000644000000000000000000000254212114176157021452 0ustar rootroot# encoding: utf-8 # # Note that because of the way PDF renders radial gradients in order to get # solid fill your start circle must be fully inside your end circle. # Otherwise you will get triangle fill like illustrated in the example below. require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do stroke_axis self.line_width = 10 fill_gradient [50, 300], [150, 200], 'ff0000', '0000ff' fill_rectangle [50, 300], 100, 100 stroke_gradient [200, 200], [300, 300], '00ffff', 'ffff00' stroke_rectangle [200, 300], 100, 100 fill_gradient [350, 300], [450, 200], 'ff0000', '0000ff' stroke_gradient [350, 200], [450, 300], '00ffff', 'ffff00' fill_and_stroke_rectangle [350, 300], 100, 100 fill_gradient [100, 100], 0, [100, 100], 70.71, 'ff0000', '0000ff' fill_rectangle [50, 150], 100, 100 stroke_gradient [250, 100], 45, [250, 100], 70.71, '00ffff', 'ffff00' stroke_rectangle [200, 150], 100, 100 stroke_gradient [400, 100], 45, [400, 100], 70.71, '00ffff', 'ffff00' fill_gradient [400, 100], 0, [400, 100], 70.71, 'ff0000', '0000ff' fill_and_stroke_rectangle [350, 150], 100, 100 fill_gradient [500, 300], 15, [500, 50], 0, 'ff0000', '0000ff' fill_rectangle [485, 300], 30, 250 end ruby-prawn-1.0.0~rc2.orig/manual/graphics/helper.rb0000644000000000000000000000112412114176157020744 0ustar rootroot# encoding: utf-8 # # To produce this manual we use the stroke_axis helper method # within examples but it is not from the Prawn API. It is defined on this file: # # https://github.com/prawnpdf/prawn/blob/master/manual/example_helper.rb # # stroke_axis prints the x and y axis for the current bounding box # with markers in 100 increments # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do stroke_axis end ruby-prawn-1.0.0~rc2.orig/manual/graphics/fill_rules.rb0000644000000000000000000000273312114176157021634 0ustar rootroot# encoding: utf-8 # # Prawn's fill operators (fill and fill_and_stroke # both accept a :fill_rule option. These rules determine which # parts of the page are counted as "inside" vs. "outside" the path. There are # two fill rules: # # * :nonzero_winding_number (default): a point is inside the path # if a ray from that point to infinity crosses a nonzero "net number" of path # segments, where path segments intersecting in one direction are counted as # positive and those in the other direction negative. # # * :even_odd: A point is inside the path if a ray from that point # to infinity crosses an odd number of path segments, regardless of direction. # # The differences between the fill rules only come into play with complex # paths; they are identical for simple shapes. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do pentagram = [[181, 95], [0, 36], [111, 190], [111, 0], [0, 154]] stroke_color 'ff0000' line_width 2 text_box "Nonzero Winding Number", :at => [50, 215], :width => 170, :align => :center polygon(*pentagram.map { |x, y| [x+50, y] }) fill_and_stroke text_box "Even-Odd", :at => [330, 215], :width => 170, :align => :center polygon(*pentagram.map { |x, y| [x+330, y] }) fill_and_stroke(:fill_rule => :even_odd) end ruby-prawn-1.0.0~rc2.orig/manual/graphics/line_width.rb0000644000000000000000000000173512114176157021623 0ustar rootroot# encoding: utf-8 # # The line_width= method sets the stroke width for subsequent # stroke calls. # # Since Ruby assumes that an unknown variable on the left hand side of an # assignment is a local temporary, rather than a setter method, if you are using # the block call to Prawn::Document.generate without passing params # you will need to call line_width on self. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do stroke_axis y = 250 3.times do |i| case i when 0 then line_width = 10 # This call will have no effect when 1 then self.line_width = 10 when 2 then self.line_width = 25 end stroke do horizontal_line 50, 150, :at => y rectangle [275, y + 25], 50, 50 circle [500, y], 25 end y -= 100 end end ruby-prawn-1.0.0~rc2.orig/manual/graphics/polygon.rb0000644000000000000000000000162012114176157021155 0ustar rootroot# encoding: utf-8 # # Drawing polygons in Prawn is easy, just pass a sequence of points to one of # the polygon family of methods. # # Just like rounded_rectangle we also have # rounded_polygon. The only difference is the radius param comes # before the polygon points. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do stroke_axis # Triangle stroke_polygon [50, 200], [50, 300], [150, 300] # Hexagon fill_polygon [50, 150], [150, 200], [250, 150], [250, 50], [150, 0], [50, 50] # Pentagram pentagon_points = [500, 100], [430, 5], [319, 41], [319, 159], [430, 195] pentagram_points = [0, 2, 4, 1, 3].map{ |i| pentagon_points[i] } stroke_rounded_polygon(20, *pentagram_points) end ruby-prawn-1.0.0~rc2.orig/manual/example_section.rb0000644000000000000000000000200712114176157021045 0ustar rootroot# encoding: utf-8 module Prawn # The Prawn::ExampleSection class is a utility class to handle sections # of related examples within an ExamplePackage # class ExampleSection attr_reader :name def initialize(package, name) @package = package @name = name @examples = [] end # Stores a new ExampleFile in the examples list # def example(filename, options={}) @examples << ExampleFile.new(self, "#{filename}.rb", options) end # Returns this example's package original folder name # def folder_name @package.folder_name end # Returns the human friendly version of this section's package name # def package_name @package.name end # Renders the section to a pdf and iterates the examples list delegating the # examples to be rendered as well # def render(pdf) pdf.render_section(self) @examples.each do |example| example.render(pdf) end end end end ruby-prawn-1.0.0~rc2.orig/manual/templates/0000755000000000000000000000000012114176157017340 5ustar rootrootruby-prawn-1.0.0~rc2.orig/manual/templates/templates.rb0000644000000000000000000000123712114176157021666 0ustar rootroot# encoding: utf-8 # # Examples for loading existing pdfs. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) Prawn::Example.generate("templates.pdf", :page_size => "FOLIO") do package "templates" do |p| p.example "full_template", :eval_source => false, :full_source => true p.example "page_template" p.intro do prose("Templates let you embed other PDF documents inside the current one. The examples show:") list( "How to load the whole content from another PDF", "How to load single pages from another PDF" ) end end end ruby-prawn-1.0.0~rc2.orig/manual/templates/page_template.rb0000644000000000000000000000347512114176157022505 0ustar rootroot# encoding: utf-8 # # If you only need to load some pages from another PDF, you can accomplish it # with the start_new_page method. You may pass it a # :template option with the path for an existing pdf and a # :template_page option to specify which page to load. # You can also load a :template using a URI: # # require 'open-uri' # # start_new_page(:template => open('url_for_your.pdf')) # # The following example loads some pages from an existing PDF. If we don't # specify the :template_page option, the first page of the template # PDF will be loaded. That's what happens on the first load below. Then we load # a page by specifying the :template_page option and then we do it # again this time adding some content to the loaded page. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do text "Please scan the next 3 pages to see the page templates in action." move_down 10 text "You also might want to look at the pdf used as a template: " url = "https://github.com/prawnpdf/prawn/raw/master/data/pdfs/form.pdf" move_down 10 formatted_text [{:text => url, :link => url}] filename = "#{Prawn::DATADIR}/pdfs/form.pdf" start_new_page(:template => filename) start_new_page(:template => filename, :template_page => 2) start_new_page(:template => filename, :template_page => 2) fill_color "FF8888" text_box "John Doe", :at => [75, cursor-75] text_box "john@doe.com", :at => [75, cursor-105] text_box "John Doe inc", :at => [75, cursor-135] text_box "You didn't think I'd tell, did you?", :at => [75, cursor-165] fill_color "000000" end ruby-prawn-1.0.0~rc2.orig/manual/templates/full_template.rb0000644000000000000000000000151512114176157022524 0ustar rootroot# encoding: utf-8 # # You may load another PDF while creating a new one. Just pass the loaded PDF # filename to the :template option when creating/generating the new # PDF. # # The provided PDF will be loaded and the its first page will be set as the # current page. If you'd like to resume the document you may take advantage of # two helpers: page_count and go_to_page. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = "#{Prawn::DATADIR}/pdfs/multipage_template.pdf" Prawn::Example.generate("full_template.pdf", :template => filename) do go_to_page(page_count) start_new_page text "Previous pages and content imported.", :align => :center text "This page and content is brand new.", :align => :center end ruby-prawn-1.0.0~rc2.orig/manual/example_file.rb0000644000000000000000000000636312114176157020331 0ustar rootroot# encoding: utf-8 module Prawn # The Prawn::ExampleFile class is a utility class to ease the manipulation # and extraction of source code and comments from the actual example files # class ExampleFile attr_reader :package, :filename # Stores the file data, filename and parent, which will be either an # ExampleSection or an ExamplePackage. # # Available boolean options are: # # :eval_source:: Evals the example source code (default: true) # :full_source:: Extract the full source code when true. Extract # only the code between the generate block when false (default: false) # def initialize(parent, filename, options={}) @parent = parent.is_a?(String) ? ExamplePackage.new(parent) : parent @filename = filename @data = read_file(@parent.folder_name, filename) @options = {:eval_source => true, :full_source => false}.merge(options) end # Return the example source code excluding the initial comments and # require calls # def full_source @data.gsub(/# encoding.*?\n.*require.*?\n\n/m, "\n").strip end # Return the example source contained inside the first generate block or # the full source if no generate block is found # def generate_block_source block = @data.slice(/\w+\.generate.*? do\n(.*)end/m, 1) return full_source unless block block.gsub(/^( ){2}/, "") end # Return either the full_source or the generate_block_source according # to the options # def source @options[:full_source] ? full_source : generate_block_source end # Return true if the example source should be evaluated inline within # the manual according to the options # def eval? @options[:eval_source] end # Retrieve the comments between the encoding declaration and the require # call for example_helper.rb # # Then removes the '#' signs, reflows the line breaks and return the result # def introduction_text intro = @data.slice(/# encoding.*?\n(.*)require File\.expand_path/m, 1) intro.gsub!(/\n# (?=\S)/m, ' ') intro.gsub!(/^#/, '') intro.gsub!("\n", "\n\n") intro.rstrip! intro end # Returns a human friendly version of the example file name # def name @name ||= @filename[/(.*)\.rb/, 1].gsub("_", " ").capitalize end # Returns this example's parent original folder name # def parent_folder_name @parent.folder_name end # Returns the human friendly version of this example parent name # def parent_name @parent.name end # Renders this example to a pdf # def render(pdf) pdf.render_example(self) end private # Read the data from a file in a given package # def read_file(folder_name, filename) data = File.read(File.expand_path(File.join( File.dirname(__FILE__), folder_name, filename))) # XXX If we ever have manual files with source encodings other than # UTF-8, we will need to fix this to work on Ruby 1.9. if data.respond_to?(:encode!) data.encode!("UTF-8") end data end end end ruby-prawn-1.0.0~rc2.orig/manual/basic_concepts/0000755000000000000000000000000012114176157020321 5ustar rootrootruby-prawn-1.0.0~rc2.orig/manual/basic_concepts/measurement.rb0000644000000000000000000000150712114176157023176 0ustar rootroot# encoding: utf-8 # # The base unit in Prawn is the PDF Point. One PDF Point is equal to 1/72 of # an inch. # # There is no need to waste time converting this measures. Prawn provides # helpers for converting from other measurements # to PDF Points. # # Just require "prawn/measurement_extensions" and it will mix some # helpers onto Numeric for converting common measurement units to # PDF Points. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do require "prawn/measurement_extensions" [:mm, :cm, :dm, :m, :in, :yd, :ft].each do |measurement| text "1 #{measurement} in PDF Points: #{1.send(measurement)} pt" move_down 5.mm end end ruby-prawn-1.0.0~rc2.orig/manual/basic_concepts/basic_concepts.rb0000644000000000000000000000237512114176157023634 0ustar rootroot# encoding: utf-8 # # Examples for Prawn basic concepts. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) Prawn::Example.generate("basic_concepts.pdf", :page_size => "FOLIO") do package "basic_concepts" do |p| p.example "creation", :eval_source => false, :full_source => true p.example "origin" p.example "cursor" p.example "other_cursor_helpers" p.example "adding_pages" p.example "measurement" p.intro do prose("This chapter covers the minimum amount of functionality you'll need to start using Prawn. If you are new to Prawn this is the first chapter to read. Once you are comfortable with the concepts shown here you might want to check the Basics section of the Graphics, Bounding Box and Text sections. The examples show:") list( "How to create new pdf documents in every possible way", "Where the origin for the document coordinates is. What are Bounding Boxes and how they interact with the origin", "How the cursor behaves", "How to start new pages", "What the base unit for measurement and coordinates is and how to use other convenient measures" ) end end end ruby-prawn-1.0.0~rc2.orig/manual/basic_concepts/adding_pages.rb0000644000000000000000000000201512114176157023251 0ustar rootroot# encoding: utf-8 # # A PDF document is a collection of pages. When we create a new document be it # with Document.new or on a Document.generate block # one initial page is created for us. # # Some methods might create new pages automatically like text which # will create a new page whenever the text string cannot fit on the current # page. # # But what if you want to go to the next page by yourself? That is easy. # # Just use the start_new_page method and a shiny new page will be # created for you just like in the following snippet. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do text "We are still on the initial page for this example. Now I'll ask " + "Prawn to gently start a new page. Please follow me to the next page." start_new_page text "See. We've left the previous page behind." end ruby-prawn-1.0.0~rc2.orig/manual/basic_concepts/cursor.rb0000644000000000000000000000230112114176157022157 0ustar rootroot# encoding: utf-8 # # We normally write our documents from top to bottom and it is no different with # Prawn. Even if the origin is on the bottom left corner we still fill the page # from the top to the bottom. In other words the cursor for inserting content # starts on the top of the page. # # Most of the functions that insert content on the page will start at the # current cursor position and proceed to the bottom of the page. # # The following snippet shows how the cursor behaves when we add some text to # the page and demonstrates some of the helpers to manage the cursor position. # The cursor method returns the current cursor position. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do stroke_axis text "the cursor is here: #{cursor}" text "now it is here: #{cursor}" move_down 200 text "on the first move the cursor went down to: #{cursor}" move_up 100 text "on the second move the cursor went up to: #{cursor}" move_cursor_to 50 text "on the last move the cursor went directly to: #{cursor}" end ruby-prawn-1.0.0~rc2.orig/manual/basic_concepts/origin.rb0000644000000000000000000000262312114176157022140 0ustar rootroot# encoding: utf-8 # # This is the most important concept you need to learn about Prawn: # # PDF documents have the origin [0,0] at the bottom-left corner of # the page. # # A bounding box is a structure which provides boundaries for inserting content. # A bounding box also has the property of relocating the origin to its relative # bottom-left corner. However, be aware that the location specified when # creating a bounding box is its top-left corner, not bottom-left (hence the # [100, 300] coordinates below). # # Even if you never create a bounding box explictly, each document already comes # with one called the margin box. This initial bounding box is the one # responsible for the document margins. # # So practically speaking the origin of a page on a default generated document # isn't the absolute bottom left corner but the bottom left corner of the margin # box. # # The following snippet strokes a circle on the margin box origin. Then strokes # the boundaries of a bounding box and a circle on its origin. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do stroke_axis stroke_circle [0, 0], 10 bounding_box([100, 300], :width => 300, :height => 200) do stroke_bounds stroke_circle [0, 0], 10 end end ruby-prawn-1.0.0~rc2.orig/manual/basic_concepts/other_cursor_helpers.rb0000644000000000000000000000240512114176157025107 0ustar rootroot# encoding: utf-8 # # Another group of helpers for changing the cursor position are the pad methods. # They accept a numeric value and a block. pad will use the numeric # value to move the cursor down both before and after the block content. # pad_top will only move the cursor before the block while # pad_bottom will only move after. # # float is a method for not changing the cursor. Pass it a block # and the cursor will remain on the same place when the block returns. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do stroke_horizontal_rule pad(20) { text "Text padded both before and after." } stroke_horizontal_rule pad_top(20) { text "Text padded on the top." } stroke_horizontal_rule pad_bottom(20) { text "Text padded on the bottom." } stroke_horizontal_rule move_down 30 text "Text written before the float block." float do move_down 30 bounding_box([0, cursor], :width => 200) do text "Text written inside the float block." stroke_bounds end end text "Text written after the float block." end ruby-prawn-1.0.0~rc2.orig/manual/basic_concepts/creation.rb0000644000000000000000000000257012114176157022456 0ustar rootroot# encoding: utf-8 # # There are three ways to create a PDF Document in Prawn: creating a new # Prawn::Document instance, or using the # Prawn::Document.generate method with and without block arguments. # # The following snippet showcase each way by creating a simple document with # some text drawn. # # When we instantiate the Prawn::Document object the actual pdf # document will only be created after we call render_file. # # The generate method will render the actual pdf object after exiting the block. # When we use it without a block argument the provided block is evaluated in the # context of a newly created Prawn::Document instance. When we use # it with a block argument a Prawn::Document instance is created # and passed to the block. # # The generate method without block arguments requires # less typing and defines and renders the pdf document in one shot. # Almost all of the examples are coded this way. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) # Assignment pdf = Prawn::Document.new pdf.text "Hello World" pdf.render_file "assignment.pdf" # Implicit Block Prawn::Document.generate("implicit.pdf") do text "Hello World" end # Explicit Block Prawn::Document.generate("explicit.pdf") do |pdf| pdf.text "Hello World" end ruby-prawn-1.0.0~rc2.orig/manual/manual/0000755000000000000000000000000012114176157016617 5ustar rootrootruby-prawn-1.0.0~rc2.orig/manual/manual/cover.rb0000644000000000000000000000137712114176157020272 0ustar rootroot# encoding: utf-8 # # Prawn manual how to read this manual page. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do move_down 200 image "#{Prawn::DATADIR}/images/prawn.png", :scale => 0.9, :at => [10, cursor] formatted_text_box([ {:text => "Prawn\n", :styles => [:bold], :size => 100} ], :at => [170, cursor - 50]) formatted_text_box([ {:text => "by example", :font => 'Courier', :size => 60} ], :at => [170, cursor - 160]) end ruby-prawn-1.0.0~rc2.orig/manual/manual/foreword.rb0000644000000000000000000000064612114176157021001 0ustar rootroot# encoding: utf-8 # # Prawn manual foreword page. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do header("Foreword, by Gregory Brown") prose "This will be written just before 1.0, to give the" + " core team something to look forward to." end ruby-prawn-1.0.0~rc2.orig/manual/manual/manual.rb0000644000000000000000000000166012114176157020424 0ustar rootroot# encoding: utf-8 # # Generates the Prawn by example manual. # Encoding.default_external = "UTF-8" if defined? Encoding require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) Prawn::Example.generate("manual.pdf", :optimize_objects => true, :compress => false, :skip_page_creation => true, :page_size => "FOLIO") do load_page "cover" load_page "foreword" load_page "how_to_read_this_manual" # Core chapters load_package "basic_concepts" load_package "graphics" load_package "text" load_package "bounding_box" # Remaining chapters load_package "layout" load_package "images" load_package "table" load_package "document_and_page_options" load_package "outline" load_package "repeatable_content" load_package "templates" load_package "security" end ruby-prawn-1.0.0~rc2.orig/manual/manual/how_to_read_this_manual.rb0000644000000000000000000000425512114176157024030 0ustar rootroot# encoding: utf-8 # # Prawn manual how to read this manual page. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do header("How to read this manual") prose <<-END_TEXT This manual is a collection of examples categorized by theme and organized from the least to the most complex. While it covers most of the common use cases it is not a comprehensive guide. The best way to read it depends on your previous knowledge of Prawn and what you need to accomplish. If you are beginning with Prawn the first chapter will teach you the most basic concepts and how to create pdf documents. For an overview of the other features each chapter beyond the first either has a Basics section (which offer enough insight on the feature without showing all the advanced stuff you might never use) or is simple enough with only a few examples. Once you understand the basics you might want to come back to this manual looking for examples that accomplish tasks you need. Advanced users are encouraged to go beyond this manual and read the source code directly if any doubt is not directly covered on this manual. END_TEXT move_down(BOX_MARGIN) header("Reading the examples") prose <<-END_TEXT The title of each example is the relative path from the Prawn source manual/ folder. The first body of text is the introductory text for the example. Generaly it is a short description of the features illustrated by the example. Next comes the example source code block in fixed width font. Most of the example snippets illustrate features that alter the page in place. The effect of these snippets is shown right below a dashed line. If it doesn't make sense to evaluate the snippet inline, a box with the link for the example file is shown instead. Note that the stroke_axis method, used occasionally in the manual, is not part of standard Prawn and is used for demonstrative purposes. It is defined in this file: https://github.com/prawnpdf/prawn/blob/master/manual/example_helper.rb END_TEXT end ruby-prawn-1.0.0~rc2.orig/manual/bounding_box/0000755000000000000000000000000012114176157020017 5ustar rootrootruby-prawn-1.0.0~rc2.orig/manual/bounding_box/indentation.rb0000644000000000000000000000244412114176157022664 0ustar rootroot# encoding: utf-8 # # Sometimes you just need to indent a portion of the contents of a bounding box, # and using a nested bounding box is pure overkill. The indent # method is what you might need. # # Just provide a number for it to indent all content generated inside the # block. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do text "No indentation on the margin box." indent(20) do text "Some indentation inside an indent block." end move_down 20 bounding_box([50, cursor], :width => 400, :height => cursor) do transparent(0.5) { stroke_bounds } move_down 10 text "No indentation inside this bounding box." indent(40) do text "Inside an indent block. And so is this horizontal line:" stroke_horizontal_rule end move_down 10 text "No indentation" move_down 20 indent(60) do text "Another indent block." bounding_box([0, cursor], :width => 200) do text "Note that this bounding box coordinates are relative to the " + "indent block" transparent(0.5) { stroke_bounds } end end end end ruby-prawn-1.0.0~rc2.orig/manual/bounding_box/russian_boxes.rb0000644000000000000000000000221712114176157023232 0ustar rootroot# encoding: utf-8 # # This example is mostly just for fun, and shows how nested bounding boxes # can simplify calculations. See the "Bounding Box" section of the manual # for more basic uses. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do def combine(a1, a2) output = [] a1.each do |i1| a2.each do |i2| output += [[i1,i2]] end end output end def recurse_bounding_box(max_depth=4, depth=1) width = (bounds.width-15)/2 height = (bounds.height-15)/2 left_top_corners = combine([5, bounds.right-width-5], [bounds.top-5, height+5]) left_top_corners.each do |lt| bounding_box(lt, :width => width, :height => height) do stroke_bounds recurse_bounding_box(max_depth, depth+1) if depth < max_depth end end end # Set up a bbox from the dashed line to the bottom of the page bounding_box([0, cursor], :width => bounds.width, :height => cursor) do recurse_bounding_box end end ruby-prawn-1.0.0~rc2.orig/manual/bounding_box/bounding_box.rb0000644000000000000000000000204112114176157023016 0ustar rootroot# encoding: utf-8 # # Examples for bounding boxes. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) Prawn::Example.generate("bounding_box.pdf", :page_size => "FOLIO") do package "bounding_box" do |p| p.section "Basics" do |s| s.example "creation" s.example "bounds" end p.section "Advanced" do |s| s.example "stretchy" s.example "nesting" s.example "indentation" s.example "canvas" s.example "russian_boxes" end p.intro do prose("Bounding boxes are the basic containers for structuring the content flow. Even being low level building blocks sometimes their simplicity is very welcome. The examples show:") list( "How to create bounding boxes with specific dimensions", "How to inspect the current bounding box for its coordinates", "Stretchy bounding boxes", "Nested bounding boxes", "Indent blocks" ) end end end ruby-prawn-1.0.0~rc2.orig/manual/bounding_box/nesting.rb0000644000000000000000000000271112114176157022014 0ustar rootroot# encoding: utf-8 # # Normally when we provide the top left corner of a bounding box we # express the coordinates relative to the margin box. This is not the # case when we have nested bounding boxes. Once nested the inner bounding box # coordinates are relative to the outter bounding box. # # This example shows some nested bounding boxes with fixed and stretchy heights. # Note how the cursor method returns coordinates relative to # the current bounding box. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do def box_content(string) text string transparent(0.5) { stroke_bounds } end gap = 20 bounding_box([50, cursor], :width => 400, :height => 200) do box_content("Fixed height") bounding_box([gap, cursor - gap], :width => 300) do text "Stretchy height" bounding_box([gap, bounds.top - gap], :width => 100) do text "Stretchy height" transparent(0.5) { dash(1); stroke_bounds; undash } end bounding_box([gap * 7, bounds.top - gap], :width => 100, :height => 50) do box_content("Fixed height") end transparent(0.5) { dash(1); stroke_bounds; undash } end bounding_box([gap, cursor - gap], :width => 300, :height => 50) do box_content("Fixed height") end end end ruby-prawn-1.0.0~rc2.orig/manual/bounding_box/bounds.rb0000644000000000000000000000331412114176157021637 0ustar rootroot# encoding: utf-8 # # The bounds method returns the current bounding box. This is # useful because the Prawn::BoundinBox exposes some nice boundary # helpers. # # top, bottom, left and # right methods return the bounding box boundaries relative to its # translated origin. top_left, top_right, # bottom_left and bottom_right return those boundaries # pairs inside arrays. # # All these methods have an "absolute" version like absolute_right. # The absolute version returns the same boundary relative to the page absolute # coordinates. # # The following snippet shows the boundaries for the margin box side by side # with the boundaries for a custom bounding box. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do def print_coordinates text "top: #{bounds.top}" text "bottom: #{bounds.bottom}" text "left: #{bounds.left}" text "right: #{bounds.right}" move_down 10 text "absolute top: #{sprintf "%.2f", bounds.absolute_top}" text "absolute bottom: #{sprintf "%.2f", bounds.absolute_bottom}" text "absolute left: #{sprintf "%.2f", bounds.absolute_left}" text "absolute right: #{sprintf "%.2f", bounds.absolute_right}" end text "Margin box bounds:" move_down 5 print_coordinates bounding_box([250, cursor + 140], :width => 200, :height => 150) do text "This bounding box bounds:" move_down 5 print_coordinates transparent(0.5) { stroke_bounds } end end ruby-prawn-1.0.0~rc2.orig/manual/bounding_box/stretchy.rb0000644000000000000000000000173412114176157022216 0ustar rootroot# encoding: utf-8 # # Bounding Boxes accept an optional :height parameter. Unless it # is provided the bounding box will be stretchy. It will expand the height to # fit all content generated inside it. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do y_position = cursor bounding_box([0, y_position], :width => 200, :height => 100) do text "This bounding box has a height of 100. If this text gets too large " + "it will flow to the next page." transparent(0.5) { stroke_bounds } end bounding_box([300, y_position], :width => 200) do text "This bounding box has variable height. No matter how much text is " + "written here, the height will expand to fit." text " _" * 100 text " *" * 100 transparent(0.5) { stroke_bounds } end end ruby-prawn-1.0.0~rc2.orig/manual/bounding_box/creation.rb0000644000000000000000000000151312114176157022150 0ustar rootroot# encoding: utf-8 # # If you've read the basic concepts examples you probably know that the origin # of a page is on the bottom left corner and that the content flows from top to # bottom. # # You also know that a Bounding Box is a structure for helping the content flow. # # A bounding box can be created with the bounding_box method. Just # provide the top left corner, a required :width option and an # optional :height. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do bounding_box([200, cursor - 100], :width => 200, :height => 100) do text "Just your regular bounding box" transparent(0.5) { stroke_bounds } end end ruby-prawn-1.0.0~rc2.orig/manual/bounding_box/canvas.rb0000644000000000000000000000165512114176157021626 0ustar rootroot# encoding: utf-8 # # The origin example already mentions that a new document already comes with # a margin box whose bottom left corner is used as the origin for calculating # coordinates. # # What has not been told is that there is one helper for "bypassing" the margin # box: canvas. This method is a shortcut for creating a bounding # box mapped to the absolute coordinates and evaluating the code inside it. # # The following snippet draws a circle on each of the four absolute corners. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do canvas do fill_circle [bounds.left, bounds.top], 30 fill_circle [bounds.right, bounds.top], 30 fill_circle [bounds.right, bounds.bottom], 30 fill_circle [0, 0], 30 end end ruby-prawn-1.0.0~rc2.orig/manual/text/0000755000000000000000000000000012114176157016326 5ustar rootrootruby-prawn-1.0.0~rc2.orig/manual/text/color.rb0000644000000000000000000000121612114176157017771 0ustar rootroot# encoding: utf-8 # # The :color attribute can give a block of text a default color, # in RGB hex format or 4-value CMYK. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do text "Default color is black" move_down 25 text "Changed to red", :color => "FF0000" move_down 25 text "CMYK color", :color => [22, 55, 79, 30] move_down 25 text "Also works with inline formatting", :color => "0000FF", :inline_format => true end ruby-prawn-1.0.0~rc2.orig/manual/text/text_box_overflow.rb0000644000000000000000000000322112114176157022430 0ustar rootroot# encoding: utf-8 # # The text_box method accepts both :width and # :height options. So what happens if the text doesn't fit the box? # # The default behavior is to truncate the text but this can be changed with # the :overflow option. Available modes are :expand # (the box will increase to fit the text) and :shrink_to_fit # (the text font size will be shrunk to fit). # # If :shrink_to_fit mode is used with the # :min_font_size option set. The font size will not be reduced to # less than the value provided even if it means truncating some text. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do string = "This is the sample text used for the text boxes. See how it " + "behave with the various overflow options used." text string y_position = cursor - 20 [:truncate, :expand, :shrink_to_fit].each_with_index do |mode, i| text_box string, :at => [i * 150, y_position], :width => 100, :height => 50, :overflow => mode end string = "If the box is too small for the text, :shrink_to_fit " + "can render the text in a really small font size." move_down 120 text string y_position = cursor - 20 [nil, 8, 10, 12].each_with_index do |value, index| text_box string, :at => [index * 150, y_position], :width => 50, :height => 50, :overflow => :shrink_to_fit, :min_font_size => value end end ruby-prawn-1.0.0~rc2.orig/manual/text/group.rb0000644000000000000000000000222212114176157020005 0ustar rootroot# encoding: utf-8 # # Sometimes free flowing text might look ugly, specially when a paragraph is # split between two pages. Using a positioned text box just to overcome this # nuisance is not the right choice. # # You probably want to use the group method instead. It will try # to render the block within the current page. If the content would fall to a # new page it just renders everything on the following page. If the block cannot # be executed on a single blank page a CannotGroup exception will # be raised. # # So if you can split your text blocks in paragraphs you can have every # paragraph contained on a single page. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do move_cursor_to 80 text "Let's move to the end of the page so that you can see group in action." group do text "This block of text was too big to be rendered on the bottom of the " + " previous page. So it was rendered entirely on this new page. " + " _ " * 200 end end ruby-prawn-1.0.0~rc2.orig/manual/text/formatted_callbacks.rb0000644000000000000000000000424012114176157022637 0ustar rootroot# encoding: utf-8 # # The :callback option is also available for the formatted text # methods. # # This option accepts an object (or array of objects) on which two methods # will be called if defined: render_behind and # render_in_front. They are called before and after rendering the # text fragment and are passed the fragment as an argument. # # This example defines two new callback classes and provide callback objects # for the formatted_text # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do class HighlightCallback def initialize(options) @color = options[:color] @document = options[:document] end def render_behind(fragment) original_color = @document.fill_color @document.fill_color = @color @document.fill_rectangle(fragment.top_left, fragment.width, fragment.height) @document.fill_color = original_color end end class ConnectedBorderCallback def initialize(options) @radius = options[:radius] @document = options[:document] end def render_in_front(fragment) @document.stroke_polygon(fragment.top_left, fragment.top_right, fragment.bottom_right, fragment.bottom_left) @document.fill_circle(fragment.top_left, @radius) @document.fill_circle(fragment.top_right, @radius) @document.fill_circle(fragment.bottom_right, @radius) @document.fill_circle(fragment.bottom_left, @radius) end end highlight = HighlightCallback.new(:color => 'ffff00', :document => self) border = ConnectedBorderCallback.new(:radius => 2.5, :document => self) formatted_text [ { :text => "hello", :callback => highlight }, { :text => " " }, { :text => "world", :callback => border }, { :text => " " }, { :text => "hello world", :callback => [highlight, border] } ], :size => 20 end ruby-prawn-1.0.0~rc2.orig/manual/text/rendering_and_color.rb0000644000000000000000000000236412114176157022655 0ustar rootroot# encoding: utf-8 # # You have already seen how to set the text color using both inline formatting # and the format text methods. There is another way by using the graphics # methods fill_color and stroke_color. # # When reading the graphics reference you learned about fill and stroke. If you # haven't read it before, read it now before continuing. # # Text can be rendered by # being filled (the default mode) or just stroked or both filled and stroked. # This can be set using the text_rendering_mode method or the # :mode option on the text methods. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do fill_color "00ff00" stroke_color "0000ff" font_size(40) do # normal rendering mode: fill text "This text is filled with green." move_down 20 # inline rendering mode: stroke text "This text is stroked with blue", :mode => :stroke move_down 20 # block rendering mode: fill and stroke text_rendering_mode(:fill_stroke) do text "This text is filled with green and stroked with blue" end end end ruby-prawn-1.0.0~rc2.orig/manual/text/paragraph_indentation.rb0000644000000000000000000000170512114176157023217 0ustar rootroot# encoding: utf-8 # # Prawn strips all whitespace from the beginning and the end of strings so there # are two ways to indent paragraphs: # # One is to use non-breaking spaces which Prawn won't strip. One shortcut to # using them is the Prawn::Text::NBSP. # # The other is to use the :indent_paragraphs option with the text # methods. Just pass a number with the space to indent the first line in each # paragraph. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do # Using non-breaking spaces text " " * 10 + "This paragraph won't be indented. " * 10 + "\n#{Prawn::Text::NBSP * 10}" + "This one will with NBSP. " * 10 move_down 20 text "This paragraph will be indented. " * 10 + "\n" + "This one will too. " * 10, :indent_paragraphs => 60 end ruby-prawn-1.0.0~rc2.orig/manual/text/leading.rb0000644000000000000000000000136012114176157020256 0ustar rootroot# encoding: utf-8 # # Leading is the additional space between lines of text. # # The leading can be set using the default_leading method which # applies to the rest of the document or until it is changed, or inline in the # text methods with the :leading option. # # The default leading is 0. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do string = "Hey, what did you do with the space between my lines? " * 10 text string, :leading => 0 move_down 20 default_leading 5 text string move_down 20 text string, :leading => 10 end ruby-prawn-1.0.0~rc2.orig/manual/text/font_style.rb0000644000000000000000000000152112114176157021040 0ustar rootroot# encoding: utf-8 # # Most font families come with some styles other than normal. Most common are # bold, italic and bold_italic. # # The style can be set the using the :style option, with either the # font method which will set the font and style for rest of the # document, or with the inline text methods. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do ["Courier", "Helvetica", "Times-Roman"].each do |example_font| move_down 20 [:bold, :bold_italic, :italic, :normal].each do |style| font example_font, :style => style text "I'm writing in #{example_font} (#{style})" end end end ruby-prawn-1.0.0~rc2.orig/manual/text/alignment.rb0000644000000000000000000000321112114176157020626 0ustar rootroot# encoding: utf-8 # # Horizontal text alignment can be achieved by supplying the :align # option to the text methods. Available options are :left # (default), :right, :center, and # :justify. # # Vertical text alignment can be achieved using the :valign option # with the text methods. Available options are :top (default), # :center, and :bottom. # # Both forms of alignment will be evaluated in the context of the current # bounding_box. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do text "This text should be left aligned" text "This text should be centered", :align => :center text "This text should be right aligned", :align => :right bounding_box([0, 220], :width => 250, :height => 220) do text "This text is flowing from the left. " * 4 move_down 15 text "This text is flowing from the center. " * 3, :align => :center move_down 15 text "This text is flowing from the right. " * 4, :align => :right move_down 15 text "This text is justified. " * 6, :align => :justify transparent(0.5) { stroke_bounds } end bounding_box([300, 220], :width => 250, :height => 220) do text "This text should be vertically top aligned" text "This text should be vertically centered", :valign => :center text "This text should be vertically bottom aligned", :valign => :bottom transparent(0.5) { stroke_bounds } end end ruby-prawn-1.0.0~rc2.orig/manual/text/registering_families.rb0000644000000000000000000000321712114176157023051 0ustar rootroot# encoding: utf-8 # # Registering font families will help you when you want to use a font over and # over or if you would like to take advantage of the :style option # of the text methods and the b and i tags when using # inline formatting. # # To register a font family update the font_families # hash with the font path for each style you want to use. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do # Registering a single TTF font font_families.update("Chalkboard" => { :normal => "#{Prawn::DATADIR}/fonts/Chalkboard.ttf" }) font("Chalkboard") do text "Using the Chalkboard font providing only its name to the font method" end move_down 20 # Registering a DFONT package font_path = "#{Prawn::DATADIR}/fonts/Action Man.dfont" font_families.update("Action Man" => { :normal => { :file => font_path, :font => "ActionMan" }, :italic => { :file => font_path, :font => "ActionMan-Italic" }, :bold => { :file => font_path, :font => "ActionMan-Bold" }, :bold_italic => { :file => font_path, :font => "ActionMan-BoldItalic" } }) font "Action Man" text "Also using the Action Man by providing only its name" move_down 20 text "Taking advantage of the inline formatting", :inline_format => true move_down 20 [:bold, :bold_italic, :italic, :normal].each do |style| text "Using the #{style} style option.", :style => style move_down 10 end end ruby-prawn-1.0.0~rc2.orig/manual/text/text_box_extensions.rb0000644000000000000000000000276312114176157022776 0ustar rootroot# encoding: utf-8 # # We've already seen one way of using text boxes with the text_box # method. Turns out this method is just a convenience for using the # Prawn::Text::Box class as it creates a new object and call # render on it. # # Knowing that any extensions we add to Prawn::Text::Box will take # effect when we use the text_box method. To add an extension all # we need to do is append the Prawn::Text::Box.extensions array # with a module. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do module TriangleBox def available_width height + 25 end end y_position = cursor - 10 width = 100 height = 100 Prawn::Text::Box.extensions << TriangleBox stroke_rectangle([0, y_position], width, height) text_box("A" * 100, :at => [0, y_position], :width => width, :height => height) Prawn::Text::Formatted::Box.extensions << TriangleBox stroke_rectangle([200, y_position], width, height) formatted_text_box([:text => "A" * 100, :color => "009900"], :at => [200, y_position], :width => width, :height => height) # Here we clear the extensions array Prawn::Text::Box.extensions.clear Prawn::Text::Formatted::Box.extensions.clear end ruby-prawn-1.0.0~rc2.orig/manual/text/utf8.rb0000644000000000000000000000174712114176157017552 0ustar rootroot# encoding: utf-8 # # Multilingualization isn't much of a problem on Prawn as its default encoding # is UTF-8. The only thing you need to worry about is if the font support the # glyphs of your language. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do text "Take this example, a simple Euro sign:" text "€", :size => 32 move_down 20 text "Seems ok. Now let's try something more complex:" text "ὕαλον ϕαγεῖν δύναμαι· τοῦτο οὔ με βλάπτει." move_down 20 text "Looks like the current font (#{font.inspect}) doesn't support those." text "Let's try them with another font." move_down 20 font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf") do text "ὕαλον ϕαγεῖν δύναμαι· τοῦτο οὔ με βλάπτει." text "There you go." end end ruby-prawn-1.0.0~rc2.orig/manual/text/free_flowing_text.rb0000644000000000000000000000421512114176157022367 0ustar rootroot# encoding: utf-8 # # Text rendering can be as simple or as complex as you want. # # This example covers the most basic method: text. It is meant for # free flowing text. The provided string will flow according to the current # bounding box width and height. It will also flow onto the next page if the # bottom of the bounding box is reached. # # The text will start being rendered on the current cursor position. When it # finishes rendering, the cursor is left directly below the text. # # This example also shows text flowing across pages following the margin box and # other bounding boxes. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do move_cursor_to 50 text "This text will flow to the next page. " * 20 y_position = cursor - 50 bounding_box([0, y_position], :width => 200, :height => 150) do transparent(0.5) { stroke_bounds } text "This text will flow along this bounding box we created for it. " * 5 end bounding_box([300, y_position], :width => 200, :height => 150) do transparent(0.5) { stroke_bounds } # This will stroke on one page text "Now look what happens when the free flowing text reaches the end " + "of a bounding box that is narrower than the margin box." + " . " * 200 + "It continues on the next page as if the previous bounding box " + "was cloned. If we want it to have the same border as the one on " + "the previous page we will need to stroke the boundaries again." transparent(0.5) { stroke_bounds } # And this will stroke on the next end move_cursor_to 200 span(350, :position => :center) do text "Span is a different kind of bounding box as it lets the text " + "flow gracefully onto the next page. It doesn't matter if the text " + "started on the middle of the previous page, when it flows to the " + "next page it will start at the beginning." + " _ " * 500 + "I told you it would start on the beginning of this page." end end ruby-prawn-1.0.0~rc2.orig/manual/text/line_wrapping.rb0000644000000000000000000000564012114176157021516 0ustar rootroot# encoding: utf-8 # # Line wrapping happens on white space or hyphens. Soft hyphens can be used to # indicate where words can be hyphenated. Non-breaking spaces can be used to # display space without allowing for a break. # # For writing styles that do not make use of spaces, the zero width space serves # to mark word boundaries. Zero width spaces are available only with TTF fonts. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do text "Hard hyphens:\n" + "Slip-sliding away, slip sliding awaaaay. You know the " + "nearer your destination the more you're slip-sliding away." move_down 20 shy = Prawn::Text::SHY text "Soft hyphens:\n" + "Slip slid#{shy}ing away, slip slid#{shy}ing away. You know the " + "nearer your destinat#{shy}ion the more you're slip slid#{shy}ing away." move_down 20 nbsp = Prawn::Text::NBSP text "Non-breaking spaces:\n" + "Slip#{nbsp}sliding away, slip#{nbsp}sliding awaaaay. You know the " + "nearer your destination the more you're slip#{nbsp}sliding away." move_down 20 font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf", :size => 16) do long_text = "No word boundaries:\n更可怕的是,同质化竞争对手可以按照URL中后面这个ID来遍历您的DB中的内容,写个小爬虫把你的页面上的关键信息顺次爬下来也不是什么难事,这样的话,你就非常被动了。更可怕的是,同质化竞争对手可以按照URL中后面这个ID来遍历您的DB中的内容,写个小爬虫把你的页面上的关键信息顺次爬下来也不是什么难事,这样的话,你就非常被动了。" text long_text move_down 20 zwsp = Prawn::Text::ZWSP long_text = "Invisible word boundaries:\n更#{zwsp}可怕的#{zwsp}是,#{zwsp}同质化#{zwsp}竞争#{zwsp}对#{zwsp}手#{zwsp}可以#{zwsp}按照#{zwsp}URL#{zwsp}中#{zwsp}后面#{zwsp}这个#{zwsp}ID#{zwsp}来#{zwsp}遍历#{zwsp}您的#{zwsp}DB#{zwsp}中的#{zwsp}内容,#{zwsp}写个#{zwsp}小爬虫#{zwsp}把#{zwsp}你的#{zwsp}页面#{zwsp}上的#{zwsp}关#{zwsp}键#{zwsp}信#{zwsp}息顺#{zwsp}次#{zwsp}爬#{zwsp}下来#{zwsp}也#{zwsp}不是#{zwsp}什么#{zwsp}难事,#{zwsp}这样的话,#{zwsp}你#{zwsp}就#{zwsp}非常#{zwsp}被动了。#{zwsp}更#{zwsp}可怕的#{zwsp}是,#{zwsp}同质化#{zwsp}竞争#{zwsp}对#{zwsp}手#{zwsp}可以#{zwsp}按照#{zwsp}URL#{zwsp}中#{zwsp}后面#{zwsp}这个#{zwsp}ID#{zwsp}来#{zwsp}遍历#{zwsp}您的#{zwsp}DB#{zwsp}中的#{zwsp}内容,#{zwsp}写个#{zwsp}小爬虫#{zwsp}把#{zwsp}你的#{zwsp}页面#{zwsp}上的#{zwsp}关#{zwsp}键#{zwsp}信#{zwsp}息顺#{zwsp}次#{zwsp}爬#{zwsp}下来#{zwsp}也#{zwsp}不是#{zwsp}什么#{zwsp}难事,#{zwsp}这样的话,#{zwsp}你#{zwsp}就#{zwsp}非常#{zwsp}被动了。" text long_text end end ruby-prawn-1.0.0~rc2.orig/manual/text/column_box.rb0000644000000000000000000000274012114176157021023 0ustar rootroot# encoding: utf-8 # # The column_box method allows you to define columns that flow # their contents from one section to the next. You can have a number of columns # on the page, and only when the last column overflows will a new page be # created. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do text "The Prince", :align => :center, :size => 18 text "Niccolò Machiavelli", :align => :center, :size => 14 move_down 12 column_box([0, cursor], :columns => 2, :width => bounds.width) do text((<<-END.gsub(/\s+/, ' ') + "\n\n") * 3) All the States and Governments by which men are or ever have been ruled, have been and are either Republics or Princedoms. Princedoms are either hereditary, in which the sovereignty is derived through an ancient line of ancestors, or they are new. New Princedoms are either wholly new, as that of Milan to Francesco Sforza; or they are like limbs joined on to the hereditary possessions of the Prince who acquires them, as the Kingdom of Naples to the dominions of the King of Spain. The States thus acquired have either been used to live under a Prince or have been free; and he who acquires them does so either by his own arms or by the arms of others, and either by good fortune or by merit. END end end ruby-prawn-1.0.0~rc2.orig/manual/text/inline.rb0000644000000000000000000000336712114176157020142 0ustar rootroot# encoding: utf-8 # # Inline formatting gives you the option to format specific portions of a text. # It uses HTML-esque syntax inside the text string. Supported tags are: # b (bold), i (italic), u (underline), # strikethrough, sub (subscript), sup # (superscript) # # The following tags accept specific attributes: font accepts # size, name, and character_spacing; # color accepts rgb and cmyk; # link accepts href for external links and # anchor for internal links. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do %w[b i u strikethrough sub sup].each do |tag| text "Just your regular text <#{tag}>except this portion " + "is using the #{tag} tag", :inline_format => true move_down 10 end text "This line uses " + "all the font tag attributes in " + "a single line. ", :inline_format => true move_down 10 text "Coloring in both RGB " + "and CMYK", :inline_format => true move_down 10 text "This an external link to the " + "Prawn wiki" + " and this is a link to the " + "Text Reference anchor", :inline_format => true end ruby-prawn-1.0.0~rc2.orig/manual/text/kerning_and_character_spacing.rb0000644000000000000000000000302012114176157024645 0ustar rootroot# encoding: utf-8 # # Kerning is the process of adjusting the spacing between characters in a # proportional font. It is usually done with specific letter pairs. We can # switch it on and off if it is available with the current font. Just pass a # boolean value to the :kerning option of the text methods. # # Character Spacing is the space between characters. It can be increased or # decreased and will have effect on the whole text. Just pass a number to the # :character_spacing option from the text methods. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do font_size(30) do text_box "With kerning:", :kerning => true, :at => [0, y - 40] text_box "Without kerning:", :kerning => false, :at => [0, y - 80] text_box "Tomato", :kerning => true, :at => [250, y - 40] text_box "Tomato", :kerning => false, :at => [250, y - 80] text_box "WAR", :kerning => true, :at => [400, y - 40] text_box "WAR", :kerning => false, :at => [400, y - 80] text_box "F.", :kerning => true, :at => [500, y - 40] text_box "F.", :kerning => false, :at => [500, y - 80] end move_down 80 string = "What have you done to the space between the characters?" [-2, -1, 0, 0.5, 1, 2].each do |spacing| move_down 20 text "#{string} (character_spacing: #{spacing})", :character_spacing => spacing end end ruby-prawn-1.0.0~rc2.orig/manual/text/win_ansi_charset.rb0000644000000000000000000000304412114176157022174 0ustar rootroot# encoding: utf-8 # # Prints a list of all of the glyphs that can be rendered by Adobe's built # in fonts, along with their character widths and WinAnsi codes. Be sure # to pass these glyphs as UTF-8, and Prawn will transcode them for you. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do FONT_SIZE = 9.5 x = 0 y = bounds.top fields = [[20, :right], [8, :left], [12, :center], [30, :right], [8, :left], [0, :left]] font "Helvetica", :size => FONT_SIZE move_down 30 text "(See next page for WinAnsi table)", :align => :center start_new_page Prawn::Encoding::WinAnsi::CHARACTERS.each_with_index do |name, index| next if name == ".notdef" y -= FONT_SIZE if y < FONT_SIZE y = bounds.top - FONT_SIZE x += 170 end code = "%d." % index char = index.chr width = 1000 * width_of(char, :size => FONT_SIZE) / FONT_SIZE size = "%d" % width data = [code, nil, char, size, nil, name] dx = x fields.zip(data).each do |(total_width, align), field| if field width = width_of(field, :size => FONT_SIZE) case align when :left then offset = 0 when :right then offset = total_width - width when :center then offset = (total_width - width)/2 end text_box(field, :at => [dx + offset, y], :skip_encoding => true) end dx += total_width end end end ruby-prawn-1.0.0~rc2.orig/manual/text/font.rb0000644000000000000000000000220612114176157017621 0ustar rootroot# encoding: utf-8 # # The font method can be used in three different ways. # # If we don't pass it any arguments it will return the current font being used # to render text. # # If we just pass it a font name it will use that font for rendering text # through the rest of the document. # # It can also be used by passing a font name and a block. In this case the # specified font will only be used to render text inside the block. # # The default font is Helvetica. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do text "Let's see which font we are using: #{font.inspect}" move_down 20 font "Times-Roman" text "Written in Times." move_down 20 font("Courier") do text "Written in Courier because we are inside the block." end move_down 20 text "Written in Times again as we left the previous block." move_down 20 text "Let's see which font we are using again: #{font.inspect}" move_down 20 font "Helvetica" text "Back to normal." end ruby-prawn-1.0.0~rc2.orig/manual/text/right_to_left_text.rb0000644000000000000000000000425512114176157022556 0ustar rootroot# encoding: utf-8 # # Prawn can be used with right-to-left text. The direction can be set # document-wide, on particular text, or on a text-box. Setting the direction to # :rtl automatically changes the default alignment to # :right # # You can even override direction on an individual fragment. The one caveat is # that two fragments going against the main direction cannot be placed next to # each other without appearing in the wrong order. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do # set the direction document-wide self.text_direction = :rtl font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf", :size => 16) do long_text = "写个小爬虫把你的页面上的关键信息顺次爬下来也不是什么难事写个小爬虫把你的页面上的关键信息顺次爬下来也不是什么难事写个小爬虫把你的页面上的关键信息顺次爬下来也不是什么难事写个小" text long_text move_down 20 text "You can override the document direction.", :direction => :ltr move_down 20 formatted_text [{ :text => "更可怕的是,同质化竞争对手可以按照" }, { :text => "URL", :direction => :ltr }, { :text => "中后面这个" }, { :text => "ID", :direction => :ltr }, { :text => "来遍历您的" }, { :text => "DB", :direction => :ltr }, { :text => "中的内容,写个小爬虫把你的页面上的关键信息顺次爬下来也不是什么难事,这样的话,你就非常被动了。" }] move_down 20 formatted_text [{ :text => "更可怕的是,同质化竞争对手可以按照" }, { :text => "this", :direction => :ltr }, { :text => "won't", :direction => :ltr, :size => 24 }, { :text => "work", :direction => :ltr }, { :text => "中的内容,写个小爬虫把你的页面上的关键信息顺次爬下来也不是什么难事" }] end end ruby-prawn-1.0.0~rc2.orig/manual/text/font_size.rb0000644000000000000000000000220712114176157020654 0ustar rootroot# encoding: utf-8 # # The font_size method works just like the font # method. # # In fact we can even use font with the :size option # to declare which size we want. # # Another way to change the font size is by supplying the :size # option to the text methods. # # The default font size is 12. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do text "Let's see which is the current font_size: #{font_size.inspect}" move_down 10 font_size 16 text "Yeah, something bigger!" move_down 10 font_size(25) { text "Even bigger!" } move_down 10 text "Back to 16 again." move_down 10 text "Single line on 20 using the :size option.", :size => 20 move_down 10 text "Back to 16 once more." move_down 10 font("Courier", :size => 10) do text "Yeah, using Courier 10 courtesy of the font method." end move_down 10 font("Helvetica", :size => 12) text "Back to normal" end ruby-prawn-1.0.0~rc2.orig/manual/text/text.rb0000644000000000000000000000507012114176157017641 0ustar rootroot# encoding: utf-8 # # Examples for text rendering. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) Prawn::Example.generate("text.pdf", :page_size => "FOLIO") do package "text" do |p| p.section "Basics" do |s| s.example "free_flowing_text" s.example "positioned_text" s.example "text_box_overflow" s.example "text_box_excess" s.example "group" s.example "column_box" end p.section "Styling" do |s| s.example "font" s.example "font_size" s.example "font_style" s.example "color" s.example "alignment" s.example "leading" s.example "kerning_and_character_spacing" s.example "paragraph_indentation" s.example "rotation" end p.section "Advanced Styling" do |s| s.example "inline" s.example "formatted_text" s.example "formatted_callbacks" s.example "rendering_and_color" s.example "text_box_extensions" end p.section "External Fonts" do |s| s.example "single_usage" s.example "registering_families" end p.section "M17n" do |s| s.example "utf8" s.example "line_wrapping" s.example "right_to_left_text" s.example "fallback_fonts" s.example "win_ansi_charset" end p.intro do prose("This is probably the feature people will use the most. There is no shortage of options when it comes to text. You'll be hard pressed to find a use case that is not covered by one of the text methods and configurable options. The examples show:") list( "Text that flows from page to page automatically starting new pages when necessary", "How to use text boxes and place them on specific positions", "What to do when a text box is too small to fit its content", "How to proceed when you want to prevent paragraphs from splitting between pages", "Flowing text in columns", "How to change the text style configuring font, size, alignment and many other settings", "How to style specific portions of a text with inline styling and formatted text", "How to define formatted callbacks to reuse common styling definitions", "How to use the different rendering modes available for the text methods", "How to create your custom text box extensions", "How to use external fonts on your pdfs", "What happens when rendering text in different languages" ) end end end ruby-prawn-1.0.0~rc2.orig/manual/text/positioned_text.rb0000644000000000000000000000313612114176157022077 0ustar rootroot# encoding: utf-8 # # Sometimes we want the text on a specific position on the page. The # text method just won't help us. # # There are two other methods for this task: draw_text and # text_box. # # draw_text is very simple. It will render text starting at the # position provided to the :at option. It won't flow to a new line # even if it hits the document boundaries so it is best suited for short text. # # text_box gives us much more control over the output. Just provide # :width and :height options and the text will flow # accordingly. Even if you don't provide a :width option the text # will flow to a new line if it reaches the right border. # # Given that said, text_box is the better option available. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do draw_text "This draw_text line is absolute positioned. However don't " + "expect it to flow even if it hits the document border", :at => [200, 300] text_box "This is a text box, you can control where it will flow by " + "specifying the :height and :width options", :at => [100, 250], :height => 100, :width => 100 text_box "Another text box with no :width option passed, so it will " + "flow to a new line whenever it reaches the right margin. ", :at => [200, 100] end ruby-prawn-1.0.0~rc2.orig/manual/text/formatted_text.rb0000644000000000000000000000527512114176157021715 0ustar rootroot# encoding: utf-8 # # There are two other text methods available: formatted_text and # formatted_text_box. # # These are useful when the provided text has numerous portions that need to be # formatted differently. As you might imply from their names the first should # be used for free flowing text just like the text method and the # last should be used for positioned text just like text_box. # # The main difference between these methods and the text and # text_box methods is how the text is provided. The # formatted_text and formatted_text_box methods accept # an array of hashes. Each hash must provide a :text option which # is the text string and may provide the following options: :styles # (an array of symbols), :size (the font size), # :character_spacing (additional space between the characters), # :font (the name of a registered font), :color (the # same input accepted by fill_color and stroke_color), # :link (an URL to create a link), and :anchor (a # destination inside the document). # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do formatted_text [ { :text => "Some bold. ", :styles => [:bold] }, { :text => "Some italic. ", :styles => [:italic] }, { :text => "Bold italic. ", :styles => [:bold, :italic] }, { :text => "Bigger Text. ", :size => 20 }, { :text => "More spacing. ", :character_spacing => 3 }, { :text => "Different Font. ", :font => "Courier" }, { :text => "Some coloring. ", :color => "FF00FF" }, { :text => "Link to the wiki. ", :color => "0000FF", :link => "https://github.com/prawnpdf/prawn/wiki" }, { :text => "Link to the Text Reference. " , :color => "0000FF", :anchor => "Text Reference" } ] formatted_text_box [ { :text => "Just your regular" }, { :text => " text_box ", :font => "Courier" }, { :text => "with some additional formatting options " + "added to the mix.", :color => [50, 100, 0, 0], :styles => [:italic] } ], :at => [100, 100], :width => 200, :height => 100 end ruby-prawn-1.0.0~rc2.orig/manual/text/text_box_excess.rb0000644000000000000000000000231712114176157022064 0ustar rootroot# encoding: utf-8 # # Whenever the text_box method truncates text, this truncated bit # is not lost, it is the method return value and we can take advantage of that. # # We just need to take some precautions. # # This example renders as much of the text as will fit in a larger font inside # one text_box and then proceeds to render the remaining text in the default # size in a second text_box. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do string = "This is the beginning of the text. It will be cut somewhere and " + "the rest of the text will procede to be rendered this time by " + "calling another method." + " . " * 50 y_position = cursor - 20 excess_text = text_box string, :width => 300, :height => 50, :overflow => :truncate, :at => [100, y_position], :size => 18 text_box excess_text, :width => 300, :at => [100, y_position - 100] end ruby-prawn-1.0.0~rc2.orig/manual/text/fallback_fonts.rb0000644000000000000000000000257712114176157021636 0ustar rootroot# encoding: utf-8 # # Prawn enables the declaration of fallback fonts for those glyphs that may not # be present in the desired font. Use the :fallback_fonts option # with any of the text or text box methods, or set fallback_fonts document-wide. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf" font_families["Kai"] = { :normal => { :file => file, :font => "Kai" } } file = "#{Prawn::DATADIR}/fonts/Action Man.dfont" font_families["Action Man"] = { :normal => { :file => file, :font => "ActionMan" }, } font("Action Man") do text("When fallback fonts are included, each glyph will be rendered " + "using the first font that includes the glyph, starting with the " + "current font and then moving through the fallback fonts from left " + "to right." + "\n\n" + "hello ƒ 你好\n再见 ƒ goodbye", :fallback_fonts => ["Times-Roman", "Kai"]) end move_down 20 formatted_text([ { :text => "Fallback fonts can even override" }, { :text => "fragment fonts (你好)", :font => "Times-Roman" }, ], :fallback_fonts => ["Times-Roman", "Kai"]) end ruby-prawn-1.0.0~rc2.orig/manual/text/rotation.rb0000644000000000000000000000301512114176157020511 0ustar rootroot# encoding: utf-8 # # Rotating text is best avoided on free flowing text, so this example # will only use the text_box method as we can have much more # control over its output. # # To rotate text all we need to do is use the :rotate option # passing an angle in degrees and an optional :rotate_around to # indicate the origin of the rotation (the default is :upper_left). # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do width = 100 height = 60 angle = 30 x = 200 y = cursor - 30 stroke_rectangle [0, y], width, height text_box("This text was not rotated", :at => [0, y], :width => width, :height => height) stroke_rectangle [0, y - 100], width, height text_box("This text was rotated around the center", :at => [0, y - 100], :width => width, :height => height, :rotate => angle, :rotate_around => :center) [:lower_left, :upper_left, :lower_right, :upper_right].each_with_index do |corner, index| y = y - 100 if index == 2 stroke_rectangle [x + (index % 2) * 200, y], width, height text_box("This text was rotated around the #{corner} corner.", :at => [x + (index % 2) * 200, y], :width => width, :height => height, :rotate => angle, :rotate_around => corner) end end ruby-prawn-1.0.0~rc2.orig/manual/text/single_usage.rb0000644000000000000000000000240412114176157021320 0ustar rootroot# encoding: utf-8 # # The PDF format has some built-in font support. If you want to use other fonts # in Prawn you need to embed the font file. # # Doing this for a single font is extremely simple. Remember the Styling font # example? Another use of the font method is to provide a font file # path and the font will be embedded in the document and set as the current # font. # # This is reasonable if a font is used only once, but, if a font used several # times, providing the path each time it is used becomes cumbersome. The example # on the next page shows a better way to deal with fonts which are used several # times in a document. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do # Using a TTF font file font("#{Prawn::DATADIR}/fonts/Chalkboard.ttf") do text "Written with the Chalkboard TTF font." end move_down 20 text "Written with the default font." move_down 20 # Using an DFONT font file font("#{Prawn::DATADIR}/fonts/Action Man.dfont") do text "Written with the Action Man DFONT font" end move_down 20 text "Written with the default font once more." end ruby-prawn-1.0.0~rc2.orig/manual/document_and_page_options/0000755000000000000000000000000012114176157022551 5ustar rootrootruby-prawn-1.0.0~rc2.orig/manual/document_and_page_options/page_size.rb0000644000000000000000000000244612114176157025052 0ustar rootroot# encoding: utf-8 # # Prawn comes with support for most of the common page sizes so you'll only need # to provide specific values if your intended format is not supported. To see a # list with all supported sizes take a look at: https://github.com/prawnpdf/prawn/blob/master/lib/prawn/document/page_geometry.rb # # To define the size use :page_size when creating new documents # and :size when starting new pages. The default page size for new # documents is LETTER (612.00 x 792.00). # # You may also define the orientation of the page to be either portrait # (default) or landscape. Use :page_layout when creating new # documents and :layout when starting new pages. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) Prawn::Document.generate("page_size.pdf", :page_size => "EXECUTIVE", :page_layout => :landscape ) do text "EXECUTIVE landscape page." custom_size = [275, 326] ["A4", "TABLOID", "B7", custom_size ].each do |size| start_new_page(:size => size, :layout => :portrait) text "#{size} portrait page." start_new_page(:size => size, :layout => :landscape) text "#{size} landscape page." end end ruby-prawn-1.0.0~rc2.orig/manual/document_and_page_options/background.rb0000644000000000000000000000145512114176157025222 0ustar rootroot# encoding: utf-8 # # Pass an image path to the :background option and it will be used # as the background for all pages. # This option can only be used on document creation. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) img = "#{Prawn::DATADIR}/images/letterhead.jpg" Prawn::Document.generate("background.pdf", :background => img, :margin => 100 ) do text "My report caption", :size => 18, :align => :right move_down font.height * 2 text "Here is my text explaning this report. " * 20, :size => 12, :align => :left, :leading => 2 move_down font.height text "I'm using a soft background. " * 40, :size => 12, :align => :left, :leading => 2 end ruby-prawn-1.0.0~rc2.orig/manual/document_and_page_options/page_margins.rb0000644000000000000000000000243212114176157025533 0ustar rootroot# encoding: utf-8 # # The default margin for pages is 0.5 inch but you can change that with the # :margin option or if you'd like to have different margins you # can use the :left_margin, :right_margin, # :top_margin, :bottom_margin options. # # These options are available both for starting new pages and creating new # documents. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) Prawn::Document.generate("page_margins.pdf", :margin => 100 ) do text "100 pts margins." stroke_bounds start_new_page(:left_margin => 300) text "300 pts margin on the left." stroke_bounds start_new_page(:top_margin => 300) text "300 pts margin both on the top and on the left. Notice that whenever " + "you set an option for a new page it will remain the default for the " + "following pages." stroke_bounds start_new_page(:margin => 50) text "50 pts margins. Using the margin option will reset previous specific " + "calls to left, right, top and bottom margins." stroke_bounds start_new_page(:margin => [50, 100, 150, 200]) text "There is also the shorthand CSS like syntax used here." stroke_bounds end ruby-prawn-1.0.0~rc2.orig/manual/document_and_page_options/metadata.rb0000644000000000000000000000136612114176157024664 0ustar rootroot# encoding: utf-8 # # To set the document metadata just pass a hash to the :info # option when creating new documents. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) Prawn::Document.generate("metadata.pdf", :info => { :Title => "My title", :Author => "John Doe", :Subject => "My Subject", :Keywords => "test metadata ruby pdf dry", :Creator => "ACME Soft App", :Producer => "Prawn", :CreationDate => Time.now, :Grok => "Test Property" }) do text "This is a test of setting metadata properties via the info option." text "It allows one to specify non standard properties like 'Grok'." end ruby-prawn-1.0.0~rc2.orig/manual/document_and_page_options/document_and_page_options.rb0000644000000000000000000000216712114176157030313 0ustar rootroot# encoding: utf-8 # # Examples for stamps and repeaters. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) Prawn::Example.generate("document_and_page_options.pdf", :page_size => "FOLIO") do package "document_and_page_options" do |p| p.example "page_size", :eval_source => false, :full_source => true p.example "page_margins", :eval_source => false, :full_source => true p.example "background", :eval_source => false, :full_source => true p.example "metadata", :eval_source => false, :full_source => true p.intro do prose("So far we've already seen how to create new documents and start new pages. This chapter expands on the previous examples by showing other options avialable. Some of the options are only available when creating new documents. The examples show:") list( "How to configure page size", "How to configure page margins", "How to use a background image", "How to add metadata to the generated PDF" ) end end end ruby-prawn-1.0.0~rc2.orig/manual/repeatable_content/0000755000000000000000000000000012114176157021200 5ustar rootrootruby-prawn-1.0.0~rc2.orig/manual/repeatable_content/stamp.rb0000644000000000000000000000251212114176157022651 0ustar rootroot# encoding: utf-8 # # Stamps should be used when you have content that will be included multiple # times in a document. Its advantages over creating the content anew each time # are: # 1. Faster document creation # 2. Smaller final document # 3. Faster display on subsequent displays of the repeated # element because the viewer application can cache the rendered # results # # The create_stamp method does just what it says. Pass it a block # with the content that should be generated and the stamp will be created. # # There are two methods to render the stamp on a page stamp and # stamp_at. The first will render the stamp as is while the # second accepts a point to serve as an offset to the stamp content. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do create_stamp("approved") do rotate(30, :origin => [-5, -5]) do stroke_color "FF3333" stroke_ellipse [0, 0], 29, 15 stroke_color "000000" fill_color "993333" font("Times-Roman") do draw_text "Approved", :at => [-23, -3] end fill_color "000000" end end stamp "approved" stamp_at "approved", [200, 200] end ruby-prawn-1.0.0~rc2.orig/manual/repeatable_content/repeatable_content.rb0000644000000000000000000000204212114176157025361 0ustar rootroot# encoding: utf-8 # # Examples for stamps and repeaters. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) Prawn::Example.generate("repeatable_content.pdf", :page_size => "FOLIO") do package "repeatable_content" do |p| p.example "repeater", :eval_source => false p.example "stamp" p.example "page_numbering", :eval_source => false p.intro do prose("Prawn offers two ways to handle repeatable content blocks. Repeater is useful for content that gets repeated at well defined intervals while Stamp is more appropriate if you need better control of when to repeat it. There is also one very specific helper for numbering pages. The examples show:") list( "How to repeat content on several pages with a single invocation", "How to create a new Stamp", 'How to "stamp" the content block on the page', "How to number the document pages with one simple call" ) end end end ruby-prawn-1.0.0~rc2.orig/manual/repeatable_content/repeater.rb0000644000000000000000000000310512114176157023333 0ustar rootroot# encoding: utf-8 # # The repeat method is quite versatile when it comes to define # the intervals at which the content block should repeat. # # The interval may be a symbol (:all, :odd, # :even), an array listing the pages, a range or a # Proc that receives the page number as an argument and should # return true if the content is to be repeated on the given page. # # You may also pass an option :dynamic to reevaluate the code block # on every call which is useful when the content changes based on the page # number. # # It is also important to say that no matter where you define the repeater it # will be applied to all matching pages. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do repeat(:all) do draw_text "All pages", :at => bounds.top_left end repeat(:odd) do draw_text "Only odd pages", :at => [0,0] end repeat(:even) do draw_text "Only even pages", :at => [0,0] end repeat([1,3,7]) do draw_text "Only on pages 1, 3 and 7", :at => [100,0] end repeat(2..4) do draw_text "From the 2nd to the 4th page", :at => [300,0] end repeat(lambda { |pg| pg % 3 == 0 }) do draw_text "Every third page", :at => [250, 20] end repeat(:all, :dynamic => true) do draw_text page_number, :at => [500, 0] end 10.times do start_new_page draw_text "A wonderful page", :at => [400,400] end end ruby-prawn-1.0.0~rc2.orig/manual/repeatable_content/page_numbering.rb0000644000000000000000000000351112114176157024507 0ustar rootroot# encoding: utf-8 # # The number_pages method is a simple way to number the pages of # your document. It should be called towards the end of the document since # pages created after the call won't be numbered. # # It accepts a string and a hash of options: # # start_count_at is the value from which to start numbering pages # # total_pages If provided, will replace total with # the value given. Useful for overriding the total number of pages when using # the start_count_at option. # # page_filter, which is one of: :all, # :odd, :even, an array, a range, or a Proc that # receives the page number as an argument and should return true if the page # number should be printed on that page. # # color which accepts the same values as fill_color # # As well as any option accepted by text_box # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do text "This is the first page!" 10.times do start_new_page text "Here comes yet another page." end string = "page of " # Green page numbers 1 to 7 options = { :at => [bounds.right - 150, 0], :width => 150, :align => :right, :page_filter => (1..7), :start_count_at => 1, :color => "007700" } number_pages string, options # Gray page numbers from 8 on up options[:page_filter] = lambda{ |pg| pg > 7} options[:start_count_at] = 8 options[:color] = "333333" number_pages string, options start_new_page text "See. This page isn't numbered and doesn't count towards the total." end ruby-prawn-1.0.0~rc2.orig/manual/outline/0000755000000000000000000000000012114176157017021 5ustar rootrootruby-prawn-1.0.0~rc2.orig/manual/outline/outline.rb0000644000000000000000000000162012114176157021024 0ustar rootroot# encoding: utf-8 # # Examples for defining the document outline. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) Prawn::Example.generate("outline.pdf", :page_size => "FOLIO") do package "outline" do |p| p.section "Basics" do |s| s.example "sections_and_pages", :eval_source => false end p.section "Adding nodes later" do |s| s.example "add_subsection_to", :eval_source => false s.example "insert_section_after", :eval_source => false end p.intro do prose("The outline of a PDF document is the table of contents tab you see to the right or left of your PDF viewer. The examples include:") list( "How to define sections and pages", "How to insert sections and/or pages to a previously defined outline structure" ) end end end ruby-prawn-1.0.0~rc2.orig/manual/outline/add_subsection_to.rb0000644000000000000000000000410712114176157023040 0ustar rootroot# encoding: utf-8 # # We have already seen how to define an outline tree sequentially. # # If you'd like to add nodes to the middle of an outline tree the # add_subsection_to may help you. # # It allows you to insert sections to the outline tree at any point. Just # provide the title of the parent section, the # position you want the new subsection to be inserted # :first or :last (defaults to :last) # and a block to declare the subsection. # # The add_subsection_to block doesn't necessarily create new # sections, it may also create new pages. # # If the parent title provided is the title of a page. The page will be # converted into a section to receive the subsection created. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do # First we create 10 pages and some default outline (1..10).each do |index| text "Page #{index}" start_new_page end outline.define do section("Section 1", :destination => 1) do page :title => "Page 2", :destination => 2 page :title => "Page 3", :destination => 3 end end # Now we will start adding nodes to the previous outline outline.add_subsection_to("Section 1", :first) do outline.section("Added later - first position") do outline.page :title => "Page 4", :destination => 4 outline.page :title => "Page 5", :destination => 5 end end outline.add_subsection_to("Section 1") do outline.page :title => "Added later - last position", :destination => 6 end outline.add_subsection_to("Added later - first position") do outline.page :title => "Another page added later", :destination => 7 end # The title provided is for a page which will be converted into a section outline.add_subsection_to("Page 3") do outline.page :title => "Last page added", :destination => 8 end end ruby-prawn-1.0.0~rc2.orig/manual/outline/sections_and_pages.rb0000644000000000000000000000472312114176157023204 0ustar rootroot# encoding: utf-8 # # The document outline tree is the set of links used to navigate through the # various document sections and pages. # # To define the document outline we first use the outline # method to lazily instantiate an outline object. Then we use the # define method with a block to start the outline tree. # # The basic methods for creating outline nodes are section and # page. The only difference between the two is that # page doesn't accept a block and will only create leaf nodes # while section accepts a block to create nested nodes. # # section accepts the title of the section and two options: # :destination - a page number to link and :closed - # a boolean value that defines if the nested outline nodes are shown when the # document is open (defaults to true). # # page is very similar to section. It requires a # :title option to be set and accepts a :destination. # # section and page may also be used without the # define method but they will need to instantiate the # outline object every time. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do # First we create 10 pages just to have something to link to (1..10).each do |index| text "Page #{index}" start_new_page end outline.define do section("Section 1", :destination => 1) do page :title => "Page 2", :destination => 2 page :title => "Page 3", :destination => 3 end section("Section 2", :destination => 4) do page :title => "Page 5", :destination => 5 section("Subsection 2.1", :destination => 6, :closed => true) do page :title => "Page 7", :destination => 7 end end end # Outside of the define block outline.section("Section 3", :destination => 8) do outline.page :title => "Page 9", :destination => 9 end outline.page :title => "Page 10", :destination => 10 # Section and Pages without links. While a section without a link may be # useful to group some pages, a page without a link is useless outline.update do # update is an alias to define section("Section without link") do page :title => "Page without link" end end end ruby-prawn-1.0.0~rc2.orig/manual/outline/insert_section_after.rb0000644000000000000000000000263012114176157023560 0ustar rootroot# encoding: utf-8 # # Another way to insert nodes into an existing outline is the # insert_section_after method. # # It accepts the title of the node that the new section will go after and a # block declaring the new section. # # As is the case with add_subsection_to the section added # doesn't need to be a section, it may be just a page. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do # First we create 10 pages and some default outline (1..10).each do |index| text "Page #{index}" start_new_page end outline.define do section("Section 1", :destination => 1) do page :title => "Page 2", :destination => 2 page :title => "Page 3", :destination => 3 end end # Now we will start adding nodes to the previous outline outline.insert_section_after("Page 2") do outline.section("Section after Page 2") do outline.page :title => "Page 4", :destination => 4 end end outline.insert_section_after("Section 1") do outline.section("Section after Section 1") do outline.page :title => "Page 5", :destination => 5 end end # Adding just a page outline.insert_section_after("Page 3") do outline.page :title => "Page after Page 3", :destination => 6 end end ruby-prawn-1.0.0~rc2.orig/manual/example_helper.rb0000644000000000000000000002774012114176157020673 0ustar rootroot# encoding: utf-8 # # Helper for organizing examples # $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) require 'prawn' require 'prawn/security' require 'prawn/layout' require 'enumerator' require File.expand_path(File.join(File.dirname(__FILE__), 'example_file')) require File.expand_path(File.join(File.dirname(__FILE__), 'example_section')) require File.expand_path(File.join(File.dirname(__FILE__), 'example_package')) require File.expand_path(File.join(File.dirname(__FILE__), 'syntax_highlight')) Prawn.debug = true module Prawn # The Prawn::Example class holds all the helper methods used to generate the # Prawn by example manual. # # The overall structure is to have single example files grouped by package # folders. Each package has a package builder file (with the same name as the # package folder) that defines the inner structure of subsections and # examples. The manual is then built by loading all the packages and some # standalone pages. # # To see one of the examples check manual/basic_concepts/cursor.rb # # To see one of the package builders check # manual/basic_concepts/basic_concepts.rb # # To see how the manual is built check manual/manual/manual.rb (Yes that's a # whole load of manuals) # class Example < Prawn::Document # Values used for the manual design: # This is the default value for the margin box # BOX_MARGIN = 36 # Additional indentation to keep the line measure with a reasonable size # INNER_MARGIN = 30 # Vertical Rhythm settings # RHYTHM = 10 LEADING = 2 # Colors # BLACK = "000000" LIGHT_GRAY = "F2F2F2" GRAY = "DDDDDD" DARK_GRAY = "333333" BROWN = "A4441C" ORANGE = "F28157" LIGHT_GOLD = "FBFBBE" DARK_GOLD = "EBE389" BLUE = "0000D0" # Used to generate the url for the example files # MANUAL_URL = "http://github.com/prawnpdf/prawn/tree/master/manual" # Loads a package. Used on the manual. # def load_package(package) load_file(package, package) end # Loads a page with outline support. Used on the manual. # def load_page(page) load_file("manual", page) outline.define do section(page.gsub("_", " ").capitalize, :destination => page_number) end end # Opens a file in a given package and evals the source # def load_file(package, file) start_new_page example = ExampleFile.new(package, "#{file}.rb") eval example.generate_block_source end # Creates a new ExamplePackage object and yields it to a block in order for # it to be populated with examples, sections and some introduction text. # Used on the package files. # def package(package, &block) ep = ExamplePackage.new(package) ep.instance_eval(&block) ep.render(self) end # Renders an ExamplePackage cover page. # # Starts a new page and renders the package introduction text. # def render_package_cover(package) header(package.name) instance_eval &(package.intro_block) outline.define do section(package.name, :destination => page_number, :closed => true) end end # Add the ExampleSection to the document outline within the appropriate # package. # def render_section(section) outline.add_subsection_to(section.package_name) do outline.section(section.name, :closed => true) end end # Renders an ExampleFile. # # Starts a new page and renders an introductory text, the example source and # evaluates the example source inline whenever that is appropriate according # to the ExampleFile directives. # def render_example(example) start_new_page outline.add_subsection_to(example.parent_name) do outline.page(:destination => page_number, :title => example.name) end example_header(example.parent_folder_name, example.filename) prose(example.introduction_text) code(example.source) if example.eval? eval_code(example.source) else source_link(example) end reset_settings end # Render the example header. Used on the example pages of the manual # def example_header(package, example) header_box do register_fonts font('DejaVu', :size => 18) do formatted_text([ { :text => package, :color => BROWN }, { :text => "/", :color => BROWN }, { :text => example, :color => ORANGE } ], :valign => :center) end end end # Register fonts used on the manual # def register_fonts kai_file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf" font_families["Kai"] = { :normal => { :file => kai_file, :font => "Kai" } } dejavu_file = "#{Prawn::DATADIR}/fonts/DejaVuSans.ttf" font_families["DejaVu"] = { :normal => { :file => dejavu_file, :font => "DejaVu" } } end # Render a block of text after processing code tags and URLs to be used with # the inline_format option. # # Used on the introducory text for example pages of the manual and on # package pages intro # def prose(str) # Process the tags str.gsub!(/([^<]+?)<\/code>/, "\\1<\/b><\/font>") # Process the links str.gsub!(/(https?:\/\/\S+)/, "\\1") inner_box do font("Helvetica", :size => 11) do str.split(/\n\n+/).each do |paragraph| text(paragraph.gsub(/\s+/," "), :align => :justify, :inline_format => true, :leading => LEADING, :color => DARK_GRAY) move_down(RHYTHM) end end end move_down(RHYTHM) end # Render a code block. Used on the example pages of the manual # def code(str) pre_text = str.gsub(' ', Prawn::Text::NBSP) pre_text = ::CodeRay.scan(pre_text, :ruby).to_prawn font('Courier', :size => 9.5) do colored_box(pre_text, :fill_color => DARK_GRAY) end end # Renders a dashed line and evaluates the code inline # def eval_code(source) move_down(RHYTHM) dash(3) stroke_color(BROWN) stroke_horizontal_line(-BOX_MARGIN, bounds.width + BOX_MARGIN) stroke_color(BLACK) undash move_down(RHYTHM*3) begin eval(source) rescue => e puts "Error evaluating example: #{e.message}" puts puts "---- Source: ----" puts source end end # Renders a box with the link for the example file # def source_link(example) url = "#{MANUAL_URL}/#{example.parent_folder_name}/#{example.filename}" reason = [{ :text => "This code snippet was not evaluated inline. " + "You may see its output by running the " + "example file located here:\n", :color => DARK_GRAY }, { :text => url, :color => BLUE, :link => url} ] font('Helvetica', :size => 9) do colored_box(reason, :fill_color => LIGHT_GOLD, :stroke_color => DARK_GOLD, :leading => LEADING*3) end end # Render a page header. Used on the manual lone pages and package # introductory pages # def header(str) header_box do register_fonts font('DejaVu', :size => 24) do text(str, :color => BROWN, :valign => :center) end end end # Render the arguments as a bulleted list. Used on the manual package # introductory pages # def list(*items) move_up(RHYTHM) inner_box do font("Helvetica", :size => 11) do items.each do |li| float { text("•", :color => DARK_GRAY) } indent(RHYTHM) do text(li.gsub(/\s+/," "), :inline_format => true, :color => DARK_GRAY, :leading => LEADING) end move_down(RHYTHM) end end end end # Renders the page-wide headers # def header_box(&block) bounding_box([-bounds.absolute_left, cursor + BOX_MARGIN], :width => bounds.absolute_left + bounds.absolute_right, :height => BOX_MARGIN*2 + RHYTHM*2) do fill_color LIGHT_GRAY fill_rectangle([bounds.left, bounds.top], bounds.right, bounds.top - bounds.bottom) fill_color BLACK indent(BOX_MARGIN + INNER_MARGIN, &block) end stroke_color GRAY stroke_horizontal_line(-BOX_MARGIN, bounds.width + BOX_MARGIN, :at => cursor) stroke_color BLACK move_down(RHYTHM*3) end # Renders a Bounding Box for the inner margin # def inner_box(&block) bounding_box([INNER_MARGIN, cursor], :width => bounds.width - INNER_MARGIN*2, &block) end # Renders a Bounding Box with some background color and the formatted text # inside it # def colored_box(box_text, options={}) options = { :fill_color => DARK_GRAY, :stroke_color => nil, :text_color => LIGHT_GRAY, :leading => LEADING }.merge(options) register_fonts text_options = { :leading => options[:leading], :fallback_fonts => ["DejaVu", "Kai"] } box_height = height_of_formatted(box_text, text_options) bounding_box([INNER_MARGIN + RHYTHM, cursor], :width => bounds.width - (INNER_MARGIN+RHYTHM)*2) do fill_color options[:fill_color] stroke_color options[:stroke_color] || options[:fill_color] fill_and_stroke_rounded_rectangle( [bounds.left - RHYTHM, cursor], bounds.left + bounds.right + RHYTHM*2, box_height + RHYTHM*2, 5 ) fill_color BLACK stroke_color BLACK pad(RHYTHM) do formatted_text(box_text, text_options) end end move_down(RHYTHM*2) end # Draws X and Y axis rulers beginning at the margin box origin. Used on # examples. # def stroke_axis(options={}) options = { :height => (cursor - 20).to_i, :width => bounds.width.to_i }.merge(options) dash(1, :space => 4) stroke_horizontal_line(-21, options[:width], :at => 0) stroke_vertical_line(-21, options[:height], :at => 0) undash fill_circle [0, 0], 1 (100..options[:width]).step(100) do |point| fill_circle [point, 0], 1 draw_text point, :at => [point-5, -10], :size => 7 end (100..options[:height]).step(100) do |point| fill_circle [0, point], 1 draw_text point, :at => [-17, point-2], :size => 7 end end # Reset some of the Prawn settings including graphics and text to their # defaults. # # Used after rendering examples so that each new example starts with a clean # slate. # def reset_settings # Text settings font("Helvetica", :size => 12) default_leading 0 self.text_direction = :ltr # Graphics settings self.line_width = 1 self.cap_style = :butt self.join_style = :miter undash fill_color BLACK stroke_color BLACK end end end ruby-prawn-1.0.0~rc2.orig/manual/example_package.rb0000644000000000000000000000246312114176157021002 0ustar rootroot# encoding: utf-8 module Prawn # The Prawn::ExamplePackage class is a utility class to handle the packaging # of individual examples within a hierarchy when building the manual # class ExamplePackage attr_reader :intro_block, :folder_name def initialize(folder_name) @folder_name = folder_name @hierarchy = [] end # Stores a new ExampleSection in the hierarchy and yields it to a block # def section(name) s = ExampleSection.new(self, name) yield s @hierarchy << s end # Stores a new ExampleFile in the hierarchy # def example(filename, options={}) @hierarchy << ExampleFile.new(self, "#{filename}.rb", options) end # Stores a block with code to be evaluated when rendering the package cover # def intro(&block) @intro_block = block end # Returns a human friendly version of the package name # def name @name ||= @folder_name.gsub("_", " ").capitalize end # Renders a cover page for the package to a pdf and iterates the examples # hierarchy delegating the examples and sections to be rendered as well # def render(pdf) pdf.render_package_cover(self) @hierarchy.each do |node| node.render(pdf) end end end end ruby-prawn-1.0.0~rc2.orig/manual/table/0000755000000000000000000000000012114176157016431 5ustar rootrootruby-prawn-1.0.0~rc2.orig/manual/table/row_colors.rb0000644000000000000000000000116612114176157021152 0ustar rootroot# encoding: utf-8 # # One of the most common table styling techniques is to stripe the rows with # alternating colors. # # There is one helper just for that. Just provide the :row_colors # option an array with color values. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do data = [["This row should have one color"], ["And this row should have another"]] data += [["..."]] * 10 table(data, :row_colors => ["F0F0F0", "FFFFCC"]) end ruby-prawn-1.0.0~rc2.orig/manual/table/cell_text.rb0000644000000000000000000000272712114176157020751 0ustar rootroot# encoding: utf-8 # # Text cells accept the following options: align, # font, font_style, inline_format, # kerning, leading, min_font_size, # overflow, rotate, rotate_around, # single_line, size, text_color, # and valign. # # Most of these style options are direct translations from the text methods # styling options. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do data = [ ["Look at how the cells will look when styled", "", ""], ["They probably won't look the same", "", ""] ] table data, :cell_style => { :font => "Times-Roman", :font_style => :italic } move_down 20 table data, :cell_style => { :size => 18, :text_color => "346842" } move_down 20 table [["Just some inline", "", ""], ["styles being applied here", "", ""]], :cell_style => { :inline_format => true } move_down 20 table [["1", "2", "3", "rotate"]], :cell_style => { :rotate => 30 } move_down 20 table data, :cell_style => { :overflow => :shrink_to_fit, :min_font_size => 8, :width => 60, :height => 30 } end ruby-prawn-1.0.0~rc2.orig/manual/table/table.rb0000644000000000000000000000270012114176157020044 0ustar rootroot# encoding: utf-8 # # Examples for tables. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) Prawn::Example.generate("table.pdf", :page_size => "FOLIO") do package "table" do |p| p.section "Basics" do |s| s.example "creation" s.example "content_and_subtables" s.example "flow_and_header" s.example "position" end p.section "Styling" do |s| s.example "column_widths" s.example "width" s.example "row_colors" s.example "cell_dimensions" s.example "cell_borders_and_bg" s.example "cell_border_lines" s.example "cell_text" s.example "image_cells" s.example "span" s.example "before_rendering_page" end p.section "Initializer Block" do |s| s.example "basic_block" s.example "filtering" s.example "style" end p.intro do prose("Prawn comes with table support out of the box. Tables can be styled in whatever way you see fit. The whole table, rows, columns and cells can be styled independently from each other. The examples show:") list( "How to create tables", "What content can be placed on tables", "Subtables (or tables within tables)", "How to style the whole table", "How to use initializer blocks to style only specific portions of the table" ) end end end ruby-prawn-1.0.0~rc2.orig/manual/table/before_rendering_page.rb0000644000000000000000000000171012114176157023250 0ustar rootroot# encoding: utf-8 # # Prawn::Table#initialize takes a # :before_rendering_page argument, to adjust the way an entire page # of table cells is styled. This allows you to do things like draw a border # around the entire table as displayed on a page. # # The callback is passed a Cells object that is numbered based on the order of # the cells on the page (e.g., the first row on the page is # cells.row(0)). # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do table([["foo", "bar", "baz"]] * 40) do |t| t.cells.border_width = 1 t.before_rendering_page do |page| page.row(0).border_top_width = 3 page.row(-1).border_bottom_width = 3 page.column(0).border_left_width = 3 page.column(-1).border_right_width = 3 end end end ruby-prawn-1.0.0~rc2.orig/manual/table/content_and_subtables.rb0000644000000000000000000000271112114176157023317 0ustar rootroot# encoding: utf-8 # # There are five kinds of objects which can be put in table cells: # 1. String: produces a text cell (the most common usage) # 2. Prawn::Table::Cell # 3. Prawn::Table # 4. Array # 5. Images # # Whenever a table or an array is provided as a cell, a subtable will be created # (a table within a cell). # # If you'd like to provide a cell or table directly, the best way is to # use the make_cell and make_table methods as they # don't call draw on the created object. # # To insert an image just provide a hash with an with an :image key # pointing to the image path. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do cell_1 = make_cell(:content => "this row content comes directly ") cell_2 = make_cell(:content => "from cell objects") two_dimensional_array = [ ["..."], ["subtable from an array"], ["..."] ] my_table = make_table([ ["..."], ["subtable from another table"], ["..."] ]) image_path = "#{Prawn::DATADIR}/images/stef.jpg" table([ ["just a regular row", "", "", "blah blah blah"], [cell_1, cell_2, "", ""], ["", "", two_dimensional_array, ""], ["just another regular row", "", "", ""], [{:image => image_path}, "", my_table, ""]]) end ruby-prawn-1.0.0~rc2.orig/manual/table/basic_block.rb0000644000000000000000000000406612114176157021217 0ustar rootroot# encoding: utf-8 # # All of the previous styling options we've seen deal with all the table cells # at once. # # With initializer blocks we may deal with specific cells. # A block passed to one of the table methods (Prawn::Table.new, # Prawn::Document#table, Prawn::Document#make_table) # will be called after cell setup but before layout. This is a very flexible way # to specify styling and layout constraints. # # Just like the Prawn::Document.generate method, the table # initializer blocks may be used with and without a block argument. # # The table class has three methods that are handy within an initializer block: # cells, rows and columns. All three # return an instance of Prawn::Table::Cells which represents # a selection of cells. # # cells return all the table cells, while rows and # columns accept a number or a range as argument which returns a # single row/column or a range of rows/columns respectively. (rows # and columns are also aliased as row and # column) # # The Prawn::Table::Cells class also defines rows and # columns so they may be chained to narrow the selection of cells. # # All of the cell styling options we've seen on previous examples may be set as # properties of the selection of cells. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do data = [ ["Header", "A " * 5, "B"], ["Data row", "C", "D " * 5], ["Another data row", "E", "F"]] table(data) do cells.padding = 12 cells.borders = [] row(0).borders = [:bottom] row(0).border_width = 2 row(0).font_style = :bold columns(0..1).borders = [:right] row(0).columns(0..1).borders = [:bottom, :right] end end ruby-prawn-1.0.0~rc2.orig/manual/table/filtering.rb0000644000000000000000000000203012114176157020734 0ustar rootroot# encoding: utf-8 # # Another way to reduce the number of cells is to filter the table. # # filter is just like Enumerable#select. Pass it a # block and it will iterate through the cells returning a new # Prawn::Table::Cells instance containing only those cells for # which the block was not false. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do data = [ ["Item", "Jan Sales", "Feb Sales"], ["Oven", 17, 89], ["Fridge", 62, 30], ["Microwave", 71, 47] ] table(data) do values = cells.columns(1..-1).rows(1..-1) bad_sales = values.filter do |cell| cell.content.to_i < 40 end bad_sales.background_color = "FFAAAA" good_sales = values.filter do |cell| cell.content.to_i > 70 end good_sales.background_color = "AAFFAA" end end ruby-prawn-1.0.0~rc2.orig/manual/table/image_cells.rb0000644000000000000000000000271412114176157021226 0ustar rootroot# encoding: utf-8 # # Prawn can insert images into a table. Just pass a hash into # table() with an :image key pointing to the image. # # You can pass the :scale, :fit, # :position, and :vposition arguments in alongside # :image; these will function just as in image(). # # The :image_width and :image_height arguments set # the width/height of the image within the cell, as opposed to the # :width and :height arguments, which set the table # cell's dimensions. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do image = "#{Prawn::DATADIR}/images/prawn.png" table [ ["Standard image cell", {:image => image}], [":scale => 0.5", {:image => image, :scale => 0.5}], [":fit => [100, 200]", {:image => image, :fit => [100, 200]}], [":image_height => 50, :image_width => 100", {:image => image, :image_height => 50, :image_width => 100}], [":position => :center", {:image => image, :position => :center}], [":vposition => :center", {:image => image, :vposition => :center, :height => 200}] ], :width => bounds.width end ruby-prawn-1.0.0~rc2.orig/manual/table/cell_dimensions.rb0000644000000000000000000000225112114176157022125 0ustar rootroot# encoding: utf-8 # # To style all the table cells you can use the :cell_style option # with the table methods. It accepts a hash with the cell style options. # # Some straightforward options are width, height, # and padding. All three accept numeric values to set the property. # # padding also accepts a four number array that defines the padding # in a CSS like syntax setting the top, right, bottom, left sequentially. The # default is 5pt for all sides. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do data = [ ["Look at how the cells will look when styled", "", ""], ["They probably won't look the same", "", ""] ] {:width => 160, :height => 50, :padding => 12}.each do |property, value| text "Cell's #{property}: #{value}" table(data, :cell_style => {property => value}) move_down 20 end text "Padding can also be set with an array: [0, 0, 0, 30]" table(data, :cell_style => {:padding => [0, 0, 0, 30]}) end ruby-prawn-1.0.0~rc2.orig/manual/table/column_widths.rb0000644000000000000000000000213312114176157021634 0ustar rootroot# encoding: utf-8 # # Prawn will make its best attempt to identify the best width for the columns. # If the end result isn't good, we can override it with some styling. # # Individual column widths can be set with the :column_widths # option. Just provide an array with the sequential width values for the columns # or a hash were each key-value pair represents the column 0-based index and its # width. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do data = [ ["this is not quite as long as the others", "here we have a line that is long but with smaller words", "this is so very looooooooooooooooooooooooooooooong"] ] text "Prawn trying to guess the column widths" table(data) move_down 20 text "Manually setting all the column widths" table(data, :column_widths => [100, 200, 240]) move_down 20 text "Setting only the last column width" table(data, :column_widths => {2 => 240}) end ruby-prawn-1.0.0~rc2.orig/manual/table/span.rb0000644000000000000000000000244112114176157017720 0ustar rootroot# encoding: utf-8 # # Table cells can span multiple columns, rows, or both. When building a cell, # use the hash argument constructor with a :colspan and/or # :rowspan argument. Row or column spanning must be specified when # building the data array; you can't set the span in the table's initialization # block. This is because cells are laid out in the grid before that block is # called, so that references to row and column numbers make sense. # # Cells are laid out in the order given, skipping any positions spanned by # previously instantiated cells. Therefore, a cell with rowspan: 2 # will be missing at least one cell in the row below it. See the code and table # below for an example. # # It is illegal to overlap cells via spanning. A # Prawn::Errors::InvalidTableSpan error will be raised if spans # would cause cells to overlap. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do table([ ["A", {:content => "2x1", :colspan => 2}, "B"], [{:content => "1x2", :rowspan => 2}, "C", "D", "E"], [{:content => "2x2", :colspan => 2, :rowspan => 2}, "F"], ["G", "H"] ]) end ruby-prawn-1.0.0~rc2.orig/manual/table/style.rb0000644000000000000000000000137712114176157020126 0ustar rootroot# encoding: utf-8 # # We've seen how to apply styles to a selection of cells by setting the # individual properties. Another option is to use the style method # # style lets us define multiple properties at once with a hash. It # also accepts a block that will be called for each cell and can be used for # some complex styling. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do table([[""] * 8] * 8) do cells.style(:width => 24, :height => 24) cells.style do |c| c.background_color = ((c.row + c.column) % 2).zero? ? '000000' : 'ffffff' end end end ruby-prawn-1.0.0~rc2.orig/manual/table/position.rb0000644000000000000000000000153112114176157020622 0ustar rootroot# encoding: utf-8 # # The table() method accepts a :position argument to # determine horizontal position of the table within its bounding box. It can be # :left (the default), :center, :right, # or a number specifying a distance in PDF points from the left side. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do data = [["The quick brown fox jumped over the lazy dogs."]] * 2 text "Left:" table data, :position => :left move_down 10 text "Center:" table data, :position => :center move_down 10 text "Right:" table data, :position => :right move_down 10 text "100pt:" table data, :position => 100 end ruby-prawn-1.0.0~rc2.orig/manual/table/creation.rb0000644000000000000000000000214512114176157020564 0ustar rootroot# encoding: utf-8 # # Creating tables with Prawn is fairly easy. There are two methods that will # create tables for us table and make_table. # # Both are wrappers that create a new Prawn::Table object. The # difference is that table calls the draw method # after creating the table and make_table only returns the created # table, so you have to call the draw method yourself. # # The most simple table can be created by providing only an array of arrays # containing your data where each inner array represents one row. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do t = make_table([ ["this is the first row"], ["this is the second row"] ]) t.draw move_down 20 table([ ["short", "short", "loooooooooooooooooooong"], ["short", "loooooooooooooooooooong", "short"], ["loooooooooooooooooooong", "short", "short"] ]) end ruby-prawn-1.0.0~rc2.orig/manual/table/width.rb0000644000000000000000000000143312114176157020076 0ustar rootroot# encoding: utf-8 # # The default table width depends on the content provided. It will expand up # to the current bounding box width to fit the content. If you want the table to # have a fixed width no matter the content you may use the :width # option to manually set the width. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do text "Normal width:" table [%w[A B C]] move_down 20 text "Fixed width:" table([%w[A B C]], :width => 300) move_down 20 text "Normal width:" table([["A", "Blah " * 20, "C"]]) move_down 20 text "Fixed width:" table([["A", "Blah " * 20, "C"]], :width => 300) end ruby-prawn-1.0.0~rc2.orig/manual/table/cell_border_lines.rb0000644000000000000000000000155212114176157022427 0ustar rootroot# encoding: utf-8 # # The border_lines option accepts an array with the styles of the # border sides. The default is [:solid, :solid, :solid, :solid]. # # border_lines must be set to an array. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do data = [ ["Look at how the cell border lines can be mixed", "", ""], ["dotted top border", "", ""], ["solid right border", "", ""], ["dotted bottom border", "", ""], ["dashed left border", "", ""] ] text "Cell :border_lines => [:dotted, :solid, :dotted, :dashed]" table(data, :cell_style => { :border_lines => [:dotted, :solid, :dotted, :dashed] }) end ruby-prawn-1.0.0~rc2.orig/manual/table/cell_borders_and_bg.rb0000644000000000000000000000204712114176157022712 0ustar rootroot# encoding: utf-8 # # The borders option accepts an array with the border sides that # will be drawn. The default is [:top, :bottom, :left, :right]. # # border_width may be set with a numeric value. # # Both border_color and background_color accept an # HTML like RGB color string ("FF0000") # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do data = [ ["Look at how the cells will look when styled", "", ""], ["They probably won't look the same", "", ""] ] { :borders => [:top, :left], :border_width => 3, :border_color => "FF0000"}.each do |property, value| text "Cell #{property}: #{value.inspect}" table(data, :cell_style => {property => value}) move_down 20 end text "Cell background_color: FFFFCC" table(data, :cell_style => {:background_color => "FFFFCC"}) end ruby-prawn-1.0.0~rc2.orig/manual/table/flow_and_header.rb0000644000000000000000000000115012114176157022054 0ustar rootroot# encoding: utf-8 # # If the table cannot fit on the current page it will flow to the next page just # like free flowing text. If you would like to have the first row treated as a # header which will be repeated on subsequent pages set the :header # option to true. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do data = [["This row should be repeated on every new page"]] data += [["..."]] * 30 table(data, :header => true) end ruby-prawn-1.0.0~rc2.orig/manual/images/0000755000000000000000000000000012114176157016607 5ustar rootrootruby-prawn-1.0.0~rc2.orig/manual/images/absolute_position.rb0000644000000000000000000000161212114176157022676 0ustar rootroot# encoding: utf-8 # # One of the options that the image method accepts is # :at. If you've read some of the graphics examples you are # probably already familiar with it. Just provide it the upper-left corner where # you want the image placed. # # While sometimes useful this option won't be practical. Notice that the cursor # won't be moved after the image is rendered and there is nothing forbidding the # text to overlap with the image. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do y_position = cursor text "The image won't go below this line of text." image "#{Prawn::DATADIR}/images/fractal.jpg", :at => [200, y_position] text "And this line of text will go just below the previous one." end ruby-prawn-1.0.0~rc2.orig/manual/images/width_and_height.rb0000644000000000000000000000157712114176157022437 0ustar rootroot# encoding: utf-8 # # The image size can be set with the :width and # :height options. # # If only one of those is provided, the image will be scaled proportionally. # When both are provided, the image will be stretched to fit the dimensions # without maintaining the aspect ratio. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do text "Scale by setting only the width" image "#{Prawn::DATADIR}/images/pigs.jpg", :width => 150 move_down 20 text "Scale by setting only the height" image "#{Prawn::DATADIR}/images/pigs.jpg", :height => 100 move_down 20 text "Stretch to fit the width and height provided" image "#{Prawn::DATADIR}/images/pigs.jpg", :width => 500, :height => 100 end ruby-prawn-1.0.0~rc2.orig/manual/images/images.rb0000644000000000000000000000175212114176157020406 0ustar rootroot# encoding: utf-8 # # Examples for embedding images. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) Prawn::Example.generate("images.pdf", :page_size => "FOLIO") do package "images" do |p| p.section "Basics" do |s| s.example "plain_image" s.example "absolute_position" end p.section "Relative Positioning" do |s| s.example "horizontal" s.example "vertical" end p.section "Size" do |s| s.example "width_and_height" s.example "scale" s.example "fit" end p.intro do prose("Embedding images on PDF documents is fairly easy. Prawn supports both JPG and PNG images. The examples show:") list( "How to add an image to a page", "How place the image on a specific position", "How to configure the image dimensions by setting the width and height or by scaling it" ) end end end ruby-prawn-1.0.0~rc2.orig/manual/images/scale.rb0000644000000000000000000000116112114176157020222 0ustar rootroot# encoding: utf-8 # # To scale an image use the :scale option. # # It scales the image proportionally given the provided value. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do text "Normal size" image "#{Prawn::DATADIR}/images/stef.jpg" move_down 20 text "Scaled to 50%" image "#{Prawn::DATADIR}/images/stef.jpg", :scale => 0.5 move_down 20 text "Scaled to 200%" image "#{Prawn::DATADIR}/images/stef.jpg", :scale => 2 end ruby-prawn-1.0.0~rc2.orig/manual/images/horizontal.rb0000644000000000000000000000164212114176157021330 0ustar rootroot# encoding: utf-8 # # The image may be positioned relatively to the current bounding box. The # horizontal position may be set with the :position option. # # It may be :left, :center, :right or a # number representing an x-offset from the left boundary. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do bounding_box([50, cursor], :width => 400, :height => 450) do stroke_bounds [:left, :center, :right].each do |position| text "Image aligned to the #{position}." image "#{Prawn::DATADIR}/images/stef.jpg", :position => position end text "The next image has a 50 point offset from the left boundary" image "#{Prawn::DATADIR}/images/stef.jpg", :position => 50 end end ruby-prawn-1.0.0~rc2.orig/manual/images/vertical.rb0000644000000000000000000000213712114176157020750 0ustar rootroot# encoding: utf-8 # # To set the vertical position of an image use the :vposition # option. # # It may be :top, :center, :bottom or a # number representing the y-offset from the top boundary. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do bounding_box([0, cursor], :width => 500, :height => 450) do stroke_bounds [:top, :center, :bottom].each do |vposition| text "Image vertically aligned to the #{vposition}.", :valign => vposition image "#{Prawn::DATADIR}/images/stef.jpg", :position => 250, :vposition => vposition end text_box "The next image has a 100 point offset from the top boundary", :at => [bounds.width - 110, bounds.top - 10], :width => 100 image "#{Prawn::DATADIR}/images/stef.jpg", :position => :right, :vposition => 100 end end ruby-prawn-1.0.0~rc2.orig/manual/images/plain_image.rb0000644000000000000000000000130512114176157021400 0ustar rootroot# encoding: utf-8 # # To embed images onto your PDF file use the image method. # It accepts the file path of the image to be loaded and some optional # arguments. # # If only the image path is provided the image will be rendered starting on # the cursor position. No manipulation is done with the image even if it doesn't # fit entirely on the page like the following snippet. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do text "The image will go right below this line of text." image "#{Prawn::DATADIR}/images/pigs.jpg" end ruby-prawn-1.0.0~rc2.orig/manual/images/fit.rb0000644000000000000000000000121312114176157017713 0ustar rootroot# encoding: utf-8 # # :fit option is useful when you want the image to have the # maximum size within a container preserving the aspect ratio without # overlapping. # # Just provide the container width and height pair. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do size = 300 text "Using the fit option" bounding_box([0, cursor], :width => size, :height => size) do image "#{Prawn::DATADIR}/images/pigs.jpg", :fit => [size, size] stroke_bounds end end ruby-prawn-1.0.0~rc2.orig/manual/layout/0000755000000000000000000000000012114176157016657 5ustar rootrootruby-prawn-1.0.0~rc2.orig/manual/layout/simple_grid.rb0000644000000000000000000000167212114176157021510 0ustar rootroot# encoding: utf-8 # # The document grid on Prawn is just a table-like structure with a defined # number of rows and columns. There are some helpers to create boxes of content # based on the grid coordinates. # # define_grid accepts the following options which are pretty much # self-explanatory: :rows, :columns, # :gutter, :row_gutter, :column_gutter # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do # The grid only need to be defined once, but since all the examples should be # able to run alone we are repeating it on every example define_grid(:columns => 5, :rows => 8, :gutter => 10) text "We defined the grid, roll over to the next page to see its outline" start_new_page grid.show_all end ruby-prawn-1.0.0~rc2.orig/manual/layout/layout.rb0000644000000000000000000000125712114176157020526 0ustar rootroot# encoding: utf-8 # # Examples for using grid layouts. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) Prawn::Example.generate("layout.pdf", :page_size => "FOLIO") do package "layout" do |p| p.example "simple_grid" p.example "boxes" p.example "content" p.intro do prose("Prawn has support for two-dimensional grid based layouts out of the box. The examples show:") list( "How to define the document grid", "How to configure the grid rows and columns gutters", "How to create boxes according to the grid" ) end end end ruby-prawn-1.0.0~rc2.orig/manual/layout/boxes.rb0000644000000000000000000000172112114176157020325 0ustar rootroot# encoding: utf-8 # # After defined the grid is there but nothing happens. To start taking effect # we need to use the grid boxes. # # grid has three different return values based on the arguments # received. With no arguments it will return the grid itself. With integers it # will return the grid box at those indices. With two arrays it will return a # multi-box spanning the region of the two grid boxes at the arrays indices. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do # The grid only need to be defined once, but since all the examples should be # able to run alone we are repeating it on every example define_grid(:columns => 5, :rows => 8, :gutter => 10) grid(4,0).show grid(5,1).show grid([6,2], [7,3]).show grid([4,4], [7,4]).show grid([7,0], [7,1]).show end ruby-prawn-1.0.0~rc2.orig/manual/layout/content.rb0000644000000000000000000000152712114176157020663 0ustar rootroot# encoding: utf-8 # # Now that we know how to access the boxes we might as well add some content # to them. # # This can be done by taping into the bounding box for a given grid box or # multi-box with the bounding_box method. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::Example.generate(filename) do # The grid only need to be defined once, but since all the examples should be # able to run alone we are repeating it on every example define_grid(:columns => 5, :rows => 8, :gutter => 10) grid([5,0], [7,1]).bounding_box do text "Adding some content to this multi_box.\n" + " _ " * 200 end grid(6,3).bounding_box do text "Just a little snippet here.\n" + " _ " * 10 end end ruby-prawn-1.0.0~rc2.orig/.rspec0000644000000000000000000000001012114176157015171 0ustar rootroot--color ruby-prawn-1.0.0~rc2.orig/lib/0000755000000000000000000000000012114176157014633 5ustar rootrootruby-prawn-1.0.0~rc2.orig/lib/prawn/0000755000000000000000000000000012114176157015762 5ustar rootrootruby-prawn-1.0.0~rc2.orig/lib/prawn/outline.rb0000644000000000000000000002751112114176157017774 0ustar rootroot# encoding: utf-8 # # generates outline dictionary and items for document # # Author Jonathan Greenberg require 'forwardable' module Prawn class Document # Lazily instantiates an Outline object for document. This is used as point of entry # to methods to build the outline tree. def outline @outline ||= Outline.new(self) end end # The Outline class organizes the outline tree items for the document. # Note that the prev and parent instance variables are adjusted while navigating # through the nested blocks. These variables along with the presence or absense # of blocks are the primary means by which the relations for the various # OutlineItems and the OutlineRoot are set. Unfortunately, the best way to # understand how this works is to follow the method calls through a real example. # # Some ideas for the organization of this class were gleaned from name_tree. In # particular the way in which the OutlineItems are finally rendered into document # objects in PdfObject through a hash. # class Outline extend Forwardable def_delegator :@document, :page_number attr_accessor :parent attr_accessor :prev attr_accessor :document attr_accessor :items def initialize(document) @document = document @parent = root @prev = nil @items = {} end # Defines/Updates an outline for the document. # The outline is an optional nested index that appears on the side of a PDF # document usually with direct links to pages. The outline DSL is defined by nested # blocks involving two methods: section and page; see the documentation on those methods # for their arguments and options. Note that one can also use outline#update # to add more sections to the end of the outline tree using the same syntax and scope. # # The syntax is best illustrated with an example: # # Prawn::Document.generate(outlined_document.pdf) do # text "Page 1. This is the first Chapter. " # start_new_page # text "Page 2. More in the first Chapter. " # start_new_page # outline.define do # section 'Chapter 1', :destination => 1, :closed => true do # page :destination => 1, :title => 'Page 1' # page :destination => 2, :title => 'Page 2' # end # end # start_new_page do # outline.update do # section 'Chapter 2', :destination => 2, do # page :destination => 3, :title => 'Page 3' # end # end # end # def define(&block) instance_eval(&block) if block end alias :update :define # Inserts an outline section to the outline tree (see outline#define). # Although you will probably choose to exclusively use outline#define so # that your outline tree is contained and easy to manage, this method # gives you the option to insert sections to the outline tree at any point # during document generation. This method allows you to add a child subsection # to any other item at any level in the outline tree. # Currently the only way to locate the place of entry is with the title for the # item. If your title names are not unique consider using define_outline. # The method takes the following arguments: # title: a string that must match an outline title to add the subsection to # position: either :first or :last(the default) where the subsection will be placed relative # to other child elements. If you need to position your subsection in between # other elements then consider using #insert_section_after # block: uses the same DSL syntax as outline#define, for example: # # Consider using this method inside of outline.update if you want to have the outline object # to be scoped as self (see #insert_section_after example). # # go_to_page 2 # start_new_page # text "Inserted Page" # outline.add_subsection_to :title => 'Page 2', :first do # outline.page :destination => page_number, :title => "Inserted Page" # end # def add_subsection_to(title, position = :last, &block) @parent = items[title] raise Prawn::Errors::UnknownOutlineTitle, "\n No outline item with title: '#{title}' exists in the outline tree" unless @parent @prev = position == :first ? nil : @parent.data.last nxt = position == :first ? @parent.data.first : nil insert_section(nxt, &block) end # Inserts an outline section to the outline tree (see outline#define). # Although you will probably choose to exclusively use outline#define so # that your outline tree is contained and easy to manage, this method # gives you the option to insert sections to the outline tree at any point # during document generation. Unlike outline.add_section, this method allows # you to enter a section after any other item at any level in the outline tree. # Currently the only way to locate the place of entry is with the title for the # item. If your title names are not unique consider using define_outline. # The method takes the following arguments: # title: the title of other section or page to insert new section after # block: uses the same DSL syntax as outline#define, for example: # # go_to_page 2 # start_new_page # text "Inserted Page" # update_outline do # insert_section_after :title => 'Page 2' do # page :destination => page_number, :title => "Inserted Page" # end # end # def insert_section_after(title, &block) @prev = items[title] raise Prawn::Errors::UnknownOutlineTitle, "\n No outline item with title: '#{title}' exists in the outline tree" unless @prev @parent = @prev.data.parent nxt = @prev.data.next insert_section(nxt, &block) end # See outline#define above for documentation on how this is used in that context # # Adds an outine section to the outline tree. # Although you will probably choose to exclusively use outline#define so # that your outline tree is contained and easy to manage, this method # gives you the option to add sections to the outline tree at any point # during document generation. When not being called from within another #section block # the section will be added at the top level after the other root elements of the outline. # For more flexible placement try using outline#insert_section_after and/or # outline#add_subsection_to # Takes the following arguments: # title: the outline text that appears for the section. # options: destination - optional integer defining the page number for a destination link. # - currently only :FIT destination supported with link to top of page. # closed - whether the section should show its nested outline elements. # - defaults to false. # block: more nested subsections and/or page blocks # # example usage: # # outline.section 'Added Section', :destination => 3 do # outline.page :destionation => 3, :title => 'Page 3' # end def section(title, options = {}, &block) add_outline_item(title, options, &block) end # See Outline#define above for more documentation on how it is used in that context # # Adds a page to the outline. # Although you will probably choose to exclusively use outline#define so # that your outline tree is contained and easy to manage, this method also # gives you the option to add pages to the root of outline tree at any point # during document generation. Note that the page will be added at the # top level after the other root outline elements. For more flexible placement try # using outline#insert_section_after and/or outline#add_subsection_to. # # Takes the following arguments: # options: # title - REQUIRED. The outline text that appears for the page. # destination - integer defining the page number for the destination link. # currently only :FIT destination supported with link to top of page. # closed - whether the section should show its nested outline elements. # - defaults to false. # example usage: # # outline.page :title => "Very Last Page" # Note: this method is almost identical to section except that it does not accept a block # thereby defining the outline item as a leaf on the outline tree structure. def page(options = {}) if options[:title] title = options[:title] else raise Prawn::Errors::RequiredOption, "\nTitle is a required option for page" end add_outline_item(title, options) end private # The Outline dictionary (12.3.3) for this document. It is # lazily initialized, so that documents that do not have an outline # do not incur the additional overhead. def root document.state.store.root.data[:Outlines] ||= document.ref!(OutlineRoot.new) end def add_outline_item(title, options, &block) outline_item = create_outline_item(title, options) set_relations(outline_item) increase_count set_variables_for_block(outline_item, block) block.call if block reset_parent(outline_item) end def create_outline_item(title, options) outline_item = OutlineItem.new(title, parent, options) if options[:destination] page_index = options[:destination] - 1 outline_item.dest = [document.state.pages[page_index].dictionary, :Fit] end outline_item.prev = prev if @prev items[title] = document.ref!(outline_item) end def set_relations(outline_item) prev.data.next = outline_item if prev parent.data.first = outline_item unless prev parent.data.last = outline_item end def increase_count counting_parent = parent while counting_parent counting_parent.data.count += 1 if counting_parent == root counting_parent = nil else counting_parent = counting_parent.data.parent end end end def set_variables_for_block(outline_item, block) self.prev = block ? nil : outline_item self.parent = outline_item if block end def reset_parent(outline_item) if parent == outline_item self.prev = outline_item self.parent = outline_item.data.parent end end def insert_section(nxt, &block) last = @parent.data.last if block block.call end adjust_relations(nxt, last) reset_root_positioning end def adjust_relations(nxt, last) if nxt nxt.data.prev = @prev @prev.data.next = nxt @parent.data.last = last end end def reset_root_positioning @parent = root @prev = root.data.last end end class OutlineRoot #:nodoc: attr_accessor :count, :first, :last def initialize @count = 0 end def to_hash {:Type => :Outlines, :Count => count, :First => first, :Last => last} end end class OutlineItem #:nodoc: attr_accessor :count, :first, :last, :next, :prev, :parent, :title, :dest, :closed def initialize(title, parent, options) @closed = options[:closed] @title = title @parent = parent @count = 0 end def to_hash hash = { :Title => title, :Parent => parent, :Count => closed ? -count : count } [{:First => first}, {:Last => last}, {:Next => @next}, {:Prev => prev}, {:Dest => dest}].each do |h| unless h.values.first.nil? hash.merge!(h) end end hash end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/security.rb0000644000000000000000000002346612114176157020171 0ustar rootroot# encoding: utf-8 # # encryption.rb : Implements encrypted PDF and access permissions. # # Copyright August 2008, Brad Ediger. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. require 'digest/md5' require 'rc4' require 'prawn/core/byte_string' module Prawn class Document # Implements PDF encryption (password protection and permissions) as # specified in the PDF Reference, version 1.3, section 3.5 "Encryption". module Security include Prawn::Core # Encrypts the document, to protect confidential data or control # modifications to the document. The encryption algorithm used is # detailed in the PDF Reference 1.3, section 3.5 "Encryption", and it is # implemented by all major PDF readers. # # +options+ can contain the following: # # :user_password:: Password required to open the document. If # this is omitted or empty, no password will be # required. The document will still be # encrypted, but anyone can read it. # # :owner_password:: Password required to make modifications to # the document or change or override its # permissions. If this is set to # :random, a random password will be # used; this can be useful if you never want # users to be able to override the document # permissions. # # :permissions:: A hash mapping permission symbols (see below) to # true or false. True means # "permitted", and false means "not permitted". # All permissions default to true. # # The following permissions can be specified: # # :print_document:: Print document. # # :modify_contents:: Modify contents of document (other than text # annotations and interactive form fields). # # :copy_contents:: Copy text and graphics from document. # # :modify_annotations:: Add or modify text annotations and # interactive form fields. # # == Examples # # Deny printing to everyone, but allow anyone to open without a password: # # encrypt_document :permissions => { :print_document => false }, # :owner_password => :random # # Set a user and owner password on the document, with full permissions for # both the user and the owner: # # encrypt_document :user_password => 'foo', :owner_password => 'bar' # # Set no passwords, grant all permissions (This is useful because the # default in some readers, if no permissions are specified, is "deny"): # # encrypt_document # # == Caveats # # * The encryption used is weak; the key is password-derived and is # limited to 40 bits, due to US export controls in effect at the time # the PDF standard was written. # # * There is nothing technologically requiring PDF readers to respect the # permissions embedded in a document. Many PDF readers do not. # # * In short, you have no security at all against a moderately # motivated person. Don't use this for anything super-serious. This is # not a limitation of Prawn, but is rather a built-in limitation of the # PDF format. # def encrypt_document(options={}) Prawn.verify_options [:user_password, :owner_password, :permissions], options @user_password = options.delete(:user_password) || "" @owner_password = options.delete(:owner_password) || @user_password if @owner_password == :random # Generate a completely ridiculous password @owner_password = (1..32).map{ rand(256) }.pack("c*") end self.permissions = options.delete(:permissions) || {} # Shove the necessary entries in the trailer and enable encryption. state.trailer[:Encrypt] = encryption_dictionary state.encrypt = true state.encryption_key = user_encryption_key end # Encrypts the given string under the given key, also requiring the # object ID and generation number of the reference. # See Algorithm 3.1. def self.encrypt_string(str, key, id, gen) # Convert ID and Gen number into little-endian truncated byte strings id = [id].pack('V')[0,3] gen = [gen].pack('V')[0,2] extended_key = "#{key}#{id}#{gen}" # Compute the RC4 key from the extended key and perform the encryption rc4_key = Digest::MD5.digest(extended_key)[0, 10] RC4.new(rc4_key).encrypt(str) end private # Provides the values for the trailer encryption dictionary. def encryption_dictionary { :Filter => :Standard, # default PDF security handler :V => 1, # "Algorithm 3.1", PDF reference 1.3 :R => 2, # Revision 2 of the algorithm :O => ByteString.new(owner_password_hash), :U => ByteString.new(user_password_hash), :P => permissions_value } end # Flags in the permissions word, numbered as LSB = 1 PermissionsBits = { :print_document => 3, :modify_contents => 4, :copy_contents => 5, :modify_annotations => 6 } FullPermissions = 0b1111_1111_1111_1111_1111_1111_1111_1111 def permissions=(perms={}) @permissions ||= FullPermissions perms.each do |key, value| unless PermissionsBits[key] raise ArgumentError, "Unknown permission :#{key}. Valid options: " + PermissionsBits.keys.map { |k| k.inspect }.join(", ") end # 0-based bit number, from LSB bit_position = PermissionsBits[key] - 1 if value # set bit @permissions |= (1 << bit_position) else # clear bit @permissions &= ~(1 << bit_position) end end end def permissions_value @permissions || FullPermissions end PasswordPadding = "28BF4E5E4E758A4164004E56FFFA01082E2E00B6D0683E802F0CA9FE6453697A". scan(/../).map{|x| x.to_i(16)}.pack("c*") # Pads or truncates a password to 32 bytes as per Alg 3.2. def pad_password(password) password = password[0, 32] password + PasswordPadding[0, 32 - password.length] end def user_encryption_key @user_encryption_key ||= begin md5 = Digest::MD5.new md5 << pad_password(@user_password) md5 << owner_password_hash md5 << [permissions_value].pack("V") md5.digest[0, 5] end end # The O (owner) value in the encryption dictionary. Algorithm 3.3. def owner_password_hash @owner_password_hash ||= begin key = Digest::MD5.digest(pad_password(@owner_password))[0, 5] RC4.new(key).encrypt(pad_password(@user_password)) end end # The U (user) value in the encryption dictionary. Algorithm 3.4. def user_password_hash RC4.new(user_encryption_key).encrypt(PasswordPadding) end end end module Core #:nodoc: module_function # Like PdfObject, but returns an encrypted result if required. # For direct objects, requires the object identifier and generation number # from the indirect object referencing obj. def EncryptedPdfObject(obj, key, id, gen, in_content_stream=false) case obj when Array "[" << obj.map { |e| EncryptedPdfObject(e, key, id, gen, in_content_stream) }.join(' ') << "]" when LiteralString # FIXME: encrypted? obj = obj.gsub(/[\\\n\(\)]/) { |m| "\\#{m}" } "(#{obj})" when Time # FIXME: encrypted? obj = obj.strftime("D:%Y%m%d%H%M%S%z").chop.chop + "'00'" obj = obj.gsub(/[\\\n\(\)]/) { |m| "\\#{m}" } "(#{obj})" when String PdfObject( ByteString.new( Document::Security.encrypt_string(obj, key, id, gen)), in_content_stream) when Hash output = "<< " obj.each do |k,v| unless String === k || Symbol === k raise Prawn::Errors::FailedObjectConversion, "A PDF Dictionary must be keyed by names" end output << PdfObject(k.to_sym, in_content_stream) << " " << EncryptedPdfObject(v, key, id, gen, in_content_stream) << "\n" end output << ">>" when NameTree::Value PdfObject(obj.name) + " " + EncryptedPdfObject(obj.value, key, id, gen, in_content_stream) when Prawn::OutlineRoot, Prawn::OutlineItem EncryptedPdfObject(obj.to_hash, key, id, gen, in_content_stream) else # delegate back to PdfObject PdfObject(obj, in_content_stream) end end class Reference # Returns the object definition for the object this references, keyed from # +key+. def encrypted_object(key) @on_encode.call(self) if @on_encode output = "#{@identifier} #{gen} obj\n" << Prawn::Core::EncryptedPdfObject(data, key, @identifier, gen) << "\n" if @stream output << "stream\n" << Document::Security.encrypt_string(@stream, key, @identifier, gen) << "\nendstream\n" end output << "endobj\n" end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/table.rb0000644000000000000000000005150212114176157017401 0ustar rootroot# encoding: utf-8 # # table.rb: Table drawing functionality. # # Copyright December 2009, Brad Ediger. All rights reserved. # # This is free software. Please see the LICENSE and COPYING files for details. require 'prawn/table/cells' require 'prawn/table/cell' require 'prawn/table/cell/in_table' require 'prawn/table/cell/text' require 'prawn/table/cell/subtable' require 'prawn/table/cell/image' require 'prawn/table/cell/span_dummy' module Prawn class Document # Set up and draw a table on this document. A block can be given, which will # be run after cell setup but before layout and drawing. # # See the documentation on Prawn::Table for details on the arguments. # def table(data, options={}, &block) t = Table.new(data, self, options, &block) t.draw t end # Set up, but do not draw, a table. Useful for creating subtables to be # inserted into another Table. Call +draw+ on the resulting Table to ink it. # # See the documentation on Prawn::Table for details on the arguments. # def make_table(data, options={}, &block) Table.new(data, self, options, &block) end end # Next-generation table drawing for Prawn. # # = Data # # Data, for a Prawn table, is a two-dimensional array of objects that can be # converted to cells ("cellable" objects). Cellable objects can be: # # String:: # Produces a text cell. This is the most common usage. # Prawn::Table::Cell:: # If you have already built a Cell or have a custom subclass of Cell you # want to use in a table, you can pass through Cell objects. # Prawn::Table:: # Creates a subtable (a table within a cell). You can use # Prawn::Document#make_table to create a table for use as a subtable # without immediately drawing it. See examples/table/bill.rb for a # somewhat complex use of subtables. # Array:: # Creates a simple subtable. Create a Table object using make_table (see # above) if you need more control over the subtable's styling. # # = Options # # Prawn/Layout provides many options to control style and layout of your # table. These options are implemented with a uniform interface: the +:foo+ # option always sets the +foo=+ accessor. See the accessor and method # documentation for full details on the options you can pass. Some # highlights: # # +cell_style+:: # A hash of style options to style all cells. See the documentation on # Prawn::Table::Cell for all cell style options. # +header+:: # If set to +true+, the first row will be repeated on every page. The # header must be included as the first row of your data. Row numbering # (for styling and other row-specific options) always indexes based on # your data array. Whether or not you have a header, row(n) always refers # to the nth element (starting from 0) of the +data+ array. # +column_widths+:: # Sets widths for individual columns. Manually setting widths can give # better results than letting Prawn guess at them, as Prawn's algorithm # for defaulting widths is currently pretty boneheaded. If you experience # problems like weird column widths or CannotFit errors, try manually # setting widths on more columns. # +position+:: # Either :left (the default), :center, :right, or a number. Specifies the # horizontal position of the table within its bounding box. If a number is # provided, it specifies the distance in points from the left edge. # # = Initializer Block # # If a block is passed to methods that initialize a table # (Prawn::Table.new, Prawn::Document#table, Prawn::Document#make_table), it # will be called after cell setup but before layout. This is a very flexible # way to specify styling and layout constraints. This code sets up a table # where the second through the fourth rows (1-3, indexed from 0) are each one # inch (72 pt) wide: # # pdf.table(data) do |table| # table.rows(1..3).width = 72 # end # # As with Prawn::Document#initialize, if the block has no arguments, it will # be evaluated in the context of the object itself. The above code could be # rewritten as: # # pdf.table(data) do # rows(1..3).width = 72 # end # class Table # Set up a table on the given document. Arguments: # # +data+:: # A two-dimensional array of cell-like objects. See the "Data" section # above for the types of objects that can be put in a table. # +document+:: # The Prawn::Document instance on which to draw the table. # +options+:: # A hash of attributes and values for the table. See the "Options" block # above for details on available options. # def initialize(data, document, options={}, &block) @pdf = document @cells = make_cells(data) @header = false @epsilon = 1e-9 options.each { |k, v| send("#{k}=", v) } if block block.arity < 1 ? instance_eval(&block) : block[self] end set_column_widths set_row_heights position_cells end # Number of rows in the table. # attr_reader :row_length # Number of columns in the table. # attr_reader :column_length # Manually set the width of the table. # attr_writer :width # Position (:left, :right, :center, or a number indicating distance in # points from the left edge) of the table within its parent bounds. # attr_writer :position # Returns a Prawn::Table::Cells object representing all of the cells in # this table. # attr_reader :cells # Specify a callback to be called before each page of cells is rendered. # The block is passed a Cells object containing all cells to be rendered on # that page. You can change styling of the cells in this block, but keep in # mind that the cells have already been positioned and sized. # def before_rendering_page(&block) @before_rendering_page = block end # Returns the width of the table in PDF points. # def width @width ||= [natural_width, @pdf.bounds.width].min end # Sets column widths for the table. The argument can be one of the following # types: # # +Array+:: # [w0, w1, w2, ...] (specify a width for each column) # +Hash+:: # {0 => w0, 1 => w1, ...} (keys are column names, values are # widths) # +Numeric+:: # +72+ (sets width for all columns) # def column_widths=(widths) case widths when Array widths.each_with_index { |w, i| column(i).width = w } when Hash widths.each { |i, w| column(i).width = w } when Numeric cells.width = widths else raise ArgumentError, "cannot interpret column widths" end end # Returns the height of the table in PDF points. # def height cells.height end # If +true+, designates the first row as a header row to be repeated on # every page. Does not change row numbering -- row numbers always index into # the data array provided, with no modification. # attr_writer :header # Accepts an Array of alternating row colors to stripe the table. # attr_writer :row_colors # Sets styles for all cells. # # pdf.table(data, :cell_style => { :borders => [:left, :right] }) # def cell_style=(style_hash) cells.style(style_hash) end # Allows generic stylable content. This is an alternate syntax that some # prefer to the attribute-based syntax. This code using style: # # pdf.table(data) do # style(row(0), :background_color => 'ff00ff') # style(column(0)) { |c| c.border_width += 1 } # end # # is equivalent to: # # pdf.table(data) do # row(0).style :background_color => 'ff00ff' # column(0).style { |c| c.border_width += 1 } # end # def style(stylable, style_hash={}, &block) stylable.style(style_hash, &block) end # Draws the table onto the document at the document's current y-position. # def draw with_position do # The cell y-positions are based on an infinitely long canvas. The offset # keeps track of how much we have to add to the original, theoretical # y-position to get to the actual position on the current page. offset = @pdf.y # Reference bounds are the non-stretchy bounds used to decide when to # flow to a new column / page. ref_bounds = @pdf.reference_bounds last_y = @pdf.y # Determine whether we're at the top of the current bounds (margin box or # bounding box). If we're at the top, we couldn't gain any more room by # breaking to the next page -- this means, in particular, that if the # first row is taller than the margin box, we will only move to the next # page if we're below the top. Some floating-point tolerance is added to # the calculation. # # Note that we use the actual bounds, not the reference bounds. This is # because even if we are in a stretchy bounding box, flowing to the next # page will not buy us any space if we are at the top. if @pdf.y > @pdf.bounds.height + @pdf.bounds.absolute_bottom - 0.001 # we're at the top of our bounds started_new_page_at_row = 0 else started_new_page_at_row = -1 # If there isn't enough room left on the page to fit the first data row # (excluding the header), start the table on the next page. needed_height = row(0).height needed_height += row(1).height if @header if needed_height > @pdf.y - ref_bounds.absolute_bottom @pdf.bounds.move_past_bottom offset = @pdf.y started_new_page_at_row = 0 end end # Duplicate each cell of the header row into @header_row so it can be # modified in before_rendering_page callbacks. if @header @header_row = Cells.new row(0).each { |cell| @header_row[cell.row, cell.column] = cell.dup } end # Track cells to be drawn on this page. They will all be drawn when this # page is finished. cells_this_page = [] @cells.each do |cell| if cell.height > (cell.y + offset) - ref_bounds.absolute_bottom && cell.row > started_new_page_at_row # Ink all cells on the current page if @before_rendering_page c = Cells.new(cells_this_page.map { |c, _| c }) @before_rendering_page.call(c) end Cell.draw_cells(cells_this_page) cells_this_page = [] # start a new page or column @pdf.bounds.move_past_bottom if cell.row > 0 && @header header_height = add_header(cells_this_page, @pdf.cursor, cell.row-1) else header_height = 0 end offset = @pdf.y - cell.y - header_height started_new_page_at_row = cell.row end # Don't modify cell.x / cell.y here, as we want to reuse the original # values when re-inking the table. #draw should be able to be called # multiple times. x, y = cell.x, cell.y y += offset # Translate coordinates to the bounds we are in, since drawing is # relative to the cursor, not ref_bounds. x += @pdf.bounds.left_side - @pdf.bounds.absolute_left y -= @pdf.bounds.absolute_bottom # Set background color, if any. if @row_colors && (!@header || cell.row > 0) # Ensure coloring restarts on every page (to make sure the header # and first row of a page are not colored the same way). index = cell.row - [started_new_page_at_row, @header ? 1 : 0].max cell.background_color ||= @row_colors[index % @row_colors.length] end cells_this_page << [cell, [x, y]] last_y = y end # Draw the last page of cells if @before_rendering_page c = Cells.new(cells_this_page.map { |c, _| c }) @before_rendering_page.call(c) end Cell.draw_cells(cells_this_page) @pdf.move_cursor_to(last_y - @cells.last.height) end end # Calculate and return the constrained column widths, taking into account # each cell's min_width, max_width, and any user-specified constraints on # the table or column size. # # Because the natural widths can be silly, this does not always work so well # at guessing a good size for columns that have vastly different content. If # you see weird problems like CannotFit errors or shockingly bad column # sizes, you should specify more column widths manually. # def column_widths @column_widths ||= begin if width - cells.min_width < -epsilon raise Errors::CannotFit, "Table's width was set too small to contain its contents " + "(min width #{cells.min_width}, requested #{width})" end if width - cells.max_width > epsilon raise Errors::CannotFit, "Table's width was set larger than its contents' maximum width " + "(max width #{cells.max_width}, requested #{width})" end if width - natural_width < -epsilon # Shrink the table to fit the requested width. f = (width - cells.min_width).to_f / (natural_width - cells.min_width) (0...column_length).map do |c| min, nat = column(c).min_width, natural_column_widths[c] (f * (nat - min)) + min end elsif width - natural_width > epsilon # Expand the table to fit the requested width. f = (width - cells.width).to_f / (cells.max_width - cells.width) (0...column_length).map do |c| nat, max = natural_column_widths[c], column(c).max_width (f * (max - nat)) + nat end else natural_column_widths end end end # Returns an array with the height of each row. # def row_heights @natural_row_heights ||= begin heights_by_row = Hash.new(0) cells.each do |cell| next if cell.is_a?(Cell::SpanDummy) # Split the height of row-spanned cells evenly by rows height_per_row = cell.height.to_f / cell.rowspan cell.rowspan.times do |i| heights_by_row[cell.row + i] = [heights_by_row[cell.row + i], height_per_row].max end end heights_by_row.sort_by { |row, _| row }.map { |_, h| h } end end protected # Converts the array of cellable objects given into instances of # Prawn::Table::Cell, and sets up their in-table properties so that they # know their own position in the table. # def make_cells(data) assert_proper_table_data(data) cells = Cells.new row_number = 0 data.each do |row_cells| column_number = 0 row_cells.each do |cell_data| # If we landed on a spanned cell (from a rowspan above), continue # until we find an empty spot. column_number += 1 until cells[row_number, column_number].nil? # Build the cell and store it in the Cells collection. cell = Cell.make(@pdf, cell_data) cells[row_number, column_number] = cell # Add dummy cells for the rest of the cells in the span group. This # allows Prawn to keep track of the horizontal and vertical space # occupied in each column and row spanned by this cell, while still # leaving the master (top left) cell in the group responsible for # drawing. Dummy cells do not put ink on the page. cell.rowspan.times do |i| cell.colspan.times do |j| next if i == 0 && j == 0 # It is an error to specify spans that overlap; catch this here if bad_cell = cells[row_number + i, column_number + j] raise Prawn::Errors::InvalidTableSpan, "Spans overlap at row #{row_number + i}, " + "column #{column_number + j}." end dummy = Cell::SpanDummy.new(@pdf, cell) cells[row_number + i, column_number + j] = dummy cell.dummy_cells << dummy end end column_number += cell.colspan end row_number += 1 end # Calculate the number of rows and columns in the table, taking into # account that some cells may span past the end of the physical cells we # have. @row_length = cells.map do |cell| cell.row + cell.rowspan end.max @column_length = cells.map do |cell| cell.column + cell.colspan end.max cells end # Add the header row to the given array of cells at the given y-position. # Number the row with the given +row+ index, so that the header appears (in # any Cells built for this page) immediately prior to the first data row on # this page. # # Return the height of the header. # def add_header(page_of_cells, y, row) @header_row.each do |cell| cell.row = row page_of_cells << [cell, [cell.x, y]] end @header_row.height end # Raises an error if the data provided cannot be converted into a valid # table. # def assert_proper_table_data(data) if data.nil? || data.empty? raise Prawn::Errors::EmptyTable, "data must be a non-empty, non-nil, two dimensional array " + "of cell-convertible objects" end unless data.all? { |e| Array === e } raise Prawn::Errors::InvalidTableData, "data must be a two dimensional array of cellable objects" end end # Returns an array of each column's natural (unconstrained) width. # def natural_column_widths @natural_column_widths ||= begin widths_by_column = Hash.new(0) cells.each do |cell| next if cell.is_a?(Cell::SpanDummy) # Split the width of colspanned cells evenly by columns width_per_column = cell.width.to_f / cell.colspan cell.colspan.times do |i| widths_by_column[cell.column + i] = [widths_by_column[cell.column + i], width_per_column].max end end widths_by_column.sort_by { |col, _| col }.map { |_, w| w } end end # Returns the "natural" (unconstrained) width of the table. This may be # extremely silly; for example, the unconstrained width of a paragraph of # text is the width it would assume if it were not wrapped at all. Could be # a mile long. # def natural_width @natural_width ||= natural_column_widths.inject(0, &:+) end # Assigns the calculated column widths to each cell. This ensures that each # cell in a column is the same width. After this method is called, # subsequent calls to column_widths and width should return the finalized # values that will be used to ink the table. # def set_column_widths column_widths.each_with_index do |w, col_num| column(col_num).width = w end end # Assigns the row heights to each cell. This ensures that every cell in a # row is the same height. # def set_row_heights row_heights.each_with_index { |h, row_num| row(row_num).height = h } end # Set each cell's position based on the widths and heights of cells # preceding it. # def position_cells # Calculate x- and y-positions as running sums of widths / heights. x_positions = column_widths.inject([0]) { |ary, x| ary << (ary.last + x); ary }[0..-2] x_positions.each_with_index { |x, i| column(i).x = x } # y-positions assume an infinitely long canvas starting at zero -- this # is corrected for in Table#draw, and page breaks are properly inserted. y_positions = row_heights.inject([0]) { |ary, y| ary << (ary.last - y); ary}[0..-2] y_positions.each_with_index { |y, i| row(i).y = y } end # Sets up a bounding box to position the table according to the specified # :position option, and yields. # def with_position x = case @position || :left when :left then return yield when :center then (@pdf.bounds.width - width) / 2.0 when :right then @pdf.bounds.width - width when Numeric then @position else raise ArgumentError, "unknown position #{@position.inspect}" end dy = @pdf.bounds.absolute_top - @pdf.y final_y = nil @pdf.bounding_box([x, @pdf.bounds.top], :width => width) do @pdf.move_down dy yield final_y = @pdf.y end @pdf.y = final_y end private def epsilon @epsilon end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/compatibility.rb0000644000000000000000000000365012114176157021164 0ustar rootroot# coding: utf-8 # # Compatibility layer to smooth over differences between Ruby implementations # The oldest version of Ruby which is supported is MRI 1.8.7 # Ideally, all version-specific or implementation-specific code should be # kept in this file (but that ideal has not been attained yet) class String #:nodoc: def first_line self.each_line { |line| return line } end unless "".respond_to?(:codepoints) def codepoints(&block) if block_given? unpack("U*").each(&block) else unpack("U*") end end end if "".respond_to?(:encode) def normalize_to_utf8 begin encode(Encoding::UTF_8) rescue raise Prawn::Errors::IncompatibleStringEncoding, "Encoding " + "#{text.encoding} can not be transparently converted to UTF-8. " + "Please ensure the encoding of the string you are attempting " + "to use is set correctly" end end alias :unicode_characters :each_char alias :unicode_length :length else def normalize_to_utf8 begin # use unpack as a hackish way to verify the string is valid utf-8 unpack("U*") return dup rescue raise Prawn::Errors::IncompatibleStringEncoding, "The string you " + "are attempting to render is not encoded in valid UTF-8." end end def unicode_characters if block_given? unpack("U*").each { |c| yield [c].pack("U") } else unpack("U*").map { |c| [c].pack("U") } end end def unicode_length unpack("U*").length end end end unless File.respond_to?(:binread) def File.binread(file) #:nodoc: File.open(file,"rb") { |f| f.read } end end if RUBY_VERSION < "1.9" def ruby_18 #:nodoc: yield end def ruby_19 #:nodoc: false end else def ruby_18 #:nodoc: false end def ruby_19 #:nodoc: yield end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/graphics/0000755000000000000000000000000012114176157017562 5ustar rootrootruby-prawn-1.0.0~rc2.orig/lib/prawn/graphics/color.rb0000644000000000000000000001306512114176157021232 0ustar rootroot# encoding: utf-8 # color.rb : Implements color handling # # Copyright June 2008, Gregory Brown. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. module Prawn module Graphics module Color # Sets or returns the fill color. # # When called with no argument, it returns the current fill color. # # If a single argument is provided, it should be a 6 digit HTML color # code. # # pdf.fill_color "f0ffc1" # # If 4 arguments are provided, the color is assumed to be a CMYK value # Values range from 0 - 100. # # pdf.fill_color 0, 99, 95, 0 # def fill_color(*color) return current_fill_color if color.empty? self.current_fill_color = process_color(*color) set_fill_color end alias_method :fill_color=, :fill_color # Sets or returns the line stroking color. # # When called with no argument, it returns the current stroking color. # # If a single argument is provided, it should be a 6 digit HTML color # code. # # pdf.stroke_color "f0ffc1" # # If 4 arguments are provided, the color is assumed to be a CMYK value # Values range from 0 - 100. # # pdf.stroke_color 0, 99, 95, 0 # def stroke_color(*color) return current_stroke_color if color.empty? color = process_color(*color) self.current_stroke_color = color set_stroke_color(color) end alias_method :stroke_color=, :stroke_color module_function # Converts RGB value array to hex string suitable for use with fill_color # and stroke_color # # >> Prawn::Graphics::Color.rgb2hex([255,120,8]) # => "ff7808" # def rgb2hex(rgb) rgb.map { |e| "%02x" % e }.join end # Converts hex string into RGB value array: # # >> Prawn::Graphics::Color.hex2rgb("ff7808") # => [255, 120, 8] # def hex2rgb(hex) r,g,b = hex[0..1], hex[2..3], hex[4..5] [r,g,b].map { |e| e.to_i(16) } end private def process_color(*color) case(color.size) when 1 color[0] when 4 color else raise ArgumentError, 'wrong number of arguments supplied' end end def color_type(color) case color when String :RGB when Array case color.length when 3 :RGB when 4 :CMYK else raise ArgumentError, "Unknown type of color: #{color.inspect}" end end end def normalize_color(color) case color_type(color) when :RGB r,g,b = hex2rgb(color) [r / 255.0, g / 255.0, b / 255.0] when :CMYK c,m,y,k = *color [c / 100.0, m / 100.0, y / 100.0, k / 100.0] end end def color_to_s(color) normalize_color(color).map { |c| '%.3f' % c }.join(' ') end def color_space(color) case color_type(color) when :RGB :DeviceRGB when :CMYK :DeviceCMYK end end COLOR_SPACES = [:DeviceRGB, :DeviceCMYK, :Pattern] def set_color_space(type, color_space) # don't set the same color space again return if current_color_space(type) == color_space && !state.page.in_stamp_stream? set_current_color_space(color_space, type) unless COLOR_SPACES.include?(color_space) raise ArgumentError, "unknown color space: '#{color_space}'" end operator = case type when :fill 'cs' when :stroke 'CS' else raise ArgumentError, "unknown type '#{type}'" end add_content "/#{color_space} #{operator}" end def set_color(type, color, options = {}) operator = case type when :fill 'scn' when :stroke 'SCN' else raise ArgumentError, "unknown type '#{type}'" end if options[:pattern] set_color_space type, :Pattern add_content "/#{color} #{operator}" else set_color_space type, color_space(color) color = color_to_s(color) write_color(color, operator) end end def set_fill_color(color = nil) set_color :fill, color || current_fill_color end def set_stroke_color(color = nil) set_color :stroke, color || current_stroke_color end def update_colors set_fill_color set_stroke_color end private def current_color_space(type) graphic_state.color_space[type] end def set_current_color_space(color_space, type) save_graphics_state if graphic_state.nil? graphic_state.color_space[type] = color_space end def current_fill_color graphic_state.fill_color end def current_fill_color=(color) graphic_state.fill_color = color end def current_stroke_color graphic_state.stroke_color end def current_stroke_color=(color) graphic_state.stroke_color = color end def write_fill_color write_color(current_fill_color, 'scn') end def write_stroke_color write_color(current_fill_color, 'SCN') end def write_color(color, operator) add_content "#{color} #{operator}" end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/graphics/transformation.rb0000644000000000000000000001231612114176157023160 0ustar rootroot# encoding: utf-8 # # transformation.rb: Implements rotate, translate, skew, scale and a generic # transformation_matrix # # Copyright January 2010, Michael Witrant. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. module Prawn module Graphics module Transformation # Rotate the user space. If a block is not provided, then you must save # and restore the graphics state yourself. # # == Options # :origin:: [number, number]. The point around which to # rotate. A block must be provided if using the :origin # # raises Prawn::Errors::BlockRequired if an :origin option is # provided, but no block is given # # Example without a block: # # save_graphics_state # rotate 30 # text "rotated text" # restore_graphics_state # # Example with a block: rotating a rectangle around its upper-left corner # # x = 300 # y = 300 # width = 150 # height = 200 # angle = 30 # pdf.rotate(angle, :origin => [x, y]) do # pdf.stroke_rectangle([x, y], width, height) # end # def rotate(angle, options={}, &block) Prawn.verify_options(:origin, options) rad = degree_to_rad(angle) cos = Math.cos(rad) sin = Math.sin(rad) if options[:origin].nil? transformation_matrix(cos, sin, -sin, cos, 0, 0, &block) else raise Prawn::Errors::BlockRequired unless block_given? x = options[:origin][0] + bounds.absolute_left y = options[:origin][1] + bounds.absolute_bottom x_prime = x * cos - y * sin y_prime = x * sin + y * cos translate(x - x_prime, y - y_prime) do transformation_matrix(cos, sin, -sin, cos, 0, 0, &block) end end end # Translate the user space. If a block is not provided, then you must save # and restore the graphics state yourself. # # Example without a block: move the text up and over 10 # # save_graphics_state # translate(10, 10) # text "scaled text" # restore_graphics_state # # Example with a block: draw a rectangle with its upper-left corner at # x + 10, y + 10 # # x = 300 # y = 300 # width = 150 # height = 200 # pdf.translate(10, 10) do # pdf.stroke_rectangle([x, y], width, height) # end # def translate(x, y, &block) transformation_matrix(1, 0, 0, 1, x, y, &block) end # Scale the user space. If a block is not provided, then you must save # and restore the graphics state yourself. # # == Options # :origin:: [number, number]. The point from which to # scale. A block must be provided if using the :origin # # raises Prawn::Errors::BlockRequired if an :origin option is # provided, but no block is given # # Example without a block: # # save_graphics_state # scale 1.5 # text "scaled text" # restore_graphics_state # # Example with a block: scale a rectangle from its upper-left corner # # x = 300 # y = 300 # width = 150 # height = 200 # factor = 1.5 # pdf.scale(angle, :origin => [x, y]) do # pdf.stroke_rectangle([x, y], width, height) # end # def scale(factor, options={}, &block) Prawn.verify_options(:origin, options) if options[:origin].nil? transformation_matrix(factor, 0, 0, factor, 0, 0, &block) else raise Prawn::Errors::BlockRequired unless block_given? x = options[:origin][0] + bounds.absolute_left y = options[:origin][1] + bounds.absolute_bottom x_prime = factor * x y_prime = factor * y translate(x - x_prime, y - y_prime) do transformation_matrix(factor, 0, 0, factor, 0, 0, &block) end end end # The following definition of skew would only work in a clearly # predicatable manner when if the document had no margin. don't provide # this shortcut until it behaves in a clearly understood manner # # def skew(a, b, &block) # transformation_matrix(1, # Math.tan(degree_to_rad(a)), # Math.tan(degree_to_rad(b)), # 1, 0, 0, &block) # end # Transform the user space (see notes for rotate regarding graphics state) # Generally, one would use the rotate, scale, translate, and skew # convenience methods instead of calling transformation_matrix directly def transformation_matrix(a, b, c, d, e, f) values = [a, b, c, d, e, f].map { |x| "%.5f" % x }.join(" ") save_graphics_state if block_given? add_content "#{values} cm" if block_given? yield restore_graphics_state end end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/graphics/dash.rb0000644000000000000000000000426612114176157021036 0ustar rootroot# encoding: utf-8 # dash.rb : Implements stroke dashing # # Contributed by Daniel Nelson. October, 2009 # # This is free software. Please see the LICENSE and COPYING files for details. # module Prawn module Graphics module Dash # Sets the dash pattern for stroked lines and curves # # length is the length of the dash. If options is not present, # or options[:space] is nil, then length is also the length of # the space between dashes # # options may contain :space and :phase # :space is the space between the dashes # :phase is where in the cycle to begin dashing. For # example, a phase of 0 starts at the beginning of # the dash; whereas, if the phase is equal to the # length of the dash, then stroking will begin at # the beginning of the space. Default is 0 # # integers or floats may be used for length and the options # # dash units are in PDF points ( 1/72 in ) # def dash(length=nil, options={}) return current_dash_state || undash_hash if length.nil? self.current_dash_state = { :dash => length, :space => options[:space] || length, :phase => options[:phase] || 0 } write_stroke_dash end alias_method :dash=, :dash # Stops dashing, restoring solid stroked lines and curves # def undash self.current_dash_state = undashed_setting write_stroke_dash end # Returns when stroke is dashed, false otherwise # def dashed? current_dash_state != undashed_setting end def write_stroke_dash add_content dash_setting end private def undashed_setting { :dash => nil, :space => nil, :phase => 0 } end private def current_dash_state=(dash_options) graphic_state.dash = dash_options end def current_dash_state graphic_state.dash end def dash_setting graphic_state.dash_setting end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/graphics/patterns.rb0000644000000000000000000001051512114176157021751 0ustar rootroot# encoding: utf-8 # patterns.rb : Implements axial & radial gradients # # Originally implemented by Wojciech Piekutowski. November, 2009 # Copyright September 2012, Alexander Mankuta. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. # module Prawn module Graphics module Patterns # Sets the fill gradient from color1 to color2. # old arguments: point, width, height, color1, color2, options = {} # new arguments: from, to, color1, color1 # or from, r1, to, r2, color1, color2 def fill_gradient(*args) if args[1].is_a?(Array) || args[2].is_a?(Array) set_gradient(:fill, *args) else warn "[DEPRECATION] 'fill_gradient(point, width, height,...)' is deprecated in favor of 'fill_gradient(from, to,...)'. " + "Old arguments will be removed in release 1.1" set_gradient :fill, args[0], [args[0].first, args[0].last - args[2]], args[3], args[4] end end # Sets the stroke gradient from color1 to color2. # old arguments: point, width, height, color1, color2, options = {} # new arguments: from, to, color1, color2 # or from, r1, to, r2, color1, color2 def stroke_gradient(*args) if args[1].is_a?(Array) || args[2].is_a?(Array) set_gradient(:stroke, *args) else warn "[DEPRECATION] 'stroke_gradient(point, width, height,...)' is deprecated in favor of 'stroke_gradient(from, to,...)'. " + "Old arguments will be removed in release 1.1" set_gradient :stroke, args[0], [args[0].first, args[0].last - args[2]], args[3], args[4] end end private def set_gradient(type, *grad) patterns = page.resources[:Pattern] ||= {} registry_key = gradient_registry_key grad if patterns["SP#{registry_key}"] shading = patterns["SP#{registry_key}"] else unless shading = gradient_registry[registry_key] shading = gradient(*grad) gradient_registry[registry_key] = shading end patterns["SP#{registry_key}"] = shading end operator = case type when :fill 'scn' when :stroke 'SCN' else raise ArgumentError, "unknown type '#{type}'" end set_color_space type, :Pattern add_content "/SP#{registry_key} #{operator}" end def gradient_registry_key(gradient) if gradient[1].is_a?(Array) # axial [ map_to_absolute(gradient[0]), map_to_absolute(gradient[1]), gradient[2], gradient[3] ] else # radial [ map_to_absolute(gradient[0]), gradient[1], map_to_absolute(gradient[2]), gradient[3], gradient[4], gradient[5] ] end.hash end def gradient_registry @gradient_registry ||= {} end def gradient(*args) if args.length != 4 && args.length != 6 raise ArgumentError, "Unknown type of gradient: #{args.inspect}" end color1 = normalize_color(args[-2]).dup.freeze color2 = normalize_color(args[-1]).dup.freeze if color_type(color1) != color_type(color2) raise ArgumentError, "Both colors must be of the same color space: #{color1.inspect} and #{color2.inspect}" end process_color color1 process_color color2 shader = ref!({ :FunctionType => 2, :Domain => [0.0, 1.0], :C0 => color1, :C1 => color2, :N => 1.0, }) shading = ref!({ :ShadingType => args.length == 4 ? 2 : 3, # axial : radial shading :ColorSpace => color_space(color1), :Coords => args.length == 4 ? [0, 0, args[1].first - args[0].first, args[1].last - args[0].last] : [0, 0, args[1], args[2].first - args[0].first, args[2].last - args[0].last, args[3]], :Function => shader, :Extend => [true, true], }) shading_pattern = ref!({ :PatternType => 2, # shading pattern :Shading => shading, :Matrix => [1, 0, 0, 1] + map_to_absolute(args[0]), }) end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/graphics/transparency.rb0000644000000000000000000000577712114176157022640 0ustar rootroot# encoding: utf-8 # # transparency.rb : Implements transparency # # Copyright October 2009, Daniel Nelson. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. # module Prawn module Graphics # The Prawn::Transparency module is used to place transparent # content on the page. It has the capacity for separate # transparency values for stroked content and all other content. # # Example: # # both the fill and stroke will be at 50% opacity # pdf.transparent(0.5) do # pdf.text("hello world") # pdf.fill_and_stroke_circle([x, y], 25) # end # # # the fill will be at 50% opacity, but the stroke will # # be at 75% opacity # pdf.transparent(0.5, 0.75) do # pdf.text("hello world") # pdf.fill_and_stroke_circle([x, y], 25) # end # module Transparency # Sets the opacity and stroke_opacity for all # the content within the block # If stroke_opacity is not provided, then it takes on # the same value as opacity # # Valid ranges for both paramters are 0.0 to 1.0 # # Example: # # both the fill and stroke will be at 50% opacity # pdf.transparent(0.5) do # pdf.text("hello world") # pdf.fill_and_stroke_circle([x, y], 25) # end # # # the fill will be at 50% opacity, but the stroke will # # be at 75% opacity # pdf.transparent(0.5, 0.75) do # pdf.text("hello world") # pdf.fill_and_stroke_circle([x, y], 25) # end # def transparent(opacity, stroke_opacity=opacity, &block) min_version(1.4) opacity = [[opacity, 0.0].max, 1.0].min stroke_opacity = [[stroke_opacity, 0.0].max, 1.0].min save_graphics_state add_content "/#{opacity_dictionary_name(opacity, stroke_opacity)} gs" yield restore_graphics_state end private def opacity_dictionary_registry @opacity_dictionary_registry ||= {} end def next_opacity_dictionary_id opacity_dictionary_registry.length + 1 end def opacity_dictionary_name(opacity, stroke_opacity) key = "#{opacity}_#{stroke_opacity}" if opacity_dictionary_registry[key] dictionary = opacity_dictionary_registry[key][:obj] dictionary_name = opacity_dictionary_registry[key][:name] else dictionary = ref!(:Type => :ExtGState, :CA => stroke_opacity, :ca => opacity ) dictionary_name = "Tr#{next_opacity_dictionary_id}" opacity_dictionary_registry[key] = { :name => dictionary_name, :obj => dictionary } end page.ext_gstates.merge!(dictionary_name => dictionary) dictionary_name end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/graphics/join_style.rb0000644000000000000000000000212512114176157022266 0ustar rootroot# encoding: utf-8 # join_style.rb : Implements stroke join styling # # Contributed by Daniel Nelson. October, 2009 # # This is free software. Please see the LICENSE and COPYING files for details. # module Prawn module Graphics module JoinStyle JOIN_STYLES = { :miter => 0, :round => 1, :bevel => 2 } # Sets the join style for stroked lines and curves # # style is one of :miter, :round, or :bevel # # NOTE: if this method is never called, :miter will be used for join style # throughout the document # def join_style(style=nil) return current_join_style || :miter if style.nil? self.current_join_style = style write_stroke_join_style end alias_method :join_style=, :join_style private def current_join_style graphic_state.join_style end def current_join_style=(style) graphic_state.join_style = style end def write_stroke_join_style add_content "#{JOIN_STYLES[current_join_style]} j" end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/graphics/cap_style.rb0000644000000000000000000000203412114176157022071 0ustar rootroot# encoding: utf-8 # cap_style.rb : Implements stroke cap styling # # Contributed by Daniel Nelson. October, 2009 # # This is free software. Please see the LICENSE and COPYING files for details. # module Prawn module Graphics module CapStyle CAP_STYLES = { :butt => 0, :round => 1, :projecting_square => 2 } # Sets the cap style for stroked lines and curves # # style is one of :butt, :round, or :projecting_square # # NOTE: If this method is never called, :butt will be used by default. # def cap_style(style=nil) return current_cap_style || :butt if style.nil? self.current_cap_style = style write_stroke_cap_style end alias_method :cap_style=, :cap_style private def current_cap_style graphic_state.cap_style end def current_cap_style=(style) graphic_state.cap_style = style end def write_stroke_cap_style add_content "#{CAP_STYLES[current_cap_style]} J" end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/graphics.rb0000644000000000000000000004164212114176157020116 0ustar rootroot# encoding: utf-8 # graphics.rb : Implements PDF drawing primitives # # Copyright April 2008, Gregory Brown. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. require "prawn/graphics/color" require "prawn/graphics/dash" require "prawn/graphics/cap_style" require "prawn/graphics/join_style" require "prawn/graphics/transparency" require "prawn/graphics/transformation" require "prawn/graphics/patterns" module Prawn # Implements the drawing facilities for Prawn::Document. # Use this to draw the most beautiful imaginable things. # # This file lifts and modifies several of PDF::Writer's graphics functions # ruby-pdf.rubyforge.org # module Graphics include Color include Dash include CapStyle include JoinStyle include Transparency include Transformation include Patterns ####################################################################### # Low level drawing operations must map the point to absolute coords! # ####################################################################### # Moves the drawing position to a given point. The point can be # specified as a tuple or a flattened argument list # # pdf.move_to [100,50] # pdf.move_to(100,50) # def move_to(*point) x,y = map_to_absolute(point) add_content("%.3f %.3f m" % [ x, y ]) end # Draws a line from the current drawing position to the specified point. # The destination may be described as a tuple or a flattened list: # # pdf.line_to [50,50] # pdf.line_to(50,50) # def line_to(*point) x,y = map_to_absolute(point) add_content("%.3f %.3f l" % [ x, y ]) end # Draws a Bezier curve from the current drawing position to the # specified point, bounded by two additional points. # # pdf.curve_to [100,100], :bounds => [[90,90],[75,75]] # def curve_to(dest,options={}) options[:bounds] or raise Prawn::Errors::InvalidGraphicsPath, "Bounding points for bezier curve must be specified "+ "as :bounds => [[x1,y1],[x2,y2]]" curve_points = (options[:bounds] << dest).map { |e| map_to_absolute(e) } add_content("%.3f %.3f %.3f %.3f %.3f %.3f c" % curve_points.flatten ) end # Draws a rectangle given point, width and # height. The rectangle is bounded by its upper-left corner. # # pdf.rectangle [300,300], 100, 200 # def rectangle(point,width,height) x,y = map_to_absolute(point) add_content("%.3f %.3f %.3f %.3f re" % [ x, y - height, width, height ]) end # Draws a rounded rectangle given point, width and # height and radius for the rounded corner. The rectangle # is bounded by its upper-left corner. # # pdf.rounded_rectangle [300,300], 100, 200, 10 # def rounded_rectangle(point,width,height,radius) x, y = point rounded_polygon(radius, point, [x + width, y], [x + width, y - height], [x, y - height]) end ########################################################### # Higher level functions: May use relative coords # ########################################################### # Sets line thickness to the width specified. # def line_width=(width) self.current_line_width = width write_line_width end # When called without an argument, returns the current line thickness. # When called with an argument, sets the line thickness to the specified # value (in PDF points) # # pdf.line_width #=> 1 # pdf.line_width(5) # pdf.line_width #=> 5 # def line_width(width=nil) if width self.line_width = width else current_line_width end end # Draws a line from one point to another. Points may be specified as # tuples or flattened argument list: # # pdf.line [100,100], [200,250] # pdf.line(100,100,200,250) # def line(*points) x0,y0,x1,y1 = points.flatten move_to(x0, y0) line_to(x1, y1) end # Draws a horizontal line from x1 to x2 at the # current y position, or the position specified by the :at option. # # # draw a line from [25, 75] to [100, 75] # horizontal_line 25, 100, :at => 75 # def horizontal_line(x1,x2,options={}) if options[:at] y1 = options[:at] else y1 = y - bounds.absolute_bottom end line(x1,y1,x2,y1) end # Draws a horizontal line from the left border to the right border of the # bounding box at the current y position. # def horizontal_rule horizontal_line(bounds.left, bounds.right) end # Draws a vertical line at the x cooordinate given by :at from y1 to y2. # # # draw a line from [25, 100] to [25, 300] # vertical_line 100, 300, :at => 25 # def vertical_line(y1,y2,params) line(params[:at],y1,params[:at],y2) end # Draws a Bezier curve between two points, bounded by two additional # points # # pdf.curve [50,100], [100,100], :bounds => [[90,90],[75,75]] # def curve(origin,dest, options={}) move_to(*origin) curve_to(dest,options) end # This constant is used to approximate a symmetrical arc using a cubic # Bezier curve. # KAPPA = 4.0 * ((Math.sqrt(2) - 1.0) / 3.0) # DEPRECATED: Please use circle instead. def circle_at(point, options) warn "[DEPRECATION] 'circle_at' is deprecated in favor of 'circle'. " + "'circle_at' will be removed in release 1.1" circle(point, options[:radius]) end # Draws a circle of radius radius with the centre-point at point # as a complete subpath. The drawing point will be moved to the # centre-point upon completion of the drawing the circle. # # pdf.circle [100,100], 25 # def circle(center, radius) ellipse(center, radius, radius) end # DEPRECATED: Please use ellipse instead. def ellipse_at(point, r1, r2=r1) warn "[DEPRECATION] 'ellipse_at' is deprecated in favor of 'ellipse'. " + "'ellipse_at' will be removed in release 1.1" ellipse(point, r1, r2) end # Draws an ellipse of +x+ radius r1 and +y+ radius r2 # with the centre-point at point as a complete subpath. The # drawing point will be moved to the centre-point upon completion of the # drawing the ellipse. # # # draws an ellipse with x-radius 25 and y-radius 50 # pdf.ellipse [100,100], 25, 50 # def ellipse(point, r1, r2 = r1) x, y = point l1 = r1 * KAPPA l2 = r2 * KAPPA move_to(x + r1, y) # Upper right hand corner curve_to [x, y + r2], :bounds => [[x + r1, y + l2], [x + l1, y + r2]] # Upper left hand corner curve_to [x - r1, y], :bounds => [[x - l1, y + r2], [x - r1, y + l2]] # Lower left hand corner curve_to [x, y - r2], :bounds => [[x - r1, y - l2], [x - l1, y - r2]] # Lower right hand corner curve_to [x + r1, y], :bounds => [[x + l1, y - r2], [x + r1, y - l2]] move_to(x, y) end # Draws a polygon from the specified points. # # # draws a snazzy triangle # pdf.polygon [100,100], [100,200], [200,200] # def polygon(*points) move_to points[0] (points[1..-1] << points[0]).each do |point| line_to(*point) end # close the path add_content "h" end # Draws a rounded polygon from specified points using the radius to define bezier curves # # # draws a rounded filled in polygon # pdf.fill_and_stroke_rounded_polygon(10, [100, 250], [200, 300], [300, 250], # [300, 150], [200, 100], [100, 150]) def rounded_polygon(radius, *points) move_to point_on_line(radius, points[1], points[0]) sides = points.size points << points[0] << points[1] (sides).times do |i| rounded_vertex(radius, points[i], points[i + 1], points[i + 2]) end # close the path add_content "h" end # Creates a rounded vertex for a line segment used for building a rounded polygon # requires a radius to define bezier curve and three points. The first two points define # the line segment and the third point helps define the curve for the vertex. def rounded_vertex(radius, *points) x0,y0,x1,y1,x2,y2 = points.flatten radial_point_1 = point_on_line(radius, points[0], points[1]) bezier_point_1 = point_on_line((radius - radius*KAPPA), points[0], points[1] ) radial_point_2 = point_on_line(radius, points[2], points[1]) bezier_point_2 = point_on_line((radius - radius*KAPPA), points[2], points[1]) line_to(radial_point_1) curve_to(radial_point_2, :bounds => [bezier_point_1, bezier_point_2]) end # Strokes the current path. If a block is provided, yields to the block # before closing the path. See Graphics::Color for color details. # def stroke yield if block_given? add_content "S" end # Closes and strokes the current path. If a block is provided, yields to # the block before closing the path. See Graphics::Color for color details. # def close_and_stroke yield if block_given? add_content "s" end # Draws and strokes a rectangle represented by the current bounding box # def stroke_bounds stroke_rectangle bounds.top_left, bounds.width, bounds.height end # Closes and fills the current path. See Graphics::Color for color details. # # If the option :fill_rule => :even_odd is specified, Prawn will use the # even-odd rule to fill the path. Otherwise, the nonzero winding number rule # will be used. See the PDF reference, "Graphics -> Path Construction and # Painting -> Clipping Path Operators" for details on the difference. # def fill(options={}) yield if block_given? add_content(options[:fill_rule] == :even_odd ? "f*" : "f") end # Closes, fills, and strokes the current path. If a block is provided, # yields to the block before closing the path. See Graphics::Color for # color details. # # If the option :fill_rule => :even_odd is specified, Prawn will use the # even-odd rule to fill the path. Otherwise, the nonzero winding number rule # will be used. See the PDF reference, "Graphics -> Path Construction and # Painting -> Clipping Path Operators" for details on the difference. # def fill_and_stroke(options={}) yield if block_given? add_content(options[:fill_rule] == :even_odd ? "b*" : "b") end # Closes the current path. # def close_path add_content "h" end ## # :method: stroke_rectangle # Draws and strokes a rectangle given +point+, +width+ and +height+. The rectangle is bounded by its upper-left corner. # :call-seq: # stroke_rectangle(point,width,height) ## # :method: fill_rectangle # Draws and fills ills a rectangle given +point+, +width+ and +height+. The rectangle is bounded by its upper-left corner. # :call-seq: # fill_rectangle(point,width,height) ## # :method: fill_and_stroke_rectangle # Draws, fills, and strokes a rectangle given +point+, +width+ and +height+. The rectangle is bounded by its upper-left corner. # :call-seq: # fill_and_stroke_rectangle(point,width,height) ## # :method: stroke_rounded_rectangle # Draws and strokes a rounded rectangle given +point+, +width+ and +height+ and +radius+ for the rounded corner. The rectangle is bounded by its upper-left corner. # :call-seq: # stroke_rounded_rectangle(point,width,height,radius) ## # :method: fill_rounded_rectangle # Draws and fills a rounded rectangle given +point+, +width+ and +height+ and +radius+ for the rounded corner. The rectangle is bounded by its upper-left corner. # :call-seq: # fill_rounded_rectangle(point,width,height,radius) ## # :method: stroke_and_fill_rounded_rectangle # Draws, fills, and strokes a rounded rectangle given +point+, +width+ and +height+ and +radius+ for the rounded corner. The rectangle is bounded by its upper-left corner. # :call-seq: # stroke_and_fill_rounded_rectangle(point,width,height,radius) ## # :method: stroke_line # Strokes a line from one point to another. Points may be specified as tuples or flattened argument list. # :call-seq: # stroke_line(*points) ## # :method: stroke_horizontal_line # Strokes a horizontal line from +x1+ to +x2+ at the current y position, or the position specified by the :at option. # :call-seq: # stroke_horizontal_line(x1,x2,options={}) ## # :method: stroke_horizontal_rule # Strokes a horizontal line from the left border to the right border of the bounding box at the current y position. ## # :method: stroke_vertical_line # Strokes a vertical line at the x coordinate given by :at from y1 to y2. # :call-seq: # stroke_vertical_line(y1,y2,params) ## # :method: stroke_curve # Strokes a Bezier curve between two points, bounded by two additional points. # :call-seq: # stroke_curve(origin,dest,options={}) ## # :method: stroke_circle # Draws and strokes a circle of radius +radius+ with the centre-point at +point+. # :call-seq: # stroke_circle(center,radius) ## # :method: fill_circle # Draws and fills a circle of radius +radius+ with the centre-point at +point+. # :call-seq: # fill_circle(center,radius) ## # :method: fill_and_stroke_circle # Draws, strokes, and fills a circle of radius +radius+ with the centre-point at +point+. # :call-seq: # fill_and_stroke_circle(center,radius) ## # :method: stroke_ellipse # Draws and strokes an ellipse of x radius +r1+ and y radius +r2+ with the centre-point at +point+. # :call-seq: # stroke_ellipse(point, r1, r2 = r1) ## # :method: fill_ellipse # Draws and fills an ellipse of x radius +r1+ and y radius +r2+ with the centre-point at +point+. # :call-seq: # fill_ellipse(point, r1, r2 = r1) ## # :method: fill_and_stroke_ellipse # Draws, strokes, and fills an ellipse of x radius +r1+ and y radius +r2+ with the centre-point at +point+. # :call-seq: # fill_and_stroke_ellipse(point, r1, r2 = r1) ## # :method: stroke_polygon # Draws and strokes a polygon from the specified points. # :call-seq: # stroke_polygon(*points) ## # :method: fill_polygon # Draws and fills a polygon from the specified points. # :call-seq: # fill_polygon(*points) ## # :method: fill_and_stroke_polygon # Draws, strokes, and fills a polygon from the specified points. # :call-seq: # fill_and_stroke_polygon(*points) ## # :method: stroke_rounded_polygon # Draws and strokes a rounded polygon from specified points, using +radius+ to define Bezier curves. # :call-seq: # stroke_rounded_polygon(radius, *points) ## # :method: fill_rounded_polygon # Draws and fills a rounded polygon from specified points, using +radius+ to define Bezier curves. # :call-seq: # fill_rounded_polygon(radius, *points) ## # :method: fill_and_stroke_rounded_polygon # Draws, strokes, and fills a rounded polygon from specified points, using +radius+ to define Bezier curves. # :call-seq: # fill_and_stroke_rounded_polygon(radius, *points) ops = %w{fill stroke fill_and_stroke} shapes = %w{line_to curve_to rectangle rounded_rectangle line horizontal_line horizontal_rule vertical_line curve circle_at circle ellipse_at ellipse polygon rounded_polygon rounded_vertex} ops.product(shapes).each do |operation,shape| class_eval "def #{operation}_#{shape}(*args); #{shape}(*args); #{operation}; end" end private def current_line_width graphic_state.line_width end def current_line_width=(width) graphic_state.line_width = width end def write_line_width add_content("#{current_line_width} w") end def map_to_absolute(*point) x,y = point.flatten [@bounding_box.absolute_left + x, @bounding_box.absolute_bottom + y] end def map_to_absolute!(point) point.replace(map_to_absolute(point)) end def degree_to_rad(angle) angle * Math::PI / 180 end # Returns the coordinates for a point on a line that is a given distance away from the second # point defining the line segement def point_on_line(distance_from_end, *points) x0,y0,x1,y1 = points.flatten length = Math.sqrt((x1 - x0)**2 + (y1 - y0)**2) p = (length - distance_from_end) / length xr = x0 + p*(x1 - x0) yr = y0 + p*(y1 - y0) [xr, yr] end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/layout.rb0000644000000000000000000000052012114176157017621 0ustar rootrootrequire "prawn/table" require 'prawn/layout/grid' module Prawn module Errors # This error is raised when table data is malformed # InvalidTableData = Class.new(StandardError) # This error is raised when an empty or nil table is rendered # EmptyTable = Class.new(StandardError) end module Layout end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/images.rb0000644000000000000000000001464212114176157017563 0ustar rootroot# encoding: ASCII-8BIT # images.rb : Implements PDF image embedding # # Copyright April 2008, James Healy, Gregory Brown. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. require 'digest/sha1' module Prawn module Images # Add the image at filename to the current page. Currently only # JPG and PNG files are supported. # # NOTE: Prawn is very slow at rendering PNGs with alpha channels, and this # uses a lot of RAM. The workaround for those who don't mind installing # RMagick is to use: # # http://github.com/amberbit/prawn-fast-png # # Arguments: # file:: path to file or an object that responds to #read # # Options: # :at:: an array [x,y] with the location of the top left corner of the image. # :position:: One of (:left, :center, :right) or an x-offset # :vposition:: One of (:top, :center, :center) or an y-offset # :height:: the height of the image [actual height of the image] # :width:: the width of the image [actual width of the image] # :scale:: scale the dimensions of the image proportionally # :fit:: scale the dimensions of the image proportionally to fit inside [width,height] # # Prawn::Document.generate("image2.pdf", :page_layout => :landscape) do # pigs = "#{Prawn::DATADIR}/images/pigs.jpg" # image pigs, :at => [50,450], :width => 450 # # dice = "#{Prawn::DATADIR}/images/dice.png" # image dice, :at => [50, 450], :scale => 0.75 # end # # If only one of :width / :height are provided, the image will be scaled # proportionally. When both are provided, the image will be stretched to # fit the dimensions without maintaining the aspect ratio. # # # If :at is provided, the image will be place in the current page but # the text position will not be changed. # # # If instead of an explicit filename, an object with a read method is # passed as +file+, you can embed images from IO objects and things # that act like them (including Tempfiles and open-uri objects). # # require "open-uri" # # Prawn::Document.generate("remote_images.pdf") do # image open("http://prawn.majesticseacreature.com/media/prawn_logo.png") # end # # This method returns an image info object which can be used to check the # dimensions of an image object if needed. # (See also: Prawn::Images::PNG , Prawn::Images::JPG) # def image(file, options={}) Prawn.verify_options [:at, :position, :vposition, :height, :width, :scale, :fit], options pdf_obj, info = build_image_object(file) embed_image(pdf_obj, info, options) info end # Builds an info object (Prawn::Images::*) and a PDF reference representing # the given image. Return a pair: [pdf_obj, info]. # def build_image_object(file) # Rewind if the object we're passed is an IO, so that multiple embeds of # the same IO object will work file.rewind if file.respond_to?(:rewind) # read the file as binary so the size is calculated correctly file.binmode if file.respond_to?(:binmode) if file.respond_to?(:read) image_content = file.read else raise ArgumentError, "#{file} not found" unless File.file?(file) image_content = File.binread(file) end image_sha1 = Digest::SHA1.hexdigest(image_content) # if this image has already been embedded, just reuse it if image_registry[image_sha1] info = image_registry[image_sha1][:info] image_obj = image_registry[image_sha1][:obj] else # Build the image object klass = case Image.detect_image_format(image_content) when :jpg then Prawn::Images::JPG when :png then Prawn::Images::PNG end info = klass.new(image_content) # Bump PDF version if the image requires it min_version(info.min_pdf_version) if info.respond_to?(:min_pdf_version) # Add the image to the PDF and register it in case we see it again. image_obj = info.build_pdf_object(self) image_registry[image_sha1] = {:obj => image_obj, :info => info} end [image_obj, info] end # Given a PDF image resource pdf_obj that has been added to the # page's resources and an info object (the pair returned from # build_image_object), embed the image according to the options # given. # def embed_image(pdf_obj, info, options) # find where the image will be placed and how big it will be w,h = info.calc_image_dimensions(options) if options[:at] x,y = map_to_absolute(options[:at]) else x,y = image_position(w,h,options) move_text_position h end # add a reference to the image object to the current page # resource list and give it a label label = "I#{next_image_id}" state.page.xobjects.merge!(label => pdf_obj) # add the image to the current page instruct = "\nq\n%.3f 0 0 %.3f %.3f %.3f cm\n/%s Do\nQ" add_content instruct % [ w, h, x, y - h, label ] end private def image_position(w,h,options) options[:position] ||= :left y = case options[:vposition] when :top bounds.absolute_top when :center bounds.absolute_top - (bounds.height - h) / 2.0 when :bottom bounds.absolute_bottom + h when Numeric bounds.absolute_top - options[:vposition] else determine_y_with_page_flow(h) end x = case options[:position] when :left bounds.left_side when :center bounds.left_side + (bounds.width - w) / 2.0 when :right bounds.right_side - w when Numeric options[:position] + bounds.left_side end return [x,y] end def determine_y_with_page_flow(h) if overruns_page?(h) bounds.move_past_bottom end self.y end def overruns_page?(h) (self.y - h) < reference_bounds.absolute_bottom end def image_registry @image_registry ||= {} end def next_image_id @image_counter ||= 0 @image_counter += 1 end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/document/0000755000000000000000000000000012114176157017600 5ustar rootrootruby-prawn-1.0.0~rc2.orig/lib/prawn/document/snapshot.rb0000644000000000000000000000573112114176157021772 0ustar rootroot# encoding: utf-8 # snapshot.rb : Implements transactional rendering for Prawn # # Copyright August 2009, Brad Ediger. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. require 'delegate' module Prawn class Document module Snapshot RollbackTransaction = Class.new(StandardError) # Call this within a +transaction+ block to roll back the transaction and # prevent any of its data from being rendered. You must reset the # y-position yourself if you have performed any drawing operations that # modify it. # def rollback raise RollbackTransaction end # Run a block of drawing operations, to be completed atomically. If # +rollback+ is called or a RollbackTransaction exception is raised # inside the block, all actions taken inside the block will be rolled # back (with the exception of y-position, which you must restore # yourself). # # Returns true on success, or false if the transaction was rolled back. # def transaction snap = take_snapshot yield true rescue RollbackTransaction restore_snapshot(snap) false end private # Takes a current snapshot of the document's state, sufficient to # reconstruct it after it was amended. # def take_snapshot # current_page holds a ref to the Pages dictionary which grows # monotonically as data is added to the document, so we share that # between the old and new copies. {:page_content => state.page.content.deep_copy, :current_page => state.page.dictionary.deep_copy(share=[:Parent]), :bounds => bounds.deep_copy, :page_number => page_number, :page_kids => state.store.pages.data[:Kids].compact.map{|kid| kid.identifier}, :dests => names? && names.data[:Dests].deep_copy} end # Rolls the page state back to the state of the given snapshot. # def restore_snapshot(shot) page = state.page # Because these objects are referenced by identifier from the Pages # dictionary, we can't just restore them over the current refs in # page_content and current_page. We have to restore them over the old # ones. page.content = shot[:page_content].identifier page.content.replace shot[:page_content] page.dictionary = shot[:current_page].identifier page.dictionary.replace shot[:current_page] page.dictionary.data[:Contents] = page.content self.page_number = shot[:page_number] state.store.pages.data[:Kids] = shot[:page_kids].map{|id| state.store[id]} state.store.pages.data[:Count] = shot[:page_kids].size self.bounds = BoundingBox.restore_deep_copy(shot[:bounds], self) if shot[:dests] names.data[:Dests] = shot[:dests] end end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/document/bounding_box.rb0000644000000000000000000003620212114176157022605 0ustar rootroot# encoding: utf-8 # bounding_box.rb : Implements a mechanism for shifting the coordinate space # # Copyright May 2008, Gregory Brown. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. module Prawn class Document # :call-seq: # bounding_box(point, options={}, &block) # # A bounding box serves two important purposes: # * Provide bounds for flowing text, starting at a given point # * Translate the origin (0,0) for graphics primitives # # A point and :width must be provided. :height is optional. # (See stretchyness below) # # ==Positioning # # Bounding boxes are positioned relative to their top left corner and # the width measurement is towards the right and height measurement is # downwards. # # Usage: # # * Bounding box 100pt x 100pt in the absolute bottom left of the # containing box: # # pdf.bounding_box([0,100], :width => 100, :height => 100) # stroke_bounds # end # # * Bounding box 200pt x 400pt high in the center of the page: # # x_pos = ((bounds.width / 2) - 150) # y_pos = ((bounds.height / 2) + 200) # pdf.bounding_box([x_pos, y_pos], :width => 300, :height => 400) do # stroke_bounds # end # # ==Flowing Text # # When flowing text, the usage of a bounding box is simple. Text will # begin at the point specified, flowing the width of the bounding box. # After the block exits, the cursor position will be moved to # the bottom of the bounding box (y - height). If flowing text exceeds # the height of the bounding box, the text will be continued on the next # page, starting again at the top-left corner of the bounding box. # # Usage: # # pdf.bounding_box([100,500], :width => 100, :height => 300) do # pdf.text "This text will flow in a very narrow box starting" + # "from [100,500]. The pointer will then be moved to [100,200]" + # "and return to the margin_box" # end # # Note, this is a low level tool and is designed primarily for building # other abstractions. If you just need to flow text on the page, you # will want to look at span() and text_box() instead # # ==Translating Coordinates # # When translating coordinates, the idea is to allow the user to draw # relative to the origin, and then translate their drawing to a specified # area of the document, rather than adjust all their drawing coordinates # to match this new region. # # Take for example two triangles which share one point, drawn from the # origin: # # pdf.polygon [0,250], [0,0], [150,100] # pdf.polygon [100,0], [150,100], [200,0] # # It would be easy enough to translate these triangles to another point, # e.g [200,200] # # pdf.polygon [200,450], [200,200], [350,300] # pdf.polygon [300,200], [350,300], [400,200] # # However, each time you want to move the drawing, you'd need to alter # every point in the drawing calls, which as you might imagine, can become # tedious. # # If instead, we think of the drawing as being bounded by a box, we can # see that the image is 200 points wide by 250 points tall. # # To translate it to a new origin, we simply select a point at (x,y+height) # # Using the [200,200] example: # # pdf.bounding_box([200,450], :width => 200, :height => 250) do # pdf.stroke do # pdf.polygon [0,250], [0,0], [150,100] # pdf.polygon [100,0], [150,100], [200,0] # end # end # # Notice that the drawing is still relative to the origin. If we want to # move this drawing around the document, we simply need to recalculate the # top-left corner of the rectangular bounding-box, and all of our graphics # calls remain unmodified. # # ==Nesting Bounding Boxes # # At the top level, bounding boxes are specified relative to the document's # margin_box (which is itself a bounding box). You can also nest bounding # boxes, allowing you to build components which are relative to each other # # Usage: # # pdf.bounding_box([200,450], :width => 200, :height => 250) do # pdf.stroke_bounds # Show the containing bounding box # pdf.bounding_box([50,200], :width => 50, :height => 50) do # # a 50x50 bounding box that starts 50 pixels left and 50 pixels down # # the parent bounding box. # pdf.stroke_bounds # end # end # # ==Stretchyness # # If you do not specify a height to a bounding box, it will become stretchy # and its height will be calculated automatically as you stretch the box # downwards. # # pdf.bounding_box([100,400], :width => 400) do # pdf.text("The height of this box is #{pdf.bounds.height}") # pdf.text('this is some text') # pdf.text('this is some more text') # pdf.text('and finally a bit more') # pdf.text("Now the height of this box is #{pdf.bounds.height}") # end # # ==Absolute Positioning # # If you wish to position the bounding boxes at absolute coordinates rather # than relative to the margins or other bounding boxes, you can use canvas() # # pdf.bounding_box([50,500], :width => 200, :height => 300) do # pdf.stroke_bounds # pdf.canvas do # Positioned outside the containing box at the 'real' (300,450) # pdf.bounding_box([300,450], :width => 200, :height => 200) do # pdf.stroke_bounds # end # end # end # # Of course, if you use canvas, you will be responsible for ensuring that # you remain within the printable area of your document. # def bounding_box(pt, *args, &block) init_bounding_box(block) do |parent_box| pt = map_to_absolute(pt) @bounding_box = BoundingBox.new(self, parent_box, pt, *args) end end # A shortcut to produce a bounding box which is mapped to the document's # absolute coordinates, regardless of how things are nested or margin sizes. # # pdf.canvas do # pdf.line pdf.bounds.bottom_left, pdf.bounds.top_right # end # def canvas(&block) init_bounding_box(block, :hold_position => true) do |_| # Canvas bbox acts like margin_box in that its parent bounds are unset. @bounding_box = BoundingBox.new(self, nil, [0,page.dimensions[3]], :width => page.dimensions[2], :height => page.dimensions[3] ) end end private def init_bounding_box(user_block, options={}, &init_block) unless user_block raise ArgumentError, "bounding boxes require a block to be drawn within the box" end parent_box = @bounding_box init_block.call(parent_box) self.y = @bounding_box.absolute_top user_block.call unless options[:hold_position] || @bounding_box.stretchy? self.y = @bounding_box.absolute_bottom end created_box, @bounding_box = @bounding_box, parent_box return created_box end # Low level layout helper that simplifies coordinate math. # # See Prawn::Document#bounding_box for a description of what this class # is used for. # class BoundingBox def initialize(document, parent, point, options={}) #:nodoc: unless options[:width] raise ArgumentError, "BoundingBox needs the :width option to be set" end @document = document @parent = parent @x, @y = point @width, @height = options[:width], options[:height] @total_left_padding = 0 @total_right_padding = 0 @stretched_height = nil end attr_reader :document, :parent # The current indentation of the left side of the bounding box. attr_reader :total_left_padding # The current indentation of the right side of the bounding box. attr_reader :total_right_padding # The translated origin (x,y-height) which describes the location # of the bottom left corner of the bounding box # def anchor [@x, @y - height] end # Relative left x-coordinate of the bounding box. (Always 0) # # Example, position some text 3 pts from the left of the containing box: # # draw_text('hello', :at => [(bounds.left + 3), 0]) # def left 0 end # Temporarily adjust the @x coordinate to allow for left_padding # # Example: # # indent 20 do # text "20 points in" # indent 30 do # text "50 points in" # end # end # # indent 20, 20 do # text "indented on both sides" # end # def indent(left_padding, right_padding = 0, &block) add_left_padding(left_padding) add_right_padding(right_padding) yield ensure @document.bounds.subtract_left_padding(left_padding) @document.bounds.subtract_right_padding(right_padding) end # Increase the left padding of the bounding box. def add_left_padding(left_padding) @total_left_padding += left_padding @x += left_padding @width -= left_padding end # Decrease the left padding of the bounding box. def subtract_left_padding(left_padding) @total_left_padding -= left_padding @x -= left_padding @width += left_padding end # Increase the right padding of the bounding box. def add_right_padding(right_padding) @total_right_padding += right_padding @width -= right_padding end # Decrease the right padding of the bounding box. def subtract_right_padding(right_padding) @total_right_padding -= right_padding @width += right_padding end # Relative right x-coordinate of the bounding box. (Equal to the box width) # # Example, position some text 3 pts from the right of the containing box: # # draw_text('hello', :at => [(bounds.right - 3), 0]) # def right @width end # Relative top y-coordinate of the bounding box. (Equal to the box height) # # Example, position some text 3 pts from the top of the containing box: # # draw_text('hello', :at => [0, (bounds.top - 3)]) # def top height end # Relative bottom y-coordinate of the bounding box (Always 0) # # Example, position some text 3 pts from the bottom of the containing box: # # draw_text('hello', :at => [0, (bounds.bottom + 3)]) # def bottom 0 end # Relative top-left point of the bounding_box # # Example, draw a line from the top left of the box diagonally to the # bottom right: # # stroke do # line(bounds.top_left, bounds.bottom_right) # end # def top_left [left,top] end # Relative top-right point of the bounding box # # Example, draw a line from the top_right of the box diagonally to the # bottom left: # # stroke do # line(bounds.top_right, bounds.bottom_left) # end # def top_right [right,top] end # Relative bottom-right point of the bounding box # # Example, draw a line along the right hand side of the page: # # stroke do # line(bounds.bottom_right, bounds.top_right) # end # def bottom_right [right,bottom] end # Relative bottom-left point of the bounding box # # Example, draw a line along the left hand side of the page: # # stroke do # line(bounds.bottom_left, bounds.top_left) # end # def bottom_left [left,bottom] end # Absolute left x-coordinate of the bounding box # def absolute_left @x end # Absolute right x-coordinate of the bounding box # def absolute_right @x + width end # Absolute top y-coordinate of the bounding box # def absolute_top @y end # Absolute bottom y-coordinate of the bottom box # def absolute_bottom @y - height end # Absolute top-left point of the bounding box # def absolute_top_left [absolute_left, absolute_top] end # Absolute top-right point of the bounding box # def absolute_top_right [absolute_right, absolute_top] end # Absolute bottom-left point of the bounding box # def absolute_bottom_left [absolute_left, absolute_bottom] end # Absolute bottom-left point of the bounding box # def absolute_bottom_right [absolute_right, absolute_bottom] end # Width of the bounding box # def width @width end # Height of the bounding box. If the box is 'stretchy' (unspecified # height attribute), height is calculated as the distance from the top of # the box to the current drawing position. # def height return @height if @height @stretched_height = [(absolute_top - @document.y), @stretched_height.to_f].max end # an alias for absolute_left def left_side absolute_left end # an alias for absolute_right def right_side absolute_right end # Moves to the top of the next page of the document, starting a new page # if necessary. # def move_past_bottom if @document.page_number == @document.page_count @document.start_new_page else @document.go_to_page(@document.page_number + 1) end end alias_method :update_height, :height # Returns +false+ when the box has a defined height, +true+ when the height # is being calculated on the fly based on the current vertical position. # def stretchy? !@height end # Returns the innermost non-stretchy bounding box. # def reference_bounds if stretchy? raise "Can't find reference bounds: my parent is unset" unless @parent @parent.reference_bounds else self end end # Returns a deep copy of these bounds (including all parent bounds but # not copying the reference to the Document). # def deep_copy copy = dup # Deep-copy the parent bounds copy.instance_variable_set("@parent", if BoundingBox === @parent @parent.deep_copy end) copy.instance_variable_set("@document", nil) copy end # Restores a copy of the bounds taken by BoundingBox.deep_copy in the # context of the given +document+. Does *not* set the bounds of the # document to the resulting BoundingBox, only returns it. # def self.restore_deep_copy(bounds, document) bounds.instance_variable_set("@document", document) bounds end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/document/column_box.rb0000644000000000000000000000712112114176157022273 0ustar rootroot# encoding: utf-8 # # column_box.rb: Extends BoundingBox to allow for columns of text # # Author Paul Ostazeski. require "prawn/document/bounding_box" module Prawn class Document # A column box is a bounding box with the additional property that when # text flows past the bottom, it will wrap first to another column on the # same page, and only flow to the next page when all the columns are # filled. # # column_box accepts the same parameters as bounding_box, as well as the # number of :columns and a :spacer (in points) between columns. # # Defaults are :columns = 3 and :spacer = font_size # # Under PDF::Writer, "spacer" was known as "gutter" # def column_box(*args, &block) init_column_box(block) do |parent_box| map_to_absolute!(args[0]) @bounding_box = ColumnBox.new(self, parent_box, *args) end end private def init_column_box(user_block, options={}, &init_block) parent_box = @bounding_box init_block.call(parent_box) self.y = @bounding_box.absolute_top user_block.call self.y = @bounding_box.absolute_bottom unless options[:hold_position] @bounding_box = parent_box end # Implements the necessary functionality to allow Document#column_box to # work. # class ColumnBox < BoundingBox def initialize(document, parent, point, options={}) #:nodoc: super @columns = options[:columns] || 3 @spacer = options[:spacer] || @document.font_size @current_column = 0 end # The column width, not the width of the whole box, # before left and/or right padding def bare_column_width (@width - @spacer * (@columns - 1)) / @columns end # The column width after padding. # Used to calculate how long a line of text can be. # def width bare_column_width - (@total_left_padding + @total_right_padding) end # Column width including the spacer. # def width_of_column bare_column_width + @spacer end # x coordinate of the left edge of the current column # def left_side absolute_left + (width_of_column * @current_column) end # Relative position of the left edge of the current column # def left width_of_column * @current_column end # x co-orordinate of the right edge of the current column # def right_side columns_from_right = @columns - (1 + @current_column) absolute_right - (width_of_column * columns_from_right) end # Relative position of the right edge of the current column. # def right left + width end # Moves to the next column or starts a new page if currently positioned at # the rightmost column. def move_past_bottom @current_column = (@current_column + 1) % @columns @document.y = @y if 0 == @current_column @document.start_new_page end end # Override the padding functions so as not to split the padding amount # between all columns on the page. def add_left_padding(left_padding) @total_left_padding += left_padding @x += left_padding end def subtract_left_padding(left_padding) @total_left_padding -= left_padding @x -= left_padding end def add_right_padding(right_padding) @total_right_padding += right_padding end def subtract_right_padding(right_padding) @total_right_padding -= right_padding end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/document/graphics_state.rb0000644000000000000000000000673112114176157023134 0ustar rootroot# encoding: utf-8 # # graphics_state.rb: Implements graphics state saving and restoring # # Copyright January 2010, Michael Witrant. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. # module Prawn class GraphicStateStack attr_accessor :stack def initialize(previous_state = nil) self.stack = [GraphicState.new(previous_state)] end def save_graphic_state(graphic_state = nil) stack.push(GraphicState.new(graphic_state || current_state)) end def restore_graphic_state if stack.empty? raise Prawn::Errors::EmptyGraphicStateStack, "\n You have reached the end of the graphic state stack" end stack.pop end def current_state stack.last end def present? stack.size > 0 end def empty? stack.empty? end end class GraphicState attr_accessor :color_space, :dash, :cap_style, :join_style, :line_width, :fill_color, :stroke_color def initialize(previous_state = nil) @color_space = previous_state ? previous_state.color_space.dup : {} @fill_color = previous_state ? previous_state.fill_color : "000000" @stroke_color = previous_state ? previous_state.stroke_color : "000000" @dash = previous_state ? previous_state.dash : { :dash => nil, :space => nil, :phase => 0 } @cap_style = previous_state ? previous_state.cap_style : :butt @join_style = previous_state ? previous_state.join_style : :miter @line_width = previous_state ? previous_state.line_width : 1 end def dash_setting "[#{@dash[:dash]} #{@dash[:space]}] #{@dash[:phase]} d" end end module Core class Page module GraphicsState def graphic_state stack.current_state end end end end class Document module GraphicsState # Pushes the current graphics state on to the graphics state stack so we # can restore it when finished with a change we want to isolate (such as # modifying the transformation matrix). Used in pairs with # restore_graphics_state or passed a block # # Example without a block: # # save_graphics_state # rotate 30 # text "rotated text" # restore_graphics_state # # Example with a block: # # save_graphics_state do # rotate 30 # text "rotated text" # end # def open_graphics_state add_content "q" end def close_graphics_state add_content "Q" end def save_graphics_state(graphic_state = nil) graphic_stack.save_graphic_state(graphic_state) open_graphics_state if block_given? yield restore_graphics_state end end # Pops the last saved graphics state off the graphics state stack and # restores the state to those values def restore_graphics_state if graphic_stack.empty? raise Prawn::Errors::EmptyGraphicStateStack, "\n You have reached the end of the graphic state stack" end close_graphics_state graphic_stack.restore_graphic_state end def graphic_stack state.page.stack end def graphic_state save_graphics_state unless graphic_stack.current_state graphic_stack.current_state end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/document/page_geometry.rb0000644000000000000000000001112612114176157022755 0ustar rootroot# encoding: utf-8 # page_geometry.rb : Describes PDF page geometries # # Copyright April 2008, Gregory Brown. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. module Prawn class Document # Dimensions pulled from PDF::Writer, rubyforge.org/projects/ruby-pdf # # All of these dimensions are in PDF Points, see Prawn::Measurements for # conversion utilities. # # Additionally, if the size you are after is not listed below, you can always # specify your size by passing an array of width and height to Prawn::Document.new # like: # # Prawn::Document.new(:page_size => [1000, 20000]) # # The sizes below can be used by passing the appropriate string to :size: # # Prawn::Document.new(:page_size => '2A0') # # ===Inbuilt Sizes: # # # 4A0:: => 4767.87 x 6740.79 # 2A0:: => 3370.39 x 4767.87 # A0:: => 2383.94 x 3370.39 # A1:: => 1683.78 x 2383.94 # A2:: => 1190.55 x 1683.78 # A3:: => 841.89 x 1190.55 # A4:: => 595.28 x 841.89 # A5:: => 419.53 x 595.28 # A6:: => 297.64 x 419.53 # A7:: => 209.76 x 297.64 # A8:: => 147.40 x 209.76 # A9:: => 104.88 x 147.40 # A10:: => 73.70 x 104.88 # B0:: => 2834.65 x 4008.19 # B1:: => 2004.09 x 2834.65 # B2:: => 1417.32 x 2004.09 # B3:: => 1000.63 x 1417.32 # B4:: => 708.66 x 1000.63 # B5:: => 498.90 x 708.66 # B6:: => 354.33 x 498.90 # B7:: => 249.45 x 354.33 # B8:: => 175.75 x 249.45 # B9:: => 124.72 x 175.75 # B10:: => 87.87 x 124.72 # C0:: => 2599.37 x 3676.54 # C1:: => 1836.85 x 2599.37 # C2:: => 1298.27 x 1836.85 # C3:: => 918.43 x 1298.27 # C4:: => 649.13 x 918.43 # C5:: => 459.21 x 649.13 # C6:: => 323.15 x 459.21 # C7:: => 229.61 x 323.15 # C8:: => 161.57 x 229.61 # C9:: => 113.39 x 161.57 # C10:: => 79.37 x 113.39 # RA0:: => 2437.80 x 3458.27 # RA1:: => 1729.13 x 2437.80 # RA2:: => 1218.90 x 1729.13 # RA3:: => 864.57 x 1218.90 # RA4:: => 609.45 x 864.57 # SRA0:: => 2551.18 x 3628.35 # SRA1:: => 1814.17 x 2551.18 # SRA2:: => 1275.59 x 1814.17 # SRA3:: => 907.09 x 1275.59 # SRA4:: => 637.80 x 907.09 # EXECUTIVE:: => 521.86 x 756.00 # FOLIO:: => 612.00 x 936.00 # LEGAL:: => 612.00 x 1008.00 # LETTER:: => 612.00 x 792.00 # TABLOID:: => 792.00 x 1224.00 # module PageGeometry SIZES = { "4A0" => [4767.87, 6740.79], "2A0" => [3370.39, 4767.87], "A0" => [2383.94, 3370.39], "A1" => [1683.78, 2383.94], "A2" => [1190.55, 1683.78], "A3" => [841.89, 1190.55], "A4" => [595.28, 841.89], "A5" => [419.53, 595.28], "A6" => [297.64, 419.53], "A7" => [209.76, 297.64], "A8" => [147.40, 209.76], "A9" => [104.88, 147.40], "A10" => [73.70, 104.88], "B0" => [2834.65, 4008.19], "B1" => [2004.09, 2834.65], "B2" => [1417.32, 2004.09], "B3" => [1000.63, 1417.32], "B4" => [708.66, 1000.63], "B5" => [498.90, 708.66], "B6" => [354.33, 498.90], "B7" => [249.45, 354.33], "B8" => [175.75, 249.45], "B9" => [124.72, 175.75], "B10" => [87.87, 124.72], "C0" => [2599.37, 3676.54], "C1" => [1836.85, 2599.37], "C2" => [1298.27, 1836.85], "C3" => [918.43, 1298.27], "C4" => [649.13, 918.43], "C5" => [459.21, 649.13], "C6" => [323.15, 459.21], "C7" => [229.61, 323.15], "C8" => [161.57, 229.61], "C9" => [113.39, 161.57], "C10" => [79.37, 113.39], "RA0" => [2437.80, 3458.27], "RA1" => [1729.13, 2437.80], "RA2" => [1218.90, 1729.13], "RA3" => [864.57, 1218.90], "RA4" => [609.45, 864.57], "SRA0" => [2551.18, 3628.35], "SRA1" => [1814.17, 2551.18], "SRA2" => [1275.59, 1814.17], "SRA3" => [907.09, 1275.59], "SRA4" => [637.80, 907.09], "EXECUTIVE" => [521.86, 756.00], "FOLIO" => [612.00, 936.00], "LEGAL" => [612.00, 1008.00], "LETTER" => [612.00, 792.00], "TABLOID" => [792.00, 1224.00] } end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/document/internals.rb0000644000000000000000000001276112114176157022133 0ustar rootroot# encoding: utf-8 # # internals.rb : Implements document internals for Prawn # # Copyright August 2008, Gregory Brown. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. module Prawn class Document # This module exposes a few low-level PDF features for those who want # to extend Prawn's core functionality. If you are not comfortable with # low level PDF functionality as defined by Adobe's specification, chances # are you won't need anything you find here. # module Internals # Creates a new Prawn::Reference and adds it to the Document's object # list. The +data+ argument is anything that Prawn::PdfObject() can convert. # # Returns the identifier which points to the reference in the ObjectStore # def ref(data) ref!(data).identifier end # Like ref, but returns the actual reference instead of its identifier. # # While you can use this to build up nested references within the object # tree, it is recommended to persist only identifiers, and them provide # helper methods to look up the actual references in the ObjectStore # if needed. If you take this approach, Prawn::Document::Snapshot # will probably work with your extension # def ref!(data) state.store.ref(data) end # At any stage in the object tree an object can be replaced with an # indirect reference. To get access to the object safely, regardless # of if it's hidden behind a Prawn::Reference, wrap it in deref(). # def deref(obj) obj.is_a?(Prawn::Core::Reference) ? obj.data : obj end # Appends a raw string to the current page content. # # # Raw line drawing example: # x1,y1,x2,y2 = 100,500,300,550 # pdf.add_content("%.3f %.3f m" % [ x1, y1 ]) # move # pdf.add_content("%.3f %.3f l" % [ x2, y2 ]) # draw path # pdf.add_content("S") # stroke # def add_content(str) save_graphics_state if graphic_state.nil? state.page.content << str << "\n" end # The Name dictionary (PDF spec 3.6.3) for this document. It is # lazily initialized, so that documents that do not need a name # dictionary do not incur the additional overhead. # def names state.store.root.data[:Names] ||= ref!(:Type => :Names) end # Returns true if the Names dictionary is in use for this document. # def names? state.store.root.data[:Names] end # Defines a block to be called just before the document is rendered. # def before_render(&block) state.before_render_callbacks << block end # Defines a block to be called just before a new page is started. # def on_page_create(&block) if block_given? state.on_page_create_callback = block else state.on_page_create_callback = nil end end private # adds a new, empty content stream to each page. Used in templating so # that imported content streams can be left pristine # def fresh_content_streams(options={}) (1..page_count).each do |i| go_to_page i state.page.new_content_stream apply_margin_options(options) generate_margin_box use_graphic_settings(options[:template]) end end def finalize_all_page_contents (1..page_count).each do |i| go_to_page i repeaters.each { |r| r.run(i) } while graphic_stack.present? restore_graphics_state end state.page.finalize end end # raise the PDF version of the file we're going to generate. # A private method, designed for internal use when the user adds a feature # to their document that requires a particular version. # def min_version(min) state.version = min if min > state.version end # Write out the PDF Header, as per spec 3.4.1 # def render_header(output) state.before_render_actions(self) # pdf version output << "%PDF-#{state.version}\n" # 4 binary chars, as recommended by the spec output << "%\xFF\xFF\xFF\xFF\n" end # Write out the PDF Body, as per spec 3.4.2 # def render_body(output) state.render_body(output) end # Write out the PDF Cross Reference Table, as per spec 3.4.3 # def render_xref(output) @xref_offset = output.size output << "xref\n" output << "0 #{state.store.size + 1}\n" output << "0000000000 65535 f \n" state.store.each do |ref| output.printf("%010d", ref.offset) output << " 00000 n \n" end end # Write out the PDF Trailer, as per spec 3.4.4 # def render_trailer(output) trailer_hash = {:Size => state.store.size + 1, :Root => state.store.root, :Info => state.store.info} trailer_hash.merge!(state.trailer) if state.trailer output << "trailer\n" output << Prawn::Core::PdfObject(trailer_hash) << "\n" output << "startxref\n" output << @xref_offset << "\n" output << "%%EOF" << "\n" end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/document/span.rb0000644000000000000000000000320212114176157021063 0ustar rootroot# encoding: utf-8 # span.rb : Implements text columns # # Copyright September 2008, Gregory Brown. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. module Prawn class Document # A span is a special purpose bounding box that allows a column of # elements to be positioned relative to the margin_box. # # Arguments: # +width+:: The width of the column in PDF points # # Options: # :position:: One of :left, :center, :right or an x offset # # This method is typically used for flowing a column of text from one # page to the next. # # span(350, :position => :center) do # text "Here's some centered text in a 350 point column. " * 100 # end # def span(width, options={}) Prawn.verify_options [:position], options original_position = self.y # FIXME: Any way to move this upstream? left_boundary = case(options[:position] || :left) when :left margin_box.absolute_left when :center margin_box.absolute_left + margin_box.width / 2.0 - width /2.0 when :right margin_box.absolute_right - width when Numeric margin_box.absolute_left + options[:position] else raise ArgumentError, "Invalid option for :position" end # we need to bust out of whatever nested bounding boxes we're in. canvas do bounding_box([left_boundary, margin_box.absolute_top], :width => width) do self.y = original_position yield end end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/stamp.rb0000644000000000000000000001002512114176157017431 0ustar rootroot# encoding: utf-8 # # stamp.rb : Implements a repeatable stamp # # Copyright October 2009, Daniel Nelson. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. # module Prawn # The Prawn::Stamp module is used to create content that will be # included multiple times in a document. Using a stamp has three # advantages over creating content anew each time it is placed on # the page: # i. faster document creation # ii. smaller final document # iii. faster display on subsequent displays of the repeated # element because the viewer application can cache the rendered # results # # Example: # pdf.create_stamp("my_stamp") { # pdf.fill_circle([10, 15], 5) # pdf.draw_text("hello world", :at => [20, 10]) # } # pdf.stamp("my_stamp") # module Stamp # Renders the stamp named name to the page # raises Prawn::Errors::InvalidName if name.empty? # raises Prawn::Errors::UndefinedObjectName if no stamp # has been created with this name # # Example: # pdf.create_stamp("my_stamp") { # pdf.fill_circle([10, 15], 5) # pdf.text("hello world", :at => [20, 10]) # } # pdf.stamp("my_stamp") # def stamp(name) dictionary_name, dictionary = stamp_dictionary(name) add_content "/#{dictionary_name} Do" state.page.xobjects.merge!(dictionary_name => dictionary) end # Renders the stamp named name at a position offset from # the initial coords at which the elements of the stamp was # created # # Example: # pdf.create_stamp("circle") do # pdf.fill_circle([0, 0], 25) # end # # draws a circle at 100, 100 # pdf.stamp_at("circle", [100, 100]) # # See stamp() for exceptions that might be raised # def stamp_at(name, point) translate(point[0], point[1]) { stamp(name) } end # Creates a re-usable stamp named name # # raises Prawn::Errors::NameTaken if a stamp already # exists in this document with this name # raises Prawn::Errors::InvalidName if name.empty? # # Example: # pdf.create_stamp("my_stamp") { # pdf.fill_circle([10, 15], 5) # pdf.draw_text("hello world", :at => [20, 10]) # } # def create_stamp(name, &block) dictionary = create_stamp_dictionary(name) state.page.stamp_stream(dictionary, &block) end private def stamp_dictionary_registry @stamp_dictionary_registry ||= {} end def next_stamp_dictionary_id stamp_dictionary_registry.length + 1 end def stamp_dictionary(name) raise Prawn::Errors::InvalidName if name.empty? if stamp_dictionary_registry[name].nil? raise Prawn::Errors::UndefinedObjectName end dict = stamp_dictionary_registry[name] dictionary_name = dict[:stamp_dictionary_name] dictionary = dict[:stamp_dictionary] [dictionary_name, dictionary] end def create_stamp_dictionary(name) raise Prawn::Errors::InvalidName if name.empty? raise Prawn::Errors::NameTaken unless stamp_dictionary_registry[name].nil? # BBox origin is the lower left margin of the page, so we need # it to be the full dimension of the page, or else things that # should appear near the top or right margin are invisible dictionary = ref!(:Type => :XObject, :Subtype => :Form, :BBox => [0, 0, state.page.dimensions[2], state.page.dimensions[3]]) dictionary_name = "Stamp#{next_stamp_dictionary_id}" stamp_dictionary_registry[name] = { :stamp_dictionary_name => dictionary_name, :stamp_dictionary => dictionary } dictionary end def freeze_stamp_graphics update_colors write_line_width write_stroke_cap_style write_stroke_join_style write_stroke_dash end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/encoding.rb0000644000000000000000000001232512114176157020100 0ustar rootroot# encoding: utf-8 # # Copyright September 2008, Gregory Brown, James Healy All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. # module Prawn module Encoding # Map between unicode and WinAnsiEnoding # class WinAnsi #:nodoc: CHARACTERS = %w[ .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef space exclam quotedbl numbersign dollar percent ampersand quotesingle parenleft parenright asterisk plus comma hyphen period slash zero one two three four five six seven eight nine colon semicolon less equal greater question at A B C D E F G H I J K L M N O P Q R S T U V W X Y Z bracketleft backslash bracketright asciicircum underscore grave a b c d e f g h i j k l m n o p q r s t u v w x y z braceleft bar braceright asciitilde .notdef Euro .notdef quotesinglbase florin quotedblbase ellipsis dagger daggerdbl circumflex perthousand Scaron guilsinglleft OE .notdef Zcaron .notdef .notdef quoteleft quoteright quotedblleft quotedblright bullet endash emdash tilde trademark scaron guilsinglright oe .notdef zcaron ydieresis space exclamdown cent sterling currency yen brokenbar section dieresis copyright ordfeminine guillemotleft logicalnot hyphen registered macron degree plusminus twosuperior threesuperior acute mu paragraph periodcentered cedilla onesuperior ordmasculine guillemotright onequarter onehalf threequarters questiondown Agrave Aacute Acircumflex Atilde Adieresis Aring AE Ccedilla Egrave Eacute Ecircumflex Edieresis Igrave Iacute Icircumflex Idieresis Eth Ntilde Ograve Oacute Ocircumflex Otilde Odieresis multiply Oslash Ugrave Uacute Ucircumflex Udieresis Yacute Thorn germandbls agrave aacute acircumflex atilde adieresis aring ae ccedilla egrave eacute ecircumflex edieresis igrave iacute icircumflex idieresis eth ntilde ograve oacute ocircumflex otilde odieresis divide oslash ugrave uacute ucircumflex udieresis yacute thorn ydieresis ] def initialize @mapping_file = "#{Prawn::DATADIR}/encodings/win_ansi.txt" load_mapping if self.class.mapping.empty? end # Converts a Unicode codepoint into a valid WinAnsi single byte character. # # If there is no WinAnsi equivlant for a character, a _ will be substituted. # def [](codepoint) # unicode codepoints < 255 map directly to the single byte value in WinAnsi return codepoint if codepoint <= 255 # There are a handful of codepoints > 255 that have equivilants in WinAnsi. # Replace anything else with an underscore self.class.mapping[codepoint] || 95 end def self.mapping @mapping ||= {} end private def load_mapping RUBY_VERSION >= "1.9" ? mode = "r:BINARY" : mode = "r" File.open(@mapping_file, mode) do |f| f.each do |l| m, single_byte, unicode = *l.match(/([0-9A-Za-z]+);([0-9A-F]{4})/) self.class.mapping["0x#{unicode}".hex] = "0x#{single_byte}".hex if single_byte end end end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/measurements.rb0000644000000000000000000000246512114176157021026 0ustar rootroot# encoding: utf-8 # measurements.rb: Conversions from other measurements to PDF points # # Copyright December 2008, Florian Witteler. All Rights Reserved. # module Prawn module Measurements # ============================================================================ #metric conversions def cm2mm(cm) return cm*10 end def dm2mm(dm) return dm*100 end def m2mm(m) return m*1000 end # ============================================================================ # imperial conversions # from http://en.wikipedia.org/wiki/Imperial_units def ft2in(ft) return ft * 12 end def yd2in(yd) return yd*36 end # ============================================================================ # PostscriptPoint-converisons def in2pt(inch) return inch * 72 end def ft2pt(ft) return in2pt(ft2in(ft)) end def yd2pt(yd) return in2pt(yd2in(yd)) end def mm2pt(mm) return mm*(72 / 25.4) end def cm2pt(cm) return mm2pt(cm2mm(cm)) end def dm2pt(dm) return mm2pt(dm2mm(dm)) end def m2pt(m) return mm2pt(m2mm(m)) end def pt2mm(pt) return pt * 1 / mm2pt(1)# (25.4 / 72) end end endruby-prawn-1.0.0~rc2.orig/lib/prawn/repeater.rb0000644000000000000000000000631412114176157020122 0ustar rootroot# encoding: utf-8 # # repeater.rb : Implements repeated page elements. # Heavy inspired by repeating_element() in PDF::Wrapper # http://pdf-wrapper.rubyforge.org/ # # Copyright November 2009, Gregory Brown. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. module Prawn class Document # A list of all repeaters in the document. # See Document#repeat for details # def repeaters @repeaters ||= [] end # Provides a way to execute a block of code repeatedly based on a # page_filter. Since Stamp is used under the hood, this method is very space # efficient. # # Available page filters are: # :all -- repeats on every page # :odd -- repeats on odd pages # :even -- repeats on even pages # some_array -- repeats on every page listed in the array # some_range -- repeats on every page included in the range # some_lambda -- yields page number and repeats for true return values # # Also accepts an optional second argument for dynamic content which executes the code # in the context of the filtered pages without using a Stamp. # # Example: # # Prawn::Document.generate("repeat.pdf", :skip_page_creation => true) do # # repeat :all do # draw_text "ALLLLLL", :at => bounds.top_left # end # # repeat :odd do # draw_text "ODD", :at => [0,0] # end # # repeat :even do # draw_text "EVEN", :at => [0,0] # end # # repeat [1,2] do # draw_text "[1,2]", :at => [100,0] # end # # repeat 2..4 do # draw_text "2..4", :at => [200,0] # end # # repeat(lambda { |pg| pg % 3 == 0 }) do # draw_text "Every third", :at => [250, 20] # end # # 10.times do # start_new_page # draw_text "A wonderful page", :at => [400,400] # end # # repeat(:all, :dynamic => true) do # text page_number, :at => [500, 0] # end # # end # def repeat(page_filter, options={}, &block) repeaters << Prawn::Repeater.new(self, page_filter, !!options[:dynamic], &block) end end class Repeater #:nodoc: class << self attr_writer :count def count @count ||= 0 end end attr_reader :name def initialize(document, page_filter, dynamic = false, &block) @document = document @page_filter = page_filter @dynamic = dynamic @stamp_name = "prawn_repeater(#{Repeater.count})" @document.create_stamp(@stamp_name, &block) unless dynamic @block = block if dynamic @graphic_state = document.state.page.graphic_state.dup Repeater.count += 1 end def match?(page_number) @document.page_match?(@page_filter, page_number) end def run(page_number) if !@dynamic @document.stamp(@stamp_name) if match?(page_number) elsif @block && match?(page_number) @document.save_graphics_state(@graphic_state) do @document.send(:freeze_stamp_graphics) @block.call end end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/font.rb0000644000000000000000000003124012114176157017255 0ustar rootroot# encoding: utf-8 # # font.rb : The Prawn font class # # Copyright May 2008, Gregory Brown / James Healy. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. # require "prawn/font/afm" require "prawn/font/ttf" require "prawn/font/dfont" module Prawn class Document # Without arguments, this returns the currently selected font. Otherwise, # it sets the current font. When a block is used, the font is applied # transactionally and is rolled back when the block exits. # # Prawn::Document.generate("font.pdf") do # text "Default font is Helvetica" # # font "Times-Roman" # text "Now using Times-Roman" # # font("Chalkboard.ttf") do # text "Using TTF font from file Chalkboard.ttf" # font "Courier", :style => :bold # text "You see this in bold Courier" # end # # text "Times-Roman, again" # end # # The :name parameter must be a string. It can be one of the 14 built-in # fonts supported by PDF, or the location of a TTF file. The Font::AFM::BUILT_INS # array specifies the valid built in font values. # # If a ttf font is specified, the glyphs necessary to render your document # will be embedded in the rendered PDF. This should be your preferred option # in most cases. It will increase the size of the resulting file, but also # make it more portable. # # The options parameter is an optional hash providing size and style. To use # the :style option you need to map those font styles to their respective font files. # See font_families for more information. # def font(name=nil, options={}) return((defined?(@font) && @font) || font("Helvetica")) if name.nil? if state.pages.empty? && !state.page.in_stamp_stream? raise Prawn::Errors::NotOnPage end new_font = find_font(name.to_s, options) if block_given? save_font do set_font(new_font, options[:size]) yield end else set_font(new_font, options[:size]) end @font end # When called with no argument, returns the current font size. # When called with a single argument but no block, sets the current font # size. When a block is used, the font size is applied transactionally and # is rolled back when the block exits. You may still change the font size # within a transactional block for individual text segments, or nested calls # to font_size. # # Prawn::Document.generate("font_size.pdf") do # font_size 16 # text "At size 16" # # font_size(10) do # text "At size 10" # text "At size 6", :size => 6 # text "At size 10" # end # # text "At size 16" # end # # When called without an argument, this method returns the current font # size. # def font_size(points=nil) return @font_size unless points size_before_yield = @font_size @font_size = points block_given? ? yield : return @font_size = size_before_yield end # Sets the font directly, given an actual Font object # and size. # def set_font(font, size=nil) # :nodoc: @font = font @font_size = size if size end # Saves the current font, and then yields. When the block # finishes, the original font is restored. # def save_font @font ||= find_font("Helvetica") original_font = @font original_size = @font_size yield ensure set_font(original_font, original_size) if original_font end # Looks up the given font using the given criteria. Once a font has been # found by that matches the criteria, it will be cached to subsequent lookups # for that font will return the same object. #-- # Challenges involved: the name alone is not sufficient to uniquely identify # a font (think dfont suitcases that can hold multiple different fonts in a # single file). Thus, the :name key is included in the cache key. # # It is further complicated, however, since fonts in some formats (like the # dfont suitcases) can be identified either by numeric index, OR by their # name within the suitcase, and both should hash to the same font object # (to avoid the font being embedded multiple times). This is not yet implemented, # which means if someone selects a font both by name, and by index, the # font will be embedded twice. Since we do font subsetting, this double # embedding won't be catastrophic, just annoying. # ++ def find_font(name, options={}) #:nodoc: if font_families.key?(name) family, name = name, font_families[name][options[:style] || :normal] if name.is_a?(Hash) options = options.merge(name) name = options[:file] end end key = "#{name}:#{options[:font] || 0}" font_registry[key] ||= Font.load(self, name, options.merge(:family => family)) end # Hash of Font objects keyed by names # def font_registry #:nodoc: @font_registry ||= {} end # Hash that maps font family names to their styled individual font names. # # To add support for another font family, append to this hash, e.g: # # pdf.font_families.update( # "MyTrueTypeFamily" => { :bold => "foo-bold.ttf", # :italic => "foo-italic.ttf", # :bold_italic => "foo-bold-italic.ttf", # :normal => "foo.ttf" }) # # This will then allow you to use the fonts like so: # # pdf.font("MyTrueTypeFamily", :style => :bold) # pdf.text "Some bold text" # pdf.font("MyTrueTypeFamily") # pdf.text "Some normal text" # # This assumes that you have appropriate TTF fonts for each style you # wish to support. # # By default the styles :bold, :italic, :bold_italic, and :normal are # defined for fonts "Courier", "Times-Roman" and "Helvetica". # # You probably want to provide those four styles, but are free to define # custom ones, like :thin, and use them in font calls. # def font_families @font_families ||= Hash.new.merge!( { "Courier" => { :bold => "Courier-Bold", :italic => "Courier-Oblique", :bold_italic => "Courier-BoldOblique", :normal => "Courier" }, "Times-Roman" => { :bold => "Times-Bold", :italic => "Times-Italic", :bold_italic => "Times-BoldItalic", :normal => "Times-Roman" }, "Helvetica" => { :bold => "Helvetica-Bold", :italic => "Helvetica-Oblique", :bold_italic => "Helvetica-BoldOblique", :normal => "Helvetica" } }) end # Returns the width of the given string using the given font. If :size is not # specified as one of the options, the string is measured using the current # font size. You can also pass :kerning as an option to indicate whether # kerning should be used when measuring the width (defaults to +false+). # # Note that the string _must_ be encoded properly for the font being used. # For AFM fonts, this is WinAnsi. For TTF, make sure the font is encoded as # UTF-8. You can use the Font#normalize_encoding method to make sure strings # are in an encoding appropriate for the current font. #-- # For the record, this method used to be a method of Font (and still delegates # to width computations on Font). However, having the primary interface for # calculating string widths exist on Font made it tricky to write extensions # for Prawn in which widths are computed differently (e.g., taking formatting # tags into account, or the like). # # By putting width_of here, on Document itself, extensions may easily override # it and redefine the width calculation behavior. #++ def width_of(string, options={}) if options[:inline_format] # Build up an Arranger with the entire string on one line, finalize it, # and find its width. arranger = Core::Text::Formatted::Arranger.new(self, options) arranger.consumed = Text::Formatted::Parser.to_array(string) arranger.finalize_line arranger.line_width else f = if options[:style] # override style with :style => :bold find_font(@font ? @font.name : 'Helvetica', :style => options[:style]) else font end f.compute_width_of(string, options) + (character_spacing * font.character_count(string)) end end end # Provides font information and helper functions. # class Font # The current font name attr_reader :name # The current font family attr_reader :family # The options hash used to initialize the font attr_reader :options # Shortcut interface for constructing a font object. Filenames of the form # *.ttf will call Font::TTF.new, *.dfont Font::DFont.new, and anything else # will be passed through to Font::AFM.new() # def self.load(document,name,options={}) case name.to_s when /\.ttf$/i then TTF.new(document, name, options) when /\.dfont$/i then DFont.new(document, name, options) when /\.afm$/i then AFM.new(document, name, options) else AFM.new(document, name, options) end end def initialize(document,name,options={}) #:nodoc: @document = document @name = name @options = options @family = options[:family] @identifier = generate_unique_id @references = {} end # The size of the font ascender in PDF points # def ascender @ascender / 1000.0 * size end # The size of the font descender in PDF points # def descender -@descender / 1000.0 * size end # The size of the recommended gap between lines of text in PDF points # def line_gap @line_gap / 1000.0 * size end def identifier_for(subset) "#{@identifier}.#{subset}".to_sym end def inspect "#{self.class.name}< #{name}: #{size} >" end # Normalizes the encoding of the string to an encoding supported by the # font. The string is expected to be UTF-8 going in. It will be re-encoded # and the new string will be returned. For an in-place (destructive) # version, see normalize_encoding!. def normalize_encoding(string) raise NotImplementedError, "subclasses of Prawn::Font must implement #normalize_encoding" end # Destructive version of normalize_encoding; normalizes the encoding of a # string in place. # def normalize_encoding!(str) str.replace(normalize_encoding(str)) end # Gets height of current font in PDF points at the given font size # def height_at(size) @normalized_height ||= (@ascender - @descender + @line_gap) / 1000.0 @normalized_height * size end # Gets height of current font in PDF points at current font size # def height height_at(size) end # Registers the given subset of the current font with the current PDF # page. This is safe to call multiple times for a given font and subset, # as it will only add the font the first time it is called. # def add_to_current_page(subset) @references[subset] ||= register(subset) @document.state.page.fonts.merge!(identifier_for(subset) => @references[subset]) end def identifier_for(subset) #:nodoc: "#{@identifier}.#{subset}" end def inspect #:nodoc: "#{self.class.name}< #{name}: #{size} >" end private # generate a font identifier that hasn't been used on the curretn page yet # def generate_unique_id offset, id = 0, nil while id.nil? || page_contains_font_id?(id) offset += 1 id = :"F#{@document.font_registry.size + offset}" end id end # Returns true if the provided font identifier already exists in the document. # This is used when adding new fonts to a document to ensure we don't step # on fonts imported from a template. # # page_contains_font_id?("F1") # => true # def page_contains_font_id?(id) id = id.to_s @document.state.page.fonts.keys.any? { |exist_id| exist_id.to_s[0,id.size] == id } end def size @document.font_size end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/text/0000755000000000000000000000000012114176157016746 5ustar rootrootruby-prawn-1.0.0~rc2.orig/lib/prawn/text/formatted.rb0000644000000000000000000000023212114176157021255 0ustar rootrootrequire "prawn/core/text/formatted/wrap" require "prawn/text/formatted/box" require "prawn/text/formatted/parser" require "prawn/text/formatted/fragment" ruby-prawn-1.0.0~rc2.orig/lib/prawn/text/formatted/0000755000000000000000000000000012114176157020733 5ustar rootrootruby-prawn-1.0.0~rc2.orig/lib/prawn/text/formatted/fragment.rb0000644000000000000000000001324312114176157023066 0ustar rootroot# encoding: utf-8 # text/formatted/fragment.rb : Implements information about a formatted fragment # # Copyright March 2010, Daniel Nelson. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. module Prawn module Text module Formatted # Prawn::Text::Formatted::Fragment is a state store for a formatted text # fragment. It does not render anything. # class Fragment attr_reader :format_state, :text attr_writer :width attr_accessor :line_height, :descender, :ascender attr_accessor :word_spacing, :left, :baseline def initialize(text, format_state, document) @format_state = format_state @document = document @word_spacing = 0 # keep the original value of "text", so we can reinitialize @text if formatting parameters # like text direction are changed @original_text = text @text = process_text(@original_text) end def width if @word_spacing == 0 then @width else @width + @word_spacing * space_count end end def height top - bottom end def subscript? styles.include?(:subscript) end def superscript? styles.include?(:superscript) end def y_offset if subscript? then -descender elsif superscript? then 0.85 * ascender else 0 end end def bounding_box [left, bottom, right, top] end def absolute_bounding_box box = bounding_box box[0] += @document.bounds.absolute_left box[2] += @document.bounds.absolute_left box[1] += @document.bounds.absolute_bottom box[3] += @document.bounds.absolute_bottom box end def underline_points y = baseline - 1.25 [[left, y], [right, y]] end def strikethrough_points y = baseline + ascender * 0.3 [[left, y], [right, y]] end def styles @format_state[:styles] || [] end def link @format_state[:link] end def anchor @format_state[:anchor] end def color @format_state[:color] end def font @format_state[:font] end def size @format_state[:size] end def character_spacing @format_state[:character_spacing] || @document.character_spacing end def direction @format_state[:direction] end def default_direction=(direction) unless @format_state[:direction] @format_state[:direction] = direction @text = process_text(@original_text) end end def include_trailing_white_space! @format_state.delete(:exclude_trailing_white_space) @text = process_text(@original_text) end def space_count @text.count(" ") end def callback_objects callback = @format_state[:callback] if callback.nil? [] elsif callback.is_a?(Array) callback else [callback] end end def right left + width end def top baseline + ascender end def bottom baseline - descender end def top_left [left, top] end def top_right [right, top] end def bottom_right [right, bottom] end def bottom_left [left, bottom] end def absolute_left absolute_bounding_box[0] end def absolute_right absolute_bounding_box[2] end def absolute_top absolute_bounding_box[3] end def absolute_bottom absolute_bounding_box[1] end def absolute_top_left [absolute_left, absolute_top] end def absolute_top_right [absolute_right, absolute_top] end def absolute_bottom_left [absolute_left, absolute_bottom] end def absolute_bottom_right [absolute_right, absolute_bottom] end private def process_text(text) string = strip_zero_width_spaces(text) if exclude_trailing_white_space? string = process_soft_hyphens(string.rstrip) end case direction when :rtl if ruby_18 { true } string.scan(/./mu).reverse.join else string.reverse end else string end end def exclude_trailing_white_space? @format_state[:exclude_trailing_white_space] end def normalized_soft_hyphen @format_state[:normalized_soft_hyphen] end def process_soft_hyphens(string) if string.length > 0 && normalized_soft_hyphen ruby_19 { if string.encoding != normalized_soft_hyphen.encoding string.force_encoding(normalized_soft_hyphen.encoding) end } string[0..-2].gsub(normalized_soft_hyphen, "") + string[-1..-1] else string end end def strip_zero_width_spaces(string) if !"".respond_to?(:encoding) || string.encoding.to_s == "UTF-8" string.gsub(Prawn::Text::ZWSP, "") else string end end end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/text/formatted/parser.rb0000644000000000000000000001770012114176157022561 0ustar rootroot# encoding: utf-8 # text/formatted/parser.rb : Implements a bi-directional parser between a subset # of html and formatted text arrays # # Copyright February 2010, Daniel Nelson. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. # module Prawn module Text module Formatted class Parser PARSER_REGEX = begin regex_string = "\n|" + "||" + "||" + "||" + "||" + "||" + "||" + "]*>||" + "]*>||" + "]*>||" + "||" + "||" + "]*>||" + "[^<\n]+" regex = Regexp.new(regex_string, Regexp::MULTILINE) end def self.to_array(string) tokens = string.gsub(//, "\n").scan(PARSER_REGEX) self.array_from_tokens(tokens) end def self.to_string(array) prefixes = { :bold => "", :italic => "", :underline => "", :strikethrough => "", :subscript => "", :superscript => "" } suffixes = { :bold => "", :italic => "", :underline => "", :strikethrough => "", :subscript => "", :superscript => "" } array.collect do |hash| prefix = "" suffix = "" if hash[:styles] hash[:styles].each do |style| prefix = prefix + prefixes[style] suffix = suffixes[style] + suffix end end font = hash[:font] ? " name='#{hash[:font]}'" : nil size = hash[:size] ? " size='#{hash[:size]}'" : nil if hash[:character_spacing] character_spacing = " character_spacing='#{hash[:character_spacing]}'" else character_spacing = nil end if font || size || character_spacing prefix = prefix + "" suffix = "" end link = hash[:link] ? " href='#{hash[:link]}'" : nil anchor = hash[:anchor] ? " anchor='#{hash[:anchor]}'" : nil if link || anchor prefix = prefix + "" suffix = "" end if hash[:color] if hash[:color].kind_of?(Array) prefix = prefix + "" else prefix = prefix + "" end suffix = "" end string = hash[:text].gsub("&", "&").gsub(">", ">").gsub("<", "<") prefix + string + suffix end.join end def self.array_paragraphs(array) #:nodoc: paragraphs = [] paragraph = [] previous_string = "\n" scan_pattern = /[^\n]+|\n/ array.each do |hash| hash[:text].scan(scan_pattern).each do |string| if string == "\n" paragraph << hash.dup.merge(:text => "\n") if previous_string == "\n" paragraphs << paragraph unless paragraph.empty? paragraph = [] else paragraph << hash.dup.merge(:text => string) end previous_string = string end end paragraphs << paragraph unless paragraph.empty? paragraphs end private def self.array_from_tokens(tokens) array = [] styles = [] colors = [] link = nil anchor = nil fonts = [] sizes = [] character_spacings = [] while token = tokens.shift case token when "", "" styles << :bold when "", "" styles << :italic when "" styles << :underline when "" styles << :strikethrough when "" styles << :subscript when "" styles << :superscript when "", "" styles.delete(:bold) when "", "" styles.delete(:italic) when "" styles.delete(:underline) when "" styles.delete(:strikethrough) when "" styles.delete(:subscript) when "" styles.delete(:superscript) when "", "" link = nil anchor = nil when "" colors.pop when "" fonts.pop sizes.pop character_spacings.pop else if token =~ /^]*>$/ or token =~ /^]*>$/ matches = /href="([^"]*)"/.match(token) || /href='([^']*)'/.match(token) link = matches[1] unless matches.nil? matches = /anchor="([^"]*)"/.match(token) || /anchor='([^']*)'/.match(token) anchor = matches[1] unless matches.nil? elsif token =~ /^]*>$/ matches = /rgb="#?([^"]*)"/.match(token) || /rgb='#?([^']*)'/.match(token) colors << matches[1] if matches matches = /c="#?([^"]*)" +m="#?([^"]*)" +y="#?([^"]*)" +k="#?([^"]*)"/.match(token) || /c='#?([^']*)' +m='#?([^']*)' +y='#?([^']*)' +k='#?([^']*)'/.match(token) colors << [matches[1].to_i, matches[2].to_i, matches[3].to_i, matches[4].to_i] if matches # intend to support rgb="#ffffff" or rgb='#ffffff', # r="255" g="255" b="255" or r='255' g='255' b='255', # and c="100" m="100" y="100" k="100" or # c='100' m='100' y='100' k='100' # color = { :rgb => "#ffffff" } # color = { :r => 255, :g => 255, :b => 255 } # color = { :c => 100, :m => 100, :y => 100, :k => 100 } elsif token =~ /^]*>$/ matches = /name="([^"]*)"/.match(token) || /name='([^']*)'/.match(token) fonts << matches[1] unless matches.nil? matches = /size="([^"]*)"/.match(token) || /size='([^']*)'/.match(token) sizes << matches[1].to_f unless matches.nil? matches = /character_spacing="([^"]*)"/.match(token) || /character_spacing='([^']*)'/.match(token) character_spacings << matches[1].to_f unless matches.nil? else string = token.gsub("<", "<").gsub(">", ">").gsub("&", "&") array << { :text => string, :styles => styles.dup, :color => colors.last, :link => link, :anchor => anchor, :font => fonts.last, :size => sizes.last, :character_spacing => character_spacings.last } end end end array end end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/text/formatted/box.rb0000644000000000000000000004736512114176157022067 0ustar rootroot# encoding: utf-8 # text/formatted/rectangle.rb : Implements text boxes with formatted text # # Copyright February 2010, Daniel Nelson. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. # module Prawn module Text module Formatted # Draws the requested formatted text into a box. When the text overflows # the rectangle shrink to fit or truncate the text. Text boxes are # independent of the document y position. # # == Formatted Text Array # # Formatted text is comprised of an array of hashes, where each hash # defines text and format information. As of the time of writing, the # following hash options are supported: # # :text:: # the text to format according to the other hash options # :styles:: # an array of styles to apply to this text. Available styles include # :bold, :italic, :underline, :strikethrough, :subscript, and # :superscript # :size:: # a number denoting the font size to apply to this text # :character_spacing:: # a number denoting how much to increase or decrease the default # spacing between characters # :font:: # the name of a font. The name must be an AFM font with the desired # faces or must be a font that is already registered using # Prawn::Document#font_families # :color:: # anything compatible with Prawn::Graphics::Color#fill_color and # Prawn::Graphics::Color#stroke_color # :link:: # a URL to which to create a link. A clickable link will be created # to that URL. Note that you must explicitly underline and color using # the appropriate tags if you which to draw attention to the link # :anchor:: # a destination that has already been or will be registered using # Prawn::Core::Destinations#add_dest. A clickable link will be # created to that destination. Note that you must explicitly underline # and color using the appropriate tags if you which to draw attention # to the link # :draw_text_callback: # if provided, this Proc will be called instead of #draw_text! once # per fragment for every low-level addition of text to the page. # :callback:: # an object (or array of such objects) with two methods: # #render_behind and #render_in_front, which are called immediately # prior to and immediately after rendring the text fragment and which # are passed the fragment as an argument # # == Example # # formatted_text_box([{ :text => "hello" }, # { :text => "world", # :size => 24, # :styles => [:bold, :italic] }]) # # == Options # # Accepts the same options as Text::Box with the below exceptions # # == Returns # # Returns a formatted text array representing any text that did not print # under the current settings. # # == Exceptions # # Raises "Bad font family" if no font family is defined for the current font # # Raises Prawn::Errrors::CannotFit if not wide enough to print # any text # def formatted_text_box(array, options={}) Text::Formatted::Box.new(array, options.merge(:document => self)).render end # Generally, one would use the Prawn::Text::Formatted#formatted_text_box # convenience method. However, using Text::Formatted::Box.new in # conjunction with #render(:dry_run => true) enables one to do look-ahead # calculations prior to placing text on the page, or to determine how much # vertical space was consumed by the printed text # class Box include Prawn::Core::Text::Formatted::Wrap def valid_options Prawn::Core::Text::VALID_OPTIONS + [:at, :height, :width, :align, :valign, :rotate, :rotate_around, :overflow, :min_font_size, :leading, :character_spacing, :mode, :single_line, :skip_encoding, :document, :direction, :fallback_fonts, :draw_text_callback] end # The text that was successfully printed (or, if dry_run was # used, the text that would have been successfully printed) attr_reader :text # True iff nothing printed (or, if dry_run was # used, nothing would have been successfully printed) def nothing_printed? @nothing_printed end # True iff everything printed (or, if dry_run was # used, everything would have been successfully printed) def everything_printed? @everything_printed end # The upper left corner of the text box attr_reader :at # The line height of the last line printed attr_reader :line_height # The height of the ascender of the last line printed attr_reader :ascender # The height of the descender of the last line printed attr_reader :descender # The leading used during printing attr_reader :leading def line_gap line_height - (ascender + descender) end # # Example (see Prawn::Text::Core::Formatted::Wrap for what is required # of the wrap method if you want to override the default wrapping # algorithm): # # # module MyWrap # # def wrap(array) # initialize_wrap([{ :text => 'all your base are belong to us' }]) # @line_wrap.wrap_line(:document => @document, # :kerning => @kerning, # :width => 10000, # :arranger => @arranger) # fragment = @arranger.retrieve_fragment # format_and_draw_fragment(fragment, 0, @line_wrap.width, 0) # [] # end # # end # # Prawn::Text::Formatted::Box.extensions << MyWrap # # box = Prawn::Text::Formatted::Box.new('hello world') # box.render('why can't I print anything other than' + # '"all your base are belong to us"?') # # def self.extensions @extensions ||= [] end def self.inherited(base) #:nodoc: extensions.each { |e| base.extensions << e } end # See Prawn::Text#text_box for valid options # def initialize(formatted_text, options={}) @inked = false Prawn.verify_options(valid_options, options) options = options.dup self.class.extensions.reverse_each { |e| extend e } @overflow = options[:overflow] || :truncate self.original_text = formatted_text @text = nil @document = options[:document] @direction = options[:direction] || @document.text_direction @fallback_fonts = options[:fallback_fonts] || @document.fallback_fonts @at = (options[:at] || [@document.bounds.left, @document.bounds.top]).dup @width = options[:width] || @document.bounds.right - @at[0] @height = options[:height] || default_height @align = options[:align] || (@direction == :rtl ? :right : :left) @vertical_align = options[:valign] || :top @leading = options[:leading] || @document.default_leading @character_spacing = options[:character_spacing] || @document.character_spacing @mode = options[:mode] || @document.text_rendering_mode @rotate = options[:rotate] || 0 @rotate_around = options[:rotate_around] || :upper_left @single_line = options[:single_line] @skip_encoding = options[:skip_encoding] || @document.skip_encoding @draw_text_callback = options[:draw_text_callback] if @overflow == :expand # if set to expand, then we simply set the bottom # as the bottom of the document bounds, since that # is the maximum we should expand to @height = default_height @overflow = :truncate end @min_font_size = options[:min_font_size] || 5 if options[:kerning].nil? then options[:kerning] = @document.default_kerning? end @options = { :kerning => options[:kerning], :size => options[:size], :style => options[:style] } super(formatted_text, options) end # Render text to the document based on the settings defined in initialize. # # In order to facilitate look-ahead calculations, render accepts # a :dry_run => true option. If provided, then everything is # executed as if rendering, with the exception that nothing is drawn on # the page. Useful for look-ahead computations of height, unprinted text, # etc. # # Returns any text that did not print under the current settings # def render(flags={}) unprinted_text = [] @document.save_font do @document.character_spacing(@character_spacing) do @document.text_rendering_mode(@mode) do process_options if @skip_encoding text = original_text else text = normalize_encoding end @document.font_size(@font_size) do shrink_to_fit(text) if @overflow == :shrink_to_fit process_vertical_alignment(text) @inked = true unless flags[:dry_run] if @rotate != 0 && @inked unprinted_text = render_rotated(text) else unprinted_text = wrap(text) end @inked = false end end end end unprinted_text end # The width available at this point in the box # def available_width @width end # The height actually used during the previous render # def height return 0 if @baseline_y.nil? || @descender.nil? (@baseline_y - @descender).abs end # fragment is a Prawn::Text::Formatted::Fragment object # def draw_fragment(fragment, accumulated_width=0, line_width=0, word_spacing=0) #:nodoc: case(@align) when :left x = @at[0] when :center x = @at[0] + @width * 0.5 - line_width * 0.5 when :right x = @at[0] + @width - line_width when :justify if @direction == :ltr x = @at[0] else x = @at[0] + @width - line_width end end x += accumulated_width y = @at[1] + @baseline_y y += fragment.y_offset fragment.left = x fragment.baseline = y if @inked draw_fragment_underlays(fragment) @document.word_spacing(word_spacing) { if @draw_text_callback @draw_text_callback.call(fragment.text, :at => [x, y], :kerning => @kerning) else @document.draw_text!(fragment.text, :at => [x, y], :kerning => @kerning) end } draw_fragment_overlays(fragment) end end private def original_text @original_array.collect { |hash| hash.dup } end def original_text=(formatted_text) @original_array = formatted_text end def normalize_encoding formatted_text = original_text unless @fallback_fonts.empty? formatted_text = process_fallback_fonts(formatted_text) end formatted_text.each do |hash| if hash[:font] @document.font(hash[:font]) do hash[:text] = @document.font.normalize_encoding(hash[:text]) end else hash[:text] = @document.font.normalize_encoding(hash[:text]) end end formatted_text end def process_fallback_fonts(formatted_text) modified_formatted_text = [] formatted_text.each do |hash| fragments = analyze_glyphs_for_fallback_font_support(hash) modified_formatted_text.concat(fragments) end modified_formatted_text end def analyze_glyphs_for_fallback_font_support(hash) font_glyph_pairs = [] original_font = @document.font.family fragment_font = hash[:font] || original_font @document.font(fragment_font) fallback_fonts = @fallback_fonts.dup # always default back to the current font if the glyph is missing from # all fonts fallback_fonts << fragment_font hash[:text].unicode_characters do |char| @document.font(fragment_font) font_glyph_pairs << [find_font_for_this_glyph(char, @document.font.family, fallback_fonts.dup), char] end @document.font(original_font) form_fragments_from_like_font_glyph_pairs(font_glyph_pairs, hash) end def find_font_for_this_glyph(char, current_font, fallback_fonts) if fallback_fonts.length == 0 || @document.font.glyph_present?(char) current_font else current_font = fallback_fonts.shift @document.font(current_font) find_font_for_this_glyph(char, @document.font.family, fallback_fonts) end end def form_fragments_from_like_font_glyph_pairs(font_glyph_pairs, hash) fragments = [] fragment = nil current_font = nil font_glyph_pairs.each do |font, char| if font != current_font current_font = font fragment = hash.dup fragment[:text] = char fragment[:font] = font fragments << fragment else fragment[:text] += char end end fragments end def move_baseline_down if @baseline_y == 0 @baseline_y = -@ascender else @baseline_y -= (@line_height + @leading) end end # Returns the default height to be used if none is provided or if the # overflow option is set to :expand. If we are in a stretchy bounding # box, assume we can stretch to the bottom of the innermost non-stretchy # box. # def default_height # Find the "frame", the innermost non-stretchy bbox. frame = @document.bounds frame = frame.parent while frame.stretchy? && frame.parent @at[1] + @document.bounds.absolute_bottom - frame.absolute_bottom end def process_vertical_alignment(text) # The vertical alignment must only be done once per text box, but # we need to wait until render() is called so that the fonts are set # up properly for wrapping. So guard with a boolean to ensure this is # only run once. return if @vertical_alignment_processed @vertical_alignment_processed = true return if @vertical_align == :top wrap(text) case @vertical_align when :center @at[1] = @at[1] - (@height - height) * 0.5 when :bottom @at[1] = @at[1] - (@height - height) + @descender end @height = height end # Decrease the font size until the text fits or the min font # size is reached def shrink_to_fit(text) wrap(text) until @everything_printed || @font_size <= @min_font_size @font_size = [@font_size - 0.5, @min_font_size].max @document.font_size = @font_size wrap(text) end end def process_options # must be performed within a save_font bock because # document.process_text_options sets the font @document.process_text_options(@options) @font_size = @options[:size] @kerning = @options[:kerning] end def render_rotated(text) unprinted_text = '' case @rotate_around when :center x = @at[0] + @width * 0.5 y = @at[1] - @height * 0.5 when :upper_right x = @at[0] + @width y = @at[1] when :lower_right x = @at[0] + @width y = @at[1] - @height when :lower_left x = @at[0] y = @at[1] - @height else x = @at[0] y = @at[1] end @document.rotate(@rotate, :origin => [x, y]) do unprinted_text = wrap(text) end unprinted_text end def draw_fragment_underlays(fragment) fragment.callback_objects.each do |obj| obj.render_behind(fragment) if obj.respond_to?(:render_behind) end end def draw_fragment_overlays(fragment) draw_fragment_overlay_styles(fragment) draw_fragment_overlay_link(fragment) draw_fragment_overlay_anchor(fragment) fragment.callback_objects.each do |obj| obj.render_in_front(fragment) if obj.respond_to?(:render_in_front) end end def draw_fragment_overlay_link(fragment) return unless fragment.link box = fragment.absolute_bounding_box @document.link_annotation(box, :Border => [0, 0, 0], :A => { :Type => :Action, :S => :URI, :URI => Prawn::Core::LiteralString.new(fragment.link) }) end def draw_fragment_overlay_anchor(fragment) return unless fragment.anchor box = fragment.absolute_bounding_box @document.link_annotation(box, :Border => [0, 0, 0], :Dest => fragment.anchor) end def draw_fragment_overlay_styles(fragment) underline = fragment.styles.include?(:underline) if underline @document.stroke_line(fragment.underline_points) end strikethrough = fragment.styles.include?(:strikethrough) if strikethrough @document.stroke_line(fragment.strikethrough_points) end end end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/text/box.rb0000644000000000000000000001333412114176157020067 0ustar rootroot# encoding: utf-8 # text/rectangle.rb : Implements text boxes # # Copyright November 2009, Daniel Nelson. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. # module Prawn module Text # Draws the requested text into a box. When the text overflows # the rectangle, you shrink to fit, or truncate the text. Text # boxes are independent of the document y position. # # == Encoding # # Note that strings passed to this function should be encoded as UTF-8. # If you get unexpected characters appearing in your rendered document, # check this. # # If the current font is a built-in one, although the string must be # encoded as UTF-8, only characters that are available in WinAnsi # are allowed. # # If an empty box is rendered to your PDF instead of the character you # wanted it usually means the current font doesn't include that character. # # == Options (default values marked in []) # # :kerning:: boolean. Whether or not to use kerning (if it # is available with the current font) # [value of document.default_kerning?] # :size:: number. The font size to use. [current font # size] # :character_spacing:: number. The amount of space to add # to or remove from the default character # spacing. [0] # :mode:: symbol. The text rendering mode. See # documentation for Prawn::Document#text_rendering_mode # for a list of valid options. [:fill] # :style:: The style to use. The requested style must be part of # the current font familly. [current style] # # :at:: # [x, y]. The upper left corner of the box # [@document.bounds.left, @document.bounds.top] # :width:: # number. The width of the box [@document.bounds.right - @at[0]] # :height:: # number. The height of the box [default_height()] # :direction:: # :ltr, :rtl, Direction of the text (left-to-right # or right-to-left) [value of document.text_direction] # :fallback_fonts:: # An array of font names. Each name must be the name of an AFM font or # the name that was used to register a family of TTF fonts (see # Prawn::Document#font_families). If present, then each glyph will be # rendered using the first font that includes the glyph, starting with # the current font and then moving through :fallback_fonts from # left to right. # :align:: # :left, :center, :right, or # :justify Alignment within the bounding box # [:left if direction is :ltr, :right if direction is :rtl] # :valign:: # :top, :center, or :bottom. Vertical # alignment within the bounding box [:top] # # :rotate:: # number. The angle to rotate the text # :rotate_around:: # :center, :upper_left, :upper_right, # :lower_right, or :lower_left. The point around which # to rotate the text [:upper_left] # :leading:: # number. Additional space between lines [value of # document.default_leading] # :single_line:: # boolean. If true, then only the first line will be drawn [false] # :skip_encoding:: # boolean [false] # :overflow:: # :truncate, :shrink_to_fit, or :expand # This controls the behavior when the amount of text # exceeds the available space. [:truncate] # :min_font_size:: # number. The minimum font size to use when :overflow is set to # :shrink_to_fit (that is the font size will not be reduced to less than # this value, even if it means that some text will be cut off). [5] # # == Returns # # Returns any text that did not print under the current settings. # # NOTE: if an AFM font is used, then the returned text is encoded in # WinAnsi. Subsequent calls to text_box that pass this returned text back # into text box must include a :skip_encoding => true option. This is # unnecessary when using TTF fonts because those operate on UTF-8 encoding. # # == Exceptions # # Raises Prawn::Errrors::CannotFit if not wide enough to print # any text # def text_box(string, options={}) options = options.dup options[:document] = self box = if options.delete(:inline_format) array = Text::Formatted::Parser.to_array(string) Text::Formatted::Box.new(array, options) else Text::Box.new(string, options) end box.render end # Generally, one would use the Prawn::Text#text_box convenience # method. However, using Text::Box.new in conjunction with # #render(:dry_run=> true) enables one to do look-ahead calculations prior # to placing text on the page, or to determine how much vertical space was # consumed by the printed text # class Box < Prawn::Text::Formatted::Box def initialize(string, options={}) super([{ :text => string }], options) end def render(flags={}) leftover = super(flags) leftover.collect { |hash| hash[:text] }.join end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/core/0000755000000000000000000000000012114176157016712 5ustar rootrootruby-prawn-1.0.0~rc2.orig/lib/prawn/core/document_state.rb0000644000000000000000000000467412114176157022270 0ustar rootrootmodule Prawn module Core class DocumentState #:nodoc: def initialize(options) normalize_metadata(options) if options[:template] @store = Prawn::Core::ObjectStore.new(:template => options[:template]) @store.info.data.merge!(options[:info]) if options[:info] else @store = Prawn::Core::ObjectStore.new(:info => options[:info]) end @version = 1.3 @pages = [] @page = nil @trailer = {} @compress = options.fetch(:compress, false) @encrypt = options.fetch(:encrypt, false) @encryption_key = options[:encryption_key] @optimize_objects = options.fetch(:optimize_objects, false) @skip_encoding = options.fetch(:skip_encoding, false) @before_render_callbacks = [] @on_page_create_callback = nil end attr_accessor :store, :version, :pages, :page, :trailer, :compress, :encrypt, :encryption_key, :optimize_objects, :skip_encoding, :before_render_callbacks, :on_page_create_callback def populate_pages_from_store(document) return 0 if @store.page_count <= 0 || @pages.size > 0 count = (1..@store.page_count) @pages = count.map do |index| orig_dict_id = @store.object_id_for_page(index) Prawn::Core::Page.new(document, :object_id => orig_dict_id) end end def normalize_metadata(options) options[:info] ||= {} options[:info][:Creator] ||= "Prawn" options[:info][:Producer] ||= "Prawn" info = options[:info] end def insert_page(page, page_number) pages.insert(page_number, page) store.pages.data[:Kids].insert(page_number, page.dictionary) store.pages.data[:Count] += 1 end def on_page_create_action(doc) on_page_create_callback[doc] if on_page_create_callback end def before_render_actions(doc) before_render_callbacks.each{ |c| c.call(self) } end def page_count pages.length end def render_body(output) store.compact if optimize_objects store.each do |ref| ref.offset = output.size output << (@encrypt ? ref.encrypted_object(@encryption_key) : ref.object) end end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/core/annotations.rb0000644000000000000000000000377412114176157021607 0ustar rootroot# encoding: utf-8 # annotations.rb : Implements low-level annotation support for PDF # # Copyright November 2008, Jamis Buck. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. # module Prawn module Core # Provides very low-level support for annotations. # module Annotations #:nodoc: # Adds a new annotation (section 8.4 in PDF spec) to the current page. # +options+ must be a Hash describing the annotation. # def annotate(options) state.page.dictionary.data[:Annots] ||= [] options = sanitize_annotation_hash(options) state.page.dictionary.data[:Annots] << ref!(options) return options end # A convenience method for creating Text annotations. +rect+ must be an array # of four numbers, describing the bounds of the annotation. +contents+ should # be a string, to be shown when the annotation is activated. # def text_annotation(rect, contents, options={}) options = options.merge(:Subtype => :Text, :Rect => rect, :Contents => contents) annotate(options) end # A convenience method for creating Link annotations. +rect+ must be an array # of four numbers, describing the bounds of the annotation. The +options+ hash # should include either :Dest (describing the target destination, usually as a # string that has been recorded in the document's Dests tree), or :A (describing # an action to perform on clicking the link), or :PA (for describing a URL to # link to). # def link_annotation(rect, options={}) options = options.merge(:Subtype => :Link, :Rect => rect) annotate(options) end private def sanitize_annotation_hash(options) options = options.merge(:Type => :Annot) if options[:Dest].is_a?(String) options[:Dest] = Prawn::Core::LiteralString.new(options[:Dest]) end options end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/core/literal_string.rb0000644000000000000000000000106112114176157022257 0ustar rootroot# encoding: utf-8 module Prawn module Core # This is used to differentiate strings that must be encoded as # a *literal* string, versus those that can be encoded in # the PDF hexadecimal format. # # Some features of the PDF format appear to require that literal # strings be used. One such feature is the /Dest key of a link # annotation; if a hex encoded string is used there, the links # do not work (as tested in Mac OS X Preview, and Adobe Acrobat # Reader). class LiteralString < String #:nodoc: end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/core/destinations.rb0000644000000000000000000000577212114176157021756 0ustar rootroot# encoding: utf-8 # prawn/core/destinations.rb : Implements destination support for PDF # # Copyright November 2008, Jamis Buck. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. module Prawn module Core module Destinations #:nodoc: # The maximum number of children to fit into a single node in the Dests tree. NAME_TREE_CHILDREN_LIMIT = 20 #:nodoc: # The Dests name tree in the Name dictionary (see Prawn::Document::Internal#names). # This name tree is used to store named destinations (PDF spec 8.2.1). # (For more on name trees, see section 3.8.4 in the PDF spec.) # def dests names.data[:Dests] ||= ref!(Prawn::Core::NameTree::Node.new(self, NAME_TREE_CHILDREN_LIMIT)) end # Adds a new destination to the dests name tree (see #dests). The # +reference+ parameter will be converted into a Prawn::Reference if # it is not already one. # def add_dest(name, reference) reference = ref!(reference) unless reference.is_a?(Prawn::Core::Reference) dests.data.add(name, reference) end # Return a Dest specification for a specific location (and optional zoom # level). # def dest_xyz(left, top, zoom=nil, dest_page=page) [dest_page.dictionary, :XYZ, left, top, zoom] end # Return a Dest specification that will fit the given page into the # viewport. # def dest_fit(dest_page=page) [dest_page.dictionary, :Fit] end # Return a Dest specification that will fit the given page horizontally # into the viewport, aligned vertically at the given top coordinate. # def dest_fit_horizontally(top, dest_page=page) [dest_page.dictionary, :FitH, top] end # Return a Dest specification that will fit the given page vertically # into the viewport, aligned horizontally at the given left coordinate. # def dest_fit_vertically(left, dest_page=page) [dest_page.dictionary, :FitV, left] end # Return a Dest specification that will fit the given rectangle into the # viewport, for the given page. # def dest_fit_rect(left, bottom, right, top, dest_page=page) [dest_page.dictionary, :FitR, left, bottom, right, top] end # Return a Dest specfication that will fit the given page's bounding box # into the viewport. # def dest_fit_bounds(dest_page=page) [dest_page.dictionary, :FitB] end # Same as #dest_fit_horizontally, but works on the page's bounding box # instead of the entire page. # def dest_fit_bounds_horizontally(top, dest_page=page) [dest_page.dictionary, :FitBH, top] end # Same as #dest_fit_vertically, but works on the page's bounding box # instead of the entire page. # def dest_fit_bounds_vertically(left, dest_page=page) [dest_page.dictionary, :FitBV, left] end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/core/pdf_object.rb0000644000000000000000000001006312114176157021336 0ustar rootroot# encoding: utf-8 # # pdf_object.rb : Handles Ruby to PDF object serialization # # Copyright April 2008, Gregory Brown. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. # Top level Module # module Prawn module Core #:nodoc: module_function if "".respond_to?(:encode) # Ruby 1.9+ def utf8_to_utf16(str) utf16 = "\xFE\xFF".force_encoding("UTF-16BE") + str.encode("UTF-16BE") end # encodes any string into a hex representation. The result is a string # with only 0-9 and a-f characters. That result is valid ASCII so tag # it as such to account for behaviour of different ruby VMs def string_to_hex(str) str.unpack("H*").first.force_encoding("ascii") end else # Ruby 1.8 def utf8_to_utf16(str) utf16 = "\xFE\xFF" str.codepoints do |cp| if cp < 0x10000 # Basic Multilingual Plane utf16 << [cp].pack("n") else # pull out high/low 10 bits hi, lo = (cp - 0x10000).divmod(2**10) # encode a surrogate pair utf16 << [0xD800 + hi, 0xDC00 + lo].pack("n*") end end utf16 end def string_to_hex(str) str.unpack("H*").first end end # Serializes Ruby objects to their PDF equivalents. Most primitive objects # will work as expected, but please note that Name objects are represented # by Ruby Symbol objects and Dictionary objects are represented by Ruby hashes # (keyed by symbols) # # Examples: # # PdfObject(true) #=> "true" # PdfObject(false) #=> "false" # PdfObject(1.2124) #=> "1.2124" # PdfObject("foo bar") #=> "(foo bar)" # PdfObject(:Symbol) #=> "/Symbol" # PdfObject(["foo",:bar, [1,2]]) #=> "[foo /bar [1 2]]" # def PdfObject(obj, in_content_stream = false) case(obj) when NilClass then "null" when TrueClass then "true" when FalseClass then "false" when Numeric if (str = String(obj)) =~ /e/i # scientific notation is not supported in PDF sprintf("%.16f", obj).gsub(/\.?0+\z/, "") else str end when Array "[" << obj.map { |e| PdfObject(e, in_content_stream) }.join(' ') << "]" when Prawn::Core::LiteralString obj = obj.gsub(/[\\\n\r\t\b\f\(\)]/n) { |m| "\\#{m}" } "(#{obj})" when Time obj = obj.strftime("D:%Y%m%d%H%M%S%z").chop.chop + "'00'" obj = obj.gsub(/[\\\n\r\t\b\f\(\)]/n) { |m| "\\#{m}" } "(#{obj})" when Prawn::Core::ByteString "<" << obj.unpack("H*").first << ">" when String obj = utf8_to_utf16(obj) unless in_content_stream "<" << string_to_hex(obj) << ">" when Symbol "/" + obj.to_s.unpack("C*").map { |n| if n < 33 || n > 126 || [35,40,41,47,60,62].include?(n) "#" + n.to_s(16).upcase else [n].pack("C*") end }.join when Hash output = "<< " obj.each do |k,v| unless String === k || Symbol === k raise Prawn::Errors::FailedObjectConversion, "A PDF Dictionary must be keyed by names" end output << PdfObject(k.to_sym, in_content_stream) << " " << PdfObject(v, in_content_stream) << "\n" end output << ">>" when Prawn::Core::Reference obj.to_s when Prawn::Core::NameTree::Node PdfObject(obj.to_hash) when Prawn::Core::NameTree::Value PdfObject(obj.name) + " " + PdfObject(obj.value) when Prawn::OutlineRoot, Prawn::OutlineItem PdfObject(obj.to_hash) else raise Prawn::Errors::FailedObjectConversion, "This object cannot be serialized to PDF (#{obj.inspect})" end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/core/text/0000755000000000000000000000000012114176157017676 5ustar rootrootruby-prawn-1.0.0~rc2.orig/lib/prawn/core/text/formatted/0000755000000000000000000000000012114176157021663 5ustar rootrootruby-prawn-1.0.0~rc2.orig/lib/prawn/core/text/formatted/arranger.rb0000644000000000000000000002240612114176157024015 0ustar rootroot# encoding: utf-8 # core/text/formatted/arranger.rb : Implements a data structure for 2-stage # processing of lines of formatted text # # Copyright February 2010, Daniel Nelson. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. module Prawn module Core module Text module Formatted #:nodoc: class Arranger #:nodoc: attr_reader :max_line_height attr_reader :max_descender attr_reader :max_ascender attr_accessor :consumed # The following present only for testing purposes attr_reader :unconsumed attr_reader :fragments attr_reader :current_format_state def initialize(document, options={}) @document = document @fragments = [] @unconsumed = [] @kerning = options[:kerning] end def space_count if @unfinalized_line raise "Lines must be finalized before calling #space_count" end @fragments.inject(0) do |sum, fragment| sum + fragment.space_count end end def line_width if @unfinalized_line raise "Lines must be finalized before calling #line_width" end @fragments.inject(0) do |sum, fragment| sum + fragment.width end end def line if @unfinalized_line raise "Lines must be finalized before calling #line" end @fragments.collect do |fragment| if ruby_18 { true } fragment.text else fragment.text.dup.force_encoding("utf-8") end end.join end def finalize_line @unfinalized_line = false omit_trailing_whitespace_from_line_width @fragments = [] @consumed.each do |hash| text = hash[:text] format_state = hash.dup format_state.delete(:text) fragment = Prawn::Text::Formatted::Fragment.new(text, format_state, @document) @fragments << fragment set_fragment_measurements(fragment) set_line_measurement_maximums(fragment) end end def format_array=(array) initialize_line @unconsumed = [] array.each do |hash| hash[:text].scan(/[^\n]+|\n/) do |line| @unconsumed << hash.merge(:text => line) end end end def initialize_line @unfinalized_line = true @max_line_height = 0 @max_descender = 0 @max_ascender = 0 @consumed = [] @fragments = [] end def finished? @unconsumed.length == 0 end def next_string unless @unfinalized_line raise "Lines must not be finalized when calling #next_string" end hash = @unconsumed.shift if hash.nil? nil else @consumed << hash.dup @current_format_state = hash.dup @current_format_state.delete(:text) hash[:text] end end def preview_next_string hash = @unconsumed.first if hash.nil? then nil else hash[:text] end end def apply_color_and_font_settings(fragment, &block) if fragment.color original_fill_color = @document.fill_color original_stroke_color = @document.stroke_color @document.fill_color(*fragment.color) @document.stroke_color(*fragment.color) apply_font_settings(fragment, &block) @document.stroke_color = original_stroke_color @document.fill_color = original_fill_color else apply_font_settings(fragment, &block) end end def apply_font_settings(fragment=nil, &block) if fragment.nil? font = current_format_state[:font] size = current_format_state[:size] character_spacing = current_format_state[:character_spacing] || @document.character_spacing styles = current_format_state[:styles] font_style = font_style(styles) else font = fragment.font size = fragment.size character_spacing = fragment.character_spacing styles = fragment.styles font_style = font_style(styles) end @document.character_spacing(character_spacing) do if font || font_style != :normal raise "Bad font family" unless @document.font.family @document.font(font || @document.font.family, :style => font_style) do apply_font_size(size, styles, &block) end else apply_font_size(size, styles, &block) end end end def update_last_string(printed, unprinted, normalized_soft_hyphen=nil) return if printed.nil? if printed.empty? @consumed.pop else @consumed.last[:text] = printed if normalized_soft_hyphen @consumed.last[:normalized_soft_hyphen] = normalized_soft_hyphen end end unless unprinted.empty? @unconsumed.unshift(@current_format_state.merge(:text => unprinted)) end load_previous_format_state if printed.empty? end def retrieve_fragment if @unfinalized_line raise "Lines must be finalized before fragments can be retrieved" end @fragments.shift end def repack_unretrieved new_unconsumed = [] while fragment = retrieve_fragment fragment.include_trailing_white_space! new_unconsumed << fragment.format_state.merge(:text => fragment.text) end @unconsumed = new_unconsumed.concat(@unconsumed) end def font_style(styles) if styles.nil? :normal elsif styles.include?(:bold) && styles.include?(:italic) :bold_italic elsif styles.include?(:bold) :bold elsif styles.include?(:italic) :italic else :normal end end private def load_previous_format_state if @consumed.empty? @current_format_state = {} else hash = @consumed.last @current_format_state = hash.dup @current_format_state.delete(:text) end end def apply_font_size(size, styles) if subscript?(styles) || superscript?(styles) relative_size = 0.583 if size.nil? size = @document.font_size * relative_size else size = size * relative_size end end if size.nil? yield else @document.font_size(size) { yield } end end def subscript?(styles) if styles.nil? then false else styles.include?(:subscript) end end def superscript?(styles) if styles.nil? then false else styles.include?(:superscript) end end def omit_trailing_whitespace_from_line_width @consumed.reverse_each do |hash| if hash[:text] == "\n" break elsif hash[:text].strip.empty? && @consumed.length > 1 # this entire fragment is trailing white space hash[:exclude_trailing_white_space] = true else # this fragment contains the first non-white space we have # encountered since the end of the line hash[:exclude_trailing_white_space] = true break end end end def set_fragment_measurements(fragment) apply_font_settings(fragment) do fragment.width = @document.width_of(fragment.text, :kerning => @kerning) fragment.line_height = @document.font.height fragment.descender = @document.font.descender fragment.ascender = @document.font.ascender end end def set_line_measurement_maximums(fragment) @max_line_height = [@max_line_height, fragment.line_height].compact.max @max_descender = [@max_descender, fragment.descender].compact.max @max_ascender = [@max_ascender, fragment.ascender].compact.max end end end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/core/text/formatted/line_wrap.rb0000644000000000000000000002275512114176157024203 0ustar rootroot# encoding: utf-8 # core/text/formatted/line_wrap.rb : Implements individual line wrapping of # formatted text # # Copyright February 2010, Daniel Nelson. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. # module Prawn module Core module Text module Formatted #:nodoc: class LineWrap #:nodoc: # The width of the last wrapped line # def width @accumulated_width || 0 end # The number of spaces in the last wrapped line attr_reader :space_count # Whether this line is the last line in the paragraph def paragraph_finished? @newline_encountered || is_next_string_newline? || @arranger.finished? end # Work in conjunction with the Prawn::Core::Formatted::Arranger # defined in the :arranger option to determine what formatted text # will fit within the width defined by the :width option # def wrap_line(options) initialize_line(options) while fragment = @arranger.next_string @fragment_output = "" fragment.lstrip! if first_fragment_on_this_line?(fragment) next if empty_line?(fragment) unless apply_font_settings_and_add_fragment_to_line(fragment) break end end @arranger.finalize_line @accumulated_width = @arranger.line_width @space_count = @arranger.space_count @arranger.line end private def first_fragment_on_this_line?(fragment) line_empty? && fragment != "\n" end def empty_line?(fragment) empty = line_empty? && fragment.empty? && is_next_string_newline? @arranger.update_last_string("", "", soft_hyphen) if empty empty end def is_next_string_newline? @arranger.preview_next_string == "\n" end def apply_font_settings_and_add_fragment_to_line(fragment) result = nil @arranger.apply_font_settings do # if font has changed from Unicode to non-Unicode, or vice versa, the characters used for soft hyphens # and zero-width spaces will be different set_soft_hyphen_and_zero_width_space result = add_fragment_to_line(fragment) end result end # returns true iff all text was printed without running into the end of # the line # def add_fragment_to_line(fragment) if fragment == "" true elsif fragment == "\n" @newline_encountered = true false else fragment.scan(scan_pattern).each do |segment| if segment == zero_width_space segment_width = 0 else segment_width = @document.width_of(segment, :kerning => @kerning) end if @accumulated_width + segment_width <= @width @accumulated_width += segment_width @fragment_output += segment else end_of_the_line_reached(segment) fragment_finished(fragment) return false end end fragment_finished(fragment) true end end # The pattern used to determine chunks of text to place on a given line # def scan_pattern pattern = "[^#{break_chars}]+#{soft_hyphen}|" + "[^#{break_chars}]+#{hyphen}+|" + "[^#{break_chars}]+|" + "[#{whitespace}]+|" + "#{hyphen}+[^#{break_chars}]*|" + "#{soft_hyphen}" new_regexp(pattern) end # The pattern used to determine whether any word breaks exist on a # current line, which in turn determines whether character level # word breaking is needed # def word_division_scan_pattern new_regexp("\\s|[#{zero_width_space}#{soft_hyphen}#{hyphen}]") end def break_chars "#{whitespace}#{soft_hyphen}#{hyphen}" end def whitespace " \\t#{zero_width_space}" end def hyphen "-" end def soft_hyphen @soft_hyphen end def zero_width_space @zero_width_space end def line_empty? @line_empty && @accumulated_width == 0 end def initialize_line(options) @document = options[:document] @kerning = options[:kerning] @width = options[:width] @accumulated_width = 0 @line_empty = true @line_contains_more_than_one_word = false @arranger = options[:arranger] @arranger.initialize_line @newline_encountered = false @line_full = false end def set_soft_hyphen_and_zero_width_space # this is done once per fragment, after the font settings for the fragment are applied -- # it could actually be skipped if the font hasn't changed font = @document.font @soft_hyphen = font.normalize_encoding(Prawn::Text::SHY) @zero_width_space = font.unicode? ? Prawn::Text::ZWSP : "" end def fragment_finished(fragment) if fragment == "\n" @newline_encountered = true @line_empty = false else update_output_based_on_last_fragment(fragment, soft_hyphen) update_line_status_based_on_last_output determine_whether_to_pull_preceding_fragment_to_join_this_one(fragment) end remember_this_fragment_for_backward_looking_ops end def update_output_based_on_last_fragment(fragment, normalized_soft_hyphen=nil) remaining_text = fragment.slice(@fragment_output.length..fragment.length) raise Errors::CannotFit if line_finished? && line_empty? && @fragment_output.empty? && !fragment.strip.empty? @arranger.update_last_string(@fragment_output, remaining_text, normalized_soft_hyphen) end def determine_whether_to_pull_preceding_fragment_to_join_this_one(current_fragment) if @fragment_output.empty? && !current_fragment.empty? && @line_contains_more_than_one_word unless previous_fragment_ended_with_breakable? || fragment_begins_with_breakable?(current_fragment) @fragment_output = @previous_fragment_output_without_last_word update_output_based_on_last_fragment(@previous_fragment) end end end def remember_this_fragment_for_backward_looking_ops @previous_fragment = @fragment_output.dup pf = @previous_fragment @previous_fragment_ended_with_breakable = pf =~ /[#{break_chars}]$/ last_word = pf.slice(/[^#{break_chars}]*$/) last_word_length = last_word.nil? ? 0 : last_word.length @previous_fragment_output_without_last_word = pf.slice(0, pf.length - last_word_length) end def previous_fragment_ended_with_breakable? @previous_fragment_ended_with_breakable end def fragment_begins_with_breakable?(fragment) fragment =~ /^[#{break_chars}]/ end def line_finished? @line_full || paragraph_finished? end def update_line_status_based_on_last_output @line_contains_more_than_one_word = true if @fragment_output =~ word_division_scan_pattern end def end_of_the_line_reached(segment) update_line_status_based_on_last_output wrap_by_char(segment) unless @line_contains_more_than_one_word @line_full = true end def wrap_by_char(segment) # this conditional is only necessary for Ruby 1.8 compatibility # String#unicode_characters is a helper which iterates over UTF-8 characters # under Ruby 1.9, it is implemented simply by aliasing #each_char font = @document.font if font.unicode? segment.unicode_characters do |char| break unless append_char(char,font) end else segment.each_char do |char| break unless append_char(char,font) end end end def append_char(char,font) # kerning doesn't make sense in the context of a single character char_width = font.compute_width_of(char) if @accumulated_width + char_width <= @width @accumulated_width += char_width @fragment_output << char true else false end end def new_regexp(pattern) regexp = ruby_19 { Regexp.new(pattern) } regexp = regexp || ruby_18 { lang = @document.font.unicode? ? 'U' : 'N' Regexp.new(pattern, 0, lang) } regexp end end end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/core/text/formatted/wrap.rb0000644000000000000000000001231212114176157023160 0ustar rootrootrequire "prawn/core/text/formatted/line_wrap" require "prawn/core/text/formatted/arranger" module Prawn module Core module Text module Formatted #:nodoc: module Wrap #:nodoc: def initialize(array, options) @line_wrap = Prawn::Core::Text::Formatted::LineWrap.new @arranger = Prawn::Core::Text::Formatted::Arranger.new(@document, :kerning => options[:kerning]) end # See the developer documentation for Prawn::Core::Text#wrap # # Formatted#wrap should set the following variables: # @line_height:: # the height of the tallest fragment in the last printed line # @descender:: # the descender height of the tallest fragment in the last # printed line # @ascender:: # the ascender heigth of the tallest fragment in the last # printed line # @baseline_y:: # the baseline of the current line # @nothing_printed:: # set to true until something is printed, then false # @everything_printed:: # set to false until everything printed, then true # # Returns any formatted text that was not printed # def wrap(array) #:nodoc: initialize_wrap(array) stop = false while !stop # wrap before testing if enough height for this line because the # height of the highest fragment on this line will be used to # determine the line height @line_wrap.wrap_line(:document => @document, :kerning => @kerning, :width => available_width, :arranger => @arranger) if enough_height_for_this_line? move_baseline_down print_line else stop = true end stop ||= @single_line || @arranger.finished? end @text = @printed_lines.join("\n") @everything_printed = @arranger.finished? @arranger.unconsumed end private def print_line @nothing_printed = false printed_fragments = [] fragments_this_line = [] word_spacing = word_spacing_for_this_line while fragment = @arranger.retrieve_fragment fragment.word_spacing = word_spacing if fragment.text == "\n" printed_fragments << "\n" if @printed_lines.last == "" break end printed_fragments << fragment.text fragments_this_line << fragment end accumulated_width = 0 fragments_this_line.reverse! if @direction == :rtl fragments_this_line.each do |fragment| fragment.default_direction = @direction format_and_draw_fragment(fragment, accumulated_width, @line_wrap.width, word_spacing) accumulated_width += fragment.width end if "".respond_to?(:force_encoding) printed_fragments.map! { |s| s.force_encoding("utf-8") } end @printed_lines << printed_fragments.join end def word_spacing_for_this_line if @align == :justify && @line_wrap.space_count > 0 && !@line_wrap.paragraph_finished? (available_width - @line_wrap.width) / @line_wrap.space_count else 0 end end def enough_height_for_this_line? @line_height = @arranger.max_line_height @descender = @arranger.max_descender @ascender = @arranger.max_ascender if @baseline_y == 0 diff = @ascender + @descender else diff = @descender + @line_height + @leading end required_total_height = @baseline_y.abs + diff if required_total_height > @height + 0.0001 # no room for the full height of this line @arranger.repack_unretrieved false else true end end def initialize_wrap(array) @text = nil @arranger.format_array = array # these values will depend on the maximum value within a given line @line_height = 0 @descender = 0 @ascender = 0 @baseline_y = 0 @printed_lines = [] @nothing_printed = true @everything_printed = false end def format_and_draw_fragment(fragment, accumulated_width, line_width, word_spacing) @arranger.apply_color_and_font_settings(fragment) do draw_fragment(fragment, accumulated_width, line_width, word_spacing) end end end end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/core/object_store.rb0000644000000000000000000002264312114176157021730 0ustar rootroot# encoding: utf-8 # prawn/core/object_store.rb : Implements PDF object repository for Prawn # # Copyright August 2009, Brad Ediger. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. require 'pdf/reader' module Prawn module Core class ObjectStore #:nodoc: include Enumerable attr_reader :min_version BASE_OBJECTS = %w[info pages root] def initialize(opts = {}) @objects = {} @identifiers = [] load_file(opts[:template]) if opts[:template] @info ||= ref(opts[:info] || {}).identifier @root ||= ref(:Type => :Catalog).identifier if pages.nil? root.data[:Pages] = ref(:Type => :Pages, :Count => 0, :Kids => []) end end def ref(data, &block) push(size + 1, data, &block) end def info @objects[@info] end def root @objects[@root] end def pages root.data[:Pages] end def page_count pages.data[:Count] end # Adds the given reference to the store and returns the reference object. # If the object provided is not a Prawn::Core::Reference, one is created from the # arguments provided. # def push(*args, &block) reference = if args.first.is_a?(Prawn::Core::Reference) args.first else Prawn::Core::Reference.new(*args, &block) end @objects[reference.identifier] = reference @identifiers << reference.identifier reference end alias_method :<<, :push def each @identifiers.each do |id| yield @objects[id] end end def [](id) @objects[id] end def size @identifiers.size end alias_method :length, :size def compact # Clear live markers each { |o| o.live = false } # Recursively mark reachable objects live, starting from the roots # (the only objects referenced in the trailer) root.mark_live info.mark_live # Renumber live objects to eliminate gaps (shrink the xref table) if @objects.any?{ |_, o| !o.live } new_id = 1 new_objects = {} new_identifiers = [] each do |obj| if obj.live obj.identifier = new_id new_objects[new_id] = obj new_identifiers << new_id new_id += 1 end end @objects = new_objects @identifiers = new_identifiers end end # returns the object ID for a particular page in the document. Pages # are indexed starting at 1 (not 0!). # # object_id_for_page(1) # => 5 # object_id_for_page(10) # => 87 # object_id_for_page(-11) # => 17 # def object_id_for_page(k) k -= 1 if k > 0 flat_page_ids = get_page_objects(pages).flatten flat_page_ids[k] end # imports all objects required to render a page from another PDF. The # objects are added to the current object store, but NOT linked # anywhere. # # The object ID of the root Page object is returned, it's up to the # calling code to link that into the document structure somewhere. If # this isn't done the imported objects will just be removed when the # store is compacted. # # Imports nothing and returns nil if the requested page number doesn't # exist. page_num is 1 indexed, so 1 indicates the first page. # def import_page(input, page_num) @loaded_objects = {} if template_id = indexed_template(input, page_num) return template_id end io = if input.respond_to?(:seek) && input.respond_to?(:read) input elsif File.file?(input.to_s) StringIO.new(File.binread(input.to_s)) else raise ArgumentError, "input must be an IO-like object or a filename" end # unless File.file?(filename) # raise ArgumentError, "#{filename} does not exist" # end hash = indexed_hash(input, io) ref = hash.page_references[page_num - 1] if ref.nil? nil else index_template(input, page_num, load_object_graph(hash, ref).identifier) end rescue PDF::Reader::MalformedPDFError, PDF::Reader::InvalidObjectError msg = "Error reading template file. If you are sure it's a valid PDF, it may be a bug." raise Prawn::Errors::TemplateError, msg rescue PDF::Reader::UnsupportedFeatureError msg = "Template file contains unsupported PDF features" raise Prawn::Errors::TemplateError, msg end private # An index for page templates so that their loaded object graph # can be reused without multiple loading def template_index @template_index ||= {} end # An index for the read object hash of a pdf template so that the # object hash does not need to be parsed multiple times when using # different pages of the pdf as page templates def hash_index @hash_index ||= {} end # returns the indexed object graph identifier for a template page if # it exists def indexed_template(input, page_number) key = indexing_key(input) template_index[key] && template_index[key][page_number] end # indexes the identifier for a page from a template def index_template(input, page_number, id) (template_index[indexing_key(input)] ||= {})[page_number] ||= id end # reads and indexes a new IO for a template # if the IO has been indexed already then the parsed object hash # is returned directly def indexed_hash(input, io) hash_index[indexing_key(input)] ||= PDF::Reader::ObjectHash.new(io) end # the index key for the input. # uses object_id so that both a string filename or an IO stream can be # indexed and reused provided the same object gets used in multiple page # template calls. def indexing_key(input) input.object_id end # returns a nested array of object IDs for all pages in this object store. # def get_page_objects(obj) if obj.data[:Type] == :Page obj.identifier elsif obj.data[:Type] == :Pages obj.data[:Kids].map { |kid| get_page_objects(kid) } end end # takes a source PDF and uses it as a template for this document. # def load_file(template) unless (template.respond_to?(:seek) && template.respond_to?(:read)) || File.file?(template) raise ArgumentError, "#{template} does not exist" end hash = PDF::Reader::ObjectHash.new(template) src_info = hash.trailer[:Info] src_root = hash.trailer[:Root] @min_version = hash.pdf_version.to_f if hash.trailer[:Encrypt] msg = "Template file is an encrypted PDF, it can't be used as a template" raise Prawn::Errors::TemplateError, msg end if src_info @info = load_object_graph(hash, src_info).identifier end if src_root @root = load_object_graph(hash, src_root).identifier end rescue PDF::Reader::MalformedPDFError, PDF::Reader::InvalidObjectError msg = "Error reading template file. If you are sure it's a valid PDF, it may be a bug." raise Prawn::Errors::TemplateError, msg rescue PDF::Reader::UnsupportedFeatureError msg = "Template file contains unsupported PDF features" raise Prawn::Errors::TemplateError, msg end # recurse down an object graph from a source PDF, importing all the # indirect objects we find. # # hash is the PDF::Reader::ObjectHash to extract objects from, object is # the object to extract. # def load_object_graph(hash, object) @loaded_objects ||= {} case object when ::Hash then object.each { |key,value| object[key] = load_object_graph(hash, value) } object when Array then object.map { |item| load_object_graph(hash, item)} when PDF::Reader::Reference then unless @loaded_objects.has_key?(object.id) @loaded_objects[object.id] = ref(nil) new_obj = load_object_graph(hash, hash[object]) if new_obj.kind_of?(PDF::Reader::Stream) stream_dict = load_object_graph(hash, new_obj.hash) @loaded_objects[object.id].data = stream_dict @loaded_objects[object.id] << new_obj.data else @loaded_objects[object.id].data = new_obj end end @loaded_objects[object.id] when PDF::Reader::Stream # Stream is a subclass of string, so this is here to prevent the stream # being wrapped in a LiteralString object when String is_utf8?(object) ? object : Prawn::Core::ByteString.new(object) else object end end ruby_18 do def is_utf8?(str) begin str.unpack("U*") true rescue false end end end ruby_19 do def is_utf8?(str) str.force_encoding("utf-8") str.valid_encoding? end end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/core/text.rb0000644000000000000000000002157112114176157020231 0ustar rootroot# encoding: utf-8 # prawn/core/text.rb : Implements low level text helpers for Prawn # # Copyright January 2010, Daniel Nelson. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. module Prawn module Core module Text #:nodoc: # These should be used as a base. Extensions may build on this list # VALID_OPTIONS = [:kerning, :size, :style] MODES = { :fill => 0, :stroke => 1, :fill_stroke => 2, :invisible => 3, :fill_clip => 4, :stroke_clip => 5, :fill_stroke_clip => 6, :clip => 7 } attr_reader :skip_encoding # Low level text placement method. All font and size alterations # should already be set # def draw_text!(text, options) x,y = map_to_absolute(options[:at]) add_text_content(text,x,y,options) end # Low level call to set the current font style and extract text options from # an options hash. Should be called from within a save_font block # def process_text_options(options) if options[:style] raise "Bad font family" unless font.family font(font.family, :style => options[:style]) end # must compare against false to keep kerning on as default unless options[:kerning] == false options[:kerning] = font.has_kerning_data? end options[:size] ||= font_size end # Retrieve the current default kerning setting. # # Defaults to true # def default_kerning? return true if @default_kerning.nil? @default_kerning end # Call with a boolean to set the document-wide kerning setting. This can be # overridden using the :kerning text option when drawing text or a text # box. # # pdf.default_kerning = false # pdf.text("hello world") # text is not kerned # pdf.text("hello world", :kerning => true) # text is kerned # def default_kerning(boolean) @default_kerning = boolean end alias_method :default_kerning=, :default_kerning # Call with no argument to retrieve the current default leading. # # Call with a number to set the document-wide text leading. This can be # overridden using the :leading text option when drawing text or a text # box. # # pdf.default_leading = 7 # pdf.text("hello world") # a leading of 7 is used # pdf.text("hello world", :leading => 0) # a leading of 0 is used # # Defaults to 0 # def default_leading(number=nil) if number.nil? return 0 if @default_leading.nil? @default_leading else @default_leading = number end end alias_method :default_leading=, :default_leading # Call with no argument to retrieve the current text direction. # # Call with a symbol to set the document-wide text direction. This can be # overridden using the :direction text option when drawing text or a text # box. # # pdf.text_direction = :rtl # pdf.text("hello world") # prints "dlrow olleh" # pdf.text("hello world", :direction => :ltr) # prints "hello world" # # Valid directions are: # # * :ltr - left-to-right (default) # * :rtl - right-to-left # # Side effects: # # * When printing left-to-right, the default text alignment is :left # * When printing right-to-left, the default text alignment is :right # def text_direction(direction=nil) if direction.nil? return :ltr if @text_direction.nil? @text_direction else @text_direction = direction end end alias_method :text_direction=, :text_direction # Call with no argument to retrieve the current fallback fonts. # # Call with an array of font names. Each name must be the name of an AFM # font or the name that was used to register a family of TTF fonts (see # Prawn::Document#font_families). If present, then each glyph will be # rendered using the first font that includes the glyph, starting with the # current font and then moving through :fallback_fonts from left to right. # # Call with an empty array to turn off fallback fonts # # file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf" # font_families["Kai"] = { # :normal => { :file => file, :font => "Kai" } # } # file = "#{Prawn::DATADIR}/fonts/Action Man.dfont" # font_families["Action Man"] = { # :normal => { :file => file, :font => "ActionMan" }, # } # fallback_fonts ["Times-Roman", "Kai"] # font "Action Man" # text "hello ƒ 你好" # > hello prints in Action Man # > ƒ prints in Times-Roman # > 你好 prints in Kai # # fallback_fonts [] # clears document-wide fallback fonts # # Side effects: # # * Increased overhead when fallback fonts are declared as each glyph is # checked to see whether it exists in the current font # def fallback_fonts(fallback_fonts=nil) if fallback_fonts.nil? return [] if @fallback_fonts.nil? @fallback_fonts else @fallback_fonts = fallback_fonts end end alias_method :fallback_fonts=, :fallback_fonts # Call with no argument to retrieve the current text rendering mode. # # Call with a symbol and block to temporarily change the current # text rendering mode. # # pdf.text_rendering_mode(:stroke) do # pdf.text("Outlined Text") # end # # Valid modes are: # # * :fill - fill text (default) # * :stroke - stroke text # * :fill_stroke - fill, then stroke text # * :invisible - invisible text # * :fill_clip - fill text then add to path for clipping # * :stroke_clip - stroke text then add to path for clipping # * :fill_stroke_clip - fill then stroke text, then add to path for clipping # * :clip - add text to path for clipping # def text_rendering_mode(mode=nil) return @text_rendering_mode || :fill if mode.nil? unless MODES.key?(mode) raise ArgumentError, "mode must be between one of #{MODES.keys.join(', ')} (#{mode})" end original_mode = @text_rendering_mode || :fill if original_mode == mode yield else @text_rendering_mode = mode add_content "\n#{MODES[mode]} Tr" yield add_content "\n#{MODES[original_mode]} Tr" @text_rendering_mode = original_mode end end # Increases or decreases the space between characters. # For horizontal text, a positive value will increase the space. # For veritical text, a positive value will decrease the space. # def character_spacing(amount=nil) return @character_spacing || 0 if amount.nil? original_character_spacing = character_spacing if original_character_spacing == amount yield else @character_spacing = amount add_content "\n%.3f Tc" % amount yield add_content "\n%.3f Tc" % original_character_spacing @character_spacing = original_character_spacing end end # Increases or decreases the space between words. # For horizontal text, a positive value will increase the space. # For veritical text, a positive value will decrease the space. # def word_spacing(amount=nil) return @word_spacing || 0 if amount.nil? original_word_spacing = word_spacing if original_word_spacing == amount yield else @word_spacing = amount add_content "\n%.3f Tw" % amount yield add_content "\n%.3f Tw" % original_word_spacing @word_spacing = original_word_spacing end end private def add_text_content(text, x, y, options) chunks = font.encode_text(text,options) add_content "\nBT" if options[:rotate] rad = options[:rotate].to_f * Math::PI / 180 arr = [ Math.cos(rad), Math.sin(rad), -Math.sin(rad), Math.cos(rad), x, y ] add_content "%.3f %.3f %.3f %.3f %.3f %.3f Tm" % arr else add_content "#{x} #{y} Td" end chunks.each do |(subset, string)| font.add_to_current_page(subset) add_content "/#{font.identifier_for(subset)} #{font_size} Tf" operation = options[:kerning] && string.is_a?(Array) ? "TJ" : "Tj" add_content Prawn::Core::PdfObject(string, true) << " " << operation end add_content "ET\n" end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/core/page.rb0000644000000000000000000001313612114176157020157 0ustar rootroot# encoding: utf-8 # prawn/core/page.rb : Implements low-level representation of a PDF page # # Copyright February 2010, Gregory Brown. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. # require 'prawn/document/graphics_state' module Prawn module Core class Page #:nodoc: include Prawn::Core::Page::GraphicsState attr_accessor :document, :content, :dictionary, :margins, :stack def initialize(document, options={}) @document = document @margins = options[:margins] || { :left => 36, :right => 36, :top => 36, :bottom => 36 } @stack = Prawn::GraphicStateStack.new(options[:graphic_state]) if options[:object_id] init_from_object(options) else init_new_page(options) end end def layout return @layout if @layout mb = dictionary.data[:MediaBox] if mb[3] > mb[2] :portrait else :landscape end end def size @size || dimensions[2,2] end def in_stamp_stream? !!@stamp_stream end def stamp_stream(dictionary) @stamp_stream = "" @stamp_dictionary = dictionary graphic_stack_size = stack.stack.size document.save_graphics_state document.send(:freeze_stamp_graphics) yield if block_given? until graphic_stack_size == stack.stack.size document.restore_graphics_state end @stamp_dictionary << @stamp_stream @stamp_stream = nil @stamp_dictionary = nil end def content @stamp_stream || document.state.store[@content] end # As per the PDF spec, each page can have multiple content streams. This will # add a fresh, empty content stream this the page, mainly for use in loading # template files. # def new_content_stream return if in_stamp_stream? unless dictionary.data[:Contents].is_a?(Array) dictionary.data[:Contents] = [content] end @content = document.ref({}) dictionary.data[:Contents] << document.state.store[@content] document.open_graphics_state end def dictionary @stamp_dictionary || document.state.store[@dictionary] end def resources if dictionary.data[:Resources] document.deref(dictionary.data[:Resources]) else dictionary.data[:Resources] = {} end end def fonts if resources[:Font] document.deref(resources[:Font]) else resources[:Font] = {} end end def xobjects if resources[:XObject] document.deref(resources[:XObject]) else resources[:XObject] = {} end end def ext_gstates if resources[:ExtGState] document.deref(resources[:ExtGState]) else resources[:ExtGState] = {} end end def finalize if dictionary.data[:Contents].is_a?(Array) dictionary.data[:Contents].each do |stream| stream.compress_stream if document.compression_enabled? end else content.compress_stream if document.compression_enabled? end end def imported_page? @imported_page end def dimensions return inherited_dictionary_value(:MediaBox) if imported_page? coords = Prawn::Document::PageGeometry::SIZES[size] || size [0,0] + case(layout) when :portrait coords when :landscape coords.reverse else raise Prawn::Errors::InvalidPageLayout, "Layout must be either :portrait or :landscape" end end private def init_from_object(options) @dictionary = options[:object_id].to_i dictionary.data[:Parent] = document.state.store.pages if options[:page_template] unless dictionary.data[:Contents].is_a?(Array) # content only on leafs @content = dictionary.data[:Contents].identifier end @stamp_stream = nil @stamp_dictionary = nil @imported_page = true end def init_new_page(options) @size = options[:size] || "LETTER" @layout = options[:layout] || :portrait @content = document.ref({}) content << "q" << "\n" @dictionary = document.ref(:Type => :Page, :Parent => document.state.store.pages, :MediaBox => dimensions, :Contents => content) resources[:ProcSet] = [:PDF, :Text, :ImageB, :ImageC, :ImageI] @stamp_stream = nil @stamp_dictionary = nil end # some entries in the Page dict can be inherited from parent Pages dicts. # # Starting with the current page dict, this method will walk up the # inheritance chain return the first value that is found for key # # inherited_dictionary_value(:MediaBox) # => [ 0, 0, 595, 842 ] # def inherited_dictionary_value(key, local_dict = nil) local_dict ||= dictionary.data if local_dict.has_key?(key) local_dict[key] elsif local_dict.has_key?(:Parent) inherited_dictionary_value(key, local_dict[:Parent].data) else nil end end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/core/reference.rb0000644000000000000000000000575512114176157021211 0ustar rootroot# encoding: utf-8 # reference.rb : Implementation of PDF indirect objects # # Copyright April 2008, Gregory Brown. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. require 'zlib' module Prawn module Core class Reference #:nodoc: attr_accessor :gen, :data, :offset, :stream, :live, :identifier def initialize(id, data) @identifier = id @gen = 0 @data = data @compressed = false @stream = nil end def object output = "#{@identifier} #{gen} obj\n" << Prawn::Core::PdfObject(data) << "\n" if @stream output << "stream\n" << @stream << "\nendstream\n" end output << "endobj\n" end def <<(data) raise 'Cannot add data to a stream that is compressed' if @compressed (@stream ||= "") << data @data[:Length] = @stream.length @stream end def to_s "#{@identifier} #{gen} R" end def compress_stream @stream = Zlib::Deflate.deflate(@stream) @data[:Filter] = :FlateDecode @data[:Length] = @stream.length @compressed = true end def compressed? @compressed end # Creates a deep copy of this ref. If +share+ is provided, shares the # given dictionary entries between the old ref and the new. # def deep_copy(share=[]) r = dup case r.data when Hash # Copy each entry not in +share+. (r.data.keys - share).each do |k| r.data[k] = Marshal.load(Marshal.dump(r.data[k])) end when Prawn::Core::NameTree::Node r.data = r.data.deep_copy else r.data = Marshal.load(Marshal.dump(r.data)) end r.stream = Marshal.load(Marshal.dump(r.stream)) r end # Replaces the data and stream with that of other_ref. Preserves compressed # status. def replace(other_ref) @data = other_ref.data @stream = other_ref.stream @compressed = other_ref.compressed? end # Marks this and all referenced objects live, recursively. def mark_live return if @live @live = true referenced_objects.each { |o| o.mark_live } end private # All objects referenced by this one. Used for GC. def referenced_objects(obj=@data) case obj when self.class [] when Hash obj.values.map{|v| [v] + referenced_objects(v) } when Array obj.map{|v| [v] + referenced_objects(v) } when OutlineRoot, OutlineItem referenced_objects(obj.to_hash) else [] end.flatten.grep(self.class) end end module_function def Reference(*args, &block) #:nodoc: Reference.new(*args, &block) end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/core/name_tree.rb0000644000000000000000000001041112114176157021173 0ustar rootroot# encoding: utf-8 # name_tree.rb : Implements NameTree for PDF # # Copyright November 2008, Jamis Buck. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. # module Prawn module Core module NameTree #:nodoc: class Node #:nodoc: attr_reader :children attr_reader :limit attr_reader :document attr_accessor :parent attr_accessor :ref def initialize(document, limit, parent=nil) @document = document @children = [] @limit = limit @parent = parent @ref = nil end def empty? children.empty? end def size leaf? ? children.size : children.inject(0) { |sum, child| sum + child.size } end def leaf? children.empty? || children.first.is_a?(Value) end def add(name, value) self << Value.new(name, value) end def to_hash hash = {} hash[:Limits] = [least, greatest] if parent if leaf? hash[:Names] = children if leaf? else hash[:Kids] = children.map { |child| child.ref } end return hash end def least if leaf? children.first.name else children.first.least end end def greatest if leaf? children.last.name else children.last.greatest end end def <<(value) if children.empty? children << value elsif leaf? children.insert(insertion_point(value), value) split! if children.length > limit else fit = children.detect { |child| child >= value } fit = children.last unless fit fit << value end value end def >=(value) children.empty? || children.last >= value end def split! if parent parent.split(self) else left, right = new_node(self), new_node(self) split_children(self, left, right) children.replace([left, right]) end end # Returns a deep copy of this node, without copying expensive things # like the ref to @document. # def deep_copy node = dup node.instance_variable_set("@children", Marshal.load(Marshal.dump(children))) node.instance_variable_set("@ref", node.ref ? node.ref.deep_copy : nil) node end protected def split(node) new_child = new_node(self) split_children(node, node, new_child) index = children.index(node) children.insert(index+1, new_child) split! if children.length > limit end private def new_node(parent=nil) node = Node.new(document, limit, parent) node.ref = document.ref!(node) return node end def split_children(node, left, right) half = (node.limit+1)/2 left_children, right_children = node.children[0...half], node.children[half..-1] left.children.replace(left_children) right.children.replace(right_children) unless node.leaf? left_children.each { |child| child.parent = left } right_children.each { |child| child.parent = right } end end def insertion_point(value) children.each_with_index do |child, index| return index if child >= value end return children.length end end class Value #:nodoc: include Comparable attr_reader :name attr_reader :value def initialize(name, value) @name, @value = Prawn::Core::LiteralString.new(name), value end def <=>(leaf) name <=> leaf.name end def inspect "#" end def to_s "#{name} : #{value}" end end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/core/byte_string.rb0000644000000000000000000000035312114176157021571 0ustar rootroot# encoding: utf-8 module Prawn module Core # This is used to differentiate strings that must be encoded as # a byte string, such as binary data from encrypted strings. class ByteString < String #:nodoc: end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/text.rb0000644000000000000000000004060712114176157017302 0ustar rootroot# encoding: utf-8 # text.rb : Implements PDF text primitives # # Copyright May 2008, Gregory Brown. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. require "prawn/core/text" require "prawn/text/formatted" require "prawn/text/box" require "zlib" module Prawn module Text include Prawn::Core::Text include Prawn::Text::Formatted # No-Break Space Prawn::Text::NBSP = " " # Zero Width Space (indicate word boundaries without a space) Prawn::Text::ZWSP = [8203].pack("U") # Soft Hyphen (invisible, except when causing a line break) Prawn::Text::SHY = "­" # If you want text to flow onto a new page or between columns, this is the # method to use. If, instead, if you want to place bounded text outside of # the flow of a document (for captions, labels, charts, etc.), use Text::Box # or its convenience method text_box. # # Draws text on the page. Prawn attempts to wrap the text to fit within your # current bounding box (or margin_box if no bounding box is being used). # Text will flow onto the next page when it reaches the bottom of the # bounding box. Text wrap in Prawn does not re-flow linebreaks, so if you # want fully automated text wrapping, be sure to remove newlines before # attempting to draw your string. # # == Examples # # pdf.text "Will be wrapped when it hits the edge of your bounding box" # pdf.text "This will be centered", :align => :center # pdf.text "This will be right aligned", :align => :right # pdf.text "This includes inline " + # "formatting", :inline_format => true # # If your font contains kerning pair data that Prawn can parse, the # text will be kerned by default. You can disable kerning by including # a false :kerning option. If you want to disable kerning on an # entire document, set default_kerning = false for that document # # === Text Positioning Details # # The text is positioned at font.ascender below the baseline, # making it easy to use this method within bounding boxes and spans. # # == Encoding # # Note that strings passed to this function should be encoded as UTF-8. # If you get unexpected characters appearing in your rendered document, # check this. # # If the current font is a built-in one, although the string must be # encoded as UTF-8, only characters that are available in WinAnsi # are allowed. # # If an empty box is rendered to your PDF instead of the character you # wanted it usually means the current font doesn't include that character. # # == Options (default values marked in []) # # :inline_format:: # boolean. If true, then the string parameter is interpreted # as a HTML-esque string that recognizes the following tags: # \:: bold # \:: italic # \:: underline # \:: strikethrough # \:: subscript # \:: superscript # \:: # with the following attributes (using double or single quotes) # size="24":: # attribute for setting size # character_spacing="2.5":: # attribute for setting character spacing # name="Helvetica":: # attribute for setting the font. The font name must be an # AFM font with the desired faces or must be a font that is # already registered using Prawn::Document#font_families # \:: # with the following attributes # rgb="ffffff" or rgb="#ffffff":: # c="100" m="100" y="100" k="100":: # \:: # with the following attributes # href="http://example.com":: an external link # anchor="ToC":: # where the value of the anchor attribute is the name of a # destination that has already been or will be registered # using Prawn::Core::Destinations#add_dest. A clickable link # will be created to that destination. # Note that you must explicitly underline and color using the # appropriate tags if you which to draw attention to the link # # :kerning:: boolean. Whether or not to use kerning (if it # is available with the current font) # [value of document.default_kerning?] # :size:: number. The font size to use. [current font # size] # :color:: an RGB color ("ff0000") or CMYK array [10, 20, 30, 40]. # :character_spacing:: number. The amount of space to add # to or remove from the default character # spacing. [0] # :style:: The style to use. The requested style must be part of # the current font familly. [current style] # :indent_paragraphs:: number. The amount to indent the # first line of each paragraph. Omit this # option if you do not want indenting # :direction:: # :ltr, :rtl, Direction of the text (left-to-right # or right-to-left) [value of document.text_direction] # :fallback_fonts:: # An array of font names. Each name must be the name of an AFM font or # the name that was used to register a family of TTF fonts (see # Prawn::Document#font_families). If present, then each glyph will be # rendered using the first font that includes the glyph, starting with # the current font and then moving through :fallback_fonts from # left to right. # :align:: # :left, :center, :right, or # :justify Alignment within the bounding box # [:left if direction is :ltr, :right if direction is :rtl] # :valign:: :top, :center, or :bottom. # Vertical alignment within the bounding box [:top] # :leading:: # number. Additional space between lines [value of # document.default_leading] # :final_gap:: boolean. If true, then the space between # each line is included below the last line; # otherwise, document.y is placed just below the # descender of the last line printed [true] # :mode:: The text rendering mode to use. Use this to specify if the # text should render with the fill color, stroke color or # both. See the comments to text_rendering_mode() to see # a list of valid options. [0] # # == Exceptions # # Raises ArgumentError if :at option included # # Raises Prawn::Errrors::CannotFit if not wide enough to print # any text # def text(string, options={}) return false if string.nil? # we modify the options. don't change the user's hash options = options.dup if options[:inline_format] options.delete(:inline_format) array = Text::Formatted::Parser.to_array(string) else array = [{ :text => string }] end formatted_text(array, options) end # Draws formatted text to the page. # Formatted text is comprised of an array of hashes, where each hash defines # text and format information. See Text::Formatted#formatted_text_box for # more information on the structure of this array # # == Example # # text([{ :text => "hello" }, # { :text => "world", # :size => 24, # :styles => [:bold, :italic] }]) # # == Options # # Accepts the same options as #text # # == Exceptions # # Same as for #text # def formatted_text(array, options={}) options = inspect_options_for_text(options.dup) if color = options.delete(:color) array = array.map do |fragment| fragment[:color] ? fragment : fragment.merge(:color => color) end end if @indent_paragraphs Text::Formatted::Parser.array_paragraphs(array).each do |paragraph| options[:skip_encoding] = false remaining_text = draw_indented_formatted_line(paragraph, options) options[:skip_encoding] = true if @no_text_printed # unless this paragraph was an empty line unless @all_text_printed @bounding_box.move_past_bottom options[:skip_encoding] = false remaining_text = draw_indented_formatted_line(paragraph, options) options[:skip_encoding] = true end end remaining_text = fill_formatted_text_box(remaining_text, options) draw_remaining_formatted_text_on_new_pages(remaining_text, options) end else remaining_text = fill_formatted_text_box(array, options) options[:skip_encoding] = true draw_remaining_formatted_text_on_new_pages(remaining_text, options) end end # Draws text on the page, beginning at the point specified by the :at option # the string is assumed to be pre-formatted to properly fit the page. # # pdf.draw_text "Hello World", :at => [100,100] # pdf.draw_text "Goodbye World", :at => [50,50], :size => 16 # # If your font contains kerning pair data that Prawn can parse, the # text will be kerned by default. You can disable kerning by including # a false :kerning option. If you want to disable kerning on an # entire document, set default_kerning = false for that document # # === Text Positioning Details: # # Prawn will position your text by the left-most edge of its baseline, and # flow along a single line. (This means that :align will not work) # # == Rotation # # Text can be rotated before it is placed on the canvas by specifying the # :rotate option with a given angle. Rotation occurs counter-clockwise. # # == Encoding # # Note that strings passed to this function should be encoded as UTF-8. # If you get unexpected characters appearing in your rendered document, # check this. # # If the current font is a built-in one, although the string must be # encoded as UTF-8, only characters that are available in WinAnsi # are allowed. # # If an empty box is rendered to your PDF instead of the character you # wanted it usually means the current font doesn't include that character. # # == Options (default values marked in []) # # :at:: [x, y](required). The position at which to start the text # :kerning:: boolean. Whether or not to use kerning (if it # is available with the current font) # [value of default_kerning?] # :size:: number. The font size to use. [current font # size] # :style:: The style to use. The requested style must be part of # the current font familly. [current style] # # :rotate:: number. The angle to which to rotate text # # == Exceptions # # Raises ArgumentError if :at option omitted # # Raises ArgumentError if :align option included # def draw_text(text, options) options = inspect_options_for_draw_text(options.dup) # dup because normalize_encoding changes the string text = text.to_s.dup save_font do process_text_options(options) font.normalize_encoding!(text) unless @skip_encoding font_size(options[:size]) { draw_text!(text, options) } end end # Gets height of text in PDF points. # Same options as #text, except as noted. # Not compatible with :indent_paragraphs option # # ==Example # # height_of("hello\nworld") # # == Exceptions # # Raises NotImplementedError if :indent_paragraphs # option included # # Raises Prawn::Errrors::CannotFit if not wide enough to print # any text # def height_of(string, options={}) height_of_formatted([{ :text => string }], options) end # Gets height of formatted text in PDF points. # See documentation for #height_of. # # ==Example # # height_of_formatted([{ :text => "hello" }, # { :text => "world", # :size => 24, # :styles => [:bold, :italic] }]) # def height_of_formatted(array, options={}) if options[:indent_paragraphs] raise NotImplementedError, ":indent_paragraphs option not available" + "with height_of" end process_final_gap_option(options) box = Text::Formatted::Box.new(array, options.merge(:height => 100000000, :document => self)) printed = box.render(:dry_run => true) height = box.height height += box.line_gap + box.leading if @final_gap height end private def draw_remaining_formatted_text_on_new_pages(remaining_text, options) while remaining_text.length > 0 @bounding_box.move_past_bottom previous_remaining_text = remaining_text remaining_text = fill_formatted_text_box(remaining_text, options) break if remaining_text == previous_remaining_text end end def draw_indented_formatted_line(string, options) indent(@indent_paragraphs) do fill_formatted_text_box(string, options.dup.merge(:single_line => true)) end end def fill_formatted_text_box(text, options) merge_text_box_positioning_options(options) box = Text::Formatted::Box.new(text, options) remaining_text = box.render @no_text_printed = box.nothing_printed? @all_text_printed = box.everything_printed? self.y -= box.height self.y -= box.line_gap + box.leading if @final_gap remaining_text end def merge_text_box_positioning_options(options) bottom = @bounding_box.stretchy? ? @margin_box.absolute_bottom : @bounding_box.absolute_bottom options[:height] = y - bottom options[:width] = bounds.width options[:at] = [@bounding_box.left_side - @bounding_box.absolute_left, y - @bounding_box.absolute_bottom] end def inspect_options_for_draw_text(options) if options[:at].nil? raise ArgumentError, "The :at option is required for draw_text" elsif options[:align] raise ArgumentError, "The :align option does not work with draw_text" end if options[:kerning].nil? then options[:kerning] = default_kerning? end valid_options = Prawn::Core::Text::VALID_OPTIONS + [:at, :rotate] Prawn.verify_options(valid_options, options) options end def inspect_options_for_text(options) if options[:at] raise ArgumentError, ":at is no longer a valid option with text." + "use draw_text or text_box instead" end process_final_gap_option(options) process_indent_paragraphs_option(options) options[:document] = self options end def process_final_gap_option(options) @final_gap = options[:final_gap].nil? || options[:final_gap] options.delete(:final_gap) end def process_indent_paragraphs_option(options) @indent_paragraphs = options[:indent_paragraphs] options.delete(:indent_paragraphs) end def move_text_position(dy) bottom = @bounding_box.stretchy? ? @margin_box.absolute_bottom : @bounding_box.absolute_bottom @bounding_box.move_past_bottom if (y - dy) < bottom self.y -= dy end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/font/0000755000000000000000000000000012114176157016730 5ustar rootrootruby-prawn-1.0.0~rc2.orig/lib/prawn/font/dfont.rb0000644000000000000000000000220712114176157020370 0ustar rootroot# encoding: utf-8 # # font.rb : The Prawn font class # # Copyright November 2008, Jamis Buck. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. # require 'prawn/font/ttf' module Prawn class Font class DFont < TTF # Returns a list of the names of all named fonts in the given dfont file. # Note that fonts are not required to be named in a dfont file, so the # list may be empty even if the file does contain fonts. Also, note that # the list is returned in no particular order, so the first font in the # list is not necessarily the font at index 0 in the file. # def self.named_fonts(file) TTFunk::ResourceFile.open(file) do |f| return f.resources_for("sfnt") end end # Returns the number of fonts contained in the dfont file. # def self.font_count(file) TTFunk::ResourceFile.open(file) do |f| return f.map["sfnt"][:list].length end end private def read_ttf_file TTFunk::File.from_dfont(@name, @options[:font] || 0) end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/font/ttf.rb0000644000000000000000000002453412114176157020062 0ustar rootroot# encoding: utf-8 # prawn/font/ttf.rb : Implements AFM font support for Prawn # # Copyright May 2008, Gregory Brown / James Healy / Jamis Buck # All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. require 'ttfunk' require 'ttfunk/subset_collection' module Prawn class Font class TTF < Font attr_reader :ttf, :subsets def unicode? true end def initialize(document, name, options={}) super @ttf = read_ttf_file @subsets = TTFunk::SubsetCollection.new(@ttf) @attributes = {} @bounding_boxes = {} @char_widths = {} @has_kerning_data = @ttf.kerning.exists? && @ttf.kerning.tables.any? @ascender = Integer(@ttf.ascent * scale_factor) @descender = Integer(@ttf.descent * scale_factor) @line_gap = Integer(@ttf.line_gap * scale_factor) end # NOTE: +string+ must be UTF8-encoded. def compute_width_of(string, options={}) #:nodoc: scale = (options[:size] || size) / 1000.0 if options[:kerning] kern(string).inject(0) do |s,r| if r.is_a?(Numeric) s - r else r.inject(s) { |s2, u| s2 + character_width_by_code(u) } end end * scale else string.codepoints.inject(0) do |s,r| s + character_width_by_code(r) end * scale end end # The font bbox, as an array of integers # def bbox @bbox ||= @ttf.bbox.map { |i| Integer(i * scale_factor) } end # Returns true if the font has kerning data, false otherwise def has_kerning_data? @has_kerning_data end # Perform any changes to the string that need to happen # before it is rendered to the canvas. Returns an array of # subset "chunks", where the even-numbered indices are the # font subset number, and the following entry element is # either a string or an array (for kerned text). # # The +text+ parameter must be UTF8-encoded. # def encode_text(text,options={}) text = text.chomp if options[:kerning] last_subset = nil kern(text).inject([]) do |result, element| if element.is_a?(Numeric) result.last[1] = [result.last[1]] unless result.last[1].is_a?(Array) result.last[1] << element result else encoded = @subsets.encode(element) if encoded.first[0] == last_subset result.last[1] << encoded.first[1] encoded.shift end if encoded.any? last_subset = encoded.last[0] result + encoded else result end end end else @subsets.encode(text.unpack("U*")) end end def basename @basename ||= @ttf.name.postscript_name end # not sure how to compute this for true-type fonts... def stemV 0 end def italic_angle @italic_angle ||= if @ttf.postscript.exists? raw = @ttf.postscript.italic_angle hi, low = raw >> 16, raw & 0xFF hi = -((hi ^ 0xFFFF) + 1) if hi & 0x8000 != 0 "#{hi}.#{low}".to_f else 0 end end def cap_height @cap_height ||= begin height = @ttf.os2.exists? && @ttf.os2.cap_height || 0 height == 0 ? @ascender : height end end def x_height # FIXME: seems like if os2 table doesn't exist, we could # just find the height of the lower-case 'x' glyph? @ttf.os2.exists? && @ttf.os2.x_height || 0 end def family_class @family_class ||= (@ttf.os2.exists? && @ttf.os2.family_class || 0) >> 8 end def serif? @serif ||= [1,2,3,4,5,7].include?(family_class) end def script? @script ||= family_class == 10 end def pdf_flags @flags ||= begin flags = 0 flags |= 0x0001 if @ttf.postscript.fixed_pitch? flags |= 0x0002 if serif? flags |= 0x0008 if script? flags |= 0x0040 if italic_angle != 0 flags |= 0x0004 # assume the font contains at least some non-latin characters end end def normalize_encoding(text) text.normalize_to_utf8 end def glyph_present?(char) code = char.codepoints.first cmap[code] > 0 end # Returns the number of characters in +str+ (a UTF-8-encoded string). # def character_count(str) str.unicode_length end private def cmap @cmap ||= @ttf.cmap.unicode.first or raise("no unicode cmap for font") end # +string+ must be UTF8-encoded. # # Returns an array. If an element is a numeric, it represents the # kern amount to inject at that position. Otherwise, the element # is an array of UTF-16 characters. def kern(string) a = [] string.codepoints do |r| if a.empty? a << [r] elsif (kern = kern_pairs_table[[cmap[a.last.last], cmap[r]]]) kern *= scale_factor a << -kern << [r] else a.last << r end end a end def kern_pairs_table @kerning_data ||= has_kerning_data? ? @ttf.kerning.tables.first.pairs : {} end def cid_to_gid_map max = cmap.code_map.keys.max (0..max).map { |cid| cmap[cid] }.pack("n*") end def hmtx @hmtx ||= @ttf.horizontal_metrics end def character_width_by_code(code) return 0 unless cmap[code] # Some TTF fonts have nonzero widths for \n (UTF-8 / ASCII code: 10). # Patch around this as we'll never be drawing a newline with a width. return 0.0 if code == 10 @char_widths[code] ||= Integer(hmtx.widths[cmap[code]] * scale_factor) end def scale_factor @scale ||= 1000.0 / @ttf.header.units_per_em end def register(subset) temp_name = @ttf.name.postscript_name.gsub("\0","").to_sym ref = @document.ref!(:Type => :Font, :BaseFont => temp_name) # Embed the font metrics in the document after everything has been # drawn, just before the document is emitted. @document.before_render { |doc| embed(ref, subset) } ref end def embed(reference, subset) font_content = @subsets[subset].encode # FIXME: we need postscript_name and glyph widths from the font # subset. Perhaps this could be done by querying the subset, # rather than by parsing the font that the subset produces? font = TTFunk::File.new(font_content) # empirically, it looks like Adobe Reader will not display fonts # if their font name is more than 33 bytes long. Strange. But true. basename = font.name.postscript_name[0, 33].gsub("\0","") raise "Can't detect a postscript name for #{file}" if basename.nil? compressed_font = Zlib::Deflate.deflate(font_content) fontfile = @document.ref!(:Length1 => font_content.size, :Filter => :FlateDecode ) fontfile << compressed_font descriptor = @document.ref!(:Type => :FontDescriptor, :FontName => basename.to_sym, :FontFile2 => fontfile, :FontBBox => bbox, :Flags => pdf_flags, :StemV => stemV, :ItalicAngle => italic_angle, :Ascent => @ascender, :Descent => @descender, :CapHeight => cap_height, :XHeight => x_height) hmtx = font.horizontal_metrics widths = font.cmap.tables.first.code_map.map { |gid| Integer(hmtx.widths[gid] * scale_factor) }[32..-1] # It would be nice to have Encoding set for the macroman subsets, # and only do a ToUnicode cmap for non-encoded unicode subsets. # However, apparently Adobe Reader won't render MacRoman encoded # subsets if original font contains unicode characters. (It has to # be some flag or something that ttfunk is simply copying over... # but I can't figure out which flag that is.) # # For now, it's simplest to just create a unicode cmap for every font. # It offends my inner purist, but it'll do. map = @subsets[subset].to_unicode_map ranges = [[]] lines = map.keys.sort.inject("") do |s, code| ranges << [] if ranges.last.length >= 100 unicode = map[code] ranges.last << "<%02x><%04x>" % [code, unicode] end range_blocks = ranges.inject("") do |s, list| s << "%d beginbfchar\n%s\nendbfchar\n" % [list.length, list.join("\n")] end to_unicode_cmap = UNICODE_CMAP_TEMPLATE % range_blocks.strip cmap = @document.ref!({}) cmap << to_unicode_cmap cmap.compress_stream reference.data.update(:Subtype => :TrueType, :BaseFont => basename.to_sym, :FontDescriptor => descriptor, :FirstChar => 32, :LastChar => 255, :Widths => @document.ref!(widths), :ToUnicode => cmap) end UNICODE_CMAP_TEMPLATE = <<-STR.strip.gsub(/^\s*/, "") /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <00> endcodespacerange %s endcmap CMapName currentdict /CMap defineresource pop end end STR def read_ttf_file TTFunk::File.open(@name) end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/font/afm.rb0000644000000000000000000001433012114176157020021 0ustar rootroot# encoding: utf-8 # prawn/font/afm.rb : Implements AFM font support for Prawn # # Copyright May 2008, Gregory Brown / James Healy. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. require 'prawn/encoding' require 'afm' module Prawn class Font class AFM < Font BUILT_INS = %w[ Courier Helvetica Times-Roman Symbol ZapfDingbats Courier-Bold Courier-Oblique Courier-BoldOblique Times-Bold Times-Italic Times-BoldItalic Helvetica-Bold Helvetica-Oblique Helvetica-BoldOblique ] def unicode? false end def self.metrics_path if m = ENV['METRICS'] @metrics_path ||= m.split(':') else @metrics_path ||= [ ".", "/usr/lib/afm", "/usr/local/lib/afm", "/usr/openwin/lib/fonts/afm", Prawn::DATADIR+'/fonts'] end end attr_reader :attributes #:nodoc: def initialize(document, name, options={}) #:nodoc: unless BUILT_INS.include?(name) raise Prawn::Errors::UnknownFont, "#{name} is not a known font." end super @@winansi ||= Prawn::Encoding::WinAnsi.new # parse data/encodings/win_ansi.txt once only @@font_data ||= SynchronizedCache.new # parse each ATM font file once only file_name = @name.dup file_name << ".afm" unless file_name =~ /\.afm$/ file_name = file_name[0] == ?/ ? file_name : find_font(file_name) font_data = @@font_data[file_name] ||= ::AFM::Font.new(file_name) @glyph_table = build_glyph_table(font_data) @kern_pairs = font_data.kern_pairs @kern_pair_table = build_kern_pair_table(@kern_pairs) @attributes = font_data.metadata @ascender = @attributes["Ascender"].to_i @descender = @attributes["Descender"].to_i @line_gap = Float(bbox[3] - bbox[1]) - (@ascender - @descender) end # The font bbox, as an array of integers # def bbox @bbox ||= @attributes['FontBBox'].split(/\s+/).map { |e| Integer(e) } end # NOTE: String *must* be encoded as WinAnsi def compute_width_of(string, options={}) #:nodoc: scale = (options[:size] || size) / 1000.0 if options[:kerning] strings, numbers = kern(string).partition { |e| e.is_a?(String) } total_kerning_offset = numbers.inject(0.0) { |s,r| s + r } (unscaled_width_of(strings.join) - total_kerning_offset) * scale else unscaled_width_of(string) * scale end end # Returns true if the font has kerning data, false otherwise # def has_kerning_data? @kern_pairs.any? end # built-in fonts only work with winansi encoding, so translate the # string. Changes the encoding in-place, so the argument itself # is replaced with a string in WinAnsi encoding. # def normalize_encoding(text) enc = @@winansi text.unpack("U*").collect { |i| enc[i] }.pack("C*") rescue ArgumentError raise Prawn::Errors::IncompatibleStringEncoding, "Arguments to text methods must be UTF-8 encoded" end # Returns the number of characters in +str+ (a WinAnsi-encoded string). # def character_count(str) str.length end # Perform any changes to the string that need to happen # before it is rendered to the canvas. Returns an array of # subset "chunks", where each chunk is an array of two elements. # The first element is the font subset number, and the second # is either a string or an array (for kerned text). # # For Adobe fonts, there is only ever a single subset, so # the first element of the array is "0", and the second is # the string itself (or an array, if kerning is performed). # # The +text+ parameter must be in WinAnsi encoding (cp1252). # def encode_text(text, options={}) [[0, options[:kerning] ? kern(text) : text]] end def glyph_present?(char) if char == "_" true else normalize_encoding(char) != "_" end end private def register(subset) font_dict = {:Type => :Font, :Subtype => :Type1, :BaseFont => name.to_sym} # Symbolic AFM fonts (Symbol, ZapfDingbats) have their own encodings font_dict.merge!(:Encoding => :WinAnsiEncoding) unless symbolic? @document.ref!(font_dict) end def symbolic? attributes["CharacterSet"] == "Special" end def find_font(file) self.class.metrics_path.find { |f| File.exist? "#{f}/#{file}" } + "/#{file}" rescue NoMethodError raise Prawn::Errors::UnknownFont, "Couldn't find the font: #{file} in any of:\n" + self.class.metrics_path.join("\n") end # converts a string into an array with spacing offsets # bewteen characters that need to be kerned # # String *must* be encoded as WinAnsi # def kern(string) kerned = [[]] last_byte = nil string.bytes do |byte| if k = last_byte && @kern_pair_table[[last_byte, byte]] kerned << -k << [byte] else kerned.last << byte end last_byte = byte end kerned.map { |e| e = (Array === e ? e.pack("C*") : e) e.respond_to?(:force_encoding) ? e.force_encoding("Windows-1252") : e } end def build_kern_pair_table(kern_pairs) character_hash = Hash[Encoding::WinAnsi::CHARACTERS.zip((0..Encoding::WinAnsi::CHARACTERS.size).to_a)] kern_pairs.inject({}) do |h,p| h[ [character_hash[p[0]], character_hash[p[1]]] ] = p[2] h end end def build_glyph_table(font_data) (0..255).map do |char| metrics = font_data.metrics_for(char) metrics ? metrics[:wx] : 0 end end def unscaled_width_of(string) string.bytes.inject(0) do |s,r| s + @glyph_table[r] end end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/utilities.rb0000644000000000000000000000235212114176157020324 0ustar rootroot# encoding: utf-8 # utilities.rb : General-purpose utility classes which don't fit anywhere else # # Copyright August 2012, Alex Dowad. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. require 'thread' module Prawn # Throughout the Prawn codebase, repeated calculations which can benefit from caching are made # In some cases, caching and reusing results can not only save CPU cycles but also greatly # reduce memory requirements # But at the same time, we don't want to throw away thread safety # We have two interchangeable thread-safe cache implementations: class SynchronizedCache # As an optimization, this could access the hash directly on VMs with a global interpreter lock (like MRI) def initialize @cache = {} @mutex = Mutex.new end def [](key) @mutex.synchronize { @cache[key] } end def []=(key,value) @mutex.synchronize { @cache[key] = value } end end class ThreadLocalCache def initialize @cache_id = "cache_#{self.object_id}".to_sym end def [](key) (Thread.current[@cache_id] ||= {})[key] end def []=(key,value) (Thread.current[@cache_id] ||= {})[key] = value end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/document.rb0000644000000000000000000005764612114176157020147 0ustar rootroot# encoding: utf-8 # document.rb : Implements PDF document generation for Prawn # # Copyright April 2008, Gregory Brown. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. require "stringio" require "prawn/document/page_geometry" require "prawn/document/bounding_box" require "prawn/document/column_box" require "prawn/document/internals" require "prawn/document/span" require "prawn/document/snapshot" require "prawn/document/graphics_state" module Prawn # The Prawn::Document class is how you start creating a PDF document. # # There are three basic ways you can instantiate PDF Documents in Prawn, they # are through assignment, implicit block or explicit block. Below is an exmple # of each type, each example does exactly the same thing, makes a PDF document # with all the defaults and puts in the default font "Hello There" and then # saves it to the current directory as "example.pdf" # # For example, assignment can be like this: # # pdf = Prawn::Document.new # pdf.text "Hello There" # pdf.render_file "example.pdf" # # Or you can do an implied block form: # # Prawn::Document.generate "example.pdf" do # text "Hello There" # end # # Or if you need to access a variable outside the scope of the block, the # explicit block form: # # words = "Hello There" # Prawn::Document.generate "example.pdf" do |pdf| # pdf.text words # end # # Usually, the block forms are used when you are simply creating a PDF document # that you want to immediately save or render out. # # See the new and generate methods for further details on the above. # class Document include Prawn::Document::Internals include Prawn::Core::Annotations include Prawn::Core::Destinations include Prawn::Document::Snapshot include Prawn::Document::GraphicsState include Prawn::Document::Security include Prawn::Text include Prawn::Graphics include Prawn::Images include Prawn::Stamp include Prawn::SoftMask # Any module added to this array will be included into instances of # Prawn::Document at the per-object level. These will also be inherited by # any subclasses. # # Example: # # module MyFancyModule # # def party! # text "It's a big party!" # end # # end # # Prawn::Document.extensions << MyFancyModule # # Prawn::Document.generate("foo.pdf") do # party! # end # def self.extensions @extensions ||= [] end def self.inherited(base) #:nodoc: extensions.each { |e| base.extensions << e } end # Creates and renders a PDF document. # # When using the implicit block form, Prawn will evaluate the block # within an instance of Prawn::Document, simplifying your syntax. # However, please note that you will not be able to reference variables # from the enclosing scope within this block. # # # Using implicit block form and rendering to a file # Prawn::Document.generate "example.pdf" do # # self here is set to the newly instantiated Prawn::Document # # and so any variables in the outside scope are unavailable # font "Times-Roman" # draw_text "Hello World", :at => [200,720], :size => 32 # end # # If you need to access your local and instance variables, use the explicit # block form shown below. In this case, Prawn yields an instance of # PDF::Document and the block is an ordinary closure: # # # Using explicit block form and rendering to a file # content = "Hello World" # Prawn::Document.generate "example.pdf" do |pdf| # # self here is left alone # pdf.font "Times-Roman" # pdf.draw_text content, :at => [200,720], :size => 32 # end # def self.generate(filename,options={},&block) pdf = new(options,&block) pdf.render_file(filename) end # Creates a new PDF Document. The following options are available (with # the default values marked in []) # # :page_size:: One of the Document::PageGeometry sizes [LETTER] # :page_layout:: Either :portrait or :landscape # :margin:: Sets the margin on all sides in points [0.5 inch] # :left_margin:: Sets the left margin in points [0.5 inch] # :right_margin:: Sets the right margin in points [0.5 inch] # :top_margin:: Sets the top margin in points [0.5 inch] # :bottom_margin:: Sets the bottom margin in points [0.5 inch] # :skip_page_creation:: Creates a document without starting the first page [false] # :compress:: Compresses content streams before rendering them [false] # :optimize_objects:: Reduce number of PDF objects in output, at expense of render time [false] # :background:: An image path to be used as background on all pages [nil] # :background_scale:: Backgound image scale [1] [nil] # :info:: Generic hash allowing for custom metadata properties [nil] # :template:: The path to an existing PDF file to use as a template [nil] # # Setting e.g. the :margin to 100 points and the :left_margin to 50 will result in margins # of 100 points on every side except for the left, where it will be 50. # # The :margin can also be an array much like CSS shorthand: # # # Top and bottom are 20, left and right are 100. # :margin => [20, 100] # # Top is 50, left and right are 100, bottom is 20. # :margin => [50, 100, 20] # # Top is 10, right is 20, bottom is 30, left is 40. # :margin => [10, 20, 30, 40] # # Additionally, :page_size can be specified as a simple two value array giving # the width and height of the document you need in PDF Points. # # Usage: # # # New document, US Letter paper, portrait orientation # pdf = Prawn::Document.new # # # New document, A4 paper, landscaped # pdf = Prawn::Document.new(:page_size => "A4", :page_layout => :landscape) # # # New document, Custom size # pdf = Prawn::Document.new(:page_size => [200, 300]) # # # New document, with background # pdf = Prawn::Document.new(:background => "#{Prawn::DATADIR}/images/pigs.jpg") # def initialize(options={},&block) options = options.dup Prawn.verify_options [:page_size, :page_layout, :margin, :left_margin, :right_margin, :top_margin, :bottom_margin, :skip_page_creation, :compress, :skip_encoding, :background, :info, :optimize_objects, :template], options # need to fix, as the refactoring breaks this # raise NotImplementedError if options[:skip_page_creation] self.class.extensions.reverse_each { |e| extend e } @internal_state = Prawn::Core::DocumentState.new(options) @internal_state.populate_pages_from_store(self) min_version(state.store.min_version) if state.store.min_version @background = options[:background] @background_scale = options[:background_scale] || 1 @font_size = 12 @bounding_box = nil @margin_box = nil @page_number = 0 options[:size] = options.delete(:page_size) options[:layout] = options.delete(:page_layout) if options[:template] fresh_content_streams(options) go_to_page(1) else if options[:skip_page_creation] || options[:template] start_new_page(options.merge(:orphan => true)) else start_new_page(options) end end @bounding_box = @margin_box if block block.arity < 1 ? instance_eval(&block) : block[self] end end attr_accessor :margin_box attr_reader :margins, :y attr_writer :font_size attr_accessor :page_number def state @internal_state end def page state.page end # Creates and advances to a new page in the document. # # Page size, margins, and layout can also be set when generating a # new page. These values will become the new defaults for page creation # # pdf.start_new_page #=> Starts new page keeping current values # pdf.start_new_page(:size => "LEGAL", :layout => :landscape) # pdf.start_new_page(:left_margin => 50, :right_margin => 50) # pdf.start_new_page(:margin => 100) # # A template for a page can be specified by pointing to the path of and existing pdf. # One can also specify which page of the template which defaults otherwise to 1. # # pdf.start_new_page(:template => multipage_template.pdf, :template_page => 2) # # Note: templates get indexed by either the object_id of the filename or stream # entered so that if you reuse the same template multiple times be sure to use the # same instance for more efficient use of resources and smaller rendered pdfs. def start_new_page(options = {}) if last_page = state.page last_page_size = last_page.size last_page_layout = last_page.layout last_page_margins = last_page.margins end page_options = {:size => options[:size] || last_page_size, :layout => options[:layout] || last_page_layout, :margins => last_page_margins} if last_page new_graphic_state = last_page.graphic_state.dup #erase the color space so that it gets reset on new page for fussy pdf-readers new_graphic_state.color_space = {} page_options.merge!(:graphic_state => new_graphic_state) end merge_template_options(page_options, options) if options[:template] state.page = Prawn::Core::Page.new(self, page_options) apply_margin_options(options) generate_margin_box # Reset the bounding box if the new page has different size or layout if last_page && (last_page.size != state.page.size || last_page.layout != state.page.layout) @bounding_box = @margin_box end state.page.new_content_stream if options[:template] use_graphic_settings(options[:template]) unless options[:orphan] state.insert_page(state.page, @page_number) @page_number += 1 canvas { image(@background, :scale => @background_scale, :at => bounds.top_left) } if @background @y = @bounding_box.absolute_top float do state.on_page_create_action(self) end end end # Returns the number of pages in the document # # pdf = Prawn::Document.new # pdf.page_count #=> 1 # 3.times { pdf.start_new_page } # pdf.page_count #=> 4 # def page_count state.page_count end # Re-opens the page with the given (1-based) page number so that you can # draw on it. # # See Prawn::Document#number_pages for a sample usage of this capability. # def go_to_page(k) @page_number = k state.page = state.pages[k-1] generate_margin_box @y = @bounding_box.absolute_top end def y=(new_y) @y = new_y bounds.update_height end # The current y drawing position relative to the innermost bounding box, # or to the page margins at the top level. # def cursor y - bounds.absolute_bottom end # Moves to the specified y position in relative terms to the bottom margin. # def move_cursor_to(new_y) self.y = new_y + bounds.absolute_bottom end # Executes a block and then restores the original y position. If new pages # were created during this block, it will teleport back to the original # page when done. # # pdf.text "A" # # pdf.float do # pdf.move_down 100 # pdf.text "C" # end # # pdf.text "B" # def float original_page = page_number original_y = y yield go_to_page(original_page) unless page_number == original_page self.y = original_y end # Renders the PDF document to string # def render output = StringIO.new finalize_all_page_contents render_header(output) render_body(output) render_xref(output) render_trailer(output) str = output.string str.force_encoding("ASCII-8BIT") if str.respond_to?(:force_encoding) str end # Renders the PDF document to file. # # pdf.render_file "foo.pdf" # def render_file(filename) Kernel.const_defined?("Encoding") ? mode = "wb:ASCII-8BIT" : mode = "wb" File.open(filename,mode) { |f| f << render } end # The bounds method returns the current bounding box you are currently in, # which is by default the box represented by the margin box on the # document itself. When called from within a created bounding_box # block, the box defined by that call will be returned instead of the # document margin box. # # Another important point about bounding boxes is that all x and y measurements # within a bounding box code block are relative to the bottom left corner of the # bounding box. # # For example: # # Prawn::Document.new do # # In the default "margin box" of a Prawn document of 0.5in along each edge # # # Draw a border around the page (the manual way) # stroke do # line(bounds.bottom_left, bounds.bottom_right) # line(bounds.bottom_right, bounds.top_right) # line(bounds.top_right, bounds.top_left) # line(bounds.top_left, bounds.bottom_left) # end # # # Draw a border around the page (the easy way) # stroke_bounds # end # def bounds @bounding_box end # Returns the innermost non-stretchy bounding box. # def reference_bounds @bounding_box.reference_bounds end # Sets Document#bounds to the BoundingBox provided. See above for a brief # description of what a bounding box is. This function is useful if you # really need to change the bounding box manually, but usually, just entering # and exiting bounding box code blocks is good enough. # def bounds=(bounding_box) @bounding_box = bounding_box end # Moves up the document by n points relative to the current position inside # the current bounding box. # def move_up(n) self.y += n end # Moves down the document by n points relative to the current position inside # the current bounding box. # def move_down(n) self.y -= n end # Moves down the document and then executes a block. # # pdf.text "some text" # pdf.pad_top(100) do # pdf.text "This is 100 points below the previous line of text" # end # pdf.text "This text appears right below the previous line of text" # def pad_top(y) move_down(y) yield end # Executes a block then moves down the document # # pdf.text "some text" # pdf.pad_bottom(100) do # pdf.text "This text appears right below the previous line of text" # end # pdf.text "This is 100 points below the previous line of text" # def pad_bottom(y) yield move_down(y) end # Moves down the document by y, executes a block, then moves down the # document by y again. # # pdf.text "some text" # pdf.pad(100) do # pdf.text "This is 100 points below the previous line of text" # end # pdf.text "This is 100 points below the previous line of text" # def pad(y) move_down(y) yield move_down(y) end # Indents the specified number of PDF points for the duration of the block # # pdf.text "some text" # pdf.indent(20) do # pdf.text "This is indented 20 points" # end # pdf.text "This starts 20 points left of the above line " + # "and is flush with the first line" # pdf.indent 20, 20 do # pdf.text "This line is indented on both sides." # end # def indent(left, right = 0, &block) bounds.indent(left, right, &block) end def mask(*fields) # :nodoc: # Stores the current state of the named attributes, executes the block, and # then restores the original values after the block has executed. # -- I will remove the nodoc if/when this feature is a little less hacky stored = {} fields.each { |f| stored[f] = send(f) } yield fields.each { |f| send("#{f}=", stored[f]) } end # Attempts to group the given block vertically within the current context. # First attempts to render it in the current position on the current page. # If that attempt overflows, it is tried anew after starting a new context # (page or column). Returns a logically true value if the content fits in # one page/column, false if a new page or column was needed. # # Raises CannotGroup if the provided content is too large to fit alone in # the current page or column. # def group(second_attempt=false) old_bounding_box = @bounding_box @bounding_box = SimpleDelegator.new(@bounding_box) def @bounding_box.move_past_bottom raise RollbackTransaction end success = transaction { yield } @bounding_box = old_bounding_box unless success raise Prawn::Errors::CannotGroup if second_attempt old_bounding_box.move_past_bottom group(second_attempt=true) { yield } end success end # Places a text box on specified pages for page numbering. This should be called # towards the end of document creation, after all your content is already in # place. In your template string, refers to the current page, and # refers to the total amount of pages in the document. Page numbering should # occur at the end of your Prawn::Document.generate block because the method iterates # through existing pages after they are created. # # Parameters are: # # string:: Template string for page number wording. # Should include '' and, optionally, ''. # options:: A hash for page numbering and text box options. # :page_filter:: A filter to specify which pages to place page numbers on. # Refer to the method 'page_match?' # :start_count_at:: The starting count to increment pages from. # :total_pages:: If provided, will replace with the value given. # Useful to override the total number of pages when using # the start_count_at option. # :color:: Text fill color. # # Please refer to Prawn::Text::text_box for additional options concerning text # formatting and placement. # # Example: Print page numbers on every page except for the first. Start counting from # five. # # Prawn::Document.generate("page_with_numbering.pdf") do # number_pages " in a total of ", # {:start_count_at => 5, # :page_filter => lambda{ |pg| pg != 1 }, # :at => [bounds.right - 50, 0], # :align => :right, # :size => 14} # end # def number_pages(string, options={}) opts = options.dup start_count_at = opts.delete(:start_count_at).to_i page_filter = if opts.has_key?(:page_filter) opts.delete(:page_filter) else :all end total_pages = opts.delete(:total_pages) txtcolor = opts.delete(:color) # An explicit height so that we can draw page numbers in the margins opts[:height] = 50 unless opts.has_key?(:height) start_count = false pseudopage = 0 (1..page_count).each do |p| unless start_count pseudopage = case start_count_at when 0 1 else start_count_at.to_i end end if page_match?(page_filter, p) go_to_page(p) # have to use fill_color here otherwise text reverts back to default fill color fill_color txtcolor unless txtcolor.nil? total_pages = total_pages.nil? ? page_count : total_pages str = string.gsub("","#{pseudopage}").gsub("","#{total_pages}") text_box str, opts start_count = true # increment page count as soon as first match found end pseudopage += 1 if start_count end end # Provides a way to execute a block of code repeatedly based on a # page_filter. # # Available page filters are: # :all repeats on every page # :odd repeats on odd pages # :even repeats on even pages # some_array repeats on every page listed in the array # some_range repeats on every page included in the range # some_lambda yields page number and repeats for true return values def page_match?(page_filter, page_number) case page_filter when :all true when :odd page_number % 2 == 1 when :even page_number % 2 == 0 when Range, Array page_filter.include?(page_number) when Proc page_filter.call(page_number) end end # Returns true if content streams will be compressed before rendering, # false otherwise # def compression_enabled? !!state.compress end private def merge_template_options(page_options, options) object_id = state.store.import_page(options[:template], options[:template_page] || 1) page_options.merge!(:object_id => object_id, :page_template => true) end # setting override_settings to true ensures that a new graphic state does not end up using # previous settings especially from imported template streams def use_graphic_settings(override_settings = false) set_fill_color if current_fill_color != "000000" || override_settings set_stroke_color if current_stroke_color != "000000" || override_settings write_line_width if line_width != 1 || override_settings write_stroke_cap_style if cap_style != :butt || override_settings write_stroke_join_style if join_style != :miter || override_settings write_stroke_dash if dashed? || override_settings end def generate_margin_box old_margin_box = @margin_box page = state.page @margin_box = BoundingBox.new( self, nil, # margin box has no parent [ page.margins[:left], page.dimensions[-1] - page.margins[:top] ] , :width => page.dimensions[-2] - (page.margins[:left] + page.margins[:right]), :height => page.dimensions[-1] - (page.margins[:top] + page.margins[:bottom]) ) # This check maintains indentation settings across page breaks if old_margin_box @margin_box.add_left_padding(old_margin_box.total_left_padding) @margin_box.add_right_padding(old_margin_box.total_right_padding) end # we must update bounding box if not flowing from the previous page # # FIXME: This may have a bug where the old margin is restored # when the bounding box exits. @bounding_box = @margin_box if old_margin_box == @bounding_box end def apply_margin_options(options) if options[:margin] # Treat :margin as CSS shorthand with 1-4 values. margin = Array(options[:margin]) positions = { 4 => [0,1,2,3], 3 => [0,1,2,1], 2 => [0,1,0,1], 1 => [0,0,0,0] }[margin.length] [:top, :right, :bottom, :left].zip(positions).each do |p,i| options[:"#{p}_margin"] ||= margin[i] end end [:left,:right,:top,:bottom].each do |side| if margin = options[:"#{side}_margin"] state.page.margins[side] = margin end end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/core.rb0000644000000000000000000000446412114176157017247 0ustar rootroot# encoding: utf-8 # Prawn : A library for PDF generation in Ruby # # Copyright April 2008, Gregory Brown. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. require "set" %w[ttfunk/lib].each do |dep| $LOAD_PATH.unshift(File.dirname(__FILE__) + "/../../vendor/#{dep}") end begin require 'ttfunk' rescue LoadError puts "Failed to load ttfunk. If you are running Prawn from git:" puts " git submodule init" puts " git submodule update" exit end module Prawn extend self file = __FILE__ file = File.readlink(file) if File.symlink?(file) dir = File.dirname(file) # The base source directory for Prawn as installed on the system # # BASEDIR = File.expand_path(File.join(dir, '..','..')) DATADIR = File.expand_path(File.join(dir, '..', '..', 'data')) # Whe set to true, Prawn will verify hash options to ensure only valid keys # are used. Off by default. # # Example: # >> Prawn::Document.new(:tomato => "Juicy") # Prawn::Errors::UnknownOption: # Detected unknown option(s): [:tomato] # Accepted options are: [:page_size, :page_layout, :left_margin, ...] # attr_accessor :debug def verify_options(accepted, actual) #:nodoc: return unless debug || $DEBUG unless (act=Set[*actual.keys]).subset?(acc=Set[*accepted]) raise Prawn::Errors::UnknownOption, "\nDetected unknown option(s): #{(act - acc).to_a.inspect}\n" << "Accepted options are: #{accepted.inspect}" end yield if block_given? end module Configurable #:nodoc: def configuration(*args) @config ||= Marshal.load(Marshal.dump(default_configuration)) if Hash === args[0] @config.update(args[0]) elsif args.length > 1 @config.values_at(*args) elsif args.length == 1 @config[args[0]] else @config end end alias_method :C, :configuration end end require "prawn/compatibility" require "prawn/errors" require "prawn/core/pdf_object" require "prawn/core/reference" require "prawn/core/page" require "prawn/core/object_store" require "prawn/core/document_state" require "prawn/core/literal_string" require "prawn/core/byte_string" require "prawn/core/name_tree" require "prawn/core/annotations" require "prawn/core/destinations" ruby-prawn-1.0.0~rc2.orig/lib/prawn/soft_mask.rb0000644000000000000000000000425012114176157020276 0ustar rootroot# encoding: utf-8 # # soft_mask.rb : Implements soft-masking # # Copyright September 2012, Alexander Mankuta. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. # module Prawn # The Prawn::SoftMask module is used to create arbitrary transparency in # document. Using a soft mask allows creaing more visually rich documents. # # You must group soft mask and graphics it's applied to under # save_graphics_state because soft mask is a part of graphic state in PDF. # # Example: # pdf.save_graphics_state do # pdf.soft_mask do # pdf.fill_color "444444" # pdf.fill_polygon [0, 40], [60, 10], [120, 40], [60, 68] # end # pdf.fill_color '000000' # pdf.fill_rectangle [0, 50], 120, 68 # end # module SoftMask def soft_mask(&block) min_version(1.4) group_attrs = ref!({ :Type => :Group, :S => :Transparency, :CS => :DeviceRGB, :I => false, :K => false }) group = ref!({ :Type => :XObject, :Subtype => :Form, :BBox => state.page.dimensions, :Group => group_attrs, }) state.page.stamp_stream(group, &block) mask = ref!({ :Type => :Mask, :S => :Luminosity, :G => group }) g_state = ref!({ :Type => :ExtGState, :SMask => mask, :AIS => false, :BM => :Normal, :OP => false, :op => false, :OPM => 1, :SA => true, }) registry_key = { :bbox => state.page.dimensions, :mask => group.stream, :page => state.page_count, }.hash if soft_mask_registry[registry_key] [g_state, mask, group, group_attrs].each { |ref| ref.live = false } add_content "/#{soft_mask_registry[registry_key]} gs" else masks = page.resources[:ExtGState] ||= {} id = masks.empty? ? 'GS1' : masks.keys.sort.last.succ masks[id] = g_state soft_mask_registry[registry_key] = id add_content "/#{id} gs" end end private def soft_mask_registry @soft_mask_registry ||= {} end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/measurement_extensions.rb0000644000000000000000000000130712114176157023114 0ustar rootroot# encoding: utf-8 # measurement_extensions.rb: Core extensions for Prawn::Measurements # # Copyright December 2008, Florian Witteler. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. require 'prawn/measurements' class Numeric include Prawn::Measurements # prawns' basic unit is PostScript-Point # 72 points per inch def mm return mm2pt(self) end def cm return cm2pt(self) end def dm return dm2pt(self) end def m return m2pt(self) end def in return in2pt(self) end def yd return yd2pt(self) end def ft return ft2pt(self) end def pt return self end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/table/0000755000000000000000000000000012114176157017051 5ustar rootrootruby-prawn-1.0.0~rc2.orig/lib/prawn/table/cells.rb0000644000000000000000000002014612114176157020503 0ustar rootroot# encoding: utf-8 # cells.rb: Methods for accessing rows, columns, and cells of a Prawn::Table. # # Copyright December 2009, Brad Ediger. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. module Prawn class Table # Selects the given rows (0-based) for styling. Returns a Cells object -- # see the documentation on Cells for things you can do with cells. # def rows(row_spec) cells.rows(row_spec) end alias_method :row, :rows # Selects the given columns (0-based) for styling. Returns a Cells object # -- see the documentation on Cells for things you can do with cells. # def columns(col_spec) cells.columns(col_spec) end alias_method :column, :columns # Represents a selection of cells to be styled. Operations on a CellProxy # can be chained, and cell properties can be set one-for-all on the proxy. # # To set vertical borders only: # # table.cells.borders = [:left, :right] # # To highlight a rectangular area of the table: # # table.rows(1..3).columns(2..4).background_color = 'ff0000' # class Cells < Array # Limits selection to the given row or rows. +row_spec+ can be anything # that responds to the === operator selecting a set of 0-based row # numbers; most commonly a number or a range. # # table.row(0) # selects first row # table.rows(3..4) # selects rows four and five # def rows(row_spec) index_cells unless @indexed row_spec = transform_spec(row_spec, @first_row, @row_count) Cells.new(@rows[row_spec] ||= select { |c| row_spec.respond_to?(:include?) ? row_spec.include?(c.row) : row_spec === c.row }) end alias_method :row, :rows # Returns the number of rows in the list. # def row_count index_cells unless @indexed @row_count end # Limits selection to the given column or columns. +col_spec+ can be # anything that responds to the === operator selecting a set of 0-based # column numbers; most commonly a number or a range. # # table.column(0) # selects first column # table.columns(3..4) # selects columns four and five # def columns(col_spec) index_cells unless @indexed col_spec = transform_spec(col_spec, @first_column, @column_count) Cells.new(@columns[col_spec] ||= select { |c| col_spec.respond_to?(:include?) ? col_spec.include?(c.column) : col_spec === c.column }) end alias_method :column, :columns # Returns the number of columns in the list. # def column_count index_cells unless @indexed @column_count end # Allows you to filter the given cells by arbitrary properties. # # table.column(4).filter { |cell| cell.content =~ /Yes/ }. # background_color = '00ff00' # def filter(&block) Cells.new(select(&block)) end # Retrieves a cell based on its 0-based row and column. Returns an # individual Cell, not a Cells collection. # # table.cells[0, 0].content # => "First cell content" # def [](row, col) return nil if empty? index_cells unless @indexed row_array, col_array = @rows[@first_row + row] || [], @columns[@first_column + col] || [] if row_array.length < col_array.length row_array.find { |c| c.column == @first_column + col } else col_array.find { |c| c.row == @first_row + row } end end # Puts a cell in the collection at the given position. Internal use only. # def []=(row, col, cell) # :nodoc: cell.extend(Cell::InTable) cell.row = row cell.column = col if @indexed (@rows[row] ||= []) << cell (@columns[col] ||= []) << cell @first_row = row if !@first_row || row < @first_row @first_column = col if !@first_column || col < @first_column @row_count = @rows.size @column_count = @columns.size end self << cell end # Supports setting multiple properties at once. # # table.cells.style(:padding => 0, :border_width => 2) # # is the same as: # # table.cells.padding = 0 # table.cells.border_width = 2 # # You can also pass a block, which will be called for each cell in turn. # This allows you to set more complicated properties: # # table.cells.style { |cell| cell.border_width += 12 } # def style(options={}, &block) each do |cell| next if cell.is_a?(Cell::SpanDummy) cell.style(options, &block) end end # Returns the total width of all columns in the selected set. # def width widths = {} each do |cell| index = cell.column per_cell_width = cell.width_ignoring_span.to_f / cell.colspan cell.colspan.times do |n| widths[cell.column+n] = [widths[cell.column+n], per_cell_width]. compact.max end end widths.values.inject(0, &:+) end # Returns minimum width required to contain cells in the set. # def min_width aggregate_cell_values(:column, :avg_spanned_min_width, :max) end # Returns maximum width that can contain cells in the set. # def max_width aggregate_cell_values(:column, :max_width_ignoring_span, :min) end # Returns the total height of all rows in the selected set. # def height aggregate_cell_values(:row, :height_ignoring_span, :max) end # Supports setting arbitrary properties on a group of cells. # # table.cells.row(3..6).background_color = 'cc0000' # def method_missing(id, *args, &block) if id.to_s =~ /=\z/ each { |c| c.send(id, *args, &block) if c.respond_to?(id) } else super end end protected # Defers indexing until rows() or columns() is actually called on the # Cells object. Without this, we would needlessly index the leaf nodes of # the object graph, the ones that are only there to be iterated over. # # Make sure to call this before using @rows or @columns. # def index_cells @rows = {} @columns = {} each do |cell| @rows[cell.row] ||= [] @rows[cell.row] << cell @columns[cell.column] ||= [] @columns[cell.column] << cell end @first_row = @rows.keys.min @first_column = @columns.keys.min @row_count = @rows.size @column_count = @columns.size @indexed = true end # Sum up a min/max value over rows or columns in the cells selected. # Takes the min/max (per +aggregate+) of the result of sending +meth+ to # each cell, grouped by +row_or_column+. # def aggregate_cell_values(row_or_column, meth, aggregate) values = {} each do |cell| index = cell.send(row_or_column) values[index] = [values[index], cell.send(meth)].compact.send(aggregate) end values.values.inject(0, &:+) end # Transforms +spec+, a column / row specification, into an object that # can be compared against a row or column number using ===. Normalizes # negative indices to be positive, given a total size of +total+. The # first row/column is indicated by +first+; this value is considered row # or column 0. # def transform_spec(spec, first, total) case spec when Range transform_spec(spec.begin, first, total) .. transform_spec(spec.end, first, total) when Integer spec < 0 ? (first + total + spec) : first + spec when Enumerable spec.map { |x| first + x } else # pass through raise "Don't understand spec #{spec.inspect}" end end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/table/cell/0000755000000000000000000000000012114176157017770 5ustar rootrootruby-prawn-1.0.0~rc2.orig/lib/prawn/table/cell/span_dummy.rb0000644000000000000000000000416212114176157022474 0ustar rootroot# encoding: utf-8 # span_dummy.rb: Placeholder for non-master spanned cells. # # Copyright December 2011, Brad Ediger. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. module Prawn class Table class Cell # A Cell object used to represent all but the topmost cell in a span # group. # class SpanDummy < Cell def initialize(pdf, master_cell) super(pdf, [0, pdf.cursor]) @master_cell = master_cell @padding = [0, 0, 0, 0] end # By default, a span dummy will never increase the height demand. # def natural_content_height 0 end # By default, a span dummy will never increase the width demand. # def natural_content_width 0 end def avg_spanned_min_width @master_cell.avg_spanned_min_width end # Dummy cells have nothing to draw. # def draw_borders(pt) end # Dummy cells have nothing to draw. # def draw_bounded_content(pt) end def padding_right=(val) @master_cell.padding_right = val if rightmost? end def padding_bottom=(val) @master_cell.padding_bottom = val if bottommost? end def border_right_color=(val) @master_cell.border_right_color = val if rightmost? end def border_bottom_color=(val) @master_cell.border_bottom_color = val if bottommost? end def border_right_width=(val) @master_cell.border_right_width = val if rightmost? end def border_bottom_width=(val) @master_cell.border_bottom_width = val if bottommost? end private # Are we on the right border of the span? # def rightmost? @column == @master_cell.column + @master_cell.colspan - 1 end # Are we on the bottom border of the span? # def bottommost? @row == @master_cell.row + @master_cell.rowspan - 1 end end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/table/cell/image.rb0000644000000000000000000000265112114176157021403 0ustar rootroot# encoding: utf-8 # image.rb: Table image cells. # # Copyright September 2010, Brad Ediger. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. module Prawn class Table class Cell # A Cell that contains another table. # class Image < Cell def initialize(pdf, point, options={}) @image_options = {} super @pdf_object, @image_info = @pdf.build_image_object(@file) @natural_width, @natural_height = @image_info.calc_image_dimensions( @image_options) end def image=(file) @file = file end def scale=(s) @image_options[:scale] = s end def fit=(f) @image_options[:fit] = f end def image_height=(h) @image_options[:height] = h end def image_width=(w) @image_options[:width] = w end def position=(p) @image_options[:position] = p end def vposition=(vp) @image_options[:vposition] = vp end def natural_content_width @natural_width end def natural_content_height @natural_height end # Draw the image on the page. # def draw_content @pdf.embed_image(@pdf_object, @image_info, @image_options) end end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/table/cell/in_table.rb0000644000000000000000000000077212114176157022100 0ustar rootroot# encoding: utf-8 # Accessors for using a Cell inside a Table. module Prawn class Table class Cell # This module extends Cell objects when they are used in a table (as # opposed to standalone). Its properties apply to cells-in-tables but not # cells themselves. # module InTable # Row number (0-based). # attr_accessor :row # Column number (0-based). # attr_accessor :column end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/table/cell/text.rb0000644000000000000000000001127612114176157021310 0ustar rootroot# encoding: utf-8 # text.rb: Text table cells. # # Copyright December 2009, Gregory Brown and Brad Ediger. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. module Prawn class Table class Cell # A Cell that contains text. Has some limited options to set font family, # size, and style. # class Text < Cell TextOptions = [:inline_format, :kerning, :size, :align, :valign, :rotate, :rotate_around, :leading, :single_line, :skip_encoding, :overflow, :min_font_size] TextOptions.each do |option| define_method("#{option}=") { |v| @text_options[option] = v } define_method(option) { @text_options[option] } end attr_writer :font, :text_color def initialize(pdf, point, options={}) @text_options = {} super end # Returns the font that will be used to draw this cell. # def font with_font { @pdf.font } end # Sets the style of the font in use. Equivalent to the Text::Box # +style+ option, but we already have a style method. # def font_style=(style) @text_options[:style] = style end # Returns the width of this text with no wrapping. This will be far off # from the final width if the text is long. # def natural_content_width @natural_content_width ||= [styled_width_of(@content), @pdf.bounds.width].min end # Returns the natural height of this block of text, wrapped to the # preset width. # def natural_content_height with_font do b = text_box(:width => spanned_content_width + FPTolerance) b.render(:dry_run => true) b.height + b.line_gap end end # Draws the text content into its bounding box. # def draw_content with_font do @pdf.move_down((@pdf.font.line_gap + @pdf.font.descender)/2) with_text_color do text_box(:width => spanned_content_width + FPTolerance, :height => spanned_content_height + FPTolerance, :at => [0, @pdf.cursor]).render end end end def set_width_constraints # Sets a reasonable minimum width. If the cell has any content, make # sure we have enough width to be at least one character wide. This is # a bit of a hack, but it should work well enough. unless @min_width min_content_width = [natural_content_width, styled_width_of_single_character].min @min_width = padding_left + padding_right + min_content_width super end end protected def with_font @pdf.save_font do options = {} options[:style] = @text_options[:style] if @text_options[:style] @pdf.font(@font || @pdf.font.name, options) yield end end def with_text_color if @text_color begin old_color = @pdf.fill_color || '000000' @pdf.fill_color(@text_color) yield ensure @pdf.fill_color(old_color) end else yield end end def text_box(extra_options={}) if @text_options[:inline_format] options = @text_options.dup options.delete(:inline_format) options.merge!(extra_options) options[:document] = @pdf array = ::Prawn::Text::Formatted::Parser.to_array(@content) ::Prawn::Text::Formatted::Box.new(array, options) else ::Prawn::Text::Box.new(@content, @text_options.merge(extra_options). merge(:document => @pdf)) end end # Returns the width of +text+ under the given text options. # def styled_width_of(text) @pdf.width_of(text, @text_options) end private # Returns the greatest possible width of any single character # under the given text options. # (We use this to determine the minimum width of a table cell) # (Although we currently determine this by measuring "M", it should really # use whichever character is widest under the current font) # def styled_width_of_single_character key = (@text_options[:style] == :bold) ? :bold_char_width : :plain_char_width cache = Thread.current[key] ||= {} cache[@pdf.font] ||= styled_width_of("M") end end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/table/cell/subtable.rb0000644000000000000000000000241412114176157022117 0ustar rootroot# encoding: utf-8 # subtable.rb: Yo dawg. # # Copyright January 2010, Brad Ediger. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. module Prawn class Table class Cell # A Cell that contains another table. # class Subtable < Cell attr_reader :subtable def initialize(pdf, point, options={}) super @subtable = options[:content] # Subtable padding defaults to zero @padding = [0, 0, 0, 0] end # Sets the text color of the entire subtable. # def text_color=(color) @subtable.cells.text_color = color end # Proxied to subtable. # def natural_content_width @subtable.cells.width end # Proxied to subtable. # def min_width @subtable.cells.min_width end # Proxied to subtable. # def max_width @subtable.cells.max_width end # Proxied to subtable. # def natural_content_height @subtable.cells.height end # Draws the subtable. # def draw_content @subtable.draw end end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/table/cell.rb0000644000000000000000000005615712114176157020333 0ustar rootroot# encoding: utf-8 # cell.rb: Table cell drawing. # # Copyright December 2009, Gregory Brown and Brad Ediger. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. require 'date' module Prawn class Document # Instantiates and draws a cell on the document. # # cell(:content => "Hello world!", :at => [12, 34]) # # See Prawn::Table::Cell.make for full options. # def cell(options={}) cell = Table::Cell.make(self, options.delete(:content), options) cell.draw cell end # Set up, but do not draw, a cell. Useful for creating cells with # formatting options to be inserted into a Table. Call +draw+ on the # resulting Cell to ink it. # # See the documentation on Prawn::Cell for details on the arguments. # def make_cell(content, options={}) Prawn::Table::Cell.make(self, content, options) end end class Table # A Cell is a rectangular area of the page into which content is drawn. It # has a framework for sizing itself and adding padding and simple styling. # There are several standard Cell subclasses that handle things like text, # Tables, and (in the future) stamps, images, and arbitrary content. # # Cells are a basic building block for table support (see Prawn::Table). # # Please subclass me if you want new content types! I'm designed to be very # extensible. See the different standard Cell subclasses in # lib/prawn/table/cell/*.rb for a template. # class Cell # Amount of dead space (in PDF points) inside the borders but outside the # content. Padding defaults to 5pt. # attr_reader :padding # If provided, the minimum width that this cell in its column will permit. # def min_width_ignoring_span set_width_constraints @min_width end # Minimum width of the entire span group this cell controls. # def min_width return min_width_ignoring_span if @colspan == 1 # Sum up the largest min-width from each column, including myself. min_widths = Hash.new(0) dummy_cells.each do |cell| min_widths[cell.column] = [min_widths[cell.column], cell.min_width].max end min_widths[column] = [min_widths[column], min_width_ignoring_span].max min_widths.values.inject(0, &:+) end # Min-width of the span divided by the number of columns. # def avg_spanned_min_width min_width.to_f / colspan end # If provided, the maximum width that this cell can be drawn in, within # its column. # def max_width_ignoring_span set_width_constraints @max_width end # Maximum width of the entire span group this cell controls. # def max_width return max_width_ignoring_span if @colspan == 1 # Sum the smallest max-width from each column in the group, including # myself. max_widths = Hash.new(0) dummy_cells.each do |cell| max_widths[cell.column] = [max_widths[cell.column], cell.max_width].min end max_widths[column] = [max_widths[column], max_width_ignoring_span].min max_widths.values.inject(0, &:+) end # Manually specify the cell's height. # attr_writer :height # Specifies which borders to enable. Must be an array of zero or more of: # [:left, :right, :top, :bottom]. # attr_accessor :borders # Width, in PDF points, of the cell's borders: [top, right, bottom, left]. # attr_reader :border_widths # HTML RGB-format ("ccffff") border colors: [top, right, bottom, left]. # attr_reader :border_colors # Line style # attr_reader :border_lines # Specifies the content for the cell. Must be a "cellable" object. See the # "Data" section of the Prawn::Table documentation for details on cellable # objects. # attr_accessor :content # The background color, if any, for this cell. Specified in HTML RGB # format, e.g., "ccffff". The background is drawn under the whole cell, # including any padding. # attr_accessor :background_color # Number of columns this cell spans. Defaults to 1. # attr_reader :colspan # Number of rows this cell spans. Defaults to 1. # attr_reader :rowspan # Array of SpanDummy cells (if any) that represent the other cells in # this span group. They know their own width / height, but do not draw # anything. # attr_reader :dummy_cells # :nodoc: # Instantiates a Cell based on the given options. The particular class of # cell returned depends on the :content argument. See the Prawn::Table # documentation under "Data" for allowable content types. # def self.make(pdf, content, options={}) at = options.delete(:at) || [0, pdf.cursor] content = content.to_s if content.nil? || content.kind_of?(Numeric) || content.kind_of?(Date) if content.is_a?(Hash) if img = content[:image] return Cell::Image.new(pdf, at, content) end options.update(content) content = options[:content] else options[:content] = content end options[:content] = content = "" if content.nil? case content when Prawn::Table::Cell content when String Cell::Text.new(pdf, at, options) when Prawn::Table Cell::Subtable.new(pdf, at, options) when Array subtable = Prawn::Table.new(options[:content], pdf, {}) Cell::Subtable.new(pdf, at, options.merge(:content => subtable)) else raise Errors::UnrecognizedTableContent end end # A small amount added to the bounding box width to cover over floating- # point errors when round-tripping from content_width to width and back. # This does not change cell positioning; it only slightly expands each # cell's bounding box width so that rounding error does not prevent a cell # from rendering. # FPTolerance = 1 # Sets up a cell on the document +pdf+, at the given x/y location +point+, # with the given +options+. Cell, like Table, follows the "options set # accessors" paradigm (see "Options" under the Table documentation), so # any cell accessor cell.foo = :bar can be set by providing the # option :foo => :bar here. # def initialize(pdf, point, options={}) @pdf = pdf @point = point # Set defaults; these can be changed by options @padding = [5, 5, 5, 5] @borders = [:top, :bottom, :left, :right] @border_widths = [1] * 4 @border_colors = ['000000'] * 4 @border_lines = [:solid] * 4 @colspan = 1 @rowspan = 1 @dummy_cells = [] options.each { |k, v| send("#{k}=", v) } @initializer_run = true end # Supports setting multiple properties at once. # # cell.style(:padding => 0, :border_width => 2) # # is the same as: # # cell.padding = 0 # cell.border_width = 2 # def style(options={}, &block) options.each { |k, v| send("#{k}=", v) } # The block form supports running a single block for multiple cells, as # in Cells#style. block.call(self) if block end # Returns the width of the cell in its first column alone, ignoring any # colspans. # def width_ignoring_span # We can't ||= here because the FP error accumulates on the round-trip # from #content_width. @width || (content_width + padding_left + padding_right) end # Returns the cell's width in points, inclusive of padding. If the cell is # the master cell of a colspan, returns the width of the entire span # group. # def width return width_ignoring_span if @colspan == 1 && @rowspan == 1 # We're in a span group; get the maximum width per column (including # the master cell) and sum each column. column_widths = Hash.new(0) dummy_cells.each do |cell| column_widths[cell.column] = [column_widths[cell.column], cell.width].max end column_widths[column] = [column_widths[column], width_ignoring_span].max column_widths.values.inject(0, &:+) end # Manually sets the cell's width, inclusive of padding. # def width=(w) @width = @min_width = @max_width = w end # Returns the width of the bare content in the cell, excluding padding. # def content_width if @width # manually set return @width - padding_left - padding_right end natural_content_width end # Width of the entire span group. # def spanned_content_width width - padding_left - padding_right end # Returns the width this cell would naturally take on, absent other # constraints. Must be implemented in subclasses. # def natural_content_width raise NotImplementedError, "subclasses must implement natural_content_width" end # Returns the cell's height in points, inclusive of padding, in its first # row only. # def height_ignoring_span # We can't ||= here because the FP error accumulates on the round-trip # from #content_height. @height || (content_height + padding_top + padding_bottom) end # Returns the cell's height in points, inclusive of padding. If the cell # is the master cell of a rowspan, returns the width of the entire span # group. # def height return height_ignoring_span if @colspan == 1 && @rowspan == 1 # We're in a span group; get the maximum height per row (including the # master cell) and sum each row. row_heights = Hash.new(0) dummy_cells.each do |cell| row_heights[cell.row] = [row_heights[cell.row], cell.height].max end row_heights[row] = [row_heights[row], height_ignoring_span].max row_heights.values.inject(0, &:+) end # Returns the height of the bare content in the cell, excluding padding. # def content_height if @height # manually set return @height - padding_top - padding_bottom end natural_content_height end # Height of the entire span group. # def spanned_content_height height - padding_top - padding_bottom end # Returns the height this cell would naturally take on, absent # constraints. Must be implemented in subclasses. # def natural_content_height raise NotImplementedError, "subclasses must implement natural_content_height" end # Indicates the number of columns that this cell is to span. Defaults to # 1. # # This must be provided as part of the table data, like so: # # pdf.table([["foo", {:content => "bar", :colspan => 2}]]) # # Setting colspan from the initializer block is invalid because layout # has already run. For example, this will NOT work: # # pdf.table([["foo", "bar"]]) { cells[0, 1].colspan = 2 } # def colspan=(span) if @initializer_run raise Prawn::Errors::InvalidTableSpan, "colspan must be provided in the table's structure, never in the " + "initialization block. See Prawn's documentation for details." end @colspan = span end # Indicates the number of rows that this cell is to span. Defaults to 1. # # This must be provided as part of the table data, like so: # # pdf.table([["foo", {:content => "bar", :rowspan => 2}], ["baz"]]) # # Setting rowspan from the initializer block is invalid because layout # has already run. For example, this will NOT work: # # pdf.table([["foo", "bar"], ["baz"]]) { cells[0, 1].rowspan = 2 } # def rowspan=(span) if @initializer_run raise Prawn::Errors::InvalidTableSpan, "rowspan must be provided in the table's structure, never in the " + "initialization block. See Prawn's documentation for details." end @rowspan = span end # Draws the cell onto the document. Pass in a point [x,y] to override the # location at which the cell is drawn. # # If drawing a group of cells at known positions, look into # Cell.draw_cells, which ensures that the backgrounds, borders, and # content are all drawn in correct order so as not to overlap. # def draw(pt=[x, y]) Prawn::Table::Cell.draw_cells([[self, pt]]) end # Given an array of pairs [cell, pt], draws each cell at its # corresponding pt, making sure all backgrounds are behind all borders # and content. # def self.draw_cells(cells) cells.each do |cell, pt| cell.set_width_constraints cell.draw_background(pt) end cells.each do |cell, pt| cell.draw_borders(pt) cell.draw_bounded_content(pt) end end # Draws the cell's content at the point provided. # def draw_bounded_content(pt) @pdf.float do @pdf.bounding_box([pt[0] + padding_left, pt[1] - padding_top], :width => spanned_content_width + FPTolerance, :height => spanned_content_height + FPTolerance) do draw_content end end end # x-position of the cell within the parent bounds. # def x @point[0] end # Set the x-position of the cell within the parent bounds. # def x=(val) @point[0] = val end # y-position of the cell within the parent bounds. # def y @point[1] end # Set the y-position of the cell within the parent bounds. # def y=(val) @point[1] = val end # Sets padding on this cell. The argument can be one of: # # * an integer (sets all padding) # * a two-element array [vertical, horizontal] # * a three-element array [top, horizontal, bottom] # * a four-element array [top, right, bottom, left] # def padding=(pad) @padding = case when pad.nil? [0, 0, 0, 0] when Numeric === pad # all padding [pad, pad, pad, pad] when pad.length == 2 # vert, horiz [pad[0], pad[1], pad[0], pad[1]] when pad.length == 3 # top, horiz, bottom [pad[0], pad[1], pad[2], pad[1]] when pad.length == 4 # top, right, bottom, left [pad[0], pad[1], pad[2], pad[3]] else raise ArgumentError, ":padding must be a number or an array [v,h] " + "or [t,r,b,l]" end end def padding_top @padding[0] end def padding_top=(val) @padding[0] = val end def padding_right @padding[1] end def padding_right=(val) @padding[1] = val end def padding_bottom @padding[2] end def padding_bottom=(val) @padding[2] = val end def padding_left @padding[3] end def padding_left=(val) @padding[3] = val end # Sets border colors on this cell. The argument can be one of: # # * an integer (sets all colors) # * a two-element array [vertical, horizontal] # * a three-element array [top, horizontal, bottom] # * a four-element array [top, right, bottom, left] # def border_color=(color) @border_colors = case when color.nil? ["000000"] * 4 when String === color # all colors [color, color, color, color] when color.length == 2 # vert, horiz [color[0], color[1], color[0], color[1]] when color.length == 3 # top, horiz, bottom [color[0], color[1], color[2], color[1]] when color.length == 4 # top, right, bottom, left [color[0], color[1], color[2], color[3]] else raise ArgumentError, ":border_color must be a string " + "or an array [v,h] or [t,r,b,l]" end end alias_method :border_colors=, :border_color= def border_top_color @border_colors[0] end def border_top_color=(val) @border_colors[0] = val end def border_top_color @border_colors[0] end def border_top_color=(val) @border_colors[0] = val end def border_right_color @border_colors[1] end def border_right_color=(val) @border_colors[1] = val end def border_bottom_color @border_colors[2] end def border_bottom_color=(val) @border_colors[2] = val end def border_left_color @border_colors[3] end def border_left_color=(val) @border_colors[3] = val end # Sets border widths on this cell. The argument can be one of: # # * an integer (sets all widths) # * a two-element array [vertical, horizontal] # * a three-element array [top, horizontal, bottom] # * a four-element array [top, right, bottom, left] # def border_width=(width) @border_widths = case when width.nil? ["000000"] * 4 when Numeric === width # all widths [width, width, width, width] when width.length == 2 # vert, horiz [width[0], width[1], width[0], width[1]] when width.length == 3 # top, horiz, bottom [width[0], width[1], width[2], width[1]] when width.length == 4 # top, right, bottom, left [width[0], width[1], width[2], width[3]] else raise ArgumentError, ":border_width must be a string " + "or an array [v,h] or [t,r,b,l]" end end alias_method :border_widths=, :border_width= def border_top_width @borders.include?(:top) ? @border_widths[0] : 0 end def border_top_width=(val) @border_widths[0] = val end def border_right_width @borders.include?(:right) ? @border_widths[1] : 0 end def border_right_width=(val) @border_widths[1] = val end def border_bottom_width @borders.include?(:bottom) ? @border_widths[2] : 0 end def border_bottom_width=(val) @border_widths[2] = val end def border_left_width @borders.include?(:left) ? @border_widths[3] : 0 end def border_left_width=(val) @border_widths[3] = val end # Sets the cell's minimum and maximum width. Deferred until requested # because padding and size can change. # def set_width_constraints @min_width ||= padding_left + padding_right @max_width ||= @pdf.bounds.width end # Sets border line style on this cell. The argument can be one of: # # Possible values are: :solid, :dashed, :dotted # # * one value (sets all lines) # * a two-element array [vertical, horizontal] # * a three-element array [top, horizontal, bottom] # * a four-element array [top, right, bottom, left] # def border_line=(line) @border_lines = case when line.nil? [:solid] * 4 when line.length == 1 # all lines [line[0]] * 4 when line.length == 2 [line[0], line[1], line[0], line[1]] when line.length == 3 [line[0], line[1], line[2], line[1]] when line.length == 4 [line[0], line[1], line[2], line[3]] else raise ArgumentError, "border_line must be one of :solid, :dashed, " ":dotted or an array [v,h] or [t,r,b,l]" end end alias_method :border_lines=, :border_line= def border_top_line @borders.include?(:top) ? @border_lines[0] : 0 end def border_top_line=(val) @border_lines[0] = val end def border_right_line @borders.include?(:right) ? @border_lines[1] : 0 end def border_right_line=(val) @border_lines[1] = val end def border_bottom_line @borders.include?(:bottom) ? @border_lines[2] : 0 end def border_bottom_line=(val) @border_lines[2] = val end def border_left_line @borders.include?(:left) ? @border_lines[3] : 0 end def border_left_line=(val) @border_lines[3] = val end # Draws the cell's background color. # def draw_background(pt) if @background_color @pdf.mask(:fill_color) do @pdf.fill_color @background_color @pdf.fill_rectangle pt, width, height end end end # Draws borders around the cell. Borders are centered on the bounds of # the cell outside of any padding, so the caller is responsible for # setting appropriate padding to ensure the border does not overlap with # cell content. # def draw_borders(pt) x, y = pt @pdf.mask(:line_width, :stroke_color) do @borders.each do |border| idx = {:top => 0, :right => 1, :bottom => 2, :left => 3}[border] border_color = @border_colors[idx] border_width = @border_widths[idx] border_line = @border_lines[idx] next if border_width <= 0 # Left and right borders are drawn one-half border beyond the center # of the corner, so that the corners end up square. from, to = case border when :top [[x, y], [x+width, y]] when :bottom [[x, y-height], [x+width, y-height]] when :left [[x, y + (border_top_width / 2.0)], [x, y - height - (border_bottom_width / 2.0)]] when :right [[x+width, y + (border_top_width / 2.0)], [x+width, y - height - (border_bottom_width / 2.0)]] end case border_line when :dashed @pdf.dash border_width * 4 when :dotted @pdf.dash border_width, :space => border_width * 2 when :solid # normal line style else raise ArgumentError, "border_line must be :solid, :dotted or" + " :dashed" end @pdf.line_width = border_width @pdf.stroke_color = border_color @pdf.stroke_line(from, to) @pdf.undash end end end # Draws cell content within the cell's bounding box. Must be implemented # in subclasses. # def draw_content raise NotImplementedError, "subclasses must implement draw_content" end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/images/0000755000000000000000000000000012114176157017227 5ustar rootrootruby-prawn-1.0.0~rc2.orig/lib/prawn/images/png.rb0000644000000000000000000002764612114176157020357 0ustar rootroot# encoding: ASCII-8BIT # png.rb : Extracts the data from a PNG that is needed for embedding # # Based on some similar code in PDF::Writer by Austin Ziegler # # Copyright April 2008, James Healy. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. require 'stringio' require 'enumerator' module Prawn module Images # A convenience class that wraps the logic for extracting the parts # of a PNG image that we need to embed them in a PDF # class PNG < Image attr_reader :palette, :img_data, :transparency attr_reader :width, :height, :bits attr_reader :color_type, :compression_method, :filter_method attr_reader :interlace_method, :alpha_channel attr_accessor :scaled_width, :scaled_height # Process a new PNG image # # data:: A binary string of PNG data # def initialize(data) data = StringIO.new(data.dup) data.read(8) # Skip the default header @palette = "" @img_data = "" @transparency = {} loop do chunk_size = data.read(4).unpack("N")[0] section = data.read(4) case section when 'IHDR' # we can grab other interesting values from here (like width, # height, etc) values = data.read(chunk_size).unpack("NNCCCCC") @width = values[0] @height = values[1] @bits = values[2] @color_type = values[3] @compression_method = values[4] @filter_method = values[5] @interlace_method = values[6] when 'PLTE' @palette << data.read(chunk_size) when 'IDAT' @img_data << data.read(chunk_size) when 'tRNS' # This chunk can only occur once and it must occur after the # PLTE chunk and before the IDAT chunk @transparency = {} case @color_type when 3 # Indexed colour, RGB. Each byte in this chunk is an alpha for # the palette index in the PLTE ("palette") chunk up until the # last non-opaque entry. Set up an array, stretching over all # palette entries which will be 0 (opaque) or 1 (transparent). @transparency[:indexed] = data.read(chunk_size).unpack("C*") short = 255 - @transparency[:indexed].size @transparency[:indexed] += ([255] * short) if short > 0 when 0 # Greyscale. Corresponding to entries in the PLTE chunk. # Grey is two bytes, range 0 .. (2 ^ bit-depth) - 1 grayval = data.read(chunk_size).unpack("n").first @transparency[:grayscale] = grayval when 2 # True colour with proper alpha channel. @transparency[:rgb] = data.read(chunk_size).unpack("nnn") end when 'IEND' # we've got everything we need, exit the loop break else # unknown (or un-important) section, skip over it data.seek(data.pos + chunk_size) end data.read(4) # Skip the CRC end end # number of color components to each pixel # def colors case self.color_type when 0, 3, 4 return 1 when 2, 6 return 3 end end # number of bits used per pixel # def pixel_bitlength if alpha_channel? self.bits * (self.colors + 1) else self.bits * self.colors end end # split the alpha channel data from the raw image data in images # where it's required. # def split_alpha_channel! unfilter_image_data if alpha_channel? end def alpha_channel? @color_type == 4 || @color_type == 6 end # Adobe Reader can't handle 16-bit png channels -- chop off the second # byte (least significant) # def alpha_channel_bits 8 end # Build a PDF object representing this image in +document+, and return # a Reference to it. # def build_pdf_object(document) if compression_method != 0 raise Errors::UnsupportedImageType, 'PNG uses an unsupported compression method' end if filter_method != 0 raise Errors::UnsupportedImageType, 'PNG uses an unsupported filter method' end if interlace_method != 0 raise Errors::UnsupportedImageType, 'PNG uses unsupported interlace method' end # some PNG types store the colour and alpha channel data together, # which the PDF spec doesn't like, so split it out. split_alpha_channel! case colors when 1 color = :DeviceGray when 3 color = :DeviceRGB else raise Errors::UnsupportedImageType, "PNG uses an unsupported number of colors (#{png.colors})" end # build the image dict obj = document.ref!( :Type => :XObject, :Subtype => :Image, :Height => height, :Width => width, :BitsPerComponent => bits, :Filter => :FlateDecode ) unless alpha_channel obj.data[:DecodeParms] = {:Predictor => 15, :Colors => colors, :BitsPerComponent => bits, :Columns => width} end # append the actual image data to the object as a stream obj << img_data # sort out the colours of the image if palette.empty? obj.data[:ColorSpace] = color else # embed the colour palette in the PDF as a object stream palette_obj = document.ref!({}) palette_obj << palette # build the color space array for the image obj.data[:ColorSpace] = [:Indexed, :DeviceRGB, (palette.size / 3) -1, palette_obj] end # ************************************* # add transparency data if necessary # ************************************* # For PNG color types 0, 2 and 3, the transparency data is stored in # a dedicated PNG chunk, and is exposed via the transparency attribute # of the PNG class. if transparency[:grayscale] # Use Color Key Masking (spec section 4.8.5) # - An array with N elements, where N is two times the number of color # components. val = transparency[:grayscale] obj.data[:Mask] = [val, val] elsif transparency[:rgb] # Use Color Key Masking (spec section 4.8.5) # - An array with N elements, where N is two times the number of color # components. rgb = transparency[:rgb] obj.data[:Mask] = rgb.collect { |x| [x,x] }.flatten elsif transparency[:indexed] # TODO: broken. I was attempting to us Color Key Masking, but I think # we need to construct an SMask i think. Maybe do it inside # the PNG class, and store it in alpha_channel #obj.data[:Mask] = transparency[:indexed] end # For PNG color types 4 and 6, the transparency data is stored as a alpha # channel mixed in with the main image data. The PNG class seperates # it out for us and makes it available via the alpha_channel attribute if alpha_channel? smask_obj = document.ref!( :Type => :XObject, :Subtype => :Image, :Height => height, :Width => width, :BitsPerComponent => alpha_channel_bits, :Filter => :FlateDecode, :ColorSpace => :DeviceGray, :Decode => [0, 1] ) smask_obj << alpha_channel obj.data[:SMask] = smask_obj end obj end # Returns the minimum PDF version required to support this image. def min_pdf_version if bits > 8 # 16-bit color only supported in 1.5+ (ISO 32000-1:2008 8.9.5.1) 1.5 elsif alpha_channel? # Need transparency for SMask 1.4 else 1.0 end end private def unfilter_image_data data = Zlib::Inflate.inflate(@img_data).bytes @img_data = "" @alpha_channel = "" pixel_bytes = pixel_bitlength / 8 scanline_length = pixel_bytes * self.width + 1 row = 0 pixels = [] row_data = [] # reused for each row of the image paeth, pa, pb, pc = nil data.each do |byte| # accumulate a whole scanline of bytes, and then process it all at once # we could do this with Enumerable#each_slice, but it allocates memory, # and we are trying to avoid that row_data << byte next if row_data.length < scanline_length filter = row_data.shift case filter when 0 # None when 1 # Sub row_data.each_with_index do |byte, index| left = index < pixel_bytes ? 0 : row_data[index - pixel_bytes] row_data[index] = (byte + left) % 256 #p [byte, left, row_data[index]] end when 2 # Up row_data.each_with_index do |byte, index| col = (index / pixel_bytes).floor upper = row == 0 ? 0 : pixels[row-1][col][index % pixel_bytes] row_data[index] = (upper + byte) % 256 end when 3 # Average row_data.each_with_index do |byte, index| col = (index / pixel_bytes).floor upper = row == 0 ? 0 : pixels[row-1][col][index % pixel_bytes] left = index < pixel_bytes ? 0 : row_data[index - pixel_bytes] row_data[index] = (byte + ((left + upper)/2).floor) % 256 end when 4 # Paeth left = upper = upper_left = nil row_data.each_with_index do |byte, index| col = (index / pixel_bytes).floor left = index < pixel_bytes ? 0 : row_data[index - pixel_bytes] if row.zero? upper = upper_left = 0 else upper = pixels[row-1][col][index % pixel_bytes] upper_left = col.zero? ? 0 : pixels[row-1][col-1][index % pixel_bytes] end p = left + upper - upper_left pa = (p - left).abs pb = (p - upper).abs pc = (p - upper_left).abs paeth = if pa <= pb && pa <= pc left elsif pb <= pc upper else upper_left end row_data[index] = (byte + paeth) % 256 end else raise ArgumentError, "Invalid filter algorithm #{filter}" end s = [] row_data.each_slice pixel_bytes do |slice| s << slice end pixels << s row += 1 row_data.clear end # convert the pixel data to separate strings for colours and alpha color_byte_size = self.colors * self.bits / 8 alpha_byte_size = alpha_channel_bits / 8 pixels.each do |this_row| this_row.each do |pixel| @img_data << pixel[0, color_byte_size].pack("C*") @alpha_channel << pixel[color_byte_size, alpha_byte_size].pack("C*") end end # compress the data @img_data = Zlib::Deflate.deflate(@img_data) @alpha_channel = Zlib::Deflate.deflate(@alpha_channel) end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/images/image.rb0000644000000000000000000000326012114176157020637 0ustar rootroot# encoding: utf-8 # image.rb : Base class for image info objects # # Copyright September 2011, Brad Ediger. All rights reserved. # # This is free software. Please see the LICENSE and COPYING files for details. require 'digest/sha1' module Prawn module Images class Image def calc_image_dimensions(options) w = options[:width] || width h = options[:height] || height if options[:width] && !options[:height] wp = w / width.to_f w = width * wp h = height * wp elsif options[:height] && !options[:width] hp = h / height.to_f w = width * hp h = height * hp elsif options[:scale] w = width * options[:scale] h = height * options[:scale] elsif options[:fit] bw, bh = options[:fit] bp = bw / bh.to_f ip = width / height.to_f if ip > bp w = bw h = bw / ip else h = bh w = bh * ip end end self.scaled_width = w self.scaled_height = h [w,h] end def self.detect_image_format(content) top = content[0,128] # Unpack before comparing for JPG header, so as to avoid having to worry # about the source string encoding. We just want a byte-by-byte compare. if top[0, 3].unpack("C*") == [255, 216, 255] return :jpg elsif top[0, 8].unpack("C*") == [137, 80, 78, 71, 13, 10, 26, 10] return :png else raise Errors::UnsupportedImageType, "image file is an unrecognised format" end end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/images/jpg.rb0000644000000000000000000000476112114176157020344 0ustar rootroot# encoding: ASCII-8BIT # jpg.rb : Extracts the data from a JPG that is needed for embedding # # Copyright April 2008, James Healy. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. require 'stringio' module Prawn module Images # A convenience class that wraps the logic for extracting the parts # of a JPG image that we need to embed them in a PDF # class JPG < Image attr_reader :width, :height, :bits, :channels attr_accessor :scaled_width, :scaled_height JPEG_SOF_BLOCKS = %W(\xc0 \xc1 \xc2 \xc3 \xc5 \xc6 \xc7 \xc9 \xca \xcb \xcd \xce \xcf) JPEG_APP_BLOCKS = %W(\xe0 \xe1 \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea \xeb \xec \xed \xee \xef) # Process a new JPG image # # :data:: A binary string of JPEG data # def initialize(data) @data = data.dup ruby_19 { data.force_encoding("binary") } data = StringIO.new(data) c_marker = "\xff" # Section marker. data.read(2) # Skip the first two bytes of JPEG identifier. loop do marker, code, length = data.read(4).unpack('aan') raise "JPEG marker not found!" if marker != c_marker if JPEG_SOF_BLOCKS.include?(code) @bits, @height, @width, @channels = data.read(6).unpack("CnnC") break end buffer = data.read(length - 2) end end # Build a PDF object representing this image in +document+, and return # a Reference to it. # def build_pdf_object(document) color_space = case channels when 1 :DeviceGray when 3 :DeviceRGB when 4 :DeviceCMYK else raise ArgumentError, 'JPG uses an unsupported number of channels' end obj = document.ref!( :Type => :XObject, :Subtype => :Image, :Filter => :DCTDecode, :ColorSpace => color_space, :BitsPerComponent => bits, :Width => width, :Height => height ) # add extra decode params for CMYK images. By swapping the # min and max values from the default, we invert the colours. See # section 4.8.4 of the spec. if color_space == :DeviceCMYK obj.data[:Decode] = [ 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0 ] end obj << @data obj end end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/errors.rb0000644000000000000000000000700412114176157017624 0ustar rootroot# encoding: utf-8 # # errors.rb : Implements custom error classes for Prawn # # Copyright April 2008, Gregory Brown. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. # module Prawn module Errors # This error is raised when Prawn::PdfObject() encounters a Ruby object it # cannot convert to PDF # FailedObjectConversion = Class.new(StandardError) # This error is raised when Document#page_layout is set to anything # other than :portrait or :landscape # InvalidPageLayout = Class.new(StandardError) # Raised when a table is spanned in an impossible way. # InvalidTableSpan = Class.new(StandardError) # This error is raised when a method requiring a current page is called # without being on a page. # NotOnPage = Class.new(StandardError) # This error is raised when Prawn cannot find a specified font # UnknownFont = Class.new(StandardError) # Raised when Prawn is asked to draw something into a too-small box # CannotFit = Class.new(StandardError) # Raised if group() is called with a block that is too big to be # rendered in the current context. # CannotGroup = Class.new(StandardError) # This error is raised when Prawn is being used on a M17N aware VM, # and the user attempts to add text that isn't compatible with UTF-8 # to their document # IncompatibleStringEncoding = Class.new(StandardError) # This error is raised when Prawn encounters an unknown key in functions # that accept an options hash. This usually means there is a typo in your # code or that the option you are trying to use has a different name than # what you have specified. # UnknownOption = Class.new(StandardError) # this error is raised when a user attempts to embed an image of an unsupported # type. This can either a completely unsupported format, or a dialect of a # supported format (ie. some types of PNG) UnsupportedImageType = Class.new(StandardError) # This error is raised when a named element has alredy been # created. For example, in the stamp module, stamps must have # unique names within a document NameTaken = Class.new(StandardError) # This error is raised when a name is not a valid format InvalidName = Class.new(StandardError) # This error is raised when an object is attempted to be # referenced by name, but no such name is associated with an object UndefinedObjectName = Class.new(StandardError) # This error is raised when a required option has not been set RequiredOption = Class.new(StandardError) # This error is raised when a requested outline item with a given title does not exist UnknownOutlineTitle = Class.new(StandardError) # This error is raised when a block is required, but not provided BlockRequired = Class.new(StandardError) # This error is rased when a graphics method is called with improper arguments InvalidGraphicsPath = Class.new(StandardError) # This error is raised when Prawn fails to load a template file # TemplateError = Class.new(StandardError) # This error is raise when trying to restore a graphic state that # EmptyGraphicStateStack = Class.new(StandardError) # Raised when unrecognized content is provided for a table cell. # UnrecognizedTableContent = Class.new(StandardError) end end ruby-prawn-1.0.0~rc2.orig/lib/prawn/layout/0000755000000000000000000000000012114176157017277 5ustar rootrootruby-prawn-1.0.0~rc2.orig/lib/prawn/layout/grid.rb0000644000000000000000000001406712114176157020561 0ustar rootrootmodule Prawn class Document # Defines the grid system for a particular document. Takes the number of # rows and columns and the width to use for the gutter as the # keys :rows, :columns, :gutter, :row_gutter, :column_gutter # def define_grid(options = {}) @grid = Grid.new(self, options) end # A method that can either be used to access a particular grid on the page # or work with the grid system directly. # # @pdf.grid # Get the Grid directly # @pdf.grid([0,1]) # Get the box at [0,1] # @pdf.grid([0,1], [1,2]) # Get a multi-box spanning from [0,1] to [1,2] # def grid(*args) @boxes ||= {} @boxes[args] ||= if args.empty? @grid else g1, g2 = args if(g1.class == Array && g2.class == Array && g1.length == 2 && g2.length == 2) multi_box(single_box(*g1), single_box(*g2)) else single_box(g1, g2) end end end # A Grid represents the entire grid system of a Page and calculates # the column width and row height of the base box. class Grid attr_reader :pdf, :columns, :rows, :gutter, :row_gutter, :column_gutter def initialize(pdf, options = {}) # :nodoc: valid_options = [:columns, :rows, :gutter, :row_gutter, :column_gutter] Prawn.verify_options valid_options, options @pdf = pdf @columns = options[:columns] @rows = options[:rows] set_gutter(options) end # Calculates the base width of boxes. def column_width @column_width ||= subdivide(pdf.bounds.width, columns, column_gutter) end # Calculates the base height of boxes. def row_height @row_height ||= subdivide(pdf.bounds.height, rows, row_gutter) end # Diagnostic tool to show all of the grids. Defaults to gray. def show_all(color = "CCCCCC") self.rows.times do |i| self.columns.times do |j| pdf.grid(i,j).show(color) end end end private def subdivide(total, num, gutter) (total.to_f - (gutter * (num - 1).to_f)) / num.to_f end def set_gutter(options) if options.has_key?(:gutter) @gutter = options[:gutter].to_f @row_gutter, @column_gutter = @gutter, @gutter else @row_gutter = options[:row_gutter].to_f @column_gutter = options[:column_gutter].to_f @gutter = 0 end end end # A Box is a class that represents a bounded area of a page. # A Grid object has methods that allow easy access to the coordinates of # its corners, which can be plugged into most existing prawnmethods. # class Box #:nodoc: attr_reader :pdf def initialize(pdf, i, j) @pdf = pdf @i = i @j = j end # Mostly diagnostic method that outputs the name of a box as # col_num, row_num # def name "#{@i.to_s},#{@j.to_s}" end # :nodoc def total_height pdf.bounds.height.to_f end # Width of a box def width grid.column_width.to_f end # Height of a box def height grid.row_height.to_f end # Width of the gutter def gutter grid.gutter.to_f end # x-coordinate of left side def left @left ||= (width + grid.column_gutter) * @j.to_f end # x-coordinate of right side def right @right ||= left + width end # y-coordinate of the top def top @top ||= total_height - ((height + grid.row_gutter) * @i.to_f) end # y-coordinate of the bottom def bottom @bottom ||= top - height end # x,y coordinates of top left corner def top_left [left, top] end # x,y coordinates of top right corner def top_right [right, top] end # x,y coordinates of bottom left corner def bottom_left [left, bottom] end # x,y coordinates of bottom right corner def bottom_right [right, bottom] end # Creates a standard bounding box based on the grid box. def bounding_box(&blk) pdf.bounding_box(top_left, :width => width, :height => height, &blk) end # Diagnostic method def show(grid_color = "CCCCCC") self.bounding_box do original_stroke_color = pdf.stroke_color pdf.stroke_color = grid_color pdf.text self.name pdf.stroke_bounds pdf.stroke_color = original_stroke_color end end private def grid pdf.grid end end # A MultiBox is specified by 2 Boxes and spans the areas between. class MultiBox < Box #:nodoc: def initialize(pdf, b1, b2) @pdf = pdf @bs = [b1, b2] end def name @bs.map {|b| b.name}.join(":") end def total_height @bs[0].total_height end def width right_box.right - left_box.left end def height top_box.top - bottom_box.bottom end def gutter @bs[0].gutter end def left left_box.left end def right right_box.right end def top top_box.top end def bottom bottom_box.bottom end private def left_box @left_box ||= @bs.min {|a,b| a.left <=> b.left} end def right_box @right_box ||= @bs.max {|a,b| a.right <=> b.right} end def top_box @top_box ||= @bs.max {|a,b| a.top <=> b.top} end def bottom_box @bottom_box ||= @bs.min {|a,b| a.bottom <=> b.bottom} end end private def single_box(i, j) Box.new(self, i, j) end def multi_box(b1, b2) MultiBox.new(self, b1, b2) end end end ruby-prawn-1.0.0~rc2.orig/lib/prawn.rb0000644000000000000000000000132012114176157016303 0ustar rootroot# Welcome to Prawn, the best PDF Generation library ever. # This documentation covers user level functionality. # # Those looking to contribute code or write extensions should look # into the lib/prawn/core/* source tree. # module Prawn #:nodoc: VERSION = "1.0.0.rc2" end require "prawn/utilities" require "prawn/core" require "prawn/text" require "prawn/graphics" require "prawn/images" require "prawn/images/image" require "prawn/images/jpg" require "prawn/images/png" require "prawn/stamp" require "prawn/soft_mask" require "prawn/security" require "prawn/document" require "prawn/font" require "prawn/encoding" require "prawn/measurements" require "prawn/repeater" require "prawn/outline" require "prawn/layout" ruby-prawn-1.0.0~rc2.orig/www/0000755000000000000000000000000012114176157014711 5ustar rootrootruby-prawn-1.0.0~rc2.orig/www/twilight.css0000644000000000000000000001357212114176157017266 0ustar rootroot/* I stole this from pastie.org. But I doubt they will care since they stole it from TextMate */ /* Stylesheet generated from TextMate theme * * Twilight * * */ /* Mostly to improve view within the TextMate HTML viewer */ body { margin: 0; padding: 0; } pre.textmate-source { padding: 0; line-height: 1.3em; word-wrap: break-word; } pre.textmate-source { color: #F8F8F8; background-color: #101010; } #content { background-color: #101010; border-color:#ddd; } #content h2 { color:#eee; } #content hr { color:#333; } #content hr { height:0px; border:0; border-top:1px solid #333; } pre.textmate-source .linenum { width: 75px; padding: 0.1em 1em 0.2em 0; color: #888; background-color: #eee; } pre.textmate-source span { padding-top: 0.2em; padding-bottom: 0.1em; } pre.textmate-source ::selection { background-color: rgba(221, 240, 255, 0.20); } /* Comment */ pre.textmate-source .comment { color: #5F5A60; font-style: italic; } /* Constant */ pre.textmate-source .constant { color: #CF6A4C; } /* Entity */ pre.textmate-source .entity { color: #9B703F; } /* Keyword */ pre.textmate-source .keyword { color: #CDA869; } /* Storage */ pre.textmate-source .storage { color: #F9EE98; } /* String */ pre.textmate-source .string { color: #8F9D6A; } /* Support */ pre.textmate-source .support { color: #9B859D; } /* Variable */ pre.textmate-source .variable { color: #7587A6; } /* Invalid – Deprecated */ pre.textmate-source .invalid_deprecated { color: #D2A8A1; font-style: italic; text-decoration: underline; } /* Invalid – Illegal */ pre.textmate-source .invalid_illegal { color: #F8F8F8; background-color: rgba(86, 45, 86, 0.75); } /* ♦ Embedded Source */ pre.textmate-source .text .source { background-color: rgba(176, 179, 186, 0.08); } /* ♦ Embedded Source (Bright) */ pre.textmate-source .text_html_ruby .source { background-color: rgba(177, 179, 186, 0.13); } /* ♦ Entity inherited-class */ pre.textmate-source .entity_other_inherited-class { color: #9B5C2E; font-style: italic; } /* ♦ String embedded-source */ pre.textmate-source .string_quoted .source { color: #DAEFA3; } /* ♦ String constant */ pre.textmate-source .string .constant { color: #DDF2A4; } /* ♦ String.regexp */ pre.textmate-source .string_regexp { color: #E9C062; } /* ♦ String.regexp.«special» */ pre.textmate-source .string_regexp .constant_character_escaped, pre.textmate-source .string_regexp .source_ruby_embedded, pre.textmate-source .string_regexp .string_regexp_arbitrary-repitition { color: #CF7D34; } /* ♦ String variable */ pre.textmate-source .string .variable { color: #8A9A95; } /* ♦ Support.function */ pre.textmate-source .support_function { color: #DAD085; } /* ♦ Support.constant */ pre.textmate-source .support_constant { color: #CF6A4C; } /* c C/C++ Preprocessor Line */ pre.textmate-source .other_preprocessor_c { color: #8996A8; } /* c C/C++ Preprocessor Directive */ pre.textmate-source .other_preprocessor_c .entity { color: #AFC4DB; } /* ✘ Doctype/XML Processing */ pre.textmate-source .meta_tag_sgml_doctype, pre.textmate-source .meta_tag_sgml_doctype .entity, pre.textmate-source .meta_tag_sgml_doctype .string, pre.textmate-source .meta_tag_preprocessor_xml, pre.textmate-source .meta_tag_preprocessor_xml .entity, pre.textmate-source .meta_tag_preprocessor_xml .string { color: #494949; } /* ✘ Meta.tag.«all» */ pre.textmate-source .declaration_tag, pre.textmate-source .declaration_tag .entity, pre.textmate-source .meta_tag, pre.textmate-source .meta_tag .entity { color: #AC885B; } /* ✘ Meta.tag.inline */ pre.textmate-source .declaration_tag_inline, pre.textmate-source .declaration_tag_inline .entity, pre.textmate-source .source .entity_name_tag, pre.textmate-source .source .entity_other_attribute-name, pre.textmate-source .meta_tag_inline, pre.textmate-source .meta_tag_inline .entity { color: #E0C589; } /* § css tag-name */ pre.textmate-source .meta_selector_css .entity_name_tag { color: #CDA869; } /* § css:pseudo-class */ pre.textmate-source .meta_selector_css .entity_other_attribute-name_tag_pseudo-class { color: #8F9D6A; } /* § css#id */ pre.textmate-source .meta_selector_css .entity_other_attribute-name_id { color: #8B98AB; } /* § css.class */ pre.textmate-source .meta_selector_css .entity_other_attribute-name_class { color: #9B703F; } /* § css property-name: */ pre.textmate-source .support_type_property-name_css { color: #C5AF75; } /* § css property-value; */ pre.textmate-source .meta_property-group .support_constant_property-value_css, pre.textmate-source .meta_property-value .support_constant_property-value_css { color: #F9EE98; } /* § css @at-rule */ pre.textmate-source .meta_preprocessor_at-rule .keyword_control_at-rule { color: #8693A5; } /* § css additional-constants */ pre.textmate-source .meta_property-value .support_constant_named-color_css, pre.textmate-source .meta_property-value .constant { color: #CA7840; } /* § css constructor.argument */ pre.textmate-source .meta_constructor_argument_css { color: #8F9D6A; } /* ⎇ diff.header */ pre.textmate-source .meta_diff, pre.textmate-source .meta_diff_header { color: #F8F8F8; font-style: italic; background-color: #0E2231; } /* ⎇ diff.deleted */ pre.textmate-source .markup_deleted { color: #F8F8F8; background-color: #420E09; } /* ⎇ diff.changed */ pre.textmate-source .markup_changed { color: #F8F8F8; background-color: #4A410D; } /* ⎇ diff.inserted */ pre.textmate-source .markup_inserted { color: #F8F8F8; background-color: #253B22; } /* Markup: List */ pre.textmate-source .markup_list { color: #F9EE98; } /* Markup: Heading */ pre.textmate-source .markup_heading { color: #CF6A4C; } /* Customizations */ pre.textmate-source { font-family: 'Monaco','Monospace','Courier New','Courier',monospace; margin-left: 2em; line-height: 1.2em; } ruby-prawn-1.0.0~rc2.orig/www/prawn-Chinese.html0000644000000000000000000001435512114176157020312 0ustar rootroot

Prawn: 小巧的Ruby PDF生成库

RubyGems安装 : gem install prawn

轻而易举创建PDF打印文档

在包括Ruby在内的几乎所有编程语言中,将文档转换成PDF格式一直是一件令人头痛的事情。Prawn可以帮你大大减轻这种痛苦,并且仍然保持高效简洁。Prawn, 中文意为虾,也暗含了小巧迅速的意味。

方便地获取所需功能

Prawn是 速度最快,功能最纯粹的基于Ruby的PDF生成类库。, 在接下来的内容中,你会看到Prawn的一些具体代码, 点击代码本身可以看到代码所产生的PDF文档。

-- 内置支持UTF-8

在Prawn中生成国际化文字和生成UTF-8字符串一样简单,当然前提条件是你有国际化文字的标准字体文件(Unicode aware TTF font)在你的系统中。使用Ruby 1.9的人,所有可以被转化成UTF-8的代码都可以直接使用。

-- 轻松的图像嵌入

在Prawn中插入JPEG和PNG格式的图像相当方便。Prawn支持Alpha透明,定位和缩放都可以很容易实现,从而使在文档中插入图像轻而易举。

-- 灵活的表格绘制

Prawn内置支持以表格的形式呈现文字,从而实现基本的报表功能。将用户从编写低端画图代码中解脱出来,而能够真正将精力用在编辑文档的内容上。。

-- 简化的定位系统

写过低端绘图软件的人一定记得处理好各种坐标系不是一件容易的事情。Prawn将这个过程大大简化。你可以将文档的任何一个部分界成一个独特的区域(bounding box),并拥有这个区域独立的坐标系。你可以在文档中随意移动这个区域的位置,但是这个区域内部组分的相对位置不会改变,从而保持了代码的简洁。在这样的特定区域内,文字也可以自动分行,所以在海报上分栏书写变得非常容易。

-- 更多功能即将实现

Prawn现在只处于开发的初级阶段, 新的功能每天都会出现。在不久的将来我们会将它整合到现有的 Ruby报表软件系统(Ruport)。 如果你希望知道最新的功能,只需点击 例子和代码, 它包含上面显示的各种代码和更多其它有关的内容。

来自Ruby社区的支持

Prawn的开发很大一部分是基于社区对Gregory Brown的 ”Ruby之乞“ 计划的捐赠。在人们的支持下,此计划一经产生就迅速成长了起来,并成了现实。

自从2008年四月Prawn开始之始,包括在代码的表达,错误的监察,以及功能的制定等各个方面都有Ruby爱好者们的积极地参与。你们可以从 Github network graph上找到他们的足迹。在为Prawn提供了插件的所有人中,特别感谢 James HealyMichael Daines 为他们对Prawn的不可取代的贡献。

如果你希望能够在Rails的程序中用到Prawn,你可以试试使用另一个社区产品,thorny_sun的 Prawnto Rails的插件。虽然这个并不是Prawn的正式部件,我们会尽力使这个插件保持发挥作用。

请加入我们开发Prawn的队伍,使它真正成为符合客户选择的生成PDF的Ruby类库。 你可以加入我们的 邮件组 或者加入我们在irc.freenode.net上 #prawn 频道的聊天组。需要做的事情还很多,你的帮助会使我们离目标更近一步!

快来一试!

从RubyGems安装: gem install prawn 从github下载: 地址为: git://github.com/sandal/prawn.git

Prawn is Free Software under the License of Ruby, developed by Gregory Brown and the Ruby community.
The Prawn logo was created by maso and is distributed under the CC Attribution-Share Alike license.

ruby-prawn-1.0.0~rc2.orig/www/prawn.css0000644000000000000000000000230112114176157016546 0ustar rootroot* { margin: 0; padding: 0; } body { font: Verdana, "Lucida Grande", "Lucida Sans", sans-serif; background-color: #000000; color: #ffffff; margin-bottom: 1em; } h2, h3, h4, h5, h6, p, pre, blockquote, form, fieldset, table, ul { margin: 1em 0; } h2 { font-size: 1.75em; } h2, h3 { color: #00bb77; } h1 { color: #bb5566; font-size: 1.1em; margin-top: 0.5em; } a { color: #ffffff; text-decoration: none; outline: none; } a:visited { color: #ffffff; } a:hover, a:active { color: #2299ff; } a img { border:none; } #contents { background-color: #101010; width: 740px; margin: 0 auto; border: 1px solid #fff; margin-top: 1em; padding: 1em 1em 1em 3em; } #sidebar { width: 180px; float: right; padding: 2em 2em 2em 0; font-size: 1.2em; } #screenshots { margin-top: 2em; float: right; } ul { text-align: center; float: right; } li { display: inline; border-top: 1px solid #fff; border-right: 1px solid #fff; border-bottom: 1px solid #666; border-left: 1px solid #666; margin-right: 5px; padding-left: 10px; padding-right: 10px; color: #fff; font-weight: bold; } ruby-prawn-1.0.0~rc2.orig/www/media/0000755000000000000000000000000012114176157015770 5ustar rootrootruby-prawn-1.0.0~rc2.orig/www/media/bounding_boxes_out.png0000644000000000000000000003642212114176157022401 0ustar rootrootPNG  IHDRaiCCPICC ProfilexkTW?wڱhR40 L2KQ3Y޼wgsޏ{w&qAQ*EXpBm(YA0 &ֺNFe\ )A\/s9\y`)g q)c1o3JDMV*6#{e<^#w,iM@||>:8``' ,oݸ7]~ԇUIq:L e3J2'!c%/Q߽~w.`g@ӊOVӞy6g 22ȶ3C +unP^f+n߆~0F94Y;@,l-I6={˱J@u-7Dxh"y.1M#&"$KTXXyJf?U JHaC_xn)8?ieмk^70!$D`㦝yU >SxøO ob³W\H0o۽~]mL*Ke7fBp8b-{ǁ= IDATx{\w?WE.!4 ("b*VٮrjjR[mbKb{U+mu]kj+P7" "=\A &ǜ/&dy aI'3yf0#C@FF00 a`##@FF00 a`##@FF00 a`##@FF00 a`##@FF00 a` `{.O>u a56@+QpHG8 1XZ/Fj[) /PSS>SNvzl_(\Rw}||nܸKuT~H{~^^aׯ_AUYY)H$ _)QaaֿӧRk]o=u>:믿;v=Z8#lmm쬬qO>9s۷;̙3g„ ֭{vjkk̙aؾ}NgwHMM}auu322gΜY]]}avcǎ%&&r+VH$Żuvv[ƍ9s/ _.^x۷odZ.Xwܼadb䪫W\?iҤI 555'N<|0q˗/"ð8NyWsrrBBB  nܸŋ;-((6mc\\\GG[[[ ~0x/*hO|-7o\UU|^{ 'Ofddmذaҥ?oۿK͛7}㫫qr`Ĉ[nsk@0e}]g{xx>}ZnضmۣG>ӧ8PTTt֭)S8gϞm۶:uhh%Ivvvhhhss}~mҤI*Q|8666)))ܹs999VVVO<z/^ֶrʴ4>xfΜy?ٳg=Ξ=ԩS89Ç=899]|7n\xÇGEEzxx\t͛'OxiEpi_gcǎ_bccu7xðsM8qΝ}g\.opͮ;s̔)Sz{{=<<O6M~7G1bΝׯWW@BBBbb"aK.{sO?400000߿Xy^^ڵk󃃃Ǐ/ַ~;{ bq=yDÃ9r1c\YYY[n}W1 {wΞ=T ަl666av;wp\.(:;;ӓfcp^x㵶21bacǎ% /@|!/@?puu!މ`6yd ooﲲ2 VX}9DC1rqȑ/"q#Rѣݻ7}tsY-s\y Ri^^^||444̚5H$2SK ~q{{$AxQ*;v&LPg}Finn Һe4|ɩ_^r%g3⻷ovssJLLNdi~ `AZZw}ٹk.B??b>?,=zD|>j( F/ȑ#o9??vF.--|Y~555Wlٲ"~Ɔx388󜜜pHѱ|r;;s#2De1$7/ ]psiii&MP=66ȣK.+~Gr666î(&NrY[[$_$P ˆ7o ܶm7uLIIIKKNJJZbş +پ}kqF777 }}}%IjjuBBBBCC+**fΜ{n]wD恨,3fܺuFF|||gu2>󳳳p~PHAO&#Gbf͚cƌqpp...VN'N8bĈ'Ow#S=== mkk%i500 Jnj8c6i$2[A9"6oތ:&|ϻZ۷o'L0o޼f^VVꫯ-_\#9f`VXX8k,//Ǐwʘ6a.X[[ݻ7HNNq|ݩӧOϯ[t駟~;8sYfegglip8{ZYY9rghhH- a߽SAwL?#2{)#Gl`#Mn߾M ={Wk{WWǓH$ׯokkӣ @|603#>>8yw5c ]S\-&&}BСCz# 0ydX|iuLIIIII9uaDK}\\{Thǟ9sӧOMMM3fNODe1d$$$9r$,,ٳgYYY:x233I?@3̕/ )߁hq8}uw1*PXUU%H4߭TYWW׍7?NoRRұcz{{]Z)RF +F'uuu8)Xbb{'7n񅍍 Z?sH&RkF\"|J an3f̰i>E<ŐD{0V^rJ ZSLYv-*L}#4MjuvӪH`HrFT|uvC]4S__!lH0\Wٕ߉u/ "ӧd>G3f Ĕǎ+E1$ަEʍ]_y啸3f;w6$$|w3!Fjѿ:w>|X(嗗.]2FJ5̈́C@E_~m۶EDD(ԐAr-yJ53!@+#_h|H$u]{~Ŋ'O3gNkkUH<\%VTTzN/?:::22rؐsEI)))iiiIIIĐ噜*v-h[Xz͚5===*'T*w+!S>fAX_OMMM#G?W/ >;qzTiZ?^!Ƕ.S|ʪ޴V+gxwff3$han xM06IuޛVFTv gBsJpΈJ믿>}Z8bTz<:bNaK.%V_)/P`_ *ZZWjW&:5guv@fN'ǘ1'E4ԮÛW=aN9*|bN'_qum&Vj;v~kXPWWߓ?dNPަiav׳װR; 9'@'_EFhX]5s x5<E ғ!٫[AۜHOd:Չ_9d`=d6'(vVۻA0'@eDۜ WzZWj9dߓOmsݘR; mO>=z4 4fqLPiR3&۶mmkkSQW=6Tug& V5 ަirԩ &м_nկ88q1 3n-ٳk׶ֆ[][R1 555s̙0aºu>}۷&L7o^sswu&-++{Wܖ/_x֖賵RðYfyyy?~\kYYYsp t-隚~]~_!knյ%I'O\]]3226lذtRcmmwކ7x#99ݻwwN>=??nҥ~=??_\.w֬Yeee666}}}_z_~ @'F5J(޿OΞ=ĉRmڴ)..*ōGGGLo-Ys7n<{qLpBoUUU=qܹsaaa{C|M|wݰaq;*ObW^{L999ƍ""77AyKQ֭[lllB!*0bX8σTCP.oӴ3|c oΝ;D k``L&TI&-fOرcwuuMMM%yL~R؈j===l6f[# _X'tmIva'MֵT&455>HV+p tϣvF]XזTEt6ܖvww]|y֬Y6xmhٳ"M$IhhU~B+.kr) È̸a!Z+gΜSV=NHH8rHXXسg4*233.o9sfKK˅ n*$$d۶moڵkyf//ɓ'ӧOG||OZfǏOWW׍7?s===$J,X,X>sY2Rioo;ª*D2_~ypp8= 8qFk%w!YC7  heGE[InnѣGіLM3Ui2e7wW{ *h%J@ (t~c4񬬬 (鳧|*@o̒ ]IIRoHaK6kOׯ̦h~˖-0,**lN}Ld)/٬=]o3 ޿0bl]i P0R8766bzw~5@d=}׽Ϟx% 6$1N_Z*lVnO7l_@>{S= Rdr{ߖ0s5HҾZ+VȘ\2q燇GDD_x:::]& ,Xh"bY!ԥʜ^BƅhUSRRRRRR==|X:9!!ɓҤɓ ,+,,ȑ#>D]LC'#RL%ݝn:>/PL׭[y51ŗ BFd իWvttLJJ˓J+2T*KJJrppHNNz*ꊴ3 C@/ޣGN2dV59"ȑ#~~~SL9zhoo/TcK tY{{ݻY,VBB@ @]qRiL; AQ/_nhh@]~mGG_!Q/a&TzAsNPH~MP(ܹs':x ! ad:_>>>K,w 3i[dwnn. $hx!,^o/ʕ+<o--- $U (PRRbc㙙,+==>?2,==beffcD0Fii yT[[Q[[Kf-PmmmDDDXX$$ (Cm?~begg QA 744b?N!(aD%JH(ݽ{{nPPPll"!S饗^駟KJJBqqq``eeɓ)`'O ,..o#0XP(##AII{FF?DFadQOOO\\\HHQ/BE---!!!qqq===$ȨmQ~!44ť^0~u0^(//wqq mhhzxwftМ9>ĉt;y$ép8&qiΣϻ|z|6}y߅$ѩˣrܪ*E᪪\ID#:(QZZkmmEW㥥o$Mhǎ"uQ`8HcXIDATv#}^lٲ3g9;; cbb&NXTTaD+kjϛ7o'N@]g>,..^b"JKK /^{.ǒ~h)QKKKY,Vqq1p牺g0y<W@1kHc02s\GYkk+UyH@!#>yWUUl"pFFT__p4w{@!GD|>V02S逅zvzٳgֺҳGo߾ 6ЖD'O˗//..sB~ӓnذ3KFzjiiп먨(#y">]#=o޼f#;2Ia޼yszz:#}466^pJ#Eȓ_pa H;vpvvF[!Ia;ߏ aGO[lA]A1)[lxb{{;BLξիW#?,BgydIa޽#ԅ#|+bccVGafcc3o޼˗/.@i-Z JM-ZQWa ,((A]5GfD-Zʕ+ a:#-*++=<<ƍ09/0 sww8qbee%BHR>u3,0RU0ᨫȌðrU0&8 ԅsȼð@7ka۷]]]Pb,L#O" l;wPhF(UG EEEu5U0&7o D]EFF._<$0,88ƍ`4#MPWA:ȢðjU0&nݚ>}:*hBgYZaPSS50R u!',00 #^KMMM a.#-0#L"BPPPMM * HI&%'auuu`.#<==QW1“0//FU0Z \ƚ6$apH#,Ȉ@UAH3#|||PWyI$܌ 0Roppu!GDPPFuvvlU0~yIfwvv TD5=t#H"\\\D"* H5#eH# TDfVpdj`"͟'<ҬҨaKGG*'!4lu Tje?c yLH55G*> T##EA)## T=z L{ 뀅̱<6M#MO~-UЄΉGӦMB]sAiP]] :пQuuu@@* H7oP2dQytƍ`U0&eee0.YNEDD 44FLXy򨣣u!aUxxkPbLH"ѵkfFZDFF UP9ID0<`:#-σiID0<*((`SLFZ>x𠽽u!af2=z0f|>u!`r;.@}ٲeǎC]YvytԵ`;vlҥ 1=FHKK;|0#H"GIII󨻻12L>:H"EaaaСCqqq^^^k0]FzJKK/;;;H>Dȑ#>piABR]H"МGUUU, ѝ?嶶QQkk+=<, npppaa!$ytҥ;v.ǂhEL/**;w.ZZQQQ?#Z,H||G}$QT^tiZZZIII~~>r,M䟱CCC̙Յ(0\WWܹsߟ yD-?_z?@)ֻ];;tUyH@*.|6Fƥ*l~@>f}G$##"y C7|p***4Gad,?X__i&I$M6逅<26f:'~H$lmmGԂ0QeffXtLf7Lb233}# AIi---/x/oQy<ŋXP<#@Ι>>>K,Zݻwoɒ%>>>4FzT*=x𠋋Ν;awBΝ;Y,x puGGǖ-[C 8wuuٳy˖-yd #}0a6nb8`uq F:cB544[1%%u9tkhhHIIqtt\nC> tè$kooOMMeXqqq@ gX?<1U03H/2eÇ;;;QWDÇM2?E]jׯ_y0"IիWvttLJJ3[TzWH;#]AbBI$ݝ| L&STTTVVVww7ty#L1=z4,,9!!ĉmmmҤĉ aaaG}!yD(N3|>W\?~xxxDDҰk׮ ,X &&fѢEui\dɷ~F0ĜH`eeeiiiyy@ `QQQAAAӧOwrrX|֭ꪪ2PjccCC <"H-sMapsεkn޼Y]]}-''@///OOO///{{{w[__TWWWUU%O񬬬{XyZl6Hz";l77QFٍ9J"HR"H$uvvxzz9iҤOOOnD Bԅ0ZDBDLooT*D*w6=zh3Eeeehh(* n a`##@FF00 a`##@FF00 a`##@FF00 a`##@FF00 a`##@FF00 a`##@ҝ_.BIENDB`ruby-prawn-1.0.0~rc2.orig/www/media/bounding_boxes.pdf0000644000000000000000000000473412114176157021500 0ustar rootroot%PDF-1.3 1 0 obj << /Creator /Producer >> endobj 2 0 obj << /Type /Pages /Count 1 /Kids [5 0 R] >> endobj 3 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 4 0 obj << /Length 1752 >> stream 0.000 0.000 0.000 rg 0.000 0.000 0.000 RG q BT /F1 12 Tf 136 624.612 Td [<5468652072> 10 <61696e20696e20737061696e2066> 30 <616c6c73206d61696e6c79206f6e20746865200a>] TJ ET BT /F1 12 Tf 136 610.74 Td [<706c61696e7320> 50 <5468652072> 10 <61696e20696e20737061696e2066> 30 <616c6c73206d61696e6c79200a>] TJ ET BT /F1 12 Tf 136 596.868 Td [<6f6e2074686520706c61696e7320> 50 <5468652072> 10 <61696e20696e20737061696e2066> 30 <616c6c73200a>] TJ ET BT /F1 12 Tf 136 582.996 Td [<6d61696e6c79206f6e2074686520706c61696e7320> 50 <5468652072> 10 <61696e20696e20737061696e0a>] TJ ET BT /F1 12 Tf 136 569.124 Td [<66> 30 <616c6c73206d61696e6c79206f6e2074686520706c61696e7320> 50 <5468652072> 10 <61696e20696e200a>] TJ ET BT /F1 12 Tf 136 555.252 Td [<737061696e2066> 30 <616c6c73206d61696e6c79206f6e2074686520706c61696e7320>] TJ ET 136.000 636.000 m 336.000 636.000 l 136.000 552.768 m 336.000 552.768 l S 336.000 436.000 m 336.000 491.228 291.228 536.000 236.000 536.000 c 180.772 536.000 136.000 491.228 136.000 436.000 c 136.000 380.772 180.772 336.000 236.000 336.000 c 291.228 336.000 336.000 380.772 336.000 436.000 c 236.000 436.000 m 136.000 536.000 m 336.000 336.000 l 336.000 536.000 m 136.000 336.000 l S 186.000 386.000 100.000 100.000 re S Q endstream endobj 5 0 obj << /Contents 4 0 R /Type /Page /Resources << /Font << /F1 7 0 R >> >> /Parent 2 0 R /ProcSet 6 0 R /MediaBox [0 0 612.0 792.0] >> endobj 6 0 obj [/PDF /Text] endobj 7 0 obj << /Type /Font /Encoding /MacRomanEncoding /BaseFont /Helvetica /Subtype /Type1 >> endobj xref 0 8 0000000000 65535 f 0000000014 00000 n 0000000108 00000 n 0000000165 00000 n 0000000214 00000 n 0000002018 00000 n 0000002163 00000 n 0000002191 00000 n trailer << /Size 8 /Root 3 0 R /Info 1 0 R >> startxref 2289 %%EOFruby-prawn-1.0.0~rc2.orig/www/media/tables.png0000644000000000000000000010656312114176157017763 0ustar rootrootPNG  IHDRiCCPICC ProfilexkTW?wڱhR40 L2KQ3Y޼wgsޏ{w&qAQ*EXpBm(YA0 &ֺNFe\ )A\/s9\y`)g q)c1o3JDMV*6#{e<^#w,iM@||>:8``' ,oݸ7]~ԇUIq:L e3J2'!c%/Q߽~w.`g@ӊOVӞy6g 22ȶ3C +unP^f+n߆~0F94Y;@,l-I6={˱J@u-7Dxh"y.1M#&"$KTXXyJf?U JHaC_xn)8?ieмk^70!$D`㦝yU >SxøO ob³W\H0o۽~]mL*Ke7fBp8b-{ǁ= IDATxw|TU{dj&{#@&Db]]\WW+uW׵aE@J5I^'dz7 1dR}G3{ιϜ{A|>Y./p㋃3 g/,_Y@g 8?D"D"OD^J@r, X.46RF{p\+n6?igR$` [6=##bL"SO7&FR GűDk[, (T.S ֗FF@@l6!1J`zmBBڵk|'xؖI:Zܙ"PZ#{yv1Dd\FKc2TB;n̸dy!5e/  {3R[dxxro6f/ouuZv*GWysJݥOqtR>o%ڳ1>>IׂT. ,^ki8C=$kjj&W_]z]ND_O?N/-?Vuve. I~יC_Yw|| 6*ʑPɻ?]t|A_VWzkČL6˵zy~֪M5uu+ yAi]5G.!IK3r9pxl~e}ű G3 c_GGŦ)Ԋ}-K4HBIg֨|ƍsrr(Bصk׵k`[l?poa2P=p;-[eXcǎN ɿozoy1`X_|֭[nݺfqƺ:شiSvv6*jǎ0 "@b[xG~3pkOU%[VJ#Si$^ nXCsD?/?Ng凾 '~}%<;1-Hʐtx藚JU7woHݿ: /Y$Ơ)D X\t0Lj^ap:$l?y .ّ~ABq}r!'N^5㛏/&%b$ho.I*Wj~W^obHgK۱%kB8.Ԫ{ߔdhonx.4;#(Rdzm]mH9t6Pd@&4-gƆńZp8a/CDW+_A~zD,LƤ\F%@!OȤ3xD )Z-%:5=~n{O{tp4X_VW}iqᛕwqɔksֽm'D~hƗ|iU~{z+22d@ff}=999?0Vg}vʕo`xWtx9sW/}z]v  (wMLLR+V(**[n]QQQQQݻm̙sȑQK[;̱jax8pI/.EQm;vn,Ëa[|HSpm@@˗7/+"2ɜOH \*l]e;H PML  1-_,W>;vE{&ؙcgH$ܿyVk(ҔM)TҺ4O.tUq@@|y#D]w[]J(7@fUTjK(;( Zʘ+MY[p ߪώԽyA|*q"8N|@ s3ttuZýܽ?MfS~pޟ{g1^0 yÇBؼ6G.x!OhMw:::F^8Z L"GE}].(,/\4g ]r‘k7#U> '"0f֕@Y]i|xB+}h@$+5>; ~vزeKDDDllNqxW^ٻw_~ 111W裏K999E{7nܸbŊ˗/[nʕ>?66vٲeOSO윜L"{ݻwޑ寿B+L\\ѣGǽGe'WOkq̊uNI p^ |I "`I#Uե$6,^Wxhf>u,U-U-&kG*G^W/_ޥuO@`G`v{'  jĕ1d 1sq$YKJõnq\"JZZZp+E i8-i+[Fy\xL0>o#_<׏D"upyVgyfsFD$](X,]]]6oveeeYY٦M;]:|p~~~qqdsPO?t=șP iN\ ņm,& &G+[sf"PRx$C渔 ʮUwD n/lSdUKV&T_ ]풂V=f)TRw`GD"Dŗ~2WoFIn\ r{:@Y`:.׿uݎߍ.uą|7ɑÙ~yK)zGWT{ѝ9!2 z~tOOϱkkt5ؚ9AQHRLSi,DAg)c p\V3rȝ/JBQ?='?~ {ݯɓ4V;Yji7w5k׮]`ARRR{{˗}l[=p8vw s3#nVj뮂F'4w輪q9(8S78888g/,_Y78888n|qpppfp㋃3 g/,_Y78888n|qpppfp㋃3 g/,_Y78888n|qpppf500T*uӦM#C>c>ohh˖-p8wgʄmO/ɏG l@X.U֐PQ&g/޼9`ILP,j^yOOϩdq;%P5vIg NwΤP$*w%ӘByRvJSʼpih\CR IU֗[lb3h|֯_F$$?))IT655=<B(*D"HRF6mFQTRرs옆k]}r*iz3#.ڌ}li qxn_g@@.2 k &%>50$ғHDuZcRq%f2Զej^)"JoE|gZU;2Lț+pnP 2}z))=(:D&~žnDoE|HȠ7V+֧5uw f/JTeW<}yNiL߉C9†cߗ9Fg1?T)ly)&/<ڛgjkŗ.ّ~ABq}rKӇr;O f @N~|{ˀN!`~#C=EJs! _ 4L!Z¦`t%'?/HXW~pXH:hĴ B{+j>.w۞ }!f/?~gk6[UI:}H".ʍ)8PTD?/?Ng凾 [\ׁXbIؐHO%=[P-+l]Rz^g!_|x~Qnj]5ث&]ԴC@@_R^~Cawww7)++ݻwh>hٲe@P>/nbb"JOA8s%\K#oV.csX}>#ߕT\m^`!fcҩkEl >.9Ex4A-M}1~nX60}q)W.cQ-\vH%"d27 ||Y@"Ĩxߨxpq"ݜn6[N,WrP5^ YPUpd49 wDm~rI3`|t^o,8PvF Y DrWw472Y4٠ EĴ kӂr{cgnXWl;v.?7j eW#b|ܩ͎d/_޼8sk&sv^P |Z/U) ,L&zxqu ħ& jG{göL@YWۀcW Ņ ^<"qJviy"o{~ŕnH;maFyq,A[L^^%ˍP_4xZ'O@ ֯__}o nnniiipkƍQO=1$qP?+}黭\o,'h4["ΥuOy,3R?&qL_dϕ in"8d2d6c) hʟyyyP6vlPx'e^&:x+ Su?1"/$?! 9zwlcFFd29>>̙3¹\nppӧ'Μ9sΟ?oՖP}=\G1h)kg}+VO^P\:s ;?xyF)*/geBu'I]+wsio^NU idJZRCdAV0ǛΧw_,q2fGd@ V !(BWZo5-pkip 2П8F'(8X6$U .j(:<@Wn6[JRTD']8Q37Th-̓r{Ө;%R6;N_>b utR{.[u^YQgfͭz%M&sҢ4 0ր:h;zt!g3#@"(c=Db}}}d2y#P(L yѮcyte꬐Qo}Ŋ]b9HSJZFA* tZZ5DT7;΢qh*tݺYr\TJBb V%J:bH%JfrArcP2[agxW89`Rt:,ZC$}An_qEs2CLءXt:#IE^\lvv:`f! h& }0lkAF#+Z:c0y^0FjnM32Ңh֭[r?1ïf7n06lpss۽{VntR~~~P[[r7nܘa2F'oy訿)rp??<{"{:AU@'@,YH'EI3LX,i ]t0x}l]e; Z'x wy"= ~ŜP rŧtbOh6gMezΝ_~}N-Y~|;Txﵪ(TRd˕6(Q$?:deBҰWרm FVY1}@ӇG p&)%'c lB$tKHζSuKV%XVX^ M渔&|]`3)2ujlmSʵYD"\t:21 b׮]V*))z k>˗|o6ltRuuu^^ r͚56m򲗩JciFf~6 W(7f KRzd2% ~W/ʋPIpxhzs2C~zsO{{g~<>5=E\U"WtI-|`?p"_/O&o\reGW8ϟ`}ZUGUiCW.tJ-%ߗz(ɝO̍ED5(}epdp@fAJFG{E{agnC=kٳ,ہD"DbV|^|c3//Ygxlb#9vM=➡ 'zՃsbp{&!ͩ#)ܙ+iN,g0%d/mן׾#VF"|GgNދi/BP(r5t:AOAd2Tz{@ >p8Q,6mڴzUV9ύE$2YTިG*ZVq(B3(?JuǢҢڊ:˕f43e H<{kvܹI'BgP4jbK ~e I#k"J$tZCRzPdg^=vR3C}~vyT8Ltelm>c0$2aTs 0*S d0HH6ADjO,kFq&jH$2qT1655]g{ nt:]bii=I7C믿_wލ^~ꋎX6[&,ʋ+-jif& &Eѹ-K]݃SC5E.\h\Ay!:@@},j9_+#푇',zuT6?}##O(T" ƣhm ¦ty1źmq﵉afךjj #}1{߻`lkyT*gd2@aaȁyooL?6˗/TD"ץk:= 99y˖-Zd\@g@dO`Eښ~R8y=٠J3f- X]풓+n:>2'#;f}O/ٳ?[I [[[G^u=p8888n|qpppf7{LNgs-PڕaY7S/?JyilX˗'~.7w=%{g,}xi)g= ]xi)/!/_/-D:oM$Ji֒Ĵ@!D6@D7<95/_Ѿ]26E%ftxNj(\7^b=J@F:'`Of ( ;X?X_]rx_qhg-ʏ>{_N~<.rc#fה?XN .?u1{En|g &q7:\Al֨N֒D@nK*tKx]9 p̖>Ihp֧xq/.]~3 &qPykNj7$X0J'F]d2ljd ]]7jKR7jj\ j+CT5^&SH;jgۀ%}C@dp@60R|K᫏.4^nmw֋bJZ*{J[ntơJeoݛ/ ]ǚ֖ƾw˭MvSu2L.ikaNf(6am:8#+tF<\1REq3Mf-TZoR/-†L^K>:FgD% Aމ_jx̳j.:ρ{Lj/ Zpq^ȶn0F;&X.(ҦͶV)lP28\(^k8ØCwi[ºw!LmuoSR zG8ppc6'!`xspLݏMn0,`qVf[S$E{*GfГvSlwwiL!ZkmJ*`LҢ+7- _< } k63P [nC&'sbl 8`rM 6 5vA!}_paӭ+0a7κ)|7X,bo}gv£ J|j_l6ݰ1Id8,ck`X)o8 s1m-ElOn~ȶ~98{`sRhuZ+Ňp]aEMW/6l{f(w#J*F 1 0XԅKI$hbN;8.|n WÕyk{eEgd'=ʡÈYL*k=ԚTUiKphⳍN`cǎM1)0vWQّg NúM@S}wrx6 6~xSyyy_l輪oa2OZQqZYTZao/t^w8F+u:# >&ӞMDh }_^ܥ S@@ t%H_(њI+*ɢejTlg0TvϨLƴ(Y`<Ңױ}Ӌp`3mM$L0ƁYwpW+Y8da{''ߞ` ڴwF&cJTٕCW iB"DLU}Zp\c08ǰFiTJJ1p~9J3ΝW32STplL'Sbޏ/MML\퀃3 g/,/daYQ e⶿Qd "Mbs8<ƻZT]l2J4lt;vtuu1L&VkkkmTeɝ-%D’sB"Dl.0?lܾ`nVxRzPtk{ˀyZ݄3YT`!v x:=}H+<{mstY) \u^H(&/&ѯ춭 rC*˕gM9+760=#;ӣ4,ږ'nLe6:M\.f{GNe+>,YQ$Xb)TҙU3]<6QQ\_d=?3 EG {¸Y &+H$,^_}Dd2JVOYg^^>6By6>mzWqWu0J=% \#+$bE@;:ڦF9 Z wVBaZra"j9-:~nVЃ]tzѹzKO e0m70V.l:IEQ?+WT;L[$DQwrqТܘǪJ$Q"_r!mA+aOĦPMY X|uz?XwPEN~e%kS{443 ɺB~guPH26݁L]uY3Ǫ^uУ|1C*EKTi)\X7t:[-Ŋcʺ$wWD\LY^L j\deTU\+FysK.7Z&>|W"W̿/G3Sd q\@E;s,ذkV+a0S_1I~n{tZțk4B",:0@@=CixN27L!6$8T (kHd0ݽ'0~PitțvsT}`yɭ7ת:lfMR*޿enwSus"ry*釽W zS`;&a]9 .e20 قd4kӟ+2EU:@Ǫ{:i\o -rlԔa'n X+rght/'j`jOy[11߲k*0'?07_.0=wM4cwjE!ubrk2}0$6M &K'NdX(X,#;b9-ɍ.-9d.Tsp%D 636^/~EK.C_zLoFc6|y2e2fӀLBQF'7BjPid6aX&i>k VŊ Lx#)DA ta9+rV&xF!_j5 LNU{UIo/.IH 0٢Th\fXgT/A ̖MugBE!ל0WNejb\9 24PSvx_J|CGb+(ZqA_=E1 ?^vI얦  qZo]-XNeꠗJ~H,fVM Վd`wz0̧VExpaFvuF@MWy`/bpKxqbhTQ} -Pq,!*D"xxr%j hM(^+4'/*܅;g?}o3MB(d8tl:cӇK$qՎFnv5/^4xn8tH 5-BeIsD7_B sd$b9Br˕F'QI0CJ^'auRj% W/5$ fR$*VcB!SActrJl.c"o5ĦL8`?Kp%<82ΧݦF ×NԨf?-BklcݧL&w{VcpvJΠb,FbNUo[0HZJ z#B+bOVW{?d=%`2ۦ$,kO`YX$&m~4<[0] !>2߱+ԌQfFhڤO.Z: tyc&M$S%щiΚ)~NG IDAT,+SI fJJlcaR5"/zZ! {}_^^ɭIh;~܅M'И$?UO<%+KZFcX6]jL1#s+Y,B"=˯6Fz4O.I!͑oKփ`GЀM%.)vW8iOAh/W6]W7W&Z +\z>}*F'ۓZAL_3JC\ ,XR⇽ܦ :hĴ B)P`WfJgP$ L&sQz6; Jڰ-sߧ0?흕໹ܗ/]mR@dePP>Z/*m[tH%D\Sp sn|)K[1xXqQpQS}wӍI`5džcZN"<[*Sul. ǔ,K[+LN%ˍP_$\!6l_97+ruY( is)U:.0E0lؖ)(jH?^yLr/֣'ˊ9wl2gaWlf|]ʎ$2qƴ;sw E/_¥1nT(Bv܅ME=9wd-fit':$tmEd.d2Ë m >50ynpW:cN&<|7D]{{`ĬZC'8V"NsC*zVES}d1 wx W?֔4 9kUWo ܇t'|;νwo6va@꣋ ׺ǝ8Sz`y_F]d2Ņ }ݲaws).lh u?[PxL#Qp;U#D-FzxNfUA!rL@$sqԺcB,~ xZ@r I/΢X*dQi l)@gPB3WeS5HDg3Ww%DЇOt;%O_~ӘL"5qhow@.S߼k6[$_2wDx (O\3qˇf:+4X◀ГvSlF7x$!j3Tm2['- ٩LU'j|h5zmSđTJ-Bь./M &N!pi%KH $S#?Yښq ōZGn| 0X~O<<9!="e| j׫;X,6#B 4Y;cq:qFFg;:C=u+U?}3 >*х>7W؄9f$7d6R,uΜqe Ǚ}H"pxLxDޚ!5e(O@*[n.boo`r dqG a[j0ze &$³6=a͖(ZisSJw!ST,io{*[?HtU⒕ UeC+- {^TŐԑő J^lb"`4/ =ػSgdjŞ3psâ.3׮xDˋGzw㗯K(dv([.%geF|ΑzBpp%i`,F' AHj8dqW1-J &EM\B% E>DND@e2R2tZM% W]֏ CPaȇԓSـ+Yӥd,޺bY-,*EBtKNkÝ5gjvfzv(<,f\b,pfp% {|,_Y78888f+Y؃e`tM7f໹;u˗'w[X.%SbctJy3(j[lxۺwر$X%wM% wwoV(|DRG6Dx⥥Ot\Iyc=:,6,H$50%%矟`j6T@g}Eoce/PIgVKJSٕy!AL"DgM{.cqJTԱNwΤP$*w%HJ!׼ځzKϘ)Zk.1lM1u*Nζ8-i߭&.8rV5qy,P;/j~ѩ=Jx2K133Q#'NK0_-J"\Ъ Yy1%=,Pt$2^xeLwSZqR'qç 7[ VwZ-6DϽ%1 ;/ɯM71c}!& oۗOb0i?n>fRhT'!BH³준A"5]^W 5V>|@t ۷ܩh =@v^TV? 9KJ͌m}84=]$yX_5uvVƘh}?8 }uyH<_0! `"C{LD.qi鲑{;UB1LO1ɦ_+A>&d㥟aw33oj02+gBtB\`;B"4Aw<0O /Ԟ^Vm(|F| #qzn-;TviBɺ5 $2>i|?\7izjB쮷1Ѫb"c>q}i^vЂP qcFz:RP=`0-NISۚawX6_?쯾qNsI!:^\p-"[,7^?!p!^W N,/mѢO}ѨTLyk5F.Ә$!1Y46.Wi=;™1 CQF:h\`;I]42YtJDDK54cݸ[k|@Ei-'ZӴsP=px!,&N~{ |Oh7:A!L.h?_9a~)RC 9wASj24\tJq5'?,\;~ ӊ%G08ۖOR*}:OpfD {`86Atls~*Y`"'9 O \\˳+سl=NhՃĔp1!@S֓aZ7LJvvsSǮ:8qw`4|ĔnvFhֽL;XG*̨2le0/JKy *VBd_8)ɢ5~ f~w\9C7%[jyIߡK13Dg:T%ˣ`2D< KTDw*-+a䎍M u8^.HiQ(ѡ=g<9 p祼Q;sxG-Pq@kcW;nr IㅰrT_MzN{& M54issȤ _fs3~M?SŒ1Ѥ \ʸR@l5KW^l(ٗД՝Ν= E 8}'f,oޝe5]!Bf?҂qS6qȹѪws*~`ʔ)SN=OW-ʋ!bܴ85K.9`ɿ,Xzآ[x@}MK}CSZ|׸J7]ԙGVyqRWgvk'm$3.UˠUmyŋZ`@w_GIxa%Įm@ZVdjViϽ虿SD_n𗒅vTKzwN DʜX#񋒅'8\/[}͚5cǎ/J#R=p/'}/5 q5'~QĈjVA|;/ a;Vm:4; A[%+VSwEwʹ|= Jvnnqdh>c0Z "7("D@@  PE /@|"@ _("D@@  PE /@|"@ _("D@@  PE @aف¢EGGGFFZ֡ZBHHHFFFWW_!踌3߼,_zΟ?ծ?>_̜9_^3fΙ3_#"+1}ݷr˥XxGo:#߯⺂z9X,Pp`2W'Lp뭷t+Vb^4i/egyfҤIUUU{g̘^Gue.\x޼yv[qqqqq?O򥜜7vvv %%%d;ܰaZ/-[pB/|R>Nz'>>o/Ҷm0 #W\OnݺuժU4-<<;RdZ`lܸ1++7|L)qrYf7o޼y;Ch^y啡/{6m?2ld{~~;iӦNm6O/_a؋/Ho6O~ݻw@PnvHKK{',Yr Xlto*,,j'gv84m@ 2_OD_~{|\YYNnn^ȧ#22S鹹7n^XXhJJJ|t~ܸqp8>G /\aZ;F>P(Ηzzzv;8--^jK/eڛL:D>u|333t3/}@ ޹Wx- F :#@ 3fg}rYYT*ꫯ|qqJJ8.J>SL)++#j4a;?#H[Ξ=`0 55jkkm6w!L&X<_ZQQsN/Ǚ3g7|ŋ=unjj2vH$z9~̙Ng\.I9<<\ @eeyD"=STTd۝Lmۜ6\}Ǐ+i]]]W~9E"{Ə_SSsɐzb 5o477[^x?>rȑ#G-Zej_|ŋ kk׮%7}7wޱc_{{FFFV~[}zɒ%{oGG@ z'to#&$e@*얖g 007Vw,1 hK$RvO1ɌjiiI J{{{];geemٲ%==d z`^ZV]6о (sEP>c4E >fP=_("D@@ u|D_ϤeJx\T @\.+f^ k%ݜCVԂo}b&mb0^ GL*n ?VW)u hصNaق;* #+Z;+S/m:֥"[Ώ;ѭ2XgEIYKv/']"2iu%Mj XTقP>ajÿJX7=׏U T:02i264fX;/8:(2%Zo9Zc0_uR[[;ޛ0yh{4xnl0X4 Ȋ):孇;YQ:StfX_ѺU 26]Rp |{L,L 2}RB~ OLccbCZS\=A\!L onBhJ<.8)lWsF%)1Zx^ǧ[v憆,J Ѩyqrw4*[ޤ@k$oZlUύSHIzs`ٛl)_iViقR&#Qɔ~k7@&m߾=**bPGrb8Qq2S *E?ѭ'żN5+Mw7ar.sAB6e`Vwg8 rF]FuD~hs [j-MT G/Nu̇ڕ"E2؈QD3߃.'NfHVlP5?7C;֥+-boKߡ~yӂc]TGo:hPsc_j[uܥj''U%=dw`G\{ョe9?)S>xd2]ԔxhWjڸ,#v@G΅T#eK}rOeuB3;VzcdsM'L_U٧F8g1isiR>I1=FnD!3ϴ<#RzaXuk]F{ fƣSi8g5Zt&r%헦Ü 2K 4 IDAT[ jp@(+W.]tĉQߺ[ov~e!IpuuKs-vnjXɊysv6**`sf>r.4& ZWUPӯ{pWOpG|ݢ8?\:MkSpTjEW|;,J {Mj_2((M* FUUժU_|)n;t nsyTxKOСYϗs壙KPp~d%cFh-vOFIa ИYR^Yh1_՘m8a ڭVƦc>\b\O".+ajw e3v;DĤla^`PPKgy)As~N_^zI,\ \?N5 6.[HE4(푖~ĨlwjZ賂)S #q=D9_WTzqdED@2eSNUCp:!gq/@|"naDY&}åQx,H`޼yrgϞe0in N8J׹נbVQ^6>+kMCEEDp }:pnh„ >eeeǏQc/~hD'&&Ⲳlٲ3fbϼib)7>9?L!)w<0Y]pbcAG%yc)8~ߣQ:s+ڵk׮]"hn DUɂ$[ʻ?3Jal(oת$c{3"sCCU78S9RXig47 IqgIsd| vD[fr_ޜ:#Vʢ/!OܒvKrAԙv4lGuF,b;JoL97wzD* 05mۛ@=~𿦳 ;? xD(@Kma>Ek9ȋ%8Bfm>S,p,U0ݩz0#VCU'ɢ*#KR7KH] n$I% 6o{׮]wwhBܠ(a>W!:^X>Qjce^m[S? TEWg/\!S\N>6{U6m(;D8XdhQ^  .)X~ISޜ ~.gQqGM>BEYds<|nlIrЏO7t1b([;GU r B~Cdp w)T5u6r804('8mz-u:!񂊱Q|&tdm)[j6!2p H}P=:m=zNxlL>;•˭d᝞NUٞqe/Mg'֤{{ԵW* o#a]F-Upˁ680[2-Z,eћF/1i& :t&>;V ȋcӌa4*fzJȾ*ֹx;MQa0|<.1Ta32\~PYWVŸwfÔ,.J0\XEct >""bz qe˖]v ;d1 8\R6qYĕWpz.w>iv ;% H@oʢE6m49HK(lv#o@,"gx⢢"qaa 5E \4iL&s>=ydkkkq]wm!'''!|iJkJ h@\?@ _!Iq:ӈ6H .Q(Y\)3XL=:N0jv#Z{#RLJ 氻tm/L.;nuXX؂ Z~2NP)|5I֝nN .˖-#¹>THBCܜ9{awt$R~]uhNnZbzYX7==~G% 6O9^wp/8] ⌟[;_V^hDJo_>Q`0i>s?ߧS@=''mmm#ӧO~'A|],J']"2iu%Mj~=ө7Xߓ.fKz=4<+V4%\Ƣ7 ;{ZbA;^.4컚{<:)BT3폍kO;"y1|lнZ|%  [ɂB9\fT&י6Egh!U| Tv^+>9Lկ' V,-ӠY+#P\@  ܶuvh:mBɷK#S|\槧[VƓ7FΉvqYfiZR~Ic}Oy7?AhNJjuYR>{2 cE,_pi?ݐ@LZ~3mwz8'YmxDC  Ŷm~K*+ĖnqN֘8|`2X_] zj^-Y㊕ټ V܉JܕP{?|XڼiApA(2x61MeS)r.L)4{ +Ӳ]ͽ|.0Y9'|qv@uߓ,Ğ(|y}t1^c$ikRKeAL@,oe:۔Cߗ~ח~/C=ܘqS֯=ԾvO :+p& '&uwt*mV;K f*7UuJT)4泜E{.)Aiי\fwJi.ݳO$ţSu mdܓDbwT+C|YC+׮5~U5wz)(%[d >>>8dt҉'& 2;=oaPp]=aR)FY[Rmyм8iY.՝iܘ di*Y |A5 D8|֠7zS{/vٚ%JˤIBNDjG%S1cJos8nbܓN)A:))?iϿU?pp7Bg-.`76mTTT"ohS,OKFE٧h5haȋxw6*FwLʍ6~ns8DJooߪ5E~Z֛T\ʢiMn{2RޫioMZ¦RƇxcEG;0VGcѢE eX#N-[ <999=02~Dv)4vDZIImSF + N(duUG(lfsב]g"Oujh| fe[:lgm;y*?ɼ]ͽltjٿOj^.Wi?(m2"i4<գ>sm+Y9&L:uΝ;~a;˼ $JJHɂMTzx(;zIr7ܱ r=zP%M;fCc# Yl*;$R*T}^~ B O^>}5kƎ;1x4/P`{m'N9Ɲ+~{AmWdTxFѣv}qqq+V -$x4@Upи(,,\lobh4Ç;&v+;v@ 넫o@\@ _{1ia!u6%? j~!CІ\(i"Ж)Qb:{@ .%IB7q&GW$ڬM/3~g䴸U(SEO,KX=1r?O#?\/[&V;Yq(?i[5?,Ȼ4h&(l%z/l@\EQd)-ˌ|`p{%MgݛҨҿuAa&3,*`;f[@vtjMoo ?=!BDP7P֪5E:N.0h9Zcɔ(qUUqy}ʏN5ɸA !sH}4wv4GƧ T9zY@^hXύ 9Oa6M,Ն!lLJ~]|{|ѯ%)dh(NJZl9T_DvpGͶg¹ -87wrhVt܍ss+Lv5]J'oh]@Oi8zQjYEUbYrD$gնgABh8/OH L6P$4~IӁ63n;]̣} aPSDܗ'8_M7FKF]' 8l!,֮];Ĭd^,ى@\wA7'^F10 ֕4*6 0: zw5,[ R;T)k ͎G:h|1u ||HbCXѸ_ŷ5͘%+{roe#W FE~h9߹)N[,0*m'bWޜ ۣxHIsTzZ RnեV͠P?ө^ai8*hYj'n )Y֦Ҧ{vԙs9E 3KTH!L8׋RRDlP=خҨl<Ц'fKyQE,Ŵhib. ayyG4Yʉ!dlAz~r(A/ ;}`?}v@O${2ޠ2iYR:f+ aPWűFJj Xh8tO?w^NWTTG]4Gp Îf2۶ms3D .(J ΛYĞ>Xԭ+iZ5>i1玙#6l4?o󂼕p~Y:ֹIKc=:AaQ֛?e'[X4ʖ3b/QD3֛ ~Y: "rdm YǣS_-#Vf;Ywk|աZ2ו4Mo\c99,}{0n-CPtB*Y>jݢ sr>ޥ|if@Oh#JJH8 {!Ƥ]Spi&w\!6`' 1>>BHp]ɸIwi{ыҸI۲0# e26Qep-oe˖t?+Cpk[Gt:Ў,?ЪlP cb:N5ک`0V^V׮]h_d+ =IDAT nFˈ.+彚Y I|tJ\hFFZZZuuW_}hGрfh @ PE /@| YC8A^D; $\f8L Yn!W1A|όrD.' W eF,Lb)\8#U~ː=ȊZz5LLaQ'3w.DnlA ;xp{nI.h+ßV^FŖ"9%G}s%0% 'RQ2cCyV%xSti\ȤVו42n,øpT~oM~Oա3uLgF،[d2H9RXig47Տ<w[eϊ69C'n.`v(Je6.ό  ͽΞntq͡4ZV&(,N+fڙ|UA)YĆ+LKkss HG|QٶrNN#;UjkȟF!UX^GXaAgZzW$0' HrLN5ו4Vi]2|!6}C4&ri/=)\ܒpNtqfl<9ߚ. I.,KJ?ѭJ83 % ݖfdsY 0% I*T;=2<;+-boKYM Ɔ xwP, C?uW ^s&$ϏM٨L0 ߙ#YAe8 Xʓq 26׎-iуj&zMj' K A)9R~q@ lTTi 6h8gjFK\I ^\է|0gC>wd'u'{ fƣS=p&/^H3dauoӁ;O AJk H-2Wms#UXǥQ?00n|3^6?%86KPPH\:MkdܓE]ݯ3;z#𻒅lI1'NvўUAp|}Aok,WZ&Or:u! eNtZd:h茻dPqgm)Q7pA4 ;.H 8 )VDpDո-.E76mTTTK% WA 3ĵB_RɢW{uUG(lfsaNܷ`+)#cb9wNomiMk+|b(I+m%JEV-O &뿾-}pQ_5c{ 0@\ d78_Qq:rTz>("D@@  PE /@|"@ _("D@@ krD9IENDB`ruby-prawn-1.0.0~rc2.orig/www/media/images.png0000644000000000000000000006612112114176157017751 0ustar rootrootPNG  IHDR#qPGiCCPICC ProfilexkTW?wڱhR40 L2KQ3Y޼wgsޏ{w&qAQ*EXpBm(YA0 &ֺNFe\ )A\/s9\y`)g q)c1o3JDMV*6#{e<^#w,iM@||>:8``' ,oݸ7]~ԇUIq:L e3J2'!c%/Q߽~w.`g@ӊOVӞy6g 22ȶ3C +unP^f+n߆~0F94Y;@,l-I6={˱J@u-7Dxh"y.1M#&"$KTXXyJf?U JHaC_xn)8?ieмk^70!$D`㦝yU >SxøO ob³W\H0o۽~]mL*Ke7fBp8b-{ǁ= IDATxw|TU;fjڤR w"" ݵ. EB%&B 6d&d̤3Ϝ{sϙϩσ|3p, ؂Y 4c fi00000 (`˺Uf sq:9 l#tH#ӉF`>lzcͻۋ]S:qd`iRbSX))d#}@dג"LJ@[G.2B/YdG}iӦ욚xjD Xj]rs,jME}q_"nzH"y~# ~dN8>ǸZgNq:aOb,j ~'*ZG%w=S %//oGrPvBƐ+'.^,}{'?~X{g뤸I\+/?r K]Ck.ȰYrT*-**bzkѢE۷o|`@]rXUJK7ߦdd&u0Lf;otUENΜ?YX7J;~50F?~}QttK/y, NI'47{ ;$E8u012)*(D$}@]c<\<5H,Z6$k11LV^qv~Y) +=칟L&'M)Y<Փ;Ҵwѫc=ܸ|J--l풧x: [%gK%V{aTic|}%ʓ?gg\ܹ^>8JAq4v1YTPڝ!bſzj&ōg*mhw:SIs|lATzÇYUJ 9>I.\Q _t+` rcoAdޮRDgwN {>3QQ DKIrbXSdW h$javG+**, ˦;>yw[%#Jٔ&q:vu .#> L==R\,vKn!:T7#|_>BìJQԜ̜??sηz|$"B1d"~ӒpZcteCAvPT_Rxc'|Χpd \].\->udCk3$""@ T۪yM&"""ý8N59D&&,& |b#':.lqS4 .}ﱯ p92h 4 D)j|CkC_y͛A"B$\=xY~[udns}3d"*J/5lⲵT*ht JQx<Ճ7qzo FC1/ gؐ/-'|Ǎͯqq#yh\Y£w(t>y@!L5.m 1xx;/ڑSIwEl:G QjEfW'p:x*mUh8d9<_z ވdQrjf{;r< 1 E&zi8gEQ7㬨n0&&&33駟ᆱI8vASZ`sewFl;ޕI$%H7;fc<^׭r{'8l%7:Ix5Dcq8GyTͶ?sB IQ.~Hk&SUGrf~*5h6<w5qNmSms{YSzNKS+F't7t;xl=^%rwv'<6go(G֭[whQkrJ ;H 7f˘05= gu64 t:ud2[~/p8>D윒{E[^C:AON}l~ogk֬ h4,)ܹرcE}W񩩩* ýjժyeff.[l_}>""bΜ9:'*ylvjjh$رcǎ۵kT*}wZa"##ϝ;7=4vA#xY]=xN$[]sr1ocӦ<ᬊc& N n\(zvL-5p?׌#L8=Y[QrlpHD'U ?qb -ׇԕ.qBţ*ǒ&̎sbh|*ȅI"]f$2IE]H,ke3Y@$yySEPN];Ό5j#{X$$$dddf B hllDm۷?TJR **JV/^x@ t:L6M&Jo޼i4iZa8SEE/Eyuh4Ԛ&4:hwLEbwVZvn3CR-j޽;k,tJMM{gBۦ,k_;S dBX$8SmC2luX$Kʤ2Il(׽j3Q)V 8Ax|```~?L}~b+[3v +E,":MAv liZ~:R=@K=Ҩ^`0jjQ!X1g~Y>Hu屸NGJ48(L:h2vuwyxjtg4 W)L$hۄ@vP{DpҖBpfa\)6QkIe[B{GQhh2X,<_TTeee.\01o 3{ⲲvYYYmm9}[[OF"鹯~ }mZa$L&ψQ){++`l󒉓ХzJ#I rmb^opxٌ kf,RkOo6H$_6luo |_nB+AqHX!VFhAI)5L;_M?X^7m^FTFG8qڵ뭷zgRHZ @g28@ÎJڻQ94m<krݫMDITfģmktR֝ŨdJpDA6A#`@3x**Sx؉C,F))AHhoK7;$t*ݞc/d2uvwzSrz;Hd[L!ʥ%UŶSEՐIC͓̞{hUD"^ϯWN,x˪=@ϸy)=ƥϾݶNw)"߶+JAJ,uyCBv^u例;wޝSZZvtt?vpp{X,p/^Nծ^o-((0L~}ϟ?ڳy̙ggg ٳg(|ɍ7\PxwkjW⼏ϋ)i42@a㼏̍(w^~H @Q#B:<'J$sh(KUzS96gy;\5{+L;4;wW&Ji Ƌ£eKZR?6}0N:+Vܽ{w 29sD~;ԇU(t/rkpxN]aqC`y/V/`Pۻszgvݫy%{ߌpHNU(jPiL GFky`mI]'ߟ.z̩i7cT0L|%,2PRݱA, 2*HDhuFsqqoMn hqLl^p *C.Oݲh( \6WV-;rpp qqqBr--VGTTH$F0&::ȑ#|oPE"hx*d2~n>ͥw}Wشޭ> &奝J?s<G 5?:K _oYy'Bc0PJȥ:x|^̊3yc$<&͓-O[5KC̷3- T`>ZL`~Ai?ѩVۭ#k50 DB0(r^CG:]5[(QGW_?>3j浛CT-fCgD&h_7CN$։B Rg1F,:#=oˏ9rԩ.t cZlYlllCCCffY&L&Q#$=n׈}1`lS5k֌H\Bt}߻MJY}EWdIv^? T(顱qڴi?lL1`i00000`````-[<ܹsxd}|G;D$`SdҵԀ88'L I(C_ ;^o?mdeFEI IDATS_rnkk T*hCzZ+G[k,ZL';qrŧ6qtfJlo_k/2HyCQ}oX'C"\wuyϓ?$(,:o[ZD"㍃igxMJ@.w:څ.d.q]xO*ugO:"jkWh& wnϬ߿K7`ٚ3|`nWFQ1?ogbX(IU}R'.|:8i*HH:&Iҥ$Bb 4VZnݪUytci&˖-={D"9}4dÆ 6lxuuu>x,[_ښeEMP[٦V~뛋 qbNm(%yvC'TB%u E]BRu+,[%Is!v Jc{/I],,o񌥨 p72XJ%eqR.ﬥ y2IwG~ݭzba뫅}57o`NIA?~s?q'i/?|A/L&vWZ^Ҍ 4jݍ E1*Ĕ@@f `^AoCn숂{5PS呝Q 7nXXa2:;"78,<=[$M/1Ճ_ZHqPစѱ4 9JR(k7bbb ==Bܜ~СAx8,MdϑnpLh63'u~n Nj,7yA{g̋w w@S[g?OF,X @d2t^Qv]s^G6gdcc^yQ^OӜ\:b0jjQK oSO!WN+k6<E|*TJ+8<('bn='bQ!>72Xy ͓Vm^닻}Myۀ5F)?ƼZuUBã DK 8\y^{u9}cܽ]ygO<`Nz|[TTeΌjtX/ kinY} jjj)$$$//2yT*+Wܸqʕ+y#GXfn?XfowvstF 2~<ڽ_~v^ߟv/\`~\ͺ9R6h4RKu BhFNP)"[*+"ҮqϘFx8&3LåY_S]' @P^ upd2ݹR(R˺.@өln3&q3mͷߢPM)-(]߲3FNXϿ݀/]8>;H2Ggv^#hPJmR܂T4OBZIxM Cq8\[ݙ"l<(׈|is"bz7\9oa.AQ$U åal(_c~ʔ)ŶBR 5gWZ￟0a޽{y b- {kb밊Tq;7JvA_xgۡoBQ?$y8JR73 ֳC, kkno"~~fK3 J7(@քDEDEPi4=ko8h;9 t: C8)y&C{2?n1|+}o =Bpvx;/Qude23zOT:\e ޳H9n?DL-DwkBeݪK|r^Ќ Ŋ2}ghc%j|ȀJG0bO1:̙3'22>{ܸq_~ecc#-9s{jSG.ynh5:{GVͲV/?+j*ZSkzAti88 ܜO_!ѩtw:5ךTU_n^>|]T-~;6@ x;qw%]]~A pwcz!=|FcG{Ϫ HizJqpv7!ڹ!Ŝ֨տ_>\] 2g̋}tk/[$.Gŝ;{I\Hf~w d2ɅkhkxoO_GшPpy{?؅Dxu=gcRcD$B\)tz`0)I/ 1V(֋j4Tҟ\,p\љ=UTUUU[n-)DyM4~ӧOO0ѣr|ӦMC#Ko߾Jjggw}Wz_ %D宽K7,*֦])!ܼJy1_w_#ĢnyD&J_,PI3UP/Ct:[{KOVmk~AopШRų_>}N.홁A˽t4~' z[~Z}U x?a-:jF0.Vro s&J=ygR5ϪŦݻmZj<_TjNu;St.?$LMZz%q/y׿8šSVڗg]9s۲cn{7n"9*AɁ:B%u#ߥwkQ2L&1"V٫.U-'~h${!Wa=RD*jQas"bpWBk0PZuuzŹOG,må$Ebh7uvdʾ[zÀ㤾BT괰`qv6uΉ)g[St;=`0Sꪄ}wf/̠J1wF޹sg4ݻ`kuL zY\(~7Uy8K}("Ճ/RU o|05CU"rKIBOy"gln|&vg:=tvaFK)c cl, ؂Y e̝;ʕ+6k&n|gCB繵$JbYNPMs};ssÒ \5̜d:9xIo4YҥK1;$(EJ7=@x}c:MZZZZZڑ#GYnݺK׮]x}ٵkl6~ѣgΜY|9z /\p`TwǏ( IKKc2[l>y򤳳3$%%裏,.tÆ wܩrڵkG\9lQB{*i]7315đFM!q@#8q∋jAM2}Uf~.k':0ǑMeٞSi\љ3i6Fx2P] 2yc,SCIJPH 9I.Tb홟M><'j;oeAZQiS 0 fؚfp. 4 Nm۶-[8qbΝD"58n߾}ɻwCBB }dr|Ϟ=6Jb-hMM޽{߿ZkJG1AqZq?8EKyL2G#-ևC!8+ }Qnm۶>}?s_L i~nQ[jC]8D ~{wpkߌY#|q. g(O%}4_Aom<&Q_p,"NmɢsUrNj j60{6`lMRRR; /,^޽{f45k#""Pǚfk׮Ed&飏>q㆛[c-0]pJ&&&MiM&kšO0IM@荪f~%u%%%EFFZ/]xիWhqh7 O-׊k2Q?*S59Ipힽ\x$Dn{hRюOR5)kn#_?47TōIix /`PJ:d,&y@#ms vavCF!+]]J+NFMU)g9qFǏ7 WgnnE℄ |~4-ZS:RGp{{m?jooo!D8p_}饗._|/B/0u)Ez~L7q8ii˅v$ STϣ_J@d<`2錦J&BpXiJ\ 3R:ntaP.m&a ;_#,hFMmToS 3FA۷o{cn=:C|l6 cfԚa.l( d]vxud?|jTz aХ9[bNUuk!<WFtd)O'%gVnH̱cZ x|h](| rfPZǪeʺ^;I#l\0*m:jqb`1417SRR PƍiAZS @ᇗ^zw9yh!yvbe+C@ӈC?3X7o|Y<bŊ[fff jI"UZx)QI: pʴ&+[w[z6byhM Yt*o(gG"HPjhΞL!1ܝ f80(ݸ{@Co;kJG֦#PRR駟x}t ,YDVӧOO>=!!.\ FP /~&pfID1ѕ"f{;D; FwA~:$&/LիWMvڵUV#63Q=Q\yN٭h*"h#"?[ާXBB¥KbccяzI3/Nr^7@A #[FvְP:(yo%`$hjH$ueRJ[z% W&%aӶ'99ƨjAb`9#Gŝ;w륗^JNNF?ݻw䔖]6==]{7kRiggw]Ű488`6f‚v\8gNHVnkW⼏ϋ)i42 :ō&w22GR3K.ݱc۷5,v&#:|@Q*wߤL ZWCBB֯_c;TO Ԧмzṱ1t(ɮdW~j`\茦Yk7͌J(K R _֎szy}mg`b`'j4*  .Ż755xdd@)4,,? >lZmҢȡ͆8G:Us\<Ӌ-Zp܁Frk$Jq*If9Dzcm۶A҉x/MXxj9|g]]]L(0."dځr )ƨgӠtttXHvڕVRRoنQ[m7,ۦ4ZlYlllCCCffW_}5LtJFCIFFF_6|RRRzQ*W555H?A)[4c fi00000`````-[0K1`cl, ؂Y 4c fi00000`````-[0K1`cl, ؂Y 4c fi00000`````-[0K1i4(fbBBBZ[[͒s644Q28<N*Q: T:Y) *'!1 ~[9օ|\ °c'd\P;ӎi#F"zB%: زnBiPSa42tX^o0=Z*WF7==xBq=N0ʖ&!!᫯oЏNNNNvZ_X;95,;bqNvyI9KK2aCY7v F_[!۸$F$EG;k F'Džxw:2 3)7fiKV L6`TT@ygF'ƣ/hmjFd+[#xK%꘹h'Rz5h5ZO q]:wj!_Q_#x{/\x7F%0/?NlgiG]iJUy_9ehebnVEm3*ۥЂLqqp\߶̨(ir/|*1z.B?w-V(_[k,ZL';qrŧ2Kvb&>  \>{4oP kdV3 ds9>=OjC{moi%T:3Zo_~T)U[GE3^ OBCGDmJͤtwi2,[3qƼ_FO 57tv&RT'u< CRD_>o4mt`i#Ndt)$K񸋃1挎~' o6m7ҥK}Y@PVVvȑ'N@@@֭['LPZZua?)l,.+j6Z^[\ H@붷8t*n\F/)_ϳ·J.r|WX V;7J9yD{}86./d4lhǰ}#+064Й`?9qGcT6}1BAyAom(m;'ޔ5K.Ԩ5щ$2~vopҐT"{t:N"1gQ%]5)[Z[Zm+YqAt)T5Ⱥ}Ҩ.qg; r)ί88qH80WRjk ڱi4ٱ{n>EI  O+)]Tɟ9,Y=Ybe'W /Ȝ G8ZdB)5ԎM~L:~0 cޝj\"뭩?(>rBرcGZZ< o6&&L&Mjժ?p߾} .~[5苲p]~+/ml 4:#@%ֲn7{mΟ*~ٵ64"~<9??DҥKqq+b JݴiG}+W0l:kffq-j y;4`i^*V^4-<+z՛-<#V51^R{K߽M6r _lvIB96űCyXKCPap8/^4GGGK$?j=<4 w ~ݼ yC+l`aV):{-/(6 @ը* l0-'gfG.|SǾUt&uG5MCm]@H0ni@2 &$'%͘JR3K G& rɤЈe&gFx?z?Dž$qƼ' n"TWcR8og\\o+zO_n6uJm_Z*=}yC<^u둤#ӰWRPՓ_ˬٕ 댝1>\wOOخ^7ovX#/DRLIg&o6 @ѪTj2hmCW# Q!FgPQGoٲŚƬ"@w/ :2Nqpd}u}=}WoK5\q.^)֘_,kuZ2 x5(UJL]"Li$d:Fج-n^5w+_p Uj+Owt:]^VL"IY0zfx`*f(ӎj-r 57^B'MZ^RfM䐈X=~s L(§)8\{"PW" .幸;tu}E\\9Ń<@as6I_OjXV9ߍs?L_XLh{[?ܿ)!FM:D0q]X dyXES 1~sk0fmC.M ֮]k_^^RNKJJ\7|3/F<;5Dy7ˋM8Kg*)̭ @"ȹw駼x;RX0Cqwq ljoΈܛךۛH$RW{oh4rٹ*CrEXt$`u|zg:y.0vJ]859}'gO~} qpbiGJ%>i0 v4o I3&42<1Y򓦅5#Z1z'S)v=K©✋ ^8%<$z%UlX {\qoۍV5Y0i!wed%K8::~'0Yk(SN+`0̙33f̈{{ Z2yܸ=-;J¾UQ[8S\[j8T1 S)Gcݕ6pƢN& ]].:= ~ldW%_Ng0&Lda7֑H$Nv䫴#_8|' $<ٱ^Z]oVId26*s &% &%\r j؄ 5Jc+s̻&1=bR`RgPzqtH9`vwSd w@[K_x=E-*)*oo ug¢<#b*زbap:8"zJl?.ݝ*Xv)gn(5v#ˊ^pw0qr+#s$qD1B?xRZmU=_";ؼy֭[WXsݻwt'Nz]vedd( voś6mϥR}qq7)T![1V5=bwB=Ny.r^:Lv?:{;EbQ@TW{HC7)3V}+ÑBooi T*mkV IeN\3?HAl ^RPt3j~QvZp|RҲW_w*1nRI~a)?|s\߆{㍼ցnl P4uvdli0|UP7yR̉|g}\~{rLLy9o}WW6[Vj̚@gê9+:<_:oSko;qo_<_b^/˹G"ͺ;)2pRRcj s JL/ωk}aq blA[A ؂, @ ƖGf޼yrC{l??b% z2i$ˆ .( Qժo&J/qSNuv1%đE"`,h?!>,55pY%wޘfsɶN4rZ9qqqk֬1$'z?sEu`G!nO a3ܳa.Y\ :9"<b%_z饂_YjO%804\{G4v\7|%JvMz_ޢX^ Gci~95mp~ir}Ə>X 돴 hRpIG[YL2__J6!a3V0ҽ{Zb0|t >0±khL.H; I}-5!#4skZJ,,Yd۶m .#?9sD"ѱcplٲ*rS^^#i411wPa4m)))ZlǎգPj ドA*aKsw`&Skv\n*x F"7x {t۰ L<9;;{tM5V$-l{8/Ε 3:y~.ʛ#^_7~lJsZXM_BN"bO0HXX+H. r)"ϵʘP:y;v@IH/|>f; HG  Fll,lܸq'OܶmLO$JJJڳgΝ;𵑑ⴘn 1)Ѩ 6YOjh<&xQL>I p`)k43Q5bnMqrrrBBÇ FHHȺu.\XPPF+V T(`fD8JжsӦMKJJjmmiJmjzv q^(4UE:yC܏CL.\Xp/xk׮رamoﶸ2<5yLoKkER*y@~u[h7h5'?6Ph/_(Ű26!~ό{& N sss G5DIxx_|a!=߈rq"(nLґaX3p_˜>}3G$޽iժU?G@֞i{i'ULXSUm":̉# ލrash]O$g>%I_P:vJGAIg\f 'IDATʟo1mMW?: _3hLYd"UJoQ'il&^^^m۶Gn޼Zu W+-w[rm14!\.\RR +/aĈrq4͛7?l聿ʈV-^sHHTj8Jn?Dvx7]6ҎB)n؉NQi\{R4bWolީaϞ*Ԙ])S+~S޼5>y5}V+|6ԜnKd \wwwNsvv޸q9s8p hF|u SHi3ygܹsgaaa111vurr3fx-gD8G4''}֭x Ji4ӧ_{a~_>IRPTI&{89FP_ LQZ}śqӧ_t)%%eٲeڨL4OU̝EoYevJ#bس+݆ .ٮYՉU!Q@TK՚)o}1㭝y3wa.L2z媦BVн8ȍϤDgGcjx,,©cMP^K.⤤ ٍ=ʤٺb w&bˑby ~<9InM?~\ O===6lHJJ ;wܳgOaaayyʕ+u2hhhP(,))ygwҥb1@Xreww g񡡡T*Brd=P9po0ց[o |ǖw\p 0bۍ+73([,^x˖-C661 z*75]uLY#O{z8Ni((qzǦqqqO??#""<<LgXktGF؁0Gaē4\~}ɒ%qqq ׮]ۿneBBB***(X#ܿYa۷߼5 +V{E ~Ϡ[P~@- blA@ c#4,:9։@ _5y;牏N@Ag[,r_>;,*W :zzNqKxpҬ"Zގ) >\".@<?\3i@|\i\Lpv|/h.Z\w8a#ⷉK3?`EuGΔ:8"{UP)D3x!ziKn(|gu!׃ճ`oGBvq4Rչ82ڻ%p.vM5ZRC%$BWkg+‚cPZ$'( $՞D$'D~@`T6:QV;I-i"aKg#? @ 0R?m?t8O.nbRfQ-L5@ ! CE]m]/W4t2rվo_JqCxLel0@ ~ewbvHHE&(dD6LP= blAb[A ؂, @ di1 K@ Y@- blA@ c 4[A  IENDB`ruby-prawn-1.0.0~rc2.orig/www/media/fancy_table.pdf0000644000000000000000000001146712114176157020743 0ustar rootroot%PDF-1.3 1 0 obj << /Creator /Producer >> endobj 2 0 obj << /Count 1 /Kids [5 0 R] /Type /Pages >> endobj 3 0 obj << /Pages 2 0 R /Type /Catalog >> endobj 4 0 obj << /Length 4147 >> stream 0.000 0.000 0.000 rg 0.000 0.000 0.000 RG q 1.000 1.000 1.000 rg 185.048 732.628 85.688 22.872 re f 0.000 0.000 0.000 rg 1 w 184.548 756.500 m 184.548 731.628 l S 271.236 756.500 m 271.236 731.628 l S 185.048 756.000 m 270.736 756.000 l S 184.548 732.128 m 271.236 732.128 l S 1 w BT /F1 12 Tf 187.548 739.612 Td [<4e616d65>] TJ ET 1.000 1.000 1.000 rg 271.736 732.628 155.216 22.872 re f 0.000 0.000 0.000 rg 1 w 271.236 756.500 m 271.236 731.628 l S 427.452 756.500 m 427.452 731.628 l S 271.736 756.000 m 426.952 756.000 l S 271.236 732.128 m 427.452 732.128 l S 1 w BT /F1 12 Tf 274.236 739.612 Td [<456d61696c>] TJ ET 1.000 1.000 0.000 rg 185.048 707.256 85.688 24.372 re f 0.000 0.000 0.000 rg 1 w 184.548 732.628 m 184.548 707.756 l S 271.236 732.628 m 271.236 707.756 l S 1 w BT /F1 12 Tf 187.548 715.74 Td [<477265676f72> -30 <792042726f> 15 <776e>] TJ ET 1.000 1.000 0.000 rg 271.736 707.256 155.216 24.372 re f 0.000 0.000 0.000 rg 1 w 271.236 732.628 m 271.236 707.756 l S 427.452 732.628 m 427.452 707.756 l S 1 w BT /F1 12 Tf 274.236 715.74 Td [<67> 10 <7265676f72> -30 <79> 100 <2e742e62726f> 15 <776e40676d61696c2e636f6d>] TJ ET 1.000 1.000 1.000 rg 185.048 683.384 85.688 24.372 re f 0.000 0.000 0.000 rg 1 w 184.548 708.756 m 184.548 683.884 l S 271.236 708.756 m 271.236 683.884 l S 1 w BT /F1 12 Tf 187.548 691.868 Td [<4a> 20 <616d6573204865616c79>] TJ ET 1.000 1.000 1.000 rg 271.736 683.384 155.216 24.372 re f 0.000 0.000 0.000 rg 1 w 271.236 708.756 m 271.236 683.884 l S 427.452 708.756 m 427.452 683.884 l S 1 w BT /F1 12 Tf 274.236 691.868 Td [<6a696d6d> 15 <794064656566> 30 <612e636f6d>] TJ ET 1.000 1.000 0.000 rg 185.048 659.512 85.688 24.372 re f 0.000 0.000 0.000 rg 1 w 184.548 684.884 m 184.548 660.012 l S 271.236 684.884 m 271.236 660.012 l S 1 w BT /F1 12 Tf 187.548 667.996 Td [<526f73732050> 50 <65726f74>] TJ ET 1.000 1.000 0.000 rg 271.736 659.512 155.216 24.372 re f 0.000 0.000 0.000 rg 1 w 271.236 684.884 m 271.236 660.012 l S 427.452 684.884 m 427.452 660.012 l S 1 w BT /F1 12 Tf 274.236 667.996 Td [<726f7373406d61696c696e61746f72> 50 <2e636f6d>] TJ ET 1.000 1.000 1.000 rg 185.048 635.640 85.688 24.372 re f 0.000 0.000 0.000 rg 1 w 184.548 661.012 m 184.548 636.140 l S 271.236 661.012 m 271.236 636.140 l S 1 w BT /F1 12 Tf 187.548 644.124 Td [<416c20476f7265>] TJ ET 1.000 1.000 1.000 rg 271.736 635.640 155.216 24.372 re f 0.000 0.000 0.000 rg 1 w 271.236 661.012 m 271.236 636.140 l S 427.452 661.012 m 427.452 636.140 l S 1 w BT /F1 12 Tf 274.236 644.124 Td [<616c406d61696c696e61746f72> 50 <2e636f6d>] TJ ET 1.000 1.000 0.000 rg 185.048 613.268 85.688 22.872 re f 0.000 0.000 0.000 rg 1 w 184.548 637.140 m 184.548 612.268 l S 271.236 637.140 m 271.236 612.268 l S 184.548 612.768 m 271.236 612.768 l S 1 w BT /F1 12 Tf 187.548 620.252 Td [<52616c7068204e61646572>] TJ ET 1.000 1.000 0.000 rg 271.736 613.268 155.216 22.872 re f 0.000 0.000 0.000 rg 1 w 271.236 637.140 m 271.236 612.268 l S 427.452 637.140 m 427.452 612.268 l S 271.236 612.768 m 427.452 612.768 l S 1 w BT /F1 12 Tf 274.236 620.252 Td [<72> 10 <616c7068406d61696c696e61746f72> 50 <2e636f6d>] TJ ET Q endstream endobj 5 0 obj << /Resources << /Font << /F1 7 0 R >> >> /Parent 2 0 R /ProcSet 6 0 R /MediaBox [0 0 612.0 792.0] /Contents 4 0 R /Type /Page >> endobj 6 0 obj [/PDF /Text] endobj 7 0 obj << /Subtype /Type1 /Encoding /MacRomanEncoding /Type /Font /BaseFont /Helvetica >> endobj xref 0 8 0000000000 65535 f 0000000014 00000 n 0000000108 00000 n 0000000165 00000 n 0000000214 00000 n 0000004413 00000 n 0000004558 00000 n 0000004586 00000 n trailer << /Size 8 /Root 3 0 R /Info 1 0 R >> startxref 4684 %%EOFruby-prawn-1.0.0~rc2.orig/www/media/prawn_logo.png0000644000000000000000000007170312114176157020655 0ustar rootrootPNG  IHDR,.׸)sRGB pHYs B(xtIME r IDATx}w|[9my8vęHB WR:xZVeRF[Ji fB;N-_ے%;#z>%Kҹ{}`nn.J`Hl.<򰔇,(b@ j`ln4͠FB&.%:&ٵMsY(an繹rK &Qnf? i eyyB'34Gu_PWޗ,3_%s<O"K[[ĵp*%exFQ}>%o7uIau2y.nZS#mcQ[hNi\ZzMN->Z[zE@INv_xrɺW~#=ZR> ´{#䵖G[{4y<+,KBSH4Gw:#e-̂O{]Wi׵H>)֧^AͭWKBR5umZly@'/to?)ۑ^aEmy0ߓDA5Ͷ-, ©-XDgA;|pxH~YeYN]R3u5Oc/z:.޻ +Kr5' /`%q ɤ(&yxw557E9Ꚋ,XY2)"[{o6!h}P9590 ©%n&:"_tP|snN-i(HvT[8,t~gUؙ,ɐIYCjܿ._U fALpoϗ?jXLSKie 3Yf%+$oE.HD_0 tV; 2>]靡_S0+< I+^\NL- [8>ya3J a:yς0=aX*k ϭ*1dAVPhB* #/ ݺ:mUYw .A `vM2F~Ud~fiɂ0do`fg$@P{Qfc_8r(T'R$[ڵ.&&m~{,#} JOTIMqdp+ ^ռA~nU K #;g\! )AͼM݃5Eɂ0lt6&&)Q߲uϲaăCpybB۸Ӧa}_S#&gdk j0%[U:wS[:HfTdnv_5F}b/&:}/xd?S3[ų˭ÿ=|owf#K Z+  N fexSgUQSDǜW9.niO/JI:˝=yrЫsD`59/N ^STP[ѻ3hdP.OyXDg9*[\2iyk4gڞHݘ6dE%@IMnʽ?Abe#~-"͆T9٥9Š|qU8 w'ַGRT4hxrY''4MQ}jC7V?$4\[hO kK9 и/޷Rwjs8;g~$e3BYweJ졠z;Ͳy\sMOX(Ϯ*T͊@L?QۿC=xH'{*G<}QcMW5Iw( U 0F T8Mdc8 jZKdJ*=mz$xaګ-C &UNV0(^X8ћ>\UNÁ ۣ;j'Qq|A(GxvUi%k`}=l요ao쒞>k5d+ /pqr;JXt)ξm4j eNv X2_|SyO^lhjjKxuAlC5nnu3~edA\sT_SlgsGǩ0Mǜ.aHA١4'J|"kKh|V/ָ^j p{r-G#ډZP>ن@b %V(F  n8Pൕ 7,`OeNe.`/)orvJŠSq哐ӵ3],UicNwVؙ*'׷GoIs $u.*srquI~CDK~s5&ApE9㥎s ٸCպK+y [$1` MȞ7` U;6Y?qăR;2VmMeG~)\bcCF3\=ƀ ΠN>Ilr^S*i$f_jCͰ$MXyrK8Qiŋ,;}-ӫ ?-mJϱtl4Qag6ȪIuaSŃg|7ѐz qRQ( ~HS| `HyqW ,vlvį=`{141dg|vaw|ifBζ;%KcS,Y_k²œϥKP.o7R?*mvxWKwl7D%!ZYrv-{;r8^ \_U$_)iB<}dEKC;^YvۅIEo7 ۹Xt2ot^U9Aj.nGş>[$폾ܜMw~jF,ء76s9ۄ=cp֎MS$Q/cG \<.iOjA8#e 'Ks?~ʼQN.[d[y)-Wz g6jS,RHi J4Pgc?!ߔ[e^e][tQo0.*;"*&huȴ%cK+4+?C-eՋؙ o!` e(u!m5PVngDC!ăphqa,_n6u>GcpJR.)s~#W: / %Wqҟ濿q^1gM?gx &D痳3jM@#pE{ida@#>-"[{T,=ߏ-J7 dʒ܁ȡI6LyU-Va!X"Z p[leeھ?/dwwE ŋ?c{pY:kO[J>D>4$3 q #>Vָ.17SՉ z2''fLbblbL$;R4o 5Dݻvږx |衇aχ_]?;/ɦ^NN-AĦnIwL(+JJD&5 ': q.;r0E"5AR"`TUCVtI7 l`bRr)O-D]\~;P(t777'gϞ][[;9,{c`Z]^SqElXG5p@ژC!~\ cb7O*aPyV&RN9hKVc 'sE& ѓ+@yqXp?OFwyW`y)`gj;}%E^3Cf1Hd] Ry0dl#b%e$ߩ]G} 0@w4e}IN2K.A9I!A"P@hHf ÎKg{gMg֯_[kN3KԉIix>9dKt)x_ګo韄nk/~wa~rscOc?oG{zBOՅ[6~Y$LD EA&H3$IN{BSl.dsaU #D|, M=چn-[;'5o999;-4NV9؛ܱ{ ')j޺)erۤL 1 G5:p= 1` C#JhbyEyEI6ff6U⾇^ec+S¼XDe-BuIQˆ\^t"Jtrq#zFX!ĉ:)bOʐ`e Xeo{sK4f[:+DJ9|s6UMC[e( \;#s.GnIb'TK:"rFv7pBcgةOqWWRoZ*VɼlAGcPy?A5k UjNd҅39tn khGo:0/9x]w\!jPSOX:)l \+'~KJ9v)[0orIYWbu`}̯9q E6T㢗xUY,~)DC,2]PN"i #sY/"N{饗>hUmT}4/(dsBN4VSgWs,DucŦ~Ռs`H7S^[ kkg IUͳ8,'vFQ8u~dB(z| Qa!B )8sLٜaOnܸK_޽{Ywu}GQ԰W_7'`d"qeyQy^G[sJc]qGRD46^9AzjrAn)ѠW=A EO>pm^oGgBΛQ:PYwT;K`fV𣘜UbG`@#lQ4F"̫l_4i]M){ x圊ظư~ΛGR|*WT z?1 MƓ@%,f5zaB:n00)84&㈟h*[P3#g >N|J"D9<  w2.j}#AqQʑ&զ Bϗ(wXS/5+, ᖨѫF4]a? &;lE FÁ<1 )q32,$VO#xz3żߥe* GCX_a5' 8n<{dl9|,PMҫ=aL@Cth$CECIw2U2q/}W~KI!V+BD]dbpSaVzl P*-n%-*J?^VX0Nѕ>~vJݬX4't )#hd(fSD0 PNJF)80>c!y[M!#2pI~7ZT 6"#6! 7.(v%*B SBry+PF^4iAQQ&!'Bt 酂@=EJiz3C K&^=p蒂k*]1/=Wrz֧֠kP@,t,ɉ͓ ק^S0<b)e  h2d8rhn DM_DZ׾&}kxsgME6>&s޻0?u?IAӪB{F%`Ȩ&Cd)wHFD:IB$Љ&9#dMqM@# Pc1i.d?3G5W<;F$z K4O{ƊaѱO5;$)Dn8c$?2I4G8#  ;h"DQql4\a^i2hDz0Ol< ^rTH35ԧ0%uWnlq4Ib`B!2@B`8Y0b zk7 Km' poO]H1Neָ4*1o r;SdE8F\MHJ?5aPd8ds9wZF2%9Kj[%.@Of~`>h j76K1MX%W[2U刳n*脖T1Y*_,7 AS!ԾVCD!20l[pcb^bM A"~`uISzQtТX֔F0Om ` L R?vhx:*W EtUNPs8Sn]őV$ȰBdsMG\v-c*"zщ,҄9EX`&#[N&0NItLtS~AQAmZ}%jA{5Re1+ogw*Q80cb'!u 16 S]oi LA2R KAF6&?F,i!:'ሟZW @ѱڥ3ԛ?SY,Rw42 =,ue6KMAYҥ[?Ш*8[@!kC@2fh̫/xW|^X90&id.1yt_]e% t-e@20F}bX>% 4CpF*-d] jJjzGL] amr\X 1\f,Iiu=%:A{_͡ޅBCt` <+鹙BACqd/WbdwF3~ tmI|Bzk x+W(o*y|>C(?WqqAxEc~)M :6H['QQc0J!2~<L'&!OU/ZV;pC~f8qHp ;ןe2f97YZpOpy(p:3@h͛? NGi(^`ʝ:<7A f7U> o5k h<:>"70i6h3Z1v6f6'Iy`WTFM4*G8,J%g!fH%7&`%eo pi.ou;d#˭i @8!Iren*G& = :ICļaCԬBaWX`~@kT70ixM],N8A O\'{"ID౽۷zU] D1{,R${z+ܫ ) -2;# 8`HћՄ)ɇU>&L@hs._lle%UMվC<`E>VϦc/@pZ.qIN+t7N``" y~`@5 `Bn#~zJ0jNK%.-xUlbzT.,/,=oF\,+c 81Uڜ@5P@SM psT$ ?ŦgjE߮6s,nPָ/Eu~1{A1W=APxM{CJ`t]#BX\"GZs(gRꩿ~ lj$ am@? 3&xZmt $g8kpS|]{M=2PL:.zЍf"|f4~n*'˥6F.v|vc@Rq Jݢ )-uۇY<|f0.khWdSMC7T-ptN.S4(&yp(,ӡ}w}g:D39 0V/MrEŏyXɿԬS(mj yXʯ4$qta.(C$שѦm |왷n ^]!>GJ4zZ* LHS@jG-"CfR.Ol]ScyQ$ L~2` +.(S0[M}KG("a{gRvz,6f9 pT~/tq4E6qtltkK=9$fxJJ9:]@Svy1>Vu}O#x>=aWL8S hK@"k~@*`cl/To2  LOXfa(9Ksq'`Ѧkz^"<]]U9Gxtj-=*[qX]ƈqڢAyeOgf9)RR&1t?K,%D'9OyCYeG[7ֱj(xz[! N^cГ$χW[o$We6#:> @-k.;.z[ 窄{vN :04aE4 %bN k۵q6gr+aIN׵+B {gsM1*Ơw寮E)p2(~Md8ʓo:RqDj #CKNmMhE%"ϐ >\צMd=˞VrεTSψ\_܏F7A6Hg@.`Vë$|ХkW7tiqx ^Z__Y3aQQŧ_Ws7Jf^Qvp*3}!ÍRgLU^k1G,ԎLL+U~,ġe"=릇LIjWO {7.ݖ^?{DyI{W6ɳG/sJ&& fHi XJt !fO+,Jq8rHfM! [lu'G2^^_t(d)%jYS!.}]X%"ipQ g- l(sa nد~ ilYP렽E))C(gN/25'YN^AAcՄj&8g ?5'95E9 [m6ֵ+tXȹ.*ᜂ!C!Z+ sX$G E%Bv uLjXx Q%jaюGJЙk{SLWi8E6fAs, i@r݌W[ǕM|ilԬbcyM3Sӟ<,oNv)xKp >ͽE"&bR8'4 L38S6c6E.T*KS9#GLtq ! `!h2ѓIN 5/EGqG=[;cF"3)KxSs۟~Jc@tNިQY[{mbh`dIG!vd)~sKRy1I iMS6̣(HsdNy^?"wu(yX~S 9ql4R(Tު= 5J|Fu3S#ꤸZ' =bs4uLPqP3AFF OCB<y Xc `'" p剖f}0[OԪ|p4b-OWWp=;#>ˡgWsKE1KGQ;܆엚:x\(vЬ3lMUŬuuFoGe#G͒>_#^Y[^>)ƨ5h|A ],)xF>s,1沊4iT6h ͕f+%BPidCʯ䋧8xqxCԣbbPU0f?#RG6+{ K-d?+9\Z{0xJv:=}i&!l\[!ӘwBSaQK(82^bZ@xA1[0ID~np(QEcKjֵk??(%e'W*@gǔ,Q1x1m14,SIW@N$RJMfVڅ[FCxmx< jpsF[ Os7U òƟow&G Q u;Ny?;!jgU3JͽǽFaNFHPtb5KE_iZ7mc9B mXa6 Ȁ&*y<0証-r̳2w;'})p@֖p8i#Ң!iɊ< ypO34I!BTH Bۈ)":}A},A^6tCO^nQRG N޵#L w'5Wdtj?/MEW=ז(͐#H Y6) P15\X/$ +2~|D ^;P;=;GC|lcOܜ{ټܫxhF2?9afcdFVPM(FS9)xYОٳ2ZS~['u)ݢ^/sȘ*//b&8t\%\|zi͒aWe|t`shZঋE@i;Dp`)D=x'>$Ӓa)Dj2`x3YUPx|戼7+Ԭ&*j!|v#g<7}ǣۣc[s9N'`~mkX1IdZj\S˝ I,Ƒృp_0ݙDjpMM k@Od3\R1CGEGv,cyWcsqifqbwm ۇ@C{"n N,!η;x߮H݈|߇HbO8j;wFXOTi4Bo._7[;BQ/ُzu$7T,lRv'6Khܻ32&V(›fr}۽;lc-:Uy )DrE9"'һ#T/CBs }:&~S}m)[! If Q kɖp /~]D_9xe9/iyL_rCr ?KL&991q0: R"oԈovhS6\E -=S_V3}n7Qx? g&3!wdK}aU]@d`)“Ԇn-ig ~@jIZgګ?wTxKe~W{wE&lL`6F'#%gou!snQZOB2䳐;S0$8WZ*`Ak,%ޝQ|lC[*m׷EFzz6xB@a͍OO"[6nCN%L@@ߞ'8aՄ 3EsXӗ,2ɠGEI2U >?6DyѾh9[哇'~OW;/V wl L3`]^ksl1hBo uɋv)D(Q1ɑ[9,c9IGZZ}>oȌ(4DCJp2ou;Iա2 f~Sר]䡗ЊI>z(zhgrk\+O%/k8Eܽ#N\]jA! .W1-]rdvֈgg t(yKݪ @=MN s#}"A$K?w<>_-{{"I_A1:/T Ƌ8O27_kU@Rr$%e")sh<I.y_ &\5thxe9t$Bdep3 u?)d#GnJ>-y`wdt^9Nje[q nzI̤A_h gܽ#_-{X{"![$#UqcDSM p0Ԣ\/xe-#o!3kQ0ie&IXѨlOg hT6${-UbH'=!p[xp\Jkm 3K,쌏@;Y& [acW/phΈQMBa]΄TZNfh7NFu*阀+ 3G&Oĭ- ?=8vvIa`Uب5;ã׬!)D7m -y<^"]gdc oKS_OJ'IHP{%;CIY 9&Mk[v N"TLg&]Q8,ژF"7է'sR-޻+H܂ --2{;cبAɎ 0HViYH,G8]\Zh_o4= h10eUv] ]H) '%,-)9u ,j@ IDATwGmW[Gt=϶{M}`wt^jV./O D3f $*bZtB*1F087KlQIw%"kV >; gک \]uSI+DCK<+j개z.G-=/r~aUe:&#$&&&Th7X-u L* ,0!аP,꒝ Q*"uRv[z6&ݯ@{*,ЍQss>E.vr楥Wf~/xܙvW8 0#$$w "h >}/X < D4J:2/R*VsU12xJ9*R@0y"A0qT fȝnk@yBL9+-J3 ;?eCdgouh8Q#q G|2s7y4=OXR-`PX|*&Th|91`4'$*.(vSSRqW1iN*`}RJ;Qg9پ9WW?Z`|I`m9܉ Cco#g0(q z&aK`F1IcDl;ճII(Ģ sT}y-s!_-|ZP1 +.?m(k܃>O A``EYG#x|RG9,wԜ1O%\נ{ 8hPP9eg$ITSpuOQb?Zmxsgڄf@P BpRlHr/Nâ_hQ:S&RFps<8;}RvƚJ xrBSU7T i1i, ^LB̴?0ѥ9B-qCG׶ 8H W%ØIm퐍QVIAh.ɺNy"}owė".]1]N MXА\ w$ȂpzI@Hxt.&%B3jGI Ъ ⃑~A g3Erpg2JSJ?J& i0֢جVPsW%|绹JLNN L FeBlx]ru cA(xE;/+1Y杬~*I^b M sA jf|>t gAT:&$Cz?miAoqj dC0'%d-VRm0Oa\SdWS(A3!WZ՗[i/=ڬCTdK2x[حoS(znBdl7Z}frMNY̳k\ 1/73+e^9̵3e^,VzݣQVm*PwA\bQSXo4JC ehc,i!B[hJaV0hqY/([kO0AFIZ%9TS6N>PBy Qlt6dK&_Q(tGm^l˫-ڢ uH-՞5 <LIN:㈎ŁßApw]6C: ;n:o(A")w$&q`:Yìc[HʦQ0 DE0㖈{'YMoۛ&*6Ip! 1ǑKH>9H#R G Ր`c Ɩ,KmYjf;;ZjgW|?Cξ}~4k-&B w . GBn.HŗF4qF&.l̠4w֡[H moʚÄZ4!A貓:ͨ:gm#,'ɚNrK5]0^^ 8Y=aM#eȠ*hc1Kg6JJpZht$BlMtyZzOU}$PDG !3۰Jw9W+ Mc,A0."m*KUN˷ТUEw_kSB/tJ4Tщ{}҆Uy >sbwCw{7w*'0Ե?ϿgžWĴS+mG Ob*Q NdCXkmDwʼn3Tr}RC y|)N.('!rQrIvRH( @ƈ SW&>Yg}4ؐ VbB:>dhgҝDz}B+YRͬUt٫I'NSd4_tG J/:%+uy`oCƫ٥/{O_OB0p cs5,F#Vκ=Rs$5k5Dp~_x^a$-/b `ٛ2uAyKUI(9;g;_[p{LMǮ BYE<^WF||gk +w /aL_O[GbZ4. +GqV-*7,NC۠=qC[hg /e2H~u9"y8R`G\^29-擰njHL#\15J $S5 شU.䋗oQk$vC9CK9!O`F=Xflx~-XWa?XUkUAmipEGCjma^ y U^&A0Tr|K3N[{^֐uz|}vwYkoeԠ/1^X|jUYS%2$jemg\Tś[.&3 :寧9^MAke1q1Xtk]>CѼ[t͟QKx#5>\|c}-ʡL]=߳>H15@ҢPi*`M@E U9r Nvѩӎ h^ĄP2]TQX%d.2Cݝn,9 U$?@~nl!ٿX<}Or!s=]Q7ETmc)Krh]>̚\X Ȩ#1!nZE00f-Y2w6fPNoF 7 cs4G*qGڱ'0]'gb,;>g {m)3} r0i Ae}`BT)nҌ:lwhh}UUAey%M!hbAIF8:\$LZpyē-iDBbZbr<9z4Έ!!p`AjXjIb{$Ј9Q!&5#!˨KĘAM*4 ] )+jD@p NaBmA.=R̠6w,Qq¡և}!h@צb~wMpouNMNJ OYŔnt0o'h$19PU< XŨ|V" a_~MLϑt,#v{50\6UXpٜl5hS%B" NY U,BZ{?B&WQCI蟷uhY4EZƺkM2sqDپ"eU>\=P@F*CO;5(+L3,\mmGwOw}@modg|Ő_r7F5~ydh*x|Ķ98+1\d4SD<iUޥLHL:T9s$jab㌃=eD%m}B"D6J+'z,7 1›׏هvF#zU27XXV-1' Zs/Kwm1*yD2ZMB; F'JRGKHCH9'^4&-Sr wbnU)* Q$i\\n. it,K F"FsdO14#ts~8bwԁE;\\=9蓐 3b?;?FUqޞ2&z$Tc٭WB%=>#EUW !!ಌF :RZ`Dkr UJ*>hS{:V=|~AiĂׯ$ .ő.κpA >r]D  Yӫ'mqBQNK[4%E @p' ΰVEj/:73zexF6¯e׏w o~)OK|`:1IDAT OɁUGli?/kqp0Ow.Z]\ؤ'MI-(!@pڸAyYWB0)T= Jq^r\KNuM:iHCgqS|WtTrg'_M% & HhstbMH~ =;#~2\ڿ+c!^ TS36hr8K.(w)|w>CWia0 }\>S׏O=G#Q7^Nh]Qwa]y<ͺόL"CPW]q`RN-&0 ^AˑU-rb8 p"̍W$ p0(kF ^~'Ci;L?RP_d +$ʅҝ[,FۺEN֞L:Z#2B-nH$/Ȥ" Ay IO}g UP.eΔS;+Ц_7>?VE:u&!6>Zuf<:Xc`E/?XOrl6bдjIjCTXӸ'i>yu{ G;+^p8BLZkc'fD]qx#&?\`ζb7꼶mMS]_>z}oe=/U/]?SO-{M Z{_1 7[;[vKrKsx٢r_)??T_1aL)UJV퉑9v N7 Q{M<]b;u⭕g/6󘄚⋲.ETjpIQ荶㕾^]u? ielv䠇Q`Ń V=:l?9yqYb+!]6ó\acy팊e rD g3,=ZûMҽJh@|uGWEN 7&^NW[ Ay}`)mUI@&+b1rx)>o+2;*qtJ<I 6Yu@61y˕&>{U0Jq"{ׇ߿zj}͓#+^7o&.=.y~dNZ"i =!2T镺}RT!A{ 'z!ƼXMir\/pX$7t|Z-&>rqX qAK[;+@a|!D럘eQ߮鮸}vܹiX'7w*蔫9rp2@P2! k(wim; /*2XI'{;S+,%{+A}KЯW֬b%`u@$-A @ae/1L0R{cTeQyfFT8=\UmK۠Fƭ=_T>樖YItĞswй\6b?WrS j{s1 y*=G =da2 . I¤gr,dXVd\pUo몾_9$g>u?՞&뎐{}MA~ '-DiM6b[NȶͫG ʙgw^O6yRm]U'FagHsYKbܢ{->iR eSHmȯFR6WOf GwA3LBA_I[*˛jF3ⷻ|lﬖٝ2}1nQg̓79}Ff٢zmļ4>5 <|dT6E'%a]-թ_zqӍB2[[OKv~"xF4 jRҸˣt{sXlh{f6G=?(7&N>˽㴑|rG+HZQvo`99i`g"_8F gX_WuRbB|j_eoksQtφ[bND@ IiIO z"1Qlhpx<^1"69ҭSf¢[DˁImV9%E5M4I,x3gJv<:}]酄qoh\!! nП DQ Ctv͚& %,jdcHcDw .o 7$r ԨٕJ)Av!奤̚6$r̨V1tz4omM.96@̓/ Nn;fSC& .t6Oʻ{ir& ?.n )QM/A{VSflDHƟ֎{օVrJ !  oyWm (w5~p];Z<F> ]zM?4I8W3a]2oo;Gf[;~ej9&&ʊ& dAŖVm[TU~\>Әλ׆uhy=owpJߴ[ٯ1bFw`v&F݆bIXouS$j h3R<>> O 2+AtAuSW:ytdq>?~AdLKXK +G'a}>//jN:Vtt Xؤ2Ap}CWĴS[r7dv${N +__ܲ1yÙ_KMua Wt7fy4wιis=?ΰ.spVɚiM#w ޵:ZWAL#{s$, .t{fba;lsFqݶWq7ia<9^4:GIX{W.<{9e6 D|Ǫ3zACY(:IX{)?2XhVkCV:|d`o['GtT$ip7t;/9_ ~04z[O]Vu!L_K8}-T?hp.ln8S6P缚ƅA=C2t硁Cfn BFkM}P'JS}ܩkDk=7uVfrQߎ_L͢O r޵&pu>^S_^J+ub*,㷷{^ Hyۏ ,& ko70cҋ ͜}aoi[<[cA՜r?Qr~2Tphf$Rb}@w[OFTFa{3־jz-cUZ)\VF=2K^bp.tfS II黱W6!8Vpe9h9\VCj A)l )`X՟-*4$FW{CoKLS|u{)%7nqu7m*C#}ڀ'I]m]90՟ӳN3k 9h\զ]ut;nҬs,gr]^r%#K( aMԦٔN3eJM& %ų5]V7UM}c&}-kJ/'C&$^#w,iM@||>:8``' ,oݸ7]~ԇUIq:L e3J2'!c%/Q߽~w.`g@ӊOVӞy6g 22ȶ3C +unP^f+n߆~0F94Y;@,l-I6={˱J@u-7Dxh"y.1M#&"$KTXXyJf?U JHaC_xn)8?ieмk^70!$D`㦝yU >SxøO ob³W\H0o۽~]mL*Ke7fBp8b-{ǁ= IDATxg|׵ZU ID(6`0qIqC8J\WPAڕUw}IXv2>ޙ{3w=D$DgBWI0a^ &¼L y% J@@@0)敀`R 1̟[@<===<<@#P&Wh&O9@t&qTT*0KNgPef@s /n|yjܴJnF':$F;1[? LBBH$d?$77~ MtW5{ t0̬K@jBɳf΋( =.8ƥ:'&O ]pn)NXdɮ]RRRd2Y{{=5Mi֍],&[p;yS}OYOw'_݉>D앙*p=}-(ں[nAkתqӟbŊ[:uj}Zbdu&e'h0a<+-3죿S)t윤:_]s2ҎQժR hvꫯV^{^{￟@1~84`}"QVliqS?w@W@BDh4߮Z}Z=;cQzioW@GOGbds\\X̏vy5k,\Pk3jf@%uu˻\ԙk1(d%&܍ <[.YQPR]tr@QUO9Fe&gV9rLYp5&nՔxԆyj{NM4{U,L f·"hݺuYYY4Mlݺ VXao۶j(-[,ZhÆ 2l˖-@RgggL~رcp7nܸ1''b[<<<֯_?gElY,a`0-Ha^tik]5lR6'4j;EOڿ'_?`dhT̅٪0qW`fE3h,k;Rќ2N(¿b}(;jTک.zpjt//lkkqa OJBfl(sb< F{NT;? /gE]@BQcKRkM.8?2(2+hTg=.:ujWWLNLLܺuo;X,h_~T*ݱcعs'N_dɎ;H$ap…7:RSS92̶@Ya 2{W.U+$шX+ bN+ [^Ye-G(GK7n3+ g 6GWLʋ1 $,쯒1+Dr/Xa/rXm֥_WfY^sXlܼ*z<+U/QiB"&t;rQ9N JFE}NY'\)2;u‹dM③BkC,xðGo]|~D`,H.YP^EWKK5[J>ϖmذaCDDDll,Bb .ݼyyy| ĬXhQ}ݺuK,)..zU-[Gccc-Zd6z-gxYYY6ByyyyyyZ~7 HGG'66/M6gFf~]?~ 7b`|Hb|ٞ.emEdz_+j^TWuH)(1w^k˺v84qw'y ~킈Z{3ٿƃذ;x6+MF%r(r<< ӯN{yB7Z>~^`2PQz~v H$[nV   Cf̙hF/\`H>^Wgsx\6mvXN_TӥBgЛL*z7NT-rRBFG.o4Ћg2[WP܅/ka`<83m]m_ΠZ;Z7j6w428^$~%%T 5'H)܄nzξ]ĞpXfWIf:8F( 6`7 z(J{!FGQS֩i@*ﮬPv=O2s\T^^ Ǐױ/lj z^_* Q*W_I$s  T*5'>;65tW_ʉM2uϼ0iZNQ+gAgPW7 m|A pH$mmmN*zIhq`W7Z̖GRk H1F#AD"1 ̀D"e$e 'ٰ  }!J"MRtH_nZz},˕*W_aXbXPʛCX-#ə[ hZuO_OeCC14*m<5Q8'pTZ[[;Ԫ:H$WWWs=CFp8C+;ðҨӧOQJ ~iC24 OZKURkA6M֭rus0"253 >죢JJJT|UZ# Mvʵ\6ۍޣ@a]c2][Ҿ͚5[eYL6 Vj1[-"H5d$舥K~T*ui̙:wFrfkW/=sdb]-`ZZ:[Uc$fgg/\ckX-*Փ ma؞#_?~OPZ;[?Wwsr[j)WKzR'V>-oH{}`ou.+'LmtT5.|:%DG\8{G=ھ}{WXXXUUqK.S(۷o7nP((8qIs&GOKKK1 촯ko֭[EEEׯ?v옗נ;|ҥK Vkwwwvvav޽z'xb#_]do,Vwf*#|~uaj8:O{rG}Z.(b^ã¢8Cm/K1/d4W_9[FY cӂ [Ο([rGvvC@g0mb% Yk}m!JlFd ̵EPd60LD2rQ#ly EB/(fշgNDf1*؃qO7GbX&$''wwwt:] tuu:nT?rG_1aOQIHHػw_q``(tz,6B%g"LXP\WvnxzVei[EIA?.%Q2ܯkLb͛-[pluQ*4ԕ0ꁟk"HJywx I3`mMOa퓏1X,ժJK ~ʥ=g_J!(j4] 5^G`~At-7.]1FۚO8LP6il6Jv% XlOxʔǟ:2';bL汌/:QG`b Q3jfU(v1- =x^VMWV7]x|Qv8Ϙo;G'DxꚣC҇R}DzB%U{I5uQ]vNRSG@0w˖-ӦM#:o8ͫo0eB%?wyz eRevΔƚ;DBB&䗟x+Z$33DnbOo/'4:}˧ϕl6hp+F_Reղ]\z: DEH_yPY*G.qdA"={zBa,vEbCWpG5nɮwuqG(sF6,ҩʂ+?)עܤ=]lOa8nȥ*w/0+q%]'06:޷͙s :0t@]SGk:ƄWVLt:}۶mtyyy|Zmf̘qĉW_}<==B!LJVzրʐ[%RgΏ8.- 4:jڬV0d4޺'_o}UZbQ~!At:^.铫Y/{شH R)wnEטD?/?h铩~{B!9bHh/.יJ Jo6;jΠ79҅0 P"SHćDxM|, <=hĴ p`oJchd A6 0)ӃLai^mIASGChziRڥu+?5 }ӂ"vEI뙣 ٱ^n% .#150(Aт ( +A p=Π~4=KBܣ}N0L3=#\߫Uj3\xs˫JԀGԑz];pSNHk׮?K/~(ׯ_r{= O>^{w^zܹk׮!b? DDDt΢v8P {7ßom#n?xg4Rꄮ.esX̫rHL0^z9WPv(kbQpܝ?0-F NtnDžNj/%|![?{L͊U"n*pt%r/M/_) ,3FF']8YUg-q24:s~t\?mΟ5)l/+`v\5 +>+]?<15pNvܾ-^5% %+֥² cւc:[\ݹa EБ$.Se-?wL_R \^q&y4]_8QNWM#SHPW5s~4JBmV[pVkT4/_="E{ F+.RjU&U/`{_oȋV&WwM150Gԑz];p蜜͛7gee ,XrJ<ާ~ /ܹϞ=??|C͜9o[rhhv{; yKL ߗe˫{?F-x,;# 9[Gs+BxCN)ي >' /o[>]·ڰZ?2Haҹ<>KΎ-\RЄw<*7D?fәO?8a:$6X]Ue AZiXd̍jMu}e隔Ϳ:WT'u^\c-( >;'`ɥ*kH^_8i4]\\+^n?QH|Dr`T6dd_w};E˰vz˃ehj24}$WȅB>MRl[FPHucVnժ BzK uHf6[(Ҙ/dr+6 @TwgOk_~yӳL)a£;?C2%>wmnj{kכl4IDAT{h^f3/CKgK}k=/LT^eMMSêMpZ6֯ ÎK0 t`,[;bzeI hC]͡?Mz/n(KɳZmm̓rC(GmtTTiOjLU0ym/ <# Cl_KSPv*dJYIg]njDᄉꪺB"<=6[k(ỐRK,}v$8UVsǛ ODLymii)))$:Z=,sx⩬Lģ( soȎ2F.YV^X'n궦ًK,fLDayQ˰c{!6byfM `sW%V&NY z'O#MkpQik54:eħԔwi{{Ծb SH|!B#%" `k6[N3nӇˋ[f̍)c]h/&f-TJ|uCf%`irھ0 uМI;Xp윤)!#8jf52Oܹ `*wzzzD"Qnn=8qu&JpErQboFz}7bikLl^2ba>/Yl_QWQu9 mjխQ#dtW_dY%OOka]8wg*-nŦ3|=_eWNy{y/?|Шʘ953ZÍKuK&#ܺ'x(?MQ0ǯX)R{KɃ\<]iaQ^lƕUjX brӇoY-6䬛jX*v7'lo.Vv;D"ٗ K:򾸼7s|&LJ`ekR,뭛WW|?Xz Fgh6o@UNt2(RT\.|˪#;%zxx bt:{2g)se;yC}0QyL'*Cn*5{ Gz_.gu8ދеðB 8ښ92M0Ic6a1[a#|۠7 =F9tR/ݷ0d2ɦ婗\PmFl<Tf2ޥ^A\&/㞶O~zd,S҇DxY㌰A3h^N}rн[?Xѧ-+n2D*32gFlY^|gݼV?l7xЪ^&0UaXĜJ:XBgRk+;& z#6b8O 0,Mk0 S+uyk C`sΡ'=yٹIS=AzɢTvh](JsN7du\`מlrz),  `>'Ƽ|6mzBCC8Ν;۷yf Ê{3gμ o,**bُ>c=c}f 5`2Z축'`m2Zr?% g]ZbZAoIUMW+uM&9cndia<1ԅ+/OLqۚxt˜&a 󤝊Q D9I<>͓]JUn]8!xH`Ys"}}1M~A1I~S.{(mXhTi3SC{q&kEI+"*i (cT.Y=e/ sˊZRvNRvnr@{WG?N])e[@qvNԙӂUQ\u+{5צ=ŃO>ez$zI.U%O ^&eƼpOyyQo$M dRP::IdϬ1x>fdӂN9?:!%[R8<ϴY=ݪ޴L f&,I zML*F7:rMuYZ6+|avuyz ^q^kܶ@s}s y&A.8/1YT3.svF؞B VyVj{5.σ =^}uM81yyyyyyZ~7~}7bŊO?T=|駗.]jXZd+ P+_Mjoehb 8_AQtiN0͓Ф''7=׻&,]eZ/Rώؿ: -Iy ~|FuyG]UHR_7% &;e* fZds#|rdҬ1h צ٬W;ϫ|B.\,֔uɎ VtFa0N4FS2&kIAG8Xb.tlXW[kKlT tG*N *r~2ÖN,i6zb6YKZ%UuՔwh^hkꨧamMk8/%O~-S<Č?Uia)\Hr0}v=-2a6;{}AQDB}5~ᙡ._Ȧӂ+]X+ hmWE%vuȔWSikRd<6wر\ߺ1OFğ R? N*iM FB{X\:[o[ pΝG}TUU< f:Zz=}- :iuYie-3BJ\^* X!75}2ͫAaxkâ|=I3ʌ1ulXYQ˞O/r\)Nxݓ'@Bj@ME>/ h dwc2Y7*6:{N >sgܚ;2rk{0H El'I`{iAZ;wge%儮^ɪӶ𘎮=5W[d*h0'j Mun|l q>$qr#}XyJ! fq1c4-q.s~4.>{VO^%{{'+:Ǖ,}hZ㐩g%l8t8ۙHF3,@OOT*=~)))7n|gzh@?=[Zۣ!D`B$=J@$%=ZߐzfFm Cܺ<;;ژ$O?5*/H\ZxgƓDBD/QdG@YasfVTvNRcer:FN14I[؊>B&O`.s#/9o6[f }.,;w#0,{>800{x[N; hz*Rdb{5ITF&w=k*:(Tr#ӪJ9\;_5mV8p)6Vzɉ0יj+:"c}/߫l뛒Ϣa9zbВ8i Xd2)ijP\g땩ܨT2AI.3x= qw1#b ci57£PIӪ Uei_Gښ}{p듫I \S'=!'ҶPw&S{D dK|nk5"G_Π$<=XP)tt%.%wnIUYί k\Vf Opg>^tOq%ĉ]((ڤqidNFLk/a%25p b{pmsٺu͛Ngzj\\܎;֮]rJRy…;vX,^{ JJJrrr0 36U~ǏۣN172!5Z -s^th̑[ )6ַtMJ:=bHhJzhQ~Cs}O|J`fVTjFb;}VfxvPo;rk#|},H8 DX:*rsz| 2?7:7)-VAhF9!50%=fXE6%=T ;H[zq2+C=W 1ɤRlLM H୏[u$tuue2t@5ɢtwEYgh`Rm6l</Z80x8.15pkF~ESq"`R{oBv_;T*نazG cۜ$/V?L0A ʘ%Gt= c?FS}6mXrMEԴ7: 3?e1OhP?6c$td:6/R)7@{% %~I0a^ &¼L y% J@@@0)敀`R +)/V. TIENDB`ruby-prawn-1.0.0~rc2.orig/www/media/utf8.pdf0000644000000000000000000133417512114176157017367 0ustar rootroot%PDF-1.3 1 0 obj << /Producer /Creator >> endobj 2 0 obj << /Type /Pages /Count 1 /Kids [5 0 R] >> endobj 3 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 4 0 obj << /Length 4757 >> stream 0.000 0.000 0.000 rg 0.000 0.000 0.000 RG q BT /F1 12 Tf 36 744.864 Td [<09f7033e0348034c034a00030361033e034003420a6e034a000303410a19034a033e0349033e0346031700030351034c0a7d0351034c0003034c09f60003034903420003033f03480a0f034d035103420346001109f7033e0348034c034a00030361033e034003420a6e034a000303410a19034a033e0349033e0346031700030351034c0a7d0351034c0003034c09f60003034903420003>] TJ ET BT /F1 12 Tf 36 730.908 Td [<033f03480a0f034d035103420346001109f7033e0348034c034a00030361033e034003420a6e034a000303410a19034a033e0349033e0346031700030351034c0a7d0351034c0003034c09f60003034903420003033f03480a0f034d035103420346001109f7033e0348034c034a00030361033e034003420a6e034a000303410a19034a033e0349033e0346031700030351034c0a7d0351034c0003034c09f60003034903420003>] TJ ET BT /F1 12 Tf 36 716.952 Td [<033f03480a0f034d035103420346001109f7033e0348034c034a00030361033e034003420a6e034a000303410a19034a033e0349033e0346031700030351034c0a7d0351034c0003034c09f60003034903420003033f03480a0f034d035103420346001109f7033e0348034c034a00030361033e034003420a6e034a000303410a19034a033e0349033e0346031700030351034c0a7d0351034c0003034c09f60003034903420003>] TJ ET BT /F1 12 Tf 36 702.996 Td [<033f03480a0f034d035103420346001109f7033e0348034c034a00030361033e034003420a6e034a000303410a19034a033e0349033e0346031700030351034c0a7d0351034c0003034c09f60003034903420003033f03480a0f034d035103420346001109f7033e0348034c034a00030361033e034003420a6e034a000303410a19034a033e0349033e0346031700030351034c0a7d0351034c0003034c09f60003034903420003>] TJ ET BT /F1 12 Tf 36 689.04 Td [<033f03480a0f034d035103420346001109f7033e0348034c034a00030361033e034003420a6e034a000303410a19034a033e0349033e0346031700030351034c0a7d0351034c0003034c09f60003034903420003033f03480a0f034d035103420346001109f7033e0348034c034a00030361033e034003420a6e034a000303410a19034a033e0349033e0346031700030351034c0a7d0351034c0003034c09f60003034903420003>] TJ ET BT /F1 12 Tf 36 675.084 Td [<033f03480a0f034d035103420346001109f7033e0348034c034a00030361033e034003420a6e034a000303410a19034a033e0349033e0346031700030351034c0a7d0351034c0003034c09f60003034903420003033f03480a0f034d035103420346001109f7033e0348034c034a00030361033e034003420a6e034a000303410a19034a033e0349033e0346031700030351034c0a7d0351034c0003034c09f60003034903420003>] TJ ET BT /F1 12 Tf 36 661.128 Td [<033f03480a0f034d035103420346001109f7033e0348034c034a00030361033e034003420a6e034a000303410a19034a033e0349033e0346031700030351034c0a7d0351034c0003034c09f60003034903420003033f03480a0f034d035103420346001109f7033e0348034c034a00030361033e034003420a6e034a000303410a19034a033e0349033e0346031700030351034c0a7d0351034c0003034c09f60003034903420003>] TJ ET BT /F1 12 Tf 36 647.172 Td [<033f03480a0f034d035103420346001109f7033e0348034c034a00030361033e034003420a6e034a000303410a19034a033e0349033e0346031700030351034c0a7d0351034c0003034c09f60003034903420003033f03480a0f034d035103420346001109f7033e0348034c034a00030361033e034003420a6e034a000303410a19034a033e0349033e0346031700030351034c0a7d0351034c0003034c09f60003034903420003>] TJ ET BT /F1 12 Tf 36 633.216 Td [<033f03480a0f034d035103420346001109f7033e0348034c034a00030361033e034003420a6e034a000303410a19034a033e0349033e0346031700030351034c0a7d0351034c0003034c09f60003034903420003033f03480a0f034d035103420346001109f7033e0348034c034a00030361033e034003420a6e034a000303410a19034a033e0349033e0346031700030351034c0a7d0351034c0003034c09f60003034903420003>] TJ ET BT /F1 12 Tf 36 619.26 Td [<033f03480a0f034d035103420346001109f7033e0348034c034a00030361033e034003420a6e034a000303410a19034a033e0349033e0346031700030351034c0a7d0351034c0003034c09f60003034903420003033f03480a0f034d035103420346001109f7033e0348034c034a00030361033e034003420a6e034a000303410a19034a033e0349033e0346031700030351034c0a7d0351034c0003034c09f60003034903420003>] TJ ET BT /F1 12 Tf 36 605.304 Td [<033f03480a0f034d0351034203460011>] TJ ET Q endstream endobj 5 0 obj << /ProcSet 6 0 R /MediaBox [0 0 612.0 792.0] /Contents 4 0 R /Type /Page /Resources << /Font << /F1 11 0 R >> >> /Parent 2 0 R >> endobj 6 0 obj [/PDF /Text] endobj 7 0 obj << /Filter /FlateDecode /Length 326816 /Length1 606452 >> stream x `TE>~nw'o$$d" bXdþ " """ 2 "a\QDd\c t:!2'uk9ԩow 0@Ɲ:"mZ⎝m+K=,7lgmͻ(9r}FM1D/}2xӾIKu|ъh!1q-62h^Fm"x9yQ^AӣzW 'WGq($_uQLLF}={>i.wDmq`>}oVo02'UR9 #U%-PUKu^ޯ}GB;!E+΂?"u/xz2xS77/RoK~>@}$Go[O'O΀@]&~ƽT ^ݻ˻? _]<_)|kkM RDJ{U;~o2_~~I2bE  z\}|2_0_՗̗|p H _i/ۂ|5Hk< ֛߲60%AW?({Ϳ(!M +߀GeZVSO+НRh\~^E+"oqnIPnO1iM9iX?jIt Z=nqX&?Np)ڵwIR{v/.P;鎜I\Wzt(dTJĥc_Q1qm"T+c7=<ߡL/\rS[OK-;1vgs[@acXzA`5np~ p% 5j֯ldSKjO]:,GKQlx1W&EmG]KRoqIH [4oǍ7:&Z#%J;gڭIۘ' )g-7'-ece>ni-E&(&C;*$zPY4ҘIshZ*}~)$ɻJlOf]qJ)e ooK!P}>\1;mZ[0~/5:3o! 9MMaE 9_-ɹ1@GnŹqKK2eKXlG] ; tغԲ878)Kr~pJf3z~Vg9*5h3XZVP'1ח04XK h1 ZMOz^6G>bO)Dgw^=磝3j1NNǘ19hjGi|׹߇zA.iWgW_/֗+e5}O\?Og 2 oF #ӨcF[n2c1ɘj0fcXk!Qɮi9EG]]\\]/t::::튺5םNuv[ۻ;K}݃cSwgWWvop~ͽ=}݇G'g<1<~z{Zxz:x:{{zy{J=#<<|9)*^7!yM-.>ށ!Qiޙ9EG˽/yxy====4חKW77׷طԷ·oek}>};;;;'M ______ֿѿٿտÿ3l@ HDy@@@@qKGO```H`T`|`r`Z`f`N`~`QK-m7vNA- &S9zfNn`]Y/_ n|/qp_?dj2CuBơΡ^ЈиФЌмВr'{ ?f^!B9w;ҟlɞ%-Ko<2o2ng5x.j!=oO3!w3ʖĊtu6';Ƶ&hƨyC2g錢ZʖTQ=9JnUns39ΉD{Nwp5|^ k^rEU0qbrBA=7&[({۩~k*.-j64[=fK 3ۙiBݪi۬V 1*@kxL,b<'}|:::?HZ8$T --Ib(.X$:%?_]E(-UKћ.:N)*4I"U9h({}OKTH-Z[9Ds8ndD5){e-؅<83C^vri_M~m{?6v6V6VK"g#%WC=Oϧ^7dYRFfSJ3jZQּ"f//uO| |Oܗr~tJz/,n|O$=0|`"h .s?UB0/pŋ8u:UV %2uV}VݨnV;ԝ3}sW£&cO~6!õ\|El>SnUj7K$J^'+]9J^٢W ~JϐO{[d-׵'[_Wl'd]NfvzE/WyFw~lE;'kns!ϩm~q~[n'lϼݯT\+QAq`i3?.a 󿕨=.WU9}q"}U闸SefiNi qJg+e+)*vMw꽯 '3㳧gYՉ=:zK2V/Yۉʩ ;%=S<vOT>1>1l61JJiv6;(ٝF4OQ3>=Onӣ|z4@>|1Y;]bʵJ|jYFfVN= P$}D$ܠ Hޟg~D~ʠԁ:SwEF8Hm*$6ZI-BB!NHe$rI_S} ILXN##9PVvxivM}I} I<֕RCxMş8G}'D ʢ?mL+[!e&QǼ-LM2FHiKijGFI!e 2kJiI^O2h kPW|YKH>~'.ua㙿De9ϗy+r̯f\9!D  c%r^}%[m]t]ԡ<ǟ7lٰμ胵zsØCSU:}Eߦn}_?я맱ӰFI:c3͌F{(1ac1Ÿ˘e5 cxxnmg|l3>7GaqwLWW5555555ϵеĵ̵ҵkkkkkg21IYvn˝E&vbwww@(xd4L|"Uu[ouvuwtqwvG=Izj{r<< =<==<<%Aa1)<C3^^fzx -mݽqIީyޅ%eޕ޵g[;;xx?yyOzYt_ė+5zR[bGFu  :21joogq:65I]71btU+|#Q;5a,M俘V>O/yw=rXVry9'ʾ| %jKiz℅غbi-m^3NVlssJmIwQ%q]mNwUg8~&Ydd uض.=R;l9qzks`t~Y~8:?Ҝl?6օT'Bm/zɡڊSX>FFD;<⎏?yE/`m0߀=fX:#B*WA%"@QЍH}NEE?яb0 Ďl$)4H)^J[ECIqF(J~Vr =^^IQH3ՙH]D>RjՄ}!h 6m2sg3w; ܗAwsw+ w:!w(tFQ uuVn݄w0|%77H|C|CD77R|}cE-M&R|S|ẃEfr"+y`M"|s|k$4yqbr!Zm\\^~Vww7oV+i` F[b5.\_\Z\?۵yyg2:zXoƓKsy]ITW3?c?0 Z::zJ#S3 K+k66vv> |8(  *Aw0H0/Xlll,v    NN . >\\\\_{˂ǂ'gCJ Pz( ZڅC]B=B}BCCBBCCB3CsBCB;nIڍ#dE#Ɔ)23yQ/ߥbicTC|\v ;;-m)7wKJ Q{n /g Bʱ|DŽږ&ŶTƎ Mtdl{Ig\簗UAٸ&;rQꄴS;4i}cM>/m4wwv)^[x1wYɜ櫺#o]|Xq#gWNm [(9?!='goj3߰ :g1Ι#\m%`mMiseùLc:,ܜmK~C>8K*r2CkEո̿z>˷BtG}F4QcͲ zT8巃cg^LOrgfGo3䷋p ֓=ڣˮKi%t2N{f:k v3=1l_c&y,osm[~CJ=b7s^`˫v$ʉ\;v;*UXȫ,_mÞyv}m &WR\s9rx&OqWNpm59%Sa(a{3U?%Ϲ$*742Di8̡Dz${F/pA WWڊp5 B'>O:B׊9uD_Dgq-]ǧ`׋% ~G 7Q_q\lA7b D*Tgdci+NhMӱ|:NCV71u:Cա:\N'ԑHVN=r:VgSTΥP](H .S E}B}BJUPWK]n99Q_R7 {uwECD/E++\=]P-Zhek9VWk kkkbXtѮ׮]ZoM3;]=ym\ViD/mZvgDwYb<S)OS|w7ǧxs~>{O)ރ|O$O$~<-yX yx6$H>%^SM|O)އ|wOZZ!>OX7[7YC(I7R['kNooNm&5olC84)漠$P*6/r庁J@  MM ZZ Z ZZ z25v۠@>(8 ::*w$ڨJ=PCP3PkP{P')M aEy߲X59.^Bè$rDxsG~Szv 5'؇Mq+MV@aƞ-.xS^o1~=aCɭ*ʗ) [hsv*¦; /kv * e٥.x FOTjTNewV/Oqw6 e/j5^,ߥx>9y־Kk vDMy?a˸)/t9֘QqՒ+gJs܋l0sW]O?"~_ҴfO9''.iq+,[чHqhƦwKezᯪ'dF,icW. *~4dEKz_V0lbnS}\e[OjoEem~B?ʑLu/'=r>^R__u^,g}<.>i*r]x (+f}& iDm+]0 FߒWA絹~>#[a%_cbsWu^5դ&x.oźWzJ-zG 4=\|nh\a0>Lp}ӅJ?Yobګ%G[.$ﵥ만xY!9gcߪQm.>gXJ}YOPjJr.}_ru_?؟jǕ땟6Vi9GO*U_-W?By?g:^LǬyiT0aq[U4!UTtM#gvJ/u}~nػ]zU,N^?͐~nEI^k+*_ צXλоy9?tVq~پV*˾Z>WK|O?y"/zrC_ǫܟ}&JXERҾR}Utjz5)g~_u?W;aMc,[{}O8}UQ~F|m*κ+wܡݽMw㫄M^ȹ*m55>΍M+=D/b)!"WxHi"2DH_KԢ"""$rD0OehLh-ZSR\IiާOQs稩yЃ^MFP hWjZcMi5bMYhy#R>ֱugYqub'Y&8:!:!5U?!Ԃe^Y@ z!5dQ݈M}I\:lu>>>:@  |l!0In%B}z !VEHeP4`+ɀl^DȤ`1 F!^Kccj̟j-1pScelUЄFhJ 4MiBs9 [GhA"\ΟnIFhIAhI gM:[_st5}ІEhöfufRSu[$'d0 aҲlYImؾlYM)2"[dS-> rE.:uE]jc (E>ez])Ԟ?^4re2MESgbۋ]%.SRE+ъy,y,YbK׎ uϊg?'WE}tT|1k5u߈orBkŷ[iiJWyyQWOsOsiiA<{.GzKOK+=+jSuԝG0`692@G͠ޭ+Sƒހ#?F@} _Яa2 Fl`Ҳ77’_M?^Bwo),bb^8 Z% JxZ^KYMNzQ.'2fc8Z4rq!h"c'DD#Ə}ğoڵwIR{v/P%/W ߤVKI,E~?u]qo%x "S 9*^kr>B k{^]1vgٵD㭒K1dˑFZ&8/&*ue"aF01z`(Rxlѓ$Y$  1i܄D*c[-rMeѐmhh؉#(W=c%N ӂQVX76);+Xr4zb ݌.ThOˎwR=s1c酑2d #e>F21 wnxNY "LHvыmDh۸Gq1.cWI<^bx]''AtϾx|};~kmux=kCqgnxL<2Ͽ#x FduցuPzu/M`]WA! \&TC؄jv ZV|JrGeIyYYyE٢A٪lSlWP*W)_+Ǖoʷ)\9ϴzz@ iIZf{55]m͟P#kW1*0]M>zr> \ l< ܮ|LR~"}@9<<{<{tʀGT:1guATX IN#T.tRK(g{ygx#^5D UUUUUUUUQ( EP4[MD`3 (mgl3K[WEg`(ozQExpX3sʳʳs eoVnOD(M'K9nEI$x DOJ('^B>S n5xQޏ}NfIa͍qWelD;Q#>^1 kgS0[`>^q Īaj`3:9+ h>l!zb$l1f[f߼R^#l_]Uu` a^]yՉkda^ևk\yߵ\Jk%׭Qƍ\FkWr=* 0d9O 2iùZsúz^Ckzgz}Ho76aKP_|"?J@k ku5úǚmoͳZXYˬ'XkYZ[MfUkGk!mPaim43?0?6yA [-ފyvK"n݀C ТlG Ir4Yеuhd빥D- YIzJi9_wb wFF|gݬd7}ǯXCRK$ܥػ UN rW7+ӎ?;_g[S`20yR~Ljè=Eb1ÊZb1>!:ٿRg_` 2xE| 5W)jލDooUN׫=վ/|*5|5=#+Io$\Y[]OR\)RzI/eIs)5)2܌2dL͸3㾌?dxwY)YY˺1_րgmڞa'Y:GEn,,y?Ⱦ_=fw=;繜9[37;^nQ/rNϽ?wqEɭ3:oYކ|-ߓ5>?Z \ f|TUA9 (\x~zܢ EQ4hkV_սפ)Xt͕k~=kb7ʍmە_U^\~}=叔?Qpy,F'GFcsq k1&)=m.We=XV{;W\[]_NC@V >Z]|&Jp+fྤIa2˭nV/:$O)I2/ekSԙ8㦌YglϤ'(FV$sVVoΚR֎>:u2BȘȊ{#@c^!͜skέ[?J>.k5Ni][/|~z=7pCނ )B?:SHQiѭ ǵuun{\k:fcRy<%ھN%ʗP(E#щ)wR/bb[c[b=[{&.XCcc76%69v[lRXձvXV,=K%1wLQT7ѯ}+ft[t׹OO=vO>TɩnrSOu:T:TSm㎏=>㣎<>8 ǯ;^|<}}W_e|Uj~Re//[Wlu٪eO({lyٲ˖=ZGe(Q6즲~emZ*iYeYe5R‡w~vx?xx;_qX{hԡC5J=r:|(P_r{/~~osglt<_ǣc׍]=vؕc1oydLڵeӂi4/͛IsRO|}=d]muڇ=?'ϋ|㯾&FFW`>}A9Щ8oQ<@=AFP_zyR (Bj44dǩhIPmSwAAa1.[E1HOe1}e> .ăAJC6h7!(z2>!Io8&Z6g٤@ j rAC~FKAB<&x YàE!dGmItXe 6鐱[?g6鲞6M&}16-ڄ]1٤1f|sm} ~%@߂i'xMf 6 <!gm 1D~X@ ؤklxw΃π~8W@D_7 7A5ÍDۍ bO%a% cl e^`^$Ky{,7+ ~#16#aa,r+xƽD0#ƻ‰# A["]_K_FٰQر] j:n\46|/#B9;9 oц\`?*zE{빐].*fro>;6l!c dc;sd>dc>ɇC(+|0?M!̩|P}l aܛ0w|%$>7rc ]=lm+HB CI$QY'BMI(cc" k'_&amQBIF6%BJ BAk!k!Jjߙ ۫P2K, ";sjl"e|FHD~plJoXædÆ mJ~:'Z Z Iܱ~x5t1a5t2j՘5&.p |8>a ڰl.`M1lq li :d |̋&|u c?Ep e7l21ʡK6VˑDs&YzۂX(og []C&QS>g9V.*=c-`bmU?ku91>ʱ41'?c_=bmh(tNMnt"˄ߎb~#) y`12ܞܨH⣖ Kx6 +1}W"D5Z% sWPp-/ N. }}|S'\&yό)DIL&ɢJ4A5)jQmL"kOiՋ?UR1]vѧѕԞt5SGD\yHyj("Os^ԛЍԷ򹮛hL$?G0+zSVjZC:~9z+z6h "L@h i*=Ii,,Sh_>/߉n?H#vr:OGw-h-m{h(w gcO3_ KxW{x4>؜^ o{1#fw#}u~^zq?F%[Bـv)H[!rO4[ J  eZehu6j%ڗ\ݦJDSuG_ je_tmVM-ZRwQ|j݉Xbݭܩ O. K,:FŽ=jJgZ.>BޡtKT eK6GKQ>6 aPq8Fw^xٰ\EJl8b ;Ձ'>-W[ul ^*1F;w+kbJ]CPGsRuۍ$O}-W3hthڜƀ񧁺BI_r$\}~H<]j1F(d-}lr*"I땺[7e7(:e$YO=kWkuszmPԵGsv,-FZϾ`+$#c1_"嶞4u+Ig ]WwQz{?Fpw+5ھe#uGht6.qOd뗏V};6orѽ=ۥ y"M:uW_lb[[k{IVQgw6//So4%7i2%?:wkq1n:0C=nM7HW4u}TȊ?ƞRD nfd3写g3iiO{ţD+F'KDV~2Q7Dikb`DtǢCrIKrYPŰ0g^m;G"y3DfmQAZJAAo-fJڜTc>/$*ÓStjI•Fc Է.uzI5+G N=ā#l}HIG&[%iVaޮ$oߒZUF\o)ҒZ\޼i ^ 19SXKM"NMKnyabcF?ӷvӳ={>7xi{~(( lloyzS[_Ҳj=WPݸ $SQӭ/\p>й[ ͫʯ߁35|Ƣ:"yzun]G =Pv~V t-<9`H, A eRۏ8tQ)*XZҁ&'Ir iA~y96a5Сo~7+6r}ơV"kWxϞ#}}'lDȬًϾg}c>yսlټľo(x~I@sd4=sȓ{Njj"T1'#3x(33#dg&{^ ;܊IPT/)5RpŒLG5țK Gj$qk }A54SjC3?;¨3k%]tָH[Fir88p 䛴Chnfj˔~9BMOԦ"KIR3[S37fY̼ 1G|Jy$dy|;ٟWC鯙\۪$OY.4jlIO7kJ7#{{nn2?:/i7ǫ[N:N:Ig$Y#BXEրa0 5BD@@D@d%,n *3"2 ˯nw~НuNsNSw%X נ:^7 {G< vy9<o$@dJhNvOe<Ã4G-] #atKK }X]{㟶]ߠ=Nj?ԳC_>Z8`ڗ15ڊ-2G Zb2( m:j\'C hҼQ5HoS\>z&;k|&(`q0<9;k{tuaS1'8䘣 %:{<}B)]aBM>&Mdr'xMLJ%pKG 0Ws/ikKMzokں@Ɨ魧-4>Ǥx_)%hյm^129uɾٯx )5<5`S` B(I(7/Fw LLVHZ_")!=N52@o0Lӱ/DL 3phhT8YMx1%s9!z5\.k惖Z,=Jh#^xDZm bjLK- n(3n J l2J+y4_%"Ld/֬Q@VBuh m3ڏ%G'8ث'N:Ň;-?l8P_ 9Zכ{x ^胉ۙ#NC-ÝrcG`/4a)6V$,1&gn8V8Sa|7,|,L.p=ݫq±Qԛ#xiU׆eg@ր,V $rssp?5FwX9FDYu#Vbl4` vn<7rY3kQb>+>PSU {L/mˆ9ڹMZܹՋ| |;e}isKnzx߂7/XrZ&ퟓ&L:|s>o}Tnm1yD&P"wPhX,)O.JVFup$bH'cܬ /bkT?͑F,(@ i,E3]h4NC .Bsk:f5a0Ү_AF&Qu+x" ~\Nl`jŹ$නD "xn$Y`?Ngț,=^zᅗC0sՊ4b1wvVetL ϝBiFuuU̓yx H^$6RT$ 1EFq2fɘ&";D[U;gL(?!&HB9R*{B<FLy./̗(;c| Ӥ"ƉiL1up㠾&`[8VjU'flz#2g9TT+Y1(“Sx( 7Q=Ew%os*QIj#$F Q0 P8'3|\o2(tXE[Cn֮'_dI.;*~Wguzea\N%UkAȜ?v< ghwI|5jhj7=$am#vc9leAg5!bl,"XB+1G]klA#x8 99j"Ŗ;Ԗ_L߿IFxS;e?zm_~vB -jUAh4d2Y818S]W%QBxP)[(K#yHg׷%nAB(_St.7>.}p4!"%j\خ?iIW8y+qx)YdXg33X1F2sZ SB7J[u_@m˷59}HMPp<r 8E1l H)(B*y:Ž&pS٩t"~_+xFP_f r/aeeWs.q|uuϣCQ˟&cmA40xfD&Iz3^_?xF-0ـ< y< E!:!pXSge d'NIq.s[HJS7D<]mzQQȦG#xҳ3:=Y0=a{O95jӷ3ݤV^yC5+:ܖw:Ν8+܁s_>k3OĴ={R,juebrrR%*GėD_/ف V!ATB$I#Юz2xgIt }XYFj\yD [l:LvebGco3Ĭ.Vd;;Oj |]wӧ1KZk Lx;X[zR-E _Fa+?3"1`gF0s,r t6Kb'sP[AOap Md'r4dgrSZO2! Co ú;N@Fl+Tp<)+KLlQ,$<1X޹5$Hv  $9#3+6׈ Gtḷ?]׎Ј.ZdF%#:֡6v.4ٿ{# YbZp)(a Xc.ADALAWf747lϖm@Wu;%:By?>iڳgc]Gk[OjBkm;0daR}CRT6g:ݿ١Y"cnFC]R۾IWblZjUu[5]m|f}Ͽﵯ'&?:C$ỵ; }b1ҷ| 0fט52XcэOlAܯR'C$y"vlu^{hKqƷkxGp㸱?z|&/SĞ[^pqPdA`P"yuѭַl߭ϵ!?ۀ`~(poCƽp@B{oNȪZ ~#G87z؏uGG4I!&A;0]Q,(G\8a-NAӹh1ֈ/!f"# i%LA5N`JA/ka'2w@xWT^ccI) Rkz |܍<;Z&¯׃/x%Ad6\7դp ii\N U{ 8"yyr9|1VRnm͛ԩ3iz#_{驩ۚl[SSយ^aϞWe_',6np` [{ c2s2s),3K9R_ߚߧRuo&c#,]~U **J*CTeT)UJ[zg6iSVzn]+Avڿ]~?+Xc퀝m<;L/VeZCa 1GCP1;{P($=$6< qh3M' OH `*039x}YB0C)UI4c =6k*g7pddf6n2oy}^_32oft9ŞfR3@ߐo979IfL#]őLʰyX cEx٭ldH^ 2fɊHXȊXP cA,. K\5 YRVfY9uʩrW<* ip;MxZ^Ηױ5ryn^d̰C,R!IR 3y\ě>L/נiEÙ~0D" 7M3`i\%{L.nHKvyN;<_מ:a:[|6jQ_= k.؁2 \vD$Yjhl‚kb-2$M%,Vd7 ꡽wI#Ct65p"/1(9ڤ|\Sy<4B!OkLsM+M6A`I3 hD pѲ0ƚc-~-rb"'~S9aml$w4t4v2-}@*RUCX$71և 8 fb> b)lnn)24Ahh)V33,ŦŖuRθ޼޲ŰG֋[qx-93ݴBHf|C9Z]NxZV1vU9^K Ɗz>8"q8DiP? UG} Z 1L)z |1` I] GJa)*cJRnXekxwGIfR2cK|r;B}l4ǒt4)R7pDvH`<"9w%Krx#.0" h녹!('rC[4[~$ 6?aS:#Ȥ+ w*4/`e6o;kv֭Dz!?Q>bȲ㚧k]vز__x\ˆZ<͓^ZŧКtRn-D0HʹG9ňPȠT[Qx1ji "6WrRWp-ށ~$N'y{DVnقz^{߷ٿH5ݿ` ab^ܕ4p >A 6Q$M:jck BMlXZ$79/8u RM"\ͦ9 0aݔnv?A  ׃D@B!v@E]W= kmʱc^ =}Ùj;'W!owC>Zݲ@HqNmQb֖-0m{S#ɎowHLA JNCS3SbKW Dj& G>3eyт~@@ S_/HES_*T~ԇ)ɩinєM>)SW ]չ O|KYlo7]5mn"r_|)qq#v>=>_}_Yyƺk۷9Sd" ,^\ OD'|wSkWd7'-}VJRV Gܠ''Oʉ'ȑo@4A}@w5nOw"@S9O>nݣk$C{$Hr-jS ^B l6ZH%R}9/ck0yOv k|URRZZRՂg.9䑒_._T+YE͛볈 j7'O~Ǘ|3%%Fj¯GpRR۽ZjO{)62<]#Oe"e ]%#y%`/ HB;l3KF (dYii)8Csޕ5|uJRͮ)-ӧuaA9VUAy%G2[DC+I Q86{ut~{t0س{aށ}0c7O3'/*(ا}KؤJx)aTFli]Y3^{ĴSLdէ$?Sl fv 6XIzRe=$?9O VgҘץOǢ \ٽDg 6F~RaIiVϐ'0y]_Џ*%|1Y4$*ݎe2]^u6q̈8ZGsd"w6$X(~'2۵kȕ9N>zf=(:e^#\ wA@9ie(٩́ v7B%}d0wl\@.Xl+\,>=|c{f}_'zpDg s]UF=30ìحщ1?l_R4t}|v)@7-Cгz~rsk4]~q_[e33ԅts&?8;W~tjbM{g)WùU([u%;vp_?0xA50Q<#h5(LtI6I4 D}/YO3!U]9O[t'4$}f3ڭ\ї"y}|=dSV `oGZ68`@3: 6oy<2a$JY9s<-4nѶ惣Ȳ{rg+=} ^h|2=^4F-9[&D]h_^OmAB) c)V`( 71qc&7Hax%j[.JOQcᇯ&>S5aq[/Lyq†h2mnl2Jd,c}Y#6(py1`[< undu9 ,g@-Xam[s.mxV4~AoS^|k)Kcؕɍ|^xs]|￯|ɘ^YX PH\3ٗI( 6InNLHU-rM/}'[LXP%BNiiiia#]/yx#:,<`iɑ_>,* |lqgy|Gh0]h -(Sq]dUpuLVYT9 XzےH[u>T@בch? ^ hlm%,4l{ T2ZM8wKV;dM$fŒZ="c$1o;:םzM6cbs'&a܈qr4ݫ 3 ͊fO*{cS0Wfhj4tό杖8g$Qk'N>g^VX8|v %júv4 CFGz_aڿ.f@>S^|״Kur)zc`Z[fYZ,fb6:PguJgWMUY#M6;Q(z) R}w_?l׫tkqں=+̀W 4:${vi|t^nz_9^uB̮U Jn.9TϽ찖}jwR[بv'%zl,bCx0/>iJ'ש1Wq(1ai{~r~F9T@וP\O/ h#pjN2աyEbXhs&TE#-8ZD{ GEU9h{ -\}B[~sXc_iY竫z$Rw,^ 'YS6#::ɞĬ/mgLD$&E>^LVڊ Ek9w~v.iWI:*IZ8 o,~Kڟ6 2/ $A6WN4&.vvN'igw+U%*v亼pϙ5;ߗ>K{zFq}y>痿f H]qlIpC<\+~|Œ7Wvex{A0BajV'mm"FoHkV(y^s~GJose$ֻ6uVh[Z=RTsjGT)4U*-̲Zؑ=/ئnQۦt5@)QE6vn{0i2Uh/7z\KS ;R-N ybRBZ!EB͡LK-4MH)ZL2/hhh LVmf6mgf. U B,eB #wA9_n*7[J۔-mWUѦmEm涝nnV<-RQapU4n]ܣgb>㩿Lx؏'k>}Z^=wG( ",00Dpcsswg9}ƌn]Uń(?M%Ox{XIzwקU@u΄0(6`mC7oJh_=1 +ק~#K>%XO0ޭM/z 1h;{fjIJejJ/!KT*iT?%9%-͟K`SSїX|LS\ۛ1i)-`6 CJtÖ"VT 1!K [UA܀iQ),_VrzJԶ)Ry%ZީS)T?c2n3ewD*P,WݯU٫YqUU ÚԐq-OVOdiN)h=,ϯQz)ҷi@[Mۉƥ*?Q;Ǭ*;z?4Lվxv[7`GN(=^OD ‡h#XᱩS^y}ڽ;pZG>ϋ|w);̈c` JWl=!;CHjE,l;1=8~w W%[U2Vf9+c(_UyUIU*,{\u)] mM%Xsp>Yi7'ŬOj5<;憐'ahPB &y25WVr<1ۚvǜ_#7u_2܎k/.)e{2.?pO~ݚN'(9|{3HUJxGtu]%qP;s%9?ُbHȤ ƀ8K OySnɄjHqF,̚{\wJJV'#|Bȸ}dxQcm.Wh= iD;-(@cyT~g>I@thSp.cѦs_#~!-GhM2]^!;UɊ{T<reYᅨmV-K!=D+h?Yo}מH{-9(SȓȽLXo};pi/3~CGu߾joIM dRF5rk cd 2fIH%Uetjv@iԆTZMҊr?^A40g97ZY/qcs_]x'ՀphoUcd-tB ^,C)Gbt nLF~2i!~=Ƌ;8U#q< 5:UnbT"- uhI6; SѢ d}C-dE~=3-\>oz_:!/UZW*Sn@(7Hq%~Fw׏2_@t {hyyRP7(>cTO=>^ ÐXC$}Ir8I/;w/r5fm> ,m MM$cQl19(W* NIT nv> ?=zKKR-~ 1% 8 !K_#}CGi1}2,BՁ O0 zNo&ȡL=ca.UrB{L=~<6| ӠXA#"D٩4PM0dC̀(tL33jk=c.n`RlAT@R<'w$/֦ZJV;\yv5Neu^S${!"d(ĸRp)r+ao#͇5҇g*x k& UXkxcewyGpۈIZFMZv{߉. n/?ciEn1H_BLjY[,9!9/Gp,[Ie9>~ר~ǶxkXC8L'Plz 4Rl06DyeL-L=V¹3&W-ɜ[/>r@B>rʊ .jȁRiO$;uɶCkى&NZ?=e*[qgUݽv s$0 HxHuP+51ƨCND,mJU4&Q"=L"8 SSCK 1GоMdgOq{_J觶2݄" ӝWb1ڎڃ$F1xG_nb?n /_}YI_6xM $a##y0=\cXcȞcSd'VNe' ޿׷}C7LýiC;}nφp2SRB]1zȣ4FO^C9;vƦ({$5)/mҠLgN8G|Jv$ O?)r+r7~q\ՅBP{(t}Nm]WUN:NÚ$ a' ʢF!E"M" 23͍8wqT+sNU/ }le=N]s|nI3ㄊp FGEqj{{!?iܯGTTrӖcwGH"gYui$7U}U~6Eu<:rU/X(篖Sޯ8"~}U(Kȿ/н&a]4džֺ*vXp ,Jcݶ=Hu*r>(@q:֩?k~U;ݸF@(|y)8ÎvV~ ڔ]RMii7[{4v,h 2+tqyzp98\t̮ީ'BbگY*kLHN6h)3|ٵ 4:X fy0gB*ή@-v *nYEyPOݍ;9K?@JN}$%/ggtR=܍j7Hs\%)|w7% QSWQ͡ /z g2*7|6ZVG:7>ʈ`:XuFuľ8]&(gψxwx}d"L=NWcJ&KTb*2oO(2*DyshMF̍Xw&\d|1FG@ EIJ;Ug}fr< .:W 5ΌA|>,1P^J^dQ1.dMxZC/)|%%{SU&3${zQJX\A3,z Nq}NPw8ŵ` v#=GK 1 k1 =zdq@KZWzxf|՚+l9_S`G* sCiRVC(ScmHK>;]3?X ݬ577ӛe]G/4 ݃ZT3M5,n϶%Kǖ?lXk^'<Ҽb͏L+uk _#.-Yx%33;gn߽;'{~FQP8mupTNoO%ozont1)OJ+Y:9;G|Ǿ& z[zԹ*h҃04C5AE]W_EcW I %F$uL>NsT ~Ks&jZ~}C֤$9[!=_Oz]_)i*\J{*`>< 0#v"f r+}\2D[~S |xNp->{'%)]W]ce7t"쵖;yRxj5:[^E\<ú1q^=K^' &݂O6ŋΌݲgG/:sޚ*_?C|CjG/Xuss.?~IGu_ h5؉Gh *2Ep@IҢvQ4Lr3ΗֶBmZ71K[tjd *mn氌 - =^!Ѵb`ǡ;ac#yd(@cl#c4[ bHC tϥB#ڂjZν+p & 'CdG>#1}wKԜ݇|û99jP4ɓZ4J=LMۇ xwjo9Q p]v&J%Q9us%]`uSec\\6h ;JթZCJA bjoE>X+ ӎ6̌-sX߇og%mO@O1wیYe4ߦu{=!*nŮ4ʃI0{+Ħ"5̐ \ȯe> w;u`׆v 9_{$Z#^a)xtxqk!pa 4bsoI${ųġRu upfVohg4_n% N"O l0bТZtj2$!)F٘Q|^$p͸q _CL8t]CC*H\Qk0Z(DGUQG7 ++Q$+/MF茘z: 2(a̙!,Y+k1Ӧu:KƓ7!iqQk" u:ޮ :uuwuˌukuu"-* 9qv 0|-h=~:aaàK멎 {]]+ ׌ zl =\=#̥1>/o Y`9Y<JxM|S3\$r:3":U2[Qd=6hY L@BOlAcPFֈtak+|F`Pc[qqk)\`tv'MYo<9g_?M*/& 1L њ-=2@#39k}TzM̭Jͺ^\ +pĀ @A+9AC`Ӧ] -]RQѲGƎt ΏyK}SZo|{i{_;{F߾-9-Fi 6K0eRo2iTJQQ }ͥeܬ]`l8/ 'Rwe5ɬ rXn3A@O:!~O}8&+%$]˿BjwYEq(e2?ܨ -_pYIO7xOQOup7d%QH?B KJe4GԐjmrLtӰuޒGhЁ! Jwed] 0s''ƌ$t*%dGn0kQy ?`?<_xJKiiBLaHFuR?D8C&QN( $ҤPaw"x] 3~xǭzsBcE;۷&w1gH&K,63$mgD8&ВJ<`)QךWUzh(LHT]J/gĢpkSE/*(c̢rY`؀t"= 31S4N3'nDeCWJzKrjX#L̛ Bj-rZK=KT9ԸH 9RJ/kI |EAa|R5WqGV7ןGߟ+=q wyݹnN5O}0mOO~T]m_Q}IХ$k>c1& DPtL+%Y-DUpmʲ9C\{y$!ju^җ2@ߊ AȟMDj0=#3%3-˚e,f2NtPR\rI${<ݽ]S&wNۣ_hD{a}tpVoξ¤ObSM3֮/%Ўյ@'}7T*/LFqB EЧ DdH6lp])f%jBRj4R(Ƅʼn\ =p6P2y`JK:#NU9E-3칃чI4]1ML&+ǑZNqT1 $$:EnD$aMm(rݩf8"2 n"{${^FƇ/%PHj";9kI@ͫOlFA%4Ȗ{ L|wi*ֻ $U۪9v*. TRi`(b!\:¼o4;&%ln"وŪۓm(BeVj\KVM4oBs 믑-r^$/O SGN_^ ]FL?}⸌'fph6OTC^WyZƃĦ a}0&v=sȫNF.ykaf}hV8UZ֦,KzԉYkڠ׾67ˀNϠo}/pk^d4Lq- O\\CĬ&`9ɔ)zۏC'P9 OP "'9Dur6oK{O`9P#xjIH& 5#5BB FGBo<e2hbpk nZp{.Op ^):R̳ ɖ=EE:\U*lu% 9)H i0z^#W:1&ij2&3Z10#tb{F^]oU[a,._~e4z5I݁dzy@!)Oh2zڤ3X@it :):h:8fS8A,;5i*3TbQy dd,8// N2(FL !m&Eug&҈Io2r:e:c'~DNQ^aN[˛U~ﮔDmR? uGtz̛Q}J&L2^o{BLtrG0M0/\S^< V4!Ϛr[W=Xռ3|ö؜{1C+cL,b \"%iPrI;Zu~IlQ_]ܑVA(R;op Jz1/jWX ݣ{{ݶDz?@j#9;%?g`'=4' \WȪ8fHrvkMj][(ܜۚ WAHy)@ s6^wR^ه%vʨ<Uia "L@M!06l<ߎ=zQe*@_}MYGPӾfX{Unݫs<&hI%pFځ68̀aP8DH!כFp ¤o y"؏a&ԜߣzF O.*`,X||wk%Cui:Nʷކ{^ď&P%X߆{O{Im<{N[5h4ͨbSCRp24QrZ}4y|Ә#ut%/?׸ Лu:`ЏyWi[ Ai}mP'jl6]Y7Y_>EzVסr<Ʈrf>A^9pM5*48Qq̩p%o9u~kRKV x익m^)?=6 U1;b6:ƚ (舡^ܙ ֧لR]V9'7If} OW[߾o}+bfoy~?*׺ȒT| [S1ƀ޷8O(OFuxcjzy!?}Ἤ c\}i) yKglWqTAHN  k9qp؆02`/jbjF10Ԕ/ǠQ{TS=X,oW10OR mZ!%es &H&sZn@WwvWcr &IryB6*Րר NgtȾ"OV,x#xRQ^`c{kE}M4xj~8 c|g%&_/GE{0A%AI?@5p_ލ{pt7(ߎ=J'Iڝ@$s-뉕`%r v VvWhǃVRgXQf%,8??Cʎ}U3HvG, ֍՞";>gm {ǩTNI}x:{ >>{ S1}E$bKT8,;ԚtWNF#(Ӎ*MRU.;D]Ɠum5!vdvIfd !w=PynӀgV{f$ m;F{ɝI|cn="fx!N-wV7N3ixb w~rWUߞ9Yrg a`X7Dn<܇gRM #g[{1<^^m_R|ZqE|^ofEq|?;>LXH~?Ы{ٙ{Ι{@‘-3,g^\`{7}=iф啃<:Ѓ{-~Pi!ŕ#UXԸK*rf~'Lųgu224I]_)_"M(V.4Ĵ##YF䢀 Vk6H Om}n7P+>P#O@Ѓ T>kY0#U JyeB;쩅L߯*㋍=5\ךb\|Y+J| (VKp/3>Rü{sLݼZňV_ԁ-Ul{>rm8n7F9r䨪dZ^:hH29gGS*+}t]eedcE12f@^0H9zr|f.\"{ڸsq3dɚF yj򕢝"d';ai.) 0 ׏3f,H;vW!3wO=2t㫇8ԑ#aҌ礉{3?~3[/QvJU9+F%u .q1kUZS*V`,VK),:ɒaiblb2VpحIfޑȷ9[KͳsˬW8v:P5O s!0ƍRGwӵ2-yY׷l1 x$lUOCFh:."9PK VNCho? x\$LC.c[2,-CMlv8nss>1:|'4l8앎W#Za|?ظ?q[,<#>0K>?T-KQ-G a4%~$!}\'AıBOޠ䋱OsgQ!pvB>EJ1&],EqGHn%Oy?$ʣe+E8RV|WH/<ٶ̚wV yཛUuh訐'1ٸv; 7sK;εk:$(_S |!Tq-Zס<>1^)T3Fg`RT^^q )}X {NAWܨwQj1;rɒ3( Z3n#i Dߠl Y.VX%> !{rk0ֹ{=5GHqp-YB͟ݮ C+*d=x~(:'ީ)c<h;95 1rMn|c7: ޡO1h|@LEH5AqD]琅%5,5ɍ%Nb\|*-(ӨWr|"wRlM _oDcԡq:\G>rAi ZD_d~M_,DLȔ"}]ϖ\ܒcH`"`#hqYCcv_Bj~8u얥.U5kveu~ V/Y<{޲/"?KVk֔LkA~pug ۳iHz[FMڶ]eE.-yЍP.H.,W^L4(J?̀7{p9#ҰF9fk w:oO7qvA[nIq m.Eq=`E@Xqps- 4(n hztm Mmf%^Aś&p"C!?Om6Pj ێg'7 b.ƻIzΎ]ܾ或DM "0QփevwbY[]nG%vwiOyty#F|#FퟴA99Y6;ع`MIή.̀9};ܹ\ L]X.ɲ}2"E$wyPo:Mjd]@"&ލ}&ME]?#^6Qr8I-=m&C]JrKz1ZqKQbD5qko˽ ?An9(_/QĆ5:w=Y׏@IJcʹhsAAepke"TϣcYe4B̧W5tQ[x/}?fr%r>N%G<4d)f6d?C$+;I OFNwRG`;$[& 4$&c}SkzE@t9Z i=GFpozw_ X^o_1YdbdQ E p'k3m d#4VVDR&V 4D?zywz)je/"E`|*K_/9|>P{L΋l޻Yn?A{?]ڱƸ~V b7b,_@r}jP T@5?:CdȖ!šONn<ǝ9|dr+-pJ.B0D EpxxUuPDyȯc, v-r]6 >Heف|Sg4V[[CIד&FǂIrC#y =EZoar%0º 㾎9扒V`VWY pl<9xxǸa ^7&ʠ׳ζN;ط39_Z%e$Ҽl xMX)q }3<48RT?V@ExuE+LPQ\e QeG1Ohh+dntiOR=Dl+(S#[=H%Zв酯?rY|ssf]m)՞8ƈ\JHXUF~C^l 6'_7*+X ȃWk`HעE֟)YMGxi vzYM@RpãJ`{`)F͹}BDd7jNS(<'AINlZ"5Idt.ϩSmP:Vhh҄yWQV,h^E@bJWF4a`ǐ,m XI;D *fh2 mjZ( K@ 9YJ/e9ְk4[-/ix/z&]ٳmgXMd- 6jwՏ?;OP,?>N8Vo raDAo65P!Tnrs񲤝IGU!LX* r0tPשY{whm/sŠi/J9- BO>)݄B}qk2!M?# ?&S|};L]~J'=O`j] ^ʳ,y, $+t̅0B{|Z ~\ޕ:>W3@۾A=eӔl0s&%$` F{L&dmQ8\cj솽Qܟ_r2%`yBT~2KKi2ϘD.+2Vץ XtNG_fNߖfv^aZN6N2$]Q`Z&Oih7uCgx,-ǼYӦMkdُUt߽; W3b qE Ėe7pJOɅSZeC)RU6u O6y0pn7^%Dl\T`ֆsE`]Tl'Wbo_T<$|Ч*R $i+8{7A.>*)MJwb Sÿ!b#${Qf]w?؅?m{Q/ZO8+X >k k|i"7nbB+1ĊAbN(2e옑-g~Qؾ]E1@ .B.RҶA"(̙zM׮E#Z!i(q%W,B5c9C&ҌzgZZU>geradmUn󧩘Z6w=M|P9CQV-B[~gEZ8vt׼!}&>I(ch.`@P[p/Ki8;ug;W-KX7mz 'I=B}$O3Mg^4XMJQā~Ca9qocۨUE$ۙ$w!( \*~5e \y+a לbfK/H!kL?_R?7U]MIZlGAEOQ>ėM۷ry}!|\o2y1cɩ>an[mۺv>#)r`ǝwN0F_JV[Àz3$^cBCn<&r`zU;|X tBj+n \E/_@g$ V> M=m_O@uDbt=H86,Rni:a4iTY݃iI|mH'<*e *ۖMo$ ;&(z2춠Mcqp. ۢɃK/ %Sf@KIf?n _Y=C?;}2ݗ22v^sGO߷mݻ6ܽ &hMdooEw v}/dsY)bwH~ eer${FUp e9]U5[MZ} KF(:^X_Mk>ݳ44_ DG=oWӼ1,y~]ٸIǍR7|Ԑ_2A.>̭g}9={N3oKn%RFcKNS$& %C1V4;n3nl.ԩ&$<GᦄV>H%0`$BZ?ܨv#ӴpQqܹ[ R6*ʉ+rB2܎<+ X |Erxtω3sGīA/op-@MC9l~s=P%ڠ& D# Ab(2B@!Y|n@ }w_Ί{)ԥ`ܠr8JXeojRHzNh<"Ȗ+8FR}+'āDTQQD1eڹJ.Z|j"EȢf%Q!g't)jRE5  :yPOA'8样gOo%Esƈ^juG a/O-)ɕ|ʘq;$753$@ըH(Q)ʴb{߆XOٕעS31^(SlbYT3 J ZcnWqD8Zj Fy32֌xբ3P.1L :ېfuYrxxN,IɆpA9o C%|9G>9Y$,p|&yBRSp|#Q4@0f"(w2 5-@(X FUe7/hFhFr8 9`YuLHNTĠYTGП y`wï6>Uߙw8 grO_^'Ok^ -Uf/0T Z$@{lpkGWT4 "* hMqse"g-q a $3:& e!I̲3_g3?lԂ)%b]!3*Vr&h麱cC=/3iB>?} ˌ*%F?M>|cǑYy}*zPn<['ta I czZÕh"ӔyN.X{M8*;j[l $lgQݹՐ٘*Nfa.]r~ۖʖHEF7)BAMƤdD(5**Z4m#OȈ 4eܡ#:(>"C{xhɌSc4lUQq&lF$Eg"eO)9^~2nǍmjc.[0q=mޒDqQZ#g(IQ@5"äШOwb'2uEUYJ ՜Ɋyf~52Pc>Z) ؒSà=J#zT4b'$o$?xY|M7ᇨ/P7)s` #"JN^ Y DXkt(ScP0}mu|r>ݒWrZ\">[?R5 )篯Xz6]r+"=ù*4eIMؗQDҢpt7uɚz|Pc%gYɂljvlsA X{2iKu\{+ʟ=/o:(̺ɧeC8ȕ4ъ×q=U;(suS -bd*rJBb jH=C?84 4Pҫw}Lnjs" r6tm]'4 dyޣ ,}h(`"KM5εȂ;ILV(Jo34&k FT܄9/- Ĵ,xK'(P;KgQ7^ au}ܫרI^Nuܾk'FF>xP/ h>e1IC|Ks+bؖtPo {lP*V} #2Wqlȯ#g%+l%oH6ƄTںj㭯Dk{qDsPwaCzܢFѶzبnbt.:4dKB.MhmaBR` R:&Xn_ŋًs_=!ğ?ZV,]EuK^r]~e*vGœ lZ k ȐXFvӠ%3ZzTZBnQ:G~%*PGp8wqY^zsˠ;x,ѹk澸ʯT5zG{>[) 4H~lfӒ`fp>tN̤DXK{-O&'ƥut 1&3i.Ju`DPuȟ 'ro z@T#Qb>@nea SOҵ36kz_̜`SfkfnAUtÙPskh~n̛8zxY^LڰOULN C2 V8DccWO[ue:Qds>;4bl>)*ntRJJ1>u+B|3R>#h#C%$i*eڲߟǜL/[FQ ϗ*>#}=yQ,sT81#QO軎U՟}$JUO[1*D `)%*܄%b{{TհfUacDlxyBC#_ÀF@s('TzU#Gr7梲 B%T5^kLv=@j8uJ ]vFZ|QrY^k}ܹT4%b`^bdLN}FDVB/75+BԧP|P})'" _\bH!5}(D0T@BDUb5G֯?f6ǩ!oC |u'L>~  w1Ӣi 7|ZS:!D;C}#!8Z̍Ѝ̆3!#G ΄Hw랭Hs9dӎ*S6sw\#]s -P,Cpfh@0$8K M"4 gAp?bí4ɡ 7sbȃ6a`yաp9@R^cS(k}/z|k G0F5!)wVCFlr :=5N:fh: j` p4["ƾ+?"6b\d7]/] SB"rL'`0 5f|^w9FμM#FKzQ*1.N%n[oڸ& ХI#>]"*0q٦f]BIH;wJ&4^3ϔQ1` Qf/׍Vjfy,j9#O7-,eb%+ ACGth媙5:SlQϓ[9iڧed='rN0ҧYSsn.A#s<6o_@~ތ>#>ڜ"%-9gL N08'ZcJh\krB3 ( l0TKٹ{qA%V>[SoxP{刞Э\/E{eNp&Q:7[2Pc|mE_-y( ٟ<4z#e\#YlODHJDa^w,B7Ji xk]>kWCkת⨆A h9)ELPEb "Z@Nj8͆C !bsSVj]4㎘̀Ha?^jЄ 9JwhppƆH#qx- GBޑ.niqKH9Mѻ~8.T?W_.8x42Wuyr9;R߸Z:9 ᕴO}<6z7m=,'e;WܻSHRY#,GY/^ƦxM>%!*!H%קD3)>@jHwzj~j{Pj<-YqW;,a Z0M>8'9I')J-,`[#fkB%[.JO; U'Ϛjf2uGx8S)8}{w0rz.q)mw"6Te*F#1H4cBœEbF+I?l9@AĽ,ԠS:wR}D_JfJԠwj5-j(K\".IjtTrc W@L qZh}R +U=}@(p Kk?3PE2Mz+Q 2wPֵbq^ xiSH}Hlh< %#Xu6u6\H>HGԮM*ΆiRVMwhl6HL&[@7oWTTzJ_MŊ`p~}k='G{ħFu(]0YvNiwG)&MHAUCpFZIZ}Cn qDQ"quSE8!7%˭HgԪq )MoRieSpK3dBҚPC)beEOY}1Wjpt;01aH,f" ptGʜ~8w˝@'E"}0~ Ǣ)=`Cjcbr%=H@6[gJc V (eށ$]1  $ "8Xx%D"RXm%CIC=\>)KwTT#NW팏ߪ'=<:hýpڎę6fE-E̛1HfN8 e>yO$$ޗß LsDļx~j-ܩA*#yX! `wo_?O'Qh$ nXZx4NUi#?;B)#7OjybGEu`ِsàGOR~g6So"ʮoc'L4qДvB:y?bX?Ғ.1Moz>LcKwE{J*.\j159z 5 3ƱپFdXpS)ْi"%xpKOS7e3xD˛/-ظof6+xGw5ĶWl0׸Hʈ3.EMK6m\PYcgqe z =M!׵5:D( FVދgH6̦RQbx/jjRKͭA}Ea@?v#[YD.W) QP]a*TDR}|YpW`>vέèh#9ppܵX-4~"u>꿹v:oB^2cdz<E7^e<`o"Pp#E0[)Q ۷5R] [rH=c꼶=,,Ǘ燅1W"P g5"j"-SV1$쫁Qzo-ڻ&N_0fpc̾͝O'dfЌJ_};΂;.l1 1Wi.C^@mnM~jӨ]p^ ':Apuu,v* uvdgfhM[u#whKϟ4&B8ۀuv)rԎ1γA*k&gzUrsSr'+{W0,i׎g?rZDD#>Kw#dA|5k8] Pq? )\E#\ ~PAа(fus=#It?,?ټ&Jfl8W;kΛY͍@ >HhW虽TKu 8:l& lVr6_AMfqJ`xq.;A %0Yq:\T vjIthz*!a~]d/2!CTmՏh`-5R Ql' h~j3EoP@d>uȐYSVӔJTtj¥꺺a(%:׳J1+S0ޥ1=SS+w*v&b4)=pKk8)zl GH$ n[BҼozϾ%i޽rFJKMM!enG=qr:`QF86ŗS&>]6rvb+ivFcq[}0 pYG%LŘFu, dpB <Z 8M*ÈBߺE6Cǣh1.4SLjPF Я%nb`,/#ĦŰKcB3tR5(0i{Md?${y``cp-מİg:4U`6 _C>?XoUnP&}÷$s+X2K7>>f]`ָ|L@C$BsZJriH1ANFaɊ΂OfHyfӓ_Q}rdw%gr7GHrۇ1 idW"RDV``8ADVDmV3֔֌U$'d2Ee_`ևOc#>ĊZIp6g7?yF ^̼  8^0Sǟz]B2'[HgDMxoz͓%o >ux%>J&6 jL#Dj ke4lҗ6rI86h:gEl ':fLL,_qn]{)ݺˏr͎;q%33Mp H厱;d1MzmFŒҮM=Ht$雟A'jp1n ?… )yu$~%៪%d|y tp }3y|QnH`w7{(f$6 DHQ"nhvb5ժpmz[lvHfҘϖT)p}4W,f/>PƏ<*Bz*oD~%*4t韵u4 9_QʶmEߞ@m?q~7N1JB[rA9uV3:9ߍq?S/?j뫒zp`•Rs/aLocvS{7`K+FHc^Ӵ=\Ob ,BH>]?B![A!m-ۮ:^,J<+1H?mTSR,[!X`km*0t`jp og{RϸIHE:a޻S-A7|]w$7i.N&b>ޠ`|jV"lG`QS3% ۘ@P%,uAЁɨɬљ1RSbG=3)Ϗ9n?Gppprܹg$w)*c^)>.;Ao+[$|LR8,,R:gWg̙>me~[+,Hm׾[ѓ>#zv񎘎׍uׄhޏSнgU#Z8lZA ,5f0Z01[{G0Ăb@j^ Tp`%hH*`Ah x8 Zy7[.ISo|]`I : ٙ4JWU8h7XJHB4)DQu[KhHZc/.gV"R2@6ӿ}>οɓiϙ;.l\Ɣ{CǞom6y0ːE[:rvN^[q w+qH1`FIEv'_U\\#ܣgnjCĚ {qGOd#5T0IcL{O^72+'wPx!Zf;Z֥Eٷ)kRuBʧj:>--+FZ$Ή ՄdܡEЄQ|g?– ! =SLy@I w#zDgV Q4H(hy8[U;~ cb_JUe,S'˰ыQ߁S[xdk Ib{ӗ.'`rS\:}zx"1? pCpuaA_A·J:yGQށhx+̩< ai7М V2k%璃;$ٸ1ghXLǴTrY X=dYd>ŲRBif6W{6Cp4֫< ۮxŁ&CcT~ѽxo-ķG!sd_.U#,&}zCD8z:eY1FUQy40x\a@~FǂxKFuw>]ZMZ~K7iI]spY^'dPM>w5>XV=)/xָؚw7Ao/ʅLQj}?7|z$HGh l447-(c@wށ'oOQ)m3|t7qh!54RtE_wuỌ7#qћ}zܡ^5#pܒZ 7x9tzמ(wYSwuPtdei0#9zUg3IExE|V'2 7Nϸf9cWpe@&fry蹅s IIS}|K}} b+%y{<>[InۤݟEʴ }iM#IO~^䃗q45\ \#u=V<@!%Ь MhT ۗ޲.zS]c# D`G\dʱ my0,',8Qn$]0iw*WL|gxr ;\wm L`swS)6E3>P.#K3C"$Vf}JoZ?*8g[%-p@ZwĺSWWjUa'$UNU1s5Q$(蒄|t飏D0Gۦ:Yֈk.-H33;߹eʲ@}NFSϦ9e^n&E4`U=O(XcB WcrdQCvb|i:8B_in |YVVFϡee:ߨkR[JTC`)+y)C)Wl qJ8H@8`򅇆zu/V&fT5IjĩLr,^pxwM|mjssS{njsӎϜ?ҁ>6H5X+r>lКo!5NSk<S fHI]a%DZpm=)}/^OϚjT|4DHA;|\U]~|S瞚ec֔Tp*~:3[ż|gGG}c!>~T%mgxN !PK2#4 j4C79uS)sJUOp/bC#&^?&{yM$V=zt‹/is/8ѵ>_vjx[׫GL3_$y"#9@QqË>yϰs3)#-A;~t#>jOC(53FyA!r  coT嶯 0Ҿ#쉪KІzO1V$ȱ9LE-%IAs)*[ LeBEҽR, !qLN[)=d,/e G)^$:$Ű%UW}]P@_s@v6gʝ;YMYT7 (DS"hC%{K9B+_@)\bDb$]'*6'Ŗ j蚮XI/< QOv\dк~ԉ3.@uHH=M ;{j[h^y7e&џ`Yȱ'5C.]K&Vr:GZiZG j2k7BXchƙsiQ֎(+XZ у FԎ}Dd0'x'ZyWG[0;DW (k\o"H b7Z5ɫ@OZKߥ$s @Wf@HqLa Lƾ T+mu=f1oمH~vpslR+^Y9-9ӣ+D!D\,J8(JTxg f>v'dRO>MrXn HS?W?/.|ƯO *?_{em98fc g]`r"3={v[?끔 έ9?oo?5p$*5bRH + N/T]1Ā9AJƋ*jEvO[9(K9֒Pe' ڻuhG1zaSZ,hpK&SQl3͘πØ?y\EbЛH6$%# 5˥oc+T."4(x{Cu~Ӝb$ƎK[=xx!/䴉]ە%?kMkۆN`Te% p:c(5|Y0Vѧ AH@jbP /hU}W"[ߕM(w}ZҦ(5!:*g*JCdP`#rHoDND)^ZHԫUCx'YՊܲ:6Z% n#',9ymչ@%ߍߊKJ3{佻 K)Z,TpFr L,<%H\ a +pUQ蘙f6 '?>M$$y*:ꀚQ?&CU ,G)ZuHi*XV$^uYY#T+Hޅۯ`oK`$O8ڟK(-rY3Kj<9^+PQNng܈h<8*يJ:˩Y`Y"?`H(ײ.'*1o̎)=

̨5HkVaJj]nTW9%@T{j(Big^ybH =8ڷZOo^1=(^ e !̆Vʠu"\٧?":ͦN@^F"G'(ED"˶1_\U\e(KDZ^KɘmzV~n6vcM$Hɹ)?1z]׿KƜfQz*i-Rb [lȡ9mU[;Z%*Qцٜ$XhE$"EkSAX%kqF妯[YRRx5S^9/o&i_^3f3s;,i'͏^4sү]$'X10:qXNu$"!Ԣ :SQ$#Ic-1f3[-H f8yT/h53,G?J[,ǁ8qd]r!8B@Aoշͪ1H0DAXa:u>x3pD]r}+H "W+` 3KNn& LW\к7D{IȹZZf\fCQ.씫iqI:-1fٓ+B0F[~#^{bQɐ M;9c+tIìIɉa*jW,\90FA9sHF5W6dʬ+ "ͬjčmCJM◎L@FCqp3g6|q<'pz@o݀P |0H+x |Z0] ɼ$Qczfoy+}yr?dSp0/"}q Zɿb\ 9q.\\P{4;1=\2">Һ.w'#"#,Ho:SN6ox @48ܗQFSaveR]MCf]lJ ° 3,[7qI7jkj1fGa$[ xFŀh!-=%ɱM5E}ڜo3lG}fȸqm^">]ޔ e=uQʘ3ZC4#cNr#=3XwEJyYiOQE^,9NœdlVZV&<`>YRYל=9wp=9wHF p$jw? ^X Uj9Ԋ8J;X2E*2Y$EJ*kC^Z;1 F,%#0hX;vno H0ܰe_0**>?h/ϗsaT;N2ѼYoFuBiغd7͐簃%w_Sˈ1̡OgQƄp&So]}`\} f, zs_%^3߆Qoa_0XѺRxYOg e[wb$&a 9A%s!zbB}NEI8G#$YQd?"]]Ѱԩ*tzvKU1Gt>DNRq}CCMWDUY.*D0VVvSw4 ԙuZʐ(lE ytQj bT e!zY􅮋|хR@U=9Up0㗍yGG5T}O%!.qxr:C`/GN`.G#2p nQ 2W0A!d,uPp7Aʑ_YSkTc9=< ~pi yyP䒼e'uvM1"y"Hg3q㣊"cN!-ϻej V+׋ǗvHvI;|sC;$T{zN'w-݆Άogo|?RMapn2C|St,7gj"8?a /\g:og>z;0n9I;^qlXXuFvNy~! 0J0ٜs+ȉ.vup#oy/+ݫ%`Vc>TWj2I2RҤѮ9{^ig~̴,ޓς?6ǣK=HͱTm%Rdω/R%gqUql*bpRq&V &6*$Ud!B%l_^ʘpdN?s ]{)ۑT4 ?Wܻo4Ӑw0>[\V#źBҦuY43Fh"-"JՌ(r`c㟜5ꉓ>״ie_~Jxw tJAoˀȌT6{䍬eVwš(n =wnc@sGWmI3>L#VgۚǾ^WQXC6fvTxi+=) *K΃<rYI{3mW FKp'*"w10slu:hòܿCXd)(  yhG;)`zpܡQa(j{jwt2g쨕uL^ӱG.]͛6d3v r; P- gc75Ԩ v#TW`%ڱ3'?>|m ؞{y2H _w`szsSٸOOeȚaDQ/~SSX[e}O:҃_sH&?SMם`)Ό述mJ?ikn Npwi1DZ@ OF940t@=upt;Xl!wTk^I#ܽl#sz~wPc8]Ѭuυ`eOO3gq0NtZHG8`fti .P֙:[gWXhJla6Gzhs;3vN:!^dԈ4xi,+ V"wo[.LDQqR\YXPZ3m#;9X-_/]}V5mެȵۗVoπ!^GbD;x :bgX ED Ȕu l0JQ8g:/U[Z >TȝpR/d0֤4cO?+ɷq'# v!\Kˀ#X;!XfbDԟ(wgHw5-#I]zld5Rsnؚ[3]V>& ;1-c63yH0|:+f{\Nj#e W}% |8IYlN>|4sՎE$5t+:ЈƐd<1-_ B:5Kƌ́(p$>f>@Rhұ_8֣M0ґ$\@ey5_W\,ŵ|jyO8^p;F]ĕ46v'㦜\5i3Mr`|hV9l҇Nztc郓BC^ww;E#D?[ -]NGD\Njo7oΘ6Us'2_0 5'x ^~ڪH:;,yMXZ{%?A > ExB:`u]9:njYY}:W%ҋ&)@:39b?0БzG ; W+ ExVõ[Μ+^L8]@c*Tb2m:m08AEB"Jm͠a-JX\2}Q8컭y1, lÒ -TAX?3 *b6XWX7ete^ٜ9ef˅rAVs\2$g+ē+5)! |t[3{rX|c^bfٶw@{\bY̽v >Kpc#\Bee!|z-dɇB}M!spYi/Gds#AC64*8xl?玢 kQނG`  ,/!}N\ys/mςi`*x˧෿ SD Ht6 N>oGp|ؑŕB$f.=H"_a>!; ]upvH4.[q wlɕie|̒ ޸2y+.SYx·]W>ʋ9 CApib)Wb.%ӬjA8 }K\HU&N Qk9w~HG }ܳS/>Nbx0"=ӭj &Hze65p>Q6,;¤8[5׾x2s]GT3}j>kmfRںJ{-v ;[&O Tb2K0t~߁J' u$' mft8]eۗۉͻc%±H9n Q!R{rX5g9 ,%goz'qB3 `@K``GmJ/BOX,莊vm)q쾠`b9qg**&)Ca}<7=CnAD%z+ ,)+EY[X M^K@G:޾ xk|w,zܡD F\Fʮ&VkZ{Mq(#I1M:+/Zq 1qNǢAbZ3!L@4x pVʀ(Eg:)K;o2 O[/^ sB%[4)Xk81'jhd97 x*[1E0m!:$Z"00g}.pd\S`VzcMI4Bp+'6\~vg򪋕™5^[/#7~čվϙ,xhpLZtH ݊F.xU.vbf(N`Cul_H6_;]T$ҩʉ31@V7m8R+D_S+#*OA:8)!\x1:b o|M 5n 1", =0I"1A_#Stk9#ߤo_iDtaJD&$׸NUVViD >(QϺdaS&%4QHB ct4u!|%RXPH:2YkI@c\ss$(1Խ=w w۠~\@_Rݎ۬I\6OLH'b~,V qJYFd2ie-lz#jًۻv~jJ\AY쌆LrvaO*V 5SWɄXhh&dwF /DJy$a2 Jőq^&kSiv<|y/wϳkN>o?} DC?֮ x9}zQI磐$mY HD$l0,G yѲE4{i S`rS'iᐉ/$SIhՕș[f~6'_vENTiN8M`ne?b.f9-d"iԺ)!*ź*{|/z-Ò_=q6;EXM> 5DZWtŨ%A#V;4'#Gt)dw$SNFr j~NB4BM~^UH`o UADxn`}5}z?ճ)/,16kk8)Gb.h0}pрH @f4^4`DQ``P9aO¶Ia6 }&s}qb =Ɛ`6$JrǺbX/UV_8WK gU{U曏ל"Hfx9n]j4K.` $N&[ iY;R!:SbT=xTsC6)6tXNlT .: F1.&cL< :3}cr#X$lsw>QDOɣׇ~WU,CzQ;K7E+ *J6{bWfܲxH ouZ#*u._Ium쨁3OL,>!, =(+8^qu->ڡ _z{d,H-Gf;.i>gaYՉ#QTb2hNvQ:Qz"^T+@iTR@f@}dqΖ6k;~KC**Nj(;M!`RgfSTlRcal NbtLD֖- la:G\ pW&˕f"+lOݞɞ)VfOd>@iXaiPg} f8?Nn?G' đ#iH2'HuJUΨ5ŮJOEԑy#SfCԀ@3*ި IyOAx}HeKl}fAŽ0l@K7C 41ZlUNh#2<H@VOt2eJgʰ >l2$Bb}$bKM( 74Ȓ/iOrSwXTV9QD.9}`)VtL*'* Zإ ξu cE-9SE5u8p{FUt wnۻnM6ٔͦPS I R-@EHQHQt6 "E)FQ胐|3sn}1^Μs)3Ĕ+嫙sHQ TM b-/ɾD4T`_ϾNM BDjG"6Gc13 hb%qp *Og`LrҌ-p.b&_LLc T/X@ݾ{jZx(EsB1! $e&Pq-29-V9 iY_ :%n3k8~O90@af"0Qw7]5'-]T8wI"m"j ]nWwbvqy߯"D?'$$"nv-$'&a򦍫??Su?ZuNkXwlZ=j\~Ǎ_"mQ͌9TQUn, mHgEx&`Q4Np&[ɖo+eeUl'ىER=qZnv*ۣr2yyX\ߥ5w!uH2'={޳ЪO[pGx; R [|[PoW䩎\.%yCc%c,} Rt8`|ede$ 4xm:SY[}좐ebbmvD>K|;[ѳk#{߁$4Y)ćt%[t3| }_sΜʙϖCr袟kpPev͕e2_ =rF1Zte^h4Z,]9zjt^@/bpECEӼ˕Se7A7Z#e؈q!Mcm'z΍[YG?|z` w5wOqz+ S76g]OpA\ Lj gwцC☷!A|C|nG+cp儙u&!ReF]|),FQ>,x"D܎K܋my|OHhmcfb7rlJK6g` SJ13=bDiB5 L{->uDB'fl:4'CC\n a@jd(c"~ǒKpXC;d~vBR%^^6!z)+ۂ>ԳΔ͙׀oσ&71c$! 3Q$ˋ\#>ɧ9~XeHEk}zæӇlucaȊ@[\Xs\K1 ;YY`Gr-Bm.ZV%sw%Gҭ=}V&1pҷx%|'W)آHOlAǗ1%\&%p+;nLa*=9(*V68m!n- S]Srfs112Vvx`Z h¹$l4sph)bād xOf<䘩QK:Rx)U71㟝=uTDaXwKÓxk_@A]7 Iʠ@6"+KJ+cb!1:P7fyfuYٺYk<~Ґܻ:igmk Y\n+fQ& o~? a5pj3ih ?d DN2x -Mj~(꩕pAg9 +02;sè yrVeo[`l-PaDЄ23 ܀D1E2R. {04Z ʩ M=4 #cXIn0l3( [:);nV;ݚ5d u FCI 3uzG<{A'J 7N.szy,93cZťy@[z=#ߒ:s Dnun ѾG#e8v-_ۡz.` g΄(9C L 1<ճ$4-5Y1%.QSӢ냸dgk |`w9Q`U%xn9>/3<4Kz |knڵdwt2npIojzy´^mt呱Ƅ=Ѿ BS1"N`IzQJ}c>A5IL`gd\/>1,j|A-A3,1Ut4/f-vF $UOn9$>cv<^(,|~ə ׵rFd'|VmǺ f%z| ~sgtπSnޜi7oN!Кב:JQ82Q)$Y!7}ԪONjj}8ނ]vx'sLa9Fѩ1>3 4&f1$,PH"lUJZYHr|ykʼySnEjavQxkSn%jDL[; oFEmb1)Oq+NDٱ,ʟ|NOPb3Rr~?-I~p[^m1cI^̔[+iҘhf֨o߿v=\>f.]: p*>N,z=Q8] Fh5&դVV1i85ۖh4F,y㷟-lF}4JOpv G.#P'R4I%yHs)1 W2yEv>k}{/Λ5 |+ߙcx>w}&\KE2M|ԩnԒ%n ?<'?6/ȵ#Z.)ܠHIWk=z:8 wk6Mfv)ʧLR-uo2g]DGT!G"uDa}9ˢ/qѦ}sKOJ;\tb"y.97TYiJ/X4ZZ BNՠSj ܛҀ3B zݞ b,Jh} {ɏ }bLRG2_\Ğ6md4xٛw;wm!f#C+2\י<T5E >p AW$&ǿ5ȏUu >K^n{Y.yTM4esM8frY^d.lژựmsӦM 6l(z k&63}̶I$xA> E[Zf'Hܰ_ed`^5X S:1qO~v_n)_j,k*I`^KbbCDuv8<Tia4Y6J^ڪ\pZyyAg$6ݺ]CߜiSMʼni}C&&\ c*^2ܣgxPer t*Y9J=M'UT*)n=~;jMJ$>(`[Z4E@j ZO5XΫf/WLyNY`Wr 鶴]& e  Z ZJO3I̦ UM*ivd pr#H侥ytP'x'j*5)L1ԯ')b-X$>[N~$ef̙#g ?Ypݻ48a86 "0j,|* Rإ@tl2L@ۧO芏OY$;! 3V$1m +>R8Eyl b13hM\!lز1\]0vsUxjV.ה{Nqg')پ1凈z˖r$9;$6< e nI@T 3# jI -[% 9q`8"(K r)4 [RhA]H` +h.PRc9KF~,Oٽan$?[_ NaG6~*Evi}L!;66w.o5ן:E%R_Jd,x:fB="_FPvү4y81MO |_' LACwjOy%<{Y We\ᰚT6 )5ɥL GHdqVR 2R#0GCG'LOxZk4XApz 'r<0W?e2Wo^,Hl3Pj$tfL- cV)Ւ x9pMB F%/I`|GQvj Jj=Ah1.9R{dDJj,5Ci c"*)G;«K3^U1oZywWVbZ@ǫ*)]EҜo<:\( .` gʍn6J(DF|]k0UWXb`Z0=Ne1ֶ ֎DN:jN3Sv ͮOؖmtKs{:6)zpŪ5R5HVPVkM.q[c5F$jEr\TeO'D~^9AeD&po1fN_};ͷ>}q!.j㕮#6ڭi%R=wNhgcھ1?ܑ3s:>>VKNldBR67{J7L(O,_߽G0TQ]=P0\B×=`aK2.hlirбkF^[]5I;œ yx}M<)f.5s-;=Ms2N4I7RϿYr%Ax!OGx:'p_m6QklĽ⸤*(,p"9g-"K&xZgV qu,ߘ#xGzw%g<"+Tj?jb~2~D栋][IMpʄ3ox4oUI%ɰ+|N֧00wwfH!P`%=t k2WέL߾6 WWԒ_OSB5Qg6(2< L2lҁ%G A!cH9F| ,Yxg'}`C࠯hLR(a4YNzE&._YZ$[q^= ^+1h|N `mrUT <y:F/^.*{Z#RbbKyR(0fE+dLTWef2;6q>Z|(VcJֈԙfH #+(󑤆%6%9sHMDYdzFʵ#OBU^^6ɮTvLكhH[Ii|ȀW6oH3Z2҇$[֦t95*٪S ]XI\'dip@PJU*:Jú%+.={yEB ~̨Gqx<|8#oAbc֔qVWVʰ%S N^G9G2HXeHʾ{WJ f.R l+UθT3VDbk*+121cXvF#Цb5Ti2PKyJ벦8R :InO$BƬ@_̂*4%3ft<Бay#Ͽ ]I/rccϝ W{)~oΎsnƺkcDjǔo,)Z* VSRܤɟ&s!i%(bnrcY̲$g`hK!K"P 8x#K-)]`Af6mUwmRݘ/5rԓG?xɣ]~)ؓ+W/8^4*,ž&]^\[P0`&V8@o+ȝlgF`}Ko7.CjiHR^6]׃D_1\|?V}/۵pə3&2jIRY\w##hǞȣìP k[ ӝIHA-a>H\R\30|Hbp"E Kw8:')hD|+C軖q-; ~;28{0XuH_'m>ZWO#^SLLrY)f`Y+UlqUT~5Ƚ>'?5x_-_'m8TDGHF֬ZVcD.OPl]YYĜGҡR8`.W!Pq?S=-w%8r/qQ_'E:]+44FJbMm*If^^ܯk1+Ň!Ϟ.#!.nI|"E٣ f`D@y5rjV։@ r^:CBH= wRgu|&dmH޶Foi޳QrvFxT]]zY'ըJznEw+ҙ *P+L5fV5x=:Cק{Լ׺W[yurnp^w\}czm`L6rV"ڑCJƝ Rxgc}9BR$kް-UD5ĨqKփ RbQ%'&ɍ07 qz/>=ߥ36%J۵4u3ʘtNfO pL)^zSAݺ@o|̙YJ$?i$Scjnؠ"9='E!FKe"*:UXGGI"NB iq%{ƌ&/k=eEO~r( *oJNQ^={ò3gu'0m\} `t%#4Cl#`!J }soϞ{|ԢуhQ VLd .}gIS۴?-O+?5ry hk-D\v|*RɿX%; \2yJvbON6d}4i$Y\Ob^|e}K.;h7}bs$N7 jSO NoO #ɥ]X9[}dPݲ"s^% wڵx7G\\7.=!^c&?*jUlBt6_tԮ0 -MYcSr;`NM/A~Lɿ#NIu"B(i/H%6_3"IBH.q%. Vrjȶ];Jh#X :5טFW_pkp0#U&ҸE͗Y 7Tx0$|=bp\W}7V,:'7z3$WG,yu9[ Er1VUkF׊'y0TY^b8OӘCER=j8Cԙfk+."O2{!^˭4)*h.4Cqdp$*zyhfh CL6T#yKW+쾓! Wh F X.FpN<& 7;0't9, Y$.) A`qT>k_H&gK{& *-( 3#nkܙ,lrzD_.wzNz"lNo /j p m:{$ţ`;u6]]RJ×QR:5љ+:D軸xC(2r{T.d 6,"w8[QJd^}oY!">D))-$]eӥ` * [Yl1㣅0ή\ G0;˃㹚o7nVZnأH8Wˌzhi %- ?e';n ^‚b 8gwg^=m',`zP)z maÆn6A tp .)ْwj0R@tКfqx 5T芵h_[".I' ^_Z|Y?;~xDj!шzy\?OuŋvhMU%8DE.i oKލ .,,H@@eFܯDv~7G)jѨB&0U$mMG{2X@Ҕ<Yh˭ $.=3`Kwg.k=P'1iTfԑ8LѼ)^E{H &Np^F\ {MA]·bDsOKu+eQF?wRȟ(Q_!*K)ݷ)h}mo'> \cR"yЀ"6MxXP>yg$,0NWf:x4-C] ' m9P s4 $*-ic U|\}9L=]GRڂ) +Y f?_ OLj'a'6u-Xï*Zlpb|D#XٷN aʴ8ܳʺ3#"ѫu6Vk:VZUf$RqiAPaR&E_&p8X[bpH5E>CK'nb#q5N4i1JK {_;#(T7V@em$6يSL@E@lcVJv3P6B7P\㕲AxVR,,Bf2FJd=nltlz0R,)XUѬȳ  ;ӧ/iߣgu%\S=)H\ m{b~iF  ~97G!8ՙb;EݭD(/sIwI fs I 1`p!w1'ɚëx3ëWD~ZZtd.P{dOnSTk̯&O#y0[eĥs6U`VX OghS g&$_^D?9n<קKA|w[/;~[7w<5NI[@I+Q)3JqRω(kzߵC0_@*UƵ;Jl`jb9gKhɎ"s ЁV)?zHb>?v0j'wֱ#JokZ?ygt8>xtoޠ_ӶĶm,lK{VJjiSGLt>m͚ (|SNK>o`1oyZY_@>g'<1'&)vq|m&E8|MM Faܧú'iߥ3Mmz.?W+#Sʠp-fiwbLiִT"c=?u#cUY }Atm0k3~],@0"y4f%q JJt 8rwYw]{LS<&l "zk/ *l"T*&DQ>dq^n*"]Ry,ɍz5hE-{6kF&%x@QN'_),x-+; ܬ?rvг_Nlg=زԶm"v6lH3],Z OC j{֨p".I߭r:>uA;YKgwNVot|l}~t? Cs41DxAȜ[)3Sn0BL"}c.J~$~T^n Ժ\!I8HڵjݫVbz{:윷[N:{Y`ݧhӈڞ^8Yagʖ :Djd=S>fiTC;fAC( ֢20آ2L2\h`\PK؇@ފZ;B#k[CM0[ki K% Ub`휟R(hDf I ;~C۶s/+Q(ͽzM=cF͜aY}4Ŭպ+h*g/S->""k쥇V.xYقKpj^Rк?WT]˜Hr3N`ˬfW_iT^ YR [$t_8 mE{)ފRwW,K){F{ Æ1d5}w;4C7}2SV%`+}_ /0+HԣgogHSF=c7#|e9[>r@GxcA+" 8!B41\zUUe2qU$YGNo֫੹-`oYGn [zE!fmhn f3ܘzGc1!,]/FG\&ʤ755"/9&% S= \G֓qj[[{ %6jŷFZ= 䩒ܘބHQ=&vsa 6,lxdT Wȅ*15++HP8b1MѮha|2Z"fW0N iNQaO$wP m1lc% CM l&vs#v3V0ȏMB't?l~ #*'8j¿%x}"*Z+R+dztLB3=Bl%7kDS{Q,#h-s5 m%mqJ {L,2ò8kLۏ1qRJbcE'ن+HNO*p*k.b][?Cʙ؏?װ~U(w84 TEO лѻ[qCMjQ"!@1ܬJ&՚! DRk5d4f5`>y|`8S^j]!!jSJiXBQ8xAp""UJu?/X5oYV2C :=[AGYC^Cl=( N"Cv<7}epk"vżE9iΑ>/sлNDsBdfŪCGʆώ7ƋsH'~nߵw?^/#͏y}DMAZb@JRR$);z-~w\RV#Pф&xpc&Mz|mzFљ-^TJk 73l7@&.ZjG+,=[/!- 1 O~ͱy$0  <5r c6OcE$$ǙAkљry@v 3D#Ƨ`P[F12&80ԅXX"4划 9% prYdNIJi xryixS;I== \$)P=ELJ@:o1kN}z୧y\Z$8} ]l$@)i#O(X9A!X*8"=gxlB1 =ZܪQ +<_q>hoosiѣރ/|v۰B߿BM?>_oSIdnpYoDCtG Lap~ٽ4qw9Y*x:9 ^$ m*F^MLs_k 79;Ț54{@{f8 O*#Q \c1'x,C" ;bE%"q-m͓kd6amX]0V>ǁV,KQ2OTYYxAt -u&ZŭYq1=7 t,BH `9˞:p 0h+#9'`Kgv" ̛G~?SȆv w!쿸w{V\:&K['.zm"KB.h"wƑ#yH[_,>B-uME 'wqW x ]oAo=sHwx'HM8WדфʪCʋYYUe0']O͒TeΠMh4V3eZH)جxq?VŔƑ.(&RyzhV'ɒ== E sA[ڦqQQ)ȟC2ЖcsUVOLhUi=BmM !^>( 2o8b'S@[a o JP\h}?ϝspY~ {.#Ϟ :?'F]h8mG𽮍B}6c9[#?n .0q s(ѫMpH!g*mDA:Ԓjs(|,BB.Wƾ?lO-H*(DV-m=6̪;qPʰAGGNg"oqDFzPİ~k+m%\ۓvjjZ-r쨑 rR Y*8wauٯ}ˣhE󺷠-z>Hz)ފ <&3߿K/Pq>rNֿk(;[F1AhY, =Cf $ϭ}f!~D׿o+藔}M~F<> 縦a:=s]Vz[`R(JQ{` ljXK4\b$1Qc 14c&]@=yX9gNs!@- a~A2<\nywss߼6{8iϛEC_/%bD,O:B<6lBwkDLZg!GB͑d.6&+[ \lPVdd^H"z1/_9vokً&/;^\sud6SeG?|;B?j8꩏:jŬ7wN^Bz:xuߍGg4$ j@O1/JJr؊c窒G/UgG.:O1KYN? +04!mϛwۿV h_FQsj%ǯUH}{+N}]G٧CZfk+J"6։}7m&j7+${x51MSK ~t]5f W 6!&$#Y?BЬ&<}ݦ@7&}v9.h(i9?_\LlxV{[[saxk0|b{R…T]mnㅟڒkuA/Yf콲ffF޶MZN). /A]Q5*isP쪷5]kp}rKVxvAFڬw ¤qxKɴA.zvBnEߌ v'hTPT@C|*iI)8!2Yx 7ᠶa Fe_ٰԣG N#ǔ"J1%ĥGΨ BN#N 8" _ROh}ah&Q0n$M%"H1KΣ\.e>1:³3F<+{sQoNH4qAR/GH0"wmi HBS۞=ۚJo{mIfIO؃( ﱾi- 3F]dR눑%{K oKHM뢈țesW*;T.;htB&Lj\.>hw{^G4sLK]zΟǧYN>Zΰ\41743ſa3q}u } }YDb=J;Yw)5 >tY\I!pF|]؀NӺR$V \+ ogO76CƐ#wu7qs9 \b^pm33ΦEG~?n3*LK7>hvoã"j饋U=6M!%{t9lغCG-ɉNX!p2)85ߙg_=N46S il셶P=쀩u p^ҷYRmN׉]WP+&{lxOQ6 ^ ǏVY*(ވpH̱V:gN_;X oHjY.G7,9yE1zDF C ?CNnU kC{O)_v6w*<~i LT[8 &NJ }3MYJx^ թ}Jm9hU 0ߺ?r\/HF){E.$L̅}xUS{Ds1y.5,!6a%)M7<Y ',V`!i5"]`IRbsTz%W ߝOZoifYc=CJļ6B =4i7Vj,}0x"TGEؐxz{D<% ZA4МjV2%D?w ~ꨕ4#w+mmwlvL I;yq݌(:(^lD`EXW2Xi_ƱWebƟe "8=bzΞjT3٠`nu_CʡG_:k&[D|9הWe|g˓jΟMi{n'+a#6/g|8~{oM>EhФd6ψCB/yip/;{I)^ӗiv}xzjt!tAZ+ n~V(uԺV-sۯE@ۿsAW,+Z$v~uZ _ ߁X6N#5Re= 2FqTS-$l 抍ACRJ~[H"-Ph:YC!h5QZkUԍtR z9w}2k]Wst׳Kb;PER yj܍84n#oAi\=?*}ߗnUWKpi>V{kLN'N$$D{` L3y8/:V 6>ziLSL 89 :&jhYp '4&rfuuTFu.JN*SRR2)tz_: Z>|R_g TpM:ΝbF+߉] oʆ}ݴv'iC[7S? V\g&5PRa]rDrW;ZDL8 ;U%PN5$f bs\ױckE#5Ną}iWg>/TQesiOh^o8|) v 9*!ykBWA5-A& H/ ~ ʪ8ȑR$UU· BX)(q ~\Scu+ ݻUE$o`j9&kgsRȱ xc|&pv(S 9xz Sr FShJQ-)zK'I%y4톇T 䘌D q#svSrV"ke?S29a`8Ǐ/%,/K2.6v1AJ|hdԸaZBmr(N.&> I*nxXh-zݫt#Ģm2E òNU]ⅉ!>]SӳoB|"6$3HfZ$X|(uzANezm ΰ Wn/''AJ S%t:$'h), 4ewkxڵkR| OR |O:2ށwqZ) AAwp B%lC r:FCC8V`cqpC=8ރ{!ޯs2, *'W 2S,,jv}=^s/Ck71L.d^"ŨZ': gPbPh~z;΢"kNBÅ& #_pNjj݋[ z^*Vi vl]e0e^ >C< dWV1tԌ3ni O%?FE7M]-A?S踡CZX!lf? 9?"%y&^!ww:"&;iD[LR]L/jqwZ,$JF4:LC q g%&Abc +$ᙙmے輳➿8}0V~d׮2;gP/#8$&k+_7U49jTq .Fjjjݲ8UK"]Ojv T*\jt4+!Bp`bB ݡ!&6S6#-wےœ3pGVerc(w/aA+n Z=oZn:R|Ƈ+ᤉа * M5m˃iIqBN=@|7ZXIG\'PGF,d-c_l T@J Xa ͩLrtܱZb̂:qSHW꨾=N/%\rY+fy]=5՜9ŭ,8u-wLMT*!u4=,i/`ئ?r6hw֎CY8vd}b]~}'ї0\-LsM^$PW*FY'S@9RzctB=`/2BđcD4v VK, : ,fv'IxyJ4-_ZOZgD( a_07wFy):I$&*$y#h~sDZaN],1$m J H)/ )%7-hVf,}6-xkkW G.;)cG+n\;`hooc ^׳;sۭ8,m|# n{t\i<~f $bseQ~վwz&J \lxp x-4Y%z(FّX}<] j* njy ,fk.00@kݰ!%vLp9vT P=q1.n?A+U Wujb!u4I6I%j e @2PKUx^]D[|D^~>_ t ^r/'kD;͇x}\H#Ud3N~XKe`j}e6qr-@MxEÉy$],fK =M dޯͣ~5S&0k?vP&s}oq' bC<<9Ul&O ;J\͞gվO,vAUGh?]hn֝W ֯qݻZ>:d5Cǭy8;l=l<-=?_lIz5>zHIfFӵ0iћO?23r! J"5$LHZܵewoMOvp㶏L7@ GOimN&4keO?𵥂0ɯ=ؐoJWz(`a8y5)$rFY5ic:CRU#PVд$rw2j'țLt6m # (zu%Ν!zwN0wvXP"!N)*\<$0;֦ĊD(APX7sXwLU\=Khﳔђd!K)5qeR޵ǣZe&o!|V5q07aa]zJMLz=^kU7r= P>G~?B 4x{6^=ڧ= Y9n<&E|ߛҫPwZ4@OLP;t{JRjaY+]uDfK>@/(&`f6C&.F T )@{oD@ZO}x~NJa; ?1p3_`1>Лh}>BV79gQvr2A`"xqa+X~ڔ䋺}` ?dvR/g0DVJ"P?feR>QҴGG-gG> [ m3b3?B0i |ACs85$)4DO xð6ͥGWaP@]><0_g}D^ ArH=^Ɏ9l$}"(%a`7GЭ4K2_뺠8Ff dOGV)_ۚ [1~!#E$@"n]lv> 뵒&=4g\TU*)"),I*1(~՞j9«!cAլ/+&nB5<l6hĈᦵ!LCro K6 ?V,FN-?8'L0~|~C$JI& IXHB*1Bb j73;meUķI]Z< b7n;ߞ/R"p!6#֏# V}DF݃8a>|/ $_ܬ2U o^ CO89HTnO|]֍8_2otQ!F!C@&IhHXq!AFdý^u C-KZg@f7yPaLH3@^%xx89uRe{W'AV-1^42."a^T%Ÿ 5 Ɗ{M ?k˗M\[6ѹRV 0G%JIIJ\U7؉< 9sNxitZ&='10 zBb@4 տ=΄_ޛŦ9$24tW%1iz4uj3r\'-Df 3C* vlF!֪T H W,hh)59y={d2G3Ư痧oKwo9: q]Q OAcn>۶mUBxc?S1} ,guxŊzKBZGC=lJc,QP_O'd&o,vΓ&uQww6gڤY%>ܲڜ;qP,Ȍ+pHCc{.Q{{SZN˄〕K:߾ o9|%.o%&AD.zqbrtKxjȳ4-s@l vPbG_4E^0C^.3Ķ*cw@;|i> k')b%':lt0jH't,Dчi$=} ]]$p?rNq\Tiw71@lɄ!;X/t/7izhc#r% pRe{F'jsƝN`/&vc)ۍв߲d7;Zڽ#:.q St;ƆCT]1]:c`& ?-D H QƿVhzNlO2Rߖ@ )C-1>ŪnnU~y'7O_=mf=ѫo/`AA$S)d*g"֛~jV vP!GIsR,!H*s}VC(ğ*C%]y\;wx%x}otsCisḂyz Ɵ2wBW$m+޴Sh({>Cl֋Ϳ)azeі ]w<'s`=(1H;IZ?kJ\Ҥ ++_*.~APu ͭݻՂrlps%owb??>&70.2vr(C9v\?=?jni8@+*ǥ=Doj|C%aD/ݐVt6P(E:>.Ά4Q3{XWRE@bR&@# LJxE!Nq񪓰euGxt4DEY/ĎmY0d $VXBx~f.Ũ/֠j0A`z;gGvi2?o.^jׯ\fXFe+@<۳y}CҺ q;ڎ􆑥[ 2?9I&$ZYKZ3H$A1HYq L_ܡW(e,qt<{xg,H{9JDYpPUlyy sǏ_tEg\ 5ՉҕZV[ע!cƬޝ?فU{š+Z ƒuCf[&>KNR{Ji~W`mU:؜3kʆna'(vF֟'9csۍַ on"(ٰi{%li|_-$>!O3ȮPZUY9W+mVڻ3@J\X.^:w'"ro|(,$z@'b" Fўwa"wEl:\vc<5i#{ť!ܖ2σ0\kA-.W^qBI,VXWFGz"›@GNWY 7|n&6j]n>tv=ulfL^*yww sYNa@!D'LJI-TE9dB߯^m658d~ގv oáC;/;3KK-@L(n"C"CLӵy%=dGw wk|]|L: -~iɰǫѻ6==hӝO,3ӥx7+rN2W V1g=*+9Ye<^9h#V%h d} Kft-$毥-Liwäj}_QOAT:og3+:ѫ3%N燹y ԲnM5O q-l/mvN ACLQͪ]b.a=XYɯ&u0-LxAى% =s|--4X ĵTw7%^hwT3 $e]AU48ZLgžMkr-uܐaQjBF)O欸ߓ鿨!nm 5t}48҄?\L@yL_p> \_7gG-!_Z.VYK (~ rEZ?2g zQҳW.-m ӬV~eX{}x`Qܘv,2dQK'2K)'shEbTLָ&9 Ssˎ[ptĉyGX SN0z|Ν-%hDžSv N\\^n~j&y^1l&)"jd`ٍ U<*,-cTaLrqI~NgFFXUQaGwuh2>Žt? 䜉`҇|B벲 _^T ѫ,?y;neѰԤ ?M\hL*i(M)Iٱsv .#ڍW>Kɏ/hIΊ'1c;)=џTg3t:t02Xk %kJ w&y&?~_wt/ ;ͯW{sԛB4cڱ>bNjgj|\kiGZ͋ꔨU vV"=(/y#[恄## 3EX~l^+js;g\RߩrvM(bm .>7mIKύ46ɾjIԿM)mB$ #L'ʇ-*:5gy ,Ct쬊.11]*}ttnnܣe&[GϝolJIm7is)j/8V6ܼKo{Gl1m0t0*C'60lR(\!M%U!33I6/1,jaQz%%>YQV4 ;c Zuo3(w[ؓ ~[:D@tJu gRԚP;|?--s+G> ȼU5]|W קϼdS!Ou'fV\>Hv/ݹrh4q^an;2/h3>ҧ-c3s+%I4dفˣF^>|h27{y70Λе"(^;Ȱ IҜG]Or%׽U|q6l;ϊ035ʱ쮄hK5cLooGtN!Qڴ./4ԣ;u98,oS ͮ6D?ku4$&KJ-p)OVmL)9sDA=DCo8g"ΆCkВfF7h)|g$Έ13^/~43cahPZ6>sLTj(li ?svmw] :wiYXveӸ8QCfCxi)/<&i`]j,1X(LxhcfNOMu7|jҠ]2 s)=IcZ:$Oq>?}l컵OͷSڎ(=&<} :7[I;E=3;va& $V5%5D`Ǥ v:1@ƌkggw_3ںCQwFP]ߡwݯ ;rRo@ Mc챮"^}w[S{ro[~R #0mh7(ˏ5~-"#19JKJ7 65fS^tӆF]4p1"e = ?ѡ/njr2+k:x,u9!6.:n fG72 eb>yC>+o?P6(Xvt~ngGv;! Xm56*p&<I{& ;<-,ի {k^IzTTL$)` SMo$/Beӫ=+`C*#L:y芃GtBؾL:i=>$:#/X:$sVU-ڻMj-m1?Nh9GS9Z1r~e6"f5Qѽc̺QFW]1-N@ WѺz#CU"MtQ#b)J0ujbšTf<&͝VC >Zjd)Sr5=Dž IQӣ~ E)-Z~vT^FJH7$oaw_Ȝ EY~z&Ⱥ$=_[iaGġfjх3n4dLDX h5Dpoa9 7x \<ǂau/'uVߗ:qZkNh,ύ.5>ę 6 x`[IƦY h#fvoZoC:3fGX>!OoSc]Ik3D ͤ :;+O˷}Z*Y[*0~ťieKDmlEtIjt?,V3㹃{QGᏘꁐKzy@۷tFII K[ T$[h?iU"ٝ;>CuCYW{l}\iT_|RO{xzrOx-%]O>)9!8þ idZS=ƭp4QIp[ `)L,@Q7C۾Kcƀ|gwM>)4! P~H:,x5 <}7? m986I {2AV޴,Ӻk <}XVv>]Ò#>2˘녓ϣ}`s6qDeG>/[e@BRLՕU0z*;7jk A[o|֬g ״΍~~l$zJb{z?xl&ggy~#4+O 3gTUx]:$,DMY9j!_a\Gx* ~>?)0uz>sMOr*PRfIrCeoBok^="_~d0-~r7/>\? {=vمTp9TPeY/Qo%EoMJ)[3β<+,J,2+Rv~};{o޼潙! Oפd@16XQO@҄7*}=Sa?x<= "BϨվ^Ocq&ěW^ CFB>x98"޵=uUޞ]4-Y?'Z0KAK'ZlC|΢~@דɫ|";DbɆ1'>D7_D 7p]8IOGݨ_,JW1%!t?-u$U]q7gZ[жux X"Ost>~z>s%|Ǣ^uJd3)sQv%a#%aѺo?/+\</S8y2KK@^a(dGU}}HiG]ʴf}h$ ߆6"<w~SOx^f5FET}Aߖ!d%h@= C05!CO 1xu 3Q e-A' ҧ]Dh k7h2t.D;60ŠYYc="Y5y;˳ fh8hh);w̧33Ogz}*~MV%i֒Wx!F 'yӽl<,oEID#[)fM hKD_W6m2L,\/WbzXefLy~92/_bǜt ~믏x(/Z_vnڀt| }nJC/oo juGl5;ZZo:Bz(Ms#DB!?$ɋ\ .P`Yu#mA_tZê&In평Q s vA,&AfI$HDa^^]KEWj7l={9C;H{!7Qՠnڷ@7~ +:=Ur/ʋ#'Xa0ar zCBHV1&hÇxУ{t|Q>F[z߬r痿_<U4wCkFzv y^L#F$Uuqނ4οw?7~/[q}&osOE!ڰR@OF.a {!BsA<łiͫ:Z%ȋ#Bq.JC]A'Tޏ!E=Qʺa8JG:)Ϋ3ǻK!thS?NS[@ =zzks۷{(~Ut #[+(?'؄r0GCTTY$:0~O>H!nރ:`Oo)#,v q=tn#-CqBCԡ,>"T I 'TK^ o%@w vۥ' WW%_0f齑4(@GPy&-;*C% '?#ΝC=yG9#9pf/H'3-wihA&0Cp0D/е O*^B-P#|>yS vVcK*W%!g5* ꣲ;ёA0Zi6_ڿ MZ4ơ&CmyV~0F<p,Ks%SN6K~.sQ R SvxtCt'7t'_Ht'SxYrC_rEvbA/ݦ!!HB=E͹h 4Z*2.ԝ1XWb/C̳9#52?ïK<,Gn[hniNRys ·;I ʞ gZ}jdN#KT|ixJΠ6 <2#^-7{ThBHI!m$DU$Tn9gO>-t#H.~MX0?4usl\0.,cN=lX{\ ϐT ߆.{0] E;?U m]sXoɺ9Ko˯o]6효v8+B3Z@8>Xr!Jf[q'yb'{[Vbb n;Lb ŷX7yI?o?T|?R gs&y(UدLGHJ'GN9K9 MӉ{wNs7Newv旸Կ݈WiO;9P*9^U|"īEWr{)*ѣԡ22G6 P2>W_<ЎTgd~Z DcxeiNFgl6 Oi O!~ٮ7`sZGm!G-C9fKON ) C ~̺%s>[{vT_הDuK^2oQ45RջVfCOj_*_n~gV\w|j*&x" H'COF]98^<ijo =㷃RorfR}GH.`_SiexWvϻFRi59֘nԦ!;-g||2ÞhR7L?"hThޱDpD?0S7ķrS^wK uW唱7D4Cs2 z:=U7Yi{m_:s|/SVP1o^a{ՋYYۻZVݳ 4|tK/u:U{ݐmtEu2uER_G};)@ |D3eD!X0MpWF>(0&l_n/˾͝ 8E !@]vQYbJTxvp+}|w8I)~˝kqIoW,UWi4w?$PiRHC),(0Դ?z[G bR #EYnYe^\fR o`~kgsїos^wXmJKc[cn#lw[Xw],ZLh'"t"iC*/ [̐H~~͊Ow}l-~Մo]!5g:OC7e{;DMn.!?l>Vk->hN%/6#vn"])DS*.GDԮi!4)?>wo O766=)av¨Ja !N>!WI?CKwW@ t,g~AO &_lϕ)=o #]kugJba5rshj-4WLs6Z>$D1 lÒK,G- }vZr׼?ު}vwnT*'jcE0%W j]_>VYUU{r.bB>Ԩ.klx+?wwJMicE} ?Ƨ>ʼnQηIF-9NwYRAѥ˟c3BzΏx4W+m 'Bwz3BY[;T ԯ(`|Dd-FO ]uGlSmکܬ|}btg6Л].TسooۃZB^zwҳd P"smsv'v. Ɏ_L|5ǯ?QL(K*!n= ;ǣyQmbz.9{HURП4}2GQv? ^rڑv0X_qˆ}f9̪wC|^C{:<'%$6şOz /?%+<#cFbR|˿i.ٸm;y=̜7c5DDdYwE^٧VtBmQ}굻(ԃ,}6:@L]a+Bڙ\KF [ FҠ]j]x->cM@oȱK4u@ĺ()(OV8RjN*4ǁQ34( k ~^3uA]Jp\%wu=@{h7Moo@M-_v7j@dݏf8>kWF>3؉Nrʲ_m4Njg. ,Y 83.@%Dzx>3vh4c.W%,(9.?7KX,y%Prݒxu`cx繖 jP"'OR)vCx&%rG?%?+vM ̫0G]8J^%<\!&WyDŽ-PssNJ;+ 7{|S/R*=İ%b7#&D z_$ E4x)1vqitzw{Ғ^iR;k6+9a-[h曒8jLf%[;$Nm'ȀPEL,(wVqB=?{4k#o@/]W¦V蔝_Ys_Z>_ sg1]#ZC/YQZ˿ɚ̢ltA!>yG>+d+T7cBYСzcjG"yH ^1Ӧ~ 6|c1сfMQ1@ΧL/y>_B~3' uȀϔsl~'Od0zxQ ܑawcރ¶/ݒ5yv{m=}Z|t`L/Uħw\4Os&Q\^8e-_XZǑ3~iWm|z>~|cxj%ᩍ4w! lEa=G}+<'6\F?ID. )җ/y?~N),f3`a +pvvϤ^}:;WfnKM=iڕ>Hɔv:'{7pLmadNࠂ`z{C5щc*/]{.]B$&ԘU|R<anKlA.(8r}kUDՂ A^+ 6 GV5|Y%W樽]Ÿ\8߲QGYKȷ˺ 8`AK"뿺Z κ۴=t"y^sUE9:7ε&<^v F ?o0knς& % __^Q#%/o ,?u-W:3$ `FE+*4Jx&ZFuv*[ t4##;>PG!U?ީB{ O]Q&އNs> )38Orc pD]kZRfpjb-Y,CuW{l!KSY ݍkr ?y]ϓ 99:^-.9T;Y)!;;T-f+x{ݯ G~N(HZf;lroORliNDYΤZ *7c a,Nݍtrwd)1( 2%RԞ62= uP7(pa|\fZ|3sՂ$ݍΒT m9?Gs-v~œidΙO1jAA/!WSQretZנK֭[&EݭHo671 }Gjgqg]BߤBX)WP]fTq\ 悅o[r9O t$Kĺ z,[p.\ tI$Hw|ϝp l+}Wp4n* tB3qDv;M>;わ9qę/xN[tU^wIeA/̜ ro݈ZJe½Q镳8831)daV />|p)kW*ZOUqG'4skE|8Ⱥ3ZH.j]j|..Rkoɇ!hУ1~ElZo4_Y>5U>[XXRYӾ7_ KzuNw8dpKѴ F5!sz̵VRڇMs`Z^8(گӇIӐX TA-چm"zDG!>e_o#/:~ =)-VD3JR[& zoSGħ;ѾOm|o]\N^3 N`_ǙPWXRo- XQ^?hM.#`ExAiJ٫;ŋ۴L؆.;|Ŏbs_0Ԉ6%vd%跆JQV#UIk 5Ptᑭ́n3܆4NJ澲nziIOQ UhLD2d Ȯ:,1 F#[ZP $TYPDՂz-JM\et4am,0Wx@f*`,DT =ĻQB:VMז[#`㜥^RAeDg1 mk,vޙM?ae*Jk^-CCCC[tau׾4p4/ߟX6,L綧5t=55Y1Jהκ](yo)&dSt&Tu(Z{;Z| dF2?rJמTT~A =!5)b:Zd;Re+e7]v)5umKl¦h ZBYMK,T+G{JEFFS*wIB=gURmQ4Q\)Ts'~x5U7-y| o`9ΡT_ 4}Nߣ6pViگ)wԫۖ6_[m J;D5wjSs%ŧ8 I tAC5^+;Ҩ{VxfKS2BTDO bгXhdxܷPvpZ#s1U\͉U6=ZxZl_*;?YU Ԥvv+,n<G-ʍ.@_\ M,(&fPZ @MMa F8ZC!!.R62pIECR= lLY~KEԾP+:$jWNT Y7?Bu'k;l+kإ{^&2$>x.ݴ]5E=\>[a[6/׈Od=B6tצ4}r+V"E+fͲtϚ%ݮ(E4xȟ Zo?1\.rQU{׋UE׋^~QW+}SoWҵz9z2G-גVrD~n}KK9}K OV++X>&R<\I,k}A~ ?F/eNJmSb }U9OΛVꁾd-/`Tc(DcQKҽF"u % k7ofk ҇H0]=rYgNjENe?ӧ }[ &c5ߧO4z$).ido =[Ys=~7oߴN~Guέ9bvr t-p0s->B'(z!g3 l,{1_~ 6O8ol7v6NqSCuxMT#"~wi~̻x<#SsrREeA3 Qx o}:ȅN_M0ޑ=.¥q~!MzR^AA^Gzg% T={ُ0 Ҧ5q<;_iDFOCPog_xQ/b LHK)ڄd$we: 3BqDj(4.CѦRo34Mx~X8q\t[OQg5Σy49P,2G% ܉gZgtC(6?EcWϖu Q,ZZ_ >3ˇxzXG "ad1bUj#ۇC˱&/ϒ;yM!n<^W4ʱ1#LgƎ5.::pdaaů=C29e|\WP.73k8W:ST1{wxo?6&Q2mx*1RRbg*4CXBOoǛz|^gf ?Eg9пO~4V+fГagZ4@m%{c7>{ЌiSuڥ|E=Z=$++-o`VC/)CNsWSXcɋ y/qo\>}T3ye\ЇǏ^l}j*1uE}Ζ:.VCWWv}x~pɂw*1z#VPɤg7գI\;Q:Mϻ wkL: i!\`k"H@q|=Ug[COrG\(J~ wBFlZJ<'<u'<|wp0ܐח};Ѕ 2cۯ $OD2LkrdGFxRfm˥~ڴ%W2ߡ vE~ѝڣo;w=u3bceIXhі%D;@0n04Q.c:0WIh҄ʯ L_6jԱKmژK|}Ѣ\:8/ݝ3Vfggey.11JƗĚ]ݰ7Uo~&/>\V,/, cGݠ|)U! rGH#G^|p2|:DHoiQ }$u␎j+tN>+'ˊ(EhqtDŽO=w㣻q'#p[Q&0a>,^r*tx+n'>c}saJrJJ ұ[g،nO?Xtmہ#grCMPӒ0Z A:boMNH < ,hcc P4qRpbsFcxmۂ}&~?~d\pg {C|ى8ƉolO[Z>.<%3y9^z:+ yMn7&5Qӧsx.1{U}'C 9c?RAl%,mj|d?Kn =su |_JL-z&t(9J!X]OyN-H#{7m<3x򴦆$?⏳;`C(_2CŊf@.:z!NaDV!B ؋@g$\Ļם~ %~ q&ՍFęb};[sA_V^.t=1~3Ex]Z + _!:+ ڵo߮Uצu߂1{6b8<44_Hʩk2%9X>9{fMeBZmK"1F >7#|Ics#Bgܷ߻2rߌl7)bgvNA[!>gȿoފsCB |~0SEAiVYhW( \@}{挼5}ƌdvoAكv)<F]T jnvNG;*Yٳq,.Tw\p-su͚5r3( ȖFY:,z`w}kY cxZ_(A&4Oé-<^%xFbg1;D#z_g5Jw;o>'[YUH>Ж{p!y 9e=""!m:.|m!2!BW;sx՝Ze6˺Au3\?)'OSHo ߴ1O|ɓ+&Ӄy. wSTÌYCy`PYGe]vRV޵KuĐʼnIQ2W%& zIIƵUlާwDxxD>0^/8Oo;6-:1sS3Lazolb@HǛs:t%{;d6n%ڴYզ͐䔧)b&vár%>%ڄy}j>g[2i6.mZݽ>0o&&NzՋ{Z6LI8OfJ"F8qvɴJS;LNHXO 0`6#6zM"X ,7_4?O~@l<LD䡏M`%kF'ƚ2'NH?{mŅ) -|м)%)iO8^W6+rvfGLO^Pk ^2-/:2geAy9 %9ĸ}_1GQؼX i}gOz:$r"SVjWyy)g3u1Fs((4/+ZrsJJg렿~cH(e=EI;.syAnG2ɦCv`^eg&'wNM-7}׮ik0Ԙjd%;Yۦu߆K_k|K.]Z) kv`CX"@"Y" _Jy9$RRQ!2adM/'Š!d9+*wS:wN!eqy7b і1l1?ukI+ӹcԌv${^ Z<ժk@];uڹÆ ƀD YG8w7*A 9~!|EM\䤨ywG/.@sWD>5yh98w?K G/^r D^=BJK_3ZVcV@Yu)y^w?9鍝hL T+6~a9W >I-I^jvڼ6,6 oZhHʨXcQ#"6dPFcaB]GѰjkx-88_DZZukռeC@g'"a6m㚅O͜0Gє^MR._CSr^!8| jSג1v9Hspo WkՖICJ7շo6q{MM$if2kq]9xr$6Ert|5P)jڎĴeK×Zuהbbђ! 7n{WٳG8gҤ9s'N7hu[ xfKRҢ C 6Gw0L/<g:'ǜsstڒS$2:5WRf/} #=kgAµ ~'7hzZ ɼ, .'#ˣكM-<-JL@63ӯ6e02L7=}'}_:ȥd߫?zL`ʒ>n Kd D%ǯHZyf%g#8x72f?Sa|o97R#OWCuS< &IFozi*9k8r* qjz`Kxr?C nHf;끛;'[FLyi9VfoG|-YK1`,SX(?핗==hPP0佤 1)T:5Wr + ZW:$XoMG:nrc;D6|x{iN1rЉީMRB]PNsfN&$6Cwt<+8<ِӫߎ5yY?nsf&%sx4]]zXGTr$Âٓ|y2b[k(y:i9H5]?sy#K5#zY݃QG fRK[(]mVZ0&[tর6k?<7 #sd\(`haH͛gRŃBhQS>ķS9iIsQiZM>ˡm8[&VɝAr?qlZ kOeNߝH5tdGw<8ϧx;vw@ɧyCm|0x0|q0ln^Kod\F3ˁbUtьɠ-5dCQv4>_HTr`f"#|ݣCۊ]?!*vN{kyzw?I Mqh11BEĿۧh6#UWYN6z0!FOꔜiRttQc6>h0ϊ`6LIaNwpNJ?z ؊:Ƥ(eGmѷBy!Q(3(9(8#&Ct$x4B_΁m V"W:7Ұc- b=-מܟ 'Lf 3|Լ&?%Z_pp^n՛-qhG\ztEND))q|]1;2g ]>hоKHg()dW5DBgG\kg/5vh=dhvENOGxڦMPA)rrliвyVtXp3?Z[/A>^&DtK`'tiJ0c#\BVXR?AFL---/78? 9כoep\s"芯U=/%(| JS,BKVwB88ڧUssrh|$f6YLb Zx'v]+p;RTdb",-=am>j|\#LfRYJ 1C.-"JGIxbVqS OW?CC[~>:e5T)H.eЧ&oɇ;B}6sG<=^z1n1gOd\#?=ts+7MuV s"ee5̓]ILder]eݏsƽJtÔllhYF[WO잝}j\ˠA]Jc! 7K/uNxHs{-?|Nm":OйSJ8y |(?ωTIIaIkQJC7С8nPۈ-IzNQomKI2p\WҺM)` y8Md08 j6Gk t{DEi8E7Q ͇~,YeuΪ2LW!(}!j^T;ܷ]k2F.YIy_*6)sBe^`暄 eQ.-^G2:!)I<{1[$d0g6Ɋęo (m+%J&~x!q:}YЫt!KB/G_5t~̖| l#QBܘ.$$'w1j1%( $%OY7?mی^m A]>ͅslPƨ=-VS,?OPE_)9Ǟp(=brҿ}7y .2!:e2W`a(zn2x]Kć+6` 2grgt}mWw/C 4b miOxCm4x-qI<՛p=i9m9N][ï~~ ~h-ߦqG[x$-s9<_I#8"_Ah>^ rΥDup9 >[Ys{k8kh{_<)?e?r" r{>m#Wƒ}NVm!+:YfC-c%0LX~ڏmQ}n-z3^PwЄEF ïLNߋY^ߒʵd^VS{g:>洽ϖ,RnNdՋh <{~  _wd(rR#Jus:\ ^yS` ?젿e 8`n~b7+9 eGP?_n_jYMUvT>'+.ОI{A|m:]㊹ \=<$rM\l\Fӹ SÇ>Aߍ`g2{H ;[ۜ1j7˝ @yq6*,Ri{=HڣC,Q{?g>d#[ 7SGzw#CANDw5=# {fh߃ёWZ8ɟ: W~}BR~ b^G"\=EE:ߣ{bCtakt(D&Rc%P{ \j+h Ĩ.S.2VOm~wyOttVVV#~'_qfY\'ۯL=j RlA;|$hi$&_FH{uGDtG-p'ԋk'U(‡| HB<|_$r^~*AO tǩpf>q WM_lG!t>ߐHDwQ?S"lG@M>v6>%':$HiLw2!3:7G"rc߮緭T^<{t|hVlw'vlW:oa_{dX656"~n'ekklKG2/x;<&/!e;ӎ? P.m:0ę6!?Rl݈/zǮj_GD?F"Nfmj"?4!g}~{]k2G0f!}9/"? ?&i_|;~ɛIMDl;/Yٸ[56̟ yԞO"ok/#q5t$}%%i ڛUwgui_`G" *m&&2<_ ͏\|`7c߾SC9WwvOs:[;אvy|.lg,§n3~ f_d϶S]gN'֮m6i3[ȯra4|>ӂ F &Q`70];0];uٛGv/ۖU.N">&r'޴ڃwDD:f?Z?j/1B\+#ʧBgH;?sfz|Y#诮 k %?K?gvs=Dhj1 ,GӬ5P ~.ћv/k^/#<Ć/wybb'Ȃ$Lc3e"\XNm>Z-|?k=pd?Z˭Ku FN5ɧТQ+O>``P|4qJ RuS\ HfGb&j1 =ǽBhVG 3|>ϵk/9UBsb;7lrswS,cm?c>4cDKcIV'6N)M@!u[FL ^fAuo,V8i[^A>||H(VG$ v_Ĵy,]y,iJ1@0Imi(4"m.Ma-gC'Fu09tFd,Gs,V??XrK ]r|Ef7=_]z1g/uٮm!ͮmDxL׶!6?Nazi[;`6*7Vln5!A㱉qZy|˘ǖ OB鹝y Ĵ%<ܕ pۙ(-GL׉[,!4 =|=/u>e|1vp""{\Id5Jd we+$;"<?&rE$W+P{Ou FlrP-|N|Skkv8p7bWr3 cWݡFL;INkŴ]"'+S$GL-ޱaNG8wk;4hSLnǿJ8ϐuHZuqb!^ ^bz8DCDǾ3C3EB^bJ1yjwGJ?xW8K':e0Os'I= :9Gl iwIotK\Ig8"Dx_ygrml^9?&ጛ%nܫ~+yu>$t~,֫?;'v[gvYOl "|5bI?Z+?$mlu*c-."8R(˪mpK7pT.>-8tdu}ȋ|k$p7ZOtuȷCV=(mH"ߖ_KN" _Nt96woU/;^ܟV85ptZ+~W==kEU8!ӭi7ܸq2Y'x&?ť)qq@+z /}(gv7 ?2C_xQOg}.$`;OMWݻN+] `_=q=>0ӊ68I҄1ˊz{5)C> }*fu8JE[4J,@Ap;Yob#dXmzYb8lY\ K2_fS,Y0z L/w'<Nd7[{V@%๤ºD3^vEx\-iض`Ep;|ܗ_Ƿ\C&t(/@cD!:~x\a)Oxn#?c&{nJKX wnt+C3DЭI'J 3O ֭L Kt>Sa 74}q7SN|G/>&?CY@7"Q"R#qyG!>v)xȞkѳ3a!z8 z$>o;A׮2 .gj+p@՞"I"*7 :Pv(q=1 }y_YUBd>1D:@ci^)NT#S3,&lWFB oy>yx$wN2|a}iXg=Yv.H=fq-=l,W,G; CTh=x1518o׉Np(]Lԑ!aX 6h!c2E vUP.yKFyKz^v]ޤ"nZFc0 O^Lr:myM\aY;Ĭ;-rN#Nx3xoI`> 1t)9dZ󗜙HPU[{O[Z_5T FTsW^e_UPI)~9JpOrqy2S_19w +d>Sȉ]=m_q.0?\_~h|@9x1>RUyy1wȥPZgq XI$%,Eʅ <ź9.^>%\RL81ȴpEۉ9]TǑguz%o`⣟%Ɣ)έ\ȟg$U#넆YgP֟c߇I?=%Us.2bѼ3Lp^ej^sq;/y_Ņu w<K3L Sи-gnfJ4rCMQPnC1j$C<.yu4q=)O`>8 =ά]'_g:+O!lDˍO`Z}ﬣtzJ" K?v*%7D R oWR leC|W~;p`e%m^3, p,D"|[k[:tW?!ط_KL0N13r 9ȍl#Gw/+GcFl=fDh\&өH0D'IK 2&oSCHμI柊sߙ$l2F $b^&|[b&BoHw "Q ȼ2-\/1M΀CA%'U$Lg3ag>߃.06=IFf=|VqYAs=#e$!< B^JzC^Q\@1$!>vHTX] *|H,3UƏCq=B '~)tC{&12>JkQ!ޤC$K93k; "~iK {ż?lMxf341'cy`':hcmR 1;;H6\.w'ƎoT$[[E\ 5AuIfWH 1XyקZZUyM[! }q ~t DVlE[= S/ |GX/mèQc64VVA`vz0F),BrGDz{|;Wj:`MU_BJdh/=W ݏT|j rdD8'oм[GFeׯtHD{??`@mv|ܕHDCD[VXhcbaD}@Gmbo88&2hXcV֎peWW l?6"41uCN%po Jij T;ahݴљbK.YL@izZ1q+-JUXdt2J X?*7wqa%<]oBwɲ%/^=W[#NIH$Uɣzӛ/BGz"ѿe?1"EI5{t)Cy^L˭7L_#>9v!"^l.9FJ*Ĩ&-Fxä}w&#YGh!`c?Y԰VX% #G`#!143Fca 1m὏`Ֆ )C0 V`+ fyB>Mmv&u}B`Pq\pͳ?Q@ά>'+K G (#=5̷ON'zt;7n3PVX`{>ip08m -طxJ{ hM AG\f D(H!=T)U̔IvKk)evPOx8k8&Aø񮰑CaË[~ ~} }dsp/dou-8xu¹Wn͟l\Ѱ޸:uwkfJ/3Y FdlYxWcFdj\j4}F'C4"u*L*I0%X]&q˖WoY=5pPe %M?i5_Oy}}pժ/ !RW_Jͫ[|r=|KNNBKI-JM(FVi #s>CKuL~7"hE]Qd| ?߻ obٿ m~軰y(cj]"j֙0Kn~55dUSCx_bF@? /?Eb)i]BK( 6gf |nH,?IjΗw8UnQK.H3{Ec1_:n ໦46]ȸH!~A AҳGz9t{|<TG<\G·F:~#LmTËYȜ% ,/ p"GyT8WVU˪Պ ijjM*2BW$irh6969597465ɚMM&&M)))IԻOSߦݡQKe2t^S=ՎTh$T~j(FkpC0pk~'_򻶻pQ-\2 &&ު(z+LUwZa?`T~pU0^/G:Q)؏-9oIǼ4|\6f]o^E3/mVӟ#(Cd;ܠ)mhIVRXD77w5hW <2:^_#>W/ur W/onȝ/:rC* =۠ 󉍊(fRO?ra@J\tѠ1^RPEjԀ/2M;){4T.6x]m{]]ݼ\n CeOhvf?-fzaH[zAJnN9FM{cTSCQUgGi>ڨM${Z x$'ۗf)֢)_UϋLN_(f!Z4-$Ӑ$V_41rsն .ToF2=!kXdak!MkiQ6ugiihdϙBxfyVl)bOUы&AG: 6Jtې5߭:thwk*W2m)5k^^]=|:`:z*VEIDۖLu`}AWW*~w#} UQ N^x4M8fA?"`6Y3owi?`rhuԙ?hO>J4]D2++b 7qmݰF&fu8*,zfK©%7fq˿HhyGuK~ o{%!!uҾ.5tԺ}\-Z>fx_e%סi-<ރdGn Lq{ +v^Ѩѓ'UT0ړ —@n=*ݪ m-4)>A^z?U*yoʁO;ih"4Q+xܿ^,;K:?Sawi0EgNξ@p*|BV;?hgGѿmVC__1KB5_S - ךb}2N"tn/ΦUr^}uۃ,G lUޭ&PSZ&qܦ`|4GyxሆحytGS]|}9Y_ꕳTHY*]RBdgB0dh"RCW梫][u]gu]˥xG~.j9KIQIVڛY1<24H Z7*y(+AS+6]x'= qsׄ8F7,TD͐Y@@{Y@ϸWx3X"fHh qMY10=0FT5֟SxL_:8(0>FfhTY-vs2j2g'U{}wB |8jGkFՆNnW6xUE1@mθa KMvMOL4d&$E?QLqU!| ~6JVU\Uj^Iޗ: 4~$ m7uؚeIlʯ,?;/_үһ3;20i5)>58յ:I;:>+L C*J"z^UV!5y׻T%%*ea>N oԆE0gKxGq т;hXqe@Kw,ZAD1^LL+9kWefJFB^c|uv>~uզU٣ojF._`,Pn 4|js?]5sƯxj丛Q0nrqY2߻gϞO;Qw $7N;w޽΃ ؄,/Jqsmw+H?#z ` J4UϦ}#JK٦fxޗMMl4KV#+*Vظ-ոɸ=2R\B*2~k K4}d'FNA+7:UF_ Jfm} 'Щ'F_Ji\2>>qצ |xW`32%+#d'D#uȜ4e2%dtM4Hht7ajdF#͜`tJ5C~ƠύAFo TÍ!FD?C 8%BxU\17?%'VӼ Tq<0z<@mp^/]P^JoN=YLRV PyŷgJOutDNկz8yuoT& 2f ήWw쬡ʞU]A"DePjࣧ8:Wx[Ve4op>oaAk`)[7' LEzH;w=Vڈ:x ?Ki';KDInEnਟQ].''o5:G]ZWu]!BK>" ?XJ)* ._'ꈛ<ԉJIטU{`6\cZ7(}#0'@u\7~sd7?8 {CK 7ˆSi+ 6vR r|ljXӀ~>Aq'x>Q-Z!o֭ÛooZeFRz"&cqckdi_=bдeM+@9yaVܗȪ_se12r-1ͨX&fAY^Z]q}g_Zb*_>~NRËxDq1֍G(U~ !v s${j5;=#!˜t5T#*_}|oɎ_bc_*ʘ%8 t&>ɯ3A%h/9RЅ=H':Lr$3fZ/#SZvȱךgg>kYr,hd~ ܃pؓN{{9M/5p)@BLIh_fFs50¦0}/h4/`6 v[5ptuf gN4K|8 'J#?+0Cٲ_ ^}~/e&WPwkAxWo4l:&oBA#?%R0Gs<#|FsOk2{^cv #S;E. h>FF_!:P$rک^Kz ڮEKCFJ\69;byi#yeH&w+e{͐ CSn,$6LiIj8^0婌yK^+zȼhy{U[=/9E35̫Q#:"G[㰝 ?2LN.}kCXĮ[ͱš"ݒYcY}$,xlI^J+{C GAe3/8{#Δ.) Og'lmU[:E !8l^ٰ."< tc>+0ve唈QfeQ [uMC-Üs!. R0I툌SDȭIek}# U}Lg3 {?sl L*[֭Xf2 C^BYp`'LYfJBMo_/'-}LmF0xLuK"ƽ鵕zS)5ai\{ƧFR6JUfjD[5uXu˧ pA[okmC fGz=K 5*qF01xT(1Åsx6)h?s@8'kE):->+>tڌ =\R6y₤WLf1W|?l7/P;:g#8H-p|o8]D4+QNT0$]VrطlBʄ’7}B$9e`Jc/Uzyټz #C}Ձ}S&o[_ʁ E5I$(wwzՐk$ZM1hb]l+d, O{~H-} .)vqW*|RU%j6Hn`iE(#4W<0N}k%1jo'hԺIK3GWgx:”R\9GlY7gzι 6 c_TaKvi]y mhb<=:ϏȻ8z5nT+T\FB  op%ܱ:2CBRztظzi h2U3cJFb07/u3fD;Zd:_^!J׻k^R I$M74qA} ^¼an'pj^:t©qÓC5^ ISk4џ'&,dʒJ)<2zvN*]|Y/eS,!Lorx&Y ^v;}xkrO|  4-GcIbM^ B^r)(&vPIj70ILm;R5;~C@Ϡ˝ k&E.:2v%#C⒋}'^\7!ɼ?A~)`iC4ƣbQtVdF >E#dkÿEG#0ż8Ade={ҟgLZ6g;O{2?EƳ^Ep_0p^].fLC6I@Ne/sD Mw U!pz:! O q >Kd/ɮ2 DG3}Y<Zګ ILn= g3Y2 2Yy4,M`"Yd̀gx4ڎKz ]hwM,c:P])t/Ǚ uh##*!.JX !eM3|ql*c׼ثt?UU{^ ƒp>h-4M^hvWŷf"Gx0_za n 93nN>_=N qqf˵XGXe~kD$T8ɽr$ FJ{jd$zpyhpL=7zvUkct_&MbF2Q?| ZaD =)x#qq ƁհU0@b!>@׏ &gQ2D[ӭl!Ib$=OHnbn-1Qz _łW_[49p ؊"I ן^{ [p\s0,K@O2^Bm >3@L KmDoHe)Wdj߮27+;NvPnBn*ʚ BPn* BPn* BPn* M)qG<XwO[!Z)oGʝvĻVVd24bӀMԓ,M65N>y铛эk^wB>B6j@ _UE֋"i"o =G tBH oOŅm0qLR<;ګ5tIPz': ZXiӉ'qHORBk덨i "#lqd#IsxG:RCv#"A*$]i '3%:g2.@(Obh,Qxa<4&x z .*?dkp>=4?O͍鵧FV$աd:U3l6zѯ4K>&m8wm瓳?96R=a%t_)Owq <&ρ?lϾ|#Z!NWGWIKKf/%<&ng$Rڍe8D[cdp _R7 :QAʺ\dVQQ|W77ecwh%C2ѱq,r WTu[F: eL~$$ks| 7)M·HsBW_ܨ;Tgɑt8H8H;iN}Du)~:ʀht C؄ŗxGYi"&L+ ?r,>::Ot1L }O0=sOԵs_U=}"0l"  ""n^i{dJאʴkYZjbejff.s{3 W>{{5־ˇe‚  \BзW]*?osaCN|TlJ"])yȥzA7^Ν&P,Tjb9ұYfLU.c.[QfErKMYpC^²XxR"ScM|7urG0 ʚ="szPܫ}pĽvVYH5n\W&/YG̿yF?):y}A鲪-Ն{ẌDme䩿Ki^> ޫ/3:e6*OQS=yUT?;T%*0U";|]*|:ot5u*|j>~@.YW}.?ZWt<. kZ+F188T%Z0jQtc);*ST: ]~S8ABӁzFŲ-U=8=($u*2.!5COCI̥ͣC,q,[|2xJ7/q~>o#gνG^7o0OxQoa&t}c{frUN$)R}:Q6bKL젘 sУx_jX,4f IU5 G*/=;_j/lDJU5{įT;A$WKg`wO鯲9%\6v&Jtj~4}J%O{=rBzMv^k|S); skh!.-pgkcAq $.彃 ZUKf1xCn} ss?+m3Z]u30!16yVnxh4bԮyY.'?:k~n?*- 6?k@fе0L'ءkU)E[j$14ݥ]avI1[*,\h<PB:q_b`F>|AGB͗<}5sA5WI>+t"kHDa}+- lQɓtOMknS ,!7%,8Uښ} =_) 7knH@b FGґo #H#8uK^#| F*1j?aYl3H doF/1Xxb;^{ ͢>$.0L`z}N^ ~+`4s|G$7vl9DpDyvDC33JVƍ9av-(m`vagͧ %HSҔ~vD9}a-9*?fy4U+D_'#g >h#GH=O![`f@j1 ^i,6Tqˬ|v >H6'^(.`b0`RQY"x=*BI02q1T >B?PXQa;$3pnq^ xVޡ?'a#%fZ-E?Wm7]]uyS"z}ݯR|p ?(ȣ_ ɳ8bPZ3V 'gUb#.ߙ `rp,qwMg/Jf0RVHt:)]7t6.Kw`01"Z7#'>MGF lDSڇ4m6.%8޴ImxׯiЈfzyf__C3tm|:>eze^`ЧYzYUpW7eim09D:?_6vNIp6+MGNtL':eKNy;ME";ͳrZ>\Y@oYF9ylƧkY0{fdzyoR{[=Б /,$WĞ2p )Y \oes|ˈ؉|Ϗ^VU<_ 4JnTwK K>{3O=louuV~qs."JS-'+ʐPT-+ +9]Pژb l& 0)gJXN]P-juX9i4=p &+DᕀW:^< x}K&+*?m٬`idP7DuhsmϚ~!.y ;jN]ZSC AX~޺މOяGO%^Q1S+!7 8Dg C|h) ~ '>NŤ'q!s> 9tΓ[;q[Aj Ի%7|}{g$]7/7_9ƒßxɜrQ'}M}+[Ӿ9aV:[*lU[]vRwJ|D5L]6_h]inoy3=DbC6_o rN{X; ).s<[k/=g''yI2 (eg򠧞ꊤHlbc{^/d{ra>B00R֘[uL{zh!}PkC^B;8ƫG7ߺu}"xz7؞ʇy<S|jeId.a^tcVv~dS X@ ByN?M( d6Ms4귤GJͻغ`m}Nvv`Sޔ'(o׬L{LX`b/j/əVl$^w7X'S\_x y (^]嶗#@(Eph5ap]wSINm t-dh'o2l͛v(Ph$J< JisFJ"x4e.Xah \ҏDNlʺSKh -_ܿ8QlI Tny5:/]>v6٪6z0?!@~Vҋ8U }Ki$Z-^xcmqA 8^MiP.([NH%1"}Hl([p9-%[([.*[QJ;XPVoSYGr&P(tdu,sti_pP v.0{NYޫ] mn%o;B2(BhzAȎ|2hq&DuU>|knџKn!~?)^yHr8bMܒ5:_ݢ[& h$dȟz"载PyxN9-PY( q4W!?U(ޣ< H8C{sNd->,5Bfќ{{KTVMPzˇ+6E:h&T&1rh/  )ib2䤝Q%LYsݡfo)ILQ+mdK찄.c^+#3ҫOkֆvv~L['b+b^}:v6$M;tIz=9EӳWOoaqSf@fW[ˣʭ-_mۄaBjP`ˆ/"X0+eoZi7bc/{,Q+n/C)mM,\SOJ8Y(?=t';>@,l!ɓg)I͛ ZSKY iI`!nkW|v[eF.ҟ赇oceSN3I ;yTV 'LV|HHdf$ifqLs*nz|xj)< Ad*0 GIĉ/O-qӡ(aRT!Uu4*vZ ^Z!`ڧJ+UN.a n|&i ]ƫ^FzW+eR_7vV^-/EK=mfw5x긴`'>05=+mw;kYܾST3Fޡ!X?ƺ~8Qk΍IRIo(4~ NcƝo_'HGr~~~w8vчyylN<%w-]ʷhouP}vO>1Dy{znUR:#C8Xq.8i&r2shV"Ճd땨R듗:mڰپf6}={Y ǂ|uOOd /2YӢHƁ\DBN&N=RK\8kIwa0GXtȿܿ$ +;qMR4?X9^ r_?,{] I|kbg+bVjCnhegM!bKO9=Q1eoڤ6a갩Fty%8ynIhvƛofdgkcE冶fm:c#UHͱyVd蝥i`A* ͜nqu҇́]z>#gdߩ&~fFVx8)#S]PM3H6+~=GahlHڱhc\|9[UFzbcjDBt`8#y+vdy ~HQʐ rױ1Ç6 ?nK/z r~k7۴o>9җ{.m糪q1[>f!Ҡ3rt]|;Lq8~8QOSC:~3~UpK2J1xإpgĤg<ψq<.z|'~3f|f+=n;mh$a/qEk!,)L:ڹ@:zz r0tôqL=gwb>]u]zeH_L&Y,ThO}NyC#|"5sE!vLƠ|2?L.fڂ.i;g]Gn%ыFܷl_?"hSLjO0gݙ 'BFBښFe2a22G0ʝ6- Xľ?$]R!,"%eNzu,Χr=- [r5HV:*Z4`Z6&؅/n%xG骰>C1Mse/aZXIH;գ}4U!}8Дz'\-Ƚ֡oq` g{b@ε( .cw L"6Y5@#K~'Z}Ato)S9EZNr E@36s&bm3Q|\w2n44WGl޲ǥpf#U_kYV)-ڶZ 7!;uIN%RIw))TM2Hz7;GO\r|Ȩί{+\ӿWKwjMUW8ǜaLCzQկt;[JW`"H2vj7s(5diڨx\m"o!kg(zGkx)ӘSU0!|6_wךk;sm\U>CbHgެGܛ{:Ľ;/u`C$u} A G'gmS%^,GHr|xDhQ0n߂F[4L"w{¸sߓKv{RӍ(Y㰆Y8m39WI✓!"VzӧYⰑMoBڱmmk^ޡ f>Edz1=+K/f֩ltZZP&-mtY'"6쾞=C55V"5$4(]xA FSU QznR* Qfek=ZKʛʛ=4{q zEVB }ďX&  y)11ylx>Owpa5̯HZ()޽bc{f'w֥阎WaotVf%E P]u,_?>ke>c]JM9vܙmZs Ei%r<4DYqA-*J+ц!`֛z D5΁snʧ?4?rhVW'8,zԈff7_t'OьbD2j9ѩ'R1|zjwԪ"Eڑ2uj_S2""3cgNoI3OM H=zt蔏&w:YH-fi]=,-0clޜɽR;MJ952b7 aKjn|?:q]_Isvѣ;9-kԨa Vڵ?1_@z2dѣ24.+pW8ڽC]k۱հl uƏ,&Yvc;/ZݡHmC$Fs57 g6A!B6ڸYU7ɧPǫOgi!eoBO;M(Αt@.YB\v"|Z@XьwCjJ_weH#kBW9G KG<$q'? wI椝+N[֫o׍xX$'41Nς_L#?5ө/ وKC6 IZ3ʽ}< >^:0 CUPs߀۸&FƉ+He[DD(@b?d'[N%~ۥ/"DꥈF,8A|]/#=[TFGxȍ[gzḛtqNW""ؾ]]yH"d3@A%Іb$1Cq3jz;]2#I&W!ڏ+,x u4U8A*BKSB<˔ͷ*9U@j>9d1P\,~nm1=}~^G*#U*#Ѹa86 mI80p'ع樔Δd33듺dC8j=gPsTQ(7Qnk`+-EOhN@;h(I=/ѪIj1Cff衺ti{wc ܶܶ}۞KUץw]|GgcśUՊG&C$S@$eJx~3ޤ>kGh`dڿ@v}ӣMRJ:U O~y* weoSǵ˺Lh.DtlBJ/T⸓y17OIΰΖ}O16^[yˬm/AkNȽ9 ?=Itqnn͞ uKОyG,>%v1)U m(s v6|7E$³yQh#rsSׇO?.WBUNÜk|*Is"zSnhʘ!0|(,'/?ٷe#t~/ _m@h}$s*k?6O ;ߡ#/ۙ{$Zy!,QݙKfGd EڵnF{PE3ttZq6r#W·IüxA ^DXKSMw,T E9m<9701JqOt<)t1*(%Pp߳|CΦ?| 66di-s8>ekXA4_?8n:|A<scԃG#b9c)AWthyq0Qm>tBGb9;)GP|McsڴrG%G] LmA]؅+:7VD4՜[`?J&(̰@`8ab̠6)360I%Yp5\|1);D8wl";Fpǡ䨲ld qA']36u`L/:T씄`OΌtubMtq+UY88z&^M8;LmRGO3LcPE?`ܤr%քu$ʃQ]HANmP"~Fr%dҳ+`ܲ" v1X4SiӦ_+6mXٹX/|ӅۦYNk6`t:5&uSlȌ?ɷsH1ڍ6culMW? 9ؤOX>qw,'.mKRg.g.XbힸT~ pQRT@Ժ5!wZ茫ʻIs >='N+#Ƽ4w$V_oZ+]W_Xo%f>n'oG ߽"?|JLAމ2ޝpŜFcLQMv%~IUU,^A&(#ʚvr'A7 ۈ=b#oR޳NV^! tޮl fʝ'¦ܨWniv2ɹbmePĀ8ͱjN_*(4̯#ࡊə=B;?HVAY? #@[TZn Q|}t_k^]ii@jۯbZ<}T~3?7oU++V͛(j[a xn'q ?8˱D3Nt?FhDĠ*Xp,q Ѓ̧,XdeLi&ӂcAU/h'N-%+͒fO5XwqTִiӦHצm{?Sn}ۘYc*?(gŀӍ kMс~6~z7;@ b#^/F /?QrzwQ5Xb))T /C~_~h9.c?a\wyl`En} jFݪ&7z5$귤nP}x0yh H}L̻GAxE!wOtݴ'pcxYko#mg8,TI˜Y}s$ŋH:CIHb63Yen2^^^]f~Ѭ+ +׾< hVf*-?!lVdu!Y] TXF|XEsM#N+(-__Ȃf{,g=q㹑 ۗ,_xы>Ur+l\^dbWsVOOtn@%pRkԲ{1;$@$)%ĸ'Kv;r!Y:\k9+ AlW<ǀG.w4w̧bC2 玏 a1q;JE2J K"6y RD~f]L@ېwYf*'k\tdwBb ĕ uWcД#2Je'C;`ˀY mڍu} [ꚬ3 vR]._ug*s7fa>]Y$ )7X24.1ϯ`EMjz3( y5g&2?g1@۹yDSk._ֶo6z\3OJPkO f+Ր%?%="xb$Z.6Oڣ=%h7'kG~+;"iݓ~5DpId<,ǣp/֎h]<Ҏkuü5?]||HY!9ˣns>o9{b,!K>T"x|j|U):o?Y4bhP<e'-B603Џ^7›/O5o!ak¤V; pe8H8lF q@hJhkARok:UX[+hxE7O!GL2{,$h‚s\ւspq1oԄE [C9[5վʩ,B ʜqz+ nrRN IANTeX(sQ[ޏs@gi3x?(p& re7Թ&5Mus(st} gkϒSvC!qsgi(mZgܛr^,ڧHiڊ1jap0X'|2ANsD-bY1BnymH`$pԣ YZrO۩fu[ǏCb- Wza?|||Bzx>wxNn?L/7 m_~\ jo/q_e#܎J;.|u7శB5fUFcOuK؜k|뷏"-t .pYMes#Zv~]0cB:v` 4l.zP& ܾMHk8j8  Fu3@% Ⰻ):)1K/6 N;YH,ixJ! %Tg,“4uMJBIѝBmp4=`l~]5^ Js&u(^D> k]n.fё'C_Bcg9 ʳ}H=-?fg҃Ļ}&ƱLǖo'DN)>PF$#6QLI&FĨp P[_ l,+Eky>~:AjG n6PjV~}/۶;9]F>~bX'ϟ.CSiiТ_m^ sLHJG@:]tUڒCQ[%ʷο3}~B 2I|GА~pVyh:J(`?͝j/l>ͦN/3B(s]k<}Yuz rL:y|OuΘ*f;_Ca|PkJu;bz]-q;yau]޺Xr&VtÅm] uO&.[tԭ WJz FōK p7zQ]كf-9~ڶr̶*{/x8BUW~9c>2qD&gE*.W,F /]NKL DU B6i:0D:B/)g!Y%i͵Ti\3V,|ezq6WצM* 7Q<^F0fDe}Sw ivi"4 *}@!RP\ܧtGx9d%9dvƵВKUߚi@?IjЂJD=+ pCh+=dv&Uh0G-4 J V5&dom>6q!7Oߜ\XF v݄ooݴnug`j:Jsmܽ"2MWNkSR=<ʋ@VsUaWdQGc05^_'R^hJkz3W^OWޯ~;Ɛ ?\/l-jP|ޠXi!%Pt]J/Rqs2D߭Q$RjF%NY ziCÈ `g͋5-L\;7o4يN$8_bGS 9/oʳ< $}q¼^+΂ qC1Bl]9$SḺ)$^M21I?% 1EŰx Z@ V_+*xTT(x (b ^~z+?ڣNC΄؆.X|glX`s+ ڀr+h;>m&WxԔ% s@ђ^+ _{mI3-7Ν=sYdJW[<.7CieŒJhYBYQ,\1KqE)MC i<+tئgi4 Zd:E\(vv)6*vuX~T9G^RYz>ZFɏSF 3&e{Y%rN͏ {cTS`#RAhLHljepQ5^f$nWix$aNo 鞐l2Z|3'OM\]KNh2%$;յt {4\24ɋ8Q"mq8vHYNAHڒVI%)֐&іBٳNe8Y%ZU-@rtMNc-]Ye,͞ <N*ѿ z9ny5KԜgHRS7rV)&ְ:MMƟ3iLQ9dˣfp6;.cpk|'eAhHmnai/a0F"k.-CpN*ԠM@"84q\`/\`:.a7v2q[o]Cq|opN/MnzV]c3-kk0g=!޽EגiXDF@zK߳w{Xc[=Dݽ|NC-+-ruŲ@|b$El͏gJ!g73S t4mR~i* by"ۢd=t=j}ա>M4EWo w/l\eQC*[aKڨD6ire6զ&L<'DDX?*s-f  ԉY "j0yq4D;vrCdL vtxd#"1wJ+wT8.@8ObASΫ`5[n)]?>-0c82,\S@DIॆD"L~Zˇvux*1T<_kARb'ƣmZl hJV;CbKU u6c?[c;F(wYsUoG|>gAV,ꇾ/-6 a$jhkbu$?Lj-]M;i L_+W+wzYX]> [tfqA* -='zcIe ` -K,t0>B0=r:3}EvHq8r1.L:7Вq:R`O?uqV*>@mЙ9 eL+9d;m(_:fΰ3t̛t>GH+axMk^ڄN>^_⥝#a7d5^xE^H&x= xN՘gN1"^؆X ӑ# B3vA0 F扎dDFK>\?fFLߦO`0kӊ^ӗJy\iwx ߇YO?^~Pj#m6s֊˻#$ח ҶfU͏ՎCBQNQ1 !F!(bBBQ1 !F!(+h~QͅPnXDұ(S(!2az;LA3wk7Gg[bR_߯C[&bd'u:_RxN?[8xϏWoF5x)^^u/V7*hVE#h'hУz4BF=G#hУz4BEU%KYBcpnd#O'c:NhqFr;!N=5Ov;Xju-*ߩN|}Ξjpʘ]=5^fYt~q0e1lXGir%w[%-Y n4`0͔I t1 {% iKzMro d&{ϠvvvfvvgfϞ;:O3gkܐ?U^uW-AZ*JhZ*JhZ*JhZ*N|J{# #jWThJ+>]?Ʌu.\w 'm"}̰N *rj t;9:`#}3͜g}9ٿT޽_UќY+V̪%6mZUҎK:vla Z۵1/kOtmi~R-e@KR-e@KR-e@KY2 ]SW UERTUE@UPUTUE@UPUTUE@UJ`.}vf.#BIߨFB)H A}K=}o{#Ԟ=9mW FmݟBXP)=IF#1UH*5eVx@'. r`SXa(`m\ MrPAR7+_׼|A7A׌Zxkti)c54:{;SW1v٭tZKoW:H#F8:8PL=@Юi/ԣP*(;J75M~KV` 'ma^]쭊f44R))=!"[l A[8*t*ڊΦpB2@'~l;kT{-pKxkPߤp} JElorZu9m 롂6r*ڔ @y90D5QGlUaig ]Ȣ&L7)MU5T*šalUM"iꫩ '2~X;WחNn舮Ꙩ玛&Mc8QM:SG/V (v 7Û| YD'R"FY ?x0O 3[8A4< o"wWx>܀ o'?̤h. X+jjwS ɐ74@1_ţXPrB7U`ޣPb EJiaU`hQ~_O&d@oEPxpLL,-m\s h4 5Z8Ar Q*@{mƷa;~?ʼjRZF.)zAu3!,.h~`,DP:/St2Zhx*Q†wA˴&<*\.!F"Lh^ (M>GA``ꡙ3ZhA=|78,|``Y4unIGuTԖx8@CP!&.pPб5,}0njc cXv, O2 cuAZBVK/e #fPV3thaiy?@!soPڔlK9J>l~hzVs˔Crphy:!X'hzXVc#'|؆O4>$Ɖq c W6 l1މ+ 4i :<)10N+ c*uaP^p|Õ-PB4d  s`Q}x[Cp\ )\ \Vĵpzݸq;lKm{h.F?7ĐlC"ilJy/$24xP66K߅fibU@,MJj(M5Km?)Ciʼt&NK5K O6K?KlfOs6KfihAX,;L{>toڱzg\t_r.qN.k3v/pOs.`)3Js*~KN;N/WvLč&pS;ܽ&nw;=˽]>>~npA9=^E3xiY7? ްbQlh7%p#:$W[6gcg#÷H =inYoX;oZ>h*➸!H59 Rc1 Pɠlp~J,i ~wٛ>7:mJC􈲯S]6SQ 9[GvWأ򍨂S댁 "'5++pG (-fP~&z xߏ#8A>i:3ĢsSᶏ\J',=Tue XNt{lů=b'Pc( #?z"GS? |hQV AP?I o{gt:zޔv7 (k=ܔ黓G^hi3[_ljfkD`EMye !=gϻex._A D2zdi}@2HFnHl>iǥkl]+Lⴢk24A+4/XX]dg=79g= /&=/Fz86^>Lʾ f>$ Cb+b}q^"$Z\{/k|G9uiNz_|sYW>i)sg~'nڰCe0$ ?J> _woTK>A89YD 6,}6o, >ڞ"Ciۻoݔ!nF36rS:Ԇ  o|;[g̯\I^]TtU އ1}O3Лb}cYʏo]>x{ Һ٫VY t\+W,DL_ZQ"1ܟH+VLcYe!S Rٲx),@RT򴇓k [ >+XG{1} @Vmҋ8RTUnv1pva%|1'nz5!晄%baÅ 2&Hx>ӄf|p{ Gh AP|Jer.ׁ-:ԉ[d])ȨDtld4cy{ag^Js98!gm;UKyTf!LI]3JO) ,DvJ'"zX˾?R?j j;1P#݃׮ai>e:h-Fn%vЫ@4:,*mVHH#Ř|Y#6v 'c.1rv-6Ũt^P22U1?>]1ZEp4тMcTY* ? KkdXȀe 0/ X,&`8BU-oX% AU*ldxY0!CQ@Zij/etPī(G @tU,-5[x7#A%I*1y%,6r 39QNx&(TdcaJ>K+׎ϡ<@l 9 ҩ33TjO0Uee1o"((/ByS3A~>M`A8BBM!'^%Ɖ .vZ^jOίD.Q3y>#G9J.)V>"'4W2 FQL)a .(!쁑I11I&7 [EPQ'q1 ^%C#E%r2j$F&r+4*UCAb#EiT8 E XM,' (2 MP(E(*w(HPt$Fh٫O=(4⑞t)= #ymbDDQ@^g껊N̳kvF蘨@t1BB[mӺ d*Y"ZRa]RDD$Zl Ӣ#>122Q"ho܏U"$^NKL#iYB6:#IVi%V(k X ,SIIrFzGxM<0yh)9L:ŏҧ#wFФ'[^"_;J{uCAp-}R, A?K*4臝]A硾3w~C,Z|f9n.|΄ $W ~g2l0?cөSGU՚u64_*E]4êr4N˹]d=޵_}ƠL޼ypyϯ\{a "Q>:\I!0ȋSJ*ppl#9B& ,euvq֏'v=p޿gw 1(.C}(* egcgZ…`Qp9.6h6uڛfp 5Vnڗ鎖-*ٙB=Zv^]I4fR6a[zgص.AO@?[pdf/[3JF1I!.-({oaz!ԗTҎ4 YɦYَ@3< !INᤒiu.%di uߏ_6no>5Ԯ,j-dN=GČA#oٷ _t%K>1eMKόZc-iix#W M;C&nQed$9Ma6VY%g@0%9BNf' r^VǴH p `@;[:8:ı4[.p?/l&ڗG'܉a [AuAqƛ]K-]+H îQV׆Vo 2]^T-आڏ9'*pv&kgnyE.HϿس/آE-z*755[Rkr zIAC AQ}d3pW2SF =ъ3rRrސQP=Ā5~؞A}:;^07l3.Y*5eߑWIz^!W,ѠʔBBڊ?qhۏۗv]_>豅 CFƜ4;.jq7u6Q~?Y6g)J6[̲YdøF_) (^ 3)DP KΎxGԞ^w!=^}mO<ꜪimJ. +MM[PܢimV&si4:1>ѢN}#xLۅ"IMlT ,ȗ< %dYmxRzKSA/ް]rvP$ˁb:#m/;s[߼\,`9#PXymhH2mF d0 m"LB iah+ív~XQ"" y~QF$a y"b6?哋bRO4@dJjogc?s +Gx('n3Ѕ=xai$J|akv'8*g|prr0?~AB#m\TSN罓.#lx8T桹jܾPHRP)tQEq^-^+ӨFpA97zynhlZ-Y%ʑ$39%}l$`CnF Y:{]Q赚EG+CB x= BfS]r"ZQ6 f4¢(>q{bRGth7(/ cTؾKvTa\;ן1T)ȩo=}xZw!Ru ئy::_)tfP%Ubd>%ny#^o6:e9/Զ{AکSؙ(Z1hm׏˩qsn3(622R[QZ za$mmK8+b+(WީDFh7V{ `FO?]+S$Bˉ7߁z*a˽EVbh8/ SCqQ| 2?Chyۛ&>ƀ>7,> A\ DK{`cpj^E]zw+l~=:Z\abĴ7{OEG'JSԭBVaF},D]tBǎ&S3ILI'dDG/<]oƧEg$m^]d1!ZJ %Y0- (g}F߶C6Z/}=kz;੯q{3"Λ`uGդAt^ANdwtӇ=(cK)ߍ>O63ťg'zD ӻS*v|947(mW96:dKU@ <\wM;7OGSr ^V\5_U7 +ƥ$OADҹ,)hF*g|Jd}YRG8>9;YpNpǛu)e\K 0&KYj-K7{H{;pY&SeY~fc\bigNBqyw }lRiJeH㊇s+!;9GjWBV'w49!klͳVٚf'#vrE'=Yr;*D*B^RuϳG -+Bj|CMF">>b(N!z+& ~Z>;#ky]W}{vc8c8ু.~Lk|HAOxtx-vs''p_rrs~G29P&E. !hZ(U@vz 2I"W,,{@E`H&p NK6Qzf̘A:dcEꄎӦIO-IdUӊ\쵝GH.ʎUǏYƨ#e=.o]QmE۴UDXTEvwGLfv=.JߡW!]-?.=OIldtI#CFT lf_Q[^^wP'u-Gո|U[W]1Er~]h(+'ɞEȣ"y7qKyE*Wkg# 7-#yRRҲޞO/뜑+W9d1ȉDTɕ/BC7ՠ! ݆)Id`MMM ;>&%] SbD*#e~eN6MptVjM3/ls #KlԌg9H>lN$;)N73n Eh^9wNsRfi  EtWUfY!3J흮Li1Й md2gʃįU=cLx9fg[7|/%8ŕs5n {S`soqqrrs~B6AlÒ*TbZZm/oa`2S&@gytg5& I(U)7"(iJrPS ( pd8@d/S&MB/ RIeG2 -P },/ʱwnTJ Qq}eUGoyd[Yu5^Sғ#S4fb:RL>*>?"TfBՃ|%5GЙi]0׃l'",nO#iݺ&^8bmw=zE7TSj-EUr&~[OE2&sVFKӣ'fe'4ӑ9J_ȃJ̥e,!!gḺ|]mGE9>͖I~2 F%#za&-:m;=(cp+t=s#d̽+q|9 m+&?u%?(=~{\FZm1~lNEd1cMM*[sUu_;,#t<]&osiւ*4w}҇ ߾KΒ?/߇TO/_OґAi@5;:O'Mf[/pJW I{DqJ$tH""J%mti[,|n_/ѝلuĹWNT{bH:jA~ *ۡt4S ~俴Ks 0.zXYIځJw8[jE3xMEOӠinN>~[4լx&uZ x'^^_H.<8Y~Wt[|*{kt_C<_?_ϳt Qh 5 4uxw:0:xf!ƃafrx ,yxŸ2Ў) ,Pkgw4Kr͚O{TDo^mܥ}E+J >Ul㇇;P<kc{֒+=:m Bv+D_54텋tb:fLWq8B_]%~Ƽ| S2~ (J'O;{gIrb4Q9s3?Wpy,6Kqfg&[850 PBH'v_ffb; ,ۢBbBf% 7ykoy`nߢlSRF^M/wzn2i >.WGW0!|FI|{P9}ɬ?kk_;-QdEkwqW[ܞ?3Nc}IT(9s7xqmFGbo: PNhO0*N yiVr^_ѐXyn2Yz2kPERƕwG=(~ί$6' YLjCɸ.{j!CS6LJ F %`$Bo9uT4IΓ y ~zsxJt %P/t ~>^.ߨڍΐM~ HG.N)Mz.Sv$>A,p̄o|hr|B2WЅRGfIIf.k׿=y Sz/nEfE>elѮdGaѦ3ikezՁ%a/_ =&9K_Z*^/s7Cw.bmїZ Wa[NB][O!Df:Z %dCK_Apo K65$CjkSd*Q ^xOym;u׶Cnӿg6gV8)q<6NwUnkGIgǮ&GUzYo3F=):2j^3,Hr>6v Xڶ툥yyy/:8UVOŘӌ7qx|lIUmT IeJڪyOlC$R{4DF-&E.Mz&gVH;<ᮕ(Cr=z'7k&s-.GOC =uFѿH.lM9wTw|c7u%/3I^n?G-uC0b_G;37hh܌nOC9*4]X t7a1~q7tL3"j6=d WM"'ӣ5%#kEv`NZ5qbխTimMѯ"ݨ@5GHz_F?VROW6}$y*do#S|_Kq˝8K]jND/E#,o?:鱱+jOMLVIrU“2@N\N;lepM4\OPG?&Ae9l|=io%Noo#'V  :OfI5?W\rcF{F}VbUP#P) dMEn":dȒ~FӁ<5}) h(MV<[EߊPUeK5|U~{1djHJ'ZU,_'Z^*oM^N YvC6ͯaײ$҆zu:Imҗ-|"t0eٲ6l[,=p (ħ/y1XtїzzIz|}SCezHSK#CA$ @&7LChao14odq_嗻w|TwjʓHK~8?}]/пGȩZ':Ҷ*3CsWBP0L6ɧ Ǿ2HKDް2)ԋTutfjʼ3e:Sf[ ʐ e dB42kYQ_݋E禡Idj{*9}yb FZaN&uOh ؾwT>j\Mi'^~HKjJ%/]eqpɛЮ@ít956#BSճQ٦k,k=D% h憝×L[\Ńy崅 X1M|^|n.J{ ~g<˜eѵB-E+nS~jPIq%#h`lxMKzܲ-1Yr֓+E.ߟkZtǟ67_{|Ȁ7OLM6h3x~ 390M>rc) ڃt+Z(JG't`SEOa9X A=FUdg >sCnjxva{Lj |UH]ĩ{砚4 ?9=frB4>7͝B}鶴4ʐKGXFFs-~4bՒ76<XP*Fv˂?ǖ>l3$ɪ`oEׄ޽𙥀x.Ⱥk)~/^޽A/AFj;;(d/ehi(# mn zQԇM4ݙn{邍qTGۚܳ^=Tji3W>a=I"O1o/,߳mQɺ u:1[XTR2#הLB9&asoց3@J*]:$Cud4^8+CHn(c_~GWz[ҹd,Yu햕oJ!qs-gK$ _Yx}0d"yv;ɳ]u(+|[Q[~%txپdž?[7_m"9Ak"0MfmSޱ)*X7d/GwB'-Ez]ݻyO/yZ7pޝ9o.uQ"}2,bn2dnA& "0*MD% V4S917h/02Én妄НdދyBɍ;oKoWĊ͓Ȟo uK ESU[h, &;=.3ݠ#ʌ4~qS^޵̮_띓\ҷ>fmrs2D/!?Y{X -0 h751؏~na}u/?dڎb.a'A{َ.JAf!n*9- BC]fc.*QQ7eDHwIʹAޢB/!u[t%@+;{;yҴ麶k׮%^=tڭ R;޾0"}{{nv7t@H!@ҥ *BEXOAT<{y (;$ xϻvMooojj<Бh]ꚚFs|R3O~"K{E} FP.֥ȿwӻAA+|u;pn?|{r3(bLJ`(v$+C2E/"z|g':HoD XutL|vQ ^'XlJ31`"8Ep!bZ$јC.BmmztʀF 0[@ =(!#F̼t& D/|Km| K跷lqKGM7ydoٱX:ey|άef.2WGQ <W9م 3E$>pjG>Nňᕁr9Hɐ/;BI7̓iVYϨOM)V[]z*D"(9(ʨ\Q"Q=j傍J/ Ч6U.V)ii)F$O탂j U J l/}}SRJm*Xł`fnN\Ŕa,H/dD Bhlbn2 3[2ij >"FBp:3*k2uԓ5Hkez[SԙltA_5=l$z)5)@9BWB.M3j5f |ڼ X̤֫zn-S-7%N*VR+ӟ}v[|ʞ4DfQyB]47*a`.S!03ɲewAb2^,=r˂J{;m, $$y&jӠ?rrSW)BuAG4x"QUe߇(Aw2;[R3g Yz((Fѧg!*`n6醓}2{\%I$F aΘ%XJNDL85;8 l!ΐϲ2iߜ\+Uķ{~O(xF1S3&cY?@ɳ?Ƣ xOG`'?>Xŭ&7\°+"TY̡*R$@|}*nfㅈo](#;ɭ|hc5' xvMa8<*!8[o{WDp2XX3j8?âzjTgyY_*/zujo ,uʂITu/WOr -MK'a$1CCxq_H*wOlc4 >D-)ʹAhn,Qo}kWR'W[x~DFp \yx7ޯxoxu0e#ZEp6$NcO˳RI3bK'1>?>Ȝ&<7_}Exlt;~\Z3!Wau+ydRZC}5XrA8 2V<7P?CԖǛfR~|qTIx?+^6N#W3z7C(3guNhAY__Wf#rX_zw7 RfA4ЖWTƑ~[ySiGٔqj]C/\xJy]w/BP".[Gy:CBu5%pz9F3V|X]&@ΑJl;Al*#Qxu'}<7ƒGK-md kOct~ɖ翸gVY>cֳ?{vB_|ϝϐz?И1>һnCܱw >rc Ua> )g58"װdz=7]m- t\xW~x*,0!l*n8ehF%Uk6:sWU/9crCm.fчPޘH/iqUS&dz//ӭ ܍Bs gvWi9!0 pNL쬶r 4/Tf8qDc!c3Ǝ_KwWo Xee|s*;2ouo dd=Q6tN[#lpY;n~@/ V7^1nqGo np'y<?B k$2I7?ж mb8s)}DGBCKb7)E~@l&P 2Pl aar"zscT*XYlSFyd&l٤ϡ/vON{Z@Bs$XS/{G4hV=g 1#wjiC`\P ,cY |Tb#e)| i]eg_OlH #BDEFptHo'3J_ԠCAa!U4~߻G؀m7$ O n1A<.n?|o)F jP_H` Deu1M_xu@d[ bx{Mnx.h߃xV-/wPs7ok,Q_?VW0GUa/Pg3RJe섀txx n. 7OEрf82 Y}`,Z dQ<92$!H!x(}}3X$ai2H3U^lꏢlN׌3@u%;BOj԰ ꀯ&(ܨ Pϊ)`T\{qY޽,f0>jE_ rC-3oj? dkJYj2M9A?bVP##,@I&׸'¢}JS@o\U0ooG=gvQ!&WlmyPo>b5]b/74Gy#>o T*vBGc~(AJ`U&Z<ԟv2PA*O|?N! cD@E6May.D9wC Apig@Do<dv-xP:9Yh^q w^w]gY=`% ʅT%bauuIq%*lIn4WzkqPrЗh7 XQ-d|~g[Ao\B, _wl/%y8G0CeuXFzNׄD A/BóCC9YÏaJ BP7LYQЦm{jno k 3y{v la=i[5d]qs֋D'LpOmdTƝsgn,)Zύ#2]UsVn "UV_nY倹UL>x@q0e{ˀuc{䮩UFWS篫șTf ԜuyaU(h>8{S" \:7jų+v9A3(AV!QH;ы&Oٌu٤{dMlف3Hx,t) s҉wCU\r:hO]0 ctEY`Lsԡ)ﵭle UEzo+QhkHNizSP=0+`.LB@#Cz]+ ܭSӎ.v I][3߭ŭ*u%bѫcbDW蔕K*V koVkV׾2Ve"|2W*gzr(H E;Ro$(|{NYEH_J%9ɽI, ~9oفԯCQeM3;;9/y,$w):k$YGTY^OmE);1n{٠?MP 5:cRq<ʥFP^a)͇q5@oX(%Ca/WG6iI1VBҰOhhO6 .GSrBPIf99Lʤ`W-QBdl[R<ǽk%zV511 Kˊ ;2WtG)>KfVN8+2qb&r{œ6IDz??#A>-**=oh|].p؏x- %\D1XIl&׿й~< cS_.go5Un bG#lc#TF^?e.|=Db@ETؗ ?LIto@ՋR䙡P3)9# vR2!{r0'#yF;dªT^iNxb5OLT'{ÛnzwS䊝*z.KG9$"GP.IgSMŋ0`D_SQxӊX=_[Ƃ'\XV̙3I-g+RkIII|皻V 1 `Gʍ>;vΘss0~ qJn-G p m G36ze{"GGJN(D~u۬33"dUi?OF+xH;zU N[8KJ43+=ܾձX򹛊̤i|RԖٜNTnO(I;J) Q6RFtbY]f[^m3,S\"sH!xΑk֬I$H3倃Uwcc=ܳK&_݈ nRQ[cko.t|=ySaofAmeBTWҢ6>\ImQ k[n>AuI{w͘{'g_k90eڦPwKy+eW'ZyM}Aѵ`8z0 mq1E+'g.~F`~"8[,5F$W1.z0^ѰRC\@.w%A*t}c[G"߻|xȂp5̇+?)=vJX굤WQd2d.YPR4bBdP@sykxdxT/P\3hQM}LOvv#z-+eLM%+sRN[VMFC]-H&K8e4g Ln "&Ͻb$mOQny(3ػwisFH>4V 8iZa\S)N*_J]#֠f| Gۂi߻48wH轿e}A{̈́5_Aؚ/#FkZ򲹙He圛-> ǍMI Dc.*[mїڍZ\^0f\}ҝAp`L" 728IU F]x7§LO/ 0Y7QGp<6> /7l3413X͟f?r 0YV3n $xjm)P~GBjѤV3R5aT~xԙ9ݗKP&DZכ'8ǟnO⵹25,%B+㗔riΗd~<.Ꞇ>RLuH'u}H9\|:oXvt]Ҏz{Af/yfënns3`=An >$ih*uPLeK5e - IIA$vUjC>:) rD'TaLb Jq6t(}8!uwY l5PYـ[1tI1M FBqsN` 7i`N(_^^CMoP@`̴ aC3n1lWgYɾ.rp 5_QI1ixm6b- E"^u;[cY6;R}-VBګ)frٞZڧji(bU}8wM׼`Oa@NOp)2H$"WKBDQkk.Bge0bE=,yI+8GAn6rp wdc)bU2t~| 3%,E҃V>z^+~׃KQ|gغ4 HSt}Nkb %xt".] >5eNzoÜ̮7MG/G;fDJ_^9)#푣tS#jMWjGLGTddnZ ZR3AZF~:buI¢F| w6b7%;5HqP:5'5a~cHEb ER t:F4*?󀕾MD)ad2pZ Uh $8Ku!u|SZPLD8#QJm^G3"^$b褃|O(؉h5wjR6ȷyL吾' j^+ YTS틸3^EtZȲ!G>VKKƯgr RJ)GO|d%^#X#rj1iR\qZ]NUB ?7T -UjLeujr)sd&$n$0a7_]E#FUhvqΞ"ITNbuZl%q2I& &龁ES%J `d25)X[cZس^NQg}Zq;4ԋj4Z7X.AIrwz\s$R!G :sMzvae݅|@JO1Hg}DAh"@Ty/愵|ףx'[ھaG/ΑwaUә]cg.n^JQ&Zد^_A|d YSp#%:@p˾4zzw3T.pB8 9-M/ {a&96SxOXӘDG:WZ3 2,/;>4uoۅ!XLgď.2n ]s%O)GIKmbbz7O9t,ɽgOR.&gsڮIKoz9%MswՋhr$ڈwojc|U<$mxlUZBfi1-pXRb6(El\E<=>j2*DYLӲe@K jʚ˦5R9A03t 5"ʺ( q%YVa FUH@Yx`?HJDK8Ty b*P%RJ3)A~D)Hy71h kpOjqRG[|:eiCstjxmzo7mFͺU"M G+G1)J#cFJVBz1+jiV$[$sJ-*d`UHĴe"ݏd>) *k2r dRR$Dt6,O* s KFL'#O# č.eV0Wp[.5aˊ ̙0%|2Q|<6!Kr\% Sɥ٘]VeMζ;_c佭 K+>W҃QaſL|eҠޫr4YAj釙J!ڙ}KjY7L̻;$<-ۑfsFp8JV fij{Ѱ,,w(d`;7M}֦#ז hv&Sez2i2LXxb+}7⚿ԚKZ*3/s&w/D8lB4(qA08(H 8K@p}}X/l{SP dџbsͲ eH]|8~M| il"_Zbe:c) :s#\.}u.o.Bu Šw^ uoižQF= @6v> C>bo(H YVbw<;<1u"Yݒu-aXQӦ; ^&O3n/ z+  xW?<o X^3Dq$'2YY}hn($nm \Dn>_|8 `=J*\ah\,S:Ԥ%ghHBh[!-ƍ w6BE dV#:?dRMە2R0I :r~I4\0|5Aa ;}@ 乼z0B{x]n8}t[ؽDgMHi 'ŏr.KRP"GN&_Xf>H*cp%O*[³Bath`: zĘ̜T%b 32Z­"'LS_~T3L(İZԠY4 RUj%VFǸ.J!?:'q衴[6I$XgڠJ&W9.>j3s)0;ek6RXqx~rSetK${2uYb/^zG(fȯj̸ͦmRz%nY9t*Hjb|L ԗ0փalu0=~y(AcDp+_7& r͆/_Jٶl'CyCuSk.1)z]_HnFgVOxRv޲9ya myAZTD2)6HTb~wZjJ5Tky*>#6Ti{Wqp.=Iw#8-P']dP'֣vg~9#\|=99[tJJJ67,Gh!$]2N;[ zO 9n!H@MOFWa.*·\|?)/(耧ft!<?:xK)3@zy,}o!@1g}Z+``_^R{^SŀEciE/kAb$a+:7_Rص%5."1UWIKKP{C&7 UW4X E -}.we*!d +}[[ ]huy%y}Amu "2ыE`BҼ06`hk\%A42 F06=ÆiXMC5 }1,X=ߞ={&{ɓ;~9"/+r~Rpm?z.~ x _B J#*jBOPaξ$GTJ^ yPB~S~Ѽyy~TiFsLBI)6 >eIZ7}5z뷲w5Bpgt5īfxXռ xxv'bLʕFq0wdȎz~YM Tuɤjq=`k^X-.rɔ&q %fISbRH)i QR?ԅ\.iXhc(kE;zY%VJ*- 10d'$qZ+wiw86E,'.߃*ׯBqI c>/]9l7XZX,J&hpdLZUrDh&d"D(ҚLV'R`YM&H"l&Gh* v[2sbZ Z]'hj"JW(,#W)5l5(UJc6-ȇjd*˵&AD"j,؃(@ Q;Q[|&a0yy]5[M<T{EWCըd0٘(|_-Sqc UK1H5gNTk 5kH{T DrleaLi4Qr7H15\=Գ> :l5x =*ōƵ?cK V1v%1Zݲkb֛M=yW#[ lݢsm3 ?ٝDc3Aر#S[]W5|qÇWU;t\wz}}kMw&jpou scD n@5rJ("e A1cMcg1S|{9xF/^z4Sg#`2H9}+wTT//37\e{>jaRjHon Dų ıWݺvЈtlhYtǠJA)9h2FWVH:&:T>-{_Jh5G{SyNfL㐍Y scs+o9> z3n̺2H ?(? .j*8T_b - Y)g̈́k@l=>b/mϛ,$h$%H9N*s`Pu|ŷy_|E"/fy]m8Rs2X5m'adVҏ2|3?TƀmbV;p8c `j:Q?r!΅n0_ŋ`+qى;F(KqP :É> 'nSߜFo`*x4pӊEXC88 "7ǒ͛yp3̜8ޘ39:ډd'%w ??x}!m,$SjX7rǫaory?_ON"(29=~3Qh^?Do f/UȪ A[q ns#oGj?؊%u/b54Eh >DC𾉆Ҩ4>JhК @т_璕 s!z̝ pB$_Ν{7X wEw ]`HEu u1p Hxv!qk&!G5O#`8?9mZ$8,'e?Ǐ?uaD'~RD/OW߁sP԰~~F3Pop7aw#\o\u#&<=^ۏ; (AwnϚ۾@w(Pa3a|ج|eX1P}ڥsѬaS8RQF(}C`k&̽|T8~-I6lzl6f(!@Z!!@Ht*MHQ S~R,+>+ׇY޻-ل$7;w9gN3wLDord&G# {#P<)}`b&z f pߗ Lh<79@8߁xJ&^Ǔ3.Z> 6 B@W{ybůį Izem^uwl"Nv%w^i~ta: N,.zY8ȒAAU,C_ϑnc:(k{dv?R&?}|z~ɺr/b^SFݖc xP l_㞝\NhJE=IHNSEBu^ny['"IMk[8ω IC",6&}x8s0ۤsT6S{XViEX5|x (:_CzfFՕת laaIdY bzgxWYXVT(B%$tRdyZ|D lJEl\/Ċ!eQiiQeCr*[ +)u×ԍFL9e|ݒ:eÔd>z%}@n bZ\ /w/^\oa,JLD荆$=cDEň)>`GXKYosǡ=]A{j جʳ Bk& H0XsWRM6myn)ƌn9f図c9Hɴ$'Ff0I %Y4fb(_MLt.2H=gH̜XX<Œ#WGJ̉=J>:%tUoO: {[G-6Q706뚢zkX)wV\σ*(ȭD&S7&bJt\V=ԝiwO"#ld ]^) 26A#x$ }rlex;"M贓avW,[poDZ"dw/@F4 eRγ,/WF+4_Ipy! ύ%1Q4hQX73.L5O7>(SK2sF`L閑6"˽aiR1:M>8V%T4^9:後Ԕ^jM)JN֩7HUHPcR(x)UiJGJejnlB^E߅*O 'yz= 4rJAV*vc^iBTYUsbsSJ׫uapדŅ qRAJքI("f&\M+HGA\P|>\Yʉ}') WzPC+rr%Wã"SY3uQQEQI*(<:[Q6&Y_Z!'&ZD9%3')%!.lޭ[8Wn5Ó xML1A!BN‚CB"RT Ne},k71:Wp4j6+yydHHppdS*FJ !"ڰ\*噿 '  Q( !rR.V |kLOu P vIYJjlgm#ΌFLՖ&ج䜑e 3*&UESxA0Zux) Z>̆†̔p!]XDҏ'^ >^HhfGq{} 1zjS'=scPVahxGg85T9!%hlW(y3,Ix?^34A~# gO,}C TI,psW^dqlUoЈvLc? 2 ~M6F L gyFHۍpG>{@~N sm 00o{ spÜ<(|9ԉ&Dg?).K<Ū1k̆Fp 2XA_ႌRyL\#2!E%$+шo_2/@#c/=w?On}ȓ Gd=nxFUG-N|w"5L@60e{߃?J!uoָuܺL9[m=ȄOecm|h4$@G՝ÿC<Ŀ]TCWW4 wa =H 6'l8>~IlOC߰Iȅ~i{-_ZhUHfh-E#~PDZH] Cx6}Z1,[^Vmf-+b2lYQz̫Q0٨,NqZS[JX/*322B7l ʂDTVf^~#% JA2dبbQ"{@E5:Zŷ܌8}`aܧPSPJKL/}ls,z|c Ƨ1-X]f :VBhW{E{ " 5524b m.0+{^q}Ɩ#tRh+he%#ja)2bb]rtbԁ@'+QS|oP'?Dg ,@UAR‡\dʴ'\sM))&{ww&HZ>R5V`j~M= PJdS(:#ŋgq*hjr{7Te WK1igxTW4pEV5p=E"pQ_CgHށ naC`DF5ZדpUއJ24eNJ-0Ǩ@ۥiJ "\Y}$#tEyZ5eL4E7$qw=6L_E[P ny>~~ތp)>I"k2PKߋ/WChGTMo^}C-MI2DىG %li%Bd$(x('i:;c +:#|M=wN0.'Ä8!AO޲xOYARYA޲8OYJ,T,5,nŝt(N(K*K!zʒKeɡ ,,^*ʒiQ*A P+TIZ S\*G.5vD+ګηjiWrHDa,ʁa8+]zrOo| c8c^u<&2Yy~ԅXDzgF cCDygϻjϨu3BCɤL442jVJǟY1tfR67|QZbi#5ɨaLZS#EHq6*%gE/U:9t:9)t: ` 3$QIKo>H8Sb_*$fe&M%DpjVSG+aBȺ xOUe2r2g%#oAz]~|\NՖTU6f(C~87r,n6핞sdTunKW ޖ\89 k]aG{ٰv7daj=lY{r#ϯ$Y$זn&)sԯUʽ?9I,H͜V\4-3 tQ1I_dHMͭ^CJ~k<ѤM;d;V99֠Ɉ8n`X|BIcR|iX>?&h[<P-eWC?XE\1r\6 } 9&,Le(,Jgn Ҍ#7,K6}RM%Y& . M27[--?8sg&USJN푟b#Y59_Z\\UD4cM-Z]vUZ/K,~bwQ\&h {᯸,B%ȴw:stGzn\}虙 ϰIY3q-Si:bӞU%~&3y 豹'U#0ë7,++d>e=/կ-O}gYקұGvXV+sv#+W'vl߶%8~zoE|Bx5ݍyajEU;m߁OY|7㻯ѻCtVX*נ[k{ _'$L3"@t X"sRyq}irqk CY@sG\3Z~4KN{?>x_> 'ֲVA4 cjoi?la.$mYkXoN}`ݱ40tB\6kN` y|,y|U{36o~eGϚ][ͭns-߾ĖM=92zsojPFTDN|J '%Э=kt2(m37nO-Oܸ}ޖ;yc3cm˜(XR|TB|HG6 ܣ2RhDOb?ns.M&$63QY\+)SRfl];eswSkx hV7ڌ%-7%,~y +e3x'pw|jw'=#4eDi⏃Wl5zq4a=SHO#=T0SAw Fzd* Fz*`Ju'Q|$} F !mt'# t& hB!ZSVjJCz^W?/'7u5m8}ނG׬ mt1o.bgG~>mh4f3-O &Iy4f%(AoiӇm¯xK6[1@htv4H67`G#v4`G#v4`G#v$<6$)PI:Q `9m2?K1$TӰpaC٢q5kzy z6YwE~BgH*4eA`.\V"u0uAc:Иέ1hLӁt1hLӁt1hLӁt1/fFae&3f ~Н*FSԤ{y[x sC ^^~$yI^%xI^%xI^%xI5xBNTa@B^ z!P/@B^ z6J-PB:m㣜KwHrr7"]_7|8r|7S_~W CsKuႍW# B.4x 4իoYm՟߰`ecqߨS:e9s|^UP7]|C]؅OB @ZT{]z}q/PAfBE^QkeC%:l۷Xޱb> A[>Շ߭{]bd77X2A@3aGVf'݄Ql./pȖo*IV=:-(gHU*lݴcUxD=y5%݉ZHGVuꑝMݟ?Ͽ.^^Pեڍ)ɞxjV^(>%&yjִt<}ccv-kD.#yˏ!3^ȞޮRj-6}Oo)w?k+?ѿ`Pz3)6[ƚLqkr7E)-q;O~v~h6F<=o^sڑ^[pdָ u,61w&z7hY ='9MF-I7M¡t~n9%۸Hl:Xa-M{eFjtlH`RdaM},&ַ>-QW~ d^{.GwA%9QyuoTI-&:gI>ޜ|t_ђbݞ yc_grk~Y\,zCAzo;{M%:j7 蹶;o0pq(UO}hX8F؇Yrݤrn9W{Gm"] Gfgd9\.U52,rZ#چ9KJK:Q>u%YDRdL̤sKhQ9$a@|N#s´:$6)=Y~FӆGV-'')umzdT.13'3QwFAjtsAp@y]Z>a_icwgPTdS;sO[[W3ٿBTp3_̬1n,q5$]2`/}WX>g>uH%S٠Mf|/CL@7b2\;s5FǼ=?W(koK?UʕpH5Hb,kO+l'Cs2nڬA .Xtۑh:(spK.@q :E&]&"h2b4xӻ.aȹsA;~{ߪCQ nyWYȼF£EfQ N}3Se/\ E3on=ЧDK0~!$S=JIaZmxA&ɖkǹsXsjs穉Bkqob2 {#fdw|9RpI6YgF:〬'G'd$WFO_O'Xz2zs8[Q#%EՉzj4MӀ QO+E=IjVC[B9'(J&UOh)Q0eXBRCPΎvH3Mviy"K Pc 6Z;lcŌ}%0Z{*!!g9T^y߈-Gg|ƒgym#\W +)x᱉_ ,R@' G? wџh+_|twɝRWO@P-1 w|5&۷]˹k?T/'˃ZiL6ջGx[ы02gY j5^luqJ72sVamc>ɡ煵Ep!ׅ BtGC 8N7*̢1i$\Ĭ?ikqڴF?ᮻ\:fҥs쉆f/9"Z~GqW] @?ႈ5͕Kו)/7;\b.1\:x4f2u#@m׾AOZshE{M=iAM#n oɓG ?e̪MCRh)}`̨!zJ7C Jm [k5,733{,^6Grd.gm0HB$;kL?|T65f.I~ ō EoVdNÀe][ߖ ]h1M= 5tCw?(3U@ &o'n%AdVZbRDI{4\" nE c~0abwco(=ґD%6_^S7hpAwP!CfNPKY8qB} :F]$,:Vc2hpM{uY\=hRaI[K:VA8E+xJ||NOEO"VcTҜQ<+)5{ J.˚[ƩEr^]3iD&D#O a5K -WEM SL-}?JkC֣uFzD-qjtǃt~)}}q8_O#㛸 /*E %R_,S*PJ !UtU88}dTP*C)$W!lS0o(8>BC)U* ݍAJ"(8(VdnD¾e % BBC[ }*  )I&pb"OV#ZGTr2.#T] 1=@*ʍ@#oeT:q $4NoƐ̢f_6ɛLj\#Nm#q0Q(=H8"-U^3uG͏AKN-7y_:&Mh-LQnno8t- |Wq141`(p:|أWLba%n[c3 P q8~O{D|dT=[$nA](^>ģNe&z|{M qt>VIf]P~|[ꉳO<#1Jtt S-UGߠkXGEF]`k [DaVs:3I|>ox?/ CPhwN`Xf5YI3}w=ᷖ#:aEEX1XFg? 㣧t;aVt@:mvڅl~ .|o?Oܝa[.z$]1?ħ@0 a}ڧN6up_X^;]sr:5-MbLxZ+Z+ u&pwW>ځmzֺ ߦuDsmN:- /Ls눞9ݝv^Go Wǝcg`[bW־=w{++>ol }6 쿝cg`Dz]ߎpǖ]߻otMiwqvǖn]n]8rq/v|YB_ߝ~ :l5>ugvgop}+z VNWp#mkyﭜnkR: z9mԓ{/4|NۭmWv'vzq/rt/r N=ןt^{`iuHו]_ʽwc.îv0&zv]>8/`>49=p47w8Z&|h<ڝMNbNqJuY^$,RBQKg>ic3]*/5at+=˒I&DI4. x/ͦK9 ?sTYdV%,+iIZ\dd@*-u,o,3}\uIkm#>]7uf jƬq$!edݾiDk5^YZ˒g".H,xY'kк<Κ5t(u EDig-SihD_y2a (Mt8BYBi Y'4f5dOϹ~*1h S=Uf6*-By1KwR_-lU(eAzp䆱Vi6ц%%gsLY؋{˦ﺍ()c~9{SM 2fʌ8Ji2<$uky+<'\t]V<VwAX؜h4Mp`ϹyHOYGvA1hȶv0{З%r r|~⠱2>ċ#aH>/P6lf!8ot뤈tǴsz#;ot%Q:q}%xR A?`^WKh5q,W @a_:tY#|p]"C3"ohW1kCG }$~xt{fH5wLJ`KJل$P6[͝?mD==i6͛ۼ;\pǙs=|?onBrtOD:i{̱yVH;M~GRV]Gs[l۳,ћ\ћ]d@<Avk2!H@'Ơ FlEa+iDh9غhD --n_/[XMA[.y-of!/6goZpدjE"UwFr kpk(56e'M]ܭ3Q3tT͗ 4U=t65釰2⚧ܵ}$%>"QHAnwr-AF<R[R w/RT5shGkP7gDVkA Cj,J\QsS2A h܊d(*ܝY#*Clk B),/+pAv]E8Hr^Ji:OK)];o3ۥg4m.IrMjr8`k,%))Ȧ đQI1Lhl f倈!2 <x7C|f5rʝ \r'x/3B“߂J1UR1Tr"Y~s! o9߁hNNջpjm`U# rgO-* ND{NV`Y/4d%$i/`'M/˃l<͓0ouM1z>&8"/+p!l")slG-8O5TqS飞I"aAr>zxrz?K}Z uzvF#EBsn$ I=sn`-Jq4|e9PO\uW>9/:RG2ahzT$?'܀njS.putEőIaTm>g=qpMF~NC5l0B^YTg8&_"2|I{ TJGk%eM%,h=rDhGHl-TmqFLd}~'v h5p:sޓ!)n¿N/{?S1JA?)CrlЯFY'ǮC.£Tr^OMS@P)恶KcBM$,LR4:7`eWKTKP7sJ/h4c .Yi$x-Fhyb,۴ IMf?v8AóhI]ރ^%+U&кvouڗ ~*Qr17Z$0AtUI;wzx?AB,18Xp%كҀ|)i'tT ɼKمF7ۤ Vn5TÄc5cwϚpr`e+OzRξr;W{ż, Xr̤삲/ :L"K d,66HBy?=8](YGY჊xe!,ǽSy:f t$9]g2ĊB*I{ڌ>[ C?Q^'3?.H7rԇ1*ē WUqieeuG s֜EGFpϏc2ےܲ8 ]G *A"zq%h/>O56ֳFHA˘U· ]IB_!/_rh5^)3F?hzFgՇjOM-ّ^E}:A^db=ܺPNG֯gZomi-JJn[BX%o! Ip=nZ^HјRNN?#w zFB5%' u=1R|/u7 B '/Z7Q<6]g\1ej(ߑR Ok+uEk?cϻ&2JQN^QȸlIk5Ve? t'?3w:CK: W(h9;e#}n.>E8KV ycPkY o-̃IhyWz5vdW Qi^[G#YNtOLl%^+wH*@$:2k ڮz(֌H 4e:.CJ7X`]mQ$cإ̒0#y,Db9坘u^2_ 'di0 U˪UH)~KhmM(cq*Xhytl0)'6\હ+s^% U̒r6`jiW>vE>vDsW>#t=̂nZ~!t=#fA ^1򱁏Jb>@o Q c\Dz_ԇPgiJJvȆ ='lb(#[rW:av4{5a>oq'x,TP']"_Cyfn^mTW0ISgZX $1JwFr;;6i2j +C \>z=Wtg(j-еo&Q9UO7ҍyyjE^u/4 3s"/ѩ>p&͇͹sο~.Ο{SIREDN3RpF2!+`j|o}t0gpD-d rϧYd7$ϥqE ގӟx&Sag0e/ . QE|>Usny<VhbiO´6+Nh4~\q mݺ/uC:a4M'_|+s׷. t뜈ćIC-ajb!$r1HF?LOxΛ]q#0' }d 2OAɌ-9ބLFIC"xj_ѹ+V,oMwoh4w偹n<֭?#_*}<a_=4PsH)ldi2Fǚs5d\(y 9DòLo]R]sY*ac+WY?}}=pXLē=ӳCшFyF)=ጁ5Sfd ,K'+P]n[_+ŏƠ8dКL*&&G"pB:H'2z-.+64^H\@\Z߾qKqZcdz;?!7g~xtժ5P`Rl^Mh-QV7 k(redJ^1f9K__hݔ ] 9ެmf^2W]~=ZM/spL5Ջx}33ܗ^agpc秺/>8κ8AoZz3aT0Ske"!1&-q( Z-[>v W(';>( [pu*=݂JZZȳ5fu :IQFFg\:I99q=ϑ:GbF$@}}]>"zԋ*:z?m~TB%'y6z{GU|wnnzlIHBz^zҕ ,U( WhDT93n <~>9mΜ陶 :twy(58wcUi0/|ZnmD¯w |qwpcmyx%xkpy{Hj 3ߠ1f2SW&VyE"0AM fUrrPuiEq"W15cHAfoz.˿_Qѭ-;ދ[Uo|矯\/@",|DP0ORO(Bm)B\}ADx~D<_!ܲߟo<B5рzHPh }^~`2e.?X{/E 9wz/]"y`dJ >ǪqG%Ytp1zn`g~ᒩS[7#%L{hU]?A(:S?1^q@YK]|Y߾彚7⿯ O[5c:N\bz  Fyh'OāV;JF)}.IS<߿_[>! X_g]m6rcAqUGB zB0iM.~(_2=4#\T}}OR[_\7y'p{kv}+tA='$6Δ/B/¡}^eAJv] ۬|1N60:?,: k 5j¨!+bi3dH߂+,_^zŗ-N&sz-~{cڼ$nBЛݧ6=S:  iBDم[6|G6^:Îvl3Ϳ7Q;i^"7ΝA>{whfxA6LϨH*/ Pe*zSZzZMNHIm B4mي4hSLwvBķw·oה̙R`O?mC!gϾnێ_(K>ʼnCwuǃ.m?,Y^bQOF-JȮkЕy"){фd5D,f@+i"L}܎r G🍳)~h:Uc@OQfey~H|eWW 7{p{*UpTߩYG*z B#xNũ4..mi~qun.;P2 D~* N&B%G 32ͲO < ˾m-{MttS)tOGg$衕K g8tنhcݲž*}mtߢmx1cw/TQ\4^JWwNˤUʒh8/qy)9+8,R2 ΋wws]`:ҁ2TW~Dׁ8/bq?[4zw\N6m]ҽH"މk4k8%׺ %H%;V6ivD~4F.el`nՒXGj .qJ3Y4Mڋ4MӋ ݁QOK>=;&lVuH.oj+T䋸㉉E65x3R_||Kk"L/'7?|[2b~ZVjjffjjW-|Յ^ZdqE~F@˴0{.\҃ b:Uw/ߢVz1e>_Qys?8Op,tPJM׬ZɺQDm T-)_Nrֳ":R $oVJhpxĂ YB_0Jr?RCnRjxo+޲7T`_CO=\M^{iC[DǶ ]γeYV:Ǘ)"e=޹AkֈDj 4"!&[_^! zfl?nX)mgYV3ūMih` 24YT"n֐_h s/sGJ$m]4@w}ò>ߣt3,Ks'?(SxGxF&hie\UAQ&NᒠX5xfygeiȇ!(]P>Tw)W5 E%?e1>, & K=Y!5DtXQ *v.6q['οi;3ZįXkӯ?%Y̨s~,F̏ǝ 6 .~XGd1`c/WYƃCu/cxy]3} vW@D&wl`^Ocf$(R߹SAfa^2]Z8~UbRHwoE4Ru'PCT)*=2G']N  =C$@WeE{L"75~R˼8aBj$d>^e> Ҙ9Q&}B`S~r 9"vr"2{$]zvARBe o;j w* Phm`_`_Tyv " ^墒{K kIɝu a;Μd^۬c[>U|}3QwPܸ{ٲ~Շ7b}1{3 x=$\'Z8=.NeA aгKMk޲iY$IűV)bn/abBZ:2/c]_E.%qFZjs]E[I o1oC\\/C\Kit 3xFj# D;WjQ{(ʼiD/2rVsl{T8F?~W;zg ^]Svrmk1UΜ} ؛{ww`tf,].HܡUAnAr;MUsM }hC."Z~S*n-`]MzAzSRg/hα _fhƙ|>2>@:-Z9PX/(bL┬EqW >ZٚkIA)&#Oqil'sՕ+bɖcw9DGB 1\{5zпqwv>_ٺ_އ~E+ArFRkP5W?фW oopb+2;m8 d@l|x`ީ¯L$0L_?lkEs#9&,sKs }>eFuָa-*B0pdUwZjȔd2 QN#cdih  m~yfbl5Гg6/~y.l渠8Y#`QhǴ-K׮-휎Lzgn#j1;;))er2HHwQ3YZf" !fӱm6m}l۱J1 t1ƖƱe4V -LN6eF!!S=#cU-CIɣ㼒ġ@L~+ )R-:C0eIDI@劆jW*dm5F2a Y'/?ztie̮߂koW7qH: O2-cJe*~YrA/y͊ V!`z~x8T 1r3OOO_Vi{x"F(PZe O D#I:Arb5FA=X "1/yp7'XPfo.8~ ɤLHGb } P&=ˎ+/m"JdHOZd#?0+ F 4 Z,5 )JeAn:/#OOſ=05c$3# T 0Iф3{r7/@/}I/;q݋1>wq*{y(>2?lnvθqC >7m Q*K>JiQy۝<#oyAAB>;y3h_\b[B:MSPt cMW+_RzW&_k3䫕[^3 ~KMW6sQ9x.7Yz"k ʽҀENTOnWSԄ|6!+MyQ4evQ9WD ?kNLz;iJGq7&܄}~(uJ=;ϕsCT6#|}{_GFoSrp_vPW/rPnWKOS)|!=5>s۩WH{t M9+B~bbi[8ZaR!#N}X^>jCr 0 J/4pٳf9?qO/liE̊Ay#^u 8zRvr{{}Uq(>N>ѻT%:j)>ykԆpQkSXZ\"I唾+|| O]ɺkҗXKt/vi}m1=Eո&s{FL ulQN%:0q·4(VL4A#)A?߅dh| L@ǃvθ >G'ބ?ƟehjZB!(~nex$z E[xVPa\Qs6ZQ)1{/{o/}b ~ ws>pкyaN/9BZP&OtrB!YNg h2n#.c+ b ҄B|y?63dY=Z" tw0v|ٲe)-*r[%m┼b˒֥% *Yz8^eq{O?ɛG:&M4˖g&f#k}qo<+Ijt币T4i:(%Qs1ڴ 8t±-?;h[Qm%c]ڂ}2cǏ^qgZmGIt d -d=Cp x'] ڄ8.6xS6!#gb|?`>_f߷ؽ1M#­VXg|O?͟)΁EXcf9Գ)/-׋A.V'ҿ>o!_J`|ta|b/HM"mYz}> 2rΰi_}GG׹]z_Iӵ$(4zW-U~@0=FHM"{H(mdl_Qݪ 忯x@FTFN4!DXoΛJ= N#kaEx6bX=p!rB}EfyhQm+ǤHe)_IK+'Д}|̃7Q^lׯ:iu}MklW2D_@:ՏLJ5Nu5MY ]*q's#"_Niϊsp9Ǣ=X[#S}SSF:qKYd2fEn%M_'}j$Ȇzq$VZvm֬B+eX' eXı>NҖ2y_SM==­v[v,;{5]L]{05b=LϠ !,w2qwF:ON}6g%jq ynOACnJ}wb}qұ:֎3Kt#||ݻ|~mר:WAz&֬7*P E:Lbo''+κ[e\ 54MlTye sλmʼ[]Tw:|oԴF1x+EAO  o꾸(J4DO-,tcs*$Hm qk~rr>v<5';Vv;asmQpZ/6$ }iLB%) {+'Xd['?~zr}Ï/j K ;GuZO~)x_Mzz0ޅ3չ] ;JIvМ_hvMILHȶo Kg!*'-!doX„i@qoxXltJX0 `xqH]^~:MD (yZJrԪ$d/1v1hҪ}u~28dt?;a1S->:9MEh`c_Xj{t(#ߐ&%:()NLsD*MpDM9b7Z)())`MQBF2Hrҏ==ӫzY7a~V\D^b_@жi~'it\}[0Ғ"uFsDcQ!ƛ {(z^۸z9Yq~AzhRy#u{=ᕤ//nOP6$@XeF0ZtT?ݠEd[ _djͬqм,e^Sz"&'dExiPj>l@֓< wC q<~2V6=|5N>|ostd]^=6k;2*/Rq>:zq6Tq2꥞~g|yœ1~~Ln;.T hjH2PL]EJPdLht$S oG]U*5C#yx/e^Ӹ` aR%IQ$21In 4*a,-")@ +O΂`Kjԫ0 UDK)y*ɷ 70n-e4;f^QF6$dgOw$=K$Ñk8t9_Eu_&ρ=Tj?J)T@Pc^o5j ~Aa4RwkzW@YiQ#m*p`GfeiG}HعxQ7\OǝŃ)~"I㗔wē(/"rD8 %w:th~9DZ ɡ-(sjQQ[z #P{ON· s,z@crL\Btű&L!JU%-69s,.:~Cv^^G:wZ5l#KwHO[E3GFWnWD܅ow/p ]:d*.Zn6()Lfޫrυ@kͶQiץI)u=\,M?w O}6 9`-B}]2W}S;i;rHƎgvA]Զ߁9+2g [ks윚"_l"5.2ՕPڅ,Gg$ݺe\G7msnO"XO&Q;m*R:Nq^9v۱cȰ7PKw҉ (iNiIIǟS:iPH/uЉTY!PdAD7&9ۉ.܇Mzoiv-⎊jy"i-3!C!`$Yv|xGwVWQ^V2w#R_Za;oܿ/J9 D/&!' @; %_BA6a&T0mhb7]VYCÎ29O+k\LwhI7x2^jʥ,ʂ X[ґMVYc4^Z%(6tMQ1r)lD)/'N`\"ݹ2˧_p!ڦQP/="*nr б\smw+-*6o@8{{Q8zV?-Bh3NKzPaԸ1O@G%IV%OѠiڕ{v/߸)].$5}1[V ׽ E_qkj}O/2H =($yGp;8H;=S^%㭑J BoM?׉Kl_ vF?H|ȭppK9sc'H1ֽj#aSNqD8zlKY^_^B%|s^颾c%NnM>iƳBBq|ѫ7W!x2{9M[ݻASa|_D뇖N._)~ d/:)-o0VOG| >X/\^ Ы|: 0pLB aߦ~J@Iƒx  xKxC$:[5 J)A,7٫4(k 4?B'; d曤.Nad9#XMs7sg__]lj(Ⱦ(/ɶzڡW0/: C4?D_|W"|F =gPtj:QċigAFYwBͿcrJ,m_;Vq 6_&8P?')w!vWnSG|Z;:;:o?%oŶ=oO%٭AY|0 CV܏NY)?~?'jj<۰͍zT2;7 ⋸G֣6Sx1]7_ǚj__ֈk3K}؍FLroL>~~9=-AO0߉|ON<!s I/QxI4a"MjFxb iɮ"x]' uW]45Fu:Lv5l:l'Spq Cgew1 Cn+/6gڢ9Ph7H[O/6fY%gvm[4-I7e,.j{Wo~ʎ>Z1K833𮣲[6]&*蓜S8֯C^- O8kvZ3lIBqhW_K7bd >lTS ot|-ݫ.`<-/] y$KA%.iW_'m3!I|-)nxčc,bp t ڼ'YIM,]f8)m|Y'+xQN$}M8LKHaNxl`;B,dr!7n;p/+Β`tsMt}H#I>e"TGP I(~yUYmMߨG@]R,.XtEX>c,es R,'3+k?vXQTXQ\`+j`0TcbW8~/Cʱ%G\oYf4?1!v7;ĮzG{h!6k;HAUQnN{Hv/\K_G,3.éMH Շ+IS(D'靣2uw]KQs77V.YcȪC2]yŲdaǬa~~wvDVcic!3嶌DnA.rF/8{&Hotݵw 6o.(W:lVTX:l_갶=-[-!2"g!.r.' vԦKrm ϋn!ơvz8w(R=|eOrF;MvFXP˶q7e}S)n)-1>Q$y6!wzdqׂb3fP :zoh^}H_?tgGokTgo|.}, &K3Ɂe<'Z6J<0$ײ&8]7IͲp]]0} ϠKirȨnqV_,XqEyrQ*)cnȗcnTc8CcwNc+H!d4I9p:KH{+E> S\so5%E(3Le:xS1) \g/KdRmBw u{\E~*r_A4OMX!+3h3|_>t웤g2 4 "g(ŕ}RzݛA#@7L] ;ȁb Q!OisƯ\<9s.t;oޞ')=! ^l`W~WFt;#6ӣn XfKF"}U"qd-NJnQBNL;vo5rdC6;m K%z(h1g~=/omj_Y-Jh%GD&ccLpAՑ(I%y/ۘV_| \{YEE"$_i>vgCcn K@ Fd) xCM|tE9l<=gE5pCT6bi==0kmM %щC9Z2DrD?vd::Dz H_.u(: g&]@Kgr Iv] /pgC[wox{P4D{7]l/.+P!%ǃ(=5\oµxa'sڿ4?w-1Аs7mIˮIOFV%l91ʑ![6KR6e:|qm[Fmqjns&Ϩܓ0jT舨Cc2RS3bB㣆u }aCS=Ry i\4?Ճ]/iݥ:}/2ޫg{PxO)Mqcڏgqi/ӺqiǍܺqix_7֢t\z$NLvS}%n17 G gRkj/ }PEP' d:UfTŃd:$Hr9:u5to?w㳳wCln~6x;_aybw޼g![U8Y[k@@IJh[3rZ57& wH'ϙ'5ȸ&dw%71JXC(J/Wvd!0غaT|tΜ)#^ӵ~-q|RFu& mV㋂g_CCZaJH1t_grN彻*;E\BfK˼{XQ)ͣ WM6:<>.z@@:{ zn!-uM;< oe; xqlԑ\ԧ&MJ46ʗ:~0^@m(FCV=E:XN"]qYU'f[Gg<^=JrYmu/6]x`O3~B{`zzvGhaqN﷋_Y{{v-VȧjM ]uyR {8Վmjt#%Z:%陙߲{졑P^e ]_Z_EŒun{N#D]x( Od##;I,7K4Z'S/mI~$w&;Fu0bǯu\9ҠoҊrvޓX 2jOmv!dh\YRA&l/,>fSs,.KWth&*{la$]QSYN~t:ovS'4q bɩs4qlK7rl$WbOq$^+|}W~ͳyh hڳK9 u=fįLʺl٦_}<,yY=Cb3sӣy Z'7d44\&ҧ< Ǡ464J I6'hY.>o JKlzaF"t) n}j:5xVfH1z[XRaBcL 38=fRl0`*/OCi8=tɞ2k@#(NoVNM;|6o]|Ho~$H||I>GGo=W+FP Õݮl[w2>*EZ>m;Zf,')1\j.on9H ئ^[UCjU><øT[ޅ6zqNE[yn%BG|kun{_5`@2Xm1^?'5[[0!o̬S:N48[(-;Bv! i= C}dvGwb[]2 yOuS]GY x*>Cٟ,I qg-.V;Z3-:{_6b -Jh N! R#)50SـJ-p{VW&8ir4uph"8e+ți$-ҡss #Ѷ"Y3Iy+YSz(F粝$(C*H8g Q|ӈQyV|1mv+8N 1 ]:Q^ ܳ&Մ&o::lL<˖Ӱ7:]we7wzuQyףIy7@2unܾ8g w WO:ҔFw#WO#S9p>MnX9y\y˚[I~"ϡQ֋ĻyV|g N. aws|"k7lӝne;M]Q];-I4>Wp}YvyI+mz}y?kG9Sl68I5_k">it˻nԏSāFCd|yI#p' E,) H=X{_Acԟ͚ٶ`.l0:aܫ2D֐Lg4:h ghLFN!R4);?-Ak~j/""l5^5C _>Q32 e =5wߘ~"A) 5CoIM1iE:ȱ(]a=m6 sgxr%b?[~ /Fu~eZָ24M!Ww}N;`+~ހ+,[f$۴}mp hB)oMb{9cEpeV{*iS1\_I ^ERQ%K\;DzOw]x:ZCIA\l MC?6 h"ܹcpO|< 2ԓݦK.-DSR"ˠA6l/r{FC%.q ִo5W_Z/H^uOxxf<XrA i dah ɭl='TJW?Ӌ)aNyUDHuj^#U.&Qh*F9?7@n> ztF/ C/WVW Silի+cE"$@Tmб˄Hm&lOt#:Q&ęPSgNǴ>}x???&"oZsYx-qƍ7>~59OrrX>?8mH>@pQvSQj;gPC t)5GzSB'fai>a:" ,Ywһ{L['y]ab;5ߢQ^1Aq喘㸶{!*9/4&"0g\xܲu%a UOMUJ͡^j ԋֳQcUFKr<^aJLjCREbD(+ĺC4-3^疠ɶlmʒlK+(Bp O@IOT/˕=o\yZgmm@8Ǥ0(&Ei0[B邆^ݘt>;rc~Aoh[6cߠel =!ٙ!9te_ ߽s;=j `WZ; !E+Y/ 2oA/qH!ISnԽšdʥZü,/k%orxVBgU2Z}aœ0찜r{|\B;.@~a"b+I"6+ no #E]y&tZع]ޝ _\ĜK""P+䉼Q $KgUk> ~z4&D//&jXkV!4#}D, mO`.zd2hOܷ࿫ EY5j?؞;GN$,g!M5[p/V> l% l"ڦHK(wWMh~/یǰnW3aAcP&rEZ4e6*q WROP/&NjF5Z~ۿEZ U O ]3i$+c]I5{XRr*~ .:cdIhw}0:5ݗ&N'iQ+lk{#i( |ej勲GS媭9mțTڂf?bWRk<s3];.GPwOQA쇘CL <괪OҟQ.7nA>{>c lV O+F e>EA|9,EoTҝǏg6~.mKpJXGi:r_ Y):GDzX|xkG;?-ILYEq#F:AHP?9zW:7&C%K:tVmF'JÈY+Zz=EDw\޽P1hΉ^G_jnL. =bDtؖ·B?u tyBTԶo%)d);P({OQvW?Q-Ek~3vgַHjScbI%Y9( %#ʫYFIV9oqז}$,tvRDyFkvdne DκVhcZ"A>]k-EEkcN}0}r֌}݅hwyKP?r]4,;qrWw-Uҟ^ZWQ>(xYRUMbUewIUe=Z>~`4ᛒrxx_]#m gO! ߞ,: (*_1X7rcɧf':V-!q7k^Ż Fs[{s@Tz}m/Թ(Nooį|zp+\׃АXs {r֚7sJqcj2/)iן# ISi4ړ]y:#eά',~m\8ݟ @9^G[Kd4M"k'Ms@yg ϻə6?þǖkr8Mwo{ϕ:4Nt->zvtzs]i/M;# rnhz?/$w$1A$M:S?FJ(C"|Mkd>4=?OVF>4 Qvx^B~4)<=CΠzMf%<뗸NKi_j[ ocDM g0}/qY#x_Q_كg*X*a^iCAb2=sj V՞ddGC}Eڳ"c!4/̚bT Ŋh2;YPw؞lŃ/]/^$|u%¯m?/8F [#ˉwSeyZ62M4ʓ"Ma VFH6c(ŋBL(J`b37 _6QsW"uW"Sk? TU)SoVݬde/<"[}NBB  dƠ "xeGEEKtr#8rD.AQ$- G/xN8つ׻tP;Yj׮]kU[Vվr P.;ӷ+v]<7gOЛ颕ҹ+AMJrz\=G,УM_cU=/4gww3=cN>:m z~e2 }g[aj=UOmv6IMjUNZ@lRدVl̿$OSS0?s6Ң>jk|'[~S(ff)`m\Aķ6d  KK+su;} lU[#zlQa ijذ!!7ښްd9taJR.޸#ڋ'^G}Fas57T3Ho_pdӞTQs37Yos޻<~{kF<3ٽgJz m&ߧ"۞{͉?'NU{Z]& S|6Si~,ͨw0~wp=3Ml;A4픾.)CeCu}hlϲsоG8g;x_uWSAc9⤵/Րvtu٧غӥg֮?5MaKƌ)Cy~šS=4>mHQ~Cƴ/[ֿINV-ju#u`?r{OOP13Z}fwW'WaזO26WO{3W=Pz遑(?c@-7sȓ[X6jw{tdM_V^u\MK;:کi@ݮ{fhwwmiߟ[C hcIVLy #j 5~TeC'w"5J~^Nv= ҾyXSq}z -zsf盗^U7#ӿttӝXX?S|cOb}E!Can9RU頏ڥC][CI?",ii ZϒV+0-?N޷S{|0/w_b׬Aƕ~buW6=e\i/Ne^ ]f]2sq2k5s!{wc۝.܃}z>1O>r>N׳i| {dNuOTTrC;5q@Hq j9|_p#~W:KSR\z1uu#?Jλݾ|Rߦ~vKtW9ɋ=Rqm7NնJq,M@(c^[:͔"k|󮜿SYccX\|N٪lW.;]mTK}?X2|ksI@ihW/{d{u9۳zw?KͲsg+1[ϖ#O$ϣ?|wk߈nLl7m ciɟ/{ºǖ5VP /5}C);?qP1p@/ ;gǿ+?qs&$Bi:0PﵝQGBw-~i&҄dzK+vݿ:zߪUյf^[kYۦϏ.-iAڝ|1]"wQwMS[.ܣZW>^yAV 7K6}ŖYuNmcbsd]pƭ{EM<]Y^:2'; bL 9MD9e z䉽,iU93TnX~3K_yzze3gvR WA^XfN^/*zI4ހnWVijq*M8tXGVش1(]u 聚+R;4)s9`}Y^׶9ZQ=:ІJ,hb-G DSL)_|֭NvL v]3nNf~qʜԛV2C]N:sOe21~?FWU愪==UZg=:3rB=ӱ*iJJCbw.94Qsg۵,3Uk;۶ mW]U3|Eb*ۨ~~˚{عYȒ1cT3Y3Av}mv{ݲ-0p=mZn]-Y(y:.%"FM߰jO_>GzLX#{nb_1Q6iοxJe[tU[Z oo7^u|EFڸhzKk{_vrԸMY9>H Kei"66 ZhkH47i_&OQi˝z >g =0%r(gcJ԰эy9f7.SsnqvV+۵ ;75~Җ{bl=ELUR+ڈDvX[=j̺hȊW4/40f3" y{4ySkRzvWJgUz5{8k攦y]iah^An7z"] ѶyW>74ImTq-4 +65ڶ ԵUI ۵{5o߫hjo^D֜Y(۸qn :`K4'r|hS* LȲ}4)ٶYUY>MR;}Of21sRNFWW(ÏV}e.%4^0F,8)\3Rl_ Ly%W# eьA.Grx|ω}|>yr-:Z1W3l9*FeߒHlsB{uȣ$˞C{j>.Yg+#Ͱ>55d U<[j 5ߐ:h 'GKGKO\,v{ VsՖ蝿On#Te^t1׸Ϗ+RuW*exwmY {ofR#榧4ߔmUѶC!u{zVSj>HnR#q}Ry}-I9~z4y=)exdRP~NoUV0O6SA86n}PH4!n7;ک?&X RK5ƺ[DZiR*On\yp٨foڪrC/O~`>}S/I9$pOb8 pAjAS͔mK=g D+:vsA;%]c*v\K>_wv.]~B~z}@h^?CNc_ #s!o 0Lb~ΑH' +>3D݉(^8<?֭} |DE;zG[~h ѬG#S`OAr!Sefh՛xpVfDzb 8p`X%ƉB2n2CbFG29cZ=^Fn'%{dW5~8BPc^| mv>sV{@`5as7A[RrBN;՝nC[ikC嬷 V yM3k85E8 ~AkT;}ڝ}vgU0ǹg1oܮvn_6r~lqd~^hTCR'vꙇ뿅l3ݱ/?Sy6Z2o1/V'*bVBXy/r\oR+R4NQ_pZ`~(׼veWխƅB6B3UKO/dsǛk˕WseM I ՒfʸJ'rZ@#PɉoɐQt_1j< uuuܵE}*lt5[.V>GBcU7ɧU^u<鳑WOv2߻.~R1|&䖇!rCn}GIi\/QwMÎ.7Lr=f~T3ֵM;@A+ukH_=CJa8ކkt'P JRns?:kΠ@s@ẃO*Ow#ߓIJәUW_k^<m)tzz'qWS6mN#)cYl~N<ǷS`7%{ֿ|;KUOǓ`,[/7ȼ'sI29ϗ<)G}OSeޣa /\S19|J-4z M= GsyF}[9n}N921`쏐~Q/ut^P'4%R'q|kʞ TJ1V'+EvQfYjo.u'C5tagԩy [p>y/.󷬽p<}g&Y)[5uz7cUJ[q=Ϥm{( :6j|a#߳L"θv}3@9g]yz2"AW!պJu ꕀ ejCKa3:buoX,7T?& }_C_[nUwRO |'a^^2]cwSh JuG{ϤlV5LxzI^_}g[GB2Yu qt;g"\b `񌖵1"`;>w'|_bnC|vx`<(16]t"/E |4nvzxL. w]6k1=qg^xzS*R?gsԣӀ=Xnj:_|n+h φ>0\(k$̳29;V?.Ƴ?ǣ^@/}qNے^0J0#ri{N^9 1<'.w:q?]k;~V5`>v*}p܍yp?Mv5\SƉ 9{z-כ<UpWw' kc7'ɱK:i G:;7=DZ`AM1׀ӮA 'c`iy;wnXߐrXFL>Ko %NQOxd,PU$\#SA|שBfOI6W0܈vO=R~N@ _N_.fAj"hЙfG4]גe /սBw/j*:.TLj_RېqZ`Eu {4o1x9BҦ1u^ǹinК3 !R\Y壯 @cpJ4jm@ g3̞ϰ/u+ nh'5Qy/!?&/uB=<]~ 'hތpa@xv5!3B619PqsPs`קת+H]/s"5_΁1TS9A~@9' Z|myz[ӝB+Pb&Q.bxgZqﳐd<%(?YʴT-`֎ ^G 'h۟aWʽ rA:=Erun$s rCPB{-VtVsw 9vC!MS(ˡ-?)t7w֦.cZ*8m!o2~ /Ot~22g:eAXG J[&E0-4Ǻit{hM񐋑Ot~2?|s1ks\Qfz IM+zKԥ9BrB1A˼pK|o~2A=~yNLca(T=y{8MaR]~ pۍhkl'1ơlwll4 _eCw{1kp1AnZҶ#-lZ[V֒϶@ ms5'{:C(+*w׫3^{‹?8kwJ܋>ԝ$4H9%>d}5bNRR{_?DE/r]urVXge}'?Vݧ#|ŘpuZi}>.L{o蹑GbD!5x ]P(L=afM0s=[_}=d) dcLkYU&8(7p{D^|oV(+7W+Sߤ=oJzY!(NY \|e|{@nj\7y;_3}c(rF9[ g'ݭMrcXiQ'e{ޛSV}+.'m&_{]@@_9i0ބ1& ZLYH=ؒ;AN~WIxݏJ~>sϗç^/w~~CgC|k$Q㳤^ 1ʓg i-04{[RzmV5b ӈ2CǓ)YYdYlU'*7ƧZE'BJRjgeRYj!&ϙޥ\/qQ>+enԆ/>bMP'#~k˞gnAcCԥ)Q@@7.]ls.iP~n ?|?u]agh$*PDyu}فX-aSW N}ƀlZ?42p|B{7Vi]Wcj/=vZCOFK[j1!|n*ΐgpqfkרvH].ߩ9KN dw>7E_TG1SӬ:UUWO#5ʍ z[skFl&æ]f=XO;h [ Q.8Vb^ ?r-uV="+k@gMj F]w]#~)難Ffbny[|VS;NgXU!W?6^F`<g;Yߪ;, Yy&cE[pZqϯԾCeoov6-Л efҿ*H x[2ɠW,Ê;4<šc(CB_ek] H mzH8l>OgwH]&ʾZ-o'ʨ*o zn'I՘G8 E8ǴUΪJȺRUORUYP4(Ճcn92qVdo0?R_p*7]̰S2V\NBkݴC(%9>v15ĿChOg:{n=nЧOm]xNvҷ"3nn9V7jYHm8ޤRkZmTme?@^;n8= 8%;:5`MB?V}Ժ^ihgo!,t$P~Mlg]5 uBv #ߋ6~@(ed;k4&r@gi/. piT褖Tzy$u)nvɓ[e{|K,| ZtԺ/RσN'Ayս:uH␶T:Lnr4DYiZcF~iEq/@Y&NTc;/bOoS~woz:Z][dVᛂDq gcnW!t>o[۔5G]@oCo}ݖk|87 }}7uzP;ɽGzC}O?]\;C޵U@09䟽AR}Ȼ|O@?V#l5Aު@Վ{_k_yf:UnfJk:*R|^.?e Yw@D z?DZRQLss:<_`[|{C{rTV+oYAkROw|>{tz' m;ϣ#rXS_I7!}MjU3ѮۀCg'XkP>oOݒTOݾkлbRR|V]l?*Pfټ7l,YK}{ V!6*.OՠUs*^!=&clW瞮Faⳑq35AmHљj:ޟ.n˻X ;_8iiawnuouq|gV]{OG~X`RaF;jAd1ڛ8c^R =n7r(xs;Fݘ:^U R8٧ۨGJ;sskQf ofw\]#:w@x K(`3Y_xag]ءko=uFdm!mbxzZk5@;C/On /W[Cj kN X>Hމ5JzP#:Y$D]Y [ǝw\%l.OIN|vQ%Nok$5p. QyW \%!#q>\ q;u; [~mzүmw|K?-. y~Q[}B˛Ҳ>U~^-২OSrL^||xr-c\7eӒ,3D&G5Kȗײ̍,sf-)eyˌ?ޢ6TH BzތB^F>|hjɑ\^q<{69z_B~)ehj*ڪ'd6L Rny!0y-!yf*b(Z[J#Qt|9KX3+ɟ%rW%>_גoL͌o!'9'm_%Nmw&Y^bCZ֙評.%SHFc]1'|%yT_ˁ۫!x@n Ҟ9'sN(P9w9}r{Yrϐ$|j5k7o"LejWɷSJNh/paxp1pH GH|?-\V9s\GH|LW1\0s. ΅ >~z9L@k<|3+ɟ%_Ŝא%H|3z)e+䯒oL@+P*]E|[\2;D晈<[OB[ /D?m4N$Z1~>OKD~9IlI9]E| Z#7o!'MI?kM4^$9_] ^_z-2eeʺOe3y}˹w9aD瘲kגo$D| y=n^HF$Oè3:LӠ~5S^LT}O!?\f73T1>|j |kg;;w%G.;B35fQUaFދ\>UԤ{U H^٩ZUQ*jUJJ #Q̳|1y ,y;;w%Tqw (& Erw7ٶA% WAY wwF#%U^AAb>yu>B/B/d̿; 3; 3; 3LB3]{ cLB"곈rQ"QbZLY)k1e-ŔSbZLY)k1e-ŔSbZLY5UCY5UCY5UCY5UCY5UCY5UCY5UCY5UCY5UCYK(k e-%PZBYK(k e-%PZBYK(k e-RRZJYK)k)e-RRZJYK)k)e-8wt2Ɨ1O0$O2^=Zr{hCZ-jV=Zr{hCZ-jV=Zr{hCZ-jV=Zr{hCZ-jV=Zr{hCZ-jV=Zr{hCZ-jV˶Z?Vǝ:S5znS|cV!_K9WK "w^dʋ܉27ҊmNFȝ܉zec}̿^>zeW^>zeW^>zW^>znCP;CP;CP;{GYt3",EzI(K@jt$@$M4Rw( (*("(vTTTT`}>S9s\̽+?qT~wT~wT<GxGxGxGQQ%^k/r\9 W+G~#ʑ]#%G~)#ʑ_p/r\9 W+G~#ʑ_p/r\9 W+G~#%GK/9_rd~ɑ#%G~5#ʑ_ ȯr\9 W+G~/#ʑ_p/STrJNQ)*9E%STrJNQ)*9E%STrJNQ)*9E%STrJNQ)*9E%STrJNQ)*9E%STrJNQ)*9E%Jڨ0gKmNx9R֯,:їw"#UO?})x3 'C=+Sce8K?AOgs˥_!JWIVPI^ o~/KMҿ&wJo&K5kAnb1JYLt/ //#mYzo/׏u;KEpnq~̮~ KbEJۤ.?#՞kZk4}i}[i7h                                                     _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _B\[U+U+U+U+U+Ua~=H?Vqҏ~OlOlOlZ0/,D_Y }UdjZ0vbnU_i$d8K?AOe2KBү~க~ Jۤ.kp;]7n b\ _[ Cz_+Y|_W~aZ'7wM]~GWH7&v&z̆RiMk]Emnn"z6=MD&g&yϗ~ _$Lү~_+_/HU&v_;)ڲkk+;:KַLgGۖY6}mJ_O5/#;;'To|}Jy+>I?^ O~x/JHgU&vZ-oڍͫ8w[&\אԒH_Gz2\חrݔ7ZG"]Ýu/-}_ qҏ~|s'|HPE/I$[}/KMҿ!/(~u\;'$>u).->r+8> eu kJ_Kڪ}\ב?$庁\so|s2}}So&#!EF¥&}/gIf}X6NO~"/JHgw<'ҿ$Jۤ.a_e9;ͭW2x'OJV+KN+gRއ:mRӎ* ߮mRQpRB*\vLS*mQIæM;T-JT4|LTllm18| r*U JU쬔*}e|V!XS?ՈZ:mRչFuVǟjIXSkRK ו `M^R.uA^$zZ!lR y}xR+ e+m֪qvk8! |m9툽=!Ki~;`_J Я:{\uF.i鲃 {Wue]~4@n Fӽ p>{gO?NL=~y KWt}_|?G}GQ0G}L~e?rѿ?yO=G(/ ѬF{yq0c3pb-2m,%o,ŢYqa8_F T<\xa`??jm|c >J%rH=S"9JD$tIjOC$Ɠ m'M&)K.߃oGSI#_ؤ/~iIGt#ėt Lɤ23 ,bB,t̂sܲփ59 :h2]q(OpJCa0: ]apg(NLÉi81 G5#?Gj4PcXb;#8 Ih6 8S4|L4 ֙3f3sfz\E'e̓|jh.@˅Yssf1,F'oO)<`>g)>Q?n9-~+s{%s+]J֭J*pW*b\EWevxNBh5qf~56Vj.ῆ֠rנl`5خv-~ס:j`1zד趞ļXSmyހ6`gz{HppppxB 7Q&r h1|!3A޿W`~> #!ίbnߒX{s؎q##DN88NOP?S'$ʢ[Y0٧=>/<}ᯜ{Oy,/|JWh\-+cb@,mE+_V$^;oLJv4李x*WS%JDȻn~iOö.~* qT)CþJ3<]ܪF\U_\ ըjjX-[h_5ѷ:9h_5Ц5G ANk]5гf I<5RĶ&S Z?S_m4M6F`&4 :סt]%uy8aq]4 kH\ vih ׄ)7Cfn`%5^$-Rw+N ѱ 1A Sml vCܷ=y :G;P8qםľꄯ0wWgva c ']Ѭ+uE#88rA.9A5֝='=^hӋ1|{75|݇>C=/%~Qyp~\cu?/# ^$xDhΙ_'(rŚ(>`|rױ;_ٳ2ׁd DbI HDDj%) Ob]2L.] 9SBA\"ߩpJ[W62&Ιv&5 ~>B8!`r0Cfap㌫G ɚ7 x[ӣ?ck c1X֎Xq2&v"Ob$2 'dl&NFlR;xoμz:MGv9Agc&x3bkgi6g}69,szEx?y~>O ',DE/yF,bz.OI0SKYšy} 3<ƳhYR\ ߥ-%9ƞ<]e/rjh9ˉq9q@IJ}+x:^V̯JXI+{%Wb+yFqל5qy\sל*_^]E ]Vjb_ ռr.ל5r͹\s.k}נZ8:֮~qz=6/H7wcEjE^$՗-VZĿ|+~^n_6vryWB^_׫} ]^Cpcmjt?yst?9z;}Aw~߅A#X>>>?h!}t8Sg9>a0u>ϗBryX ŹXo;JGxcw{~`491Ǝas cH?2#c?'~>u>A' fII$q)Nif vgx^%rp.Ex\dEp.g/.i6p+8Flej2_e_+B}U|_%U쮱\vWrXÚ8:@ $77uN|9N9*Ѫ"hi42մx-WƋu^{Wƻ ?x&ӖҶ>>E+CKkOG /LPZ42`G~|gF 6ذ5gS` v*S3)ԌB&Zu|0WZ܋U(6ES b(&W|2%^-JoEʔ¦Kte-3O-ϲg8|/ʕCcʔ<FlL`*iT9J2 @X[5ՂIk&javMuKD+β>/Y Ю9iVCyax5BFiG 5gM4te3ޜش --3iN+ѳ5[6Sy YӖۂyִ;L{0'w~!u`.Ct{vauogu&]Ш ]:pnt'=q8zCo0zCos}}_2(1=G=6q*Hgl3^4u ~4w0O 1ǒX#qœxs@- d/ $pr &0\s :'oq%# LI$Dp?Lλ&0:I[q'd|s5LK RO!)ĞB)} Ms `7 AhJJ=Rc٤T֦'O9J#7i zHcIg拾.upπS2 d'?O&~2ɞτo&|38:$YO~#Y3 ,w0\9!A!2PbJCY;CY;CY;| #_04F/f>c8NSSl8| W#xƏ$#I.Gv$kGQf(G1?\"ף(֏b(jl41&i4:cX?1C|0cc,q%18b;۱؎8|88#q3|G#> O`~&m&='b3pD'? I5 l2's?&bB S3ZB-LR SJ-LR STja*0ZJ-L4ja5: X?ӹNLt8M f53`~3<3l&Dh6fL4E.fQ˳`6fKf|w514>>> pKm\bKs 2~|36XXt[n m!f!  E-bn1/&y11>?O)S=-A%h48O ~YjYyyϢR>7s~hόmr6ϖmٗ? W .CX>|G!u!~H~pcp?aB>!C!8~J~O .g>>#9>'矣h{0XK|_GsG;?>{>{kp7e[8(;| ?hǸ?^{>kфϚ'9 ?q8Ng8zlj8ǩq9>A'6Oq>qV?w>ǚg|INbw؝$v'I8$< S<S<S<S<S<S< <<<<<3<3<3<3<3<ϳ<ϳ~,>,>>>>>><><>>>W|_+>W||39́g>s|3yyyyy7y7y7yn tN7:Dt&7 Mo|'N<3<tLqrܳOq^U:'-6vv]y4Z/ ;=v< vm8mmm? \<\yyYVJs ;O<Ÿk0 ^ih:la͏2?k!m< ?H;F#~6lmeCwm_|m--(hU U8C*X /~A _/~! _B/ ~a _0-maߏu?g~W|!GEU"!EgY|!Eѿ(5Rۢi(/ nQŶ(E-m1kDöŰ-b-m1l8c[FS+'ӖҶӨ-N%P+A=L4JIrU%ѳ$1d$ZKO)rW \J3_x ,K­,ʢ{Y/z&ʑrvʱy> CC40ڈ5_cj1M sM݄\43piش%{%6 $՚\9A "`2mӞP7@C舿NF~Ъ3v t!. :myve+yJ^~74NMu~{R=ѩՋ__p/z< 1cq>6~??~{Q(D(b&7zf>h棙fށVt`A\r`΁bb+46c cW,p6]c.c(\bm: z 1&6=Y\2ڥP{)=SoḀRhƳ= ^ihN.\:1gk&gkqgQ4<ePd(RFQ7N2 h2Ggbnz&116?cX33_cy,XcY7|<>y<G OxO$DM~r2ZOO❂&S0SO#7ӰFL?5-g06셙4,flb 3g\|z.q<'GG<4^/BEpZb1ӋٗOI{ Kq ~w `Oǧ4OY=K,R_ 99<`.2.#˘[躂Vլ[Mk[r-ג^ϵu:'z@@ /k# Mh%b| /u VxmEVjl+h2lF]lcn; 񽂟Wy kkĶNu%:7 b.0v37᛬jk/Xb-b}}yۇm~|'``ww{2. ?H==xǺ>gC?#}'<>S>3|}x.|N>G9|hy?L,K_ `͗_r%|EN"__G;BnPGk4Xfo|M|Cl[[leͷh-kQ(5;{澇u1cG q^Op?g$9k.\@]]&/Eq%MMfM<|Fl_fqZ/>z\sQ=nI=n'oob{?>{zܴɯN8;$>gz2^UIOG/yچ+ςgaD+gʳ t e+ϲEhii;hוOm6m |4};!-[yo98C9-gy֕gyíT`+0^ ǔgE+a_qƞ=7aogܾvDyVG#J`W"Jĸ'q?hP+cW*hYe4x@9Z=N[J;H#UѠ*ZUe*U)jOCjR ^Ո:TGii``} րg Z5X5UA[DC[OG`F\]@`@ WauпSx`Sg=ZF]0C] )4x?}}h5`<i5gCtnX5a8>ړܷ=1GpC A.<>||Zx\<f;.+PB#yk'4 #a؅m{3\;{b 71cqqg?rI]D?EShKL=pO ;'Llə3ީ v&\8zGP#I>FHpF?VOΩchsfxxG @'0? gO)O%gS=l953Lg3 ^:so.=8ws`DL'w!3;|]$=yxWk_19C PW9_uo{޼peGۥSh}ѴloߊƜm*}8AU *OO; ))mʫ8v%*Wyebueo򪜮"ʫ5^c;c ~,c =k1>xoqw<'x3>'3 @?3IIOb|;'c?'dBSk O^SY?4♆4itMn:8 g?`|3Lg?Y,g? Y6g?9nse_\\tvO`vOlyiv|_[_ZE_ԓ"\bgʓ`< yxNO{X3_oMD7M.gc/{{/'{ᶗ{[o>{MF9`{Aw]o <ƒ{`{`pk>> 'R죏:Cvu5Ro3?s?0}//Kj+==#!7_St .(c{=}O>~@c'qt>'?gqv::ENasxN4;M^NqOs:i!3;p !/gg؟g,%v.g,Er,?9ρs?yσ~vxکm;1Tk%l+~hhG~h臾 p V 몀Ko>_z?@ê*V%ު1T:T:MMkb_$5y-jk[ ϵ?.RPmk__mlS0^u.uѰ.s \]֣n걗1W]ԧ볾c Т kH.! ѭ!x ܐFЧ؍XgcFoDF5oc]cbhLlB&mB-6A&kJ7_Sߔ:iJ^}34mFiF|hF30sj9ܜؚ`zZђx[R-h FK0ZђhŞlF+C+0ZF HHnZ`5hM A6`!mв mhFA*#"` F0pmKLm׎vj^iiO&rZPr>}'8Qa`tƮ3uMCj +<bF^Κ>>>>>>>QEǨKcߏc}$#Wܟ\gMg(E6$'~NC'<%6%-nP)<#Rxm 1#=S>ރO%/iاFm3X:# <2#,`r0!!5Cqf6#i{|$q=t8wfb;Y6 Yb6q͆s\%O'\s>1\,@h|,$&>{9{,F<s1bl$~D'mR%>PT**Z|JyS)[XVEZQC0מ\7q_{[8u>UԼ.{(ubOW.7. 4.<ϲn]kUJ6*>`S2~k/Uƴu_{&}O.@ *UuUBuQkJV)jJU*ӕ]UWQT]6.^=^ݺOOKOuD&C p*Hsf:lYZ8 9):2w9DvϰGE&:쑩{|=%B|=:912>ɦ ưkq$nZLEr?t(YT&iIz.GŠo+.7&9 Q\IZU?n`m2d!R%uFť4S'iQXG@3m{ɭkΪ;Ԯ JVYZԟ3C̥H\Rj̻;qhlWv~mcSOu|όMeĪDz cdbEY%/d+VPYwݕ-\/%I>Žc]xMwX "ŇKigΪC\]w[I欵&X& M/2O W T<eO~]o!ibȮ!JV粉ҥ3..  ws2ċK,8y*I#ʍ!t oˎu(tv$8.];ޭssMU+"=Bnz;Bm[j)1(͟U '[n;Zǻ6fdy2gQ}$a iwȭLfC ;9?wHy:n=.ι#{8y5!{u׳;Z $u/Um)w{^Mf{unI!#սN)RcsZUeTw>~?=~?T{,8awNwp a9.1$y kOvc-ar|bm{e V=#o]aƵ#mƽuNYP^'VEޱY\\L#CU 2]8ۻg",r>;y Fggʝ5ڍu=%fNC[] W&\lˢ"D )m/y jr1 sgٺҿ-(#@ͭvm5I|C ;KEK[~[Vڈ^V,A(tg$nνv ,JuWt >ֈC$6n]>]u憎m#1ZjE;CE@osfyn.A*=d/U=VoG7n*,]aݩo>ʵ3\;3$f. u=y_9鷞ws~j;~Y{In'w卺>-޳>~v'OǮ|7zv>~ꍖ vT,[',{OOqw|< 9Roar+#`Ca߻P:}2pZC4os`grcvS%)Ru pMU4p}xWDAṃEkr}gay[;lw|t}Awn]G^߰k+^aJ;a{+i{%=Wʋ?/|dSJyO~^}%sI%ۥ{voS[&oO3ol2)[&-?-_o&t#֥v l#o;׾;wGy; wGOG7>7>׾}O|CT7 6j+?в~f{GBrVa[]4{|bJrj#hLud!?pv-#5vx?og 9>iOOv$F'fHMOŧbS#ݟ e('#Si,HbHi 8GNQQɉ)[qxGeGR$~5pmLKKHJL'GY`~5I#%59:#!n ,F`c?iJȈdŧ%gC&1 d!mFV8DM $-6  Nr=A;-rMN8 7 4d&萅d{ZFtkĊ/&9bJNHkbE.rC"pUUI!5je%%\sȄ[[5hK"39H'&:=}H#&;g#[XoZdB:N#%rtLWFBdv& X^eUQ8IVIri@L\yޠ0[۬pRI.["KpPsTYf, mD22/$k94LE18cLIa{EOpXl]nLã#M˫h{FRpUsEGYMKNvJR=zzWr S"F0)fVTw@#!">6SkXۈaC~]h-ŽEx`^NB:ۃ{vn94$NmBtjgoͺNaА!8nW!]-g۴6uHhHD/[ېN\=90<"Mp{nú#B: %c0AMX^!G(A[Dx`Ppvr]L`{pwkq!]#ƒ;Z::u )(0"$u0 vq#6!AYXfpY w  w&ĺ@ǐ6b(*tۄuܥBz3 Z~"#nQ5H0Z k+ =urrd:V  aW;lQtݛhǨ/UzPظ1m%:[vztL%ɩda&;d{=-20VYHxVF&,;6-0%5%Y=>?qγ}Iϵo%[/ ֑wgz)/ djp@J\J/[NΑJ|*&(婼OSMPU!UXݯ*J*ʨGr*BSUꪆj)U먺AUO=zX5Rѷjj%syGT(YuQnCTUU?dXjکj\5U}Ʃ'EuIP dG}.gZuYe+yAPoTr4ܽ;uPW?Oԇ#WsgܞRgb>Q%?HMog3P5D S#p]=FjNU=|ꆺk. *V.ZEu1]\%u)]ZeUW5]NtEmוtU]MW5tM]K>ut]uP?ƺ^fn[V:Pmtmu;^Mj~DwСtgE*G]Wԏ:BwuSҽuW?ӏ~:RQ:Z;tq:^:A'quSuN:SgzzGjqz'IzizgYz'<=_/ "X?K^ez^WUz^uzޠ_&Y_[VަW5Cԯ7.[-O>#DҟBG>1I'>O3> e}EkWve1x/m3L~c3LAS6")f)eJ21)o*n*?ST1nj7McM=oa46MLS47-LK֦ 2igڛ`BMGɄΦ 7]Mfez>y2O!|n/̗+s|m1ߚ;3?qslNS9cΚs漹`.K&\6W/檹f~59溹an>|=l< z(qG<{(QʣG><{TaQ٣U=yTQquq[v+f,3ssF˶%)S$N։Sn ~7qgx=g/w9eyeeEe%e"ԔLɕPZ6eeeeUe5eue eM]P:B)JYKY[lllllllS6WPTj9WZFVN^AQR+J2ILQz^e2Mk9S+3ePU\\\\\\\\\\\\\\\\ܠܨܤܬܢܪܦܮܡܩܥܭܣܫܧܯ<<<<<<<<<<<<<<<<||||||||||||||||jjꪞ꫁ssss KKKK˨˪˩˫+++cTJfjՆڪ+kkjکjVZXuu]u=u}uuCu#ucuuSu3uڥW'nu:Y;;TuڧNWwQ:TwSwWPTRVQUSWPTRVQUSWPTRVQUSWOPOTOROVOQOUOSOWPTRVQUSW/P/T/R/V/Q/U/S/WPTRVQUSWoPoToRoVoQoUoSoWPTRVQUSWPTRVQUSWPTRVQUSW_P_T_R_V_Q_U_S_WPTRVQUSW?P?T?R?V?Q?U?S?WPTRVQUSWPTRVQUSWPTRVQZٴ5ES5M5C35K5Gs5O@ HDK99yyEEŴŵ%%ee1ФV2-ZCkڴUUմյ55vC *m-mmm6N\BRJZFVN^AQkZ6IMz^m6MӦkh m@vfjik{h{j{i{khjikhjikhjikGhGjGiGkhjik'h'j'i'khjikghgjgigkhjikhjikhjikWhWjWiWkhjik7h7j7i7khjikwhwjwiwkhjikhjikhjikOhOjOiOkhjik/h/j/i/khjikohojoiokhjikhjikhjik_h_j_i_khjik?h?j?i?khjikhjikh-l캢뺡ۺzzz\<|B"bR2r J]R陞um*jzޡw^ꕾ>V_G_W_O__@PHXDTLooooooooow D[O֧=Nz>U]~}>3==}}CC##ccSS33ss KK++kk[[;;{{GG''ggWW77wwOO//oo__??c6cvC1TC3t0L2l1\3|#0B#2b#1RccNc.cncc^c>c~ccAc!caccQc1cqc cIc)ciccYc9cyccEc%c! iԌȍ0Z6ceccUc5cuc cM0:(XXkckgol`lhldlllbljlf36704261537v0v4cmL2&Sc'cgטjL3.F10]nƞ^>ƾ~ƁA!ơaƑQ1Ʊq ƉI)ƩiƙY9ƹyƅE%ƥeƕU5Ƶu ƍM-ƭmƝ]=ƽ}ƃC#ƣcƓS3Ƴs ƋK+ƫkƛ[;ƻ{ƇG'ƧgƗW7ƷwƏO/ƯoƟ_?ƿf99ii阮陾9999999994kffflfnvfafeem5153770747276717573Ǚ[[[[ۘۚۙۛ;;]xs96')fkN5}tsߜaLs7swssOs/soss_s?s@ `P0pH(hX8xD$dT4t L,l\<|B"bR2r J*jZ:zF&fV6vN.n^>~A!aQ1q I)iY9yE%eU5u M-m]=}C#cS3s K+k[;{G'gW7wO/o_Ś͚R,,2,Ӳ,r,, ЊJԚÚӚ˚ۚǚךϚZZZZZZZZZZZZZZZZZZZc KZ5+rn5VZZZZZZZj:NJֲֶZXZY[XZYZYͭ--mm.k5hu[굦ZӬ>koͰAkWkuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuubfn+jkni[m;k{ovhGvl'vjaiemckgo/`/h/d/l/b/j/f/n/a/i/e/m/c/k/g/o`hd-횝ٹ]vflbjfnaiv]إ]kkcuu MMqV6vv=ޞ`OId{cdlSiv=g=>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>߾оȾؾľԾܾ̾¾Ҿʾھƾ־ξ޾Ѿɾپžվ;ݾþӾ˾۾Ǿ׾Ͼ~~~~~~冖'Zni!ɖZnny~倖Zm~~~~~~~U5u M-m{Zߵ߳߷??????miqfsfwGu4Gw t,vuξ~΁A!ΡaΑQ1αq ΉI)ΩiΙY9ιy΅E%ΥeΕU5εu ΍M-έmΝ]=ν}΃C#ΣcΓS3γs ΋K+ΫkΛ[;λ{·G'ΧgΗW7ηwΏO/ίoΟ_?οn;;kk븮빾;;;;;;;;;tknnmn[i*-kkn-ge-ߺ;]]]bw}wwÖ܍܍MMqV6-gۺ۹ۻ;;]xw;v')nNu}twߝ̖K==ݽܽ}}݃܃CC##ݣܣcZuuso9dD$dT4t L,l\<|B"bR2r J*jZ:zF&fV6vN.n^>~A!aQ1q I)iY9yE%eU5u M-m]=}C#cS3s K+k[;{G'gW7wO/o_ś͛S<<3<ӳoAoWowwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww+k[;{~G~'~/////////////////_~k~w~~7777777[[[[;;]x?')~O}tߟL7wO/o_?@ `P0pH(hX8xD$dT4t L,l\<|B"bR2r J*jZ:zF&fV6vN.n^>~A!aQ1q I)iY9yE%eU5u M-m]=}C#cS3s K+k[;{G'gW7wO/oߠ%-=P5=03;p7?08H4#3+;'7/?X X0X(X8X$X4X,XX!X1X)@ 4֠-X9X%X5X-X=X#X3h:Πʠ ̓--mm`|0!t')9 ӂ`zK``f[{GgWwOo_p@p`pPpppHphpXpxpDpdpTptpLplp\p|pBpbpRprpJpjpZpzpFpfpVpvpNpnp^p~pApapQpqpIpipYpypEpepUpupMpmp]p}pCpcpSpspKpkp[p{pGpgpWpwpOpop_p@`PpHhXxDdTtLl\|BbRrJjZzFfVvNn^~AaQqIiYyEeUuMm]}CcSsKk[{GgWwOo*jZ:zaFa&a................ E(ZyXakagXeXkkcuu ͍MMqV6vaW8>N IpJSia_8=%g`k83-=#3+;'7/?< <0<(<8<$<4<,<<<"<2<*<:<&<6<.<>!1)9%5-=#3+;'7/?| |0|(|8|$|4|,|<|"|2|*|:|&|6|.|>|!|1|)|9|%|5|-|=|#|3|+|;|'|7|/|? 0(8$4,<"2*:&6.>!1)9%5-=#3+;'7jffHHȌȎȍȏ(((VVVD"Q-ʢY!Y1Y)D&$K4֤-Y9Y%Y5Y-Y=Y#Y3iO:ΤHʤJJN&$&%'$&%'$&%͓--mmd|2!t'ɔ')9M&ӒdzKҟHddf[{GgWwOo_r@r`rPrprHrhrXrxrDrdrTrtrLrlr\r|rBrbrRrrrJrjrZrzrFrfrVrvrNrnr^r~rArarQrqrIrirYryrErerUrurMrmr]r}rCrcrSrsrKrkr[r{rGrgrWrwrOror_r@`PpHhXxDdTtLl\|BbRrJjZzFfVvNn^~AaQqIiYyEeUuMm]}CcSsKk[{GgWwOoڒΖΞ*jZ:ziFi&iΑΙΕΝΓΛΗΟ................IE*ZyZOikږigZeZkkcuu ӍҍMMqV6viW:>NLItJړSii_:=%Og`k:3-=#3+;'7/?= =0=(=8=$=4=,=<="=2=*=:=&=6=.=>=!=1=)=9=%=5=-===#=3=+=;='=7=/=? 0(8$4,<"2*:&6.>!1)9%5-=#3+;'7/?} }0}(}8}$}4},}<}"}2}*}:}&}6}.}>}!}1})}ٚ1i`ӧtO3ڧvMftT}|zp1&MN焞 S'vLcsb@ׄ  =ԋ ]C8Rnb;PetT9bpq֚eQgYZ;kM:'gy=qﱺ~uJ?؁މzp1r&=ؑ3yƲ枑:ufYg]wUL5mb} zpqכu<yz^ F~o0O7i#o}3_6Y6ؐ79m8ep]^߬MF?Mf]Ckdd #eӑߚ1\Mgyg6n6f=f#yG6H>q#G:ƍpL ppg8>Aje3gy,wc}sc[k޾igzƈ1TA5:AmQ۩NjA-HmC 6tmC 6tmC 6tmC ݶJpJ_4o#?knGvnGvnGR79?η;@;@;@DN;DN;DN;DN KKKKK\_k~p᧨WWWWWW}W}~f9yrvux݆3zfLyGcPURkԌSFmvP;R/ }h3fy+X`%V"X`%HV"Yd%HV"Y䝐wB/їK%5kЯ_CV7n=cNX@X@X@X@2d, co@_G~:uѯ_G~:uѯ@~ 7o@~ 7o6@ l$6@ l$6@ l$6@ l$6@ ml$v@l$v@l$v@ߎ~;l $[ɖ@%l $[ɖ@%l $[ɖ@%跣߁>ɶ@-l $ɶ@-l $ɶ@-l $ɶ@-l $ɶ@-l $6@ l$6@ l$6@ l$6@ l$ %X`]u %X`]x%K@.P˪aMu0R [mY~QsjڠzSv/0oS;ԂZRGރ8888 V!ZmTh րh րh րhMJ 1g;)HZ5HZ5HZ5HZ5HZ5HZ5HZ5HZ5HZ5i i i i i i i i i i i i h h Pe b b b Q M M 67o7{Fόgv{)]i}ݽ=]n9}FO5Ycxn8gy2nN<򢨧 k]Z]͍šDAOݺOJSOlJ:$5}z^f_p g߲`oԣl2O۴g.eA(MQ:ьw,+ xs7GOg#'5}I m(sC_< k>pw:i ii,/SK|AԦЇo>k5`~8j8j8j8j8j8jFGX# aFGX#aFGX#*+++++03z te+]3z he@+ZʀV2 he@+ZʀV2 he@+ZʀV2/U2x ^e*WU2x ^e*WU2x ^e*WU2x ^e*WU2x ^e*WU2x/[VFe4~UǧTSu|Oz}Su|O:>SgL3u|:>SgL3u|__O?ٯ:R7B^}^:Ou={=UxsssTjS |V}ksxj'ԑm{ |5^k{ |5^k{ |5^k?m?m?m?m?m5|n >[ϭ؏J%ߒm,aIX|oK>+Jl=NIe=|K+J+J>J]~%G%.w K]np_/|K%{^}/|K%w].~|K%s9}cFfTIQ3jNSVjAjv߁~w߁~w߁~w߁~w߉~'w߉~ ^_}=-Xoz [ނw)XozKKKKKKKKKKKKKKKK++++++++++++GdA-ȿ ߂[ roA-Ƚ ނ[{ roA-Ƚ ނ[{ roA-Ƚy ݂[w nA-Ȼy ݂[w nA-Ȼy ݂[w nA-Ȼy ܂[s rnA-ȹ9 ܂[s rnA-ȹ9 ܂[s mA-ȷ ۂ|[k rmA-ȵ ڂ\[k rmA-ȵ ڂ\[k rmA-ȵ ڂ\[k rmA-ȵ ڂ\[k rmA-ȵ ڂ\[k rmA-ȵ ڂ\[k rmAݬ跢ߊ~+跢ߊ~+跡߆~m跡߆~m跡߆~m跡߆~mYmA-ȷ ۂ|[o mA-ȷ ۂ|[o mA-ȷ ۂ|[o mA-ȷ ق<[g lA-ȳy ق<[g lA-ȳy ق<[g lA-ȳy ق<[g lA-ȳy ق<[g lA-ȳy ق<[g rlA-ȱ9 ؂[c rlA-ȱ9 ؂[cl#9 ؂[c rlA-ȱ9 ЂZC7+s8oQ۩NjA-c rlAݬ89dU*GJ/K%,KeҷG9R~p[3G1w w5+Jc%15+Jc%X~ffff͊>1 .pLpLpYс %\Y&֬'\ບບບບບບບບບບບZ&֬ 5+p\(7ȕ&&֬+q=Np=Np=Np=Np=Np=Np=Np=Np=Np=Y'W>WϔJ%RIS+J%RIT+J%RIT+\)ɗJ|$_*ɗJ[>\)K%RIT.KԮv+]A jWPԮƌAԒ:r6Ԯv+]A jWPt+(]A *WPTr+\A *WPT+\A *WPTr+\A *WPTr+\A *WPTp+(\A WPԭnu+[A VP~ZA VPTjU+ZA VPTjU+ZA VPTjU+ZA VPTH5*RT"ըH5* VPhE+(ZqPhE+(ZA VPhE+몠k]+ZA Vеtk]+ZA Vеtk]+ZA VеTjU+ZA VPTjU+ZA Vд4iM+hZA Vд4iM+hZA zVгg5+YA jVPԬf5+YA jVPԬf5+YA͊0Wa*8Y >V#W_*T\}R\}cF8ڬ*5jFͩujJmS;Ԃ:[TɃfLGH7g}Ƅ?v?{"pM=K̾Y*/YdJ+Y5O6<{B4kE5[-R-uXݻM<~N :oJƇd|(JJJJFe_effi~~~~~~~~~~~:uѯs:ǭs:ǭs:mpmp<Ghp 5k@^+zrG+跢ߊ~+跢ߊ~+跢߆nm趡ۆnoB_oߴͿT{{xW񔕵vubߴj9OXS;kj=`muցp ^_GE{1bR`hbsIQ3jNSVjI-%ucߵ`??@X ,ք@X4=M/1!>%4k=xN1g#z~R$o-@ $+%أ(dau5 RP\=ZuvO31JQ5k6)Mm lS`} S`ا6EVC(Sz'ZM ? N(pB PV= Lqwx3g&ӦpF3 QguSg=uSg=uփ T8A*pP@>*pT UG8Q*pT ᖒᖒᖒ͚Y]}3{' Ïõlj}3<-^66ƒXrKncm,%6ƒYr;Kng, e6e6V6~F7?d,E\W.C*%C*%C*5'4z&77TMw`-,et2:XFd,etNދNދN;DN;DN;fأO{j+ߓoq a)a)a)a)a)a)a)a)a)a)(Jޗ})//////////ѯЯЯЯЯЯЯЯЯЯЯЯЯЯЧhVmFӽ[όF}翟ef74CCpGf MePd MA'h3R2R2R2YnWs=3vnn ?lQ;MMpW|0ehoW5mr_/(%(%(%(%(nM54a_3m`י0$5_ F)F)F)F)F)F)F٬5k`J~R'$K4J4J4J94rFԞޮ~4J4J4J4J4fͬf#5(3R2R2R2R2R2R2R2R2R2R2R2R2R2R2R2R2R2R2R2R2R2R2Y+{]ixw53(%3'%3'%3'%3'%3'%3'%3'%3'%3'%3'%3'%3'%3'%3'%3'%3'%3'%3'%3'%3'%3'%3'%3'%3'%3'%3'%3'U 54Mr O=`5dGWn+۽}2j^脘F)F)F)F)F)F)F)F)F)F٬=4q'ȏLݝ̥̥̥̥̥̥̥̥̥̥lk])`:d:d:d:d:d:d:d:d:ddddddddddddddddddF9o> J)J)J)J)J)J)J)J)2)2٬PK@-P3R2R2R2R2R2R2Yy5S)%S)%S)}@͔JɔJɔfEPK@-5S,}@-PK@-PK@-g7A2*)}JkLŔLŔLŔLlVjAԒZyݻ{t䒛dʥdʥdddeV@;ށ=`0c,%c,%c,%c,%c+%c+V(J(J&6q^jE 5_~Q/jEFP)j8E 5SpNQ)ju 63mfۓ$'InOܞ$=Ir{$Iۓܴcƌ&11jԌSFmv48fԒZ MVf @@ Y^rr1Y^r7n ux m;[n'N @r;vf^A}6O @r?~f^A`  $7Hn(PЬ+g9+`ɝ; $wH,Y @rgɝ; $wH,Y @rgA}Ax׌DF/Ãlŵ1>S6*!=]jߋG']O6zlN fm $1Hnc Ar6m $1훰s!ncC1L6뿣Oƞ6YuC79NQg_9tCȿ̘5[1q:*[$84+^2g/aCrؐÆ&vO߷vK7f+!WBr^ ɽڦ-ZP%7tf Xtf ɐ#94h`(=s!G!G!G!GrhW?'cȑdȑdȑdȑdȑdȑr4x>J5+mfl+r!fTdTdTdTdTdTdTR6i8vgZ5w^wH `]<3Z6p$ 6F^@ Nrg0jߜhuYUt}ӧ~£{{nCRb%)vIʲ.IKR(vI]b4juAS☤8&K(F+ъbg%YIqVRg1r(F+ъb(F+ъb(F+jyS󊧦@)j @)j j'O<)j:J5%| ך⠦8yjS8RiMm3L8S)T3L8S)T3L8S)T3L8S)T3L8S)T3L8S)Tc<{r+vH( ik'WɎlx \B.J1R +J1R +J1R +J1#tj:K5% >RMgRqmk؉G)筭drr(8`qpYf23, KY,~S)ߔo7eMY6F.LK1R̴3-LK1R̴Et":eNYD,S)Et":eNYD,S)Et":eNYD,S)Et":eNYD5O{1}c6Fpx 6D1 yT? Po8?%ĚF[bG쉎(6@ Plb(6@ Plb(6@ Plb5@j PkZ5@j PkZx J@)9b)bSc*fc>?K(Qza腡^naQ#:b舡#:b舡#:b舡#:b舡#:b舡#:b舡#:bQzb艡'zb艡'zb艡'zb艡'zb艡'zb艡'zb艡'zb艡'zb艡'FnQb苡/Q;Fn菡?c菡?nzd葡Gzd葡Gzd葡Gzd葡Gzd葡Gzd葡Gzd葡Gzd葡Gzd葡Gzd葡Gzd葡Gzd葡Gzd葡GuQuSN:e蔡SN:e蔡SN:e蔡SN:e蔡SN:e蔡SN:eQze蕡W^ze蕡W^ze蕡W^zeѧ3tFe>ѧ3t{`=h ;;cgt쌎ѱ3:v{c㽱:[gtnѭ3t:[gt댷kn軡nVѪ3Zuo迡o迡o迡o迡3|=Cf ^ 3s9}>g|3ӌqݑ$RDH='"Dz"RODH='"Dz"RODH=Fx5«^jW#/r"Fx5«^jW#Fx5«^jW#Fx5«^jW#Fx5w]"|E.w]"|y0Oikچmkm-#Dgu2Jb*)Jb*яF1);78!*qJ,&gHl-#n&================ ~?O' ~?O'ވۉۉˉˉ#}H9w#HwFyt~u#}H_7ҷm#}H6ҷm#}H6҇a#}H6҇a%g\_"/M;DˇSW }LaBzÄ^%*W J;bOt|*W J9r^y{ %+SO? )SpN;%/9oɸJ_r󗜿%*qW8*p*p*QWWWWWWWWWW3~?~?qqqqqqg?g\q3q|uw~?q<<^D/a0K%L&z ^D/a0K%L&z ].ab0K%L&c X\,a.0K%b sX\l\+4'Gsk7 |b sX\,a.0K%b sX\,a.0K%b?ΓV*Q#|DT>ʇRP*C[V~_nUr˭r+ʯ:+ r+ʁ*rʁ*vjǫvjǫv~~~~~猜} } 58^x58^x58^x58^x㵎:^x㵎:^x㵎:^x㵎:^xu9^z^P{C\=sVΜ>u"[gX]+;Lj;rh繻G.><򱕳kE3ٝ>rکst3OX9n;}艵-K]+gVi/`kS;|禕yM+۩q~S+쬟Z?wɵu߉,mܹ6\JS~-eiM~2Y?udΥCƝK' ]i]f,#04O<Ӫ<ߏ&ߏ/7]9ss:vϺtK>!|3ɶgl{齎mϷ1Ϸϣ>mOٮ=ɶg۳w3+[DN+,3F:|kgSϞ[9}oɿ&w'wbS8q":?)-<}3+ٷ>7jX{A=?.smeё\[]M9tl}gۉ>)vuh5߹wya,Ӛ<<Ӻ<Ӻ<ߺ|u|[Ϸ.o]>ߺ|u|[Ϸ>o}>||[Ϸ>o}>||[Ϸ>o}>||}|X?=-/S"ۓl[i]fU]g/Cry57c>i.}r<($o{_AyIiÒ|5 !!))=_=VU>o 5g73ȟ ?ڐ?_߻(;ȧO_O}S'>|; 5o^U|l^%k|gWMy.y+g| 3.[,nx<<OyS Ey OAnrC-ʓȵ 7ݔ'ˑAr'>@ă+p@=ܽOG;l  ۔P/BQ/J U2#:Y(tɂf8GYwˋrN do5rs Zwꁃ:t\1A0ȁ1 DZod[}31{!YdעcAcW rr٢gl寿1=i endstream endobj 8 0 obj << /FontName /DejaVuSans /ItalicAngle 0 /FontFile2 7 0 R /Ascent 928 /Type /FontDescriptor /FontBBox [-1020.5078125 -356.4453125 1680.6640625 1166.50390625] /Descent -235 /Flags 32 /StemV 0 >> endobj 9 0 obj << /W [0 [600] 3 [317 400 459 837 636 950 779 274 390 390 500 837 317 360 317 336 636 636 636 636 636 636 636 636 636 636 336 336 837 837 837 530 1000 684 686 698 770 631 575 774 751 294 294 655 557 862 748 787 603 787 694 634 610 731 684 988 685 610 685 390 336 390 837 500 500 612 634 549 634 615 352 634 633 277 277 579 277 974 633 611 634 634 411 520 392 633 591 817 591 591 524 636 336 636 837 317 400 636 636 636 636 336 500 500 1000 471 611 837 360 1000 500 500 837 400 400 500 636 636 317 500 400 471 611 969 969 969 530 684 684 684 684 684 684 974 698 631 631 631 631 294 294 294 294 774 748 787 787 787 787 787 837 787 731 731 731 731 610 604 629 612 612 612 612 612 612 981 549 615 615 615 615 277 277 277 277 611 633 611 611 611 611 611 837 611 633 633 633 633 591 634 591 684 612 684 612 684 612 698 549 698 549 698 549 698 549 770 634 774 634 631 615 631 615 631 615 631 615 631 615 774 634 774 634 774 634 774 634 751 633 916 694 294 277 294 277 294 277 294 277 294 277 589 555 294 277 655 579 579 557 292 557 277 557 375 557 341 562 284 748 633 748 633 748 633 813 748 633 787 611 787 611 787 611 1069 1022 694 411 694 411 694 411 634 520 634 520 634 520 634 520 610 392 610 392 610 392 731 633 731 633 731 633 731 633 731 633 731 633 988 817 610 591 610 685 524 685 524 685 524 352 634 734 686 634 686 634 703 698 549 774 818 686 634 611 631 787 614 575 352 774 686 983 353 294 745 579 277 591 974 748 633 787 913 611 948 759 651 634 694 634 520 631 335 392 610 392 610 857 633 764 720 743 730 685 524 666 666 577 524 636 666 577 510 634 294 492 458 295 1421 1298 1154 835 786 456 931 923 797 684 612 294 277 787 611 731 633 731 633 731 633 731 633 731 633 615 684 612 684 612 974 981 774 634 774 634 655 579 787 611 787 611 666 577 277 1421 1298 1154 774 634 1112 682 748 633 684 612 974 981 787 611 684 612 684 612 631 615 631 615 294 277 294 277 787 611 787 611 694 411 694 411 731 633 731 633 634 520 610 392 626 521 751 633 735 837 698 610 685 524 684 612 631 615 787 611 787 611 787 611 787 611 610 591 474 842 477 277 998 998 684 698 549 557 610 520 524 603 479 686 731 684 631 615 294 277 781 634 694 411 610 591 600 634 634 634 549 549 634 696 615 615 819 540 531 775 664 277 695 634 629 595 595 633 633 633 277 338 371 395 487 278 706 974 974 974 645 642 633 611 857 728 659 414 414 413 411 410 530 530 603 603 520 335 335 461 335 392 392 633 617 598 591 817 591 610 524 524 577 577 510 510 510 510 787 579 664 708 653 291 666 506 727 510 510 1014 1057 1012 824 609 778 848 640 654 515 515 661 663 404 398 174 258 295 295 378 515 372 278 459 317 317 317 307 307 369 369 500 500 500 500 500 500 274 500 500 500 274 500 500 500 336 336 307 307 500 500 412 500 500 500 500 500 500 500 315 500 425 166 373 443 369 493 493 493 493 493 500 500 500 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 278 500 549 549 549 336 500 500 692 317 746 871 408 812 824 825 338 684 686 557 684 631 685 751 787 294 655 684 862 748 631 787 751 603 631 610 610 787 685 787 764 294 610 659 548 654 338 578 659 638 591 611 540 543 633 611 338 589 591 636 558 557 611 602 634 586 633 602 578 659 577 659 837 338 578 611 578 837 614 619 698 842 698 659 837 663 787 611 648 586 575 458 659 659 865 627 933 837 758 659 791 614 686 606 767 625 699 611 610 536 663 634 549 277 787 615 615 604 634 698 862 650 634 703 698 703 631 631 786 609 698 634 294 294 294 1093 1044 786 709 748 609 751 684 686 686 609 781 631 1077 641 748 748 709 751 862 751 787 751 603 698 610 609 860 685 776 685 1069 1093 832 882 686 698 1079 694 612 616 589 525 691 615 900 531 649 649 604 639 754 653 611 653 634 549 582 591 854 591 680 590 915 941 706 789 589 548 841 601 615 615 625 525 548 520 277 277 277 902 898 651 604 649 591 653 933 837 770 671 942 749 879 783 1159 1001 787 611 1026 824 636 540 856 876 787 611 781 665 781 665 992 904 953 758 1179 1027 933 837 698 549 502 0 0 0 0 417 417 772 676 686 589 603 634 609 525 674 590 624 529 1077 900 641 531 709 604 709 604 709 604 856 831 751 660 1014 876 1081 915 795 651 698 549 610 582 610 591 610 591 685 591 934 806 685 590 685 590 685 633 940 728 940 728 294 1077 900 655 604 775 670 751 660 776 680 685 590 887 774 277 684 612 684 612 974 981 631 615 787 615 787 615 1077 900 641 531 666 577 748 649 748 649 787 611 787 611 787 611 698 548 609 591 609 591 609 591 685 590 609 525 882 789 674 590 685 591 685 591 686 589 1005 896 974 869 678 588 1071 957 1112 967 774 659 772 710 614 540 751 639 787 634 988 817 1080 905 1081 912 866 731 882 882 731 643 681 731 850 882 731 557 823 986 731 707 643 882 776 882 731 840 731 731 731 790 643 882 731 882 634 731 731 799 860 790 787 634 307 317 500 500 391 526 500 974 633 761 766 633 696 533 633 700 696 633 403 894 640 633 633 634 701 633 659 277 759 515 633 452 974 515 768 633 695 973 633 634 501 973 647 611 628 762 336 433 0 0 0 0 0 0 0 0 0 0 0 0 0 0 360 0 294 0 0 294 441 0 628 608 447 593 639 272 374 639 648 272 591 556 599 639 658 272 441 699 562 639 604 520 581 662 591 808 657 470 454 470 415 644 322 0 317 530 470 277 277 482 277 782 277 941 523 941 941 645 645 645 445 445 482 482 1220 1220 1208 1208 924 924 596 596 292 1036 775 824 726 619 734 523 482 782 782 0 0 0 0 0 0 0 0 0 0 0 500 537 537 537 537 537 537 537 537 537 537 537 324 317 544 941 775 291 941 941 941 941 941 941 941 941 645 645 645 645 645 645 645 482 482 610 482 1036 1036 1036 895 895 726 734 645 482 782 782 523 537 537 537 537 537 537 537 537 537 537 636 636 636 636 636 636 636 636 636 636 277 571 423 591 653 653 593 653 828 437 437 558 611 350 958 472 783 653 625 733 529 724 472 625 593 529 529 522 593 593 0 0 0 0 0 0 0 0 0 313 313 560 560 360 651 670 683 687 482 627 683 687 669 641 645 655 658 625 625 745 766 686 686 701 687 683 649 632 703 818 632 683 787 632 0 539 539 0 0 0 0 0 0 0 0 663 375 657 459 547 491 673 0 0 0 0 0 0 636 640 640 670 625 625 703 670 673 676 1028 1028 840 690 641 759 590 685 789 811 466 564 789 792 584 837 750 688 810 584 584 836 836 645 604 584 595 584 721 794 584 566 584 668 798 542 664 542 564 673 507 508 533 784 522 517 508 797 507 518 1057 521 522 782 517 522 792 522 655 523 788 522 782 522 521 521 566 522 522 488 522 498 517 560 507 507 508 563 823 595 522 553 553 405 303 684 684 684 684 769 769 769 769 769 769 834 834 834 834 834 834 966 1006 966 1006 769 966 1006 966 1006 769 255 542 423 423 389 389 393 389 465 385 255 389 389 389 1089 908 953 1116 684 684 684 684 729 729 729 729 729 729 834 834 834 834 834 834 966 1006 966 1006 966 1006 966 1006 729 508 191 731 731 731 731 729 729 729 729 729 729 920 888 920 888 920 888 927 900 927 900 947 900 947 900 947 434 877 877 865 890 628 628 628 628 628 694 628 628 628 859 770 814 815 814 815 859 770 859 770 814 815 814 815 814 406 406 750 774 750 774 628 628 628 628 628 628 628 628 628 859 770 814 815 814 815 859 770 859 770 814 815 814 815 814 434 434 609 557 557 557 609 522 609 557 557 749 768 746 763 746 763 749 768 749 768 746 763 746 763 746 385 508 385 851 851 851 822 851 851 851 851 851 1069 1034 1059 851 1059 851 851 600 452 600 851 851 851 851 851 851 851 851 851 1069 1034 1059 1029 1059 1029 1069 1034 1069 1034 1083 1029 1083 1029 600 729 603 603 603 603 603 661 603 603 603 834 753 791 770 791 770 834 753 834 753 791 770 791 770 791 418 420 418 711 711 711 891 891 891 891 909 872 909 872 909 872 1140 1099 1140 1099 1140 1099 1140 1099 640 626 626 626 626 626 667 626 626 626 844 780 815 818 815 818 844 780 844 780 815 818 815 818 815 418 389 484 915 915 915 915 915 915 603 603 603 603 603 603 834 753 418 729 684 684 684 684 726 726 726 726 923 1006 508 731 731 731 731 731 731 729 729 729 729 947 900 508 830 830 830 830 830 830 830 563 751 484 1046 1046 1046 1046 1046 1046 1046 825 830 830 830 830 1259 1259 1259 1001 1001 1259 1259 699 1072 851 851 851 851 851 851 600 643 643 643 643 643 643 643 418 628 770 767 468 468 443 1046 1309 1632 1632 1375 1375 1632 1632 477 492 711 931 1150 1369 492 711 931 1149 1369 498 718 938 1158 1378 492 711 929 1149 1369 498 752 788 1204 1149 683 507 506 591 717 981 585 549 604 604 490 540 277 394 579 583 754 649 611 549 684 684 684 1022 611 611 524 601 601 582 574 736 947 637 591 817 524 525 583 591 563 524 590 639 430 613 432 484 397 397 487 473 185 185 413 350 543 471 471 495 439 379 437 384 460 622 391 391 405 647 428 405 416 416 360 359 405 178 425 623 408 413 370 413 413 428 294 404 469 623 416 401 372 385 415 363 178 258 404 416 401 372 411 415 363 634 473 371 277 405 370 370 413 360 296 232 405 404 261 249 260 261 234 249 234 376 623 623 410 479 408 413 413 360 286 294 507 418 361 406 416 366 436 366 392 413 0 0 0 0 0 0 684 612 686 634 686 634 686 634 698 549 770 634 770 634 770 634 770 634 770 634 631 615 631 615 631 615 631 615 631 615 575 352 774 634 751 633 751 633 751 633 751 633 751 633 294 277 294 277 655 579 655 579 655 579 557 287 557 287 557 277 557 277 862 974 862 974 862 974 748 633 748 633 748 633 748 633 787 611 787 611 787 611 787 611 603 634 603 634 694 411 694 411 694 411 694 411 634 520 634 520 634 520 634 520 634 520 610 392 610 392 610 392 610 392 731 633 731 633 731 633 731 633 731 633 684 591 684 591 988 817 988 817 988 817 988 817 988 817 685 591 685 591 610 591 685 524 685 524 685 524 633 392 817 591 612 352 611 684 612 684 612 684 612 684 612 684 612 684 612 684 612 684 612 684 612 684 612 684 612 684 612 631 615 631 615 631 615 631 615 631 615 631 615 631 615 631 615 294 277 294 277 787 611 787 611 787 611 787 611 787 611 787 611 787 611 913 611 913 611 913 611 913 611 913 611 731 633 731 633 857 633 857 633 857 633 857 633 857 633 610 591 610 591 610 591 610 591 659 659 659 659 659 659 659 659 684 684 877 877 769 801 708 742 540 540 540 540 540 540 710 710 965 974 898 927 633 633 633 633 633 633 633 633 836 835 1085 1088 1026 1050 933 946 338 338 338 338 338 338 338 338 379 374 634 634 570 599 489 492 611 611 611 611 611 611 804 848 1094 1099 938 970 578 578 578 578 578 578 578 578 783 997 1012 897 837 837 837 837 837 837 837 837 802 843 1089 1095 945 972 921 952 659 659 540 548 633 654 338 338 611 611 578 578 837 837 659 659 659 659 659 659 659 659 684 684 877 877 769 801 708 742 633 633 633 633 633 633 633 633 836 835 1085 1088 1026 1050 933 946 837 837 837 837 837 837 837 837 802 843 1089 1095 945 972 921 952 659 659 659 659 659 659 659 684 684 716 692 684 500 500 500 500 500 633 633 654 633 633 804 746 930 871 751 500 500 500 338 338 338 338 338 338 294 294 475 408 500 500 500 578 578 578 578 634 634 578 578 610 610 845 824 685 500 500 500 837 837 837 837 837 940 812 922 825 764 500 500 500 1000 500 1000 329 250 166 636 317 199 99 0 0 0 0 0 360 360 636 500 1000 1000 500 500 317 317 317 317 518 518 518 518 500 500 589 589 334 667 1000 317 0 0 0 0 0 199 1341 1735 227 373 520 227 373 520 338 399 399 837 485 530 500 803 803 250 1000 500 166 390 390 921 732 732 497 636 500 500 500 336 803 500 449 837 803 837 585 663 837 837 317 797 837 317 317 222 0 0 0 0 0 0 0 0 0 0 0 400 178 400 400 400 400 400 400 527 527 527 245 245 398 400 400 400 400 400 400 400 400 400 400 527 527 527 245 245 391 416 413 443 416 876 636 636 636 636 974 748 1272 1073 988 784 636 636 636 636 1272 636 636 636 636 773 641 0 0 0 0 0 0 0 1018 1018 698 1123 642 1018 1066 614 698 951 988 754 849 633 633 469 697 720 413 817 800 1040 1000 697 701 787 797 813 791 896 684 1019 1074 1000 684 744 577 764 764 616 338 655 684 786 703 854 591 605 786 575 1069 461 745 673 465 644 379 925 1193 702 727 654 848 810 774 557 557 610 818 708 615 351 351 779 526 969 969 969 969 969 969 969 969 969 969 969 969 567 294 492 689 922 684 922 1119 1316 917 685 933 1131 557 698 770 862 277 457 637 811 591 811 990 1170 818 591 822 1001 277 549 634 974 1245 770 1245 703 549 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 684 636 517 631 631 871 668 668 871 871 717 871 871 717 636 756 756 673 837 837 837 166 636 837 625 625 637 637 637 676 833 837 896 896 837 500 500 500 500 731 731 731 731 520 789 1057 520 789 1057 520 520 520 636 636 260 636 837 837 837 837 837 837 837 837 375 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 838 838 1000 1000 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 1046 1046 463 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 731 731 731 837 837 837 837 721 721 837 837 837 837 837 837 837 837 837 837 837 837 837 871 871 871 871 520 520 871 871 871 871 871 871 871 871 837 837 837 837 1000 1000 837 837 520 731 731 731 837 837 820 820 820 820 494 317 625 1000 1000 1000 1000 1000 837 732 732 837 837 1422 1422 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 1000 1000 1000 1000 1000 871 717 871 871 717 871 871 1000 871 717 871 717 871 602 602 634 837 837 837 837 488 390 390 390 390 808 808 808 808 837 513 1000 837 468 468 468 468 520 520 1152 1152 1414 1152 1443 1414 873 338 634 837 659 757 1152 873 500 500 500 500 500 500 500 500 500 500 500 500 750 750 750 750 750 750 750 520 837 944 873 769 634 634 896 896 896 896 896 896 896 896 896 896 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 769 769 769 769 769 769 769 769 769 769 769 769 769 769 769 769 769 769 769 769 769 769 769 769 769 769 769 769 769 769 769 769 944 944 944 944 944 944 944 944 944 944 677 677 944 944 550 550 769 769 769 769 501 501 769 769 501 501 769 769 769 769 501 501 769 769 501 501 769 769 769 769 769 872 494 872 872 872 872 872 872 872 872 872 872 872 526 526 791 970 970 970 387 387 387 387 872 872 769 769 769 769 589 944 944 944 944 944 769 769 769 1119 944 944 944 944 872 872 872 872 769 769 769 830 830 732 732 769 896 1000 896 896 896 896 896 572 895 896 888 888 671 1012 1245 1250 896 896 896 532 896 896 896 896 896 896 896 896 896 608 896 608 896 896 896 896 668 746 649 783 544 896 896 896 710 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 613 730 730 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 471 638 896 896 471 357 483 748 765 896 896 896 896 896 896 896 896 896 896 896 896 896 896 869 869 869 869 869 869 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 541 896 896 896 896 896 896 896 896 702 1003 1085 1143 901 837 837 837 837 837 837 837 837 837 837 843 837 730 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 896 896 896 896 896 896 837 837 837 322 322 538 538 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 896 896 896 896 896 896 896 896 896 896 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 494 495 495 390 390 556 556 837 837 837 837 1157 1433 1433 1433 1433 1433 1433 1433 1433 1433 1433 1433 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 732 837 837 837 837 683 683 733 733 837 1000 1000 1000 1000 1000 1000 1000 494 837 837 1000 1000 1000 1325 520 520 520 520 520 520 520 520 520 520 520 520 520 520 520 520 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 837 835 835 835 835 944 944 944 944 769 769 769 769 944 869 873 873 873 557 277 557 603 694 612 392 751 633 655 579 685 524 781 862 684 734 1127 961 591 654 567 659 414 490 174 430 646 887 887 682 683 635 561 684 684 631 631 682 874 685 490 685 887 887 300 626 751 655 527 685 644 631 502 952 778 748 620 294 778 294 751 632 887 887 751 320 749 887 887 698 767 685 698 622 684 751 631 788 566 788 515 530 530 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 896 634 520 353 338 1179 1027 1028 906 1079 841 493 493 493 493 493 751 633 877 709 490 520 1249 984 971 817 971 817 958 817 703 549 680 392 581 426 806 704 1357 1018 557 277 575 603 862 294 1199 976 976 611 688 629 629 966 966 686 860 1201 1201 1195 1186 1529 295 0 494 635 855 773 905 771 843 854 807 875 837 799 799 799 799 663 663 663 655 453 607 690 335 436 683 335 641 666 635 736 456 771 651 666 639 687 641 799 725 272 655 666 666 628 941 981 278 301 941 981 278 301 941 981 278 301 941 981 278 301 941 981 278 301 941 981 278 301 1036 1035 478 505 1036 1035 478 505 645 645 618 645 645 645 618 645 645 645 618 645 645 645 618 645 482 551 482 551 895 895 476 552 895 895 476 552 734 761 482 516 278 301 782 833 278 301 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 292 292 292 261 292 292 292 292 292 292 292 292 292 292 292 470 277 304 277 304 482 516 277 304 782 833 278 301 277 304 941 981 278 301 523 536 941 981 278 301 941 981 278 301 645 645 618 645 645 645 618 645 645 645 618 645 445 524 445 524 482 551 482 551 1220 1274 837 892 1220 1274 837 892 1208 1225 849 867 1208 1225 849 867 924 949 795 820 924 949 795 820 596 532 596 482 596 532 522 482 1036 1035 478 505 775 833 478 505 824 842 476 552 726 757 304 331 619 665 535 578 734 761 278 301 523 536 527 460 482 516 782 833 782 833 278 301 570 596 570 596 570 596 570 596 0 0 0 0 0 1025]] /BaseFont /DejaVuSans /Type /Font /CIDSystemInfo << /Registry /Ordering /Supplement 0 >> /CIDToGIDMap /Identity /Subtype /CIDFontType2 /FontDescriptor 8 0 R >> endobj 10 0 obj << /Filter /FlateDecode /Length 22239 /Length1 69319 >> stream x\˪dv.~]<.4s\Q60F$Nϯaʈ?32hG_7o/?s_ /?_~_7߿翞kO_}o/?|wϿJ쪻*jjWj\MWjz]Wj^WUru\eWו|E$_/WK|E$_/WK|E$_/WK|E,_/W|U,_/WU|U,_/WU|U,_/WU|U"_W+U|M"_+5|M"_+5|M"_+5|M*_5|]*_u|]*_u|]*_u|]&_ku|C&ߐ7k |C&ߐ7k |C&ߐ7k |C.ߐ7u^|D]W.+QJ{%u^|D]W.{% ^bCO!'ߐo7} >||CO!'ߐo7}M>||S%ߔo7[M|S%ߔo7[M|S%ߔo7[M|S%ߔoȷ{[=m||[G-#ߖoȷ{=m||[G-#ߖoʷ{^||GW#+ߑw{;^||GW#+ߑw;}]>||WO+'ߕw}]>||WO+'ߕʷ-|7_oWJ\ɷ+p%ߚ[+Jo-WJu\ɷ++vr%ߖ/ɷKm|[$ߖ/ɷKm|[$ߖ/ɷKm|[$ߖ/ɷK|G$ߑ/p 1B GÑ/p 1B GÑ/p 1B GÑ/p 1\B WÕ/p 1\B WÕ/p 1\B WÕ/p 1\B WÕ/p##1~+!_"%bH!_"%bH!_"%bH!_"%bH!_"%bH!_"%bH!_"%bH!_"%bH!_"%bH!_"%bH!_"%bH!_"%bH!_"%bH!_"%bH!_"%bH!_"!))))))))))))))))G>K|/=_z鑏#G>K|/=_z鑏#%K/_%K/_%K/_%K/_%K/_%K/_%K/_%K/_%K/_%K/_%K/_%K/_%K/_%K/_%K/_%K/_%K/_%K/_%K/_%K/_%K/_%K/_%K/_%K/_eK/_eK/_eK/_eK/_eK/_eK/_eK/_eK/_eK/_eK/_eK/_eK/_eK/_eK/_eK/_eK/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_2e/_fDNd2eW(_!2U+QBDO郍ڎ_S|`㿦6k;O'>郍>郍>郍>郍>郍>郍>郍>郍>郍>xfir&ir&!Ip㿮%4&zǛWxxU'߈Ǔo7xx<|j7>uڍOݧvS_n}j7O<|O<|O*5owx|5fVz|_Of =>)4*z|_r^={9x/~הsu*oש߈#Zh 7%0j7L} Ɗ\ao. #~o`5XoDcF4Xoğh,7߈# h,7߈# h,7߈# h,7߈# h,70j7̥ZZZ#߈7o#߈W9x0{jwH߉3;~'Ļw\#\W~';w#w#']>xCCƳ]ǝǝǽǽ'wXcNxNxNxN{ !:wv;?;gxwGv;+|+|+|;|;`}>xwv;;u_8/y)Kq`_R<_8/y)Kq`_R<*Y>*Y>*Y>^*E>^*E>^mz/^Ex5_3uE>C/>C/>COUxV[n/^UxV[n/^UxV[ޫ|>{/^Ux]W|*ޛ|>{gxo M>37|&3uM>S3uM>Ӿ7|&Oi߻|>{ϧ}]>Ӿw|.ۻ|ni˧ .&л|B.P)R_K?b/`_)6Rl _K1bc/`_}QH$>3'S>}gcOl )>sOOL]>#ا|&Q}UK)TK)_DKG>sg.̥#T3|R\?KG>sg.̥#T3|R\?KW>g_L+ITs'_I|W>gW>g_̳+yV嫑H>g?̳'yV3|&X`O>g?L' V3|fVEZd__֗|f]}NZ_֗|%;i}NZ_%Y_%Y_%Y_%Y_-Y-Y-Y-Yַ|-j}Z-j}Zַ|# ]?# ]?# ]?# ]?### ]?m?# ]?o?o֯|$ܯ|`QrW>{g_|_+y+y+y+y+Ǐ|>~#8|G>?QzƏ|3~䣞#gG=G>?QHQHQHQHQHQHQHQHQHQHQ{bp_=8/{bp_ ]7/vŮ~bo_ ]7/vŮ~bo_ ]7/vŮ~bo_ ]7/vŮ~bo_ ]7/vŮ~bo_ ]7/v}bo_l 7/v}bo_l 7/v}bo_l 7/v}bn_l mm7FK- k4FKbo_l 7Nbo_l 7N; k4N; k4N; k4I;b'q_$8/vNI;b'q_$8/B[b q_l!-8/B[b q_l!-8/;{bp_k$5I;b'q_$8/v5bCq_l( 8/6ņPbCq_#8/vŎ;bGp_#8/vŎ;bGp_71$ k3|3|O\_'S311/a&6؆0bf_lLm 3ړu={]O^דu={]O]3{]O^דbOg_Y{_L=ړ:kO?+Ϛ8o늓8o늓8o늓M'm$6ɟM'm$M'mtM'mtM'mmtF'mmtF'mmtF'mmtF'mmtF'mmtΑH>mtF'ms8'ms8'ms8'ms8'ms1'ms.+1'ms1'ms1'ms1'ms1'ms1'm[5[5[5{|8'ms8'ms8'ms8'ms8'm[[[[[[5[5[5[5G"4[5[5{'߈N>]qߎOC>;oNf俭=M俭=M俭=M俭=M俭=M俭=M俭=M俭=Mm:oNfm:oNfm:oNfm:oN6I&m$)ߊ)mn:oN榓N;DK-N;DK-N;DK-N;DK-N;DK-N;&XNt;DgNt;DgNt;DgNt;`M;&XN ;'D}N ;'D}N ;&XN ;.DN ;.DN ;.DN ;.Dصw]߉v'hw]߉v'hw]߉v'hwv.;Gxhΰ]Zzzslll^d%.ټwK6/]yl^d%.ټwK6/]yl^d%.ټwK6/]yl^d%.ټw;#|32G//]zy^^ߥ.wK//]zy^^ߥ.wK//]zy^^ߥ.wK//]D9/]yrs^圗.w99/]yrs^圗.w99/]yrs^圗.ټwK6/]yl^d%.ټwK6/]ywE"2/]ye^,e.˼wY2/]ye^,e W^啗.w K(/]ByP^%.w K(/#.w K(/]ByP^ߥ.w)/]xxxxO~O~O~O~ߟ+s%ï\?W2ϕ?_$ߟ+~J_"u%ѯ\I?Wϕ?W>zy_}壗^W>zy_}s}s}#lW>y_}#lO>O>O>y?䣞zO>y?䣞zO>y?ˑA#wG6l%ټK>y|d.]ͻ#wG6l%ټK>y|d.]ͻ#wG6l-ټ[>y|dnͻsGnQϻ壞wG=z-[>#{D#G>"z|D={#GD=G=GK=N=GR+_H򅤮|!+_򅁮|a+_򅁮|a+_89ߏ|9ߏ|9ߏ|9ߏ|9ߏ||?@ߏ| @ߏ| @ߏ| %K1Зc/@_$}I>| %KQϗ䣞/G=_z$|I7~ŗc/_-,[|Y>|leŗc/_-,[|Y>|le+Wc_=ȧ E|Ww"Lݿ"߉_7_GXmW񬏫xוg?W\yfsϕ?_?W\yֿs9ϕ?_!}U> iH_OC|)ɧ!}M> kiH_OC|Ӑ&54ɧ!}M> kiH_OC|Ӑ&54ɧ!}]> iH_\ ]>iO_O{|Ӟ.u˧=}]>iO_O{|7Ӟ! oȧ=}C>iOߐO{|7Ӟ! oȧ=}C>iOߐO{|7Ӟ)Moʧ=}S>}DߔO|7kxtZ<|-].nMZ<tOtO/6%㿤|tn_2%/L?K%S_Ґ>KIC/iH% 㿤!}4)ɔ㿤=}=_)hO=_)hO=_)hO=_)hO_) h,_2/~i?K%sڏ9ɜdN_2/~i?Kѥ/E]Rt)Kѥ/E]Rt)Kѥ/E]Rt)Kѥ/E]Rt)Kѥ/E]Rt)Kѥ/Edj_2/~Lm?K%Sۏdj_2/~Lm?K%Sۏ> d_2/~p?Kf%3܏ d_)z+%3܏>>).%}w_2]w%I3^4ɴw_2]L{%I^L{%ɴw_2]L{%ɴw_2]L{%ɴw_2]L{%>de_2 ^L%>d./ /K‹d./ /K‹d./9b_zeYg_zeYg_zeSeZh_feZh_feZh_feZh_feZh_feZh_feZh_feZh_feZh_feZh_feZh_feZh_feZh_feZh_feZh_feZh_6A^h_6A^MeZZMey_6A^)k_eZ)k_eZ)k_eZ)k_eZ)k_eZ)k_eZ)k_eZ)k_eZ)k_eZ)k_eZ)k_eZ)k_eZ)k_ٌz_6^ͨe3ٌz_6^ͨe3ٌz_6^,/2-/2-/2-/2-/2-/2-/2-/2-ˌ/3x2-ˌ/A/2x2-ˌ/3x2-ˌ/3x2-ˌ/3x2-T/H$-T/SLu2-T/L`2m/L`2m/L`2m/L`2m/L`2m/L`2m/L`2m/L`2m/B` m+B` m+B` m+B` m+B` m+BD m+D濒xQB= l+ԳxB6hAh3Ʋ |>77']'~|nn+>77ss_W|nn+>77ss_W|nn++~;x8_Ŀ/go7Yq8k|_5/goF7 q8at_0/N'n/?|_|7oM7ʼnDq8t_h/N4'nM7ʼnDq8t_h/N4'nM7ʼnDq8t_h/N4'nM7ʼnDq8t_h/N4'nM7ʼnDq8t_h/N4'nM7ʼnDq8t_h/N4߲/7nM7|q8t_o/7nM7|q8t_o/7߲/N;nN7iq8t_v/N;nN7iq8t_v/N;nN7iq8t_v/N;Ǿ/}_|>}7ocǾ/ZgnV7Yq8ku_/ZgnV7Yq8ku_/ZgncǾloggn3Z7qF8u_Ѻ/hgn3Z7qFfRsk&5Iῦqkῦqkῦqb qB8!_{/N='b qB8!_{/N='kkk8)fsk8)fsk8)fsk8)fsk8)fsk8;fskf:fs1;;;;;;9fNtkD9fNtkD͜_3':'kD-kD;kD9fNtkD9fNtkD9fNtkD9fNtkD9fNtkD9fNtkD9:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w:w::w:w:w:w:w:w:w:w:w:w/M_|6mŷ o8&p/M_u;_u;_] w28ep/_|.] w28ep/_|.] w28ep/_|.] .w\2epSNu:]Tw{YƳ.uש_.uש_.uש_'rlFvo`vo`voYuoYuoYuoYuoYuo _ YuoYuoYuoYuoYuoYuoYuoYuohVfuohVfuohVfuohVfuohVfuohVfuohVfuohVfuohVfuohVfuohVfuohVfuohVfuohVfuohVfuohVfuohVfuohV.uohOtohOtoDtox.x.x.iAFg&toh:soh:soh:soh:soh:soh:soh:soh:soh:soh:soh:soh:soh:soh:soh:soh:soh:soh:soh:soh:soh:soh:soh:soh:soh:soh:F4_oDF_o__חMF4toDMF4toDMF4toDMF4toD݆Ft&֗37L/ 07L/ 07L/ 3ssssst0e7L/ SÔ0e7L/ SÔ0e7L/ Sϔ0e7L/ SӔߌN3:-74e7ߌ3.h7M/MS3/h7ߌ3/h7ߌ3/h7ߌ3/h7ߌ3/h7moM?7o~~o7m1oN?7pۅ.~ov3ssssssssssssssssssssssssssssssss#G>|7o>|#G>|7o>|+W>|7_o|+W>|7_o|'O>|7?o~'O>|7?o~ssssssssssssssssssssssssssssssssOKw,mDQxUhf&X?{l$mkVˁ"W<Օ< .| .|:< ujnWͭ歹]Rj]U+ZW VUwU>w]~;뇻~;{Qw]Wu 끏o}hE#_.v׷F]4u>uUg MV*_y }^uUn MV*_7Y&duUn MV*_7Y&duUn MV*_7Y&duUn MV*_z$~%_7f݌Qu3JnF (%_7ߪ|zwU=tUO\yjwݺi[7 w݇'NiݺM[ w6n&߭unmݺM𿻺 𿻺 𿻺 [fYeVnU]]W^7]r=\;õ=\;õ=\;õ=\;õ=\;õ=:î=:î="Ǯ=:ç= :à=ߐRC oH )\! 7Z=㪞s꩗+<RC oH )\! 7L3i&ߐRC oH )\! 7p.ߐRC oH )\! 7p.ߐRC oH )\! 7p.ߐRC oH )\! 73Q oTg:ߨ=ݗ+wwac[#E>b[#E>b[#E>b98ll;ఱ6\a.ac1q8l |%>ac1qؘ8lL|6&>ac1 6 618lL|6&>]]x_WՅwu]t_W71wu]]q_WW?5Ym럚OMV&SYYhcccc```>myz>mϿJh>.oo3g0ߪ;[u|˷/En[})rzowUޑVyGn[owUޑVyGn[5U|n[5U|n[5um:33ggφt6|Slt6| =l<᫪jN|UU'7O|<~Ww;UN|U'6O|g=5YωjjjjjjO>6_n_n_̦g6>]8_t|{W134̦g67>iMlo|f|34̦g67>iM󍏵k7>֚|5?Xk~cZ󃏵8?>|6?8l~qaq~1C_|6m~c3j⫵[}~u?|ߺ>b^y+O>b^yOΗ>u^y3oO⫕W+兯V _֬oߚm[ֿkoZY5k-)wkrߚr-)wkrߚr-;Z o|j5jx:Un|UG7_U΍*WsʹUrn|U97_U΃*Wy||||U>R|Uԁ*uJRԁ*uJRԁ@|vrg >;9ȉ:Wa99[99[99[99[99[99[ٷȅϾE.|-ro }\[g">ٷȅϾE.|-ro }\ȅي\h>g+ځيvK\R'j>T;vK\R'j>T;ɥځO.|rR-ɥZK'jO.\>T |rR-ɥZKgloZ7r\)joʥr\)joʥr\)joʥrվiooʥr\)joʥr\)joʥr\)joʥr\)joʥ2Iiioo~ [[ߪꛜ^?vm>ǿo?>?1ׯ3?|E endstream endobj 11 0 obj << /BaseFont /DejaVuSans /ToUnicode 10 0 R /Type /Font /Subtype /Type0 /DescendantFonts [9 0 R] /Encoding /Identity-H >> endobj xref 0 12 0000000000 65535 f 0000000014 00000 n 0000000108 00000 n 0000000165 00000 n 0000000214 00000 n 0000005023 00000 n 0000005169 00000 n 0000005197 00000 n 0000332104 00000 n 0000332312 00000 n 0000352124 00000 n 0000374453 00000 n trailer << /Info 1 0 R /Size 12 /Root 3 0 R >> startxref 374590 %%EOFruby-prawn-1.0.0~rc2.orig/www/media/image.pdf0000644000000000000000000046433512114176157017564 0ustar rootroot%PDF-1.3 1 0 obj << /Creator /Producer >> endobj 2 0 obj << /Count 1 /Type /Pages /Kids [5 0 R] >> endobj 3 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 4 0 obj << /Length 146 >> stream 0.000 0.000 0.000 rg 0.000 0.000 0.000 RG q q 450.000 0 0 337.500 86.000 148.500 cm /I1 Do Q q 240.000 0 0 180.000 86.000 306.000 cm /I2 Do Q Q endstream endobj 5 0 obj << /Type /Page /Parent 2 0 R /ProcSet 6 0 R /MediaBox [0 0 792.0 612.0] /Contents 4 0 R /Resources << /XObject << /I1 7 0 R /I2 8 0 R >> >> >> endobj 6 0 obj [/ImageC] endobj 7 0 obj << /Length 79767 /Type /XObject /ColorSpace /DeviceRGB /BitsPerComponent 8 /Subtype /Image /Width 604 /Filter /DCTDecode /Height 453 >> stream JFIFHHC  !"$"$C\" G !1A"Qaq2#BR$3br%C4&ct2!1AQ"a2q3B#CR ?~i.,-:<S_/@͠"6$t"5Y co`,I# ybL;t1fqCk؍v~FiBQw|]bT\ 귮%%ۀ,p ua2Puc0_8o -k ѸƳTC,ѣޑpGXqJF:nv* /HjoA2)%AӱVrPMqz` m©BXme 85S8R8o`,n{o`h/@@-bxS#m$RX,4Oe jaɵkef2RJ0{j $|Aq/XU[E[\}>B6~˞PZ)dyS͗MGL4 k_˖A'0waVƳt3&MLkxGŌUKѺ*/`c-1.duJjR ž!iӱ##p$,bq~y+9M %A`}mK[9 !Nk9ER%>~JT%|rWbTHD5v5^[:fz+p6_ S1\OhI\HM3Nc%\]5i٣:,; 8jʀ~WcXף7X[1ǿ 1*m97UQPݯŔ'|`>!q(U&ی5Sɨ 5smVJ-6M2$zc$:QnahXwc5yGRYus)!6 A8)S!r!As` *|cF> w[aaԒ\YIN*BU-!C T%{l{byLsD}C͉*)`]][ 8,[q+H)(L>îǍO!'54q\KWӦ$jo|hMcLS%Lu'Oؚձ6[of-mIX@V1?=d~;\_eh% :k,4~+mrMu2I#P_U 4}$/VWɢ#2,X_Z{c)4@G\\T*]ÿŦ4rj(Eג[slhפ)5Dm$q=kQd%TZڏ偅n9ǣHJ:{HZj䁪$xفe'닑ۃyjlÛc'rAV E^_16Qs|u$s#=Hmn)3QFnhfxV'lRGjV7#&+ !h7L`ty"8NkwC}j¦w)錙\&8Ll}F +nm+e}CUAGQ xs-Ǐ#z؁K`A$ _bP66^؏'VPl#&q{v*[iŸ9|JO{鋂RFlr~Άc4LO(IdO(Q 8v[vIt_3t#ʠoaΩTasWM#z MBv LHX_snqRATŅ10 lO`(@$ֿXcV klvt(V݇㬾;X_PBX.T\ $xԀ,wI>p { 4 r9۶1N4! tbl9,R5c"ӜV,F[G\4Mݏ<,uJjEm"# H6A KOP6@Xm([Nj Tɪ@.П Nc0>4$b7<`93 -N Fs>Њ*#HaÍMk@ǙH´f i?j:KECb@6l=$uNfwCDqpo9 $AG$ʃO=3܃cq|d%J\$_̢Qg${4~hL7OfH ~==n::Nim \ -; [6 n,yoStRE\*4 ֥2 7󅜎FmGS;ӄK' Mb7a&):~tM,fWVF x& oٵd67~7 U U4S7v'Mk|$rS G ҳ^*neQv j>_޸ǑHٝe 낵IR՛ !}pe`xcFFgq =)氊A<ᑎ~GY&bN&1Kwp\T9c2W~F󺸉o#~LF9瑸0:JN@+dZNA;GUE_IGFGt;Im$_nl,̵D,]`ok`yl>dL ( ۶Okij~y҆W,Na{_an;aWR4Te>qj(3%I6"޽LHUs1H^hkC4R{uKVDt]콍ĵ4)]nAiIV w)+I´(LLC<6QiAPSTTAM{:Q#P 7!-+E@ۂkfi#xO$w܋\w:,ͣiDr.rPNݱx3~ST0Ԥ66nqm0#T >]"6o|UB Cr/'醥Zc$܆ }}:C3k-~H^"D1Rep"MHj.A.ݰb.fěo}LP]^[TƊ4P+$FE+)5j"ha+SS"'qZg3: kAsU 8j5ـ?)2lТH$cboX]*x[c#"IAR] ͔uBNXKRLl8Pw tPy1s_S:D˨:4#5(9, nc^8vAZXy9-R3Mű-1]+.Ab/4 3 FZEc*zU t~bO3;~X/I!vArl7' 3=IM t9$l Zk>Nf6΁E3(a!DYjo~y^*۹\Hje*kWRFYXkbdcKX ēao0س _a:eoԁp-y 7$qS4)@  uXr Z@X _Ssr"[rF-_ZʅB;h>nkߌC^Ab!{W̲ҡw^=#-M, Hݔmc+}qX\);࠺j81ZРV lR"ZR]vlF_]# 5Zvmr4Q &_ꉌ+Li5EЧ?:[WY? }Y^iIAH^]GdH{Ocoz:{VW\dcO2 ,-col}WEGOa_ umLWPdu׿G:;Yrs *E;x_!Kj{_b+(zj}}Is:crn5P8ӷ}gs⢖9qMfamDlG\"We CU45: A$w\p sZ 9hDPPH:@qY]<)cf'3Qx-hj(:cl=gJ#+ZJiY9lo83|+2w+tױ vguUg.X06vƽyUD 4!*H׳#+QIABU^4z@`C[cr;nH-hw-]PThaZFvhe{v/c1e8%]z@6q!MAFJ gꦢuT3Zqm7`̩tĎ~)$[U=C84܍'cV%ݪ]__:ȅUl bª.? q@*K =@8hVbE?,VP\hVk| ޖݐ 6Cyj1=L TƣQo11CCKzV/l[Z3>,/vX2yL+VBU3c~Rufl ˏc).p7QSPHU9 ʄ6j$0?~ڹw)\20_1_,hLnZI]^>}5lLS3j_{Zrdj&mNąq̓{]/ʂ:DoAm$9fj-.73g !"6E? 'Xkr>bIn{[[͔2ךeo7 na b#=$@Y[޻"GG˷cKbQ!k"YOh=Śyl S]mtP5u4</NߦPC2jHIbXǍ_%:녥/ȳASO2 +6'Le u*[9)CRm~a*VӚzYd9)ٓ + {n$4T07<fcW-h&yz*k؛Qbb1wdHjeIѥ~dSM$luL GbݻU\W\s ; amRg:v!OSVڎU8=LaPG8E$0dM Hؚԗ9_OXqEOlG-Bks|\k\?s <0OnIㄟ"hV4s!x|wȻ) HPV(FW~X:OYC7[G?CP pd(nX|dR@k[G,eEo|%F]9$osCcpj[e}%Eک?+QUDdV[-/Ŕ[ `,4~"M{-lHc=k{C2|jِ됨1`;7=)fUŒK  V);IRp}JBX8&6𱙋ԣ/<7[N0 5 c*O6@ ?5unv댳h넸Ro5*66ɏ)H^ IP˷k% 1IM ÌUv2ȑ`a𯝴gӵBun=PfS%tEPT3^]`Mk!k^1=6K6yZNJBeD{EkLjPV24jA"~7]&>VfJ# 4sm,o< 6JO!-hSߵ>{GJRAYЭP<_ tS_S6ņi[gT}w 8%xw :Xa3"}qj+̩X)?v VtH{}bb &O01"MQT YÌwao#ooԆX +/ \v7Ź/ j4ZHK`Qf̠vdܝFgB>a`N"UOxD A'܏51ű77u\F{I Nk)*R'mLql/ G@kWxb UD3%Eٔqak{^κd,G-5|Rӫ,ɣgͻĿyHVX{2\_-RD^${*!}P/MJ-M"cYL1̦@(<)ԩV{A) vxس@nx1R6(VQ66]?Z}G/AF&I"n;wqle]qQzMΛjob칩X#ԧ$ZHH"AH\jKL ,vl`j%2egy b#^?<x4q{{T%F` {f]dVÀɤ-"ƪo)j:ZQM4F=5SEH16*'8f@=H`TmuJq n޸Pǭ)K\_FyZ~VFيbQRHJ$AuE?k@}? QV VOb?]d[?)*![OlIj&O3c{nOl X+c1֐FJ臇åH]Wj'˞ "} +DC?24屳XA.W*qSH:-jW:lo٦9-ehLr=nY,S)#u!v8ixp߸Dj ̒yfMq5 hfV>XFY8bq)VJOP~c)Z* A,zPrmX,Ȋoa < $иB{N{{T$/!$(Tɹ;q^6#WhΥoa1h$~o+ko`4U}e5ф*HzJĜíu.زk̐o 5o(өiWөt? %8(ܟ֝2J51+ iЃ>`(D•1>@fe[_<@c711T鵬-R]oصT\}#\^4cqS\,NrGD-L"hay塇Ja#msm31F 5"Ȼ\{Ŭ9 vzxmȇ{qBc۶* o ²bX)2C-lVIFUQP{82icv@|ZJ +]Ar`8)%7QH -##5,{B0Py.4 8 nāaZ."OʼnX2: 9*Rŏ:).j Yek@>δ_s꘺29 qf``Mi4*;=4dkM y꺤&|*>m|G-Lec5tYe\̺nf*3έd~Y{m\sԣ+Y4%T)ԼqC6y\GAY3Ʈ 6GUx.Xn>`MYm+Bb}Hb9D*,-)FLjyꩢYE1 #n(O w,UϹ۟4ы)',5MY$G"&ܚ 疶ZXĚU;Ò,OۿkcR AeA> G)GKQT3!2 O [qKӈ ,KWˤG(.ۋn=_-{YԋWeưHoO@~r>5TUeW!7cj3Z:BXz^ߝr'aeԣ*L4kpA[ڧ2h+DYK~y$%<4YKQjykms1dZ<dE+OQAqI֮ MuU#ovj^KiAA#`gRfZʱ-zc~bU|T%UEMT7v _VAMU  X0PlBհN}i̒0nߐ}xĝN^a_G$VE7یd4s~Dqo\R'M5IVXukmbsjAbJ75E_s[3Y"K$V`Q%Z1F4ܐjٖǡrէOЌ~4oiNIb4&Q:}%7pr <$I@}LZ+'XsL)a7))5 np=M=-L(D2D42n؛-UIFX`u"7@6|C+^d6#Cj-6B񨱎@Froh~MV*,:$EصGtK \iѓCLz#3fVSrcl GC.ZB;l! 7 y8a̋,_S[ثQH3sA`ʰ{n7hPro`N# b=G1D-09դ:t5VyU%Bag$I/i4lxC~_zc*z<8]fsJL5[8'ѓU#܅ł;X0O2uڽl>rE ,f}s SLuwV3Ig-˪i*Zj7 K8_[}qQRM1O»^w9Frl'C$S/gA]H S."\m3֏>JDkmm d5bh`6^b5qmfP IBnm?\4ݫBES٫RAaBtʒ؆83$.tOٽG'K&) `i>m;kv8չu&sNWA R5m=dd퇘jy!,X_"}zG:4$0!VSbƮغ&ɳ^JJjD7#w{Qӕ)3. >W^pe@H(I'+L'T](:e5 VTj{]tqRGalL4f4DV /OTȡgO)(ߞ5 3iasl0qL/7U~G鋹~_+Ƶ þ?tlHD "钘O4oA7 ðH 9x؁gb#NCf7 R 7ÐMAvE4gYw34O1fmZTXYAM| 1 mYΝ1" tͿUjSSDn16;C~bZb+l;'? [#b(hN/c,B߆Đ1ʯlDԨ o+ՒX-Vu6>q7nw[3~.Zֿ&O6_bQcl^X{.} 3"fhYP6[ ^ T,YWU N ^`l&_#V4pfR&hs8fҹMc\,};Q?%)i aoxUEeQZQa7 moQ֔G"]l`ɧ\A?V7mRg]:͜`qg];Cg/̺5+ZrQ5kX9R}/wx&zHjpܩ67."'^)8*K, ̄Dsk/HQp̛ b2'.~%&a WRUY$T,lO tTO녗)*aXc$<II4oiMоmH/f$8EL]BIivbrK.qQKU{4Dyo|i),e*V#.>;T!㟷8&y.n9JT夞8m>9OU$2F=7u tt2K$,V;k kryJiDnp76aW$OSH-ۑ﵏ s6]CNYi*m:{FpeCiS|zw Aဳnx5;=BUb6(eGWGZ2Ң}cTr2,m;OEu.{UDs 5hd)ϒ>s#d] mZk/5E#L-c_ =3,0>_ŬJ]u$ 'a{q+3 ga'QS}lqt$/1=d5,?‘M<,u5E .yD%3hd Xb 9$0CQJCK)%,ůIh8F\\#ms# h5lI ̮T%"K]Hmzʺ4zwwG'Kb^-~A<bQzg-In=qE*RR/58X݃n{b X2F]u1 ^tGT A== Xvk$}1[)M:\c0ꦧ_'᠒ %hI׏UMq_WB=7bdZi(z:xXX- {#dЫVICSqoLF2% QŊ an7W,w O8d#V-gϩ./11錻#NveM._+$9xቚrMLDtRqdugDcjyW 3>4P, t$yc#',V3,5hiWLQz1^sC (9 uTLG.e=_&BMT3:Ot(Y̠s,lIpcA#@huBvKg1R^u|'I@3H($Ipr~X= \$µ}GtnVZih]հ-F%?Rn#",۾zZx(sN3k~It$7x?wS`l,V?gZA`$#96a])VO!S<j\G*GOI8Z@um lO\W ڙdKl-h+Ί!gfuy,-ckfck!Ck۷F ։^5-&/uf|7ch ?+=*XRť nEńyԑp{`-4*hGc&ز VB" <C1d#j"Qۏ623K1vU}FDNxlq䨯7m( ZYfzwavq#Uf0>!A ˢ?*3@M3KG%,sz8ʉc:}r̛6́o}#QE21T07TLAc;'R jYx;^vS*e̿c<*7bDʕ_b,%Ij^*Ѷ-.wR> U?f.i0MʲkZŻҹ}I&qWgS%Ԣ_k8r<+AF-׳ hid o Rw=CQaƔ_PrbF:r ;g2:*n2'dC!} xmony'l5QgTYvkUQT821 `4Z[vsN1ci2ꇭjzu;U]9T yuT7:>9_-TN"i#,1uGY-RIQeP0j]pw-җY<] gmDrAS5"VnFwQS@da? oihjr֪Rͯk}_hռ>eC%:F q}%g|EYcDhbn=WOWMRƲKkl"U噽2C6d]q~tIRN Gָ.ܕ5uN` ;c;l箞vb 7VE;t-E$ItlQh=jE$tZeuFe!bR7QB0UɄIs#G= qgc% qqƳ|%9rb/VnEG[n1O"*&'ʫ!n7w|7߂VZQVPR,Ⱦd*XXp> U$EXKPNeYnR6kIh?'Kvv QdYM k 1a⚅*$RLGkC"X(Zc=@}\`Q9RS,G]~b?'l0qs3*0,"mccv^L#eLR2> p~촨Krw߾rxZ(^׼`7T]lqƏAA=,!_D8pψT5Öw8BHLq\; w`Ova, G\ɢE8VF1;-pӚJg2=8[G>m_vh˺.+gk[Opd*=3Juj=3FFqn1xD\v Cdm$ O1Ďoo\NS0$r,{+v;lxKj6G#q V*2H*8b#s۸ꨪM]~#9zNY%P,ٮw|f2٩+":XP{\r֒v)y X؋82xҏGt3FJ˲E[P@n_شNJaG,}Lt 03%u7K\drE,%y\Ƣ T!/m{%6,#4Y)ą٣]Mj:Lb8qM$f :dpnJ9o?FRPtd(ϏEGVNPm{=tKNKQI+$o_ /[oWZ BujK:i^iKezHR4F&ӮNonA=._#+65l.Eͱͧ`u< Nf|eA|*{̺JF\P@p˱F$O0 S|@9oC "c{ܐoCvSxK^_0' ԙ]G*kd$ ؟rJJݤju f g *D&CVETٵ3RyHtTɷb1eYGSC=; Ag==N) 'n ZbqY,.eWRxt jPl'ʡi1sr,ۧ+3 SQ=@Vc8ǨiDz8ōi7O\QDrsc '˦GwS7C1i&ITnO X9xeuj۰[؟|IU&_Zl+辆fcApHFrΔxUjezےQpʀŬeZ*( lŁ gy#p=7ƴҳ ic$Ԏv-ֳk/j*xbȥ$.5ci(Xie&ʃql9ٲÛq_W.xdԊ lk{WpJJζ0LeBR{j+T?s4Ɩ$tpBlp8;΁o:}= jqOrEu $>@j!=>oKb l`H9&eb('v7߮ S0ٶ<rhji!~"o{OlwLCFbcb=8q,RoH^´3 "-ii!wEB 6޸ MX ´ZO&o͡2k`:G:,>G#XULv,˩MŷP<:/1(JDK,/ -`DBic 2+/!; +ocDsGQf+2 .JH_F.'D|\?EXY齯+2]]*fm!OVʺC2_q}#RWmT+Ymu3_})>_6ZX67Sd1ueKm* 9e%j6Up딐VWVKRtGE2<]:2DV| VBG\sڴtb̢ =GOXfȺgg*i5Hs(P#u<r8?hD<8\9fǕ֍wT"F l ";k("\4/ ]MHцa:SovsJM_efmI&q^eG%ʫk\fEyP(iV-2I90rR$oNR7I%2'#luR4bBv`LD,Ml0J+*l3I"J\ziZ`A&K#-G \|9T,hd@ְZa}TQ|2t*o#A, վ+|P. {qĕ-,š$Z 697yUeAe[$XO) # 5Pjk6$l2Lj=>LW?{}4&ޙWeRgt =;Flw6"mofKEzIj\opR)@7#E)kv8˜81{+c"K ڕةqZVVu9>}KoDf pǽ5E -<˪M:O:3t7#.is#ePe% qb7x,¦xiVf$ mɷ6\ڗ9s9)ZǥFpM߃UxfzQM-4 O/m[vVWXmM6v86m"(Y.F!_)z_5FYѴ6q߶rdgZPSrvNbsa\J_2Չ%c'PZ龥H rdY(I}@>_2#3-Km>'2-CONXӽW7te:RZJF*JѣT);zX茊 ٲ`6o\9*劎oqp7#^WӔHNYB\ ۸'cqyJ5fXg9u ULb_r}k| lQb/f?҂*zHs `fo{ F:*˦ Mbx&_a~=1,QD>8k%%?m(vN|ȌJ?| -˧3;RۏT7 S|nY IoRklp\[<&y|R} aCX+l-Hqm"#|u]KUE@cas(%dI r^q9[}7#i*:\-eEZ ,trt}VW$PH(CjA~1_=QKSoZv$~GoY@$S *EG$Lo}%Sc>b9z*̲HTc>7g-vOG=2џ놊/ySSEC/ \?,zf攈gήL/%3茍n;瞞jQ,V|U@$35X*{X]^\ֱmMj> [lNRLuP}6IXPHMc?|#X A ec(hÄl^ 7n KKEHT544l v v_GO9(-[>} ZX*jb ŬzR1zNRyƧ䦨5+ Zpoè29 -4iiqakcFv B̏G҆DP{[tOVѭE=~o68&6{v 4i4{nq6fumhʥI _l 1DY$^&0 Ge+lo=.& w6]k2[AYBo2T$Umcmb; [ iN3 y7PF˦`Ӈgu[zq暲55]*J1L͠lCͷ˙HѺػ-HL[30Č(] kl7B)2X2&ll5Y_Ε^*+3GLKb"\X\z} 8cijjuWIME5lL!.J3h%YzrY<]0O,zǭcT:(CE^亁qJP>a#fH[-t)l{}UJRŘR#~ԲY;P2ֵD,# >q_O_KIY#\6fT&0"%`,r~Ş+Y߳B:#)}Mw.Tc1̞p2`?lǗ33.E\149igJʋim%,i3h<ߧ&omR!_,^$LpF6<'WdIDXc¬z.hL:IK Ud^Ą }'9 `pW6AES>kB)"tpIm&̲.4CT' vILSa~)M]k\[ &kA=``=TRXUs*]THݨޝK` ((h9A r*KKal$peZUAQi$zu cko|} Գ^?]V|$Nl ³UC:Fi*/{"j U2xuS ~W2 UDx;)AUb LH /p=W%.,'qmkoQ-d&jfW(ܝ큹OXSFDdӱL|0Yӫ3HFèvĥ1F| `)b,3FCxO_n09zf2AGQ^Si!'nI${qu m]JmW% .^] 7%y(HR8m m",%z<ȯ~lfS*%H؀O; QPU ɳ0:I TgȐ<,NUo6◱.ù&aj*6葮f/x:C}U?ǵqՕMS5VMb-q붦꺊./ եg*M'6@e.m,ٛŘ.%+EI7jO1ڜQ GEܒ[>n)˦AIbۂ@>c!˳(:*0[4ƐDSmaJ?*]@3d0\ Knv;~z5ϧ頴êZԺfߓLˠs2٪ 5p0Ɵ*zS*ɪm]QW3Z 9;CqOFtXd5z c.|E&o p1M5Ś-Ld[rH9ӝ-eYqJo;0.{ >GYHc5>#$H叹ǥy>G˯ÛO򼖙Dt Eʴfvr\CPj_'x 6[sNp*y ^l6zKcqNIm{(?ܮGNlR뵸+IO8ەU8)G 1Fg7gر{c_n_O<{{aӧh" &tV #,& _P8m6R} ƉSQxUcP6,<+вC_bmHU 1 *G[ۛ ^WҶ¶cХ1{k~2{{bdp@6R#nEVQ,-<%͠Yj #q)G0=䥜 ,#ߖ ?:GM0<2P_'  }+J]/ЁL'̪gSVX`XtmVz+A220VF,xċ bWbdEa NϤzF& #1G-DNo5kMtaJTJYAƷOtٗYR-r8$-ⶢAR=})eYze46%~Vy>N[5)z:Y?&qov/5ugH&#RN>ڠyq~)0R+?f5Boj[)+&|f]R5&gCOYN4a=u 4TKu$m K2g<&7'+:"K#c]gfJri;<ϊ=vl)s!w'1%[{c:Fz-Q{Ĥ6Vx- gh$QkO&͛)VkknTwmC2jVSYjV9%^jϚ@%_\"=AKa 5S^ cSZ 3\bp<1&` 6ҽmJI^be,A.Ki1=ʲmuvcSWVx h`pwl WI+!R>qd3WXFԕk(c{U,kQO,~.^r[,sG[G8SsM*(kN*RQk?~P)RZČ6-n?6̇6HFsc6''3(ar7M|>jתuQhb]돤CD(2:_U:1#,=YJW堐K1GHnދ+R#'i>]?)MLB|5@rXU!+b텰ѾVzJ2ޜEUү(Q]z˯zV5uT7DBʀT}-w% iv؋n#XE]4aEk*_e--~r+s$*"V![l 79]! i=-}h3Z啼Gܴ6Œ,K*ԣlP)e#gg(?~ q~d|,ՔUDᕣQΛvL˩rL"ZZin;xr-+% M IC%}5E%^̱R\/N&l|%d:v{M岟4jSri?Qac+IC244J$qk ʐ6̷,۩"壏J* ~bͤ8hs8*c{}WoGngG#k[=/IOvxHqp67 W^bM4RB@F>GAPsJwnb{F%8h>QU5"g mWXO :ƛǡ#>[I?C8cd!0Y}8":M26IR,s,jJ+<^dy_TTPb,¥e1.{Rt=C Ue8$\0 ~ ҐT =->cfHHxA$wGo `9Stz-lypsN&M9W6A+(=m3QTqDT%ntOSt#UOW# ZXej*'Z=uATo $8xϩrN[VIV"Qvݘ`qum>a6g(6Ko0uQ,Xe^7)1(h) *["Xy'sk[Iûi8js*yc^%v ,oa}ǥ#iydHKʭ\0Fx \c4xZ_Y$=:l#R3BK>M-1UN`K$H9l95<I-ez#va`q,dϏg^^nuHa6Q;-y\ B( ZݰӟnSN*~[0Tг Zk2DMվ`\U!v/1 TU<P[S7ltQxZo# )9JI]O ث j$ajq/{s1)"0?Ӓfener\~+zy$J7ȷqr85y̙U}<Եb)c*؂|99ZL4‡rlge_shTELV`8Im$K]6{A_kLHERl>FC/۬ڄX<(ESo] 1֜lBLJ6 +iZ$0Q 6< ^}Eű%/E)Yt|ӴSξ2L?iy3\{HZicq7EuԚN`D ַ}mH #z<)Zܝ'jZYZ6ᅈ޸(㐀LS)O{?ęvs i"ҙ)$J *XF\+N@kKEJM"rpEen!Yb<-U6O)?^0\Z@l#u[1c,8ESK:%7oL# Z2GmQ:5 Nɪ @ 򕿱&4ꄉ{SJ :60> #ߐƭ? keV,O׶98.Okd9VUv6=BJ*Ă2&OXA;`[6Q l3Yu,94(*y&>gZ!87Bx`Л۾ٱt1> 26 5M0JTK5פ3Z h~‚0l** /%}Pt=?ĸ%d%3Ī4ka /kJ 0:; @LwZculJpc̣X /um$H^r.l1D.'Ъp okm>\VfK?1g0q_TUŪ/ 5X!]>68PeTu)V**r9gI;ql2J%O_mY{aO15B?b+F}؜}Q_YkpRf4RUS4s! (eu8MHU?Q!$A%oS#ɓf* d<0e^]Ո`TO%Ciwd? d-t+Znl?[olr"zG\qRs!f n;{bU MQ5 .YSUN˥A{7]9ϖK Ta6|wD)r梍%@ڡwI;Xy9^FUBQGO"ąE,m7oϗp&~1¬i(#Ma'> sJ,hy>v'}0<*#twaxQ(V'-Z_.7kN]ѹS )^_Ⱥ LQU MB|}?UV|m؅K˥>ULRٓMrmo_Kao:%J]y@2B{dw&hɽA7p>G)ҽ4˥qu/1sK0T{Yי߉6t&}+QEj8L9c%UKq\q Sdk~ & %,ܗ?0V*s\9̧񪕎ll> YW0m2z0qK~O[Ot 1tЎLKv#qVF-ŌN(aLRu4BSL[{b4Km62`,a/sEES[>骟 9j)fU$qQl#%F܎@Ѯ,M{nVUaYb># $7nG)t5̎fRV M| SC} ,"1OV vZjiKm32tow U&F8bM$o.Dn;Ic0 o#_r U:{>A,PJ@6Ћ!]e`$7q81izOO ,s޸V2~#7Ng4bH2n0 zT:)zc/Wxg&2a틹^D30kreYjfį0 ao8;:.m BݙaRV x*K B, żî!heGQe 8>"ufs~WIxC˪'fPNWYr5Sat5\DaqLMUwDv uM$f*85oYDm&a-V˓d⌔P:dY7 X,}c<^,Σ1̪9&y4c@|v!bYcA5\2KX=7I8`j(礮\M<$8)id}Ae]}%hv`;F!1[M #CvmM/Xc򦍣-_  %Fbt 2ltZPð鉟0VRO8ˢ-)#6\t%llp"QZ}a5)Sqp[Q#0̩ir {coy_VTEC4$ZݣBB"-1I)%|6muTI*g}M0B҆9zUH#e[~+` +#kadcfjj&Ij$2?eOA6Z6*.| ~&Fr,xG)_׌n.:$ݒKYQ$lV>1ڔzɒ).#\~}MfYH`S3*REX2t=mDU-=e\j#?Y+_myX}wr#o*Av+~S3\.\}Nts QH,f=EOI#%06no s~iYm7'X*૨V<:IѬͶj,QiAblu,ٸQZ wm=HAR#3ܖ:[{6OlX)Q |cubo؎v0.=c?C)q?s%"yb!I<O2wVGӅH3F)=2OgՔ]ME/T "0*| sh*"iX} P6$[(Uf(vYxD0/p #z * ZDɻZޟ\r(;Fyj%^-RJWQJ-<念\*I|P%#4fX܀68NXZRD>./c 8+$ү-q鷦\Ea Rv$r;9Q%, V|ERnd$odIh5z 3 EX8aRfUyQ1[[sOTiX|hsZѳ`.G|R0u:uV ̍am< c:~)[JyOayyYu!MΕ0qkϙunj@<Me FGo|bgЅ_ Ϲ NZI)AM]/Rt1ܷ}YzȎ F/p@#뙪0̠+ -lAMS'v=at1IF yq+"HH}=Nhke v!̫Y [^E6M|%F ճs|(b{,}nb'rr,5gҴYH@{e|ͮ-0,sj*id2D Sh+Ꭴ|A+;W6?\YEс; i *`-)#A_ f{ ,JaIu~$q`0:if 'F,幪S:2{K筩"n; nZ6 Ϟe Jr9823I2Hb XET5P9O o8ml2rXcw6َ֙6MԔzKUVc2xG[%. Ea*,*%|ٯ* -qs.jlÑ9Te˪Җv5I~ t)Tme b0|-SV)x&&>3!%i*#{ LRtOЉ\¦!֞K-|Za/ZoJp#DȹK!ddu 8򳡾-7LVE-5<,4vۛXwy1ӏ@;u謟 ȍ4AFyXiRlaCuuYd=3 T>Yn[*c'TbN}OSҙUE Cl?\vC{4*2<+}ǮK1ҐLKw7# WĞ7,MzJ5R>Rd]q>]$G<:;j"STU7URE.2iiB h]@O/͗N򴰨efBP ێI ZX0q{+5 KD6\:xq/P.Gk%1Ra32414rJ:nƞ)6mSOb`|# ~w}Py#vȳ9y]b@6YLuJQ}H%`7܋oͭ:o4> x̕*4mg&QAKRYU[}NpRPdf\΂Jhw,͹8tUW@fhv;w8trQ+ibz5V{Z޸7ʬ+ mAkkbpn9DX#+e#X_|1S9p#q:SU۲T%eΙX0&H 3|WO cJKDsE:LdE@+<2, ;k*/9u9j9MR1R̲*:|vgǻ(5i4%|_Gjl 743_eo?|QMʓǦXd'4Lz:HO㍊nN,3[4ӍL}m|/|IMr2!%BrOW/*3(>ͷb{N3䭜44Bv\S4FT6YT4[bE#X ʈԋ'oQlHen;[YO!1* Z}:AA܍1ia SD0#QY̶>i<ʊ4ǡJ @7?l7ٯdi H1&GOΑ!sk[l~R]BѺ79DomNj(Xi򾟍A\qՙtt$m1رWRV0V(le=y 6uec WcLQD`SI>:Q~W#'m)E+{FwoBp]Ǚl7|XAtœCֲZ߅si;tNst:))ΘHfȫ(|;wؐM2ܢB3iNI(sU܂x8S$L߻*ɵ Bj$ C,0`;.a5ű01{'6k}CjMa 1jjZhLͤHCI*\;Jd@|&oIم=~`IGN*ܬJ.~g42 :$ǩcaƲ,v@u͖Nj6Emu}I5zHHPI۾OmEXmf XXq#ĆFV Nۏ>)PPRa _퉲4šW&aߦ3br"}I C,lф 6ǨJ;Eb_ ֭?L{Ο2Ʈ72X {Ǧ-B!m ^;a301t/ hdwObgwQV%ZXz]9MJ)hoW~{c4Ĕ^pcQA~{>ofH\=1ҤzA4D(#  c[Ioo;(IY$89-HP5\#3Z[0N\aolO yoA'+kRdaIb53.o|e9B Zh )u+#(G dpzyEBoߟ JjfUg[3i!\9@'sƶjG 'Qtlk:,JlÖ{("s"ڒc9GG2y Tpgy ͈<*&KDk a8~\ 3 O)Y5TB䙁d+&xAu&#s3Ik+,; ]UQ-=% 4(.Xo`1>7i1i$@M˿",>XXyA'5>Cֹ>g͓E)P*Vډp($cqqcb9}gԹVC<" ,*U4ص k0%X=_7vU(MO `or/ǓNAgbЇ)r\tM#,A}Ϧ VJ]Cq86W-Lj*S>شxGh,ݞ2itحJsT+m=-,[[blaC{Ml/QMɧYk8PTEo.-7jm%ܱ$ܷEM Fde^sDZh Z5$hslKR`@5}L/Gu[-4jEG"#,IZhȉdBܑ"UT3;&o1 ܲ+PVPֲ6o5Qy5ΓaoO?MgC3ba:<,i>T2-a R'Ȣ"'.9G|&1zm0Ixzq̮ 4YVcjw6,v Ǯ A)X`\MYr[Y8kkp0N(cKssMPx0UnV!}pڕ4U,-`:R^<8[$UfK=ĉko;$.w"I $7Br4ĔB+T5Ols +Y{1zUt_,_aP |XZqb JcdR$RE>M0KM剙լ$_}|=dpQ‹!}6% N1}a12c`uEl<."GKD'l֨}D RZ|G{c)i@7[ϳ*Һra2 9́YЃFmwyOrwL"d2᢭HlEoq4S6ՊUACK+ؔun瑊JYpc!RmmoKR*OV܋qk:uЛThPB:סZ `w!Q2Yig]Q$ֱٯ܁1R%eɠ`=z4 D ͵^qZXichBIkX'l49c+\d@ w> @S))2|QpŜ`bcXؚ7dn7*(T"HF`PId2 o.t@A/`3dv =9]vܟN67>W=(A'ؾf>LW,i[q@|M{cυCIxѕm c?9#bN /ChFK&Kי_$e<-$?Ku M"b/1b6_=4a&Iu0C/ꌢ5u} 3o{qi-} 32orUQ+89Jԩ؍5z+5Qx}m{;{c,{Cc&]j20 x7A#E5=Q;D5[.vOI4.+aX2*< x&E mn3rܯ24مS呀2v7v2?K[G<fGISEN/,v|YC*k1:۱8:wS&e!g)6;lxdYyXH[}n=qXftBxeMVKQ$Jak&p{2PEM?"k ;mstc ')3\ RW| ooלCI?ʨ'hd1IZTvǩ:!pa؃߷?>PH+wkp; oom/V%G 1{]gRN_RِRmB>j57v=qi˨ji\*e{"CkK{n,qul=Q%-Rԏ86[H?SR&ы%ZȪbkac&J=4ż8` T ]1r Uu A7T`Ft~} ]eVMf N*Y#b=M7ߛ w$V~5 si*I@ WT`YO}clRX(z|fۀAl3TT< Zq4RUAĮ`,pfXPS@*hʮh%E ѪF%B) %EL YR)o|3S|][nߥⴧO;Oe}qx&oa>2="܊;spEM-/fZhQj'\S aVSm,kk\ziv +R I)#ʒqt˹j,4N~w&K!BۜG8Pˍ7EX=Z"浌፹>5K#M|rL۰釳Qu2dﱵL`RWM< þOg+9 $[ʌwʼ+ZtD.4DNژ?d[Ekfi-`m5LUӠ1% 9{(ezIEh_Z.6*#mA {VL.gt{_m)W+TYh KG GaQ2|-ʣsk&a-/ qQWIWVB6H_ unmS-dض튯%\HM{7C%Nk tܟ~158vX6Gx Zz<5L2ȭ1/e2^`ěY'TD+h{osߖ2UF!Qr9#f#\i+2ѱe"2j6`Qasm~:@]CʈXW Y\ ;f.m"8 ();b4چI%Zdk s|\9)[%^[J;!̆MHW^I Mk wa$몲)`RgI*gw`-a2UM 23םM$ )YYWkn}Ш;EؑI q؍N[(CyLzjZ Re$[s<UDaI`S ;ݏÜX tAy a|-Wm@o^7C}c)G4`Umz+%S"rRs/SBJ;}O|&eZwPK<.%{cu- 5R2C*&F#MQͪ6H O/OA^i`F %ry)2jiie%;A' g.dȔ1:B݀Rr!3 ?")i:`H]Lm:Af{S9 )h. ߝcrEL^8M6m? )BF9kM-=+F{7(Wt;)*܁Hmed9uRFku!Ab*m[ u:#4s.%>OW9Y Ė mŽÕPu?#RSva am,&1$hve(Z6D+[ե1rDnzc7C%e|SDm!r5y z^Z* ,YS N9Wcsb؏jX(2Uyz` ۝ |b7 Q3/ rxU4ʫv0Z xc*o}7:p{f^sj'E˧U3B/C+cqZ_Cu7Zd>tHKg]+Q^r1ia>]9m]4EJd,,j8ϮQI5\aDu:c \-};߶&8O-g2USTg7 oNw>؛ٚOOSKO[ -M+ico`㤤,72,"07% ^ױwgӢ.\ZwD[N_"dK\߾#wQeaU$}-Ң˫%XZ8d% .@;ߜ"|?J9,LoNpc> -2Zh\NbeR#Pa ckSTn/j_V,:`dY"eI!`\,eH H},98|Y5!% z6?!%$Cm:ǏQm8&kt9 T4QuP!$yaѲx՟/e^m1g4υ]9rBT-<$ eH~oO7C9B=DlMml}hdG5J }qsksXա+MEd? _m\=֌7 £4$r<#/LVa:BPeec*4b2ZoaH 4U*B#f#/ȩ斡7դGckX;w!5,^3IR>kr%mLym,+w Xmo}Ƕ!蟊y h=7|ji'55e'U9*]dl,u.#clcQ)*1Rbv #Ž :r\Q7)-]O\*'”U9t}mO6dkҚ6t#$, jPR%G醮Ϫ)%x!1xhd; j[܍mϦ4/@R7*tuh@ї2>؟Lg{d;WPo {]LL9cjkÌΦ,dA:Ż #*2 Ox%I4ki$ǹ2JI7g9SA[ZX9dz̫榞.QF5#3_æwFi>Ys\衮mm nvkTySUN&t~@U m~1C 뚛7HUFBK]eyR5R}KQݰYӕ1 Q6-lt8KSA MAPԵN]VS~ z5j VU1Ki7㞋!u1հ8cfe8+Q {qkjtBb1 9 lfPFTRw;n}lTl' S45ZէZEDj¥akȩvr,J~Fw,&b'#6yBLV$ܟ`?6~ꌊzL3TWfT  7=1fÕ5%02D~8e]g:PQ`Jk Xv+筮>fH4}G7Æ[A5 Ư* (Tb;l_*NuuB5ee|b5m /?\**1M4&h˱5sc|Eՙ$i\d6;;D{QF19hb'Ӭ A6%vlh g̴C,r>0X\*}v1^րHG xj+ݴuC]Ti1%=V̬(ԉ~VluEF.%xV=\$8t .Q[=YXC #([v3к@Rubwpc]O(jY5Nұ$8A.;y"w8[ ,r>\-: A=mV Xʱ]hm yEUD(jtA#zifH^Qf@w؛͏ K˖5j` @Am:kI:JUX"1ys$Ugn3/JRSŔ]|ak',1'BMJ-5X[>>QO)fhEF |\YI`s:6Ab-p*V@Nؼb#g2*!bmEa &$VgZ4T[Kl>d/sRK;1V{'_#];׹8Fs41O$jG _e]ߛALӪ:c"cqZ)DqaF|U%oOK P#~7Ymko'?_|ȅCd-;k:6Ć ç?_ ^t~`jiwۓ|\NjQf LYG0c[[;~4:!3ڍopǗԬck'ARb X#a/Yкn Xcj49|JloaRmhG^|\ ض(oQClY}#C#om v ].1w) R劓Gm`nHi';f'xt;Eo83c>umxX_ ^ctY16r3jݮ_P`8)̟-NUHVqsRDe!XŪ7wxBlA2Hl~ ]iR 9VҥR870J5h6|S=|gͥ4đաI[W;NSOC #釦-fhBTFVbZzXDk0Hq'PRTJδk>FKi"܋[347QJT*4ܸ[ ־جvze%LwXՇijۛo)UUkeijܯ0[.Z)J2HVU h^겺(8"uؓԛbFp8LfAtSuOVt2H` R72D" ʖH=U)ydh+iI{ i m㽹J]8=MEID*3X0S^*3S8| G!aU\(eQgvԗx!A:0rI:I 1^ߌ#ci:o/\?YBv`-}9۾"̫'T9)XuF&(6ێ6g,"F)mAGb7yO;ξ;؅} jS۾c:MAS [L&`;Ņ8w[amC@Ng[[OA<פ2i("=)<錇)M|tQ.fN.[v=ѥ.m5eetuxo *^s;-*_aG@%]U,NĬ)0Xؐw80Hi֝jJ-P6m:4OKeeK4O{v^Od*PQRt)k- ́vƥaNA'JGU VMX*-Fv,ͦua4z *:z*B0Sv}Wj6̡ˣxg?NYmb[r*pgArury ۞0ћмoOLC.չ7D7 {w5!n}^um>4k>k+bNJ|6t@>RA@ I3,'Ă6'οCL;+$}}4,FF/~EҔ1@(.pԷ֤YRN [V cCIPL)^Pq V(<іǪlg)C &zGMsv_342_^m_$C4zzxWRʠ;I+!H,w ̄b5Q\`fqxLIFlG#C58:4bk".;kokvlYZ4eMIL#UpYԆ'~p򝊢H2Z5UeDQ ݀ .œfJԫFmX;tΤ,<58ɩ1\i"2rCzVK߂lpZx얇*ͳhܫ(h7x@Aa'j*]kmhii_$$˒ MzBxK巸\u"iD9>N2CZ]oPXf9&J(/\'"̪jYCO*Aa`Z4j%Z[1 3&W_c|Q vM#pukU3IO4ڙY5Xm~/NƓrPA|%,BeT%PoӜV8!B4 OJ= Q^AnF:rwyTQPZ(*F `6F|4 Rvϓ+N0)hacBF:dboc@FfK41 G1,mA#=E X1)Fy\T}VzsD5xTus&kCf`vrÄ\r V6*i<7,X)kH`7U8^')څ yE b?s}[,Eex9eﶡtͭq8d1wx`.J-?&fwfouFFo un LLUN4JŖuVb/ss7yIJ2ڼU5AB%FAhk fbcnj\}shoG\r@~!#]J͘ƐS;42w,F`pֵحUe[ BձxE5)l:5MTѭ<1Y"Ebݷe&q)L10@2:n^k( 4tHffٴQđUTp #{ k4i#"1yTQC>8թ,pSo.eKiS) kvc?iY!FI'1f]6 Hݚ4Td=7U]~03o&CUyG 7VYJGP}, +/$dkQ2wԫV<\yHnzet ٔl>r Dħ)RHT7VcAH)~&)JĶ+7AuPԋa^ve/̝Hx1JNRدƧbU7c}gM.͖t'Xe qlnzzyL e$'//L%IslEjEܜl+ni|&8љ$.Yi/ٟo9zg<,2ujJYyg6\H^bC+-Õn xJwP cFG#"T3>kT KF7C>ם/Rǧ_)F6| ";L*2:P-Ca;w\Z\.(i5 <9Kf='!3Uen@=u~eǣՆE$>GNms:E@ag+zd *IjddI{R{oۜJ~m*GU8u$7LNp剰Y5 pl/4,=5(}Itl1,.wL,i)xrZ) 6q[qBO }Ǩ'vEHu4X¶fDk&ȩ%0A;ZW=@KQgb^1WC&gHI"Y53A"Y<)u06Zw]aYS. ;x؎::)HOMݯqDzSS4,N멜]FĒ~>n'𩙣G/Pٖ [qkSVʓ˭Ͷ$|]Ͳ!5i$hf`mqfQRHS%:l '&*(dc7?ځ`Vi-mVc,u i67</,f9PH:1V#ΫѼ*jʈխp7`g $*HUl~9dr$ʿm'߹6QȒK {oqBrd$B"i&dS{6$b'{cei 'AG{m={E;R]RX7k_&h=w(eRDK›*fEXejYOn㏱ĔW<lTl7;mTU$: :B,X1"BQ'PESQ|XYԋ0ϯlLRȿ&%22bɷnq^gx&^p">bvPoO@xv-6>PkvL.*&2hXwlI>)2)(Ygq*Pyo`k3X1 &̚I7D}عJ^mFOm;ĵEF҈R[S ŸxOUMI[JN ! m@!܋#|[ܟMۿ Re--< d3,AEejZT3PSW˪ ׽s2Lrċ2Gx ei` Q ;Okz+%)o8Z CUtU3bHUI"+TeX@ XUl?sr:xm1nGo}SI)DDqc-TA177eFz|UjuQ(~/a%/ͻ"i۪jY<80Ԁ7'W6 }u%u}9H֎O޼a$QmcŶ8)xHBf&[eV<0HTAFwcT}/RǗeR zՕ݁xԣyժ**^SujhXiı1q |8?Σ#0Z4i%7WK<};#ŔVK۶؛6j D<.P_齆>w裎/ʭyB<𣋝`\^ba[luQ\qTq#{ nn1;e8AV y'ep$WMŮtێݻC> ؼ 8JP&@l^VͥH74*@'?ڗ"·]uYFj*""D4b[¶Vfuf0CR7"FpUdwv?Q]QO]e$Nj@E\#k=o0K 39 iHGa6-nk_|wl_Hٜk`p9 +kF= <`ElNh,>o==M\I+ 8Lyj!3.ak?ԕtB!aupE4SeIL3zϫ28=`fK턖>NSGŘRNn tYV]X4F@04?_2_^q5 j wDZ丯yU ,t4(X$1z+E_=%@Jqv}r?ro8K0L642GSbV=HKg8ֽ Vɒ3yUh113mݹvAQeg>YRNu/ʝqGyZREۆ:c+ |%L2ž\*nѫe-M;͑0OR9QtE؇U^[II&g_P?ML3˩.:֬|~=z)5RV_T4_bXNN!\:l"0pE궞yK1R޶VǞ<`ԝpӝYI೑ Ľ6?%f1MUR[4d(  RT<20 s+b6erNHe|𸽝a=| Xk!ً}ś'Nh<@PrMĸp%m62Lia 19HdI,eg5)N.'c`>aSְc+9琎+lNm!`n(j'޳X$zX)%~[K59=_UI&#A䐰Esa/5dYNyBikW;b$Ljc{~Q7XX֖*rtïnq]FIjcpZ܏}myRtxkco+ItG9-+ѐ?q9V~a QWdz˱qχU IZvW[Qbƨ#c#VALBnXLP#;v^:GBtl1 5dٮWBTcvpZaVSrLVvfbl]|!6@$C;#F[SF@pqtJyF%c%s I6.U\2ŖTxGk"-?0Pі(bI;{cdA0 !UTs*6swǎvݜeALP\=c9ZmnUnWmoճ|!,FU5 ,}VOSL Mm?lFvz4SvIG W}۹d/B+c]5` qMR2$lJ߶MK,RӴPF m,X`.!1HQ<ʊw$b=~"hsW4'UJc: řGI)!W6Ӡ6X+D˱V6 FsΣ2G6buj'$&(X*skn-~ c}icY'&tBĶqE"r6QעR$du3eOWG[`o{a:t vOlzr)m^\mi X1?yaq@K KXUIw4iJp&2n) /P$*,J]yﱾ;ctr =}KѵjJEvֽ/o yS SSYn[#­5|!Ro\cAVU%m6mWO: 0>K9ˏ-L~-@@;!^Ncjd,I?XEQTH61=]_,RB!W%?E !XR"X;oȾpO Q躁_Զ:)4IvmV]+g )6!ΐ-}ݯqPչtsuqnذ17=06ciN<Y9vi$1?E {1Ɋ*)jwv+- #b6\5[`㊎'CaamE? ;ZނW#GB|3( "gѤC?o?Cs8IUOZYrBiEnH 8 \ Iy~s,dk*6Uv&C4T2=Dpj %>{cTy)MJ4~C#!`IN|~QSS̋+OڎT+qm=|f'ʙe%QY 6 ͵wӍ 3VI,w^E q{q5~ePrfec5036'k M^ umE2R(d6$]okossFcӑ-?8["Ӹ :KI`ѓ9 Eo27́JZ75_qu#)yux)k{m- lTs,K"6Jj&T@Cn} Ǧ?#3%D!R ۿu M"2+w> e:IN`{o?M=nY]!1ũI%$Yo#"c4r2,Nc'5%4 ^ jbHҕBH[(#}b@YoN>\DO\DhB+:4k5V/ab'ɠ29$lQ ;Z [m\luuG2˩YW+b\\9Y4E-*)1„cG}ݱĂ?yr3Z*~ D@m͸#iF{U* RGCq_Lu#'^ԻB";\ cck#O"q'8)gpVN$O|Ct<βo@b?o|`J9*a'OƧMTjt6䩭n_ōYHQP_ GYhFĄaIqb cOluS9ljN^+ /x6?b6!|SKno{bjDZes0eJ|/եU#Ћ>=b>quP2 eH*m fiP<5bFhNfdJ48MGUp*$o#i;|]L١aHI61hQT:V{aTo 1ՠnp|Fnš^ʺXo8e3168H*e Rv)xfGJ6u+Ƌ9ޞFt9|_ C(Uـ7-z ȅ3TZ6Ræ7HC)@6(%QI7FtxȈJzF,V߼ a@s6Dn5DG{~F8?o LuxUT"\r$,m*ǝRh*0螱Jyho:鮌l9gS8:(\j]=C5$\Ce{v3d_fYR̅XT5aN So 8h lsu% =/4 :]ҕuƀLqdnF3.OF2&žRH`Ewg_|TrC RUV6Ҩ3*j*cEe4 $mV'prꐒSIBӊj#IaY[bDf$m`[ȥ*1Ԅ8RؑbA'Q>Z CY *s8E k@ _끭,SI eF>Lhb-᷅,fC7 \P̩-:Q t{1*$hyI$+d LX QM,M0rT{2U5Eh]ȭzUZAU5 )WCmJJ5qT {cO!IJA }tZOQ$(9NlIVkSg4AiUKFqC fVŊ_^b˱fTEW50M@Ky^୽} Y-8crبsJJICHёI؍y STHfaO{w?K`]UD5OTI#QmAT*X_!:$0ocpG]H6⮢|ŔAm2*ȩ  Ge !j##}V~~xF#j猬SPXqrbJWw()!ǎG'2fa@ srn>/GKOJXG I*0tCTLVdaI3),S;F񩿕Wc#kz`9K4XΖ q VC"IrZ̪xG%Z6t΂e)qwlQ3.ͪvգҴB%G, nGx /-mV xNrFVvlw$#dKO`5H5`-Gaxi `-3 bUtUݭQP qsmW8-{[KHby玦G4fD"B]eN"sQ -|PEokYC%4L2ٴ*9'8)*>$xgf߸>cnI#s}3x- bxl;ͨK)+~pGǯNQrGXq jI N(p1J IG7\~?DR \FPxD7Q@2т=F.fT2ƑUĨX(`飯x1!$n-rA9cyBnۓޚi`N;˟) wV&PtpmisXޚP*;+ [XpC?r1)5jpPc EDM.xfCFk`|rN%QbBϾ:%Ŵyo鈕4mNG$NaV5QG'ȭ4BWKphh[k|*uVU)VBQBb?\|{dzeL`k~owZ$Jz L[Û:.}~()Ki-|ٳT+UQw<-,\KQP\}7?\*U#n)-6Ԁ@cc6ߍO 6JWoс`S7.BMh+rG[Nʎ7'o ʺˍBH#,S>LrZ{9pC$և H 67y2zvB:{ PQO+@JC" kqz5UTT<%6 2ʒ0G\S=,5(!! ~Ǐ化?3-S]-;i>VRpfv󴛰7|{/z1$%.Q.LZ/RYs9+ TICѨ~6OpJ5g}3@o3I!bJbn-vgdfԹ[?\rI&tE9Ylv#kcxS$pLΪя+7SK,Bik.9kgJk_F{;`;;guhK7b95sUI<'H13kM%^~l*)2 quT+H_%bOn0l'jgh&67 mΫk` Eb7bf2FIM[slu$C$2#r6ߞBp,'o3͐d3hxăWҁ;2M4H.>/sQ*dI"x"GQ6'_6nܬmG v:'{{cL!B6_UМddؘ-}ߌ=uwMdu:yisb"d!;m],[q KVƓJK8#km'CLi}K*DJE TTCR5W]W<Q$(} [x*ySK Q92B؃!iX`7tc!NÜUbuOMPgI-e /`z)D"bb@b:Ŷa³)ҥs{u*OO9TI>`bSIJO+jWm #]yxu%$!W˽LM F7 vh`w/4J,S>O9I#LlvZo?l#)EPwQv鎦uJdm'poly2ɉse! "X/} Zx>{T'Y+wƌ^cJQBRj8ѰՉZ;[6)O $> R[3$w_٪bT5 f]1|Wu4)0ز~aM`=ZoDTv==4ـT&ŶKY(s-!CUXH;mY>~<Ԅ`_l/,8(gwW˖EYg]q}iG+G 1U6ag\s iE #GKF=1 UiNc"EQx#ab>k<M-_+4yVcS[RꪣhXYÜ[?!pOL-e_*U[K[bu oӋ|SRKǾn㑷Kc1GD8:ekmCUTK*i%V$k\?/WqkVPEm.QLS;ƺTO$')mt. eE^yP GH6#ӎqqs*+ B\w$TFֽЀ(߼H),Uqmړ.ʨ*?7qF|֩ꃱ_6|HU4A4T6XNi4TcM^X{?!+[B˳?y~o/K|dY,ҭ\Ru==Ҷs=vSST4X4n]s9mSh5<䛞 xU~-l)L$A>_44# GPĂG7.S[ olt4F ":kDi)}n{X,Ò(4,4%R.m=2tXdQ)4H?IJ89[\ljF}? WNBV`CA]y賈L& X+̳婒#,0 NK\^OُΩ2YH#Q}7ll:Ѥm0E%U,sƬ{y…TSHji%.TgM6ݰj*:jsJHi4f1ama)SLMe%EQ-+-ن[uOPHv ko$UQWSՙn^#i)ɦnGp| E p-O;-w[[T(dzu8@G,ENe1@A;\ yrtNn"7#fxTt67l(:r!u$c1o|Yɘx{k/ĺ  q825Xn~,/nAӹoa$w. (I KuVA" GR{j?- 8G{kG!`ss*jY3âKߛn;XJRf v\ zz&`?UQ5vP,)RÝpX sTZI mBd_Z>Bu En="kDKd:xw4y R,v.9Q=4M e$O*X˖2 1f]A!y}41H)y%QH݁`9_Fv68@HPHX,4l+j6l~]U[rpVѭV Oγ d&%mQM>k4XۖQpq-= dUBPuQRj(*Huob1ȊT3N7i&o~03ŗ4$׃CԴZQ>!eTU[s9/P$eلрA{z8>(j[8sxQ֏|XGmᣘl|$ |O=toƏG@2ұ$lѽy<̞$6TYfFUUye;1[1ޮ hh{Y"5._CL#{ی a=nLy:z&wob|j,~#<{*aXР)T>KgUgn~)z_ކ0ꄖ|}~cRzٖ07&mqVVI#辛x$,Bc<ĬJˏ [|s4ebRU| ׋H*$\<$1YTyUe4fH@41 w;%:*t,xnƀ4va*E7#}-$*:  vny>㉔JR$v_kbѝqIKK!a"ҤyMmfpƎ4ݱB77- ;5Z"e_לhy{JojIViÌ^wU- ѳ*8h5xm!X=`+6SLU{|qSGQ-;#Z̬\ۍI#;0߈!<- KaѦ?Oq 4OR*d-@ !ؐ{}}p1E[ pQKX"M^Bv @!4:oɺb!JJ]]oN1J(7 @>cؤI.?bRc/ߌQ~L~=-B(Ƕ:qS,WB,x[oǰ"(PTRUT kS_vQoK rX s|{F?aT‹j?t<RI*Z'_DZf 5Cj)n,mz ǩyLjX+qǰQEEO-)@Om~prJ+P򅸱=bmبJB9dXPX6QUtk;\V'&&H]Q$_}{ f&&Ң%cI_Wp>ǰ=n/1_|$J?Q{16bRWSVe1Ӹ(-+ŭq{ƏBZVO:x[f _WiH.v'ǰ%IX4L., vr1L4]$/ab/=a}R^XQIUî1,3iZ8ZEr n-sDZI+]C13EU5?%8Q!穢g'{o@}7{@LnU"N̷I6N_(as.aXܠC}1{ b(a~6k|{#Lpe"H"-Hk8DZ`)DT(PZ1B &1{ ~LU_䔒36Aa=.[$5I:`c(̏0 G$jU*?ߟȁ얚*3Jl,wDZe :@E`D]ǰM肚-Rmm{アm4I1X.&DZيԳOOP$2n[I5K Z$ܯkl{Pwj']Lmhahi p>=fE[؉u @D@iс;_'DZ9c 4EVoAF\{1Q~D!#sn-َG0J]DZ scJ}Wsr\kԡ5j caV|=Ǔp`e4)[6eT4ri=ͶlI$|]KW_Tf`^I^mɵP.~iMDL}scO&rYTR,:yPh\ؒ~if3OEQ(\&ǰ:giVp7?L' R'P\{ZcL;aDI #T7p ڂo' qDZucóT›{Qm ,kcاJAt_ ΑᬏUT2()ɂ'Ϩ$\:yPrxEPWl{ endstream endobj 8 0 obj << /Length 62578 /Type /XObject /ColorSpace /DeviceRGB /SMask 9 0 R /BitsPerComponent 8 /Subtype /Image /Width 320 /Filter /FlateDecode /Height 240 >> stream xtUי=k nv{/ ]{ޅQ 'c88qӓI$3Jc'3I"g=k;?~~~~~~~~~~~~|6u-;cl蠌`Cbe]~GDrP/vAO`c(v uBr~cBXH^nP2pyaǰu rtrr?3& 'V0ʐ{ˋFT$U-R^#W(jMFӭ]jeRѡ IYLR*yBQ9BHF;S? ^$Ǹ@.$EI"`VzB*˔9P,VJU*Iՙ&M)yl:/;[9yƬu.%Lu8VI*$X & 8FMpRկڧx?юP dhǒt M 2`iXNuj0Z-5릫iWmOL2xĶl3NCjel!Yih%6B9T )ZݼN;sYL)?_ ) |X-Ų1 [,) Tgriqp[vmڬV-g3nn^|._x, р끞g=]\ͳfZѣiz)ՄJ311L i1Tc*RZ.kI{sp8x~ǧ4^o/'d\O๸,KVY_wnq  ^ XppnYg̦ylYm@϶禧ۺaܠU{QjJ]͖֚Kۣ65 jŀh"3P ڏScc J+YL4koThrtӑ..fALhj]2cY]W\V\]G,jHWim˓./xx SMfVUV&.Dh:KBXXNz?SSc#Gn2WxR(ɕd)/k+nn~~%I:yK'"7#}}LK&ݜN=V(r;hVt*40jM&hG̀Fկyk }=n{ x#`\0[( N;PT7o?c/ud!X,4d$YPWm-6!7lJcyOg>ylu֢P݃JZ ejfn HuZ٭DCЭIy57:??};ugݭerLIvz>~@& Q'v{~)heiH#Rǟ&ŭwY V e鄓SPl*7[BP:[[thVrn]MYэ4GSFر5 }a!y66XZ]qz~A v`?EOǜgi \eťb@Q;MH(,ʅ29o8&-`,S6aLaظT: JID!K$bqX BJ$m֋֏J9hu'oާ>Elo TNbZemĭe]ͪycc'r :/ހr1YHEB;59[ ;~o Κ43h%$p1CqȢbB$jF^(pRN+Dvɀi{aL;!AgL&J_Ű.w7;0O&&^R(ΨTmbS.ot*GIrSjϭrKBNT;sIJQF..3˟-x%FZ$2{kjT}*0e0-\]{2)W&q'1 !aư$JQ,LQ Сu^izy'In T-TQك6|A[pXX, ԕ @A!k}P^mxaC#z*_?'R|!Vt+4ø2oq^sv?q)o[/+^/z>bR9ǛqiC~!PJŒzVL#A6_"[?/,pHyq|A^N1.i!)˧bGQ|(j @pnnHl< b)j@&i^EM/1'9hznh)jio2jQ\qX,)7+儢^Atmn3 $I(yN̏gz~:wޗ܅/><3ޞO{?nlxuK:*kxqIDR+e;KjĒFE"8> +B&l:Er^݁LjK2 *yf) B1Rͫ ZN7VO+ M#9&A.@1oOe:r9 /)*ղZ}hIrWY (cWR+"j+".;9Ro ZWK;VR Oj>qe؂o^4ɹ~}ju]uuyeYGm!OyQV2֋m RlX U4aɈD:.W9>[|QEcgwrǧg9rJuYrF#  BQ,}L <B!x1-S\ &yjAj-huufIYKEK5 Eڽ>l'iY aWxJ0 C$N/^Oh`3I5^O-kEB%:ЕeF!E+\'6K?d&8 i$^ZP+wY;~}olw毂tOTWG /sDa {=ir er~iAfN0c!Gl:p%vQYT #8)5D|~6b>ym_,إln5W!z1ډZE npwp`rhaPNLgK v &sLRo[yf򇓫YP,uoQRՏ!F#9jdn!f ԙj6 rŤRybt[#6"%dÈ__b* ;$bQHPT h|VWMFͣ y\&a\BqS{6 `A=Txr9PlFI xQx(5QufL6VO>"3tDR+x'T+a68? R(6 \Hq_ç)NԉԪކ*/ƣ )7Zf:{? ?xۢrէt/` q`ݡ)}"'%+$*|Kyr5*F6 ܂\َ&+Ȑz!7/rlij4>k4>g0qbbt{t|jɱnunD!P+'j_ⅻ;v=e\b@U*lb}$ ܆wSGh1fPWT.=Q[! RiT.E;^$ vr'C#Z35IQ/rx ^OcT'Lf% q^CV_T*-(~ biW|gg ]F^tAA4 O7)%/O%gWeeyUZhV5eHph<.02UV; CFѸl0,3.7A9 9]~o=x!9nWU\LM2x֕k=[=mTjVOF/gl߷/$Zv9H$^ON!2aŝށ8v~H*:nDg7Lia}Yգ7wpّHNLKGnng ` 4HAtM•tK"a{Nd?gS jNwUoW k:#ͶZ}AfB!%i&y)(Z:ri2zzNy{O=:t&%e+5||3aagzznlg3Ytd2,1]g! E~N_0WLq`XVej6AtcXWBa.fg:899X{}*e}pSrdQѨ߮_~zsnn5o5eM2IDծ ]-Y88ok[zA(nߥx(@vkd'#] aYKvjo-͘-3ۂ 2k1O#zunVRZm0v6-Z~铥OdF] ,j@n`J:%N糓cHrNhsE^ _jQ*瘛G$ ;Ϥ]昉Rf,iO#G##Wss+,P\|keeee]KIv%$䲏#nnm t!W2LtA _]WB3gxNؿT L Hܘ>vKN քلK/l_~ٛg+UNAG,G<[21߭׼RsqoQ2m+XT=4Jӽ̢nҞD.aY p l#=rW 8 rV/KRP)6o.WL(jV 0R݊Q.)#GZx;կL@~\jgH;S{'9wu99/ڛ KFfb`23(iz)3 Ly83H5Lg~;1C&lぁQQnyloy›kk_lFդ+G^ru=ӭ(+ ŢB1PucVS?T3`π XV+JggwhZ3 %0 `4=)aXLV*C`8vG 3[ aUs85  k2VqSńww̮w|M=2"o˛Pҍ4]F[G)FջYC5/5$C"^GBL $EOibU\T,+yZ=Zuo򗿴{w7~+T]OCB;JW"jr94ӟӵ!K$MR}nfT/E 04HQ9ɠ{f\ kV.X==ǣW򶛚wv>1;''TQѵ'/?~\ W1s&'df,Z }3X 0`l/tZW$s!E,xR&JOc'8g Yh{tPklNGݥZخմTP- L6'CPrٷKw/`4bmȆe:ߏ"LTDZfR aIrw3~$ҎN8 hȥQ +oTo}ܽ/}6_Dn/(3o*f`/rHX(UIT&-'Ipԃ< Y-2t{0aݼ2}(}sɫ99W?rJił..pư3ԳɇP(s@V ^%iHrd+^?TvN*- +V"8 \!d:9}Gyl,'VqY,v[\N[˥船䒥Skf%9seO gx6?}w(\EqߏHpM5P1vkxY$ \I" Ȼsǀ &q8>$5CuAAWJ矛?{^|ٗg33VM B+wxJWYC!Cg4TH$*cv02a0 (bN IQd1aX.p(d:p6g8"b:2r&%x3+k=#c-%e9%e52r>0p{b5~5Nn)oN^|Fg-MTxbY5fD~Ad%\4C1o)Ѭj6;IG1 J}@W J1A_·'pz\z]z&ӢccjL)鸓S2O>^LF}k;!!ߖxoGB8*aǛS݅Cԇ#EZ>,wu?qjɧ^{;~x'oRXǒ̓I2umBaWu;NG 'PHCX$db}A(cf3߀뮑HJ B&Kd:tazzzy ;; =ju'$shc.mv&흝`Q)hpf`XXN[,&Ӝ0To㜳P2.:'|(qsS$+QEܨ-j˵T U"~+z)0{rdPF|Ww/?/9^b'CVB>ߏYgbDnDzjdԶvQ۳3^FD6ox???PC7:Wtצlem|G^avL;Zb0ԿB!Wa52Y}_0C0qČ00;`/{e୔H~ *\ d2tBK|VۡVj5t&FrAນ򹉡؞- vP1s瀢AjD1My0k4r< i"QX HQaEख़ {}*hp9R\T99ָVjJUbhV+*g*«ÍFoSKKFrW~>w3z+~s~~?pD+qY %|ex3 %p-o{ ye.fN\xg%~_+ww;2ZԿ& h㯓/~!OPh¹mF-M6hV.AFyLod *EL3fTZd5̃LfSG7bX61禝>V((WjtqnDޫVw|07RRD v<JR0<.CcV[[p{pDGDX[XPS_ֈ-˅KK@BFwBwtKrS9ӌpr q~SΤݶwW 寔 jJ0waTx{Y]eLV%1-꠾ҙ'fn~wݟg|=SF^tJ.“O 8&;~?u upe"DU*eo;MQT+3 a%RLkgonRi}O+`p. x9E5Njyí*Ul Q8lf9Nj*S41ٹh̳*H2)!R$  ˄vKHS+MkMuKuy3yT5)d55Om>~/vvDDUpc#y ~` kw׊)|,yټ` 3FC n!=`?b0CaXR կV׿YRnʹ\-vo,v yU?$ SFc^i6ZsK)MgC ?f`~ ۭ'&7l6mol-+2DHt<'O'?6~ŧ^xܣjjx*Wuth+?ݼ yჅw U,25Ju'#kf\4i~WГA7C23* *_̗~ -r+Gg?8`aAŰG9H Q*$"V(U&H(Mӝ EBG=3EAYǜ]vOX ZȲ 2Y1R6>RohLl1^*EUA$|ࢁf[1 XNxVhs|}</x XӬ2BP*pnq]]zz7_xg8czjgLw r)+aӬI7Sul ']4>~#LijUR)+ jxbm3`vgrZ쵆nNN">˫zr萛}1;sϏJ3"K*VjP.`~_逝VQW*+) <\; s[AQe4d>= r/`\@@ rJ6FON/#GCBV&U1@$RAsÇC~S$T&X,'s J 'Ç#>3'lL1K1YY?6yd ^p"j!YOnn޺/YIkIӥ9aK%lB͛5ߤ߉&rz>OmVm)#hy'b1'"~wཇ]Ba(E=3JYftvXzAFNTݽǧۻ7 `2(h0<|<2r*!a%!a=!a3>BlŨG_Z.BX|OrÇCއ>x0@(TAA~~yp{R|P Uc^X/vJMe-[z6l5T>6|̵ӕl$|@,r:o}օ/Ncwg4%OjNݙ}h{^BINGoX Yۖ1T#+v `KR|IjF.̄cY_N>K_҂o:Կv gJS "sT"B6g~!WAWoao/^.i />_aHOA_ ?y@$aa+!!G.?p::z1.n%9y--tNι킂W+/Ox:=kaa_ [l~Aąt/1 >tA/@V'xyey{g=Zfdp J|$~mˠ%j!\IvMfiFY|fXQC.FElL6.<}atvO5*<.D9Q+8yd˷[f~7廗堀׽ιY-Q=X~1BGFDNF)=nA(a[d J jbf*M)!i\`gZ")$1/ևAYx_r?~񋚇2VPp=?ђeevㅮWZ[_liyN{7)-}3; 7߀3..BQ'Y|>8x;?hpNuH$Xh|7 $I {}r>*|8e]2 ĕSKYke#23܃?KuDyul]6ߴZJ&NaN/x;q=;m32}w-qѷʑ|qv.Y uH|@{=56\թ~~nGSU^[)oΟlw5wܢ-bh^1N$B3>o± W_"~~W QBaXaiHpNWf0TZ>>C@.@  N92626:sRxcǏ11[@kRk7N|"+ܛϗ=_WrGww𝉉/,|k~ӐVU}#7g?<{?~kk?3?=++O~PYNV֗o\^&v*ߣ? oGD(:j=rhWVk՚&x3<JV?e*NӥʊXEE)?׹F$8N& $@17VKXxސl7"W2|n{-SZ~S?/ZW|Uu{BͯϿoߺt)8 ֳVH0kЎjAaB37*㗑`wGЃ23 l'~e#h*Z6KZ$F-RNYvkF爛rq>~4㟍Wa_8U"9!AaOQ4]"EjuV[WLUVkVFz (x<4t:<|."b>*j%&f=)dF#׋nܮ}ޟO~3g~_|q?~{{zG7=@8wp*ifssŒf2 ZmM89~ S }K_cmT,TZEPSJ2WgӲ4R dP,H~D*Lj$Wr<ԖiV²nVدmݚ;_􃢰W~Žy̥[+_{w֙lޮW]].X-E U)/b۹{#>&v#fe蛯dX? (6K%mkN} *"~b` 믝_4!Ư"x(U*=a0, I$q<pp \4#A|~$AīTIjuN ZLӱry IdW@v9p>߈DtTahñ.:\Dɠ!bXLN$IQPbsk(bT+7:ť_JMz͂߬Nkommnm}ᝆVPRV))OEG_ =:a6t*U IV0W lvu) ?ghlVW_JJS`1[MCE_`ѕ[tfmQSS "œRHJHq2)*c:Y}Ѭ^8鸞k5j;*Uٻ]s>lY e˯ovo>}?ߋw&7N߫~>}r6CZ`QgԯF -L2 wVq;P}Jb헢/F;B[CJxLO>B| JiW dH>?Q$: ,0{#IVC. Owq Ov.7ϏbQ PK$5x ȢHĺ@]b'dٚ:rd&2r+>ԛ_),|NIۥoYXjvgSR{ر G_uwFUm*UE!xyP(X  Hbq$E1IHa(D3?WD1G:tȃ%@5$hI?EQ11bi >ykϥBzii&'?x#&JDĹ %o97Ie`jTV$+U  Q Q("hP[: 0,ͅ7$s8p c8GGxx߿FX40O1Knn烃PZ]Yu.,t36vر#Gڃ}k}=]*ݝlNgKn2T*:MA4,]KKNbT1N3ZY[uHpgWn/)88cx(K$f6y˗HbP pR^'7~w3^2Wr`Sy8&Ac1LմF`=z%5>n L=ZmFƈoRJeeE($Xh" htgLV{R*7#  ȳXlv*{)!:9ԏByX``Gm,͆?`x@DD_X =z$)Яϫǣ˭ӭemf]0t1vJif4nVNW^|ɨZ7V 8 /ut&]y)Ꝫwv| _lW6!N}b?MZry㪇mf7! mD&+,Cbݹ3{vо8 3Ι۝?9#*>'9`U!,V[*wB \"o N"G#yDJ-"STZj2 {{o\ |KAAjoyOY5;tVIDZ(O/Lb==2 +9Y dOrrtLx{+.厎[N=t2P xzNű11(cbbc&ccG"##BCkr_su~OO WMvMkZ;+# u\9R*L,d83L/yۍ?hû "U@45C>d)'7x ^?OZRk/>˖i J`3Hpoή.ݝUԿ81A<ْ];cV;nxEtKx??紟Ki -/}pC:8 @%|Ülr%d9 ЂBq8Lq~? )g#rfS^iy%/-/Mw%ww4Cj2YjP*i<3ȱq '_(`NΏ,pq)T*O \n@pKrYDrr)ٙNN<|8qTΆUWw֚čr޻zԅzATA$z1w;N2L$3o9,$$3w9kS޸bHȴ^?PfsPh bc'7nܕ0'%b_LJ 6`i2[,g-p'z\ OiZCR;v[Sp3@.ڃab{)lsӧM]j1B+~[yٲ3\7O&nwܝVRk/^E{ nMH/"W^¤&._9FBoŅNwH.\HW רs}]dwsZYbkigRtz^~#A4({Aqbwtvv1yijf6 j5ڨT+]2Y\^T(x DQ~~11qqUɭaaM^^j5<4HqI7]\n)kk[jomx3.Wlyٖqq3޻]]w O{$,l,&f".n*!aOrlZMm\BY0U@Nt@j+%A4 Ւw;Fu_5I-1a؆>}*DBHWRYATj$@KJ0`pξ|s<7D^ީ egƌzpjUjŠZ1U׫O͆k7޳~^/ {u=ZZ7(oE&k2D.#\z 'q:*ŜW(z>+p ƝFC]=zx^|iwϳB_l<~J >ٞ=Oz^t?z娋㬣qĨ@u G7`sI8U~4,lCʼn|aP%FH#rٸ IB>)vM>O Riɴ!((-18%esbbUBUm4Vp8&.{Zp8lv@P#TqUtm202F?.Xq1'^^}|GDKH8ia5+Dnɼg /wVT$Q)kU *EZMiЂ_~`jt^nQ45Nj 8]U&+ apў Sq73oef?nIQG+n^/zm=k~>/x=y3J|s;yg_ū;?O_=|paT2{ii̤۪e7%Fb_AAI/XhqX)~aP)ȕ;qHG=VRԚCl6?_0ϾJd%gpP‹=3LTb:֘:gB%K˽a޿a6;$dp6&Ӱvγ{A-R {\]/u*ERiHf"_9:005>0)bF@%$ۻ^.p2p^B@^B\׊D,V9V`k|y-Lxz 0(/u+lpԪUWZ_yTC`!G̀g8j40hY!,gGŒz ZюKd#MdH*mF DM"YLcB~ͬF{Hk8i07v@u|fG+7 @rx( ʝZrrKKG[ZvWVedt5Lju _R )p^c2mZGVHg+/*^ Br\ &XBaC 縸ʐꀀZD,Pq#3CnGdQI9j+Yg+b7`{d:'g^/#gSS\›\{fCío77JYɬ6 zx4tשյju ]UXIqRYZO;| <1B;R`m\y^Cf''OGtp9g;>48HN ^u;0=51?/ki4dQ%zo!? eX觡A\OVCSBh !@]9P9T M")b4\$B* [7Wu:A,ڧ?*NHA[FZ/WoWw-,'-',S9\\OQ  ?^$g`V*mXS=|ɓ?~if\Pڀ>q{ <2@. /&@*,ZRnm<\GnLߒf՛<^ +N <%+73ӳg2Y>Jbq>7K7;;+ݔA,QPԲC٣{A}Jgjkg7mP^BK˫lm@t|MLtt;>޶goذ p;^(vob[0Š(\^6n4/BW3:ӄ^iڱnY2lO]4nu1u+~O#p7࠷}ujn a&… l[p3;O;*E )ŐB73Ϙ;C銓-W<^u33k5&S7PTjAl$z{np?9 v|ft_~7޽{sO_<3S陯@LAp "/^7Vx  P"QTZUI$;.I8ŏ( ,D4I$JeFl29;TR)࿉F"єE:]ZYlph364aî]^}7_oiyGF>{=:p>ݞ=\/) C+1KcdZܴbx r]j./$uziLcخAnW~Tm=BNNcή\κy{/ӐiX!on3_HpB- }/\uIǯ;$$;EArR?G[ݞvs|'ܼz VG?b? <-B!P YP{U.&7-mg]ݡ;Ο;w֭Wy@N߱cy[vv[ppK\H /]HW!Q(Q&F*A|" 8ABSQ[1\6O~_(R2TQP|H$dعq 6·={ވ_F$<죰wC^ x)u=js%\-/QyћU55CCXa4b؇WԁRՐʰ`gv9r#r}|>^U&:uϋǚ5F.o?BwӠN7:][[_t׮+/?裷z_~ffOv-l38dUAFrfKj6@xV3RX&3(I3Mxd\c'+ÿ[ f#FR=mm K("(/ RXT'UOsrSFn8y$XaѮI64^/v~ׇsϝ0w@qn,ر?LNޭjc1V E/o(-"T6T~iY]5:`my/q\ּp:w}{K6aX軡=u 4ڲ-D׵5={],U1?oK8JDhs.-*g~3G-J.i?h=iu<|w|?\X=V[ /h< 6O&ۤ[ƋFccۆ jj<=3̹s/||*+wΝ21q}"1׷XLrcHxI pzCFEP"YBƑ7#'ρ x䖂 ϜF曹LoAvv43aX ;QIuVG{7F z8{<NH>w_o/'?=+WqٹW.^D?a{ɸ%>oEIT%B j4Әn\iv<{+2ZH茳s }eb"CihS^>>_+hzJۯE.֡G(7/ԟ,]X\#&OBZEI[+T d2Uʸhgu8`=j55[NY.9>jyR ȕJA`Z\.VYY;mvn+Wxݗ_~##Z[33;  9RNk2mǫ0*UBQTu_. Dw(UB!ѹ/p R(>66nkZ׮ufR} zJ3'%ԹG|Ii0>~<4r6>Dvʚw:{~c8vb⥹nݺ=wνr]zq ;wI2V LRܧVj1hhpzDk,G"rx۴=&ǣ]yxϹ{]8vaiܤԂy& t/ wZd_?QGXF wMMC&Cohu~/VqK\]/pn-ƥ~4Z.$/3sC;vջO?}̙{zf*+W;:թ 2Ӂ#SN \J\;i1x'$1( @ۺlg5;P薔Xh j: CzӐm,&NGOߑ}Nd\)zm#g^=sox>t~w;sW~{0"K[Fx%n\@ޤ1^WQ||FD܍=ګ<"51Xh&E<:ӴሃY+]OB8w춠;zkTR@kLKvⴷ!,YҊ&պ]5S.fV?\vvJ(凼/yL;;{Q6gJ˕R=&'yyf={.mrr"'g 0dʒ˓*0RN>sJՈWHZ&6oH*h4GYx0"Q![h@-ᾁ6_f'3X@>[CurYdK7[f(z46\)SjJj]jqu7*xZۍ8qj굹^{띹O?j˯~܇P] K} 7@׸VO;us_o^NΥ@R_Hcb #u&GTM izᰃ)4t鐓i҄3^Aw3S*I{!h.хT(w[1zRޥrŔ-:m0?mjuBf*rE`Ar/W (C5fH42w++km=urOFpTTkV<#x/˫0&Ӑ:jX,z}?J&2r=XBaU3BvȤRaHr9c*J8T K N7hBorr`rrط1LN~9CPKs7?s~;{bn"[W d-nSwtW?y醂80u PRiT5ҍ ˬz a6w!AF)PQEkѲIiT+d2٨L:"lu[P:r Q|LPYRXW>%N>~i4ZQ (0_\0ˇp29 @bKNޑ=pw|vW2&S.O%P.S4 \q~VU(jpimX7Y&\d^YQ+J ܳxB39aLN(bLn$qE)|IH^ SmL.;#bf^**{mSP{?s$p翺|tFFx#.^@~_}ʲT?~eLb[u\٫LSѭP @!֏Qa&Ր#<6ߛ^DQ"me2٘ -ۘJ$q\jB1Q8.3BG! z _zm=nJY<^9HfQ+#U")1-Nȭ>> F#(&:=za4IqXh\rł!-jmK.lM D*}wC|~X\ ?A0껝A͉\ņbgO3?۟"d!Lnl$)?A5^xt~|GZM,w(ubj*PV5[4N @"RbEmSКyEI̷G*ۊW6!x;)):/a a1=1.t X,@5Nk'%66$#)F5`3pd׬`r!#@j Sh*b8 Ê]p"㪳xy(PTÅDRi䒓xJ~)ܬT(7f7 @:/qo1Ho#HRL8W$+Fon#W/ܬ}g#_<6wsϽ}ӹ?'KIYw%Gx)E޼s?~;pFǰ"ܶt;TȚe"H qօhu ^BvU.Us Zi`{ [ mߝ2.ݵ 8vdpj8kH'imywٰAO䉄V *F4e8H"  P"nXpz/FX"vw+j*˦d]R..KJ~N%GYIݓ!{.Odilv&r8y`]f#p*Y_ 7/Ť/˱ r#,O.V,Vql*ۏsA'X&/-Ha 8B7+sBT~ی-nS>~G"oLsl[M |d{}}sg.~yԋ S=ޕ>G^GNjܽ^/67A|?}= `Ϥh,.Kg<.,K" t(^B>?o"AH\>@-,NdU"DkLo="5pvɑF}@2xAx6E.}}UUO(Vlm@|T6M'I "(d!Jr_lp>tg1p8W IXR!;ƯD?J;)B3(,_0\t"gSXT &fBWR;a'YSߔqw:?O~{}<0t$:`{<{iVg=VUO>W՗_~p%e܈nLms ̵D˄?9%K+6a϶'7eyzuKBZ۹s?q~> ow7^~ql)M\|g5hR$•bhGA L"sɾ dapuw u!OPV,#.RvmRQo&yE~b~W;g0*UCY)S _lO=~90CY  r.4ép& # 'ո{ ٦& |~;WHu7 vv `2Bll2v6{?%ugB$YP^&QUʴ *c:z刨ngWxlK5 6A]~T ~twݟe]<~_,=:KE$7#\PM*]<Ł47P'He2y\R*y~sf+p@$7pA=6Z4$D͏$hh;-'὿ `!{RmmV[V#~kٺ?!^,4H(,J u kpx\mp Z \!d|%=b 8'QڳK^^b / JmMG$.3maoyHQ!Tu*c:fu9urHs17OϼVe+M5JJvv^ ##s}+D7v$<2zVbK% /ZԾE4hk)) DcGyI|<>ukA~~0)`yC('M  8[ 8 Ӆ4>3\ag9yH\n!@ N*|M;`7!J x h`@,4 ~#7yu_2@73L@m6H!-KE VoT{Q>'ד^g}ן :~fCɸI7e];ŭ{"|_~'#"ܹw~W?v񊊕^پ$Q0Zox=VQ1?Pqu}:(蜿X:cYNuz#ޠbx})՟J3#H F. 5nF)blN:⚝F/FAr o!ARYcPZG }h:mϯ+q28^grz!JqP2pشˌ7Q,$%Gf[|R\jNat퐇1G0!Ƥc{C"̖ aO =2~;wp|sϞ/s$rs۩Vf\ o0EYp2mc# #Sy~ՏJ m!(Ygj AG! :BS lvH@7@!QZ&|#FS){?{;;[Ou8Ye\I4x%{&;8_hO=Gr_E hHv_ zy~.K vm!xf-_Ux&ruNA4s8౛ !9SMC]JX y<Ȧ 1 |xFQ?eЩlo0Pxb!HBmSuquӌ>Y{LF0=o4-=u/޺OoǗ/2H _?:FGI ?/n^1u-"⍸GWJpB\$Tז66Tebu >hw5 ŋh/>#Ci@"@c!TXG WayET R(vlBڲz~>EW4+kYqC _ .{ޅm]LoZ6-\n?>8:02^N*Jjd4*\*A/U37xR[`oŢpBp&U" JILf넃Ng 71O~#wuW }W|03caaع"ss"j尰&% Q,3\E"b ,Ľ׈kyr@"]CҦ'-v ._7dWV=6?@CX5kݍeb vo \c{oZ(lP;;{z;ׯoksvn2t*_2l ς"6N%(_|M?JDRJdi zӐɺe}kkQ/!گ/\xD%C{#eeK%H/~'=w`XoJ5r>$~:~Q&lԴ#'Ό7dp"8b0`GG!&__b:i14ZJgd2 L4t$' /2lyxI},AD%APhr8m/n_ BaX/APoG,L`X;eg <|(%e4=}4-m$-mG\>onOf_Ul(zKڧap!/cչuvb7ϭk]͛QI!V;1? [/pF31&5>]lvr:|t[ ܊\o(Vk[ݼl,>ʜe(J(0x!H0 ]06=DE(Gxi4zQ`3Ypx:ݨx8g$/9r0r{ wwy<|:xhƲ%Lf Sf\gNmYm &,,PU 3: qh( z\&{qKph|dn  v̊߰d.H(D.d^HWʔ uJۮ5tLKɡ6uhZat<=<{oxDOTVĉG^{m*eGڽ:v^oѸjTݍON~3>~l^0oTj_b-e(*5JR"(p,k :I _D,2Ψ`@K<-FR)[hh$R燭uA|$5Cf}4dX%,V)Uf7a`66SࢁD0B .&wP: ;W$-A;IЮ0r X _/[}|vl0w_8w(əKTI~pҸ "avh]&NA"|H, j:AoC밣s߇oztxxqB--}o9PPlSmCk6t`vn|xطMJy_ ݌S0̕v @ h4*5z!^BD-0IAGSt$9t`xTj2bnOt8E#`lyi|+_xѱzm}"`2p f7Xul6zbƓJ^Q\<&RՉwK$-2ـ{̙OyÇ/qq_AMV(:c\tϏ#l7`~&s/G86@\tTQ!SU)4JmZߤ3,~!ǁow ݽիI_6/]jN\z,4DRHpsѯ8%唿V8Okd6EKQS9JKF8o7P07299D"QIhR4 .GW KrQN0|-FMR( @:3Ng|n6aD3$^֑3ߕڵ~QoJˢAY`3Y*s-j6i&vȎ_\HoyaP^>^`b8މC*݆vX=&fgqƣ?w oo˗o:titT}MM9!R+YuO&P;0_p.AA Ӻu4z@\$HRfUVd:Y+}$&;]~xFBۮ9va_|e۶BOt @,t˽ F. Ž\dd^ria!n IgtZ)2ph-FL#ՙ@#5ژits( .. vop7U nGMGScT&CZhHX&$2z4f3Zpʸj~Âx) l7>xې 31e0y91` $xr3\( @F, [%!.WX#;{wGljo\p֭7|Νמ}řNԕl- ~?~IkL\؂B G|n.sµ*mFߢ3vfVџݹw񻨿-M녁O˾r,wXg0co=Hˑ+/_0V۰0Nٱ٬\3IϦ#)EN@ ,c@I@JCJ~k~EWEMo DU_U҂m>>8]lm֚rBr㿸!Ld}/ /U=}jnd;* {bȋL +!0[ K}1..\ՍǥQ.[oәG⛯ݾٳϏl[2 3z}>bkioKCKP# ~@ȋPVa F RӠֵh S Cu&R2J0K9hS(6,HpZxXՒbDb ]e&.H,+ˤJ9nPi[.d~Wow{~Ikq{Kc=$ޥ2g mr~O,EEBʆ!_\+ 3pB^@@V:R#"z&{ġgN_x… ϟ?{s?:q[cRsK0]~|QBP* r ȅ tJ덶*FkP=lmC𻒍)a0 3 h5a~9nN mQVx5Ba#^S Y(6/#ݧ=ٳ/]xx|\oœmy Tp[E~U&65hvsa6ki[_VVhP].C>lժ(x % _eBݨFt]zC#dRS?"|]11$5YV/\7.m׆У:~YFy ]]oy4mVKC`pGF/Ds@( >a@*SyzuUOV:5uOrg=}Gl NNw+sel.[y8 m272v5N8 xiW;?nm: A/淘̂?cx;q;ENs8xwp-Al&Z^$mspߙ6]Yy蕑KO;Lgrr8 4&`66k׮q\C*/]?[*5BP6tze2! #cs]؊wsn0̐bE?7T:DpldJʮڣmm'[ZWVJOڲޥ4JLgGFdgG(A\7s>>.. ERT\\gl )_󺵱,VP\!WɕJUZӎ >Eyo7B}%:,: ݫL '}0xt=ɯLV)ok|^% 9kY0LɡKr:fk)H%&WW#ve-8PQ͌TiD"Jh&: 9""a u>ֺ]eFk} 4Z*LGfr =0 o[h:!E EpFi/(/+@._|=fs@ddrtz EDl]Z gI~7J$EL771usX5$6;?02+++""E^϶[ϴq#-/KNV4 ~Xe>Tzx\i^ޟzgvoܸXc)Ћ* nY"B2LZh_l3>/=Z0):Ղ8;vg1\R 9R:gBEtNضKzS OCScom~A[|}=:=L&yOEMT; mfptV.[enfY6э #5PTA$4IDu"aK+i\L`\*5JI*>(]~5k\׀~4O/k7k5ZUJ!wv>Gͪb1Z yl u#x!*E  ©8;p[k!9|@K:-cã8tmԭι[sP+g$@!$PsPB(c1q{fw=>4`J~<_NzCۃaz=X^v/Y肯5m۫z\x7ǾwpgGFDFD- (pT8,UG*1PHБufe2 <<<¥i7FίY/C'-_&2\N $TNb&$80|rqa8V]Z[YWzhaGq-q!!b2_srEGxbĤ">kx@ENBF|Mh4x,BihO-?3<,`,t|5'r<, 6 ߼㤤_ r Y-{W T75 t$&GDrN3; %q/^%!.-'v0 (& \&=N ͠&S;lP^D ( D!᫓9gk<`V \.w?%8J<(QI9VT]H.L\\݉EIII:N_~(333R6 V>+B g'V+m^ٴbqp9Š/l(rMKþ}o'$ ??X?vT ~^qduALV jKWNDrH./WKPl-/}̨(#prSÇ v dLc_3T*U|h31ۏ;%ŋBlLgu / GFƿ8𗴴/| 勣H#bz6k4N'H.kƙț7eˏML1R,G%K=ڛz`FoFFO]jߵfmpYA#"̈́X ^Ɨ4HreR}\Ui5*R LcBצ+^) @1嵞 % Loҁb;+T%w8׏*UbL2T~DYN,C;wollhd]t. iDnJ"X6ŏ~OuV2@x9>;~G2=]_eہJKծ]EGw[,_o<܋ę,,)r x{_lq,3'/ ~+ lm 6=f=5.%vKۖ-[66nٱ3!ncƠ *PE=4fsïK$j@: hZ݈9 OlWduO{ruzG 0hq,g?1({U!8G:?Hfr{]nO-"%1fۦ!ѓ>ogEffnn.kٜr:65M\N0B!HpJE|磢۾zl.! wK|8zU*YLѬxoZw|c\ib99]^/2\[FVlrEBL),:`mG)%~SDEl۶9:qLx+.!\Uo߾0vC4SV)q3 ÇKPЭ8P^*Νxz~csk_yLR/VC^N_ו. ]Br;w~駟Y׿^rQrQrd1Xha$,ܺu a8&Wbx(.RɥRn>qIL16W+Lh4'5n<sj+V9Çk:ؓk,ޘ~~WBC__n. `P7b0:=/9= 4j0%+T4$b {>6v<#%ڵ?ޱ>x33;66U{< %0[ \狋}ݟ'L3i~wfk7޼ZLLFF2R fdžBt`в ٌL1 #,d(^O vIJEB73\0)[oXO(=1`}V뙠)?kaanA||ٜdF/F["s8S %I, {3f2}12<rLL p)<Îгd0tf!D-`K!2elNW͓IRYL)s=AǓ} A#MM?޴͛8d_{{S^ O_}ZzZ'M.wYh@iXNbl0kQQEGߍ{!&ztBxWTHǖW,.%!(|u|>׭g|pJUnOED_~.2vOA}̺>`9`3|Id Sabp9:.5Bdvߥw>NL|'>lvYe-JN&#DpPW/b/ZhBjH)F/z]:q 9wO ~Xgii9%%x`׮z g}?{S_x_bn?a)+=+_z9tz:ef r88'Nqw4@  ~}lyoӦˑ{*8bAˎ r"BIB/`P2GKp9p54<&ǂBzH:^竫}pο}{׮=/їR.~SEժg$^ K*W( ~֮h˖7o~)6Ve."Ȥ/Z8vBgX`M)I~0htcSh~+HLh2=n{7?>`: 5lJ(sITfЋd zү[}?K^?-^IKQ#7h +W~_Fx!*^iڴzVjUhz,H78~Fd&X t:K~~?ؼn|5k^HKUz*5CfSq\hh]8zJE"Kw|s:K<ҁ(zwa׿#w~ئ-MN׫uhZ-0ۣi'dT+>NbA K$  %a0*qLxM[WR,tWYT3KQK:N?oD2  ?Je*~ÿo<1Ew{N_߈N7 :( CӍt'uqF9 ;Bso'e\bT@n"a݉]?<ԋ`q\j嗽% .z< ]F}mRᶘz k_>go]q'=4M(GstdK~Jq E", %#Oi4i{$x3 𒅮_u! 9_V_|8<>WPBq$_\ 8~lpQj0\3oYl;v{#z)ro- mn$]$`d &S~B/H0rlJci-UJTWZU \de]8]PY=?N1 zk6|ͷl0_<7 h_X^Zt޶Z{#w||Hy?ysj=TnrC%^xJ]ZNߠʼnX 0gsB==7 Y|bI["՘ A[r:K?&64:߇*uI(?yU}ťC\rR{ʜGyw۶+z@y*7M`2ݵXo_2t+Wr][ 8ۂbqbN2w:AB=t0r.c\5DjFÐ:LWjtἜDEn>sճܛ~~.~k-O{Ͱ+~u0׃w퟾|W7n0/,U`/Mphle<znݨL\|3CI`}x"ǒBS=__^Wo?zx{h- 9EhP\)y)yv/0ʵ*Ad +! L]9v/BGY2*YZޠU!nrW2hƍ1Q{H<E2R+X6;` Wi_(i^Ķx.3ѼbZ-o*:qrWO ~LI.&HO _"5 Ä3#+vsVYi8y(:˜>[8 Tz*u ^eת-Y_rU!s axe΄!>[\_bcNK6uɼ`0fq|\O4c4v:offm|l~b}dy`z`k6l>g\2[YVi9cr@m ܿk5H/NGrIpoc27^0f^DѧSYBjIy3ʻ`&]9m$w=>oN[[CQ] -O> rKy/7,֫&5|b!. ; #|p|jb}h i!@m1jh4՚+9u˶Yf%MLL >,s{``^^`m6k\B{zHjn%,׫ϙ3f䴫59Kxx/gȼ#ށؤxj}SO ?Pt޶^$O9r:~~~ gV'ˇfFM? ^^fd 吏r;b1^^;֜䂂ԨH_.jB5.z^RR"mрb@x 4ZqD>S !T9Κ g_['/fM_ 9A{c;; Ezpldn~GNK:%}-}}σw`|}AA mXAVfLLPiЯ\)i?ͯ;bBo2=ق5.!lg77XIta9ɠU)$=ZY?")jƨ=K ;oy#rsB}m=i1th|ԿwI }ہ7ַ0?I`'?B,(賈?q8~dd񽌢kh4'kyFv/>UVVhkhPPG~y@p}}ii)ܖ 2$nJ*Tث :0Ŕè$3ݳs_dwuҁ={!Zp|`8gv: _/[/lyW@}}fd26ok2u+ aZ]B{gw_Ys h59MFє H^` ?Iyt^={qf{f{jp͵`l2/x@<>׭Fr aT^r%O=p'e^h v:=9tf'&f46㨨@As`a6d42$Ը'=ơLD" xxWX!|SOIO46(9N&sQ ޹cGPP%p.3eݻ~zٜ)xl>&أU&OYL>)zUI{u/ߙ1esd&՝7c&G6 eU(ڈavB/[??~ ~~O>>oY\V- ƫzp ~?S(Z"h ՒU$+VȞy~tp?lZG?) *%RT*Z+mKߺ52""Lg27he7P4Zvbb(¹lnpt^uՠnмdB^1^讛ugw%u{Ό^Z׬S&}%["Wuin4cX7Sxbyf^ {':!!/L27_4_3޴Ltӏ2F  :tLr )EtTtU\ÔWp)O"6F%;hz-``/Y P>o/.rl8 -9aF?Gji\|IlVRS]S\EzLU(vDtJR}P>w|usA|wf D5 dHe2qo ʠd C×5 YW~^YYukOy{Ɇ%F`VvB#;*K2ޒd8^$*QMgmKOe-G~~߷oY,Fð~mG:=<'kW [P.[TV(>JT(uN7l(~ҸlAUJrDўgiSrrB*=%D"QP)5 U$MBZ=TtID8R*4bq-rY 6I&eoQ(E$*n bµBaDrT`"Ib {jApG/Z,`{QbH\ xܥ i#"K&&T &;,OOǓ~2p7GJ gNN^ +\Ңi(>i֪i4 ňwH%vD"o1W jR9'(a[/4|^sd bn! "x5|~|F8_f]Z/Y/8($䧡/AA|<:]FSV[& rxd6`W/]bEl?f;9?ǟ˅ &8OJ{CC?[_? ~hYyPrAvj%zT*^v L$ra) חES6RcSlzҏxl˽!kkevundOj}>?E#" |'>dNR 2Q矔ɮ!Ȝ\>, DޣbX\-D0,V0bNxBAhV~Pļ>nM[V6j4&@Td|bxL*=)6 LfE$k8.wNj~]v I?Vk#Wj4 $˳ L*%J2dbq,JhA4RH׮-iݻ;v[ғwŀ8~2p7DN̻ĻAQUʫЀs0> Zl.8.O4` [ImLHndf<޸Dr[~ AǽeAjB a&LlYrAM(}TziY.K|6h%C&M*r@:隌KP({d,MV2=]w`^n.&Pm;ͅ~8p7GMUبԶ(>3c\X^brqE l;IQp{i4 c?F:łX|A^Ds2٨P'KPuvaIb@ I#La6Yˍ#)#= 6qd\I0G1-&QߥTnH@7VFCI E.Ȯ+*ǎ mEEl$/OJKw 1-NGSNРlmUww#]]09q5KNNYKu})j]bcXbm:W(f$>C>fs/o`C{XkHvQ["@yg׷b9d6ZKmNLpM4+Tv A\hAME`SSDSӚȪꈊ"#B,'G?ݻ &%Ӟq;Çō^dg'24.@v_zՇ~mur0Ymv˭rم,Vuͮ9 {Aќ˧S*ՈZݩRE4=E]dKmzͶw5((ۻfCB^z!$E"ȅG뽼t=T IdT֘ڂ?__[^\VXUt䈡@?M0ͯ;Jn60;…+WҮ\ɺx6mrtуv J:&7 yY&br~ժ(v.L*+IvB R(,uw?kk孭(~IefzH;g?s9;k |X\T$QIiD]Yini ijZٹ+<澾 }}===!-->uXq78 7.D 5Y#M yB ͣ062< /ꆆ@f==CCQnٳW}_ |饠[ovw}v:onV64(vMk]ݭ2+(2`;4`'N^ )ttLn`o_zmtIn{N@q r)Ƞ iAV]GLU}Dq$G&޳7^O0\l/;9_69r y옄_iqDUQ!uugKsݿZ{Ob**TeeRwN~8p7܂aEwM f(veKCk[[==pȐD<x!A%$Jm>mr+rЫ>{cnrrߍZupR]_>?('ڻKc;/.I$Pi#kK"+i;/NM大qD[^.%_iY19Xr4כmMMFck؈몪𳅅"w_w|`X  UpSTE _Uޮ<~\=8St'O&X vYb*SPTwZ/Ƞ7?4Оfm_Q{AR~K dE94];/!d n]w.TN~nnxd%%`-G +b0嚪* ZYjnڌMMXc;;11Do `2IK 0mg.r _38Ґ( ~]rykn raB_ 9̄ykG55HOZT8(ʕfKߤmM 1L_wΝ/H`Ju!-,=]R"/+S+*+*amCwW]-S -"%jF $XZUM+kkww+!0rQ821#&E@FFC߁6MMYA^ur9gb˗|YNOb}mHOfWӠ\]qDy8O}>Ijp^bo|sfֶ-$])={q\ غ EEC@\^. ୩Qj޶6 РU:$;񸑝-8zT\[]]CdCU$r0\yflL31LM馧u xa,Zabre7a^ZkgcxۤqׄtijeYn~I.mxb;E+;:p#GĀ-gڢ"1/}(UUjՐ7oS 膄󤟉;X̎gq %%"෭MD ӣ8~\90t;>B[hIIItb#{A'PpOb7ΫW{+ )˩nYU!Rķ+ӔVUdgQޙ$ߑL١ܳ[KOg7?m?@:bơB1hnYV-iAKEYȭTUvu_ķpVUV]~2p7G@1=WZ*.)(mnAI̬vvw~^77AB ~A_H4I `W^Ct;O޶je[Fvkk*mmHu(O:ؿW7ٿǔϺ/δee@23ٙ ^n<*)lS(rT ‹J`[(Ev6I?w"(MKLdrUUI[W>2"ў>;9͡gbϜi|l`H0d/nC * ̤e|8ԃhbYGVQCoSR[V.Pj2ٙ̃̀#Ek } y$RGFH&B8*+>~ϟ~&B_\| K3t) :ٍ7) VB6)?oEaI*,n!^Z@m ehGT;ٕ=y;3MfRU5~,*@fe{{^://T xNh_ OP\{dl4:JX+Oy<,>9?{&/.d?XS/T3 \UO?A;]{y"8ło^|#}zRstP-ߒodx'X>^_7DUq'Zu]KBUd[X-ˎV-4IY$^=xÅ]f'nϤbQ2!HKvw*]<ޮؐ?CO3y%n7&WR`0 nvvff(B_cs2A6+<>y W޿W@ ϟka-=,璾,~!{;t3!IhK '_r =vcQ`6pMzѢnm FS nճw>}6ّn{pg=M$x3#gA^`=t\; | j_;vÑ~0®.z=vNE|qMuU.!XV]\?S=Ut#*J ס[^.`n*Oxku,p:^R0|a'KF>~OOɏ߯pn=}|۝M7䉘h=.J'%i)V=9BN).:>,|5MMǏT z9QR|E ,~*Ņ,F :8{"?ܫH7ʼn0D=qq~ : e,u*f9>BSN +^,p*sjh{3ռ^#!a$,FDp=!IK*wfDR*%?mgPB/,046.ۺ۷A>}vf0PdXJ`.sZgO++v6e4* y+nōxq?/宺^n)7XZ%S9ELL+K!_vjpsK>˶e h|>ˋEl3SFr$R:"l,/+V"~d`47bA`\P8\\Tnq,[lfNGӓ Fb_l̽ ;++ n*IРZ̄,^Y)F07᭭|tZJ iQ"!D5Q }+m\s=KX9%3b`4L wj63I׉7¾ýLӃӡgG=gG[T\[^W^vvme=n^jYVZZb/,0\^P]]RM$C/=9IQaX,ʇ`sָP2uKA;mܕ%̱^6cRXs9/̳jNPMghneVU]m&[6[vZN4mWGPu cʰ-2F@/C9`܍N'T0_WO]]ۥ7nwtP1N0} \trm6Y0kF-۬E.ۄ&lX.P&=˨eLg% z-az+5h]:QY̦(y04f11d B|!|n<JW42B癐ZM ``My[5˜˝Bo̜eiYNtjVŜU19]#ja٭l^=T[85v"*X >M_qҭ T`jTd,* I  /P &GyWWb0da] q\I#㔁2,`Y}f>5Iҕ3̉Q mb19ƘO3rE`LO@L?FW+: ͠C' r\N 8Z #!f(yﲃ_bQr" _8OPE Ä ;W2 EaUU!nh(in.{ v[[,>$ z)#Ǐh~ }h:jo  D~ǻ)P}h%S'ƨ3TbֶH_ҖtҖ"mW U?׵ +_cT(w^kf#&TQ*Q!zI8|1< /( 沘FNOzI"RA[ZCJCJwrI~aMV<2>F̩:-E ͺ =.{ tHd `C/ZPHa׈ usd8OӐdw@^a(h; Db$}IDF;;$t!;;H ;=GA(!m)=&I/+N{o*iE5&udD9WP]򥗮+gqSS齻ew$e[[-yYkK(R447Ծ{zA#{&'cL9 ܄X$Ao #h!XI9[Wa A [3#1?Mmuq~YDQԣMH{w ˺AFP/M@59NCUęi"īr8=-bqh8&q`"yaRSU\[S FäZ![`9vz đ2X U" 2$/5-,wBѨ6+p`ϐˊE0QTUɋШ(@[ %MmQv]er|lz &3 AaDıNK2h`NdB\&. Ew T76ܻSr*-,xD#z{J`25Eu@"VwBLvVTB~ E&j (gCF6;6[[[f}àP `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0" !r\\ endstream endobj 9 0 obj << /Length 14160 /Type /XObject /Decode [0 1] /ColorSpace /DeviceGray /BitsPerComponent 8 /Subtype /Image /Width 320 /Filter /FlateDecode /Height 240 >> stream x}y|Uv~ߝ\?Gf#M HeXHFш`4F1Q`du010,̞^V]KuR{;z vh3$4SOy󞴴^E/zыwiFyxԨ̴^z4pYOM^ ad>^͏'_|ϪkRsOוS›KK4v|s|BPtDF^i|nx{ɜ1OBoR ?:r򊂆Zo:\.zVퟮGѴ^cgX55ZZ ^GC-aU/=ؘ\gүN64)U tD"@TKGw_SU42\mW)TzU%:uuolBW}`ȔbjF>kT6;f<8o~`Gk7h4FG\ I!Kj3}Oj P ⣌Z{'z@گܱvF?T?i}{?;nONϞWyBH@$MZNŏAvm+JI.8 }3 =s$5zѣǎ1r􌴾i = sWS!ZF|M<ë 5!gBΌ3gΘ;pƜ‚9L51;;+{tff!zh2 5!$il.`joݺza޸7><51`fɢ⥋.++_^|e⒒sySr&L1h@bFu$eCm$MplgٳS2s ,_^^v}ƪ-[6nZ_UYr5k֖U,[YQri| c3ғ5pWwpZ C7-;7o[W}Ёښ}޽{ݻwmߺ}M+׬)_YdnaA̴'oSm9!XWZ &O߬~~|O2172+xQEejΟ?]wb@֦W/?{5Gj: pu˦+J"'iH@&G7-:-.1fLΝ|7bJUш \K⫭uN\>_=|w= 5|vz/T"hV$3K8cѪ[Z/htxf21$4JS֟?[S7_5IYGƌ}5aiPB җ)sWn9t1/Drv7"j?~ٜ IXFzM'ğǦ$LuB7˾e 3l<'l7*?yf 4h1ۤ!\!>0YʴoN;0c *h \.mN񮕏H [T4OEN@ v€v;$l=񛅓G\g6х˪nG*HYTJLfځIv{j~R4̛ >0{8 T0x- >t9)MLDS?&}~$̨NW1A0 n Yt ,(dؔ˷nň < Ma'ng+f{ά~QEIY #>({xT=j0&vtAmN`U.V{#8{-s\8ob=;Tp;t& SQ=U4zQ[^Dp贅${-tEL\ix3u  V$K>ߠhx~P{IMXX f3ڭs'wo'c};naw@şyI1yF'pf8'.G맓bd|j}Tn]Y2 O'=w?K›M (Aݴz4⁊ycsʫ/j p^ %L$˟%f Aӂ`CmZ#Ay" XΗ?f\a*P64d?Z2딓s"%kMq~v7 3ˎ#yw@6@˟01&@)7f3 2ξb8CIbMuP$KSBRaŏ1Հ?Ohv%#;6X} R_ >b5$*0ee16AxP)a9nGgV>d=a3Fy}=rbh5ukgdwy!}FfϩtRaԮ^!v3t6JnDo8;h !;1:/Y3ՖGC/' KTqYm3}rWl1 E 9Eene'lpF?^[k1rhI:%3Ep0NHCb'hǮя]ZZ8+py%28y}0 1!шL!Sc:sH#,1pٴ?$ܒEMԀ8C #7!$@VZ63ZedU;7@5:^?[Xj% Qi`ecۛ@ȌEՈnX|$o'.P#Tbh4{ek:tJ}3r +HaGE|DZ(7L&U:LCImTpa0?e5E: jGV%IVѡF t.mpc Z cfDkAUjO^Y8yt"=Wx}?5*mE!"JPlQ48F{OL\Z#O}iin8؀=DSV`Z] J%$o?b^^AsKb&D<@5i'9m2 Q+JS ?өz.? xW䌌ՓʪOU E,vfI>Q¹Pl:CA~/o~~fHt4a3t 9_G.<|^T ~?(+rgZۅ|5$,jX9)hr[tCw$w51?o"B7h {[6Į5E3f>sBs* bRfAOTjt\BLJ^EIڽ9 O m"##( E7:V'SRQgnK%~$ DtF?$VɈ0 ߢπ$·gꔞӚ@@g^.adOxv_EIX 9hU(%.+T!i ‍jVlRI% vneSE@lUL3ß r'NQTHnJ5ك_2KRkP1MKĬVGl:lBD&ҐdظYvUe+luFIx5x K-xQF!-:;>j J 'E4jx0"]^@͡$:æDB B`c$Y;ft\g$mN?1hnK@¤Swd#OT 9أ򮨰tbeѩB/ąw'NicVU_FK/L-6 QE`th';i j=j@Ma׶S#>: Ѣf G:1go:SXҎЌ/hcIQ w e I&cf5;QnZMWYOP):)G2!&kLG~|gBʿ}:J2#ۘ BI%a D8[ N(%<BpV 61:<11y,^X=YngLV8?pat19Sl@DGxZB7Zl6 a>D?"rpp?"v ɟ&h#9SKC2LO_?] >~g>rk>Z3Yf3uNFcKuN𧇞y c`GG*0yL TOB_ ڻ;_ {`GtO6n;fg'ɠiml AK} gW hB 6#ZI=Q7JDt%{SsAL@ܡVK]?'ĝM ZְJxPhOwCER}䭤_9o}qRqG9*ض,: jmio'OzDH+u3v"ھ[D0j֫~lF n72E;0nݵs*?[::GWU*J( k76l]8" Ս?4ŘhehA3|!;͠ A@lb{'ʋ$wϽ/6!8 WB8Fҹ, ~)}~'cvU:`ᇗ"$wD羻*q!:BP>S&9J>_X)ՈC1TJsD2Ejŷw+k=4tۏM'9;"LXԗΝ5=< A, =: ϪOa fTIC&Y 56i83pM8PQiI2}iig'q%©FWQ~a6&kmj -5 :ɟC9W>9ج-abp#%̙r|ʣ?-Q&i4~ARi(;9$֝P Cl3V1e|ܨY#ׇ!gx{\$uݶFqϽq'lbd9}qNvh ?ঢK*nnZ =|OSf}i&*t Bq|S=0FOɷaL/a:uY-x^Q~5y ΐXYcE#1|~ˢO<]h4c[ ;^a_Y8^O,H>NT& QySudjˢ/0'DE a# ߛlƟZpgd7y;BmAתt^Dѹ5_hz!qrX|`uJ~e,ϝ޶pTL;ϵ CA%>nf9<"0|qFWxP a .YEǶ6(a q_%V`8I&r/9n3 {O$usjld F]6¤/''t1>SD>.b3=jHap4og%E?t+CGܐ?jno1TvҒP> ;I+li1kYzX */Nܓ {H~tv _6EGp 1$d$3Ъ&k~R/9k=|È/~I%|b^f䑔Pv%tRžH :v'='$$g@ &O_W%hbkj"-F.͜#\KJ"XI;6w ?u!1+a%q(7u#3%AB>7Y-6*Lwu W 4;$5?;̄(ⴼH~=E#yʴOI*1gEhOa|Q0yMrktpȂo|_o5zrg^ծ#uWr1&`;M9tւc؊= k~o),= [U{E xyqAB s@Pmٕr?gtlB7;e鑔K?lJKoز7 Rlq|]ަZXeDѭyHUkO{C/3^)[/;|̹W%8G=ElE{o^?߶m/?rW;vlK@i][\D~K˗ת3G|p.Bzv¼ɾ{exp#=ٳg%+^wּD6J]"CK#X<+}X_!qPXWocEIܹ>`3oЈ,>2~Zyf/.xϿX2=DG@~d aij͵y /=v1haqHҒRq'{5iҴǦMzѩT"'VMaV.CqzuwS'N޵b܂ }o&8OZ?pC~iC݃&b} ]lOOɶVmݾz]lTQ^hx}ߍ!7aDոBvhdjN_ũi5xZx(bYK 'd JKKr(~H6H:DRDoPmw֋7?py3nI@ƦY8Euugؐc=rlt㦈^_%StR xz2?9l>oOa9FD;V{PR q^'{3?$}7OqOiNԄYyE~$p_-*ޡ7Rn&)M'c+Zd<KW v_61D@NZ'OwMp !KZT3(N'YkeHt8DT"bZ渢+@"M'%g9i~w#  B)m =(s DSY<9(حXlN]vF+0BM(RFt;< /ɓx &$B7(OeȤ06]^~Y&*0(~$(JDF ϩ!\&ч2(LD )D; ec^/I#)zp8lV7 (h@Q-裗nW;RIêx. p_ ZQt РiT*,4xez AtT?vPX9]Nnc(Du9fHk]FUh҆اyiT?Nҗ[qbfì1pa@$WEX?[`k7nvS.qcӇgסT?uy㝹g FOZ23u n'In2 UݦOAk8a'N.y ޳r0C.wN^Lo*c(hH@jBݓkIaLzh'QwF3.1J9)o3 u8+{ {&zýQjlƊuj t|J%eZSP& y8IsWTlDocFOAh7`:]aEY0+ Rt=W9ܪm,WjTRΉB\LJK7ftAj1t3K*k.ʰ[(={q?~.Ĉ?9U3HHs F;?R1z-n9hس3/yUy{6E Ew)V|#́ZXM.$,@_PhCQ ѩewPCHl]6'7s-|8sv KAL:t:J7-HkZOWW-ͻS ϝf BMtXA5m<o475@oYj=PdGzlKy䱷` wWY(Z`][[XZZZZmBBV :fZl$#/T͜rW.Y 1ٗ쮹؊NE٭FD#k625647X J*^;i).wbeCc}5;ҎZa1Zly$KM3+6`ZYJG[uVX!SH%.>'j zbڢz}`ܤ'ƺ{=FD( EB č͍MMm<@$VjQ ArWk.G/(k@. !G^k@$l 3T8C.--2W pϐ {U> uW<>_kkD")Tn<⾍+MHMRqqg߁Ι>x*ӗZy0(T.ȔJH/h>cW6H9w7nޱ&QJ0n:˦;EOO+}Aw'WZǻ bL7[,tQI:ك;y ~Kwp7|y_||Y,UiMv3n6WN}7 GƮ_|oQ=啕1`mx+-WNѪ4vw]i 5f,ҷ>XٳOza wBI$yg?֯wz5E/zы^E/zы^E/zы^E/zы^: endstream endobj xref 0 10 0000000000 65535 f 0000000014 00000 n 0000000108 00000 n 0000000165 00000 n 0000000214 00000 n 0000000411 00000 n 0000000569 00000 n 0000000594 00000 n 0000080530 00000 n 0000143292 00000 n trailer << /Size 10 /Root 3 0 R /Info 1 0 R >> startxref 157638 %%EOFruby-prawn-1.0.0~rc2.orig/www/media/bounding_boxes.png0000644000000000000000000012531712114176157021514 0ustar rootrootPNG  IHDRV;LiCCPICC ProfilexkTW?wڱhR40 L2KQ3Y޼wgsޏ{w&qAQ*EXpBm(YA0 &ֺNFe\ )A\/s9\y`)g q)c1o3JDMV*6#{e<^#w,iM@||>:8``' ,oݸ7]~ԇUIq:L e3J2'!c%/Q߽~w.`g@ӊOVӞy6g 22ȶ3C +unP^f+n߆~0F94Y;@,l-I6={˱J@u-7Dxh"y.1M#&"$KTXXyJf?U JHaC_xn)8?ieмk^70!$D`㦝yU >SxøO ob³W\H0o۽~]mL*Ke7fBp8b-{ǁ= IDATxw\TeҋthK1v1ɋBS4$c~/XϖQ,`AATDE;Rl쮋(ܝ;w朙g=gaa{[@#Dzh4s2ՌB%IJEdD^6^X,ɓJP(q{ȤJ9[PU%bBz~2XZ,j[#4+=V P eBжtN,6ŠTQ*HcPDB1̘1L&WWWw."?-qP}zfKqo~3`0 Y̝4IgD>xuoKa<oǎ@ fsiAXA#="_]c<g%PH=X P 1m\&,rh2P_RiŦ jޞijjڰa۷MD/|ˏD@O}/$ƾ=c_b2NEMŞ!BFϝ4R <h/˻vڵkoaP}NG ]]KƊف ݧ<ȫ5R%ԧ3W²" Is&{{By aޔH<WOX[m66Ξ`ų@7y~qe pqՂp8\&hjiqx_o/෩;=. G_V|2]Π18LLqw0g7fL8ÖoK"$rw+jʣֽ6ӫ CØ4ѡaر!ۗ2uXGGGh| + {{3O6l:u_|k.. fffw>s֭[---'Ohkk Ndd$L^|,X Ф$l=) I~.qX&۶<߁`d1ᭀˏ'^TO?$<)AsK&Bqֶs<ȡEuY1H}mN$mhtMo&m"pkpKY{UT(F c&5?7)C"9j/I8=(%V1Ρ.f9{ ý%bw\8ӕb#[Yc& {k`÷8nX#ց7,kXJJsf><-l8uꔗ2$A&7%FrBrìxt#Z ^B2p8Zp,%Ҩ? 980ß|ϥ ,lyNs2ZSy)n@MC-Ɂ6c1s2MԡT)iT'ƈKVd_uitqeեPT^d|1,tͽQͨ4{k{t3#Yզe.^eff8gۗsʕ+ܹs1GIR߯V==t y566&''WVV<… r׮]hnnׯx3gse+W̟?_'H[lpppll,\<YK\=lZ[ .f.d߆Vk Y~kYZEip'u>g @8wxF8n'S+J@.SBڭ.KnԢn*na^JayIAn%I%'" omk[[d]mC7O;GU*5j;_P]2^PXYYpuB|m-rFTQ 0>T4 r?9S+E <3iL"x7nqljZDمs<0i^XjF1.$[:C[+zav P*xt& ::UԔj,Ĝעz;J*KJF.LK h,OM} B ?cD:~)knn.6 =H$2F&7oތ%rMʸ8HOOOOOLP,sFDB" 1g&yEf)לQ_lRV WsL(J5x%智A&یH$7`%acu5͏8eiF,?v?URx?>i+ƕ]>wtx_RMT8---F܌ueJU?tvQ׿b<\KMxj)l͎9u~IDb]c]iUIoHnngF1kZXu|sZa 44;8הJv.b? YIX]_g` PkT:k@f;<~wiSҲ2V;{lPh"2tu 6LwT*;j_KPYVUe jkLmf| MnV&<+*)V]PA*j|U|/al޶Ņg۟Zh=7I'0D,?{"5B树/ eLjp-s2fqӀ{[=T*_~8@/M϶[dVI:ڰJ [#^Nzf7U}c;D>,`8@ Z;+ʺJ}Q׸$'[iH+d%yDXl!~DOQi I,-⸡omSPZ`ųru.wwtNXuOU((( ˖- j$iԨQV)bqrrrTTAoNBQVV6qD*gtUUU*83TlZZZhh;:ؙ?[9n6l. p$T7J% 2`Rl7g%v~hS]p7ԵP$~V &K*UD"B%;dL|k?ms ƐQP j[9t5Ȯej:AomPjE5#9YhO```}}}EE 5-|&b9KLϩ!#jq~/'&y*nYoXyu}վ_SX/ʊ SOY裏JJJg#v[}Y]WUXVxf<cƌqC`3ٗnƗTۗ(f]#(f>Ƚ#=iΤyC²HZc3K%t2$߈73n.xs=u*lٲ%:::33ܹsv5jTUU-]t׮]B=z(11PEQQQHNNh46m*--՛sÆ ۶m;w'˕+WNEGGm'ˏ`´ZFՕ4>2aKEhZXq96C(2kF{ZY;?ɾ\ج좆g[z0V ݌.SL&DOM pYܬ,&Y[Q IA&*6d.~sX*-oU3̦>lÆ Sʈ"ssL&Hg#HT* R666%%%sgΜ駟~&csxH+:J$htJDGegSB%)*Ft]Dn6~A3TW48pÈ tU{iNQ*x,6I&b̔JE_:QQYajK 8pz/w͠4v 9]$M#^!z#LѣNz䉿?m4n//y慅EEEݻw.V>v+2_B:uVo eE_<^)]e׮]ܹsGQ*sd{!CxzzfffD(LfLtg'S%Eu3˔ʞ<ᑛU{;hO}CmG j@ }dl=@}G A@ >#Dz [@ }dl=@}G A@ >#Dz [@ }dl=@}G GJ R=R^<==/^}4iRkk{3g&%%UUUT:O>|p׭[- ul9G>ݜJrZdVgiFv["DR1jMPj 5k֬~"6:eXN޳K%RgGŦ4H`iFvдZ(TmkɸF glȑ#͟0a;99%ZdIII}mmm7-97I\qB\ٴ'"M7s5;%ҪDYFzna}#jI}la F1һP$ffD'IJ޺++Cm fzևpxf ESܬNW[@+va؎i¡],h>zgl租~m@IIIRRLO+vϒKgX|)S.w\4"aM몄G"ߔJcaZ8Zp\~(WktK:(o pd޶{+?????JV뭢gy,l*l-ֿHTLv(!/Eғ#F;s 6gg'N:w%v aÆ-[,55?xX;w޺ukڵXĉ͛+q8_~%33sӦMSs=~۷ÍȏV^p7|311ѣG{wwϻaĸwN<:Y>12Ii>C!Z0ڙ+Ԛ";Z*ra{CO' iM0ѕߪPu4TWT0Ž^:c|yPw`rhDyl|HGux/ D<ׂiEp$_ ӊFee{ta><*KB>MSդ ɑev z˙.2Ц|_O>u 8\B co[nٰacǎegg>ȑ#P(\\\L&8;;[}B0** ۗ2u~ $11qѢErD޽{޽;cƌӧc7 .oN*ɸ\VZemmtҁN6 BBBmw߅{@^^ޭ[~*}7 NlĊ@K2>§Q Ed)*5C%2UA.{[B#,xP$QIo|VġHx޺LP qbg[)N,F z*{Yk'Zns(죫4Ip3#xYl/[#Ӥ"rmp8/^\~=zzn p v;[Xӻ_  dԭ>܍B,~;aASGu/D /y?fx<޶m>ٳg)A",_<77799Y ʕ+ܹsرښ,[kkkqqqKKKbcc|@7n^SSҢm2ٙkצ>}:,, "##]v٪:((TzY;;۷?sF׊xZ-Tj@#kr8vOfRw #ڕHΧr U02%HuzҊcF['[)ra5ǎI-mj*[uE 8CYe 2XւE'ui5Oo<:,L~YQlnx\OƆpW~fff.ױ:E$S~6y n=6d"~%IeSVa[E>U0zb @ d*m紴4#%9rRL&˗MСC؁D"!:+v i4888a՘ *>vR4]B#4ʔL~({QUl qFҞi(S\і4IdʓU%}VJďvq+%L3F,W魫GLY̝ܪl f1e8hq2s5_\& Nv?~|?ٱc455m߾="""((֭[ߞI&nSKfyq$BvQ5GzC &kUUUuuuؤ6{^^J88::2tcomDllld2X,sssoo?H~<z\'$$uUΔ{nUX3#IZm[*&,KvCJӦBRM2\Y*!U5PWUЯWtújG΅"q, FRBteӮuJђ%p'G>ɓ'~-ڮ\u۶m Jg -~j˒k*ǎ< jiZkfc 0O, IDATY.R 8۷o\~L&O4 <==CBBΟ?/t͏?Fd2yٲen(,,d2#Fv20}?~Ο?fgg̙SQQ 7n,**Zdə3g=y_(fjBPTтˬ~ogg?:ĖK!`Ef]DI,k(I$x9Z\)3T:eɮVlu_K[Xu-JuqԖie-Rh6>ueR )]k파`iiu֓'O޿'Oh4JxRqT ]/=V %qJs'j`g2@7#9$eex*=6={1cxS~Xu ;v`!NHHP*ׯ_|9-[DGGgff;wnΝƍkvɒ%W64"+))޽{D"ٴiӜ9so%ܿ\.\bEnn.&&&ŋ+qƍ;fӦM|֭[Mow}"\d>>ӧOJ| PZ?āO$f/soFz}?ڛM!Ո1yU.#tm+ !Y\V}3V5Xsggpqg*УCe*K9[j?k* L!//G}TRR&?}lN%;Unv:UsNnQ~4.gv_A&v"F)pL&s]MMn,,,MčLfSsaXDRݼysժU* NӞԐH$2Jxg|믿M̥,E"I2̦UZh+WLNM%8jMvMo]#FнZe.H IJY$PHD<^|RuѨVi.RkZ$/WkΆK<9 0F̆~ȑǏzjkk3ܹԛ_T]hdl1~ xʕ=Ei);/*\a 77?CzX@Uu-\pرnMx]zidذ}ɟ3czEv6#=H_Bh4ڈ# `0nݺuyy@ʪٺP[[[^cֺ7@R= /z@` A@ >#D߇9XX*Ji H(& f4 LlQ5^~vjFw[_ӬT|8sz bSw4=tN,6Qoa,-+E^ ֛\1EY9?тšٖ[x 7hLݽn!lEeSL)D`Fl(/{θ~͚5^^^|9\<6<[tsw>G>xر7p߆{ <g%Pͺ扷=4:ʆ݃"udE.M&kT*b;L@&'>?LWV ar{jLj>|ݿa fsiA݁kc3ƃB&8 v~w8b މU2f̘i:>uu=5gSI -M&f?( jlhl2tF{`xU OM)yeSY&q%x7`OM|~H(._d/rFW FIsTbtCXrh m1 wK+ϊ,=uEz+++:E{D"I&-Z)&&f˖-8n͛7߿ arr9F/FB}ThBxa^M÷Z[d1LlQ[tdj57ygOˮGW~@O.W=H5aZbҍ{k0:lA?s/?G@D 4o(hl:rK>qzУPfnJW.`-Yt9+a9LjxhJANJRnڭQ!yڱf2O%,]*ʄjFo]J0Q/ַrJs߉|5;#Cvӯ}pM |5jMFjQrB6hPId2Š-R3|{{هwY%W=0Ƚn!1ѕh W]zLNN4hЬY֯_R.]:n8kk~]tPuZLV^dREqa[XAΖx>C!2 n6=lLvrf Ex%xz,|ŋ]ӧOc{ܹ633={L&-[888\re=+R:sh\ܭH$|V{?{QcO_2%X^RX+js*Y#qΠ@K:(8}?^nlhe0oF ,U0THpgUUX_JwV5z<(9ĪFP*՘T0QV{| nL&꭫ K/Y%#VW 8fA#<. ^~vG uX 6Z8-59++_>6RVanuS&p[VF a;݁ƃO~xk[.ǜ^_C"*[W}ߝO7#q)\dIL/#\~huǫ[חH$4C`݋-zqvSfuϽB̶(*V628Iښ&*lhJ1˝]6v&ƆVh3s@ j+&J}b1wNaG $bAXPDk;\,-2u"Dպ:cH/F}Tdq>JI}7j̍+y JԷ d⶘ %aw.Ctk[wpiY]alK{PaI>X1]~^^$Wiq@+vRd-z+ W^ձrǏo޼yGJ%c1tsȁP\[tdg+@TD|}ZuVOtց7&9OPv \C.Sb1fn):bӺT^e@6a5궃_MOꂇsr`p"niZ >S* >Klxj@0qANei@#t7f6gO&\4e;52zTUbSc~~~@$qqq ,`00C 5kҥK-[_肒WUUT*+1<)bcxݺKKֈbvD"!,gɠPOcnPQp;1 :2&¯LXU.lmfs6v\PJT~]z*ϵn_:ܝ6+̫6GT v& *!'YB55[rQ G*FF9Zr{C oCzX@kZ\Jf^DM/۷F_f˗;⒘XWWG>\XXsիW?sDD2::ɓ|>ذaT~$XʛB%N%̽ o qyV|>_H$ˊ.?K7g,a'k&[dd 1=P Cv ;yD,)ҊZ{IjҌyr^7t$KP \.׈{PT#z $J!'!*IeiŚQZ\0Ռ,)DA_Ws/򱻿3d:Vk9q1Kr#+ތF6\F @~]ePD&I_xezwmEBaL=mOEȻbP*N "gK_^LƖK"fhĆ#ȴx)jE}@j>FGq8plAe5NRW5 7(V @}^"@z [@ }c~m)I:GB ֏3fΜ9|/7 h>~s@ // m) y׮]iii۶mlgggaaÇmmm<o&&&>zh޽~ {D;wn޼o˙.2Ц~{Tލcv! ˁ@ =E/+VaÆM4:|Cz{{/_|C 333ݻw9sf֭m۶.<<\.ݻ},ѣG 6x{{O:/صk5$!u+O8w󟯫Y/dC^^^mm-DGEE^}f.vڸ@sssvٳg믿s玷7ݞd=z4++O>"9o޼_pAT"z MmGOzQUbz;։.좊@V¸~ƍeeeǎӹ)6Deee\\Omtrr/nnnd2ygΜ9s\.7M/g"eeeZvoElAO\ֶ |젱Y`Žf$.*jk8nPSS}vLEH(,,Ɔt^Ο?fgg̙SQQ"GV/Yfw ^^^F6U %qm[qQcceN`PFI^8mr ~͛x<ɓ' BoݺU]]}uf&&&ŋ+Jۣ8h7mّ2ƞV :}JRFѸ~z͞wxa ^JasAeee$yT*ǫ0:sssL&<6QbPH6R؛޴; yޛE sz [@ }dl=@}4e0|Rڟ4i@ (..fΜ) [[[{xzz<*LdǏ Jcoo?{3f|#G>^_/ŋ׮]ǏmۦP(>|.}Ϟ=|뭷>s"xI#tR__=//ϐ 215/d2l?Pp8"0}j\߁.* ӧO0`@\HDӭlll~GhLAAADDL^lnAtB8qDbbb=֭P`aaDuu2k.S x5l}BBBFFm%Kddd0*** 999))iXzٿZZ{キbŊ\pBbb͛7,XdR)>pŽ{t¯c˖-Ctttܹs'8hР/;wʕ+7N6mٲeVVV ٷoߌ3Ν;* mۖtܹoV7qY|34.Lrr~%R(3flݺUwװ斑m6())޽{w\\܉'jkv"OZ71V D"ɝwY荋baahuA IDATLfSSSt>"J'R(@ɓ888Sn_矧T gUG\c˸?~<((Ȕ˻/CX,DRn޼jժ;wob +ka__ T*ozQW_#G?~իW[[[g̘A-Zԃ#^]^j8.AP222:H_$0/̻Ѱax֭]vup$xmAzk#Dzk(V ˝9sFC 7o㛛+++)ꯞbݺuyyyƷR_+K=GJ|ULϯ7Gak2eʔ>??LW@$Y,l cƍzO,Rz =J7eуNolllt-0bĈGN^Ը}&V XXX|g4BoΉz2Q`<n;~WWWSjD:Vo'"^B^q}BBF4iR{K,\zuBB 8h7mTZZj(ryeee555x<~c_(c e˖sܹsܸq0hР;v477STHyf]iӦ{6 <ݻT*5--m…* }?[N رC =RRR֬Y7Q^&Ewͱc\\\h4Çn۷F_f 6y3}tT'WOq)\7>|xРAw-..^|K?4DKkUUBєJewezs^:Ϝ9}Jff \B&\5:+W 3_z177  8t萿SwDkannn;w{BHf׬Yk.ol=" yM5jTHHHMMMbbbrrroKG O_އ@  dl=@}^[$``R ++c=qm)䕱xfzG`vjfϩ2+`ܠiN\j%jj3opW  _X.z"D sc>?_ʢ֒d_kgܪ5/,[}¹& @ ^s^'qbNXq?Qׯ-L۝K. Ex?,D,khP@ pYD~6oJJo9\+D͏` m}MX OIt|{;[rtx̿qO(MMCϧﮚO,U8z\x=@hyz+ F_zfb\D^@ ^(V @>Y0}G z0}G z0}G z0}G z0}G z0}G z0}G z0}G z0}G z0}G z0}G Ӈ-Zh4Zvvvhӊٳgè(@]'OUSS] L4iРA744Q6B3aE5i-ido feJ ֓DC\!+J$rͤ vJ+)SO}/]kCcRv*zvVQEHٷ% ҍX)JEM6\-J{aE\19VKVӌL*o>n$Zm% bRzvj{|!C,--_~wվյ{=QBBBEEŋ}GFY:dr 6!_4cw02!5dmaϝǺ24F=}w[3(($:<^L57nTW?{ݴiӋl*ٝu]w닏p_KyD}vͱڗf;ذ˚YtwcVQpy+s}~êeC4+FH|-͖Fxk0l;Ԃ>a$BSY٩M/`YYY>Һ@+sp3ȕ]9M$cQRЗkp{M]zەOB\xܘz2aGZ*)))))R(^?ƽ&ҍp`4}pQڳ$[aaB#:s_/ki}7y&xIY ^þtxϝ;w ' nnnKQQQzz_U_}pHNN8pyrss?r}ٶm[NNҥKqɘ1ccccz8ιs8Ύ; ֬Y>5mڴÇ_r%===22RO1 [xqnnnrr2ƍtݻwwӞxG6PܫpU)t*x"W>lc p*|!wzFh&b!LgoWc<R+]yU=l0 m͠ AV_ K93F0"^.ni1\?eäZ3ooӧ755͝;\]]SSS^:~ҥKs)))R!Hv~zttIM\\\||-[Ə/-,,TaѢE|IHHĉ """))i֭d׮]P\\c|КIon?~T.fP2qjI3+h¿;ܖ<:aev.y842iͫU0z4e6vk-jP@(SR|ƉE׼=ީ\x!DlmfNuŜ"_"`T!9ٳg-[fnn@İs挦D,@KKƍSSSl2{K?^N, i_^FWR-D2sdH,!O U(`QUg6Ԋ.êTǏ͞=ŋw^n.%\O]^* ė;PPge],Ies13??i6E<3DdddMMM}}}CC>]\\,q?vvv...n޾h.[4;;;X~~~Ǐד^][n@CCz,f[[[J]rS-[QYYKTg:z]¥d6Bs7_Ϻ7A$ȕ BeW *yu *zv}ZP2~{B)+M%y:%SȄ8w#DFF2DS-[CbbGRRRFF. ! hXzj%*|U"yĊAK>ذr6+UDTǰT*5..n֬YwֳJ$Z)y*lCB]jy/}|A5Jmי4~kO.6}tT!!!fJMML >>>OL&/---=z4B7o>keee,k۷o7"8iҤÇӧ aԩS `h0;_Q+/=e뜗`>|& 1/o"'j*D 21ԆmI#'`ިlsxM5GIFF9r͡C9rDT0"?tZɕOZ&nl!6 G.Mu@ZTTtj5,Dpqq7nܺu뚚te4ѲM*/xV1lg׵{[1q#zX20 YXYLn >@ o;v|?g}fooy漼<طo_FFL&[l>@Ku뒓 Ҷm;hMHH[xYEEErrrJJP(\fԩS/%駟$Iuu ߿GtR]]@e2;3b0k֬9uׯ_of;vT>2ŬZ|3wPȢ*RՕ}"8>f;oUWC{ҤI"h$>ȹŜ^^~,xiCTr]hq hKCCu$xeNC+4Gr4;G\ռÚv޻W?ܬxJOU 4*àIVcw<_paEEŰa$֫4g8 p4~Kl WK ;:XRJ?WԶ?a`͊%Ux:̖W1[mv%2L>> 2d ك=Zu4WPj.v&-,WQ \9.\tZ=EߩW Ow3|3ajmm,wttSknn6d7@`X--"lnn. r˗-Z$45L&S(|Gr waÆڐ42NyjPQ&s211fk.0eSILZyC'Ŝ.U(k״SZZ:x`UZN*:τI&EL"` S=NKFِM%IJDT"r)D̊NiZm˰ZaQ[T2mF},zimzJ&T*2dԨQ.\wܹvhM/ɴNv8~XX;11Q3bYiRBu322O?H--hiC^CT䥋FQyuG_^0ʆosZ ei6213/*T=}VjꢳLf:z~+uu/ueeeݲtO>ODZUArҳ65 f헫Aicʾ@ 8hOc0}G z0}L׿`0W{ B WW>|ԩ}ٳ5d \,G︣,@Ba8=ܶoߞd29<<ёㅇs߾}{)**JNN5t < IDATW_\v#G_0_7gq{׌[-| Ӡ| Ǩb20`ϟ߿)))'NX~=Dk5:x Zo_~*}߿>댴?p!o@ L7KPsuww_xfb K;w.44tu;wKH~uq[Mhۥr@cOQ|a@~ՕҌGs72A#~~W_ᇞ eڵ'N8qD"!uF_vzЎ,|t}u|+@ =Mƅ ޽{OV"JgG?vؑsN|CJJ3/N:K]YR^@/coXWWqFXrSeee~~~xъ!P(l֭[=;;SzWֶ v 1#}{{#|=@>#뻅(@~{{;I& 4H}~4עZ6q@_  mRЍͰS4N2_~_~%7݉`FϮjg;(kw\&㘑2J5 \3By]i1эժUk%K>})Gxp B|I'Z$r`G˄׼~yƣ=wbU|syhIf!.>pa3K#<\QU7ݻiӦ,:Z⾞aJz&8;i嗟,ÅZ˚A<įnF!IYe u>hGjj*ZÇ߸q_YYYC76ߊkWcfdEwKB_ٷV: 5 2ރ8YZheuzY}Rq˲t*x"W>lcXy$x/:X~?"OC Lzϣh5[Nda#~`;hw멾OsimÞƜq0-{}F,5.Q>ϺBC2Z $[նkT>ʨ!FJy {)//p?̔vvvmmmrէ b8ZE~Rp6YעUh6@_ԶKt2Lz&RT]Tk,*G܊Ai)qnkь%O;}lz*T*X\4_"ߜ[Z_>EL9uS''+V|*7k֬ݻw.@k{5rAۢB\X%ċ㕞vj8}tll,L&c`uܹs3f033.+eiiCPPömb1>7eee@"®p/U(x⌌ ]/]fǏfdd(ʨC_t`۷Oն)))GK.}Sw~,Y^Yo Wzw Rj}N톶,a4yGTjtt N8Kf;vT>2ŬZ|3wPȢ*RKV:祇Hq6'j;PSrDlTqbIDžeU6/`y7CJU̩? qӤ^vZ/nVq/&DΡ+۴׋_p0,,,(((::` ; dR-gzo ;o=j mP?6\.9Z DWx=knn~D]UUU(P(uuOg322,,Ynݺ~p8J0UMMMQذaCCC_mH)D̍ͨj 4*OOÇy/QcA#|@ii՟VY3|ˢeQ0HE Fn4X1(BiO29]PִKz\7כ6l2dHEE~~tiӦ7o޽ >> ۷w{^Ł|}`ccPVV5xz|rUjNr/"/@@ LWz@ A@ L1L>È;wqɓ'?sd /--}qYСCG& )&&&::ސcaa1yL裏Vpt/...qqq;V*lDJAELfS/nTؙ)S<DžK,¨T'ѣ #++K"y|SN}ܭ_ eժUnYamr7oY"K5c ??4";vzÿiz>|m7*xbJJʃ Lyoӿ .1jcwӃd?K j7WkEks9cǎ5kr_\v%0lŹEƍwߵk>_U_}p]>}l۶-''gҥjʕ+۷oJQ_bt555իǏWo9bĈiӦEDD[]Wϟ@?󭭭)ʡC  ={899ի;T(:@ ̟??44444/ɜ?pa͋B/^\v5kK=pgy{{O>iܹ@ ~|G,X4p(V:V :uy&N8{l׿GPp ̘1i/33~ťb[`` NU*oo襤$ }[[[ 9sv驙2...>>~˖-Ǐ{~Μ9Ν-xx>ӊX%Nڻw/677gggWWW̙34]cǎ 6짟~xɓ'`Æ ׮]J4t(xڵCz beeէOt];h 2j(.$Jw~cjB"kk׮moo>}ܹs^sb8GW/**6lU/T숈>|xhh̙3bBwvv...~u={M駟A8k׮u9;;?~k o?nذa…맟~pD"{@ee%o~ZZRTTiիoܸE=5\|>덈xxz,B IP֮]{ĉ'NH$"ގz;;;}qUUUmm-@ppp.Ϝ9m۶7^r9zηoV?rԥ\1\] wWiK+H$R[;;;yWLOO?t;V:֖Jog3ꕗ'  Źs௕zP??c]^zΧ: F RR-22_ lu}}\.W_aooA;wܳgτ  t=J:@ihh|m...U1\] ̢.* ꪵ^r\Q߾}tڃVmll\paRR|i;ذQRyyySn/ɴ> o/ ; N,㣂~~~M;sQ&I;ޞ3{dD"qҤIAAAӧO6ðSVUU|&icccgg߂NgJKKGMP͛^طo_&)JK.i:(%33BDEEODDӧuUp5WYYh080rʛ7oWssJ]lY@@" 0ᄇ%0 ÷ꬫ۸qX,VO䚙ZյMJ$GGGh4ssǧjjjr9pԭfT{u/eee,k۷o7$FDwpp&$$6LυsӧOvvvVVƍZ駟f͚`ѣGϜ9sҥ˗/Ϙ1#!!A&}edd={v׮]z޾׭[7`m۶¾}={6--G'N8o<M%iii7nx뭷Ȥ-[G:WA?y~~̙3\999+Vx?3k.{/xx\^;w\lYnn.NMMգs߾}ׯ_߰a~iVVֱc~#Gr???xJ:pŊnnnW\zX,޺u:qrr#GΜ9sy* on3??__TQQrܹ_~XKFD$o>bX(OF&)JU14vK񚛛 y&,cVkk붶sqT*Çtac]]z633/qㆺ !MF|ͅdrM1 ``0d2Y͜; t:Lnmm5H0 `*++ӌ96Ÿ4ήCgWg:cnn. r˗-Zt5;7"x#|Bff~, `ҳ 2dԨQ.\L&sΜ9=](++(Tj~~~ éW"^>CBBrrroa#) #z"+ _@ as(V˧c_&0f ԟ«9&&&,,ސo)JN0!66_~7oT"@ z }@LL Q{ohmp7..۷o=z˗kkk X%oGJpP ѣ;f1h׮];j7Wk*UƾDkLƎbŊ]zU*w%bvohm/]ع^0ъ{3**)(((<<*yx|=U-J^P!ZXZZ>|7o޾}ڃkV޽{ӢLZKPk `1c&Olnn $$*yx4FJ+V+s#Gh K[^^nmmi&=UJ]*//,$l2ct@Wr֭UP7ׯ_ĨX%`L r%|u)*t% ot@W `ҁp *yvK}9P!^0#t |L^rkI;bc-tW1cƬ]D2oDWtaz@\\ѣ;1P^ZzBt 80=^_bX%Zy/F5{zK֝P!0PBt0 k*1wh/]B=!P"444??a L7bKD}aXzz R=h `BD]M&bX3/ K+&mݺU%] 80=_"btW &L8(QTVNA5$N {3IpΜ|ݸ # e3)@9@>~B#{?o3)`e6=g[*Nyyf_/(O:#폲g)F v^'q IDATAKoY4X󵊚uV w\æVqc%@ L=dkN"&=*+ϛ2|*LA"й\B0=^klW,. DsA|v+ :Y^/ar1D~~]^=ۖԕm`Dۃ@ I&?}1jAL(ی+c{Y8֖<sy}.fTT!'#`F:F@ =A"|=@>#|=@>#|=@>#|=@>#|=@>#|=@>#|=@>#|=@>#|=@>#|=@>#|=@>D2󳰰|; dIJxzW.pApeBk^ ?cX_y%Ta,u&k<>Zƨ2:Q˯k LO0ӌLl$c7=l>OqI&pa'KpVZ3(($:<^LLd!~B੬RىM_>|IOPBaVVVႌ;e%2\o_k޿ca, 2הW $3ԔhW[RRRR'P(^?ƽ&ҍp`4}č4ڕXjV>n^/J:~W4eoQ(x ~u?Fu-j{?7ޮGLsyы.kJόsk׮͚5 P(*???77w…;׿/^ cǎ]bŀҮ^V;mڴÇ_r%<<X,VzzzzzzJJf7o^nnǹ\..ӧ϶mrrrΟ?n:c/0D]fΜ'Xv|"bGKBYL|a O׵ܫp'8Od"~#F]ÈF|߫\e?$c04?c0E `aT!]\\BCC LEx0QSՆe6aQHyw\W\B`N1!?o Cp2 sdZt!F$+F2ueX|7o޾}{RR ...>>~˖-Ǐwa`Μ9;w,g}=}skjjիWǏ)@P:TXX8hРٳIP|+W ?~!C<.>Ex *ժI$ͬl?!ؙLn{2.z| j0=8̷8fK-qb5/7]Pߺ0:S}=̩o<9@ݷ+VfT ryRRҞ={{O ѰX'ɚwږfwXQ;04`_WmT yM^l3{Z6ei6F nI#^dXB2~;F~;Ch_\^ .$ ~gx |%|1uG@QQѰaÎ92mڴO?8k.]}rkkM6@Xzubb7MRTr{{BU*UvvvDD$&&^vСCPWWgl|>MJJJ틎ټym۶~NFڤܛcm@3﷫K91]WyΝ{iJG9nܸrՆe6ĹTوhWt2YU*?iJ̳E2Ps.aq:09{<^o:$ `˖-/ưDL!){(!dzD;?7ޤ'2~:y[&We:޴;Fu|}SS%`RԼ<\|r=.]+"(H4 WT ~sWRT]gggwJJʜ9sݻWXXh~M9_"&*o~78Ԇ͗h Jj2'YlJ(5de|!H]~yNe(ڜC#ܬmaVci 4;XTeږjEd&SjYlq3ghJǰJ:~xZZٳ/^{giՆ/԰K\A"i$ %QG?t@j$!!EY"C|EC [Tjs"~3v\fIe쯅Ix_}\p8ߍ*˫@.O_ԤKX,nooKKK??ǏR50h c9R퍯{yyy߿_f=ԴKj"Q(ϡZ ޔ[ tY,cev3uZ;T*5..n֬YwRՆ/Ӱ >*ڷ.BTt?9p;WXݰ "D\(V ĺJ</?N6OؙWԴU׈[-[v͂\~?B?>-- =<<\p€K.VVVb\TT7_pJKKG3gΜpCU(//P(QQQiii>>>x1?eʔ#GOyyy3T$fI#?J-E"*gvCV^z`C]lZnJU*!B3OTŜiCEa+]?WdžA:j-b|>… Fv`I#3ɤ0[+vzՆ?<4~l*]rXg!-,WQ \9ZזNcϩ;uixxn[Wg8 C&doY+++LN'ɭX BҲrJ:jժ ۺu+> 9::թ_~6l:thF"ЙJ$|_LͶLjD.WHlbN*5:^_4aQ[aX[2ZDg뵦g|+'N|7.ү_{>|I4hM6ݼysRxg}Un gmqj/Čz?E _;w5aN\=Zxz|rw֖KKKկMݞHڰ7,ȚƦ7_jE#4F z0}G e*yʇ~vΝXxȐ>(??_A"cbb7h_*:a„~ݼyS"LɓfО?Ǝ+J;ˏqd { zo; Esis͛7?gSN^]jzsPcto:@PVZp^|}} L}ѣG_|@ @Ä۩vҦ?f^kƌ~~~ϝK9>i$:Ir˽d?K%|||RSSwѽ:_\=JII LfG>}z׮]xC0<ϋM.N-+Wo>y$<7((ðps>=zٳgF t`ɒ%~-ӌ=3/$\,xZH++zZ<(Z-ңTTڃDV>VڕP #Ѐ\eբ R#ThD6O6@q7f&﷠aljQnfWUUw˗/m۶8:: B d^~MOO?w\iiiAAD"33O>~*YT[41/`412t!0;v(...**Rn%;;… MtEnvM6D'OiY5mڴ%Kܿ֬Y@?ubG@_W~?!*0$<4988:tϟOR6b4ex'OFw18.Gxp*VWWGDDwsss>: eᐛе><<[z9sC\|yll,ۼy͛666QQQׯOMM255Q]JJJdd={Νwwy'222$$dٲeZ-HKKzwڕM&W 'N8s挟_BBB]]߼ys``مrk֬پ}; ԬX"::/`\6*a P?X(6lPn+))AAAK,oD]6o+WҴ,155% qm۶nܸחlr1 < =@s(ijkk faaaSLP(t?ۢ !!v26t<㈲gI8p`޽`ll|Ẻ`T>T=5kCnBx<+++??"{qrr*..^v֋-joohii ! 曋/&瓛?"(,,o6mq5ktttH$;w<쳧N%+~n%txLtR$ڵk,tigЭA3f…֭7x<իWh3c;;;5fӅL:uѢE2L tu00ewd9-㐹(Ç塤i``@&999D 655QPQ~^ɘeIP##C)cǎX,}H]#r֟:u1++k'/wߑ{999a77e˖mܸ̘>>>\.w޼yeCCNx}}}\]]F̞=[,SVmr0@oo/`̢~B2F"hrܹsΝEEE:M%ܦ@&@oo/!m`Na0B$? / 懒T*9sPQQQTTݻw5(&t@56t2G: Nz{{|e'766 ʇjKӄsᨨt.jw=Tzر{Q*͛7Ϟ={ȑCCCVR GS>e[:_3Xbd4C`W{{-[233 O-Ou]pL!8B]uuutP(G!JZ塤iUUUeeeYYY.]"N@56tRrO d2ࠧ'э$?W_|ŗ_~I.D8d2ǬD 9}tr{̙3f(=HR///YXXwBCC|~hhh||<34NVX[[gggko0K( >$12)))3fв6Thffb3[[[rFIZZJT*m|}}ׯ_g=vg]t>rsscE=k֬n:::\]] ((())I4iݡ/Vljj z+]P o-"##322\F睪 u EI" ,X@Wt:q4kӧ TۗwԩbHnfff~jW*wGJ,D|rM'6mH$䄈WUU({nIID"ٱc]^^vUKj˚>JO<>r222u֣Gtxʙdб彽qnvvvjB 1Vo۶IDAT~iIi>666 DCy(aESK@Eb[3`E78u.{{{Lot,ҧ)HMhhhDDٳgWXƻQBrrEjj6cڴiHLLqK/TX,TSS3iҤ ՛pgƻ`jj2 y:[Xaleb4Uh`f"Bqy}|LWG[7ה+uK}lMS{dW_~(.z=B5ֵf- v=mm3ݭȯ}Tݒ=jen k{54*qK}tB 5)\U:0{jDJPp9lTDWƸ!ƺַ 2r9^dpdZf+I<Ǩ!wo}+ /]|o}4^hۃB4f3?lJHZ/0n?'nu^ bB ׸s)01W)"TY,c#no!9BHfBHaG!!zXBHqqAYߡE!4/]ܧoBH56ը3Ysњ|^Vb%n%idŁ!~vBṟG !(yZ掗3Nn}6k]%W>wtKXg#~(K XBtFO1qQr@!tQr杮f+Il+>j/]~K+!F!4Rs l&/oL⑟ (rSL9lOWvB11:^v杮7i6bb٤o} 01tu4!5v>nBrLe\oi{hl05Jx!9[᪔]}Ɇ[:*^ϑ/_kBI̍u=z'#XYXBHaG!!zXBHaG!!zXBHaG!!zXBHaG!!zXBHaG!!zXBH~r =l֨!~7fp/("#ju/4眨{44u3%=-#\:z3r*[1ێg#bJy01`~ V&8ٚ+6yfv}Zv1j;B!fn.4_kx %ˎ/SV+scc">ϻ={cpBi6Ŝa͘fE^^A~(H\<_llP<"m^v_jBOXB3>򎟧6!iS^7c#.L \-li}8O֓yޮHo&Bv^/h=9wgD$CnKJ3ܭ|gɝ_~^ɴ!pB% |.c%01JB!7Bk=B?!)%IENDB`ruby-prawn-1.0.0~rc2.orig/www/index.html0000644000000000000000000005517112114176157016717 0ustar rootroot

Prawn: Fast, Nimble PDF Generation For Ruby

Installable via RubyGemsgem install prawn

Building printable documents doesn't have to be hard

If you've ever needed to produce PDF documents before, in Ruby or another language, you probably know how much it can suck. Prawn takes the pain out of generating beautiful printable documents, while still remaining fast, tiny and nimble. It is also named after a majestic sea creature, and that has to count for something.

The features you need, without all the complexity

In addition to being the fastest pure Ruby PDF generation library, Prawn has features that might prevent you from hating your job. The samples below give a taste of what Prawn based programs looks like, click the code to reveal the PDF it generates.

-- Built in support for UTF-8

Internationalized text in Prawn is as simple as providing UTF-8 strings for it to render, assuming you've got a Unicode aware TTF font handy. For those who are running on Ruby 1.9, any encoding that can be converted to UTF-8 will work out of the box!

Prawn::Document.generate("utf8.pdf") do
  font "#{Prawn::BASEDIR}/data/fonts/DejaVuSans.ttf"
  text "ὕαλον ϕαγεῖν δύναμαι· τοῦτο οὔ με βλάπτει." * 20
end

-- Easy image embedding

Prawn makes embedding JPEG and PNG images a breeze. With support for alpha transparency, easy positioning and scaling of images, you'll have no problem including all the graphics you need in your documents.

Prawn::Document.generate("image2.pdf", :page_layout => :landscape) do     
  pigs = "#{Prawn::BASEDIR}/data/images/pigs.jpg" 
  image pigs, :at => [50,450], :width => 450                                      

  dice = "#{Prawn::BASEDIR}/data/images/dice.png"
  image dice, :at => [50, 450], :scale => 0.75 
end

-- Flexible table drawing

Prawn has built in support for rendering text in the form of tables, providing basic reporting functionality. This lets users focus on customizing their documents rather than forcing them to write a ton of low level graphics drawing code.

Prawn::Document.generate("fancy_table.pdf") do

  data = [["Gregory Brown", "gregory.t.brown@fakemail.test" ],
          ["James Healy"  , "jimmy@fakemail.test"           ],
          ["Ross Perot"   , "ross@fakemail.test"            ],
          ["Al Gore"      , "al@fakemail.test"              ],
          ["Ralph Nader"  , "ralph@fakemail.test"           ]]

  table data,
    :position           => :center,
    :headers            => ["Name", "Email"],
    :row_colors         => ["ffffff","ffff00"],
    :vertical_padding   => 5,
    :horizontal_padding => 3
end

-- Simplified content positioning

Anyone who has done work with a low level graphics engine knows that doing coordinate math isn't fun. Prawn simplifies this by allowing you to box off a sub-section of the document and treat it as its own mini-coordinate space. This means that all positioning is relative, making it easy to move things around your document while keeping your code clean. Text can also be flowed within these sectioned off bounding boxes, so this makes it trivial to generate columns of text on the fly.

Prawn::Document.generate("bounding_boxes.pdf") do   

  bounding_box [100,600], :width => 200 do
    text "The rain in spain falls mainly on the plains " * 5
    stroke do
      line bounds.top_left,    bounds.top_right
      line bounds.bottom_left, bounds.bottom_right
    end
  end

  bounding_box [100,500], :width => 200, :height => 200 do
    stroke do
      circle_at [100,100], :radius => 100
      line bounds.top_left, bounds.bottom_right
      line bounds.top_right, bounds.bottom_left
    end   

    bounding_box [50,150], :width => 100, :height => 100 do
      stroke_rectangle bounds.top_left, bounds.width, bounds.height
    end   
  end
end
  

-- And loads more to come

Prawn is currently alpha-level software under active development. New features are cropping up every day, and we expect to see loads of cool things in the near future including integration with the popular Ruby Reports project. For now, you can keep an eye on the latest new features by checking out the examples distributed with the source, which include the code samples shown above and much, much more!

Supported by the Ruby Community

The development on Prawn is in part made possible through donations from the community to Gregory Brown's Ruby Mendicant project, but quickly outgrew its humble beginnings.

Since the project began in April 2008, the project has seen contributions in the form of code, bug reports, and feature requests from a whole bunch of Ruby hackers. You can find many of their contributions by checking out the Github network graph for the project. Although several have contributed patches to Prawn, special thanks goes out to James Healy and Michael Daines for being instrumental to the forward development of the library.

Many people have expressed interest in using Prawn within their Rails applications, and for this purpose, you might be interested in checking out yet another community contribution, thorny_sun's Prawnto Rails plugin. Although this is not officially part of Prawn, we'll do what we can to make sure this plugin continues to work as things move forward

Please join us in the development of Prawn so that it can become the library of choice for PDF generation in Ruby. You can start by getting in touch with us on the mailing list or stopping by to chat in the #prawn channel on irc.freenode.net. There is lots left to be done, and we could use your help!

What are you waiting for?

It's time to generate some PDFs. Get Prawn via RubyGems with gem install prawn or clone us at git://github.com/sandal/prawn.git

Prawn is Free Software under the License of Ruby, developed by Gregory Brown and the Ruby community.
The Prawn logo was created by maso and is distributed under the CC Attribution-Share Alike license.

ruby-prawn-1.0.0~rc2.orig/.travis.yml0000644000000000000000000000040312114176157016173 0ustar rootrootlanguage: ruby rvm: - 1.8.7 - 1.9.2 - 1.9.3 - 2.0.0 - rbx-18mode - rbx-19mode - jruby-18mode - jruby-19mode matrix: allow_failures: - rvm: 2.0.0 - rvm: rbx-18mode - rvm: rbx-19mode - rvm: jruby-18mode - rvm: jruby-19mode ruby-prawn-1.0.0~rc2.orig/GPLv20000644000000000000000000004311012114176157014701 0ustar rootroot GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. ruby-prawn-1.0.0~rc2.orig/LICENSE0000644000000000000000000000460612114176157015100 0ustar rootrootPrawn is copyrighted free software produced by Gregory Brown along with community contributions. See git log for authorship information. Licensing terms follow (License of Ruby): You can redistribute Prawn and/or modify it under either the terms of the GPLv2 or GPLv3 (see GPLv2 and GPLv3 files), or the conditions below: 1. You may make and give away verbatim copies of the source form of the software without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. 2. You may modify your copy of the software in any way, provided that you do at least ONE of the following: a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or by allowing the author to include your modifications in the software. b) use the modified software only within your corporation or organization. c) rename any non-standard executables so the names do not conflict with standard executables, which must also be provided. d) make other distribution arrangements with the author. 3. You may distribute the software in object code or executable form, provided that you do at least ONE of the following: a) distribute the executables and library files of the software, together with instructions (in the manual page or equivalent) on where to get the original distribution. b) accompany the distribution with the machine-readable source of the software. c) give non-standard executables non-standard names, with instructions on where to get the original software distribution. d) make other distribution arrangements with the author. 4. You may modify and include the part of the software into any other software (possibly commercial). 5. The scripts and library files supplied as input to or produced as output from the software do not automatically fall under the copyright of the software, but belong to whomever generated them, and may be sold commercially, and may be aggregated with this software. 6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ruby-prawn-1.0.0~rc2.orig/bench/0000755000000000000000000000000012114176157015144 5ustar rootrootruby-prawn-1.0.0~rc2.orig/bench/afm_text_bench.rb0000644000000000000000000000067112114176157020443 0ustar rootroot$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) require "prawn" require "benchmark" N=2000 Benchmark.bmbm do |x| x.report("AFM text") do Prawn::Document.new { N.times do (1..5).each do |i| draw_text "Hello Prawn", :at => [200, i * 100] end start_new_page end }.render end end ruby-prawn-1.0.0~rc2.orig/bench/ttf_text_bench.rb0000644000000000000000000000077212114176157020477 0ustar rootroot$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) require "prawn" require "benchmark" N=2000 Benchmark.bmbm do |x| x.report("TTF text") do Prawn::Document.new { font "#{Prawn::DATADIR}/fonts/DejaVuSans.ttf" N.times do (1..5).each do |i| draw_text "Hello Prawn", :at => [200, i * 100] end start_new_page end }.render end end ruby-prawn-1.0.0~rc2.orig/bench/png_type_6.rb0000644000000000000000000000051612114176157017545 0ustar rootroot$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) require "prawn" require "benchmark" N=5 Benchmark.bmbm do |x| x.report("PNG Type 6") do N.times do Prawn::Document.new do image "#{Prawn::DATADIR}/images/dice.png" end.render end end end ruby-prawn-1.0.0~rc2.orig/bench/table_bench.rb0000644000000000000000000000302712114176157017721 0ustar rootrootif RUBY_VERSION =~ /1\.8/ require "rubygems" class Array def sample self[rand(self.length)] end end end $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) require "prawn" require "benchmark" # Helpers for benchmark class String CHARS = ("a".."z").to_a def self.random(length) length.times.collect { CHARS.sample }.join end end def data_for_table(columns,rows,string_size) rows.times.collect { columns.times.collect { String.random(string_size) }} end def benchmark_table_generation(columns,rows,string_size,options={}) data = data_for_table(columns,rows,string_size) Benchmark.bm do |x| x.report("#{columns}x#{rows} table (#{columns*rows} cells, with #{string_size} char string contents#{", options = #{options.inspect}" unless options.empty?})") do Prawn::Document.new { table(data,options) }.render end end end # Slowest case: styled table, which is very squeezed horizontally, # so text has to be wrapped benchmark_table_generation(26,50,10, :row_colors => ['FFFFFF','F0F0FF'], :header => true, :cell_style => {:inline_format=>true}) # Try building and rendering tables of different sizes benchmark_table_generation(10,400,5) benchmark_table_generation(10,200,5) benchmark_table_generation(10,100,5) # Try different optional arguments to Prawn::Document#table benchmark_table_generation(10,450,5, :cell_style => {:inline_format=>true}) benchmark_table_generation(10,450,5, :row_colors => ['FFFFFF','F0F0FF'], :header => true, :cell_style => {:inline_format=>true}) ruby-prawn-1.0.0~rc2.orig/data/0000755000000000000000000000000012114176157014776 5ustar rootrootruby-prawn-1.0.0~rc2.orig/data/shift_jis_text.txt0000644000000000000000000000001512114176157020561 0ustar rootrootCy[W ruby-prawn-1.0.0~rc2.orig/data/encodings/0000755000000000000000000000000012114176157016747 5ustar rootrootruby-prawn-1.0.0~rc2.orig/data/encodings/win_ansi.txt0000644000000000000000000000047412114176157021324 0ustar rootroot# A mapping of WinAnsi (win-1252) characters to unicode. Anything # not specified is left unchanged 80;20AC 82;201A 83;0192 84;201E 85;2026 86;2020 87;2021 88;02C6 89;2030 8A;0160 8B;2039 8C;0152 8E;017D 91;2018 92;2019 93;201C 94;201D 95;2022 96;2013 97;2014 98;02DC 99;2122 9A;0161 9B;203A 9C;0153 9E;017E 9F;0178 ruby-prawn-1.0.0~rc2.orig/data/fonts/0000755000000000000000000000000012161041170016113 5ustar rootrootruby-prawn-1.0.0~rc2.orig/data/fonts/Symbol.afm0000644000000000000000000002301412114176157020061 0ustar rootrootStartFontMetrics 4.1 Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All rights reserved. Comment Creation Date: Thu May 1 15:12:25 1997 Comment UniqueID 43064 Comment VMusage 30820 39997 FontName Symbol FullName Symbol FamilyName Symbol Weight Medium ItalicAngle 0 IsFixedPitch false CharacterSet Special FontBBox -180 -293 1090 1010 UnderlinePosition -100 UnderlineThickness 50 Version 001.008 Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All rights reserved. EncodingScheme FontSpecific StdHW 92 StdVW 85 StartCharMetrics 190 C 32 ; WX 250 ; N space ; B 0 0 0 0 ; C 33 ; WX 333 ; N exclam ; B 128 -17 240 672 ; C 34 ; WX 713 ; N universal ; B 31 0 681 705 ; C 35 ; WX 500 ; N numbersign ; B 20 -16 481 673 ; C 36 ; WX 549 ; N existential ; B 25 0 478 707 ; C 37 ; WX 833 ; N percent ; B 63 -36 771 655 ; C 38 ; WX 778 ; N ampersand ; B 41 -18 750 661 ; C 39 ; WX 439 ; N suchthat ; B 48 -17 414 500 ; C 40 ; WX 333 ; N parenleft ; B 53 -191 300 673 ; C 41 ; WX 333 ; N parenright ; B 30 -191 277 673 ; C 42 ; WX 500 ; N asteriskmath ; B 65 134 427 551 ; C 43 ; WX 549 ; N plus ; B 10 0 539 533 ; C 44 ; WX 250 ; N comma ; B 56 -152 194 104 ; C 45 ; WX 549 ; N minus ; B 11 233 535 288 ; C 46 ; WX 250 ; N period ; B 69 -17 181 95 ; C 47 ; WX 278 ; N slash ; B 0 -18 254 646 ; C 48 ; WX 500 ; N zero ; B 24 -14 476 685 ; C 49 ; WX 500 ; N one ; B 117 0 390 673 ; C 50 ; WX 500 ; N two ; B 25 0 475 685 ; C 51 ; WX 500 ; N three ; B 43 -14 435 685 ; C 52 ; WX 500 ; N four ; B 15 0 469 685 ; C 53 ; WX 500 ; N five ; B 32 -14 445 690 ; C 54 ; WX 500 ; N six ; B 34 -14 468 685 ; C 55 ; WX 500 ; N seven ; B 24 -16 448 673 ; C 56 ; WX 500 ; N eight ; B 56 -14 445 685 ; C 57 ; WX 500 ; N nine ; B 30 -18 459 685 ; C 58 ; WX 278 ; N colon ; B 81 -17 193 460 ; C 59 ; WX 278 ; N semicolon ; B 83 -152 221 460 ; C 60 ; WX 549 ; N less ; B 26 0 523 522 ; C 61 ; WX 549 ; N equal ; B 11 141 537 390 ; C 62 ; WX 549 ; N greater ; B 26 0 523 522 ; C 63 ; WX 444 ; N question ; B 70 -17 412 686 ; C 64 ; WX 549 ; N congruent ; B 11 0 537 475 ; C 65 ; WX 722 ; N Alpha ; B 4 0 684 673 ; C 66 ; WX 667 ; N Beta ; B 29 0 592 673 ; C 67 ; WX 722 ; N Chi ; B -9 0 704 673 ; C 68 ; WX 612 ; N Delta ; B 6 0 608 688 ; C 69 ; WX 611 ; N Epsilon ; B 32 0 617 673 ; C 70 ; WX 763 ; N Phi ; B 26 0 741 673 ; C 71 ; WX 603 ; N Gamma ; B 24 0 609 673 ; C 72 ; WX 722 ; N Eta ; B 39 0 729 673 ; C 73 ; WX 333 ; N Iota ; B 32 0 316 673 ; C 74 ; WX 631 ; N theta1 ; B 18 -18 623 689 ; C 75 ; WX 722 ; N Kappa ; B 35 0 722 673 ; C 76 ; WX 686 ; N Lambda ; B 6 0 680 688 ; C 77 ; WX 889 ; N Mu ; B 28 0 887 673 ; C 78 ; WX 722 ; N Nu ; B 29 -8 720 673 ; C 79 ; WX 722 ; N Omicron ; B 41 -17 715 685 ; C 80 ; WX 768 ; N Pi ; B 25 0 745 673 ; C 81 ; WX 741 ; N Theta ; B 41 -17 715 685 ; C 82 ; WX 556 ; N Rho ; B 28 0 563 673 ; C 83 ; WX 592 ; N Sigma ; B 5 0 589 673 ; C 84 ; WX 611 ; N Tau ; B 33 0 607 673 ; C 85 ; WX 690 ; N Upsilon ; B -8 0 694 673 ; C 86 ; WX 439 ; N sigma1 ; B 40 -233 436 500 ; C 87 ; WX 768 ; N Omega ; B 34 0 736 688 ; C 88 ; WX 645 ; N Xi ; B 40 0 599 673 ; C 89 ; WX 795 ; N Psi ; B 15 0 781 684 ; C 90 ; WX 611 ; N Zeta ; B 44 0 636 673 ; C 91 ; WX 333 ; N bracketleft ; B 86 -155 299 674 ; C 92 ; WX 863 ; N therefore ; B 163 0 701 487 ; C 93 ; WX 333 ; N bracketright ; B 33 -155 246 674 ; C 94 ; WX 658 ; N perpendicular ; B 15 0 652 674 ; C 95 ; WX 500 ; N underscore ; B -2 -125 502 -75 ; C 96 ; WX 500 ; N radicalex ; B 480 881 1090 917 ; C 97 ; WX 631 ; N alpha ; B 41 -18 622 500 ; C 98 ; WX 549 ; N beta ; B 61 -223 515 741 ; C 99 ; WX 549 ; N chi ; B 12 -231 522 499 ; C 100 ; WX 494 ; N delta ; B 40 -19 481 740 ; C 101 ; WX 439 ; N epsilon ; B 22 -19 427 502 ; C 102 ; WX 521 ; N phi ; B 28 -224 492 673 ; C 103 ; WX 411 ; N gamma ; B 5 -225 484 499 ; C 104 ; WX 603 ; N eta ; B 0 -202 527 514 ; C 105 ; WX 329 ; N iota ; B 0 -17 301 503 ; C 106 ; WX 603 ; N phi1 ; B 36 -224 587 499 ; C 107 ; WX 549 ; N kappa ; B 33 0 558 501 ; C 108 ; WX 549 ; N lambda ; B 24 -17 548 739 ; C 109 ; WX 576 ; N mu ; B 33 -223 567 500 ; C 110 ; WX 521 ; N nu ; B -9 -16 475 507 ; C 111 ; WX 549 ; N omicron ; B 35 -19 501 499 ; C 112 ; WX 549 ; N pi ; B 10 -19 530 487 ; C 113 ; WX 521 ; N theta ; B 43 -17 485 690 ; C 114 ; WX 549 ; N rho ; B 50 -230 490 499 ; C 115 ; WX 603 ; N sigma ; B 30 -21 588 500 ; C 116 ; WX 439 ; N tau ; B 10 -19 418 500 ; C 117 ; WX 576 ; N upsilon ; B 7 -18 535 507 ; C 118 ; WX 713 ; N omega1 ; B 12 -18 671 583 ; C 119 ; WX 686 ; N omega ; B 42 -17 684 500 ; C 120 ; WX 493 ; N xi ; B 27 -224 469 766 ; C 121 ; WX 686 ; N psi ; B 12 -228 701 500 ; C 122 ; WX 494 ; N zeta ; B 60 -225 467 756 ; C 123 ; WX 480 ; N braceleft ; B 58 -183 397 673 ; C 124 ; WX 200 ; N bar ; B 65 -293 135 707 ; C 125 ; WX 480 ; N braceright ; B 79 -183 418 673 ; C 126 ; WX 549 ; N similar ; B 17 203 529 307 ; C 160 ; WX 750 ; N Euro ; B 20 -12 714 685 ; C 161 ; WX 620 ; N Upsilon1 ; B -2 0 610 685 ; C 162 ; WX 247 ; N minute ; B 27 459 228 735 ; C 163 ; WX 549 ; N lessequal ; B 29 0 526 639 ; C 164 ; WX 167 ; N fraction ; B -180 -12 340 677 ; C 165 ; WX 713 ; N infinity ; B 26 124 688 404 ; C 166 ; WX 500 ; N florin ; B 2 -193 494 686 ; C 167 ; WX 753 ; N club ; B 86 -26 660 533 ; C 168 ; WX 753 ; N diamond ; B 142 -36 600 550 ; C 169 ; WX 753 ; N heart ; B 117 -33 631 532 ; C 170 ; WX 753 ; N spade ; B 113 -36 629 548 ; C 171 ; WX 1042 ; N arrowboth ; B 24 -15 1024 511 ; C 172 ; WX 987 ; N arrowleft ; B 32 -15 942 511 ; C 173 ; WX 603 ; N arrowup ; B 45 0 571 910 ; C 174 ; WX 987 ; N arrowright ; B 49 -15 959 511 ; C 175 ; WX 603 ; N arrowdown ; B 45 -22 571 888 ; C 176 ; WX 400 ; N degree ; B 50 385 350 685 ; C 177 ; WX 549 ; N plusminus ; B 10 0 539 645 ; C 178 ; WX 411 ; N second ; B 20 459 413 737 ; C 179 ; WX 549 ; N greaterequal ; B 29 0 526 639 ; C 180 ; WX 549 ; N multiply ; B 17 8 533 524 ; C 181 ; WX 713 ; N proportional ; B 27 123 639 404 ; C 182 ; WX 494 ; N partialdiff ; B 26 -20 462 746 ; C 183 ; WX 460 ; N bullet ; B 50 113 410 473 ; C 184 ; WX 549 ; N divide ; B 10 71 536 456 ; C 185 ; WX 549 ; N notequal ; B 15 -25 540 549 ; C 186 ; WX 549 ; N equivalence ; B 14 82 538 443 ; C 187 ; WX 549 ; N approxequal ; B 14 135 527 394 ; C 188 ; WX 1000 ; N ellipsis ; B 111 -17 889 95 ; C 189 ; WX 603 ; N arrowvertex ; B 280 -120 336 1010 ; C 190 ; WX 1000 ; N arrowhorizex ; B -60 220 1050 276 ; C 191 ; WX 658 ; N carriagereturn ; B 15 -16 602 629 ; C 192 ; WX 823 ; N aleph ; B 175 -18 661 658 ; C 193 ; WX 686 ; N Ifraktur ; B 10 -53 578 740 ; C 194 ; WX 795 ; N Rfraktur ; B 26 -15 759 734 ; C 195 ; WX 987 ; N weierstrass ; B 159 -211 870 573 ; C 196 ; WX 768 ; N circlemultiply ; B 43 -17 733 673 ; C 197 ; WX 768 ; N circleplus ; B 43 -15 733 675 ; C 198 ; WX 823 ; N emptyset ; B 39 -24 781 719 ; C 199 ; WX 768 ; N intersection ; B 40 0 732 509 ; C 200 ; WX 768 ; N union ; B 40 -17 732 492 ; C 201 ; WX 713 ; N propersuperset ; B 20 0 673 470 ; C 202 ; WX 713 ; N reflexsuperset ; B 20 -125 673 470 ; C 203 ; WX 713 ; N notsubset ; B 36 -70 690 540 ; C 204 ; WX 713 ; N propersubset ; B 37 0 690 470 ; C 205 ; WX 713 ; N reflexsubset ; B 37 -125 690 470 ; C 206 ; WX 713 ; N element ; B 45 0 505 468 ; C 207 ; WX 713 ; N notelement ; B 45 -58 505 555 ; C 208 ; WX 768 ; N angle ; B 26 0 738 673 ; C 209 ; WX 713 ; N gradient ; B 36 -19 681 718 ; C 210 ; WX 790 ; N registerserif ; B 50 -17 740 673 ; C 211 ; WX 790 ; N copyrightserif ; B 51 -15 741 675 ; C 212 ; WX 890 ; N trademarkserif ; B 18 293 855 673 ; C 213 ; WX 823 ; N product ; B 25 -101 803 751 ; C 214 ; WX 549 ; N radical ; B 10 -38 515 917 ; C 215 ; WX 250 ; N dotmath ; B 69 210 169 310 ; C 216 ; WX 713 ; N logicalnot ; B 15 0 680 288 ; C 217 ; WX 603 ; N logicaland ; B 23 0 583 454 ; C 218 ; WX 603 ; N logicalor ; B 30 0 578 477 ; C 219 ; WX 1042 ; N arrowdblboth ; B 27 -20 1023 510 ; C 220 ; WX 987 ; N arrowdblleft ; B 30 -15 939 513 ; C 221 ; WX 603 ; N arrowdblup ; B 39 2 567 911 ; C 222 ; WX 987 ; N arrowdblright ; B 45 -20 954 508 ; C 223 ; WX 603 ; N arrowdbldown ; B 44 -19 572 890 ; C 224 ; WX 494 ; N lozenge ; B 18 0 466 745 ; C 225 ; WX 329 ; N angleleft ; B 25 -198 306 746 ; C 226 ; WX 790 ; N registersans ; B 50 -20 740 670 ; C 227 ; WX 790 ; N copyrightsans ; B 49 -15 739 675 ; C 228 ; WX 786 ; N trademarksans ; B 5 293 725 673 ; C 229 ; WX 713 ; N summation ; B 14 -108 695 752 ; C 230 ; WX 384 ; N parenlefttp ; B 24 -293 436 926 ; C 231 ; WX 384 ; N parenleftex ; B 24 -85 108 925 ; C 232 ; WX 384 ; N parenleftbt ; B 24 -293 436 926 ; C 233 ; WX 384 ; N bracketlefttp ; B 0 -80 349 926 ; C 234 ; WX 384 ; N bracketleftex ; B 0 -79 77 925 ; C 235 ; WX 384 ; N bracketleftbt ; B 0 -80 349 926 ; C 236 ; WX 494 ; N bracelefttp ; B 209 -85 445 925 ; C 237 ; WX 494 ; N braceleftmid ; B 20 -85 284 935 ; C 238 ; WX 494 ; N braceleftbt ; B 209 -75 445 935 ; C 239 ; WX 494 ; N braceex ; B 209 -85 284 935 ; C 241 ; WX 329 ; N angleright ; B 21 -198 302 746 ; C 242 ; WX 274 ; N integral ; B 2 -107 291 916 ; C 243 ; WX 686 ; N integraltp ; B 308 -88 675 920 ; C 244 ; WX 686 ; N integralex ; B 308 -88 378 975 ; C 245 ; WX 686 ; N integralbt ; B 11 -87 378 921 ; C 246 ; WX 384 ; N parenrighttp ; B 54 -293 466 926 ; C 247 ; WX 384 ; N parenrightex ; B 382 -85 466 925 ; C 248 ; WX 384 ; N parenrightbt ; B 54 -293 466 926 ; C 249 ; WX 384 ; N bracketrighttp ; B 22 -80 371 926 ; C 250 ; WX 384 ; N bracketrightex ; B 294 -79 371 925 ; C 251 ; WX 384 ; N bracketrightbt ; B 22 -80 371 926 ; C 252 ; WX 494 ; N bracerighttp ; B 48 -85 284 925 ; C 253 ; WX 494 ; N bracerightmid ; B 209 -85 473 935 ; C 254 ; WX 494 ; N bracerightbt ; B 48 -75 284 935 ; C -1 ; WX 790 ; N apple ; B 56 -3 733 808 ; EndCharMetrics EndFontMetrics ruby-prawn-1.0.0~rc2.orig/data/fonts/Times-Italic.afm0000644000000000000000000020143012114176157021100 0ustar rootrootStartFontMetrics 4.1 Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. Comment Creation Date: Thu May 1 12:56:55 1997 Comment UniqueID 43067 Comment VMusage 47727 58752 FontName Times-Italic FullName Times Italic FamilyName Times Weight Medium ItalicAngle -15.5 IsFixedPitch false CharacterSet ExtendedRoman FontBBox -169 -217 1010 883 UnderlinePosition -100 UnderlineThickness 50 Version 002.000 Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries. EncodingScheme AdobeStandardEncoding CapHeight 653 XHeight 441 Ascender 683 Descender -217 StdHW 32 StdVW 76 StartCharMetrics 315 C 32 ; WX 250 ; N space ; B 0 0 0 0 ; C 33 ; WX 333 ; N exclam ; B 39 -11 302 667 ; C 34 ; WX 420 ; N quotedbl ; B 144 421 432 666 ; C 35 ; WX 500 ; N numbersign ; B 2 0 540 676 ; C 36 ; WX 500 ; N dollar ; B 31 -89 497 731 ; C 37 ; WX 833 ; N percent ; B 79 -13 790 676 ; C 38 ; WX 778 ; N ampersand ; B 76 -18 723 666 ; C 39 ; WX 333 ; N quoteright ; B 151 436 290 666 ; C 40 ; WX 333 ; N parenleft ; B 42 -181 315 669 ; C 41 ; WX 333 ; N parenright ; B 16 -180 289 669 ; C 42 ; WX 500 ; N asterisk ; B 128 255 492 666 ; C 43 ; WX 675 ; N plus ; B 86 0 590 506 ; C 44 ; WX 250 ; N comma ; B -4 -129 135 101 ; C 45 ; WX 333 ; N hyphen ; B 49 192 282 255 ; C 46 ; WX 250 ; N period ; B 27 -11 138 100 ; C 47 ; WX 278 ; N slash ; B -65 -18 386 666 ; C 48 ; WX 500 ; N zero ; B 32 -7 497 676 ; C 49 ; WX 500 ; N one ; B 49 0 409 676 ; C 50 ; WX 500 ; N two ; B 12 0 452 676 ; C 51 ; WX 500 ; N three ; B 15 -7 465 676 ; C 52 ; WX 500 ; N four ; B 1 0 479 676 ; C 53 ; WX 500 ; N five ; B 15 -7 491 666 ; C 54 ; WX 500 ; N six ; B 30 -7 521 686 ; C 55 ; WX 500 ; N seven ; B 75 -8 537 666 ; C 56 ; WX 500 ; N eight ; B 30 -7 493 676 ; C 57 ; WX 500 ; N nine ; B 23 -17 492 676 ; C 58 ; WX 333 ; N colon ; B 50 -11 261 441 ; C 59 ; WX 333 ; N semicolon ; B 27 -129 261 441 ; C 60 ; WX 675 ; N less ; B 84 -8 592 514 ; C 61 ; WX 675 ; N equal ; B 86 120 590 386 ; C 62 ; WX 675 ; N greater ; B 84 -8 592 514 ; C 63 ; WX 500 ; N question ; B 132 -12 472 664 ; C 64 ; WX 920 ; N at ; B 118 -18 806 666 ; C 65 ; WX 611 ; N A ; B -51 0 564 668 ; C 66 ; WX 611 ; N B ; B -8 0 588 653 ; C 67 ; WX 667 ; N C ; B 66 -18 689 666 ; C 68 ; WX 722 ; N D ; B -8 0 700 653 ; C 69 ; WX 611 ; N E ; B -1 0 634 653 ; C 70 ; WX 611 ; N F ; B 8 0 645 653 ; C 71 ; WX 722 ; N G ; B 52 -18 722 666 ; C 72 ; WX 722 ; N H ; B -8 0 767 653 ; C 73 ; WX 333 ; N I ; B -8 0 384 653 ; C 74 ; WX 444 ; N J ; B -6 -18 491 653 ; C 75 ; WX 667 ; N K ; B 7 0 722 653 ; C 76 ; WX 556 ; N L ; B -8 0 559 653 ; C 77 ; WX 833 ; N M ; B -18 0 873 653 ; C 78 ; WX 667 ; N N ; B -20 -15 727 653 ; C 79 ; WX 722 ; N O ; B 60 -18 699 666 ; C 80 ; WX 611 ; N P ; B 0 0 605 653 ; C 81 ; WX 722 ; N Q ; B 59 -182 699 666 ; C 82 ; WX 611 ; N R ; B -13 0 588 653 ; C 83 ; WX 500 ; N S ; B 17 -18 508 667 ; C 84 ; WX 556 ; N T ; B 59 0 633 653 ; C 85 ; WX 722 ; N U ; B 102 -18 765 653 ; C 86 ; WX 611 ; N V ; B 76 -18 688 653 ; C 87 ; WX 833 ; N W ; B 71 -18 906 653 ; C 88 ; WX 611 ; N X ; B -29 0 655 653 ; C 89 ; WX 556 ; N Y ; B 78 0 633 653 ; C 90 ; WX 556 ; N Z ; B -6 0 606 653 ; C 91 ; WX 389 ; N bracketleft ; B 21 -153 391 663 ; C 92 ; WX 278 ; N backslash ; B -41 -18 319 666 ; C 93 ; WX 389 ; N bracketright ; B 12 -153 382 663 ; C 94 ; WX 422 ; N asciicircum ; B 0 301 422 666 ; C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; C 96 ; WX 333 ; N quoteleft ; B 171 436 310 666 ; C 97 ; WX 500 ; N a ; B 17 -11 476 441 ; C 98 ; WX 500 ; N b ; B 23 -11 473 683 ; C 99 ; WX 444 ; N c ; B 30 -11 425 441 ; C 100 ; WX 500 ; N d ; B 15 -13 527 683 ; C 101 ; WX 444 ; N e ; B 31 -11 412 441 ; C 102 ; WX 278 ; N f ; B -147 -207 424 678 ; L i fi ; L l fl ; C 103 ; WX 500 ; N g ; B 8 -206 472 441 ; C 104 ; WX 500 ; N h ; B 19 -9 478 683 ; C 105 ; WX 278 ; N i ; B 49 -11 264 654 ; C 106 ; WX 278 ; N j ; B -124 -207 276 654 ; C 107 ; WX 444 ; N k ; B 14 -11 461 683 ; C 108 ; WX 278 ; N l ; B 41 -11 279 683 ; C 109 ; WX 722 ; N m ; B 12 -9 704 441 ; C 110 ; WX 500 ; N n ; B 14 -9 474 441 ; C 111 ; WX 500 ; N o ; B 27 -11 468 441 ; C 112 ; WX 500 ; N p ; B -75 -205 469 441 ; C 113 ; WX 500 ; N q ; B 25 -209 483 441 ; C 114 ; WX 389 ; N r ; B 45 0 412 441 ; C 115 ; WX 389 ; N s ; B 16 -13 366 442 ; C 116 ; WX 278 ; N t ; B 37 -11 296 546 ; C 117 ; WX 500 ; N u ; B 42 -11 475 441 ; C 118 ; WX 444 ; N v ; B 21 -18 426 441 ; C 119 ; WX 667 ; N w ; B 16 -18 648 441 ; C 120 ; WX 444 ; N x ; B -27 -11 447 441 ; C 121 ; WX 444 ; N y ; B -24 -206 426 441 ; C 122 ; WX 389 ; N z ; B -2 -81 380 428 ; C 123 ; WX 400 ; N braceleft ; B 51 -177 407 687 ; C 124 ; WX 275 ; N bar ; B 105 -217 171 783 ; C 125 ; WX 400 ; N braceright ; B -7 -177 349 687 ; C 126 ; WX 541 ; N asciitilde ; B 40 183 502 323 ; C 161 ; WX 389 ; N exclamdown ; B 59 -205 322 473 ; C 162 ; WX 500 ; N cent ; B 77 -143 472 560 ; C 163 ; WX 500 ; N sterling ; B 10 -6 517 670 ; C 164 ; WX 167 ; N fraction ; B -169 -10 337 676 ; C 165 ; WX 500 ; N yen ; B 27 0 603 653 ; C 166 ; WX 500 ; N florin ; B 25 -182 507 682 ; C 167 ; WX 500 ; N section ; B 53 -162 461 666 ; C 168 ; WX 500 ; N currency ; B -22 53 522 597 ; C 169 ; WX 214 ; N quotesingle ; B 132 421 241 666 ; C 170 ; WX 556 ; N quotedblleft ; B 166 436 514 666 ; C 171 ; WX 500 ; N guillemotleft ; B 53 37 445 403 ; C 172 ; WX 333 ; N guilsinglleft ; B 51 37 281 403 ; C 173 ; WX 333 ; N guilsinglright ; B 52 37 282 403 ; C 174 ; WX 500 ; N fi ; B -141 -207 481 681 ; C 175 ; WX 500 ; N fl ; B -141 -204 518 682 ; C 177 ; WX 500 ; N endash ; B -6 197 505 243 ; C 178 ; WX 500 ; N dagger ; B 101 -159 488 666 ; C 179 ; WX 500 ; N daggerdbl ; B 22 -143 491 666 ; C 180 ; WX 250 ; N periodcentered ; B 70 199 181 310 ; C 182 ; WX 523 ; N paragraph ; B 55 -123 616 653 ; C 183 ; WX 350 ; N bullet ; B 40 191 310 461 ; C 184 ; WX 333 ; N quotesinglbase ; B 44 -129 183 101 ; C 185 ; WX 556 ; N quotedblbase ; B 57 -129 405 101 ; C 186 ; WX 556 ; N quotedblright ; B 151 436 499 666 ; C 187 ; WX 500 ; N guillemotright ; B 55 37 447 403 ; C 188 ; WX 889 ; N ellipsis ; B 57 -11 762 100 ; C 189 ; WX 1000 ; N perthousand ; B 25 -19 1010 706 ; C 191 ; WX 500 ; N questiondown ; B 28 -205 368 471 ; C 193 ; WX 333 ; N grave ; B 121 492 311 664 ; C 194 ; WX 333 ; N acute ; B 180 494 403 664 ; C 195 ; WX 333 ; N circumflex ; B 91 492 385 661 ; C 196 ; WX 333 ; N tilde ; B 100 517 427 624 ; C 197 ; WX 333 ; N macron ; B 99 532 411 583 ; C 198 ; WX 333 ; N breve ; B 117 492 418 650 ; C 199 ; WX 333 ; N dotaccent ; B 207 548 305 646 ; C 200 ; WX 333 ; N dieresis ; B 107 548 405 646 ; C 202 ; WX 333 ; N ring ; B 155 492 355 691 ; C 203 ; WX 333 ; N cedilla ; B -30 -217 182 0 ; C 205 ; WX 333 ; N hungarumlaut ; B 93 494 486 664 ; C 206 ; WX 333 ; N ogonek ; B 20 -169 203 40 ; C 207 ; WX 333 ; N caron ; B 121 492 426 661 ; C 208 ; WX 889 ; N emdash ; B -6 197 894 243 ; C 225 ; WX 889 ; N AE ; B -27 0 911 653 ; C 227 ; WX 276 ; N ordfeminine ; B 42 406 352 676 ; C 232 ; WX 556 ; N Lslash ; B -8 0 559 653 ; C 233 ; WX 722 ; N Oslash ; B 60 -105 699 722 ; C 234 ; WX 944 ; N OE ; B 49 -8 964 666 ; C 235 ; WX 310 ; N ordmasculine ; B 67 406 362 676 ; C 241 ; WX 667 ; N ae ; B 23 -11 640 441 ; C 245 ; WX 278 ; N dotlessi ; B 49 -11 235 441 ; C 248 ; WX 278 ; N lslash ; B 41 -11 312 683 ; C 249 ; WX 500 ; N oslash ; B 28 -135 469 554 ; C 250 ; WX 667 ; N oe ; B 20 -12 646 441 ; C 251 ; WX 500 ; N germandbls ; B -168 -207 493 679 ; C -1 ; WX 333 ; N Idieresis ; B -8 0 435 818 ; C -1 ; WX 444 ; N eacute ; B 31 -11 459 664 ; C -1 ; WX 500 ; N abreve ; B 17 -11 502 650 ; C -1 ; WX 500 ; N uhungarumlaut ; B 42 -11 580 664 ; C -1 ; WX 444 ; N ecaron ; B 31 -11 482 661 ; C -1 ; WX 556 ; N Ydieresis ; B 78 0 633 818 ; C -1 ; WX 675 ; N divide ; B 86 -11 590 517 ; C -1 ; WX 556 ; N Yacute ; B 78 0 633 876 ; C -1 ; WX 611 ; N Acircumflex ; B -51 0 564 873 ; C -1 ; WX 500 ; N aacute ; B 17 -11 487 664 ; C -1 ; WX 722 ; N Ucircumflex ; B 102 -18 765 873 ; C -1 ; WX 444 ; N yacute ; B -24 -206 459 664 ; C -1 ; WX 389 ; N scommaaccent ; B 16 -217 366 442 ; C -1 ; WX 444 ; N ecircumflex ; B 31 -11 441 661 ; C -1 ; WX 722 ; N Uring ; B 102 -18 765 883 ; C -1 ; WX 722 ; N Udieresis ; B 102 -18 765 818 ; C -1 ; WX 500 ; N aogonek ; B 17 -169 476 441 ; C -1 ; WX 722 ; N Uacute ; B 102 -18 765 876 ; C -1 ; WX 500 ; N uogonek ; B 42 -169 477 441 ; C -1 ; WX 611 ; N Edieresis ; B -1 0 634 818 ; C -1 ; WX 722 ; N Dcroat ; B -8 0 700 653 ; C -1 ; WX 250 ; N commaaccent ; B 8 -217 133 -50 ; C -1 ; WX 760 ; N copyright ; B 41 -18 719 666 ; C -1 ; WX 611 ; N Emacron ; B -1 0 634 795 ; C -1 ; WX 444 ; N ccaron ; B 30 -11 482 661 ; C -1 ; WX 500 ; N aring ; B 17 -11 476 691 ; C -1 ; WX 667 ; N Ncommaaccent ; B -20 -187 727 653 ; C -1 ; WX 278 ; N lacute ; B 41 -11 395 876 ; C -1 ; WX 500 ; N agrave ; B 17 -11 476 664 ; C -1 ; WX 556 ; N Tcommaaccent ; B 59 -217 633 653 ; C -1 ; WX 667 ; N Cacute ; B 66 -18 690 876 ; C -1 ; WX 500 ; N atilde ; B 17 -11 511 624 ; C -1 ; WX 611 ; N Edotaccent ; B -1 0 634 818 ; C -1 ; WX 389 ; N scaron ; B 16 -13 454 661 ; C -1 ; WX 389 ; N scedilla ; B 16 -217 366 442 ; C -1 ; WX 278 ; N iacute ; B 49 -11 355 664 ; C -1 ; WX 471 ; N lozenge ; B 13 0 459 724 ; C -1 ; WX 611 ; N Rcaron ; B -13 0 588 873 ; C -1 ; WX 722 ; N Gcommaaccent ; B 52 -217 722 666 ; C -1 ; WX 500 ; N ucircumflex ; B 42 -11 475 661 ; C -1 ; WX 500 ; N acircumflex ; B 17 -11 476 661 ; C -1 ; WX 611 ; N Amacron ; B -51 0 564 795 ; C -1 ; WX 389 ; N rcaron ; B 45 0 434 661 ; C -1 ; WX 444 ; N ccedilla ; B 30 -217 425 441 ; C -1 ; WX 556 ; N Zdotaccent ; B -6 0 606 818 ; C -1 ; WX 611 ; N Thorn ; B 0 0 569 653 ; C -1 ; WX 722 ; N Omacron ; B 60 -18 699 795 ; C -1 ; WX 611 ; N Racute ; B -13 0 588 876 ; C -1 ; WX 500 ; N Sacute ; B 17 -18 508 876 ; C -1 ; WX 544 ; N dcaron ; B 15 -13 658 683 ; C -1 ; WX 722 ; N Umacron ; B 102 -18 765 795 ; C -1 ; WX 500 ; N uring ; B 42 -11 475 691 ; C -1 ; WX 300 ; N threesuperior ; B 43 268 339 676 ; C -1 ; WX 722 ; N Ograve ; B 60 -18 699 876 ; C -1 ; WX 611 ; N Agrave ; B -51 0 564 876 ; C -1 ; WX 611 ; N Abreve ; B -51 0 564 862 ; C -1 ; WX 675 ; N multiply ; B 93 8 582 497 ; C -1 ; WX 500 ; N uacute ; B 42 -11 477 664 ; C -1 ; WX 556 ; N Tcaron ; B 59 0 633 873 ; C -1 ; WX 476 ; N partialdiff ; B 17 -38 459 710 ; C -1 ; WX 444 ; N ydieresis ; B -24 -206 441 606 ; C -1 ; WX 667 ; N Nacute ; B -20 -15 727 876 ; C -1 ; WX 278 ; N icircumflex ; B 33 -11 327 661 ; C -1 ; WX 611 ; N Ecircumflex ; B -1 0 634 873 ; C -1 ; WX 500 ; N adieresis ; B 17 -11 489 606 ; C -1 ; WX 444 ; N edieresis ; B 31 -11 451 606 ; C -1 ; WX 444 ; N cacute ; B 30 -11 459 664 ; C -1 ; WX 500 ; N nacute ; B 14 -9 477 664 ; C -1 ; WX 500 ; N umacron ; B 42 -11 485 583 ; C -1 ; WX 667 ; N Ncaron ; B -20 -15 727 873 ; C -1 ; WX 333 ; N Iacute ; B -8 0 433 876 ; C -1 ; WX 675 ; N plusminus ; B 86 0 590 506 ; C -1 ; WX 275 ; N brokenbar ; B 105 -142 171 708 ; C -1 ; WX 760 ; N registered ; B 41 -18 719 666 ; C -1 ; WX 722 ; N Gbreve ; B 52 -18 722 862 ; C -1 ; WX 333 ; N Idotaccent ; B -8 0 384 818 ; C -1 ; WX 600 ; N summation ; B 15 -10 585 706 ; C -1 ; WX 611 ; N Egrave ; B -1 0 634 876 ; C -1 ; WX 389 ; N racute ; B 45 0 431 664 ; C -1 ; WX 500 ; N omacron ; B 27 -11 495 583 ; C -1 ; WX 556 ; N Zacute ; B -6 0 606 876 ; C -1 ; WX 556 ; N Zcaron ; B -6 0 606 873 ; C -1 ; WX 549 ; N greaterequal ; B 26 0 523 658 ; C -1 ; WX 722 ; N Eth ; B -8 0 700 653 ; C -1 ; WX 667 ; N Ccedilla ; B 66 -217 689 666 ; C -1 ; WX 278 ; N lcommaaccent ; B 22 -217 279 683 ; C -1 ; WX 300 ; N tcaron ; B 37 -11 407 681 ; C -1 ; WX 444 ; N eogonek ; B 31 -169 412 441 ; C -1 ; WX 722 ; N Uogonek ; B 102 -184 765 653 ; C -1 ; WX 611 ; N Aacute ; B -51 0 564 876 ; C -1 ; WX 611 ; N Adieresis ; B -51 0 564 818 ; C -1 ; WX 444 ; N egrave ; B 31 -11 412 664 ; C -1 ; WX 389 ; N zacute ; B -2 -81 431 664 ; C -1 ; WX 278 ; N iogonek ; B 49 -169 264 654 ; C -1 ; WX 722 ; N Oacute ; B 60 -18 699 876 ; C -1 ; WX 500 ; N oacute ; B 27 -11 487 664 ; C -1 ; WX 500 ; N amacron ; B 17 -11 495 583 ; C -1 ; WX 389 ; N sacute ; B 16 -13 431 664 ; C -1 ; WX 278 ; N idieresis ; B 49 -11 352 606 ; C -1 ; WX 722 ; N Ocircumflex ; B 60 -18 699 873 ; C -1 ; WX 722 ; N Ugrave ; B 102 -18 765 876 ; C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; C -1 ; WX 500 ; N thorn ; B -75 -205 469 683 ; C -1 ; WX 300 ; N twosuperior ; B 33 271 324 676 ; C -1 ; WX 722 ; N Odieresis ; B 60 -18 699 818 ; C -1 ; WX 500 ; N mu ; B -30 -209 497 428 ; C -1 ; WX 278 ; N igrave ; B 49 -11 284 664 ; C -1 ; WX 500 ; N ohungarumlaut ; B 27 -11 590 664 ; C -1 ; WX 611 ; N Eogonek ; B -1 -169 634 653 ; C -1 ; WX 500 ; N dcroat ; B 15 -13 572 683 ; C -1 ; WX 750 ; N threequarters ; B 23 -10 736 676 ; C -1 ; WX 500 ; N Scedilla ; B 17 -217 508 667 ; C -1 ; WX 300 ; N lcaron ; B 41 -11 407 683 ; C -1 ; WX 667 ; N Kcommaaccent ; B 7 -217 722 653 ; C -1 ; WX 556 ; N Lacute ; B -8 0 559 876 ; C -1 ; WX 980 ; N trademark ; B 30 247 957 653 ; C -1 ; WX 444 ; N edotaccent ; B 31 -11 412 606 ; C -1 ; WX 333 ; N Igrave ; B -8 0 384 876 ; C -1 ; WX 333 ; N Imacron ; B -8 0 441 795 ; C -1 ; WX 611 ; N Lcaron ; B -8 0 586 653 ; C -1 ; WX 750 ; N onehalf ; B 34 -10 749 676 ; C -1 ; WX 549 ; N lessequal ; B 26 0 523 658 ; C -1 ; WX 500 ; N ocircumflex ; B 27 -11 468 661 ; C -1 ; WX 500 ; N ntilde ; B 14 -9 476 624 ; C -1 ; WX 722 ; N Uhungarumlaut ; B 102 -18 765 876 ; C -1 ; WX 611 ; N Eacute ; B -1 0 634 876 ; C -1 ; WX 444 ; N emacron ; B 31 -11 457 583 ; C -1 ; WX 500 ; N gbreve ; B 8 -206 487 650 ; C -1 ; WX 750 ; N onequarter ; B 33 -10 736 676 ; C -1 ; WX 500 ; N Scaron ; B 17 -18 520 873 ; C -1 ; WX 500 ; N Scommaaccent ; B 17 -217 508 667 ; C -1 ; WX 722 ; N Ohungarumlaut ; B 60 -18 699 876 ; C -1 ; WX 400 ; N degree ; B 101 390 387 676 ; C -1 ; WX 500 ; N ograve ; B 27 -11 468 664 ; C -1 ; WX 667 ; N Ccaron ; B 66 -18 689 873 ; C -1 ; WX 500 ; N ugrave ; B 42 -11 475 664 ; C -1 ; WX 453 ; N radical ; B 2 -60 452 768 ; C -1 ; WX 722 ; N Dcaron ; B -8 0 700 873 ; C -1 ; WX 389 ; N rcommaaccent ; B -3 -217 412 441 ; C -1 ; WX 667 ; N Ntilde ; B -20 -15 727 836 ; C -1 ; WX 500 ; N otilde ; B 27 -11 496 624 ; C -1 ; WX 611 ; N Rcommaaccent ; B -13 -187 588 653 ; C -1 ; WX 556 ; N Lcommaaccent ; B -8 -217 559 653 ; C -1 ; WX 611 ; N Atilde ; B -51 0 566 836 ; C -1 ; WX 611 ; N Aogonek ; B -51 -169 566 668 ; C -1 ; WX 611 ; N Aring ; B -51 0 564 883 ; C -1 ; WX 722 ; N Otilde ; B 60 -18 699 836 ; C -1 ; WX 389 ; N zdotaccent ; B -2 -81 380 606 ; C -1 ; WX 611 ; N Ecaron ; B -1 0 634 873 ; C -1 ; WX 333 ; N Iogonek ; B -8 -169 384 653 ; C -1 ; WX 444 ; N kcommaaccent ; B 14 -187 461 683 ; C -1 ; WX 675 ; N minus ; B 86 220 590 286 ; C -1 ; WX 333 ; N Icircumflex ; B -8 0 425 873 ; C -1 ; WX 500 ; N ncaron ; B 14 -9 510 661 ; C -1 ; WX 278 ; N tcommaaccent ; B 2 -217 296 546 ; C -1 ; WX 675 ; N logicalnot ; B 86 108 590 386 ; C -1 ; WX 500 ; N odieresis ; B 27 -11 489 606 ; C -1 ; WX 500 ; N udieresis ; B 42 -11 479 606 ; C -1 ; WX 549 ; N notequal ; B 12 -29 537 541 ; C -1 ; WX 500 ; N gcommaaccent ; B 8 -206 472 706 ; C -1 ; WX 500 ; N eth ; B 27 -11 482 683 ; C -1 ; WX 389 ; N zcaron ; B -2 -81 434 661 ; C -1 ; WX 500 ; N ncommaaccent ; B 14 -187 474 441 ; C -1 ; WX 300 ; N onesuperior ; B 43 271 284 676 ; C -1 ; WX 278 ; N imacron ; B 46 -11 311 583 ; C -1 ; WX 500 ; N Euro ; B 0 0 0 0 ; EndCharMetrics StartKernData StartKernPairs 2321 KPX A C -30 KPX A Cacute -30 KPX A Ccaron -30 KPX A Ccedilla -30 KPX A G -35 KPX A Gbreve -35 KPX A Gcommaaccent -35 KPX A O -40 KPX A Oacute -40 KPX A Ocircumflex -40 KPX A Odieresis -40 KPX A Ograve -40 KPX A Ohungarumlaut -40 KPX A Omacron -40 KPX A Oslash -40 KPX A Otilde -40 KPX A Q -40 KPX A T -37 KPX A Tcaron -37 KPX A Tcommaaccent -37 KPX A U -50 KPX A Uacute -50 KPX A Ucircumflex -50 KPX A Udieresis -50 KPX A Ugrave -50 KPX A Uhungarumlaut -50 KPX A Umacron -50 KPX A Uogonek -50 KPX A Uring -50 KPX A V -105 KPX A W -95 KPX A Y -55 KPX A Yacute -55 KPX A Ydieresis -55 KPX A quoteright -37 KPX A u -20 KPX A uacute -20 KPX A ucircumflex -20 KPX A udieresis -20 KPX A ugrave -20 KPX A uhungarumlaut -20 KPX A umacron -20 KPX A uogonek -20 KPX A uring -20 KPX A v -55 KPX A w -55 KPX A y -55 KPX A yacute -55 KPX A ydieresis -55 KPX Aacute C -30 KPX Aacute Cacute -30 KPX Aacute Ccaron -30 KPX Aacute Ccedilla -30 KPX Aacute G -35 KPX Aacute Gbreve -35 KPX Aacute Gcommaaccent -35 KPX Aacute O -40 KPX Aacute Oacute -40 KPX Aacute Ocircumflex -40 KPX Aacute Odieresis -40 KPX Aacute Ograve -40 KPX Aacute Ohungarumlaut -40 KPX Aacute Omacron -40 KPX Aacute Oslash -40 KPX Aacute Otilde -40 KPX Aacute Q -40 KPX Aacute T -37 KPX Aacute Tcaron -37 KPX Aacute Tcommaaccent -37 KPX Aacute U -50 KPX Aacute Uacute -50 KPX Aacute Ucircumflex -50 KPX Aacute Udieresis -50 KPX Aacute Ugrave -50 KPX Aacute Uhungarumlaut -50 KPX Aacute Umacron -50 KPX Aacute Uogonek -50 KPX Aacute Uring -50 KPX Aacute V -105 KPX Aacute W -95 KPX Aacute Y -55 KPX Aacute Yacute -55 KPX Aacute Ydieresis -55 KPX Aacute quoteright -37 KPX Aacute u -20 KPX Aacute uacute -20 KPX Aacute ucircumflex -20 KPX Aacute udieresis -20 KPX Aacute ugrave -20 KPX Aacute uhungarumlaut -20 KPX Aacute umacron -20 KPX Aacute uogonek -20 KPX Aacute uring -20 KPX Aacute v -55 KPX Aacute w -55 KPX Aacute y -55 KPX Aacute yacute -55 KPX Aacute ydieresis -55 KPX Abreve C -30 KPX Abreve Cacute -30 KPX Abreve Ccaron -30 KPX Abreve Ccedilla -30 KPX Abreve G -35 KPX Abreve Gbreve -35 KPX Abreve Gcommaaccent -35 KPX Abreve O -40 KPX Abreve Oacute -40 KPX Abreve Ocircumflex -40 KPX Abreve Odieresis -40 KPX Abreve Ograve -40 KPX Abreve Ohungarumlaut -40 KPX Abreve Omacron -40 KPX Abreve Oslash -40 KPX Abreve Otilde -40 KPX Abreve Q -40 KPX Abreve T -37 KPX Abreve Tcaron -37 KPX Abreve Tcommaaccent -37 KPX Abreve U -50 KPX Abreve Uacute -50 KPX Abreve Ucircumflex -50 KPX Abreve Udieresis -50 KPX Abreve Ugrave -50 KPX Abreve Uhungarumlaut -50 KPX Abreve Umacron -50 KPX Abreve Uogonek -50 KPX Abreve Uring -50 KPX Abreve V -105 KPX Abreve W -95 KPX Abreve Y -55 KPX Abreve Yacute -55 KPX Abreve Ydieresis -55 KPX Abreve quoteright -37 KPX Abreve u -20 KPX Abreve uacute -20 KPX Abreve ucircumflex -20 KPX Abreve udieresis -20 KPX Abreve ugrave -20 KPX Abreve uhungarumlaut -20 KPX Abreve umacron -20 KPX Abreve uogonek -20 KPX Abreve uring -20 KPX Abreve v -55 KPX Abreve w -55 KPX Abreve y -55 KPX Abreve yacute -55 KPX Abreve ydieresis -55 KPX Acircumflex C -30 KPX Acircumflex Cacute -30 KPX Acircumflex Ccaron -30 KPX Acircumflex Ccedilla -30 KPX Acircumflex G -35 KPX Acircumflex Gbreve -35 KPX Acircumflex Gcommaaccent -35 KPX Acircumflex O -40 KPX Acircumflex Oacute -40 KPX Acircumflex Ocircumflex -40 KPX Acircumflex Odieresis -40 KPX Acircumflex Ograve -40 KPX Acircumflex Ohungarumlaut -40 KPX Acircumflex Omacron -40 KPX Acircumflex Oslash -40 KPX Acircumflex Otilde -40 KPX Acircumflex Q -40 KPX Acircumflex T -37 KPX Acircumflex Tcaron -37 KPX Acircumflex Tcommaaccent -37 KPX Acircumflex U -50 KPX Acircumflex Uacute -50 KPX Acircumflex Ucircumflex -50 KPX Acircumflex Udieresis -50 KPX Acircumflex Ugrave -50 KPX Acircumflex Uhungarumlaut -50 KPX Acircumflex Umacron -50 KPX Acircumflex Uogonek -50 KPX Acircumflex Uring -50 KPX Acircumflex V -105 KPX Acircumflex W -95 KPX Acircumflex Y -55 KPX Acircumflex Yacute -55 KPX Acircumflex Ydieresis -55 KPX Acircumflex quoteright -37 KPX Acircumflex u -20 KPX Acircumflex uacute -20 KPX Acircumflex ucircumflex -20 KPX Acircumflex udieresis -20 KPX Acircumflex ugrave -20 KPX Acircumflex uhungarumlaut -20 KPX Acircumflex umacron -20 KPX Acircumflex uogonek -20 KPX Acircumflex uring -20 KPX Acircumflex v -55 KPX Acircumflex w -55 KPX Acircumflex y -55 KPX Acircumflex yacute -55 KPX Acircumflex ydieresis -55 KPX Adieresis C -30 KPX Adieresis Cacute -30 KPX Adieresis Ccaron -30 KPX Adieresis Ccedilla -30 KPX Adieresis G -35 KPX Adieresis Gbreve -35 KPX Adieresis Gcommaaccent -35 KPX Adieresis O -40 KPX Adieresis Oacute -40 KPX Adieresis Ocircumflex -40 KPX Adieresis Odieresis -40 KPX Adieresis Ograve -40 KPX Adieresis Ohungarumlaut -40 KPX Adieresis Omacron -40 KPX Adieresis Oslash -40 KPX Adieresis Otilde -40 KPX Adieresis Q -40 KPX Adieresis T -37 KPX Adieresis Tcaron -37 KPX Adieresis Tcommaaccent -37 KPX Adieresis U -50 KPX Adieresis Uacute -50 KPX Adieresis Ucircumflex -50 KPX Adieresis Udieresis -50 KPX Adieresis Ugrave -50 KPX Adieresis Uhungarumlaut -50 KPX Adieresis Umacron -50 KPX Adieresis Uogonek -50 KPX Adieresis Uring -50 KPX Adieresis V -105 KPX Adieresis W -95 KPX Adieresis Y -55 KPX Adieresis Yacute -55 KPX Adieresis Ydieresis -55 KPX Adieresis quoteright -37 KPX Adieresis u -20 KPX Adieresis uacute -20 KPX Adieresis ucircumflex -20 KPX Adieresis udieresis -20 KPX Adieresis ugrave -20 KPX Adieresis uhungarumlaut -20 KPX Adieresis umacron -20 KPX Adieresis uogonek -20 KPX Adieresis uring -20 KPX Adieresis v -55 KPX Adieresis w -55 KPX Adieresis y -55 KPX Adieresis yacute -55 KPX Adieresis ydieresis -55 KPX Agrave C -30 KPX Agrave Cacute -30 KPX Agrave Ccaron -30 KPX Agrave Ccedilla -30 KPX Agrave G -35 KPX Agrave Gbreve -35 KPX Agrave Gcommaaccent -35 KPX Agrave O -40 KPX Agrave Oacute -40 KPX Agrave Ocircumflex -40 KPX Agrave Odieresis -40 KPX Agrave Ograve -40 KPX Agrave Ohungarumlaut -40 KPX Agrave Omacron -40 KPX Agrave Oslash -40 KPX Agrave Otilde -40 KPX Agrave Q -40 KPX Agrave T -37 KPX Agrave Tcaron -37 KPX Agrave Tcommaaccent -37 KPX Agrave U -50 KPX Agrave Uacute -50 KPX Agrave Ucircumflex -50 KPX Agrave Udieresis -50 KPX Agrave Ugrave -50 KPX Agrave Uhungarumlaut -50 KPX Agrave Umacron -50 KPX Agrave Uogonek -50 KPX Agrave Uring -50 KPX Agrave V -105 KPX Agrave W -95 KPX Agrave Y -55 KPX Agrave Yacute -55 KPX Agrave Ydieresis -55 KPX Agrave quoteright -37 KPX Agrave u -20 KPX Agrave uacute -20 KPX Agrave ucircumflex -20 KPX Agrave udieresis -20 KPX Agrave ugrave -20 KPX Agrave uhungarumlaut -20 KPX Agrave umacron -20 KPX Agrave uogonek -20 KPX Agrave uring -20 KPX Agrave v -55 KPX Agrave w -55 KPX Agrave y -55 KPX Agrave yacute -55 KPX Agrave ydieresis -55 KPX Amacron C -30 KPX Amacron Cacute -30 KPX Amacron Ccaron -30 KPX Amacron Ccedilla -30 KPX Amacron G -35 KPX Amacron Gbreve -35 KPX Amacron Gcommaaccent -35 KPX Amacron O -40 KPX Amacron Oacute -40 KPX Amacron Ocircumflex -40 KPX Amacron Odieresis -40 KPX Amacron Ograve -40 KPX Amacron Ohungarumlaut -40 KPX Amacron Omacron -40 KPX Amacron Oslash -40 KPX Amacron Otilde -40 KPX Amacron Q -40 KPX Amacron T -37 KPX Amacron Tcaron -37 KPX Amacron Tcommaaccent -37 KPX Amacron U -50 KPX Amacron Uacute -50 KPX Amacron Ucircumflex -50 KPX Amacron Udieresis -50 KPX Amacron Ugrave -50 KPX Amacron Uhungarumlaut -50 KPX Amacron Umacron -50 KPX Amacron Uogonek -50 KPX Amacron Uring -50 KPX Amacron V -105 KPX Amacron W -95 KPX Amacron Y -55 KPX Amacron Yacute -55 KPX Amacron Ydieresis -55 KPX Amacron quoteright -37 KPX Amacron u -20 KPX Amacron uacute -20 KPX Amacron ucircumflex -20 KPX Amacron udieresis -20 KPX Amacron ugrave -20 KPX Amacron uhungarumlaut -20 KPX Amacron umacron -20 KPX Amacron uogonek -20 KPX Amacron uring -20 KPX Amacron v -55 KPX Amacron w -55 KPX Amacron y -55 KPX Amacron yacute -55 KPX Amacron ydieresis -55 KPX Aogonek C -30 KPX Aogonek Cacute -30 KPX Aogonek Ccaron -30 KPX Aogonek Ccedilla -30 KPX Aogonek G -35 KPX Aogonek Gbreve -35 KPX Aogonek Gcommaaccent -35 KPX Aogonek O -40 KPX Aogonek Oacute -40 KPX Aogonek Ocircumflex -40 KPX Aogonek Odieresis -40 KPX Aogonek Ograve -40 KPX Aogonek Ohungarumlaut -40 KPX Aogonek Omacron -40 KPX Aogonek Oslash -40 KPX Aogonek Otilde -40 KPX Aogonek Q -40 KPX Aogonek T -37 KPX Aogonek Tcaron -37 KPX Aogonek Tcommaaccent -37 KPX Aogonek U -50 KPX Aogonek Uacute -50 KPX Aogonek Ucircumflex -50 KPX Aogonek Udieresis -50 KPX Aogonek Ugrave -50 KPX Aogonek Uhungarumlaut -50 KPX Aogonek Umacron -50 KPX Aogonek Uogonek -50 KPX Aogonek Uring -50 KPX Aogonek V -105 KPX Aogonek W -95 KPX Aogonek Y -55 KPX Aogonek Yacute -55 KPX Aogonek Ydieresis -55 KPX Aogonek quoteright -37 KPX Aogonek u -20 KPX Aogonek uacute -20 KPX Aogonek ucircumflex -20 KPX Aogonek udieresis -20 KPX Aogonek ugrave -20 KPX Aogonek uhungarumlaut -20 KPX Aogonek umacron -20 KPX Aogonek uogonek -20 KPX Aogonek uring -20 KPX Aogonek v -55 KPX Aogonek w -55 KPX Aogonek y -55 KPX Aogonek yacute -55 KPX Aogonek ydieresis -55 KPX Aring C -30 KPX Aring Cacute -30 KPX Aring Ccaron -30 KPX Aring Ccedilla -30 KPX Aring G -35 KPX Aring Gbreve -35 KPX Aring Gcommaaccent -35 KPX Aring O -40 KPX Aring Oacute -40 KPX Aring Ocircumflex -40 KPX Aring Odieresis -40 KPX Aring Ograve -40 KPX Aring Ohungarumlaut -40 KPX Aring Omacron -40 KPX Aring Oslash -40 KPX Aring Otilde -40 KPX Aring Q -40 KPX Aring T -37 KPX Aring Tcaron -37 KPX Aring Tcommaaccent -37 KPX Aring U -50 KPX Aring Uacute -50 KPX Aring Ucircumflex -50 KPX Aring Udieresis -50 KPX Aring Ugrave -50 KPX Aring Uhungarumlaut -50 KPX Aring Umacron -50 KPX Aring Uogonek -50 KPX Aring Uring -50 KPX Aring V -105 KPX Aring W -95 KPX Aring Y -55 KPX Aring Yacute -55 KPX Aring Ydieresis -55 KPX Aring quoteright -37 KPX Aring u -20 KPX Aring uacute -20 KPX Aring ucircumflex -20 KPX Aring udieresis -20 KPX Aring ugrave -20 KPX Aring uhungarumlaut -20 KPX Aring umacron -20 KPX Aring uogonek -20 KPX Aring uring -20 KPX Aring v -55 KPX Aring w -55 KPX Aring y -55 KPX Aring yacute -55 KPX Aring ydieresis -55 KPX Atilde C -30 KPX Atilde Cacute -30 KPX Atilde Ccaron -30 KPX Atilde Ccedilla -30 KPX Atilde G -35 KPX Atilde Gbreve -35 KPX Atilde Gcommaaccent -35 KPX Atilde O -40 KPX Atilde Oacute -40 KPX Atilde Ocircumflex -40 KPX Atilde Odieresis -40 KPX Atilde Ograve -40 KPX Atilde Ohungarumlaut -40 KPX Atilde Omacron -40 KPX Atilde Oslash -40 KPX Atilde Otilde -40 KPX Atilde Q -40 KPX Atilde T -37 KPX Atilde Tcaron -37 KPX Atilde Tcommaaccent -37 KPX Atilde U -50 KPX Atilde Uacute -50 KPX Atilde Ucircumflex -50 KPX Atilde Udieresis -50 KPX Atilde Ugrave -50 KPX Atilde Uhungarumlaut -50 KPX Atilde Umacron -50 KPX Atilde Uogonek -50 KPX Atilde Uring -50 KPX Atilde V -105 KPX Atilde W -95 KPX Atilde Y -55 KPX Atilde Yacute -55 KPX Atilde Ydieresis -55 KPX Atilde quoteright -37 KPX Atilde u -20 KPX Atilde uacute -20 KPX Atilde ucircumflex -20 KPX Atilde udieresis -20 KPX Atilde ugrave -20 KPX Atilde uhungarumlaut -20 KPX Atilde umacron -20 KPX Atilde uogonek -20 KPX Atilde uring -20 KPX Atilde v -55 KPX Atilde w -55 KPX Atilde y -55 KPX Atilde yacute -55 KPX Atilde ydieresis -55 KPX B A -25 KPX B Aacute -25 KPX B Abreve -25 KPX B Acircumflex -25 KPX B Adieresis -25 KPX B Agrave -25 KPX B Amacron -25 KPX B Aogonek -25 KPX B Aring -25 KPX B Atilde -25 KPX B U -10 KPX B Uacute -10 KPX B Ucircumflex -10 KPX B Udieresis -10 KPX B Ugrave -10 KPX B Uhungarumlaut -10 KPX B Umacron -10 KPX B Uogonek -10 KPX B Uring -10 KPX D A -35 KPX D Aacute -35 KPX D Abreve -35 KPX D Acircumflex -35 KPX D Adieresis -35 KPX D Agrave -35 KPX D Amacron -35 KPX D Aogonek -35 KPX D Aring -35 KPX D Atilde -35 KPX D V -40 KPX D W -40 KPX D Y -40 KPX D Yacute -40 KPX D Ydieresis -40 KPX Dcaron A -35 KPX Dcaron Aacute -35 KPX Dcaron Abreve -35 KPX Dcaron Acircumflex -35 KPX Dcaron Adieresis -35 KPX Dcaron Agrave -35 KPX Dcaron Amacron -35 KPX Dcaron Aogonek -35 KPX Dcaron Aring -35 KPX Dcaron Atilde -35 KPX Dcaron V -40 KPX Dcaron W -40 KPX Dcaron Y -40 KPX Dcaron Yacute -40 KPX Dcaron Ydieresis -40 KPX Dcroat A -35 KPX Dcroat Aacute -35 KPX Dcroat Abreve -35 KPX Dcroat Acircumflex -35 KPX Dcroat Adieresis -35 KPX Dcroat Agrave -35 KPX Dcroat Amacron -35 KPX Dcroat Aogonek -35 KPX Dcroat Aring -35 KPX Dcroat Atilde -35 KPX Dcroat V -40 KPX Dcroat W -40 KPX Dcroat Y -40 KPX Dcroat Yacute -40 KPX Dcroat Ydieresis -40 KPX F A -115 KPX F Aacute -115 KPX F Abreve -115 KPX F Acircumflex -115 KPX F Adieresis -115 KPX F Agrave -115 KPX F Amacron -115 KPX F Aogonek -115 KPX F Aring -115 KPX F Atilde -115 KPX F a -75 KPX F aacute -75 KPX F abreve -75 KPX F acircumflex -75 KPX F adieresis -75 KPX F agrave -75 KPX F amacron -75 KPX F aogonek -75 KPX F aring -75 KPX F atilde -75 KPX F comma -135 KPX F e -75 KPX F eacute -75 KPX F ecaron -75 KPX F ecircumflex -75 KPX F edieresis -75 KPX F edotaccent -75 KPX F egrave -75 KPX F emacron -75 KPX F eogonek -75 KPX F i -45 KPX F iacute -45 KPX F icircumflex -45 KPX F idieresis -45 KPX F igrave -45 KPX F imacron -45 KPX F iogonek -45 KPX F o -105 KPX F oacute -105 KPX F ocircumflex -105 KPX F odieresis -105 KPX F ograve -105 KPX F ohungarumlaut -105 KPX F omacron -105 KPX F oslash -105 KPX F otilde -105 KPX F period -135 KPX F r -55 KPX F racute -55 KPX F rcaron -55 KPX F rcommaaccent -55 KPX J A -40 KPX J Aacute -40 KPX J Abreve -40 KPX J Acircumflex -40 KPX J Adieresis -40 KPX J Agrave -40 KPX J Amacron -40 KPX J Aogonek -40 KPX J Aring -40 KPX J Atilde -40 KPX J a -35 KPX J aacute -35 KPX J abreve -35 KPX J acircumflex -35 KPX J adieresis -35 KPX J agrave -35 KPX J amacron -35 KPX J aogonek -35 KPX J aring -35 KPX J atilde -35 KPX J comma -25 KPX J e -25 KPX J eacute -25 KPX J ecaron -25 KPX J ecircumflex -25 KPX J edieresis -25 KPX J edotaccent -25 KPX J egrave -25 KPX J emacron -25 KPX J eogonek -25 KPX J o -25 KPX J oacute -25 KPX J ocircumflex -25 KPX J odieresis -25 KPX J ograve -25 KPX J ohungarumlaut -25 KPX J omacron -25 KPX J oslash -25 KPX J otilde -25 KPX J period -25 KPX J u -35 KPX J uacute -35 KPX J ucircumflex -35 KPX J udieresis -35 KPX J ugrave -35 KPX J uhungarumlaut -35 KPX J umacron -35 KPX J uogonek -35 KPX J uring -35 KPX K O -50 KPX K Oacute -50 KPX K Ocircumflex -50 KPX K Odieresis -50 KPX K Ograve -50 KPX K Ohungarumlaut -50 KPX K Omacron -50 KPX K Oslash -50 KPX K Otilde -50 KPX K e -35 KPX K eacute -35 KPX K ecaron -35 KPX K ecircumflex -35 KPX K edieresis -35 KPX K edotaccent -35 KPX K egrave -35 KPX K emacron -35 KPX K eogonek -35 KPX K o -40 KPX K oacute -40 KPX K ocircumflex -40 KPX K odieresis -40 KPX K ograve -40 KPX K ohungarumlaut -40 KPX K omacron -40 KPX K oslash -40 KPX K otilde -40 KPX K u -40 KPX K uacute -40 KPX K ucircumflex -40 KPX K udieresis -40 KPX K ugrave -40 KPX K uhungarumlaut -40 KPX K umacron -40 KPX K uogonek -40 KPX K uring -40 KPX K y -40 KPX K yacute -40 KPX K ydieresis -40 KPX Kcommaaccent O -50 KPX Kcommaaccent Oacute -50 KPX Kcommaaccent Ocircumflex -50 KPX Kcommaaccent Odieresis -50 KPX Kcommaaccent Ograve -50 KPX Kcommaaccent Ohungarumlaut -50 KPX Kcommaaccent Omacron -50 KPX Kcommaaccent Oslash -50 KPX Kcommaaccent Otilde -50 KPX Kcommaaccent e -35 KPX Kcommaaccent eacute -35 KPX Kcommaaccent ecaron -35 KPX Kcommaaccent ecircumflex -35 KPX Kcommaaccent edieresis -35 KPX Kcommaaccent edotaccent -35 KPX Kcommaaccent egrave -35 KPX Kcommaaccent emacron -35 KPX Kcommaaccent eogonek -35 KPX Kcommaaccent o -40 KPX Kcommaaccent oacute -40 KPX Kcommaaccent ocircumflex -40 KPX Kcommaaccent odieresis -40 KPX Kcommaaccent ograve -40 KPX Kcommaaccent ohungarumlaut -40 KPX Kcommaaccent omacron -40 KPX Kcommaaccent oslash -40 KPX Kcommaaccent otilde -40 KPX Kcommaaccent u -40 KPX Kcommaaccent uacute -40 KPX Kcommaaccent ucircumflex -40 KPX Kcommaaccent udieresis -40 KPX Kcommaaccent ugrave -40 KPX Kcommaaccent uhungarumlaut -40 KPX Kcommaaccent umacron -40 KPX Kcommaaccent uogonek -40 KPX Kcommaaccent uring -40 KPX Kcommaaccent y -40 KPX Kcommaaccent yacute -40 KPX Kcommaaccent ydieresis -40 KPX L T -20 KPX L Tcaron -20 KPX L Tcommaaccent -20 KPX L V -55 KPX L W -55 KPX L Y -20 KPX L Yacute -20 KPX L Ydieresis -20 KPX L quoteright -37 KPX L y -30 KPX L yacute -30 KPX L ydieresis -30 KPX Lacute T -20 KPX Lacute Tcaron -20 KPX Lacute Tcommaaccent -20 KPX Lacute V -55 KPX Lacute W -55 KPX Lacute Y -20 KPX Lacute Yacute -20 KPX Lacute Ydieresis -20 KPX Lacute quoteright -37 KPX Lacute y -30 KPX Lacute yacute -30 KPX Lacute ydieresis -30 KPX Lcommaaccent T -20 KPX Lcommaaccent Tcaron -20 KPX Lcommaaccent Tcommaaccent -20 KPX Lcommaaccent V -55 KPX Lcommaaccent W -55 KPX Lcommaaccent Y -20 KPX Lcommaaccent Yacute -20 KPX Lcommaaccent Ydieresis -20 KPX Lcommaaccent quoteright -37 KPX Lcommaaccent y -30 KPX Lcommaaccent yacute -30 KPX Lcommaaccent ydieresis -30 KPX Lslash T -20 KPX Lslash Tcaron -20 KPX Lslash Tcommaaccent -20 KPX Lslash V -55 KPX Lslash W -55 KPX Lslash Y -20 KPX Lslash Yacute -20 KPX Lslash Ydieresis -20 KPX Lslash quoteright -37 KPX Lslash y -30 KPX Lslash yacute -30 KPX Lslash ydieresis -30 KPX N A -27 KPX N Aacute -27 KPX N Abreve -27 KPX N Acircumflex -27 KPX N Adieresis -27 KPX N Agrave -27 KPX N Amacron -27 KPX N Aogonek -27 KPX N Aring -27 KPX N Atilde -27 KPX Nacute A -27 KPX Nacute Aacute -27 KPX Nacute Abreve -27 KPX Nacute Acircumflex -27 KPX Nacute Adieresis -27 KPX Nacute Agrave -27 KPX Nacute Amacron -27 KPX Nacute Aogonek -27 KPX Nacute Aring -27 KPX Nacute Atilde -27 KPX Ncaron A -27 KPX Ncaron Aacute -27 KPX Ncaron Abreve -27 KPX Ncaron Acircumflex -27 KPX Ncaron Adieresis -27 KPX Ncaron Agrave -27 KPX Ncaron Amacron -27 KPX Ncaron Aogonek -27 KPX Ncaron Aring -27 KPX Ncaron Atilde -27 KPX Ncommaaccent A -27 KPX Ncommaaccent Aacute -27 KPX Ncommaaccent Abreve -27 KPX Ncommaaccent Acircumflex -27 KPX Ncommaaccent Adieresis -27 KPX Ncommaaccent Agrave -27 KPX Ncommaaccent Amacron -27 KPX Ncommaaccent Aogonek -27 KPX Ncommaaccent Aring -27 KPX Ncommaaccent Atilde -27 KPX Ntilde A -27 KPX Ntilde Aacute -27 KPX Ntilde Abreve -27 KPX Ntilde Acircumflex -27 KPX Ntilde Adieresis -27 KPX Ntilde Agrave -27 KPX Ntilde Amacron -27 KPX Ntilde Aogonek -27 KPX Ntilde Aring -27 KPX Ntilde Atilde -27 KPX O A -55 KPX O Aacute -55 KPX O Abreve -55 KPX O Acircumflex -55 KPX O Adieresis -55 KPX O Agrave -55 KPX O Amacron -55 KPX O Aogonek -55 KPX O Aring -55 KPX O Atilde -55 KPX O T -40 KPX O Tcaron -40 KPX O Tcommaaccent -40 KPX O V -50 KPX O W -50 KPX O X -40 KPX O Y -50 KPX O Yacute -50 KPX O Ydieresis -50 KPX Oacute A -55 KPX Oacute Aacute -55 KPX Oacute Abreve -55 KPX Oacute Acircumflex -55 KPX Oacute Adieresis -55 KPX Oacute Agrave -55 KPX Oacute Amacron -55 KPX Oacute Aogonek -55 KPX Oacute Aring -55 KPX Oacute Atilde -55 KPX Oacute T -40 KPX Oacute Tcaron -40 KPX Oacute Tcommaaccent -40 KPX Oacute V -50 KPX Oacute W -50 KPX Oacute X -40 KPX Oacute Y -50 KPX Oacute Yacute -50 KPX Oacute Ydieresis -50 KPX Ocircumflex A -55 KPX Ocircumflex Aacute -55 KPX Ocircumflex Abreve -55 KPX Ocircumflex Acircumflex -55 KPX Ocircumflex Adieresis -55 KPX Ocircumflex Agrave -55 KPX Ocircumflex Amacron -55 KPX Ocircumflex Aogonek -55 KPX Ocircumflex Aring -55 KPX Ocircumflex Atilde -55 KPX Ocircumflex T -40 KPX Ocircumflex Tcaron -40 KPX Ocircumflex Tcommaaccent -40 KPX Ocircumflex V -50 KPX Ocircumflex W -50 KPX Ocircumflex X -40 KPX Ocircumflex Y -50 KPX Ocircumflex Yacute -50 KPX Ocircumflex Ydieresis -50 KPX Odieresis A -55 KPX Odieresis Aacute -55 KPX Odieresis Abreve -55 KPX Odieresis Acircumflex -55 KPX Odieresis Adieresis -55 KPX Odieresis Agrave -55 KPX Odieresis Amacron -55 KPX Odieresis Aogonek -55 KPX Odieresis Aring -55 KPX Odieresis Atilde -55 KPX Odieresis T -40 KPX Odieresis Tcaron -40 KPX Odieresis Tcommaaccent -40 KPX Odieresis V -50 KPX Odieresis W -50 KPX Odieresis X -40 KPX Odieresis Y -50 KPX Odieresis Yacute -50 KPX Odieresis Ydieresis -50 KPX Ograve A -55 KPX Ograve Aacute -55 KPX Ograve Abreve -55 KPX Ograve Acircumflex -55 KPX Ograve Adieresis -55 KPX Ograve Agrave -55 KPX Ograve Amacron -55 KPX Ograve Aogonek -55 KPX Ograve Aring -55 KPX Ograve Atilde -55 KPX Ograve T -40 KPX Ograve Tcaron -40 KPX Ograve Tcommaaccent -40 KPX Ograve V -50 KPX Ograve W -50 KPX Ograve X -40 KPX Ograve Y -50 KPX Ograve Yacute -50 KPX Ograve Ydieresis -50 KPX Ohungarumlaut A -55 KPX Ohungarumlaut Aacute -55 KPX Ohungarumlaut Abreve -55 KPX Ohungarumlaut Acircumflex -55 KPX Ohungarumlaut Adieresis -55 KPX Ohungarumlaut Agrave -55 KPX Ohungarumlaut Amacron -55 KPX Ohungarumlaut Aogonek -55 KPX Ohungarumlaut Aring -55 KPX Ohungarumlaut Atilde -55 KPX Ohungarumlaut T -40 KPX Ohungarumlaut Tcaron -40 KPX Ohungarumlaut Tcommaaccent -40 KPX Ohungarumlaut V -50 KPX Ohungarumlaut W -50 KPX Ohungarumlaut X -40 KPX Ohungarumlaut Y -50 KPX Ohungarumlaut Yacute -50 KPX Ohungarumlaut Ydieresis -50 KPX Omacron A -55 KPX Omacron Aacute -55 KPX Omacron Abreve -55 KPX Omacron Acircumflex -55 KPX Omacron Adieresis -55 KPX Omacron Agrave -55 KPX Omacron Amacron -55 KPX Omacron Aogonek -55 KPX Omacron Aring -55 KPX Omacron Atilde -55 KPX Omacron T -40 KPX Omacron Tcaron -40 KPX Omacron Tcommaaccent -40 KPX Omacron V -50 KPX Omacron W -50 KPX Omacron X -40 KPX Omacron Y -50 KPX Omacron Yacute -50 KPX Omacron Ydieresis -50 KPX Oslash A -55 KPX Oslash Aacute -55 KPX Oslash Abreve -55 KPX Oslash Acircumflex -55 KPX Oslash Adieresis -55 KPX Oslash Agrave -55 KPX Oslash Amacron -55 KPX Oslash Aogonek -55 KPX Oslash Aring -55 KPX Oslash Atilde -55 KPX Oslash T -40 KPX Oslash Tcaron -40 KPX Oslash Tcommaaccent -40 KPX Oslash V -50 KPX Oslash W -50 KPX Oslash X -40 KPX Oslash Y -50 KPX Oslash Yacute -50 KPX Oslash Ydieresis -50 KPX Otilde A -55 KPX Otilde Aacute -55 KPX Otilde Abreve -55 KPX Otilde Acircumflex -55 KPX Otilde Adieresis -55 KPX Otilde Agrave -55 KPX Otilde Amacron -55 KPX Otilde Aogonek -55 KPX Otilde Aring -55 KPX Otilde Atilde -55 KPX Otilde T -40 KPX Otilde Tcaron -40 KPX Otilde Tcommaaccent -40 KPX Otilde V -50 KPX Otilde W -50 KPX Otilde X -40 KPX Otilde Y -50 KPX Otilde Yacute -50 KPX Otilde Ydieresis -50 KPX P A -90 KPX P Aacute -90 KPX P Abreve -90 KPX P Acircumflex -90 KPX P Adieresis -90 KPX P Agrave -90 KPX P Amacron -90 KPX P Aogonek -90 KPX P Aring -90 KPX P Atilde -90 KPX P a -80 KPX P aacute -80 KPX P abreve -80 KPX P acircumflex -80 KPX P adieresis -80 KPX P agrave -80 KPX P amacron -80 KPX P aogonek -80 KPX P aring -80 KPX P atilde -80 KPX P comma -135 KPX P e -80 KPX P eacute -80 KPX P ecaron -80 KPX P ecircumflex -80 KPX P edieresis -80 KPX P edotaccent -80 KPX P egrave -80 KPX P emacron -80 KPX P eogonek -80 KPX P o -80 KPX P oacute -80 KPX P ocircumflex -80 KPX P odieresis -80 KPX P ograve -80 KPX P ohungarumlaut -80 KPX P omacron -80 KPX P oslash -80 KPX P otilde -80 KPX P period -135 KPX Q U -10 KPX Q Uacute -10 KPX Q Ucircumflex -10 KPX Q Udieresis -10 KPX Q Ugrave -10 KPX Q Uhungarumlaut -10 KPX Q Umacron -10 KPX Q Uogonek -10 KPX Q Uring -10 KPX R O -40 KPX R Oacute -40 KPX R Ocircumflex -40 KPX R Odieresis -40 KPX R Ograve -40 KPX R Ohungarumlaut -40 KPX R Omacron -40 KPX R Oslash -40 KPX R Otilde -40 KPX R U -40 KPX R Uacute -40 KPX R Ucircumflex -40 KPX R Udieresis -40 KPX R Ugrave -40 KPX R Uhungarumlaut -40 KPX R Umacron -40 KPX R Uogonek -40 KPX R Uring -40 KPX R V -18 KPX R W -18 KPX R Y -18 KPX R Yacute -18 KPX R Ydieresis -18 KPX Racute O -40 KPX Racute Oacute -40 KPX Racute Ocircumflex -40 KPX Racute Odieresis -40 KPX Racute Ograve -40 KPX Racute Ohungarumlaut -40 KPX Racute Omacron -40 KPX Racute Oslash -40 KPX Racute Otilde -40 KPX Racute U -40 KPX Racute Uacute -40 KPX Racute Ucircumflex -40 KPX Racute Udieresis -40 KPX Racute Ugrave -40 KPX Racute Uhungarumlaut -40 KPX Racute Umacron -40 KPX Racute Uogonek -40 KPX Racute Uring -40 KPX Racute V -18 KPX Racute W -18 KPX Racute Y -18 KPX Racute Yacute -18 KPX Racute Ydieresis -18 KPX Rcaron O -40 KPX Rcaron Oacute -40 KPX Rcaron Ocircumflex -40 KPX Rcaron Odieresis -40 KPX Rcaron Ograve -40 KPX Rcaron Ohungarumlaut -40 KPX Rcaron Omacron -40 KPX Rcaron Oslash -40 KPX Rcaron Otilde -40 KPX Rcaron U -40 KPX Rcaron Uacute -40 KPX Rcaron Ucircumflex -40 KPX Rcaron Udieresis -40 KPX Rcaron Ugrave -40 KPX Rcaron Uhungarumlaut -40 KPX Rcaron Umacron -40 KPX Rcaron Uogonek -40 KPX Rcaron Uring -40 KPX Rcaron V -18 KPX Rcaron W -18 KPX Rcaron Y -18 KPX Rcaron Yacute -18 KPX Rcaron Ydieresis -18 KPX Rcommaaccent O -40 KPX Rcommaaccent Oacute -40 KPX Rcommaaccent Ocircumflex -40 KPX Rcommaaccent Odieresis -40 KPX Rcommaaccent Ograve -40 KPX Rcommaaccent Ohungarumlaut -40 KPX Rcommaaccent Omacron -40 KPX Rcommaaccent Oslash -40 KPX Rcommaaccent Otilde -40 KPX Rcommaaccent U -40 KPX Rcommaaccent Uacute -40 KPX Rcommaaccent Ucircumflex -40 KPX Rcommaaccent Udieresis -40 KPX Rcommaaccent Ugrave -40 KPX Rcommaaccent Uhungarumlaut -40 KPX Rcommaaccent Umacron -40 KPX Rcommaaccent Uogonek -40 KPX Rcommaaccent Uring -40 KPX Rcommaaccent V -18 KPX Rcommaaccent W -18 KPX Rcommaaccent Y -18 KPX Rcommaaccent Yacute -18 KPX Rcommaaccent Ydieresis -18 KPX T A -50 KPX T Aacute -50 KPX T Abreve -50 KPX T Acircumflex -50 KPX T Adieresis -50 KPX T Agrave -50 KPX T Amacron -50 KPX T Aogonek -50 KPX T Aring -50 KPX T Atilde -50 KPX T O -18 KPX T Oacute -18 KPX T Ocircumflex -18 KPX T Odieresis -18 KPX T Ograve -18 KPX T Ohungarumlaut -18 KPX T Omacron -18 KPX T Oslash -18 KPX T Otilde -18 KPX T a -92 KPX T aacute -92 KPX T abreve -92 KPX T acircumflex -92 KPX T adieresis -92 KPX T agrave -92 KPX T amacron -92 KPX T aogonek -92 KPX T aring -92 KPX T atilde -92 KPX T colon -55 KPX T comma -74 KPX T e -92 KPX T eacute -92 KPX T ecaron -92 KPX T ecircumflex -52 KPX T edieresis -52 KPX T edotaccent -92 KPX T egrave -52 KPX T emacron -52 KPX T eogonek -92 KPX T hyphen -74 KPX T i -55 KPX T iacute -55 KPX T iogonek -55 KPX T o -92 KPX T oacute -92 KPX T ocircumflex -92 KPX T odieresis -92 KPX T ograve -92 KPX T ohungarumlaut -92 KPX T omacron -92 KPX T oslash -92 KPX T otilde -92 KPX T period -74 KPX T r -55 KPX T racute -55 KPX T rcaron -55 KPX T rcommaaccent -55 KPX T semicolon -65 KPX T u -55 KPX T uacute -55 KPX T ucircumflex -55 KPX T udieresis -55 KPX T ugrave -55 KPX T uhungarumlaut -55 KPX T umacron -55 KPX T uogonek -55 KPX T uring -55 KPX T w -74 KPX T y -74 KPX T yacute -74 KPX T ydieresis -34 KPX Tcaron A -50 KPX Tcaron Aacute -50 KPX Tcaron Abreve -50 KPX Tcaron Acircumflex -50 KPX Tcaron Adieresis -50 KPX Tcaron Agrave -50 KPX Tcaron Amacron -50 KPX Tcaron Aogonek -50 KPX Tcaron Aring -50 KPX Tcaron Atilde -50 KPX Tcaron O -18 KPX Tcaron Oacute -18 KPX Tcaron Ocircumflex -18 KPX Tcaron Odieresis -18 KPX Tcaron Ograve -18 KPX Tcaron Ohungarumlaut -18 KPX Tcaron Omacron -18 KPX Tcaron Oslash -18 KPX Tcaron Otilde -18 KPX Tcaron a -92 KPX Tcaron aacute -92 KPX Tcaron abreve -92 KPX Tcaron acircumflex -92 KPX Tcaron adieresis -92 KPX Tcaron agrave -92 KPX Tcaron amacron -92 KPX Tcaron aogonek -92 KPX Tcaron aring -92 KPX Tcaron atilde -92 KPX Tcaron colon -55 KPX Tcaron comma -74 KPX Tcaron e -92 KPX Tcaron eacute -92 KPX Tcaron ecaron -92 KPX Tcaron ecircumflex -52 KPX Tcaron edieresis -52 KPX Tcaron edotaccent -92 KPX Tcaron egrave -52 KPX Tcaron emacron -52 KPX Tcaron eogonek -92 KPX Tcaron hyphen -74 KPX Tcaron i -55 KPX Tcaron iacute -55 KPX Tcaron iogonek -55 KPX Tcaron o -92 KPX Tcaron oacute -92 KPX Tcaron ocircumflex -92 KPX Tcaron odieresis -92 KPX Tcaron ograve -92 KPX Tcaron ohungarumlaut -92 KPX Tcaron omacron -92 KPX Tcaron oslash -92 KPX Tcaron otilde -92 KPX Tcaron period -74 KPX Tcaron r -55 KPX Tcaron racute -55 KPX Tcaron rcaron -55 KPX Tcaron rcommaaccent -55 KPX Tcaron semicolon -65 KPX Tcaron u -55 KPX Tcaron uacute -55 KPX Tcaron ucircumflex -55 KPX Tcaron udieresis -55 KPX Tcaron ugrave -55 KPX Tcaron uhungarumlaut -55 KPX Tcaron umacron -55 KPX Tcaron uogonek -55 KPX Tcaron uring -55 KPX Tcaron w -74 KPX Tcaron y -74 KPX Tcaron yacute -74 KPX Tcaron ydieresis -34 KPX Tcommaaccent A -50 KPX Tcommaaccent Aacute -50 KPX Tcommaaccent Abreve -50 KPX Tcommaaccent Acircumflex -50 KPX Tcommaaccent Adieresis -50 KPX Tcommaaccent Agrave -50 KPX Tcommaaccent Amacron -50 KPX Tcommaaccent Aogonek -50 KPX Tcommaaccent Aring -50 KPX Tcommaaccent Atilde -50 KPX Tcommaaccent O -18 KPX Tcommaaccent Oacute -18 KPX Tcommaaccent Ocircumflex -18 KPX Tcommaaccent Odieresis -18 KPX Tcommaaccent Ograve -18 KPX Tcommaaccent Ohungarumlaut -18 KPX Tcommaaccent Omacron -18 KPX Tcommaaccent Oslash -18 KPX Tcommaaccent Otilde -18 KPX Tcommaaccent a -92 KPX Tcommaaccent aacute -92 KPX Tcommaaccent abreve -92 KPX Tcommaaccent acircumflex -92 KPX Tcommaaccent adieresis -92 KPX Tcommaaccent agrave -92 KPX Tcommaaccent amacron -92 KPX Tcommaaccent aogonek -92 KPX Tcommaaccent aring -92 KPX Tcommaaccent atilde -92 KPX Tcommaaccent colon -55 KPX Tcommaaccent comma -74 KPX Tcommaaccent e -92 KPX Tcommaaccent eacute -92 KPX Tcommaaccent ecaron -92 KPX Tcommaaccent ecircumflex -52 KPX Tcommaaccent edieresis -52 KPX Tcommaaccent edotaccent -92 KPX Tcommaaccent egrave -52 KPX Tcommaaccent emacron -52 KPX Tcommaaccent eogonek -92 KPX Tcommaaccent hyphen -74 KPX Tcommaaccent i -55 KPX Tcommaaccent iacute -55 KPX Tcommaaccent iogonek -55 KPX Tcommaaccent o -92 KPX Tcommaaccent oacute -92 KPX Tcommaaccent ocircumflex -92 KPX Tcommaaccent odieresis -92 KPX Tcommaaccent ograve -92 KPX Tcommaaccent ohungarumlaut -92 KPX Tcommaaccent omacron -92 KPX Tcommaaccent oslash -92 KPX Tcommaaccent otilde -92 KPX Tcommaaccent period -74 KPX Tcommaaccent r -55 KPX Tcommaaccent racute -55 KPX Tcommaaccent rcaron -55 KPX Tcommaaccent rcommaaccent -55 KPX Tcommaaccent semicolon -65 KPX Tcommaaccent u -55 KPX Tcommaaccent uacute -55 KPX Tcommaaccent ucircumflex -55 KPX Tcommaaccent udieresis -55 KPX Tcommaaccent ugrave -55 KPX Tcommaaccent uhungarumlaut -55 KPX Tcommaaccent umacron -55 KPX Tcommaaccent uogonek -55 KPX Tcommaaccent uring -55 KPX Tcommaaccent w -74 KPX Tcommaaccent y -74 KPX Tcommaaccent yacute -74 KPX Tcommaaccent ydieresis -34 KPX U A -40 KPX U Aacute -40 KPX U Abreve -40 KPX U Acircumflex -40 KPX U Adieresis -40 KPX U Agrave -40 KPX U Amacron -40 KPX U Aogonek -40 KPX U Aring -40 KPX U Atilde -40 KPX U comma -25 KPX U period -25 KPX Uacute A -40 KPX Uacute Aacute -40 KPX Uacute Abreve -40 KPX Uacute Acircumflex -40 KPX Uacute Adieresis -40 KPX Uacute Agrave -40 KPX Uacute Amacron -40 KPX Uacute Aogonek -40 KPX Uacute Aring -40 KPX Uacute Atilde -40 KPX Uacute comma -25 KPX Uacute period -25 KPX Ucircumflex A -40 KPX Ucircumflex Aacute -40 KPX Ucircumflex Abreve -40 KPX Ucircumflex Acircumflex -40 KPX Ucircumflex Adieresis -40 KPX Ucircumflex Agrave -40 KPX Ucircumflex Amacron -40 KPX Ucircumflex Aogonek -40 KPX Ucircumflex Aring -40 KPX Ucircumflex Atilde -40 KPX Ucircumflex comma -25 KPX Ucircumflex period -25 KPX Udieresis A -40 KPX Udieresis Aacute -40 KPX Udieresis Abreve -40 KPX Udieresis Acircumflex -40 KPX Udieresis Adieresis -40 KPX Udieresis Agrave -40 KPX Udieresis Amacron -40 KPX Udieresis Aogonek -40 KPX Udieresis Aring -40 KPX Udieresis Atilde -40 KPX Udieresis comma -25 KPX Udieresis period -25 KPX Ugrave A -40 KPX Ugrave Aacute -40 KPX Ugrave Abreve -40 KPX Ugrave Acircumflex -40 KPX Ugrave Adieresis -40 KPX Ugrave Agrave -40 KPX Ugrave Amacron -40 KPX Ugrave Aogonek -40 KPX Ugrave Aring -40 KPX Ugrave Atilde -40 KPX Ugrave comma -25 KPX Ugrave period -25 KPX Uhungarumlaut A -40 KPX Uhungarumlaut Aacute -40 KPX Uhungarumlaut Abreve -40 KPX Uhungarumlaut Acircumflex -40 KPX Uhungarumlaut Adieresis -40 KPX Uhungarumlaut Agrave -40 KPX Uhungarumlaut Amacron -40 KPX Uhungarumlaut Aogonek -40 KPX Uhungarumlaut Aring -40 KPX Uhungarumlaut Atilde -40 KPX Uhungarumlaut comma -25 KPX Uhungarumlaut period -25 KPX Umacron A -40 KPX Umacron Aacute -40 KPX Umacron Abreve -40 KPX Umacron Acircumflex -40 KPX Umacron Adieresis -40 KPX Umacron Agrave -40 KPX Umacron Amacron -40 KPX Umacron Aogonek -40 KPX Umacron Aring -40 KPX Umacron Atilde -40 KPX Umacron comma -25 KPX Umacron period -25 KPX Uogonek A -40 KPX Uogonek Aacute -40 KPX Uogonek Abreve -40 KPX Uogonek Acircumflex -40 KPX Uogonek Adieresis -40 KPX Uogonek Agrave -40 KPX Uogonek Amacron -40 KPX Uogonek Aogonek -40 KPX Uogonek Aring -40 KPX Uogonek Atilde -40 KPX Uogonek comma -25 KPX Uogonek period -25 KPX Uring A -40 KPX Uring Aacute -40 KPX Uring Abreve -40 KPX Uring Acircumflex -40 KPX Uring Adieresis -40 KPX Uring Agrave -40 KPX Uring Amacron -40 KPX Uring Aogonek -40 KPX Uring Aring -40 KPX Uring Atilde -40 KPX Uring comma -25 KPX Uring period -25 KPX V A -60 KPX V Aacute -60 KPX V Abreve -60 KPX V Acircumflex -60 KPX V Adieresis -60 KPX V Agrave -60 KPX V Amacron -60 KPX V Aogonek -60 KPX V Aring -60 KPX V Atilde -60 KPX V O -30 KPX V Oacute -30 KPX V Ocircumflex -30 KPX V Odieresis -30 KPX V Ograve -30 KPX V Ohungarumlaut -30 KPX V Omacron -30 KPX V Oslash -30 KPX V Otilde -30 KPX V a -111 KPX V aacute -111 KPX V abreve -111 KPX V acircumflex -111 KPX V adieresis -111 KPX V agrave -111 KPX V amacron -111 KPX V aogonek -111 KPX V aring -111 KPX V atilde -111 KPX V colon -65 KPX V comma -129 KPX V e -111 KPX V eacute -111 KPX V ecaron -111 KPX V ecircumflex -111 KPX V edieresis -71 KPX V edotaccent -111 KPX V egrave -71 KPX V emacron -71 KPX V eogonek -111 KPX V hyphen -55 KPX V i -74 KPX V iacute -74 KPX V icircumflex -34 KPX V idieresis -34 KPX V igrave -34 KPX V imacron -34 KPX V iogonek -74 KPX V o -111 KPX V oacute -111 KPX V ocircumflex -111 KPX V odieresis -111 KPX V ograve -111 KPX V ohungarumlaut -111 KPX V omacron -111 KPX V oslash -111 KPX V otilde -111 KPX V period -129 KPX V semicolon -74 KPX V u -74 KPX V uacute -74 KPX V ucircumflex -74 KPX V udieresis -74 KPX V ugrave -74 KPX V uhungarumlaut -74 KPX V umacron -74 KPX V uogonek -74 KPX V uring -74 KPX W A -60 KPX W Aacute -60 KPX W Abreve -60 KPX W Acircumflex -60 KPX W Adieresis -60 KPX W Agrave -60 KPX W Amacron -60 KPX W Aogonek -60 KPX W Aring -60 KPX W Atilde -60 KPX W O -25 KPX W Oacute -25 KPX W Ocircumflex -25 KPX W Odieresis -25 KPX W Ograve -25 KPX W Ohungarumlaut -25 KPX W Omacron -25 KPX W Oslash -25 KPX W Otilde -25 KPX W a -92 KPX W aacute -92 KPX W abreve -92 KPX W acircumflex -92 KPX W adieresis -92 KPX W agrave -92 KPX W amacron -92 KPX W aogonek -92 KPX W aring -92 KPX W atilde -92 KPX W colon -65 KPX W comma -92 KPX W e -92 KPX W eacute -92 KPX W ecaron -92 KPX W ecircumflex -92 KPX W edieresis -52 KPX W edotaccent -92 KPX W egrave -52 KPX W emacron -52 KPX W eogonek -92 KPX W hyphen -37 KPX W i -55 KPX W iacute -55 KPX W iogonek -55 KPX W o -92 KPX W oacute -92 KPX W ocircumflex -92 KPX W odieresis -92 KPX W ograve -92 KPX W ohungarumlaut -92 KPX W omacron -92 KPX W oslash -92 KPX W otilde -92 KPX W period -92 KPX W semicolon -65 KPX W u -55 KPX W uacute -55 KPX W ucircumflex -55 KPX W udieresis -55 KPX W ugrave -55 KPX W uhungarumlaut -55 KPX W umacron -55 KPX W uogonek -55 KPX W uring -55 KPX W y -70 KPX W yacute -70 KPX W ydieresis -70 KPX Y A -50 KPX Y Aacute -50 KPX Y Abreve -50 KPX Y Acircumflex -50 KPX Y Adieresis -50 KPX Y Agrave -50 KPX Y Amacron -50 KPX Y Aogonek -50 KPX Y Aring -50 KPX Y Atilde -50 KPX Y O -15 KPX Y Oacute -15 KPX Y Ocircumflex -15 KPX Y Odieresis -15 KPX Y Ograve -15 KPX Y Ohungarumlaut -15 KPX Y Omacron -15 KPX Y Oslash -15 KPX Y Otilde -15 KPX Y a -92 KPX Y aacute -92 KPX Y abreve -92 KPX Y acircumflex -92 KPX Y adieresis -92 KPX Y agrave -92 KPX Y amacron -92 KPX Y aogonek -92 KPX Y aring -92 KPX Y atilde -92 KPX Y colon -65 KPX Y comma -92 KPX Y e -92 KPX Y eacute -92 KPX Y ecaron -92 KPX Y ecircumflex -92 KPX Y edieresis -52 KPX Y edotaccent -92 KPX Y egrave -52 KPX Y emacron -52 KPX Y eogonek -92 KPX Y hyphen -74 KPX Y i -74 KPX Y iacute -74 KPX Y icircumflex -34 KPX Y idieresis -34 KPX Y igrave -34 KPX Y imacron -34 KPX Y iogonek -74 KPX Y o -92 KPX Y oacute -92 KPX Y ocircumflex -92 KPX Y odieresis -92 KPX Y ograve -92 KPX Y ohungarumlaut -92 KPX Y omacron -92 KPX Y oslash -92 KPX Y otilde -92 KPX Y period -92 KPX Y semicolon -65 KPX Y u -92 KPX Y uacute -92 KPX Y ucircumflex -92 KPX Y udieresis -92 KPX Y ugrave -92 KPX Y uhungarumlaut -92 KPX Y umacron -92 KPX Y uogonek -92 KPX Y uring -92 KPX Yacute A -50 KPX Yacute Aacute -50 KPX Yacute Abreve -50 KPX Yacute Acircumflex -50 KPX Yacute Adieresis -50 KPX Yacute Agrave -50 KPX Yacute Amacron -50 KPX Yacute Aogonek -50 KPX Yacute Aring -50 KPX Yacute Atilde -50 KPX Yacute O -15 KPX Yacute Oacute -15 KPX Yacute Ocircumflex -15 KPX Yacute Odieresis -15 KPX Yacute Ograve -15 KPX Yacute Ohungarumlaut -15 KPX Yacute Omacron -15 KPX Yacute Oslash -15 KPX Yacute Otilde -15 KPX Yacute a -92 KPX Yacute aacute -92 KPX Yacute abreve -92 KPX Yacute acircumflex -92 KPX Yacute adieresis -92 KPX Yacute agrave -92 KPX Yacute amacron -92 KPX Yacute aogonek -92 KPX Yacute aring -92 KPX Yacute atilde -92 KPX Yacute colon -65 KPX Yacute comma -92 KPX Yacute e -92 KPX Yacute eacute -92 KPX Yacute ecaron -92 KPX Yacute ecircumflex -92 KPX Yacute edieresis -52 KPX Yacute edotaccent -92 KPX Yacute egrave -52 KPX Yacute emacron -52 KPX Yacute eogonek -92 KPX Yacute hyphen -74 KPX Yacute i -74 KPX Yacute iacute -74 KPX Yacute icircumflex -34 KPX Yacute idieresis -34 KPX Yacute igrave -34 KPX Yacute imacron -34 KPX Yacute iogonek -74 KPX Yacute o -92 KPX Yacute oacute -92 KPX Yacute ocircumflex -92 KPX Yacute odieresis -92 KPX Yacute ograve -92 KPX Yacute ohungarumlaut -92 KPX Yacute omacron -92 KPX Yacute oslash -92 KPX Yacute otilde -92 KPX Yacute period -92 KPX Yacute semicolon -65 KPX Yacute u -92 KPX Yacute uacute -92 KPX Yacute ucircumflex -92 KPX Yacute udieresis -92 KPX Yacute ugrave -92 KPX Yacute uhungarumlaut -92 KPX Yacute umacron -92 KPX Yacute uogonek -92 KPX Yacute uring -92 KPX Ydieresis A -50 KPX Ydieresis Aacute -50 KPX Ydieresis Abreve -50 KPX Ydieresis Acircumflex -50 KPX Ydieresis Adieresis -50 KPX Ydieresis Agrave -50 KPX Ydieresis Amacron -50 KPX Ydieresis Aogonek -50 KPX Ydieresis Aring -50 KPX Ydieresis Atilde -50 KPX Ydieresis O -15 KPX Ydieresis Oacute -15 KPX Ydieresis Ocircumflex -15 KPX Ydieresis Odieresis -15 KPX Ydieresis Ograve -15 KPX Ydieresis Ohungarumlaut -15 KPX Ydieresis Omacron -15 KPX Ydieresis Oslash -15 KPX Ydieresis Otilde -15 KPX Ydieresis a -92 KPX Ydieresis aacute -92 KPX Ydieresis abreve -92 KPX Ydieresis acircumflex -92 KPX Ydieresis adieresis -92 KPX Ydieresis agrave -92 KPX Ydieresis amacron -92 KPX Ydieresis aogonek -92 KPX Ydieresis aring -92 KPX Ydieresis atilde -92 KPX Ydieresis colon -65 KPX Ydieresis comma -92 KPX Ydieresis e -92 KPX Ydieresis eacute -92 KPX Ydieresis ecaron -92 KPX Ydieresis ecircumflex -92 KPX Ydieresis edieresis -52 KPX Ydieresis edotaccent -92 KPX Ydieresis egrave -52 KPX Ydieresis emacron -52 KPX Ydieresis eogonek -92 KPX Ydieresis hyphen -74 KPX Ydieresis i -74 KPX Ydieresis iacute -74 KPX Ydieresis icircumflex -34 KPX Ydieresis idieresis -34 KPX Ydieresis igrave -34 KPX Ydieresis imacron -34 KPX Ydieresis iogonek -74 KPX Ydieresis o -92 KPX Ydieresis oacute -92 KPX Ydieresis ocircumflex -92 KPX Ydieresis odieresis -92 KPX Ydieresis ograve -92 KPX Ydieresis ohungarumlaut -92 KPX Ydieresis omacron -92 KPX Ydieresis oslash -92 KPX Ydieresis otilde -92 KPX Ydieresis period -92 KPX Ydieresis semicolon -65 KPX Ydieresis u -92 KPX Ydieresis uacute -92 KPX Ydieresis ucircumflex -92 KPX Ydieresis udieresis -92 KPX Ydieresis ugrave -92 KPX Ydieresis uhungarumlaut -92 KPX Ydieresis umacron -92 KPX Ydieresis uogonek -92 KPX Ydieresis uring -92 KPX a g -10 KPX a gbreve -10 KPX a gcommaaccent -10 KPX aacute g -10 KPX aacute gbreve -10 KPX aacute gcommaaccent -10 KPX abreve g -10 KPX abreve gbreve -10 KPX abreve gcommaaccent -10 KPX acircumflex g -10 KPX acircumflex gbreve -10 KPX acircumflex gcommaaccent -10 KPX adieresis g -10 KPX adieresis gbreve -10 KPX adieresis gcommaaccent -10 KPX agrave g -10 KPX agrave gbreve -10 KPX agrave gcommaaccent -10 KPX amacron g -10 KPX amacron gbreve -10 KPX amacron gcommaaccent -10 KPX aogonek g -10 KPX aogonek gbreve -10 KPX aogonek gcommaaccent -10 KPX aring g -10 KPX aring gbreve -10 KPX aring gcommaaccent -10 KPX atilde g -10 KPX atilde gbreve -10 KPX atilde gcommaaccent -10 KPX b period -40 KPX b u -20 KPX b uacute -20 KPX b ucircumflex -20 KPX b udieresis -20 KPX b ugrave -20 KPX b uhungarumlaut -20 KPX b umacron -20 KPX b uogonek -20 KPX b uring -20 KPX c h -15 KPX c k -20 KPX c kcommaaccent -20 KPX cacute h -15 KPX cacute k -20 KPX cacute kcommaaccent -20 KPX ccaron h -15 KPX ccaron k -20 KPX ccaron kcommaaccent -20 KPX ccedilla h -15 KPX ccedilla k -20 KPX ccedilla kcommaaccent -20 KPX comma quotedblright -140 KPX comma quoteright -140 KPX e comma -10 KPX e g -40 KPX e gbreve -40 KPX e gcommaaccent -40 KPX e period -15 KPX e v -15 KPX e w -15 KPX e x -20 KPX e y -30 KPX e yacute -30 KPX e ydieresis -30 KPX eacute comma -10 KPX eacute g -40 KPX eacute gbreve -40 KPX eacute gcommaaccent -40 KPX eacute period -15 KPX eacute v -15 KPX eacute w -15 KPX eacute x -20 KPX eacute y -30 KPX eacute yacute -30 KPX eacute ydieresis -30 KPX ecaron comma -10 KPX ecaron g -40 KPX ecaron gbreve -40 KPX ecaron gcommaaccent -40 KPX ecaron period -15 KPX ecaron v -15 KPX ecaron w -15 KPX ecaron x -20 KPX ecaron y -30 KPX ecaron yacute -30 KPX ecaron ydieresis -30 KPX ecircumflex comma -10 KPX ecircumflex g -40 KPX ecircumflex gbreve -40 KPX ecircumflex gcommaaccent -40 KPX ecircumflex period -15 KPX ecircumflex v -15 KPX ecircumflex w -15 KPX ecircumflex x -20 KPX ecircumflex y -30 KPX ecircumflex yacute -30 KPX ecircumflex ydieresis -30 KPX edieresis comma -10 KPX edieresis g -40 KPX edieresis gbreve -40 KPX edieresis gcommaaccent -40 KPX edieresis period -15 KPX edieresis v -15 KPX edieresis w -15 KPX edieresis x -20 KPX edieresis y -30 KPX edieresis yacute -30 KPX edieresis ydieresis -30 KPX edotaccent comma -10 KPX edotaccent g -40 KPX edotaccent gbreve -40 KPX edotaccent gcommaaccent -40 KPX edotaccent period -15 KPX edotaccent v -15 KPX edotaccent w -15 KPX edotaccent x -20 KPX edotaccent y -30 KPX edotaccent yacute -30 KPX edotaccent ydieresis -30 KPX egrave comma -10 KPX egrave g -40 KPX egrave gbreve -40 KPX egrave gcommaaccent -40 KPX egrave period -15 KPX egrave v -15 KPX egrave w -15 KPX egrave x -20 KPX egrave y -30 KPX egrave yacute -30 KPX egrave ydieresis -30 KPX emacron comma -10 KPX emacron g -40 KPX emacron gbreve -40 KPX emacron gcommaaccent -40 KPX emacron period -15 KPX emacron v -15 KPX emacron w -15 KPX emacron x -20 KPX emacron y -30 KPX emacron yacute -30 KPX emacron ydieresis -30 KPX eogonek comma -10 KPX eogonek g -40 KPX eogonek gbreve -40 KPX eogonek gcommaaccent -40 KPX eogonek period -15 KPX eogonek v -15 KPX eogonek w -15 KPX eogonek x -20 KPX eogonek y -30 KPX eogonek yacute -30 KPX eogonek ydieresis -30 KPX f comma -10 KPX f dotlessi -60 KPX f f -18 KPX f i -20 KPX f iogonek -20 KPX f period -15 KPX f quoteright 92 KPX g comma -10 KPX g e -10 KPX g eacute -10 KPX g ecaron -10 KPX g ecircumflex -10 KPX g edieresis -10 KPX g edotaccent -10 KPX g egrave -10 KPX g emacron -10 KPX g eogonek -10 KPX g g -10 KPX g gbreve -10 KPX g gcommaaccent -10 KPX g period -15 KPX gbreve comma -10 KPX gbreve e -10 KPX gbreve eacute -10 KPX gbreve ecaron -10 KPX gbreve ecircumflex -10 KPX gbreve edieresis -10 KPX gbreve edotaccent -10 KPX gbreve egrave -10 KPX gbreve emacron -10 KPX gbreve eogonek -10 KPX gbreve g -10 KPX gbreve gbreve -10 KPX gbreve gcommaaccent -10 KPX gbreve period -15 KPX gcommaaccent comma -10 KPX gcommaaccent e -10 KPX gcommaaccent eacute -10 KPX gcommaaccent ecaron -10 KPX gcommaaccent ecircumflex -10 KPX gcommaaccent edieresis -10 KPX gcommaaccent edotaccent -10 KPX gcommaaccent egrave -10 KPX gcommaaccent emacron -10 KPX gcommaaccent eogonek -10 KPX gcommaaccent g -10 KPX gcommaaccent gbreve -10 KPX gcommaaccent gcommaaccent -10 KPX gcommaaccent period -15 KPX k e -10 KPX k eacute -10 KPX k ecaron -10 KPX k ecircumflex -10 KPX k edieresis -10 KPX k edotaccent -10 KPX k egrave -10 KPX k emacron -10 KPX k eogonek -10 KPX k o -10 KPX k oacute -10 KPX k ocircumflex -10 KPX k odieresis -10 KPX k ograve -10 KPX k ohungarumlaut -10 KPX k omacron -10 KPX k oslash -10 KPX k otilde -10 KPX k y -10 KPX k yacute -10 KPX k ydieresis -10 KPX kcommaaccent e -10 KPX kcommaaccent eacute -10 KPX kcommaaccent ecaron -10 KPX kcommaaccent ecircumflex -10 KPX kcommaaccent edieresis -10 KPX kcommaaccent edotaccent -10 KPX kcommaaccent egrave -10 KPX kcommaaccent emacron -10 KPX kcommaaccent eogonek -10 KPX kcommaaccent o -10 KPX kcommaaccent oacute -10 KPX kcommaaccent ocircumflex -10 KPX kcommaaccent odieresis -10 KPX kcommaaccent ograve -10 KPX kcommaaccent ohungarumlaut -10 KPX kcommaaccent omacron -10 KPX kcommaaccent oslash -10 KPX kcommaaccent otilde -10 KPX kcommaaccent y -10 KPX kcommaaccent yacute -10 KPX kcommaaccent ydieresis -10 KPX n v -40 KPX nacute v -40 KPX ncaron v -40 KPX ncommaaccent v -40 KPX ntilde v -40 KPX o g -10 KPX o gbreve -10 KPX o gcommaaccent -10 KPX o v -10 KPX oacute g -10 KPX oacute gbreve -10 KPX oacute gcommaaccent -10 KPX oacute v -10 KPX ocircumflex g -10 KPX ocircumflex gbreve -10 KPX ocircumflex gcommaaccent -10 KPX ocircumflex v -10 KPX odieresis g -10 KPX odieresis gbreve -10 KPX odieresis gcommaaccent -10 KPX odieresis v -10 KPX ograve g -10 KPX ograve gbreve -10 KPX ograve gcommaaccent -10 KPX ograve v -10 KPX ohungarumlaut g -10 KPX ohungarumlaut gbreve -10 KPX ohungarumlaut gcommaaccent -10 KPX ohungarumlaut v -10 KPX omacron g -10 KPX omacron gbreve -10 KPX omacron gcommaaccent -10 KPX omacron v -10 KPX oslash g -10 KPX oslash gbreve -10 KPX oslash gcommaaccent -10 KPX oslash v -10 KPX otilde g -10 KPX otilde gbreve -10 KPX otilde gcommaaccent -10 KPX otilde v -10 KPX period quotedblright -140 KPX period quoteright -140 KPX quoteleft quoteleft -111 KPX quoteright d -25 KPX quoteright dcroat -25 KPX quoteright quoteright -111 KPX quoteright r -25 KPX quoteright racute -25 KPX quoteright rcaron -25 KPX quoteright rcommaaccent -25 KPX quoteright s -40 KPX quoteright sacute -40 KPX quoteright scaron -40 KPX quoteright scedilla -40 KPX quoteright scommaaccent -40 KPX quoteright space -111 KPX quoteright t -30 KPX quoteright tcommaaccent -30 KPX quoteright v -10 KPX r a -15 KPX r aacute -15 KPX r abreve -15 KPX r acircumflex -15 KPX r adieresis -15 KPX r agrave -15 KPX r amacron -15 KPX r aogonek -15 KPX r aring -15 KPX r atilde -15 KPX r c -37 KPX r cacute -37 KPX r ccaron -37 KPX r ccedilla -37 KPX r comma -111 KPX r d -37 KPX r dcroat -37 KPX r e -37 KPX r eacute -37 KPX r ecaron -37 KPX r ecircumflex -37 KPX r edieresis -37 KPX r edotaccent -37 KPX r egrave -37 KPX r emacron -37 KPX r eogonek -37 KPX r g -37 KPX r gbreve -37 KPX r gcommaaccent -37 KPX r hyphen -20 KPX r o -45 KPX r oacute -45 KPX r ocircumflex -45 KPX r odieresis -45 KPX r ograve -45 KPX r ohungarumlaut -45 KPX r omacron -45 KPX r oslash -45 KPX r otilde -45 KPX r period -111 KPX r q -37 KPX r s -10 KPX r sacute -10 KPX r scaron -10 KPX r scedilla -10 KPX r scommaaccent -10 KPX racute a -15 KPX racute aacute -15 KPX racute abreve -15 KPX racute acircumflex -15 KPX racute adieresis -15 KPX racute agrave -15 KPX racute amacron -15 KPX racute aogonek -15 KPX racute aring -15 KPX racute atilde -15 KPX racute c -37 KPX racute cacute -37 KPX racute ccaron -37 KPX racute ccedilla -37 KPX racute comma -111 KPX racute d -37 KPX racute dcroat -37 KPX racute e -37 KPX racute eacute -37 KPX racute ecaron -37 KPX racute ecircumflex -37 KPX racute edieresis -37 KPX racute edotaccent -37 KPX racute egrave -37 KPX racute emacron -37 KPX racute eogonek -37 KPX racute g -37 KPX racute gbreve -37 KPX racute gcommaaccent -37 KPX racute hyphen -20 KPX racute o -45 KPX racute oacute -45 KPX racute ocircumflex -45 KPX racute odieresis -45 KPX racute ograve -45 KPX racute ohungarumlaut -45 KPX racute omacron -45 KPX racute oslash -45 KPX racute otilde -45 KPX racute period -111 KPX racute q -37 KPX racute s -10 KPX racute sacute -10 KPX racute scaron -10 KPX racute scedilla -10 KPX racute scommaaccent -10 KPX rcaron a -15 KPX rcaron aacute -15 KPX rcaron abreve -15 KPX rcaron acircumflex -15 KPX rcaron adieresis -15 KPX rcaron agrave -15 KPX rcaron amacron -15 KPX rcaron aogonek -15 KPX rcaron aring -15 KPX rcaron atilde -15 KPX rcaron c -37 KPX rcaron cacute -37 KPX rcaron ccaron -37 KPX rcaron ccedilla -37 KPX rcaron comma -111 KPX rcaron d -37 KPX rcaron dcroat -37 KPX rcaron e -37 KPX rcaron eacute -37 KPX rcaron ecaron -37 KPX rcaron ecircumflex -37 KPX rcaron edieresis -37 KPX rcaron edotaccent -37 KPX rcaron egrave -37 KPX rcaron emacron -37 KPX rcaron eogonek -37 KPX rcaron g -37 KPX rcaron gbreve -37 KPX rcaron gcommaaccent -37 KPX rcaron hyphen -20 KPX rcaron o -45 KPX rcaron oacute -45 KPX rcaron ocircumflex -45 KPX rcaron odieresis -45 KPX rcaron ograve -45 KPX rcaron ohungarumlaut -45 KPX rcaron omacron -45 KPX rcaron oslash -45 KPX rcaron otilde -45 KPX rcaron period -111 KPX rcaron q -37 KPX rcaron s -10 KPX rcaron sacute -10 KPX rcaron scaron -10 KPX rcaron scedilla -10 KPX rcaron scommaaccent -10 KPX rcommaaccent a -15 KPX rcommaaccent aacute -15 KPX rcommaaccent abreve -15 KPX rcommaaccent acircumflex -15 KPX rcommaaccent adieresis -15 KPX rcommaaccent agrave -15 KPX rcommaaccent amacron -15 KPX rcommaaccent aogonek -15 KPX rcommaaccent aring -15 KPX rcommaaccent atilde -15 KPX rcommaaccent c -37 KPX rcommaaccent cacute -37 KPX rcommaaccent ccaron -37 KPX rcommaaccent ccedilla -37 KPX rcommaaccent comma -111 KPX rcommaaccent d -37 KPX rcommaaccent dcroat -37 KPX rcommaaccent e -37 KPX rcommaaccent eacute -37 KPX rcommaaccent ecaron -37 KPX rcommaaccent ecircumflex -37 KPX rcommaaccent edieresis -37 KPX rcommaaccent edotaccent -37 KPX rcommaaccent egrave -37 KPX rcommaaccent emacron -37 KPX rcommaaccent eogonek -37 KPX rcommaaccent g -37 KPX rcommaaccent gbreve -37 KPX rcommaaccent gcommaaccent -37 KPX rcommaaccent hyphen -20 KPX rcommaaccent o -45 KPX rcommaaccent oacute -45 KPX rcommaaccent ocircumflex -45 KPX rcommaaccent odieresis -45 KPX rcommaaccent ograve -45 KPX rcommaaccent ohungarumlaut -45 KPX rcommaaccent omacron -45 KPX rcommaaccent oslash -45 KPX rcommaaccent otilde -45 KPX rcommaaccent period -111 KPX rcommaaccent q -37 KPX rcommaaccent s -10 KPX rcommaaccent sacute -10 KPX rcommaaccent scaron -10 KPX rcommaaccent scedilla -10 KPX rcommaaccent scommaaccent -10 KPX space A -18 KPX space Aacute -18 KPX space Abreve -18 KPX space Acircumflex -18 KPX space Adieresis -18 KPX space Agrave -18 KPX space Amacron -18 KPX space Aogonek -18 KPX space Aring -18 KPX space Atilde -18 KPX space T -18 KPX space Tcaron -18 KPX space Tcommaaccent -18 KPX space V -35 KPX space W -40 KPX space Y -75 KPX space Yacute -75 KPX space Ydieresis -75 KPX v comma -74 KPX v period -74 KPX w comma -74 KPX w period -74 KPX y comma -55 KPX y period -55 KPX yacute comma -55 KPX yacute period -55 KPX ydieresis comma -55 KPX ydieresis period -55 EndKernPairs EndKernData EndFontMetrics ruby-prawn-1.0.0~rc2.orig/data/fonts/Courier-BoldOblique.afm0000644000000000000000000003604712114176157022435 0ustar rootrootStartFontMetrics 4.1 Comment Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. Comment Creation Date: Mon Jun 23 16:28:46 1997 Comment UniqueID 43049 Comment VMusage 17529 79244 FontName Courier-BoldOblique FullName Courier Bold Oblique FamilyName Courier Weight Bold ItalicAngle -12 IsFixedPitch true CharacterSet ExtendedRoman FontBBox -57 -250 869 801 UnderlinePosition -100 UnderlineThickness 50 Version 003.000 Notice Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. EncodingScheme AdobeStandardEncoding CapHeight 562 XHeight 439 Ascender 629 Descender -157 StdHW 84 StdVW 106 StartCharMetrics 315 C 32 ; WX 600 ; N space ; B 0 0 0 0 ; C 33 ; WX 600 ; N exclam ; B 215 -15 495 572 ; C 34 ; WX 600 ; N quotedbl ; B 211 277 585 562 ; C 35 ; WX 600 ; N numbersign ; B 88 -45 641 651 ; C 36 ; WX 600 ; N dollar ; B 87 -126 630 666 ; C 37 ; WX 600 ; N percent ; B 101 -15 625 616 ; C 38 ; WX 600 ; N ampersand ; B 61 -15 595 543 ; C 39 ; WX 600 ; N quoteright ; B 229 277 543 562 ; C 40 ; WX 600 ; N parenleft ; B 265 -102 592 616 ; C 41 ; WX 600 ; N parenright ; B 117 -102 444 616 ; C 42 ; WX 600 ; N asterisk ; B 179 219 598 601 ; C 43 ; WX 600 ; N plus ; B 114 39 596 478 ; C 44 ; WX 600 ; N comma ; B 99 -111 430 174 ; C 45 ; WX 600 ; N hyphen ; B 143 203 567 313 ; C 46 ; WX 600 ; N period ; B 206 -15 427 171 ; C 47 ; WX 600 ; N slash ; B 90 -77 626 626 ; C 48 ; WX 600 ; N zero ; B 135 -15 593 616 ; C 49 ; WX 600 ; N one ; B 93 0 562 616 ; C 50 ; WX 600 ; N two ; B 61 0 594 616 ; C 51 ; WX 600 ; N three ; B 71 -15 571 616 ; C 52 ; WX 600 ; N four ; B 81 0 559 616 ; C 53 ; WX 600 ; N five ; B 77 -15 621 601 ; C 54 ; WX 600 ; N six ; B 135 -15 652 616 ; C 55 ; WX 600 ; N seven ; B 147 0 622 601 ; C 56 ; WX 600 ; N eight ; B 115 -15 604 616 ; C 57 ; WX 600 ; N nine ; B 75 -15 592 616 ; C 58 ; WX 600 ; N colon ; B 205 -15 480 425 ; C 59 ; WX 600 ; N semicolon ; B 99 -111 481 425 ; C 60 ; WX 600 ; N less ; B 120 15 613 501 ; C 61 ; WX 600 ; N equal ; B 96 118 614 398 ; C 62 ; WX 600 ; N greater ; B 97 15 589 501 ; C 63 ; WX 600 ; N question ; B 183 -14 592 580 ; C 64 ; WX 600 ; N at ; B 65 -15 642 616 ; C 65 ; WX 600 ; N A ; B -9 0 632 562 ; C 66 ; WX 600 ; N B ; B 30 0 630 562 ; C 67 ; WX 600 ; N C ; B 74 -18 675 580 ; C 68 ; WX 600 ; N D ; B 30 0 664 562 ; C 69 ; WX 600 ; N E ; B 25 0 670 562 ; C 70 ; WX 600 ; N F ; B 39 0 684 562 ; C 71 ; WX 600 ; N G ; B 74 -18 675 580 ; C 72 ; WX 600 ; N H ; B 20 0 700 562 ; C 73 ; WX 600 ; N I ; B 77 0 643 562 ; C 74 ; WX 600 ; N J ; B 58 -18 721 562 ; C 75 ; WX 600 ; N K ; B 21 0 692 562 ; C 76 ; WX 600 ; N L ; B 39 0 636 562 ; C 77 ; WX 600 ; N M ; B -2 0 722 562 ; C 78 ; WX 600 ; N N ; B 8 -12 730 562 ; C 79 ; WX 600 ; N O ; B 74 -18 645 580 ; C 80 ; WX 600 ; N P ; B 48 0 643 562 ; C 81 ; WX 600 ; N Q ; B 83 -138 636 580 ; C 82 ; WX 600 ; N R ; B 24 0 617 562 ; C 83 ; WX 600 ; N S ; B 54 -22 673 582 ; C 84 ; WX 600 ; N T ; B 86 0 679 562 ; C 85 ; WX 600 ; N U ; B 101 -18 716 562 ; C 86 ; WX 600 ; N V ; B 84 0 733 562 ; C 87 ; WX 600 ; N W ; B 79 0 738 562 ; C 88 ; WX 600 ; N X ; B 12 0 690 562 ; C 89 ; WX 600 ; N Y ; B 109 0 709 562 ; C 90 ; WX 600 ; N Z ; B 62 0 637 562 ; C 91 ; WX 600 ; N bracketleft ; B 223 -102 606 616 ; C 92 ; WX 600 ; N backslash ; B 222 -77 496 626 ; C 93 ; WX 600 ; N bracketright ; B 103 -102 486 616 ; C 94 ; WX 600 ; N asciicircum ; B 171 250 556 616 ; C 95 ; WX 600 ; N underscore ; B -27 -125 585 -75 ; C 96 ; WX 600 ; N quoteleft ; B 297 277 487 562 ; C 97 ; WX 600 ; N a ; B 61 -15 593 454 ; C 98 ; WX 600 ; N b ; B 13 -15 636 626 ; C 99 ; WX 600 ; N c ; B 81 -15 631 459 ; C 100 ; WX 600 ; N d ; B 60 -15 645 626 ; C 101 ; WX 600 ; N e ; B 81 -15 605 454 ; C 102 ; WX 600 ; N f ; B 83 0 677 626 ; L i fi ; L l fl ; C 103 ; WX 600 ; N g ; B 40 -146 674 454 ; C 104 ; WX 600 ; N h ; B 18 0 615 626 ; C 105 ; WX 600 ; N i ; B 77 0 546 658 ; C 106 ; WX 600 ; N j ; B 36 -146 580 658 ; C 107 ; WX 600 ; N k ; B 33 0 643 626 ; C 108 ; WX 600 ; N l ; B 77 0 546 626 ; C 109 ; WX 600 ; N m ; B -22 0 649 454 ; C 110 ; WX 600 ; N n ; B 18 0 615 454 ; C 111 ; WX 600 ; N o ; B 71 -15 622 454 ; C 112 ; WX 600 ; N p ; B -32 -142 622 454 ; C 113 ; WX 600 ; N q ; B 60 -142 685 454 ; C 114 ; WX 600 ; N r ; B 47 0 655 454 ; C 115 ; WX 600 ; N s ; B 66 -17 608 459 ; C 116 ; WX 600 ; N t ; B 118 -15 567 562 ; C 117 ; WX 600 ; N u ; B 70 -15 592 439 ; C 118 ; WX 600 ; N v ; B 70 0 695 439 ; C 119 ; WX 600 ; N w ; B 53 0 712 439 ; C 120 ; WX 600 ; N x ; B 6 0 671 439 ; C 121 ; WX 600 ; N y ; B -21 -142 695 439 ; C 122 ; WX 600 ; N z ; B 81 0 614 439 ; C 123 ; WX 600 ; N braceleft ; B 203 -102 595 616 ; C 124 ; WX 600 ; N bar ; B 201 -250 505 750 ; C 125 ; WX 600 ; N braceright ; B 114 -102 506 616 ; C 126 ; WX 600 ; N asciitilde ; B 120 153 590 356 ; C 161 ; WX 600 ; N exclamdown ; B 196 -146 477 449 ; C 162 ; WX 600 ; N cent ; B 121 -49 605 614 ; C 163 ; WX 600 ; N sterling ; B 106 -28 650 611 ; C 164 ; WX 600 ; N fraction ; B 22 -60 708 661 ; C 165 ; WX 600 ; N yen ; B 98 0 710 562 ; C 166 ; WX 600 ; N florin ; B -57 -131 702 616 ; C 167 ; WX 600 ; N section ; B 74 -70 620 580 ; C 168 ; WX 600 ; N currency ; B 77 49 644 517 ; C 169 ; WX 600 ; N quotesingle ; B 303 277 493 562 ; C 170 ; WX 600 ; N quotedblleft ; B 190 277 594 562 ; C 171 ; WX 600 ; N guillemotleft ; B 62 70 639 446 ; C 172 ; WX 600 ; N guilsinglleft ; B 195 70 545 446 ; C 173 ; WX 600 ; N guilsinglright ; B 165 70 514 446 ; C 174 ; WX 600 ; N fi ; B 12 0 644 626 ; C 175 ; WX 600 ; N fl ; B 12 0 644 626 ; C 177 ; WX 600 ; N endash ; B 108 203 602 313 ; C 178 ; WX 600 ; N dagger ; B 175 -70 586 580 ; C 179 ; WX 600 ; N daggerdbl ; B 121 -70 587 580 ; C 180 ; WX 600 ; N periodcentered ; B 248 165 461 351 ; C 182 ; WX 600 ; N paragraph ; B 61 -70 700 580 ; C 183 ; WX 600 ; N bullet ; B 196 132 523 430 ; C 184 ; WX 600 ; N quotesinglbase ; B 144 -142 458 143 ; C 185 ; WX 600 ; N quotedblbase ; B 34 -142 560 143 ; C 186 ; WX 600 ; N quotedblright ; B 119 277 645 562 ; C 187 ; WX 600 ; N guillemotright ; B 71 70 647 446 ; C 188 ; WX 600 ; N ellipsis ; B 35 -15 587 116 ; C 189 ; WX 600 ; N perthousand ; B -45 -15 743 616 ; C 191 ; WX 600 ; N questiondown ; B 100 -146 509 449 ; C 193 ; WX 600 ; N grave ; B 272 508 503 661 ; C 194 ; WX 600 ; N acute ; B 312 508 609 661 ; C 195 ; WX 600 ; N circumflex ; B 212 483 607 657 ; C 196 ; WX 600 ; N tilde ; B 199 493 643 636 ; C 197 ; WX 600 ; N macron ; B 195 505 637 585 ; C 198 ; WX 600 ; N breve ; B 217 468 652 631 ; C 199 ; WX 600 ; N dotaccent ; B 348 498 493 638 ; C 200 ; WX 600 ; N dieresis ; B 246 498 595 638 ; C 202 ; WX 600 ; N ring ; B 319 481 528 678 ; C 203 ; WX 600 ; N cedilla ; B 168 -206 368 0 ; C 205 ; WX 600 ; N hungarumlaut ; B 171 488 729 661 ; C 206 ; WX 600 ; N ogonek ; B 143 -199 367 0 ; C 207 ; WX 600 ; N caron ; B 238 493 633 667 ; C 208 ; WX 600 ; N emdash ; B 33 203 677 313 ; C 225 ; WX 600 ; N AE ; B -29 0 708 562 ; C 227 ; WX 600 ; N ordfeminine ; B 188 196 526 580 ; C 232 ; WX 600 ; N Lslash ; B 39 0 636 562 ; C 233 ; WX 600 ; N Oslash ; B 48 -22 673 584 ; C 234 ; WX 600 ; N OE ; B 26 0 701 562 ; C 235 ; WX 600 ; N ordmasculine ; B 188 196 543 580 ; C 241 ; WX 600 ; N ae ; B 21 -15 652 454 ; C 245 ; WX 600 ; N dotlessi ; B 77 0 546 439 ; C 248 ; WX 600 ; N lslash ; B 77 0 587 626 ; C 249 ; WX 600 ; N oslash ; B 54 -24 638 463 ; C 250 ; WX 600 ; N oe ; B 18 -15 662 454 ; C 251 ; WX 600 ; N germandbls ; B 22 -15 629 626 ; C -1 ; WX 600 ; N Idieresis ; B 77 0 643 761 ; C -1 ; WX 600 ; N eacute ; B 81 -15 609 661 ; C -1 ; WX 600 ; N abreve ; B 61 -15 658 661 ; C -1 ; WX 600 ; N uhungarumlaut ; B 70 -15 769 661 ; C -1 ; WX 600 ; N ecaron ; B 81 -15 633 667 ; C -1 ; WX 600 ; N Ydieresis ; B 109 0 709 761 ; C -1 ; WX 600 ; N divide ; B 114 16 596 500 ; C -1 ; WX 600 ; N Yacute ; B 109 0 709 784 ; C -1 ; WX 600 ; N Acircumflex ; B -9 0 632 780 ; C -1 ; WX 600 ; N aacute ; B 61 -15 609 661 ; C -1 ; WX 600 ; N Ucircumflex ; B 101 -18 716 780 ; C -1 ; WX 600 ; N yacute ; B -21 -142 695 661 ; C -1 ; WX 600 ; N scommaaccent ; B 66 -250 608 459 ; C -1 ; WX 600 ; N ecircumflex ; B 81 -15 607 657 ; C -1 ; WX 600 ; N Uring ; B 101 -18 716 801 ; C -1 ; WX 600 ; N Udieresis ; B 101 -18 716 761 ; C -1 ; WX 600 ; N aogonek ; B 61 -199 593 454 ; C -1 ; WX 600 ; N Uacute ; B 101 -18 716 784 ; C -1 ; WX 600 ; N uogonek ; B 70 -199 592 439 ; C -1 ; WX 600 ; N Edieresis ; B 25 0 670 761 ; C -1 ; WX 600 ; N Dcroat ; B 30 0 664 562 ; C -1 ; WX 600 ; N commaaccent ; B 151 -250 385 -57 ; C -1 ; WX 600 ; N copyright ; B 53 -18 667 580 ; C -1 ; WX 600 ; N Emacron ; B 25 0 670 708 ; C -1 ; WX 600 ; N ccaron ; B 81 -15 633 667 ; C -1 ; WX 600 ; N aring ; B 61 -15 593 678 ; C -1 ; WX 600 ; N Ncommaaccent ; B 8 -250 730 562 ; C -1 ; WX 600 ; N lacute ; B 77 0 639 801 ; C -1 ; WX 600 ; N agrave ; B 61 -15 593 661 ; C -1 ; WX 600 ; N Tcommaaccent ; B 86 -250 679 562 ; C -1 ; WX 600 ; N Cacute ; B 74 -18 675 784 ; C -1 ; WX 600 ; N atilde ; B 61 -15 643 636 ; C -1 ; WX 600 ; N Edotaccent ; B 25 0 670 761 ; C -1 ; WX 600 ; N scaron ; B 66 -17 633 667 ; C -1 ; WX 600 ; N scedilla ; B 66 -206 608 459 ; C -1 ; WX 600 ; N iacute ; B 77 0 609 661 ; C -1 ; WX 600 ; N lozenge ; B 145 0 614 740 ; C -1 ; WX 600 ; N Rcaron ; B 24 0 659 790 ; C -1 ; WX 600 ; N Gcommaaccent ; B 74 -250 675 580 ; C -1 ; WX 600 ; N ucircumflex ; B 70 -15 597 657 ; C -1 ; WX 600 ; N acircumflex ; B 61 -15 607 657 ; C -1 ; WX 600 ; N Amacron ; B -9 0 633 708 ; C -1 ; WX 600 ; N rcaron ; B 47 0 655 667 ; C -1 ; WX 600 ; N ccedilla ; B 81 -206 631 459 ; C -1 ; WX 600 ; N Zdotaccent ; B 62 0 637 761 ; C -1 ; WX 600 ; N Thorn ; B 48 0 620 562 ; C -1 ; WX 600 ; N Omacron ; B 74 -18 663 708 ; C -1 ; WX 600 ; N Racute ; B 24 0 665 784 ; C -1 ; WX 600 ; N Sacute ; B 54 -22 673 784 ; C -1 ; WX 600 ; N dcaron ; B 60 -15 861 626 ; C -1 ; WX 600 ; N Umacron ; B 101 -18 716 708 ; C -1 ; WX 600 ; N uring ; B 70 -15 592 678 ; C -1 ; WX 600 ; N threesuperior ; B 193 222 526 616 ; C -1 ; WX 600 ; N Ograve ; B 74 -18 645 784 ; C -1 ; WX 600 ; N Agrave ; B -9 0 632 784 ; C -1 ; WX 600 ; N Abreve ; B -9 0 684 784 ; C -1 ; WX 600 ; N multiply ; B 104 39 606 478 ; C -1 ; WX 600 ; N uacute ; B 70 -15 599 661 ; C -1 ; WX 600 ; N Tcaron ; B 86 0 679 790 ; C -1 ; WX 600 ; N partialdiff ; B 91 -38 627 728 ; C -1 ; WX 600 ; N ydieresis ; B -21 -142 695 638 ; C -1 ; WX 600 ; N Nacute ; B 8 -12 730 784 ; C -1 ; WX 600 ; N icircumflex ; B 77 0 577 657 ; C -1 ; WX 600 ; N Ecircumflex ; B 25 0 670 780 ; C -1 ; WX 600 ; N adieresis ; B 61 -15 595 638 ; C -1 ; WX 600 ; N edieresis ; B 81 -15 605 638 ; C -1 ; WX 600 ; N cacute ; B 81 -15 649 661 ; C -1 ; WX 600 ; N nacute ; B 18 0 639 661 ; C -1 ; WX 600 ; N umacron ; B 70 -15 637 585 ; C -1 ; WX 600 ; N Ncaron ; B 8 -12 730 790 ; C -1 ; WX 600 ; N Iacute ; B 77 0 643 784 ; C -1 ; WX 600 ; N plusminus ; B 76 24 614 515 ; C -1 ; WX 600 ; N brokenbar ; B 217 -175 489 675 ; C -1 ; WX 600 ; N registered ; B 53 -18 667 580 ; C -1 ; WX 600 ; N Gbreve ; B 74 -18 684 784 ; C -1 ; WX 600 ; N Idotaccent ; B 77 0 643 761 ; C -1 ; WX 600 ; N summation ; B 15 -10 672 706 ; C -1 ; WX 600 ; N Egrave ; B 25 0 670 784 ; C -1 ; WX 600 ; N racute ; B 47 0 655 661 ; C -1 ; WX 600 ; N omacron ; B 71 -15 637 585 ; C -1 ; WX 600 ; N Zacute ; B 62 0 665 784 ; C -1 ; WX 600 ; N Zcaron ; B 62 0 659 790 ; C -1 ; WX 600 ; N greaterequal ; B 26 0 627 696 ; C -1 ; WX 600 ; N Eth ; B 30 0 664 562 ; C -1 ; WX 600 ; N Ccedilla ; B 74 -206 675 580 ; C -1 ; WX 600 ; N lcommaaccent ; B 77 -250 546 626 ; C -1 ; WX 600 ; N tcaron ; B 118 -15 627 703 ; C -1 ; WX 600 ; N eogonek ; B 81 -199 605 454 ; C -1 ; WX 600 ; N Uogonek ; B 101 -199 716 562 ; C -1 ; WX 600 ; N Aacute ; B -9 0 655 784 ; C -1 ; WX 600 ; N Adieresis ; B -9 0 632 761 ; C -1 ; WX 600 ; N egrave ; B 81 -15 605 661 ; C -1 ; WX 600 ; N zacute ; B 81 0 614 661 ; C -1 ; WX 600 ; N iogonek ; B 77 -199 546 658 ; C -1 ; WX 600 ; N Oacute ; B 74 -18 645 784 ; C -1 ; WX 600 ; N oacute ; B 71 -15 649 661 ; C -1 ; WX 600 ; N amacron ; B 61 -15 637 585 ; C -1 ; WX 600 ; N sacute ; B 66 -17 609 661 ; C -1 ; WX 600 ; N idieresis ; B 77 0 561 618 ; C -1 ; WX 600 ; N Ocircumflex ; B 74 -18 645 780 ; C -1 ; WX 600 ; N Ugrave ; B 101 -18 716 784 ; C -1 ; WX 600 ; N Delta ; B 6 0 594 688 ; C -1 ; WX 600 ; N thorn ; B -32 -142 622 626 ; C -1 ; WX 600 ; N twosuperior ; B 191 230 542 616 ; C -1 ; WX 600 ; N Odieresis ; B 74 -18 645 761 ; C -1 ; WX 600 ; N mu ; B 49 -142 592 439 ; C -1 ; WX 600 ; N igrave ; B 77 0 546 661 ; C -1 ; WX 600 ; N ohungarumlaut ; B 71 -15 809 661 ; C -1 ; WX 600 ; N Eogonek ; B 25 -199 670 562 ; C -1 ; WX 600 ; N dcroat ; B 60 -15 712 626 ; C -1 ; WX 600 ; N threequarters ; B 8 -60 699 661 ; C -1 ; WX 600 ; N Scedilla ; B 54 -206 673 582 ; C -1 ; WX 600 ; N lcaron ; B 77 0 731 626 ; C -1 ; WX 600 ; N Kcommaaccent ; B 21 -250 692 562 ; C -1 ; WX 600 ; N Lacute ; B 39 0 636 784 ; C -1 ; WX 600 ; N trademark ; B 86 230 869 562 ; C -1 ; WX 600 ; N edotaccent ; B 81 -15 605 638 ; C -1 ; WX 600 ; N Igrave ; B 77 0 643 784 ; C -1 ; WX 600 ; N Imacron ; B 77 0 663 708 ; C -1 ; WX 600 ; N Lcaron ; B 39 0 757 562 ; C -1 ; WX 600 ; N onehalf ; B 22 -60 716 661 ; C -1 ; WX 600 ; N lessequal ; B 26 0 671 696 ; C -1 ; WX 600 ; N ocircumflex ; B 71 -15 622 657 ; C -1 ; WX 600 ; N ntilde ; B 18 0 643 636 ; C -1 ; WX 600 ; N Uhungarumlaut ; B 101 -18 805 784 ; C -1 ; WX 600 ; N Eacute ; B 25 0 670 784 ; C -1 ; WX 600 ; N emacron ; B 81 -15 637 585 ; C -1 ; WX 600 ; N gbreve ; B 40 -146 674 661 ; C -1 ; WX 600 ; N onequarter ; B 13 -60 707 661 ; C -1 ; WX 600 ; N Scaron ; B 54 -22 689 790 ; C -1 ; WX 600 ; N Scommaaccent ; B 54 -250 673 582 ; C -1 ; WX 600 ; N Ohungarumlaut ; B 74 -18 795 784 ; C -1 ; WX 600 ; N degree ; B 173 243 570 616 ; C -1 ; WX 600 ; N ograve ; B 71 -15 622 661 ; C -1 ; WX 600 ; N Ccaron ; B 74 -18 689 790 ; C -1 ; WX 600 ; N ugrave ; B 70 -15 592 661 ; C -1 ; WX 600 ; N radical ; B 67 -104 635 778 ; C -1 ; WX 600 ; N Dcaron ; B 30 0 664 790 ; C -1 ; WX 600 ; N rcommaaccent ; B 47 -250 655 454 ; C -1 ; WX 600 ; N Ntilde ; B 8 -12 730 759 ; C -1 ; WX 600 ; N otilde ; B 71 -15 643 636 ; C -1 ; WX 600 ; N Rcommaaccent ; B 24 -250 617 562 ; C -1 ; WX 600 ; N Lcommaaccent ; B 39 -250 636 562 ; C -1 ; WX 600 ; N Atilde ; B -9 0 669 759 ; C -1 ; WX 600 ; N Aogonek ; B -9 -199 632 562 ; C -1 ; WX 600 ; N Aring ; B -9 0 632 801 ; C -1 ; WX 600 ; N Otilde ; B 74 -18 669 759 ; C -1 ; WX 600 ; N zdotaccent ; B 81 0 614 638 ; C -1 ; WX 600 ; N Ecaron ; B 25 0 670 790 ; C -1 ; WX 600 ; N Iogonek ; B 77 -199 643 562 ; C -1 ; WX 600 ; N kcommaaccent ; B 33 -250 643 626 ; C -1 ; WX 600 ; N minus ; B 114 203 596 313 ; C -1 ; WX 600 ; N Icircumflex ; B 77 0 643 780 ; C -1 ; WX 600 ; N ncaron ; B 18 0 633 667 ; C -1 ; WX 600 ; N tcommaaccent ; B 118 -250 567 562 ; C -1 ; WX 600 ; N logicalnot ; B 135 103 617 413 ; C -1 ; WX 600 ; N odieresis ; B 71 -15 622 638 ; C -1 ; WX 600 ; N udieresis ; B 70 -15 595 638 ; C -1 ; WX 600 ; N notequal ; B 30 -47 626 563 ; C -1 ; WX 600 ; N gcommaaccent ; B 40 -146 674 714 ; C -1 ; WX 600 ; N eth ; B 93 -27 661 626 ; C -1 ; WX 600 ; N zcaron ; B 81 0 643 667 ; C -1 ; WX 600 ; N ncommaaccent ; B 18 -250 615 454 ; C -1 ; WX 600 ; N onesuperior ; B 212 230 514 616 ; C -1 ; WX 600 ; N imacron ; B 77 0 575 585 ; C -1 ; WX 600 ; N Euro ; B 0 0 0 0 ; EndCharMetrics EndFontMetrics ruby-prawn-1.0.0~rc2.orig/data/fonts/Courier-Bold.afm0000644000000000000000000003574512114176157021120 0ustar rootrootStartFontMetrics 4.1 Comment Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. Comment Creation Date: Mon Jun 23 16:28:00 1997 Comment UniqueID 43048 Comment VMusage 41139 52164 FontName Courier-Bold FullName Courier Bold FamilyName Courier Weight Bold ItalicAngle 0 IsFixedPitch true CharacterSet ExtendedRoman FontBBox -113 -250 749 801 UnderlinePosition -100 UnderlineThickness 50 Version 003.000 Notice Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. EncodingScheme AdobeStandardEncoding CapHeight 562 XHeight 439 Ascender 629 Descender -157 StdHW 84 StdVW 106 StartCharMetrics 315 C 32 ; WX 600 ; N space ; B 0 0 0 0 ; C 33 ; WX 600 ; N exclam ; B 202 -15 398 572 ; C 34 ; WX 600 ; N quotedbl ; B 135 277 465 562 ; C 35 ; WX 600 ; N numbersign ; B 56 -45 544 651 ; C 36 ; WX 600 ; N dollar ; B 82 -126 519 666 ; C 37 ; WX 600 ; N percent ; B 5 -15 595 616 ; C 38 ; WX 600 ; N ampersand ; B 36 -15 546 543 ; C 39 ; WX 600 ; N quoteright ; B 171 277 423 562 ; C 40 ; WX 600 ; N parenleft ; B 219 -102 461 616 ; C 41 ; WX 600 ; N parenright ; B 139 -102 381 616 ; C 42 ; WX 600 ; N asterisk ; B 91 219 509 601 ; C 43 ; WX 600 ; N plus ; B 71 39 529 478 ; C 44 ; WX 600 ; N comma ; B 123 -111 393 174 ; C 45 ; WX 600 ; N hyphen ; B 100 203 500 313 ; C 46 ; WX 600 ; N period ; B 192 -15 408 171 ; C 47 ; WX 600 ; N slash ; B 98 -77 502 626 ; C 48 ; WX 600 ; N zero ; B 87 -15 513 616 ; C 49 ; WX 600 ; N one ; B 81 0 539 616 ; C 50 ; WX 600 ; N two ; B 61 0 499 616 ; C 51 ; WX 600 ; N three ; B 63 -15 501 616 ; C 52 ; WX 600 ; N four ; B 53 0 507 616 ; C 53 ; WX 600 ; N five ; B 70 -15 521 601 ; C 54 ; WX 600 ; N six ; B 90 -15 521 616 ; C 55 ; WX 600 ; N seven ; B 55 0 494 601 ; C 56 ; WX 600 ; N eight ; B 83 -15 517 616 ; C 57 ; WX 600 ; N nine ; B 79 -15 510 616 ; C 58 ; WX 600 ; N colon ; B 191 -15 407 425 ; C 59 ; WX 600 ; N semicolon ; B 123 -111 408 425 ; C 60 ; WX 600 ; N less ; B 66 15 523 501 ; C 61 ; WX 600 ; N equal ; B 71 118 529 398 ; C 62 ; WX 600 ; N greater ; B 77 15 534 501 ; C 63 ; WX 600 ; N question ; B 98 -14 501 580 ; C 64 ; WX 600 ; N at ; B 16 -15 584 616 ; C 65 ; WX 600 ; N A ; B -9 0 609 562 ; C 66 ; WX 600 ; N B ; B 30 0 573 562 ; C 67 ; WX 600 ; N C ; B 22 -18 560 580 ; C 68 ; WX 600 ; N D ; B 30 0 594 562 ; C 69 ; WX 600 ; N E ; B 25 0 560 562 ; C 70 ; WX 600 ; N F ; B 39 0 570 562 ; C 71 ; WX 600 ; N G ; B 22 -18 594 580 ; C 72 ; WX 600 ; N H ; B 20 0 580 562 ; C 73 ; WX 600 ; N I ; B 77 0 523 562 ; C 74 ; WX 600 ; N J ; B 37 -18 601 562 ; C 75 ; WX 600 ; N K ; B 21 0 599 562 ; C 76 ; WX 600 ; N L ; B 39 0 578 562 ; C 77 ; WX 600 ; N M ; B -2 0 602 562 ; C 78 ; WX 600 ; N N ; B 8 -12 610 562 ; C 79 ; WX 600 ; N O ; B 22 -18 578 580 ; C 80 ; WX 600 ; N P ; B 48 0 559 562 ; C 81 ; WX 600 ; N Q ; B 32 -138 578 580 ; C 82 ; WX 600 ; N R ; B 24 0 599 562 ; C 83 ; WX 600 ; N S ; B 47 -22 553 582 ; C 84 ; WX 600 ; N T ; B 21 0 579 562 ; C 85 ; WX 600 ; N U ; B 4 -18 596 562 ; C 86 ; WX 600 ; N V ; B -13 0 613 562 ; C 87 ; WX 600 ; N W ; B -18 0 618 562 ; C 88 ; WX 600 ; N X ; B 12 0 588 562 ; C 89 ; WX 600 ; N Y ; B 12 0 589 562 ; C 90 ; WX 600 ; N Z ; B 62 0 539 562 ; C 91 ; WX 600 ; N bracketleft ; B 245 -102 475 616 ; C 92 ; WX 600 ; N backslash ; B 99 -77 503 626 ; C 93 ; WX 600 ; N bracketright ; B 125 -102 355 616 ; C 94 ; WX 600 ; N asciicircum ; B 108 250 492 616 ; C 95 ; WX 600 ; N underscore ; B 0 -125 600 -75 ; C 96 ; WX 600 ; N quoteleft ; B 178 277 428 562 ; C 97 ; WX 600 ; N a ; B 35 -15 570 454 ; C 98 ; WX 600 ; N b ; B 0 -15 584 626 ; C 99 ; WX 600 ; N c ; B 40 -15 545 459 ; C 100 ; WX 600 ; N d ; B 20 -15 591 626 ; C 101 ; WX 600 ; N e ; B 40 -15 563 454 ; C 102 ; WX 600 ; N f ; B 83 0 547 626 ; L i fi ; L l fl ; C 103 ; WX 600 ; N g ; B 30 -146 580 454 ; C 104 ; WX 600 ; N h ; B 5 0 592 626 ; C 105 ; WX 600 ; N i ; B 77 0 523 658 ; C 106 ; WX 600 ; N j ; B 63 -146 440 658 ; C 107 ; WX 600 ; N k ; B 20 0 585 626 ; C 108 ; WX 600 ; N l ; B 77 0 523 626 ; C 109 ; WX 600 ; N m ; B -22 0 626 454 ; C 110 ; WX 600 ; N n ; B 18 0 592 454 ; C 111 ; WX 600 ; N o ; B 30 -15 570 454 ; C 112 ; WX 600 ; N p ; B -1 -142 570 454 ; C 113 ; WX 600 ; N q ; B 20 -142 591 454 ; C 114 ; WX 600 ; N r ; B 47 0 580 454 ; C 115 ; WX 600 ; N s ; B 68 -17 535 459 ; C 116 ; WX 600 ; N t ; B 47 -15 532 562 ; C 117 ; WX 600 ; N u ; B -1 -15 569 439 ; C 118 ; WX 600 ; N v ; B -1 0 601 439 ; C 119 ; WX 600 ; N w ; B -18 0 618 439 ; C 120 ; WX 600 ; N x ; B 6 0 594 439 ; C 121 ; WX 600 ; N y ; B -4 -142 601 439 ; C 122 ; WX 600 ; N z ; B 81 0 520 439 ; C 123 ; WX 600 ; N braceleft ; B 160 -102 464 616 ; C 124 ; WX 600 ; N bar ; B 255 -250 345 750 ; C 125 ; WX 600 ; N braceright ; B 136 -102 440 616 ; C 126 ; WX 600 ; N asciitilde ; B 71 153 530 356 ; C 161 ; WX 600 ; N exclamdown ; B 202 -146 398 449 ; C 162 ; WX 600 ; N cent ; B 66 -49 518 614 ; C 163 ; WX 600 ; N sterling ; B 72 -28 558 611 ; C 164 ; WX 600 ; N fraction ; B 25 -60 576 661 ; C 165 ; WX 600 ; N yen ; B 10 0 590 562 ; C 166 ; WX 600 ; N florin ; B -30 -131 572 616 ; C 167 ; WX 600 ; N section ; B 83 -70 517 580 ; C 168 ; WX 600 ; N currency ; B 54 49 546 517 ; C 169 ; WX 600 ; N quotesingle ; B 227 277 373 562 ; C 170 ; WX 600 ; N quotedblleft ; B 71 277 535 562 ; C 171 ; WX 600 ; N guillemotleft ; B 8 70 553 446 ; C 172 ; WX 600 ; N guilsinglleft ; B 141 70 459 446 ; C 173 ; WX 600 ; N guilsinglright ; B 141 70 459 446 ; C 174 ; WX 600 ; N fi ; B 12 0 593 626 ; C 175 ; WX 600 ; N fl ; B 12 0 593 626 ; C 177 ; WX 600 ; N endash ; B 65 203 535 313 ; C 178 ; WX 600 ; N dagger ; B 106 -70 494 580 ; C 179 ; WX 600 ; N daggerdbl ; B 106 -70 494 580 ; C 180 ; WX 600 ; N periodcentered ; B 196 165 404 351 ; C 182 ; WX 600 ; N paragraph ; B 6 -70 576 580 ; C 183 ; WX 600 ; N bullet ; B 140 132 460 430 ; C 184 ; WX 600 ; N quotesinglbase ; B 175 -142 427 143 ; C 185 ; WX 600 ; N quotedblbase ; B 65 -142 529 143 ; C 186 ; WX 600 ; N quotedblright ; B 61 277 525 562 ; C 187 ; WX 600 ; N guillemotright ; B 47 70 592 446 ; C 188 ; WX 600 ; N ellipsis ; B 26 -15 574 116 ; C 189 ; WX 600 ; N perthousand ; B -113 -15 713 616 ; C 191 ; WX 600 ; N questiondown ; B 99 -146 502 449 ; C 193 ; WX 600 ; N grave ; B 132 508 395 661 ; C 194 ; WX 600 ; N acute ; B 205 508 468 661 ; C 195 ; WX 600 ; N circumflex ; B 103 483 497 657 ; C 196 ; WX 600 ; N tilde ; B 89 493 512 636 ; C 197 ; WX 600 ; N macron ; B 88 505 512 585 ; C 198 ; WX 600 ; N breve ; B 83 468 517 631 ; C 199 ; WX 600 ; N dotaccent ; B 230 498 370 638 ; C 200 ; WX 600 ; N dieresis ; B 128 498 472 638 ; C 202 ; WX 600 ; N ring ; B 198 481 402 678 ; C 203 ; WX 600 ; N cedilla ; B 205 -206 387 0 ; C 205 ; WX 600 ; N hungarumlaut ; B 68 488 588 661 ; C 206 ; WX 600 ; N ogonek ; B 169 -199 400 0 ; C 207 ; WX 600 ; N caron ; B 103 493 497 667 ; C 208 ; WX 600 ; N emdash ; B -10 203 610 313 ; C 225 ; WX 600 ; N AE ; B -29 0 602 562 ; C 227 ; WX 600 ; N ordfeminine ; B 147 196 453 580 ; C 232 ; WX 600 ; N Lslash ; B 39 0 578 562 ; C 233 ; WX 600 ; N Oslash ; B 22 -22 578 584 ; C 234 ; WX 600 ; N OE ; B -25 0 595 562 ; C 235 ; WX 600 ; N ordmasculine ; B 147 196 453 580 ; C 241 ; WX 600 ; N ae ; B -4 -15 601 454 ; C 245 ; WX 600 ; N dotlessi ; B 77 0 523 439 ; C 248 ; WX 600 ; N lslash ; B 77 0 523 626 ; C 249 ; WX 600 ; N oslash ; B 30 -24 570 463 ; C 250 ; WX 600 ; N oe ; B -18 -15 611 454 ; C 251 ; WX 600 ; N germandbls ; B 22 -15 596 626 ; C -1 ; WX 600 ; N Idieresis ; B 77 0 523 761 ; C -1 ; WX 600 ; N eacute ; B 40 -15 563 661 ; C -1 ; WX 600 ; N abreve ; B 35 -15 570 661 ; C -1 ; WX 600 ; N uhungarumlaut ; B -1 -15 628 661 ; C -1 ; WX 600 ; N ecaron ; B 40 -15 563 667 ; C -1 ; WX 600 ; N Ydieresis ; B 12 0 589 761 ; C -1 ; WX 600 ; N divide ; B 71 16 529 500 ; C -1 ; WX 600 ; N Yacute ; B 12 0 589 784 ; C -1 ; WX 600 ; N Acircumflex ; B -9 0 609 780 ; C -1 ; WX 600 ; N aacute ; B 35 -15 570 661 ; C -1 ; WX 600 ; N Ucircumflex ; B 4 -18 596 780 ; C -1 ; WX 600 ; N yacute ; B -4 -142 601 661 ; C -1 ; WX 600 ; N scommaaccent ; B 68 -250 535 459 ; C -1 ; WX 600 ; N ecircumflex ; B 40 -15 563 657 ; C -1 ; WX 600 ; N Uring ; B 4 -18 596 801 ; C -1 ; WX 600 ; N Udieresis ; B 4 -18 596 761 ; C -1 ; WX 600 ; N aogonek ; B 35 -199 586 454 ; C -1 ; WX 600 ; N Uacute ; B 4 -18 596 784 ; C -1 ; WX 600 ; N uogonek ; B -1 -199 585 439 ; C -1 ; WX 600 ; N Edieresis ; B 25 0 560 761 ; C -1 ; WX 600 ; N Dcroat ; B 30 0 594 562 ; C -1 ; WX 600 ; N commaaccent ; B 205 -250 397 -57 ; C -1 ; WX 600 ; N copyright ; B 0 -18 600 580 ; C -1 ; WX 600 ; N Emacron ; B 25 0 560 708 ; C -1 ; WX 600 ; N ccaron ; B 40 -15 545 667 ; C -1 ; WX 600 ; N aring ; B 35 -15 570 678 ; C -1 ; WX 600 ; N Ncommaaccent ; B 8 -250 610 562 ; C -1 ; WX 600 ; N lacute ; B 77 0 523 801 ; C -1 ; WX 600 ; N agrave ; B 35 -15 570 661 ; C -1 ; WX 600 ; N Tcommaaccent ; B 21 -250 579 562 ; C -1 ; WX 600 ; N Cacute ; B 22 -18 560 784 ; C -1 ; WX 600 ; N atilde ; B 35 -15 570 636 ; C -1 ; WX 600 ; N Edotaccent ; B 25 0 560 761 ; C -1 ; WX 600 ; N scaron ; B 68 -17 535 667 ; C -1 ; WX 600 ; N scedilla ; B 68 -206 535 459 ; C -1 ; WX 600 ; N iacute ; B 77 0 523 661 ; C -1 ; WX 600 ; N lozenge ; B 66 0 534 740 ; C -1 ; WX 600 ; N Rcaron ; B 24 0 599 790 ; C -1 ; WX 600 ; N Gcommaaccent ; B 22 -250 594 580 ; C -1 ; WX 600 ; N ucircumflex ; B -1 -15 569 657 ; C -1 ; WX 600 ; N acircumflex ; B 35 -15 570 657 ; C -1 ; WX 600 ; N Amacron ; B -9 0 609 708 ; C -1 ; WX 600 ; N rcaron ; B 47 0 580 667 ; C -1 ; WX 600 ; N ccedilla ; B 40 -206 545 459 ; C -1 ; WX 600 ; N Zdotaccent ; B 62 0 539 761 ; C -1 ; WX 600 ; N Thorn ; B 48 0 557 562 ; C -1 ; WX 600 ; N Omacron ; B 22 -18 578 708 ; C -1 ; WX 600 ; N Racute ; B 24 0 599 784 ; C -1 ; WX 600 ; N Sacute ; B 47 -22 553 784 ; C -1 ; WX 600 ; N dcaron ; B 20 -15 727 626 ; C -1 ; WX 600 ; N Umacron ; B 4 -18 596 708 ; C -1 ; WX 600 ; N uring ; B -1 -15 569 678 ; C -1 ; WX 600 ; N threesuperior ; B 138 222 433 616 ; C -1 ; WX 600 ; N Ograve ; B 22 -18 578 784 ; C -1 ; WX 600 ; N Agrave ; B -9 0 609 784 ; C -1 ; WX 600 ; N Abreve ; B -9 0 609 784 ; C -1 ; WX 600 ; N multiply ; B 81 39 520 478 ; C -1 ; WX 600 ; N uacute ; B -1 -15 569 661 ; C -1 ; WX 600 ; N Tcaron ; B 21 0 579 790 ; C -1 ; WX 600 ; N partialdiff ; B 63 -38 537 728 ; C -1 ; WX 600 ; N ydieresis ; B -4 -142 601 638 ; C -1 ; WX 600 ; N Nacute ; B 8 -12 610 784 ; C -1 ; WX 600 ; N icircumflex ; B 73 0 523 657 ; C -1 ; WX 600 ; N Ecircumflex ; B 25 0 560 780 ; C -1 ; WX 600 ; N adieresis ; B 35 -15 570 638 ; C -1 ; WX 600 ; N edieresis ; B 40 -15 563 638 ; C -1 ; WX 600 ; N cacute ; B 40 -15 545 661 ; C -1 ; WX 600 ; N nacute ; B 18 0 592 661 ; C -1 ; WX 600 ; N umacron ; B -1 -15 569 585 ; C -1 ; WX 600 ; N Ncaron ; B 8 -12 610 790 ; C -1 ; WX 600 ; N Iacute ; B 77 0 523 784 ; C -1 ; WX 600 ; N plusminus ; B 71 24 529 515 ; C -1 ; WX 600 ; N brokenbar ; B 255 -175 345 675 ; C -1 ; WX 600 ; N registered ; B 0 -18 600 580 ; C -1 ; WX 600 ; N Gbreve ; B 22 -18 594 784 ; C -1 ; WX 600 ; N Idotaccent ; B 77 0 523 761 ; C -1 ; WX 600 ; N summation ; B 15 -10 586 706 ; C -1 ; WX 600 ; N Egrave ; B 25 0 560 784 ; C -1 ; WX 600 ; N racute ; B 47 0 580 661 ; C -1 ; WX 600 ; N omacron ; B 30 -15 570 585 ; C -1 ; WX 600 ; N Zacute ; B 62 0 539 784 ; C -1 ; WX 600 ; N Zcaron ; B 62 0 539 790 ; C -1 ; WX 600 ; N greaterequal ; B 26 0 523 696 ; C -1 ; WX 600 ; N Eth ; B 30 0 594 562 ; C -1 ; WX 600 ; N Ccedilla ; B 22 -206 560 580 ; C -1 ; WX 600 ; N lcommaaccent ; B 77 -250 523 626 ; C -1 ; WX 600 ; N tcaron ; B 47 -15 532 703 ; C -1 ; WX 600 ; N eogonek ; B 40 -199 563 454 ; C -1 ; WX 600 ; N Uogonek ; B 4 -199 596 562 ; C -1 ; WX 600 ; N Aacute ; B -9 0 609 784 ; C -1 ; WX 600 ; N Adieresis ; B -9 0 609 761 ; C -1 ; WX 600 ; N egrave ; B 40 -15 563 661 ; C -1 ; WX 600 ; N zacute ; B 81 0 520 661 ; C -1 ; WX 600 ; N iogonek ; B 77 -199 523 658 ; C -1 ; WX 600 ; N Oacute ; B 22 -18 578 784 ; C -1 ; WX 600 ; N oacute ; B 30 -15 570 661 ; C -1 ; WX 600 ; N amacron ; B 35 -15 570 585 ; C -1 ; WX 600 ; N sacute ; B 68 -17 535 661 ; C -1 ; WX 600 ; N idieresis ; B 77 0 523 618 ; C -1 ; WX 600 ; N Ocircumflex ; B 22 -18 578 780 ; C -1 ; WX 600 ; N Ugrave ; B 4 -18 596 784 ; C -1 ; WX 600 ; N Delta ; B 6 0 594 688 ; C -1 ; WX 600 ; N thorn ; B -14 -142 570 626 ; C -1 ; WX 600 ; N twosuperior ; B 143 230 436 616 ; C -1 ; WX 600 ; N Odieresis ; B 22 -18 578 761 ; C -1 ; WX 600 ; N mu ; B -1 -142 569 439 ; C -1 ; WX 600 ; N igrave ; B 77 0 523 661 ; C -1 ; WX 600 ; N ohungarumlaut ; B 30 -15 668 661 ; C -1 ; WX 600 ; N Eogonek ; B 25 -199 576 562 ; C -1 ; WX 600 ; N dcroat ; B 20 -15 591 626 ; C -1 ; WX 600 ; N threequarters ; B -47 -60 648 661 ; C -1 ; WX 600 ; N Scedilla ; B 47 -206 553 582 ; C -1 ; WX 600 ; N lcaron ; B 77 0 597 626 ; C -1 ; WX 600 ; N Kcommaaccent ; B 21 -250 599 562 ; C -1 ; WX 600 ; N Lacute ; B 39 0 578 784 ; C -1 ; WX 600 ; N trademark ; B -9 230 749 562 ; C -1 ; WX 600 ; N edotaccent ; B 40 -15 563 638 ; C -1 ; WX 600 ; N Igrave ; B 77 0 523 784 ; C -1 ; WX 600 ; N Imacron ; B 77 0 523 708 ; C -1 ; WX 600 ; N Lcaron ; B 39 0 637 562 ; C -1 ; WX 600 ; N onehalf ; B -47 -60 648 661 ; C -1 ; WX 600 ; N lessequal ; B 26 0 523 696 ; C -1 ; WX 600 ; N ocircumflex ; B 30 -15 570 657 ; C -1 ; WX 600 ; N ntilde ; B 18 0 592 636 ; C -1 ; WX 600 ; N Uhungarumlaut ; B 4 -18 638 784 ; C -1 ; WX 600 ; N Eacute ; B 25 0 560 784 ; C -1 ; WX 600 ; N emacron ; B 40 -15 563 585 ; C -1 ; WX 600 ; N gbreve ; B 30 -146 580 661 ; C -1 ; WX 600 ; N onequarter ; B -56 -60 656 661 ; C -1 ; WX 600 ; N Scaron ; B 47 -22 553 790 ; C -1 ; WX 600 ; N Scommaaccent ; B 47 -250 553 582 ; C -1 ; WX 600 ; N Ohungarumlaut ; B 22 -18 628 784 ; C -1 ; WX 600 ; N degree ; B 86 243 474 616 ; C -1 ; WX 600 ; N ograve ; B 30 -15 570 661 ; C -1 ; WX 600 ; N Ccaron ; B 22 -18 560 790 ; C -1 ; WX 600 ; N ugrave ; B -1 -15 569 661 ; C -1 ; WX 600 ; N radical ; B -19 -104 473 778 ; C -1 ; WX 600 ; N Dcaron ; B 30 0 594 790 ; C -1 ; WX 600 ; N rcommaaccent ; B 47 -250 580 454 ; C -1 ; WX 600 ; N Ntilde ; B 8 -12 610 759 ; C -1 ; WX 600 ; N otilde ; B 30 -15 570 636 ; C -1 ; WX 600 ; N Rcommaaccent ; B 24 -250 599 562 ; C -1 ; WX 600 ; N Lcommaaccent ; B 39 -250 578 562 ; C -1 ; WX 600 ; N Atilde ; B -9 0 609 759 ; C -1 ; WX 600 ; N Aogonek ; B -9 -199 625 562 ; C -1 ; WX 600 ; N Aring ; B -9 0 609 801 ; C -1 ; WX 600 ; N Otilde ; B 22 -18 578 759 ; C -1 ; WX 600 ; N zdotaccent ; B 81 0 520 638 ; C -1 ; WX 600 ; N Ecaron ; B 25 0 560 790 ; C -1 ; WX 600 ; N Iogonek ; B 77 -199 523 562 ; C -1 ; WX 600 ; N kcommaaccent ; B 20 -250 585 626 ; C -1 ; WX 600 ; N minus ; B 71 203 529 313 ; C -1 ; WX 600 ; N Icircumflex ; B 77 0 523 780 ; C -1 ; WX 600 ; N ncaron ; B 18 0 592 667 ; C -1 ; WX 600 ; N tcommaaccent ; B 47 -250 532 562 ; C -1 ; WX 600 ; N logicalnot ; B 71 103 529 413 ; C -1 ; WX 600 ; N odieresis ; B 30 -15 570 638 ; C -1 ; WX 600 ; N udieresis ; B -1 -15 569 638 ; C -1 ; WX 600 ; N notequal ; B 12 -47 537 563 ; C -1 ; WX 600 ; N gcommaaccent ; B 30 -146 580 714 ; C -1 ; WX 600 ; N eth ; B 58 -27 543 626 ; C -1 ; WX 600 ; N zcaron ; B 81 0 520 667 ; C -1 ; WX 600 ; N ncommaaccent ; B 18 -250 592 454 ; C -1 ; WX 600 ; N onesuperior ; B 153 230 447 616 ; C -1 ; WX 600 ; N imacron ; B 77 0 523 585 ; C -1 ; WX 600 ; N Euro ; B 0 0 0 0 ; EndCharMetrics EndFontMetrics ruby-prawn-1.0.0~rc2.orig/data/fonts/Times-BoldItalic.afm0000644000000000000000000016437212114176157021716 0ustar rootrootStartFontMetrics 4.1 Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. Comment Creation Date: Thu May 1 13:04:06 1997 Comment UniqueID 43066 Comment VMusage 45874 56899 FontName Times-BoldItalic FullName Times Bold Italic FamilyName Times Weight Bold ItalicAngle -15 IsFixedPitch false CharacterSet ExtendedRoman FontBBox -200 -218 996 921 UnderlinePosition -100 UnderlineThickness 50 Version 002.000 Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries. EncodingScheme AdobeStandardEncoding CapHeight 669 XHeight 462 Ascender 683 Descender -217 StdHW 42 StdVW 121 StartCharMetrics 315 C 32 ; WX 250 ; N space ; B 0 0 0 0 ; C 33 ; WX 389 ; N exclam ; B 67 -13 370 684 ; C 34 ; WX 555 ; N quotedbl ; B 136 398 536 685 ; C 35 ; WX 500 ; N numbersign ; B -33 0 533 700 ; C 36 ; WX 500 ; N dollar ; B -20 -100 497 733 ; C 37 ; WX 833 ; N percent ; B 39 -10 793 692 ; C 38 ; WX 778 ; N ampersand ; B 5 -19 699 682 ; C 39 ; WX 333 ; N quoteright ; B 98 369 302 685 ; C 40 ; WX 333 ; N parenleft ; B 28 -179 344 685 ; C 41 ; WX 333 ; N parenright ; B -44 -179 271 685 ; C 42 ; WX 500 ; N asterisk ; B 65 249 456 685 ; C 43 ; WX 570 ; N plus ; B 33 0 537 506 ; C 44 ; WX 250 ; N comma ; B -60 -182 144 134 ; C 45 ; WX 333 ; N hyphen ; B 2 166 271 282 ; C 46 ; WX 250 ; N period ; B -9 -13 139 135 ; C 47 ; WX 278 ; N slash ; B -64 -18 342 685 ; C 48 ; WX 500 ; N zero ; B 17 -14 477 683 ; C 49 ; WX 500 ; N one ; B 5 0 419 683 ; C 50 ; WX 500 ; N two ; B -27 0 446 683 ; C 51 ; WX 500 ; N three ; B -15 -13 450 683 ; C 52 ; WX 500 ; N four ; B -15 0 503 683 ; C 53 ; WX 500 ; N five ; B -11 -13 487 669 ; C 54 ; WX 500 ; N six ; B 23 -15 509 679 ; C 55 ; WX 500 ; N seven ; B 52 0 525 669 ; C 56 ; WX 500 ; N eight ; B 3 -13 476 683 ; C 57 ; WX 500 ; N nine ; B -12 -10 475 683 ; C 58 ; WX 333 ; N colon ; B 23 -13 264 459 ; C 59 ; WX 333 ; N semicolon ; B -25 -183 264 459 ; C 60 ; WX 570 ; N less ; B 31 -8 539 514 ; C 61 ; WX 570 ; N equal ; B 33 107 537 399 ; C 62 ; WX 570 ; N greater ; B 31 -8 539 514 ; C 63 ; WX 500 ; N question ; B 79 -13 470 684 ; C 64 ; WX 832 ; N at ; B 63 -18 770 685 ; C 65 ; WX 667 ; N A ; B -67 0 593 683 ; C 66 ; WX 667 ; N B ; B -24 0 624 669 ; C 67 ; WX 667 ; N C ; B 32 -18 677 685 ; C 68 ; WX 722 ; N D ; B -46 0 685 669 ; C 69 ; WX 667 ; N E ; B -27 0 653 669 ; C 70 ; WX 667 ; N F ; B -13 0 660 669 ; C 71 ; WX 722 ; N G ; B 21 -18 706 685 ; C 72 ; WX 778 ; N H ; B -24 0 799 669 ; C 73 ; WX 389 ; N I ; B -32 0 406 669 ; C 74 ; WX 500 ; N J ; B -46 -99 524 669 ; C 75 ; WX 667 ; N K ; B -21 0 702 669 ; C 76 ; WX 611 ; N L ; B -22 0 590 669 ; C 77 ; WX 889 ; N M ; B -29 -12 917 669 ; C 78 ; WX 722 ; N N ; B -27 -15 748 669 ; C 79 ; WX 722 ; N O ; B 27 -18 691 685 ; C 80 ; WX 611 ; N P ; B -27 0 613 669 ; C 81 ; WX 722 ; N Q ; B 27 -208 691 685 ; C 82 ; WX 667 ; N R ; B -29 0 623 669 ; C 83 ; WX 556 ; N S ; B 2 -18 526 685 ; C 84 ; WX 611 ; N T ; B 50 0 650 669 ; C 85 ; WX 722 ; N U ; B 67 -18 744 669 ; C 86 ; WX 667 ; N V ; B 65 -18 715 669 ; C 87 ; WX 889 ; N W ; B 65 -18 940 669 ; C 88 ; WX 667 ; N X ; B -24 0 694 669 ; C 89 ; WX 611 ; N Y ; B 73 0 659 669 ; C 90 ; WX 611 ; N Z ; B -11 0 590 669 ; C 91 ; WX 333 ; N bracketleft ; B -37 -159 362 674 ; C 92 ; WX 278 ; N backslash ; B -1 -18 279 685 ; C 93 ; WX 333 ; N bracketright ; B -56 -157 343 674 ; C 94 ; WX 570 ; N asciicircum ; B 67 304 503 669 ; C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; C 96 ; WX 333 ; N quoteleft ; B 128 369 332 685 ; C 97 ; WX 500 ; N a ; B -21 -14 455 462 ; C 98 ; WX 500 ; N b ; B -14 -13 444 699 ; C 99 ; WX 444 ; N c ; B -5 -13 392 462 ; C 100 ; WX 500 ; N d ; B -21 -13 517 699 ; C 101 ; WX 444 ; N e ; B 5 -13 398 462 ; C 102 ; WX 333 ; N f ; B -169 -205 446 698 ; L i fi ; L l fl ; C 103 ; WX 500 ; N g ; B -52 -203 478 462 ; C 104 ; WX 556 ; N h ; B -13 -9 498 699 ; C 105 ; WX 278 ; N i ; B 2 -9 263 684 ; C 106 ; WX 278 ; N j ; B -189 -207 279 684 ; C 107 ; WX 500 ; N k ; B -23 -8 483 699 ; C 108 ; WX 278 ; N l ; B 2 -9 290 699 ; C 109 ; WX 778 ; N m ; B -14 -9 722 462 ; C 110 ; WX 556 ; N n ; B -6 -9 493 462 ; C 111 ; WX 500 ; N o ; B -3 -13 441 462 ; C 112 ; WX 500 ; N p ; B -120 -205 446 462 ; C 113 ; WX 500 ; N q ; B 1 -205 471 462 ; C 114 ; WX 389 ; N r ; B -21 0 389 462 ; C 115 ; WX 389 ; N s ; B -19 -13 333 462 ; C 116 ; WX 278 ; N t ; B -11 -9 281 594 ; C 117 ; WX 556 ; N u ; B 15 -9 492 462 ; C 118 ; WX 444 ; N v ; B 16 -13 401 462 ; C 119 ; WX 667 ; N w ; B 16 -13 614 462 ; C 120 ; WX 500 ; N x ; B -46 -13 469 462 ; C 121 ; WX 444 ; N y ; B -94 -205 392 462 ; C 122 ; WX 389 ; N z ; B -43 -78 368 449 ; C 123 ; WX 348 ; N braceleft ; B 5 -187 436 686 ; C 124 ; WX 220 ; N bar ; B 66 -218 154 782 ; C 125 ; WX 348 ; N braceright ; B -129 -187 302 686 ; C 126 ; WX 570 ; N asciitilde ; B 54 173 516 333 ; C 161 ; WX 389 ; N exclamdown ; B 19 -205 322 492 ; C 162 ; WX 500 ; N cent ; B 42 -143 439 576 ; C 163 ; WX 500 ; N sterling ; B -32 -12 510 683 ; C 164 ; WX 167 ; N fraction ; B -169 -14 324 683 ; C 165 ; WX 500 ; N yen ; B 33 0 628 669 ; C 166 ; WX 500 ; N florin ; B -87 -156 537 707 ; C 167 ; WX 500 ; N section ; B 36 -143 459 685 ; C 168 ; WX 500 ; N currency ; B -26 34 526 586 ; C 169 ; WX 278 ; N quotesingle ; B 128 398 268 685 ; C 170 ; WX 500 ; N quotedblleft ; B 53 369 513 685 ; C 171 ; WX 500 ; N guillemotleft ; B 12 32 468 415 ; C 172 ; WX 333 ; N guilsinglleft ; B 32 32 303 415 ; C 173 ; WX 333 ; N guilsinglright ; B 10 32 281 415 ; C 174 ; WX 556 ; N fi ; B -188 -205 514 703 ; C 175 ; WX 556 ; N fl ; B -186 -205 553 704 ; C 177 ; WX 500 ; N endash ; B -40 178 477 269 ; C 178 ; WX 500 ; N dagger ; B 91 -145 494 685 ; C 179 ; WX 500 ; N daggerdbl ; B 10 -139 493 685 ; C 180 ; WX 250 ; N periodcentered ; B 51 257 199 405 ; C 182 ; WX 500 ; N paragraph ; B -57 -193 562 669 ; C 183 ; WX 350 ; N bullet ; B 0 175 350 525 ; C 184 ; WX 333 ; N quotesinglbase ; B -5 -182 199 134 ; C 185 ; WX 500 ; N quotedblbase ; B -57 -182 403 134 ; C 186 ; WX 500 ; N quotedblright ; B 53 369 513 685 ; C 187 ; WX 500 ; N guillemotright ; B 12 32 468 415 ; C 188 ; WX 1000 ; N ellipsis ; B 40 -13 852 135 ; C 189 ; WX 1000 ; N perthousand ; B 7 -29 996 706 ; C 191 ; WX 500 ; N questiondown ; B 30 -205 421 492 ; C 193 ; WX 333 ; N grave ; B 85 516 297 697 ; C 194 ; WX 333 ; N acute ; B 139 516 379 697 ; C 195 ; WX 333 ; N circumflex ; B 40 516 367 690 ; C 196 ; WX 333 ; N tilde ; B 48 536 407 655 ; C 197 ; WX 333 ; N macron ; B 51 553 393 623 ; C 198 ; WX 333 ; N breve ; B 71 516 387 678 ; C 199 ; WX 333 ; N dotaccent ; B 163 550 298 684 ; C 200 ; WX 333 ; N dieresis ; B 55 550 402 684 ; C 202 ; WX 333 ; N ring ; B 127 516 340 729 ; C 203 ; WX 333 ; N cedilla ; B -80 -218 156 5 ; C 205 ; WX 333 ; N hungarumlaut ; B 69 516 498 697 ; C 206 ; WX 333 ; N ogonek ; B 15 -183 244 34 ; C 207 ; WX 333 ; N caron ; B 79 516 411 690 ; C 208 ; WX 1000 ; N emdash ; B -40 178 977 269 ; C 225 ; WX 944 ; N AE ; B -64 0 918 669 ; C 227 ; WX 266 ; N ordfeminine ; B 16 399 330 685 ; C 232 ; WX 611 ; N Lslash ; B -22 0 590 669 ; C 233 ; WX 722 ; N Oslash ; B 27 -125 691 764 ; C 234 ; WX 944 ; N OE ; B 23 -8 946 677 ; C 235 ; WX 300 ; N ordmasculine ; B 56 400 347 685 ; C 241 ; WX 722 ; N ae ; B -5 -13 673 462 ; C 245 ; WX 278 ; N dotlessi ; B 2 -9 238 462 ; C 248 ; WX 278 ; N lslash ; B -7 -9 307 699 ; C 249 ; WX 500 ; N oslash ; B -3 -119 441 560 ; C 250 ; WX 722 ; N oe ; B 6 -13 674 462 ; C 251 ; WX 500 ; N germandbls ; B -200 -200 473 705 ; C -1 ; WX 389 ; N Idieresis ; B -32 0 450 862 ; C -1 ; WX 444 ; N eacute ; B 5 -13 435 697 ; C -1 ; WX 500 ; N abreve ; B -21 -14 471 678 ; C -1 ; WX 556 ; N uhungarumlaut ; B 15 -9 610 697 ; C -1 ; WX 444 ; N ecaron ; B 5 -13 467 690 ; C -1 ; WX 611 ; N Ydieresis ; B 73 0 659 862 ; C -1 ; WX 570 ; N divide ; B 33 -29 537 535 ; C -1 ; WX 611 ; N Yacute ; B 73 0 659 904 ; C -1 ; WX 667 ; N Acircumflex ; B -67 0 593 897 ; C -1 ; WX 500 ; N aacute ; B -21 -14 463 697 ; C -1 ; WX 722 ; N Ucircumflex ; B 67 -18 744 897 ; C -1 ; WX 444 ; N yacute ; B -94 -205 435 697 ; C -1 ; WX 389 ; N scommaaccent ; B -19 -218 333 462 ; C -1 ; WX 444 ; N ecircumflex ; B 5 -13 423 690 ; C -1 ; WX 722 ; N Uring ; B 67 -18 744 921 ; C -1 ; WX 722 ; N Udieresis ; B 67 -18 744 862 ; C -1 ; WX 500 ; N aogonek ; B -21 -183 455 462 ; C -1 ; WX 722 ; N Uacute ; B 67 -18 744 904 ; C -1 ; WX 556 ; N uogonek ; B 15 -183 492 462 ; C -1 ; WX 667 ; N Edieresis ; B -27 0 653 862 ; C -1 ; WX 722 ; N Dcroat ; B -31 0 700 669 ; C -1 ; WX 250 ; N commaaccent ; B -36 -218 131 -50 ; C -1 ; WX 747 ; N copyright ; B 30 -18 718 685 ; C -1 ; WX 667 ; N Emacron ; B -27 0 653 830 ; C -1 ; WX 444 ; N ccaron ; B -5 -13 467 690 ; C -1 ; WX 500 ; N aring ; B -21 -14 455 729 ; C -1 ; WX 722 ; N Ncommaaccent ; B -27 -218 748 669 ; C -1 ; WX 278 ; N lacute ; B 2 -9 392 904 ; C -1 ; WX 500 ; N agrave ; B -21 -14 455 697 ; C -1 ; WX 611 ; N Tcommaaccent ; B 50 -218 650 669 ; C -1 ; WX 667 ; N Cacute ; B 32 -18 677 904 ; C -1 ; WX 500 ; N atilde ; B -21 -14 491 655 ; C -1 ; WX 667 ; N Edotaccent ; B -27 0 653 862 ; C -1 ; WX 389 ; N scaron ; B -19 -13 424 690 ; C -1 ; WX 389 ; N scedilla ; B -19 -218 333 462 ; C -1 ; WX 278 ; N iacute ; B 2 -9 352 697 ; C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ; C -1 ; WX 667 ; N Rcaron ; B -29 0 623 897 ; C -1 ; WX 722 ; N Gcommaaccent ; B 21 -218 706 685 ; C -1 ; WX 556 ; N ucircumflex ; B 15 -9 492 690 ; C -1 ; WX 500 ; N acircumflex ; B -21 -14 455 690 ; C -1 ; WX 667 ; N Amacron ; B -67 0 593 830 ; C -1 ; WX 389 ; N rcaron ; B -21 0 424 690 ; C -1 ; WX 444 ; N ccedilla ; B -5 -218 392 462 ; C -1 ; WX 611 ; N Zdotaccent ; B -11 0 590 862 ; C -1 ; WX 611 ; N Thorn ; B -27 0 573 669 ; C -1 ; WX 722 ; N Omacron ; B 27 -18 691 830 ; C -1 ; WX 667 ; N Racute ; B -29 0 623 904 ; C -1 ; WX 556 ; N Sacute ; B 2 -18 531 904 ; C -1 ; WX 608 ; N dcaron ; B -21 -13 675 708 ; C -1 ; WX 722 ; N Umacron ; B 67 -18 744 830 ; C -1 ; WX 556 ; N uring ; B 15 -9 492 729 ; C -1 ; WX 300 ; N threesuperior ; B 17 265 321 683 ; C -1 ; WX 722 ; N Ograve ; B 27 -18 691 904 ; C -1 ; WX 667 ; N Agrave ; B -67 0 593 904 ; C -1 ; WX 667 ; N Abreve ; B -67 0 593 885 ; C -1 ; WX 570 ; N multiply ; B 48 16 522 490 ; C -1 ; WX 556 ; N uacute ; B 15 -9 492 697 ; C -1 ; WX 611 ; N Tcaron ; B 50 0 650 897 ; C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ; C -1 ; WX 444 ; N ydieresis ; B -94 -205 443 655 ; C -1 ; WX 722 ; N Nacute ; B -27 -15 748 904 ; C -1 ; WX 278 ; N icircumflex ; B -3 -9 324 690 ; C -1 ; WX 667 ; N Ecircumflex ; B -27 0 653 897 ; C -1 ; WX 500 ; N adieresis ; B -21 -14 476 655 ; C -1 ; WX 444 ; N edieresis ; B 5 -13 448 655 ; C -1 ; WX 444 ; N cacute ; B -5 -13 435 697 ; C -1 ; WX 556 ; N nacute ; B -6 -9 493 697 ; C -1 ; WX 556 ; N umacron ; B 15 -9 492 623 ; C -1 ; WX 722 ; N Ncaron ; B -27 -15 748 897 ; C -1 ; WX 389 ; N Iacute ; B -32 0 432 904 ; C -1 ; WX 570 ; N plusminus ; B 33 0 537 506 ; C -1 ; WX 220 ; N brokenbar ; B 66 -143 154 707 ; C -1 ; WX 747 ; N registered ; B 30 -18 718 685 ; C -1 ; WX 722 ; N Gbreve ; B 21 -18 706 885 ; C -1 ; WX 389 ; N Idotaccent ; B -32 0 406 862 ; C -1 ; WX 600 ; N summation ; B 14 -10 585 706 ; C -1 ; WX 667 ; N Egrave ; B -27 0 653 904 ; C -1 ; WX 389 ; N racute ; B -21 0 407 697 ; C -1 ; WX 500 ; N omacron ; B -3 -13 462 623 ; C -1 ; WX 611 ; N Zacute ; B -11 0 590 904 ; C -1 ; WX 611 ; N Zcaron ; B -11 0 590 897 ; C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ; C -1 ; WX 722 ; N Eth ; B -31 0 700 669 ; C -1 ; WX 667 ; N Ccedilla ; B 32 -218 677 685 ; C -1 ; WX 278 ; N lcommaaccent ; B -42 -218 290 699 ; C -1 ; WX 366 ; N tcaron ; B -11 -9 434 754 ; C -1 ; WX 444 ; N eogonek ; B 5 -183 398 462 ; C -1 ; WX 722 ; N Uogonek ; B 67 -183 744 669 ; C -1 ; WX 667 ; N Aacute ; B -67 0 593 904 ; C -1 ; WX 667 ; N Adieresis ; B -67 0 593 862 ; C -1 ; WX 444 ; N egrave ; B 5 -13 398 697 ; C -1 ; WX 389 ; N zacute ; B -43 -78 407 697 ; C -1 ; WX 278 ; N iogonek ; B -20 -183 263 684 ; C -1 ; WX 722 ; N Oacute ; B 27 -18 691 904 ; C -1 ; WX 500 ; N oacute ; B -3 -13 463 697 ; C -1 ; WX 500 ; N amacron ; B -21 -14 467 623 ; C -1 ; WX 389 ; N sacute ; B -19 -13 407 697 ; C -1 ; WX 278 ; N idieresis ; B 2 -9 364 655 ; C -1 ; WX 722 ; N Ocircumflex ; B 27 -18 691 897 ; C -1 ; WX 722 ; N Ugrave ; B 67 -18 744 904 ; C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; C -1 ; WX 500 ; N thorn ; B -120 -205 446 699 ; C -1 ; WX 300 ; N twosuperior ; B 2 274 313 683 ; C -1 ; WX 722 ; N Odieresis ; B 27 -18 691 862 ; C -1 ; WX 576 ; N mu ; B -60 -207 516 449 ; C -1 ; WX 278 ; N igrave ; B 2 -9 259 697 ; C -1 ; WX 500 ; N ohungarumlaut ; B -3 -13 582 697 ; C -1 ; WX 667 ; N Eogonek ; B -27 -183 653 669 ; C -1 ; WX 500 ; N dcroat ; B -21 -13 552 699 ; C -1 ; WX 750 ; N threequarters ; B 7 -14 726 683 ; C -1 ; WX 556 ; N Scedilla ; B 2 -218 526 685 ; C -1 ; WX 382 ; N lcaron ; B 2 -9 448 708 ; C -1 ; WX 667 ; N Kcommaaccent ; B -21 -218 702 669 ; C -1 ; WX 611 ; N Lacute ; B -22 0 590 904 ; C -1 ; WX 1000 ; N trademark ; B 32 263 968 669 ; C -1 ; WX 444 ; N edotaccent ; B 5 -13 398 655 ; C -1 ; WX 389 ; N Igrave ; B -32 0 406 904 ; C -1 ; WX 389 ; N Imacron ; B -32 0 461 830 ; C -1 ; WX 611 ; N Lcaron ; B -22 0 671 718 ; C -1 ; WX 750 ; N onehalf ; B -9 -14 723 683 ; C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ; C -1 ; WX 500 ; N ocircumflex ; B -3 -13 451 690 ; C -1 ; WX 556 ; N ntilde ; B -6 -9 504 655 ; C -1 ; WX 722 ; N Uhungarumlaut ; B 67 -18 744 904 ; C -1 ; WX 667 ; N Eacute ; B -27 0 653 904 ; C -1 ; WX 444 ; N emacron ; B 5 -13 439 623 ; C -1 ; WX 500 ; N gbreve ; B -52 -203 478 678 ; C -1 ; WX 750 ; N onequarter ; B 7 -14 721 683 ; C -1 ; WX 556 ; N Scaron ; B 2 -18 553 897 ; C -1 ; WX 556 ; N Scommaaccent ; B 2 -218 526 685 ; C -1 ; WX 722 ; N Ohungarumlaut ; B 27 -18 723 904 ; C -1 ; WX 400 ; N degree ; B 83 397 369 683 ; C -1 ; WX 500 ; N ograve ; B -3 -13 441 697 ; C -1 ; WX 667 ; N Ccaron ; B 32 -18 677 897 ; C -1 ; WX 556 ; N ugrave ; B 15 -9 492 697 ; C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ; C -1 ; WX 722 ; N Dcaron ; B -46 0 685 897 ; C -1 ; WX 389 ; N rcommaaccent ; B -67 -218 389 462 ; C -1 ; WX 722 ; N Ntilde ; B -27 -15 748 862 ; C -1 ; WX 500 ; N otilde ; B -3 -13 491 655 ; C -1 ; WX 667 ; N Rcommaaccent ; B -29 -218 623 669 ; C -1 ; WX 611 ; N Lcommaaccent ; B -22 -218 590 669 ; C -1 ; WX 667 ; N Atilde ; B -67 0 593 862 ; C -1 ; WX 667 ; N Aogonek ; B -67 -183 604 683 ; C -1 ; WX 667 ; N Aring ; B -67 0 593 921 ; C -1 ; WX 722 ; N Otilde ; B 27 -18 691 862 ; C -1 ; WX 389 ; N zdotaccent ; B -43 -78 368 655 ; C -1 ; WX 667 ; N Ecaron ; B -27 0 653 897 ; C -1 ; WX 389 ; N Iogonek ; B -32 -183 406 669 ; C -1 ; WX 500 ; N kcommaaccent ; B -23 -218 483 699 ; C -1 ; WX 606 ; N minus ; B 51 209 555 297 ; C -1 ; WX 389 ; N Icircumflex ; B -32 0 450 897 ; C -1 ; WX 556 ; N ncaron ; B -6 -9 523 690 ; C -1 ; WX 278 ; N tcommaaccent ; B -62 -218 281 594 ; C -1 ; WX 606 ; N logicalnot ; B 51 108 555 399 ; C -1 ; WX 500 ; N odieresis ; B -3 -13 471 655 ; C -1 ; WX 556 ; N udieresis ; B 15 -9 499 655 ; C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ; C -1 ; WX 500 ; N gcommaaccent ; B -52 -203 478 767 ; C -1 ; WX 500 ; N eth ; B -3 -13 454 699 ; C -1 ; WX 389 ; N zcaron ; B -43 -78 424 690 ; C -1 ; WX 556 ; N ncommaaccent ; B -6 -218 493 462 ; C -1 ; WX 300 ; N onesuperior ; B 30 274 301 683 ; C -1 ; WX 278 ; N imacron ; B 2 -9 294 623 ; C -1 ; WX 500 ; N Euro ; B 0 0 0 0 ; EndCharMetrics StartKernData StartKernPairs 2038 KPX A C -65 KPX A Cacute -65 KPX A Ccaron -65 KPX A Ccedilla -65 KPX A G -60 KPX A Gbreve -60 KPX A Gcommaaccent -60 KPX A O -50 KPX A Oacute -50 KPX A Ocircumflex -50 KPX A Odieresis -50 KPX A Ograve -50 KPX A Ohungarumlaut -50 KPX A Omacron -50 KPX A Oslash -50 KPX A Otilde -50 KPX A Q -55 KPX A T -55 KPX A Tcaron -55 KPX A Tcommaaccent -55 KPX A U -50 KPX A Uacute -50 KPX A Ucircumflex -50 KPX A Udieresis -50 KPX A Ugrave -50 KPX A Uhungarumlaut -50 KPX A Umacron -50 KPX A Uogonek -50 KPX A Uring -50 KPX A V -95 KPX A W -100 KPX A Y -70 KPX A Yacute -70 KPX A Ydieresis -70 KPX A quoteright -74 KPX A u -30 KPX A uacute -30 KPX A ucircumflex -30 KPX A udieresis -30 KPX A ugrave -30 KPX A uhungarumlaut -30 KPX A umacron -30 KPX A uogonek -30 KPX A uring -30 KPX A v -74 KPX A w -74 KPX A y -74 KPX A yacute -74 KPX A ydieresis -74 KPX Aacute C -65 KPX Aacute Cacute -65 KPX Aacute Ccaron -65 KPX Aacute Ccedilla -65 KPX Aacute G -60 KPX Aacute Gbreve -60 KPX Aacute Gcommaaccent -60 KPX Aacute O -50 KPX Aacute Oacute -50 KPX Aacute Ocircumflex -50 KPX Aacute Odieresis -50 KPX Aacute Ograve -50 KPX Aacute Ohungarumlaut -50 KPX Aacute Omacron -50 KPX Aacute Oslash -50 KPX Aacute Otilde -50 KPX Aacute Q -55 KPX Aacute T -55 KPX Aacute Tcaron -55 KPX Aacute Tcommaaccent -55 KPX Aacute U -50 KPX Aacute Uacute -50 KPX Aacute Ucircumflex -50 KPX Aacute Udieresis -50 KPX Aacute Ugrave -50 KPX Aacute Uhungarumlaut -50 KPX Aacute Umacron -50 KPX Aacute Uogonek -50 KPX Aacute Uring -50 KPX Aacute V -95 KPX Aacute W -100 KPX Aacute Y -70 KPX Aacute Yacute -70 KPX Aacute Ydieresis -70 KPX Aacute quoteright -74 KPX Aacute u -30 KPX Aacute uacute -30 KPX Aacute ucircumflex -30 KPX Aacute udieresis -30 KPX Aacute ugrave -30 KPX Aacute uhungarumlaut -30 KPX Aacute umacron -30 KPX Aacute uogonek -30 KPX Aacute uring -30 KPX Aacute v -74 KPX Aacute w -74 KPX Aacute y -74 KPX Aacute yacute -74 KPX Aacute ydieresis -74 KPX Abreve C -65 KPX Abreve Cacute -65 KPX Abreve Ccaron -65 KPX Abreve Ccedilla -65 KPX Abreve G -60 KPX Abreve Gbreve -60 KPX Abreve Gcommaaccent -60 KPX Abreve O -50 KPX Abreve Oacute -50 KPX Abreve Ocircumflex -50 KPX Abreve Odieresis -50 KPX Abreve Ograve -50 KPX Abreve Ohungarumlaut -50 KPX Abreve Omacron -50 KPX Abreve Oslash -50 KPX Abreve Otilde -50 KPX Abreve Q -55 KPX Abreve T -55 KPX Abreve Tcaron -55 KPX Abreve Tcommaaccent -55 KPX Abreve U -50 KPX Abreve Uacute -50 KPX Abreve Ucircumflex -50 KPX Abreve Udieresis -50 KPX Abreve Ugrave -50 KPX Abreve Uhungarumlaut -50 KPX Abreve Umacron -50 KPX Abreve Uogonek -50 KPX Abreve Uring -50 KPX Abreve V -95 KPX Abreve W -100 KPX Abreve Y -70 KPX Abreve Yacute -70 KPX Abreve Ydieresis -70 KPX Abreve quoteright -74 KPX Abreve u -30 KPX Abreve uacute -30 KPX Abreve ucircumflex -30 KPX Abreve udieresis -30 KPX Abreve ugrave -30 KPX Abreve uhungarumlaut -30 KPX Abreve umacron -30 KPX Abreve uogonek -30 KPX Abreve uring -30 KPX Abreve v -74 KPX Abreve w -74 KPX Abreve y -74 KPX Abreve yacute -74 KPX Abreve ydieresis -74 KPX Acircumflex C -65 KPX Acircumflex Cacute -65 KPX Acircumflex Ccaron -65 KPX Acircumflex Ccedilla -65 KPX Acircumflex G -60 KPX Acircumflex Gbreve -60 KPX Acircumflex Gcommaaccent -60 KPX Acircumflex O -50 KPX Acircumflex Oacute -50 KPX Acircumflex Ocircumflex -50 KPX Acircumflex Odieresis -50 KPX Acircumflex Ograve -50 KPX Acircumflex Ohungarumlaut -50 KPX Acircumflex Omacron -50 KPX Acircumflex Oslash -50 KPX Acircumflex Otilde -50 KPX Acircumflex Q -55 KPX Acircumflex T -55 KPX Acircumflex Tcaron -55 KPX Acircumflex Tcommaaccent -55 KPX Acircumflex U -50 KPX Acircumflex Uacute -50 KPX Acircumflex Ucircumflex -50 KPX Acircumflex Udieresis -50 KPX Acircumflex Ugrave -50 KPX Acircumflex Uhungarumlaut -50 KPX Acircumflex Umacron -50 KPX Acircumflex Uogonek -50 KPX Acircumflex Uring -50 KPX Acircumflex V -95 KPX Acircumflex W -100 KPX Acircumflex Y -70 KPX Acircumflex Yacute -70 KPX Acircumflex Ydieresis -70 KPX Acircumflex quoteright -74 KPX Acircumflex u -30 KPX Acircumflex uacute -30 KPX Acircumflex ucircumflex -30 KPX Acircumflex udieresis -30 KPX Acircumflex ugrave -30 KPX Acircumflex uhungarumlaut -30 KPX Acircumflex umacron -30 KPX Acircumflex uogonek -30 KPX Acircumflex uring -30 KPX Acircumflex v -74 KPX Acircumflex w -74 KPX Acircumflex y -74 KPX Acircumflex yacute -74 KPX Acircumflex ydieresis -74 KPX Adieresis C -65 KPX Adieresis Cacute -65 KPX Adieresis Ccaron -65 KPX Adieresis Ccedilla -65 KPX Adieresis G -60 KPX Adieresis Gbreve -60 KPX Adieresis Gcommaaccent -60 KPX Adieresis O -50 KPX Adieresis Oacute -50 KPX Adieresis Ocircumflex -50 KPX Adieresis Odieresis -50 KPX Adieresis Ograve -50 KPX Adieresis Ohungarumlaut -50 KPX Adieresis Omacron -50 KPX Adieresis Oslash -50 KPX Adieresis Otilde -50 KPX Adieresis Q -55 KPX Adieresis T -55 KPX Adieresis Tcaron -55 KPX Adieresis Tcommaaccent -55 KPX Adieresis U -50 KPX Adieresis Uacute -50 KPX Adieresis Ucircumflex -50 KPX Adieresis Udieresis -50 KPX Adieresis Ugrave -50 KPX Adieresis Uhungarumlaut -50 KPX Adieresis Umacron -50 KPX Adieresis Uogonek -50 KPX Adieresis Uring -50 KPX Adieresis V -95 KPX Adieresis W -100 KPX Adieresis Y -70 KPX Adieresis Yacute -70 KPX Adieresis Ydieresis -70 KPX Adieresis quoteright -74 KPX Adieresis u -30 KPX Adieresis uacute -30 KPX Adieresis ucircumflex -30 KPX Adieresis udieresis -30 KPX Adieresis ugrave -30 KPX Adieresis uhungarumlaut -30 KPX Adieresis umacron -30 KPX Adieresis uogonek -30 KPX Adieresis uring -30 KPX Adieresis v -74 KPX Adieresis w -74 KPX Adieresis y -74 KPX Adieresis yacute -74 KPX Adieresis ydieresis -74 KPX Agrave C -65 KPX Agrave Cacute -65 KPX Agrave Ccaron -65 KPX Agrave Ccedilla -65 KPX Agrave G -60 KPX Agrave Gbreve -60 KPX Agrave Gcommaaccent -60 KPX Agrave O -50 KPX Agrave Oacute -50 KPX Agrave Ocircumflex -50 KPX Agrave Odieresis -50 KPX Agrave Ograve -50 KPX Agrave Ohungarumlaut -50 KPX Agrave Omacron -50 KPX Agrave Oslash -50 KPX Agrave Otilde -50 KPX Agrave Q -55 KPX Agrave T -55 KPX Agrave Tcaron -55 KPX Agrave Tcommaaccent -55 KPX Agrave U -50 KPX Agrave Uacute -50 KPX Agrave Ucircumflex -50 KPX Agrave Udieresis -50 KPX Agrave Ugrave -50 KPX Agrave Uhungarumlaut -50 KPX Agrave Umacron -50 KPX Agrave Uogonek -50 KPX Agrave Uring -50 KPX Agrave V -95 KPX Agrave W -100 KPX Agrave Y -70 KPX Agrave Yacute -70 KPX Agrave Ydieresis -70 KPX Agrave quoteright -74 KPX Agrave u -30 KPX Agrave uacute -30 KPX Agrave ucircumflex -30 KPX Agrave udieresis -30 KPX Agrave ugrave -30 KPX Agrave uhungarumlaut -30 KPX Agrave umacron -30 KPX Agrave uogonek -30 KPX Agrave uring -30 KPX Agrave v -74 KPX Agrave w -74 KPX Agrave y -74 KPX Agrave yacute -74 KPX Agrave ydieresis -74 KPX Amacron C -65 KPX Amacron Cacute -65 KPX Amacron Ccaron -65 KPX Amacron Ccedilla -65 KPX Amacron G -60 KPX Amacron Gbreve -60 KPX Amacron Gcommaaccent -60 KPX Amacron O -50 KPX Amacron Oacute -50 KPX Amacron Ocircumflex -50 KPX Amacron Odieresis -50 KPX Amacron Ograve -50 KPX Amacron Ohungarumlaut -50 KPX Amacron Omacron -50 KPX Amacron Oslash -50 KPX Amacron Otilde -50 KPX Amacron Q -55 KPX Amacron T -55 KPX Amacron Tcaron -55 KPX Amacron Tcommaaccent -55 KPX Amacron U -50 KPX Amacron Uacute -50 KPX Amacron Ucircumflex -50 KPX Amacron Udieresis -50 KPX Amacron Ugrave -50 KPX Amacron Uhungarumlaut -50 KPX Amacron Umacron -50 KPX Amacron Uogonek -50 KPX Amacron Uring -50 KPX Amacron V -95 KPX Amacron W -100 KPX Amacron Y -70 KPX Amacron Yacute -70 KPX Amacron Ydieresis -70 KPX Amacron quoteright -74 KPX Amacron u -30 KPX Amacron uacute -30 KPX Amacron ucircumflex -30 KPX Amacron udieresis -30 KPX Amacron ugrave -30 KPX Amacron uhungarumlaut -30 KPX Amacron umacron -30 KPX Amacron uogonek -30 KPX Amacron uring -30 KPX Amacron v -74 KPX Amacron w -74 KPX Amacron y -74 KPX Amacron yacute -74 KPX Amacron ydieresis -74 KPX Aogonek C -65 KPX Aogonek Cacute -65 KPX Aogonek Ccaron -65 KPX Aogonek Ccedilla -65 KPX Aogonek G -60 KPX Aogonek Gbreve -60 KPX Aogonek Gcommaaccent -60 KPX Aogonek O -50 KPX Aogonek Oacute -50 KPX Aogonek Ocircumflex -50 KPX Aogonek Odieresis -50 KPX Aogonek Ograve -50 KPX Aogonek Ohungarumlaut -50 KPX Aogonek Omacron -50 KPX Aogonek Oslash -50 KPX Aogonek Otilde -50 KPX Aogonek Q -55 KPX Aogonek T -55 KPX Aogonek Tcaron -55 KPX Aogonek Tcommaaccent -55 KPX Aogonek U -50 KPX Aogonek Uacute -50 KPX Aogonek Ucircumflex -50 KPX Aogonek Udieresis -50 KPX Aogonek Ugrave -50 KPX Aogonek Uhungarumlaut -50 KPX Aogonek Umacron -50 KPX Aogonek Uogonek -50 KPX Aogonek Uring -50 KPX Aogonek V -95 KPX Aogonek W -100 KPX Aogonek Y -70 KPX Aogonek Yacute -70 KPX Aogonek Ydieresis -70 KPX Aogonek quoteright -74 KPX Aogonek u -30 KPX Aogonek uacute -30 KPX Aogonek ucircumflex -30 KPX Aogonek udieresis -30 KPX Aogonek ugrave -30 KPX Aogonek uhungarumlaut -30 KPX Aogonek umacron -30 KPX Aogonek uogonek -30 KPX Aogonek uring -30 KPX Aogonek v -74 KPX Aogonek w -74 KPX Aogonek y -34 KPX Aogonek yacute -34 KPX Aogonek ydieresis -34 KPX Aring C -65 KPX Aring Cacute -65 KPX Aring Ccaron -65 KPX Aring Ccedilla -65 KPX Aring G -60 KPX Aring Gbreve -60 KPX Aring Gcommaaccent -60 KPX Aring O -50 KPX Aring Oacute -50 KPX Aring Ocircumflex -50 KPX Aring Odieresis -50 KPX Aring Ograve -50 KPX Aring Ohungarumlaut -50 KPX Aring Omacron -50 KPX Aring Oslash -50 KPX Aring Otilde -50 KPX Aring Q -55 KPX Aring T -55 KPX Aring Tcaron -55 KPX Aring Tcommaaccent -55 KPX Aring U -50 KPX Aring Uacute -50 KPX Aring Ucircumflex -50 KPX Aring Udieresis -50 KPX Aring Ugrave -50 KPX Aring Uhungarumlaut -50 KPX Aring Umacron -50 KPX Aring Uogonek -50 KPX Aring Uring -50 KPX Aring V -95 KPX Aring W -100 KPX Aring Y -70 KPX Aring Yacute -70 KPX Aring Ydieresis -70 KPX Aring quoteright -74 KPX Aring u -30 KPX Aring uacute -30 KPX Aring ucircumflex -30 KPX Aring udieresis -30 KPX Aring ugrave -30 KPX Aring uhungarumlaut -30 KPX Aring umacron -30 KPX Aring uogonek -30 KPX Aring uring -30 KPX Aring v -74 KPX Aring w -74 KPX Aring y -74 KPX Aring yacute -74 KPX Aring ydieresis -74 KPX Atilde C -65 KPX Atilde Cacute -65 KPX Atilde Ccaron -65 KPX Atilde Ccedilla -65 KPX Atilde G -60 KPX Atilde Gbreve -60 KPX Atilde Gcommaaccent -60 KPX Atilde O -50 KPX Atilde Oacute -50 KPX Atilde Ocircumflex -50 KPX Atilde Odieresis -50 KPX Atilde Ograve -50 KPX Atilde Ohungarumlaut -50 KPX Atilde Omacron -50 KPX Atilde Oslash -50 KPX Atilde Otilde -50 KPX Atilde Q -55 KPX Atilde T -55 KPX Atilde Tcaron -55 KPX Atilde Tcommaaccent -55 KPX Atilde U -50 KPX Atilde Uacute -50 KPX Atilde Ucircumflex -50 KPX Atilde Udieresis -50 KPX Atilde Ugrave -50 KPX Atilde Uhungarumlaut -50 KPX Atilde Umacron -50 KPX Atilde Uogonek -50 KPX Atilde Uring -50 KPX Atilde V -95 KPX Atilde W -100 KPX Atilde Y -70 KPX Atilde Yacute -70 KPX Atilde Ydieresis -70 KPX Atilde quoteright -74 KPX Atilde u -30 KPX Atilde uacute -30 KPX Atilde ucircumflex -30 KPX Atilde udieresis -30 KPX Atilde ugrave -30 KPX Atilde uhungarumlaut -30 KPX Atilde umacron -30 KPX Atilde uogonek -30 KPX Atilde uring -30 KPX Atilde v -74 KPX Atilde w -74 KPX Atilde y -74 KPX Atilde yacute -74 KPX Atilde ydieresis -74 KPX B A -25 KPX B Aacute -25 KPX B Abreve -25 KPX B Acircumflex -25 KPX B Adieresis -25 KPX B Agrave -25 KPX B Amacron -25 KPX B Aogonek -25 KPX B Aring -25 KPX B Atilde -25 KPX B U -10 KPX B Uacute -10 KPX B Ucircumflex -10 KPX B Udieresis -10 KPX B Ugrave -10 KPX B Uhungarumlaut -10 KPX B Umacron -10 KPX B Uogonek -10 KPX B Uring -10 KPX D A -25 KPX D Aacute -25 KPX D Abreve -25 KPX D Acircumflex -25 KPX D Adieresis -25 KPX D Agrave -25 KPX D Amacron -25 KPX D Aogonek -25 KPX D Aring -25 KPX D Atilde -25 KPX D V -50 KPX D W -40 KPX D Y -50 KPX D Yacute -50 KPX D Ydieresis -50 KPX Dcaron A -25 KPX Dcaron Aacute -25 KPX Dcaron Abreve -25 KPX Dcaron Acircumflex -25 KPX Dcaron Adieresis -25 KPX Dcaron Agrave -25 KPX Dcaron Amacron -25 KPX Dcaron Aogonek -25 KPX Dcaron Aring -25 KPX Dcaron Atilde -25 KPX Dcaron V -50 KPX Dcaron W -40 KPX Dcaron Y -50 KPX Dcaron Yacute -50 KPX Dcaron Ydieresis -50 KPX Dcroat A -25 KPX Dcroat Aacute -25 KPX Dcroat Abreve -25 KPX Dcroat Acircumflex -25 KPX Dcroat Adieresis -25 KPX Dcroat Agrave -25 KPX Dcroat Amacron -25 KPX Dcroat Aogonek -25 KPX Dcroat Aring -25 KPX Dcroat Atilde -25 KPX Dcroat V -50 KPX Dcroat W -40 KPX Dcroat Y -50 KPX Dcroat Yacute -50 KPX Dcroat Ydieresis -50 KPX F A -100 KPX F Aacute -100 KPX F Abreve -100 KPX F Acircumflex -100 KPX F Adieresis -100 KPX F Agrave -100 KPX F Amacron -100 KPX F Aogonek -100 KPX F Aring -100 KPX F Atilde -100 KPX F a -95 KPX F aacute -95 KPX F abreve -95 KPX F acircumflex -95 KPX F adieresis -95 KPX F agrave -95 KPX F amacron -95 KPX F aogonek -95 KPX F aring -95 KPX F atilde -95 KPX F comma -129 KPX F e -100 KPX F eacute -100 KPX F ecaron -100 KPX F ecircumflex -100 KPX F edieresis -100 KPX F edotaccent -100 KPX F egrave -100 KPX F emacron -100 KPX F eogonek -100 KPX F i -40 KPX F iacute -40 KPX F icircumflex -40 KPX F idieresis -40 KPX F igrave -40 KPX F imacron -40 KPX F iogonek -40 KPX F o -70 KPX F oacute -70 KPX F ocircumflex -70 KPX F odieresis -70 KPX F ograve -70 KPX F ohungarumlaut -70 KPX F omacron -70 KPX F oslash -70 KPX F otilde -70 KPX F period -129 KPX F r -50 KPX F racute -50 KPX F rcaron -50 KPX F rcommaaccent -50 KPX J A -25 KPX J Aacute -25 KPX J Abreve -25 KPX J Acircumflex -25 KPX J Adieresis -25 KPX J Agrave -25 KPX J Amacron -25 KPX J Aogonek -25 KPX J Aring -25 KPX J Atilde -25 KPX J a -40 KPX J aacute -40 KPX J abreve -40 KPX J acircumflex -40 KPX J adieresis -40 KPX J agrave -40 KPX J amacron -40 KPX J aogonek -40 KPX J aring -40 KPX J atilde -40 KPX J comma -10 KPX J e -40 KPX J eacute -40 KPX J ecaron -40 KPX J ecircumflex -40 KPX J edieresis -40 KPX J edotaccent -40 KPX J egrave -40 KPX J emacron -40 KPX J eogonek -40 KPX J o -40 KPX J oacute -40 KPX J ocircumflex -40 KPX J odieresis -40 KPX J ograve -40 KPX J ohungarumlaut -40 KPX J omacron -40 KPX J oslash -40 KPX J otilde -40 KPX J period -10 KPX J u -40 KPX J uacute -40 KPX J ucircumflex -40 KPX J udieresis -40 KPX J ugrave -40 KPX J uhungarumlaut -40 KPX J umacron -40 KPX J uogonek -40 KPX J uring -40 KPX K O -30 KPX K Oacute -30 KPX K Ocircumflex -30 KPX K Odieresis -30 KPX K Ograve -30 KPX K Ohungarumlaut -30 KPX K Omacron -30 KPX K Oslash -30 KPX K Otilde -30 KPX K e -25 KPX K eacute -25 KPX K ecaron -25 KPX K ecircumflex -25 KPX K edieresis -25 KPX K edotaccent -25 KPX K egrave -25 KPX K emacron -25 KPX K eogonek -25 KPX K o -25 KPX K oacute -25 KPX K ocircumflex -25 KPX K odieresis -25 KPX K ograve -25 KPX K ohungarumlaut -25 KPX K omacron -25 KPX K oslash -25 KPX K otilde -25 KPX K u -20 KPX K uacute -20 KPX K ucircumflex -20 KPX K udieresis -20 KPX K ugrave -20 KPX K uhungarumlaut -20 KPX K umacron -20 KPX K uogonek -20 KPX K uring -20 KPX K y -20 KPX K yacute -20 KPX K ydieresis -20 KPX Kcommaaccent O -30 KPX Kcommaaccent Oacute -30 KPX Kcommaaccent Ocircumflex -30 KPX Kcommaaccent Odieresis -30 KPX Kcommaaccent Ograve -30 KPX Kcommaaccent Ohungarumlaut -30 KPX Kcommaaccent Omacron -30 KPX Kcommaaccent Oslash -30 KPX Kcommaaccent Otilde -30 KPX Kcommaaccent e -25 KPX Kcommaaccent eacute -25 KPX Kcommaaccent ecaron -25 KPX Kcommaaccent ecircumflex -25 KPX Kcommaaccent edieresis -25 KPX Kcommaaccent edotaccent -25 KPX Kcommaaccent egrave -25 KPX Kcommaaccent emacron -25 KPX Kcommaaccent eogonek -25 KPX Kcommaaccent o -25 KPX Kcommaaccent oacute -25 KPX Kcommaaccent ocircumflex -25 KPX Kcommaaccent odieresis -25 KPX Kcommaaccent ograve -25 KPX Kcommaaccent ohungarumlaut -25 KPX Kcommaaccent omacron -25 KPX Kcommaaccent oslash -25 KPX Kcommaaccent otilde -25 KPX Kcommaaccent u -20 KPX Kcommaaccent uacute -20 KPX Kcommaaccent ucircumflex -20 KPX Kcommaaccent udieresis -20 KPX Kcommaaccent ugrave -20 KPX Kcommaaccent uhungarumlaut -20 KPX Kcommaaccent umacron -20 KPX Kcommaaccent uogonek -20 KPX Kcommaaccent uring -20 KPX Kcommaaccent y -20 KPX Kcommaaccent yacute -20 KPX Kcommaaccent ydieresis -20 KPX L T -18 KPX L Tcaron -18 KPX L Tcommaaccent -18 KPX L V -37 KPX L W -37 KPX L Y -37 KPX L Yacute -37 KPX L Ydieresis -37 KPX L quoteright -55 KPX L y -37 KPX L yacute -37 KPX L ydieresis -37 KPX Lacute T -18 KPX Lacute Tcaron -18 KPX Lacute Tcommaaccent -18 KPX Lacute V -37 KPX Lacute W -37 KPX Lacute Y -37 KPX Lacute Yacute -37 KPX Lacute Ydieresis -37 KPX Lacute quoteright -55 KPX Lacute y -37 KPX Lacute yacute -37 KPX Lacute ydieresis -37 KPX Lcommaaccent T -18 KPX Lcommaaccent Tcaron -18 KPX Lcommaaccent Tcommaaccent -18 KPX Lcommaaccent V -37 KPX Lcommaaccent W -37 KPX Lcommaaccent Y -37 KPX Lcommaaccent Yacute -37 KPX Lcommaaccent Ydieresis -37 KPX Lcommaaccent quoteright -55 KPX Lcommaaccent y -37 KPX Lcommaaccent yacute -37 KPX Lcommaaccent ydieresis -37 KPX Lslash T -18 KPX Lslash Tcaron -18 KPX Lslash Tcommaaccent -18 KPX Lslash V -37 KPX Lslash W -37 KPX Lslash Y -37 KPX Lslash Yacute -37 KPX Lslash Ydieresis -37 KPX Lslash quoteright -55 KPX Lslash y -37 KPX Lslash yacute -37 KPX Lslash ydieresis -37 KPX N A -30 KPX N Aacute -30 KPX N Abreve -30 KPX N Acircumflex -30 KPX N Adieresis -30 KPX N Agrave -30 KPX N Amacron -30 KPX N Aogonek -30 KPX N Aring -30 KPX N Atilde -30 KPX Nacute A -30 KPX Nacute Aacute -30 KPX Nacute Abreve -30 KPX Nacute Acircumflex -30 KPX Nacute Adieresis -30 KPX Nacute Agrave -30 KPX Nacute Amacron -30 KPX Nacute Aogonek -30 KPX Nacute Aring -30 KPX Nacute Atilde -30 KPX Ncaron A -30 KPX Ncaron Aacute -30 KPX Ncaron Abreve -30 KPX Ncaron Acircumflex -30 KPX Ncaron Adieresis -30 KPX Ncaron Agrave -30 KPX Ncaron Amacron -30 KPX Ncaron Aogonek -30 KPX Ncaron Aring -30 KPX Ncaron Atilde -30 KPX Ncommaaccent A -30 KPX Ncommaaccent Aacute -30 KPX Ncommaaccent Abreve -30 KPX Ncommaaccent Acircumflex -30 KPX Ncommaaccent Adieresis -30 KPX Ncommaaccent Agrave -30 KPX Ncommaaccent Amacron -30 KPX Ncommaaccent Aogonek -30 KPX Ncommaaccent Aring -30 KPX Ncommaaccent Atilde -30 KPX Ntilde A -30 KPX Ntilde Aacute -30 KPX Ntilde Abreve -30 KPX Ntilde Acircumflex -30 KPX Ntilde Adieresis -30 KPX Ntilde Agrave -30 KPX Ntilde Amacron -30 KPX Ntilde Aogonek -30 KPX Ntilde Aring -30 KPX Ntilde Atilde -30 KPX O A -40 KPX O Aacute -40 KPX O Abreve -40 KPX O Acircumflex -40 KPX O Adieresis -40 KPX O Agrave -40 KPX O Amacron -40 KPX O Aogonek -40 KPX O Aring -40 KPX O Atilde -40 KPX O T -40 KPX O Tcaron -40 KPX O Tcommaaccent -40 KPX O V -50 KPX O W -50 KPX O X -40 KPX O Y -50 KPX O Yacute -50 KPX O Ydieresis -50 KPX Oacute A -40 KPX Oacute Aacute -40 KPX Oacute Abreve -40 KPX Oacute Acircumflex -40 KPX Oacute Adieresis -40 KPX Oacute Agrave -40 KPX Oacute Amacron -40 KPX Oacute Aogonek -40 KPX Oacute Aring -40 KPX Oacute Atilde -40 KPX Oacute T -40 KPX Oacute Tcaron -40 KPX Oacute Tcommaaccent -40 KPX Oacute V -50 KPX Oacute W -50 KPX Oacute X -40 KPX Oacute Y -50 KPX Oacute Yacute -50 KPX Oacute Ydieresis -50 KPX Ocircumflex A -40 KPX Ocircumflex Aacute -40 KPX Ocircumflex Abreve -40 KPX Ocircumflex Acircumflex -40 KPX Ocircumflex Adieresis -40 KPX Ocircumflex Agrave -40 KPX Ocircumflex Amacron -40 KPX Ocircumflex Aogonek -40 KPX Ocircumflex Aring -40 KPX Ocircumflex Atilde -40 KPX Ocircumflex T -40 KPX Ocircumflex Tcaron -40 KPX Ocircumflex Tcommaaccent -40 KPX Ocircumflex V -50 KPX Ocircumflex W -50 KPX Ocircumflex X -40 KPX Ocircumflex Y -50 KPX Ocircumflex Yacute -50 KPX Ocircumflex Ydieresis -50 KPX Odieresis A -40 KPX Odieresis Aacute -40 KPX Odieresis Abreve -40 KPX Odieresis Acircumflex -40 KPX Odieresis Adieresis -40 KPX Odieresis Agrave -40 KPX Odieresis Amacron -40 KPX Odieresis Aogonek -40 KPX Odieresis Aring -40 KPX Odieresis Atilde -40 KPX Odieresis T -40 KPX Odieresis Tcaron -40 KPX Odieresis Tcommaaccent -40 KPX Odieresis V -50 KPX Odieresis W -50 KPX Odieresis X -40 KPX Odieresis Y -50 KPX Odieresis Yacute -50 KPX Odieresis Ydieresis -50 KPX Ograve A -40 KPX Ograve Aacute -40 KPX Ograve Abreve -40 KPX Ograve Acircumflex -40 KPX Ograve Adieresis -40 KPX Ograve Agrave -40 KPX Ograve Amacron -40 KPX Ograve Aogonek -40 KPX Ograve Aring -40 KPX Ograve Atilde -40 KPX Ograve T -40 KPX Ograve Tcaron -40 KPX Ograve Tcommaaccent -40 KPX Ograve V -50 KPX Ograve W -50 KPX Ograve X -40 KPX Ograve Y -50 KPX Ograve Yacute -50 KPX Ograve Ydieresis -50 KPX Ohungarumlaut A -40 KPX Ohungarumlaut Aacute -40 KPX Ohungarumlaut Abreve -40 KPX Ohungarumlaut Acircumflex -40 KPX Ohungarumlaut Adieresis -40 KPX Ohungarumlaut Agrave -40 KPX Ohungarumlaut Amacron -40 KPX Ohungarumlaut Aogonek -40 KPX Ohungarumlaut Aring -40 KPX Ohungarumlaut Atilde -40 KPX Ohungarumlaut T -40 KPX Ohungarumlaut Tcaron -40 KPX Ohungarumlaut Tcommaaccent -40 KPX Ohungarumlaut V -50 KPX Ohungarumlaut W -50 KPX Ohungarumlaut X -40 KPX Ohungarumlaut Y -50 KPX Ohungarumlaut Yacute -50 KPX Ohungarumlaut Ydieresis -50 KPX Omacron A -40 KPX Omacron Aacute -40 KPX Omacron Abreve -40 KPX Omacron Acircumflex -40 KPX Omacron Adieresis -40 KPX Omacron Agrave -40 KPX Omacron Amacron -40 KPX Omacron Aogonek -40 KPX Omacron Aring -40 KPX Omacron Atilde -40 KPX Omacron T -40 KPX Omacron Tcaron -40 KPX Omacron Tcommaaccent -40 KPX Omacron V -50 KPX Omacron W -50 KPX Omacron X -40 KPX Omacron Y -50 KPX Omacron Yacute -50 KPX Omacron Ydieresis -50 KPX Oslash A -40 KPX Oslash Aacute -40 KPX Oslash Abreve -40 KPX Oslash Acircumflex -40 KPX Oslash Adieresis -40 KPX Oslash Agrave -40 KPX Oslash Amacron -40 KPX Oslash Aogonek -40 KPX Oslash Aring -40 KPX Oslash Atilde -40 KPX Oslash T -40 KPX Oslash Tcaron -40 KPX Oslash Tcommaaccent -40 KPX Oslash V -50 KPX Oslash W -50 KPX Oslash X -40 KPX Oslash Y -50 KPX Oslash Yacute -50 KPX Oslash Ydieresis -50 KPX Otilde A -40 KPX Otilde Aacute -40 KPX Otilde Abreve -40 KPX Otilde Acircumflex -40 KPX Otilde Adieresis -40 KPX Otilde Agrave -40 KPX Otilde Amacron -40 KPX Otilde Aogonek -40 KPX Otilde Aring -40 KPX Otilde Atilde -40 KPX Otilde T -40 KPX Otilde Tcaron -40 KPX Otilde Tcommaaccent -40 KPX Otilde V -50 KPX Otilde W -50 KPX Otilde X -40 KPX Otilde Y -50 KPX Otilde Yacute -50 KPX Otilde Ydieresis -50 KPX P A -85 KPX P Aacute -85 KPX P Abreve -85 KPX P Acircumflex -85 KPX P Adieresis -85 KPX P Agrave -85 KPX P Amacron -85 KPX P Aogonek -85 KPX P Aring -85 KPX P Atilde -85 KPX P a -40 KPX P aacute -40 KPX P abreve -40 KPX P acircumflex -40 KPX P adieresis -40 KPX P agrave -40 KPX P amacron -40 KPX P aogonek -40 KPX P aring -40 KPX P atilde -40 KPX P comma -129 KPX P e -50 KPX P eacute -50 KPX P ecaron -50 KPX P ecircumflex -50 KPX P edieresis -50 KPX P edotaccent -50 KPX P egrave -50 KPX P emacron -50 KPX P eogonek -50 KPX P o -55 KPX P oacute -55 KPX P ocircumflex -55 KPX P odieresis -55 KPX P ograve -55 KPX P ohungarumlaut -55 KPX P omacron -55 KPX P oslash -55 KPX P otilde -55 KPX P period -129 KPX Q U -10 KPX Q Uacute -10 KPX Q Ucircumflex -10 KPX Q Udieresis -10 KPX Q Ugrave -10 KPX Q Uhungarumlaut -10 KPX Q Umacron -10 KPX Q Uogonek -10 KPX Q Uring -10 KPX R O -40 KPX R Oacute -40 KPX R Ocircumflex -40 KPX R Odieresis -40 KPX R Ograve -40 KPX R Ohungarumlaut -40 KPX R Omacron -40 KPX R Oslash -40 KPX R Otilde -40 KPX R T -30 KPX R Tcaron -30 KPX R Tcommaaccent -30 KPX R U -40 KPX R Uacute -40 KPX R Ucircumflex -40 KPX R Udieresis -40 KPX R Ugrave -40 KPX R Uhungarumlaut -40 KPX R Umacron -40 KPX R Uogonek -40 KPX R Uring -40 KPX R V -18 KPX R W -18 KPX R Y -18 KPX R Yacute -18 KPX R Ydieresis -18 KPX Racute O -40 KPX Racute Oacute -40 KPX Racute Ocircumflex -40 KPX Racute Odieresis -40 KPX Racute Ograve -40 KPX Racute Ohungarumlaut -40 KPX Racute Omacron -40 KPX Racute Oslash -40 KPX Racute Otilde -40 KPX Racute T -30 KPX Racute Tcaron -30 KPX Racute Tcommaaccent -30 KPX Racute U -40 KPX Racute Uacute -40 KPX Racute Ucircumflex -40 KPX Racute Udieresis -40 KPX Racute Ugrave -40 KPX Racute Uhungarumlaut -40 KPX Racute Umacron -40 KPX Racute Uogonek -40 KPX Racute Uring -40 KPX Racute V -18 KPX Racute W -18 KPX Racute Y -18 KPX Racute Yacute -18 KPX Racute Ydieresis -18 KPX Rcaron O -40 KPX Rcaron Oacute -40 KPX Rcaron Ocircumflex -40 KPX Rcaron Odieresis -40 KPX Rcaron Ograve -40 KPX Rcaron Ohungarumlaut -40 KPX Rcaron Omacron -40 KPX Rcaron Oslash -40 KPX Rcaron Otilde -40 KPX Rcaron T -30 KPX Rcaron Tcaron -30 KPX Rcaron Tcommaaccent -30 KPX Rcaron U -40 KPX Rcaron Uacute -40 KPX Rcaron Ucircumflex -40 KPX Rcaron Udieresis -40 KPX Rcaron Ugrave -40 KPX Rcaron Uhungarumlaut -40 KPX Rcaron Umacron -40 KPX Rcaron Uogonek -40 KPX Rcaron Uring -40 KPX Rcaron V -18 KPX Rcaron W -18 KPX Rcaron Y -18 KPX Rcaron Yacute -18 KPX Rcaron Ydieresis -18 KPX Rcommaaccent O -40 KPX Rcommaaccent Oacute -40 KPX Rcommaaccent Ocircumflex -40 KPX Rcommaaccent Odieresis -40 KPX Rcommaaccent Ograve -40 KPX Rcommaaccent Ohungarumlaut -40 KPX Rcommaaccent Omacron -40 KPX Rcommaaccent Oslash -40 KPX Rcommaaccent Otilde -40 KPX Rcommaaccent T -30 KPX Rcommaaccent Tcaron -30 KPX Rcommaaccent Tcommaaccent -30 KPX Rcommaaccent U -40 KPX Rcommaaccent Uacute -40 KPX Rcommaaccent Ucircumflex -40 KPX Rcommaaccent Udieresis -40 KPX Rcommaaccent Ugrave -40 KPX Rcommaaccent Uhungarumlaut -40 KPX Rcommaaccent Umacron -40 KPX Rcommaaccent Uogonek -40 KPX Rcommaaccent Uring -40 KPX Rcommaaccent V -18 KPX Rcommaaccent W -18 KPX Rcommaaccent Y -18 KPX Rcommaaccent Yacute -18 KPX Rcommaaccent Ydieresis -18 KPX T A -55 KPX T Aacute -55 KPX T Abreve -55 KPX T Acircumflex -55 KPX T Adieresis -55 KPX T Agrave -55 KPX T Amacron -55 KPX T Aogonek -55 KPX T Aring -55 KPX T Atilde -55 KPX T O -18 KPX T Oacute -18 KPX T Ocircumflex -18 KPX T Odieresis -18 KPX T Ograve -18 KPX T Ohungarumlaut -18 KPX T Omacron -18 KPX T Oslash -18 KPX T Otilde -18 KPX T a -92 KPX T aacute -92 KPX T abreve -92 KPX T acircumflex -92 KPX T adieresis -92 KPX T agrave -92 KPX T amacron -92 KPX T aogonek -92 KPX T aring -92 KPX T atilde -92 KPX T colon -74 KPX T comma -92 KPX T e -92 KPX T eacute -92 KPX T ecaron -92 KPX T ecircumflex -92 KPX T edieresis -52 KPX T edotaccent -92 KPX T egrave -52 KPX T emacron -52 KPX T eogonek -92 KPX T hyphen -92 KPX T i -37 KPX T iacute -37 KPX T iogonek -37 KPX T o -95 KPX T oacute -95 KPX T ocircumflex -95 KPX T odieresis -95 KPX T ograve -95 KPX T ohungarumlaut -95 KPX T omacron -95 KPX T oslash -95 KPX T otilde -95 KPX T period -92 KPX T r -37 KPX T racute -37 KPX T rcaron -37 KPX T rcommaaccent -37 KPX T semicolon -74 KPX T u -37 KPX T uacute -37 KPX T ucircumflex -37 KPX T udieresis -37 KPX T ugrave -37 KPX T uhungarumlaut -37 KPX T umacron -37 KPX T uogonek -37 KPX T uring -37 KPX T w -37 KPX T y -37 KPX T yacute -37 KPX T ydieresis -37 KPX Tcaron A -55 KPX Tcaron Aacute -55 KPX Tcaron Abreve -55 KPX Tcaron Acircumflex -55 KPX Tcaron Adieresis -55 KPX Tcaron Agrave -55 KPX Tcaron Amacron -55 KPX Tcaron Aogonek -55 KPX Tcaron Aring -55 KPX Tcaron Atilde -55 KPX Tcaron O -18 KPX Tcaron Oacute -18 KPX Tcaron Ocircumflex -18 KPX Tcaron Odieresis -18 KPX Tcaron Ograve -18 KPX Tcaron Ohungarumlaut -18 KPX Tcaron Omacron -18 KPX Tcaron Oslash -18 KPX Tcaron Otilde -18 KPX Tcaron a -92 KPX Tcaron aacute -92 KPX Tcaron abreve -92 KPX Tcaron acircumflex -92 KPX Tcaron adieresis -92 KPX Tcaron agrave -92 KPX Tcaron amacron -92 KPX Tcaron aogonek -92 KPX Tcaron aring -92 KPX Tcaron atilde -92 KPX Tcaron colon -74 KPX Tcaron comma -92 KPX Tcaron e -92 KPX Tcaron eacute -92 KPX Tcaron ecaron -92 KPX Tcaron ecircumflex -92 KPX Tcaron edieresis -52 KPX Tcaron edotaccent -92 KPX Tcaron egrave -52 KPX Tcaron emacron -52 KPX Tcaron eogonek -92 KPX Tcaron hyphen -92 KPX Tcaron i -37 KPX Tcaron iacute -37 KPX Tcaron iogonek -37 KPX Tcaron o -95 KPX Tcaron oacute -95 KPX Tcaron ocircumflex -95 KPX Tcaron odieresis -95 KPX Tcaron ograve -95 KPX Tcaron ohungarumlaut -95 KPX Tcaron omacron -95 KPX Tcaron oslash -95 KPX Tcaron otilde -95 KPX Tcaron period -92 KPX Tcaron r -37 KPX Tcaron racute -37 KPX Tcaron rcaron -37 KPX Tcaron rcommaaccent -37 KPX Tcaron semicolon -74 KPX Tcaron u -37 KPX Tcaron uacute -37 KPX Tcaron ucircumflex -37 KPX Tcaron udieresis -37 KPX Tcaron ugrave -37 KPX Tcaron uhungarumlaut -37 KPX Tcaron umacron -37 KPX Tcaron uogonek -37 KPX Tcaron uring -37 KPX Tcaron w -37 KPX Tcaron y -37 KPX Tcaron yacute -37 KPX Tcaron ydieresis -37 KPX Tcommaaccent A -55 KPX Tcommaaccent Aacute -55 KPX Tcommaaccent Abreve -55 KPX Tcommaaccent Acircumflex -55 KPX Tcommaaccent Adieresis -55 KPX Tcommaaccent Agrave -55 KPX Tcommaaccent Amacron -55 KPX Tcommaaccent Aogonek -55 KPX Tcommaaccent Aring -55 KPX Tcommaaccent Atilde -55 KPX Tcommaaccent O -18 KPX Tcommaaccent Oacute -18 KPX Tcommaaccent Ocircumflex -18 KPX Tcommaaccent Odieresis -18 KPX Tcommaaccent Ograve -18 KPX Tcommaaccent Ohungarumlaut -18 KPX Tcommaaccent Omacron -18 KPX Tcommaaccent Oslash -18 KPX Tcommaaccent Otilde -18 KPX Tcommaaccent a -92 KPX Tcommaaccent aacute -92 KPX Tcommaaccent abreve -92 KPX Tcommaaccent acircumflex -92 KPX Tcommaaccent adieresis -92 KPX Tcommaaccent agrave -92 KPX Tcommaaccent amacron -92 KPX Tcommaaccent aogonek -92 KPX Tcommaaccent aring -92 KPX Tcommaaccent atilde -92 KPX Tcommaaccent colon -74 KPX Tcommaaccent comma -92 KPX Tcommaaccent e -92 KPX Tcommaaccent eacute -92 KPX Tcommaaccent ecaron -92 KPX Tcommaaccent ecircumflex -92 KPX Tcommaaccent edieresis -52 KPX Tcommaaccent edotaccent -92 KPX Tcommaaccent egrave -52 KPX Tcommaaccent emacron -52 KPX Tcommaaccent eogonek -92 KPX Tcommaaccent hyphen -92 KPX Tcommaaccent i -37 KPX Tcommaaccent iacute -37 KPX Tcommaaccent iogonek -37 KPX Tcommaaccent o -95 KPX Tcommaaccent oacute -95 KPX Tcommaaccent ocircumflex -95 KPX Tcommaaccent odieresis -95 KPX Tcommaaccent ograve -95 KPX Tcommaaccent ohungarumlaut -95 KPX Tcommaaccent omacron -95 KPX Tcommaaccent oslash -95 KPX Tcommaaccent otilde -95 KPX Tcommaaccent period -92 KPX Tcommaaccent r -37 KPX Tcommaaccent racute -37 KPX Tcommaaccent rcaron -37 KPX Tcommaaccent rcommaaccent -37 KPX Tcommaaccent semicolon -74 KPX Tcommaaccent u -37 KPX Tcommaaccent uacute -37 KPX Tcommaaccent ucircumflex -37 KPX Tcommaaccent udieresis -37 KPX Tcommaaccent ugrave -37 KPX Tcommaaccent uhungarumlaut -37 KPX Tcommaaccent umacron -37 KPX Tcommaaccent uogonek -37 KPX Tcommaaccent uring -37 KPX Tcommaaccent w -37 KPX Tcommaaccent y -37 KPX Tcommaaccent yacute -37 KPX Tcommaaccent ydieresis -37 KPX U A -45 KPX U Aacute -45 KPX U Abreve -45 KPX U Acircumflex -45 KPX U Adieresis -45 KPX U Agrave -45 KPX U Amacron -45 KPX U Aogonek -45 KPX U Aring -45 KPX U Atilde -45 KPX Uacute A -45 KPX Uacute Aacute -45 KPX Uacute Abreve -45 KPX Uacute Acircumflex -45 KPX Uacute Adieresis -45 KPX Uacute Agrave -45 KPX Uacute Amacron -45 KPX Uacute Aogonek -45 KPX Uacute Aring -45 KPX Uacute Atilde -45 KPX Ucircumflex A -45 KPX Ucircumflex Aacute -45 KPX Ucircumflex Abreve -45 KPX Ucircumflex Acircumflex -45 KPX Ucircumflex Adieresis -45 KPX Ucircumflex Agrave -45 KPX Ucircumflex Amacron -45 KPX Ucircumflex Aogonek -45 KPX Ucircumflex Aring -45 KPX Ucircumflex Atilde -45 KPX Udieresis A -45 KPX Udieresis Aacute -45 KPX Udieresis Abreve -45 KPX Udieresis Acircumflex -45 KPX Udieresis Adieresis -45 KPX Udieresis Agrave -45 KPX Udieresis Amacron -45 KPX Udieresis Aogonek -45 KPX Udieresis Aring -45 KPX Udieresis Atilde -45 KPX Ugrave A -45 KPX Ugrave Aacute -45 KPX Ugrave Abreve -45 KPX Ugrave Acircumflex -45 KPX Ugrave Adieresis -45 KPX Ugrave Agrave -45 KPX Ugrave Amacron -45 KPX Ugrave Aogonek -45 KPX Ugrave Aring -45 KPX Ugrave Atilde -45 KPX Uhungarumlaut A -45 KPX Uhungarumlaut Aacute -45 KPX Uhungarumlaut Abreve -45 KPX Uhungarumlaut Acircumflex -45 KPX Uhungarumlaut Adieresis -45 KPX Uhungarumlaut Agrave -45 KPX Uhungarumlaut Amacron -45 KPX Uhungarumlaut Aogonek -45 KPX Uhungarumlaut Aring -45 KPX Uhungarumlaut Atilde -45 KPX Umacron A -45 KPX Umacron Aacute -45 KPX Umacron Abreve -45 KPX Umacron Acircumflex -45 KPX Umacron Adieresis -45 KPX Umacron Agrave -45 KPX Umacron Amacron -45 KPX Umacron Aogonek -45 KPX Umacron Aring -45 KPX Umacron Atilde -45 KPX Uogonek A -45 KPX Uogonek Aacute -45 KPX Uogonek Abreve -45 KPX Uogonek Acircumflex -45 KPX Uogonek Adieresis -45 KPX Uogonek Agrave -45 KPX Uogonek Amacron -45 KPX Uogonek Aogonek -45 KPX Uogonek Aring -45 KPX Uogonek Atilde -45 KPX Uring A -45 KPX Uring Aacute -45 KPX Uring Abreve -45 KPX Uring Acircumflex -45 KPX Uring Adieresis -45 KPX Uring Agrave -45 KPX Uring Amacron -45 KPX Uring Aogonek -45 KPX Uring Aring -45 KPX Uring Atilde -45 KPX V A -85 KPX V Aacute -85 KPX V Abreve -85 KPX V Acircumflex -85 KPX V Adieresis -85 KPX V Agrave -85 KPX V Amacron -85 KPX V Aogonek -85 KPX V Aring -85 KPX V Atilde -85 KPX V G -10 KPX V Gbreve -10 KPX V Gcommaaccent -10 KPX V O -30 KPX V Oacute -30 KPX V Ocircumflex -30 KPX V Odieresis -30 KPX V Ograve -30 KPX V Ohungarumlaut -30 KPX V Omacron -30 KPX V Oslash -30 KPX V Otilde -30 KPX V a -111 KPX V aacute -111 KPX V abreve -111 KPX V acircumflex -111 KPX V adieresis -111 KPX V agrave -111 KPX V amacron -111 KPX V aogonek -111 KPX V aring -111 KPX V atilde -111 KPX V colon -74 KPX V comma -129 KPX V e -111 KPX V eacute -111 KPX V ecaron -111 KPX V ecircumflex -111 KPX V edieresis -71 KPX V edotaccent -111 KPX V egrave -71 KPX V emacron -71 KPX V eogonek -111 KPX V hyphen -70 KPX V i -55 KPX V iacute -55 KPX V iogonek -55 KPX V o -111 KPX V oacute -111 KPX V ocircumflex -111 KPX V odieresis -111 KPX V ograve -111 KPX V ohungarumlaut -111 KPX V omacron -111 KPX V oslash -111 KPX V otilde -111 KPX V period -129 KPX V semicolon -74 KPX V u -55 KPX V uacute -55 KPX V ucircumflex -55 KPX V udieresis -55 KPX V ugrave -55 KPX V uhungarumlaut -55 KPX V umacron -55 KPX V uogonek -55 KPX V uring -55 KPX W A -74 KPX W Aacute -74 KPX W Abreve -74 KPX W Acircumflex -74 KPX W Adieresis -74 KPX W Agrave -74 KPX W Amacron -74 KPX W Aogonek -74 KPX W Aring -74 KPX W Atilde -74 KPX W O -15 KPX W Oacute -15 KPX W Ocircumflex -15 KPX W Odieresis -15 KPX W Ograve -15 KPX W Ohungarumlaut -15 KPX W Omacron -15 KPX W Oslash -15 KPX W Otilde -15 KPX W a -85 KPX W aacute -85 KPX W abreve -85 KPX W acircumflex -85 KPX W adieresis -85 KPX W agrave -85 KPX W amacron -85 KPX W aogonek -85 KPX W aring -85 KPX W atilde -85 KPX W colon -55 KPX W comma -74 KPX W e -90 KPX W eacute -90 KPX W ecaron -90 KPX W ecircumflex -90 KPX W edieresis -50 KPX W edotaccent -90 KPX W egrave -50 KPX W emacron -50 KPX W eogonek -90 KPX W hyphen -50 KPX W i -37 KPX W iacute -37 KPX W iogonek -37 KPX W o -80 KPX W oacute -80 KPX W ocircumflex -80 KPX W odieresis -80 KPX W ograve -80 KPX W ohungarumlaut -80 KPX W omacron -80 KPX W oslash -80 KPX W otilde -80 KPX W period -74 KPX W semicolon -55 KPX W u -55 KPX W uacute -55 KPX W ucircumflex -55 KPX W udieresis -55 KPX W ugrave -55 KPX W uhungarumlaut -55 KPX W umacron -55 KPX W uogonek -55 KPX W uring -55 KPX W y -55 KPX W yacute -55 KPX W ydieresis -55 KPX Y A -74 KPX Y Aacute -74 KPX Y Abreve -74 KPX Y Acircumflex -74 KPX Y Adieresis -74 KPX Y Agrave -74 KPX Y Amacron -74 KPX Y Aogonek -74 KPX Y Aring -74 KPX Y Atilde -74 KPX Y O -25 KPX Y Oacute -25 KPX Y Ocircumflex -25 KPX Y Odieresis -25 KPX Y Ograve -25 KPX Y Ohungarumlaut -25 KPX Y Omacron -25 KPX Y Oslash -25 KPX Y Otilde -25 KPX Y a -92 KPX Y aacute -92 KPX Y abreve -92 KPX Y acircumflex -92 KPX Y adieresis -92 KPX Y agrave -92 KPX Y amacron -92 KPX Y aogonek -92 KPX Y aring -92 KPX Y atilde -92 KPX Y colon -92 KPX Y comma -92 KPX Y e -111 KPX Y eacute -111 KPX Y ecaron -111 KPX Y ecircumflex -71 KPX Y edieresis -71 KPX Y edotaccent -111 KPX Y egrave -71 KPX Y emacron -71 KPX Y eogonek -111 KPX Y hyphen -92 KPX Y i -55 KPX Y iacute -55 KPX Y iogonek -55 KPX Y o -111 KPX Y oacute -111 KPX Y ocircumflex -111 KPX Y odieresis -111 KPX Y ograve -111 KPX Y ohungarumlaut -111 KPX Y omacron -111 KPX Y oslash -111 KPX Y otilde -111 KPX Y period -74 KPX Y semicolon -92 KPX Y u -92 KPX Y uacute -92 KPX Y ucircumflex -92 KPX Y udieresis -92 KPX Y ugrave -92 KPX Y uhungarumlaut -92 KPX Y umacron -92 KPX Y uogonek -92 KPX Y uring -92 KPX Yacute A -74 KPX Yacute Aacute -74 KPX Yacute Abreve -74 KPX Yacute Acircumflex -74 KPX Yacute Adieresis -74 KPX Yacute Agrave -74 KPX Yacute Amacron -74 KPX Yacute Aogonek -74 KPX Yacute Aring -74 KPX Yacute Atilde -74 KPX Yacute O -25 KPX Yacute Oacute -25 KPX Yacute Ocircumflex -25 KPX Yacute Odieresis -25 KPX Yacute Ograve -25 KPX Yacute Ohungarumlaut -25 KPX Yacute Omacron -25 KPX Yacute Oslash -25 KPX Yacute Otilde -25 KPX Yacute a -92 KPX Yacute aacute -92 KPX Yacute abreve -92 KPX Yacute acircumflex -92 KPX Yacute adieresis -92 KPX Yacute agrave -92 KPX Yacute amacron -92 KPX Yacute aogonek -92 KPX Yacute aring -92 KPX Yacute atilde -92 KPX Yacute colon -92 KPX Yacute comma -92 KPX Yacute e -111 KPX Yacute eacute -111 KPX Yacute ecaron -111 KPX Yacute ecircumflex -71 KPX Yacute edieresis -71 KPX Yacute edotaccent -111 KPX Yacute egrave -71 KPX Yacute emacron -71 KPX Yacute eogonek -111 KPX Yacute hyphen -92 KPX Yacute i -55 KPX Yacute iacute -55 KPX Yacute iogonek -55 KPX Yacute o -111 KPX Yacute oacute -111 KPX Yacute ocircumflex -111 KPX Yacute odieresis -111 KPX Yacute ograve -111 KPX Yacute ohungarumlaut -111 KPX Yacute omacron -111 KPX Yacute oslash -111 KPX Yacute otilde -111 KPX Yacute period -74 KPX Yacute semicolon -92 KPX Yacute u -92 KPX Yacute uacute -92 KPX Yacute ucircumflex -92 KPX Yacute udieresis -92 KPX Yacute ugrave -92 KPX Yacute uhungarumlaut -92 KPX Yacute umacron -92 KPX Yacute uogonek -92 KPX Yacute uring -92 KPX Ydieresis A -74 KPX Ydieresis Aacute -74 KPX Ydieresis Abreve -74 KPX Ydieresis Acircumflex -74 KPX Ydieresis Adieresis -74 KPX Ydieresis Agrave -74 KPX Ydieresis Amacron -74 KPX Ydieresis Aogonek -74 KPX Ydieresis Aring -74 KPX Ydieresis Atilde -74 KPX Ydieresis O -25 KPX Ydieresis Oacute -25 KPX Ydieresis Ocircumflex -25 KPX Ydieresis Odieresis -25 KPX Ydieresis Ograve -25 KPX Ydieresis Ohungarumlaut -25 KPX Ydieresis Omacron -25 KPX Ydieresis Oslash -25 KPX Ydieresis Otilde -25 KPX Ydieresis a -92 KPX Ydieresis aacute -92 KPX Ydieresis abreve -92 KPX Ydieresis acircumflex -92 KPX Ydieresis adieresis -92 KPX Ydieresis agrave -92 KPX Ydieresis amacron -92 KPX Ydieresis aogonek -92 KPX Ydieresis aring -92 KPX Ydieresis atilde -92 KPX Ydieresis colon -92 KPX Ydieresis comma -92 KPX Ydieresis e -111 KPX Ydieresis eacute -111 KPX Ydieresis ecaron -111 KPX Ydieresis ecircumflex -71 KPX Ydieresis edieresis -71 KPX Ydieresis edotaccent -111 KPX Ydieresis egrave -71 KPX Ydieresis emacron -71 KPX Ydieresis eogonek -111 KPX Ydieresis hyphen -92 KPX Ydieresis i -55 KPX Ydieresis iacute -55 KPX Ydieresis iogonek -55 KPX Ydieresis o -111 KPX Ydieresis oacute -111 KPX Ydieresis ocircumflex -111 KPX Ydieresis odieresis -111 KPX Ydieresis ograve -111 KPX Ydieresis ohungarumlaut -111 KPX Ydieresis omacron -111 KPX Ydieresis oslash -111 KPX Ydieresis otilde -111 KPX Ydieresis period -74 KPX Ydieresis semicolon -92 KPX Ydieresis u -92 KPX Ydieresis uacute -92 KPX Ydieresis ucircumflex -92 KPX Ydieresis udieresis -92 KPX Ydieresis ugrave -92 KPX Ydieresis uhungarumlaut -92 KPX Ydieresis umacron -92 KPX Ydieresis uogonek -92 KPX Ydieresis uring -92 KPX b b -10 KPX b period -40 KPX b u -20 KPX b uacute -20 KPX b ucircumflex -20 KPX b udieresis -20 KPX b ugrave -20 KPX b uhungarumlaut -20 KPX b umacron -20 KPX b uogonek -20 KPX b uring -20 KPX c h -10 KPX c k -10 KPX c kcommaaccent -10 KPX cacute h -10 KPX cacute k -10 KPX cacute kcommaaccent -10 KPX ccaron h -10 KPX ccaron k -10 KPX ccaron kcommaaccent -10 KPX ccedilla h -10 KPX ccedilla k -10 KPX ccedilla kcommaaccent -10 KPX comma quotedblright -95 KPX comma quoteright -95 KPX e b -10 KPX eacute b -10 KPX ecaron b -10 KPX ecircumflex b -10 KPX edieresis b -10 KPX edotaccent b -10 KPX egrave b -10 KPX emacron b -10 KPX eogonek b -10 KPX f comma -10 KPX f dotlessi -30 KPX f e -10 KPX f eacute -10 KPX f edotaccent -10 KPX f eogonek -10 KPX f f -18 KPX f o -10 KPX f oacute -10 KPX f ocircumflex -10 KPX f ograve -10 KPX f ohungarumlaut -10 KPX f oslash -10 KPX f otilde -10 KPX f period -10 KPX f quoteright 55 KPX k e -30 KPX k eacute -30 KPX k ecaron -30 KPX k ecircumflex -30 KPX k edieresis -30 KPX k edotaccent -30 KPX k egrave -30 KPX k emacron -30 KPX k eogonek -30 KPX k o -10 KPX k oacute -10 KPX k ocircumflex -10 KPX k odieresis -10 KPX k ograve -10 KPX k ohungarumlaut -10 KPX k omacron -10 KPX k oslash -10 KPX k otilde -10 KPX kcommaaccent e -30 KPX kcommaaccent eacute -30 KPX kcommaaccent ecaron -30 KPX kcommaaccent ecircumflex -30 KPX kcommaaccent edieresis -30 KPX kcommaaccent edotaccent -30 KPX kcommaaccent egrave -30 KPX kcommaaccent emacron -30 KPX kcommaaccent eogonek -30 KPX kcommaaccent o -10 KPX kcommaaccent oacute -10 KPX kcommaaccent ocircumflex -10 KPX kcommaaccent odieresis -10 KPX kcommaaccent ograve -10 KPX kcommaaccent ohungarumlaut -10 KPX kcommaaccent omacron -10 KPX kcommaaccent oslash -10 KPX kcommaaccent otilde -10 KPX n v -40 KPX nacute v -40 KPX ncaron v -40 KPX ncommaaccent v -40 KPX ntilde v -40 KPX o v -15 KPX o w -25 KPX o x -10 KPX o y -10 KPX o yacute -10 KPX o ydieresis -10 KPX oacute v -15 KPX oacute w -25 KPX oacute x -10 KPX oacute y -10 KPX oacute yacute -10 KPX oacute ydieresis -10 KPX ocircumflex v -15 KPX ocircumflex w -25 KPX ocircumflex x -10 KPX ocircumflex y -10 KPX ocircumflex yacute -10 KPX ocircumflex ydieresis -10 KPX odieresis v -15 KPX odieresis w -25 KPX odieresis x -10 KPX odieresis y -10 KPX odieresis yacute -10 KPX odieresis ydieresis -10 KPX ograve v -15 KPX ograve w -25 KPX ograve x -10 KPX ograve y -10 KPX ograve yacute -10 KPX ograve ydieresis -10 KPX ohungarumlaut v -15 KPX ohungarumlaut w -25 KPX ohungarumlaut x -10 KPX ohungarumlaut y -10 KPX ohungarumlaut yacute -10 KPX ohungarumlaut ydieresis -10 KPX omacron v -15 KPX omacron w -25 KPX omacron x -10 KPX omacron y -10 KPX omacron yacute -10 KPX omacron ydieresis -10 KPX oslash v -15 KPX oslash w -25 KPX oslash x -10 KPX oslash y -10 KPX oslash yacute -10 KPX oslash ydieresis -10 KPX otilde v -15 KPX otilde w -25 KPX otilde x -10 KPX otilde y -10 KPX otilde yacute -10 KPX otilde ydieresis -10 KPX period quotedblright -95 KPX period quoteright -95 KPX quoteleft quoteleft -74 KPX quoteright d -15 KPX quoteright dcroat -15 KPX quoteright quoteright -74 KPX quoteright r -15 KPX quoteright racute -15 KPX quoteright rcaron -15 KPX quoteright rcommaaccent -15 KPX quoteright s -74 KPX quoteright sacute -74 KPX quoteright scaron -74 KPX quoteright scedilla -74 KPX quoteright scommaaccent -74 KPX quoteright space -74 KPX quoteright t -37 KPX quoteright tcommaaccent -37 KPX quoteright v -15 KPX r comma -65 KPX r period -65 KPX racute comma -65 KPX racute period -65 KPX rcaron comma -65 KPX rcaron period -65 KPX rcommaaccent comma -65 KPX rcommaaccent period -65 KPX space A -37 KPX space Aacute -37 KPX space Abreve -37 KPX space Acircumflex -37 KPX space Adieresis -37 KPX space Agrave -37 KPX space Amacron -37 KPX space Aogonek -37 KPX space Aring -37 KPX space Atilde -37 KPX space V -70 KPX space W -70 KPX space Y -70 KPX space Yacute -70 KPX space Ydieresis -70 KPX v comma -37 KPX v e -15 KPX v eacute -15 KPX v ecaron -15 KPX v ecircumflex -15 KPX v edieresis -15 KPX v edotaccent -15 KPX v egrave -15 KPX v emacron -15 KPX v eogonek -15 KPX v o -15 KPX v oacute -15 KPX v ocircumflex -15 KPX v odieresis -15 KPX v ograve -15 KPX v ohungarumlaut -15 KPX v omacron -15 KPX v oslash -15 KPX v otilde -15 KPX v period -37 KPX w a -10 KPX w aacute -10 KPX w abreve -10 KPX w acircumflex -10 KPX w adieresis -10 KPX w agrave -10 KPX w amacron -10 KPX w aogonek -10 KPX w aring -10 KPX w atilde -10 KPX w comma -37 KPX w e -10 KPX w eacute -10 KPX w ecaron -10 KPX w ecircumflex -10 KPX w edieresis -10 KPX w edotaccent -10 KPX w egrave -10 KPX w emacron -10 KPX w eogonek -10 KPX w o -15 KPX w oacute -15 KPX w ocircumflex -15 KPX w odieresis -15 KPX w ograve -15 KPX w ohungarumlaut -15 KPX w omacron -15 KPX w oslash -15 KPX w otilde -15 KPX w period -37 KPX x e -10 KPX x eacute -10 KPX x ecaron -10 KPX x ecircumflex -10 KPX x edieresis -10 KPX x edotaccent -10 KPX x egrave -10 KPX x emacron -10 KPX x eogonek -10 KPX y comma -37 KPX y period -37 KPX yacute comma -37 KPX yacute period -37 KPX ydieresis comma -37 KPX ydieresis period -37 EndKernPairs EndKernData EndFontMetrics ruby-prawn-1.0.0~rc2.orig/data/fonts/Helvetica-Bold.afm0000644000000000000000000020722512114176157021406 0ustar rootrootStartFontMetrics 4.1 Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved. Comment Creation Date: Thu May 1 12:43:52 1997 Comment UniqueID 43052 Comment VMusage 37169 48194 FontName Helvetica-Bold FullName Helvetica Bold FamilyName Helvetica Weight Bold ItalicAngle 0 IsFixedPitch false CharacterSet ExtendedRoman FontBBox -170 -228 1003 962 UnderlinePosition -100 UnderlineThickness 50 Version 002.000 Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. EncodingScheme AdobeStandardEncoding CapHeight 718 XHeight 532 Ascender 718 Descender -207 StdHW 118 StdVW 140 StartCharMetrics 315 C 32 ; WX 278 ; N space ; B 0 0 0 0 ; C 33 ; WX 333 ; N exclam ; B 90 0 244 718 ; C 34 ; WX 474 ; N quotedbl ; B 98 447 376 718 ; C 35 ; WX 556 ; N numbersign ; B 18 0 538 698 ; C 36 ; WX 556 ; N dollar ; B 30 -115 523 775 ; C 37 ; WX 889 ; N percent ; B 28 -19 861 710 ; C 38 ; WX 722 ; N ampersand ; B 54 -19 701 718 ; C 39 ; WX 278 ; N quoteright ; B 69 445 209 718 ; C 40 ; WX 333 ; N parenleft ; B 35 -208 314 734 ; C 41 ; WX 333 ; N parenright ; B 19 -208 298 734 ; C 42 ; WX 389 ; N asterisk ; B 27 387 362 718 ; C 43 ; WX 584 ; N plus ; B 40 0 544 506 ; C 44 ; WX 278 ; N comma ; B 64 -168 214 146 ; C 45 ; WX 333 ; N hyphen ; B 27 215 306 345 ; C 46 ; WX 278 ; N period ; B 64 0 214 146 ; C 47 ; WX 278 ; N slash ; B -33 -19 311 737 ; C 48 ; WX 556 ; N zero ; B 32 -19 524 710 ; C 49 ; WX 556 ; N one ; B 69 0 378 710 ; C 50 ; WX 556 ; N two ; B 26 0 511 710 ; C 51 ; WX 556 ; N three ; B 27 -19 516 710 ; C 52 ; WX 556 ; N four ; B 27 0 526 710 ; C 53 ; WX 556 ; N five ; B 27 -19 516 698 ; C 54 ; WX 556 ; N six ; B 31 -19 520 710 ; C 55 ; WX 556 ; N seven ; B 25 0 528 698 ; C 56 ; WX 556 ; N eight ; B 32 -19 524 710 ; C 57 ; WX 556 ; N nine ; B 30 -19 522 710 ; C 58 ; WX 333 ; N colon ; B 92 0 242 512 ; C 59 ; WX 333 ; N semicolon ; B 92 -168 242 512 ; C 60 ; WX 584 ; N less ; B 38 -8 546 514 ; C 61 ; WX 584 ; N equal ; B 40 87 544 419 ; C 62 ; WX 584 ; N greater ; B 38 -8 546 514 ; C 63 ; WX 611 ; N question ; B 60 0 556 727 ; C 64 ; WX 975 ; N at ; B 118 -19 856 737 ; C 65 ; WX 722 ; N A ; B 20 0 702 718 ; C 66 ; WX 722 ; N B ; B 76 0 669 718 ; C 67 ; WX 722 ; N C ; B 44 -19 684 737 ; C 68 ; WX 722 ; N D ; B 76 0 685 718 ; C 69 ; WX 667 ; N E ; B 76 0 621 718 ; C 70 ; WX 611 ; N F ; B 76 0 587 718 ; C 71 ; WX 778 ; N G ; B 44 -19 713 737 ; C 72 ; WX 722 ; N H ; B 71 0 651 718 ; C 73 ; WX 278 ; N I ; B 64 0 214 718 ; C 74 ; WX 556 ; N J ; B 22 -18 484 718 ; C 75 ; WX 722 ; N K ; B 87 0 722 718 ; C 76 ; WX 611 ; N L ; B 76 0 583 718 ; C 77 ; WX 833 ; N M ; B 69 0 765 718 ; C 78 ; WX 722 ; N N ; B 69 0 654 718 ; C 79 ; WX 778 ; N O ; B 44 -19 734 737 ; C 80 ; WX 667 ; N P ; B 76 0 627 718 ; C 81 ; WX 778 ; N Q ; B 44 -52 737 737 ; C 82 ; WX 722 ; N R ; B 76 0 677 718 ; C 83 ; WX 667 ; N S ; B 39 -19 629 737 ; C 84 ; WX 611 ; N T ; B 14 0 598 718 ; C 85 ; WX 722 ; N U ; B 72 -19 651 718 ; C 86 ; WX 667 ; N V ; B 19 0 648 718 ; C 87 ; WX 944 ; N W ; B 16 0 929 718 ; C 88 ; WX 667 ; N X ; B 14 0 653 718 ; C 89 ; WX 667 ; N Y ; B 15 0 653 718 ; C 90 ; WX 611 ; N Z ; B 25 0 586 718 ; C 91 ; WX 333 ; N bracketleft ; B 63 -196 309 722 ; C 92 ; WX 278 ; N backslash ; B -33 -19 311 737 ; C 93 ; WX 333 ; N bracketright ; B 24 -196 270 722 ; C 94 ; WX 584 ; N asciicircum ; B 62 323 522 698 ; C 95 ; WX 556 ; N underscore ; B 0 -125 556 -75 ; C 96 ; WX 278 ; N quoteleft ; B 69 454 209 727 ; C 97 ; WX 556 ; N a ; B 29 -14 527 546 ; C 98 ; WX 611 ; N b ; B 61 -14 578 718 ; C 99 ; WX 556 ; N c ; B 34 -14 524 546 ; C 100 ; WX 611 ; N d ; B 34 -14 551 718 ; C 101 ; WX 556 ; N e ; B 23 -14 528 546 ; C 102 ; WX 333 ; N f ; B 10 0 318 727 ; L i fi ; L l fl ; C 103 ; WX 611 ; N g ; B 40 -217 553 546 ; C 104 ; WX 611 ; N h ; B 65 0 546 718 ; C 105 ; WX 278 ; N i ; B 69 0 209 725 ; C 106 ; WX 278 ; N j ; B 3 -214 209 725 ; C 107 ; WX 556 ; N k ; B 69 0 562 718 ; C 108 ; WX 278 ; N l ; B 69 0 209 718 ; C 109 ; WX 889 ; N m ; B 64 0 826 546 ; C 110 ; WX 611 ; N n ; B 65 0 546 546 ; C 111 ; WX 611 ; N o ; B 34 -14 578 546 ; C 112 ; WX 611 ; N p ; B 62 -207 578 546 ; C 113 ; WX 611 ; N q ; B 34 -207 552 546 ; C 114 ; WX 389 ; N r ; B 64 0 373 546 ; C 115 ; WX 556 ; N s ; B 30 -14 519 546 ; C 116 ; WX 333 ; N t ; B 10 -6 309 676 ; C 117 ; WX 611 ; N u ; B 66 -14 545 532 ; C 118 ; WX 556 ; N v ; B 13 0 543 532 ; C 119 ; WX 778 ; N w ; B 10 0 769 532 ; C 120 ; WX 556 ; N x ; B 15 0 541 532 ; C 121 ; WX 556 ; N y ; B 10 -214 539 532 ; C 122 ; WX 500 ; N z ; B 20 0 480 532 ; C 123 ; WX 389 ; N braceleft ; B 48 -196 365 722 ; C 124 ; WX 280 ; N bar ; B 84 -225 196 775 ; C 125 ; WX 389 ; N braceright ; B 24 -196 341 722 ; C 126 ; WX 584 ; N asciitilde ; B 61 163 523 343 ; C 161 ; WX 333 ; N exclamdown ; B 90 -186 244 532 ; C 162 ; WX 556 ; N cent ; B 34 -118 524 628 ; C 163 ; WX 556 ; N sterling ; B 28 -16 541 718 ; C 164 ; WX 167 ; N fraction ; B -170 -19 336 710 ; C 165 ; WX 556 ; N yen ; B -9 0 565 698 ; C 166 ; WX 556 ; N florin ; B -10 -210 516 737 ; C 167 ; WX 556 ; N section ; B 34 -184 522 727 ; C 168 ; WX 556 ; N currency ; B -3 76 559 636 ; C 169 ; WX 238 ; N quotesingle ; B 70 447 168 718 ; C 170 ; WX 500 ; N quotedblleft ; B 64 454 436 727 ; C 171 ; WX 556 ; N guillemotleft ; B 88 76 468 484 ; C 172 ; WX 333 ; N guilsinglleft ; B 83 76 250 484 ; C 173 ; WX 333 ; N guilsinglright ; B 83 76 250 484 ; C 174 ; WX 611 ; N fi ; B 10 0 542 727 ; C 175 ; WX 611 ; N fl ; B 10 0 542 727 ; C 177 ; WX 556 ; N endash ; B 0 227 556 333 ; C 178 ; WX 556 ; N dagger ; B 36 -171 520 718 ; C 179 ; WX 556 ; N daggerdbl ; B 36 -171 520 718 ; C 180 ; WX 278 ; N periodcentered ; B 58 172 220 334 ; C 182 ; WX 556 ; N paragraph ; B -8 -191 539 700 ; C 183 ; WX 350 ; N bullet ; B 10 194 340 524 ; C 184 ; WX 278 ; N quotesinglbase ; B 69 -146 209 127 ; C 185 ; WX 500 ; N quotedblbase ; B 64 -146 436 127 ; C 186 ; WX 500 ; N quotedblright ; B 64 445 436 718 ; C 187 ; WX 556 ; N guillemotright ; B 88 76 468 484 ; C 188 ; WX 1000 ; N ellipsis ; B 92 0 908 146 ; C 189 ; WX 1000 ; N perthousand ; B -3 -19 1003 710 ; C 191 ; WX 611 ; N questiondown ; B 55 -195 551 532 ; C 193 ; WX 333 ; N grave ; B -23 604 225 750 ; C 194 ; WX 333 ; N acute ; B 108 604 356 750 ; C 195 ; WX 333 ; N circumflex ; B -10 604 343 750 ; C 196 ; WX 333 ; N tilde ; B -17 610 350 737 ; C 197 ; WX 333 ; N macron ; B -6 604 339 678 ; C 198 ; WX 333 ; N breve ; B -2 604 335 750 ; C 199 ; WX 333 ; N dotaccent ; B 104 614 230 729 ; C 200 ; WX 333 ; N dieresis ; B 6 614 327 729 ; C 202 ; WX 333 ; N ring ; B 59 568 275 776 ; C 203 ; WX 333 ; N cedilla ; B 6 -228 245 0 ; C 205 ; WX 333 ; N hungarumlaut ; B 9 604 486 750 ; C 206 ; WX 333 ; N ogonek ; B 71 -228 304 0 ; C 207 ; WX 333 ; N caron ; B -10 604 343 750 ; C 208 ; WX 1000 ; N emdash ; B 0 227 1000 333 ; C 225 ; WX 1000 ; N AE ; B 5 0 954 718 ; C 227 ; WX 370 ; N ordfeminine ; B 22 401 347 737 ; C 232 ; WX 611 ; N Lslash ; B -20 0 583 718 ; C 233 ; WX 778 ; N Oslash ; B 33 -27 744 745 ; C 234 ; WX 1000 ; N OE ; B 37 -19 961 737 ; C 235 ; WX 365 ; N ordmasculine ; B 6 401 360 737 ; C 241 ; WX 889 ; N ae ; B 29 -14 858 546 ; C 245 ; WX 278 ; N dotlessi ; B 69 0 209 532 ; C 248 ; WX 278 ; N lslash ; B -18 0 296 718 ; C 249 ; WX 611 ; N oslash ; B 22 -29 589 560 ; C 250 ; WX 944 ; N oe ; B 34 -14 912 546 ; C 251 ; WX 611 ; N germandbls ; B 69 -14 579 731 ; C -1 ; WX 278 ; N Idieresis ; B -21 0 300 915 ; C -1 ; WX 556 ; N eacute ; B 23 -14 528 750 ; C -1 ; WX 556 ; N abreve ; B 29 -14 527 750 ; C -1 ; WX 611 ; N uhungarumlaut ; B 66 -14 625 750 ; C -1 ; WX 556 ; N ecaron ; B 23 -14 528 750 ; C -1 ; WX 667 ; N Ydieresis ; B 15 0 653 915 ; C -1 ; WX 584 ; N divide ; B 40 -42 544 548 ; C -1 ; WX 667 ; N Yacute ; B 15 0 653 936 ; C -1 ; WX 722 ; N Acircumflex ; B 20 0 702 936 ; C -1 ; WX 556 ; N aacute ; B 29 -14 527 750 ; C -1 ; WX 722 ; N Ucircumflex ; B 72 -19 651 936 ; C -1 ; WX 556 ; N yacute ; B 10 -214 539 750 ; C -1 ; WX 556 ; N scommaaccent ; B 30 -228 519 546 ; C -1 ; WX 556 ; N ecircumflex ; B 23 -14 528 750 ; C -1 ; WX 722 ; N Uring ; B 72 -19 651 962 ; C -1 ; WX 722 ; N Udieresis ; B 72 -19 651 915 ; C -1 ; WX 556 ; N aogonek ; B 29 -224 545 546 ; C -1 ; WX 722 ; N Uacute ; B 72 -19 651 936 ; C -1 ; WX 611 ; N uogonek ; B 66 -228 545 532 ; C -1 ; WX 667 ; N Edieresis ; B 76 0 621 915 ; C -1 ; WX 722 ; N Dcroat ; B -5 0 685 718 ; C -1 ; WX 250 ; N commaaccent ; B 64 -228 199 -50 ; C -1 ; WX 737 ; N copyright ; B -11 -19 749 737 ; C -1 ; WX 667 ; N Emacron ; B 76 0 621 864 ; C -1 ; WX 556 ; N ccaron ; B 34 -14 524 750 ; C -1 ; WX 556 ; N aring ; B 29 -14 527 776 ; C -1 ; WX 722 ; N Ncommaaccent ; B 69 -228 654 718 ; C -1 ; WX 278 ; N lacute ; B 69 0 329 936 ; C -1 ; WX 556 ; N agrave ; B 29 -14 527 750 ; C -1 ; WX 611 ; N Tcommaaccent ; B 14 -228 598 718 ; C -1 ; WX 722 ; N Cacute ; B 44 -19 684 936 ; C -1 ; WX 556 ; N atilde ; B 29 -14 527 737 ; C -1 ; WX 667 ; N Edotaccent ; B 76 0 621 915 ; C -1 ; WX 556 ; N scaron ; B 30 -14 519 750 ; C -1 ; WX 556 ; N scedilla ; B 30 -228 519 546 ; C -1 ; WX 278 ; N iacute ; B 69 0 329 750 ; C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ; C -1 ; WX 722 ; N Rcaron ; B 76 0 677 936 ; C -1 ; WX 778 ; N Gcommaaccent ; B 44 -228 713 737 ; C -1 ; WX 611 ; N ucircumflex ; B 66 -14 545 750 ; C -1 ; WX 556 ; N acircumflex ; B 29 -14 527 750 ; C -1 ; WX 722 ; N Amacron ; B 20 0 702 864 ; C -1 ; WX 389 ; N rcaron ; B 18 0 373 750 ; C -1 ; WX 556 ; N ccedilla ; B 34 -228 524 546 ; C -1 ; WX 611 ; N Zdotaccent ; B 25 0 586 915 ; C -1 ; WX 667 ; N Thorn ; B 76 0 627 718 ; C -1 ; WX 778 ; N Omacron ; B 44 -19 734 864 ; C -1 ; WX 722 ; N Racute ; B 76 0 677 936 ; C -1 ; WX 667 ; N Sacute ; B 39 -19 629 936 ; C -1 ; WX 743 ; N dcaron ; B 34 -14 750 718 ; C -1 ; WX 722 ; N Umacron ; B 72 -19 651 864 ; C -1 ; WX 611 ; N uring ; B 66 -14 545 776 ; C -1 ; WX 333 ; N threesuperior ; B 8 271 326 710 ; C -1 ; WX 778 ; N Ograve ; B 44 -19 734 936 ; C -1 ; WX 722 ; N Agrave ; B 20 0 702 936 ; C -1 ; WX 722 ; N Abreve ; B 20 0 702 936 ; C -1 ; WX 584 ; N multiply ; B 40 1 545 505 ; C -1 ; WX 611 ; N uacute ; B 66 -14 545 750 ; C -1 ; WX 611 ; N Tcaron ; B 14 0 598 936 ; C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ; C -1 ; WX 556 ; N ydieresis ; B 10 -214 539 729 ; C -1 ; WX 722 ; N Nacute ; B 69 0 654 936 ; C -1 ; WX 278 ; N icircumflex ; B -37 0 316 750 ; C -1 ; WX 667 ; N Ecircumflex ; B 76 0 621 936 ; C -1 ; WX 556 ; N adieresis ; B 29 -14 527 729 ; C -1 ; WX 556 ; N edieresis ; B 23 -14 528 729 ; C -1 ; WX 556 ; N cacute ; B 34 -14 524 750 ; C -1 ; WX 611 ; N nacute ; B 65 0 546 750 ; C -1 ; WX 611 ; N umacron ; B 66 -14 545 678 ; C -1 ; WX 722 ; N Ncaron ; B 69 0 654 936 ; C -1 ; WX 278 ; N Iacute ; B 64 0 329 936 ; C -1 ; WX 584 ; N plusminus ; B 40 0 544 506 ; C -1 ; WX 280 ; N brokenbar ; B 84 -150 196 700 ; C -1 ; WX 737 ; N registered ; B -11 -19 748 737 ; C -1 ; WX 778 ; N Gbreve ; B 44 -19 713 936 ; C -1 ; WX 278 ; N Idotaccent ; B 64 0 214 915 ; C -1 ; WX 600 ; N summation ; B 14 -10 585 706 ; C -1 ; WX 667 ; N Egrave ; B 76 0 621 936 ; C -1 ; WX 389 ; N racute ; B 64 0 384 750 ; C -1 ; WX 611 ; N omacron ; B 34 -14 578 678 ; C -1 ; WX 611 ; N Zacute ; B 25 0 586 936 ; C -1 ; WX 611 ; N Zcaron ; B 25 0 586 936 ; C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ; C -1 ; WX 722 ; N Eth ; B -5 0 685 718 ; C -1 ; WX 722 ; N Ccedilla ; B 44 -228 684 737 ; C -1 ; WX 278 ; N lcommaaccent ; B 69 -228 213 718 ; C -1 ; WX 389 ; N tcaron ; B 10 -6 421 878 ; C -1 ; WX 556 ; N eogonek ; B 23 -228 528 546 ; C -1 ; WX 722 ; N Uogonek ; B 72 -228 651 718 ; C -1 ; WX 722 ; N Aacute ; B 20 0 702 936 ; C -1 ; WX 722 ; N Adieresis ; B 20 0 702 915 ; C -1 ; WX 556 ; N egrave ; B 23 -14 528 750 ; C -1 ; WX 500 ; N zacute ; B 20 0 480 750 ; C -1 ; WX 278 ; N iogonek ; B 16 -224 249 725 ; C -1 ; WX 778 ; N Oacute ; B 44 -19 734 936 ; C -1 ; WX 611 ; N oacute ; B 34 -14 578 750 ; C -1 ; WX 556 ; N amacron ; B 29 -14 527 678 ; C -1 ; WX 556 ; N sacute ; B 30 -14 519 750 ; C -1 ; WX 278 ; N idieresis ; B -21 0 300 729 ; C -1 ; WX 778 ; N Ocircumflex ; B 44 -19 734 936 ; C -1 ; WX 722 ; N Ugrave ; B 72 -19 651 936 ; C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; C -1 ; WX 611 ; N thorn ; B 62 -208 578 718 ; C -1 ; WX 333 ; N twosuperior ; B 9 283 324 710 ; C -1 ; WX 778 ; N Odieresis ; B 44 -19 734 915 ; C -1 ; WX 611 ; N mu ; B 66 -207 545 532 ; C -1 ; WX 278 ; N igrave ; B -50 0 209 750 ; C -1 ; WX 611 ; N ohungarumlaut ; B 34 -14 625 750 ; C -1 ; WX 667 ; N Eogonek ; B 76 -224 639 718 ; C -1 ; WX 611 ; N dcroat ; B 34 -14 650 718 ; C -1 ; WX 834 ; N threequarters ; B 16 -19 799 710 ; C -1 ; WX 667 ; N Scedilla ; B 39 -228 629 737 ; C -1 ; WX 400 ; N lcaron ; B 69 0 408 718 ; C -1 ; WX 722 ; N Kcommaaccent ; B 87 -228 722 718 ; C -1 ; WX 611 ; N Lacute ; B 76 0 583 936 ; C -1 ; WX 1000 ; N trademark ; B 44 306 956 718 ; C -1 ; WX 556 ; N edotaccent ; B 23 -14 528 729 ; C -1 ; WX 278 ; N Igrave ; B -50 0 214 936 ; C -1 ; WX 278 ; N Imacron ; B -33 0 312 864 ; C -1 ; WX 611 ; N Lcaron ; B 76 0 583 718 ; C -1 ; WX 834 ; N onehalf ; B 26 -19 794 710 ; C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ; C -1 ; WX 611 ; N ocircumflex ; B 34 -14 578 750 ; C -1 ; WX 611 ; N ntilde ; B 65 0 546 737 ; C -1 ; WX 722 ; N Uhungarumlaut ; B 72 -19 681 936 ; C -1 ; WX 667 ; N Eacute ; B 76 0 621 936 ; C -1 ; WX 556 ; N emacron ; B 23 -14 528 678 ; C -1 ; WX 611 ; N gbreve ; B 40 -217 553 750 ; C -1 ; WX 834 ; N onequarter ; B 26 -19 766 710 ; C -1 ; WX 667 ; N Scaron ; B 39 -19 629 936 ; C -1 ; WX 667 ; N Scommaaccent ; B 39 -228 629 737 ; C -1 ; WX 778 ; N Ohungarumlaut ; B 44 -19 734 936 ; C -1 ; WX 400 ; N degree ; B 57 426 343 712 ; C -1 ; WX 611 ; N ograve ; B 34 -14 578 750 ; C -1 ; WX 722 ; N Ccaron ; B 44 -19 684 936 ; C -1 ; WX 611 ; N ugrave ; B 66 -14 545 750 ; C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ; C -1 ; WX 722 ; N Dcaron ; B 76 0 685 936 ; C -1 ; WX 389 ; N rcommaaccent ; B 64 -228 373 546 ; C -1 ; WX 722 ; N Ntilde ; B 69 0 654 923 ; C -1 ; WX 611 ; N otilde ; B 34 -14 578 737 ; C -1 ; WX 722 ; N Rcommaaccent ; B 76 -228 677 718 ; C -1 ; WX 611 ; N Lcommaaccent ; B 76 -228 583 718 ; C -1 ; WX 722 ; N Atilde ; B 20 0 702 923 ; C -1 ; WX 722 ; N Aogonek ; B 20 -224 742 718 ; C -1 ; WX 722 ; N Aring ; B 20 0 702 962 ; C -1 ; WX 778 ; N Otilde ; B 44 -19 734 923 ; C -1 ; WX 500 ; N zdotaccent ; B 20 0 480 729 ; C -1 ; WX 667 ; N Ecaron ; B 76 0 621 936 ; C -1 ; WX 278 ; N Iogonek ; B -11 -228 222 718 ; C -1 ; WX 556 ; N kcommaaccent ; B 69 -228 562 718 ; C -1 ; WX 584 ; N minus ; B 40 197 544 309 ; C -1 ; WX 278 ; N Icircumflex ; B -37 0 316 936 ; C -1 ; WX 611 ; N ncaron ; B 65 0 546 750 ; C -1 ; WX 333 ; N tcommaaccent ; B 10 -228 309 676 ; C -1 ; WX 584 ; N logicalnot ; B 40 108 544 419 ; C -1 ; WX 611 ; N odieresis ; B 34 -14 578 729 ; C -1 ; WX 611 ; N udieresis ; B 66 -14 545 729 ; C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ; C -1 ; WX 611 ; N gcommaaccent ; B 40 -217 553 850 ; C -1 ; WX 611 ; N eth ; B 34 -14 578 737 ; C -1 ; WX 500 ; N zcaron ; B 20 0 480 750 ; C -1 ; WX 611 ; N ncommaaccent ; B 65 -228 546 546 ; C -1 ; WX 333 ; N onesuperior ; B 26 283 237 710 ; C -1 ; WX 278 ; N imacron ; B -8 0 285 678 ; C -1 ; WX 556 ; N Euro ; B 0 0 0 0 ; EndCharMetrics StartKernData StartKernPairs 2481 KPX A C -40 KPX A Cacute -40 KPX A Ccaron -40 KPX A Ccedilla -40 KPX A G -50 KPX A Gbreve -50 KPX A Gcommaaccent -50 KPX A O -40 KPX A Oacute -40 KPX A Ocircumflex -40 KPX A Odieresis -40 KPX A Ograve -40 KPX A Ohungarumlaut -40 KPX A Omacron -40 KPX A Oslash -40 KPX A Otilde -40 KPX A Q -40 KPX A T -90 KPX A Tcaron -90 KPX A Tcommaaccent -90 KPX A U -50 KPX A Uacute -50 KPX A Ucircumflex -50 KPX A Udieresis -50 KPX A Ugrave -50 KPX A Uhungarumlaut -50 KPX A Umacron -50 KPX A Uogonek -50 KPX A Uring -50 KPX A V -80 KPX A W -60 KPX A Y -110 KPX A Yacute -110 KPX A Ydieresis -110 KPX A u -30 KPX A uacute -30 KPX A ucircumflex -30 KPX A udieresis -30 KPX A ugrave -30 KPX A uhungarumlaut -30 KPX A umacron -30 KPX A uogonek -30 KPX A uring -30 KPX A v -40 KPX A w -30 KPX A y -30 KPX A yacute -30 KPX A ydieresis -30 KPX Aacute C -40 KPX Aacute Cacute -40 KPX Aacute Ccaron -40 KPX Aacute Ccedilla -40 KPX Aacute G -50 KPX Aacute Gbreve -50 KPX Aacute Gcommaaccent -50 KPX Aacute O -40 KPX Aacute Oacute -40 KPX Aacute Ocircumflex -40 KPX Aacute Odieresis -40 KPX Aacute Ograve -40 KPX Aacute Ohungarumlaut -40 KPX Aacute Omacron -40 KPX Aacute Oslash -40 KPX Aacute Otilde -40 KPX Aacute Q -40 KPX Aacute T -90 KPX Aacute Tcaron -90 KPX Aacute Tcommaaccent -90 KPX Aacute U -50 KPX Aacute Uacute -50 KPX Aacute Ucircumflex -50 KPX Aacute Udieresis -50 KPX Aacute Ugrave -50 KPX Aacute Uhungarumlaut -50 KPX Aacute Umacron -50 KPX Aacute Uogonek -50 KPX Aacute Uring -50 KPX Aacute V -80 KPX Aacute W -60 KPX Aacute Y -110 KPX Aacute Yacute -110 KPX Aacute Ydieresis -110 KPX Aacute u -30 KPX Aacute uacute -30 KPX Aacute ucircumflex -30 KPX Aacute udieresis -30 KPX Aacute ugrave -30 KPX Aacute uhungarumlaut -30 KPX Aacute umacron -30 KPX Aacute uogonek -30 KPX Aacute uring -30 KPX Aacute v -40 KPX Aacute w -30 KPX Aacute y -30 KPX Aacute yacute -30 KPX Aacute ydieresis -30 KPX Abreve C -40 KPX Abreve Cacute -40 KPX Abreve Ccaron -40 KPX Abreve Ccedilla -40 KPX Abreve G -50 KPX Abreve Gbreve -50 KPX Abreve Gcommaaccent -50 KPX Abreve O -40 KPX Abreve Oacute -40 KPX Abreve Ocircumflex -40 KPX Abreve Odieresis -40 KPX Abreve Ograve -40 KPX Abreve Ohungarumlaut -40 KPX Abreve Omacron -40 KPX Abreve Oslash -40 KPX Abreve Otilde -40 KPX Abreve Q -40 KPX Abreve T -90 KPX Abreve Tcaron -90 KPX Abreve Tcommaaccent -90 KPX Abreve U -50 KPX Abreve Uacute -50 KPX Abreve Ucircumflex -50 KPX Abreve Udieresis -50 KPX Abreve Ugrave -50 KPX Abreve Uhungarumlaut -50 KPX Abreve Umacron -50 KPX Abreve Uogonek -50 KPX Abreve Uring -50 KPX Abreve V -80 KPX Abreve W -60 KPX Abreve Y -110 KPX Abreve Yacute -110 KPX Abreve Ydieresis -110 KPX Abreve u -30 KPX Abreve uacute -30 KPX Abreve ucircumflex -30 KPX Abreve udieresis -30 KPX Abreve ugrave -30 KPX Abreve uhungarumlaut -30 KPX Abreve umacron -30 KPX Abreve uogonek -30 KPX Abreve uring -30 KPX Abreve v -40 KPX Abreve w -30 KPX Abreve y -30 KPX Abreve yacute -30 KPX Abreve ydieresis -30 KPX Acircumflex C -40 KPX Acircumflex Cacute -40 KPX Acircumflex Ccaron -40 KPX Acircumflex Ccedilla -40 KPX Acircumflex G -50 KPX Acircumflex Gbreve -50 KPX Acircumflex Gcommaaccent -50 KPX Acircumflex O -40 KPX Acircumflex Oacute -40 KPX Acircumflex Ocircumflex -40 KPX Acircumflex Odieresis -40 KPX Acircumflex Ograve -40 KPX Acircumflex Ohungarumlaut -40 KPX Acircumflex Omacron -40 KPX Acircumflex Oslash -40 KPX Acircumflex Otilde -40 KPX Acircumflex Q -40 KPX Acircumflex T -90 KPX Acircumflex Tcaron -90 KPX Acircumflex Tcommaaccent -90 KPX Acircumflex U -50 KPX Acircumflex Uacute -50 KPX Acircumflex Ucircumflex -50 KPX Acircumflex Udieresis -50 KPX Acircumflex Ugrave -50 KPX Acircumflex Uhungarumlaut -50 KPX Acircumflex Umacron -50 KPX Acircumflex Uogonek -50 KPX Acircumflex Uring -50 KPX Acircumflex V -80 KPX Acircumflex W -60 KPX Acircumflex Y -110 KPX Acircumflex Yacute -110 KPX Acircumflex Ydieresis -110 KPX Acircumflex u -30 KPX Acircumflex uacute -30 KPX Acircumflex ucircumflex -30 KPX Acircumflex udieresis -30 KPX Acircumflex ugrave -30 KPX Acircumflex uhungarumlaut -30 KPX Acircumflex umacron -30 KPX Acircumflex uogonek -30 KPX Acircumflex uring -30 KPX Acircumflex v -40 KPX Acircumflex w -30 KPX Acircumflex y -30 KPX Acircumflex yacute -30 KPX Acircumflex ydieresis -30 KPX Adieresis C -40 KPX Adieresis Cacute -40 KPX Adieresis Ccaron -40 KPX Adieresis Ccedilla -40 KPX Adieresis G -50 KPX Adieresis Gbreve -50 KPX Adieresis Gcommaaccent -50 KPX Adieresis O -40 KPX Adieresis Oacute -40 KPX Adieresis Ocircumflex -40 KPX Adieresis Odieresis -40 KPX Adieresis Ograve -40 KPX Adieresis Ohungarumlaut -40 KPX Adieresis Omacron -40 KPX Adieresis Oslash -40 KPX Adieresis Otilde -40 KPX Adieresis Q -40 KPX Adieresis T -90 KPX Adieresis Tcaron -90 KPX Adieresis Tcommaaccent -90 KPX Adieresis U -50 KPX Adieresis Uacute -50 KPX Adieresis Ucircumflex -50 KPX Adieresis Udieresis -50 KPX Adieresis Ugrave -50 KPX Adieresis Uhungarumlaut -50 KPX Adieresis Umacron -50 KPX Adieresis Uogonek -50 KPX Adieresis Uring -50 KPX Adieresis V -80 KPX Adieresis W -60 KPX Adieresis Y -110 KPX Adieresis Yacute -110 KPX Adieresis Ydieresis -110 KPX Adieresis u -30 KPX Adieresis uacute -30 KPX Adieresis ucircumflex -30 KPX Adieresis udieresis -30 KPX Adieresis ugrave -30 KPX Adieresis uhungarumlaut -30 KPX Adieresis umacron -30 KPX Adieresis uogonek -30 KPX Adieresis uring -30 KPX Adieresis v -40 KPX Adieresis w -30 KPX Adieresis y -30 KPX Adieresis yacute -30 KPX Adieresis ydieresis -30 KPX Agrave C -40 KPX Agrave Cacute -40 KPX Agrave Ccaron -40 KPX Agrave Ccedilla -40 KPX Agrave G -50 KPX Agrave Gbreve -50 KPX Agrave Gcommaaccent -50 KPX Agrave O -40 KPX Agrave Oacute -40 KPX Agrave Ocircumflex -40 KPX Agrave Odieresis -40 KPX Agrave Ograve -40 KPX Agrave Ohungarumlaut -40 KPX Agrave Omacron -40 KPX Agrave Oslash -40 KPX Agrave Otilde -40 KPX Agrave Q -40 KPX Agrave T -90 KPX Agrave Tcaron -90 KPX Agrave Tcommaaccent -90 KPX Agrave U -50 KPX Agrave Uacute -50 KPX Agrave Ucircumflex -50 KPX Agrave Udieresis -50 KPX Agrave Ugrave -50 KPX Agrave Uhungarumlaut -50 KPX Agrave Umacron -50 KPX Agrave Uogonek -50 KPX Agrave Uring -50 KPX Agrave V -80 KPX Agrave W -60 KPX Agrave Y -110 KPX Agrave Yacute -110 KPX Agrave Ydieresis -110 KPX Agrave u -30 KPX Agrave uacute -30 KPX Agrave ucircumflex -30 KPX Agrave udieresis -30 KPX Agrave ugrave -30 KPX Agrave uhungarumlaut -30 KPX Agrave umacron -30 KPX Agrave uogonek -30 KPX Agrave uring -30 KPX Agrave v -40 KPX Agrave w -30 KPX Agrave y -30 KPX Agrave yacute -30 KPX Agrave ydieresis -30 KPX Amacron C -40 KPX Amacron Cacute -40 KPX Amacron Ccaron -40 KPX Amacron Ccedilla -40 KPX Amacron G -50 KPX Amacron Gbreve -50 KPX Amacron Gcommaaccent -50 KPX Amacron O -40 KPX Amacron Oacute -40 KPX Amacron Ocircumflex -40 KPX Amacron Odieresis -40 KPX Amacron Ograve -40 KPX Amacron Ohungarumlaut -40 KPX Amacron Omacron -40 KPX Amacron Oslash -40 KPX Amacron Otilde -40 KPX Amacron Q -40 KPX Amacron T -90 KPX Amacron Tcaron -90 KPX Amacron Tcommaaccent -90 KPX Amacron U -50 KPX Amacron Uacute -50 KPX Amacron Ucircumflex -50 KPX Amacron Udieresis -50 KPX Amacron Ugrave -50 KPX Amacron Uhungarumlaut -50 KPX Amacron Umacron -50 KPX Amacron Uogonek -50 KPX Amacron Uring -50 KPX Amacron V -80 KPX Amacron W -60 KPX Amacron Y -110 KPX Amacron Yacute -110 KPX Amacron Ydieresis -110 KPX Amacron u -30 KPX Amacron uacute -30 KPX Amacron ucircumflex -30 KPX Amacron udieresis -30 KPX Amacron ugrave -30 KPX Amacron uhungarumlaut -30 KPX Amacron umacron -30 KPX Amacron uogonek -30 KPX Amacron uring -30 KPX Amacron v -40 KPX Amacron w -30 KPX Amacron y -30 KPX Amacron yacute -30 KPX Amacron ydieresis -30 KPX Aogonek C -40 KPX Aogonek Cacute -40 KPX Aogonek Ccaron -40 KPX Aogonek Ccedilla -40 KPX Aogonek G -50 KPX Aogonek Gbreve -50 KPX Aogonek Gcommaaccent -50 KPX Aogonek O -40 KPX Aogonek Oacute -40 KPX Aogonek Ocircumflex -40 KPX Aogonek Odieresis -40 KPX Aogonek Ograve -40 KPX Aogonek Ohungarumlaut -40 KPX Aogonek Omacron -40 KPX Aogonek Oslash -40 KPX Aogonek Otilde -40 KPX Aogonek Q -40 KPX Aogonek T -90 KPX Aogonek Tcaron -90 KPX Aogonek Tcommaaccent -90 KPX Aogonek U -50 KPX Aogonek Uacute -50 KPX Aogonek Ucircumflex -50 KPX Aogonek Udieresis -50 KPX Aogonek Ugrave -50 KPX Aogonek Uhungarumlaut -50 KPX Aogonek Umacron -50 KPX Aogonek Uogonek -50 KPX Aogonek Uring -50 KPX Aogonek V -80 KPX Aogonek W -60 KPX Aogonek Y -110 KPX Aogonek Yacute -110 KPX Aogonek Ydieresis -110 KPX Aogonek u -30 KPX Aogonek uacute -30 KPX Aogonek ucircumflex -30 KPX Aogonek udieresis -30 KPX Aogonek ugrave -30 KPX Aogonek uhungarumlaut -30 KPX Aogonek umacron -30 KPX Aogonek uogonek -30 KPX Aogonek uring -30 KPX Aogonek v -40 KPX Aogonek w -30 KPX Aogonek y -30 KPX Aogonek yacute -30 KPX Aogonek ydieresis -30 KPX Aring C -40 KPX Aring Cacute -40 KPX Aring Ccaron -40 KPX Aring Ccedilla -40 KPX Aring G -50 KPX Aring Gbreve -50 KPX Aring Gcommaaccent -50 KPX Aring O -40 KPX Aring Oacute -40 KPX Aring Ocircumflex -40 KPX Aring Odieresis -40 KPX Aring Ograve -40 KPX Aring Ohungarumlaut -40 KPX Aring Omacron -40 KPX Aring Oslash -40 KPX Aring Otilde -40 KPX Aring Q -40 KPX Aring T -90 KPX Aring Tcaron -90 KPX Aring Tcommaaccent -90 KPX Aring U -50 KPX Aring Uacute -50 KPX Aring Ucircumflex -50 KPX Aring Udieresis -50 KPX Aring Ugrave -50 KPX Aring Uhungarumlaut -50 KPX Aring Umacron -50 KPX Aring Uogonek -50 KPX Aring Uring -50 KPX Aring V -80 KPX Aring W -60 KPX Aring Y -110 KPX Aring Yacute -110 KPX Aring Ydieresis -110 KPX Aring u -30 KPX Aring uacute -30 KPX Aring ucircumflex -30 KPX Aring udieresis -30 KPX Aring ugrave -30 KPX Aring uhungarumlaut -30 KPX Aring umacron -30 KPX Aring uogonek -30 KPX Aring uring -30 KPX Aring v -40 KPX Aring w -30 KPX Aring y -30 KPX Aring yacute -30 KPX Aring ydieresis -30 KPX Atilde C -40 KPX Atilde Cacute -40 KPX Atilde Ccaron -40 KPX Atilde Ccedilla -40 KPX Atilde G -50 KPX Atilde Gbreve -50 KPX Atilde Gcommaaccent -50 KPX Atilde O -40 KPX Atilde Oacute -40 KPX Atilde Ocircumflex -40 KPX Atilde Odieresis -40 KPX Atilde Ograve -40 KPX Atilde Ohungarumlaut -40 KPX Atilde Omacron -40 KPX Atilde Oslash -40 KPX Atilde Otilde -40 KPX Atilde Q -40 KPX Atilde T -90 KPX Atilde Tcaron -90 KPX Atilde Tcommaaccent -90 KPX Atilde U -50 KPX Atilde Uacute -50 KPX Atilde Ucircumflex -50 KPX Atilde Udieresis -50 KPX Atilde Ugrave -50 KPX Atilde Uhungarumlaut -50 KPX Atilde Umacron -50 KPX Atilde Uogonek -50 KPX Atilde Uring -50 KPX Atilde V -80 KPX Atilde W -60 KPX Atilde Y -110 KPX Atilde Yacute -110 KPX Atilde Ydieresis -110 KPX Atilde u -30 KPX Atilde uacute -30 KPX Atilde ucircumflex -30 KPX Atilde udieresis -30 KPX Atilde ugrave -30 KPX Atilde uhungarumlaut -30 KPX Atilde umacron -30 KPX Atilde uogonek -30 KPX Atilde uring -30 KPX Atilde v -40 KPX Atilde w -30 KPX Atilde y -30 KPX Atilde yacute -30 KPX Atilde ydieresis -30 KPX B A -30 KPX B Aacute -30 KPX B Abreve -30 KPX B Acircumflex -30 KPX B Adieresis -30 KPX B Agrave -30 KPX B Amacron -30 KPX B Aogonek -30 KPX B Aring -30 KPX B Atilde -30 KPX B U -10 KPX B Uacute -10 KPX B Ucircumflex -10 KPX B Udieresis -10 KPX B Ugrave -10 KPX B Uhungarumlaut -10 KPX B Umacron -10 KPX B Uogonek -10 KPX B Uring -10 KPX D A -40 KPX D Aacute -40 KPX D Abreve -40 KPX D Acircumflex -40 KPX D Adieresis -40 KPX D Agrave -40 KPX D Amacron -40 KPX D Aogonek -40 KPX D Aring -40 KPX D Atilde -40 KPX D V -40 KPX D W -40 KPX D Y -70 KPX D Yacute -70 KPX D Ydieresis -70 KPX D comma -30 KPX D period -30 KPX Dcaron A -40 KPX Dcaron Aacute -40 KPX Dcaron Abreve -40 KPX Dcaron Acircumflex -40 KPX Dcaron Adieresis -40 KPX Dcaron Agrave -40 KPX Dcaron Amacron -40 KPX Dcaron Aogonek -40 KPX Dcaron Aring -40 KPX Dcaron Atilde -40 KPX Dcaron V -40 KPX Dcaron W -40 KPX Dcaron Y -70 KPX Dcaron Yacute -70 KPX Dcaron Ydieresis -70 KPX Dcaron comma -30 KPX Dcaron period -30 KPX Dcroat A -40 KPX Dcroat Aacute -40 KPX Dcroat Abreve -40 KPX Dcroat Acircumflex -40 KPX Dcroat Adieresis -40 KPX Dcroat Agrave -40 KPX Dcroat Amacron -40 KPX Dcroat Aogonek -40 KPX Dcroat Aring -40 KPX Dcroat Atilde -40 KPX Dcroat V -40 KPX Dcroat W -40 KPX Dcroat Y -70 KPX Dcroat Yacute -70 KPX Dcroat Ydieresis -70 KPX Dcroat comma -30 KPX Dcroat period -30 KPX F A -80 KPX F Aacute -80 KPX F Abreve -80 KPX F Acircumflex -80 KPX F Adieresis -80 KPX F Agrave -80 KPX F Amacron -80 KPX F Aogonek -80 KPX F Aring -80 KPX F Atilde -80 KPX F a -20 KPX F aacute -20 KPX F abreve -20 KPX F acircumflex -20 KPX F adieresis -20 KPX F agrave -20 KPX F amacron -20 KPX F aogonek -20 KPX F aring -20 KPX F atilde -20 KPX F comma -100 KPX F period -100 KPX J A -20 KPX J Aacute -20 KPX J Abreve -20 KPX J Acircumflex -20 KPX J Adieresis -20 KPX J Agrave -20 KPX J Amacron -20 KPX J Aogonek -20 KPX J Aring -20 KPX J Atilde -20 KPX J comma -20 KPX J period -20 KPX J u -20 KPX J uacute -20 KPX J ucircumflex -20 KPX J udieresis -20 KPX J ugrave -20 KPX J uhungarumlaut -20 KPX J umacron -20 KPX J uogonek -20 KPX J uring -20 KPX K O -30 KPX K Oacute -30 KPX K Ocircumflex -30 KPX K Odieresis -30 KPX K Ograve -30 KPX K Ohungarumlaut -30 KPX K Omacron -30 KPX K Oslash -30 KPX K Otilde -30 KPX K e -15 KPX K eacute -15 KPX K ecaron -15 KPX K ecircumflex -15 KPX K edieresis -15 KPX K edotaccent -15 KPX K egrave -15 KPX K emacron -15 KPX K eogonek -15 KPX K o -35 KPX K oacute -35 KPX K ocircumflex -35 KPX K odieresis -35 KPX K ograve -35 KPX K ohungarumlaut -35 KPX K omacron -35 KPX K oslash -35 KPX K otilde -35 KPX K u -30 KPX K uacute -30 KPX K ucircumflex -30 KPX K udieresis -30 KPX K ugrave -30 KPX K uhungarumlaut -30 KPX K umacron -30 KPX K uogonek -30 KPX K uring -30 KPX K y -40 KPX K yacute -40 KPX K ydieresis -40 KPX Kcommaaccent O -30 KPX Kcommaaccent Oacute -30 KPX Kcommaaccent Ocircumflex -30 KPX Kcommaaccent Odieresis -30 KPX Kcommaaccent Ograve -30 KPX Kcommaaccent Ohungarumlaut -30 KPX Kcommaaccent Omacron -30 KPX Kcommaaccent Oslash -30 KPX Kcommaaccent Otilde -30 KPX Kcommaaccent e -15 KPX Kcommaaccent eacute -15 KPX Kcommaaccent ecaron -15 KPX Kcommaaccent ecircumflex -15 KPX Kcommaaccent edieresis -15 KPX Kcommaaccent edotaccent -15 KPX Kcommaaccent egrave -15 KPX Kcommaaccent emacron -15 KPX Kcommaaccent eogonek -15 KPX Kcommaaccent o -35 KPX Kcommaaccent oacute -35 KPX Kcommaaccent ocircumflex -35 KPX Kcommaaccent odieresis -35 KPX Kcommaaccent ograve -35 KPX Kcommaaccent ohungarumlaut -35 KPX Kcommaaccent omacron -35 KPX Kcommaaccent oslash -35 KPX Kcommaaccent otilde -35 KPX Kcommaaccent u -30 KPX Kcommaaccent uacute -30 KPX Kcommaaccent ucircumflex -30 KPX Kcommaaccent udieresis -30 KPX Kcommaaccent ugrave -30 KPX Kcommaaccent uhungarumlaut -30 KPX Kcommaaccent umacron -30 KPX Kcommaaccent uogonek -30 KPX Kcommaaccent uring -30 KPX Kcommaaccent y -40 KPX Kcommaaccent yacute -40 KPX Kcommaaccent ydieresis -40 KPX L T -90 KPX L Tcaron -90 KPX L Tcommaaccent -90 KPX L V -110 KPX L W -80 KPX L Y -120 KPX L Yacute -120 KPX L Ydieresis -120 KPX L quotedblright -140 KPX L quoteright -140 KPX L y -30 KPX L yacute -30 KPX L ydieresis -30 KPX Lacute T -90 KPX Lacute Tcaron -90 KPX Lacute Tcommaaccent -90 KPX Lacute V -110 KPX Lacute W -80 KPX Lacute Y -120 KPX Lacute Yacute -120 KPX Lacute Ydieresis -120 KPX Lacute quotedblright -140 KPX Lacute quoteright -140 KPX Lacute y -30 KPX Lacute yacute -30 KPX Lacute ydieresis -30 KPX Lcommaaccent T -90 KPX Lcommaaccent Tcaron -90 KPX Lcommaaccent Tcommaaccent -90 KPX Lcommaaccent V -110 KPX Lcommaaccent W -80 KPX Lcommaaccent Y -120 KPX Lcommaaccent Yacute -120 KPX Lcommaaccent Ydieresis -120 KPX Lcommaaccent quotedblright -140 KPX Lcommaaccent quoteright -140 KPX Lcommaaccent y -30 KPX Lcommaaccent yacute -30 KPX Lcommaaccent ydieresis -30 KPX Lslash T -90 KPX Lslash Tcaron -90 KPX Lslash Tcommaaccent -90 KPX Lslash V -110 KPX Lslash W -80 KPX Lslash Y -120 KPX Lslash Yacute -120 KPX Lslash Ydieresis -120 KPX Lslash quotedblright -140 KPX Lslash quoteright -140 KPX Lslash y -30 KPX Lslash yacute -30 KPX Lslash ydieresis -30 KPX O A -50 KPX O Aacute -50 KPX O Abreve -50 KPX O Acircumflex -50 KPX O Adieresis -50 KPX O Agrave -50 KPX O Amacron -50 KPX O Aogonek -50 KPX O Aring -50 KPX O Atilde -50 KPX O T -40 KPX O Tcaron -40 KPX O Tcommaaccent -40 KPX O V -50 KPX O W -50 KPX O X -50 KPX O Y -70 KPX O Yacute -70 KPX O Ydieresis -70 KPX O comma -40 KPX O period -40 KPX Oacute A -50 KPX Oacute Aacute -50 KPX Oacute Abreve -50 KPX Oacute Acircumflex -50 KPX Oacute Adieresis -50 KPX Oacute Agrave -50 KPX Oacute Amacron -50 KPX Oacute Aogonek -50 KPX Oacute Aring -50 KPX Oacute Atilde -50 KPX Oacute T -40 KPX Oacute Tcaron -40 KPX Oacute Tcommaaccent -40 KPX Oacute V -50 KPX Oacute W -50 KPX Oacute X -50 KPX Oacute Y -70 KPX Oacute Yacute -70 KPX Oacute Ydieresis -70 KPX Oacute comma -40 KPX Oacute period -40 KPX Ocircumflex A -50 KPX Ocircumflex Aacute -50 KPX Ocircumflex Abreve -50 KPX Ocircumflex Acircumflex -50 KPX Ocircumflex Adieresis -50 KPX Ocircumflex Agrave -50 KPX Ocircumflex Amacron -50 KPX Ocircumflex Aogonek -50 KPX Ocircumflex Aring -50 KPX Ocircumflex Atilde -50 KPX Ocircumflex T -40 KPX Ocircumflex Tcaron -40 KPX Ocircumflex Tcommaaccent -40 KPX Ocircumflex V -50 KPX Ocircumflex W -50 KPX Ocircumflex X -50 KPX Ocircumflex Y -70 KPX Ocircumflex Yacute -70 KPX Ocircumflex Ydieresis -70 KPX Ocircumflex comma -40 KPX Ocircumflex period -40 KPX Odieresis A -50 KPX Odieresis Aacute -50 KPX Odieresis Abreve -50 KPX Odieresis Acircumflex -50 KPX Odieresis Adieresis -50 KPX Odieresis Agrave -50 KPX Odieresis Amacron -50 KPX Odieresis Aogonek -50 KPX Odieresis Aring -50 KPX Odieresis Atilde -50 KPX Odieresis T -40 KPX Odieresis Tcaron -40 KPX Odieresis Tcommaaccent -40 KPX Odieresis V -50 KPX Odieresis W -50 KPX Odieresis X -50 KPX Odieresis Y -70 KPX Odieresis Yacute -70 KPX Odieresis Ydieresis -70 KPX Odieresis comma -40 KPX Odieresis period -40 KPX Ograve A -50 KPX Ograve Aacute -50 KPX Ograve Abreve -50 KPX Ograve Acircumflex -50 KPX Ograve Adieresis -50 KPX Ograve Agrave -50 KPX Ograve Amacron -50 KPX Ograve Aogonek -50 KPX Ograve Aring -50 KPX Ograve Atilde -50 KPX Ograve T -40 KPX Ograve Tcaron -40 KPX Ograve Tcommaaccent -40 KPX Ograve V -50 KPX Ograve W -50 KPX Ograve X -50 KPX Ograve Y -70 KPX Ograve Yacute -70 KPX Ograve Ydieresis -70 KPX Ograve comma -40 KPX Ograve period -40 KPX Ohungarumlaut A -50 KPX Ohungarumlaut Aacute -50 KPX Ohungarumlaut Abreve -50 KPX Ohungarumlaut Acircumflex -50 KPX Ohungarumlaut Adieresis -50 KPX Ohungarumlaut Agrave -50 KPX Ohungarumlaut Amacron -50 KPX Ohungarumlaut Aogonek -50 KPX Ohungarumlaut Aring -50 KPX Ohungarumlaut Atilde -50 KPX Ohungarumlaut T -40 KPX Ohungarumlaut Tcaron -40 KPX Ohungarumlaut Tcommaaccent -40 KPX Ohungarumlaut V -50 KPX Ohungarumlaut W -50 KPX Ohungarumlaut X -50 KPX Ohungarumlaut Y -70 KPX Ohungarumlaut Yacute -70 KPX Ohungarumlaut Ydieresis -70 KPX Ohungarumlaut comma -40 KPX Ohungarumlaut period -40 KPX Omacron A -50 KPX Omacron Aacute -50 KPX Omacron Abreve -50 KPX Omacron Acircumflex -50 KPX Omacron Adieresis -50 KPX Omacron Agrave -50 KPX Omacron Amacron -50 KPX Omacron Aogonek -50 KPX Omacron Aring -50 KPX Omacron Atilde -50 KPX Omacron T -40 KPX Omacron Tcaron -40 KPX Omacron Tcommaaccent -40 KPX Omacron V -50 KPX Omacron W -50 KPX Omacron X -50 KPX Omacron Y -70 KPX Omacron Yacute -70 KPX Omacron Ydieresis -70 KPX Omacron comma -40 KPX Omacron period -40 KPX Oslash A -50 KPX Oslash Aacute -50 KPX Oslash Abreve -50 KPX Oslash Acircumflex -50 KPX Oslash Adieresis -50 KPX Oslash Agrave -50 KPX Oslash Amacron -50 KPX Oslash Aogonek -50 KPX Oslash Aring -50 KPX Oslash Atilde -50 KPX Oslash T -40 KPX Oslash Tcaron -40 KPX Oslash Tcommaaccent -40 KPX Oslash V -50 KPX Oslash W -50 KPX Oslash X -50 KPX Oslash Y -70 KPX Oslash Yacute -70 KPX Oslash Ydieresis -70 KPX Oslash comma -40 KPX Oslash period -40 KPX Otilde A -50 KPX Otilde Aacute -50 KPX Otilde Abreve -50 KPX Otilde Acircumflex -50 KPX Otilde Adieresis -50 KPX Otilde Agrave -50 KPX Otilde Amacron -50 KPX Otilde Aogonek -50 KPX Otilde Aring -50 KPX Otilde Atilde -50 KPX Otilde T -40 KPX Otilde Tcaron -40 KPX Otilde Tcommaaccent -40 KPX Otilde V -50 KPX Otilde W -50 KPX Otilde X -50 KPX Otilde Y -70 KPX Otilde Yacute -70 KPX Otilde Ydieresis -70 KPX Otilde comma -40 KPX Otilde period -40 KPX P A -100 KPX P Aacute -100 KPX P Abreve -100 KPX P Acircumflex -100 KPX P Adieresis -100 KPX P Agrave -100 KPX P Amacron -100 KPX P Aogonek -100 KPX P Aring -100 KPX P Atilde -100 KPX P a -30 KPX P aacute -30 KPX P abreve -30 KPX P acircumflex -30 KPX P adieresis -30 KPX P agrave -30 KPX P amacron -30 KPX P aogonek -30 KPX P aring -30 KPX P atilde -30 KPX P comma -120 KPX P e -30 KPX P eacute -30 KPX P ecaron -30 KPX P ecircumflex -30 KPX P edieresis -30 KPX P edotaccent -30 KPX P egrave -30 KPX P emacron -30 KPX P eogonek -30 KPX P o -40 KPX P oacute -40 KPX P ocircumflex -40 KPX P odieresis -40 KPX P ograve -40 KPX P ohungarumlaut -40 KPX P omacron -40 KPX P oslash -40 KPX P otilde -40 KPX P period -120 KPX Q U -10 KPX Q Uacute -10 KPX Q Ucircumflex -10 KPX Q Udieresis -10 KPX Q Ugrave -10 KPX Q Uhungarumlaut -10 KPX Q Umacron -10 KPX Q Uogonek -10 KPX Q Uring -10 KPX Q comma 20 KPX Q period 20 KPX R O -20 KPX R Oacute -20 KPX R Ocircumflex -20 KPX R Odieresis -20 KPX R Ograve -20 KPX R Ohungarumlaut -20 KPX R Omacron -20 KPX R Oslash -20 KPX R Otilde -20 KPX R T -20 KPX R Tcaron -20 KPX R Tcommaaccent -20 KPX R U -20 KPX R Uacute -20 KPX R Ucircumflex -20 KPX R Udieresis -20 KPX R Ugrave -20 KPX R Uhungarumlaut -20 KPX R Umacron -20 KPX R Uogonek -20 KPX R Uring -20 KPX R V -50 KPX R W -40 KPX R Y -50 KPX R Yacute -50 KPX R Ydieresis -50 KPX Racute O -20 KPX Racute Oacute -20 KPX Racute Ocircumflex -20 KPX Racute Odieresis -20 KPX Racute Ograve -20 KPX Racute Ohungarumlaut -20 KPX Racute Omacron -20 KPX Racute Oslash -20 KPX Racute Otilde -20 KPX Racute T -20 KPX Racute Tcaron -20 KPX Racute Tcommaaccent -20 KPX Racute U -20 KPX Racute Uacute -20 KPX Racute Ucircumflex -20 KPX Racute Udieresis -20 KPX Racute Ugrave -20 KPX Racute Uhungarumlaut -20 KPX Racute Umacron -20 KPX Racute Uogonek -20 KPX Racute Uring -20 KPX Racute V -50 KPX Racute W -40 KPX Racute Y -50 KPX Racute Yacute -50 KPX Racute Ydieresis -50 KPX Rcaron O -20 KPX Rcaron Oacute -20 KPX Rcaron Ocircumflex -20 KPX Rcaron Odieresis -20 KPX Rcaron Ograve -20 KPX Rcaron Ohungarumlaut -20 KPX Rcaron Omacron -20 KPX Rcaron Oslash -20 KPX Rcaron Otilde -20 KPX Rcaron T -20 KPX Rcaron Tcaron -20 KPX Rcaron Tcommaaccent -20 KPX Rcaron U -20 KPX Rcaron Uacute -20 KPX Rcaron Ucircumflex -20 KPX Rcaron Udieresis -20 KPX Rcaron Ugrave -20 KPX Rcaron Uhungarumlaut -20 KPX Rcaron Umacron -20 KPX Rcaron Uogonek -20 KPX Rcaron Uring -20 KPX Rcaron V -50 KPX Rcaron W -40 KPX Rcaron Y -50 KPX Rcaron Yacute -50 KPX Rcaron Ydieresis -50 KPX Rcommaaccent O -20 KPX Rcommaaccent Oacute -20 KPX Rcommaaccent Ocircumflex -20 KPX Rcommaaccent Odieresis -20 KPX Rcommaaccent Ograve -20 KPX Rcommaaccent Ohungarumlaut -20 KPX Rcommaaccent Omacron -20 KPX Rcommaaccent Oslash -20 KPX Rcommaaccent Otilde -20 KPX Rcommaaccent T -20 KPX Rcommaaccent Tcaron -20 KPX Rcommaaccent Tcommaaccent -20 KPX Rcommaaccent U -20 KPX Rcommaaccent Uacute -20 KPX Rcommaaccent Ucircumflex -20 KPX Rcommaaccent Udieresis -20 KPX Rcommaaccent Ugrave -20 KPX Rcommaaccent Uhungarumlaut -20 KPX Rcommaaccent Umacron -20 KPX Rcommaaccent Uogonek -20 KPX Rcommaaccent Uring -20 KPX Rcommaaccent V -50 KPX Rcommaaccent W -40 KPX Rcommaaccent Y -50 KPX Rcommaaccent Yacute -50 KPX Rcommaaccent Ydieresis -50 KPX T A -90 KPX T Aacute -90 KPX T Abreve -90 KPX T Acircumflex -90 KPX T Adieresis -90 KPX T Agrave -90 KPX T Amacron -90 KPX T Aogonek -90 KPX T Aring -90 KPX T Atilde -90 KPX T O -40 KPX T Oacute -40 KPX T Ocircumflex -40 KPX T Odieresis -40 KPX T Ograve -40 KPX T Ohungarumlaut -40 KPX T Omacron -40 KPX T Oslash -40 KPX T Otilde -40 KPX T a -80 KPX T aacute -80 KPX T abreve -80 KPX T acircumflex -80 KPX T adieresis -80 KPX T agrave -80 KPX T amacron -80 KPX T aogonek -80 KPX T aring -80 KPX T atilde -80 KPX T colon -40 KPX T comma -80 KPX T e -60 KPX T eacute -60 KPX T ecaron -60 KPX T ecircumflex -60 KPX T edieresis -60 KPX T edotaccent -60 KPX T egrave -60 KPX T emacron -60 KPX T eogonek -60 KPX T hyphen -120 KPX T o -80 KPX T oacute -80 KPX T ocircumflex -80 KPX T odieresis -80 KPX T ograve -80 KPX T ohungarumlaut -80 KPX T omacron -80 KPX T oslash -80 KPX T otilde -80 KPX T period -80 KPX T r -80 KPX T racute -80 KPX T rcommaaccent -80 KPX T semicolon -40 KPX T u -90 KPX T uacute -90 KPX T ucircumflex -90 KPX T udieresis -90 KPX T ugrave -90 KPX T uhungarumlaut -90 KPX T umacron -90 KPX T uogonek -90 KPX T uring -90 KPX T w -60 KPX T y -60 KPX T yacute -60 KPX T ydieresis -60 KPX Tcaron A -90 KPX Tcaron Aacute -90 KPX Tcaron Abreve -90 KPX Tcaron Acircumflex -90 KPX Tcaron Adieresis -90 KPX Tcaron Agrave -90 KPX Tcaron Amacron -90 KPX Tcaron Aogonek -90 KPX Tcaron Aring -90 KPX Tcaron Atilde -90 KPX Tcaron O -40 KPX Tcaron Oacute -40 KPX Tcaron Ocircumflex -40 KPX Tcaron Odieresis -40 KPX Tcaron Ograve -40 KPX Tcaron Ohungarumlaut -40 KPX Tcaron Omacron -40 KPX Tcaron Oslash -40 KPX Tcaron Otilde -40 KPX Tcaron a -80 KPX Tcaron aacute -80 KPX Tcaron abreve -80 KPX Tcaron acircumflex -80 KPX Tcaron adieresis -80 KPX Tcaron agrave -80 KPX Tcaron amacron -80 KPX Tcaron aogonek -80 KPX Tcaron aring -80 KPX Tcaron atilde -80 KPX Tcaron colon -40 KPX Tcaron comma -80 KPX Tcaron e -60 KPX Tcaron eacute -60 KPX Tcaron ecaron -60 KPX Tcaron ecircumflex -60 KPX Tcaron edieresis -60 KPX Tcaron edotaccent -60 KPX Tcaron egrave -60 KPX Tcaron emacron -60 KPX Tcaron eogonek -60 KPX Tcaron hyphen -120 KPX Tcaron o -80 KPX Tcaron oacute -80 KPX Tcaron ocircumflex -80 KPX Tcaron odieresis -80 KPX Tcaron ograve -80 KPX Tcaron ohungarumlaut -80 KPX Tcaron omacron -80 KPX Tcaron oslash -80 KPX Tcaron otilde -80 KPX Tcaron period -80 KPX Tcaron r -80 KPX Tcaron racute -80 KPX Tcaron rcommaaccent -80 KPX Tcaron semicolon -40 KPX Tcaron u -90 KPX Tcaron uacute -90 KPX Tcaron ucircumflex -90 KPX Tcaron udieresis -90 KPX Tcaron ugrave -90 KPX Tcaron uhungarumlaut -90 KPX Tcaron umacron -90 KPX Tcaron uogonek -90 KPX Tcaron uring -90 KPX Tcaron w -60 KPX Tcaron y -60 KPX Tcaron yacute -60 KPX Tcaron ydieresis -60 KPX Tcommaaccent A -90 KPX Tcommaaccent Aacute -90 KPX Tcommaaccent Abreve -90 KPX Tcommaaccent Acircumflex -90 KPX Tcommaaccent Adieresis -90 KPX Tcommaaccent Agrave -90 KPX Tcommaaccent Amacron -90 KPX Tcommaaccent Aogonek -90 KPX Tcommaaccent Aring -90 KPX Tcommaaccent Atilde -90 KPX Tcommaaccent O -40 KPX Tcommaaccent Oacute -40 KPX Tcommaaccent Ocircumflex -40 KPX Tcommaaccent Odieresis -40 KPX Tcommaaccent Ograve -40 KPX Tcommaaccent Ohungarumlaut -40 KPX Tcommaaccent Omacron -40 KPX Tcommaaccent Oslash -40 KPX Tcommaaccent Otilde -40 KPX Tcommaaccent a -80 KPX Tcommaaccent aacute -80 KPX Tcommaaccent abreve -80 KPX Tcommaaccent acircumflex -80 KPX Tcommaaccent adieresis -80 KPX Tcommaaccent agrave -80 KPX Tcommaaccent amacron -80 KPX Tcommaaccent aogonek -80 KPX Tcommaaccent aring -80 KPX Tcommaaccent atilde -80 KPX Tcommaaccent colon -40 KPX Tcommaaccent comma -80 KPX Tcommaaccent e -60 KPX Tcommaaccent eacute -60 KPX Tcommaaccent ecaron -60 KPX Tcommaaccent ecircumflex -60 KPX Tcommaaccent edieresis -60 KPX Tcommaaccent edotaccent -60 KPX Tcommaaccent egrave -60 KPX Tcommaaccent emacron -60 KPX Tcommaaccent eogonek -60 KPX Tcommaaccent hyphen -120 KPX Tcommaaccent o -80 KPX Tcommaaccent oacute -80 KPX Tcommaaccent ocircumflex -80 KPX Tcommaaccent odieresis -80 KPX Tcommaaccent ograve -80 KPX Tcommaaccent ohungarumlaut -80 KPX Tcommaaccent omacron -80 KPX Tcommaaccent oslash -80 KPX Tcommaaccent otilde -80 KPX Tcommaaccent period -80 KPX Tcommaaccent r -80 KPX Tcommaaccent racute -80 KPX Tcommaaccent rcommaaccent -80 KPX Tcommaaccent semicolon -40 KPX Tcommaaccent u -90 KPX Tcommaaccent uacute -90 KPX Tcommaaccent ucircumflex -90 KPX Tcommaaccent udieresis -90 KPX Tcommaaccent ugrave -90 KPX Tcommaaccent uhungarumlaut -90 KPX Tcommaaccent umacron -90 KPX Tcommaaccent uogonek -90 KPX Tcommaaccent uring -90 KPX Tcommaaccent w -60 KPX Tcommaaccent y -60 KPX Tcommaaccent yacute -60 KPX Tcommaaccent ydieresis -60 KPX U A -50 KPX U Aacute -50 KPX U Abreve -50 KPX U Acircumflex -50 KPX U Adieresis -50 KPX U Agrave -50 KPX U Amacron -50 KPX U Aogonek -50 KPX U Aring -50 KPX U Atilde -50 KPX U comma -30 KPX U period -30 KPX Uacute A -50 KPX Uacute Aacute -50 KPX Uacute Abreve -50 KPX Uacute Acircumflex -50 KPX Uacute Adieresis -50 KPX Uacute Agrave -50 KPX Uacute Amacron -50 KPX Uacute Aogonek -50 KPX Uacute Aring -50 KPX Uacute Atilde -50 KPX Uacute comma -30 KPX Uacute period -30 KPX Ucircumflex A -50 KPX Ucircumflex Aacute -50 KPX Ucircumflex Abreve -50 KPX Ucircumflex Acircumflex -50 KPX Ucircumflex Adieresis -50 KPX Ucircumflex Agrave -50 KPX Ucircumflex Amacron -50 KPX Ucircumflex Aogonek -50 KPX Ucircumflex Aring -50 KPX Ucircumflex Atilde -50 KPX Ucircumflex comma -30 KPX Ucircumflex period -30 KPX Udieresis A -50 KPX Udieresis Aacute -50 KPX Udieresis Abreve -50 KPX Udieresis Acircumflex -50 KPX Udieresis Adieresis -50 KPX Udieresis Agrave -50 KPX Udieresis Amacron -50 KPX Udieresis Aogonek -50 KPX Udieresis Aring -50 KPX Udieresis Atilde -50 KPX Udieresis comma -30 KPX Udieresis period -30 KPX Ugrave A -50 KPX Ugrave Aacute -50 KPX Ugrave Abreve -50 KPX Ugrave Acircumflex -50 KPX Ugrave Adieresis -50 KPX Ugrave Agrave -50 KPX Ugrave Amacron -50 KPX Ugrave Aogonek -50 KPX Ugrave Aring -50 KPX Ugrave Atilde -50 KPX Ugrave comma -30 KPX Ugrave period -30 KPX Uhungarumlaut A -50 KPX Uhungarumlaut Aacute -50 KPX Uhungarumlaut Abreve -50 KPX Uhungarumlaut Acircumflex -50 KPX Uhungarumlaut Adieresis -50 KPX Uhungarumlaut Agrave -50 KPX Uhungarumlaut Amacron -50 KPX Uhungarumlaut Aogonek -50 KPX Uhungarumlaut Aring -50 KPX Uhungarumlaut Atilde -50 KPX Uhungarumlaut comma -30 KPX Uhungarumlaut period -30 KPX Umacron A -50 KPX Umacron Aacute -50 KPX Umacron Abreve -50 KPX Umacron Acircumflex -50 KPX Umacron Adieresis -50 KPX Umacron Agrave -50 KPX Umacron Amacron -50 KPX Umacron Aogonek -50 KPX Umacron Aring -50 KPX Umacron Atilde -50 KPX Umacron comma -30 KPX Umacron period -30 KPX Uogonek A -50 KPX Uogonek Aacute -50 KPX Uogonek Abreve -50 KPX Uogonek Acircumflex -50 KPX Uogonek Adieresis -50 KPX Uogonek Agrave -50 KPX Uogonek Amacron -50 KPX Uogonek Aogonek -50 KPX Uogonek Aring -50 KPX Uogonek Atilde -50 KPX Uogonek comma -30 KPX Uogonek period -30 KPX Uring A -50 KPX Uring Aacute -50 KPX Uring Abreve -50 KPX Uring Acircumflex -50 KPX Uring Adieresis -50 KPX Uring Agrave -50 KPX Uring Amacron -50 KPX Uring Aogonek -50 KPX Uring Aring -50 KPX Uring Atilde -50 KPX Uring comma -30 KPX Uring period -30 KPX V A -80 KPX V Aacute -80 KPX V Abreve -80 KPX V Acircumflex -80 KPX V Adieresis -80 KPX V Agrave -80 KPX V Amacron -80 KPX V Aogonek -80 KPX V Aring -80 KPX V Atilde -80 KPX V G -50 KPX V Gbreve -50 KPX V Gcommaaccent -50 KPX V O -50 KPX V Oacute -50 KPX V Ocircumflex -50 KPX V Odieresis -50 KPX V Ograve -50 KPX V Ohungarumlaut -50 KPX V Omacron -50 KPX V Oslash -50 KPX V Otilde -50 KPX V a -60 KPX V aacute -60 KPX V abreve -60 KPX V acircumflex -60 KPX V adieresis -60 KPX V agrave -60 KPX V amacron -60 KPX V aogonek -60 KPX V aring -60 KPX V atilde -60 KPX V colon -40 KPX V comma -120 KPX V e -50 KPX V eacute -50 KPX V ecaron -50 KPX V ecircumflex -50 KPX V edieresis -50 KPX V edotaccent -50 KPX V egrave -50 KPX V emacron -50 KPX V eogonek -50 KPX V hyphen -80 KPX V o -90 KPX V oacute -90 KPX V ocircumflex -90 KPX V odieresis -90 KPX V ograve -90 KPX V ohungarumlaut -90 KPX V omacron -90 KPX V oslash -90 KPX V otilde -90 KPX V period -120 KPX V semicolon -40 KPX V u -60 KPX V uacute -60 KPX V ucircumflex -60 KPX V udieresis -60 KPX V ugrave -60 KPX V uhungarumlaut -60 KPX V umacron -60 KPX V uogonek -60 KPX V uring -60 KPX W A -60 KPX W Aacute -60 KPX W Abreve -60 KPX W Acircumflex -60 KPX W Adieresis -60 KPX W Agrave -60 KPX W Amacron -60 KPX W Aogonek -60 KPX W Aring -60 KPX W Atilde -60 KPX W O -20 KPX W Oacute -20 KPX W Ocircumflex -20 KPX W Odieresis -20 KPX W Ograve -20 KPX W Ohungarumlaut -20 KPX W Omacron -20 KPX W Oslash -20 KPX W Otilde -20 KPX W a -40 KPX W aacute -40 KPX W abreve -40 KPX W acircumflex -40 KPX W adieresis -40 KPX W agrave -40 KPX W amacron -40 KPX W aogonek -40 KPX W aring -40 KPX W atilde -40 KPX W colon -10 KPX W comma -80 KPX W e -35 KPX W eacute -35 KPX W ecaron -35 KPX W ecircumflex -35 KPX W edieresis -35 KPX W edotaccent -35 KPX W egrave -35 KPX W emacron -35 KPX W eogonek -35 KPX W hyphen -40 KPX W o -60 KPX W oacute -60 KPX W ocircumflex -60 KPX W odieresis -60 KPX W ograve -60 KPX W ohungarumlaut -60 KPX W omacron -60 KPX W oslash -60 KPX W otilde -60 KPX W period -80 KPX W semicolon -10 KPX W u -45 KPX W uacute -45 KPX W ucircumflex -45 KPX W udieresis -45 KPX W ugrave -45 KPX W uhungarumlaut -45 KPX W umacron -45 KPX W uogonek -45 KPX W uring -45 KPX W y -20 KPX W yacute -20 KPX W ydieresis -20 KPX Y A -110 KPX Y Aacute -110 KPX Y Abreve -110 KPX Y Acircumflex -110 KPX Y Adieresis -110 KPX Y Agrave -110 KPX Y Amacron -110 KPX Y Aogonek -110 KPX Y Aring -110 KPX Y Atilde -110 KPX Y O -70 KPX Y Oacute -70 KPX Y Ocircumflex -70 KPX Y Odieresis -70 KPX Y Ograve -70 KPX Y Ohungarumlaut -70 KPX Y Omacron -70 KPX Y Oslash -70 KPX Y Otilde -70 KPX Y a -90 KPX Y aacute -90 KPX Y abreve -90 KPX Y acircumflex -90 KPX Y adieresis -90 KPX Y agrave -90 KPX Y amacron -90 KPX Y aogonek -90 KPX Y aring -90 KPX Y atilde -90 KPX Y colon -50 KPX Y comma -100 KPX Y e -80 KPX Y eacute -80 KPX Y ecaron -80 KPX Y ecircumflex -80 KPX Y edieresis -80 KPX Y edotaccent -80 KPX Y egrave -80 KPX Y emacron -80 KPX Y eogonek -80 KPX Y o -100 KPX Y oacute -100 KPX Y ocircumflex -100 KPX Y odieresis -100 KPX Y ograve -100 KPX Y ohungarumlaut -100 KPX Y omacron -100 KPX Y oslash -100 KPX Y otilde -100 KPX Y period -100 KPX Y semicolon -50 KPX Y u -100 KPX Y uacute -100 KPX Y ucircumflex -100 KPX Y udieresis -100 KPX Y ugrave -100 KPX Y uhungarumlaut -100 KPX Y umacron -100 KPX Y uogonek -100 KPX Y uring -100 KPX Yacute A -110 KPX Yacute Aacute -110 KPX Yacute Abreve -110 KPX Yacute Acircumflex -110 KPX Yacute Adieresis -110 KPX Yacute Agrave -110 KPX Yacute Amacron -110 KPX Yacute Aogonek -110 KPX Yacute Aring -110 KPX Yacute Atilde -110 KPX Yacute O -70 KPX Yacute Oacute -70 KPX Yacute Ocircumflex -70 KPX Yacute Odieresis -70 KPX Yacute Ograve -70 KPX Yacute Ohungarumlaut -70 KPX Yacute Omacron -70 KPX Yacute Oslash -70 KPX Yacute Otilde -70 KPX Yacute a -90 KPX Yacute aacute -90 KPX Yacute abreve -90 KPX Yacute acircumflex -90 KPX Yacute adieresis -90 KPX Yacute agrave -90 KPX Yacute amacron -90 KPX Yacute aogonek -90 KPX Yacute aring -90 KPX Yacute atilde -90 KPX Yacute colon -50 KPX Yacute comma -100 KPX Yacute e -80 KPX Yacute eacute -80 KPX Yacute ecaron -80 KPX Yacute ecircumflex -80 KPX Yacute edieresis -80 KPX Yacute edotaccent -80 KPX Yacute egrave -80 KPX Yacute emacron -80 KPX Yacute eogonek -80 KPX Yacute o -100 KPX Yacute oacute -100 KPX Yacute ocircumflex -100 KPX Yacute odieresis -100 KPX Yacute ograve -100 KPX Yacute ohungarumlaut -100 KPX Yacute omacron -100 KPX Yacute oslash -100 KPX Yacute otilde -100 KPX Yacute period -100 KPX Yacute semicolon -50 KPX Yacute u -100 KPX Yacute uacute -100 KPX Yacute ucircumflex -100 KPX Yacute udieresis -100 KPX Yacute ugrave -100 KPX Yacute uhungarumlaut -100 KPX Yacute umacron -100 KPX Yacute uogonek -100 KPX Yacute uring -100 KPX Ydieresis A -110 KPX Ydieresis Aacute -110 KPX Ydieresis Abreve -110 KPX Ydieresis Acircumflex -110 KPX Ydieresis Adieresis -110 KPX Ydieresis Agrave -110 KPX Ydieresis Amacron -110 KPX Ydieresis Aogonek -110 KPX Ydieresis Aring -110 KPX Ydieresis Atilde -110 KPX Ydieresis O -70 KPX Ydieresis Oacute -70 KPX Ydieresis Ocircumflex -70 KPX Ydieresis Odieresis -70 KPX Ydieresis Ograve -70 KPX Ydieresis Ohungarumlaut -70 KPX Ydieresis Omacron -70 KPX Ydieresis Oslash -70 KPX Ydieresis Otilde -70 KPX Ydieresis a -90 KPX Ydieresis aacute -90 KPX Ydieresis abreve -90 KPX Ydieresis acircumflex -90 KPX Ydieresis adieresis -90 KPX Ydieresis agrave -90 KPX Ydieresis amacron -90 KPX Ydieresis aogonek -90 KPX Ydieresis aring -90 KPX Ydieresis atilde -90 KPX Ydieresis colon -50 KPX Ydieresis comma -100 KPX Ydieresis e -80 KPX Ydieresis eacute -80 KPX Ydieresis ecaron -80 KPX Ydieresis ecircumflex -80 KPX Ydieresis edieresis -80 KPX Ydieresis edotaccent -80 KPX Ydieresis egrave -80 KPX Ydieresis emacron -80 KPX Ydieresis eogonek -80 KPX Ydieresis o -100 KPX Ydieresis oacute -100 KPX Ydieresis ocircumflex -100 KPX Ydieresis odieresis -100 KPX Ydieresis ograve -100 KPX Ydieresis ohungarumlaut -100 KPX Ydieresis omacron -100 KPX Ydieresis oslash -100 KPX Ydieresis otilde -100 KPX Ydieresis period -100 KPX Ydieresis semicolon -50 KPX Ydieresis u -100 KPX Ydieresis uacute -100 KPX Ydieresis ucircumflex -100 KPX Ydieresis udieresis -100 KPX Ydieresis ugrave -100 KPX Ydieresis uhungarumlaut -100 KPX Ydieresis umacron -100 KPX Ydieresis uogonek -100 KPX Ydieresis uring -100 KPX a g -10 KPX a gbreve -10 KPX a gcommaaccent -10 KPX a v -15 KPX a w -15 KPX a y -20 KPX a yacute -20 KPX a ydieresis -20 KPX aacute g -10 KPX aacute gbreve -10 KPX aacute gcommaaccent -10 KPX aacute v -15 KPX aacute w -15 KPX aacute y -20 KPX aacute yacute -20 KPX aacute ydieresis -20 KPX abreve g -10 KPX abreve gbreve -10 KPX abreve gcommaaccent -10 KPX abreve v -15 KPX abreve w -15 KPX abreve y -20 KPX abreve yacute -20 KPX abreve ydieresis -20 KPX acircumflex g -10 KPX acircumflex gbreve -10 KPX acircumflex gcommaaccent -10 KPX acircumflex v -15 KPX acircumflex w -15 KPX acircumflex y -20 KPX acircumflex yacute -20 KPX acircumflex ydieresis -20 KPX adieresis g -10 KPX adieresis gbreve -10 KPX adieresis gcommaaccent -10 KPX adieresis v -15 KPX adieresis w -15 KPX adieresis y -20 KPX adieresis yacute -20 KPX adieresis ydieresis -20 KPX agrave g -10 KPX agrave gbreve -10 KPX agrave gcommaaccent -10 KPX agrave v -15 KPX agrave w -15 KPX agrave y -20 KPX agrave yacute -20 KPX agrave ydieresis -20 KPX amacron g -10 KPX amacron gbreve -10 KPX amacron gcommaaccent -10 KPX amacron v -15 KPX amacron w -15 KPX amacron y -20 KPX amacron yacute -20 KPX amacron ydieresis -20 KPX aogonek g -10 KPX aogonek gbreve -10 KPX aogonek gcommaaccent -10 KPX aogonek v -15 KPX aogonek w -15 KPX aogonek y -20 KPX aogonek yacute -20 KPX aogonek ydieresis -20 KPX aring g -10 KPX aring gbreve -10 KPX aring gcommaaccent -10 KPX aring v -15 KPX aring w -15 KPX aring y -20 KPX aring yacute -20 KPX aring ydieresis -20 KPX atilde g -10 KPX atilde gbreve -10 KPX atilde gcommaaccent -10 KPX atilde v -15 KPX atilde w -15 KPX atilde y -20 KPX atilde yacute -20 KPX atilde ydieresis -20 KPX b l -10 KPX b lacute -10 KPX b lcommaaccent -10 KPX b lslash -10 KPX b u -20 KPX b uacute -20 KPX b ucircumflex -20 KPX b udieresis -20 KPX b ugrave -20 KPX b uhungarumlaut -20 KPX b umacron -20 KPX b uogonek -20 KPX b uring -20 KPX b v -20 KPX b y -20 KPX b yacute -20 KPX b ydieresis -20 KPX c h -10 KPX c k -20 KPX c kcommaaccent -20 KPX c l -20 KPX c lacute -20 KPX c lcommaaccent -20 KPX c lslash -20 KPX c y -10 KPX c yacute -10 KPX c ydieresis -10 KPX cacute h -10 KPX cacute k -20 KPX cacute kcommaaccent -20 KPX cacute l -20 KPX cacute lacute -20 KPX cacute lcommaaccent -20 KPX cacute lslash -20 KPX cacute y -10 KPX cacute yacute -10 KPX cacute ydieresis -10 KPX ccaron h -10 KPX ccaron k -20 KPX ccaron kcommaaccent -20 KPX ccaron l -20 KPX ccaron lacute -20 KPX ccaron lcommaaccent -20 KPX ccaron lslash -20 KPX ccaron y -10 KPX ccaron yacute -10 KPX ccaron ydieresis -10 KPX ccedilla h -10 KPX ccedilla k -20 KPX ccedilla kcommaaccent -20 KPX ccedilla l -20 KPX ccedilla lacute -20 KPX ccedilla lcommaaccent -20 KPX ccedilla lslash -20 KPX ccedilla y -10 KPX ccedilla yacute -10 KPX ccedilla ydieresis -10 KPX colon space -40 KPX comma quotedblright -120 KPX comma quoteright -120 KPX comma space -40 KPX d d -10 KPX d dcroat -10 KPX d v -15 KPX d w -15 KPX d y -15 KPX d yacute -15 KPX d ydieresis -15 KPX dcroat d -10 KPX dcroat dcroat -10 KPX dcroat v -15 KPX dcroat w -15 KPX dcroat y -15 KPX dcroat yacute -15 KPX dcroat ydieresis -15 KPX e comma 10 KPX e period 20 KPX e v -15 KPX e w -15 KPX e x -15 KPX e y -15 KPX e yacute -15 KPX e ydieresis -15 KPX eacute comma 10 KPX eacute period 20 KPX eacute v -15 KPX eacute w -15 KPX eacute x -15 KPX eacute y -15 KPX eacute yacute -15 KPX eacute ydieresis -15 KPX ecaron comma 10 KPX ecaron period 20 KPX ecaron v -15 KPX ecaron w -15 KPX ecaron x -15 KPX ecaron y -15 KPX ecaron yacute -15 KPX ecaron ydieresis -15 KPX ecircumflex comma 10 KPX ecircumflex period 20 KPX ecircumflex v -15 KPX ecircumflex w -15 KPX ecircumflex x -15 KPX ecircumflex y -15 KPX ecircumflex yacute -15 KPX ecircumflex ydieresis -15 KPX edieresis comma 10 KPX edieresis period 20 KPX edieresis v -15 KPX edieresis w -15 KPX edieresis x -15 KPX edieresis y -15 KPX edieresis yacute -15 KPX edieresis ydieresis -15 KPX edotaccent comma 10 KPX edotaccent period 20 KPX edotaccent v -15 KPX edotaccent w -15 KPX edotaccent x -15 KPX edotaccent y -15 KPX edotaccent yacute -15 KPX edotaccent ydieresis -15 KPX egrave comma 10 KPX egrave period 20 KPX egrave v -15 KPX egrave w -15 KPX egrave x -15 KPX egrave y -15 KPX egrave yacute -15 KPX egrave ydieresis -15 KPX emacron comma 10 KPX emacron period 20 KPX emacron v -15 KPX emacron w -15 KPX emacron x -15 KPX emacron y -15 KPX emacron yacute -15 KPX emacron ydieresis -15 KPX eogonek comma 10 KPX eogonek period 20 KPX eogonek v -15 KPX eogonek w -15 KPX eogonek x -15 KPX eogonek y -15 KPX eogonek yacute -15 KPX eogonek ydieresis -15 KPX f comma -10 KPX f e -10 KPX f eacute -10 KPX f ecaron -10 KPX f ecircumflex -10 KPX f edieresis -10 KPX f edotaccent -10 KPX f egrave -10 KPX f emacron -10 KPX f eogonek -10 KPX f o -20 KPX f oacute -20 KPX f ocircumflex -20 KPX f odieresis -20 KPX f ograve -20 KPX f ohungarumlaut -20 KPX f omacron -20 KPX f oslash -20 KPX f otilde -20 KPX f period -10 KPX f quotedblright 30 KPX f quoteright 30 KPX g e 10 KPX g eacute 10 KPX g ecaron 10 KPX g ecircumflex 10 KPX g edieresis 10 KPX g edotaccent 10 KPX g egrave 10 KPX g emacron 10 KPX g eogonek 10 KPX g g -10 KPX g gbreve -10 KPX g gcommaaccent -10 KPX gbreve e 10 KPX gbreve eacute 10 KPX gbreve ecaron 10 KPX gbreve ecircumflex 10 KPX gbreve edieresis 10 KPX gbreve edotaccent 10 KPX gbreve egrave 10 KPX gbreve emacron 10 KPX gbreve eogonek 10 KPX gbreve g -10 KPX gbreve gbreve -10 KPX gbreve gcommaaccent -10 KPX gcommaaccent e 10 KPX gcommaaccent eacute 10 KPX gcommaaccent ecaron 10 KPX gcommaaccent ecircumflex 10 KPX gcommaaccent edieresis 10 KPX gcommaaccent edotaccent 10 KPX gcommaaccent egrave 10 KPX gcommaaccent emacron 10 KPX gcommaaccent eogonek 10 KPX gcommaaccent g -10 KPX gcommaaccent gbreve -10 KPX gcommaaccent gcommaaccent -10 KPX h y -20 KPX h yacute -20 KPX h ydieresis -20 KPX k o -15 KPX k oacute -15 KPX k ocircumflex -15 KPX k odieresis -15 KPX k ograve -15 KPX k ohungarumlaut -15 KPX k omacron -15 KPX k oslash -15 KPX k otilde -15 KPX kcommaaccent o -15 KPX kcommaaccent oacute -15 KPX kcommaaccent ocircumflex -15 KPX kcommaaccent odieresis -15 KPX kcommaaccent ograve -15 KPX kcommaaccent ohungarumlaut -15 KPX kcommaaccent omacron -15 KPX kcommaaccent oslash -15 KPX kcommaaccent otilde -15 KPX l w -15 KPX l y -15 KPX l yacute -15 KPX l ydieresis -15 KPX lacute w -15 KPX lacute y -15 KPX lacute yacute -15 KPX lacute ydieresis -15 KPX lcommaaccent w -15 KPX lcommaaccent y -15 KPX lcommaaccent yacute -15 KPX lcommaaccent ydieresis -15 KPX lslash w -15 KPX lslash y -15 KPX lslash yacute -15 KPX lslash ydieresis -15 KPX m u -20 KPX m uacute -20 KPX m ucircumflex -20 KPX m udieresis -20 KPX m ugrave -20 KPX m uhungarumlaut -20 KPX m umacron -20 KPX m uogonek -20 KPX m uring -20 KPX m y -30 KPX m yacute -30 KPX m ydieresis -30 KPX n u -10 KPX n uacute -10 KPX n ucircumflex -10 KPX n udieresis -10 KPX n ugrave -10 KPX n uhungarumlaut -10 KPX n umacron -10 KPX n uogonek -10 KPX n uring -10 KPX n v -40 KPX n y -20 KPX n yacute -20 KPX n ydieresis -20 KPX nacute u -10 KPX nacute uacute -10 KPX nacute ucircumflex -10 KPX nacute udieresis -10 KPX nacute ugrave -10 KPX nacute uhungarumlaut -10 KPX nacute umacron -10 KPX nacute uogonek -10 KPX nacute uring -10 KPX nacute v -40 KPX nacute y -20 KPX nacute yacute -20 KPX nacute ydieresis -20 KPX ncaron u -10 KPX ncaron uacute -10 KPX ncaron ucircumflex -10 KPX ncaron udieresis -10 KPX ncaron ugrave -10 KPX ncaron uhungarumlaut -10 KPX ncaron umacron -10 KPX ncaron uogonek -10 KPX ncaron uring -10 KPX ncaron v -40 KPX ncaron y -20 KPX ncaron yacute -20 KPX ncaron ydieresis -20 KPX ncommaaccent u -10 KPX ncommaaccent uacute -10 KPX ncommaaccent ucircumflex -10 KPX ncommaaccent udieresis -10 KPX ncommaaccent ugrave -10 KPX ncommaaccent uhungarumlaut -10 KPX ncommaaccent umacron -10 KPX ncommaaccent uogonek -10 KPX ncommaaccent uring -10 KPX ncommaaccent v -40 KPX ncommaaccent y -20 KPX ncommaaccent yacute -20 KPX ncommaaccent ydieresis -20 KPX ntilde u -10 KPX ntilde uacute -10 KPX ntilde ucircumflex -10 KPX ntilde udieresis -10 KPX ntilde ugrave -10 KPX ntilde uhungarumlaut -10 KPX ntilde umacron -10 KPX ntilde uogonek -10 KPX ntilde uring -10 KPX ntilde v -40 KPX ntilde y -20 KPX ntilde yacute -20 KPX ntilde ydieresis -20 KPX o v -20 KPX o w -15 KPX o x -30 KPX o y -20 KPX o yacute -20 KPX o ydieresis -20 KPX oacute v -20 KPX oacute w -15 KPX oacute x -30 KPX oacute y -20 KPX oacute yacute -20 KPX oacute ydieresis -20 KPX ocircumflex v -20 KPX ocircumflex w -15 KPX ocircumflex x -30 KPX ocircumflex y -20 KPX ocircumflex yacute -20 KPX ocircumflex ydieresis -20 KPX odieresis v -20 KPX odieresis w -15 KPX odieresis x -30 KPX odieresis y -20 KPX odieresis yacute -20 KPX odieresis ydieresis -20 KPX ograve v -20 KPX ograve w -15 KPX ograve x -30 KPX ograve y -20 KPX ograve yacute -20 KPX ograve ydieresis -20 KPX ohungarumlaut v -20 KPX ohungarumlaut w -15 KPX ohungarumlaut x -30 KPX ohungarumlaut y -20 KPX ohungarumlaut yacute -20 KPX ohungarumlaut ydieresis -20 KPX omacron v -20 KPX omacron w -15 KPX omacron x -30 KPX omacron y -20 KPX omacron yacute -20 KPX omacron ydieresis -20 KPX oslash v -20 KPX oslash w -15 KPX oslash x -30 KPX oslash y -20 KPX oslash yacute -20 KPX oslash ydieresis -20 KPX otilde v -20 KPX otilde w -15 KPX otilde x -30 KPX otilde y -20 KPX otilde yacute -20 KPX otilde ydieresis -20 KPX p y -15 KPX p yacute -15 KPX p ydieresis -15 KPX period quotedblright -120 KPX period quoteright -120 KPX period space -40 KPX quotedblright space -80 KPX quoteleft quoteleft -46 KPX quoteright d -80 KPX quoteright dcroat -80 KPX quoteright l -20 KPX quoteright lacute -20 KPX quoteright lcommaaccent -20 KPX quoteright lslash -20 KPX quoteright quoteright -46 KPX quoteright r -40 KPX quoteright racute -40 KPX quoteright rcaron -40 KPX quoteright rcommaaccent -40 KPX quoteright s -60 KPX quoteright sacute -60 KPX quoteright scaron -60 KPX quoteright scedilla -60 KPX quoteright scommaaccent -60 KPX quoteright space -80 KPX quoteright v -20 KPX r c -20 KPX r cacute -20 KPX r ccaron -20 KPX r ccedilla -20 KPX r comma -60 KPX r d -20 KPX r dcroat -20 KPX r g -15 KPX r gbreve -15 KPX r gcommaaccent -15 KPX r hyphen -20 KPX r o -20 KPX r oacute -20 KPX r ocircumflex -20 KPX r odieresis -20 KPX r ograve -20 KPX r ohungarumlaut -20 KPX r omacron -20 KPX r oslash -20 KPX r otilde -20 KPX r period -60 KPX r q -20 KPX r s -15 KPX r sacute -15 KPX r scaron -15 KPX r scedilla -15 KPX r scommaaccent -15 KPX r t 20 KPX r tcommaaccent 20 KPX r v 10 KPX r y 10 KPX r yacute 10 KPX r ydieresis 10 KPX racute c -20 KPX racute cacute -20 KPX racute ccaron -20 KPX racute ccedilla -20 KPX racute comma -60 KPX racute d -20 KPX racute dcroat -20 KPX racute g -15 KPX racute gbreve -15 KPX racute gcommaaccent -15 KPX racute hyphen -20 KPX racute o -20 KPX racute oacute -20 KPX racute ocircumflex -20 KPX racute odieresis -20 KPX racute ograve -20 KPX racute ohungarumlaut -20 KPX racute omacron -20 KPX racute oslash -20 KPX racute otilde -20 KPX racute period -60 KPX racute q -20 KPX racute s -15 KPX racute sacute -15 KPX racute scaron -15 KPX racute scedilla -15 KPX racute scommaaccent -15 KPX racute t 20 KPX racute tcommaaccent 20 KPX racute v 10 KPX racute y 10 KPX racute yacute 10 KPX racute ydieresis 10 KPX rcaron c -20 KPX rcaron cacute -20 KPX rcaron ccaron -20 KPX rcaron ccedilla -20 KPX rcaron comma -60 KPX rcaron d -20 KPX rcaron dcroat -20 KPX rcaron g -15 KPX rcaron gbreve -15 KPX rcaron gcommaaccent -15 KPX rcaron hyphen -20 KPX rcaron o -20 KPX rcaron oacute -20 KPX rcaron ocircumflex -20 KPX rcaron odieresis -20 KPX rcaron ograve -20 KPX rcaron ohungarumlaut -20 KPX rcaron omacron -20 KPX rcaron oslash -20 KPX rcaron otilde -20 KPX rcaron period -60 KPX rcaron q -20 KPX rcaron s -15 KPX rcaron sacute -15 KPX rcaron scaron -15 KPX rcaron scedilla -15 KPX rcaron scommaaccent -15 KPX rcaron t 20 KPX rcaron tcommaaccent 20 KPX rcaron v 10 KPX rcaron y 10 KPX rcaron yacute 10 KPX rcaron ydieresis 10 KPX rcommaaccent c -20 KPX rcommaaccent cacute -20 KPX rcommaaccent ccaron -20 KPX rcommaaccent ccedilla -20 KPX rcommaaccent comma -60 KPX rcommaaccent d -20 KPX rcommaaccent dcroat -20 KPX rcommaaccent g -15 KPX rcommaaccent gbreve -15 KPX rcommaaccent gcommaaccent -15 KPX rcommaaccent hyphen -20 KPX rcommaaccent o -20 KPX rcommaaccent oacute -20 KPX rcommaaccent ocircumflex -20 KPX rcommaaccent odieresis -20 KPX rcommaaccent ograve -20 KPX rcommaaccent ohungarumlaut -20 KPX rcommaaccent omacron -20 KPX rcommaaccent oslash -20 KPX rcommaaccent otilde -20 KPX rcommaaccent period -60 KPX rcommaaccent q -20 KPX rcommaaccent s -15 KPX rcommaaccent sacute -15 KPX rcommaaccent scaron -15 KPX rcommaaccent scedilla -15 KPX rcommaaccent scommaaccent -15 KPX rcommaaccent t 20 KPX rcommaaccent tcommaaccent 20 KPX rcommaaccent v 10 KPX rcommaaccent y 10 KPX rcommaaccent yacute 10 KPX rcommaaccent ydieresis 10 KPX s w -15 KPX sacute w -15 KPX scaron w -15 KPX scedilla w -15 KPX scommaaccent w -15 KPX semicolon space -40 KPX space T -100 KPX space Tcaron -100 KPX space Tcommaaccent -100 KPX space V -80 KPX space W -80 KPX space Y -120 KPX space Yacute -120 KPX space Ydieresis -120 KPX space quotedblleft -80 KPX space quoteleft -60 KPX v a -20 KPX v aacute -20 KPX v abreve -20 KPX v acircumflex -20 KPX v adieresis -20 KPX v agrave -20 KPX v amacron -20 KPX v aogonek -20 KPX v aring -20 KPX v atilde -20 KPX v comma -80 KPX v o -30 KPX v oacute -30 KPX v ocircumflex -30 KPX v odieresis -30 KPX v ograve -30 KPX v ohungarumlaut -30 KPX v omacron -30 KPX v oslash -30 KPX v otilde -30 KPX v period -80 KPX w comma -40 KPX w o -20 KPX w oacute -20 KPX w ocircumflex -20 KPX w odieresis -20 KPX w ograve -20 KPX w ohungarumlaut -20 KPX w omacron -20 KPX w oslash -20 KPX w otilde -20 KPX w period -40 KPX x e -10 KPX x eacute -10 KPX x ecaron -10 KPX x ecircumflex -10 KPX x edieresis -10 KPX x edotaccent -10 KPX x egrave -10 KPX x emacron -10 KPX x eogonek -10 KPX y a -30 KPX y aacute -30 KPX y abreve -30 KPX y acircumflex -30 KPX y adieresis -30 KPX y agrave -30 KPX y amacron -30 KPX y aogonek -30 KPX y aring -30 KPX y atilde -30 KPX y comma -80 KPX y e -10 KPX y eacute -10 KPX y ecaron -10 KPX y ecircumflex -10 KPX y edieresis -10 KPX y edotaccent -10 KPX y egrave -10 KPX y emacron -10 KPX y eogonek -10 KPX y o -25 KPX y oacute -25 KPX y ocircumflex -25 KPX y odieresis -25 KPX y ograve -25 KPX y ohungarumlaut -25 KPX y omacron -25 KPX y oslash -25 KPX y otilde -25 KPX y period -80 KPX yacute a -30 KPX yacute aacute -30 KPX yacute abreve -30 KPX yacute acircumflex -30 KPX yacute adieresis -30 KPX yacute agrave -30 KPX yacute amacron -30 KPX yacute aogonek -30 KPX yacute aring -30 KPX yacute atilde -30 KPX yacute comma -80 KPX yacute e -10 KPX yacute eacute -10 KPX yacute ecaron -10 KPX yacute ecircumflex -10 KPX yacute edieresis -10 KPX yacute edotaccent -10 KPX yacute egrave -10 KPX yacute emacron -10 KPX yacute eogonek -10 KPX yacute o -25 KPX yacute oacute -25 KPX yacute ocircumflex -25 KPX yacute odieresis -25 KPX yacute ograve -25 KPX yacute ohungarumlaut -25 KPX yacute omacron -25 KPX yacute oslash -25 KPX yacute otilde -25 KPX yacute period -80 KPX ydieresis a -30 KPX ydieresis aacute -30 KPX ydieresis abreve -30 KPX ydieresis acircumflex -30 KPX ydieresis adieresis -30 KPX ydieresis agrave -30 KPX ydieresis amacron -30 KPX ydieresis aogonek -30 KPX ydieresis aring -30 KPX ydieresis atilde -30 KPX ydieresis comma -80 KPX ydieresis e -10 KPX ydieresis eacute -10 KPX ydieresis ecaron -10 KPX ydieresis ecircumflex -10 KPX ydieresis edieresis -10 KPX ydieresis edotaccent -10 KPX ydieresis egrave -10 KPX ydieresis emacron -10 KPX ydieresis eogonek -10 KPX ydieresis o -25 KPX ydieresis oacute -25 KPX ydieresis ocircumflex -25 KPX ydieresis odieresis -25 KPX ydieresis ograve -25 KPX ydieresis ohungarumlaut -25 KPX ydieresis omacron -25 KPX ydieresis oslash -25 KPX ydieresis otilde -25 KPX ydieresis period -80 KPX z e 10 KPX z eacute 10 KPX z ecaron 10 KPX z ecircumflex 10 KPX z edieresis 10 KPX z edotaccent 10 KPX z egrave 10 KPX z emacron 10 KPX z eogonek 10 KPX zacute e 10 KPX zacute eacute 10 KPX zacute ecaron 10 KPX zacute ecircumflex 10 KPX zacute edieresis 10 KPX zacute edotaccent 10 KPX zacute egrave 10 KPX zacute emacron 10 KPX zacute eogonek 10 KPX zcaron e 10 KPX zcaron eacute 10 KPX zcaron ecaron 10 KPX zcaron ecircumflex 10 KPX zcaron edieresis 10 KPX zcaron edotaccent 10 KPX zcaron egrave 10 KPX zcaron emacron 10 KPX zcaron eogonek 10 KPX zdotaccent e 10 KPX zdotaccent eacute 10 KPX zdotaccent ecaron 10 KPX zdotaccent ecircumflex 10 KPX zdotaccent edieresis 10 KPX zdotaccent edotaccent 10 KPX zdotaccent egrave 10 KPX zdotaccent emacron 10 KPX zdotaccent eogonek 10 EndKernPairs EndKernData EndFontMetrics ruby-prawn-1.0.0~rc2.orig/data/fonts/MustRead.html0000644000000000000000000000165112114176157020544 0ustar rootroot Core 14 AFM Files - ReadMe or
This file and the 14 PostScript(R) AFM files it accompanies may be used, copied, and distributed for any purpose and without charge, with or without modification, provided that all copyright notices are retained; that the AFM files are not distributed without this file; that all modifications to this file or any of the AFM files are prominently noted in the modified file(s); and that this paragraph is not modified. Adobe Systems has no responsibility or obligation to support the use of the AFM files. Col
ruby-prawn-1.0.0~rc2.orig/data/fonts/Helvetica-Oblique.afm0000644000000000000000000022123012114176157022116 0ustar rootrootStartFontMetrics 4.1 Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved. Comment Creation Date: Thu May 1 12:44:31 1997 Comment UniqueID 43055 Comment VMusage 14960 69346 FontName Helvetica-Oblique FullName Helvetica Oblique FamilyName Helvetica Weight Medium ItalicAngle -12 IsFixedPitch false CharacterSet ExtendedRoman FontBBox -170 -225 1116 931 UnderlinePosition -100 UnderlineThickness 50 Version 002.000 Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. EncodingScheme AdobeStandardEncoding CapHeight 718 XHeight 523 Ascender 718 Descender -207 StdHW 76 StdVW 88 StartCharMetrics 315 C 32 ; WX 278 ; N space ; B 0 0 0 0 ; C 33 ; WX 278 ; N exclam ; B 90 0 340 718 ; C 34 ; WX 355 ; N quotedbl ; B 168 463 438 718 ; C 35 ; WX 556 ; N numbersign ; B 73 0 631 688 ; C 36 ; WX 556 ; N dollar ; B 69 -115 617 775 ; C 37 ; WX 889 ; N percent ; B 147 -19 889 703 ; C 38 ; WX 667 ; N ampersand ; B 77 -15 647 718 ; C 39 ; WX 222 ; N quoteright ; B 151 463 310 718 ; C 40 ; WX 333 ; N parenleft ; B 108 -207 454 733 ; C 41 ; WX 333 ; N parenright ; B -9 -207 337 733 ; C 42 ; WX 389 ; N asterisk ; B 165 431 475 718 ; C 43 ; WX 584 ; N plus ; B 85 0 606 505 ; C 44 ; WX 278 ; N comma ; B 56 -147 214 106 ; C 45 ; WX 333 ; N hyphen ; B 93 232 357 322 ; C 46 ; WX 278 ; N period ; B 87 0 214 106 ; C 47 ; WX 278 ; N slash ; B -21 -19 452 737 ; C 48 ; WX 556 ; N zero ; B 93 -19 608 703 ; C 49 ; WX 556 ; N one ; B 207 0 508 703 ; C 50 ; WX 556 ; N two ; B 26 0 617 703 ; C 51 ; WX 556 ; N three ; B 75 -19 610 703 ; C 52 ; WX 556 ; N four ; B 61 0 576 703 ; C 53 ; WX 556 ; N five ; B 68 -19 621 688 ; C 54 ; WX 556 ; N six ; B 91 -19 615 703 ; C 55 ; WX 556 ; N seven ; B 137 0 669 688 ; C 56 ; WX 556 ; N eight ; B 74 -19 607 703 ; C 57 ; WX 556 ; N nine ; B 82 -19 609 703 ; C 58 ; WX 278 ; N colon ; B 87 0 301 516 ; C 59 ; WX 278 ; N semicolon ; B 56 -147 301 516 ; C 60 ; WX 584 ; N less ; B 94 11 641 495 ; C 61 ; WX 584 ; N equal ; B 63 115 628 390 ; C 62 ; WX 584 ; N greater ; B 50 11 597 495 ; C 63 ; WX 556 ; N question ; B 161 0 610 727 ; C 64 ; WX 1015 ; N at ; B 215 -19 965 737 ; C 65 ; WX 667 ; N A ; B 14 0 654 718 ; C 66 ; WX 667 ; N B ; B 74 0 712 718 ; C 67 ; WX 722 ; N C ; B 108 -19 782 737 ; C 68 ; WX 722 ; N D ; B 81 0 764 718 ; C 69 ; WX 667 ; N E ; B 86 0 762 718 ; C 70 ; WX 611 ; N F ; B 86 0 736 718 ; C 71 ; WX 778 ; N G ; B 111 -19 799 737 ; C 72 ; WX 722 ; N H ; B 77 0 799 718 ; C 73 ; WX 278 ; N I ; B 91 0 341 718 ; C 74 ; WX 500 ; N J ; B 47 -19 581 718 ; C 75 ; WX 667 ; N K ; B 76 0 808 718 ; C 76 ; WX 556 ; N L ; B 76 0 555 718 ; C 77 ; WX 833 ; N M ; B 73 0 914 718 ; C 78 ; WX 722 ; N N ; B 76 0 799 718 ; C 79 ; WX 778 ; N O ; B 105 -19 826 737 ; C 80 ; WX 667 ; N P ; B 86 0 737 718 ; C 81 ; WX 778 ; N Q ; B 105 -56 826 737 ; C 82 ; WX 722 ; N R ; B 88 0 773 718 ; C 83 ; WX 667 ; N S ; B 90 -19 713 737 ; C 84 ; WX 611 ; N T ; B 148 0 750 718 ; C 85 ; WX 722 ; N U ; B 123 -19 797 718 ; C 86 ; WX 667 ; N V ; B 173 0 800 718 ; C 87 ; WX 944 ; N W ; B 169 0 1081 718 ; C 88 ; WX 667 ; N X ; B 19 0 790 718 ; C 89 ; WX 667 ; N Y ; B 167 0 806 718 ; C 90 ; WX 611 ; N Z ; B 23 0 741 718 ; C 91 ; WX 278 ; N bracketleft ; B 21 -196 403 722 ; C 92 ; WX 278 ; N backslash ; B 140 -19 291 737 ; C 93 ; WX 278 ; N bracketright ; B -14 -196 368 722 ; C 94 ; WX 469 ; N asciicircum ; B 42 264 539 688 ; C 95 ; WX 556 ; N underscore ; B -27 -125 540 -75 ; C 96 ; WX 222 ; N quoteleft ; B 165 470 323 725 ; C 97 ; WX 556 ; N a ; B 61 -15 559 538 ; C 98 ; WX 556 ; N b ; B 58 -15 584 718 ; C 99 ; WX 500 ; N c ; B 74 -15 553 538 ; C 100 ; WX 556 ; N d ; B 84 -15 652 718 ; C 101 ; WX 556 ; N e ; B 84 -15 578 538 ; C 102 ; WX 278 ; N f ; B 86 0 416 728 ; L i fi ; L l fl ; C 103 ; WX 556 ; N g ; B 42 -220 610 538 ; C 104 ; WX 556 ; N h ; B 65 0 573 718 ; C 105 ; WX 222 ; N i ; B 67 0 308 718 ; C 106 ; WX 222 ; N j ; B -60 -210 308 718 ; C 107 ; WX 500 ; N k ; B 67 0 600 718 ; C 108 ; WX 222 ; N l ; B 67 0 308 718 ; C 109 ; WX 833 ; N m ; B 65 0 852 538 ; C 110 ; WX 556 ; N n ; B 65 0 573 538 ; C 111 ; WX 556 ; N o ; B 83 -14 585 538 ; C 112 ; WX 556 ; N p ; B 14 -207 584 538 ; C 113 ; WX 556 ; N q ; B 84 -207 605 538 ; C 114 ; WX 333 ; N r ; B 77 0 446 538 ; C 115 ; WX 500 ; N s ; B 63 -15 529 538 ; C 116 ; WX 278 ; N t ; B 102 -7 368 669 ; C 117 ; WX 556 ; N u ; B 94 -15 600 523 ; C 118 ; WX 500 ; N v ; B 119 0 603 523 ; C 119 ; WX 722 ; N w ; B 125 0 820 523 ; C 120 ; WX 500 ; N x ; B 11 0 594 523 ; C 121 ; WX 500 ; N y ; B 15 -214 600 523 ; C 122 ; WX 500 ; N z ; B 31 0 571 523 ; C 123 ; WX 334 ; N braceleft ; B 92 -196 445 722 ; C 124 ; WX 260 ; N bar ; B 46 -225 332 775 ; C 125 ; WX 334 ; N braceright ; B 0 -196 354 722 ; C 126 ; WX 584 ; N asciitilde ; B 111 180 580 326 ; C 161 ; WX 333 ; N exclamdown ; B 77 -195 326 523 ; C 162 ; WX 556 ; N cent ; B 95 -115 584 623 ; C 163 ; WX 556 ; N sterling ; B 49 -16 634 718 ; C 164 ; WX 167 ; N fraction ; B -170 -19 482 703 ; C 165 ; WX 556 ; N yen ; B 81 0 699 688 ; C 166 ; WX 556 ; N florin ; B -52 -207 654 737 ; C 167 ; WX 556 ; N section ; B 76 -191 584 737 ; C 168 ; WX 556 ; N currency ; B 60 99 646 603 ; C 169 ; WX 191 ; N quotesingle ; B 157 463 285 718 ; C 170 ; WX 333 ; N quotedblleft ; B 138 470 461 725 ; C 171 ; WX 556 ; N guillemotleft ; B 146 108 554 446 ; C 172 ; WX 333 ; N guilsinglleft ; B 137 108 340 446 ; C 173 ; WX 333 ; N guilsinglright ; B 111 108 314 446 ; C 174 ; WX 500 ; N fi ; B 86 0 587 728 ; C 175 ; WX 500 ; N fl ; B 86 0 585 728 ; C 177 ; WX 556 ; N endash ; B 51 240 623 313 ; C 178 ; WX 556 ; N dagger ; B 135 -159 622 718 ; C 179 ; WX 556 ; N daggerdbl ; B 52 -159 623 718 ; C 180 ; WX 278 ; N periodcentered ; B 129 190 257 315 ; C 182 ; WX 537 ; N paragraph ; B 126 -173 650 718 ; C 183 ; WX 350 ; N bullet ; B 91 202 413 517 ; C 184 ; WX 222 ; N quotesinglbase ; B 21 -149 180 106 ; C 185 ; WX 333 ; N quotedblbase ; B -6 -149 318 106 ; C 186 ; WX 333 ; N quotedblright ; B 124 463 448 718 ; C 187 ; WX 556 ; N guillemotright ; B 120 108 528 446 ; C 188 ; WX 1000 ; N ellipsis ; B 115 0 908 106 ; C 189 ; WX 1000 ; N perthousand ; B 88 -19 1029 703 ; C 191 ; WX 611 ; N questiondown ; B 85 -201 534 525 ; C 193 ; WX 333 ; N grave ; B 170 593 337 734 ; C 194 ; WX 333 ; N acute ; B 248 593 475 734 ; C 195 ; WX 333 ; N circumflex ; B 147 593 438 734 ; C 196 ; WX 333 ; N tilde ; B 125 606 490 722 ; C 197 ; WX 333 ; N macron ; B 143 627 468 684 ; C 198 ; WX 333 ; N breve ; B 167 595 476 731 ; C 199 ; WX 333 ; N dotaccent ; B 249 604 362 706 ; C 200 ; WX 333 ; N dieresis ; B 168 604 443 706 ; C 202 ; WX 333 ; N ring ; B 214 572 402 756 ; C 203 ; WX 333 ; N cedilla ; B 2 -225 232 0 ; C 205 ; WX 333 ; N hungarumlaut ; B 157 593 565 734 ; C 206 ; WX 333 ; N ogonek ; B 43 -225 249 0 ; C 207 ; WX 333 ; N caron ; B 177 593 468 734 ; C 208 ; WX 1000 ; N emdash ; B 51 240 1067 313 ; C 225 ; WX 1000 ; N AE ; B 8 0 1097 718 ; C 227 ; WX 370 ; N ordfeminine ; B 127 405 449 737 ; C 232 ; WX 556 ; N Lslash ; B 41 0 555 718 ; C 233 ; WX 778 ; N Oslash ; B 43 -19 890 737 ; C 234 ; WX 1000 ; N OE ; B 98 -19 1116 737 ; C 235 ; WX 365 ; N ordmasculine ; B 141 405 468 737 ; C 241 ; WX 889 ; N ae ; B 61 -15 909 538 ; C 245 ; WX 278 ; N dotlessi ; B 95 0 294 523 ; C 248 ; WX 222 ; N lslash ; B 41 0 347 718 ; C 249 ; WX 611 ; N oslash ; B 29 -22 647 545 ; C 250 ; WX 944 ; N oe ; B 83 -15 964 538 ; C 251 ; WX 611 ; N germandbls ; B 67 -15 658 728 ; C -1 ; WX 278 ; N Idieresis ; B 91 0 458 901 ; C -1 ; WX 556 ; N eacute ; B 84 -15 587 734 ; C -1 ; WX 556 ; N abreve ; B 61 -15 578 731 ; C -1 ; WX 556 ; N uhungarumlaut ; B 94 -15 677 734 ; C -1 ; WX 556 ; N ecaron ; B 84 -15 580 734 ; C -1 ; WX 667 ; N Ydieresis ; B 167 0 806 901 ; C -1 ; WX 584 ; N divide ; B 85 -19 606 524 ; C -1 ; WX 667 ; N Yacute ; B 167 0 806 929 ; C -1 ; WX 667 ; N Acircumflex ; B 14 0 654 929 ; C -1 ; WX 556 ; N aacute ; B 61 -15 587 734 ; C -1 ; WX 722 ; N Ucircumflex ; B 123 -19 797 929 ; C -1 ; WX 500 ; N yacute ; B 15 -214 600 734 ; C -1 ; WX 500 ; N scommaaccent ; B 63 -225 529 538 ; C -1 ; WX 556 ; N ecircumflex ; B 84 -15 578 734 ; C -1 ; WX 722 ; N Uring ; B 123 -19 797 931 ; C -1 ; WX 722 ; N Udieresis ; B 123 -19 797 901 ; C -1 ; WX 556 ; N aogonek ; B 61 -220 559 538 ; C -1 ; WX 722 ; N Uacute ; B 123 -19 797 929 ; C -1 ; WX 556 ; N uogonek ; B 94 -225 600 523 ; C -1 ; WX 667 ; N Edieresis ; B 86 0 762 901 ; C -1 ; WX 722 ; N Dcroat ; B 69 0 764 718 ; C -1 ; WX 250 ; N commaaccent ; B 39 -225 172 -40 ; C -1 ; WX 737 ; N copyright ; B 54 -19 837 737 ; C -1 ; WX 667 ; N Emacron ; B 86 0 762 879 ; C -1 ; WX 500 ; N ccaron ; B 74 -15 553 734 ; C -1 ; WX 556 ; N aring ; B 61 -15 559 756 ; C -1 ; WX 722 ; N Ncommaaccent ; B 76 -225 799 718 ; C -1 ; WX 222 ; N lacute ; B 67 0 461 929 ; C -1 ; WX 556 ; N agrave ; B 61 -15 559 734 ; C -1 ; WX 611 ; N Tcommaaccent ; B 148 -225 750 718 ; C -1 ; WX 722 ; N Cacute ; B 108 -19 782 929 ; C -1 ; WX 556 ; N atilde ; B 61 -15 592 722 ; C -1 ; WX 667 ; N Edotaccent ; B 86 0 762 901 ; C -1 ; WX 500 ; N scaron ; B 63 -15 552 734 ; C -1 ; WX 500 ; N scedilla ; B 63 -225 529 538 ; C -1 ; WX 278 ; N iacute ; B 95 0 448 734 ; C -1 ; WX 471 ; N lozenge ; B 88 0 540 728 ; C -1 ; WX 722 ; N Rcaron ; B 88 0 773 929 ; C -1 ; WX 778 ; N Gcommaaccent ; B 111 -225 799 737 ; C -1 ; WX 556 ; N ucircumflex ; B 94 -15 600 734 ; C -1 ; WX 556 ; N acircumflex ; B 61 -15 559 734 ; C -1 ; WX 667 ; N Amacron ; B 14 0 677 879 ; C -1 ; WX 333 ; N rcaron ; B 77 0 508 734 ; C -1 ; WX 500 ; N ccedilla ; B 74 -225 553 538 ; C -1 ; WX 611 ; N Zdotaccent ; B 23 0 741 901 ; C -1 ; WX 667 ; N Thorn ; B 86 0 712 718 ; C -1 ; WX 778 ; N Omacron ; B 105 -19 826 879 ; C -1 ; WX 722 ; N Racute ; B 88 0 773 929 ; C -1 ; WX 667 ; N Sacute ; B 90 -19 713 929 ; C -1 ; WX 643 ; N dcaron ; B 84 -15 808 718 ; C -1 ; WX 722 ; N Umacron ; B 123 -19 797 879 ; C -1 ; WX 556 ; N uring ; B 94 -15 600 756 ; C -1 ; WX 333 ; N threesuperior ; B 90 270 436 703 ; C -1 ; WX 778 ; N Ograve ; B 105 -19 826 929 ; C -1 ; WX 667 ; N Agrave ; B 14 0 654 929 ; C -1 ; WX 667 ; N Abreve ; B 14 0 685 926 ; C -1 ; WX 584 ; N multiply ; B 50 0 642 506 ; C -1 ; WX 556 ; N uacute ; B 94 -15 600 734 ; C -1 ; WX 611 ; N Tcaron ; B 148 0 750 929 ; C -1 ; WX 476 ; N partialdiff ; B 41 -38 550 714 ; C -1 ; WX 500 ; N ydieresis ; B 15 -214 600 706 ; C -1 ; WX 722 ; N Nacute ; B 76 0 799 929 ; C -1 ; WX 278 ; N icircumflex ; B 95 0 411 734 ; C -1 ; WX 667 ; N Ecircumflex ; B 86 0 762 929 ; C -1 ; WX 556 ; N adieresis ; B 61 -15 559 706 ; C -1 ; WX 556 ; N edieresis ; B 84 -15 578 706 ; C -1 ; WX 500 ; N cacute ; B 74 -15 559 734 ; C -1 ; WX 556 ; N nacute ; B 65 0 587 734 ; C -1 ; WX 556 ; N umacron ; B 94 -15 600 684 ; C -1 ; WX 722 ; N Ncaron ; B 76 0 799 929 ; C -1 ; WX 278 ; N Iacute ; B 91 0 489 929 ; C -1 ; WX 584 ; N plusminus ; B 39 0 618 506 ; C -1 ; WX 260 ; N brokenbar ; B 62 -150 316 700 ; C -1 ; WX 737 ; N registered ; B 54 -19 837 737 ; C -1 ; WX 778 ; N Gbreve ; B 111 -19 799 926 ; C -1 ; WX 278 ; N Idotaccent ; B 91 0 377 901 ; C -1 ; WX 600 ; N summation ; B 15 -10 671 706 ; C -1 ; WX 667 ; N Egrave ; B 86 0 762 929 ; C -1 ; WX 333 ; N racute ; B 77 0 475 734 ; C -1 ; WX 556 ; N omacron ; B 83 -14 585 684 ; C -1 ; WX 611 ; N Zacute ; B 23 0 741 929 ; C -1 ; WX 611 ; N Zcaron ; B 23 0 741 929 ; C -1 ; WX 549 ; N greaterequal ; B 26 0 620 674 ; C -1 ; WX 722 ; N Eth ; B 69 0 764 718 ; C -1 ; WX 722 ; N Ccedilla ; B 108 -225 782 737 ; C -1 ; WX 222 ; N lcommaaccent ; B 25 -225 308 718 ; C -1 ; WX 317 ; N tcaron ; B 102 -7 501 808 ; C -1 ; WX 556 ; N eogonek ; B 84 -225 578 538 ; C -1 ; WX 722 ; N Uogonek ; B 123 -225 797 718 ; C -1 ; WX 667 ; N Aacute ; B 14 0 683 929 ; C -1 ; WX 667 ; N Adieresis ; B 14 0 654 901 ; C -1 ; WX 556 ; N egrave ; B 84 -15 578 734 ; C -1 ; WX 500 ; N zacute ; B 31 0 571 734 ; C -1 ; WX 222 ; N iogonek ; B -61 -225 308 718 ; C -1 ; WX 778 ; N Oacute ; B 105 -19 826 929 ; C -1 ; WX 556 ; N oacute ; B 83 -14 587 734 ; C -1 ; WX 556 ; N amacron ; B 61 -15 580 684 ; C -1 ; WX 500 ; N sacute ; B 63 -15 559 734 ; C -1 ; WX 278 ; N idieresis ; B 95 0 416 706 ; C -1 ; WX 778 ; N Ocircumflex ; B 105 -19 826 929 ; C -1 ; WX 722 ; N Ugrave ; B 123 -19 797 929 ; C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; C -1 ; WX 556 ; N thorn ; B 14 -207 584 718 ; C -1 ; WX 333 ; N twosuperior ; B 64 281 449 703 ; C -1 ; WX 778 ; N Odieresis ; B 105 -19 826 901 ; C -1 ; WX 556 ; N mu ; B 24 -207 600 523 ; C -1 ; WX 278 ; N igrave ; B 95 0 310 734 ; C -1 ; WX 556 ; N ohungarumlaut ; B 83 -14 677 734 ; C -1 ; WX 667 ; N Eogonek ; B 86 -220 762 718 ; C -1 ; WX 556 ; N dcroat ; B 84 -15 689 718 ; C -1 ; WX 834 ; N threequarters ; B 130 -19 861 703 ; C -1 ; WX 667 ; N Scedilla ; B 90 -225 713 737 ; C -1 ; WX 299 ; N lcaron ; B 67 0 464 718 ; C -1 ; WX 667 ; N Kcommaaccent ; B 76 -225 808 718 ; C -1 ; WX 556 ; N Lacute ; B 76 0 555 929 ; C -1 ; WX 1000 ; N trademark ; B 186 306 1056 718 ; C -1 ; WX 556 ; N edotaccent ; B 84 -15 578 706 ; C -1 ; WX 278 ; N Igrave ; B 91 0 351 929 ; C -1 ; WX 278 ; N Imacron ; B 91 0 483 879 ; C -1 ; WX 556 ; N Lcaron ; B 76 0 570 718 ; C -1 ; WX 834 ; N onehalf ; B 114 -19 839 703 ; C -1 ; WX 549 ; N lessequal ; B 26 0 666 674 ; C -1 ; WX 556 ; N ocircumflex ; B 83 -14 585 734 ; C -1 ; WX 556 ; N ntilde ; B 65 0 592 722 ; C -1 ; WX 722 ; N Uhungarumlaut ; B 123 -19 801 929 ; C -1 ; WX 667 ; N Eacute ; B 86 0 762 929 ; C -1 ; WX 556 ; N emacron ; B 84 -15 580 684 ; C -1 ; WX 556 ; N gbreve ; B 42 -220 610 731 ; C -1 ; WX 834 ; N onequarter ; B 150 -19 802 703 ; C -1 ; WX 667 ; N Scaron ; B 90 -19 713 929 ; C -1 ; WX 667 ; N Scommaaccent ; B 90 -225 713 737 ; C -1 ; WX 778 ; N Ohungarumlaut ; B 105 -19 829 929 ; C -1 ; WX 400 ; N degree ; B 169 411 468 703 ; C -1 ; WX 556 ; N ograve ; B 83 -14 585 734 ; C -1 ; WX 722 ; N Ccaron ; B 108 -19 782 929 ; C -1 ; WX 556 ; N ugrave ; B 94 -15 600 734 ; C -1 ; WX 453 ; N radical ; B 79 -80 617 762 ; C -1 ; WX 722 ; N Dcaron ; B 81 0 764 929 ; C -1 ; WX 333 ; N rcommaaccent ; B 30 -225 446 538 ; C -1 ; WX 722 ; N Ntilde ; B 76 0 799 917 ; C -1 ; WX 556 ; N otilde ; B 83 -14 602 722 ; C -1 ; WX 722 ; N Rcommaaccent ; B 88 -225 773 718 ; C -1 ; WX 556 ; N Lcommaaccent ; B 76 -225 555 718 ; C -1 ; WX 667 ; N Atilde ; B 14 0 699 917 ; C -1 ; WX 667 ; N Aogonek ; B 14 -225 654 718 ; C -1 ; WX 667 ; N Aring ; B 14 0 654 931 ; C -1 ; WX 778 ; N Otilde ; B 105 -19 826 917 ; C -1 ; WX 500 ; N zdotaccent ; B 31 0 571 706 ; C -1 ; WX 667 ; N Ecaron ; B 86 0 762 929 ; C -1 ; WX 278 ; N Iogonek ; B -33 -225 341 718 ; C -1 ; WX 500 ; N kcommaaccent ; B 67 -225 600 718 ; C -1 ; WX 584 ; N minus ; B 85 216 606 289 ; C -1 ; WX 278 ; N Icircumflex ; B 91 0 452 929 ; C -1 ; WX 556 ; N ncaron ; B 65 0 580 734 ; C -1 ; WX 278 ; N tcommaaccent ; B 63 -225 368 669 ; C -1 ; WX 584 ; N logicalnot ; B 106 108 628 390 ; C -1 ; WX 556 ; N odieresis ; B 83 -14 585 706 ; C -1 ; WX 556 ; N udieresis ; B 94 -15 600 706 ; C -1 ; WX 549 ; N notequal ; B 34 -35 623 551 ; C -1 ; WX 556 ; N gcommaaccent ; B 42 -220 610 822 ; C -1 ; WX 556 ; N eth ; B 81 -15 617 737 ; C -1 ; WX 500 ; N zcaron ; B 31 0 571 734 ; C -1 ; WX 556 ; N ncommaaccent ; B 65 -225 573 538 ; C -1 ; WX 333 ; N onesuperior ; B 166 281 371 703 ; C -1 ; WX 278 ; N imacron ; B 95 0 417 684 ; C -1 ; WX 556 ; N Euro ; B 0 0 0 0 ; EndCharMetrics StartKernData StartKernPairs 2705 KPX A C -30 KPX A Cacute -30 KPX A Ccaron -30 KPX A Ccedilla -30 KPX A G -30 KPX A Gbreve -30 KPX A Gcommaaccent -30 KPX A O -30 KPX A Oacute -30 KPX A Ocircumflex -30 KPX A Odieresis -30 KPX A Ograve -30 KPX A Ohungarumlaut -30 KPX A Omacron -30 KPX A Oslash -30 KPX A Otilde -30 KPX A Q -30 KPX A T -120 KPX A Tcaron -120 KPX A Tcommaaccent -120 KPX A U -50 KPX A Uacute -50 KPX A Ucircumflex -50 KPX A Udieresis -50 KPX A Ugrave -50 KPX A Uhungarumlaut -50 KPX A Umacron -50 KPX A Uogonek -50 KPX A Uring -50 KPX A V -70 KPX A W -50 KPX A Y -100 KPX A Yacute -100 KPX A Ydieresis -100 KPX A u -30 KPX A uacute -30 KPX A ucircumflex -30 KPX A udieresis -30 KPX A ugrave -30 KPX A uhungarumlaut -30 KPX A umacron -30 KPX A uogonek -30 KPX A uring -30 KPX A v -40 KPX A w -40 KPX A y -40 KPX A yacute -40 KPX A ydieresis -40 KPX Aacute C -30 KPX Aacute Cacute -30 KPX Aacute Ccaron -30 KPX Aacute Ccedilla -30 KPX Aacute G -30 KPX Aacute Gbreve -30 KPX Aacute Gcommaaccent -30 KPX Aacute O -30 KPX Aacute Oacute -30 KPX Aacute Ocircumflex -30 KPX Aacute Odieresis -30 KPX Aacute Ograve -30 KPX Aacute Ohungarumlaut -30 KPX Aacute Omacron -30 KPX Aacute Oslash -30 KPX Aacute Otilde -30 KPX Aacute Q -30 KPX Aacute T -120 KPX Aacute Tcaron -120 KPX Aacute Tcommaaccent -120 KPX Aacute U -50 KPX Aacute Uacute -50 KPX Aacute Ucircumflex -50 KPX Aacute Udieresis -50 KPX Aacute Ugrave -50 KPX Aacute Uhungarumlaut -50 KPX Aacute Umacron -50 KPX Aacute Uogonek -50 KPX Aacute Uring -50 KPX Aacute V -70 KPX Aacute W -50 KPX Aacute Y -100 KPX Aacute Yacute -100 KPX Aacute Ydieresis -100 KPX Aacute u -30 KPX Aacute uacute -30 KPX Aacute ucircumflex -30 KPX Aacute udieresis -30 KPX Aacute ugrave -30 KPX Aacute uhungarumlaut -30 KPX Aacute umacron -30 KPX Aacute uogonek -30 KPX Aacute uring -30 KPX Aacute v -40 KPX Aacute w -40 KPX Aacute y -40 KPX Aacute yacute -40 KPX Aacute ydieresis -40 KPX Abreve C -30 KPX Abreve Cacute -30 KPX Abreve Ccaron -30 KPX Abreve Ccedilla -30 KPX Abreve G -30 KPX Abreve Gbreve -30 KPX Abreve Gcommaaccent -30 KPX Abreve O -30 KPX Abreve Oacute -30 KPX Abreve Ocircumflex -30 KPX Abreve Odieresis -30 KPX Abreve Ograve -30 KPX Abreve Ohungarumlaut -30 KPX Abreve Omacron -30 KPX Abreve Oslash -30 KPX Abreve Otilde -30 KPX Abreve Q -30 KPX Abreve T -120 KPX Abreve Tcaron -120 KPX Abreve Tcommaaccent -120 KPX Abreve U -50 KPX Abreve Uacute -50 KPX Abreve Ucircumflex -50 KPX Abreve Udieresis -50 KPX Abreve Ugrave -50 KPX Abreve Uhungarumlaut -50 KPX Abreve Umacron -50 KPX Abreve Uogonek -50 KPX Abreve Uring -50 KPX Abreve V -70 KPX Abreve W -50 KPX Abreve Y -100 KPX Abreve Yacute -100 KPX Abreve Ydieresis -100 KPX Abreve u -30 KPX Abreve uacute -30 KPX Abreve ucircumflex -30 KPX Abreve udieresis -30 KPX Abreve ugrave -30 KPX Abreve uhungarumlaut -30 KPX Abreve umacron -30 KPX Abreve uogonek -30 KPX Abreve uring -30 KPX Abreve v -40 KPX Abreve w -40 KPX Abreve y -40 KPX Abreve yacute -40 KPX Abreve ydieresis -40 KPX Acircumflex C -30 KPX Acircumflex Cacute -30 KPX Acircumflex Ccaron -30 KPX Acircumflex Ccedilla -30 KPX Acircumflex G -30 KPX Acircumflex Gbreve -30 KPX Acircumflex Gcommaaccent -30 KPX Acircumflex O -30 KPX Acircumflex Oacute -30 KPX Acircumflex Ocircumflex -30 KPX Acircumflex Odieresis -30 KPX Acircumflex Ograve -30 KPX Acircumflex Ohungarumlaut -30 KPX Acircumflex Omacron -30 KPX Acircumflex Oslash -30 KPX Acircumflex Otilde -30 KPX Acircumflex Q -30 KPX Acircumflex T -120 KPX Acircumflex Tcaron -120 KPX Acircumflex Tcommaaccent -120 KPX Acircumflex U -50 KPX Acircumflex Uacute -50 KPX Acircumflex Ucircumflex -50 KPX Acircumflex Udieresis -50 KPX Acircumflex Ugrave -50 KPX Acircumflex Uhungarumlaut -50 KPX Acircumflex Umacron -50 KPX Acircumflex Uogonek -50 KPX Acircumflex Uring -50 KPX Acircumflex V -70 KPX Acircumflex W -50 KPX Acircumflex Y -100 KPX Acircumflex Yacute -100 KPX Acircumflex Ydieresis -100 KPX Acircumflex u -30 KPX Acircumflex uacute -30 KPX Acircumflex ucircumflex -30 KPX Acircumflex udieresis -30 KPX Acircumflex ugrave -30 KPX Acircumflex uhungarumlaut -30 KPX Acircumflex umacron -30 KPX Acircumflex uogonek -30 KPX Acircumflex uring -30 KPX Acircumflex v -40 KPX Acircumflex w -40 KPX Acircumflex y -40 KPX Acircumflex yacute -40 KPX Acircumflex ydieresis -40 KPX Adieresis C -30 KPX Adieresis Cacute -30 KPX Adieresis Ccaron -30 KPX Adieresis Ccedilla -30 KPX Adieresis G -30 KPX Adieresis Gbreve -30 KPX Adieresis Gcommaaccent -30 KPX Adieresis O -30 KPX Adieresis Oacute -30 KPX Adieresis Ocircumflex -30 KPX Adieresis Odieresis -30 KPX Adieresis Ograve -30 KPX Adieresis Ohungarumlaut -30 KPX Adieresis Omacron -30 KPX Adieresis Oslash -30 KPX Adieresis Otilde -30 KPX Adieresis Q -30 KPX Adieresis T -120 KPX Adieresis Tcaron -120 KPX Adieresis Tcommaaccent -120 KPX Adieresis U -50 KPX Adieresis Uacute -50 KPX Adieresis Ucircumflex -50 KPX Adieresis Udieresis -50 KPX Adieresis Ugrave -50 KPX Adieresis Uhungarumlaut -50 KPX Adieresis Umacron -50 KPX Adieresis Uogonek -50 KPX Adieresis Uring -50 KPX Adieresis V -70 KPX Adieresis W -50 KPX Adieresis Y -100 KPX Adieresis Yacute -100 KPX Adieresis Ydieresis -100 KPX Adieresis u -30 KPX Adieresis uacute -30 KPX Adieresis ucircumflex -30 KPX Adieresis udieresis -30 KPX Adieresis ugrave -30 KPX Adieresis uhungarumlaut -30 KPX Adieresis umacron -30 KPX Adieresis uogonek -30 KPX Adieresis uring -30 KPX Adieresis v -40 KPX Adieresis w -40 KPX Adieresis y -40 KPX Adieresis yacute -40 KPX Adieresis ydieresis -40 KPX Agrave C -30 KPX Agrave Cacute -30 KPX Agrave Ccaron -30 KPX Agrave Ccedilla -30 KPX Agrave G -30 KPX Agrave Gbreve -30 KPX Agrave Gcommaaccent -30 KPX Agrave O -30 KPX Agrave Oacute -30 KPX Agrave Ocircumflex -30 KPX Agrave Odieresis -30 KPX Agrave Ograve -30 KPX Agrave Ohungarumlaut -30 KPX Agrave Omacron -30 KPX Agrave Oslash -30 KPX Agrave Otilde -30 KPX Agrave Q -30 KPX Agrave T -120 KPX Agrave Tcaron -120 KPX Agrave Tcommaaccent -120 KPX Agrave U -50 KPX Agrave Uacute -50 KPX Agrave Ucircumflex -50 KPX Agrave Udieresis -50 KPX Agrave Ugrave -50 KPX Agrave Uhungarumlaut -50 KPX Agrave Umacron -50 KPX Agrave Uogonek -50 KPX Agrave Uring -50 KPX Agrave V -70 KPX Agrave W -50 KPX Agrave Y -100 KPX Agrave Yacute -100 KPX Agrave Ydieresis -100 KPX Agrave u -30 KPX Agrave uacute -30 KPX Agrave ucircumflex -30 KPX Agrave udieresis -30 KPX Agrave ugrave -30 KPX Agrave uhungarumlaut -30 KPX Agrave umacron -30 KPX Agrave uogonek -30 KPX Agrave uring -30 KPX Agrave v -40 KPX Agrave w -40 KPX Agrave y -40 KPX Agrave yacute -40 KPX Agrave ydieresis -40 KPX Amacron C -30 KPX Amacron Cacute -30 KPX Amacron Ccaron -30 KPX Amacron Ccedilla -30 KPX Amacron G -30 KPX Amacron Gbreve -30 KPX Amacron Gcommaaccent -30 KPX Amacron O -30 KPX Amacron Oacute -30 KPX Amacron Ocircumflex -30 KPX Amacron Odieresis -30 KPX Amacron Ograve -30 KPX Amacron Ohungarumlaut -30 KPX Amacron Omacron -30 KPX Amacron Oslash -30 KPX Amacron Otilde -30 KPX Amacron Q -30 KPX Amacron T -120 KPX Amacron Tcaron -120 KPX Amacron Tcommaaccent -120 KPX Amacron U -50 KPX Amacron Uacute -50 KPX Amacron Ucircumflex -50 KPX Amacron Udieresis -50 KPX Amacron Ugrave -50 KPX Amacron Uhungarumlaut -50 KPX Amacron Umacron -50 KPX Amacron Uogonek -50 KPX Amacron Uring -50 KPX Amacron V -70 KPX Amacron W -50 KPX Amacron Y -100 KPX Amacron Yacute -100 KPX Amacron Ydieresis -100 KPX Amacron u -30 KPX Amacron uacute -30 KPX Amacron ucircumflex -30 KPX Amacron udieresis -30 KPX Amacron ugrave -30 KPX Amacron uhungarumlaut -30 KPX Amacron umacron -30 KPX Amacron uogonek -30 KPX Amacron uring -30 KPX Amacron v -40 KPX Amacron w -40 KPX Amacron y -40 KPX Amacron yacute -40 KPX Amacron ydieresis -40 KPX Aogonek C -30 KPX Aogonek Cacute -30 KPX Aogonek Ccaron -30 KPX Aogonek Ccedilla -30 KPX Aogonek G -30 KPX Aogonek Gbreve -30 KPX Aogonek Gcommaaccent -30 KPX Aogonek O -30 KPX Aogonek Oacute -30 KPX Aogonek Ocircumflex -30 KPX Aogonek Odieresis -30 KPX Aogonek Ograve -30 KPX Aogonek Ohungarumlaut -30 KPX Aogonek Omacron -30 KPX Aogonek Oslash -30 KPX Aogonek Otilde -30 KPX Aogonek Q -30 KPX Aogonek T -120 KPX Aogonek Tcaron -120 KPX Aogonek Tcommaaccent -120 KPX Aogonek U -50 KPX Aogonek Uacute -50 KPX Aogonek Ucircumflex -50 KPX Aogonek Udieresis -50 KPX Aogonek Ugrave -50 KPX Aogonek Uhungarumlaut -50 KPX Aogonek Umacron -50 KPX Aogonek Uogonek -50 KPX Aogonek Uring -50 KPX Aogonek V -70 KPX Aogonek W -50 KPX Aogonek Y -100 KPX Aogonek Yacute -100 KPX Aogonek Ydieresis -100 KPX Aogonek u -30 KPX Aogonek uacute -30 KPX Aogonek ucircumflex -30 KPX Aogonek udieresis -30 KPX Aogonek ugrave -30 KPX Aogonek uhungarumlaut -30 KPX Aogonek umacron -30 KPX Aogonek uogonek -30 KPX Aogonek uring -30 KPX Aogonek v -40 KPX Aogonek w -40 KPX Aogonek y -40 KPX Aogonek yacute -40 KPX Aogonek ydieresis -40 KPX Aring C -30 KPX Aring Cacute -30 KPX Aring Ccaron -30 KPX Aring Ccedilla -30 KPX Aring G -30 KPX Aring Gbreve -30 KPX Aring Gcommaaccent -30 KPX Aring O -30 KPX Aring Oacute -30 KPX Aring Ocircumflex -30 KPX Aring Odieresis -30 KPX Aring Ograve -30 KPX Aring Ohungarumlaut -30 KPX Aring Omacron -30 KPX Aring Oslash -30 KPX Aring Otilde -30 KPX Aring Q -30 KPX Aring T -120 KPX Aring Tcaron -120 KPX Aring Tcommaaccent -120 KPX Aring U -50 KPX Aring Uacute -50 KPX Aring Ucircumflex -50 KPX Aring Udieresis -50 KPX Aring Ugrave -50 KPX Aring Uhungarumlaut -50 KPX Aring Umacron -50 KPX Aring Uogonek -50 KPX Aring Uring -50 KPX Aring V -70 KPX Aring W -50 KPX Aring Y -100 KPX Aring Yacute -100 KPX Aring Ydieresis -100 KPX Aring u -30 KPX Aring uacute -30 KPX Aring ucircumflex -30 KPX Aring udieresis -30 KPX Aring ugrave -30 KPX Aring uhungarumlaut -30 KPX Aring umacron -30 KPX Aring uogonek -30 KPX Aring uring -30 KPX Aring v -40 KPX Aring w -40 KPX Aring y -40 KPX Aring yacute -40 KPX Aring ydieresis -40 KPX Atilde C -30 KPX Atilde Cacute -30 KPX Atilde Ccaron -30 KPX Atilde Ccedilla -30 KPX Atilde G -30 KPX Atilde Gbreve -30 KPX Atilde Gcommaaccent -30 KPX Atilde O -30 KPX Atilde Oacute -30 KPX Atilde Ocircumflex -30 KPX Atilde Odieresis -30 KPX Atilde Ograve -30 KPX Atilde Ohungarumlaut -30 KPX Atilde Omacron -30 KPX Atilde Oslash -30 KPX Atilde Otilde -30 KPX Atilde Q -30 KPX Atilde T -120 KPX Atilde Tcaron -120 KPX Atilde Tcommaaccent -120 KPX Atilde U -50 KPX Atilde Uacute -50 KPX Atilde Ucircumflex -50 KPX Atilde Udieresis -50 KPX Atilde Ugrave -50 KPX Atilde Uhungarumlaut -50 KPX Atilde Umacron -50 KPX Atilde Uogonek -50 KPX Atilde Uring -50 KPX Atilde V -70 KPX Atilde W -50 KPX Atilde Y -100 KPX Atilde Yacute -100 KPX Atilde Ydieresis -100 KPX Atilde u -30 KPX Atilde uacute -30 KPX Atilde ucircumflex -30 KPX Atilde udieresis -30 KPX Atilde ugrave -30 KPX Atilde uhungarumlaut -30 KPX Atilde umacron -30 KPX Atilde uogonek -30 KPX Atilde uring -30 KPX Atilde v -40 KPX Atilde w -40 KPX Atilde y -40 KPX Atilde yacute -40 KPX Atilde ydieresis -40 KPX B U -10 KPX B Uacute -10 KPX B Ucircumflex -10 KPX B Udieresis -10 KPX B Ugrave -10 KPX B Uhungarumlaut -10 KPX B Umacron -10 KPX B Uogonek -10 KPX B Uring -10 KPX B comma -20 KPX B period -20 KPX C comma -30 KPX C period -30 KPX Cacute comma -30 KPX Cacute period -30 KPX Ccaron comma -30 KPX Ccaron period -30 KPX Ccedilla comma -30 KPX Ccedilla period -30 KPX D A -40 KPX D Aacute -40 KPX D Abreve -40 KPX D Acircumflex -40 KPX D Adieresis -40 KPX D Agrave -40 KPX D Amacron -40 KPX D Aogonek -40 KPX D Aring -40 KPX D Atilde -40 KPX D V -70 KPX D W -40 KPX D Y -90 KPX D Yacute -90 KPX D Ydieresis -90 KPX D comma -70 KPX D period -70 KPX Dcaron A -40 KPX Dcaron Aacute -40 KPX Dcaron Abreve -40 KPX Dcaron Acircumflex -40 KPX Dcaron Adieresis -40 KPX Dcaron Agrave -40 KPX Dcaron Amacron -40 KPX Dcaron Aogonek -40 KPX Dcaron Aring -40 KPX Dcaron Atilde -40 KPX Dcaron V -70 KPX Dcaron W -40 KPX Dcaron Y -90 KPX Dcaron Yacute -90 KPX Dcaron Ydieresis -90 KPX Dcaron comma -70 KPX Dcaron period -70 KPX Dcroat A -40 KPX Dcroat Aacute -40 KPX Dcroat Abreve -40 KPX Dcroat Acircumflex -40 KPX Dcroat Adieresis -40 KPX Dcroat Agrave -40 KPX Dcroat Amacron -40 KPX Dcroat Aogonek -40 KPX Dcroat Aring -40 KPX Dcroat Atilde -40 KPX Dcroat V -70 KPX Dcroat W -40 KPX Dcroat Y -90 KPX Dcroat Yacute -90 KPX Dcroat Ydieresis -90 KPX Dcroat comma -70 KPX Dcroat period -70 KPX F A -80 KPX F Aacute -80 KPX F Abreve -80 KPX F Acircumflex -80 KPX F Adieresis -80 KPX F Agrave -80 KPX F Amacron -80 KPX F Aogonek -80 KPX F Aring -80 KPX F Atilde -80 KPX F a -50 KPX F aacute -50 KPX F abreve -50 KPX F acircumflex -50 KPX F adieresis -50 KPX F agrave -50 KPX F amacron -50 KPX F aogonek -50 KPX F aring -50 KPX F atilde -50 KPX F comma -150 KPX F e -30 KPX F eacute -30 KPX F ecaron -30 KPX F ecircumflex -30 KPX F edieresis -30 KPX F edotaccent -30 KPX F egrave -30 KPX F emacron -30 KPX F eogonek -30 KPX F o -30 KPX F oacute -30 KPX F ocircumflex -30 KPX F odieresis -30 KPX F ograve -30 KPX F ohungarumlaut -30 KPX F omacron -30 KPX F oslash -30 KPX F otilde -30 KPX F period -150 KPX F r -45 KPX F racute -45 KPX F rcaron -45 KPX F rcommaaccent -45 KPX J A -20 KPX J Aacute -20 KPX J Abreve -20 KPX J Acircumflex -20 KPX J Adieresis -20 KPX J Agrave -20 KPX J Amacron -20 KPX J Aogonek -20 KPX J Aring -20 KPX J Atilde -20 KPX J a -20 KPX J aacute -20 KPX J abreve -20 KPX J acircumflex -20 KPX J adieresis -20 KPX J agrave -20 KPX J amacron -20 KPX J aogonek -20 KPX J aring -20 KPX J atilde -20 KPX J comma -30 KPX J period -30 KPX J u -20 KPX J uacute -20 KPX J ucircumflex -20 KPX J udieresis -20 KPX J ugrave -20 KPX J uhungarumlaut -20 KPX J umacron -20 KPX J uogonek -20 KPX J uring -20 KPX K O -50 KPX K Oacute -50 KPX K Ocircumflex -50 KPX K Odieresis -50 KPX K Ograve -50 KPX K Ohungarumlaut -50 KPX K Omacron -50 KPX K Oslash -50 KPX K Otilde -50 KPX K e -40 KPX K eacute -40 KPX K ecaron -40 KPX K ecircumflex -40 KPX K edieresis -40 KPX K edotaccent -40 KPX K egrave -40 KPX K emacron -40 KPX K eogonek -40 KPX K o -40 KPX K oacute -40 KPX K ocircumflex -40 KPX K odieresis -40 KPX K ograve -40 KPX K ohungarumlaut -40 KPX K omacron -40 KPX K oslash -40 KPX K otilde -40 KPX K u -30 KPX K uacute -30 KPX K ucircumflex -30 KPX K udieresis -30 KPX K ugrave -30 KPX K uhungarumlaut -30 KPX K umacron -30 KPX K uogonek -30 KPX K uring -30 KPX K y -50 KPX K yacute -50 KPX K ydieresis -50 KPX Kcommaaccent O -50 KPX Kcommaaccent Oacute -50 KPX Kcommaaccent Ocircumflex -50 KPX Kcommaaccent Odieresis -50 KPX Kcommaaccent Ograve -50 KPX Kcommaaccent Ohungarumlaut -50 KPX Kcommaaccent Omacron -50 KPX Kcommaaccent Oslash -50 KPX Kcommaaccent Otilde -50 KPX Kcommaaccent e -40 KPX Kcommaaccent eacute -40 KPX Kcommaaccent ecaron -40 KPX Kcommaaccent ecircumflex -40 KPX Kcommaaccent edieresis -40 KPX Kcommaaccent edotaccent -40 KPX Kcommaaccent egrave -40 KPX Kcommaaccent emacron -40 KPX Kcommaaccent eogonek -40 KPX Kcommaaccent o -40 KPX Kcommaaccent oacute -40 KPX Kcommaaccent ocircumflex -40 KPX Kcommaaccent odieresis -40 KPX Kcommaaccent ograve -40 KPX Kcommaaccent ohungarumlaut -40 KPX Kcommaaccent omacron -40 KPX Kcommaaccent oslash -40 KPX Kcommaaccent otilde -40 KPX Kcommaaccent u -30 KPX Kcommaaccent uacute -30 KPX Kcommaaccent ucircumflex -30 KPX Kcommaaccent udieresis -30 KPX Kcommaaccent ugrave -30 KPX Kcommaaccent uhungarumlaut -30 KPX Kcommaaccent umacron -30 KPX Kcommaaccent uogonek -30 KPX Kcommaaccent uring -30 KPX Kcommaaccent y -50 KPX Kcommaaccent yacute -50 KPX Kcommaaccent ydieresis -50 KPX L T -110 KPX L Tcaron -110 KPX L Tcommaaccent -110 KPX L V -110 KPX L W -70 KPX L Y -140 KPX L Yacute -140 KPX L Ydieresis -140 KPX L quotedblright -140 KPX L quoteright -160 KPX L y -30 KPX L yacute -30 KPX L ydieresis -30 KPX Lacute T -110 KPX Lacute Tcaron -110 KPX Lacute Tcommaaccent -110 KPX Lacute V -110 KPX Lacute W -70 KPX Lacute Y -140 KPX Lacute Yacute -140 KPX Lacute Ydieresis -140 KPX Lacute quotedblright -140 KPX Lacute quoteright -160 KPX Lacute y -30 KPX Lacute yacute -30 KPX Lacute ydieresis -30 KPX Lcaron T -110 KPX Lcaron Tcaron -110 KPX Lcaron Tcommaaccent -110 KPX Lcaron V -110 KPX Lcaron W -70 KPX Lcaron Y -140 KPX Lcaron Yacute -140 KPX Lcaron Ydieresis -140 KPX Lcaron quotedblright -140 KPX Lcaron quoteright -160 KPX Lcaron y -30 KPX Lcaron yacute -30 KPX Lcaron ydieresis -30 KPX Lcommaaccent T -110 KPX Lcommaaccent Tcaron -110 KPX Lcommaaccent Tcommaaccent -110 KPX Lcommaaccent V -110 KPX Lcommaaccent W -70 KPX Lcommaaccent Y -140 KPX Lcommaaccent Yacute -140 KPX Lcommaaccent Ydieresis -140 KPX Lcommaaccent quotedblright -140 KPX Lcommaaccent quoteright -160 KPX Lcommaaccent y -30 KPX Lcommaaccent yacute -30 KPX Lcommaaccent ydieresis -30 KPX Lslash T -110 KPX Lslash Tcaron -110 KPX Lslash Tcommaaccent -110 KPX Lslash V -110 KPX Lslash W -70 KPX Lslash Y -140 KPX Lslash Yacute -140 KPX Lslash Ydieresis -140 KPX Lslash quotedblright -140 KPX Lslash quoteright -160 KPX Lslash y -30 KPX Lslash yacute -30 KPX Lslash ydieresis -30 KPX O A -20 KPX O Aacute -20 KPX O Abreve -20 KPX O Acircumflex -20 KPX O Adieresis -20 KPX O Agrave -20 KPX O Amacron -20 KPX O Aogonek -20 KPX O Aring -20 KPX O Atilde -20 KPX O T -40 KPX O Tcaron -40 KPX O Tcommaaccent -40 KPX O V -50 KPX O W -30 KPX O X -60 KPX O Y -70 KPX O Yacute -70 KPX O Ydieresis -70 KPX O comma -40 KPX O period -40 KPX Oacute A -20 KPX Oacute Aacute -20 KPX Oacute Abreve -20 KPX Oacute Acircumflex -20 KPX Oacute Adieresis -20 KPX Oacute Agrave -20 KPX Oacute Amacron -20 KPX Oacute Aogonek -20 KPX Oacute Aring -20 KPX Oacute Atilde -20 KPX Oacute T -40 KPX Oacute Tcaron -40 KPX Oacute Tcommaaccent -40 KPX Oacute V -50 KPX Oacute W -30 KPX Oacute X -60 KPX Oacute Y -70 KPX Oacute Yacute -70 KPX Oacute Ydieresis -70 KPX Oacute comma -40 KPX Oacute period -40 KPX Ocircumflex A -20 KPX Ocircumflex Aacute -20 KPX Ocircumflex Abreve -20 KPX Ocircumflex Acircumflex -20 KPX Ocircumflex Adieresis -20 KPX Ocircumflex Agrave -20 KPX Ocircumflex Amacron -20 KPX Ocircumflex Aogonek -20 KPX Ocircumflex Aring -20 KPX Ocircumflex Atilde -20 KPX Ocircumflex T -40 KPX Ocircumflex Tcaron -40 KPX Ocircumflex Tcommaaccent -40 KPX Ocircumflex V -50 KPX Ocircumflex W -30 KPX Ocircumflex X -60 KPX Ocircumflex Y -70 KPX Ocircumflex Yacute -70 KPX Ocircumflex Ydieresis -70 KPX Ocircumflex comma -40 KPX Ocircumflex period -40 KPX Odieresis A -20 KPX Odieresis Aacute -20 KPX Odieresis Abreve -20 KPX Odieresis Acircumflex -20 KPX Odieresis Adieresis -20 KPX Odieresis Agrave -20 KPX Odieresis Amacron -20 KPX Odieresis Aogonek -20 KPX Odieresis Aring -20 KPX Odieresis Atilde -20 KPX Odieresis T -40 KPX Odieresis Tcaron -40 KPX Odieresis Tcommaaccent -40 KPX Odieresis V -50 KPX Odieresis W -30 KPX Odieresis X -60 KPX Odieresis Y -70 KPX Odieresis Yacute -70 KPX Odieresis Ydieresis -70 KPX Odieresis comma -40 KPX Odieresis period -40 KPX Ograve A -20 KPX Ograve Aacute -20 KPX Ograve Abreve -20 KPX Ograve Acircumflex -20 KPX Ograve Adieresis -20 KPX Ograve Agrave -20 KPX Ograve Amacron -20 KPX Ograve Aogonek -20 KPX Ograve Aring -20 KPX Ograve Atilde -20 KPX Ograve T -40 KPX Ograve Tcaron -40 KPX Ograve Tcommaaccent -40 KPX Ograve V -50 KPX Ograve W -30 KPX Ograve X -60 KPX Ograve Y -70 KPX Ograve Yacute -70 KPX Ograve Ydieresis -70 KPX Ograve comma -40 KPX Ograve period -40 KPX Ohungarumlaut A -20 KPX Ohungarumlaut Aacute -20 KPX Ohungarumlaut Abreve -20 KPX Ohungarumlaut Acircumflex -20 KPX Ohungarumlaut Adieresis -20 KPX Ohungarumlaut Agrave -20 KPX Ohungarumlaut Amacron -20 KPX Ohungarumlaut Aogonek -20 KPX Ohungarumlaut Aring -20 KPX Ohungarumlaut Atilde -20 KPX Ohungarumlaut T -40 KPX Ohungarumlaut Tcaron -40 KPX Ohungarumlaut Tcommaaccent -40 KPX Ohungarumlaut V -50 KPX Ohungarumlaut W -30 KPX Ohungarumlaut X -60 KPX Ohungarumlaut Y -70 KPX Ohungarumlaut Yacute -70 KPX Ohungarumlaut Ydieresis -70 KPX Ohungarumlaut comma -40 KPX Ohungarumlaut period -40 KPX Omacron A -20 KPX Omacron Aacute -20 KPX Omacron Abreve -20 KPX Omacron Acircumflex -20 KPX Omacron Adieresis -20 KPX Omacron Agrave -20 KPX Omacron Amacron -20 KPX Omacron Aogonek -20 KPX Omacron Aring -20 KPX Omacron Atilde -20 KPX Omacron T -40 KPX Omacron Tcaron -40 KPX Omacron Tcommaaccent -40 KPX Omacron V -50 KPX Omacron W -30 KPX Omacron X -60 KPX Omacron Y -70 KPX Omacron Yacute -70 KPX Omacron Ydieresis -70 KPX Omacron comma -40 KPX Omacron period -40 KPX Oslash A -20 KPX Oslash Aacute -20 KPX Oslash Abreve -20 KPX Oslash Acircumflex -20 KPX Oslash Adieresis -20 KPX Oslash Agrave -20 KPX Oslash Amacron -20 KPX Oslash Aogonek -20 KPX Oslash Aring -20 KPX Oslash Atilde -20 KPX Oslash T -40 KPX Oslash Tcaron -40 KPX Oslash Tcommaaccent -40 KPX Oslash V -50 KPX Oslash W -30 KPX Oslash X -60 KPX Oslash Y -70 KPX Oslash Yacute -70 KPX Oslash Ydieresis -70 KPX Oslash comma -40 KPX Oslash period -40 KPX Otilde A -20 KPX Otilde Aacute -20 KPX Otilde Abreve -20 KPX Otilde Acircumflex -20 KPX Otilde Adieresis -20 KPX Otilde Agrave -20 KPX Otilde Amacron -20 KPX Otilde Aogonek -20 KPX Otilde Aring -20 KPX Otilde Atilde -20 KPX Otilde T -40 KPX Otilde Tcaron -40 KPX Otilde Tcommaaccent -40 KPX Otilde V -50 KPX Otilde W -30 KPX Otilde X -60 KPX Otilde Y -70 KPX Otilde Yacute -70 KPX Otilde Ydieresis -70 KPX Otilde comma -40 KPX Otilde period -40 KPX P A -120 KPX P Aacute -120 KPX P Abreve -120 KPX P Acircumflex -120 KPX P Adieresis -120 KPX P Agrave -120 KPX P Amacron -120 KPX P Aogonek -120 KPX P Aring -120 KPX P Atilde -120 KPX P a -40 KPX P aacute -40 KPX P abreve -40 KPX P acircumflex -40 KPX P adieresis -40 KPX P agrave -40 KPX P amacron -40 KPX P aogonek -40 KPX P aring -40 KPX P atilde -40 KPX P comma -180 KPX P e -50 KPX P eacute -50 KPX P ecaron -50 KPX P ecircumflex -50 KPX P edieresis -50 KPX P edotaccent -50 KPX P egrave -50 KPX P emacron -50 KPX P eogonek -50 KPX P o -50 KPX P oacute -50 KPX P ocircumflex -50 KPX P odieresis -50 KPX P ograve -50 KPX P ohungarumlaut -50 KPX P omacron -50 KPX P oslash -50 KPX P otilde -50 KPX P period -180 KPX Q U -10 KPX Q Uacute -10 KPX Q Ucircumflex -10 KPX Q Udieresis -10 KPX Q Ugrave -10 KPX Q Uhungarumlaut -10 KPX Q Umacron -10 KPX Q Uogonek -10 KPX Q Uring -10 KPX R O -20 KPX R Oacute -20 KPX R Ocircumflex -20 KPX R Odieresis -20 KPX R Ograve -20 KPX R Ohungarumlaut -20 KPX R Omacron -20 KPX R Oslash -20 KPX R Otilde -20 KPX R T -30 KPX R Tcaron -30 KPX R Tcommaaccent -30 KPX R U -40 KPX R Uacute -40 KPX R Ucircumflex -40 KPX R Udieresis -40 KPX R Ugrave -40 KPX R Uhungarumlaut -40 KPX R Umacron -40 KPX R Uogonek -40 KPX R Uring -40 KPX R V -50 KPX R W -30 KPX R Y -50 KPX R Yacute -50 KPX R Ydieresis -50 KPX Racute O -20 KPX Racute Oacute -20 KPX Racute Ocircumflex -20 KPX Racute Odieresis -20 KPX Racute Ograve -20 KPX Racute Ohungarumlaut -20 KPX Racute Omacron -20 KPX Racute Oslash -20 KPX Racute Otilde -20 KPX Racute T -30 KPX Racute Tcaron -30 KPX Racute Tcommaaccent -30 KPX Racute U -40 KPX Racute Uacute -40 KPX Racute Ucircumflex -40 KPX Racute Udieresis -40 KPX Racute Ugrave -40 KPX Racute Uhungarumlaut -40 KPX Racute Umacron -40 KPX Racute Uogonek -40 KPX Racute Uring -40 KPX Racute V -50 KPX Racute W -30 KPX Racute Y -50 KPX Racute Yacute -50 KPX Racute Ydieresis -50 KPX Rcaron O -20 KPX Rcaron Oacute -20 KPX Rcaron Ocircumflex -20 KPX Rcaron Odieresis -20 KPX Rcaron Ograve -20 KPX Rcaron Ohungarumlaut -20 KPX Rcaron Omacron -20 KPX Rcaron Oslash -20 KPX Rcaron Otilde -20 KPX Rcaron T -30 KPX Rcaron Tcaron -30 KPX Rcaron Tcommaaccent -30 KPX Rcaron U -40 KPX Rcaron Uacute -40 KPX Rcaron Ucircumflex -40 KPX Rcaron Udieresis -40 KPX Rcaron Ugrave -40 KPX Rcaron Uhungarumlaut -40 KPX Rcaron Umacron -40 KPX Rcaron Uogonek -40 KPX Rcaron Uring -40 KPX Rcaron V -50 KPX Rcaron W -30 KPX Rcaron Y -50 KPX Rcaron Yacute -50 KPX Rcaron Ydieresis -50 KPX Rcommaaccent O -20 KPX Rcommaaccent Oacute -20 KPX Rcommaaccent Ocircumflex -20 KPX Rcommaaccent Odieresis -20 KPX Rcommaaccent Ograve -20 KPX Rcommaaccent Ohungarumlaut -20 KPX Rcommaaccent Omacron -20 KPX Rcommaaccent Oslash -20 KPX Rcommaaccent Otilde -20 KPX Rcommaaccent T -30 KPX Rcommaaccent Tcaron -30 KPX Rcommaaccent Tcommaaccent -30 KPX Rcommaaccent U -40 KPX Rcommaaccent Uacute -40 KPX Rcommaaccent Ucircumflex -40 KPX Rcommaaccent Udieresis -40 KPX Rcommaaccent Ugrave -40 KPX Rcommaaccent Uhungarumlaut -40 KPX Rcommaaccent Umacron -40 KPX Rcommaaccent Uogonek -40 KPX Rcommaaccent Uring -40 KPX Rcommaaccent V -50 KPX Rcommaaccent W -30 KPX Rcommaaccent Y -50 KPX Rcommaaccent Yacute -50 KPX Rcommaaccent Ydieresis -50 KPX S comma -20 KPX S period -20 KPX Sacute comma -20 KPX Sacute period -20 KPX Scaron comma -20 KPX Scaron period -20 KPX Scedilla comma -20 KPX Scedilla period -20 KPX Scommaaccent comma -20 KPX Scommaaccent period -20 KPX T A -120 KPX T Aacute -120 KPX T Abreve -120 KPX T Acircumflex -120 KPX T Adieresis -120 KPX T Agrave -120 KPX T Amacron -120 KPX T Aogonek -120 KPX T Aring -120 KPX T Atilde -120 KPX T O -40 KPX T Oacute -40 KPX T Ocircumflex -40 KPX T Odieresis -40 KPX T Ograve -40 KPX T Ohungarumlaut -40 KPX T Omacron -40 KPX T Oslash -40 KPX T Otilde -40 KPX T a -120 KPX T aacute -120 KPX T abreve -60 KPX T acircumflex -120 KPX T adieresis -120 KPX T agrave -120 KPX T amacron -60 KPX T aogonek -120 KPX T aring -120 KPX T atilde -60 KPX T colon -20 KPX T comma -120 KPX T e -120 KPX T eacute -120 KPX T ecaron -120 KPX T ecircumflex -120 KPX T edieresis -120 KPX T edotaccent -120 KPX T egrave -60 KPX T emacron -60 KPX T eogonek -120 KPX T hyphen -140 KPX T o -120 KPX T oacute -120 KPX T ocircumflex -120 KPX T odieresis -120 KPX T ograve -120 KPX T ohungarumlaut -120 KPX T omacron -60 KPX T oslash -120 KPX T otilde -60 KPX T period -120 KPX T r -120 KPX T racute -120 KPX T rcaron -120 KPX T rcommaaccent -120 KPX T semicolon -20 KPX T u -120 KPX T uacute -120 KPX T ucircumflex -120 KPX T udieresis -120 KPX T ugrave -120 KPX T uhungarumlaut -120 KPX T umacron -60 KPX T uogonek -120 KPX T uring -120 KPX T w -120 KPX T y -120 KPX T yacute -120 KPX T ydieresis -60 KPX Tcaron A -120 KPX Tcaron Aacute -120 KPX Tcaron Abreve -120 KPX Tcaron Acircumflex -120 KPX Tcaron Adieresis -120 KPX Tcaron Agrave -120 KPX Tcaron Amacron -120 KPX Tcaron Aogonek -120 KPX Tcaron Aring -120 KPX Tcaron Atilde -120 KPX Tcaron O -40 KPX Tcaron Oacute -40 KPX Tcaron Ocircumflex -40 KPX Tcaron Odieresis -40 KPX Tcaron Ograve -40 KPX Tcaron Ohungarumlaut -40 KPX Tcaron Omacron -40 KPX Tcaron Oslash -40 KPX Tcaron Otilde -40 KPX Tcaron a -120 KPX Tcaron aacute -120 KPX Tcaron abreve -60 KPX Tcaron acircumflex -120 KPX Tcaron adieresis -120 KPX Tcaron agrave -120 KPX Tcaron amacron -60 KPX Tcaron aogonek -120 KPX Tcaron aring -120 KPX Tcaron atilde -60 KPX Tcaron colon -20 KPX Tcaron comma -120 KPX Tcaron e -120 KPX Tcaron eacute -120 KPX Tcaron ecaron -120 KPX Tcaron ecircumflex -120 KPX Tcaron edieresis -120 KPX Tcaron edotaccent -120 KPX Tcaron egrave -60 KPX Tcaron emacron -60 KPX Tcaron eogonek -120 KPX Tcaron hyphen -140 KPX Tcaron o -120 KPX Tcaron oacute -120 KPX Tcaron ocircumflex -120 KPX Tcaron odieresis -120 KPX Tcaron ograve -120 KPX Tcaron ohungarumlaut -120 KPX Tcaron omacron -60 KPX Tcaron oslash -120 KPX Tcaron otilde -60 KPX Tcaron period -120 KPX Tcaron r -120 KPX Tcaron racute -120 KPX Tcaron rcaron -120 KPX Tcaron rcommaaccent -120 KPX Tcaron semicolon -20 KPX Tcaron u -120 KPX Tcaron uacute -120 KPX Tcaron ucircumflex -120 KPX Tcaron udieresis -120 KPX Tcaron ugrave -120 KPX Tcaron uhungarumlaut -120 KPX Tcaron umacron -60 KPX Tcaron uogonek -120 KPX Tcaron uring -120 KPX Tcaron w -120 KPX Tcaron y -120 KPX Tcaron yacute -120 KPX Tcaron ydieresis -60 KPX Tcommaaccent A -120 KPX Tcommaaccent Aacute -120 KPX Tcommaaccent Abreve -120 KPX Tcommaaccent Acircumflex -120 KPX Tcommaaccent Adieresis -120 KPX Tcommaaccent Agrave -120 KPX Tcommaaccent Amacron -120 KPX Tcommaaccent Aogonek -120 KPX Tcommaaccent Aring -120 KPX Tcommaaccent Atilde -120 KPX Tcommaaccent O -40 KPX Tcommaaccent Oacute -40 KPX Tcommaaccent Ocircumflex -40 KPX Tcommaaccent Odieresis -40 KPX Tcommaaccent Ograve -40 KPX Tcommaaccent Ohungarumlaut -40 KPX Tcommaaccent Omacron -40 KPX Tcommaaccent Oslash -40 KPX Tcommaaccent Otilde -40 KPX Tcommaaccent a -120 KPX Tcommaaccent aacute -120 KPX Tcommaaccent abreve -60 KPX Tcommaaccent acircumflex -120 KPX Tcommaaccent adieresis -120 KPX Tcommaaccent agrave -120 KPX Tcommaaccent amacron -60 KPX Tcommaaccent aogonek -120 KPX Tcommaaccent aring -120 KPX Tcommaaccent atilde -60 KPX Tcommaaccent colon -20 KPX Tcommaaccent comma -120 KPX Tcommaaccent e -120 KPX Tcommaaccent eacute -120 KPX Tcommaaccent ecaron -120 KPX Tcommaaccent ecircumflex -120 KPX Tcommaaccent edieresis -120 KPX Tcommaaccent edotaccent -120 KPX Tcommaaccent egrave -60 KPX Tcommaaccent emacron -60 KPX Tcommaaccent eogonek -120 KPX Tcommaaccent hyphen -140 KPX Tcommaaccent o -120 KPX Tcommaaccent oacute -120 KPX Tcommaaccent ocircumflex -120 KPX Tcommaaccent odieresis -120 KPX Tcommaaccent ograve -120 KPX Tcommaaccent ohungarumlaut -120 KPX Tcommaaccent omacron -60 KPX Tcommaaccent oslash -120 KPX Tcommaaccent otilde -60 KPX Tcommaaccent period -120 KPX Tcommaaccent r -120 KPX Tcommaaccent racute -120 KPX Tcommaaccent rcaron -120 KPX Tcommaaccent rcommaaccent -120 KPX Tcommaaccent semicolon -20 KPX Tcommaaccent u -120 KPX Tcommaaccent uacute -120 KPX Tcommaaccent ucircumflex -120 KPX Tcommaaccent udieresis -120 KPX Tcommaaccent ugrave -120 KPX Tcommaaccent uhungarumlaut -120 KPX Tcommaaccent umacron -60 KPX Tcommaaccent uogonek -120 KPX Tcommaaccent uring -120 KPX Tcommaaccent w -120 KPX Tcommaaccent y -120 KPX Tcommaaccent yacute -120 KPX Tcommaaccent ydieresis -60 KPX U A -40 KPX U Aacute -40 KPX U Abreve -40 KPX U Acircumflex -40 KPX U Adieresis -40 KPX U Agrave -40 KPX U Amacron -40 KPX U Aogonek -40 KPX U Aring -40 KPX U Atilde -40 KPX U comma -40 KPX U period -40 KPX Uacute A -40 KPX Uacute Aacute -40 KPX Uacute Abreve -40 KPX Uacute Acircumflex -40 KPX Uacute Adieresis -40 KPX Uacute Agrave -40 KPX Uacute Amacron -40 KPX Uacute Aogonek -40 KPX Uacute Aring -40 KPX Uacute Atilde -40 KPX Uacute comma -40 KPX Uacute period -40 KPX Ucircumflex A -40 KPX Ucircumflex Aacute -40 KPX Ucircumflex Abreve -40 KPX Ucircumflex Acircumflex -40 KPX Ucircumflex Adieresis -40 KPX Ucircumflex Agrave -40 KPX Ucircumflex Amacron -40 KPX Ucircumflex Aogonek -40 KPX Ucircumflex Aring -40 KPX Ucircumflex Atilde -40 KPX Ucircumflex comma -40 KPX Ucircumflex period -40 KPX Udieresis A -40 KPX Udieresis Aacute -40 KPX Udieresis Abreve -40 KPX Udieresis Acircumflex -40 KPX Udieresis Adieresis -40 KPX Udieresis Agrave -40 KPX Udieresis Amacron -40 KPX Udieresis Aogonek -40 KPX Udieresis Aring -40 KPX Udieresis Atilde -40 KPX Udieresis comma -40 KPX Udieresis period -40 KPX Ugrave A -40 KPX Ugrave Aacute -40 KPX Ugrave Abreve -40 KPX Ugrave Acircumflex -40 KPX Ugrave Adieresis -40 KPX Ugrave Agrave -40 KPX Ugrave Amacron -40 KPX Ugrave Aogonek -40 KPX Ugrave Aring -40 KPX Ugrave Atilde -40 KPX Ugrave comma -40 KPX Ugrave period -40 KPX Uhungarumlaut A -40 KPX Uhungarumlaut Aacute -40 KPX Uhungarumlaut Abreve -40 KPX Uhungarumlaut Acircumflex -40 KPX Uhungarumlaut Adieresis -40 KPX Uhungarumlaut Agrave -40 KPX Uhungarumlaut Amacron -40 KPX Uhungarumlaut Aogonek -40 KPX Uhungarumlaut Aring -40 KPX Uhungarumlaut Atilde -40 KPX Uhungarumlaut comma -40 KPX Uhungarumlaut period -40 KPX Umacron A -40 KPX Umacron Aacute -40 KPX Umacron Abreve -40 KPX Umacron Acircumflex -40 KPX Umacron Adieresis -40 KPX Umacron Agrave -40 KPX Umacron Amacron -40 KPX Umacron Aogonek -40 KPX Umacron Aring -40 KPX Umacron Atilde -40 KPX Umacron comma -40 KPX Umacron period -40 KPX Uogonek A -40 KPX Uogonek Aacute -40 KPX Uogonek Abreve -40 KPX Uogonek Acircumflex -40 KPX Uogonek Adieresis -40 KPX Uogonek Agrave -40 KPX Uogonek Amacron -40 KPX Uogonek Aogonek -40 KPX Uogonek Aring -40 KPX Uogonek Atilde -40 KPX Uogonek comma -40 KPX Uogonek period -40 KPX Uring A -40 KPX Uring Aacute -40 KPX Uring Abreve -40 KPX Uring Acircumflex -40 KPX Uring Adieresis -40 KPX Uring Agrave -40 KPX Uring Amacron -40 KPX Uring Aogonek -40 KPX Uring Aring -40 KPX Uring Atilde -40 KPX Uring comma -40 KPX Uring period -40 KPX V A -80 KPX V Aacute -80 KPX V Abreve -80 KPX V Acircumflex -80 KPX V Adieresis -80 KPX V Agrave -80 KPX V Amacron -80 KPX V Aogonek -80 KPX V Aring -80 KPX V Atilde -80 KPX V G -40 KPX V Gbreve -40 KPX V Gcommaaccent -40 KPX V O -40 KPX V Oacute -40 KPX V Ocircumflex -40 KPX V Odieresis -40 KPX V Ograve -40 KPX V Ohungarumlaut -40 KPX V Omacron -40 KPX V Oslash -40 KPX V Otilde -40 KPX V a -70 KPX V aacute -70 KPX V abreve -70 KPX V acircumflex -70 KPX V adieresis -70 KPX V agrave -70 KPX V amacron -70 KPX V aogonek -70 KPX V aring -70 KPX V atilde -70 KPX V colon -40 KPX V comma -125 KPX V e -80 KPX V eacute -80 KPX V ecaron -80 KPX V ecircumflex -80 KPX V edieresis -80 KPX V edotaccent -80 KPX V egrave -80 KPX V emacron -80 KPX V eogonek -80 KPX V hyphen -80 KPX V o -80 KPX V oacute -80 KPX V ocircumflex -80 KPX V odieresis -80 KPX V ograve -80 KPX V ohungarumlaut -80 KPX V omacron -80 KPX V oslash -80 KPX V otilde -80 KPX V period -125 KPX V semicolon -40 KPX V u -70 KPX V uacute -70 KPX V ucircumflex -70 KPX V udieresis -70 KPX V ugrave -70 KPX V uhungarumlaut -70 KPX V umacron -70 KPX V uogonek -70 KPX V uring -70 KPX W A -50 KPX W Aacute -50 KPX W Abreve -50 KPX W Acircumflex -50 KPX W Adieresis -50 KPX W Agrave -50 KPX W Amacron -50 KPX W Aogonek -50 KPX W Aring -50 KPX W Atilde -50 KPX W O -20 KPX W Oacute -20 KPX W Ocircumflex -20 KPX W Odieresis -20 KPX W Ograve -20 KPX W Ohungarumlaut -20 KPX W Omacron -20 KPX W Oslash -20 KPX W Otilde -20 KPX W a -40 KPX W aacute -40 KPX W abreve -40 KPX W acircumflex -40 KPX W adieresis -40 KPX W agrave -40 KPX W amacron -40 KPX W aogonek -40 KPX W aring -40 KPX W atilde -40 KPX W comma -80 KPX W e -30 KPX W eacute -30 KPX W ecaron -30 KPX W ecircumflex -30 KPX W edieresis -30 KPX W edotaccent -30 KPX W egrave -30 KPX W emacron -30 KPX W eogonek -30 KPX W hyphen -40 KPX W o -30 KPX W oacute -30 KPX W ocircumflex -30 KPX W odieresis -30 KPX W ograve -30 KPX W ohungarumlaut -30 KPX W omacron -30 KPX W oslash -30 KPX W otilde -30 KPX W period -80 KPX W u -30 KPX W uacute -30 KPX W ucircumflex -30 KPX W udieresis -30 KPX W ugrave -30 KPX W uhungarumlaut -30 KPX W umacron -30 KPX W uogonek -30 KPX W uring -30 KPX W y -20 KPX W yacute -20 KPX W ydieresis -20 KPX Y A -110 KPX Y Aacute -110 KPX Y Abreve -110 KPX Y Acircumflex -110 KPX Y Adieresis -110 KPX Y Agrave -110 KPX Y Amacron -110 KPX Y Aogonek -110 KPX Y Aring -110 KPX Y Atilde -110 KPX Y O -85 KPX Y Oacute -85 KPX Y Ocircumflex -85 KPX Y Odieresis -85 KPX Y Ograve -85 KPX Y Ohungarumlaut -85 KPX Y Omacron -85 KPX Y Oslash -85 KPX Y Otilde -85 KPX Y a -140 KPX Y aacute -140 KPX Y abreve -70 KPX Y acircumflex -140 KPX Y adieresis -140 KPX Y agrave -140 KPX Y amacron -70 KPX Y aogonek -140 KPX Y aring -140 KPX Y atilde -140 KPX Y colon -60 KPX Y comma -140 KPX Y e -140 KPX Y eacute -140 KPX Y ecaron -140 KPX Y ecircumflex -140 KPX Y edieresis -140 KPX Y edotaccent -140 KPX Y egrave -140 KPX Y emacron -70 KPX Y eogonek -140 KPX Y hyphen -140 KPX Y i -20 KPX Y iacute -20 KPX Y iogonek -20 KPX Y o -140 KPX Y oacute -140 KPX Y ocircumflex -140 KPX Y odieresis -140 KPX Y ograve -140 KPX Y ohungarumlaut -140 KPX Y omacron -140 KPX Y oslash -140 KPX Y otilde -140 KPX Y period -140 KPX Y semicolon -60 KPX Y u -110 KPX Y uacute -110 KPX Y ucircumflex -110 KPX Y udieresis -110 KPX Y ugrave -110 KPX Y uhungarumlaut -110 KPX Y umacron -110 KPX Y uogonek -110 KPX Y uring -110 KPX Yacute A -110 KPX Yacute Aacute -110 KPX Yacute Abreve -110 KPX Yacute Acircumflex -110 KPX Yacute Adieresis -110 KPX Yacute Agrave -110 KPX Yacute Amacron -110 KPX Yacute Aogonek -110 KPX Yacute Aring -110 KPX Yacute Atilde -110 KPX Yacute O -85 KPX Yacute Oacute -85 KPX Yacute Ocircumflex -85 KPX Yacute Odieresis -85 KPX Yacute Ograve -85 KPX Yacute Ohungarumlaut -85 KPX Yacute Omacron -85 KPX Yacute Oslash -85 KPX Yacute Otilde -85 KPX Yacute a -140 KPX Yacute aacute -140 KPX Yacute abreve -70 KPX Yacute acircumflex -140 KPX Yacute adieresis -140 KPX Yacute agrave -140 KPX Yacute amacron -70 KPX Yacute aogonek -140 KPX Yacute aring -140 KPX Yacute atilde -70 KPX Yacute colon -60 KPX Yacute comma -140 KPX Yacute e -140 KPX Yacute eacute -140 KPX Yacute ecaron -140 KPX Yacute ecircumflex -140 KPX Yacute edieresis -140 KPX Yacute edotaccent -140 KPX Yacute egrave -140 KPX Yacute emacron -70 KPX Yacute eogonek -140 KPX Yacute hyphen -140 KPX Yacute i -20 KPX Yacute iacute -20 KPX Yacute iogonek -20 KPX Yacute o -140 KPX Yacute oacute -140 KPX Yacute ocircumflex -140 KPX Yacute odieresis -140 KPX Yacute ograve -140 KPX Yacute ohungarumlaut -140 KPX Yacute omacron -70 KPX Yacute oslash -140 KPX Yacute otilde -140 KPX Yacute period -140 KPX Yacute semicolon -60 KPX Yacute u -110 KPX Yacute uacute -110 KPX Yacute ucircumflex -110 KPX Yacute udieresis -110 KPX Yacute ugrave -110 KPX Yacute uhungarumlaut -110 KPX Yacute umacron -110 KPX Yacute uogonek -110 KPX Yacute uring -110 KPX Ydieresis A -110 KPX Ydieresis Aacute -110 KPX Ydieresis Abreve -110 KPX Ydieresis Acircumflex -110 KPX Ydieresis Adieresis -110 KPX Ydieresis Agrave -110 KPX Ydieresis Amacron -110 KPX Ydieresis Aogonek -110 KPX Ydieresis Aring -110 KPX Ydieresis Atilde -110 KPX Ydieresis O -85 KPX Ydieresis Oacute -85 KPX Ydieresis Ocircumflex -85 KPX Ydieresis Odieresis -85 KPX Ydieresis Ograve -85 KPX Ydieresis Ohungarumlaut -85 KPX Ydieresis Omacron -85 KPX Ydieresis Oslash -85 KPX Ydieresis Otilde -85 KPX Ydieresis a -140 KPX Ydieresis aacute -140 KPX Ydieresis abreve -70 KPX Ydieresis acircumflex -140 KPX Ydieresis adieresis -140 KPX Ydieresis agrave -140 KPX Ydieresis amacron -70 KPX Ydieresis aogonek -140 KPX Ydieresis aring -140 KPX Ydieresis atilde -70 KPX Ydieresis colon -60 KPX Ydieresis comma -140 KPX Ydieresis e -140 KPX Ydieresis eacute -140 KPX Ydieresis ecaron -140 KPX Ydieresis ecircumflex -140 KPX Ydieresis edieresis -140 KPX Ydieresis edotaccent -140 KPX Ydieresis egrave -140 KPX Ydieresis emacron -70 KPX Ydieresis eogonek -140 KPX Ydieresis hyphen -140 KPX Ydieresis i -20 KPX Ydieresis iacute -20 KPX Ydieresis iogonek -20 KPX Ydieresis o -140 KPX Ydieresis oacute -140 KPX Ydieresis ocircumflex -140 KPX Ydieresis odieresis -140 KPX Ydieresis ograve -140 KPX Ydieresis ohungarumlaut -140 KPX Ydieresis omacron -140 KPX Ydieresis oslash -140 KPX Ydieresis otilde -140 KPX Ydieresis period -140 KPX Ydieresis semicolon -60 KPX Ydieresis u -110 KPX Ydieresis uacute -110 KPX Ydieresis ucircumflex -110 KPX Ydieresis udieresis -110 KPX Ydieresis ugrave -110 KPX Ydieresis uhungarumlaut -110 KPX Ydieresis umacron -110 KPX Ydieresis uogonek -110 KPX Ydieresis uring -110 KPX a v -20 KPX a w -20 KPX a y -30 KPX a yacute -30 KPX a ydieresis -30 KPX aacute v -20 KPX aacute w -20 KPX aacute y -30 KPX aacute yacute -30 KPX aacute ydieresis -30 KPX abreve v -20 KPX abreve w -20 KPX abreve y -30 KPX abreve yacute -30 KPX abreve ydieresis -30 KPX acircumflex v -20 KPX acircumflex w -20 KPX acircumflex y -30 KPX acircumflex yacute -30 KPX acircumflex ydieresis -30 KPX adieresis v -20 KPX adieresis w -20 KPX adieresis y -30 KPX adieresis yacute -30 KPX adieresis ydieresis -30 KPX agrave v -20 KPX agrave w -20 KPX agrave y -30 KPX agrave yacute -30 KPX agrave ydieresis -30 KPX amacron v -20 KPX amacron w -20 KPX amacron y -30 KPX amacron yacute -30 KPX amacron ydieresis -30 KPX aogonek v -20 KPX aogonek w -20 KPX aogonek y -30 KPX aogonek yacute -30 KPX aogonek ydieresis -30 KPX aring v -20 KPX aring w -20 KPX aring y -30 KPX aring yacute -30 KPX aring ydieresis -30 KPX atilde v -20 KPX atilde w -20 KPX atilde y -30 KPX atilde yacute -30 KPX atilde ydieresis -30 KPX b b -10 KPX b comma -40 KPX b l -20 KPX b lacute -20 KPX b lcommaaccent -20 KPX b lslash -20 KPX b period -40 KPX b u -20 KPX b uacute -20 KPX b ucircumflex -20 KPX b udieresis -20 KPX b ugrave -20 KPX b uhungarumlaut -20 KPX b umacron -20 KPX b uogonek -20 KPX b uring -20 KPX b v -20 KPX b y -20 KPX b yacute -20 KPX b ydieresis -20 KPX c comma -15 KPX c k -20 KPX c kcommaaccent -20 KPX cacute comma -15 KPX cacute k -20 KPX cacute kcommaaccent -20 KPX ccaron comma -15 KPX ccaron k -20 KPX ccaron kcommaaccent -20 KPX ccedilla comma -15 KPX ccedilla k -20 KPX ccedilla kcommaaccent -20 KPX colon space -50 KPX comma quotedblright -100 KPX comma quoteright -100 KPX e comma -15 KPX e period -15 KPX e v -30 KPX e w -20 KPX e x -30 KPX e y -20 KPX e yacute -20 KPX e ydieresis -20 KPX eacute comma -15 KPX eacute period -15 KPX eacute v -30 KPX eacute w -20 KPX eacute x -30 KPX eacute y -20 KPX eacute yacute -20 KPX eacute ydieresis -20 KPX ecaron comma -15 KPX ecaron period -15 KPX ecaron v -30 KPX ecaron w -20 KPX ecaron x -30 KPX ecaron y -20 KPX ecaron yacute -20 KPX ecaron ydieresis -20 KPX ecircumflex comma -15 KPX ecircumflex period -15 KPX ecircumflex v -30 KPX ecircumflex w -20 KPX ecircumflex x -30 KPX ecircumflex y -20 KPX ecircumflex yacute -20 KPX ecircumflex ydieresis -20 KPX edieresis comma -15 KPX edieresis period -15 KPX edieresis v -30 KPX edieresis w -20 KPX edieresis x -30 KPX edieresis y -20 KPX edieresis yacute -20 KPX edieresis ydieresis -20 KPX edotaccent comma -15 KPX edotaccent period -15 KPX edotaccent v -30 KPX edotaccent w -20 KPX edotaccent x -30 KPX edotaccent y -20 KPX edotaccent yacute -20 KPX edotaccent ydieresis -20 KPX egrave comma -15 KPX egrave period -15 KPX egrave v -30 KPX egrave w -20 KPX egrave x -30 KPX egrave y -20 KPX egrave yacute -20 KPX egrave ydieresis -20 KPX emacron comma -15 KPX emacron period -15 KPX emacron v -30 KPX emacron w -20 KPX emacron x -30 KPX emacron y -20 KPX emacron yacute -20 KPX emacron ydieresis -20 KPX eogonek comma -15 KPX eogonek period -15 KPX eogonek v -30 KPX eogonek w -20 KPX eogonek x -30 KPX eogonek y -20 KPX eogonek yacute -20 KPX eogonek ydieresis -20 KPX f a -30 KPX f aacute -30 KPX f abreve -30 KPX f acircumflex -30 KPX f adieresis -30 KPX f agrave -30 KPX f amacron -30 KPX f aogonek -30 KPX f aring -30 KPX f atilde -30 KPX f comma -30 KPX f dotlessi -28 KPX f e -30 KPX f eacute -30 KPX f ecaron -30 KPX f ecircumflex -30 KPX f edieresis -30 KPX f edotaccent -30 KPX f egrave -30 KPX f emacron -30 KPX f eogonek -30 KPX f o -30 KPX f oacute -30 KPX f ocircumflex -30 KPX f odieresis -30 KPX f ograve -30 KPX f ohungarumlaut -30 KPX f omacron -30 KPX f oslash -30 KPX f otilde -30 KPX f period -30 KPX f quotedblright 60 KPX f quoteright 50 KPX g r -10 KPX g racute -10 KPX g rcaron -10 KPX g rcommaaccent -10 KPX gbreve r -10 KPX gbreve racute -10 KPX gbreve rcaron -10 KPX gbreve rcommaaccent -10 KPX gcommaaccent r -10 KPX gcommaaccent racute -10 KPX gcommaaccent rcaron -10 KPX gcommaaccent rcommaaccent -10 KPX h y -30 KPX h yacute -30 KPX h ydieresis -30 KPX k e -20 KPX k eacute -20 KPX k ecaron -20 KPX k ecircumflex -20 KPX k edieresis -20 KPX k edotaccent -20 KPX k egrave -20 KPX k emacron -20 KPX k eogonek -20 KPX k o -20 KPX k oacute -20 KPX k ocircumflex -20 KPX k odieresis -20 KPX k ograve -20 KPX k ohungarumlaut -20 KPX k omacron -20 KPX k oslash -20 KPX k otilde -20 KPX kcommaaccent e -20 KPX kcommaaccent eacute -20 KPX kcommaaccent ecaron -20 KPX kcommaaccent ecircumflex -20 KPX kcommaaccent edieresis -20 KPX kcommaaccent edotaccent -20 KPX kcommaaccent egrave -20 KPX kcommaaccent emacron -20 KPX kcommaaccent eogonek -20 KPX kcommaaccent o -20 KPX kcommaaccent oacute -20 KPX kcommaaccent ocircumflex -20 KPX kcommaaccent odieresis -20 KPX kcommaaccent ograve -20 KPX kcommaaccent ohungarumlaut -20 KPX kcommaaccent omacron -20 KPX kcommaaccent oslash -20 KPX kcommaaccent otilde -20 KPX m u -10 KPX m uacute -10 KPX m ucircumflex -10 KPX m udieresis -10 KPX m ugrave -10 KPX m uhungarumlaut -10 KPX m umacron -10 KPX m uogonek -10 KPX m uring -10 KPX m y -15 KPX m yacute -15 KPX m ydieresis -15 KPX n u -10 KPX n uacute -10 KPX n ucircumflex -10 KPX n udieresis -10 KPX n ugrave -10 KPX n uhungarumlaut -10 KPX n umacron -10 KPX n uogonek -10 KPX n uring -10 KPX n v -20 KPX n y -15 KPX n yacute -15 KPX n ydieresis -15 KPX nacute u -10 KPX nacute uacute -10 KPX nacute ucircumflex -10 KPX nacute udieresis -10 KPX nacute ugrave -10 KPX nacute uhungarumlaut -10 KPX nacute umacron -10 KPX nacute uogonek -10 KPX nacute uring -10 KPX nacute v -20 KPX nacute y -15 KPX nacute yacute -15 KPX nacute ydieresis -15 KPX ncaron u -10 KPX ncaron uacute -10 KPX ncaron ucircumflex -10 KPX ncaron udieresis -10 KPX ncaron ugrave -10 KPX ncaron uhungarumlaut -10 KPX ncaron umacron -10 KPX ncaron uogonek -10 KPX ncaron uring -10 KPX ncaron v -20 KPX ncaron y -15 KPX ncaron yacute -15 KPX ncaron ydieresis -15 KPX ncommaaccent u -10 KPX ncommaaccent uacute -10 KPX ncommaaccent ucircumflex -10 KPX ncommaaccent udieresis -10 KPX ncommaaccent ugrave -10 KPX ncommaaccent uhungarumlaut -10 KPX ncommaaccent umacron -10 KPX ncommaaccent uogonek -10 KPX ncommaaccent uring -10 KPX ncommaaccent v -20 KPX ncommaaccent y -15 KPX ncommaaccent yacute -15 KPX ncommaaccent ydieresis -15 KPX ntilde u -10 KPX ntilde uacute -10 KPX ntilde ucircumflex -10 KPX ntilde udieresis -10 KPX ntilde ugrave -10 KPX ntilde uhungarumlaut -10 KPX ntilde umacron -10 KPX ntilde uogonek -10 KPX ntilde uring -10 KPX ntilde v -20 KPX ntilde y -15 KPX ntilde yacute -15 KPX ntilde ydieresis -15 KPX o comma -40 KPX o period -40 KPX o v -15 KPX o w -15 KPX o x -30 KPX o y -30 KPX o yacute -30 KPX o ydieresis -30 KPX oacute comma -40 KPX oacute period -40 KPX oacute v -15 KPX oacute w -15 KPX oacute x -30 KPX oacute y -30 KPX oacute yacute -30 KPX oacute ydieresis -30 KPX ocircumflex comma -40 KPX ocircumflex period -40 KPX ocircumflex v -15 KPX ocircumflex w -15 KPX ocircumflex x -30 KPX ocircumflex y -30 KPX ocircumflex yacute -30 KPX ocircumflex ydieresis -30 KPX odieresis comma -40 KPX odieresis period -40 KPX odieresis v -15 KPX odieresis w -15 KPX odieresis x -30 KPX odieresis y -30 KPX odieresis yacute -30 KPX odieresis ydieresis -30 KPX ograve comma -40 KPX ograve period -40 KPX ograve v -15 KPX ograve w -15 KPX ograve x -30 KPX ograve y -30 KPX ograve yacute -30 KPX ograve ydieresis -30 KPX ohungarumlaut comma -40 KPX ohungarumlaut period -40 KPX ohungarumlaut v -15 KPX ohungarumlaut w -15 KPX ohungarumlaut x -30 KPX ohungarumlaut y -30 KPX ohungarumlaut yacute -30 KPX ohungarumlaut ydieresis -30 KPX omacron comma -40 KPX omacron period -40 KPX omacron v -15 KPX omacron w -15 KPX omacron x -30 KPX omacron y -30 KPX omacron yacute -30 KPX omacron ydieresis -30 KPX oslash a -55 KPX oslash aacute -55 KPX oslash abreve -55 KPX oslash acircumflex -55 KPX oslash adieresis -55 KPX oslash agrave -55 KPX oslash amacron -55 KPX oslash aogonek -55 KPX oslash aring -55 KPX oslash atilde -55 KPX oslash b -55 KPX oslash c -55 KPX oslash cacute -55 KPX oslash ccaron -55 KPX oslash ccedilla -55 KPX oslash comma -95 KPX oslash d -55 KPX oslash dcroat -55 KPX oslash e -55 KPX oslash eacute -55 KPX oslash ecaron -55 KPX oslash ecircumflex -55 KPX oslash edieresis -55 KPX oslash edotaccent -55 KPX oslash egrave -55 KPX oslash emacron -55 KPX oslash eogonek -55 KPX oslash f -55 KPX oslash g -55 KPX oslash gbreve -55 KPX oslash gcommaaccent -55 KPX oslash h -55 KPX oslash i -55 KPX oslash iacute -55 KPX oslash icircumflex -55 KPX oslash idieresis -55 KPX oslash igrave -55 KPX oslash imacron -55 KPX oslash iogonek -55 KPX oslash j -55 KPX oslash k -55 KPX oslash kcommaaccent -55 KPX oslash l -55 KPX oslash lacute -55 KPX oslash lcommaaccent -55 KPX oslash lslash -55 KPX oslash m -55 KPX oslash n -55 KPX oslash nacute -55 KPX oslash ncaron -55 KPX oslash ncommaaccent -55 KPX oslash ntilde -55 KPX oslash o -55 KPX oslash oacute -55 KPX oslash ocircumflex -55 KPX oslash odieresis -55 KPX oslash ograve -55 KPX oslash ohungarumlaut -55 KPX oslash omacron -55 KPX oslash oslash -55 KPX oslash otilde -55 KPX oslash p -55 KPX oslash period -95 KPX oslash q -55 KPX oslash r -55 KPX oslash racute -55 KPX oslash rcaron -55 KPX oslash rcommaaccent -55 KPX oslash s -55 KPX oslash sacute -55 KPX oslash scaron -55 KPX oslash scedilla -55 KPX oslash scommaaccent -55 KPX oslash t -55 KPX oslash tcommaaccent -55 KPX oslash u -55 KPX oslash uacute -55 KPX oslash ucircumflex -55 KPX oslash udieresis -55 KPX oslash ugrave -55 KPX oslash uhungarumlaut -55 KPX oslash umacron -55 KPX oslash uogonek -55 KPX oslash uring -55 KPX oslash v -70 KPX oslash w -70 KPX oslash x -85 KPX oslash y -70 KPX oslash yacute -70 KPX oslash ydieresis -70 KPX oslash z -55 KPX oslash zacute -55 KPX oslash zcaron -55 KPX oslash zdotaccent -55 KPX otilde comma -40 KPX otilde period -40 KPX otilde v -15 KPX otilde w -15 KPX otilde x -30 KPX otilde y -30 KPX otilde yacute -30 KPX otilde ydieresis -30 KPX p comma -35 KPX p period -35 KPX p y -30 KPX p yacute -30 KPX p ydieresis -30 KPX period quotedblright -100 KPX period quoteright -100 KPX period space -60 KPX quotedblright space -40 KPX quoteleft quoteleft -57 KPX quoteright d -50 KPX quoteright dcroat -50 KPX quoteright quoteright -57 KPX quoteright r -50 KPX quoteright racute -50 KPX quoteright rcaron -50 KPX quoteright rcommaaccent -50 KPX quoteright s -50 KPX quoteright sacute -50 KPX quoteright scaron -50 KPX quoteright scedilla -50 KPX quoteright scommaaccent -50 KPX quoteright space -70 KPX r a -10 KPX r aacute -10 KPX r abreve -10 KPX r acircumflex -10 KPX r adieresis -10 KPX r agrave -10 KPX r amacron -10 KPX r aogonek -10 KPX r aring -10 KPX r atilde -10 KPX r colon 30 KPX r comma -50 KPX r i 15 KPX r iacute 15 KPX r icircumflex 15 KPX r idieresis 15 KPX r igrave 15 KPX r imacron 15 KPX r iogonek 15 KPX r k 15 KPX r kcommaaccent 15 KPX r l 15 KPX r lacute 15 KPX r lcommaaccent 15 KPX r lslash 15 KPX r m 25 KPX r n 25 KPX r nacute 25 KPX r ncaron 25 KPX r ncommaaccent 25 KPX r ntilde 25 KPX r p 30 KPX r period -50 KPX r semicolon 30 KPX r t 40 KPX r tcommaaccent 40 KPX r u 15 KPX r uacute 15 KPX r ucircumflex 15 KPX r udieresis 15 KPX r ugrave 15 KPX r uhungarumlaut 15 KPX r umacron 15 KPX r uogonek 15 KPX r uring 15 KPX r v 30 KPX r y 30 KPX r yacute 30 KPX r ydieresis 30 KPX racute a -10 KPX racute aacute -10 KPX racute abreve -10 KPX racute acircumflex -10 KPX racute adieresis -10 KPX racute agrave -10 KPX racute amacron -10 KPX racute aogonek -10 KPX racute aring -10 KPX racute atilde -10 KPX racute colon 30 KPX racute comma -50 KPX racute i 15 KPX racute iacute 15 KPX racute icircumflex 15 KPX racute idieresis 15 KPX racute igrave 15 KPX racute imacron 15 KPX racute iogonek 15 KPX racute k 15 KPX racute kcommaaccent 15 KPX racute l 15 KPX racute lacute 15 KPX racute lcommaaccent 15 KPX racute lslash 15 KPX racute m 25 KPX racute n 25 KPX racute nacute 25 KPX racute ncaron 25 KPX racute ncommaaccent 25 KPX racute ntilde 25 KPX racute p 30 KPX racute period -50 KPX racute semicolon 30 KPX racute t 40 KPX racute tcommaaccent 40 KPX racute u 15 KPX racute uacute 15 KPX racute ucircumflex 15 KPX racute udieresis 15 KPX racute ugrave 15 KPX racute uhungarumlaut 15 KPX racute umacron 15 KPX racute uogonek 15 KPX racute uring 15 KPX racute v 30 KPX racute y 30 KPX racute yacute 30 KPX racute ydieresis 30 KPX rcaron a -10 KPX rcaron aacute -10 KPX rcaron abreve -10 KPX rcaron acircumflex -10 KPX rcaron adieresis -10 KPX rcaron agrave -10 KPX rcaron amacron -10 KPX rcaron aogonek -10 KPX rcaron aring -10 KPX rcaron atilde -10 KPX rcaron colon 30 KPX rcaron comma -50 KPX rcaron i 15 KPX rcaron iacute 15 KPX rcaron icircumflex 15 KPX rcaron idieresis 15 KPX rcaron igrave 15 KPX rcaron imacron 15 KPX rcaron iogonek 15 KPX rcaron k 15 KPX rcaron kcommaaccent 15 KPX rcaron l 15 KPX rcaron lacute 15 KPX rcaron lcommaaccent 15 KPX rcaron lslash 15 KPX rcaron m 25 KPX rcaron n 25 KPX rcaron nacute 25 KPX rcaron ncaron 25 KPX rcaron ncommaaccent 25 KPX rcaron ntilde 25 KPX rcaron p 30 KPX rcaron period -50 KPX rcaron semicolon 30 KPX rcaron t 40 KPX rcaron tcommaaccent 40 KPX rcaron u 15 KPX rcaron uacute 15 KPX rcaron ucircumflex 15 KPX rcaron udieresis 15 KPX rcaron ugrave 15 KPX rcaron uhungarumlaut 15 KPX rcaron umacron 15 KPX rcaron uogonek 15 KPX rcaron uring 15 KPX rcaron v 30 KPX rcaron y 30 KPX rcaron yacute 30 KPX rcaron ydieresis 30 KPX rcommaaccent a -10 KPX rcommaaccent aacute -10 KPX rcommaaccent abreve -10 KPX rcommaaccent acircumflex -10 KPX rcommaaccent adieresis -10 KPX rcommaaccent agrave -10 KPX rcommaaccent amacron -10 KPX rcommaaccent aogonek -10 KPX rcommaaccent aring -10 KPX rcommaaccent atilde -10 KPX rcommaaccent colon 30 KPX rcommaaccent comma -50 KPX rcommaaccent i 15 KPX rcommaaccent iacute 15 KPX rcommaaccent icircumflex 15 KPX rcommaaccent idieresis 15 KPX rcommaaccent igrave 15 KPX rcommaaccent imacron 15 KPX rcommaaccent iogonek 15 KPX rcommaaccent k 15 KPX rcommaaccent kcommaaccent 15 KPX rcommaaccent l 15 KPX rcommaaccent lacute 15 KPX rcommaaccent lcommaaccent 15 KPX rcommaaccent lslash 15 KPX rcommaaccent m 25 KPX rcommaaccent n 25 KPX rcommaaccent nacute 25 KPX rcommaaccent ncaron 25 KPX rcommaaccent ncommaaccent 25 KPX rcommaaccent ntilde 25 KPX rcommaaccent p 30 KPX rcommaaccent period -50 KPX rcommaaccent semicolon 30 KPX rcommaaccent t 40 KPX rcommaaccent tcommaaccent 40 KPX rcommaaccent u 15 KPX rcommaaccent uacute 15 KPX rcommaaccent ucircumflex 15 KPX rcommaaccent udieresis 15 KPX rcommaaccent ugrave 15 KPX rcommaaccent uhungarumlaut 15 KPX rcommaaccent umacron 15 KPX rcommaaccent uogonek 15 KPX rcommaaccent uring 15 KPX rcommaaccent v 30 KPX rcommaaccent y 30 KPX rcommaaccent yacute 30 KPX rcommaaccent ydieresis 30 KPX s comma -15 KPX s period -15 KPX s w -30 KPX sacute comma -15 KPX sacute period -15 KPX sacute w -30 KPX scaron comma -15 KPX scaron period -15 KPX scaron w -30 KPX scedilla comma -15 KPX scedilla period -15 KPX scedilla w -30 KPX scommaaccent comma -15 KPX scommaaccent period -15 KPX scommaaccent w -30 KPX semicolon space -50 KPX space T -50 KPX space Tcaron -50 KPX space Tcommaaccent -50 KPX space V -50 KPX space W -40 KPX space Y -90 KPX space Yacute -90 KPX space Ydieresis -90 KPX space quotedblleft -30 KPX space quoteleft -60 KPX v a -25 KPX v aacute -25 KPX v abreve -25 KPX v acircumflex -25 KPX v adieresis -25 KPX v agrave -25 KPX v amacron -25 KPX v aogonek -25 KPX v aring -25 KPX v atilde -25 KPX v comma -80 KPX v e -25 KPX v eacute -25 KPX v ecaron -25 KPX v ecircumflex -25 KPX v edieresis -25 KPX v edotaccent -25 KPX v egrave -25 KPX v emacron -25 KPX v eogonek -25 KPX v o -25 KPX v oacute -25 KPX v ocircumflex -25 KPX v odieresis -25 KPX v ograve -25 KPX v ohungarumlaut -25 KPX v omacron -25 KPX v oslash -25 KPX v otilde -25 KPX v period -80 KPX w a -15 KPX w aacute -15 KPX w abreve -15 KPX w acircumflex -15 KPX w adieresis -15 KPX w agrave -15 KPX w amacron -15 KPX w aogonek -15 KPX w aring -15 KPX w atilde -15 KPX w comma -60 KPX w e -10 KPX w eacute -10 KPX w ecaron -10 KPX w ecircumflex -10 KPX w edieresis -10 KPX w edotaccent -10 KPX w egrave -10 KPX w emacron -10 KPX w eogonek -10 KPX w o -10 KPX w oacute -10 KPX w ocircumflex -10 KPX w odieresis -10 KPX w ograve -10 KPX w ohungarumlaut -10 KPX w omacron -10 KPX w oslash -10 KPX w otilde -10 KPX w period -60 KPX x e -30 KPX x eacute -30 KPX x ecaron -30 KPX x ecircumflex -30 KPX x edieresis -30 KPX x edotaccent -30 KPX x egrave -30 KPX x emacron -30 KPX x eogonek -30 KPX y a -20 KPX y aacute -20 KPX y abreve -20 KPX y acircumflex -20 KPX y adieresis -20 KPX y agrave -20 KPX y amacron -20 KPX y aogonek -20 KPX y aring -20 KPX y atilde -20 KPX y comma -100 KPX y e -20 KPX y eacute -20 KPX y ecaron -20 KPX y ecircumflex -20 KPX y edieresis -20 KPX y edotaccent -20 KPX y egrave -20 KPX y emacron -20 KPX y eogonek -20 KPX y o -20 KPX y oacute -20 KPX y ocircumflex -20 KPX y odieresis -20 KPX y ograve -20 KPX y ohungarumlaut -20 KPX y omacron -20 KPX y oslash -20 KPX y otilde -20 KPX y period -100 KPX yacute a -20 KPX yacute aacute -20 KPX yacute abreve -20 KPX yacute acircumflex -20 KPX yacute adieresis -20 KPX yacute agrave -20 KPX yacute amacron -20 KPX yacute aogonek -20 KPX yacute aring -20 KPX yacute atilde -20 KPX yacute comma -100 KPX yacute e -20 KPX yacute eacute -20 KPX yacute ecaron -20 KPX yacute ecircumflex -20 KPX yacute edieresis -20 KPX yacute edotaccent -20 KPX yacute egrave -20 KPX yacute emacron -20 KPX yacute eogonek -20 KPX yacute o -20 KPX yacute oacute -20 KPX yacute ocircumflex -20 KPX yacute odieresis -20 KPX yacute ograve -20 KPX yacute ohungarumlaut -20 KPX yacute omacron -20 KPX yacute oslash -20 KPX yacute otilde -20 KPX yacute period -100 KPX ydieresis a -20 KPX ydieresis aacute -20 KPX ydieresis abreve -20 KPX ydieresis acircumflex -20 KPX ydieresis adieresis -20 KPX ydieresis agrave -20 KPX ydieresis amacron -20 KPX ydieresis aogonek -20 KPX ydieresis aring -20 KPX ydieresis atilde -20 KPX ydieresis comma -100 KPX ydieresis e -20 KPX ydieresis eacute -20 KPX ydieresis ecaron -20 KPX ydieresis ecircumflex -20 KPX ydieresis edieresis -20 KPX ydieresis edotaccent -20 KPX ydieresis egrave -20 KPX ydieresis emacron -20 KPX ydieresis eogonek -20 KPX ydieresis o -20 KPX ydieresis oacute -20 KPX ydieresis ocircumflex -20 KPX ydieresis odieresis -20 KPX ydieresis ograve -20 KPX ydieresis ohungarumlaut -20 KPX ydieresis omacron -20 KPX ydieresis oslash -20 KPX ydieresis otilde -20 KPX ydieresis period -100 KPX z e -15 KPX z eacute -15 KPX z ecaron -15 KPX z ecircumflex -15 KPX z edieresis -15 KPX z edotaccent -15 KPX z egrave -15 KPX z emacron -15 KPX z eogonek -15 KPX z o -15 KPX z oacute -15 KPX z ocircumflex -15 KPX z odieresis -15 KPX z ograve -15 KPX z ohungarumlaut -15 KPX z omacron -15 KPX z oslash -15 KPX z otilde -15 KPX zacute e -15 KPX zacute eacute -15 KPX zacute ecaron -15 KPX zacute ecircumflex -15 KPX zacute edieresis -15 KPX zacute edotaccent -15 KPX zacute egrave -15 KPX zacute emacron -15 KPX zacute eogonek -15 KPX zacute o -15 KPX zacute oacute -15 KPX zacute ocircumflex -15 KPX zacute odieresis -15 KPX zacute ograve -15 KPX zacute ohungarumlaut -15 KPX zacute omacron -15 KPX zacute oslash -15 KPX zacute otilde -15 KPX zcaron e -15 KPX zcaron eacute -15 KPX zcaron ecaron -15 KPX zcaron ecircumflex -15 KPX zcaron edieresis -15 KPX zcaron edotaccent -15 KPX zcaron egrave -15 KPX zcaron emacron -15 KPX zcaron eogonek -15 KPX zcaron o -15 KPX zcaron oacute -15 KPX zcaron ocircumflex -15 KPX zcaron odieresis -15 KPX zcaron ograve -15 KPX zcaron ohungarumlaut -15 KPX zcaron omacron -15 KPX zcaron oslash -15 KPX zcaron otilde -15 KPX zdotaccent e -15 KPX zdotaccent eacute -15 KPX zdotaccent ecaron -15 KPX zdotaccent ecircumflex -15 KPX zdotaccent edieresis -15 KPX zdotaccent edotaccent -15 KPX zdotaccent egrave -15 KPX zdotaccent emacron -15 KPX zdotaccent eogonek -15 KPX zdotaccent o -15 KPX zdotaccent oacute -15 KPX zdotaccent ocircumflex -15 KPX zdotaccent odieresis -15 KPX zdotaccent ograve -15 KPX zdotaccent ohungarumlaut -15 KPX zdotaccent omacron -15 KPX zdotaccent oslash -15 KPX zdotaccent otilde -15 EndKernPairs EndKernData EndFontMetrics ruby-prawn-1.0.0~rc2.orig/data/fonts/Courier.afm0000644000000000000000000003574712114176157020244 0ustar rootrootStartFontMetrics 4.1 Comment Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. Comment Creation Date: Thu May 1 17:27:09 1997 Comment UniqueID 43050 Comment VMusage 39754 50779 FontName Courier FullName Courier FamilyName Courier Weight Medium ItalicAngle 0 IsFixedPitch true CharacterSet ExtendedRoman FontBBox -23 -250 715 805 UnderlinePosition -100 UnderlineThickness 50 Version 003.000 Notice Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. EncodingScheme AdobeStandardEncoding CapHeight 562 XHeight 426 Ascender 629 Descender -157 StdHW 51 StdVW 51 StartCharMetrics 315 C 32 ; WX 600 ; N space ; B 0 0 0 0 ; C 33 ; WX 600 ; N exclam ; B 236 -15 364 572 ; C 34 ; WX 600 ; N quotedbl ; B 187 328 413 562 ; C 35 ; WX 600 ; N numbersign ; B 93 -32 507 639 ; C 36 ; WX 600 ; N dollar ; B 105 -126 496 662 ; C 37 ; WX 600 ; N percent ; B 81 -15 518 622 ; C 38 ; WX 600 ; N ampersand ; B 63 -15 538 543 ; C 39 ; WX 600 ; N quoteright ; B 213 328 376 562 ; C 40 ; WX 600 ; N parenleft ; B 269 -108 440 622 ; C 41 ; WX 600 ; N parenright ; B 160 -108 331 622 ; C 42 ; WX 600 ; N asterisk ; B 116 257 484 607 ; C 43 ; WX 600 ; N plus ; B 80 44 520 470 ; C 44 ; WX 600 ; N comma ; B 181 -112 344 122 ; C 45 ; WX 600 ; N hyphen ; B 103 231 497 285 ; C 46 ; WX 600 ; N period ; B 229 -15 371 109 ; C 47 ; WX 600 ; N slash ; B 125 -80 475 629 ; C 48 ; WX 600 ; N zero ; B 106 -15 494 622 ; C 49 ; WX 600 ; N one ; B 96 0 505 622 ; C 50 ; WX 600 ; N two ; B 70 0 471 622 ; C 51 ; WX 600 ; N three ; B 75 -15 466 622 ; C 52 ; WX 600 ; N four ; B 78 0 500 622 ; C 53 ; WX 600 ; N five ; B 92 -15 497 607 ; C 54 ; WX 600 ; N six ; B 111 -15 497 622 ; C 55 ; WX 600 ; N seven ; B 82 0 483 607 ; C 56 ; WX 600 ; N eight ; B 102 -15 498 622 ; C 57 ; WX 600 ; N nine ; B 96 -15 489 622 ; C 58 ; WX 600 ; N colon ; B 229 -15 371 385 ; C 59 ; WX 600 ; N semicolon ; B 181 -112 371 385 ; C 60 ; WX 600 ; N less ; B 41 42 519 472 ; C 61 ; WX 600 ; N equal ; B 80 138 520 376 ; C 62 ; WX 600 ; N greater ; B 66 42 544 472 ; C 63 ; WX 600 ; N question ; B 129 -15 492 572 ; C 64 ; WX 600 ; N at ; B 77 -15 533 622 ; C 65 ; WX 600 ; N A ; B 3 0 597 562 ; C 66 ; WX 600 ; N B ; B 43 0 559 562 ; C 67 ; WX 600 ; N C ; B 41 -18 540 580 ; C 68 ; WX 600 ; N D ; B 43 0 574 562 ; C 69 ; WX 600 ; N E ; B 53 0 550 562 ; C 70 ; WX 600 ; N F ; B 53 0 545 562 ; C 71 ; WX 600 ; N G ; B 31 -18 575 580 ; C 72 ; WX 600 ; N H ; B 32 0 568 562 ; C 73 ; WX 600 ; N I ; B 96 0 504 562 ; C 74 ; WX 600 ; N J ; B 34 -18 566 562 ; C 75 ; WX 600 ; N K ; B 38 0 582 562 ; C 76 ; WX 600 ; N L ; B 47 0 554 562 ; C 77 ; WX 600 ; N M ; B 4 0 596 562 ; C 78 ; WX 600 ; N N ; B 7 -13 593 562 ; C 79 ; WX 600 ; N O ; B 43 -18 557 580 ; C 80 ; WX 600 ; N P ; B 79 0 558 562 ; C 81 ; WX 600 ; N Q ; B 43 -138 557 580 ; C 82 ; WX 600 ; N R ; B 38 0 588 562 ; C 83 ; WX 600 ; N S ; B 72 -20 529 580 ; C 84 ; WX 600 ; N T ; B 38 0 563 562 ; C 85 ; WX 600 ; N U ; B 17 -18 583 562 ; C 86 ; WX 600 ; N V ; B -4 -13 604 562 ; C 87 ; WX 600 ; N W ; B -3 -13 603 562 ; C 88 ; WX 600 ; N X ; B 23 0 577 562 ; C 89 ; WX 600 ; N Y ; B 24 0 576 562 ; C 90 ; WX 600 ; N Z ; B 86 0 514 562 ; C 91 ; WX 600 ; N bracketleft ; B 269 -108 442 622 ; C 92 ; WX 600 ; N backslash ; B 118 -80 482 629 ; C 93 ; WX 600 ; N bracketright ; B 158 -108 331 622 ; C 94 ; WX 600 ; N asciicircum ; B 94 354 506 622 ; C 95 ; WX 600 ; N underscore ; B 0 -125 600 -75 ; C 96 ; WX 600 ; N quoteleft ; B 224 328 387 562 ; C 97 ; WX 600 ; N a ; B 53 -15 559 441 ; C 98 ; WX 600 ; N b ; B 14 -15 575 629 ; C 99 ; WX 600 ; N c ; B 66 -15 529 441 ; C 100 ; WX 600 ; N d ; B 45 -15 591 629 ; C 101 ; WX 600 ; N e ; B 66 -15 548 441 ; C 102 ; WX 600 ; N f ; B 114 0 531 629 ; L i fi ; L l fl ; C 103 ; WX 600 ; N g ; B 45 -157 566 441 ; C 104 ; WX 600 ; N h ; B 18 0 582 629 ; C 105 ; WX 600 ; N i ; B 95 0 505 657 ; C 106 ; WX 600 ; N j ; B 82 -157 410 657 ; C 107 ; WX 600 ; N k ; B 43 0 580 629 ; C 108 ; WX 600 ; N l ; B 95 0 505 629 ; C 109 ; WX 600 ; N m ; B -5 0 605 441 ; C 110 ; WX 600 ; N n ; B 26 0 575 441 ; C 111 ; WX 600 ; N o ; B 62 -15 538 441 ; C 112 ; WX 600 ; N p ; B 9 -157 555 441 ; C 113 ; WX 600 ; N q ; B 45 -157 591 441 ; C 114 ; WX 600 ; N r ; B 60 0 559 441 ; C 115 ; WX 600 ; N s ; B 80 -15 513 441 ; C 116 ; WX 600 ; N t ; B 87 -15 530 561 ; C 117 ; WX 600 ; N u ; B 21 -15 562 426 ; C 118 ; WX 600 ; N v ; B 10 -10 590 426 ; C 119 ; WX 600 ; N w ; B -4 -10 604 426 ; C 120 ; WX 600 ; N x ; B 20 0 580 426 ; C 121 ; WX 600 ; N y ; B 7 -157 592 426 ; C 122 ; WX 600 ; N z ; B 99 0 502 426 ; C 123 ; WX 600 ; N braceleft ; B 182 -108 437 622 ; C 124 ; WX 600 ; N bar ; B 275 -250 326 750 ; C 125 ; WX 600 ; N braceright ; B 163 -108 418 622 ; C 126 ; WX 600 ; N asciitilde ; B 63 197 540 320 ; C 161 ; WX 600 ; N exclamdown ; B 236 -157 364 430 ; C 162 ; WX 600 ; N cent ; B 96 -49 500 614 ; C 163 ; WX 600 ; N sterling ; B 84 -21 521 611 ; C 164 ; WX 600 ; N fraction ; B 92 -57 509 665 ; C 165 ; WX 600 ; N yen ; B 26 0 574 562 ; C 166 ; WX 600 ; N florin ; B 4 -143 539 622 ; C 167 ; WX 600 ; N section ; B 113 -78 488 580 ; C 168 ; WX 600 ; N currency ; B 73 58 527 506 ; C 169 ; WX 600 ; N quotesingle ; B 259 328 341 562 ; C 170 ; WX 600 ; N quotedblleft ; B 143 328 471 562 ; C 171 ; WX 600 ; N guillemotleft ; B 37 70 563 446 ; C 172 ; WX 600 ; N guilsinglleft ; B 149 70 451 446 ; C 173 ; WX 600 ; N guilsinglright ; B 149 70 451 446 ; C 174 ; WX 600 ; N fi ; B 3 0 597 629 ; C 175 ; WX 600 ; N fl ; B 3 0 597 629 ; C 177 ; WX 600 ; N endash ; B 75 231 525 285 ; C 178 ; WX 600 ; N dagger ; B 141 -78 459 580 ; C 179 ; WX 600 ; N daggerdbl ; B 141 -78 459 580 ; C 180 ; WX 600 ; N periodcentered ; B 222 189 378 327 ; C 182 ; WX 600 ; N paragraph ; B 50 -78 511 562 ; C 183 ; WX 600 ; N bullet ; B 172 130 428 383 ; C 184 ; WX 600 ; N quotesinglbase ; B 213 -134 376 100 ; C 185 ; WX 600 ; N quotedblbase ; B 143 -134 457 100 ; C 186 ; WX 600 ; N quotedblright ; B 143 328 457 562 ; C 187 ; WX 600 ; N guillemotright ; B 37 70 563 446 ; C 188 ; WX 600 ; N ellipsis ; B 37 -15 563 111 ; C 189 ; WX 600 ; N perthousand ; B 3 -15 600 622 ; C 191 ; WX 600 ; N questiondown ; B 108 -157 471 430 ; C 193 ; WX 600 ; N grave ; B 151 497 378 672 ; C 194 ; WX 600 ; N acute ; B 242 497 469 672 ; C 195 ; WX 600 ; N circumflex ; B 124 477 476 654 ; C 196 ; WX 600 ; N tilde ; B 105 489 503 606 ; C 197 ; WX 600 ; N macron ; B 120 525 480 565 ; C 198 ; WX 600 ; N breve ; B 153 501 447 609 ; C 199 ; WX 600 ; N dotaccent ; B 249 537 352 640 ; C 200 ; WX 600 ; N dieresis ; B 148 537 453 640 ; C 202 ; WX 600 ; N ring ; B 218 463 382 627 ; C 203 ; WX 600 ; N cedilla ; B 224 -151 362 10 ; C 205 ; WX 600 ; N hungarumlaut ; B 133 497 540 672 ; C 206 ; WX 600 ; N ogonek ; B 211 -172 407 4 ; C 207 ; WX 600 ; N caron ; B 124 492 476 669 ; C 208 ; WX 600 ; N emdash ; B 0 231 600 285 ; C 225 ; WX 600 ; N AE ; B 3 0 550 562 ; C 227 ; WX 600 ; N ordfeminine ; B 156 249 442 580 ; C 232 ; WX 600 ; N Lslash ; B 47 0 554 562 ; C 233 ; WX 600 ; N Oslash ; B 43 -80 557 629 ; C 234 ; WX 600 ; N OE ; B 7 0 567 562 ; C 235 ; WX 600 ; N ordmasculine ; B 157 249 443 580 ; C 241 ; WX 600 ; N ae ; B 19 -15 570 441 ; C 245 ; WX 600 ; N dotlessi ; B 95 0 505 426 ; C 248 ; WX 600 ; N lslash ; B 95 0 505 629 ; C 249 ; WX 600 ; N oslash ; B 62 -80 538 506 ; C 250 ; WX 600 ; N oe ; B 19 -15 559 441 ; C 251 ; WX 600 ; N germandbls ; B 48 -15 588 629 ; C -1 ; WX 600 ; N Idieresis ; B 96 0 504 753 ; C -1 ; WX 600 ; N eacute ; B 66 -15 548 672 ; C -1 ; WX 600 ; N abreve ; B 53 -15 559 609 ; C -1 ; WX 600 ; N uhungarumlaut ; B 21 -15 580 672 ; C -1 ; WX 600 ; N ecaron ; B 66 -15 548 669 ; C -1 ; WX 600 ; N Ydieresis ; B 24 0 576 753 ; C -1 ; WX 600 ; N divide ; B 87 48 513 467 ; C -1 ; WX 600 ; N Yacute ; B 24 0 576 805 ; C -1 ; WX 600 ; N Acircumflex ; B 3 0 597 787 ; C -1 ; WX 600 ; N aacute ; B 53 -15 559 672 ; C -1 ; WX 600 ; N Ucircumflex ; B 17 -18 583 787 ; C -1 ; WX 600 ; N yacute ; B 7 -157 592 672 ; C -1 ; WX 600 ; N scommaaccent ; B 80 -250 513 441 ; C -1 ; WX 600 ; N ecircumflex ; B 66 -15 548 654 ; C -1 ; WX 600 ; N Uring ; B 17 -18 583 760 ; C -1 ; WX 600 ; N Udieresis ; B 17 -18 583 753 ; C -1 ; WX 600 ; N aogonek ; B 53 -172 587 441 ; C -1 ; WX 600 ; N Uacute ; B 17 -18 583 805 ; C -1 ; WX 600 ; N uogonek ; B 21 -172 590 426 ; C -1 ; WX 600 ; N Edieresis ; B 53 0 550 753 ; C -1 ; WX 600 ; N Dcroat ; B 30 0 574 562 ; C -1 ; WX 600 ; N commaaccent ; B 198 -250 335 -58 ; C -1 ; WX 600 ; N copyright ; B 0 -18 600 580 ; C -1 ; WX 600 ; N Emacron ; B 53 0 550 698 ; C -1 ; WX 600 ; N ccaron ; B 66 -15 529 669 ; C -1 ; WX 600 ; N aring ; B 53 -15 559 627 ; C -1 ; WX 600 ; N Ncommaaccent ; B 7 -250 593 562 ; C -1 ; WX 600 ; N lacute ; B 95 0 505 805 ; C -1 ; WX 600 ; N agrave ; B 53 -15 559 672 ; C -1 ; WX 600 ; N Tcommaaccent ; B 38 -250 563 562 ; C -1 ; WX 600 ; N Cacute ; B 41 -18 540 805 ; C -1 ; WX 600 ; N atilde ; B 53 -15 559 606 ; C -1 ; WX 600 ; N Edotaccent ; B 53 0 550 753 ; C -1 ; WX 600 ; N scaron ; B 80 -15 513 669 ; C -1 ; WX 600 ; N scedilla ; B 80 -151 513 441 ; C -1 ; WX 600 ; N iacute ; B 95 0 505 672 ; C -1 ; WX 600 ; N lozenge ; B 18 0 443 706 ; C -1 ; WX 600 ; N Rcaron ; B 38 0 588 802 ; C -1 ; WX 600 ; N Gcommaaccent ; B 31 -250 575 580 ; C -1 ; WX 600 ; N ucircumflex ; B 21 -15 562 654 ; C -1 ; WX 600 ; N acircumflex ; B 53 -15 559 654 ; C -1 ; WX 600 ; N Amacron ; B 3 0 597 698 ; C -1 ; WX 600 ; N rcaron ; B 60 0 559 669 ; C -1 ; WX 600 ; N ccedilla ; B 66 -151 529 441 ; C -1 ; WX 600 ; N Zdotaccent ; B 86 0 514 753 ; C -1 ; WX 600 ; N Thorn ; B 79 0 538 562 ; C -1 ; WX 600 ; N Omacron ; B 43 -18 557 698 ; C -1 ; WX 600 ; N Racute ; B 38 0 588 805 ; C -1 ; WX 600 ; N Sacute ; B 72 -20 529 805 ; C -1 ; WX 600 ; N dcaron ; B 45 -15 715 629 ; C -1 ; WX 600 ; N Umacron ; B 17 -18 583 698 ; C -1 ; WX 600 ; N uring ; B 21 -15 562 627 ; C -1 ; WX 600 ; N threesuperior ; B 155 240 406 622 ; C -1 ; WX 600 ; N Ograve ; B 43 -18 557 805 ; C -1 ; WX 600 ; N Agrave ; B 3 0 597 805 ; C -1 ; WX 600 ; N Abreve ; B 3 0 597 732 ; C -1 ; WX 600 ; N multiply ; B 87 43 515 470 ; C -1 ; WX 600 ; N uacute ; B 21 -15 562 672 ; C -1 ; WX 600 ; N Tcaron ; B 38 0 563 802 ; C -1 ; WX 600 ; N partialdiff ; B 17 -38 459 710 ; C -1 ; WX 600 ; N ydieresis ; B 7 -157 592 620 ; C -1 ; WX 600 ; N Nacute ; B 7 -13 593 805 ; C -1 ; WX 600 ; N icircumflex ; B 94 0 505 654 ; C -1 ; WX 600 ; N Ecircumflex ; B 53 0 550 787 ; C -1 ; WX 600 ; N adieresis ; B 53 -15 559 620 ; C -1 ; WX 600 ; N edieresis ; B 66 -15 548 620 ; C -1 ; WX 600 ; N cacute ; B 66 -15 529 672 ; C -1 ; WX 600 ; N nacute ; B 26 0 575 672 ; C -1 ; WX 600 ; N umacron ; B 21 -15 562 565 ; C -1 ; WX 600 ; N Ncaron ; B 7 -13 593 802 ; C -1 ; WX 600 ; N Iacute ; B 96 0 504 805 ; C -1 ; WX 600 ; N plusminus ; B 87 44 513 558 ; C -1 ; WX 600 ; N brokenbar ; B 275 -175 326 675 ; C -1 ; WX 600 ; N registered ; B 0 -18 600 580 ; C -1 ; WX 600 ; N Gbreve ; B 31 -18 575 732 ; C -1 ; WX 600 ; N Idotaccent ; B 96 0 504 753 ; C -1 ; WX 600 ; N summation ; B 15 -10 585 706 ; C -1 ; WX 600 ; N Egrave ; B 53 0 550 805 ; C -1 ; WX 600 ; N racute ; B 60 0 559 672 ; C -1 ; WX 600 ; N omacron ; B 62 -15 538 565 ; C -1 ; WX 600 ; N Zacute ; B 86 0 514 805 ; C -1 ; WX 600 ; N Zcaron ; B 86 0 514 802 ; C -1 ; WX 600 ; N greaterequal ; B 98 0 502 710 ; C -1 ; WX 600 ; N Eth ; B 30 0 574 562 ; C -1 ; WX 600 ; N Ccedilla ; B 41 -151 540 580 ; C -1 ; WX 600 ; N lcommaaccent ; B 95 -250 505 629 ; C -1 ; WX 600 ; N tcaron ; B 87 -15 530 717 ; C -1 ; WX 600 ; N eogonek ; B 66 -172 548 441 ; C -1 ; WX 600 ; N Uogonek ; B 17 -172 583 562 ; C -1 ; WX 600 ; N Aacute ; B 3 0 597 805 ; C -1 ; WX 600 ; N Adieresis ; B 3 0 597 753 ; C -1 ; WX 600 ; N egrave ; B 66 -15 548 672 ; C -1 ; WX 600 ; N zacute ; B 99 0 502 672 ; C -1 ; WX 600 ; N iogonek ; B 95 -172 505 657 ; C -1 ; WX 600 ; N Oacute ; B 43 -18 557 805 ; C -1 ; WX 600 ; N oacute ; B 62 -15 538 672 ; C -1 ; WX 600 ; N amacron ; B 53 -15 559 565 ; C -1 ; WX 600 ; N sacute ; B 80 -15 513 672 ; C -1 ; WX 600 ; N idieresis ; B 95 0 505 620 ; C -1 ; WX 600 ; N Ocircumflex ; B 43 -18 557 787 ; C -1 ; WX 600 ; N Ugrave ; B 17 -18 583 805 ; C -1 ; WX 600 ; N Delta ; B 6 0 598 688 ; C -1 ; WX 600 ; N thorn ; B -6 -157 555 629 ; C -1 ; WX 600 ; N twosuperior ; B 177 249 424 622 ; C -1 ; WX 600 ; N Odieresis ; B 43 -18 557 753 ; C -1 ; WX 600 ; N mu ; B 21 -157 562 426 ; C -1 ; WX 600 ; N igrave ; B 95 0 505 672 ; C -1 ; WX 600 ; N ohungarumlaut ; B 62 -15 580 672 ; C -1 ; WX 600 ; N Eogonek ; B 53 -172 561 562 ; C -1 ; WX 600 ; N dcroat ; B 45 -15 591 629 ; C -1 ; WX 600 ; N threequarters ; B 8 -56 593 666 ; C -1 ; WX 600 ; N Scedilla ; B 72 -151 529 580 ; C -1 ; WX 600 ; N lcaron ; B 95 0 533 629 ; C -1 ; WX 600 ; N Kcommaaccent ; B 38 -250 582 562 ; C -1 ; WX 600 ; N Lacute ; B 47 0 554 805 ; C -1 ; WX 600 ; N trademark ; B -23 263 623 562 ; C -1 ; WX 600 ; N edotaccent ; B 66 -15 548 620 ; C -1 ; WX 600 ; N Igrave ; B 96 0 504 805 ; C -1 ; WX 600 ; N Imacron ; B 96 0 504 698 ; C -1 ; WX 600 ; N Lcaron ; B 47 0 554 562 ; C -1 ; WX 600 ; N onehalf ; B 0 -57 611 665 ; C -1 ; WX 600 ; N lessequal ; B 98 0 502 710 ; C -1 ; WX 600 ; N ocircumflex ; B 62 -15 538 654 ; C -1 ; WX 600 ; N ntilde ; B 26 0 575 606 ; C -1 ; WX 600 ; N Uhungarumlaut ; B 17 -18 590 805 ; C -1 ; WX 600 ; N Eacute ; B 53 0 550 805 ; C -1 ; WX 600 ; N emacron ; B 66 -15 548 565 ; C -1 ; WX 600 ; N gbreve ; B 45 -157 566 609 ; C -1 ; WX 600 ; N onequarter ; B 0 -57 600 665 ; C -1 ; WX 600 ; N Scaron ; B 72 -20 529 802 ; C -1 ; WX 600 ; N Scommaaccent ; B 72 -250 529 580 ; C -1 ; WX 600 ; N Ohungarumlaut ; B 43 -18 580 805 ; C -1 ; WX 600 ; N degree ; B 123 269 477 622 ; C -1 ; WX 600 ; N ograve ; B 62 -15 538 672 ; C -1 ; WX 600 ; N Ccaron ; B 41 -18 540 802 ; C -1 ; WX 600 ; N ugrave ; B 21 -15 562 672 ; C -1 ; WX 600 ; N radical ; B 3 -15 597 792 ; C -1 ; WX 600 ; N Dcaron ; B 43 0 574 802 ; C -1 ; WX 600 ; N rcommaaccent ; B 60 -250 559 441 ; C -1 ; WX 600 ; N Ntilde ; B 7 -13 593 729 ; C -1 ; WX 600 ; N otilde ; B 62 -15 538 606 ; C -1 ; WX 600 ; N Rcommaaccent ; B 38 -250 588 562 ; C -1 ; WX 600 ; N Lcommaaccent ; B 47 -250 554 562 ; C -1 ; WX 600 ; N Atilde ; B 3 0 597 729 ; C -1 ; WX 600 ; N Aogonek ; B 3 -172 608 562 ; C -1 ; WX 600 ; N Aring ; B 3 0 597 750 ; C -1 ; WX 600 ; N Otilde ; B 43 -18 557 729 ; C -1 ; WX 600 ; N zdotaccent ; B 99 0 502 620 ; C -1 ; WX 600 ; N Ecaron ; B 53 0 550 802 ; C -1 ; WX 600 ; N Iogonek ; B 96 -172 504 562 ; C -1 ; WX 600 ; N kcommaaccent ; B 43 -250 580 629 ; C -1 ; WX 600 ; N minus ; B 80 232 520 283 ; C -1 ; WX 600 ; N Icircumflex ; B 96 0 504 787 ; C -1 ; WX 600 ; N ncaron ; B 26 0 575 669 ; C -1 ; WX 600 ; N tcommaaccent ; B 87 -250 530 561 ; C -1 ; WX 600 ; N logicalnot ; B 87 108 513 369 ; C -1 ; WX 600 ; N odieresis ; B 62 -15 538 620 ; C -1 ; WX 600 ; N udieresis ; B 21 -15 562 620 ; C -1 ; WX 600 ; N notequal ; B 15 -16 540 529 ; C -1 ; WX 600 ; N gcommaaccent ; B 45 -157 566 708 ; C -1 ; WX 600 ; N eth ; B 62 -15 538 629 ; C -1 ; WX 600 ; N zcaron ; B 99 0 502 669 ; C -1 ; WX 600 ; N ncommaaccent ; B 26 -250 575 441 ; C -1 ; WX 600 ; N onesuperior ; B 172 249 428 622 ; C -1 ; WX 600 ; N imacron ; B 95 0 505 565 ; C -1 ; WX 600 ; N Euro ; B 0 0 0 0 ; EndCharMetrics EndFontMetrics ruby-prawn-1.0.0~rc2.orig/data/fonts/ZapfDingbats.afm0000644000000000000000000002246712114176157021203 0ustar rootrootStartFontMetrics 4.1 Comment Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated. All Rights Reserved. Comment Creation Date: Thu May 1 15:14:13 1997 Comment UniqueID 43082 Comment VMusage 45775 55535 FontName ZapfDingbats FullName ITC Zapf Dingbats FamilyName ZapfDingbats Weight Medium ItalicAngle 0 IsFixedPitch false CharacterSet Special FontBBox -1 -143 981 820 UnderlinePosition -100 UnderlineThickness 50 Version 002.000 Notice Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated. All Rights Reserved.ITC Zapf Dingbats is a registered trademark of International Typeface Corporation. EncodingScheme FontSpecific StdHW 28 StdVW 90 StartCharMetrics 202 C 32 ; WX 278 ; N space ; B 0 0 0 0 ; C 33 ; WX 974 ; N a1 ; B 35 72 939 621 ; C 34 ; WX 961 ; N a2 ; B 35 81 927 611 ; C 35 ; WX 974 ; N a202 ; B 35 72 939 621 ; C 36 ; WX 980 ; N a3 ; B 35 0 945 692 ; C 37 ; WX 719 ; N a4 ; B 34 139 685 566 ; C 38 ; WX 789 ; N a5 ; B 35 -14 755 705 ; C 39 ; WX 790 ; N a119 ; B 35 -14 755 705 ; C 40 ; WX 791 ; N a118 ; B 35 -13 761 705 ; C 41 ; WX 690 ; N a117 ; B 34 138 655 553 ; C 42 ; WX 960 ; N a11 ; B 35 123 925 568 ; C 43 ; WX 939 ; N a12 ; B 35 134 904 559 ; C 44 ; WX 549 ; N a13 ; B 29 -11 516 705 ; C 45 ; WX 855 ; N a14 ; B 34 59 820 632 ; C 46 ; WX 911 ; N a15 ; B 35 50 876 642 ; C 47 ; WX 933 ; N a16 ; B 35 139 899 550 ; C 48 ; WX 911 ; N a105 ; B 35 50 876 642 ; C 49 ; WX 945 ; N a17 ; B 35 139 909 553 ; C 50 ; WX 974 ; N a18 ; B 35 104 938 587 ; C 51 ; WX 755 ; N a19 ; B 34 -13 721 705 ; C 52 ; WX 846 ; N a20 ; B 36 -14 811 705 ; C 53 ; WX 762 ; N a21 ; B 35 0 727 692 ; C 54 ; WX 761 ; N a22 ; B 35 0 727 692 ; C 55 ; WX 571 ; N a23 ; B -1 -68 571 661 ; C 56 ; WX 677 ; N a24 ; B 36 -13 642 705 ; C 57 ; WX 763 ; N a25 ; B 35 0 728 692 ; C 58 ; WX 760 ; N a26 ; B 35 0 726 692 ; C 59 ; WX 759 ; N a27 ; B 35 0 725 692 ; C 60 ; WX 754 ; N a28 ; B 35 0 720 692 ; C 61 ; WX 494 ; N a6 ; B 35 0 460 692 ; C 62 ; WX 552 ; N a7 ; B 35 0 517 692 ; C 63 ; WX 537 ; N a8 ; B 35 0 503 692 ; C 64 ; WX 577 ; N a9 ; B 35 96 542 596 ; C 65 ; WX 692 ; N a10 ; B 35 -14 657 705 ; C 66 ; WX 786 ; N a29 ; B 35 -14 751 705 ; C 67 ; WX 788 ; N a30 ; B 35 -14 752 705 ; C 68 ; WX 788 ; N a31 ; B 35 -14 753 705 ; C 69 ; WX 790 ; N a32 ; B 35 -14 756 705 ; C 70 ; WX 793 ; N a33 ; B 35 -13 759 705 ; C 71 ; WX 794 ; N a34 ; B 35 -13 759 705 ; C 72 ; WX 816 ; N a35 ; B 35 -14 782 705 ; C 73 ; WX 823 ; N a36 ; B 35 -14 787 705 ; C 74 ; WX 789 ; N a37 ; B 35 -14 754 705 ; C 75 ; WX 841 ; N a38 ; B 35 -14 807 705 ; C 76 ; WX 823 ; N a39 ; B 35 -14 789 705 ; C 77 ; WX 833 ; N a40 ; B 35 -14 798 705 ; C 78 ; WX 816 ; N a41 ; B 35 -13 782 705 ; C 79 ; WX 831 ; N a42 ; B 35 -14 796 705 ; C 80 ; WX 923 ; N a43 ; B 35 -14 888 705 ; C 81 ; WX 744 ; N a44 ; B 35 0 710 692 ; C 82 ; WX 723 ; N a45 ; B 35 0 688 692 ; C 83 ; WX 749 ; N a46 ; B 35 0 714 692 ; C 84 ; WX 790 ; N a47 ; B 34 -14 756 705 ; C 85 ; WX 792 ; N a48 ; B 35 -14 758 705 ; C 86 ; WX 695 ; N a49 ; B 35 -14 661 706 ; C 87 ; WX 776 ; N a50 ; B 35 -6 741 699 ; C 88 ; WX 768 ; N a51 ; B 35 -7 734 699 ; C 89 ; WX 792 ; N a52 ; B 35 -14 757 705 ; C 90 ; WX 759 ; N a53 ; B 35 0 725 692 ; C 91 ; WX 707 ; N a54 ; B 35 -13 672 704 ; C 92 ; WX 708 ; N a55 ; B 35 -14 672 705 ; C 93 ; WX 682 ; N a56 ; B 35 -14 647 705 ; C 94 ; WX 701 ; N a57 ; B 35 -14 666 705 ; C 95 ; WX 826 ; N a58 ; B 35 -14 791 705 ; C 96 ; WX 815 ; N a59 ; B 35 -14 780 705 ; C 97 ; WX 789 ; N a60 ; B 35 -14 754 705 ; C 98 ; WX 789 ; N a61 ; B 35 -14 754 705 ; C 99 ; WX 707 ; N a62 ; B 34 -14 673 705 ; C 100 ; WX 687 ; N a63 ; B 36 0 651 692 ; C 101 ; WX 696 ; N a64 ; B 35 0 661 691 ; C 102 ; WX 689 ; N a65 ; B 35 0 655 692 ; C 103 ; WX 786 ; N a66 ; B 34 -14 751 705 ; C 104 ; WX 787 ; N a67 ; B 35 -14 752 705 ; C 105 ; WX 713 ; N a68 ; B 35 -14 678 705 ; C 106 ; WX 791 ; N a69 ; B 35 -14 756 705 ; C 107 ; WX 785 ; N a70 ; B 36 -14 751 705 ; C 108 ; WX 791 ; N a71 ; B 35 -14 757 705 ; C 109 ; WX 873 ; N a72 ; B 35 -14 838 705 ; C 110 ; WX 761 ; N a73 ; B 35 0 726 692 ; C 111 ; WX 762 ; N a74 ; B 35 0 727 692 ; C 112 ; WX 762 ; N a203 ; B 35 0 727 692 ; C 113 ; WX 759 ; N a75 ; B 35 0 725 692 ; C 114 ; WX 759 ; N a204 ; B 35 0 725 692 ; C 115 ; WX 892 ; N a76 ; B 35 0 858 705 ; C 116 ; WX 892 ; N a77 ; B 35 -14 858 692 ; C 117 ; WX 788 ; N a78 ; B 35 -14 754 705 ; C 118 ; WX 784 ; N a79 ; B 35 -14 749 705 ; C 119 ; WX 438 ; N a81 ; B 35 -14 403 705 ; C 120 ; WX 138 ; N a82 ; B 35 0 104 692 ; C 121 ; WX 277 ; N a83 ; B 35 0 242 692 ; C 122 ; WX 415 ; N a84 ; B 35 0 380 692 ; C 123 ; WX 392 ; N a97 ; B 35 263 357 705 ; C 124 ; WX 392 ; N a98 ; B 34 263 357 705 ; C 125 ; WX 668 ; N a99 ; B 35 263 633 705 ; C 126 ; WX 668 ; N a100 ; B 36 263 634 705 ; C 128 ; WX 390 ; N a89 ; B 35 -14 356 705 ; C 129 ; WX 390 ; N a90 ; B 35 -14 355 705 ; C 130 ; WX 317 ; N a93 ; B 35 0 283 692 ; C 131 ; WX 317 ; N a94 ; B 35 0 283 692 ; C 132 ; WX 276 ; N a91 ; B 35 0 242 692 ; C 133 ; WX 276 ; N a92 ; B 35 0 242 692 ; C 134 ; WX 509 ; N a205 ; B 35 0 475 692 ; C 135 ; WX 509 ; N a85 ; B 35 0 475 692 ; C 136 ; WX 410 ; N a206 ; B 35 0 375 692 ; C 137 ; WX 410 ; N a86 ; B 35 0 375 692 ; C 138 ; WX 234 ; N a87 ; B 35 -14 199 705 ; C 139 ; WX 234 ; N a88 ; B 35 -14 199 705 ; C 140 ; WX 334 ; N a95 ; B 35 0 299 692 ; C 141 ; WX 334 ; N a96 ; B 35 0 299 692 ; C 161 ; WX 732 ; N a101 ; B 35 -143 697 806 ; C 162 ; WX 544 ; N a102 ; B 56 -14 488 706 ; C 163 ; WX 544 ; N a103 ; B 34 -14 508 705 ; C 164 ; WX 910 ; N a104 ; B 35 40 875 651 ; C 165 ; WX 667 ; N a106 ; B 35 -14 633 705 ; C 166 ; WX 760 ; N a107 ; B 35 -14 726 705 ; C 167 ; WX 760 ; N a108 ; B 0 121 758 569 ; C 168 ; WX 776 ; N a112 ; B 35 0 741 705 ; C 169 ; WX 595 ; N a111 ; B 34 -14 560 705 ; C 170 ; WX 694 ; N a110 ; B 35 -14 659 705 ; C 171 ; WX 626 ; N a109 ; B 34 0 591 705 ; C 172 ; WX 788 ; N a120 ; B 35 -14 754 705 ; C 173 ; WX 788 ; N a121 ; B 35 -14 754 705 ; C 174 ; WX 788 ; N a122 ; B 35 -14 754 705 ; C 175 ; WX 788 ; N a123 ; B 35 -14 754 705 ; C 176 ; WX 788 ; N a124 ; B 35 -14 754 705 ; C 177 ; WX 788 ; N a125 ; B 35 -14 754 705 ; C 178 ; WX 788 ; N a126 ; B 35 -14 754 705 ; C 179 ; WX 788 ; N a127 ; B 35 -14 754 705 ; C 180 ; WX 788 ; N a128 ; B 35 -14 754 705 ; C 181 ; WX 788 ; N a129 ; B 35 -14 754 705 ; C 182 ; WX 788 ; N a130 ; B 35 -14 754 705 ; C 183 ; WX 788 ; N a131 ; B 35 -14 754 705 ; C 184 ; WX 788 ; N a132 ; B 35 -14 754 705 ; C 185 ; WX 788 ; N a133 ; B 35 -14 754 705 ; C 186 ; WX 788 ; N a134 ; B 35 -14 754 705 ; C 187 ; WX 788 ; N a135 ; B 35 -14 754 705 ; C 188 ; WX 788 ; N a136 ; B 35 -14 754 705 ; C 189 ; WX 788 ; N a137 ; B 35 -14 754 705 ; C 190 ; WX 788 ; N a138 ; B 35 -14 754 705 ; C 191 ; WX 788 ; N a139 ; B 35 -14 754 705 ; C 192 ; WX 788 ; N a140 ; B 35 -14 754 705 ; C 193 ; WX 788 ; N a141 ; B 35 -14 754 705 ; C 194 ; WX 788 ; N a142 ; B 35 -14 754 705 ; C 195 ; WX 788 ; N a143 ; B 35 -14 754 705 ; C 196 ; WX 788 ; N a144 ; B 35 -14 754 705 ; C 197 ; WX 788 ; N a145 ; B 35 -14 754 705 ; C 198 ; WX 788 ; N a146 ; B 35 -14 754 705 ; C 199 ; WX 788 ; N a147 ; B 35 -14 754 705 ; C 200 ; WX 788 ; N a148 ; B 35 -14 754 705 ; C 201 ; WX 788 ; N a149 ; B 35 -14 754 705 ; C 202 ; WX 788 ; N a150 ; B 35 -14 754 705 ; C 203 ; WX 788 ; N a151 ; B 35 -14 754 705 ; C 204 ; WX 788 ; N a152 ; B 35 -14 754 705 ; C 205 ; WX 788 ; N a153 ; B 35 -14 754 705 ; C 206 ; WX 788 ; N a154 ; B 35 -14 754 705 ; C 207 ; WX 788 ; N a155 ; B 35 -14 754 705 ; C 208 ; WX 788 ; N a156 ; B 35 -14 754 705 ; C 209 ; WX 788 ; N a157 ; B 35 -14 754 705 ; C 210 ; WX 788 ; N a158 ; B 35 -14 754 705 ; C 211 ; WX 788 ; N a159 ; B 35 -14 754 705 ; C 212 ; WX 894 ; N a160 ; B 35 58 860 634 ; C 213 ; WX 838 ; N a161 ; B 35 152 803 540 ; C 214 ; WX 1016 ; N a163 ; B 34 152 981 540 ; C 215 ; WX 458 ; N a164 ; B 35 -127 422 820 ; C 216 ; WX 748 ; N a196 ; B 35 94 698 597 ; C 217 ; WX 924 ; N a165 ; B 35 140 890 552 ; C 218 ; WX 748 ; N a192 ; B 35 94 698 597 ; C 219 ; WX 918 ; N a166 ; B 35 166 884 526 ; C 220 ; WX 927 ; N a167 ; B 35 32 892 660 ; C 221 ; WX 928 ; N a168 ; B 35 129 891 562 ; C 222 ; WX 928 ; N a169 ; B 35 128 893 563 ; C 223 ; WX 834 ; N a170 ; B 35 155 799 537 ; C 224 ; WX 873 ; N a171 ; B 35 93 838 599 ; C 225 ; WX 828 ; N a172 ; B 35 104 791 588 ; C 226 ; WX 924 ; N a173 ; B 35 98 889 594 ; C 227 ; WX 924 ; N a162 ; B 35 98 889 594 ; C 228 ; WX 917 ; N a174 ; B 35 0 882 692 ; C 229 ; WX 930 ; N a175 ; B 35 84 896 608 ; C 230 ; WX 931 ; N a176 ; B 35 84 896 608 ; C 231 ; WX 463 ; N a177 ; B 35 -99 429 791 ; C 232 ; WX 883 ; N a178 ; B 35 71 848 623 ; C 233 ; WX 836 ; N a179 ; B 35 44 802 648 ; C 234 ; WX 836 ; N a193 ; B 35 44 802 648 ; C 235 ; WX 867 ; N a180 ; B 35 101 832 591 ; C 236 ; WX 867 ; N a199 ; B 35 101 832 591 ; C 237 ; WX 696 ; N a181 ; B 35 44 661 648 ; C 238 ; WX 696 ; N a200 ; B 35 44 661 648 ; C 239 ; WX 874 ; N a182 ; B 35 77 840 619 ; C 241 ; WX 874 ; N a201 ; B 35 73 840 615 ; C 242 ; WX 760 ; N a183 ; B 35 0 725 692 ; C 243 ; WX 946 ; N a184 ; B 35 160 911 533 ; C 244 ; WX 771 ; N a197 ; B 34 37 736 655 ; C 245 ; WX 865 ; N a185 ; B 35 207 830 481 ; C 246 ; WX 771 ; N a194 ; B 34 37 736 655 ; C 247 ; WX 888 ; N a198 ; B 34 -19 853 712 ; C 248 ; WX 967 ; N a186 ; B 35 124 932 568 ; C 249 ; WX 888 ; N a195 ; B 34 -19 853 712 ; C 250 ; WX 831 ; N a187 ; B 35 113 796 579 ; C 251 ; WX 873 ; N a188 ; B 36 118 838 578 ; C 252 ; WX 927 ; N a189 ; B 35 150 891 542 ; C 253 ; WX 970 ; N a190 ; B 35 76 931 616 ; C 254 ; WX 918 ; N a191 ; B 34 99 884 593 ; EndCharMetrics EndFontMetrics ruby-prawn-1.0.0~rc2.orig/data/fonts/Times-Roman.afm0000644000000000000000000016605412114176157020763 0ustar rootrootStartFontMetrics 4.1 Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. Comment Creation Date: Thu May 1 12:49:17 1997 Comment UniqueID 43068 Comment VMusage 43909 54934 FontName Times-Roman FullName Times Roman FamilyName Times Weight Roman ItalicAngle 0 IsFixedPitch false CharacterSet ExtendedRoman FontBBox -168 -218 1000 898 UnderlinePosition -100 UnderlineThickness 50 Version 002.000 Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries. EncodingScheme AdobeStandardEncoding CapHeight 662 XHeight 450 Ascender 683 Descender -217 StdHW 28 StdVW 84 StartCharMetrics 315 C 32 ; WX 250 ; N space ; B 0 0 0 0 ; C 33 ; WX 333 ; N exclam ; B 130 -9 238 676 ; C 34 ; WX 408 ; N quotedbl ; B 77 431 331 676 ; C 35 ; WX 500 ; N numbersign ; B 5 0 496 662 ; C 36 ; WX 500 ; N dollar ; B 44 -87 457 727 ; C 37 ; WX 833 ; N percent ; B 61 -13 772 676 ; C 38 ; WX 778 ; N ampersand ; B 42 -13 750 676 ; C 39 ; WX 333 ; N quoteright ; B 79 433 218 676 ; C 40 ; WX 333 ; N parenleft ; B 48 -177 304 676 ; C 41 ; WX 333 ; N parenright ; B 29 -177 285 676 ; C 42 ; WX 500 ; N asterisk ; B 69 265 432 676 ; C 43 ; WX 564 ; N plus ; B 30 0 534 506 ; C 44 ; WX 250 ; N comma ; B 56 -141 195 102 ; C 45 ; WX 333 ; N hyphen ; B 39 194 285 257 ; C 46 ; WX 250 ; N period ; B 70 -11 181 100 ; C 47 ; WX 278 ; N slash ; B -9 -14 287 676 ; C 48 ; WX 500 ; N zero ; B 24 -14 476 676 ; C 49 ; WX 500 ; N one ; B 111 0 394 676 ; C 50 ; WX 500 ; N two ; B 30 0 475 676 ; C 51 ; WX 500 ; N three ; B 43 -14 431 676 ; C 52 ; WX 500 ; N four ; B 12 0 472 676 ; C 53 ; WX 500 ; N five ; B 32 -14 438 688 ; C 54 ; WX 500 ; N six ; B 34 -14 468 684 ; C 55 ; WX 500 ; N seven ; B 20 -8 449 662 ; C 56 ; WX 500 ; N eight ; B 56 -14 445 676 ; C 57 ; WX 500 ; N nine ; B 30 -22 459 676 ; C 58 ; WX 278 ; N colon ; B 81 -11 192 459 ; C 59 ; WX 278 ; N semicolon ; B 80 -141 219 459 ; C 60 ; WX 564 ; N less ; B 28 -8 536 514 ; C 61 ; WX 564 ; N equal ; B 30 120 534 386 ; C 62 ; WX 564 ; N greater ; B 28 -8 536 514 ; C 63 ; WX 444 ; N question ; B 68 -8 414 676 ; C 64 ; WX 921 ; N at ; B 116 -14 809 676 ; C 65 ; WX 722 ; N A ; B 15 0 706 674 ; C 66 ; WX 667 ; N B ; B 17 0 593 662 ; C 67 ; WX 667 ; N C ; B 28 -14 633 676 ; C 68 ; WX 722 ; N D ; B 16 0 685 662 ; C 69 ; WX 611 ; N E ; B 12 0 597 662 ; C 70 ; WX 556 ; N F ; B 12 0 546 662 ; C 71 ; WX 722 ; N G ; B 32 -14 709 676 ; C 72 ; WX 722 ; N H ; B 19 0 702 662 ; C 73 ; WX 333 ; N I ; B 18 0 315 662 ; C 74 ; WX 389 ; N J ; B 10 -14 370 662 ; C 75 ; WX 722 ; N K ; B 34 0 723 662 ; C 76 ; WX 611 ; N L ; B 12 0 598 662 ; C 77 ; WX 889 ; N M ; B 12 0 863 662 ; C 78 ; WX 722 ; N N ; B 12 -11 707 662 ; C 79 ; WX 722 ; N O ; B 34 -14 688 676 ; C 80 ; WX 556 ; N P ; B 16 0 542 662 ; C 81 ; WX 722 ; N Q ; B 34 -178 701 676 ; C 82 ; WX 667 ; N R ; B 17 0 659 662 ; C 83 ; WX 556 ; N S ; B 42 -14 491 676 ; C 84 ; WX 611 ; N T ; B 17 0 593 662 ; C 85 ; WX 722 ; N U ; B 14 -14 705 662 ; C 86 ; WX 722 ; N V ; B 16 -11 697 662 ; C 87 ; WX 944 ; N W ; B 5 -11 932 662 ; C 88 ; WX 722 ; N X ; B 10 0 704 662 ; C 89 ; WX 722 ; N Y ; B 22 0 703 662 ; C 90 ; WX 611 ; N Z ; B 9 0 597 662 ; C 91 ; WX 333 ; N bracketleft ; B 88 -156 299 662 ; C 92 ; WX 278 ; N backslash ; B -9 -14 287 676 ; C 93 ; WX 333 ; N bracketright ; B 34 -156 245 662 ; C 94 ; WX 469 ; N asciicircum ; B 24 297 446 662 ; C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; C 96 ; WX 333 ; N quoteleft ; B 115 433 254 676 ; C 97 ; WX 444 ; N a ; B 37 -10 442 460 ; C 98 ; WX 500 ; N b ; B 3 -10 468 683 ; C 99 ; WX 444 ; N c ; B 25 -10 412 460 ; C 100 ; WX 500 ; N d ; B 27 -10 491 683 ; C 101 ; WX 444 ; N e ; B 25 -10 424 460 ; C 102 ; WX 333 ; N f ; B 20 0 383 683 ; L i fi ; L l fl ; C 103 ; WX 500 ; N g ; B 28 -218 470 460 ; C 104 ; WX 500 ; N h ; B 9 0 487 683 ; C 105 ; WX 278 ; N i ; B 16 0 253 683 ; C 106 ; WX 278 ; N j ; B -70 -218 194 683 ; C 107 ; WX 500 ; N k ; B 7 0 505 683 ; C 108 ; WX 278 ; N l ; B 19 0 257 683 ; C 109 ; WX 778 ; N m ; B 16 0 775 460 ; C 110 ; WX 500 ; N n ; B 16 0 485 460 ; C 111 ; WX 500 ; N o ; B 29 -10 470 460 ; C 112 ; WX 500 ; N p ; B 5 -217 470 460 ; C 113 ; WX 500 ; N q ; B 24 -217 488 460 ; C 114 ; WX 333 ; N r ; B 5 0 335 460 ; C 115 ; WX 389 ; N s ; B 51 -10 348 460 ; C 116 ; WX 278 ; N t ; B 13 -10 279 579 ; C 117 ; WX 500 ; N u ; B 9 -10 479 450 ; C 118 ; WX 500 ; N v ; B 19 -14 477 450 ; C 119 ; WX 722 ; N w ; B 21 -14 694 450 ; C 120 ; WX 500 ; N x ; B 17 0 479 450 ; C 121 ; WX 500 ; N y ; B 14 -218 475 450 ; C 122 ; WX 444 ; N z ; B 27 0 418 450 ; C 123 ; WX 480 ; N braceleft ; B 100 -181 350 680 ; C 124 ; WX 200 ; N bar ; B 67 -218 133 782 ; C 125 ; WX 480 ; N braceright ; B 130 -181 380 680 ; C 126 ; WX 541 ; N asciitilde ; B 40 183 502 323 ; C 161 ; WX 333 ; N exclamdown ; B 97 -218 205 467 ; C 162 ; WX 500 ; N cent ; B 53 -138 448 579 ; C 163 ; WX 500 ; N sterling ; B 12 -8 490 676 ; C 164 ; WX 167 ; N fraction ; B -168 -14 331 676 ; C 165 ; WX 500 ; N yen ; B -53 0 512 662 ; C 166 ; WX 500 ; N florin ; B 7 -189 490 676 ; C 167 ; WX 500 ; N section ; B 70 -148 426 676 ; C 168 ; WX 500 ; N currency ; B -22 58 522 602 ; C 169 ; WX 180 ; N quotesingle ; B 48 431 133 676 ; C 170 ; WX 444 ; N quotedblleft ; B 43 433 414 676 ; C 171 ; WX 500 ; N guillemotleft ; B 42 33 456 416 ; C 172 ; WX 333 ; N guilsinglleft ; B 63 33 285 416 ; C 173 ; WX 333 ; N guilsinglright ; B 48 33 270 416 ; C 174 ; WX 556 ; N fi ; B 31 0 521 683 ; C 175 ; WX 556 ; N fl ; B 32 0 521 683 ; C 177 ; WX 500 ; N endash ; B 0 201 500 250 ; C 178 ; WX 500 ; N dagger ; B 59 -149 442 676 ; C 179 ; WX 500 ; N daggerdbl ; B 58 -153 442 676 ; C 180 ; WX 250 ; N periodcentered ; B 70 199 181 310 ; C 182 ; WX 453 ; N paragraph ; B -22 -154 450 662 ; C 183 ; WX 350 ; N bullet ; B 40 196 310 466 ; C 184 ; WX 333 ; N quotesinglbase ; B 79 -141 218 102 ; C 185 ; WX 444 ; N quotedblbase ; B 45 -141 416 102 ; C 186 ; WX 444 ; N quotedblright ; B 30 433 401 676 ; C 187 ; WX 500 ; N guillemotright ; B 44 33 458 416 ; C 188 ; WX 1000 ; N ellipsis ; B 111 -11 888 100 ; C 189 ; WX 1000 ; N perthousand ; B 7 -19 994 706 ; C 191 ; WX 444 ; N questiondown ; B 30 -218 376 466 ; C 193 ; WX 333 ; N grave ; B 19 507 242 678 ; C 194 ; WX 333 ; N acute ; B 93 507 317 678 ; C 195 ; WX 333 ; N circumflex ; B 11 507 322 674 ; C 196 ; WX 333 ; N tilde ; B 1 532 331 638 ; C 197 ; WX 333 ; N macron ; B 11 547 322 601 ; C 198 ; WX 333 ; N breve ; B 26 507 307 664 ; C 199 ; WX 333 ; N dotaccent ; B 118 581 216 681 ; C 200 ; WX 333 ; N dieresis ; B 18 581 315 681 ; C 202 ; WX 333 ; N ring ; B 67 512 266 711 ; C 203 ; WX 333 ; N cedilla ; B 52 -215 261 0 ; C 205 ; WX 333 ; N hungarumlaut ; B -3 507 377 678 ; C 206 ; WX 333 ; N ogonek ; B 62 -165 243 0 ; C 207 ; WX 333 ; N caron ; B 11 507 322 674 ; C 208 ; WX 1000 ; N emdash ; B 0 201 1000 250 ; C 225 ; WX 889 ; N AE ; B 0 0 863 662 ; C 227 ; WX 276 ; N ordfeminine ; B 4 394 270 676 ; C 232 ; WX 611 ; N Lslash ; B 12 0 598 662 ; C 233 ; WX 722 ; N Oslash ; B 34 -80 688 734 ; C 234 ; WX 889 ; N OE ; B 30 -6 885 668 ; C 235 ; WX 310 ; N ordmasculine ; B 6 394 304 676 ; C 241 ; WX 667 ; N ae ; B 38 -10 632 460 ; C 245 ; WX 278 ; N dotlessi ; B 16 0 253 460 ; C 248 ; WX 278 ; N lslash ; B 19 0 259 683 ; C 249 ; WX 500 ; N oslash ; B 29 -112 470 551 ; C 250 ; WX 722 ; N oe ; B 30 -10 690 460 ; C 251 ; WX 500 ; N germandbls ; B 12 -9 468 683 ; C -1 ; WX 333 ; N Idieresis ; B 18 0 315 835 ; C -1 ; WX 444 ; N eacute ; B 25 -10 424 678 ; C -1 ; WX 444 ; N abreve ; B 37 -10 442 664 ; C -1 ; WX 500 ; N uhungarumlaut ; B 9 -10 501 678 ; C -1 ; WX 444 ; N ecaron ; B 25 -10 424 674 ; C -1 ; WX 722 ; N Ydieresis ; B 22 0 703 835 ; C -1 ; WX 564 ; N divide ; B 30 -10 534 516 ; C -1 ; WX 722 ; N Yacute ; B 22 0 703 890 ; C -1 ; WX 722 ; N Acircumflex ; B 15 0 706 886 ; C -1 ; WX 444 ; N aacute ; B 37 -10 442 678 ; C -1 ; WX 722 ; N Ucircumflex ; B 14 -14 705 886 ; C -1 ; WX 500 ; N yacute ; B 14 -218 475 678 ; C -1 ; WX 389 ; N scommaaccent ; B 51 -218 348 460 ; C -1 ; WX 444 ; N ecircumflex ; B 25 -10 424 674 ; C -1 ; WX 722 ; N Uring ; B 14 -14 705 898 ; C -1 ; WX 722 ; N Udieresis ; B 14 -14 705 835 ; C -1 ; WX 444 ; N aogonek ; B 37 -165 469 460 ; C -1 ; WX 722 ; N Uacute ; B 14 -14 705 890 ; C -1 ; WX 500 ; N uogonek ; B 9 -155 487 450 ; C -1 ; WX 611 ; N Edieresis ; B 12 0 597 835 ; C -1 ; WX 722 ; N Dcroat ; B 16 0 685 662 ; C -1 ; WX 250 ; N commaaccent ; B 59 -218 184 -50 ; C -1 ; WX 760 ; N copyright ; B 38 -14 722 676 ; C -1 ; WX 611 ; N Emacron ; B 12 0 597 813 ; C -1 ; WX 444 ; N ccaron ; B 25 -10 412 674 ; C -1 ; WX 444 ; N aring ; B 37 -10 442 711 ; C -1 ; WX 722 ; N Ncommaaccent ; B 12 -198 707 662 ; C -1 ; WX 278 ; N lacute ; B 19 0 290 890 ; C -1 ; WX 444 ; N agrave ; B 37 -10 442 678 ; C -1 ; WX 611 ; N Tcommaaccent ; B 17 -218 593 662 ; C -1 ; WX 667 ; N Cacute ; B 28 -14 633 890 ; C -1 ; WX 444 ; N atilde ; B 37 -10 442 638 ; C -1 ; WX 611 ; N Edotaccent ; B 12 0 597 835 ; C -1 ; WX 389 ; N scaron ; B 39 -10 350 674 ; C -1 ; WX 389 ; N scedilla ; B 51 -215 348 460 ; C -1 ; WX 278 ; N iacute ; B 16 0 290 678 ; C -1 ; WX 471 ; N lozenge ; B 13 0 459 724 ; C -1 ; WX 667 ; N Rcaron ; B 17 0 659 886 ; C -1 ; WX 722 ; N Gcommaaccent ; B 32 -218 709 676 ; C -1 ; WX 500 ; N ucircumflex ; B 9 -10 479 674 ; C -1 ; WX 444 ; N acircumflex ; B 37 -10 442 674 ; C -1 ; WX 722 ; N Amacron ; B 15 0 706 813 ; C -1 ; WX 333 ; N rcaron ; B 5 0 335 674 ; C -1 ; WX 444 ; N ccedilla ; B 25 -215 412 460 ; C -1 ; WX 611 ; N Zdotaccent ; B 9 0 597 835 ; C -1 ; WX 556 ; N Thorn ; B 16 0 542 662 ; C -1 ; WX 722 ; N Omacron ; B 34 -14 688 813 ; C -1 ; WX 667 ; N Racute ; B 17 0 659 890 ; C -1 ; WX 556 ; N Sacute ; B 42 -14 491 890 ; C -1 ; WX 588 ; N dcaron ; B 27 -10 589 695 ; C -1 ; WX 722 ; N Umacron ; B 14 -14 705 813 ; C -1 ; WX 500 ; N uring ; B 9 -10 479 711 ; C -1 ; WX 300 ; N threesuperior ; B 15 262 291 676 ; C -1 ; WX 722 ; N Ograve ; B 34 -14 688 890 ; C -1 ; WX 722 ; N Agrave ; B 15 0 706 890 ; C -1 ; WX 722 ; N Abreve ; B 15 0 706 876 ; C -1 ; WX 564 ; N multiply ; B 38 8 527 497 ; C -1 ; WX 500 ; N uacute ; B 9 -10 479 678 ; C -1 ; WX 611 ; N Tcaron ; B 17 0 593 886 ; C -1 ; WX 476 ; N partialdiff ; B 17 -38 459 710 ; C -1 ; WX 500 ; N ydieresis ; B 14 -218 475 623 ; C -1 ; WX 722 ; N Nacute ; B 12 -11 707 890 ; C -1 ; WX 278 ; N icircumflex ; B -16 0 295 674 ; C -1 ; WX 611 ; N Ecircumflex ; B 12 0 597 886 ; C -1 ; WX 444 ; N adieresis ; B 37 -10 442 623 ; C -1 ; WX 444 ; N edieresis ; B 25 -10 424 623 ; C -1 ; WX 444 ; N cacute ; B 25 -10 413 678 ; C -1 ; WX 500 ; N nacute ; B 16 0 485 678 ; C -1 ; WX 500 ; N umacron ; B 9 -10 479 601 ; C -1 ; WX 722 ; N Ncaron ; B 12 -11 707 886 ; C -1 ; WX 333 ; N Iacute ; B 18 0 317 890 ; C -1 ; WX 564 ; N plusminus ; B 30 0 534 506 ; C -1 ; WX 200 ; N brokenbar ; B 67 -143 133 707 ; C -1 ; WX 760 ; N registered ; B 38 -14 722 676 ; C -1 ; WX 722 ; N Gbreve ; B 32 -14 709 876 ; C -1 ; WX 333 ; N Idotaccent ; B 18 0 315 835 ; C -1 ; WX 600 ; N summation ; B 15 -10 585 706 ; C -1 ; WX 611 ; N Egrave ; B 12 0 597 890 ; C -1 ; WX 333 ; N racute ; B 5 0 335 678 ; C -1 ; WX 500 ; N omacron ; B 29 -10 470 601 ; C -1 ; WX 611 ; N Zacute ; B 9 0 597 890 ; C -1 ; WX 611 ; N Zcaron ; B 9 0 597 886 ; C -1 ; WX 549 ; N greaterequal ; B 26 0 523 666 ; C -1 ; WX 722 ; N Eth ; B 16 0 685 662 ; C -1 ; WX 667 ; N Ccedilla ; B 28 -215 633 676 ; C -1 ; WX 278 ; N lcommaaccent ; B 19 -218 257 683 ; C -1 ; WX 326 ; N tcaron ; B 13 -10 318 722 ; C -1 ; WX 444 ; N eogonek ; B 25 -165 424 460 ; C -1 ; WX 722 ; N Uogonek ; B 14 -165 705 662 ; C -1 ; WX 722 ; N Aacute ; B 15 0 706 890 ; C -1 ; WX 722 ; N Adieresis ; B 15 0 706 835 ; C -1 ; WX 444 ; N egrave ; B 25 -10 424 678 ; C -1 ; WX 444 ; N zacute ; B 27 0 418 678 ; C -1 ; WX 278 ; N iogonek ; B 16 -165 265 683 ; C -1 ; WX 722 ; N Oacute ; B 34 -14 688 890 ; C -1 ; WX 500 ; N oacute ; B 29 -10 470 678 ; C -1 ; WX 444 ; N amacron ; B 37 -10 442 601 ; C -1 ; WX 389 ; N sacute ; B 51 -10 348 678 ; C -1 ; WX 278 ; N idieresis ; B -9 0 288 623 ; C -1 ; WX 722 ; N Ocircumflex ; B 34 -14 688 886 ; C -1 ; WX 722 ; N Ugrave ; B 14 -14 705 890 ; C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; C -1 ; WX 500 ; N thorn ; B 5 -217 470 683 ; C -1 ; WX 300 ; N twosuperior ; B 1 270 296 676 ; C -1 ; WX 722 ; N Odieresis ; B 34 -14 688 835 ; C -1 ; WX 500 ; N mu ; B 36 -218 512 450 ; C -1 ; WX 278 ; N igrave ; B -8 0 253 678 ; C -1 ; WX 500 ; N ohungarumlaut ; B 29 -10 491 678 ; C -1 ; WX 611 ; N Eogonek ; B 12 -165 597 662 ; C -1 ; WX 500 ; N dcroat ; B 27 -10 500 683 ; C -1 ; WX 750 ; N threequarters ; B 15 -14 718 676 ; C -1 ; WX 556 ; N Scedilla ; B 42 -215 491 676 ; C -1 ; WX 344 ; N lcaron ; B 19 0 347 695 ; C -1 ; WX 722 ; N Kcommaaccent ; B 34 -198 723 662 ; C -1 ; WX 611 ; N Lacute ; B 12 0 598 890 ; C -1 ; WX 980 ; N trademark ; B 30 256 957 662 ; C -1 ; WX 444 ; N edotaccent ; B 25 -10 424 623 ; C -1 ; WX 333 ; N Igrave ; B 18 0 315 890 ; C -1 ; WX 333 ; N Imacron ; B 11 0 322 813 ; C -1 ; WX 611 ; N Lcaron ; B 12 0 598 676 ; C -1 ; WX 750 ; N onehalf ; B 31 -14 746 676 ; C -1 ; WX 549 ; N lessequal ; B 26 0 523 666 ; C -1 ; WX 500 ; N ocircumflex ; B 29 -10 470 674 ; C -1 ; WX 500 ; N ntilde ; B 16 0 485 638 ; C -1 ; WX 722 ; N Uhungarumlaut ; B 14 -14 705 890 ; C -1 ; WX 611 ; N Eacute ; B 12 0 597 890 ; C -1 ; WX 444 ; N emacron ; B 25 -10 424 601 ; C -1 ; WX 500 ; N gbreve ; B 28 -218 470 664 ; C -1 ; WX 750 ; N onequarter ; B 37 -14 718 676 ; C -1 ; WX 556 ; N Scaron ; B 42 -14 491 886 ; C -1 ; WX 556 ; N Scommaaccent ; B 42 -218 491 676 ; C -1 ; WX 722 ; N Ohungarumlaut ; B 34 -14 688 890 ; C -1 ; WX 400 ; N degree ; B 57 390 343 676 ; C -1 ; WX 500 ; N ograve ; B 29 -10 470 678 ; C -1 ; WX 667 ; N Ccaron ; B 28 -14 633 886 ; C -1 ; WX 500 ; N ugrave ; B 9 -10 479 678 ; C -1 ; WX 453 ; N radical ; B 2 -60 452 768 ; C -1 ; WX 722 ; N Dcaron ; B 16 0 685 886 ; C -1 ; WX 333 ; N rcommaaccent ; B 5 -218 335 460 ; C -1 ; WX 722 ; N Ntilde ; B 12 -11 707 850 ; C -1 ; WX 500 ; N otilde ; B 29 -10 470 638 ; C -1 ; WX 667 ; N Rcommaaccent ; B 17 -198 659 662 ; C -1 ; WX 611 ; N Lcommaaccent ; B 12 -218 598 662 ; C -1 ; WX 722 ; N Atilde ; B 15 0 706 850 ; C -1 ; WX 722 ; N Aogonek ; B 15 -165 738 674 ; C -1 ; WX 722 ; N Aring ; B 15 0 706 898 ; C -1 ; WX 722 ; N Otilde ; B 34 -14 688 850 ; C -1 ; WX 444 ; N zdotaccent ; B 27 0 418 623 ; C -1 ; WX 611 ; N Ecaron ; B 12 0 597 886 ; C -1 ; WX 333 ; N Iogonek ; B 18 -165 315 662 ; C -1 ; WX 500 ; N kcommaaccent ; B 7 -218 505 683 ; C -1 ; WX 564 ; N minus ; B 30 220 534 286 ; C -1 ; WX 333 ; N Icircumflex ; B 11 0 322 886 ; C -1 ; WX 500 ; N ncaron ; B 16 0 485 674 ; C -1 ; WX 278 ; N tcommaaccent ; B 13 -218 279 579 ; C -1 ; WX 564 ; N logicalnot ; B 30 108 534 386 ; C -1 ; WX 500 ; N odieresis ; B 29 -10 470 623 ; C -1 ; WX 500 ; N udieresis ; B 9 -10 479 623 ; C -1 ; WX 549 ; N notequal ; B 12 -31 537 547 ; C -1 ; WX 500 ; N gcommaaccent ; B 28 -218 470 749 ; C -1 ; WX 500 ; N eth ; B 29 -10 471 686 ; C -1 ; WX 444 ; N zcaron ; B 27 0 418 674 ; C -1 ; WX 500 ; N ncommaaccent ; B 16 -218 485 460 ; C -1 ; WX 300 ; N onesuperior ; B 57 270 248 676 ; C -1 ; WX 278 ; N imacron ; B 6 0 271 601 ; C -1 ; WX 500 ; N Euro ; B 0 0 0 0 ; EndCharMetrics StartKernData StartKernPairs 2073 KPX A C -40 KPX A Cacute -40 KPX A Ccaron -40 KPX A Ccedilla -40 KPX A G -40 KPX A Gbreve -40 KPX A Gcommaaccent -40 KPX A O -55 KPX A Oacute -55 KPX A Ocircumflex -55 KPX A Odieresis -55 KPX A Ograve -55 KPX A Ohungarumlaut -55 KPX A Omacron -55 KPX A Oslash -55 KPX A Otilde -55 KPX A Q -55 KPX A T -111 KPX A Tcaron -111 KPX A Tcommaaccent -111 KPX A U -55 KPX A Uacute -55 KPX A Ucircumflex -55 KPX A Udieresis -55 KPX A Ugrave -55 KPX A Uhungarumlaut -55 KPX A Umacron -55 KPX A Uogonek -55 KPX A Uring -55 KPX A V -135 KPX A W -90 KPX A Y -105 KPX A Yacute -105 KPX A Ydieresis -105 KPX A quoteright -111 KPX A v -74 KPX A w -92 KPX A y -92 KPX A yacute -92 KPX A ydieresis -92 KPX Aacute C -40 KPX Aacute Cacute -40 KPX Aacute Ccaron -40 KPX Aacute Ccedilla -40 KPX Aacute G -40 KPX Aacute Gbreve -40 KPX Aacute Gcommaaccent -40 KPX Aacute O -55 KPX Aacute Oacute -55 KPX Aacute Ocircumflex -55 KPX Aacute Odieresis -55 KPX Aacute Ograve -55 KPX Aacute Ohungarumlaut -55 KPX Aacute Omacron -55 KPX Aacute Oslash -55 KPX Aacute Otilde -55 KPX Aacute Q -55 KPX Aacute T -111 KPX Aacute Tcaron -111 KPX Aacute Tcommaaccent -111 KPX Aacute U -55 KPX Aacute Uacute -55 KPX Aacute Ucircumflex -55 KPX Aacute Udieresis -55 KPX Aacute Ugrave -55 KPX Aacute Uhungarumlaut -55 KPX Aacute Umacron -55 KPX Aacute Uogonek -55 KPX Aacute Uring -55 KPX Aacute V -135 KPX Aacute W -90 KPX Aacute Y -105 KPX Aacute Yacute -105 KPX Aacute Ydieresis -105 KPX Aacute quoteright -111 KPX Aacute v -74 KPX Aacute w -92 KPX Aacute y -92 KPX Aacute yacute -92 KPX Aacute ydieresis -92 KPX Abreve C -40 KPX Abreve Cacute -40 KPX Abreve Ccaron -40 KPX Abreve Ccedilla -40 KPX Abreve G -40 KPX Abreve Gbreve -40 KPX Abreve Gcommaaccent -40 KPX Abreve O -55 KPX Abreve Oacute -55 KPX Abreve Ocircumflex -55 KPX Abreve Odieresis -55 KPX Abreve Ograve -55 KPX Abreve Ohungarumlaut -55 KPX Abreve Omacron -55 KPX Abreve Oslash -55 KPX Abreve Otilde -55 KPX Abreve Q -55 KPX Abreve T -111 KPX Abreve Tcaron -111 KPX Abreve Tcommaaccent -111 KPX Abreve U -55 KPX Abreve Uacute -55 KPX Abreve Ucircumflex -55 KPX Abreve Udieresis -55 KPX Abreve Ugrave -55 KPX Abreve Uhungarumlaut -55 KPX Abreve Umacron -55 KPX Abreve Uogonek -55 KPX Abreve Uring -55 KPX Abreve V -135 KPX Abreve W -90 KPX Abreve Y -105 KPX Abreve Yacute -105 KPX Abreve Ydieresis -105 KPX Abreve quoteright -111 KPX Abreve v -74 KPX Abreve w -92 KPX Abreve y -92 KPX Abreve yacute -92 KPX Abreve ydieresis -92 KPX Acircumflex C -40 KPX Acircumflex Cacute -40 KPX Acircumflex Ccaron -40 KPX Acircumflex Ccedilla -40 KPX Acircumflex G -40 KPX Acircumflex Gbreve -40 KPX Acircumflex Gcommaaccent -40 KPX Acircumflex O -55 KPX Acircumflex Oacute -55 KPX Acircumflex Ocircumflex -55 KPX Acircumflex Odieresis -55 KPX Acircumflex Ograve -55 KPX Acircumflex Ohungarumlaut -55 KPX Acircumflex Omacron -55 KPX Acircumflex Oslash -55 KPX Acircumflex Otilde -55 KPX Acircumflex Q -55 KPX Acircumflex T -111 KPX Acircumflex Tcaron -111 KPX Acircumflex Tcommaaccent -111 KPX Acircumflex U -55 KPX Acircumflex Uacute -55 KPX Acircumflex Ucircumflex -55 KPX Acircumflex Udieresis -55 KPX Acircumflex Ugrave -55 KPX Acircumflex Uhungarumlaut -55 KPX Acircumflex Umacron -55 KPX Acircumflex Uogonek -55 KPX Acircumflex Uring -55 KPX Acircumflex V -135 KPX Acircumflex W -90 KPX Acircumflex Y -105 KPX Acircumflex Yacute -105 KPX Acircumflex Ydieresis -105 KPX Acircumflex quoteright -111 KPX Acircumflex v -74 KPX Acircumflex w -92 KPX Acircumflex y -92 KPX Acircumflex yacute -92 KPX Acircumflex ydieresis -92 KPX Adieresis C -40 KPX Adieresis Cacute -40 KPX Adieresis Ccaron -40 KPX Adieresis Ccedilla -40 KPX Adieresis G -40 KPX Adieresis Gbreve -40 KPX Adieresis Gcommaaccent -40 KPX Adieresis O -55 KPX Adieresis Oacute -55 KPX Adieresis Ocircumflex -55 KPX Adieresis Odieresis -55 KPX Adieresis Ograve -55 KPX Adieresis Ohungarumlaut -55 KPX Adieresis Omacron -55 KPX Adieresis Oslash -55 KPX Adieresis Otilde -55 KPX Adieresis Q -55 KPX Adieresis T -111 KPX Adieresis Tcaron -111 KPX Adieresis Tcommaaccent -111 KPX Adieresis U -55 KPX Adieresis Uacute -55 KPX Adieresis Ucircumflex -55 KPX Adieresis Udieresis -55 KPX Adieresis Ugrave -55 KPX Adieresis Uhungarumlaut -55 KPX Adieresis Umacron -55 KPX Adieresis Uogonek -55 KPX Adieresis Uring -55 KPX Adieresis V -135 KPX Adieresis W -90 KPX Adieresis Y -105 KPX Adieresis Yacute -105 KPX Adieresis Ydieresis -105 KPX Adieresis quoteright -111 KPX Adieresis v -74 KPX Adieresis w -92 KPX Adieresis y -92 KPX Adieresis yacute -92 KPX Adieresis ydieresis -92 KPX Agrave C -40 KPX Agrave Cacute -40 KPX Agrave Ccaron -40 KPX Agrave Ccedilla -40 KPX Agrave G -40 KPX Agrave Gbreve -40 KPX Agrave Gcommaaccent -40 KPX Agrave O -55 KPX Agrave Oacute -55 KPX Agrave Ocircumflex -55 KPX Agrave Odieresis -55 KPX Agrave Ograve -55 KPX Agrave Ohungarumlaut -55 KPX Agrave Omacron -55 KPX Agrave Oslash -55 KPX Agrave Otilde -55 KPX Agrave Q -55 KPX Agrave T -111 KPX Agrave Tcaron -111 KPX Agrave Tcommaaccent -111 KPX Agrave U -55 KPX Agrave Uacute -55 KPX Agrave Ucircumflex -55 KPX Agrave Udieresis -55 KPX Agrave Ugrave -55 KPX Agrave Uhungarumlaut -55 KPX Agrave Umacron -55 KPX Agrave Uogonek -55 KPX Agrave Uring -55 KPX Agrave V -135 KPX Agrave W -90 KPX Agrave Y -105 KPX Agrave Yacute -105 KPX Agrave Ydieresis -105 KPX Agrave quoteright -111 KPX Agrave v -74 KPX Agrave w -92 KPX Agrave y -92 KPX Agrave yacute -92 KPX Agrave ydieresis -92 KPX Amacron C -40 KPX Amacron Cacute -40 KPX Amacron Ccaron -40 KPX Amacron Ccedilla -40 KPX Amacron G -40 KPX Amacron Gbreve -40 KPX Amacron Gcommaaccent -40 KPX Amacron O -55 KPX Amacron Oacute -55 KPX Amacron Ocircumflex -55 KPX Amacron Odieresis -55 KPX Amacron Ograve -55 KPX Amacron Ohungarumlaut -55 KPX Amacron Omacron -55 KPX Amacron Oslash -55 KPX Amacron Otilde -55 KPX Amacron Q -55 KPX Amacron T -111 KPX Amacron Tcaron -111 KPX Amacron Tcommaaccent -111 KPX Amacron U -55 KPX Amacron Uacute -55 KPX Amacron Ucircumflex -55 KPX Amacron Udieresis -55 KPX Amacron Ugrave -55 KPX Amacron Uhungarumlaut -55 KPX Amacron Umacron -55 KPX Amacron Uogonek -55 KPX Amacron Uring -55 KPX Amacron V -135 KPX Amacron W -90 KPX Amacron Y -105 KPX Amacron Yacute -105 KPX Amacron Ydieresis -105 KPX Amacron quoteright -111 KPX Amacron v -74 KPX Amacron w -92 KPX Amacron y -92 KPX Amacron yacute -92 KPX Amacron ydieresis -92 KPX Aogonek C -40 KPX Aogonek Cacute -40 KPX Aogonek Ccaron -40 KPX Aogonek Ccedilla -40 KPX Aogonek G -40 KPX Aogonek Gbreve -40 KPX Aogonek Gcommaaccent -40 KPX Aogonek O -55 KPX Aogonek Oacute -55 KPX Aogonek Ocircumflex -55 KPX Aogonek Odieresis -55 KPX Aogonek Ograve -55 KPX Aogonek Ohungarumlaut -55 KPX Aogonek Omacron -55 KPX Aogonek Oslash -55 KPX Aogonek Otilde -55 KPX Aogonek Q -55 KPX Aogonek T -111 KPX Aogonek Tcaron -111 KPX Aogonek Tcommaaccent -111 KPX Aogonek U -55 KPX Aogonek Uacute -55 KPX Aogonek Ucircumflex -55 KPX Aogonek Udieresis -55 KPX Aogonek Ugrave -55 KPX Aogonek Uhungarumlaut -55 KPX Aogonek Umacron -55 KPX Aogonek Uogonek -55 KPX Aogonek Uring -55 KPX Aogonek V -135 KPX Aogonek W -90 KPX Aogonek Y -105 KPX Aogonek Yacute -105 KPX Aogonek Ydieresis -105 KPX Aogonek quoteright -111 KPX Aogonek v -74 KPX Aogonek w -52 KPX Aogonek y -52 KPX Aogonek yacute -52 KPX Aogonek ydieresis -52 KPX Aring C -40 KPX Aring Cacute -40 KPX Aring Ccaron -40 KPX Aring Ccedilla -40 KPX Aring G -40 KPX Aring Gbreve -40 KPX Aring Gcommaaccent -40 KPX Aring O -55 KPX Aring Oacute -55 KPX Aring Ocircumflex -55 KPX Aring Odieresis -55 KPX Aring Ograve -55 KPX Aring Ohungarumlaut -55 KPX Aring Omacron -55 KPX Aring Oslash -55 KPX Aring Otilde -55 KPX Aring Q -55 KPX Aring T -111 KPX Aring Tcaron -111 KPX Aring Tcommaaccent -111 KPX Aring U -55 KPX Aring Uacute -55 KPX Aring Ucircumflex -55 KPX Aring Udieresis -55 KPX Aring Ugrave -55 KPX Aring Uhungarumlaut -55 KPX Aring Umacron -55 KPX Aring Uogonek -55 KPX Aring Uring -55 KPX Aring V -135 KPX Aring W -90 KPX Aring Y -105 KPX Aring Yacute -105 KPX Aring Ydieresis -105 KPX Aring quoteright -111 KPX Aring v -74 KPX Aring w -92 KPX Aring y -92 KPX Aring yacute -92 KPX Aring ydieresis -92 KPX Atilde C -40 KPX Atilde Cacute -40 KPX Atilde Ccaron -40 KPX Atilde Ccedilla -40 KPX Atilde G -40 KPX Atilde Gbreve -40 KPX Atilde Gcommaaccent -40 KPX Atilde O -55 KPX Atilde Oacute -55 KPX Atilde Ocircumflex -55 KPX Atilde Odieresis -55 KPX Atilde Ograve -55 KPX Atilde Ohungarumlaut -55 KPX Atilde Omacron -55 KPX Atilde Oslash -55 KPX Atilde Otilde -55 KPX Atilde Q -55 KPX Atilde T -111 KPX Atilde Tcaron -111 KPX Atilde Tcommaaccent -111 KPX Atilde U -55 KPX Atilde Uacute -55 KPX Atilde Ucircumflex -55 KPX Atilde Udieresis -55 KPX Atilde Ugrave -55 KPX Atilde Uhungarumlaut -55 KPX Atilde Umacron -55 KPX Atilde Uogonek -55 KPX Atilde Uring -55 KPX Atilde V -135 KPX Atilde W -90 KPX Atilde Y -105 KPX Atilde Yacute -105 KPX Atilde Ydieresis -105 KPX Atilde quoteright -111 KPX Atilde v -74 KPX Atilde w -92 KPX Atilde y -92 KPX Atilde yacute -92 KPX Atilde ydieresis -92 KPX B A -35 KPX B Aacute -35 KPX B Abreve -35 KPX B Acircumflex -35 KPX B Adieresis -35 KPX B Agrave -35 KPX B Amacron -35 KPX B Aogonek -35 KPX B Aring -35 KPX B Atilde -35 KPX B U -10 KPX B Uacute -10 KPX B Ucircumflex -10 KPX B Udieresis -10 KPX B Ugrave -10 KPX B Uhungarumlaut -10 KPX B Umacron -10 KPX B Uogonek -10 KPX B Uring -10 KPX D A -40 KPX D Aacute -40 KPX D Abreve -40 KPX D Acircumflex -40 KPX D Adieresis -40 KPX D Agrave -40 KPX D Amacron -40 KPX D Aogonek -40 KPX D Aring -40 KPX D Atilde -40 KPX D V -40 KPX D W -30 KPX D Y -55 KPX D Yacute -55 KPX D Ydieresis -55 KPX Dcaron A -40 KPX Dcaron Aacute -40 KPX Dcaron Abreve -40 KPX Dcaron Acircumflex -40 KPX Dcaron Adieresis -40 KPX Dcaron Agrave -40 KPX Dcaron Amacron -40 KPX Dcaron Aogonek -40 KPX Dcaron Aring -40 KPX Dcaron Atilde -40 KPX Dcaron V -40 KPX Dcaron W -30 KPX Dcaron Y -55 KPX Dcaron Yacute -55 KPX Dcaron Ydieresis -55 KPX Dcroat A -40 KPX Dcroat Aacute -40 KPX Dcroat Abreve -40 KPX Dcroat Acircumflex -40 KPX Dcroat Adieresis -40 KPX Dcroat Agrave -40 KPX Dcroat Amacron -40 KPX Dcroat Aogonek -40 KPX Dcroat Aring -40 KPX Dcroat Atilde -40 KPX Dcroat V -40 KPX Dcroat W -30 KPX Dcroat Y -55 KPX Dcroat Yacute -55 KPX Dcroat Ydieresis -55 KPX F A -74 KPX F Aacute -74 KPX F Abreve -74 KPX F Acircumflex -74 KPX F Adieresis -74 KPX F Agrave -74 KPX F Amacron -74 KPX F Aogonek -74 KPX F Aring -74 KPX F Atilde -74 KPX F a -15 KPX F aacute -15 KPX F abreve -15 KPX F acircumflex -15 KPX F adieresis -15 KPX F agrave -15 KPX F amacron -15 KPX F aogonek -15 KPX F aring -15 KPX F atilde -15 KPX F comma -80 KPX F o -15 KPX F oacute -15 KPX F ocircumflex -15 KPX F odieresis -15 KPX F ograve -15 KPX F ohungarumlaut -15 KPX F omacron -15 KPX F oslash -15 KPX F otilde -15 KPX F period -80 KPX J A -60 KPX J Aacute -60 KPX J Abreve -60 KPX J Acircumflex -60 KPX J Adieresis -60 KPX J Agrave -60 KPX J Amacron -60 KPX J Aogonek -60 KPX J Aring -60 KPX J Atilde -60 KPX K O -30 KPX K Oacute -30 KPX K Ocircumflex -30 KPX K Odieresis -30 KPX K Ograve -30 KPX K Ohungarumlaut -30 KPX K Omacron -30 KPX K Oslash -30 KPX K Otilde -30 KPX K e -25 KPX K eacute -25 KPX K ecaron -25 KPX K ecircumflex -25 KPX K edieresis -25 KPX K edotaccent -25 KPX K egrave -25 KPX K emacron -25 KPX K eogonek -25 KPX K o -35 KPX K oacute -35 KPX K ocircumflex -35 KPX K odieresis -35 KPX K ograve -35 KPX K ohungarumlaut -35 KPX K omacron -35 KPX K oslash -35 KPX K otilde -35 KPX K u -15 KPX K uacute -15 KPX K ucircumflex -15 KPX K udieresis -15 KPX K ugrave -15 KPX K uhungarumlaut -15 KPX K umacron -15 KPX K uogonek -15 KPX K uring -15 KPX K y -25 KPX K yacute -25 KPX K ydieresis -25 KPX Kcommaaccent O -30 KPX Kcommaaccent Oacute -30 KPX Kcommaaccent Ocircumflex -30 KPX Kcommaaccent Odieresis -30 KPX Kcommaaccent Ograve -30 KPX Kcommaaccent Ohungarumlaut -30 KPX Kcommaaccent Omacron -30 KPX Kcommaaccent Oslash -30 KPX Kcommaaccent Otilde -30 KPX Kcommaaccent e -25 KPX Kcommaaccent eacute -25 KPX Kcommaaccent ecaron -25 KPX Kcommaaccent ecircumflex -25 KPX Kcommaaccent edieresis -25 KPX Kcommaaccent edotaccent -25 KPX Kcommaaccent egrave -25 KPX Kcommaaccent emacron -25 KPX Kcommaaccent eogonek -25 KPX Kcommaaccent o -35 KPX Kcommaaccent oacute -35 KPX Kcommaaccent ocircumflex -35 KPX Kcommaaccent odieresis -35 KPX Kcommaaccent ograve -35 KPX Kcommaaccent ohungarumlaut -35 KPX Kcommaaccent omacron -35 KPX Kcommaaccent oslash -35 KPX Kcommaaccent otilde -35 KPX Kcommaaccent u -15 KPX Kcommaaccent uacute -15 KPX Kcommaaccent ucircumflex -15 KPX Kcommaaccent udieresis -15 KPX Kcommaaccent ugrave -15 KPX Kcommaaccent uhungarumlaut -15 KPX Kcommaaccent umacron -15 KPX Kcommaaccent uogonek -15 KPX Kcommaaccent uring -15 KPX Kcommaaccent y -25 KPX Kcommaaccent yacute -25 KPX Kcommaaccent ydieresis -25 KPX L T -92 KPX L Tcaron -92 KPX L Tcommaaccent -92 KPX L V -100 KPX L W -74 KPX L Y -100 KPX L Yacute -100 KPX L Ydieresis -100 KPX L quoteright -92 KPX L y -55 KPX L yacute -55 KPX L ydieresis -55 KPX Lacute T -92 KPX Lacute Tcaron -92 KPX Lacute Tcommaaccent -92 KPX Lacute V -100 KPX Lacute W -74 KPX Lacute Y -100 KPX Lacute Yacute -100 KPX Lacute Ydieresis -100 KPX Lacute quoteright -92 KPX Lacute y -55 KPX Lacute yacute -55 KPX Lacute ydieresis -55 KPX Lcaron quoteright -92 KPX Lcaron y -55 KPX Lcaron yacute -55 KPX Lcaron ydieresis -55 KPX Lcommaaccent T -92 KPX Lcommaaccent Tcaron -92 KPX Lcommaaccent Tcommaaccent -92 KPX Lcommaaccent V -100 KPX Lcommaaccent W -74 KPX Lcommaaccent Y -100 KPX Lcommaaccent Yacute -100 KPX Lcommaaccent Ydieresis -100 KPX Lcommaaccent quoteright -92 KPX Lcommaaccent y -55 KPX Lcommaaccent yacute -55 KPX Lcommaaccent ydieresis -55 KPX Lslash T -92 KPX Lslash Tcaron -92 KPX Lslash Tcommaaccent -92 KPX Lslash V -100 KPX Lslash W -74 KPX Lslash Y -100 KPX Lslash Yacute -100 KPX Lslash Ydieresis -100 KPX Lslash quoteright -92 KPX Lslash y -55 KPX Lslash yacute -55 KPX Lslash ydieresis -55 KPX N A -35 KPX N Aacute -35 KPX N Abreve -35 KPX N Acircumflex -35 KPX N Adieresis -35 KPX N Agrave -35 KPX N Amacron -35 KPX N Aogonek -35 KPX N Aring -35 KPX N Atilde -35 KPX Nacute A -35 KPX Nacute Aacute -35 KPX Nacute Abreve -35 KPX Nacute Acircumflex -35 KPX Nacute Adieresis -35 KPX Nacute Agrave -35 KPX Nacute Amacron -35 KPX Nacute Aogonek -35 KPX Nacute Aring -35 KPX Nacute Atilde -35 KPX Ncaron A -35 KPX Ncaron Aacute -35 KPX Ncaron Abreve -35 KPX Ncaron Acircumflex -35 KPX Ncaron Adieresis -35 KPX Ncaron Agrave -35 KPX Ncaron Amacron -35 KPX Ncaron Aogonek -35 KPX Ncaron Aring -35 KPX Ncaron Atilde -35 KPX Ncommaaccent A -35 KPX Ncommaaccent Aacute -35 KPX Ncommaaccent Abreve -35 KPX Ncommaaccent Acircumflex -35 KPX Ncommaaccent Adieresis -35 KPX Ncommaaccent Agrave -35 KPX Ncommaaccent Amacron -35 KPX Ncommaaccent Aogonek -35 KPX Ncommaaccent Aring -35 KPX Ncommaaccent Atilde -35 KPX Ntilde A -35 KPX Ntilde Aacute -35 KPX Ntilde Abreve -35 KPX Ntilde Acircumflex -35 KPX Ntilde Adieresis -35 KPX Ntilde Agrave -35 KPX Ntilde Amacron -35 KPX Ntilde Aogonek -35 KPX Ntilde Aring -35 KPX Ntilde Atilde -35 KPX O A -35 KPX O Aacute -35 KPX O Abreve -35 KPX O Acircumflex -35 KPX O Adieresis -35 KPX O Agrave -35 KPX O Amacron -35 KPX O Aogonek -35 KPX O Aring -35 KPX O Atilde -35 KPX O T -40 KPX O Tcaron -40 KPX O Tcommaaccent -40 KPX O V -50 KPX O W -35 KPX O X -40 KPX O Y -50 KPX O Yacute -50 KPX O Ydieresis -50 KPX Oacute A -35 KPX Oacute Aacute -35 KPX Oacute Abreve -35 KPX Oacute Acircumflex -35 KPX Oacute Adieresis -35 KPX Oacute Agrave -35 KPX Oacute Amacron -35 KPX Oacute Aogonek -35 KPX Oacute Aring -35 KPX Oacute Atilde -35 KPX Oacute T -40 KPX Oacute Tcaron -40 KPX Oacute Tcommaaccent -40 KPX Oacute V -50 KPX Oacute W -35 KPX Oacute X -40 KPX Oacute Y -50 KPX Oacute Yacute -50 KPX Oacute Ydieresis -50 KPX Ocircumflex A -35 KPX Ocircumflex Aacute -35 KPX Ocircumflex Abreve -35 KPX Ocircumflex Acircumflex -35 KPX Ocircumflex Adieresis -35 KPX Ocircumflex Agrave -35 KPX Ocircumflex Amacron -35 KPX Ocircumflex Aogonek -35 KPX Ocircumflex Aring -35 KPX Ocircumflex Atilde -35 KPX Ocircumflex T -40 KPX Ocircumflex Tcaron -40 KPX Ocircumflex Tcommaaccent -40 KPX Ocircumflex V -50 KPX Ocircumflex W -35 KPX Ocircumflex X -40 KPX Ocircumflex Y -50 KPX Ocircumflex Yacute -50 KPX Ocircumflex Ydieresis -50 KPX Odieresis A -35 KPX Odieresis Aacute -35 KPX Odieresis Abreve -35 KPX Odieresis Acircumflex -35 KPX Odieresis Adieresis -35 KPX Odieresis Agrave -35 KPX Odieresis Amacron -35 KPX Odieresis Aogonek -35 KPX Odieresis Aring -35 KPX Odieresis Atilde -35 KPX Odieresis T -40 KPX Odieresis Tcaron -40 KPX Odieresis Tcommaaccent -40 KPX Odieresis V -50 KPX Odieresis W -35 KPX Odieresis X -40 KPX Odieresis Y -50 KPX Odieresis Yacute -50 KPX Odieresis Ydieresis -50 KPX Ograve A -35 KPX Ograve Aacute -35 KPX Ograve Abreve -35 KPX Ograve Acircumflex -35 KPX Ograve Adieresis -35 KPX Ograve Agrave -35 KPX Ograve Amacron -35 KPX Ograve Aogonek -35 KPX Ograve Aring -35 KPX Ograve Atilde -35 KPX Ograve T -40 KPX Ograve Tcaron -40 KPX Ograve Tcommaaccent -40 KPX Ograve V -50 KPX Ograve W -35 KPX Ograve X -40 KPX Ograve Y -50 KPX Ograve Yacute -50 KPX Ograve Ydieresis -50 KPX Ohungarumlaut A -35 KPX Ohungarumlaut Aacute -35 KPX Ohungarumlaut Abreve -35 KPX Ohungarumlaut Acircumflex -35 KPX Ohungarumlaut Adieresis -35 KPX Ohungarumlaut Agrave -35 KPX Ohungarumlaut Amacron -35 KPX Ohungarumlaut Aogonek -35 KPX Ohungarumlaut Aring -35 KPX Ohungarumlaut Atilde -35 KPX Ohungarumlaut T -40 KPX Ohungarumlaut Tcaron -40 KPX Ohungarumlaut Tcommaaccent -40 KPX Ohungarumlaut V -50 KPX Ohungarumlaut W -35 KPX Ohungarumlaut X -40 KPX Ohungarumlaut Y -50 KPX Ohungarumlaut Yacute -50 KPX Ohungarumlaut Ydieresis -50 KPX Omacron A -35 KPX Omacron Aacute -35 KPX Omacron Abreve -35 KPX Omacron Acircumflex -35 KPX Omacron Adieresis -35 KPX Omacron Agrave -35 KPX Omacron Amacron -35 KPX Omacron Aogonek -35 KPX Omacron Aring -35 KPX Omacron Atilde -35 KPX Omacron T -40 KPX Omacron Tcaron -40 KPX Omacron Tcommaaccent -40 KPX Omacron V -50 KPX Omacron W -35 KPX Omacron X -40 KPX Omacron Y -50 KPX Omacron Yacute -50 KPX Omacron Ydieresis -50 KPX Oslash A -35 KPX Oslash Aacute -35 KPX Oslash Abreve -35 KPX Oslash Acircumflex -35 KPX Oslash Adieresis -35 KPX Oslash Agrave -35 KPX Oslash Amacron -35 KPX Oslash Aogonek -35 KPX Oslash Aring -35 KPX Oslash Atilde -35 KPX Oslash T -40 KPX Oslash Tcaron -40 KPX Oslash Tcommaaccent -40 KPX Oslash V -50 KPX Oslash W -35 KPX Oslash X -40 KPX Oslash Y -50 KPX Oslash Yacute -50 KPX Oslash Ydieresis -50 KPX Otilde A -35 KPX Otilde Aacute -35 KPX Otilde Abreve -35 KPX Otilde Acircumflex -35 KPX Otilde Adieresis -35 KPX Otilde Agrave -35 KPX Otilde Amacron -35 KPX Otilde Aogonek -35 KPX Otilde Aring -35 KPX Otilde Atilde -35 KPX Otilde T -40 KPX Otilde Tcaron -40 KPX Otilde Tcommaaccent -40 KPX Otilde V -50 KPX Otilde W -35 KPX Otilde X -40 KPX Otilde Y -50 KPX Otilde Yacute -50 KPX Otilde Ydieresis -50 KPX P A -92 KPX P Aacute -92 KPX P Abreve -92 KPX P Acircumflex -92 KPX P Adieresis -92 KPX P Agrave -92 KPX P Amacron -92 KPX P Aogonek -92 KPX P Aring -92 KPX P Atilde -92 KPX P a -15 KPX P aacute -15 KPX P abreve -15 KPX P acircumflex -15 KPX P adieresis -15 KPX P agrave -15 KPX P amacron -15 KPX P aogonek -15 KPX P aring -15 KPX P atilde -15 KPX P comma -111 KPX P period -111 KPX Q U -10 KPX Q Uacute -10 KPX Q Ucircumflex -10 KPX Q Udieresis -10 KPX Q Ugrave -10 KPX Q Uhungarumlaut -10 KPX Q Umacron -10 KPX Q Uogonek -10 KPX Q Uring -10 KPX R O -40 KPX R Oacute -40 KPX R Ocircumflex -40 KPX R Odieresis -40 KPX R Ograve -40 KPX R Ohungarumlaut -40 KPX R Omacron -40 KPX R Oslash -40 KPX R Otilde -40 KPX R T -60 KPX R Tcaron -60 KPX R Tcommaaccent -60 KPX R U -40 KPX R Uacute -40 KPX R Ucircumflex -40 KPX R Udieresis -40 KPX R Ugrave -40 KPX R Uhungarumlaut -40 KPX R Umacron -40 KPX R Uogonek -40 KPX R Uring -40 KPX R V -80 KPX R W -55 KPX R Y -65 KPX R Yacute -65 KPX R Ydieresis -65 KPX Racute O -40 KPX Racute Oacute -40 KPX Racute Ocircumflex -40 KPX Racute Odieresis -40 KPX Racute Ograve -40 KPX Racute Ohungarumlaut -40 KPX Racute Omacron -40 KPX Racute Oslash -40 KPX Racute Otilde -40 KPX Racute T -60 KPX Racute Tcaron -60 KPX Racute Tcommaaccent -60 KPX Racute U -40 KPX Racute Uacute -40 KPX Racute Ucircumflex -40 KPX Racute Udieresis -40 KPX Racute Ugrave -40 KPX Racute Uhungarumlaut -40 KPX Racute Umacron -40 KPX Racute Uogonek -40 KPX Racute Uring -40 KPX Racute V -80 KPX Racute W -55 KPX Racute Y -65 KPX Racute Yacute -65 KPX Racute Ydieresis -65 KPX Rcaron O -40 KPX Rcaron Oacute -40 KPX Rcaron Ocircumflex -40 KPX Rcaron Odieresis -40 KPX Rcaron Ograve -40 KPX Rcaron Ohungarumlaut -40 KPX Rcaron Omacron -40 KPX Rcaron Oslash -40 KPX Rcaron Otilde -40 KPX Rcaron T -60 KPX Rcaron Tcaron -60 KPX Rcaron Tcommaaccent -60 KPX Rcaron U -40 KPX Rcaron Uacute -40 KPX Rcaron Ucircumflex -40 KPX Rcaron Udieresis -40 KPX Rcaron Ugrave -40 KPX Rcaron Uhungarumlaut -40 KPX Rcaron Umacron -40 KPX Rcaron Uogonek -40 KPX Rcaron Uring -40 KPX Rcaron V -80 KPX Rcaron W -55 KPX Rcaron Y -65 KPX Rcaron Yacute -65 KPX Rcaron Ydieresis -65 KPX Rcommaaccent O -40 KPX Rcommaaccent Oacute -40 KPX Rcommaaccent Ocircumflex -40 KPX Rcommaaccent Odieresis -40 KPX Rcommaaccent Ograve -40 KPX Rcommaaccent Ohungarumlaut -40 KPX Rcommaaccent Omacron -40 KPX Rcommaaccent Oslash -40 KPX Rcommaaccent Otilde -40 KPX Rcommaaccent T -60 KPX Rcommaaccent Tcaron -60 KPX Rcommaaccent Tcommaaccent -60 KPX Rcommaaccent U -40 KPX Rcommaaccent Uacute -40 KPX Rcommaaccent Ucircumflex -40 KPX Rcommaaccent Udieresis -40 KPX Rcommaaccent Ugrave -40 KPX Rcommaaccent Uhungarumlaut -40 KPX Rcommaaccent Umacron -40 KPX Rcommaaccent Uogonek -40 KPX Rcommaaccent Uring -40 KPX Rcommaaccent V -80 KPX Rcommaaccent W -55 KPX Rcommaaccent Y -65 KPX Rcommaaccent Yacute -65 KPX Rcommaaccent Ydieresis -65 KPX T A -93 KPX T Aacute -93 KPX T Abreve -93 KPX T Acircumflex -93 KPX T Adieresis -93 KPX T Agrave -93 KPX T Amacron -93 KPX T Aogonek -93 KPX T Aring -93 KPX T Atilde -93 KPX T O -18 KPX T Oacute -18 KPX T Ocircumflex -18 KPX T Odieresis -18 KPX T Ograve -18 KPX T Ohungarumlaut -18 KPX T Omacron -18 KPX T Oslash -18 KPX T Otilde -18 KPX T a -80 KPX T aacute -80 KPX T abreve -80 KPX T acircumflex -80 KPX T adieresis -40 KPX T agrave -40 KPX T amacron -40 KPX T aogonek -80 KPX T aring -80 KPX T atilde -40 KPX T colon -50 KPX T comma -74 KPX T e -70 KPX T eacute -70 KPX T ecaron -70 KPX T ecircumflex -70 KPX T edieresis -30 KPX T edotaccent -70 KPX T egrave -70 KPX T emacron -30 KPX T eogonek -70 KPX T hyphen -92 KPX T i -35 KPX T iacute -35 KPX T iogonek -35 KPX T o -80 KPX T oacute -80 KPX T ocircumflex -80 KPX T odieresis -80 KPX T ograve -80 KPX T ohungarumlaut -80 KPX T omacron -80 KPX T oslash -80 KPX T otilde -80 KPX T period -74 KPX T r -35 KPX T racute -35 KPX T rcaron -35 KPX T rcommaaccent -35 KPX T semicolon -55 KPX T u -45 KPX T uacute -45 KPX T ucircumflex -45 KPX T udieresis -45 KPX T ugrave -45 KPX T uhungarumlaut -45 KPX T umacron -45 KPX T uogonek -45 KPX T uring -45 KPX T w -80 KPX T y -80 KPX T yacute -80 KPX T ydieresis -80 KPX Tcaron A -93 KPX Tcaron Aacute -93 KPX Tcaron Abreve -93 KPX Tcaron Acircumflex -93 KPX Tcaron Adieresis -93 KPX Tcaron Agrave -93 KPX Tcaron Amacron -93 KPX Tcaron Aogonek -93 KPX Tcaron Aring -93 KPX Tcaron Atilde -93 KPX Tcaron O -18 KPX Tcaron Oacute -18 KPX Tcaron Ocircumflex -18 KPX Tcaron Odieresis -18 KPX Tcaron Ograve -18 KPX Tcaron Ohungarumlaut -18 KPX Tcaron Omacron -18 KPX Tcaron Oslash -18 KPX Tcaron Otilde -18 KPX Tcaron a -80 KPX Tcaron aacute -80 KPX Tcaron abreve -80 KPX Tcaron acircumflex -80 KPX Tcaron adieresis -40 KPX Tcaron agrave -40 KPX Tcaron amacron -40 KPX Tcaron aogonek -80 KPX Tcaron aring -80 KPX Tcaron atilde -40 KPX Tcaron colon -50 KPX Tcaron comma -74 KPX Tcaron e -70 KPX Tcaron eacute -70 KPX Tcaron ecaron -70 KPX Tcaron ecircumflex -30 KPX Tcaron edieresis -30 KPX Tcaron edotaccent -70 KPX Tcaron egrave -70 KPX Tcaron emacron -30 KPX Tcaron eogonek -70 KPX Tcaron hyphen -92 KPX Tcaron i -35 KPX Tcaron iacute -35 KPX Tcaron iogonek -35 KPX Tcaron o -80 KPX Tcaron oacute -80 KPX Tcaron ocircumflex -80 KPX Tcaron odieresis -80 KPX Tcaron ograve -80 KPX Tcaron ohungarumlaut -80 KPX Tcaron omacron -80 KPX Tcaron oslash -80 KPX Tcaron otilde -80 KPX Tcaron period -74 KPX Tcaron r -35 KPX Tcaron racute -35 KPX Tcaron rcaron -35 KPX Tcaron rcommaaccent -35 KPX Tcaron semicolon -55 KPX Tcaron u -45 KPX Tcaron uacute -45 KPX Tcaron ucircumflex -45 KPX Tcaron udieresis -45 KPX Tcaron ugrave -45 KPX Tcaron uhungarumlaut -45 KPX Tcaron umacron -45 KPX Tcaron uogonek -45 KPX Tcaron uring -45 KPX Tcaron w -80 KPX Tcaron y -80 KPX Tcaron yacute -80 KPX Tcaron ydieresis -80 KPX Tcommaaccent A -93 KPX Tcommaaccent Aacute -93 KPX Tcommaaccent Abreve -93 KPX Tcommaaccent Acircumflex -93 KPX Tcommaaccent Adieresis -93 KPX Tcommaaccent Agrave -93 KPX Tcommaaccent Amacron -93 KPX Tcommaaccent Aogonek -93 KPX Tcommaaccent Aring -93 KPX Tcommaaccent Atilde -93 KPX Tcommaaccent O -18 KPX Tcommaaccent Oacute -18 KPX Tcommaaccent Ocircumflex -18 KPX Tcommaaccent Odieresis -18 KPX Tcommaaccent Ograve -18 KPX Tcommaaccent Ohungarumlaut -18 KPX Tcommaaccent Omacron -18 KPX Tcommaaccent Oslash -18 KPX Tcommaaccent Otilde -18 KPX Tcommaaccent a -80 KPX Tcommaaccent aacute -80 KPX Tcommaaccent abreve -80 KPX Tcommaaccent acircumflex -80 KPX Tcommaaccent adieresis -40 KPX Tcommaaccent agrave -40 KPX Tcommaaccent amacron -40 KPX Tcommaaccent aogonek -80 KPX Tcommaaccent aring -80 KPX Tcommaaccent atilde -40 KPX Tcommaaccent colon -50 KPX Tcommaaccent comma -74 KPX Tcommaaccent e -70 KPX Tcommaaccent eacute -70 KPX Tcommaaccent ecaron -70 KPX Tcommaaccent ecircumflex -30 KPX Tcommaaccent edieresis -30 KPX Tcommaaccent edotaccent -70 KPX Tcommaaccent egrave -30 KPX Tcommaaccent emacron -70 KPX Tcommaaccent eogonek -70 KPX Tcommaaccent hyphen -92 KPX Tcommaaccent i -35 KPX Tcommaaccent iacute -35 KPX Tcommaaccent iogonek -35 KPX Tcommaaccent o -80 KPX Tcommaaccent oacute -80 KPX Tcommaaccent ocircumflex -80 KPX Tcommaaccent odieresis -80 KPX Tcommaaccent ograve -80 KPX Tcommaaccent ohungarumlaut -80 KPX Tcommaaccent omacron -80 KPX Tcommaaccent oslash -80 KPX Tcommaaccent otilde -80 KPX Tcommaaccent period -74 KPX Tcommaaccent r -35 KPX Tcommaaccent racute -35 KPX Tcommaaccent rcaron -35 KPX Tcommaaccent rcommaaccent -35 KPX Tcommaaccent semicolon -55 KPX Tcommaaccent u -45 KPX Tcommaaccent uacute -45 KPX Tcommaaccent ucircumflex -45 KPX Tcommaaccent udieresis -45 KPX Tcommaaccent ugrave -45 KPX Tcommaaccent uhungarumlaut -45 KPX Tcommaaccent umacron -45 KPX Tcommaaccent uogonek -45 KPX Tcommaaccent uring -45 KPX Tcommaaccent w -80 KPX Tcommaaccent y -80 KPX Tcommaaccent yacute -80 KPX Tcommaaccent ydieresis -80 KPX U A -40 KPX U Aacute -40 KPX U Abreve -40 KPX U Acircumflex -40 KPX U Adieresis -40 KPX U Agrave -40 KPX U Amacron -40 KPX U Aogonek -40 KPX U Aring -40 KPX U Atilde -40 KPX Uacute A -40 KPX Uacute Aacute -40 KPX Uacute Abreve -40 KPX Uacute Acircumflex -40 KPX Uacute Adieresis -40 KPX Uacute Agrave -40 KPX Uacute Amacron -40 KPX Uacute Aogonek -40 KPX Uacute Aring -40 KPX Uacute Atilde -40 KPX Ucircumflex A -40 KPX Ucircumflex Aacute -40 KPX Ucircumflex Abreve -40 KPX Ucircumflex Acircumflex -40 KPX Ucircumflex Adieresis -40 KPX Ucircumflex Agrave -40 KPX Ucircumflex Amacron -40 KPX Ucircumflex Aogonek -40 KPX Ucircumflex Aring -40 KPX Ucircumflex Atilde -40 KPX Udieresis A -40 KPX Udieresis Aacute -40 KPX Udieresis Abreve -40 KPX Udieresis Acircumflex -40 KPX Udieresis Adieresis -40 KPX Udieresis Agrave -40 KPX Udieresis Amacron -40 KPX Udieresis Aogonek -40 KPX Udieresis Aring -40 KPX Udieresis Atilde -40 KPX Ugrave A -40 KPX Ugrave Aacute -40 KPX Ugrave Abreve -40 KPX Ugrave Acircumflex -40 KPX Ugrave Adieresis -40 KPX Ugrave Agrave -40 KPX Ugrave Amacron -40 KPX Ugrave Aogonek -40 KPX Ugrave Aring -40 KPX Ugrave Atilde -40 KPX Uhungarumlaut A -40 KPX Uhungarumlaut Aacute -40 KPX Uhungarumlaut Abreve -40 KPX Uhungarumlaut Acircumflex -40 KPX Uhungarumlaut Adieresis -40 KPX Uhungarumlaut Agrave -40 KPX Uhungarumlaut Amacron -40 KPX Uhungarumlaut Aogonek -40 KPX Uhungarumlaut Aring -40 KPX Uhungarumlaut Atilde -40 KPX Umacron A -40 KPX Umacron Aacute -40 KPX Umacron Abreve -40 KPX Umacron Acircumflex -40 KPX Umacron Adieresis -40 KPX Umacron Agrave -40 KPX Umacron Amacron -40 KPX Umacron Aogonek -40 KPX Umacron Aring -40 KPX Umacron Atilde -40 KPX Uogonek A -40 KPX Uogonek Aacute -40 KPX Uogonek Abreve -40 KPX Uogonek Acircumflex -40 KPX Uogonek Adieresis -40 KPX Uogonek Agrave -40 KPX Uogonek Amacron -40 KPX Uogonek Aogonek -40 KPX Uogonek Aring -40 KPX Uogonek Atilde -40 KPX Uring A -40 KPX Uring Aacute -40 KPX Uring Abreve -40 KPX Uring Acircumflex -40 KPX Uring Adieresis -40 KPX Uring Agrave -40 KPX Uring Amacron -40 KPX Uring Aogonek -40 KPX Uring Aring -40 KPX Uring Atilde -40 KPX V A -135 KPX V Aacute -135 KPX V Abreve -135 KPX V Acircumflex -135 KPX V Adieresis -135 KPX V Agrave -135 KPX V Amacron -135 KPX V Aogonek -135 KPX V Aring -135 KPX V Atilde -135 KPX V G -15 KPX V Gbreve -15 KPX V Gcommaaccent -15 KPX V O -40 KPX V Oacute -40 KPX V Ocircumflex -40 KPX V Odieresis -40 KPX V Ograve -40 KPX V Ohungarumlaut -40 KPX V Omacron -40 KPX V Oslash -40 KPX V Otilde -40 KPX V a -111 KPX V aacute -111 KPX V abreve -111 KPX V acircumflex -71 KPX V adieresis -71 KPX V agrave -71 KPX V amacron -71 KPX V aogonek -111 KPX V aring -111 KPX V atilde -71 KPX V colon -74 KPX V comma -129 KPX V e -111 KPX V eacute -111 KPX V ecaron -71 KPX V ecircumflex -71 KPX V edieresis -71 KPX V edotaccent -111 KPX V egrave -71 KPX V emacron -71 KPX V eogonek -111 KPX V hyphen -100 KPX V i -60 KPX V iacute -60 KPX V icircumflex -20 KPX V idieresis -20 KPX V igrave -20 KPX V imacron -20 KPX V iogonek -60 KPX V o -129 KPX V oacute -129 KPX V ocircumflex -129 KPX V odieresis -89 KPX V ograve -89 KPX V ohungarumlaut -129 KPX V omacron -89 KPX V oslash -129 KPX V otilde -89 KPX V period -129 KPX V semicolon -74 KPX V u -75 KPX V uacute -75 KPX V ucircumflex -75 KPX V udieresis -75 KPX V ugrave -75 KPX V uhungarumlaut -75 KPX V umacron -75 KPX V uogonek -75 KPX V uring -75 KPX W A -120 KPX W Aacute -120 KPX W Abreve -120 KPX W Acircumflex -120 KPX W Adieresis -120 KPX W Agrave -120 KPX W Amacron -120 KPX W Aogonek -120 KPX W Aring -120 KPX W Atilde -120 KPX W O -10 KPX W Oacute -10 KPX W Ocircumflex -10 KPX W Odieresis -10 KPX W Ograve -10 KPX W Ohungarumlaut -10 KPX W Omacron -10 KPX W Oslash -10 KPX W Otilde -10 KPX W a -80 KPX W aacute -80 KPX W abreve -80 KPX W acircumflex -80 KPX W adieresis -80 KPX W agrave -80 KPX W amacron -80 KPX W aogonek -80 KPX W aring -80 KPX W atilde -80 KPX W colon -37 KPX W comma -92 KPX W e -80 KPX W eacute -80 KPX W ecaron -80 KPX W ecircumflex -80 KPX W edieresis -40 KPX W edotaccent -80 KPX W egrave -40 KPX W emacron -40 KPX W eogonek -80 KPX W hyphen -65 KPX W i -40 KPX W iacute -40 KPX W iogonek -40 KPX W o -80 KPX W oacute -80 KPX W ocircumflex -80 KPX W odieresis -80 KPX W ograve -80 KPX W ohungarumlaut -80 KPX W omacron -80 KPX W oslash -80 KPX W otilde -80 KPX W period -92 KPX W semicolon -37 KPX W u -50 KPX W uacute -50 KPX W ucircumflex -50 KPX W udieresis -50 KPX W ugrave -50 KPX W uhungarumlaut -50 KPX W umacron -50 KPX W uogonek -50 KPX W uring -50 KPX W y -73 KPX W yacute -73 KPX W ydieresis -73 KPX Y A -120 KPX Y Aacute -120 KPX Y Abreve -120 KPX Y Acircumflex -120 KPX Y Adieresis -120 KPX Y Agrave -120 KPX Y Amacron -120 KPX Y Aogonek -120 KPX Y Aring -120 KPX Y Atilde -120 KPX Y O -30 KPX Y Oacute -30 KPX Y Ocircumflex -30 KPX Y Odieresis -30 KPX Y Ograve -30 KPX Y Ohungarumlaut -30 KPX Y Omacron -30 KPX Y Oslash -30 KPX Y Otilde -30 KPX Y a -100 KPX Y aacute -100 KPX Y abreve -100 KPX Y acircumflex -100 KPX Y adieresis -60 KPX Y agrave -60 KPX Y amacron -60 KPX Y aogonek -100 KPX Y aring -100 KPX Y atilde -60 KPX Y colon -92 KPX Y comma -129 KPX Y e -100 KPX Y eacute -100 KPX Y ecaron -100 KPX Y ecircumflex -100 KPX Y edieresis -60 KPX Y edotaccent -100 KPX Y egrave -60 KPX Y emacron -60 KPX Y eogonek -100 KPX Y hyphen -111 KPX Y i -55 KPX Y iacute -55 KPX Y iogonek -55 KPX Y o -110 KPX Y oacute -110 KPX Y ocircumflex -110 KPX Y odieresis -70 KPX Y ograve -70 KPX Y ohungarumlaut -110 KPX Y omacron -70 KPX Y oslash -110 KPX Y otilde -70 KPX Y period -129 KPX Y semicolon -92 KPX Y u -111 KPX Y uacute -111 KPX Y ucircumflex -111 KPX Y udieresis -71 KPX Y ugrave -71 KPX Y uhungarumlaut -111 KPX Y umacron -71 KPX Y uogonek -111 KPX Y uring -111 KPX Yacute A -120 KPX Yacute Aacute -120 KPX Yacute Abreve -120 KPX Yacute Acircumflex -120 KPX Yacute Adieresis -120 KPX Yacute Agrave -120 KPX Yacute Amacron -120 KPX Yacute Aogonek -120 KPX Yacute Aring -120 KPX Yacute Atilde -120 KPX Yacute O -30 KPX Yacute Oacute -30 KPX Yacute Ocircumflex -30 KPX Yacute Odieresis -30 KPX Yacute Ograve -30 KPX Yacute Ohungarumlaut -30 KPX Yacute Omacron -30 KPX Yacute Oslash -30 KPX Yacute Otilde -30 KPX Yacute a -100 KPX Yacute aacute -100 KPX Yacute abreve -100 KPX Yacute acircumflex -100 KPX Yacute adieresis -60 KPX Yacute agrave -60 KPX Yacute amacron -60 KPX Yacute aogonek -100 KPX Yacute aring -100 KPX Yacute atilde -60 KPX Yacute colon -92 KPX Yacute comma -129 KPX Yacute e -100 KPX Yacute eacute -100 KPX Yacute ecaron -100 KPX Yacute ecircumflex -100 KPX Yacute edieresis -60 KPX Yacute edotaccent -100 KPX Yacute egrave -60 KPX Yacute emacron -60 KPX Yacute eogonek -100 KPX Yacute hyphen -111 KPX Yacute i -55 KPX Yacute iacute -55 KPX Yacute iogonek -55 KPX Yacute o -110 KPX Yacute oacute -110 KPX Yacute ocircumflex -110 KPX Yacute odieresis -70 KPX Yacute ograve -70 KPX Yacute ohungarumlaut -110 KPX Yacute omacron -70 KPX Yacute oslash -110 KPX Yacute otilde -70 KPX Yacute period -129 KPX Yacute semicolon -92 KPX Yacute u -111 KPX Yacute uacute -111 KPX Yacute ucircumflex -111 KPX Yacute udieresis -71 KPX Yacute ugrave -71 KPX Yacute uhungarumlaut -111 KPX Yacute umacron -71 KPX Yacute uogonek -111 KPX Yacute uring -111 KPX Ydieresis A -120 KPX Ydieresis Aacute -120 KPX Ydieresis Abreve -120 KPX Ydieresis Acircumflex -120 KPX Ydieresis Adieresis -120 KPX Ydieresis Agrave -120 KPX Ydieresis Amacron -120 KPX Ydieresis Aogonek -120 KPX Ydieresis Aring -120 KPX Ydieresis Atilde -120 KPX Ydieresis O -30 KPX Ydieresis Oacute -30 KPX Ydieresis Ocircumflex -30 KPX Ydieresis Odieresis -30 KPX Ydieresis Ograve -30 KPX Ydieresis Ohungarumlaut -30 KPX Ydieresis Omacron -30 KPX Ydieresis Oslash -30 KPX Ydieresis Otilde -30 KPX Ydieresis a -100 KPX Ydieresis aacute -100 KPX Ydieresis abreve -100 KPX Ydieresis acircumflex -100 KPX Ydieresis adieresis -60 KPX Ydieresis agrave -60 KPX Ydieresis amacron -60 KPX Ydieresis aogonek -100 KPX Ydieresis aring -100 KPX Ydieresis atilde -100 KPX Ydieresis colon -92 KPX Ydieresis comma -129 KPX Ydieresis e -100 KPX Ydieresis eacute -100 KPX Ydieresis ecaron -100 KPX Ydieresis ecircumflex -100 KPX Ydieresis edieresis -60 KPX Ydieresis edotaccent -100 KPX Ydieresis egrave -60 KPX Ydieresis emacron -60 KPX Ydieresis eogonek -100 KPX Ydieresis hyphen -111 KPX Ydieresis i -55 KPX Ydieresis iacute -55 KPX Ydieresis iogonek -55 KPX Ydieresis o -110 KPX Ydieresis oacute -110 KPX Ydieresis ocircumflex -110 KPX Ydieresis odieresis -70 KPX Ydieresis ograve -70 KPX Ydieresis ohungarumlaut -110 KPX Ydieresis omacron -70 KPX Ydieresis oslash -110 KPX Ydieresis otilde -70 KPX Ydieresis period -129 KPX Ydieresis semicolon -92 KPX Ydieresis u -111 KPX Ydieresis uacute -111 KPX Ydieresis ucircumflex -111 KPX Ydieresis udieresis -71 KPX Ydieresis ugrave -71 KPX Ydieresis uhungarumlaut -111 KPX Ydieresis umacron -71 KPX Ydieresis uogonek -111 KPX Ydieresis uring -111 KPX a v -20 KPX a w -15 KPX aacute v -20 KPX aacute w -15 KPX abreve v -20 KPX abreve w -15 KPX acircumflex v -20 KPX acircumflex w -15 KPX adieresis v -20 KPX adieresis w -15 KPX agrave v -20 KPX agrave w -15 KPX amacron v -20 KPX amacron w -15 KPX aogonek v -20 KPX aogonek w -15 KPX aring v -20 KPX aring w -15 KPX atilde v -20 KPX atilde w -15 KPX b period -40 KPX b u -20 KPX b uacute -20 KPX b ucircumflex -20 KPX b udieresis -20 KPX b ugrave -20 KPX b uhungarumlaut -20 KPX b umacron -20 KPX b uogonek -20 KPX b uring -20 KPX b v -15 KPX c y -15 KPX c yacute -15 KPX c ydieresis -15 KPX cacute y -15 KPX cacute yacute -15 KPX cacute ydieresis -15 KPX ccaron y -15 KPX ccaron yacute -15 KPX ccaron ydieresis -15 KPX ccedilla y -15 KPX ccedilla yacute -15 KPX ccedilla ydieresis -15 KPX comma quotedblright -70 KPX comma quoteright -70 KPX e g -15 KPX e gbreve -15 KPX e gcommaaccent -15 KPX e v -25 KPX e w -25 KPX e x -15 KPX e y -15 KPX e yacute -15 KPX e ydieresis -15 KPX eacute g -15 KPX eacute gbreve -15 KPX eacute gcommaaccent -15 KPX eacute v -25 KPX eacute w -25 KPX eacute x -15 KPX eacute y -15 KPX eacute yacute -15 KPX eacute ydieresis -15 KPX ecaron g -15 KPX ecaron gbreve -15 KPX ecaron gcommaaccent -15 KPX ecaron v -25 KPX ecaron w -25 KPX ecaron x -15 KPX ecaron y -15 KPX ecaron yacute -15 KPX ecaron ydieresis -15 KPX ecircumflex g -15 KPX ecircumflex gbreve -15 KPX ecircumflex gcommaaccent -15 KPX ecircumflex v -25 KPX ecircumflex w -25 KPX ecircumflex x -15 KPX ecircumflex y -15 KPX ecircumflex yacute -15 KPX ecircumflex ydieresis -15 KPX edieresis g -15 KPX edieresis gbreve -15 KPX edieresis gcommaaccent -15 KPX edieresis v -25 KPX edieresis w -25 KPX edieresis x -15 KPX edieresis y -15 KPX edieresis yacute -15 KPX edieresis ydieresis -15 KPX edotaccent g -15 KPX edotaccent gbreve -15 KPX edotaccent gcommaaccent -15 KPX edotaccent v -25 KPX edotaccent w -25 KPX edotaccent x -15 KPX edotaccent y -15 KPX edotaccent yacute -15 KPX edotaccent ydieresis -15 KPX egrave g -15 KPX egrave gbreve -15 KPX egrave gcommaaccent -15 KPX egrave v -25 KPX egrave w -25 KPX egrave x -15 KPX egrave y -15 KPX egrave yacute -15 KPX egrave ydieresis -15 KPX emacron g -15 KPX emacron gbreve -15 KPX emacron gcommaaccent -15 KPX emacron v -25 KPX emacron w -25 KPX emacron x -15 KPX emacron y -15 KPX emacron yacute -15 KPX emacron ydieresis -15 KPX eogonek g -15 KPX eogonek gbreve -15 KPX eogonek gcommaaccent -15 KPX eogonek v -25 KPX eogonek w -25 KPX eogonek x -15 KPX eogonek y -15 KPX eogonek yacute -15 KPX eogonek ydieresis -15 KPX f a -10 KPX f aacute -10 KPX f abreve -10 KPX f acircumflex -10 KPX f adieresis -10 KPX f agrave -10 KPX f amacron -10 KPX f aogonek -10 KPX f aring -10 KPX f atilde -10 KPX f dotlessi -50 KPX f f -25 KPX f i -20 KPX f iacute -20 KPX f quoteright 55 KPX g a -5 KPX g aacute -5 KPX g abreve -5 KPX g acircumflex -5 KPX g adieresis -5 KPX g agrave -5 KPX g amacron -5 KPX g aogonek -5 KPX g aring -5 KPX g atilde -5 KPX gbreve a -5 KPX gbreve aacute -5 KPX gbreve abreve -5 KPX gbreve acircumflex -5 KPX gbreve adieresis -5 KPX gbreve agrave -5 KPX gbreve amacron -5 KPX gbreve aogonek -5 KPX gbreve aring -5 KPX gbreve atilde -5 KPX gcommaaccent a -5 KPX gcommaaccent aacute -5 KPX gcommaaccent abreve -5 KPX gcommaaccent acircumflex -5 KPX gcommaaccent adieresis -5 KPX gcommaaccent agrave -5 KPX gcommaaccent amacron -5 KPX gcommaaccent aogonek -5 KPX gcommaaccent aring -5 KPX gcommaaccent atilde -5 KPX h y -5 KPX h yacute -5 KPX h ydieresis -5 KPX i v -25 KPX iacute v -25 KPX icircumflex v -25 KPX idieresis v -25 KPX igrave v -25 KPX imacron v -25 KPX iogonek v -25 KPX k e -10 KPX k eacute -10 KPX k ecaron -10 KPX k ecircumflex -10 KPX k edieresis -10 KPX k edotaccent -10 KPX k egrave -10 KPX k emacron -10 KPX k eogonek -10 KPX k o -10 KPX k oacute -10 KPX k ocircumflex -10 KPX k odieresis -10 KPX k ograve -10 KPX k ohungarumlaut -10 KPX k omacron -10 KPX k oslash -10 KPX k otilde -10 KPX k y -15 KPX k yacute -15 KPX k ydieresis -15 KPX kcommaaccent e -10 KPX kcommaaccent eacute -10 KPX kcommaaccent ecaron -10 KPX kcommaaccent ecircumflex -10 KPX kcommaaccent edieresis -10 KPX kcommaaccent edotaccent -10 KPX kcommaaccent egrave -10 KPX kcommaaccent emacron -10 KPX kcommaaccent eogonek -10 KPX kcommaaccent o -10 KPX kcommaaccent oacute -10 KPX kcommaaccent ocircumflex -10 KPX kcommaaccent odieresis -10 KPX kcommaaccent ograve -10 KPX kcommaaccent ohungarumlaut -10 KPX kcommaaccent omacron -10 KPX kcommaaccent oslash -10 KPX kcommaaccent otilde -10 KPX kcommaaccent y -15 KPX kcommaaccent yacute -15 KPX kcommaaccent ydieresis -15 KPX l w -10 KPX lacute w -10 KPX lcommaaccent w -10 KPX lslash w -10 KPX n v -40 KPX n y -15 KPX n yacute -15 KPX n ydieresis -15 KPX nacute v -40 KPX nacute y -15 KPX nacute yacute -15 KPX nacute ydieresis -15 KPX ncaron v -40 KPX ncaron y -15 KPX ncaron yacute -15 KPX ncaron ydieresis -15 KPX ncommaaccent v -40 KPX ncommaaccent y -15 KPX ncommaaccent yacute -15 KPX ncommaaccent ydieresis -15 KPX ntilde v -40 KPX ntilde y -15 KPX ntilde yacute -15 KPX ntilde ydieresis -15 KPX o v -15 KPX o w -25 KPX o y -10 KPX o yacute -10 KPX o ydieresis -10 KPX oacute v -15 KPX oacute w -25 KPX oacute y -10 KPX oacute yacute -10 KPX oacute ydieresis -10 KPX ocircumflex v -15 KPX ocircumflex w -25 KPX ocircumflex y -10 KPX ocircumflex yacute -10 KPX ocircumflex ydieresis -10 KPX odieresis v -15 KPX odieresis w -25 KPX odieresis y -10 KPX odieresis yacute -10 KPX odieresis ydieresis -10 KPX ograve v -15 KPX ograve w -25 KPX ograve y -10 KPX ograve yacute -10 KPX ograve ydieresis -10 KPX ohungarumlaut v -15 KPX ohungarumlaut w -25 KPX ohungarumlaut y -10 KPX ohungarumlaut yacute -10 KPX ohungarumlaut ydieresis -10 KPX omacron v -15 KPX omacron w -25 KPX omacron y -10 KPX omacron yacute -10 KPX omacron ydieresis -10 KPX oslash v -15 KPX oslash w -25 KPX oslash y -10 KPX oslash yacute -10 KPX oslash ydieresis -10 KPX otilde v -15 KPX otilde w -25 KPX otilde y -10 KPX otilde yacute -10 KPX otilde ydieresis -10 KPX p y -10 KPX p yacute -10 KPX p ydieresis -10 KPX period quotedblright -70 KPX period quoteright -70 KPX quotedblleft A -80 KPX quotedblleft Aacute -80 KPX quotedblleft Abreve -80 KPX quotedblleft Acircumflex -80 KPX quotedblleft Adieresis -80 KPX quotedblleft Agrave -80 KPX quotedblleft Amacron -80 KPX quotedblleft Aogonek -80 KPX quotedblleft Aring -80 KPX quotedblleft Atilde -80 KPX quoteleft A -80 KPX quoteleft Aacute -80 KPX quoteleft Abreve -80 KPX quoteleft Acircumflex -80 KPX quoteleft Adieresis -80 KPX quoteleft Agrave -80 KPX quoteleft Amacron -80 KPX quoteleft Aogonek -80 KPX quoteleft Aring -80 KPX quoteleft Atilde -80 KPX quoteleft quoteleft -74 KPX quoteright d -50 KPX quoteright dcroat -50 KPX quoteright l -10 KPX quoteright lacute -10 KPX quoteright lcommaaccent -10 KPX quoteright lslash -10 KPX quoteright quoteright -74 KPX quoteright r -50 KPX quoteright racute -50 KPX quoteright rcaron -50 KPX quoteright rcommaaccent -50 KPX quoteright s -55 KPX quoteright sacute -55 KPX quoteright scaron -55 KPX quoteright scedilla -55 KPX quoteright scommaaccent -55 KPX quoteright space -74 KPX quoteright t -18 KPX quoteright tcommaaccent -18 KPX quoteright v -50 KPX r comma -40 KPX r g -18 KPX r gbreve -18 KPX r gcommaaccent -18 KPX r hyphen -20 KPX r period -55 KPX racute comma -40 KPX racute g -18 KPX racute gbreve -18 KPX racute gcommaaccent -18 KPX racute hyphen -20 KPX racute period -55 KPX rcaron comma -40 KPX rcaron g -18 KPX rcaron gbreve -18 KPX rcaron gcommaaccent -18 KPX rcaron hyphen -20 KPX rcaron period -55 KPX rcommaaccent comma -40 KPX rcommaaccent g -18 KPX rcommaaccent gbreve -18 KPX rcommaaccent gcommaaccent -18 KPX rcommaaccent hyphen -20 KPX rcommaaccent period -55 KPX space A -55 KPX space Aacute -55 KPX space Abreve -55 KPX space Acircumflex -55 KPX space Adieresis -55 KPX space Agrave -55 KPX space Amacron -55 KPX space Aogonek -55 KPX space Aring -55 KPX space Atilde -55 KPX space T -18 KPX space Tcaron -18 KPX space Tcommaaccent -18 KPX space V -50 KPX space W -30 KPX space Y -90 KPX space Yacute -90 KPX space Ydieresis -90 KPX v a -25 KPX v aacute -25 KPX v abreve -25 KPX v acircumflex -25 KPX v adieresis -25 KPX v agrave -25 KPX v amacron -25 KPX v aogonek -25 KPX v aring -25 KPX v atilde -25 KPX v comma -65 KPX v e -15 KPX v eacute -15 KPX v ecaron -15 KPX v ecircumflex -15 KPX v edieresis -15 KPX v edotaccent -15 KPX v egrave -15 KPX v emacron -15 KPX v eogonek -15 KPX v o -20 KPX v oacute -20 KPX v ocircumflex -20 KPX v odieresis -20 KPX v ograve -20 KPX v ohungarumlaut -20 KPX v omacron -20 KPX v oslash -20 KPX v otilde -20 KPX v period -65 KPX w a -10 KPX w aacute -10 KPX w abreve -10 KPX w acircumflex -10 KPX w adieresis -10 KPX w agrave -10 KPX w amacron -10 KPX w aogonek -10 KPX w aring -10 KPX w atilde -10 KPX w comma -65 KPX w o -10 KPX w oacute -10 KPX w ocircumflex -10 KPX w odieresis -10 KPX w ograve -10 KPX w ohungarumlaut -10 KPX w omacron -10 KPX w oslash -10 KPX w otilde -10 KPX w period -65 KPX x e -15 KPX x eacute -15 KPX x ecaron -15 KPX x ecircumflex -15 KPX x edieresis -15 KPX x edotaccent -15 KPX x egrave -15 KPX x emacron -15 KPX x eogonek -15 KPX y comma -65 KPX y period -65 KPX yacute comma -65 KPX yacute period -65 KPX ydieresis comma -65 KPX ydieresis period -65 EndKernPairs EndKernData EndFontMetrics ruby-prawn-1.0.0~rc2.orig/data/fonts/Courier-Oblique.afm0000644000000000000000000003612112114176157021625 0ustar rootrootStartFontMetrics 4.1 Comment Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. Comment Creation Date: Thu May 1 17:37:52 1997 Comment UniqueID 43051 Comment VMusage 16248 75829 FontName Courier-Oblique FullName Courier Oblique FamilyName Courier Weight Medium ItalicAngle -12 IsFixedPitch true CharacterSet ExtendedRoman FontBBox -27 -250 849 805 UnderlinePosition -100 UnderlineThickness 50 Version 003.000 Notice Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. EncodingScheme AdobeStandardEncoding CapHeight 562 XHeight 426 Ascender 629 Descender -157 StdHW 51 StdVW 51 StartCharMetrics 315 C 32 ; WX 600 ; N space ; B 0 0 0 0 ; C 33 ; WX 600 ; N exclam ; B 243 -15 464 572 ; C 34 ; WX 600 ; N quotedbl ; B 273 328 532 562 ; C 35 ; WX 600 ; N numbersign ; B 133 -32 596 639 ; C 36 ; WX 600 ; N dollar ; B 108 -126 596 662 ; C 37 ; WX 600 ; N percent ; B 134 -15 599 622 ; C 38 ; WX 600 ; N ampersand ; B 87 -15 580 543 ; C 39 ; WX 600 ; N quoteright ; B 283 328 495 562 ; C 40 ; WX 600 ; N parenleft ; B 313 -108 572 622 ; C 41 ; WX 600 ; N parenright ; B 137 -108 396 622 ; C 42 ; WX 600 ; N asterisk ; B 212 257 580 607 ; C 43 ; WX 600 ; N plus ; B 129 44 580 470 ; C 44 ; WX 600 ; N comma ; B 157 -112 370 122 ; C 45 ; WX 600 ; N hyphen ; B 152 231 558 285 ; C 46 ; WX 600 ; N period ; B 238 -15 382 109 ; C 47 ; WX 600 ; N slash ; B 112 -80 604 629 ; C 48 ; WX 600 ; N zero ; B 154 -15 575 622 ; C 49 ; WX 600 ; N one ; B 98 0 515 622 ; C 50 ; WX 600 ; N two ; B 70 0 568 622 ; C 51 ; WX 600 ; N three ; B 82 -15 538 622 ; C 52 ; WX 600 ; N four ; B 108 0 541 622 ; C 53 ; WX 600 ; N five ; B 99 -15 589 607 ; C 54 ; WX 600 ; N six ; B 155 -15 629 622 ; C 55 ; WX 600 ; N seven ; B 182 0 612 607 ; C 56 ; WX 600 ; N eight ; B 132 -15 588 622 ; C 57 ; WX 600 ; N nine ; B 93 -15 574 622 ; C 58 ; WX 600 ; N colon ; B 238 -15 441 385 ; C 59 ; WX 600 ; N semicolon ; B 157 -112 441 385 ; C 60 ; WX 600 ; N less ; B 96 42 610 472 ; C 61 ; WX 600 ; N equal ; B 109 138 600 376 ; C 62 ; WX 600 ; N greater ; B 85 42 599 472 ; C 63 ; WX 600 ; N question ; B 222 -15 583 572 ; C 64 ; WX 600 ; N at ; B 127 -15 582 622 ; C 65 ; WX 600 ; N A ; B 3 0 607 562 ; C 66 ; WX 600 ; N B ; B 43 0 616 562 ; C 67 ; WX 600 ; N C ; B 93 -18 655 580 ; C 68 ; WX 600 ; N D ; B 43 0 645 562 ; C 69 ; WX 600 ; N E ; B 53 0 660 562 ; C 70 ; WX 600 ; N F ; B 53 0 660 562 ; C 71 ; WX 600 ; N G ; B 83 -18 645 580 ; C 72 ; WX 600 ; N H ; B 32 0 687 562 ; C 73 ; WX 600 ; N I ; B 96 0 623 562 ; C 74 ; WX 600 ; N J ; B 52 -18 685 562 ; C 75 ; WX 600 ; N K ; B 38 0 671 562 ; C 76 ; WX 600 ; N L ; B 47 0 607 562 ; C 77 ; WX 600 ; N M ; B 4 0 715 562 ; C 78 ; WX 600 ; N N ; B 7 -13 712 562 ; C 79 ; WX 600 ; N O ; B 94 -18 625 580 ; C 80 ; WX 600 ; N P ; B 79 0 644 562 ; C 81 ; WX 600 ; N Q ; B 95 -138 625 580 ; C 82 ; WX 600 ; N R ; B 38 0 598 562 ; C 83 ; WX 600 ; N S ; B 76 -20 650 580 ; C 84 ; WX 600 ; N T ; B 108 0 665 562 ; C 85 ; WX 600 ; N U ; B 125 -18 702 562 ; C 86 ; WX 600 ; N V ; B 105 -13 723 562 ; C 87 ; WX 600 ; N W ; B 106 -13 722 562 ; C 88 ; WX 600 ; N X ; B 23 0 675 562 ; C 89 ; WX 600 ; N Y ; B 133 0 695 562 ; C 90 ; WX 600 ; N Z ; B 86 0 610 562 ; C 91 ; WX 600 ; N bracketleft ; B 246 -108 574 622 ; C 92 ; WX 600 ; N backslash ; B 249 -80 468 629 ; C 93 ; WX 600 ; N bracketright ; B 135 -108 463 622 ; C 94 ; WX 600 ; N asciicircum ; B 175 354 587 622 ; C 95 ; WX 600 ; N underscore ; B -27 -125 584 -75 ; C 96 ; WX 600 ; N quoteleft ; B 343 328 457 562 ; C 97 ; WX 600 ; N a ; B 76 -15 569 441 ; C 98 ; WX 600 ; N b ; B 29 -15 625 629 ; C 99 ; WX 600 ; N c ; B 106 -15 608 441 ; C 100 ; WX 600 ; N d ; B 85 -15 640 629 ; C 101 ; WX 600 ; N e ; B 106 -15 598 441 ; C 102 ; WX 600 ; N f ; B 114 0 662 629 ; L i fi ; L l fl ; C 103 ; WX 600 ; N g ; B 61 -157 657 441 ; C 104 ; WX 600 ; N h ; B 33 0 592 629 ; C 105 ; WX 600 ; N i ; B 95 0 515 657 ; C 106 ; WX 600 ; N j ; B 52 -157 550 657 ; C 107 ; WX 600 ; N k ; B 58 0 633 629 ; C 108 ; WX 600 ; N l ; B 95 0 515 629 ; C 109 ; WX 600 ; N m ; B -5 0 615 441 ; C 110 ; WX 600 ; N n ; B 26 0 585 441 ; C 111 ; WX 600 ; N o ; B 102 -15 588 441 ; C 112 ; WX 600 ; N p ; B -24 -157 605 441 ; C 113 ; WX 600 ; N q ; B 85 -157 682 441 ; C 114 ; WX 600 ; N r ; B 60 0 636 441 ; C 115 ; WX 600 ; N s ; B 78 -15 584 441 ; C 116 ; WX 600 ; N t ; B 167 -15 561 561 ; C 117 ; WX 600 ; N u ; B 101 -15 572 426 ; C 118 ; WX 600 ; N v ; B 90 -10 681 426 ; C 119 ; WX 600 ; N w ; B 76 -10 695 426 ; C 120 ; WX 600 ; N x ; B 20 0 655 426 ; C 121 ; WX 600 ; N y ; B -4 -157 683 426 ; C 122 ; WX 600 ; N z ; B 99 0 593 426 ; C 123 ; WX 600 ; N braceleft ; B 233 -108 569 622 ; C 124 ; WX 600 ; N bar ; B 222 -250 485 750 ; C 125 ; WX 600 ; N braceright ; B 140 -108 477 622 ; C 126 ; WX 600 ; N asciitilde ; B 116 197 600 320 ; C 161 ; WX 600 ; N exclamdown ; B 225 -157 445 430 ; C 162 ; WX 600 ; N cent ; B 151 -49 588 614 ; C 163 ; WX 600 ; N sterling ; B 124 -21 621 611 ; C 164 ; WX 600 ; N fraction ; B 84 -57 646 665 ; C 165 ; WX 600 ; N yen ; B 120 0 693 562 ; C 166 ; WX 600 ; N florin ; B -26 -143 671 622 ; C 167 ; WX 600 ; N section ; B 104 -78 590 580 ; C 168 ; WX 600 ; N currency ; B 94 58 628 506 ; C 169 ; WX 600 ; N quotesingle ; B 345 328 460 562 ; C 170 ; WX 600 ; N quotedblleft ; B 262 328 541 562 ; C 171 ; WX 600 ; N guillemotleft ; B 92 70 652 446 ; C 172 ; WX 600 ; N guilsinglleft ; B 204 70 540 446 ; C 173 ; WX 600 ; N guilsinglright ; B 170 70 506 446 ; C 174 ; WX 600 ; N fi ; B 3 0 619 629 ; C 175 ; WX 600 ; N fl ; B 3 0 619 629 ; C 177 ; WX 600 ; N endash ; B 124 231 586 285 ; C 178 ; WX 600 ; N dagger ; B 217 -78 546 580 ; C 179 ; WX 600 ; N daggerdbl ; B 163 -78 546 580 ; C 180 ; WX 600 ; N periodcentered ; B 275 189 434 327 ; C 182 ; WX 600 ; N paragraph ; B 100 -78 630 562 ; C 183 ; WX 600 ; N bullet ; B 224 130 485 383 ; C 184 ; WX 600 ; N quotesinglbase ; B 185 -134 397 100 ; C 185 ; WX 600 ; N quotedblbase ; B 115 -134 478 100 ; C 186 ; WX 600 ; N quotedblright ; B 213 328 576 562 ; C 187 ; WX 600 ; N guillemotright ; B 58 70 618 446 ; C 188 ; WX 600 ; N ellipsis ; B 46 -15 575 111 ; C 189 ; WX 600 ; N perthousand ; B 59 -15 627 622 ; C 191 ; WX 600 ; N questiondown ; B 105 -157 466 430 ; C 193 ; WX 600 ; N grave ; B 294 497 484 672 ; C 194 ; WX 600 ; N acute ; B 348 497 612 672 ; C 195 ; WX 600 ; N circumflex ; B 229 477 581 654 ; C 196 ; WX 600 ; N tilde ; B 212 489 629 606 ; C 197 ; WX 600 ; N macron ; B 232 525 600 565 ; C 198 ; WX 600 ; N breve ; B 279 501 576 609 ; C 199 ; WX 600 ; N dotaccent ; B 373 537 478 640 ; C 200 ; WX 600 ; N dieresis ; B 272 537 579 640 ; C 202 ; WX 600 ; N ring ; B 332 463 500 627 ; C 203 ; WX 600 ; N cedilla ; B 197 -151 344 10 ; C 205 ; WX 600 ; N hungarumlaut ; B 239 497 683 672 ; C 206 ; WX 600 ; N ogonek ; B 189 -172 377 4 ; C 207 ; WX 600 ; N caron ; B 262 492 614 669 ; C 208 ; WX 600 ; N emdash ; B 49 231 661 285 ; C 225 ; WX 600 ; N AE ; B 3 0 655 562 ; C 227 ; WX 600 ; N ordfeminine ; B 209 249 512 580 ; C 232 ; WX 600 ; N Lslash ; B 47 0 607 562 ; C 233 ; WX 600 ; N Oslash ; B 94 -80 625 629 ; C 234 ; WX 600 ; N OE ; B 59 0 672 562 ; C 235 ; WX 600 ; N ordmasculine ; B 210 249 535 580 ; C 241 ; WX 600 ; N ae ; B 41 -15 626 441 ; C 245 ; WX 600 ; N dotlessi ; B 95 0 515 426 ; C 248 ; WX 600 ; N lslash ; B 95 0 587 629 ; C 249 ; WX 600 ; N oslash ; B 102 -80 588 506 ; C 250 ; WX 600 ; N oe ; B 54 -15 615 441 ; C 251 ; WX 600 ; N germandbls ; B 48 -15 617 629 ; C -1 ; WX 600 ; N Idieresis ; B 96 0 623 753 ; C -1 ; WX 600 ; N eacute ; B 106 -15 612 672 ; C -1 ; WX 600 ; N abreve ; B 76 -15 576 609 ; C -1 ; WX 600 ; N uhungarumlaut ; B 101 -15 723 672 ; C -1 ; WX 600 ; N ecaron ; B 106 -15 614 669 ; C -1 ; WX 600 ; N Ydieresis ; B 133 0 695 753 ; C -1 ; WX 600 ; N divide ; B 136 48 573 467 ; C -1 ; WX 600 ; N Yacute ; B 133 0 695 805 ; C -1 ; WX 600 ; N Acircumflex ; B 3 0 607 787 ; C -1 ; WX 600 ; N aacute ; B 76 -15 612 672 ; C -1 ; WX 600 ; N Ucircumflex ; B 125 -18 702 787 ; C -1 ; WX 600 ; N yacute ; B -4 -157 683 672 ; C -1 ; WX 600 ; N scommaaccent ; B 78 -250 584 441 ; C -1 ; WX 600 ; N ecircumflex ; B 106 -15 598 654 ; C -1 ; WX 600 ; N Uring ; B 125 -18 702 760 ; C -1 ; WX 600 ; N Udieresis ; B 125 -18 702 753 ; C -1 ; WX 600 ; N aogonek ; B 76 -172 569 441 ; C -1 ; WX 600 ; N Uacute ; B 125 -18 702 805 ; C -1 ; WX 600 ; N uogonek ; B 101 -172 572 426 ; C -1 ; WX 600 ; N Edieresis ; B 53 0 660 753 ; C -1 ; WX 600 ; N Dcroat ; B 43 0 645 562 ; C -1 ; WX 600 ; N commaaccent ; B 145 -250 323 -58 ; C -1 ; WX 600 ; N copyright ; B 53 -18 667 580 ; C -1 ; WX 600 ; N Emacron ; B 53 0 660 698 ; C -1 ; WX 600 ; N ccaron ; B 106 -15 614 669 ; C -1 ; WX 600 ; N aring ; B 76 -15 569 627 ; C -1 ; WX 600 ; N Ncommaaccent ; B 7 -250 712 562 ; C -1 ; WX 600 ; N lacute ; B 95 0 640 805 ; C -1 ; WX 600 ; N agrave ; B 76 -15 569 672 ; C -1 ; WX 600 ; N Tcommaaccent ; B 108 -250 665 562 ; C -1 ; WX 600 ; N Cacute ; B 93 -18 655 805 ; C -1 ; WX 600 ; N atilde ; B 76 -15 629 606 ; C -1 ; WX 600 ; N Edotaccent ; B 53 0 660 753 ; C -1 ; WX 600 ; N scaron ; B 78 -15 614 669 ; C -1 ; WX 600 ; N scedilla ; B 78 -151 584 441 ; C -1 ; WX 600 ; N iacute ; B 95 0 612 672 ; C -1 ; WX 600 ; N lozenge ; B 94 0 519 706 ; C -1 ; WX 600 ; N Rcaron ; B 38 0 642 802 ; C -1 ; WX 600 ; N Gcommaaccent ; B 83 -250 645 580 ; C -1 ; WX 600 ; N ucircumflex ; B 101 -15 572 654 ; C -1 ; WX 600 ; N acircumflex ; B 76 -15 581 654 ; C -1 ; WX 600 ; N Amacron ; B 3 0 607 698 ; C -1 ; WX 600 ; N rcaron ; B 60 0 636 669 ; C -1 ; WX 600 ; N ccedilla ; B 106 -151 614 441 ; C -1 ; WX 600 ; N Zdotaccent ; B 86 0 610 753 ; C -1 ; WX 600 ; N Thorn ; B 79 0 606 562 ; C -1 ; WX 600 ; N Omacron ; B 94 -18 628 698 ; C -1 ; WX 600 ; N Racute ; B 38 0 670 805 ; C -1 ; WX 600 ; N Sacute ; B 76 -20 650 805 ; C -1 ; WX 600 ; N dcaron ; B 85 -15 849 629 ; C -1 ; WX 600 ; N Umacron ; B 125 -18 702 698 ; C -1 ; WX 600 ; N uring ; B 101 -15 572 627 ; C -1 ; WX 600 ; N threesuperior ; B 213 240 501 622 ; C -1 ; WX 600 ; N Ograve ; B 94 -18 625 805 ; C -1 ; WX 600 ; N Agrave ; B 3 0 607 805 ; C -1 ; WX 600 ; N Abreve ; B 3 0 607 732 ; C -1 ; WX 600 ; N multiply ; B 103 43 607 470 ; C -1 ; WX 600 ; N uacute ; B 101 -15 602 672 ; C -1 ; WX 600 ; N Tcaron ; B 108 0 665 802 ; C -1 ; WX 600 ; N partialdiff ; B 45 -38 546 710 ; C -1 ; WX 600 ; N ydieresis ; B -4 -157 683 620 ; C -1 ; WX 600 ; N Nacute ; B 7 -13 712 805 ; C -1 ; WX 600 ; N icircumflex ; B 95 0 551 654 ; C -1 ; WX 600 ; N Ecircumflex ; B 53 0 660 787 ; C -1 ; WX 600 ; N adieresis ; B 76 -15 575 620 ; C -1 ; WX 600 ; N edieresis ; B 106 -15 598 620 ; C -1 ; WX 600 ; N cacute ; B 106 -15 612 672 ; C -1 ; WX 600 ; N nacute ; B 26 0 602 672 ; C -1 ; WX 600 ; N umacron ; B 101 -15 600 565 ; C -1 ; WX 600 ; N Ncaron ; B 7 -13 712 802 ; C -1 ; WX 600 ; N Iacute ; B 96 0 640 805 ; C -1 ; WX 600 ; N plusminus ; B 96 44 594 558 ; C -1 ; WX 600 ; N brokenbar ; B 238 -175 469 675 ; C -1 ; WX 600 ; N registered ; B 53 -18 667 580 ; C -1 ; WX 600 ; N Gbreve ; B 83 -18 645 732 ; C -1 ; WX 600 ; N Idotaccent ; B 96 0 623 753 ; C -1 ; WX 600 ; N summation ; B 15 -10 670 706 ; C -1 ; WX 600 ; N Egrave ; B 53 0 660 805 ; C -1 ; WX 600 ; N racute ; B 60 0 636 672 ; C -1 ; WX 600 ; N omacron ; B 102 -15 600 565 ; C -1 ; WX 600 ; N Zacute ; B 86 0 670 805 ; C -1 ; WX 600 ; N Zcaron ; B 86 0 642 802 ; C -1 ; WX 600 ; N greaterequal ; B 98 0 594 710 ; C -1 ; WX 600 ; N Eth ; B 43 0 645 562 ; C -1 ; WX 600 ; N Ccedilla ; B 93 -151 658 580 ; C -1 ; WX 600 ; N lcommaaccent ; B 95 -250 515 629 ; C -1 ; WX 600 ; N tcaron ; B 167 -15 587 717 ; C -1 ; WX 600 ; N eogonek ; B 106 -172 598 441 ; C -1 ; WX 600 ; N Uogonek ; B 124 -172 702 562 ; C -1 ; WX 600 ; N Aacute ; B 3 0 660 805 ; C -1 ; WX 600 ; N Adieresis ; B 3 0 607 753 ; C -1 ; WX 600 ; N egrave ; B 106 -15 598 672 ; C -1 ; WX 600 ; N zacute ; B 99 0 612 672 ; C -1 ; WX 600 ; N iogonek ; B 95 -172 515 657 ; C -1 ; WX 600 ; N Oacute ; B 94 -18 640 805 ; C -1 ; WX 600 ; N oacute ; B 102 -15 612 672 ; C -1 ; WX 600 ; N amacron ; B 76 -15 600 565 ; C -1 ; WX 600 ; N sacute ; B 78 -15 612 672 ; C -1 ; WX 600 ; N idieresis ; B 95 0 545 620 ; C -1 ; WX 600 ; N Ocircumflex ; B 94 -18 625 787 ; C -1 ; WX 600 ; N Ugrave ; B 125 -18 702 805 ; C -1 ; WX 600 ; N Delta ; B 6 0 598 688 ; C -1 ; WX 600 ; N thorn ; B -24 -157 605 629 ; C -1 ; WX 600 ; N twosuperior ; B 230 249 535 622 ; C -1 ; WX 600 ; N Odieresis ; B 94 -18 625 753 ; C -1 ; WX 600 ; N mu ; B 72 -157 572 426 ; C -1 ; WX 600 ; N igrave ; B 95 0 515 672 ; C -1 ; WX 600 ; N ohungarumlaut ; B 102 -15 723 672 ; C -1 ; WX 600 ; N Eogonek ; B 53 -172 660 562 ; C -1 ; WX 600 ; N dcroat ; B 85 -15 704 629 ; C -1 ; WX 600 ; N threequarters ; B 73 -56 659 666 ; C -1 ; WX 600 ; N Scedilla ; B 76 -151 650 580 ; C -1 ; WX 600 ; N lcaron ; B 95 0 667 629 ; C -1 ; WX 600 ; N Kcommaaccent ; B 38 -250 671 562 ; C -1 ; WX 600 ; N Lacute ; B 47 0 607 805 ; C -1 ; WX 600 ; N trademark ; B 75 263 742 562 ; C -1 ; WX 600 ; N edotaccent ; B 106 -15 598 620 ; C -1 ; WX 600 ; N Igrave ; B 96 0 623 805 ; C -1 ; WX 600 ; N Imacron ; B 96 0 628 698 ; C -1 ; WX 600 ; N Lcaron ; B 47 0 632 562 ; C -1 ; WX 600 ; N onehalf ; B 65 -57 669 665 ; C -1 ; WX 600 ; N lessequal ; B 98 0 645 710 ; C -1 ; WX 600 ; N ocircumflex ; B 102 -15 588 654 ; C -1 ; WX 600 ; N ntilde ; B 26 0 629 606 ; C -1 ; WX 600 ; N Uhungarumlaut ; B 125 -18 761 805 ; C -1 ; WX 600 ; N Eacute ; B 53 0 670 805 ; C -1 ; WX 600 ; N emacron ; B 106 -15 600 565 ; C -1 ; WX 600 ; N gbreve ; B 61 -157 657 609 ; C -1 ; WX 600 ; N onequarter ; B 65 -57 674 665 ; C -1 ; WX 600 ; N Scaron ; B 76 -20 672 802 ; C -1 ; WX 600 ; N Scommaaccent ; B 76 -250 650 580 ; C -1 ; WX 600 ; N Ohungarumlaut ; B 94 -18 751 805 ; C -1 ; WX 600 ; N degree ; B 214 269 576 622 ; C -1 ; WX 600 ; N ograve ; B 102 -15 588 672 ; C -1 ; WX 600 ; N Ccaron ; B 93 -18 672 802 ; C -1 ; WX 600 ; N ugrave ; B 101 -15 572 672 ; C -1 ; WX 600 ; N radical ; B 85 -15 765 792 ; C -1 ; WX 600 ; N Dcaron ; B 43 0 645 802 ; C -1 ; WX 600 ; N rcommaaccent ; B 60 -250 636 441 ; C -1 ; WX 600 ; N Ntilde ; B 7 -13 712 729 ; C -1 ; WX 600 ; N otilde ; B 102 -15 629 606 ; C -1 ; WX 600 ; N Rcommaaccent ; B 38 -250 598 562 ; C -1 ; WX 600 ; N Lcommaaccent ; B 47 -250 607 562 ; C -1 ; WX 600 ; N Atilde ; B 3 0 655 729 ; C -1 ; WX 600 ; N Aogonek ; B 3 -172 607 562 ; C -1 ; WX 600 ; N Aring ; B 3 0 607 750 ; C -1 ; WX 600 ; N Otilde ; B 94 -18 655 729 ; C -1 ; WX 600 ; N zdotaccent ; B 99 0 593 620 ; C -1 ; WX 600 ; N Ecaron ; B 53 0 660 802 ; C -1 ; WX 600 ; N Iogonek ; B 96 -172 623 562 ; C -1 ; WX 600 ; N kcommaaccent ; B 58 -250 633 629 ; C -1 ; WX 600 ; N minus ; B 129 232 580 283 ; C -1 ; WX 600 ; N Icircumflex ; B 96 0 623 787 ; C -1 ; WX 600 ; N ncaron ; B 26 0 614 669 ; C -1 ; WX 600 ; N tcommaaccent ; B 165 -250 561 561 ; C -1 ; WX 600 ; N logicalnot ; B 155 108 591 369 ; C -1 ; WX 600 ; N odieresis ; B 102 -15 588 620 ; C -1 ; WX 600 ; N udieresis ; B 101 -15 575 620 ; C -1 ; WX 600 ; N notequal ; B 43 -16 621 529 ; C -1 ; WX 600 ; N gcommaaccent ; B 61 -157 657 708 ; C -1 ; WX 600 ; N eth ; B 102 -15 639 629 ; C -1 ; WX 600 ; N zcaron ; B 99 0 624 669 ; C -1 ; WX 600 ; N ncommaaccent ; B 26 -250 585 441 ; C -1 ; WX 600 ; N onesuperior ; B 231 249 491 622 ; C -1 ; WX 600 ; N imacron ; B 95 0 543 565 ; C -1 ; WX 600 ; N Euro ; B 0 0 0 0 ; EndCharMetrics EndFontMetrics ruby-prawn-1.0.0~rc2.orig/data/fonts/Helvetica-BoldOblique.afm0000644000000000000000000020736512114176157022734 0ustar rootrootStartFontMetrics 4.1 Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved. Comment Creation Date: Thu May 1 12:45:12 1997 Comment UniqueID 43053 Comment VMusage 14482 68586 FontName Helvetica-BoldOblique FullName Helvetica Bold Oblique FamilyName Helvetica Weight Bold ItalicAngle -12 IsFixedPitch false CharacterSet ExtendedRoman FontBBox -174 -228 1114 962 UnderlinePosition -100 UnderlineThickness 50 Version 002.000 Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. EncodingScheme AdobeStandardEncoding CapHeight 718 XHeight 532 Ascender 718 Descender -207 StdHW 118 StdVW 140 StartCharMetrics 315 C 32 ; WX 278 ; N space ; B 0 0 0 0 ; C 33 ; WX 333 ; N exclam ; B 94 0 397 718 ; C 34 ; WX 474 ; N quotedbl ; B 193 447 529 718 ; C 35 ; WX 556 ; N numbersign ; B 60 0 644 698 ; C 36 ; WX 556 ; N dollar ; B 67 -115 622 775 ; C 37 ; WX 889 ; N percent ; B 136 -19 901 710 ; C 38 ; WX 722 ; N ampersand ; B 89 -19 732 718 ; C 39 ; WX 278 ; N quoteright ; B 167 445 362 718 ; C 40 ; WX 333 ; N parenleft ; B 76 -208 470 734 ; C 41 ; WX 333 ; N parenright ; B -25 -208 369 734 ; C 42 ; WX 389 ; N asterisk ; B 146 387 481 718 ; C 43 ; WX 584 ; N plus ; B 82 0 610 506 ; C 44 ; WX 278 ; N comma ; B 28 -168 245 146 ; C 45 ; WX 333 ; N hyphen ; B 73 215 379 345 ; C 46 ; WX 278 ; N period ; B 64 0 245 146 ; C 47 ; WX 278 ; N slash ; B -37 -19 468 737 ; C 48 ; WX 556 ; N zero ; B 86 -19 617 710 ; C 49 ; WX 556 ; N one ; B 173 0 529 710 ; C 50 ; WX 556 ; N two ; B 26 0 619 710 ; C 51 ; WX 556 ; N three ; B 65 -19 608 710 ; C 52 ; WX 556 ; N four ; B 60 0 598 710 ; C 53 ; WX 556 ; N five ; B 64 -19 636 698 ; C 54 ; WX 556 ; N six ; B 85 -19 619 710 ; C 55 ; WX 556 ; N seven ; B 125 0 676 698 ; C 56 ; WX 556 ; N eight ; B 69 -19 616 710 ; C 57 ; WX 556 ; N nine ; B 78 -19 615 710 ; C 58 ; WX 333 ; N colon ; B 92 0 351 512 ; C 59 ; WX 333 ; N semicolon ; B 56 -168 351 512 ; C 60 ; WX 584 ; N less ; B 82 -8 655 514 ; C 61 ; WX 584 ; N equal ; B 58 87 633 419 ; C 62 ; WX 584 ; N greater ; B 36 -8 609 514 ; C 63 ; WX 611 ; N question ; B 165 0 671 727 ; C 64 ; WX 975 ; N at ; B 186 -19 954 737 ; C 65 ; WX 722 ; N A ; B 20 0 702 718 ; C 66 ; WX 722 ; N B ; B 76 0 764 718 ; C 67 ; WX 722 ; N C ; B 107 -19 789 737 ; C 68 ; WX 722 ; N D ; B 76 0 777 718 ; C 69 ; WX 667 ; N E ; B 76 0 757 718 ; C 70 ; WX 611 ; N F ; B 76 0 740 718 ; C 71 ; WX 778 ; N G ; B 108 -19 817 737 ; C 72 ; WX 722 ; N H ; B 71 0 804 718 ; C 73 ; WX 278 ; N I ; B 64 0 367 718 ; C 74 ; WX 556 ; N J ; B 60 -18 637 718 ; C 75 ; WX 722 ; N K ; B 87 0 858 718 ; C 76 ; WX 611 ; N L ; B 76 0 611 718 ; C 77 ; WX 833 ; N M ; B 69 0 918 718 ; C 78 ; WX 722 ; N N ; B 69 0 807 718 ; C 79 ; WX 778 ; N O ; B 107 -19 823 737 ; C 80 ; WX 667 ; N P ; B 76 0 738 718 ; C 81 ; WX 778 ; N Q ; B 107 -52 823 737 ; C 82 ; WX 722 ; N R ; B 76 0 778 718 ; C 83 ; WX 667 ; N S ; B 81 -19 718 737 ; C 84 ; WX 611 ; N T ; B 140 0 751 718 ; C 85 ; WX 722 ; N U ; B 116 -19 804 718 ; C 86 ; WX 667 ; N V ; B 172 0 801 718 ; C 87 ; WX 944 ; N W ; B 169 0 1082 718 ; C 88 ; WX 667 ; N X ; B 14 0 791 718 ; C 89 ; WX 667 ; N Y ; B 168 0 806 718 ; C 90 ; WX 611 ; N Z ; B 25 0 737 718 ; C 91 ; WX 333 ; N bracketleft ; B 21 -196 462 722 ; C 92 ; WX 278 ; N backslash ; B 124 -19 307 737 ; C 93 ; WX 333 ; N bracketright ; B -18 -196 423 722 ; C 94 ; WX 584 ; N asciicircum ; B 131 323 591 698 ; C 95 ; WX 556 ; N underscore ; B -27 -125 540 -75 ; C 96 ; WX 278 ; N quoteleft ; B 165 454 361 727 ; C 97 ; WX 556 ; N a ; B 55 -14 583 546 ; C 98 ; WX 611 ; N b ; B 61 -14 645 718 ; C 99 ; WX 556 ; N c ; B 79 -14 599 546 ; C 100 ; WX 611 ; N d ; B 82 -14 704 718 ; C 101 ; WX 556 ; N e ; B 70 -14 593 546 ; C 102 ; WX 333 ; N f ; B 87 0 469 727 ; L i fi ; L l fl ; C 103 ; WX 611 ; N g ; B 38 -217 666 546 ; C 104 ; WX 611 ; N h ; B 65 0 629 718 ; C 105 ; WX 278 ; N i ; B 69 0 363 725 ; C 106 ; WX 278 ; N j ; B -42 -214 363 725 ; C 107 ; WX 556 ; N k ; B 69 0 670 718 ; C 108 ; WX 278 ; N l ; B 69 0 362 718 ; C 109 ; WX 889 ; N m ; B 64 0 909 546 ; C 110 ; WX 611 ; N n ; B 65 0 629 546 ; C 111 ; WX 611 ; N o ; B 82 -14 643 546 ; C 112 ; WX 611 ; N p ; B 18 -207 645 546 ; C 113 ; WX 611 ; N q ; B 80 -207 665 546 ; C 114 ; WX 389 ; N r ; B 64 0 489 546 ; C 115 ; WX 556 ; N s ; B 63 -14 584 546 ; C 116 ; WX 333 ; N t ; B 100 -6 422 676 ; C 117 ; WX 611 ; N u ; B 98 -14 658 532 ; C 118 ; WX 556 ; N v ; B 126 0 656 532 ; C 119 ; WX 778 ; N w ; B 123 0 882 532 ; C 120 ; WX 556 ; N x ; B 15 0 648 532 ; C 121 ; WX 556 ; N y ; B 42 -214 652 532 ; C 122 ; WX 500 ; N z ; B 20 0 583 532 ; C 123 ; WX 389 ; N braceleft ; B 94 -196 518 722 ; C 124 ; WX 280 ; N bar ; B 36 -225 361 775 ; C 125 ; WX 389 ; N braceright ; B -18 -196 407 722 ; C 126 ; WX 584 ; N asciitilde ; B 115 163 577 343 ; C 161 ; WX 333 ; N exclamdown ; B 50 -186 353 532 ; C 162 ; WX 556 ; N cent ; B 79 -118 599 628 ; C 163 ; WX 556 ; N sterling ; B 50 -16 635 718 ; C 164 ; WX 167 ; N fraction ; B -174 -19 487 710 ; C 165 ; WX 556 ; N yen ; B 60 0 713 698 ; C 166 ; WX 556 ; N florin ; B -50 -210 669 737 ; C 167 ; WX 556 ; N section ; B 61 -184 598 727 ; C 168 ; WX 556 ; N currency ; B 27 76 680 636 ; C 169 ; WX 238 ; N quotesingle ; B 165 447 321 718 ; C 170 ; WX 500 ; N quotedblleft ; B 160 454 588 727 ; C 171 ; WX 556 ; N guillemotleft ; B 135 76 571 484 ; C 172 ; WX 333 ; N guilsinglleft ; B 130 76 353 484 ; C 173 ; WX 333 ; N guilsinglright ; B 99 76 322 484 ; C 174 ; WX 611 ; N fi ; B 87 0 696 727 ; C 175 ; WX 611 ; N fl ; B 87 0 695 727 ; C 177 ; WX 556 ; N endash ; B 48 227 627 333 ; C 178 ; WX 556 ; N dagger ; B 118 -171 626 718 ; C 179 ; WX 556 ; N daggerdbl ; B 46 -171 628 718 ; C 180 ; WX 278 ; N periodcentered ; B 110 172 276 334 ; C 182 ; WX 556 ; N paragraph ; B 98 -191 688 700 ; C 183 ; WX 350 ; N bullet ; B 83 194 420 524 ; C 184 ; WX 278 ; N quotesinglbase ; B 41 -146 236 127 ; C 185 ; WX 500 ; N quotedblbase ; B 36 -146 463 127 ; C 186 ; WX 500 ; N quotedblright ; B 162 445 589 718 ; C 187 ; WX 556 ; N guillemotright ; B 104 76 540 484 ; C 188 ; WX 1000 ; N ellipsis ; B 92 0 939 146 ; C 189 ; WX 1000 ; N perthousand ; B 76 -19 1038 710 ; C 191 ; WX 611 ; N questiondown ; B 53 -195 559 532 ; C 193 ; WX 333 ; N grave ; B 136 604 353 750 ; C 194 ; WX 333 ; N acute ; B 236 604 515 750 ; C 195 ; WX 333 ; N circumflex ; B 118 604 471 750 ; C 196 ; WX 333 ; N tilde ; B 113 610 507 737 ; C 197 ; WX 333 ; N macron ; B 122 604 483 678 ; C 198 ; WX 333 ; N breve ; B 156 604 494 750 ; C 199 ; WX 333 ; N dotaccent ; B 235 614 385 729 ; C 200 ; WX 333 ; N dieresis ; B 137 614 482 729 ; C 202 ; WX 333 ; N ring ; B 200 568 420 776 ; C 203 ; WX 333 ; N cedilla ; B -37 -228 220 0 ; C 205 ; WX 333 ; N hungarumlaut ; B 137 604 645 750 ; C 206 ; WX 333 ; N ogonek ; B 41 -228 264 0 ; C 207 ; WX 333 ; N caron ; B 149 604 502 750 ; C 208 ; WX 1000 ; N emdash ; B 48 227 1071 333 ; C 225 ; WX 1000 ; N AE ; B 5 0 1100 718 ; C 227 ; WX 370 ; N ordfeminine ; B 125 401 465 737 ; C 232 ; WX 611 ; N Lslash ; B 34 0 611 718 ; C 233 ; WX 778 ; N Oslash ; B 35 -27 894 745 ; C 234 ; WX 1000 ; N OE ; B 99 -19 1114 737 ; C 235 ; WX 365 ; N ordmasculine ; B 123 401 485 737 ; C 241 ; WX 889 ; N ae ; B 56 -14 923 546 ; C 245 ; WX 278 ; N dotlessi ; B 69 0 322 532 ; C 248 ; WX 278 ; N lslash ; B 40 0 407 718 ; C 249 ; WX 611 ; N oslash ; B 22 -29 701 560 ; C 250 ; WX 944 ; N oe ; B 82 -14 977 546 ; C 251 ; WX 611 ; N germandbls ; B 69 -14 657 731 ; C -1 ; WX 278 ; N Idieresis ; B 64 0 494 915 ; C -1 ; WX 556 ; N eacute ; B 70 -14 627 750 ; C -1 ; WX 556 ; N abreve ; B 55 -14 606 750 ; C -1 ; WX 611 ; N uhungarumlaut ; B 98 -14 784 750 ; C -1 ; WX 556 ; N ecaron ; B 70 -14 614 750 ; C -1 ; WX 667 ; N Ydieresis ; B 168 0 806 915 ; C -1 ; WX 584 ; N divide ; B 82 -42 610 548 ; C -1 ; WX 667 ; N Yacute ; B 168 0 806 936 ; C -1 ; WX 722 ; N Acircumflex ; B 20 0 706 936 ; C -1 ; WX 556 ; N aacute ; B 55 -14 627 750 ; C -1 ; WX 722 ; N Ucircumflex ; B 116 -19 804 936 ; C -1 ; WX 556 ; N yacute ; B 42 -214 652 750 ; C -1 ; WX 556 ; N scommaaccent ; B 63 -228 584 546 ; C -1 ; WX 556 ; N ecircumflex ; B 70 -14 593 750 ; C -1 ; WX 722 ; N Uring ; B 116 -19 804 962 ; C -1 ; WX 722 ; N Udieresis ; B 116 -19 804 915 ; C -1 ; WX 556 ; N aogonek ; B 55 -224 583 546 ; C -1 ; WX 722 ; N Uacute ; B 116 -19 804 936 ; C -1 ; WX 611 ; N uogonek ; B 98 -228 658 532 ; C -1 ; WX 667 ; N Edieresis ; B 76 0 757 915 ; C -1 ; WX 722 ; N Dcroat ; B 62 0 777 718 ; C -1 ; WX 250 ; N commaaccent ; B 16 -228 188 -50 ; C -1 ; WX 737 ; N copyright ; B 56 -19 835 737 ; C -1 ; WX 667 ; N Emacron ; B 76 0 757 864 ; C -1 ; WX 556 ; N ccaron ; B 79 -14 614 750 ; C -1 ; WX 556 ; N aring ; B 55 -14 583 776 ; C -1 ; WX 722 ; N Ncommaaccent ; B 69 -228 807 718 ; C -1 ; WX 278 ; N lacute ; B 69 0 528 936 ; C -1 ; WX 556 ; N agrave ; B 55 -14 583 750 ; C -1 ; WX 611 ; N Tcommaaccent ; B 140 -228 751 718 ; C -1 ; WX 722 ; N Cacute ; B 107 -19 789 936 ; C -1 ; WX 556 ; N atilde ; B 55 -14 619 737 ; C -1 ; WX 667 ; N Edotaccent ; B 76 0 757 915 ; C -1 ; WX 556 ; N scaron ; B 63 -14 614 750 ; C -1 ; WX 556 ; N scedilla ; B 63 -228 584 546 ; C -1 ; WX 278 ; N iacute ; B 69 0 488 750 ; C -1 ; WX 494 ; N lozenge ; B 90 0 564 745 ; C -1 ; WX 722 ; N Rcaron ; B 76 0 778 936 ; C -1 ; WX 778 ; N Gcommaaccent ; B 108 -228 817 737 ; C -1 ; WX 611 ; N ucircumflex ; B 98 -14 658 750 ; C -1 ; WX 556 ; N acircumflex ; B 55 -14 583 750 ; C -1 ; WX 722 ; N Amacron ; B 20 0 718 864 ; C -1 ; WX 389 ; N rcaron ; B 64 0 530 750 ; C -1 ; WX 556 ; N ccedilla ; B 79 -228 599 546 ; C -1 ; WX 611 ; N Zdotaccent ; B 25 0 737 915 ; C -1 ; WX 667 ; N Thorn ; B 76 0 716 718 ; C -1 ; WX 778 ; N Omacron ; B 107 -19 823 864 ; C -1 ; WX 722 ; N Racute ; B 76 0 778 936 ; C -1 ; WX 667 ; N Sacute ; B 81 -19 722 936 ; C -1 ; WX 743 ; N dcaron ; B 82 -14 903 718 ; C -1 ; WX 722 ; N Umacron ; B 116 -19 804 864 ; C -1 ; WX 611 ; N uring ; B 98 -14 658 776 ; C -1 ; WX 333 ; N threesuperior ; B 91 271 441 710 ; C -1 ; WX 778 ; N Ograve ; B 107 -19 823 936 ; C -1 ; WX 722 ; N Agrave ; B 20 0 702 936 ; C -1 ; WX 722 ; N Abreve ; B 20 0 729 936 ; C -1 ; WX 584 ; N multiply ; B 57 1 635 505 ; C -1 ; WX 611 ; N uacute ; B 98 -14 658 750 ; C -1 ; WX 611 ; N Tcaron ; B 140 0 751 936 ; C -1 ; WX 494 ; N partialdiff ; B 43 -21 585 750 ; C -1 ; WX 556 ; N ydieresis ; B 42 -214 652 729 ; C -1 ; WX 722 ; N Nacute ; B 69 0 807 936 ; C -1 ; WX 278 ; N icircumflex ; B 69 0 444 750 ; C -1 ; WX 667 ; N Ecircumflex ; B 76 0 757 936 ; C -1 ; WX 556 ; N adieresis ; B 55 -14 594 729 ; C -1 ; WX 556 ; N edieresis ; B 70 -14 594 729 ; C -1 ; WX 556 ; N cacute ; B 79 -14 627 750 ; C -1 ; WX 611 ; N nacute ; B 65 0 654 750 ; C -1 ; WX 611 ; N umacron ; B 98 -14 658 678 ; C -1 ; WX 722 ; N Ncaron ; B 69 0 807 936 ; C -1 ; WX 278 ; N Iacute ; B 64 0 528 936 ; C -1 ; WX 584 ; N plusminus ; B 40 0 625 506 ; C -1 ; WX 280 ; N brokenbar ; B 52 -150 345 700 ; C -1 ; WX 737 ; N registered ; B 55 -19 834 737 ; C -1 ; WX 778 ; N Gbreve ; B 108 -19 817 936 ; C -1 ; WX 278 ; N Idotaccent ; B 64 0 397 915 ; C -1 ; WX 600 ; N summation ; B 14 -10 670 706 ; C -1 ; WX 667 ; N Egrave ; B 76 0 757 936 ; C -1 ; WX 389 ; N racute ; B 64 0 543 750 ; C -1 ; WX 611 ; N omacron ; B 82 -14 643 678 ; C -1 ; WX 611 ; N Zacute ; B 25 0 737 936 ; C -1 ; WX 611 ; N Zcaron ; B 25 0 737 936 ; C -1 ; WX 549 ; N greaterequal ; B 26 0 629 704 ; C -1 ; WX 722 ; N Eth ; B 62 0 777 718 ; C -1 ; WX 722 ; N Ccedilla ; B 107 -228 789 737 ; C -1 ; WX 278 ; N lcommaaccent ; B 30 -228 362 718 ; C -1 ; WX 389 ; N tcaron ; B 100 -6 608 878 ; C -1 ; WX 556 ; N eogonek ; B 70 -228 593 546 ; C -1 ; WX 722 ; N Uogonek ; B 116 -228 804 718 ; C -1 ; WX 722 ; N Aacute ; B 20 0 750 936 ; C -1 ; WX 722 ; N Adieresis ; B 20 0 716 915 ; C -1 ; WX 556 ; N egrave ; B 70 -14 593 750 ; C -1 ; WX 500 ; N zacute ; B 20 0 599 750 ; C -1 ; WX 278 ; N iogonek ; B -14 -224 363 725 ; C -1 ; WX 778 ; N Oacute ; B 107 -19 823 936 ; C -1 ; WX 611 ; N oacute ; B 82 -14 654 750 ; C -1 ; WX 556 ; N amacron ; B 55 -14 595 678 ; C -1 ; WX 556 ; N sacute ; B 63 -14 627 750 ; C -1 ; WX 278 ; N idieresis ; B 69 0 455 729 ; C -1 ; WX 778 ; N Ocircumflex ; B 107 -19 823 936 ; C -1 ; WX 722 ; N Ugrave ; B 116 -19 804 936 ; C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; C -1 ; WX 611 ; N thorn ; B 18 -208 645 718 ; C -1 ; WX 333 ; N twosuperior ; B 69 283 449 710 ; C -1 ; WX 778 ; N Odieresis ; B 107 -19 823 915 ; C -1 ; WX 611 ; N mu ; B 22 -207 658 532 ; C -1 ; WX 278 ; N igrave ; B 69 0 326 750 ; C -1 ; WX 611 ; N ohungarumlaut ; B 82 -14 784 750 ; C -1 ; WX 667 ; N Eogonek ; B 76 -224 757 718 ; C -1 ; WX 611 ; N dcroat ; B 82 -14 789 718 ; C -1 ; WX 834 ; N threequarters ; B 99 -19 839 710 ; C -1 ; WX 667 ; N Scedilla ; B 81 -228 718 737 ; C -1 ; WX 400 ; N lcaron ; B 69 0 561 718 ; C -1 ; WX 722 ; N Kcommaaccent ; B 87 -228 858 718 ; C -1 ; WX 611 ; N Lacute ; B 76 0 611 936 ; C -1 ; WX 1000 ; N trademark ; B 179 306 1109 718 ; C -1 ; WX 556 ; N edotaccent ; B 70 -14 593 729 ; C -1 ; WX 278 ; N Igrave ; B 64 0 367 936 ; C -1 ; WX 278 ; N Imacron ; B 64 0 496 864 ; C -1 ; WX 611 ; N Lcaron ; B 76 0 643 718 ; C -1 ; WX 834 ; N onehalf ; B 132 -19 858 710 ; C -1 ; WX 549 ; N lessequal ; B 29 0 676 704 ; C -1 ; WX 611 ; N ocircumflex ; B 82 -14 643 750 ; C -1 ; WX 611 ; N ntilde ; B 65 0 646 737 ; C -1 ; WX 722 ; N Uhungarumlaut ; B 116 -19 880 936 ; C -1 ; WX 667 ; N Eacute ; B 76 0 757 936 ; C -1 ; WX 556 ; N emacron ; B 70 -14 595 678 ; C -1 ; WX 611 ; N gbreve ; B 38 -217 666 750 ; C -1 ; WX 834 ; N onequarter ; B 132 -19 806 710 ; C -1 ; WX 667 ; N Scaron ; B 81 -19 718 936 ; C -1 ; WX 667 ; N Scommaaccent ; B 81 -228 718 737 ; C -1 ; WX 778 ; N Ohungarumlaut ; B 107 -19 908 936 ; C -1 ; WX 400 ; N degree ; B 175 426 467 712 ; C -1 ; WX 611 ; N ograve ; B 82 -14 643 750 ; C -1 ; WX 722 ; N Ccaron ; B 107 -19 789 936 ; C -1 ; WX 611 ; N ugrave ; B 98 -14 658 750 ; C -1 ; WX 549 ; N radical ; B 112 -46 689 850 ; C -1 ; WX 722 ; N Dcaron ; B 76 0 777 936 ; C -1 ; WX 389 ; N rcommaaccent ; B 26 -228 489 546 ; C -1 ; WX 722 ; N Ntilde ; B 69 0 807 923 ; C -1 ; WX 611 ; N otilde ; B 82 -14 646 737 ; C -1 ; WX 722 ; N Rcommaaccent ; B 76 -228 778 718 ; C -1 ; WX 611 ; N Lcommaaccent ; B 76 -228 611 718 ; C -1 ; WX 722 ; N Atilde ; B 20 0 741 923 ; C -1 ; WX 722 ; N Aogonek ; B 20 -224 702 718 ; C -1 ; WX 722 ; N Aring ; B 20 0 702 962 ; C -1 ; WX 778 ; N Otilde ; B 107 -19 823 923 ; C -1 ; WX 500 ; N zdotaccent ; B 20 0 583 729 ; C -1 ; WX 667 ; N Ecaron ; B 76 0 757 936 ; C -1 ; WX 278 ; N Iogonek ; B -41 -228 367 718 ; C -1 ; WX 556 ; N kcommaaccent ; B 69 -228 670 718 ; C -1 ; WX 584 ; N minus ; B 82 197 610 309 ; C -1 ; WX 278 ; N Icircumflex ; B 64 0 484 936 ; C -1 ; WX 611 ; N ncaron ; B 65 0 641 750 ; C -1 ; WX 333 ; N tcommaaccent ; B 58 -228 422 676 ; C -1 ; WX 584 ; N logicalnot ; B 105 108 633 419 ; C -1 ; WX 611 ; N odieresis ; B 82 -14 643 729 ; C -1 ; WX 611 ; N udieresis ; B 98 -14 658 729 ; C -1 ; WX 549 ; N notequal ; B 32 -49 630 570 ; C -1 ; WX 611 ; N gcommaaccent ; B 38 -217 666 850 ; C -1 ; WX 611 ; N eth ; B 82 -14 670 737 ; C -1 ; WX 500 ; N zcaron ; B 20 0 586 750 ; C -1 ; WX 611 ; N ncommaaccent ; B 65 -228 629 546 ; C -1 ; WX 333 ; N onesuperior ; B 148 283 388 710 ; C -1 ; WX 278 ; N imacron ; B 69 0 429 678 ; C -1 ; WX 556 ; N Euro ; B 0 0 0 0 ; EndCharMetrics StartKernData StartKernPairs 2481 KPX A C -40 KPX A Cacute -40 KPX A Ccaron -40 KPX A Ccedilla -40 KPX A G -50 KPX A Gbreve -50 KPX A Gcommaaccent -50 KPX A O -40 KPX A Oacute -40 KPX A Ocircumflex -40 KPX A Odieresis -40 KPX A Ograve -40 KPX A Ohungarumlaut -40 KPX A Omacron -40 KPX A Oslash -40 KPX A Otilde -40 KPX A Q -40 KPX A T -90 KPX A Tcaron -90 KPX A Tcommaaccent -90 KPX A U -50 KPX A Uacute -50 KPX A Ucircumflex -50 KPX A Udieresis -50 KPX A Ugrave -50 KPX A Uhungarumlaut -50 KPX A Umacron -50 KPX A Uogonek -50 KPX A Uring -50 KPX A V -80 KPX A W -60 KPX A Y -110 KPX A Yacute -110 KPX A Ydieresis -110 KPX A u -30 KPX A uacute -30 KPX A ucircumflex -30 KPX A udieresis -30 KPX A ugrave -30 KPX A uhungarumlaut -30 KPX A umacron -30 KPX A uogonek -30 KPX A uring -30 KPX A v -40 KPX A w -30 KPX A y -30 KPX A yacute -30 KPX A ydieresis -30 KPX Aacute C -40 KPX Aacute Cacute -40 KPX Aacute Ccaron -40 KPX Aacute Ccedilla -40 KPX Aacute G -50 KPX Aacute Gbreve -50 KPX Aacute Gcommaaccent -50 KPX Aacute O -40 KPX Aacute Oacute -40 KPX Aacute Ocircumflex -40 KPX Aacute Odieresis -40 KPX Aacute Ograve -40 KPX Aacute Ohungarumlaut -40 KPX Aacute Omacron -40 KPX Aacute Oslash -40 KPX Aacute Otilde -40 KPX Aacute Q -40 KPX Aacute T -90 KPX Aacute Tcaron -90 KPX Aacute Tcommaaccent -90 KPX Aacute U -50 KPX Aacute Uacute -50 KPX Aacute Ucircumflex -50 KPX Aacute Udieresis -50 KPX Aacute Ugrave -50 KPX Aacute Uhungarumlaut -50 KPX Aacute Umacron -50 KPX Aacute Uogonek -50 KPX Aacute Uring -50 KPX Aacute V -80 KPX Aacute W -60 KPX Aacute Y -110 KPX Aacute Yacute -110 KPX Aacute Ydieresis -110 KPX Aacute u -30 KPX Aacute uacute -30 KPX Aacute ucircumflex -30 KPX Aacute udieresis -30 KPX Aacute ugrave -30 KPX Aacute uhungarumlaut -30 KPX Aacute umacron -30 KPX Aacute uogonek -30 KPX Aacute uring -30 KPX Aacute v -40 KPX Aacute w -30 KPX Aacute y -30 KPX Aacute yacute -30 KPX Aacute ydieresis -30 KPX Abreve C -40 KPX Abreve Cacute -40 KPX Abreve Ccaron -40 KPX Abreve Ccedilla -40 KPX Abreve G -50 KPX Abreve Gbreve -50 KPX Abreve Gcommaaccent -50 KPX Abreve O -40 KPX Abreve Oacute -40 KPX Abreve Ocircumflex -40 KPX Abreve Odieresis -40 KPX Abreve Ograve -40 KPX Abreve Ohungarumlaut -40 KPX Abreve Omacron -40 KPX Abreve Oslash -40 KPX Abreve Otilde -40 KPX Abreve Q -40 KPX Abreve T -90 KPX Abreve Tcaron -90 KPX Abreve Tcommaaccent -90 KPX Abreve U -50 KPX Abreve Uacute -50 KPX Abreve Ucircumflex -50 KPX Abreve Udieresis -50 KPX Abreve Ugrave -50 KPX Abreve Uhungarumlaut -50 KPX Abreve Umacron -50 KPX Abreve Uogonek -50 KPX Abreve Uring -50 KPX Abreve V -80 KPX Abreve W -60 KPX Abreve Y -110 KPX Abreve Yacute -110 KPX Abreve Ydieresis -110 KPX Abreve u -30 KPX Abreve uacute -30 KPX Abreve ucircumflex -30 KPX Abreve udieresis -30 KPX Abreve ugrave -30 KPX Abreve uhungarumlaut -30 KPX Abreve umacron -30 KPX Abreve uogonek -30 KPX Abreve uring -30 KPX Abreve v -40 KPX Abreve w -30 KPX Abreve y -30 KPX Abreve yacute -30 KPX Abreve ydieresis -30 KPX Acircumflex C -40 KPX Acircumflex Cacute -40 KPX Acircumflex Ccaron -40 KPX Acircumflex Ccedilla -40 KPX Acircumflex G -50 KPX Acircumflex Gbreve -50 KPX Acircumflex Gcommaaccent -50 KPX Acircumflex O -40 KPX Acircumflex Oacute -40 KPX Acircumflex Ocircumflex -40 KPX Acircumflex Odieresis -40 KPX Acircumflex Ograve -40 KPX Acircumflex Ohungarumlaut -40 KPX Acircumflex Omacron -40 KPX Acircumflex Oslash -40 KPX Acircumflex Otilde -40 KPX Acircumflex Q -40 KPX Acircumflex T -90 KPX Acircumflex Tcaron -90 KPX Acircumflex Tcommaaccent -90 KPX Acircumflex U -50 KPX Acircumflex Uacute -50 KPX Acircumflex Ucircumflex -50 KPX Acircumflex Udieresis -50 KPX Acircumflex Ugrave -50 KPX Acircumflex Uhungarumlaut -50 KPX Acircumflex Umacron -50 KPX Acircumflex Uogonek -50 KPX Acircumflex Uring -50 KPX Acircumflex V -80 KPX Acircumflex W -60 KPX Acircumflex Y -110 KPX Acircumflex Yacute -110 KPX Acircumflex Ydieresis -110 KPX Acircumflex u -30 KPX Acircumflex uacute -30 KPX Acircumflex ucircumflex -30 KPX Acircumflex udieresis -30 KPX Acircumflex ugrave -30 KPX Acircumflex uhungarumlaut -30 KPX Acircumflex umacron -30 KPX Acircumflex uogonek -30 KPX Acircumflex uring -30 KPX Acircumflex v -40 KPX Acircumflex w -30 KPX Acircumflex y -30 KPX Acircumflex yacute -30 KPX Acircumflex ydieresis -30 KPX Adieresis C -40 KPX Adieresis Cacute -40 KPX Adieresis Ccaron -40 KPX Adieresis Ccedilla -40 KPX Adieresis G -50 KPX Adieresis Gbreve -50 KPX Adieresis Gcommaaccent -50 KPX Adieresis O -40 KPX Adieresis Oacute -40 KPX Adieresis Ocircumflex -40 KPX Adieresis Odieresis -40 KPX Adieresis Ograve -40 KPX Adieresis Ohungarumlaut -40 KPX Adieresis Omacron -40 KPX Adieresis Oslash -40 KPX Adieresis Otilde -40 KPX Adieresis Q -40 KPX Adieresis T -90 KPX Adieresis Tcaron -90 KPX Adieresis Tcommaaccent -90 KPX Adieresis U -50 KPX Adieresis Uacute -50 KPX Adieresis Ucircumflex -50 KPX Adieresis Udieresis -50 KPX Adieresis Ugrave -50 KPX Adieresis Uhungarumlaut -50 KPX Adieresis Umacron -50 KPX Adieresis Uogonek -50 KPX Adieresis Uring -50 KPX Adieresis V -80 KPX Adieresis W -60 KPX Adieresis Y -110 KPX Adieresis Yacute -110 KPX Adieresis Ydieresis -110 KPX Adieresis u -30 KPX Adieresis uacute -30 KPX Adieresis ucircumflex -30 KPX Adieresis udieresis -30 KPX Adieresis ugrave -30 KPX Adieresis uhungarumlaut -30 KPX Adieresis umacron -30 KPX Adieresis uogonek -30 KPX Adieresis uring -30 KPX Adieresis v -40 KPX Adieresis w -30 KPX Adieresis y -30 KPX Adieresis yacute -30 KPX Adieresis ydieresis -30 KPX Agrave C -40 KPX Agrave Cacute -40 KPX Agrave Ccaron -40 KPX Agrave Ccedilla -40 KPX Agrave G -50 KPX Agrave Gbreve -50 KPX Agrave Gcommaaccent -50 KPX Agrave O -40 KPX Agrave Oacute -40 KPX Agrave Ocircumflex -40 KPX Agrave Odieresis -40 KPX Agrave Ograve -40 KPX Agrave Ohungarumlaut -40 KPX Agrave Omacron -40 KPX Agrave Oslash -40 KPX Agrave Otilde -40 KPX Agrave Q -40 KPX Agrave T -90 KPX Agrave Tcaron -90 KPX Agrave Tcommaaccent -90 KPX Agrave U -50 KPX Agrave Uacute -50 KPX Agrave Ucircumflex -50 KPX Agrave Udieresis -50 KPX Agrave Ugrave -50 KPX Agrave Uhungarumlaut -50 KPX Agrave Umacron -50 KPX Agrave Uogonek -50 KPX Agrave Uring -50 KPX Agrave V -80 KPX Agrave W -60 KPX Agrave Y -110 KPX Agrave Yacute -110 KPX Agrave Ydieresis -110 KPX Agrave u -30 KPX Agrave uacute -30 KPX Agrave ucircumflex -30 KPX Agrave udieresis -30 KPX Agrave ugrave -30 KPX Agrave uhungarumlaut -30 KPX Agrave umacron -30 KPX Agrave uogonek -30 KPX Agrave uring -30 KPX Agrave v -40 KPX Agrave w -30 KPX Agrave y -30 KPX Agrave yacute -30 KPX Agrave ydieresis -30 KPX Amacron C -40 KPX Amacron Cacute -40 KPX Amacron Ccaron -40 KPX Amacron Ccedilla -40 KPX Amacron G -50 KPX Amacron Gbreve -50 KPX Amacron Gcommaaccent -50 KPX Amacron O -40 KPX Amacron Oacute -40 KPX Amacron Ocircumflex -40 KPX Amacron Odieresis -40 KPX Amacron Ograve -40 KPX Amacron Ohungarumlaut -40 KPX Amacron Omacron -40 KPX Amacron Oslash -40 KPX Amacron Otilde -40 KPX Amacron Q -40 KPX Amacron T -90 KPX Amacron Tcaron -90 KPX Amacron Tcommaaccent -90 KPX Amacron U -50 KPX Amacron Uacute -50 KPX Amacron Ucircumflex -50 KPX Amacron Udieresis -50 KPX Amacron Ugrave -50 KPX Amacron Uhungarumlaut -50 KPX Amacron Umacron -50 KPX Amacron Uogonek -50 KPX Amacron Uring -50 KPX Amacron V -80 KPX Amacron W -60 KPX Amacron Y -110 KPX Amacron Yacute -110 KPX Amacron Ydieresis -110 KPX Amacron u -30 KPX Amacron uacute -30 KPX Amacron ucircumflex -30 KPX Amacron udieresis -30 KPX Amacron ugrave -30 KPX Amacron uhungarumlaut -30 KPX Amacron umacron -30 KPX Amacron uogonek -30 KPX Amacron uring -30 KPX Amacron v -40 KPX Amacron w -30 KPX Amacron y -30 KPX Amacron yacute -30 KPX Amacron ydieresis -30 KPX Aogonek C -40 KPX Aogonek Cacute -40 KPX Aogonek Ccaron -40 KPX Aogonek Ccedilla -40 KPX Aogonek G -50 KPX Aogonek Gbreve -50 KPX Aogonek Gcommaaccent -50 KPX Aogonek O -40 KPX Aogonek Oacute -40 KPX Aogonek Ocircumflex -40 KPX Aogonek Odieresis -40 KPX Aogonek Ograve -40 KPX Aogonek Ohungarumlaut -40 KPX Aogonek Omacron -40 KPX Aogonek Oslash -40 KPX Aogonek Otilde -40 KPX Aogonek Q -40 KPX Aogonek T -90 KPX Aogonek Tcaron -90 KPX Aogonek Tcommaaccent -90 KPX Aogonek U -50 KPX Aogonek Uacute -50 KPX Aogonek Ucircumflex -50 KPX Aogonek Udieresis -50 KPX Aogonek Ugrave -50 KPX Aogonek Uhungarumlaut -50 KPX Aogonek Umacron -50 KPX Aogonek Uogonek -50 KPX Aogonek Uring -50 KPX Aogonek V -80 KPX Aogonek W -60 KPX Aogonek Y -110 KPX Aogonek Yacute -110 KPX Aogonek Ydieresis -110 KPX Aogonek u -30 KPX Aogonek uacute -30 KPX Aogonek ucircumflex -30 KPX Aogonek udieresis -30 KPX Aogonek ugrave -30 KPX Aogonek uhungarumlaut -30 KPX Aogonek umacron -30 KPX Aogonek uogonek -30 KPX Aogonek uring -30 KPX Aogonek v -40 KPX Aogonek w -30 KPX Aogonek y -30 KPX Aogonek yacute -30 KPX Aogonek ydieresis -30 KPX Aring C -40 KPX Aring Cacute -40 KPX Aring Ccaron -40 KPX Aring Ccedilla -40 KPX Aring G -50 KPX Aring Gbreve -50 KPX Aring Gcommaaccent -50 KPX Aring O -40 KPX Aring Oacute -40 KPX Aring Ocircumflex -40 KPX Aring Odieresis -40 KPX Aring Ograve -40 KPX Aring Ohungarumlaut -40 KPX Aring Omacron -40 KPX Aring Oslash -40 KPX Aring Otilde -40 KPX Aring Q -40 KPX Aring T -90 KPX Aring Tcaron -90 KPX Aring Tcommaaccent -90 KPX Aring U -50 KPX Aring Uacute -50 KPX Aring Ucircumflex -50 KPX Aring Udieresis -50 KPX Aring Ugrave -50 KPX Aring Uhungarumlaut -50 KPX Aring Umacron -50 KPX Aring Uogonek -50 KPX Aring Uring -50 KPX Aring V -80 KPX Aring W -60 KPX Aring Y -110 KPX Aring Yacute -110 KPX Aring Ydieresis -110 KPX Aring u -30 KPX Aring uacute -30 KPX Aring ucircumflex -30 KPX Aring udieresis -30 KPX Aring ugrave -30 KPX Aring uhungarumlaut -30 KPX Aring umacron -30 KPX Aring uogonek -30 KPX Aring uring -30 KPX Aring v -40 KPX Aring w -30 KPX Aring y -30 KPX Aring yacute -30 KPX Aring ydieresis -30 KPX Atilde C -40 KPX Atilde Cacute -40 KPX Atilde Ccaron -40 KPX Atilde Ccedilla -40 KPX Atilde G -50 KPX Atilde Gbreve -50 KPX Atilde Gcommaaccent -50 KPX Atilde O -40 KPX Atilde Oacute -40 KPX Atilde Ocircumflex -40 KPX Atilde Odieresis -40 KPX Atilde Ograve -40 KPX Atilde Ohungarumlaut -40 KPX Atilde Omacron -40 KPX Atilde Oslash -40 KPX Atilde Otilde -40 KPX Atilde Q -40 KPX Atilde T -90 KPX Atilde Tcaron -90 KPX Atilde Tcommaaccent -90 KPX Atilde U -50 KPX Atilde Uacute -50 KPX Atilde Ucircumflex -50 KPX Atilde Udieresis -50 KPX Atilde Ugrave -50 KPX Atilde Uhungarumlaut -50 KPX Atilde Umacron -50 KPX Atilde Uogonek -50 KPX Atilde Uring -50 KPX Atilde V -80 KPX Atilde W -60 KPX Atilde Y -110 KPX Atilde Yacute -110 KPX Atilde Ydieresis -110 KPX Atilde u -30 KPX Atilde uacute -30 KPX Atilde ucircumflex -30 KPX Atilde udieresis -30 KPX Atilde ugrave -30 KPX Atilde uhungarumlaut -30 KPX Atilde umacron -30 KPX Atilde uogonek -30 KPX Atilde uring -30 KPX Atilde v -40 KPX Atilde w -30 KPX Atilde y -30 KPX Atilde yacute -30 KPX Atilde ydieresis -30 KPX B A -30 KPX B Aacute -30 KPX B Abreve -30 KPX B Acircumflex -30 KPX B Adieresis -30 KPX B Agrave -30 KPX B Amacron -30 KPX B Aogonek -30 KPX B Aring -30 KPX B Atilde -30 KPX B U -10 KPX B Uacute -10 KPX B Ucircumflex -10 KPX B Udieresis -10 KPX B Ugrave -10 KPX B Uhungarumlaut -10 KPX B Umacron -10 KPX B Uogonek -10 KPX B Uring -10 KPX D A -40 KPX D Aacute -40 KPX D Abreve -40 KPX D Acircumflex -40 KPX D Adieresis -40 KPX D Agrave -40 KPX D Amacron -40 KPX D Aogonek -40 KPX D Aring -40 KPX D Atilde -40 KPX D V -40 KPX D W -40 KPX D Y -70 KPX D Yacute -70 KPX D Ydieresis -70 KPX D comma -30 KPX D period -30 KPX Dcaron A -40 KPX Dcaron Aacute -40 KPX Dcaron Abreve -40 KPX Dcaron Acircumflex -40 KPX Dcaron Adieresis -40 KPX Dcaron Agrave -40 KPX Dcaron Amacron -40 KPX Dcaron Aogonek -40 KPX Dcaron Aring -40 KPX Dcaron Atilde -40 KPX Dcaron V -40 KPX Dcaron W -40 KPX Dcaron Y -70 KPX Dcaron Yacute -70 KPX Dcaron Ydieresis -70 KPX Dcaron comma -30 KPX Dcaron period -30 KPX Dcroat A -40 KPX Dcroat Aacute -40 KPX Dcroat Abreve -40 KPX Dcroat Acircumflex -40 KPX Dcroat Adieresis -40 KPX Dcroat Agrave -40 KPX Dcroat Amacron -40 KPX Dcroat Aogonek -40 KPX Dcroat Aring -40 KPX Dcroat Atilde -40 KPX Dcroat V -40 KPX Dcroat W -40 KPX Dcroat Y -70 KPX Dcroat Yacute -70 KPX Dcroat Ydieresis -70 KPX Dcroat comma -30 KPX Dcroat period -30 KPX F A -80 KPX F Aacute -80 KPX F Abreve -80 KPX F Acircumflex -80 KPX F Adieresis -80 KPX F Agrave -80 KPX F Amacron -80 KPX F Aogonek -80 KPX F Aring -80 KPX F Atilde -80 KPX F a -20 KPX F aacute -20 KPX F abreve -20 KPX F acircumflex -20 KPX F adieresis -20 KPX F agrave -20 KPX F amacron -20 KPX F aogonek -20 KPX F aring -20 KPX F atilde -20 KPX F comma -100 KPX F period -100 KPX J A -20 KPX J Aacute -20 KPX J Abreve -20 KPX J Acircumflex -20 KPX J Adieresis -20 KPX J Agrave -20 KPX J Amacron -20 KPX J Aogonek -20 KPX J Aring -20 KPX J Atilde -20 KPX J comma -20 KPX J period -20 KPX J u -20 KPX J uacute -20 KPX J ucircumflex -20 KPX J udieresis -20 KPX J ugrave -20 KPX J uhungarumlaut -20 KPX J umacron -20 KPX J uogonek -20 KPX J uring -20 KPX K O -30 KPX K Oacute -30 KPX K Ocircumflex -30 KPX K Odieresis -30 KPX K Ograve -30 KPX K Ohungarumlaut -30 KPX K Omacron -30 KPX K Oslash -30 KPX K Otilde -30 KPX K e -15 KPX K eacute -15 KPX K ecaron -15 KPX K ecircumflex -15 KPX K edieresis -15 KPX K edotaccent -15 KPX K egrave -15 KPX K emacron -15 KPX K eogonek -15 KPX K o -35 KPX K oacute -35 KPX K ocircumflex -35 KPX K odieresis -35 KPX K ograve -35 KPX K ohungarumlaut -35 KPX K omacron -35 KPX K oslash -35 KPX K otilde -35 KPX K u -30 KPX K uacute -30 KPX K ucircumflex -30 KPX K udieresis -30 KPX K ugrave -30 KPX K uhungarumlaut -30 KPX K umacron -30 KPX K uogonek -30 KPX K uring -30 KPX K y -40 KPX K yacute -40 KPX K ydieresis -40 KPX Kcommaaccent O -30 KPX Kcommaaccent Oacute -30 KPX Kcommaaccent Ocircumflex -30 KPX Kcommaaccent Odieresis -30 KPX Kcommaaccent Ograve -30 KPX Kcommaaccent Ohungarumlaut -30 KPX Kcommaaccent Omacron -30 KPX Kcommaaccent Oslash -30 KPX Kcommaaccent Otilde -30 KPX Kcommaaccent e -15 KPX Kcommaaccent eacute -15 KPX Kcommaaccent ecaron -15 KPX Kcommaaccent ecircumflex -15 KPX Kcommaaccent edieresis -15 KPX Kcommaaccent edotaccent -15 KPX Kcommaaccent egrave -15 KPX Kcommaaccent emacron -15 KPX Kcommaaccent eogonek -15 KPX Kcommaaccent o -35 KPX Kcommaaccent oacute -35 KPX Kcommaaccent ocircumflex -35 KPX Kcommaaccent odieresis -35 KPX Kcommaaccent ograve -35 KPX Kcommaaccent ohungarumlaut -35 KPX Kcommaaccent omacron -35 KPX Kcommaaccent oslash -35 KPX Kcommaaccent otilde -35 KPX Kcommaaccent u -30 KPX Kcommaaccent uacute -30 KPX Kcommaaccent ucircumflex -30 KPX Kcommaaccent udieresis -30 KPX Kcommaaccent ugrave -30 KPX Kcommaaccent uhungarumlaut -30 KPX Kcommaaccent umacron -30 KPX Kcommaaccent uogonek -30 KPX Kcommaaccent uring -30 KPX Kcommaaccent y -40 KPX Kcommaaccent yacute -40 KPX Kcommaaccent ydieresis -40 KPX L T -90 KPX L Tcaron -90 KPX L Tcommaaccent -90 KPX L V -110 KPX L W -80 KPX L Y -120 KPX L Yacute -120 KPX L Ydieresis -120 KPX L quotedblright -140 KPX L quoteright -140 KPX L y -30 KPX L yacute -30 KPX L ydieresis -30 KPX Lacute T -90 KPX Lacute Tcaron -90 KPX Lacute Tcommaaccent -90 KPX Lacute V -110 KPX Lacute W -80 KPX Lacute Y -120 KPX Lacute Yacute -120 KPX Lacute Ydieresis -120 KPX Lacute quotedblright -140 KPX Lacute quoteright -140 KPX Lacute y -30 KPX Lacute yacute -30 KPX Lacute ydieresis -30 KPX Lcommaaccent T -90 KPX Lcommaaccent Tcaron -90 KPX Lcommaaccent Tcommaaccent -90 KPX Lcommaaccent V -110 KPX Lcommaaccent W -80 KPX Lcommaaccent Y -120 KPX Lcommaaccent Yacute -120 KPX Lcommaaccent Ydieresis -120 KPX Lcommaaccent quotedblright -140 KPX Lcommaaccent quoteright -140 KPX Lcommaaccent y -30 KPX Lcommaaccent yacute -30 KPX Lcommaaccent ydieresis -30 KPX Lslash T -90 KPX Lslash Tcaron -90 KPX Lslash Tcommaaccent -90 KPX Lslash V -110 KPX Lslash W -80 KPX Lslash Y -120 KPX Lslash Yacute -120 KPX Lslash Ydieresis -120 KPX Lslash quotedblright -140 KPX Lslash quoteright -140 KPX Lslash y -30 KPX Lslash yacute -30 KPX Lslash ydieresis -30 KPX O A -50 KPX O Aacute -50 KPX O Abreve -50 KPX O Acircumflex -50 KPX O Adieresis -50 KPX O Agrave -50 KPX O Amacron -50 KPX O Aogonek -50 KPX O Aring -50 KPX O Atilde -50 KPX O T -40 KPX O Tcaron -40 KPX O Tcommaaccent -40 KPX O V -50 KPX O W -50 KPX O X -50 KPX O Y -70 KPX O Yacute -70 KPX O Ydieresis -70 KPX O comma -40 KPX O period -40 KPX Oacute A -50 KPX Oacute Aacute -50 KPX Oacute Abreve -50 KPX Oacute Acircumflex -50 KPX Oacute Adieresis -50 KPX Oacute Agrave -50 KPX Oacute Amacron -50 KPX Oacute Aogonek -50 KPX Oacute Aring -50 KPX Oacute Atilde -50 KPX Oacute T -40 KPX Oacute Tcaron -40 KPX Oacute Tcommaaccent -40 KPX Oacute V -50 KPX Oacute W -50 KPX Oacute X -50 KPX Oacute Y -70 KPX Oacute Yacute -70 KPX Oacute Ydieresis -70 KPX Oacute comma -40 KPX Oacute period -40 KPX Ocircumflex A -50 KPX Ocircumflex Aacute -50 KPX Ocircumflex Abreve -50 KPX Ocircumflex Acircumflex -50 KPX Ocircumflex Adieresis -50 KPX Ocircumflex Agrave -50 KPX Ocircumflex Amacron -50 KPX Ocircumflex Aogonek -50 KPX Ocircumflex Aring -50 KPX Ocircumflex Atilde -50 KPX Ocircumflex T -40 KPX Ocircumflex Tcaron -40 KPX Ocircumflex Tcommaaccent -40 KPX Ocircumflex V -50 KPX Ocircumflex W -50 KPX Ocircumflex X -50 KPX Ocircumflex Y -70 KPX Ocircumflex Yacute -70 KPX Ocircumflex Ydieresis -70 KPX Ocircumflex comma -40 KPX Ocircumflex period -40 KPX Odieresis A -50 KPX Odieresis Aacute -50 KPX Odieresis Abreve -50 KPX Odieresis Acircumflex -50 KPX Odieresis Adieresis -50 KPX Odieresis Agrave -50 KPX Odieresis Amacron -50 KPX Odieresis Aogonek -50 KPX Odieresis Aring -50 KPX Odieresis Atilde -50 KPX Odieresis T -40 KPX Odieresis Tcaron -40 KPX Odieresis Tcommaaccent -40 KPX Odieresis V -50 KPX Odieresis W -50 KPX Odieresis X -50 KPX Odieresis Y -70 KPX Odieresis Yacute -70 KPX Odieresis Ydieresis -70 KPX Odieresis comma -40 KPX Odieresis period -40 KPX Ograve A -50 KPX Ograve Aacute -50 KPX Ograve Abreve -50 KPX Ograve Acircumflex -50 KPX Ograve Adieresis -50 KPX Ograve Agrave -50 KPX Ograve Amacron -50 KPX Ograve Aogonek -50 KPX Ograve Aring -50 KPX Ograve Atilde -50 KPX Ograve T -40 KPX Ograve Tcaron -40 KPX Ograve Tcommaaccent -40 KPX Ograve V -50 KPX Ograve W -50 KPX Ograve X -50 KPX Ograve Y -70 KPX Ograve Yacute -70 KPX Ograve Ydieresis -70 KPX Ograve comma -40 KPX Ograve period -40 KPX Ohungarumlaut A -50 KPX Ohungarumlaut Aacute -50 KPX Ohungarumlaut Abreve -50 KPX Ohungarumlaut Acircumflex -50 KPX Ohungarumlaut Adieresis -50 KPX Ohungarumlaut Agrave -50 KPX Ohungarumlaut Amacron -50 KPX Ohungarumlaut Aogonek -50 KPX Ohungarumlaut Aring -50 KPX Ohungarumlaut Atilde -50 KPX Ohungarumlaut T -40 KPX Ohungarumlaut Tcaron -40 KPX Ohungarumlaut Tcommaaccent -40 KPX Ohungarumlaut V -50 KPX Ohungarumlaut W -50 KPX Ohungarumlaut X -50 KPX Ohungarumlaut Y -70 KPX Ohungarumlaut Yacute -70 KPX Ohungarumlaut Ydieresis -70 KPX Ohungarumlaut comma -40 KPX Ohungarumlaut period -40 KPX Omacron A -50 KPX Omacron Aacute -50 KPX Omacron Abreve -50 KPX Omacron Acircumflex -50 KPX Omacron Adieresis -50 KPX Omacron Agrave -50 KPX Omacron Amacron -50 KPX Omacron Aogonek -50 KPX Omacron Aring -50 KPX Omacron Atilde -50 KPX Omacron T -40 KPX Omacron Tcaron -40 KPX Omacron Tcommaaccent -40 KPX Omacron V -50 KPX Omacron W -50 KPX Omacron X -50 KPX Omacron Y -70 KPX Omacron Yacute -70 KPX Omacron Ydieresis -70 KPX Omacron comma -40 KPX Omacron period -40 KPX Oslash A -50 KPX Oslash Aacute -50 KPX Oslash Abreve -50 KPX Oslash Acircumflex -50 KPX Oslash Adieresis -50 KPX Oslash Agrave -50 KPX Oslash Amacron -50 KPX Oslash Aogonek -50 KPX Oslash Aring -50 KPX Oslash Atilde -50 KPX Oslash T -40 KPX Oslash Tcaron -40 KPX Oslash Tcommaaccent -40 KPX Oslash V -50 KPX Oslash W -50 KPX Oslash X -50 KPX Oslash Y -70 KPX Oslash Yacute -70 KPX Oslash Ydieresis -70 KPX Oslash comma -40 KPX Oslash period -40 KPX Otilde A -50 KPX Otilde Aacute -50 KPX Otilde Abreve -50 KPX Otilde Acircumflex -50 KPX Otilde Adieresis -50 KPX Otilde Agrave -50 KPX Otilde Amacron -50 KPX Otilde Aogonek -50 KPX Otilde Aring -50 KPX Otilde Atilde -50 KPX Otilde T -40 KPX Otilde Tcaron -40 KPX Otilde Tcommaaccent -40 KPX Otilde V -50 KPX Otilde W -50 KPX Otilde X -50 KPX Otilde Y -70 KPX Otilde Yacute -70 KPX Otilde Ydieresis -70 KPX Otilde comma -40 KPX Otilde period -40 KPX P A -100 KPX P Aacute -100 KPX P Abreve -100 KPX P Acircumflex -100 KPX P Adieresis -100 KPX P Agrave -100 KPX P Amacron -100 KPX P Aogonek -100 KPX P Aring -100 KPX P Atilde -100 KPX P a -30 KPX P aacute -30 KPX P abreve -30 KPX P acircumflex -30 KPX P adieresis -30 KPX P agrave -30 KPX P amacron -30 KPX P aogonek -30 KPX P aring -30 KPX P atilde -30 KPX P comma -120 KPX P e -30 KPX P eacute -30 KPX P ecaron -30 KPX P ecircumflex -30 KPX P edieresis -30 KPX P edotaccent -30 KPX P egrave -30 KPX P emacron -30 KPX P eogonek -30 KPX P o -40 KPX P oacute -40 KPX P ocircumflex -40 KPX P odieresis -40 KPX P ograve -40 KPX P ohungarumlaut -40 KPX P omacron -40 KPX P oslash -40 KPX P otilde -40 KPX P period -120 KPX Q U -10 KPX Q Uacute -10 KPX Q Ucircumflex -10 KPX Q Udieresis -10 KPX Q Ugrave -10 KPX Q Uhungarumlaut -10 KPX Q Umacron -10 KPX Q Uogonek -10 KPX Q Uring -10 KPX Q comma 20 KPX Q period 20 KPX R O -20 KPX R Oacute -20 KPX R Ocircumflex -20 KPX R Odieresis -20 KPX R Ograve -20 KPX R Ohungarumlaut -20 KPX R Omacron -20 KPX R Oslash -20 KPX R Otilde -20 KPX R T -20 KPX R Tcaron -20 KPX R Tcommaaccent -20 KPX R U -20 KPX R Uacute -20 KPX R Ucircumflex -20 KPX R Udieresis -20 KPX R Ugrave -20 KPX R Uhungarumlaut -20 KPX R Umacron -20 KPX R Uogonek -20 KPX R Uring -20 KPX R V -50 KPX R W -40 KPX R Y -50 KPX R Yacute -50 KPX R Ydieresis -50 KPX Racute O -20 KPX Racute Oacute -20 KPX Racute Ocircumflex -20 KPX Racute Odieresis -20 KPX Racute Ograve -20 KPX Racute Ohungarumlaut -20 KPX Racute Omacron -20 KPX Racute Oslash -20 KPX Racute Otilde -20 KPX Racute T -20 KPX Racute Tcaron -20 KPX Racute Tcommaaccent -20 KPX Racute U -20 KPX Racute Uacute -20 KPX Racute Ucircumflex -20 KPX Racute Udieresis -20 KPX Racute Ugrave -20 KPX Racute Uhungarumlaut -20 KPX Racute Umacron -20 KPX Racute Uogonek -20 KPX Racute Uring -20 KPX Racute V -50 KPX Racute W -40 KPX Racute Y -50 KPX Racute Yacute -50 KPX Racute Ydieresis -50 KPX Rcaron O -20 KPX Rcaron Oacute -20 KPX Rcaron Ocircumflex -20 KPX Rcaron Odieresis -20 KPX Rcaron Ograve -20 KPX Rcaron Ohungarumlaut -20 KPX Rcaron Omacron -20 KPX Rcaron Oslash -20 KPX Rcaron Otilde -20 KPX Rcaron T -20 KPX Rcaron Tcaron -20 KPX Rcaron Tcommaaccent -20 KPX Rcaron U -20 KPX Rcaron Uacute -20 KPX Rcaron Ucircumflex -20 KPX Rcaron Udieresis -20 KPX Rcaron Ugrave -20 KPX Rcaron Uhungarumlaut -20 KPX Rcaron Umacron -20 KPX Rcaron Uogonek -20 KPX Rcaron Uring -20 KPX Rcaron V -50 KPX Rcaron W -40 KPX Rcaron Y -50 KPX Rcaron Yacute -50 KPX Rcaron Ydieresis -50 KPX Rcommaaccent O -20 KPX Rcommaaccent Oacute -20 KPX Rcommaaccent Ocircumflex -20 KPX Rcommaaccent Odieresis -20 KPX Rcommaaccent Ograve -20 KPX Rcommaaccent Ohungarumlaut -20 KPX Rcommaaccent Omacron -20 KPX Rcommaaccent Oslash -20 KPX Rcommaaccent Otilde -20 KPX Rcommaaccent T -20 KPX Rcommaaccent Tcaron -20 KPX Rcommaaccent Tcommaaccent -20 KPX Rcommaaccent U -20 KPX Rcommaaccent Uacute -20 KPX Rcommaaccent Ucircumflex -20 KPX Rcommaaccent Udieresis -20 KPX Rcommaaccent Ugrave -20 KPX Rcommaaccent Uhungarumlaut -20 KPX Rcommaaccent Umacron -20 KPX Rcommaaccent Uogonek -20 KPX Rcommaaccent Uring -20 KPX Rcommaaccent V -50 KPX Rcommaaccent W -40 KPX Rcommaaccent Y -50 KPX Rcommaaccent Yacute -50 KPX Rcommaaccent Ydieresis -50 KPX T A -90 KPX T Aacute -90 KPX T Abreve -90 KPX T Acircumflex -90 KPX T Adieresis -90 KPX T Agrave -90 KPX T Amacron -90 KPX T Aogonek -90 KPX T Aring -90 KPX T Atilde -90 KPX T O -40 KPX T Oacute -40 KPX T Ocircumflex -40 KPX T Odieresis -40 KPX T Ograve -40 KPX T Ohungarumlaut -40 KPX T Omacron -40 KPX T Oslash -40 KPX T Otilde -40 KPX T a -80 KPX T aacute -80 KPX T abreve -80 KPX T acircumflex -80 KPX T adieresis -80 KPX T agrave -80 KPX T amacron -80 KPX T aogonek -80 KPX T aring -80 KPX T atilde -80 KPX T colon -40 KPX T comma -80 KPX T e -60 KPX T eacute -60 KPX T ecaron -60 KPX T ecircumflex -60 KPX T edieresis -60 KPX T edotaccent -60 KPX T egrave -60 KPX T emacron -60 KPX T eogonek -60 KPX T hyphen -120 KPX T o -80 KPX T oacute -80 KPX T ocircumflex -80 KPX T odieresis -80 KPX T ograve -80 KPX T ohungarumlaut -80 KPX T omacron -80 KPX T oslash -80 KPX T otilde -80 KPX T period -80 KPX T r -80 KPX T racute -80 KPX T rcommaaccent -80 KPX T semicolon -40 KPX T u -90 KPX T uacute -90 KPX T ucircumflex -90 KPX T udieresis -90 KPX T ugrave -90 KPX T uhungarumlaut -90 KPX T umacron -90 KPX T uogonek -90 KPX T uring -90 KPX T w -60 KPX T y -60 KPX T yacute -60 KPX T ydieresis -60 KPX Tcaron A -90 KPX Tcaron Aacute -90 KPX Tcaron Abreve -90 KPX Tcaron Acircumflex -90 KPX Tcaron Adieresis -90 KPX Tcaron Agrave -90 KPX Tcaron Amacron -90 KPX Tcaron Aogonek -90 KPX Tcaron Aring -90 KPX Tcaron Atilde -90 KPX Tcaron O -40 KPX Tcaron Oacute -40 KPX Tcaron Ocircumflex -40 KPX Tcaron Odieresis -40 KPX Tcaron Ograve -40 KPX Tcaron Ohungarumlaut -40 KPX Tcaron Omacron -40 KPX Tcaron Oslash -40 KPX Tcaron Otilde -40 KPX Tcaron a -80 KPX Tcaron aacute -80 KPX Tcaron abreve -80 KPX Tcaron acircumflex -80 KPX Tcaron adieresis -80 KPX Tcaron agrave -80 KPX Tcaron amacron -80 KPX Tcaron aogonek -80 KPX Tcaron aring -80 KPX Tcaron atilde -80 KPX Tcaron colon -40 KPX Tcaron comma -80 KPX Tcaron e -60 KPX Tcaron eacute -60 KPX Tcaron ecaron -60 KPX Tcaron ecircumflex -60 KPX Tcaron edieresis -60 KPX Tcaron edotaccent -60 KPX Tcaron egrave -60 KPX Tcaron emacron -60 KPX Tcaron eogonek -60 KPX Tcaron hyphen -120 KPX Tcaron o -80 KPX Tcaron oacute -80 KPX Tcaron ocircumflex -80 KPX Tcaron odieresis -80 KPX Tcaron ograve -80 KPX Tcaron ohungarumlaut -80 KPX Tcaron omacron -80 KPX Tcaron oslash -80 KPX Tcaron otilde -80 KPX Tcaron period -80 KPX Tcaron r -80 KPX Tcaron racute -80 KPX Tcaron rcommaaccent -80 KPX Tcaron semicolon -40 KPX Tcaron u -90 KPX Tcaron uacute -90 KPX Tcaron ucircumflex -90 KPX Tcaron udieresis -90 KPX Tcaron ugrave -90 KPX Tcaron uhungarumlaut -90 KPX Tcaron umacron -90 KPX Tcaron uogonek -90 KPX Tcaron uring -90 KPX Tcaron w -60 KPX Tcaron y -60 KPX Tcaron yacute -60 KPX Tcaron ydieresis -60 KPX Tcommaaccent A -90 KPX Tcommaaccent Aacute -90 KPX Tcommaaccent Abreve -90 KPX Tcommaaccent Acircumflex -90 KPX Tcommaaccent Adieresis -90 KPX Tcommaaccent Agrave -90 KPX Tcommaaccent Amacron -90 KPX Tcommaaccent Aogonek -90 KPX Tcommaaccent Aring -90 KPX Tcommaaccent Atilde -90 KPX Tcommaaccent O -40 KPX Tcommaaccent Oacute -40 KPX Tcommaaccent Ocircumflex -40 KPX Tcommaaccent Odieresis -40 KPX Tcommaaccent Ograve -40 KPX Tcommaaccent Ohungarumlaut -40 KPX Tcommaaccent Omacron -40 KPX Tcommaaccent Oslash -40 KPX Tcommaaccent Otilde -40 KPX Tcommaaccent a -80 KPX Tcommaaccent aacute -80 KPX Tcommaaccent abreve -80 KPX Tcommaaccent acircumflex -80 KPX Tcommaaccent adieresis -80 KPX Tcommaaccent agrave -80 KPX Tcommaaccent amacron -80 KPX Tcommaaccent aogonek -80 KPX Tcommaaccent aring -80 KPX Tcommaaccent atilde -80 KPX Tcommaaccent colon -40 KPX Tcommaaccent comma -80 KPX Tcommaaccent e -60 KPX Tcommaaccent eacute -60 KPX Tcommaaccent ecaron -60 KPX Tcommaaccent ecircumflex -60 KPX Tcommaaccent edieresis -60 KPX Tcommaaccent edotaccent -60 KPX Tcommaaccent egrave -60 KPX Tcommaaccent emacron -60 KPX Tcommaaccent eogonek -60 KPX Tcommaaccent hyphen -120 KPX Tcommaaccent o -80 KPX Tcommaaccent oacute -80 KPX Tcommaaccent ocircumflex -80 KPX Tcommaaccent odieresis -80 KPX Tcommaaccent ograve -80 KPX Tcommaaccent ohungarumlaut -80 KPX Tcommaaccent omacron -80 KPX Tcommaaccent oslash -80 KPX Tcommaaccent otilde -80 KPX Tcommaaccent period -80 KPX Tcommaaccent r -80 KPX Tcommaaccent racute -80 KPX Tcommaaccent rcommaaccent -80 KPX Tcommaaccent semicolon -40 KPX Tcommaaccent u -90 KPX Tcommaaccent uacute -90 KPX Tcommaaccent ucircumflex -90 KPX Tcommaaccent udieresis -90 KPX Tcommaaccent ugrave -90 KPX Tcommaaccent uhungarumlaut -90 KPX Tcommaaccent umacron -90 KPX Tcommaaccent uogonek -90 KPX Tcommaaccent uring -90 KPX Tcommaaccent w -60 KPX Tcommaaccent y -60 KPX Tcommaaccent yacute -60 KPX Tcommaaccent ydieresis -60 KPX U A -50 KPX U Aacute -50 KPX U Abreve -50 KPX U Acircumflex -50 KPX U Adieresis -50 KPX U Agrave -50 KPX U Amacron -50 KPX U Aogonek -50 KPX U Aring -50 KPX U Atilde -50 KPX U comma -30 KPX U period -30 KPX Uacute A -50 KPX Uacute Aacute -50 KPX Uacute Abreve -50 KPX Uacute Acircumflex -50 KPX Uacute Adieresis -50 KPX Uacute Agrave -50 KPX Uacute Amacron -50 KPX Uacute Aogonek -50 KPX Uacute Aring -50 KPX Uacute Atilde -50 KPX Uacute comma -30 KPX Uacute period -30 KPX Ucircumflex A -50 KPX Ucircumflex Aacute -50 KPX Ucircumflex Abreve -50 KPX Ucircumflex Acircumflex -50 KPX Ucircumflex Adieresis -50 KPX Ucircumflex Agrave -50 KPX Ucircumflex Amacron -50 KPX Ucircumflex Aogonek -50 KPX Ucircumflex Aring -50 KPX Ucircumflex Atilde -50 KPX Ucircumflex comma -30 KPX Ucircumflex period -30 KPX Udieresis A -50 KPX Udieresis Aacute -50 KPX Udieresis Abreve -50 KPX Udieresis Acircumflex -50 KPX Udieresis Adieresis -50 KPX Udieresis Agrave -50 KPX Udieresis Amacron -50 KPX Udieresis Aogonek -50 KPX Udieresis Aring -50 KPX Udieresis Atilde -50 KPX Udieresis comma -30 KPX Udieresis period -30 KPX Ugrave A -50 KPX Ugrave Aacute -50 KPX Ugrave Abreve -50 KPX Ugrave Acircumflex -50 KPX Ugrave Adieresis -50 KPX Ugrave Agrave -50 KPX Ugrave Amacron -50 KPX Ugrave Aogonek -50 KPX Ugrave Aring -50 KPX Ugrave Atilde -50 KPX Ugrave comma -30 KPX Ugrave period -30 KPX Uhungarumlaut A -50 KPX Uhungarumlaut Aacute -50 KPX Uhungarumlaut Abreve -50 KPX Uhungarumlaut Acircumflex -50 KPX Uhungarumlaut Adieresis -50 KPX Uhungarumlaut Agrave -50 KPX Uhungarumlaut Amacron -50 KPX Uhungarumlaut Aogonek -50 KPX Uhungarumlaut Aring -50 KPX Uhungarumlaut Atilde -50 KPX Uhungarumlaut comma -30 KPX Uhungarumlaut period -30 KPX Umacron A -50 KPX Umacron Aacute -50 KPX Umacron Abreve -50 KPX Umacron Acircumflex -50 KPX Umacron Adieresis -50 KPX Umacron Agrave -50 KPX Umacron Amacron -50 KPX Umacron Aogonek -50 KPX Umacron Aring -50 KPX Umacron Atilde -50 KPX Umacron comma -30 KPX Umacron period -30 KPX Uogonek A -50 KPX Uogonek Aacute -50 KPX Uogonek Abreve -50 KPX Uogonek Acircumflex -50 KPX Uogonek Adieresis -50 KPX Uogonek Agrave -50 KPX Uogonek Amacron -50 KPX Uogonek Aogonek -50 KPX Uogonek Aring -50 KPX Uogonek Atilde -50 KPX Uogonek comma -30 KPX Uogonek period -30 KPX Uring A -50 KPX Uring Aacute -50 KPX Uring Abreve -50 KPX Uring Acircumflex -50 KPX Uring Adieresis -50 KPX Uring Agrave -50 KPX Uring Amacron -50 KPX Uring Aogonek -50 KPX Uring Aring -50 KPX Uring Atilde -50 KPX Uring comma -30 KPX Uring period -30 KPX V A -80 KPX V Aacute -80 KPX V Abreve -80 KPX V Acircumflex -80 KPX V Adieresis -80 KPX V Agrave -80 KPX V Amacron -80 KPX V Aogonek -80 KPX V Aring -80 KPX V Atilde -80 KPX V G -50 KPX V Gbreve -50 KPX V Gcommaaccent -50 KPX V O -50 KPX V Oacute -50 KPX V Ocircumflex -50 KPX V Odieresis -50 KPX V Ograve -50 KPX V Ohungarumlaut -50 KPX V Omacron -50 KPX V Oslash -50 KPX V Otilde -50 KPX V a -60 KPX V aacute -60 KPX V abreve -60 KPX V acircumflex -60 KPX V adieresis -60 KPX V agrave -60 KPX V amacron -60 KPX V aogonek -60 KPX V aring -60 KPX V atilde -60 KPX V colon -40 KPX V comma -120 KPX V e -50 KPX V eacute -50 KPX V ecaron -50 KPX V ecircumflex -50 KPX V edieresis -50 KPX V edotaccent -50 KPX V egrave -50 KPX V emacron -50 KPX V eogonek -50 KPX V hyphen -80 KPX V o -90 KPX V oacute -90 KPX V ocircumflex -90 KPX V odieresis -90 KPX V ograve -90 KPX V ohungarumlaut -90 KPX V omacron -90 KPX V oslash -90 KPX V otilde -90 KPX V period -120 KPX V semicolon -40 KPX V u -60 KPX V uacute -60 KPX V ucircumflex -60 KPX V udieresis -60 KPX V ugrave -60 KPX V uhungarumlaut -60 KPX V umacron -60 KPX V uogonek -60 KPX V uring -60 KPX W A -60 KPX W Aacute -60 KPX W Abreve -60 KPX W Acircumflex -60 KPX W Adieresis -60 KPX W Agrave -60 KPX W Amacron -60 KPX W Aogonek -60 KPX W Aring -60 KPX W Atilde -60 KPX W O -20 KPX W Oacute -20 KPX W Ocircumflex -20 KPX W Odieresis -20 KPX W Ograve -20 KPX W Ohungarumlaut -20 KPX W Omacron -20 KPX W Oslash -20 KPX W Otilde -20 KPX W a -40 KPX W aacute -40 KPX W abreve -40 KPX W acircumflex -40 KPX W adieresis -40 KPX W agrave -40 KPX W amacron -40 KPX W aogonek -40 KPX W aring -40 KPX W atilde -40 KPX W colon -10 KPX W comma -80 KPX W e -35 KPX W eacute -35 KPX W ecaron -35 KPX W ecircumflex -35 KPX W edieresis -35 KPX W edotaccent -35 KPX W egrave -35 KPX W emacron -35 KPX W eogonek -35 KPX W hyphen -40 KPX W o -60 KPX W oacute -60 KPX W ocircumflex -60 KPX W odieresis -60 KPX W ograve -60 KPX W ohungarumlaut -60 KPX W omacron -60 KPX W oslash -60 KPX W otilde -60 KPX W period -80 KPX W semicolon -10 KPX W u -45 KPX W uacute -45 KPX W ucircumflex -45 KPX W udieresis -45 KPX W ugrave -45 KPX W uhungarumlaut -45 KPX W umacron -45 KPX W uogonek -45 KPX W uring -45 KPX W y -20 KPX W yacute -20 KPX W ydieresis -20 KPX Y A -110 KPX Y Aacute -110 KPX Y Abreve -110 KPX Y Acircumflex -110 KPX Y Adieresis -110 KPX Y Agrave -110 KPX Y Amacron -110 KPX Y Aogonek -110 KPX Y Aring -110 KPX Y Atilde -110 KPX Y O -70 KPX Y Oacute -70 KPX Y Ocircumflex -70 KPX Y Odieresis -70 KPX Y Ograve -70 KPX Y Ohungarumlaut -70 KPX Y Omacron -70 KPX Y Oslash -70 KPX Y Otilde -70 KPX Y a -90 KPX Y aacute -90 KPX Y abreve -90 KPX Y acircumflex -90 KPX Y adieresis -90 KPX Y agrave -90 KPX Y amacron -90 KPX Y aogonek -90 KPX Y aring -90 KPX Y atilde -90 KPX Y colon -50 KPX Y comma -100 KPX Y e -80 KPX Y eacute -80 KPX Y ecaron -80 KPX Y ecircumflex -80 KPX Y edieresis -80 KPX Y edotaccent -80 KPX Y egrave -80 KPX Y emacron -80 KPX Y eogonek -80 KPX Y o -100 KPX Y oacute -100 KPX Y ocircumflex -100 KPX Y odieresis -100 KPX Y ograve -100 KPX Y ohungarumlaut -100 KPX Y omacron -100 KPX Y oslash -100 KPX Y otilde -100 KPX Y period -100 KPX Y semicolon -50 KPX Y u -100 KPX Y uacute -100 KPX Y ucircumflex -100 KPX Y udieresis -100 KPX Y ugrave -100 KPX Y uhungarumlaut -100 KPX Y umacron -100 KPX Y uogonek -100 KPX Y uring -100 KPX Yacute A -110 KPX Yacute Aacute -110 KPX Yacute Abreve -110 KPX Yacute Acircumflex -110 KPX Yacute Adieresis -110 KPX Yacute Agrave -110 KPX Yacute Amacron -110 KPX Yacute Aogonek -110 KPX Yacute Aring -110 KPX Yacute Atilde -110 KPX Yacute O -70 KPX Yacute Oacute -70 KPX Yacute Ocircumflex -70 KPX Yacute Odieresis -70 KPX Yacute Ograve -70 KPX Yacute Ohungarumlaut -70 KPX Yacute Omacron -70 KPX Yacute Oslash -70 KPX Yacute Otilde -70 KPX Yacute a -90 KPX Yacute aacute -90 KPX Yacute abreve -90 KPX Yacute acircumflex -90 KPX Yacute adieresis -90 KPX Yacute agrave -90 KPX Yacute amacron -90 KPX Yacute aogonek -90 KPX Yacute aring -90 KPX Yacute atilde -90 KPX Yacute colon -50 KPX Yacute comma -100 KPX Yacute e -80 KPX Yacute eacute -80 KPX Yacute ecaron -80 KPX Yacute ecircumflex -80 KPX Yacute edieresis -80 KPX Yacute edotaccent -80 KPX Yacute egrave -80 KPX Yacute emacron -80 KPX Yacute eogonek -80 KPX Yacute o -100 KPX Yacute oacute -100 KPX Yacute ocircumflex -100 KPX Yacute odieresis -100 KPX Yacute ograve -100 KPX Yacute ohungarumlaut -100 KPX Yacute omacron -100 KPX Yacute oslash -100 KPX Yacute otilde -100 KPX Yacute period -100 KPX Yacute semicolon -50 KPX Yacute u -100 KPX Yacute uacute -100 KPX Yacute ucircumflex -100 KPX Yacute udieresis -100 KPX Yacute ugrave -100 KPX Yacute uhungarumlaut -100 KPX Yacute umacron -100 KPX Yacute uogonek -100 KPX Yacute uring -100 KPX Ydieresis A -110 KPX Ydieresis Aacute -110 KPX Ydieresis Abreve -110 KPX Ydieresis Acircumflex -110 KPX Ydieresis Adieresis -110 KPX Ydieresis Agrave -110 KPX Ydieresis Amacron -110 KPX Ydieresis Aogonek -110 KPX Ydieresis Aring -110 KPX Ydieresis Atilde -110 KPX Ydieresis O -70 KPX Ydieresis Oacute -70 KPX Ydieresis Ocircumflex -70 KPX Ydieresis Odieresis -70 KPX Ydieresis Ograve -70 KPX Ydieresis Ohungarumlaut -70 KPX Ydieresis Omacron -70 KPX Ydieresis Oslash -70 KPX Ydieresis Otilde -70 KPX Ydieresis a -90 KPX Ydieresis aacute -90 KPX Ydieresis abreve -90 KPX Ydieresis acircumflex -90 KPX Ydieresis adieresis -90 KPX Ydieresis agrave -90 KPX Ydieresis amacron -90 KPX Ydieresis aogonek -90 KPX Ydieresis aring -90 KPX Ydieresis atilde -90 KPX Ydieresis colon -50 KPX Ydieresis comma -100 KPX Ydieresis e -80 KPX Ydieresis eacute -80 KPX Ydieresis ecaron -80 KPX Ydieresis ecircumflex -80 KPX Ydieresis edieresis -80 KPX Ydieresis edotaccent -80 KPX Ydieresis egrave -80 KPX Ydieresis emacron -80 KPX Ydieresis eogonek -80 KPX Ydieresis o -100 KPX Ydieresis oacute -100 KPX Ydieresis ocircumflex -100 KPX Ydieresis odieresis -100 KPX Ydieresis ograve -100 KPX Ydieresis ohungarumlaut -100 KPX Ydieresis omacron -100 KPX Ydieresis oslash -100 KPX Ydieresis otilde -100 KPX Ydieresis period -100 KPX Ydieresis semicolon -50 KPX Ydieresis u -100 KPX Ydieresis uacute -100 KPX Ydieresis ucircumflex -100 KPX Ydieresis udieresis -100 KPX Ydieresis ugrave -100 KPX Ydieresis uhungarumlaut -100 KPX Ydieresis umacron -100 KPX Ydieresis uogonek -100 KPX Ydieresis uring -100 KPX a g -10 KPX a gbreve -10 KPX a gcommaaccent -10 KPX a v -15 KPX a w -15 KPX a y -20 KPX a yacute -20 KPX a ydieresis -20 KPX aacute g -10 KPX aacute gbreve -10 KPX aacute gcommaaccent -10 KPX aacute v -15 KPX aacute w -15 KPX aacute y -20 KPX aacute yacute -20 KPX aacute ydieresis -20 KPX abreve g -10 KPX abreve gbreve -10 KPX abreve gcommaaccent -10 KPX abreve v -15 KPX abreve w -15 KPX abreve y -20 KPX abreve yacute -20 KPX abreve ydieresis -20 KPX acircumflex g -10 KPX acircumflex gbreve -10 KPX acircumflex gcommaaccent -10 KPX acircumflex v -15 KPX acircumflex w -15 KPX acircumflex y -20 KPX acircumflex yacute -20 KPX acircumflex ydieresis -20 KPX adieresis g -10 KPX adieresis gbreve -10 KPX adieresis gcommaaccent -10 KPX adieresis v -15 KPX adieresis w -15 KPX adieresis y -20 KPX adieresis yacute -20 KPX adieresis ydieresis -20 KPX agrave g -10 KPX agrave gbreve -10 KPX agrave gcommaaccent -10 KPX agrave v -15 KPX agrave w -15 KPX agrave y -20 KPX agrave yacute -20 KPX agrave ydieresis -20 KPX amacron g -10 KPX amacron gbreve -10 KPX amacron gcommaaccent -10 KPX amacron v -15 KPX amacron w -15 KPX amacron y -20 KPX amacron yacute -20 KPX amacron ydieresis -20 KPX aogonek g -10 KPX aogonek gbreve -10 KPX aogonek gcommaaccent -10 KPX aogonek v -15 KPX aogonek w -15 KPX aogonek y -20 KPX aogonek yacute -20 KPX aogonek ydieresis -20 KPX aring g -10 KPX aring gbreve -10 KPX aring gcommaaccent -10 KPX aring v -15 KPX aring w -15 KPX aring y -20 KPX aring yacute -20 KPX aring ydieresis -20 KPX atilde g -10 KPX atilde gbreve -10 KPX atilde gcommaaccent -10 KPX atilde v -15 KPX atilde w -15 KPX atilde y -20 KPX atilde yacute -20 KPX atilde ydieresis -20 KPX b l -10 KPX b lacute -10 KPX b lcommaaccent -10 KPX b lslash -10 KPX b u -20 KPX b uacute -20 KPX b ucircumflex -20 KPX b udieresis -20 KPX b ugrave -20 KPX b uhungarumlaut -20 KPX b umacron -20 KPX b uogonek -20 KPX b uring -20 KPX b v -20 KPX b y -20 KPX b yacute -20 KPX b ydieresis -20 KPX c h -10 KPX c k -20 KPX c kcommaaccent -20 KPX c l -20 KPX c lacute -20 KPX c lcommaaccent -20 KPX c lslash -20 KPX c y -10 KPX c yacute -10 KPX c ydieresis -10 KPX cacute h -10 KPX cacute k -20 KPX cacute kcommaaccent -20 KPX cacute l -20 KPX cacute lacute -20 KPX cacute lcommaaccent -20 KPX cacute lslash -20 KPX cacute y -10 KPX cacute yacute -10 KPX cacute ydieresis -10 KPX ccaron h -10 KPX ccaron k -20 KPX ccaron kcommaaccent -20 KPX ccaron l -20 KPX ccaron lacute -20 KPX ccaron lcommaaccent -20 KPX ccaron lslash -20 KPX ccaron y -10 KPX ccaron yacute -10 KPX ccaron ydieresis -10 KPX ccedilla h -10 KPX ccedilla k -20 KPX ccedilla kcommaaccent -20 KPX ccedilla l -20 KPX ccedilla lacute -20 KPX ccedilla lcommaaccent -20 KPX ccedilla lslash -20 KPX ccedilla y -10 KPX ccedilla yacute -10 KPX ccedilla ydieresis -10 KPX colon space -40 KPX comma quotedblright -120 KPX comma quoteright -120 KPX comma space -40 KPX d d -10 KPX d dcroat -10 KPX d v -15 KPX d w -15 KPX d y -15 KPX d yacute -15 KPX d ydieresis -15 KPX dcroat d -10 KPX dcroat dcroat -10 KPX dcroat v -15 KPX dcroat w -15 KPX dcroat y -15 KPX dcroat yacute -15 KPX dcroat ydieresis -15 KPX e comma 10 KPX e period 20 KPX e v -15 KPX e w -15 KPX e x -15 KPX e y -15 KPX e yacute -15 KPX e ydieresis -15 KPX eacute comma 10 KPX eacute period 20 KPX eacute v -15 KPX eacute w -15 KPX eacute x -15 KPX eacute y -15 KPX eacute yacute -15 KPX eacute ydieresis -15 KPX ecaron comma 10 KPX ecaron period 20 KPX ecaron v -15 KPX ecaron w -15 KPX ecaron x -15 KPX ecaron y -15 KPX ecaron yacute -15 KPX ecaron ydieresis -15 KPX ecircumflex comma 10 KPX ecircumflex period 20 KPX ecircumflex v -15 KPX ecircumflex w -15 KPX ecircumflex x -15 KPX ecircumflex y -15 KPX ecircumflex yacute -15 KPX ecircumflex ydieresis -15 KPX edieresis comma 10 KPX edieresis period 20 KPX edieresis v -15 KPX edieresis w -15 KPX edieresis x -15 KPX edieresis y -15 KPX edieresis yacute -15 KPX edieresis ydieresis -15 KPX edotaccent comma 10 KPX edotaccent period 20 KPX edotaccent v -15 KPX edotaccent w -15 KPX edotaccent x -15 KPX edotaccent y -15 KPX edotaccent yacute -15 KPX edotaccent ydieresis -15 KPX egrave comma 10 KPX egrave period 20 KPX egrave v -15 KPX egrave w -15 KPX egrave x -15 KPX egrave y -15 KPX egrave yacute -15 KPX egrave ydieresis -15 KPX emacron comma 10 KPX emacron period 20 KPX emacron v -15 KPX emacron w -15 KPX emacron x -15 KPX emacron y -15 KPX emacron yacute -15 KPX emacron ydieresis -15 KPX eogonek comma 10 KPX eogonek period 20 KPX eogonek v -15 KPX eogonek w -15 KPX eogonek x -15 KPX eogonek y -15 KPX eogonek yacute -15 KPX eogonek ydieresis -15 KPX f comma -10 KPX f e -10 KPX f eacute -10 KPX f ecaron -10 KPX f ecircumflex -10 KPX f edieresis -10 KPX f edotaccent -10 KPX f egrave -10 KPX f emacron -10 KPX f eogonek -10 KPX f o -20 KPX f oacute -20 KPX f ocircumflex -20 KPX f odieresis -20 KPX f ograve -20 KPX f ohungarumlaut -20 KPX f omacron -20 KPX f oslash -20 KPX f otilde -20 KPX f period -10 KPX f quotedblright 30 KPX f quoteright 30 KPX g e 10 KPX g eacute 10 KPX g ecaron 10 KPX g ecircumflex 10 KPX g edieresis 10 KPX g edotaccent 10 KPX g egrave 10 KPX g emacron 10 KPX g eogonek 10 KPX g g -10 KPX g gbreve -10 KPX g gcommaaccent -10 KPX gbreve e 10 KPX gbreve eacute 10 KPX gbreve ecaron 10 KPX gbreve ecircumflex 10 KPX gbreve edieresis 10 KPX gbreve edotaccent 10 KPX gbreve egrave 10 KPX gbreve emacron 10 KPX gbreve eogonek 10 KPX gbreve g -10 KPX gbreve gbreve -10 KPX gbreve gcommaaccent -10 KPX gcommaaccent e 10 KPX gcommaaccent eacute 10 KPX gcommaaccent ecaron 10 KPX gcommaaccent ecircumflex 10 KPX gcommaaccent edieresis 10 KPX gcommaaccent edotaccent 10 KPX gcommaaccent egrave 10 KPX gcommaaccent emacron 10 KPX gcommaaccent eogonek 10 KPX gcommaaccent g -10 KPX gcommaaccent gbreve -10 KPX gcommaaccent gcommaaccent -10 KPX h y -20 KPX h yacute -20 KPX h ydieresis -20 KPX k o -15 KPX k oacute -15 KPX k ocircumflex -15 KPX k odieresis -15 KPX k ograve -15 KPX k ohungarumlaut -15 KPX k omacron -15 KPX k oslash -15 KPX k otilde -15 KPX kcommaaccent o -15 KPX kcommaaccent oacute -15 KPX kcommaaccent ocircumflex -15 KPX kcommaaccent odieresis -15 KPX kcommaaccent ograve -15 KPX kcommaaccent ohungarumlaut -15 KPX kcommaaccent omacron -15 KPX kcommaaccent oslash -15 KPX kcommaaccent otilde -15 KPX l w -15 KPX l y -15 KPX l yacute -15 KPX l ydieresis -15 KPX lacute w -15 KPX lacute y -15 KPX lacute yacute -15 KPX lacute ydieresis -15 KPX lcommaaccent w -15 KPX lcommaaccent y -15 KPX lcommaaccent yacute -15 KPX lcommaaccent ydieresis -15 KPX lslash w -15 KPX lslash y -15 KPX lslash yacute -15 KPX lslash ydieresis -15 KPX m u -20 KPX m uacute -20 KPX m ucircumflex -20 KPX m udieresis -20 KPX m ugrave -20 KPX m uhungarumlaut -20 KPX m umacron -20 KPX m uogonek -20 KPX m uring -20 KPX m y -30 KPX m yacute -30 KPX m ydieresis -30 KPX n u -10 KPX n uacute -10 KPX n ucircumflex -10 KPX n udieresis -10 KPX n ugrave -10 KPX n uhungarumlaut -10 KPX n umacron -10 KPX n uogonek -10 KPX n uring -10 KPX n v -40 KPX n y -20 KPX n yacute -20 KPX n ydieresis -20 KPX nacute u -10 KPX nacute uacute -10 KPX nacute ucircumflex -10 KPX nacute udieresis -10 KPX nacute ugrave -10 KPX nacute uhungarumlaut -10 KPX nacute umacron -10 KPX nacute uogonek -10 KPX nacute uring -10 KPX nacute v -40 KPX nacute y -20 KPX nacute yacute -20 KPX nacute ydieresis -20 KPX ncaron u -10 KPX ncaron uacute -10 KPX ncaron ucircumflex -10 KPX ncaron udieresis -10 KPX ncaron ugrave -10 KPX ncaron uhungarumlaut -10 KPX ncaron umacron -10 KPX ncaron uogonek -10 KPX ncaron uring -10 KPX ncaron v -40 KPX ncaron y -20 KPX ncaron yacute -20 KPX ncaron ydieresis -20 KPX ncommaaccent u -10 KPX ncommaaccent uacute -10 KPX ncommaaccent ucircumflex -10 KPX ncommaaccent udieresis -10 KPX ncommaaccent ugrave -10 KPX ncommaaccent uhungarumlaut -10 KPX ncommaaccent umacron -10 KPX ncommaaccent uogonek -10 KPX ncommaaccent uring -10 KPX ncommaaccent v -40 KPX ncommaaccent y -20 KPX ncommaaccent yacute -20 KPX ncommaaccent ydieresis -20 KPX ntilde u -10 KPX ntilde uacute -10 KPX ntilde ucircumflex -10 KPX ntilde udieresis -10 KPX ntilde ugrave -10 KPX ntilde uhungarumlaut -10 KPX ntilde umacron -10 KPX ntilde uogonek -10 KPX ntilde uring -10 KPX ntilde v -40 KPX ntilde y -20 KPX ntilde yacute -20 KPX ntilde ydieresis -20 KPX o v -20 KPX o w -15 KPX o x -30 KPX o y -20 KPX o yacute -20 KPX o ydieresis -20 KPX oacute v -20 KPX oacute w -15 KPX oacute x -30 KPX oacute y -20 KPX oacute yacute -20 KPX oacute ydieresis -20 KPX ocircumflex v -20 KPX ocircumflex w -15 KPX ocircumflex x -30 KPX ocircumflex y -20 KPX ocircumflex yacute -20 KPX ocircumflex ydieresis -20 KPX odieresis v -20 KPX odieresis w -15 KPX odieresis x -30 KPX odieresis y -20 KPX odieresis yacute -20 KPX odieresis ydieresis -20 KPX ograve v -20 KPX ograve w -15 KPX ograve x -30 KPX ograve y -20 KPX ograve yacute -20 KPX ograve ydieresis -20 KPX ohungarumlaut v -20 KPX ohungarumlaut w -15 KPX ohungarumlaut x -30 KPX ohungarumlaut y -20 KPX ohungarumlaut yacute -20 KPX ohungarumlaut ydieresis -20 KPX omacron v -20 KPX omacron w -15 KPX omacron x -30 KPX omacron y -20 KPX omacron yacute -20 KPX omacron ydieresis -20 KPX oslash v -20 KPX oslash w -15 KPX oslash x -30 KPX oslash y -20 KPX oslash yacute -20 KPX oslash ydieresis -20 KPX otilde v -20 KPX otilde w -15 KPX otilde x -30 KPX otilde y -20 KPX otilde yacute -20 KPX otilde ydieresis -20 KPX p y -15 KPX p yacute -15 KPX p ydieresis -15 KPX period quotedblright -120 KPX period quoteright -120 KPX period space -40 KPX quotedblright space -80 KPX quoteleft quoteleft -46 KPX quoteright d -80 KPX quoteright dcroat -80 KPX quoteright l -20 KPX quoteright lacute -20 KPX quoteright lcommaaccent -20 KPX quoteright lslash -20 KPX quoteright quoteright -46 KPX quoteright r -40 KPX quoteright racute -40 KPX quoteright rcaron -40 KPX quoteright rcommaaccent -40 KPX quoteright s -60 KPX quoteright sacute -60 KPX quoteright scaron -60 KPX quoteright scedilla -60 KPX quoteright scommaaccent -60 KPX quoteright space -80 KPX quoteright v -20 KPX r c -20 KPX r cacute -20 KPX r ccaron -20 KPX r ccedilla -20 KPX r comma -60 KPX r d -20 KPX r dcroat -20 KPX r g -15 KPX r gbreve -15 KPX r gcommaaccent -15 KPX r hyphen -20 KPX r o -20 KPX r oacute -20 KPX r ocircumflex -20 KPX r odieresis -20 KPX r ograve -20 KPX r ohungarumlaut -20 KPX r omacron -20 KPX r oslash -20 KPX r otilde -20 KPX r period -60 KPX r q -20 KPX r s -15 KPX r sacute -15 KPX r scaron -15 KPX r scedilla -15 KPX r scommaaccent -15 KPX r t 20 KPX r tcommaaccent 20 KPX r v 10 KPX r y 10 KPX r yacute 10 KPX r ydieresis 10 KPX racute c -20 KPX racute cacute -20 KPX racute ccaron -20 KPX racute ccedilla -20 KPX racute comma -60 KPX racute d -20 KPX racute dcroat -20 KPX racute g -15 KPX racute gbreve -15 KPX racute gcommaaccent -15 KPX racute hyphen -20 KPX racute o -20 KPX racute oacute -20 KPX racute ocircumflex -20 KPX racute odieresis -20 KPX racute ograve -20 KPX racute ohungarumlaut -20 KPX racute omacron -20 KPX racute oslash -20 KPX racute otilde -20 KPX racute period -60 KPX racute q -20 KPX racute s -15 KPX racute sacute -15 KPX racute scaron -15 KPX racute scedilla -15 KPX racute scommaaccent -15 KPX racute t 20 KPX racute tcommaaccent 20 KPX racute v 10 KPX racute y 10 KPX racute yacute 10 KPX racute ydieresis 10 KPX rcaron c -20 KPX rcaron cacute -20 KPX rcaron ccaron -20 KPX rcaron ccedilla -20 KPX rcaron comma -60 KPX rcaron d -20 KPX rcaron dcroat -20 KPX rcaron g -15 KPX rcaron gbreve -15 KPX rcaron gcommaaccent -15 KPX rcaron hyphen -20 KPX rcaron o -20 KPX rcaron oacute -20 KPX rcaron ocircumflex -20 KPX rcaron odieresis -20 KPX rcaron ograve -20 KPX rcaron ohungarumlaut -20 KPX rcaron omacron -20 KPX rcaron oslash -20 KPX rcaron otilde -20 KPX rcaron period -60 KPX rcaron q -20 KPX rcaron s -15 KPX rcaron sacute -15 KPX rcaron scaron -15 KPX rcaron scedilla -15 KPX rcaron scommaaccent -15 KPX rcaron t 20 KPX rcaron tcommaaccent 20 KPX rcaron v 10 KPX rcaron y 10 KPX rcaron yacute 10 KPX rcaron ydieresis 10 KPX rcommaaccent c -20 KPX rcommaaccent cacute -20 KPX rcommaaccent ccaron -20 KPX rcommaaccent ccedilla -20 KPX rcommaaccent comma -60 KPX rcommaaccent d -20 KPX rcommaaccent dcroat -20 KPX rcommaaccent g -15 KPX rcommaaccent gbreve -15 KPX rcommaaccent gcommaaccent -15 KPX rcommaaccent hyphen -20 KPX rcommaaccent o -20 KPX rcommaaccent oacute -20 KPX rcommaaccent ocircumflex -20 KPX rcommaaccent odieresis -20 KPX rcommaaccent ograve -20 KPX rcommaaccent ohungarumlaut -20 KPX rcommaaccent omacron -20 KPX rcommaaccent oslash -20 KPX rcommaaccent otilde -20 KPX rcommaaccent period -60 KPX rcommaaccent q -20 KPX rcommaaccent s -15 KPX rcommaaccent sacute -15 KPX rcommaaccent scaron -15 KPX rcommaaccent scedilla -15 KPX rcommaaccent scommaaccent -15 KPX rcommaaccent t 20 KPX rcommaaccent tcommaaccent 20 KPX rcommaaccent v 10 KPX rcommaaccent y 10 KPX rcommaaccent yacute 10 KPX rcommaaccent ydieresis 10 KPX s w -15 KPX sacute w -15 KPX scaron w -15 KPX scedilla w -15 KPX scommaaccent w -15 KPX semicolon space -40 KPX space T -100 KPX space Tcaron -100 KPX space Tcommaaccent -100 KPX space V -80 KPX space W -80 KPX space Y -120 KPX space Yacute -120 KPX space Ydieresis -120 KPX space quotedblleft -80 KPX space quoteleft -60 KPX v a -20 KPX v aacute -20 KPX v abreve -20 KPX v acircumflex -20 KPX v adieresis -20 KPX v agrave -20 KPX v amacron -20 KPX v aogonek -20 KPX v aring -20 KPX v atilde -20 KPX v comma -80 KPX v o -30 KPX v oacute -30 KPX v ocircumflex -30 KPX v odieresis -30 KPX v ograve -30 KPX v ohungarumlaut -30 KPX v omacron -30 KPX v oslash -30 KPX v otilde -30 KPX v period -80 KPX w comma -40 KPX w o -20 KPX w oacute -20 KPX w ocircumflex -20 KPX w odieresis -20 KPX w ograve -20 KPX w ohungarumlaut -20 KPX w omacron -20 KPX w oslash -20 KPX w otilde -20 KPX w period -40 KPX x e -10 KPX x eacute -10 KPX x ecaron -10 KPX x ecircumflex -10 KPX x edieresis -10 KPX x edotaccent -10 KPX x egrave -10 KPX x emacron -10 KPX x eogonek -10 KPX y a -30 KPX y aacute -30 KPX y abreve -30 KPX y acircumflex -30 KPX y adieresis -30 KPX y agrave -30 KPX y amacron -30 KPX y aogonek -30 KPX y aring -30 KPX y atilde -30 KPX y comma -80 KPX y e -10 KPX y eacute -10 KPX y ecaron -10 KPX y ecircumflex -10 KPX y edieresis -10 KPX y edotaccent -10 KPX y egrave -10 KPX y emacron -10 KPX y eogonek -10 KPX y o -25 KPX y oacute -25 KPX y ocircumflex -25 KPX y odieresis -25 KPX y ograve -25 KPX y ohungarumlaut -25 KPX y omacron -25 KPX y oslash -25 KPX y otilde -25 KPX y period -80 KPX yacute a -30 KPX yacute aacute -30 KPX yacute abreve -30 KPX yacute acircumflex -30 KPX yacute adieresis -30 KPX yacute agrave -30 KPX yacute amacron -30 KPX yacute aogonek -30 KPX yacute aring -30 KPX yacute atilde -30 KPX yacute comma -80 KPX yacute e -10 KPX yacute eacute -10 KPX yacute ecaron -10 KPX yacute ecircumflex -10 KPX yacute edieresis -10 KPX yacute edotaccent -10 KPX yacute egrave -10 KPX yacute emacron -10 KPX yacute eogonek -10 KPX yacute o -25 KPX yacute oacute -25 KPX yacute ocircumflex -25 KPX yacute odieresis -25 KPX yacute ograve -25 KPX yacute ohungarumlaut -25 KPX yacute omacron -25 KPX yacute oslash -25 KPX yacute otilde -25 KPX yacute period -80 KPX ydieresis a -30 KPX ydieresis aacute -30 KPX ydieresis abreve -30 KPX ydieresis acircumflex -30 KPX ydieresis adieresis -30 KPX ydieresis agrave -30 KPX ydieresis amacron -30 KPX ydieresis aogonek -30 KPX ydieresis aring -30 KPX ydieresis atilde -30 KPX ydieresis comma -80 KPX ydieresis e -10 KPX ydieresis eacute -10 KPX ydieresis ecaron -10 KPX ydieresis ecircumflex -10 KPX ydieresis edieresis -10 KPX ydieresis edotaccent -10 KPX ydieresis egrave -10 KPX ydieresis emacron -10 KPX ydieresis eogonek -10 KPX ydieresis o -25 KPX ydieresis oacute -25 KPX ydieresis ocircumflex -25 KPX ydieresis odieresis -25 KPX ydieresis ograve -25 KPX ydieresis ohungarumlaut -25 KPX ydieresis omacron -25 KPX ydieresis oslash -25 KPX ydieresis otilde -25 KPX ydieresis period -80 KPX z e 10 KPX z eacute 10 KPX z ecaron 10 KPX z ecircumflex 10 KPX z edieresis 10 KPX z edotaccent 10 KPX z egrave 10 KPX z emacron 10 KPX z eogonek 10 KPX zacute e 10 KPX zacute eacute 10 KPX zacute ecaron 10 KPX zacute ecircumflex 10 KPX zacute edieresis 10 KPX zacute edotaccent 10 KPX zacute egrave 10 KPX zacute emacron 10 KPX zacute eogonek 10 KPX zcaron e 10 KPX zcaron eacute 10 KPX zcaron ecaron 10 KPX zcaron ecircumflex 10 KPX zcaron edieresis 10 KPX zcaron edotaccent 10 KPX zcaron egrave 10 KPX zcaron emacron 10 KPX zcaron eogonek 10 KPX zdotaccent e 10 KPX zdotaccent eacute 10 KPX zdotaccent ecaron 10 KPX zdotaccent ecircumflex 10 KPX zdotaccent edieresis 10 KPX zdotaccent edotaccent 10 KPX zdotaccent egrave 10 KPX zdotaccent emacron 10 KPX zdotaccent eogonek 10 EndKernPairs EndKernData EndFontMetrics ruby-prawn-1.0.0~rc2.orig/data/fonts/Helvetica.afm0000644000000000000000000022106412114176157020525 0ustar rootrootStartFontMetrics 4.1 Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved. Comment Creation Date: Thu May 1 12:38:23 1997 Comment UniqueID 43054 Comment VMusage 37069 48094 FontName Helvetica FullName Helvetica FamilyName Helvetica Weight Medium ItalicAngle 0 IsFixedPitch false CharacterSet ExtendedRoman FontBBox -166 -225 1000 931 UnderlinePosition -100 UnderlineThickness 50 Version 002.000 Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. EncodingScheme AdobeStandardEncoding CapHeight 718 XHeight 523 Ascender 718 Descender -207 StdHW 76 StdVW 88 StartCharMetrics 315 C 32 ; WX 278 ; N space ; B 0 0 0 0 ; C 33 ; WX 278 ; N exclam ; B 90 0 187 718 ; C 34 ; WX 355 ; N quotedbl ; B 70 463 285 718 ; C 35 ; WX 556 ; N numbersign ; B 28 0 529 688 ; C 36 ; WX 556 ; N dollar ; B 32 -115 520 775 ; C 37 ; WX 889 ; N percent ; B 39 -19 850 703 ; C 38 ; WX 667 ; N ampersand ; B 44 -15 645 718 ; C 39 ; WX 222 ; N quoteright ; B 53 463 157 718 ; C 40 ; WX 333 ; N parenleft ; B 68 -207 299 733 ; C 41 ; WX 333 ; N parenright ; B 34 -207 265 733 ; C 42 ; WX 389 ; N asterisk ; B 39 431 349 718 ; C 43 ; WX 584 ; N plus ; B 39 0 545 505 ; C 44 ; WX 278 ; N comma ; B 87 -147 191 106 ; C 45 ; WX 333 ; N hyphen ; B 44 232 289 322 ; C 46 ; WX 278 ; N period ; B 87 0 191 106 ; C 47 ; WX 278 ; N slash ; B -17 -19 295 737 ; C 48 ; WX 556 ; N zero ; B 37 -19 519 703 ; C 49 ; WX 556 ; N one ; B 101 0 359 703 ; C 50 ; WX 556 ; N two ; B 26 0 507 703 ; C 51 ; WX 556 ; N three ; B 34 -19 522 703 ; C 52 ; WX 556 ; N four ; B 25 0 523 703 ; C 53 ; WX 556 ; N five ; B 32 -19 514 688 ; C 54 ; WX 556 ; N six ; B 38 -19 518 703 ; C 55 ; WX 556 ; N seven ; B 37 0 523 688 ; C 56 ; WX 556 ; N eight ; B 38 -19 517 703 ; C 57 ; WX 556 ; N nine ; B 42 -19 514 703 ; C 58 ; WX 278 ; N colon ; B 87 0 191 516 ; C 59 ; WX 278 ; N semicolon ; B 87 -147 191 516 ; C 60 ; WX 584 ; N less ; B 48 11 536 495 ; C 61 ; WX 584 ; N equal ; B 39 115 545 390 ; C 62 ; WX 584 ; N greater ; B 48 11 536 495 ; C 63 ; WX 556 ; N question ; B 56 0 492 727 ; C 64 ; WX 1015 ; N at ; B 147 -19 868 737 ; C 65 ; WX 667 ; N A ; B 14 0 654 718 ; C 66 ; WX 667 ; N B ; B 74 0 627 718 ; C 67 ; WX 722 ; N C ; B 44 -19 681 737 ; C 68 ; WX 722 ; N D ; B 81 0 674 718 ; C 69 ; WX 667 ; N E ; B 86 0 616 718 ; C 70 ; WX 611 ; N F ; B 86 0 583 718 ; C 71 ; WX 778 ; N G ; B 48 -19 704 737 ; C 72 ; WX 722 ; N H ; B 77 0 646 718 ; C 73 ; WX 278 ; N I ; B 91 0 188 718 ; C 74 ; WX 500 ; N J ; B 17 -19 428 718 ; C 75 ; WX 667 ; N K ; B 76 0 663 718 ; C 76 ; WX 556 ; N L ; B 76 0 537 718 ; C 77 ; WX 833 ; N M ; B 73 0 761 718 ; C 78 ; WX 722 ; N N ; B 76 0 646 718 ; C 79 ; WX 778 ; N O ; B 39 -19 739 737 ; C 80 ; WX 667 ; N P ; B 86 0 622 718 ; C 81 ; WX 778 ; N Q ; B 39 -56 739 737 ; C 82 ; WX 722 ; N R ; B 88 0 684 718 ; C 83 ; WX 667 ; N S ; B 49 -19 620 737 ; C 84 ; WX 611 ; N T ; B 14 0 597 718 ; C 85 ; WX 722 ; N U ; B 79 -19 644 718 ; C 86 ; WX 667 ; N V ; B 20 0 647 718 ; C 87 ; WX 944 ; N W ; B 16 0 928 718 ; C 88 ; WX 667 ; N X ; B 19 0 648 718 ; C 89 ; WX 667 ; N Y ; B 14 0 653 718 ; C 90 ; WX 611 ; N Z ; B 23 0 588 718 ; C 91 ; WX 278 ; N bracketleft ; B 63 -196 250 722 ; C 92 ; WX 278 ; N backslash ; B -17 -19 295 737 ; C 93 ; WX 278 ; N bracketright ; B 28 -196 215 722 ; C 94 ; WX 469 ; N asciicircum ; B -14 264 483 688 ; C 95 ; WX 556 ; N underscore ; B 0 -125 556 -75 ; C 96 ; WX 222 ; N quoteleft ; B 65 470 169 725 ; C 97 ; WX 556 ; N a ; B 36 -15 530 538 ; C 98 ; WX 556 ; N b ; B 58 -15 517 718 ; C 99 ; WX 500 ; N c ; B 30 -15 477 538 ; C 100 ; WX 556 ; N d ; B 35 -15 499 718 ; C 101 ; WX 556 ; N e ; B 40 -15 516 538 ; C 102 ; WX 278 ; N f ; B 14 0 262 728 ; L i fi ; L l fl ; C 103 ; WX 556 ; N g ; B 40 -220 499 538 ; C 104 ; WX 556 ; N h ; B 65 0 491 718 ; C 105 ; WX 222 ; N i ; B 67 0 155 718 ; C 106 ; WX 222 ; N j ; B -16 -210 155 718 ; C 107 ; WX 500 ; N k ; B 67 0 501 718 ; C 108 ; WX 222 ; N l ; B 67 0 155 718 ; C 109 ; WX 833 ; N m ; B 65 0 769 538 ; C 110 ; WX 556 ; N n ; B 65 0 491 538 ; C 111 ; WX 556 ; N o ; B 35 -14 521 538 ; C 112 ; WX 556 ; N p ; B 58 -207 517 538 ; C 113 ; WX 556 ; N q ; B 35 -207 494 538 ; C 114 ; WX 333 ; N r ; B 77 0 332 538 ; C 115 ; WX 500 ; N s ; B 32 -15 464 538 ; C 116 ; WX 278 ; N t ; B 14 -7 257 669 ; C 117 ; WX 556 ; N u ; B 68 -15 489 523 ; C 118 ; WX 500 ; N v ; B 8 0 492 523 ; C 119 ; WX 722 ; N w ; B 14 0 709 523 ; C 120 ; WX 500 ; N x ; B 11 0 490 523 ; C 121 ; WX 500 ; N y ; B 11 -214 489 523 ; C 122 ; WX 500 ; N z ; B 31 0 469 523 ; C 123 ; WX 334 ; N braceleft ; B 42 -196 292 722 ; C 124 ; WX 260 ; N bar ; B 94 -225 167 775 ; C 125 ; WX 334 ; N braceright ; B 42 -196 292 722 ; C 126 ; WX 584 ; N asciitilde ; B 61 180 523 326 ; C 161 ; WX 333 ; N exclamdown ; B 118 -195 215 523 ; C 162 ; WX 556 ; N cent ; B 51 -115 513 623 ; C 163 ; WX 556 ; N sterling ; B 33 -16 539 718 ; C 164 ; WX 167 ; N fraction ; B -166 -19 333 703 ; C 165 ; WX 556 ; N yen ; B 3 0 553 688 ; C 166 ; WX 556 ; N florin ; B -11 -207 501 737 ; C 167 ; WX 556 ; N section ; B 43 -191 512 737 ; C 168 ; WX 556 ; N currency ; B 28 99 528 603 ; C 169 ; WX 191 ; N quotesingle ; B 59 463 132 718 ; C 170 ; WX 333 ; N quotedblleft ; B 38 470 307 725 ; C 171 ; WX 556 ; N guillemotleft ; B 97 108 459 446 ; C 172 ; WX 333 ; N guilsinglleft ; B 88 108 245 446 ; C 173 ; WX 333 ; N guilsinglright ; B 88 108 245 446 ; C 174 ; WX 500 ; N fi ; B 14 0 434 728 ; C 175 ; WX 500 ; N fl ; B 14 0 432 728 ; C 177 ; WX 556 ; N endash ; B 0 240 556 313 ; C 178 ; WX 556 ; N dagger ; B 43 -159 514 718 ; C 179 ; WX 556 ; N daggerdbl ; B 43 -159 514 718 ; C 180 ; WX 278 ; N periodcentered ; B 77 190 202 315 ; C 182 ; WX 537 ; N paragraph ; B 18 -173 497 718 ; C 183 ; WX 350 ; N bullet ; B 18 202 333 517 ; C 184 ; WX 222 ; N quotesinglbase ; B 53 -149 157 106 ; C 185 ; WX 333 ; N quotedblbase ; B 26 -149 295 106 ; C 186 ; WX 333 ; N quotedblright ; B 26 463 295 718 ; C 187 ; WX 556 ; N guillemotright ; B 97 108 459 446 ; C 188 ; WX 1000 ; N ellipsis ; B 115 0 885 106 ; C 189 ; WX 1000 ; N perthousand ; B 7 -19 994 703 ; C 191 ; WX 611 ; N questiondown ; B 91 -201 527 525 ; C 193 ; WX 333 ; N grave ; B 14 593 211 734 ; C 194 ; WX 333 ; N acute ; B 122 593 319 734 ; C 195 ; WX 333 ; N circumflex ; B 21 593 312 734 ; C 196 ; WX 333 ; N tilde ; B -4 606 337 722 ; C 197 ; WX 333 ; N macron ; B 10 627 323 684 ; C 198 ; WX 333 ; N breve ; B 13 595 321 731 ; C 199 ; WX 333 ; N dotaccent ; B 121 604 212 706 ; C 200 ; WX 333 ; N dieresis ; B 40 604 293 706 ; C 202 ; WX 333 ; N ring ; B 75 572 259 756 ; C 203 ; WX 333 ; N cedilla ; B 45 -225 259 0 ; C 205 ; WX 333 ; N hungarumlaut ; B 31 593 409 734 ; C 206 ; WX 333 ; N ogonek ; B 73 -225 287 0 ; C 207 ; WX 333 ; N caron ; B 21 593 312 734 ; C 208 ; WX 1000 ; N emdash ; B 0 240 1000 313 ; C 225 ; WX 1000 ; N AE ; B 8 0 951 718 ; C 227 ; WX 370 ; N ordfeminine ; B 24 405 346 737 ; C 232 ; WX 556 ; N Lslash ; B -20 0 537 718 ; C 233 ; WX 778 ; N Oslash ; B 39 -19 740 737 ; C 234 ; WX 1000 ; N OE ; B 36 -19 965 737 ; C 235 ; WX 365 ; N ordmasculine ; B 25 405 341 737 ; C 241 ; WX 889 ; N ae ; B 36 -15 847 538 ; C 245 ; WX 278 ; N dotlessi ; B 95 0 183 523 ; C 248 ; WX 222 ; N lslash ; B -20 0 242 718 ; C 249 ; WX 611 ; N oslash ; B 28 -22 537 545 ; C 250 ; WX 944 ; N oe ; B 35 -15 902 538 ; C 251 ; WX 611 ; N germandbls ; B 67 -15 571 728 ; C -1 ; WX 278 ; N Idieresis ; B 13 0 266 901 ; C -1 ; WX 556 ; N eacute ; B 40 -15 516 734 ; C -1 ; WX 556 ; N abreve ; B 36 -15 530 731 ; C -1 ; WX 556 ; N uhungarumlaut ; B 68 -15 521 734 ; C -1 ; WX 556 ; N ecaron ; B 40 -15 516 734 ; C -1 ; WX 667 ; N Ydieresis ; B 14 0 653 901 ; C -1 ; WX 584 ; N divide ; B 39 -19 545 524 ; C -1 ; WX 667 ; N Yacute ; B 14 0 653 929 ; C -1 ; WX 667 ; N Acircumflex ; B 14 0 654 929 ; C -1 ; WX 556 ; N aacute ; B 36 -15 530 734 ; C -1 ; WX 722 ; N Ucircumflex ; B 79 -19 644 929 ; C -1 ; WX 500 ; N yacute ; B 11 -214 489 734 ; C -1 ; WX 500 ; N scommaaccent ; B 32 -225 464 538 ; C -1 ; WX 556 ; N ecircumflex ; B 40 -15 516 734 ; C -1 ; WX 722 ; N Uring ; B 79 -19 644 931 ; C -1 ; WX 722 ; N Udieresis ; B 79 -19 644 901 ; C -1 ; WX 556 ; N aogonek ; B 36 -220 547 538 ; C -1 ; WX 722 ; N Uacute ; B 79 -19 644 929 ; C -1 ; WX 556 ; N uogonek ; B 68 -225 519 523 ; C -1 ; WX 667 ; N Edieresis ; B 86 0 616 901 ; C -1 ; WX 722 ; N Dcroat ; B 0 0 674 718 ; C -1 ; WX 250 ; N commaaccent ; B 87 -225 181 -40 ; C -1 ; WX 737 ; N copyright ; B -14 -19 752 737 ; C -1 ; WX 667 ; N Emacron ; B 86 0 616 879 ; C -1 ; WX 500 ; N ccaron ; B 30 -15 477 734 ; C -1 ; WX 556 ; N aring ; B 36 -15 530 756 ; C -1 ; WX 722 ; N Ncommaaccent ; B 76 -225 646 718 ; C -1 ; WX 222 ; N lacute ; B 67 0 264 929 ; C -1 ; WX 556 ; N agrave ; B 36 -15 530 734 ; C -1 ; WX 611 ; N Tcommaaccent ; B 14 -225 597 718 ; C -1 ; WX 722 ; N Cacute ; B 44 -19 681 929 ; C -1 ; WX 556 ; N atilde ; B 36 -15 530 722 ; C -1 ; WX 667 ; N Edotaccent ; B 86 0 616 901 ; C -1 ; WX 500 ; N scaron ; B 32 -15 464 734 ; C -1 ; WX 500 ; N scedilla ; B 32 -225 464 538 ; C -1 ; WX 278 ; N iacute ; B 95 0 292 734 ; C -1 ; WX 471 ; N lozenge ; B 10 0 462 728 ; C -1 ; WX 722 ; N Rcaron ; B 88 0 684 929 ; C -1 ; WX 778 ; N Gcommaaccent ; B 48 -225 704 737 ; C -1 ; WX 556 ; N ucircumflex ; B 68 -15 489 734 ; C -1 ; WX 556 ; N acircumflex ; B 36 -15 530 734 ; C -1 ; WX 667 ; N Amacron ; B 14 0 654 879 ; C -1 ; WX 333 ; N rcaron ; B 61 0 352 734 ; C -1 ; WX 500 ; N ccedilla ; B 30 -225 477 538 ; C -1 ; WX 611 ; N Zdotaccent ; B 23 0 588 901 ; C -1 ; WX 667 ; N Thorn ; B 86 0 622 718 ; C -1 ; WX 778 ; N Omacron ; B 39 -19 739 879 ; C -1 ; WX 722 ; N Racute ; B 88 0 684 929 ; C -1 ; WX 667 ; N Sacute ; B 49 -19 620 929 ; C -1 ; WX 643 ; N dcaron ; B 35 -15 655 718 ; C -1 ; WX 722 ; N Umacron ; B 79 -19 644 879 ; C -1 ; WX 556 ; N uring ; B 68 -15 489 756 ; C -1 ; WX 333 ; N threesuperior ; B 5 270 325 703 ; C -1 ; WX 778 ; N Ograve ; B 39 -19 739 929 ; C -1 ; WX 667 ; N Agrave ; B 14 0 654 929 ; C -1 ; WX 667 ; N Abreve ; B 14 0 654 926 ; C -1 ; WX 584 ; N multiply ; B 39 0 545 506 ; C -1 ; WX 556 ; N uacute ; B 68 -15 489 734 ; C -1 ; WX 611 ; N Tcaron ; B 14 0 597 929 ; C -1 ; WX 476 ; N partialdiff ; B 13 -38 463 714 ; C -1 ; WX 500 ; N ydieresis ; B 11 -214 489 706 ; C -1 ; WX 722 ; N Nacute ; B 76 0 646 929 ; C -1 ; WX 278 ; N icircumflex ; B -6 0 285 734 ; C -1 ; WX 667 ; N Ecircumflex ; B 86 0 616 929 ; C -1 ; WX 556 ; N adieresis ; B 36 -15 530 706 ; C -1 ; WX 556 ; N edieresis ; B 40 -15 516 706 ; C -1 ; WX 500 ; N cacute ; B 30 -15 477 734 ; C -1 ; WX 556 ; N nacute ; B 65 0 491 734 ; C -1 ; WX 556 ; N umacron ; B 68 -15 489 684 ; C -1 ; WX 722 ; N Ncaron ; B 76 0 646 929 ; C -1 ; WX 278 ; N Iacute ; B 91 0 292 929 ; C -1 ; WX 584 ; N plusminus ; B 39 0 545 506 ; C -1 ; WX 260 ; N brokenbar ; B 94 -150 167 700 ; C -1 ; WX 737 ; N registered ; B -14 -19 752 737 ; C -1 ; WX 778 ; N Gbreve ; B 48 -19 704 926 ; C -1 ; WX 278 ; N Idotaccent ; B 91 0 188 901 ; C -1 ; WX 600 ; N summation ; B 15 -10 586 706 ; C -1 ; WX 667 ; N Egrave ; B 86 0 616 929 ; C -1 ; WX 333 ; N racute ; B 77 0 332 734 ; C -1 ; WX 556 ; N omacron ; B 35 -14 521 684 ; C -1 ; WX 611 ; N Zacute ; B 23 0 588 929 ; C -1 ; WX 611 ; N Zcaron ; B 23 0 588 929 ; C -1 ; WX 549 ; N greaterequal ; B 26 0 523 674 ; C -1 ; WX 722 ; N Eth ; B 0 0 674 718 ; C -1 ; WX 722 ; N Ccedilla ; B 44 -225 681 737 ; C -1 ; WX 222 ; N lcommaaccent ; B 67 -225 167 718 ; C -1 ; WX 317 ; N tcaron ; B 14 -7 329 808 ; C -1 ; WX 556 ; N eogonek ; B 40 -225 516 538 ; C -1 ; WX 722 ; N Uogonek ; B 79 -225 644 718 ; C -1 ; WX 667 ; N Aacute ; B 14 0 654 929 ; C -1 ; WX 667 ; N Adieresis ; B 14 0 654 901 ; C -1 ; WX 556 ; N egrave ; B 40 -15 516 734 ; C -1 ; WX 500 ; N zacute ; B 31 0 469 734 ; C -1 ; WX 222 ; N iogonek ; B -31 -225 183 718 ; C -1 ; WX 778 ; N Oacute ; B 39 -19 739 929 ; C -1 ; WX 556 ; N oacute ; B 35 -14 521 734 ; C -1 ; WX 556 ; N amacron ; B 36 -15 530 684 ; C -1 ; WX 500 ; N sacute ; B 32 -15 464 734 ; C -1 ; WX 278 ; N idieresis ; B 13 0 266 706 ; C -1 ; WX 778 ; N Ocircumflex ; B 39 -19 739 929 ; C -1 ; WX 722 ; N Ugrave ; B 79 -19 644 929 ; C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; C -1 ; WX 556 ; N thorn ; B 58 -207 517 718 ; C -1 ; WX 333 ; N twosuperior ; B 4 281 323 703 ; C -1 ; WX 778 ; N Odieresis ; B 39 -19 739 901 ; C -1 ; WX 556 ; N mu ; B 68 -207 489 523 ; C -1 ; WX 278 ; N igrave ; B -13 0 184 734 ; C -1 ; WX 556 ; N ohungarumlaut ; B 35 -14 521 734 ; C -1 ; WX 667 ; N Eogonek ; B 86 -220 633 718 ; C -1 ; WX 556 ; N dcroat ; B 35 -15 550 718 ; C -1 ; WX 834 ; N threequarters ; B 45 -19 810 703 ; C -1 ; WX 667 ; N Scedilla ; B 49 -225 620 737 ; C -1 ; WX 299 ; N lcaron ; B 67 0 311 718 ; C -1 ; WX 667 ; N Kcommaaccent ; B 76 -225 663 718 ; C -1 ; WX 556 ; N Lacute ; B 76 0 537 929 ; C -1 ; WX 1000 ; N trademark ; B 46 306 903 718 ; C -1 ; WX 556 ; N edotaccent ; B 40 -15 516 706 ; C -1 ; WX 278 ; N Igrave ; B -13 0 188 929 ; C -1 ; WX 278 ; N Imacron ; B -17 0 296 879 ; C -1 ; WX 556 ; N Lcaron ; B 76 0 537 718 ; C -1 ; WX 834 ; N onehalf ; B 43 -19 773 703 ; C -1 ; WX 549 ; N lessequal ; B 26 0 523 674 ; C -1 ; WX 556 ; N ocircumflex ; B 35 -14 521 734 ; C -1 ; WX 556 ; N ntilde ; B 65 0 491 722 ; C -1 ; WX 722 ; N Uhungarumlaut ; B 79 -19 644 929 ; C -1 ; WX 667 ; N Eacute ; B 86 0 616 929 ; C -1 ; WX 556 ; N emacron ; B 40 -15 516 684 ; C -1 ; WX 556 ; N gbreve ; B 40 -220 499 731 ; C -1 ; WX 834 ; N onequarter ; B 73 -19 756 703 ; C -1 ; WX 667 ; N Scaron ; B 49 -19 620 929 ; C -1 ; WX 667 ; N Scommaaccent ; B 49 -225 620 737 ; C -1 ; WX 778 ; N Ohungarumlaut ; B 39 -19 739 929 ; C -1 ; WX 400 ; N degree ; B 54 411 346 703 ; C -1 ; WX 556 ; N ograve ; B 35 -14 521 734 ; C -1 ; WX 722 ; N Ccaron ; B 44 -19 681 929 ; C -1 ; WX 556 ; N ugrave ; B 68 -15 489 734 ; C -1 ; WX 453 ; N radical ; B -4 -80 458 762 ; C -1 ; WX 722 ; N Dcaron ; B 81 0 674 929 ; C -1 ; WX 333 ; N rcommaaccent ; B 77 -225 332 538 ; C -1 ; WX 722 ; N Ntilde ; B 76 0 646 917 ; C -1 ; WX 556 ; N otilde ; B 35 -14 521 722 ; C -1 ; WX 722 ; N Rcommaaccent ; B 88 -225 684 718 ; C -1 ; WX 556 ; N Lcommaaccent ; B 76 -225 537 718 ; C -1 ; WX 667 ; N Atilde ; B 14 0 654 917 ; C -1 ; WX 667 ; N Aogonek ; B 14 -225 654 718 ; C -1 ; WX 667 ; N Aring ; B 14 0 654 931 ; C -1 ; WX 778 ; N Otilde ; B 39 -19 739 917 ; C -1 ; WX 500 ; N zdotaccent ; B 31 0 469 706 ; C -1 ; WX 667 ; N Ecaron ; B 86 0 616 929 ; C -1 ; WX 278 ; N Iogonek ; B -3 -225 211 718 ; C -1 ; WX 500 ; N kcommaaccent ; B 67 -225 501 718 ; C -1 ; WX 584 ; N minus ; B 39 216 545 289 ; C -1 ; WX 278 ; N Icircumflex ; B -6 0 285 929 ; C -1 ; WX 556 ; N ncaron ; B 65 0 491 734 ; C -1 ; WX 278 ; N tcommaaccent ; B 14 -225 257 669 ; C -1 ; WX 584 ; N logicalnot ; B 39 108 545 390 ; C -1 ; WX 556 ; N odieresis ; B 35 -14 521 706 ; C -1 ; WX 556 ; N udieresis ; B 68 -15 489 706 ; C -1 ; WX 549 ; N notequal ; B 12 -35 537 551 ; C -1 ; WX 556 ; N gcommaaccent ; B 40 -220 499 822 ; C -1 ; WX 556 ; N eth ; B 35 -15 522 737 ; C -1 ; WX 500 ; N zcaron ; B 31 0 469 734 ; C -1 ; WX 556 ; N ncommaaccent ; B 65 -225 491 538 ; C -1 ; WX 333 ; N onesuperior ; B 43 281 222 703 ; C -1 ; WX 278 ; N imacron ; B 5 0 272 684 ; C -1 ; WX 556 ; N Euro ; B 0 0 0 0 ; EndCharMetrics StartKernData StartKernPairs 2705 KPX A C -30 KPX A Cacute -30 KPX A Ccaron -30 KPX A Ccedilla -30 KPX A G -30 KPX A Gbreve -30 KPX A Gcommaaccent -30 KPX A O -30 KPX A Oacute -30 KPX A Ocircumflex -30 KPX A Odieresis -30 KPX A Ograve -30 KPX A Ohungarumlaut -30 KPX A Omacron -30 KPX A Oslash -30 KPX A Otilde -30 KPX A Q -30 KPX A T -120 KPX A Tcaron -120 KPX A Tcommaaccent -120 KPX A U -50 KPX A Uacute -50 KPX A Ucircumflex -50 KPX A Udieresis -50 KPX A Ugrave -50 KPX A Uhungarumlaut -50 KPX A Umacron -50 KPX A Uogonek -50 KPX A Uring -50 KPX A V -70 KPX A W -50 KPX A Y -100 KPX A Yacute -100 KPX A Ydieresis -100 KPX A u -30 KPX A uacute -30 KPX A ucircumflex -30 KPX A udieresis -30 KPX A ugrave -30 KPX A uhungarumlaut -30 KPX A umacron -30 KPX A uogonek -30 KPX A uring -30 KPX A v -40 KPX A w -40 KPX A y -40 KPX A yacute -40 KPX A ydieresis -40 KPX Aacute C -30 KPX Aacute Cacute -30 KPX Aacute Ccaron -30 KPX Aacute Ccedilla -30 KPX Aacute G -30 KPX Aacute Gbreve -30 KPX Aacute Gcommaaccent -30 KPX Aacute O -30 KPX Aacute Oacute -30 KPX Aacute Ocircumflex -30 KPX Aacute Odieresis -30 KPX Aacute Ograve -30 KPX Aacute Ohungarumlaut -30 KPX Aacute Omacron -30 KPX Aacute Oslash -30 KPX Aacute Otilde -30 KPX Aacute Q -30 KPX Aacute T -120 KPX Aacute Tcaron -120 KPX Aacute Tcommaaccent -120 KPX Aacute U -50 KPX Aacute Uacute -50 KPX Aacute Ucircumflex -50 KPX Aacute Udieresis -50 KPX Aacute Ugrave -50 KPX Aacute Uhungarumlaut -50 KPX Aacute Umacron -50 KPX Aacute Uogonek -50 KPX Aacute Uring -50 KPX Aacute V -70 KPX Aacute W -50 KPX Aacute Y -100 KPX Aacute Yacute -100 KPX Aacute Ydieresis -100 KPX Aacute u -30 KPX Aacute uacute -30 KPX Aacute ucircumflex -30 KPX Aacute udieresis -30 KPX Aacute ugrave -30 KPX Aacute uhungarumlaut -30 KPX Aacute umacron -30 KPX Aacute uogonek -30 KPX Aacute uring -30 KPX Aacute v -40 KPX Aacute w -40 KPX Aacute y -40 KPX Aacute yacute -40 KPX Aacute ydieresis -40 KPX Abreve C -30 KPX Abreve Cacute -30 KPX Abreve Ccaron -30 KPX Abreve Ccedilla -30 KPX Abreve G -30 KPX Abreve Gbreve -30 KPX Abreve Gcommaaccent -30 KPX Abreve O -30 KPX Abreve Oacute -30 KPX Abreve Ocircumflex -30 KPX Abreve Odieresis -30 KPX Abreve Ograve -30 KPX Abreve Ohungarumlaut -30 KPX Abreve Omacron -30 KPX Abreve Oslash -30 KPX Abreve Otilde -30 KPX Abreve Q -30 KPX Abreve T -120 KPX Abreve Tcaron -120 KPX Abreve Tcommaaccent -120 KPX Abreve U -50 KPX Abreve Uacute -50 KPX Abreve Ucircumflex -50 KPX Abreve Udieresis -50 KPX Abreve Ugrave -50 KPX Abreve Uhungarumlaut -50 KPX Abreve Umacron -50 KPX Abreve Uogonek -50 KPX Abreve Uring -50 KPX Abreve V -70 KPX Abreve W -50 KPX Abreve Y -100 KPX Abreve Yacute -100 KPX Abreve Ydieresis -100 KPX Abreve u -30 KPX Abreve uacute -30 KPX Abreve ucircumflex -30 KPX Abreve udieresis -30 KPX Abreve ugrave -30 KPX Abreve uhungarumlaut -30 KPX Abreve umacron -30 KPX Abreve uogonek -30 KPX Abreve uring -30 KPX Abreve v -40 KPX Abreve w -40 KPX Abreve y -40 KPX Abreve yacute -40 KPX Abreve ydieresis -40 KPX Acircumflex C -30 KPX Acircumflex Cacute -30 KPX Acircumflex Ccaron -30 KPX Acircumflex Ccedilla -30 KPX Acircumflex G -30 KPX Acircumflex Gbreve -30 KPX Acircumflex Gcommaaccent -30 KPX Acircumflex O -30 KPX Acircumflex Oacute -30 KPX Acircumflex Ocircumflex -30 KPX Acircumflex Odieresis -30 KPX Acircumflex Ograve -30 KPX Acircumflex Ohungarumlaut -30 KPX Acircumflex Omacron -30 KPX Acircumflex Oslash -30 KPX Acircumflex Otilde -30 KPX Acircumflex Q -30 KPX Acircumflex T -120 KPX Acircumflex Tcaron -120 KPX Acircumflex Tcommaaccent -120 KPX Acircumflex U -50 KPX Acircumflex Uacute -50 KPX Acircumflex Ucircumflex -50 KPX Acircumflex Udieresis -50 KPX Acircumflex Ugrave -50 KPX Acircumflex Uhungarumlaut -50 KPX Acircumflex Umacron -50 KPX Acircumflex Uogonek -50 KPX Acircumflex Uring -50 KPX Acircumflex V -70 KPX Acircumflex W -50 KPX Acircumflex Y -100 KPX Acircumflex Yacute -100 KPX Acircumflex Ydieresis -100 KPX Acircumflex u -30 KPX Acircumflex uacute -30 KPX Acircumflex ucircumflex -30 KPX Acircumflex udieresis -30 KPX Acircumflex ugrave -30 KPX Acircumflex uhungarumlaut -30 KPX Acircumflex umacron -30 KPX Acircumflex uogonek -30 KPX Acircumflex uring -30 KPX Acircumflex v -40 KPX Acircumflex w -40 KPX Acircumflex y -40 KPX Acircumflex yacute -40 KPX Acircumflex ydieresis -40 KPX Adieresis C -30 KPX Adieresis Cacute -30 KPX Adieresis Ccaron -30 KPX Adieresis Ccedilla -30 KPX Adieresis G -30 KPX Adieresis Gbreve -30 KPX Adieresis Gcommaaccent -30 KPX Adieresis O -30 KPX Adieresis Oacute -30 KPX Adieresis Ocircumflex -30 KPX Adieresis Odieresis -30 KPX Adieresis Ograve -30 KPX Adieresis Ohungarumlaut -30 KPX Adieresis Omacron -30 KPX Adieresis Oslash -30 KPX Adieresis Otilde -30 KPX Adieresis Q -30 KPX Adieresis T -120 KPX Adieresis Tcaron -120 KPX Adieresis Tcommaaccent -120 KPX Adieresis U -50 KPX Adieresis Uacute -50 KPX Adieresis Ucircumflex -50 KPX Adieresis Udieresis -50 KPX Adieresis Ugrave -50 KPX Adieresis Uhungarumlaut -50 KPX Adieresis Umacron -50 KPX Adieresis Uogonek -50 KPX Adieresis Uring -50 KPX Adieresis V -70 KPX Adieresis W -50 KPX Adieresis Y -100 KPX Adieresis Yacute -100 KPX Adieresis Ydieresis -100 KPX Adieresis u -30 KPX Adieresis uacute -30 KPX Adieresis ucircumflex -30 KPX Adieresis udieresis -30 KPX Adieresis ugrave -30 KPX Adieresis uhungarumlaut -30 KPX Adieresis umacron -30 KPX Adieresis uogonek -30 KPX Adieresis uring -30 KPX Adieresis v -40 KPX Adieresis w -40 KPX Adieresis y -40 KPX Adieresis yacute -40 KPX Adieresis ydieresis -40 KPX Agrave C -30 KPX Agrave Cacute -30 KPX Agrave Ccaron -30 KPX Agrave Ccedilla -30 KPX Agrave G -30 KPX Agrave Gbreve -30 KPX Agrave Gcommaaccent -30 KPX Agrave O -30 KPX Agrave Oacute -30 KPX Agrave Ocircumflex -30 KPX Agrave Odieresis -30 KPX Agrave Ograve -30 KPX Agrave Ohungarumlaut -30 KPX Agrave Omacron -30 KPX Agrave Oslash -30 KPX Agrave Otilde -30 KPX Agrave Q -30 KPX Agrave T -120 KPX Agrave Tcaron -120 KPX Agrave Tcommaaccent -120 KPX Agrave U -50 KPX Agrave Uacute -50 KPX Agrave Ucircumflex -50 KPX Agrave Udieresis -50 KPX Agrave Ugrave -50 KPX Agrave Uhungarumlaut -50 KPX Agrave Umacron -50 KPX Agrave Uogonek -50 KPX Agrave Uring -50 KPX Agrave V -70 KPX Agrave W -50 KPX Agrave Y -100 KPX Agrave Yacute -100 KPX Agrave Ydieresis -100 KPX Agrave u -30 KPX Agrave uacute -30 KPX Agrave ucircumflex -30 KPX Agrave udieresis -30 KPX Agrave ugrave -30 KPX Agrave uhungarumlaut -30 KPX Agrave umacron -30 KPX Agrave uogonek -30 KPX Agrave uring -30 KPX Agrave v -40 KPX Agrave w -40 KPX Agrave y -40 KPX Agrave yacute -40 KPX Agrave ydieresis -40 KPX Amacron C -30 KPX Amacron Cacute -30 KPX Amacron Ccaron -30 KPX Amacron Ccedilla -30 KPX Amacron G -30 KPX Amacron Gbreve -30 KPX Amacron Gcommaaccent -30 KPX Amacron O -30 KPX Amacron Oacute -30 KPX Amacron Ocircumflex -30 KPX Amacron Odieresis -30 KPX Amacron Ograve -30 KPX Amacron Ohungarumlaut -30 KPX Amacron Omacron -30 KPX Amacron Oslash -30 KPX Amacron Otilde -30 KPX Amacron Q -30 KPX Amacron T -120 KPX Amacron Tcaron -120 KPX Amacron Tcommaaccent -120 KPX Amacron U -50 KPX Amacron Uacute -50 KPX Amacron Ucircumflex -50 KPX Amacron Udieresis -50 KPX Amacron Ugrave -50 KPX Amacron Uhungarumlaut -50 KPX Amacron Umacron -50 KPX Amacron Uogonek -50 KPX Amacron Uring -50 KPX Amacron V -70 KPX Amacron W -50 KPX Amacron Y -100 KPX Amacron Yacute -100 KPX Amacron Ydieresis -100 KPX Amacron u -30 KPX Amacron uacute -30 KPX Amacron ucircumflex -30 KPX Amacron udieresis -30 KPX Amacron ugrave -30 KPX Amacron uhungarumlaut -30 KPX Amacron umacron -30 KPX Amacron uogonek -30 KPX Amacron uring -30 KPX Amacron v -40 KPX Amacron w -40 KPX Amacron y -40 KPX Amacron yacute -40 KPX Amacron ydieresis -40 KPX Aogonek C -30 KPX Aogonek Cacute -30 KPX Aogonek Ccaron -30 KPX Aogonek Ccedilla -30 KPX Aogonek G -30 KPX Aogonek Gbreve -30 KPX Aogonek Gcommaaccent -30 KPX Aogonek O -30 KPX Aogonek Oacute -30 KPX Aogonek Ocircumflex -30 KPX Aogonek Odieresis -30 KPX Aogonek Ograve -30 KPX Aogonek Ohungarumlaut -30 KPX Aogonek Omacron -30 KPX Aogonek Oslash -30 KPX Aogonek Otilde -30 KPX Aogonek Q -30 KPX Aogonek T -120 KPX Aogonek Tcaron -120 KPX Aogonek Tcommaaccent -120 KPX Aogonek U -50 KPX Aogonek Uacute -50 KPX Aogonek Ucircumflex -50 KPX Aogonek Udieresis -50 KPX Aogonek Ugrave -50 KPX Aogonek Uhungarumlaut -50 KPX Aogonek Umacron -50 KPX Aogonek Uogonek -50 KPX Aogonek Uring -50 KPX Aogonek V -70 KPX Aogonek W -50 KPX Aogonek Y -100 KPX Aogonek Yacute -100 KPX Aogonek Ydieresis -100 KPX Aogonek u -30 KPX Aogonek uacute -30 KPX Aogonek ucircumflex -30 KPX Aogonek udieresis -30 KPX Aogonek ugrave -30 KPX Aogonek uhungarumlaut -30 KPX Aogonek umacron -30 KPX Aogonek uogonek -30 KPX Aogonek uring -30 KPX Aogonek v -40 KPX Aogonek w -40 KPX Aogonek y -40 KPX Aogonek yacute -40 KPX Aogonek ydieresis -40 KPX Aring C -30 KPX Aring Cacute -30 KPX Aring Ccaron -30 KPX Aring Ccedilla -30 KPX Aring G -30 KPX Aring Gbreve -30 KPX Aring Gcommaaccent -30 KPX Aring O -30 KPX Aring Oacute -30 KPX Aring Ocircumflex -30 KPX Aring Odieresis -30 KPX Aring Ograve -30 KPX Aring Ohungarumlaut -30 KPX Aring Omacron -30 KPX Aring Oslash -30 KPX Aring Otilde -30 KPX Aring Q -30 KPX Aring T -120 KPX Aring Tcaron -120 KPX Aring Tcommaaccent -120 KPX Aring U -50 KPX Aring Uacute -50 KPX Aring Ucircumflex -50 KPX Aring Udieresis -50 KPX Aring Ugrave -50 KPX Aring Uhungarumlaut -50 KPX Aring Umacron -50 KPX Aring Uogonek -50 KPX Aring Uring -50 KPX Aring V -70 KPX Aring W -50 KPX Aring Y -100 KPX Aring Yacute -100 KPX Aring Ydieresis -100 KPX Aring u -30 KPX Aring uacute -30 KPX Aring ucircumflex -30 KPX Aring udieresis -30 KPX Aring ugrave -30 KPX Aring uhungarumlaut -30 KPX Aring umacron -30 KPX Aring uogonek -30 KPX Aring uring -30 KPX Aring v -40 KPX Aring w -40 KPX Aring y -40 KPX Aring yacute -40 KPX Aring ydieresis -40 KPX Atilde C -30 KPX Atilde Cacute -30 KPX Atilde Ccaron -30 KPX Atilde Ccedilla -30 KPX Atilde G -30 KPX Atilde Gbreve -30 KPX Atilde Gcommaaccent -30 KPX Atilde O -30 KPX Atilde Oacute -30 KPX Atilde Ocircumflex -30 KPX Atilde Odieresis -30 KPX Atilde Ograve -30 KPX Atilde Ohungarumlaut -30 KPX Atilde Omacron -30 KPX Atilde Oslash -30 KPX Atilde Otilde -30 KPX Atilde Q -30 KPX Atilde T -120 KPX Atilde Tcaron -120 KPX Atilde Tcommaaccent -120 KPX Atilde U -50 KPX Atilde Uacute -50 KPX Atilde Ucircumflex -50 KPX Atilde Udieresis -50 KPX Atilde Ugrave -50 KPX Atilde Uhungarumlaut -50 KPX Atilde Umacron -50 KPX Atilde Uogonek -50 KPX Atilde Uring -50 KPX Atilde V -70 KPX Atilde W -50 KPX Atilde Y -100 KPX Atilde Yacute -100 KPX Atilde Ydieresis -100 KPX Atilde u -30 KPX Atilde uacute -30 KPX Atilde ucircumflex -30 KPX Atilde udieresis -30 KPX Atilde ugrave -30 KPX Atilde uhungarumlaut -30 KPX Atilde umacron -30 KPX Atilde uogonek -30 KPX Atilde uring -30 KPX Atilde v -40 KPX Atilde w -40 KPX Atilde y -40 KPX Atilde yacute -40 KPX Atilde ydieresis -40 KPX B U -10 KPX B Uacute -10 KPX B Ucircumflex -10 KPX B Udieresis -10 KPX B Ugrave -10 KPX B Uhungarumlaut -10 KPX B Umacron -10 KPX B Uogonek -10 KPX B Uring -10 KPX B comma -20 KPX B period -20 KPX C comma -30 KPX C period -30 KPX Cacute comma -30 KPX Cacute period -30 KPX Ccaron comma -30 KPX Ccaron period -30 KPX Ccedilla comma -30 KPX Ccedilla period -30 KPX D A -40 KPX D Aacute -40 KPX D Abreve -40 KPX D Acircumflex -40 KPX D Adieresis -40 KPX D Agrave -40 KPX D Amacron -40 KPX D Aogonek -40 KPX D Aring -40 KPX D Atilde -40 KPX D V -70 KPX D W -40 KPX D Y -90 KPX D Yacute -90 KPX D Ydieresis -90 KPX D comma -70 KPX D period -70 KPX Dcaron A -40 KPX Dcaron Aacute -40 KPX Dcaron Abreve -40 KPX Dcaron Acircumflex -40 KPX Dcaron Adieresis -40 KPX Dcaron Agrave -40 KPX Dcaron Amacron -40 KPX Dcaron Aogonek -40 KPX Dcaron Aring -40 KPX Dcaron Atilde -40 KPX Dcaron V -70 KPX Dcaron W -40 KPX Dcaron Y -90 KPX Dcaron Yacute -90 KPX Dcaron Ydieresis -90 KPX Dcaron comma -70 KPX Dcaron period -70 KPX Dcroat A -40 KPX Dcroat Aacute -40 KPX Dcroat Abreve -40 KPX Dcroat Acircumflex -40 KPX Dcroat Adieresis -40 KPX Dcroat Agrave -40 KPX Dcroat Amacron -40 KPX Dcroat Aogonek -40 KPX Dcroat Aring -40 KPX Dcroat Atilde -40 KPX Dcroat V -70 KPX Dcroat W -40 KPX Dcroat Y -90 KPX Dcroat Yacute -90 KPX Dcroat Ydieresis -90 KPX Dcroat comma -70 KPX Dcroat period -70 KPX F A -80 KPX F Aacute -80 KPX F Abreve -80 KPX F Acircumflex -80 KPX F Adieresis -80 KPX F Agrave -80 KPX F Amacron -80 KPX F Aogonek -80 KPX F Aring -80 KPX F Atilde -80 KPX F a -50 KPX F aacute -50 KPX F abreve -50 KPX F acircumflex -50 KPX F adieresis -50 KPX F agrave -50 KPX F amacron -50 KPX F aogonek -50 KPX F aring -50 KPX F atilde -50 KPX F comma -150 KPX F e -30 KPX F eacute -30 KPX F ecaron -30 KPX F ecircumflex -30 KPX F edieresis -30 KPX F edotaccent -30 KPX F egrave -30 KPX F emacron -30 KPX F eogonek -30 KPX F o -30 KPX F oacute -30 KPX F ocircumflex -30 KPX F odieresis -30 KPX F ograve -30 KPX F ohungarumlaut -30 KPX F omacron -30 KPX F oslash -30 KPX F otilde -30 KPX F period -150 KPX F r -45 KPX F racute -45 KPX F rcaron -45 KPX F rcommaaccent -45 KPX J A -20 KPX J Aacute -20 KPX J Abreve -20 KPX J Acircumflex -20 KPX J Adieresis -20 KPX J Agrave -20 KPX J Amacron -20 KPX J Aogonek -20 KPX J Aring -20 KPX J Atilde -20 KPX J a -20 KPX J aacute -20 KPX J abreve -20 KPX J acircumflex -20 KPX J adieresis -20 KPX J agrave -20 KPX J amacron -20 KPX J aogonek -20 KPX J aring -20 KPX J atilde -20 KPX J comma -30 KPX J period -30 KPX J u -20 KPX J uacute -20 KPX J ucircumflex -20 KPX J udieresis -20 KPX J ugrave -20 KPX J uhungarumlaut -20 KPX J umacron -20 KPX J uogonek -20 KPX J uring -20 KPX K O -50 KPX K Oacute -50 KPX K Ocircumflex -50 KPX K Odieresis -50 KPX K Ograve -50 KPX K Ohungarumlaut -50 KPX K Omacron -50 KPX K Oslash -50 KPX K Otilde -50 KPX K e -40 KPX K eacute -40 KPX K ecaron -40 KPX K ecircumflex -40 KPX K edieresis -40 KPX K edotaccent -40 KPX K egrave -40 KPX K emacron -40 KPX K eogonek -40 KPX K o -40 KPX K oacute -40 KPX K ocircumflex -40 KPX K odieresis -40 KPX K ograve -40 KPX K ohungarumlaut -40 KPX K omacron -40 KPX K oslash -40 KPX K otilde -40 KPX K u -30 KPX K uacute -30 KPX K ucircumflex -30 KPX K udieresis -30 KPX K ugrave -30 KPX K uhungarumlaut -30 KPX K umacron -30 KPX K uogonek -30 KPX K uring -30 KPX K y -50 KPX K yacute -50 KPX K ydieresis -50 KPX Kcommaaccent O -50 KPX Kcommaaccent Oacute -50 KPX Kcommaaccent Ocircumflex -50 KPX Kcommaaccent Odieresis -50 KPX Kcommaaccent Ograve -50 KPX Kcommaaccent Ohungarumlaut -50 KPX Kcommaaccent Omacron -50 KPX Kcommaaccent Oslash -50 KPX Kcommaaccent Otilde -50 KPX Kcommaaccent e -40 KPX Kcommaaccent eacute -40 KPX Kcommaaccent ecaron -40 KPX Kcommaaccent ecircumflex -40 KPX Kcommaaccent edieresis -40 KPX Kcommaaccent edotaccent -40 KPX Kcommaaccent egrave -40 KPX Kcommaaccent emacron -40 KPX Kcommaaccent eogonek -40 KPX Kcommaaccent o -40 KPX Kcommaaccent oacute -40 KPX Kcommaaccent ocircumflex -40 KPX Kcommaaccent odieresis -40 KPX Kcommaaccent ograve -40 KPX Kcommaaccent ohungarumlaut -40 KPX Kcommaaccent omacron -40 KPX Kcommaaccent oslash -40 KPX Kcommaaccent otilde -40 KPX Kcommaaccent u -30 KPX Kcommaaccent uacute -30 KPX Kcommaaccent ucircumflex -30 KPX Kcommaaccent udieresis -30 KPX Kcommaaccent ugrave -30 KPX Kcommaaccent uhungarumlaut -30 KPX Kcommaaccent umacron -30 KPX Kcommaaccent uogonek -30 KPX Kcommaaccent uring -30 KPX Kcommaaccent y -50 KPX Kcommaaccent yacute -50 KPX Kcommaaccent ydieresis -50 KPX L T -110 KPX L Tcaron -110 KPX L Tcommaaccent -110 KPX L V -110 KPX L W -70 KPX L Y -140 KPX L Yacute -140 KPX L Ydieresis -140 KPX L quotedblright -140 KPX L quoteright -160 KPX L y -30 KPX L yacute -30 KPX L ydieresis -30 KPX Lacute T -110 KPX Lacute Tcaron -110 KPX Lacute Tcommaaccent -110 KPX Lacute V -110 KPX Lacute W -70 KPX Lacute Y -140 KPX Lacute Yacute -140 KPX Lacute Ydieresis -140 KPX Lacute quotedblright -140 KPX Lacute quoteright -160 KPX Lacute y -30 KPX Lacute yacute -30 KPX Lacute ydieresis -30 KPX Lcaron T -110 KPX Lcaron Tcaron -110 KPX Lcaron Tcommaaccent -110 KPX Lcaron V -110 KPX Lcaron W -70 KPX Lcaron Y -140 KPX Lcaron Yacute -140 KPX Lcaron Ydieresis -140 KPX Lcaron quotedblright -140 KPX Lcaron quoteright -160 KPX Lcaron y -30 KPX Lcaron yacute -30 KPX Lcaron ydieresis -30 KPX Lcommaaccent T -110 KPX Lcommaaccent Tcaron -110 KPX Lcommaaccent Tcommaaccent -110 KPX Lcommaaccent V -110 KPX Lcommaaccent W -70 KPX Lcommaaccent Y -140 KPX Lcommaaccent Yacute -140 KPX Lcommaaccent Ydieresis -140 KPX Lcommaaccent quotedblright -140 KPX Lcommaaccent quoteright -160 KPX Lcommaaccent y -30 KPX Lcommaaccent yacute -30 KPX Lcommaaccent ydieresis -30 KPX Lslash T -110 KPX Lslash Tcaron -110 KPX Lslash Tcommaaccent -110 KPX Lslash V -110 KPX Lslash W -70 KPX Lslash Y -140 KPX Lslash Yacute -140 KPX Lslash Ydieresis -140 KPX Lslash quotedblright -140 KPX Lslash quoteright -160 KPX Lslash y -30 KPX Lslash yacute -30 KPX Lslash ydieresis -30 KPX O A -20 KPX O Aacute -20 KPX O Abreve -20 KPX O Acircumflex -20 KPX O Adieresis -20 KPX O Agrave -20 KPX O Amacron -20 KPX O Aogonek -20 KPX O Aring -20 KPX O Atilde -20 KPX O T -40 KPX O Tcaron -40 KPX O Tcommaaccent -40 KPX O V -50 KPX O W -30 KPX O X -60 KPX O Y -70 KPX O Yacute -70 KPX O Ydieresis -70 KPX O comma -40 KPX O period -40 KPX Oacute A -20 KPX Oacute Aacute -20 KPX Oacute Abreve -20 KPX Oacute Acircumflex -20 KPX Oacute Adieresis -20 KPX Oacute Agrave -20 KPX Oacute Amacron -20 KPX Oacute Aogonek -20 KPX Oacute Aring -20 KPX Oacute Atilde -20 KPX Oacute T -40 KPX Oacute Tcaron -40 KPX Oacute Tcommaaccent -40 KPX Oacute V -50 KPX Oacute W -30 KPX Oacute X -60 KPX Oacute Y -70 KPX Oacute Yacute -70 KPX Oacute Ydieresis -70 KPX Oacute comma -40 KPX Oacute period -40 KPX Ocircumflex A -20 KPX Ocircumflex Aacute -20 KPX Ocircumflex Abreve -20 KPX Ocircumflex Acircumflex -20 KPX Ocircumflex Adieresis -20 KPX Ocircumflex Agrave -20 KPX Ocircumflex Amacron -20 KPX Ocircumflex Aogonek -20 KPX Ocircumflex Aring -20 KPX Ocircumflex Atilde -20 KPX Ocircumflex T -40 KPX Ocircumflex Tcaron -40 KPX Ocircumflex Tcommaaccent -40 KPX Ocircumflex V -50 KPX Ocircumflex W -30 KPX Ocircumflex X -60 KPX Ocircumflex Y -70 KPX Ocircumflex Yacute -70 KPX Ocircumflex Ydieresis -70 KPX Ocircumflex comma -40 KPX Ocircumflex period -40 KPX Odieresis A -20 KPX Odieresis Aacute -20 KPX Odieresis Abreve -20 KPX Odieresis Acircumflex -20 KPX Odieresis Adieresis -20 KPX Odieresis Agrave -20 KPX Odieresis Amacron -20 KPX Odieresis Aogonek -20 KPX Odieresis Aring -20 KPX Odieresis Atilde -20 KPX Odieresis T -40 KPX Odieresis Tcaron -40 KPX Odieresis Tcommaaccent -40 KPX Odieresis V -50 KPX Odieresis W -30 KPX Odieresis X -60 KPX Odieresis Y -70 KPX Odieresis Yacute -70 KPX Odieresis Ydieresis -70 KPX Odieresis comma -40 KPX Odieresis period -40 KPX Ograve A -20 KPX Ograve Aacute -20 KPX Ograve Abreve -20 KPX Ograve Acircumflex -20 KPX Ograve Adieresis -20 KPX Ograve Agrave -20 KPX Ograve Amacron -20 KPX Ograve Aogonek -20 KPX Ograve Aring -20 KPX Ograve Atilde -20 KPX Ograve T -40 KPX Ograve Tcaron -40 KPX Ograve Tcommaaccent -40 KPX Ograve V -50 KPX Ograve W -30 KPX Ograve X -60 KPX Ograve Y -70 KPX Ograve Yacute -70 KPX Ograve Ydieresis -70 KPX Ograve comma -40 KPX Ograve period -40 KPX Ohungarumlaut A -20 KPX Ohungarumlaut Aacute -20 KPX Ohungarumlaut Abreve -20 KPX Ohungarumlaut Acircumflex -20 KPX Ohungarumlaut Adieresis -20 KPX Ohungarumlaut Agrave -20 KPX Ohungarumlaut Amacron -20 KPX Ohungarumlaut Aogonek -20 KPX Ohungarumlaut Aring -20 KPX Ohungarumlaut Atilde -20 KPX Ohungarumlaut T -40 KPX Ohungarumlaut Tcaron -40 KPX Ohungarumlaut Tcommaaccent -40 KPX Ohungarumlaut V -50 KPX Ohungarumlaut W -30 KPX Ohungarumlaut X -60 KPX Ohungarumlaut Y -70 KPX Ohungarumlaut Yacute -70 KPX Ohungarumlaut Ydieresis -70 KPX Ohungarumlaut comma -40 KPX Ohungarumlaut period -40 KPX Omacron A -20 KPX Omacron Aacute -20 KPX Omacron Abreve -20 KPX Omacron Acircumflex -20 KPX Omacron Adieresis -20 KPX Omacron Agrave -20 KPX Omacron Amacron -20 KPX Omacron Aogonek -20 KPX Omacron Aring -20 KPX Omacron Atilde -20 KPX Omacron T -40 KPX Omacron Tcaron -40 KPX Omacron Tcommaaccent -40 KPX Omacron V -50 KPX Omacron W -30 KPX Omacron X -60 KPX Omacron Y -70 KPX Omacron Yacute -70 KPX Omacron Ydieresis -70 KPX Omacron comma -40 KPX Omacron period -40 KPX Oslash A -20 KPX Oslash Aacute -20 KPX Oslash Abreve -20 KPX Oslash Acircumflex -20 KPX Oslash Adieresis -20 KPX Oslash Agrave -20 KPX Oslash Amacron -20 KPX Oslash Aogonek -20 KPX Oslash Aring -20 KPX Oslash Atilde -20 KPX Oslash T -40 KPX Oslash Tcaron -40 KPX Oslash Tcommaaccent -40 KPX Oslash V -50 KPX Oslash W -30 KPX Oslash X -60 KPX Oslash Y -70 KPX Oslash Yacute -70 KPX Oslash Ydieresis -70 KPX Oslash comma -40 KPX Oslash period -40 KPX Otilde A -20 KPX Otilde Aacute -20 KPX Otilde Abreve -20 KPX Otilde Acircumflex -20 KPX Otilde Adieresis -20 KPX Otilde Agrave -20 KPX Otilde Amacron -20 KPX Otilde Aogonek -20 KPX Otilde Aring -20 KPX Otilde Atilde -20 KPX Otilde T -40 KPX Otilde Tcaron -40 KPX Otilde Tcommaaccent -40 KPX Otilde V -50 KPX Otilde W -30 KPX Otilde X -60 KPX Otilde Y -70 KPX Otilde Yacute -70 KPX Otilde Ydieresis -70 KPX Otilde comma -40 KPX Otilde period -40 KPX P A -120 KPX P Aacute -120 KPX P Abreve -120 KPX P Acircumflex -120 KPX P Adieresis -120 KPX P Agrave -120 KPX P Amacron -120 KPX P Aogonek -120 KPX P Aring -120 KPX P Atilde -120 KPX P a -40 KPX P aacute -40 KPX P abreve -40 KPX P acircumflex -40 KPX P adieresis -40 KPX P agrave -40 KPX P amacron -40 KPX P aogonek -40 KPX P aring -40 KPX P atilde -40 KPX P comma -180 KPX P e -50 KPX P eacute -50 KPX P ecaron -50 KPX P ecircumflex -50 KPX P edieresis -50 KPX P edotaccent -50 KPX P egrave -50 KPX P emacron -50 KPX P eogonek -50 KPX P o -50 KPX P oacute -50 KPX P ocircumflex -50 KPX P odieresis -50 KPX P ograve -50 KPX P ohungarumlaut -50 KPX P omacron -50 KPX P oslash -50 KPX P otilde -50 KPX P period -180 KPX Q U -10 KPX Q Uacute -10 KPX Q Ucircumflex -10 KPX Q Udieresis -10 KPX Q Ugrave -10 KPX Q Uhungarumlaut -10 KPX Q Umacron -10 KPX Q Uogonek -10 KPX Q Uring -10 KPX R O -20 KPX R Oacute -20 KPX R Ocircumflex -20 KPX R Odieresis -20 KPX R Ograve -20 KPX R Ohungarumlaut -20 KPX R Omacron -20 KPX R Oslash -20 KPX R Otilde -20 KPX R T -30 KPX R Tcaron -30 KPX R Tcommaaccent -30 KPX R U -40 KPX R Uacute -40 KPX R Ucircumflex -40 KPX R Udieresis -40 KPX R Ugrave -40 KPX R Uhungarumlaut -40 KPX R Umacron -40 KPX R Uogonek -40 KPX R Uring -40 KPX R V -50 KPX R W -30 KPX R Y -50 KPX R Yacute -50 KPX R Ydieresis -50 KPX Racute O -20 KPX Racute Oacute -20 KPX Racute Ocircumflex -20 KPX Racute Odieresis -20 KPX Racute Ograve -20 KPX Racute Ohungarumlaut -20 KPX Racute Omacron -20 KPX Racute Oslash -20 KPX Racute Otilde -20 KPX Racute T -30 KPX Racute Tcaron -30 KPX Racute Tcommaaccent -30 KPX Racute U -40 KPX Racute Uacute -40 KPX Racute Ucircumflex -40 KPX Racute Udieresis -40 KPX Racute Ugrave -40 KPX Racute Uhungarumlaut -40 KPX Racute Umacron -40 KPX Racute Uogonek -40 KPX Racute Uring -40 KPX Racute V -50 KPX Racute W -30 KPX Racute Y -50 KPX Racute Yacute -50 KPX Racute Ydieresis -50 KPX Rcaron O -20 KPX Rcaron Oacute -20 KPX Rcaron Ocircumflex -20 KPX Rcaron Odieresis -20 KPX Rcaron Ograve -20 KPX Rcaron Ohungarumlaut -20 KPX Rcaron Omacron -20 KPX Rcaron Oslash -20 KPX Rcaron Otilde -20 KPX Rcaron T -30 KPX Rcaron Tcaron -30 KPX Rcaron Tcommaaccent -30 KPX Rcaron U -40 KPX Rcaron Uacute -40 KPX Rcaron Ucircumflex -40 KPX Rcaron Udieresis -40 KPX Rcaron Ugrave -40 KPX Rcaron Uhungarumlaut -40 KPX Rcaron Umacron -40 KPX Rcaron Uogonek -40 KPX Rcaron Uring -40 KPX Rcaron V -50 KPX Rcaron W -30 KPX Rcaron Y -50 KPX Rcaron Yacute -50 KPX Rcaron Ydieresis -50 KPX Rcommaaccent O -20 KPX Rcommaaccent Oacute -20 KPX Rcommaaccent Ocircumflex -20 KPX Rcommaaccent Odieresis -20 KPX Rcommaaccent Ograve -20 KPX Rcommaaccent Ohungarumlaut -20 KPX Rcommaaccent Omacron -20 KPX Rcommaaccent Oslash -20 KPX Rcommaaccent Otilde -20 KPX Rcommaaccent T -30 KPX Rcommaaccent Tcaron -30 KPX Rcommaaccent Tcommaaccent -30 KPX Rcommaaccent U -40 KPX Rcommaaccent Uacute -40 KPX Rcommaaccent Ucircumflex -40 KPX Rcommaaccent Udieresis -40 KPX Rcommaaccent Ugrave -40 KPX Rcommaaccent Uhungarumlaut -40 KPX Rcommaaccent Umacron -40 KPX Rcommaaccent Uogonek -40 KPX Rcommaaccent Uring -40 KPX Rcommaaccent V -50 KPX Rcommaaccent W -30 KPX Rcommaaccent Y -50 KPX Rcommaaccent Yacute -50 KPX Rcommaaccent Ydieresis -50 KPX S comma -20 KPX S period -20 KPX Sacute comma -20 KPX Sacute period -20 KPX Scaron comma -20 KPX Scaron period -20 KPX Scedilla comma -20 KPX Scedilla period -20 KPX Scommaaccent comma -20 KPX Scommaaccent period -20 KPX T A -120 KPX T Aacute -120 KPX T Abreve -120 KPX T Acircumflex -120 KPX T Adieresis -120 KPX T Agrave -120 KPX T Amacron -120 KPX T Aogonek -120 KPX T Aring -120 KPX T Atilde -120 KPX T O -40 KPX T Oacute -40 KPX T Ocircumflex -40 KPX T Odieresis -40 KPX T Ograve -40 KPX T Ohungarumlaut -40 KPX T Omacron -40 KPX T Oslash -40 KPX T Otilde -40 KPX T a -120 KPX T aacute -120 KPX T abreve -60 KPX T acircumflex -120 KPX T adieresis -120 KPX T agrave -120 KPX T amacron -60 KPX T aogonek -120 KPX T aring -120 KPX T atilde -60 KPX T colon -20 KPX T comma -120 KPX T e -120 KPX T eacute -120 KPX T ecaron -120 KPX T ecircumflex -120 KPX T edieresis -120 KPX T edotaccent -120 KPX T egrave -60 KPX T emacron -60 KPX T eogonek -120 KPX T hyphen -140 KPX T o -120 KPX T oacute -120 KPX T ocircumflex -120 KPX T odieresis -120 KPX T ograve -120 KPX T ohungarumlaut -120 KPX T omacron -60 KPX T oslash -120 KPX T otilde -60 KPX T period -120 KPX T r -120 KPX T racute -120 KPX T rcaron -120 KPX T rcommaaccent -120 KPX T semicolon -20 KPX T u -120 KPX T uacute -120 KPX T ucircumflex -120 KPX T udieresis -120 KPX T ugrave -120 KPX T uhungarumlaut -120 KPX T umacron -60 KPX T uogonek -120 KPX T uring -120 KPX T w -120 KPX T y -120 KPX T yacute -120 KPX T ydieresis -60 KPX Tcaron A -120 KPX Tcaron Aacute -120 KPX Tcaron Abreve -120 KPX Tcaron Acircumflex -120 KPX Tcaron Adieresis -120 KPX Tcaron Agrave -120 KPX Tcaron Amacron -120 KPX Tcaron Aogonek -120 KPX Tcaron Aring -120 KPX Tcaron Atilde -120 KPX Tcaron O -40 KPX Tcaron Oacute -40 KPX Tcaron Ocircumflex -40 KPX Tcaron Odieresis -40 KPX Tcaron Ograve -40 KPX Tcaron Ohungarumlaut -40 KPX Tcaron Omacron -40 KPX Tcaron Oslash -40 KPX Tcaron Otilde -40 KPX Tcaron a -120 KPX Tcaron aacute -120 KPX Tcaron abreve -60 KPX Tcaron acircumflex -120 KPX Tcaron adieresis -120 KPX Tcaron agrave -120 KPX Tcaron amacron -60 KPX Tcaron aogonek -120 KPX Tcaron aring -120 KPX Tcaron atilde -60 KPX Tcaron colon -20 KPX Tcaron comma -120 KPX Tcaron e -120 KPX Tcaron eacute -120 KPX Tcaron ecaron -120 KPX Tcaron ecircumflex -120 KPX Tcaron edieresis -120 KPX Tcaron edotaccent -120 KPX Tcaron egrave -60 KPX Tcaron emacron -60 KPX Tcaron eogonek -120 KPX Tcaron hyphen -140 KPX Tcaron o -120 KPX Tcaron oacute -120 KPX Tcaron ocircumflex -120 KPX Tcaron odieresis -120 KPX Tcaron ograve -120 KPX Tcaron ohungarumlaut -120 KPX Tcaron omacron -60 KPX Tcaron oslash -120 KPX Tcaron otilde -60 KPX Tcaron period -120 KPX Tcaron r -120 KPX Tcaron racute -120 KPX Tcaron rcaron -120 KPX Tcaron rcommaaccent -120 KPX Tcaron semicolon -20 KPX Tcaron u -120 KPX Tcaron uacute -120 KPX Tcaron ucircumflex -120 KPX Tcaron udieresis -120 KPX Tcaron ugrave -120 KPX Tcaron uhungarumlaut -120 KPX Tcaron umacron -60 KPX Tcaron uogonek -120 KPX Tcaron uring -120 KPX Tcaron w -120 KPX Tcaron y -120 KPX Tcaron yacute -120 KPX Tcaron ydieresis -60 KPX Tcommaaccent A -120 KPX Tcommaaccent Aacute -120 KPX Tcommaaccent Abreve -120 KPX Tcommaaccent Acircumflex -120 KPX Tcommaaccent Adieresis -120 KPX Tcommaaccent Agrave -120 KPX Tcommaaccent Amacron -120 KPX Tcommaaccent Aogonek -120 KPX Tcommaaccent Aring -120 KPX Tcommaaccent Atilde -120 KPX Tcommaaccent O -40 KPX Tcommaaccent Oacute -40 KPX Tcommaaccent Ocircumflex -40 KPX Tcommaaccent Odieresis -40 KPX Tcommaaccent Ograve -40 KPX Tcommaaccent Ohungarumlaut -40 KPX Tcommaaccent Omacron -40 KPX Tcommaaccent Oslash -40 KPX Tcommaaccent Otilde -40 KPX Tcommaaccent a -120 KPX Tcommaaccent aacute -120 KPX Tcommaaccent abreve -60 KPX Tcommaaccent acircumflex -120 KPX Tcommaaccent adieresis -120 KPX Tcommaaccent agrave -120 KPX Tcommaaccent amacron -60 KPX Tcommaaccent aogonek -120 KPX Tcommaaccent aring -120 KPX Tcommaaccent atilde -60 KPX Tcommaaccent colon -20 KPX Tcommaaccent comma -120 KPX Tcommaaccent e -120 KPX Tcommaaccent eacute -120 KPX Tcommaaccent ecaron -120 KPX Tcommaaccent ecircumflex -120 KPX Tcommaaccent edieresis -120 KPX Tcommaaccent edotaccent -120 KPX Tcommaaccent egrave -60 KPX Tcommaaccent emacron -60 KPX Tcommaaccent eogonek -120 KPX Tcommaaccent hyphen -140 KPX Tcommaaccent o -120 KPX Tcommaaccent oacute -120 KPX Tcommaaccent ocircumflex -120 KPX Tcommaaccent odieresis -120 KPX Tcommaaccent ograve -120 KPX Tcommaaccent ohungarumlaut -120 KPX Tcommaaccent omacron -60 KPX Tcommaaccent oslash -120 KPX Tcommaaccent otilde -60 KPX Tcommaaccent period -120 KPX Tcommaaccent r -120 KPX Tcommaaccent racute -120 KPX Tcommaaccent rcaron -120 KPX Tcommaaccent rcommaaccent -120 KPX Tcommaaccent semicolon -20 KPX Tcommaaccent u -120 KPX Tcommaaccent uacute -120 KPX Tcommaaccent ucircumflex -120 KPX Tcommaaccent udieresis -120 KPX Tcommaaccent ugrave -120 KPX Tcommaaccent uhungarumlaut -120 KPX Tcommaaccent umacron -60 KPX Tcommaaccent uogonek -120 KPX Tcommaaccent uring -120 KPX Tcommaaccent w -120 KPX Tcommaaccent y -120 KPX Tcommaaccent yacute -120 KPX Tcommaaccent ydieresis -60 KPX U A -40 KPX U Aacute -40 KPX U Abreve -40 KPX U Acircumflex -40 KPX U Adieresis -40 KPX U Agrave -40 KPX U Amacron -40 KPX U Aogonek -40 KPX U Aring -40 KPX U Atilde -40 KPX U comma -40 KPX U period -40 KPX Uacute A -40 KPX Uacute Aacute -40 KPX Uacute Abreve -40 KPX Uacute Acircumflex -40 KPX Uacute Adieresis -40 KPX Uacute Agrave -40 KPX Uacute Amacron -40 KPX Uacute Aogonek -40 KPX Uacute Aring -40 KPX Uacute Atilde -40 KPX Uacute comma -40 KPX Uacute period -40 KPX Ucircumflex A -40 KPX Ucircumflex Aacute -40 KPX Ucircumflex Abreve -40 KPX Ucircumflex Acircumflex -40 KPX Ucircumflex Adieresis -40 KPX Ucircumflex Agrave -40 KPX Ucircumflex Amacron -40 KPX Ucircumflex Aogonek -40 KPX Ucircumflex Aring -40 KPX Ucircumflex Atilde -40 KPX Ucircumflex comma -40 KPX Ucircumflex period -40 KPX Udieresis A -40 KPX Udieresis Aacute -40 KPX Udieresis Abreve -40 KPX Udieresis Acircumflex -40 KPX Udieresis Adieresis -40 KPX Udieresis Agrave -40 KPX Udieresis Amacron -40 KPX Udieresis Aogonek -40 KPX Udieresis Aring -40 KPX Udieresis Atilde -40 KPX Udieresis comma -40 KPX Udieresis period -40 KPX Ugrave A -40 KPX Ugrave Aacute -40 KPX Ugrave Abreve -40 KPX Ugrave Acircumflex -40 KPX Ugrave Adieresis -40 KPX Ugrave Agrave -40 KPX Ugrave Amacron -40 KPX Ugrave Aogonek -40 KPX Ugrave Aring -40 KPX Ugrave Atilde -40 KPX Ugrave comma -40 KPX Ugrave period -40 KPX Uhungarumlaut A -40 KPX Uhungarumlaut Aacute -40 KPX Uhungarumlaut Abreve -40 KPX Uhungarumlaut Acircumflex -40 KPX Uhungarumlaut Adieresis -40 KPX Uhungarumlaut Agrave -40 KPX Uhungarumlaut Amacron -40 KPX Uhungarumlaut Aogonek -40 KPX Uhungarumlaut Aring -40 KPX Uhungarumlaut Atilde -40 KPX Uhungarumlaut comma -40 KPX Uhungarumlaut period -40 KPX Umacron A -40 KPX Umacron Aacute -40 KPX Umacron Abreve -40 KPX Umacron Acircumflex -40 KPX Umacron Adieresis -40 KPX Umacron Agrave -40 KPX Umacron Amacron -40 KPX Umacron Aogonek -40 KPX Umacron Aring -40 KPX Umacron Atilde -40 KPX Umacron comma -40 KPX Umacron period -40 KPX Uogonek A -40 KPX Uogonek Aacute -40 KPX Uogonek Abreve -40 KPX Uogonek Acircumflex -40 KPX Uogonek Adieresis -40 KPX Uogonek Agrave -40 KPX Uogonek Amacron -40 KPX Uogonek Aogonek -40 KPX Uogonek Aring -40 KPX Uogonek Atilde -40 KPX Uogonek comma -40 KPX Uogonek period -40 KPX Uring A -40 KPX Uring Aacute -40 KPX Uring Abreve -40 KPX Uring Acircumflex -40 KPX Uring Adieresis -40 KPX Uring Agrave -40 KPX Uring Amacron -40 KPX Uring Aogonek -40 KPX Uring Aring -40 KPX Uring Atilde -40 KPX Uring comma -40 KPX Uring period -40 KPX V A -80 KPX V Aacute -80 KPX V Abreve -80 KPX V Acircumflex -80 KPX V Adieresis -80 KPX V Agrave -80 KPX V Amacron -80 KPX V Aogonek -80 KPX V Aring -80 KPX V Atilde -80 KPX V G -40 KPX V Gbreve -40 KPX V Gcommaaccent -40 KPX V O -40 KPX V Oacute -40 KPX V Ocircumflex -40 KPX V Odieresis -40 KPX V Ograve -40 KPX V Ohungarumlaut -40 KPX V Omacron -40 KPX V Oslash -40 KPX V Otilde -40 KPX V a -70 KPX V aacute -70 KPX V abreve -70 KPX V acircumflex -70 KPX V adieresis -70 KPX V agrave -70 KPX V amacron -70 KPX V aogonek -70 KPX V aring -70 KPX V atilde -70 KPX V colon -40 KPX V comma -125 KPX V e -80 KPX V eacute -80 KPX V ecaron -80 KPX V ecircumflex -80 KPX V edieresis -80 KPX V edotaccent -80 KPX V egrave -80 KPX V emacron -80 KPX V eogonek -80 KPX V hyphen -80 KPX V o -80 KPX V oacute -80 KPX V ocircumflex -80 KPX V odieresis -80 KPX V ograve -80 KPX V ohungarumlaut -80 KPX V omacron -80 KPX V oslash -80 KPX V otilde -80 KPX V period -125 KPX V semicolon -40 KPX V u -70 KPX V uacute -70 KPX V ucircumflex -70 KPX V udieresis -70 KPX V ugrave -70 KPX V uhungarumlaut -70 KPX V umacron -70 KPX V uogonek -70 KPX V uring -70 KPX W A -50 KPX W Aacute -50 KPX W Abreve -50 KPX W Acircumflex -50 KPX W Adieresis -50 KPX W Agrave -50 KPX W Amacron -50 KPX W Aogonek -50 KPX W Aring -50 KPX W Atilde -50 KPX W O -20 KPX W Oacute -20 KPX W Ocircumflex -20 KPX W Odieresis -20 KPX W Ograve -20 KPX W Ohungarumlaut -20 KPX W Omacron -20 KPX W Oslash -20 KPX W Otilde -20 KPX W a -40 KPX W aacute -40 KPX W abreve -40 KPX W acircumflex -40 KPX W adieresis -40 KPX W agrave -40 KPX W amacron -40 KPX W aogonek -40 KPX W aring -40 KPX W atilde -40 KPX W comma -80 KPX W e -30 KPX W eacute -30 KPX W ecaron -30 KPX W ecircumflex -30 KPX W edieresis -30 KPX W edotaccent -30 KPX W egrave -30 KPX W emacron -30 KPX W eogonek -30 KPX W hyphen -40 KPX W o -30 KPX W oacute -30 KPX W ocircumflex -30 KPX W odieresis -30 KPX W ograve -30 KPX W ohungarumlaut -30 KPX W omacron -30 KPX W oslash -30 KPX W otilde -30 KPX W period -80 KPX W u -30 KPX W uacute -30 KPX W ucircumflex -30 KPX W udieresis -30 KPX W ugrave -30 KPX W uhungarumlaut -30 KPX W umacron -30 KPX W uogonek -30 KPX W uring -30 KPX W y -20 KPX W yacute -20 KPX W ydieresis -20 KPX Y A -110 KPX Y Aacute -110 KPX Y Abreve -110 KPX Y Acircumflex -110 KPX Y Adieresis -110 KPX Y Agrave -110 KPX Y Amacron -110 KPX Y Aogonek -110 KPX Y Aring -110 KPX Y Atilde -110 KPX Y O -85 KPX Y Oacute -85 KPX Y Ocircumflex -85 KPX Y Odieresis -85 KPX Y Ograve -85 KPX Y Ohungarumlaut -85 KPX Y Omacron -85 KPX Y Oslash -85 KPX Y Otilde -85 KPX Y a -140 KPX Y aacute -140 KPX Y abreve -70 KPX Y acircumflex -140 KPX Y adieresis -140 KPX Y agrave -140 KPX Y amacron -70 KPX Y aogonek -140 KPX Y aring -140 KPX Y atilde -140 KPX Y colon -60 KPX Y comma -140 KPX Y e -140 KPX Y eacute -140 KPX Y ecaron -140 KPX Y ecircumflex -140 KPX Y edieresis -140 KPX Y edotaccent -140 KPX Y egrave -140 KPX Y emacron -70 KPX Y eogonek -140 KPX Y hyphen -140 KPX Y i -20 KPX Y iacute -20 KPX Y iogonek -20 KPX Y o -140 KPX Y oacute -140 KPX Y ocircumflex -140 KPX Y odieresis -140 KPX Y ograve -140 KPX Y ohungarumlaut -140 KPX Y omacron -140 KPX Y oslash -140 KPX Y otilde -140 KPX Y period -140 KPX Y semicolon -60 KPX Y u -110 KPX Y uacute -110 KPX Y ucircumflex -110 KPX Y udieresis -110 KPX Y ugrave -110 KPX Y uhungarumlaut -110 KPX Y umacron -110 KPX Y uogonek -110 KPX Y uring -110 KPX Yacute A -110 KPX Yacute Aacute -110 KPX Yacute Abreve -110 KPX Yacute Acircumflex -110 KPX Yacute Adieresis -110 KPX Yacute Agrave -110 KPX Yacute Amacron -110 KPX Yacute Aogonek -110 KPX Yacute Aring -110 KPX Yacute Atilde -110 KPX Yacute O -85 KPX Yacute Oacute -85 KPX Yacute Ocircumflex -85 KPX Yacute Odieresis -85 KPX Yacute Ograve -85 KPX Yacute Ohungarumlaut -85 KPX Yacute Omacron -85 KPX Yacute Oslash -85 KPX Yacute Otilde -85 KPX Yacute a -140 KPX Yacute aacute -140 KPX Yacute abreve -70 KPX Yacute acircumflex -140 KPX Yacute adieresis -140 KPX Yacute agrave -140 KPX Yacute amacron -70 KPX Yacute aogonek -140 KPX Yacute aring -140 KPX Yacute atilde -70 KPX Yacute colon -60 KPX Yacute comma -140 KPX Yacute e -140 KPX Yacute eacute -140 KPX Yacute ecaron -140 KPX Yacute ecircumflex -140 KPX Yacute edieresis -140 KPX Yacute edotaccent -140 KPX Yacute egrave -140 KPX Yacute emacron -70 KPX Yacute eogonek -140 KPX Yacute hyphen -140 KPX Yacute i -20 KPX Yacute iacute -20 KPX Yacute iogonek -20 KPX Yacute o -140 KPX Yacute oacute -140 KPX Yacute ocircumflex -140 KPX Yacute odieresis -140 KPX Yacute ograve -140 KPX Yacute ohungarumlaut -140 KPX Yacute omacron -70 KPX Yacute oslash -140 KPX Yacute otilde -140 KPX Yacute period -140 KPX Yacute semicolon -60 KPX Yacute u -110 KPX Yacute uacute -110 KPX Yacute ucircumflex -110 KPX Yacute udieresis -110 KPX Yacute ugrave -110 KPX Yacute uhungarumlaut -110 KPX Yacute umacron -110 KPX Yacute uogonek -110 KPX Yacute uring -110 KPX Ydieresis A -110 KPX Ydieresis Aacute -110 KPX Ydieresis Abreve -110 KPX Ydieresis Acircumflex -110 KPX Ydieresis Adieresis -110 KPX Ydieresis Agrave -110 KPX Ydieresis Amacron -110 KPX Ydieresis Aogonek -110 KPX Ydieresis Aring -110 KPX Ydieresis Atilde -110 KPX Ydieresis O -85 KPX Ydieresis Oacute -85 KPX Ydieresis Ocircumflex -85 KPX Ydieresis Odieresis -85 KPX Ydieresis Ograve -85 KPX Ydieresis Ohungarumlaut -85 KPX Ydieresis Omacron -85 KPX Ydieresis Oslash -85 KPX Ydieresis Otilde -85 KPX Ydieresis a -140 KPX Ydieresis aacute -140 KPX Ydieresis abreve -70 KPX Ydieresis acircumflex -140 KPX Ydieresis adieresis -140 KPX Ydieresis agrave -140 KPX Ydieresis amacron -70 KPX Ydieresis aogonek -140 KPX Ydieresis aring -140 KPX Ydieresis atilde -70 KPX Ydieresis colon -60 KPX Ydieresis comma -140 KPX Ydieresis e -140 KPX Ydieresis eacute -140 KPX Ydieresis ecaron -140 KPX Ydieresis ecircumflex -140 KPX Ydieresis edieresis -140 KPX Ydieresis edotaccent -140 KPX Ydieresis egrave -140 KPX Ydieresis emacron -70 KPX Ydieresis eogonek -140 KPX Ydieresis hyphen -140 KPX Ydieresis i -20 KPX Ydieresis iacute -20 KPX Ydieresis iogonek -20 KPX Ydieresis o -140 KPX Ydieresis oacute -140 KPX Ydieresis ocircumflex -140 KPX Ydieresis odieresis -140 KPX Ydieresis ograve -140 KPX Ydieresis ohungarumlaut -140 KPX Ydieresis omacron -140 KPX Ydieresis oslash -140 KPX Ydieresis otilde -140 KPX Ydieresis period -140 KPX Ydieresis semicolon -60 KPX Ydieresis u -110 KPX Ydieresis uacute -110 KPX Ydieresis ucircumflex -110 KPX Ydieresis udieresis -110 KPX Ydieresis ugrave -110 KPX Ydieresis uhungarumlaut -110 KPX Ydieresis umacron -110 KPX Ydieresis uogonek -110 KPX Ydieresis uring -110 KPX a v -20 KPX a w -20 KPX a y -30 KPX a yacute -30 KPX a ydieresis -30 KPX aacute v -20 KPX aacute w -20 KPX aacute y -30 KPX aacute yacute -30 KPX aacute ydieresis -30 KPX abreve v -20 KPX abreve w -20 KPX abreve y -30 KPX abreve yacute -30 KPX abreve ydieresis -30 KPX acircumflex v -20 KPX acircumflex w -20 KPX acircumflex y -30 KPX acircumflex yacute -30 KPX acircumflex ydieresis -30 KPX adieresis v -20 KPX adieresis w -20 KPX adieresis y -30 KPX adieresis yacute -30 KPX adieresis ydieresis -30 KPX agrave v -20 KPX agrave w -20 KPX agrave y -30 KPX agrave yacute -30 KPX agrave ydieresis -30 KPX amacron v -20 KPX amacron w -20 KPX amacron y -30 KPX amacron yacute -30 KPX amacron ydieresis -30 KPX aogonek v -20 KPX aogonek w -20 KPX aogonek y -30 KPX aogonek yacute -30 KPX aogonek ydieresis -30 KPX aring v -20 KPX aring w -20 KPX aring y -30 KPX aring yacute -30 KPX aring ydieresis -30 KPX atilde v -20 KPX atilde w -20 KPX atilde y -30 KPX atilde yacute -30 KPX atilde ydieresis -30 KPX b b -10 KPX b comma -40 KPX b l -20 KPX b lacute -20 KPX b lcommaaccent -20 KPX b lslash -20 KPX b period -40 KPX b u -20 KPX b uacute -20 KPX b ucircumflex -20 KPX b udieresis -20 KPX b ugrave -20 KPX b uhungarumlaut -20 KPX b umacron -20 KPX b uogonek -20 KPX b uring -20 KPX b v -20 KPX b y -20 KPX b yacute -20 KPX b ydieresis -20 KPX c comma -15 KPX c k -20 KPX c kcommaaccent -20 KPX cacute comma -15 KPX cacute k -20 KPX cacute kcommaaccent -20 KPX ccaron comma -15 KPX ccaron k -20 KPX ccaron kcommaaccent -20 KPX ccedilla comma -15 KPX ccedilla k -20 KPX ccedilla kcommaaccent -20 KPX colon space -50 KPX comma quotedblright -100 KPX comma quoteright -100 KPX e comma -15 KPX e period -15 KPX e v -30 KPX e w -20 KPX e x -30 KPX e y -20 KPX e yacute -20 KPX e ydieresis -20 KPX eacute comma -15 KPX eacute period -15 KPX eacute v -30 KPX eacute w -20 KPX eacute x -30 KPX eacute y -20 KPX eacute yacute -20 KPX eacute ydieresis -20 KPX ecaron comma -15 KPX ecaron period -15 KPX ecaron v -30 KPX ecaron w -20 KPX ecaron x -30 KPX ecaron y -20 KPX ecaron yacute -20 KPX ecaron ydieresis -20 KPX ecircumflex comma -15 KPX ecircumflex period -15 KPX ecircumflex v -30 KPX ecircumflex w -20 KPX ecircumflex x -30 KPX ecircumflex y -20 KPX ecircumflex yacute -20 KPX ecircumflex ydieresis -20 KPX edieresis comma -15 KPX edieresis period -15 KPX edieresis v -30 KPX edieresis w -20 KPX edieresis x -30 KPX edieresis y -20 KPX edieresis yacute -20 KPX edieresis ydieresis -20 KPX edotaccent comma -15 KPX edotaccent period -15 KPX edotaccent v -30 KPX edotaccent w -20 KPX edotaccent x -30 KPX edotaccent y -20 KPX edotaccent yacute -20 KPX edotaccent ydieresis -20 KPX egrave comma -15 KPX egrave period -15 KPX egrave v -30 KPX egrave w -20 KPX egrave x -30 KPX egrave y -20 KPX egrave yacute -20 KPX egrave ydieresis -20 KPX emacron comma -15 KPX emacron period -15 KPX emacron v -30 KPX emacron w -20 KPX emacron x -30 KPX emacron y -20 KPX emacron yacute -20 KPX emacron ydieresis -20 KPX eogonek comma -15 KPX eogonek period -15 KPX eogonek v -30 KPX eogonek w -20 KPX eogonek x -30 KPX eogonek y -20 KPX eogonek yacute -20 KPX eogonek ydieresis -20 KPX f a -30 KPX f aacute -30 KPX f abreve -30 KPX f acircumflex -30 KPX f adieresis -30 KPX f agrave -30 KPX f amacron -30 KPX f aogonek -30 KPX f aring -30 KPX f atilde -30 KPX f comma -30 KPX f dotlessi -28 KPX f e -30 KPX f eacute -30 KPX f ecaron -30 KPX f ecircumflex -30 KPX f edieresis -30 KPX f edotaccent -30 KPX f egrave -30 KPX f emacron -30 KPX f eogonek -30 KPX f o -30 KPX f oacute -30 KPX f ocircumflex -30 KPX f odieresis -30 KPX f ograve -30 KPX f ohungarumlaut -30 KPX f omacron -30 KPX f oslash -30 KPX f otilde -30 KPX f period -30 KPX f quotedblright 60 KPX f quoteright 50 KPX g r -10 KPX g racute -10 KPX g rcaron -10 KPX g rcommaaccent -10 KPX gbreve r -10 KPX gbreve racute -10 KPX gbreve rcaron -10 KPX gbreve rcommaaccent -10 KPX gcommaaccent r -10 KPX gcommaaccent racute -10 KPX gcommaaccent rcaron -10 KPX gcommaaccent rcommaaccent -10 KPX h y -30 KPX h yacute -30 KPX h ydieresis -30 KPX k e -20 KPX k eacute -20 KPX k ecaron -20 KPX k ecircumflex -20 KPX k edieresis -20 KPX k edotaccent -20 KPX k egrave -20 KPX k emacron -20 KPX k eogonek -20 KPX k o -20 KPX k oacute -20 KPX k ocircumflex -20 KPX k odieresis -20 KPX k ograve -20 KPX k ohungarumlaut -20 KPX k omacron -20 KPX k oslash -20 KPX k otilde -20 KPX kcommaaccent e -20 KPX kcommaaccent eacute -20 KPX kcommaaccent ecaron -20 KPX kcommaaccent ecircumflex -20 KPX kcommaaccent edieresis -20 KPX kcommaaccent edotaccent -20 KPX kcommaaccent egrave -20 KPX kcommaaccent emacron -20 KPX kcommaaccent eogonek -20 KPX kcommaaccent o -20 KPX kcommaaccent oacute -20 KPX kcommaaccent ocircumflex -20 KPX kcommaaccent odieresis -20 KPX kcommaaccent ograve -20 KPX kcommaaccent ohungarumlaut -20 KPX kcommaaccent omacron -20 KPX kcommaaccent oslash -20 KPX kcommaaccent otilde -20 KPX m u -10 KPX m uacute -10 KPX m ucircumflex -10 KPX m udieresis -10 KPX m ugrave -10 KPX m uhungarumlaut -10 KPX m umacron -10 KPX m uogonek -10 KPX m uring -10 KPX m y -15 KPX m yacute -15 KPX m ydieresis -15 KPX n u -10 KPX n uacute -10 KPX n ucircumflex -10 KPX n udieresis -10 KPX n ugrave -10 KPX n uhungarumlaut -10 KPX n umacron -10 KPX n uogonek -10 KPX n uring -10 KPX n v -20 KPX n y -15 KPX n yacute -15 KPX n ydieresis -15 KPX nacute u -10 KPX nacute uacute -10 KPX nacute ucircumflex -10 KPX nacute udieresis -10 KPX nacute ugrave -10 KPX nacute uhungarumlaut -10 KPX nacute umacron -10 KPX nacute uogonek -10 KPX nacute uring -10 KPX nacute v -20 KPX nacute y -15 KPX nacute yacute -15 KPX nacute ydieresis -15 KPX ncaron u -10 KPX ncaron uacute -10 KPX ncaron ucircumflex -10 KPX ncaron udieresis -10 KPX ncaron ugrave -10 KPX ncaron uhungarumlaut -10 KPX ncaron umacron -10 KPX ncaron uogonek -10 KPX ncaron uring -10 KPX ncaron v -20 KPX ncaron y -15 KPX ncaron yacute -15 KPX ncaron ydieresis -15 KPX ncommaaccent u -10 KPX ncommaaccent uacute -10 KPX ncommaaccent ucircumflex -10 KPX ncommaaccent udieresis -10 KPX ncommaaccent ugrave -10 KPX ncommaaccent uhungarumlaut -10 KPX ncommaaccent umacron -10 KPX ncommaaccent uogonek -10 KPX ncommaaccent uring -10 KPX ncommaaccent v -20 KPX ncommaaccent y -15 KPX ncommaaccent yacute -15 KPX ncommaaccent ydieresis -15 KPX ntilde u -10 KPX ntilde uacute -10 KPX ntilde ucircumflex -10 KPX ntilde udieresis -10 KPX ntilde ugrave -10 KPX ntilde uhungarumlaut -10 KPX ntilde umacron -10 KPX ntilde uogonek -10 KPX ntilde uring -10 KPX ntilde v -20 KPX ntilde y -15 KPX ntilde yacute -15 KPX ntilde ydieresis -15 KPX o comma -40 KPX o period -40 KPX o v -15 KPX o w -15 KPX o x -30 KPX o y -30 KPX o yacute -30 KPX o ydieresis -30 KPX oacute comma -40 KPX oacute period -40 KPX oacute v -15 KPX oacute w -15 KPX oacute x -30 KPX oacute y -30 KPX oacute yacute -30 KPX oacute ydieresis -30 KPX ocircumflex comma -40 KPX ocircumflex period -40 KPX ocircumflex v -15 KPX ocircumflex w -15 KPX ocircumflex x -30 KPX ocircumflex y -30 KPX ocircumflex yacute -30 KPX ocircumflex ydieresis -30 KPX odieresis comma -40 KPX odieresis period -40 KPX odieresis v -15 KPX odieresis w -15 KPX odieresis x -30 KPX odieresis y -30 KPX odieresis yacute -30 KPX odieresis ydieresis -30 KPX ograve comma -40 KPX ograve period -40 KPX ograve v -15 KPX ograve w -15 KPX ograve x -30 KPX ograve y -30 KPX ograve yacute -30 KPX ograve ydieresis -30 KPX ohungarumlaut comma -40 KPX ohungarumlaut period -40 KPX ohungarumlaut v -15 KPX ohungarumlaut w -15 KPX ohungarumlaut x -30 KPX ohungarumlaut y -30 KPX ohungarumlaut yacute -30 KPX ohungarumlaut ydieresis -30 KPX omacron comma -40 KPX omacron period -40 KPX omacron v -15 KPX omacron w -15 KPX omacron x -30 KPX omacron y -30 KPX omacron yacute -30 KPX omacron ydieresis -30 KPX oslash a -55 KPX oslash aacute -55 KPX oslash abreve -55 KPX oslash acircumflex -55 KPX oslash adieresis -55 KPX oslash agrave -55 KPX oslash amacron -55 KPX oslash aogonek -55 KPX oslash aring -55 KPX oslash atilde -55 KPX oslash b -55 KPX oslash c -55 KPX oslash cacute -55 KPX oslash ccaron -55 KPX oslash ccedilla -55 KPX oslash comma -95 KPX oslash d -55 KPX oslash dcroat -55 KPX oslash e -55 KPX oslash eacute -55 KPX oslash ecaron -55 KPX oslash ecircumflex -55 KPX oslash edieresis -55 KPX oslash edotaccent -55 KPX oslash egrave -55 KPX oslash emacron -55 KPX oslash eogonek -55 KPX oslash f -55 KPX oslash g -55 KPX oslash gbreve -55 KPX oslash gcommaaccent -55 KPX oslash h -55 KPX oslash i -55 KPX oslash iacute -55 KPX oslash icircumflex -55 KPX oslash idieresis -55 KPX oslash igrave -55 KPX oslash imacron -55 KPX oslash iogonek -55 KPX oslash j -55 KPX oslash k -55 KPX oslash kcommaaccent -55 KPX oslash l -55 KPX oslash lacute -55 KPX oslash lcommaaccent -55 KPX oslash lslash -55 KPX oslash m -55 KPX oslash n -55 KPX oslash nacute -55 KPX oslash ncaron -55 KPX oslash ncommaaccent -55 KPX oslash ntilde -55 KPX oslash o -55 KPX oslash oacute -55 KPX oslash ocircumflex -55 KPX oslash odieresis -55 KPX oslash ograve -55 KPX oslash ohungarumlaut -55 KPX oslash omacron -55 KPX oslash oslash -55 KPX oslash otilde -55 KPX oslash p -55 KPX oslash period -95 KPX oslash q -55 KPX oslash r -55 KPX oslash racute -55 KPX oslash rcaron -55 KPX oslash rcommaaccent -55 KPX oslash s -55 KPX oslash sacute -55 KPX oslash scaron -55 KPX oslash scedilla -55 KPX oslash scommaaccent -55 KPX oslash t -55 KPX oslash tcommaaccent -55 KPX oslash u -55 KPX oslash uacute -55 KPX oslash ucircumflex -55 KPX oslash udieresis -55 KPX oslash ugrave -55 KPX oslash uhungarumlaut -55 KPX oslash umacron -55 KPX oslash uogonek -55 KPX oslash uring -55 KPX oslash v -70 KPX oslash w -70 KPX oslash x -85 KPX oslash y -70 KPX oslash yacute -70 KPX oslash ydieresis -70 KPX oslash z -55 KPX oslash zacute -55 KPX oslash zcaron -55 KPX oslash zdotaccent -55 KPX otilde comma -40 KPX otilde period -40 KPX otilde v -15 KPX otilde w -15 KPX otilde x -30 KPX otilde y -30 KPX otilde yacute -30 KPX otilde ydieresis -30 KPX p comma -35 KPX p period -35 KPX p y -30 KPX p yacute -30 KPX p ydieresis -30 KPX period quotedblright -100 KPX period quoteright -100 KPX period space -60 KPX quotedblright space -40 KPX quoteleft quoteleft -57 KPX quoteright d -50 KPX quoteright dcroat -50 KPX quoteright quoteright -57 KPX quoteright r -50 KPX quoteright racute -50 KPX quoteright rcaron -50 KPX quoteright rcommaaccent -50 KPX quoteright s -50 KPX quoteright sacute -50 KPX quoteright scaron -50 KPX quoteright scedilla -50 KPX quoteright scommaaccent -50 KPX quoteright space -70 KPX r a -10 KPX r aacute -10 KPX r abreve -10 KPX r acircumflex -10 KPX r adieresis -10 KPX r agrave -10 KPX r amacron -10 KPX r aogonek -10 KPX r aring -10 KPX r atilde -10 KPX r colon 30 KPX r comma -50 KPX r i 15 KPX r iacute 15 KPX r icircumflex 15 KPX r idieresis 15 KPX r igrave 15 KPX r imacron 15 KPX r iogonek 15 KPX r k 15 KPX r kcommaaccent 15 KPX r l 15 KPX r lacute 15 KPX r lcommaaccent 15 KPX r lslash 15 KPX r m 25 KPX r n 25 KPX r nacute 25 KPX r ncaron 25 KPX r ncommaaccent 25 KPX r ntilde 25 KPX r p 30 KPX r period -50 KPX r semicolon 30 KPX r t 40 KPX r tcommaaccent 40 KPX r u 15 KPX r uacute 15 KPX r ucircumflex 15 KPX r udieresis 15 KPX r ugrave 15 KPX r uhungarumlaut 15 KPX r umacron 15 KPX r uogonek 15 KPX r uring 15 KPX r v 30 KPX r y 30 KPX r yacute 30 KPX r ydieresis 30 KPX racute a -10 KPX racute aacute -10 KPX racute abreve -10 KPX racute acircumflex -10 KPX racute adieresis -10 KPX racute agrave -10 KPX racute amacron -10 KPX racute aogonek -10 KPX racute aring -10 KPX racute atilde -10 KPX racute colon 30 KPX racute comma -50 KPX racute i 15 KPX racute iacute 15 KPX racute icircumflex 15 KPX racute idieresis 15 KPX racute igrave 15 KPX racute imacron 15 KPX racute iogonek 15 KPX racute k 15 KPX racute kcommaaccent 15 KPX racute l 15 KPX racute lacute 15 KPX racute lcommaaccent 15 KPX racute lslash 15 KPX racute m 25 KPX racute n 25 KPX racute nacute 25 KPX racute ncaron 25 KPX racute ncommaaccent 25 KPX racute ntilde 25 KPX racute p 30 KPX racute period -50 KPX racute semicolon 30 KPX racute t 40 KPX racute tcommaaccent 40 KPX racute u 15 KPX racute uacute 15 KPX racute ucircumflex 15 KPX racute udieresis 15 KPX racute ugrave 15 KPX racute uhungarumlaut 15 KPX racute umacron 15 KPX racute uogonek 15 KPX racute uring 15 KPX racute v 30 KPX racute y 30 KPX racute yacute 30 KPX racute ydieresis 30 KPX rcaron a -10 KPX rcaron aacute -10 KPX rcaron abreve -10 KPX rcaron acircumflex -10 KPX rcaron adieresis -10 KPX rcaron agrave -10 KPX rcaron amacron -10 KPX rcaron aogonek -10 KPX rcaron aring -10 KPX rcaron atilde -10 KPX rcaron colon 30 KPX rcaron comma -50 KPX rcaron i 15 KPX rcaron iacute 15 KPX rcaron icircumflex 15 KPX rcaron idieresis 15 KPX rcaron igrave 15 KPX rcaron imacron 15 KPX rcaron iogonek 15 KPX rcaron k 15 KPX rcaron kcommaaccent 15 KPX rcaron l 15 KPX rcaron lacute 15 KPX rcaron lcommaaccent 15 KPX rcaron lslash 15 KPX rcaron m 25 KPX rcaron n 25 KPX rcaron nacute 25 KPX rcaron ncaron 25 KPX rcaron ncommaaccent 25 KPX rcaron ntilde 25 KPX rcaron p 30 KPX rcaron period -50 KPX rcaron semicolon 30 KPX rcaron t 40 KPX rcaron tcommaaccent 40 KPX rcaron u 15 KPX rcaron uacute 15 KPX rcaron ucircumflex 15 KPX rcaron udieresis 15 KPX rcaron ugrave 15 KPX rcaron uhungarumlaut 15 KPX rcaron umacron 15 KPX rcaron uogonek 15 KPX rcaron uring 15 KPX rcaron v 30 KPX rcaron y 30 KPX rcaron yacute 30 KPX rcaron ydieresis 30 KPX rcommaaccent a -10 KPX rcommaaccent aacute -10 KPX rcommaaccent abreve -10 KPX rcommaaccent acircumflex -10 KPX rcommaaccent adieresis -10 KPX rcommaaccent agrave -10 KPX rcommaaccent amacron -10 KPX rcommaaccent aogonek -10 KPX rcommaaccent aring -10 KPX rcommaaccent atilde -10 KPX rcommaaccent colon 30 KPX rcommaaccent comma -50 KPX rcommaaccent i 15 KPX rcommaaccent iacute 15 KPX rcommaaccent icircumflex 15 KPX rcommaaccent idieresis 15 KPX rcommaaccent igrave 15 KPX rcommaaccent imacron 15 KPX rcommaaccent iogonek 15 KPX rcommaaccent k 15 KPX rcommaaccent kcommaaccent 15 KPX rcommaaccent l 15 KPX rcommaaccent lacute 15 KPX rcommaaccent lcommaaccent 15 KPX rcommaaccent lslash 15 KPX rcommaaccent m 25 KPX rcommaaccent n 25 KPX rcommaaccent nacute 25 KPX rcommaaccent ncaron 25 KPX rcommaaccent ncommaaccent 25 KPX rcommaaccent ntilde 25 KPX rcommaaccent p 30 KPX rcommaaccent period -50 KPX rcommaaccent semicolon 30 KPX rcommaaccent t 40 KPX rcommaaccent tcommaaccent 40 KPX rcommaaccent u 15 KPX rcommaaccent uacute 15 KPX rcommaaccent ucircumflex 15 KPX rcommaaccent udieresis 15 KPX rcommaaccent ugrave 15 KPX rcommaaccent uhungarumlaut 15 KPX rcommaaccent umacron 15 KPX rcommaaccent uogonek 15 KPX rcommaaccent uring 15 KPX rcommaaccent v 30 KPX rcommaaccent y 30 KPX rcommaaccent yacute 30 KPX rcommaaccent ydieresis 30 KPX s comma -15 KPX s period -15 KPX s w -30 KPX sacute comma -15 KPX sacute period -15 KPX sacute w -30 KPX scaron comma -15 KPX scaron period -15 KPX scaron w -30 KPX scedilla comma -15 KPX scedilla period -15 KPX scedilla w -30 KPX scommaaccent comma -15 KPX scommaaccent period -15 KPX scommaaccent w -30 KPX semicolon space -50 KPX space T -50 KPX space Tcaron -50 KPX space Tcommaaccent -50 KPX space V -50 KPX space W -40 KPX space Y -90 KPX space Yacute -90 KPX space Ydieresis -90 KPX space quotedblleft -30 KPX space quoteleft -60 KPX v a -25 KPX v aacute -25 KPX v abreve -25 KPX v acircumflex -25 KPX v adieresis -25 KPX v agrave -25 KPX v amacron -25 KPX v aogonek -25 KPX v aring -25 KPX v atilde -25 KPX v comma -80 KPX v e -25 KPX v eacute -25 KPX v ecaron -25 KPX v ecircumflex -25 KPX v edieresis -25 KPX v edotaccent -25 KPX v egrave -25 KPX v emacron -25 KPX v eogonek -25 KPX v o -25 KPX v oacute -25 KPX v ocircumflex -25 KPX v odieresis -25 KPX v ograve -25 KPX v ohungarumlaut -25 KPX v omacron -25 KPX v oslash -25 KPX v otilde -25 KPX v period -80 KPX w a -15 KPX w aacute -15 KPX w abreve -15 KPX w acircumflex -15 KPX w adieresis -15 KPX w agrave -15 KPX w amacron -15 KPX w aogonek -15 KPX w aring -15 KPX w atilde -15 KPX w comma -60 KPX w e -10 KPX w eacute -10 KPX w ecaron -10 KPX w ecircumflex -10 KPX w edieresis -10 KPX w edotaccent -10 KPX w egrave -10 KPX w emacron -10 KPX w eogonek -10 KPX w o -10 KPX w oacute -10 KPX w ocircumflex -10 KPX w odieresis -10 KPX w ograve -10 KPX w ohungarumlaut -10 KPX w omacron -10 KPX w oslash -10 KPX w otilde -10 KPX w period -60 KPX x e -30 KPX x eacute -30 KPX x ecaron -30 KPX x ecircumflex -30 KPX x edieresis -30 KPX x edotaccent -30 KPX x egrave -30 KPX x emacron -30 KPX x eogonek -30 KPX y a -20 KPX y aacute -20 KPX y abreve -20 KPX y acircumflex -20 KPX y adieresis -20 KPX y agrave -20 KPX y amacron -20 KPX y aogonek -20 KPX y aring -20 KPX y atilde -20 KPX y comma -100 KPX y e -20 KPX y eacute -20 KPX y ecaron -20 KPX y ecircumflex -20 KPX y edieresis -20 KPX y edotaccent -20 KPX y egrave -20 KPX y emacron -20 KPX y eogonek -20 KPX y o -20 KPX y oacute -20 KPX y ocircumflex -20 KPX y odieresis -20 KPX y ograve -20 KPX y ohungarumlaut -20 KPX y omacron -20 KPX y oslash -20 KPX y otilde -20 KPX y period -100 KPX yacute a -20 KPX yacute aacute -20 KPX yacute abreve -20 KPX yacute acircumflex -20 KPX yacute adieresis -20 KPX yacute agrave -20 KPX yacute amacron -20 KPX yacute aogonek -20 KPX yacute aring -20 KPX yacute atilde -20 KPX yacute comma -100 KPX yacute e -20 KPX yacute eacute -20 KPX yacute ecaron -20 KPX yacute ecircumflex -20 KPX yacute edieresis -20 KPX yacute edotaccent -20 KPX yacute egrave -20 KPX yacute emacron -20 KPX yacute eogonek -20 KPX yacute o -20 KPX yacute oacute -20 KPX yacute ocircumflex -20 KPX yacute odieresis -20 KPX yacute ograve -20 KPX yacute ohungarumlaut -20 KPX yacute omacron -20 KPX yacute oslash -20 KPX yacute otilde -20 KPX yacute period -100 KPX ydieresis a -20 KPX ydieresis aacute -20 KPX ydieresis abreve -20 KPX ydieresis acircumflex -20 KPX ydieresis adieresis -20 KPX ydieresis agrave -20 KPX ydieresis amacron -20 KPX ydieresis aogonek -20 KPX ydieresis aring -20 KPX ydieresis atilde -20 KPX ydieresis comma -100 KPX ydieresis e -20 KPX ydieresis eacute -20 KPX ydieresis ecaron -20 KPX ydieresis ecircumflex -20 KPX ydieresis edieresis -20 KPX ydieresis edotaccent -20 KPX ydieresis egrave -20 KPX ydieresis emacron -20 KPX ydieresis eogonek -20 KPX ydieresis o -20 KPX ydieresis oacute -20 KPX ydieresis ocircumflex -20 KPX ydieresis odieresis -20 KPX ydieresis ograve -20 KPX ydieresis ohungarumlaut -20 KPX ydieresis omacron -20 KPX ydieresis oslash -20 KPX ydieresis otilde -20 KPX ydieresis period -100 KPX z e -15 KPX z eacute -15 KPX z ecaron -15 KPX z ecircumflex -15 KPX z edieresis -15 KPX z edotaccent -15 KPX z egrave -15 KPX z emacron -15 KPX z eogonek -15 KPX z o -15 KPX z oacute -15 KPX z ocircumflex -15 KPX z odieresis -15 KPX z ograve -15 KPX z ohungarumlaut -15 KPX z omacron -15 KPX z oslash -15 KPX z otilde -15 KPX zacute e -15 KPX zacute eacute -15 KPX zacute ecaron -15 KPX zacute ecircumflex -15 KPX zacute edieresis -15 KPX zacute edotaccent -15 KPX zacute egrave -15 KPX zacute emacron -15 KPX zacute eogonek -15 KPX zacute o -15 KPX zacute oacute -15 KPX zacute ocircumflex -15 KPX zacute odieresis -15 KPX zacute ograve -15 KPX zacute ohungarumlaut -15 KPX zacute omacron -15 KPX zacute oslash -15 KPX zacute otilde -15 KPX zcaron e -15 KPX zcaron eacute -15 KPX zcaron ecaron -15 KPX zcaron ecircumflex -15 KPX zcaron edieresis -15 KPX zcaron edotaccent -15 KPX zcaron egrave -15 KPX zcaron emacron -15 KPX zcaron eogonek -15 KPX zcaron o -15 KPX zcaron oacute -15 KPX zcaron ocircumflex -15 KPX zcaron odieresis -15 KPX zcaron ograve -15 KPX zcaron ohungarumlaut -15 KPX zcaron omacron -15 KPX zcaron oslash -15 KPX zcaron otilde -15 KPX zdotaccent e -15 KPX zdotaccent eacute -15 KPX zdotaccent ecaron -15 KPX zdotaccent ecircumflex -15 KPX zdotaccent edieresis -15 KPX zdotaccent edotaccent -15 KPX zdotaccent egrave -15 KPX zdotaccent emacron -15 KPX zdotaccent eogonek -15 KPX zdotaccent o -15 KPX zdotaccent oacute -15 KPX zdotaccent ocircumflex -15 KPX zdotaccent odieresis -15 KPX zdotaccent ograve -15 KPX zdotaccent ohungarumlaut -15 KPX zdotaccent omacron -15 KPX zdotaccent oslash -15 KPX zdotaccent otilde -15 EndKernPairs EndKernData EndFontMetrics ruby-prawn-1.0.0~rc2.orig/data/fonts/Times-Bold.afm0000644000000000000000000017537312114176157020573 0ustar rootrootStartFontMetrics 4.1 Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. Comment Creation Date: Thu May 1 12:52:56 1997 Comment UniqueID 43065 Comment VMusage 41636 52661 FontName Times-Bold FullName Times Bold FamilyName Times Weight Bold ItalicAngle 0 IsFixedPitch false CharacterSet ExtendedRoman FontBBox -168 -218 1000 935 UnderlinePosition -100 UnderlineThickness 50 Version 002.000 Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries. EncodingScheme AdobeStandardEncoding CapHeight 676 XHeight 461 Ascender 683 Descender -217 StdHW 44 StdVW 139 StartCharMetrics 315 C 32 ; WX 250 ; N space ; B 0 0 0 0 ; C 33 ; WX 333 ; N exclam ; B 81 -13 251 691 ; C 34 ; WX 555 ; N quotedbl ; B 83 404 472 691 ; C 35 ; WX 500 ; N numbersign ; B 4 0 496 700 ; C 36 ; WX 500 ; N dollar ; B 29 -99 472 750 ; C 37 ; WX 1000 ; N percent ; B 124 -14 877 692 ; C 38 ; WX 833 ; N ampersand ; B 62 -16 787 691 ; C 39 ; WX 333 ; N quoteright ; B 79 356 263 691 ; C 40 ; WX 333 ; N parenleft ; B 46 -168 306 694 ; C 41 ; WX 333 ; N parenright ; B 27 -168 287 694 ; C 42 ; WX 500 ; N asterisk ; B 56 255 447 691 ; C 43 ; WX 570 ; N plus ; B 33 0 537 506 ; C 44 ; WX 250 ; N comma ; B 39 -180 223 155 ; C 45 ; WX 333 ; N hyphen ; B 44 171 287 287 ; C 46 ; WX 250 ; N period ; B 41 -13 210 156 ; C 47 ; WX 278 ; N slash ; B -24 -19 302 691 ; C 48 ; WX 500 ; N zero ; B 24 -13 476 688 ; C 49 ; WX 500 ; N one ; B 65 0 442 688 ; C 50 ; WX 500 ; N two ; B 17 0 478 688 ; C 51 ; WX 500 ; N three ; B 16 -14 468 688 ; C 52 ; WX 500 ; N four ; B 19 0 475 688 ; C 53 ; WX 500 ; N five ; B 22 -8 470 676 ; C 54 ; WX 500 ; N six ; B 28 -13 475 688 ; C 55 ; WX 500 ; N seven ; B 17 0 477 676 ; C 56 ; WX 500 ; N eight ; B 28 -13 472 688 ; C 57 ; WX 500 ; N nine ; B 26 -13 473 688 ; C 58 ; WX 333 ; N colon ; B 82 -13 251 472 ; C 59 ; WX 333 ; N semicolon ; B 82 -180 266 472 ; C 60 ; WX 570 ; N less ; B 31 -8 539 514 ; C 61 ; WX 570 ; N equal ; B 33 107 537 399 ; C 62 ; WX 570 ; N greater ; B 31 -8 539 514 ; C 63 ; WX 500 ; N question ; B 57 -13 445 689 ; C 64 ; WX 930 ; N at ; B 108 -19 822 691 ; C 65 ; WX 722 ; N A ; B 9 0 689 690 ; C 66 ; WX 667 ; N B ; B 16 0 619 676 ; C 67 ; WX 722 ; N C ; B 49 -19 687 691 ; C 68 ; WX 722 ; N D ; B 14 0 690 676 ; C 69 ; WX 667 ; N E ; B 16 0 641 676 ; C 70 ; WX 611 ; N F ; B 16 0 583 676 ; C 71 ; WX 778 ; N G ; B 37 -19 755 691 ; C 72 ; WX 778 ; N H ; B 21 0 759 676 ; C 73 ; WX 389 ; N I ; B 20 0 370 676 ; C 74 ; WX 500 ; N J ; B 3 -96 479 676 ; C 75 ; WX 778 ; N K ; B 30 0 769 676 ; C 76 ; WX 667 ; N L ; B 19 0 638 676 ; C 77 ; WX 944 ; N M ; B 14 0 921 676 ; C 78 ; WX 722 ; N N ; B 16 -18 701 676 ; C 79 ; WX 778 ; N O ; B 35 -19 743 691 ; C 80 ; WX 611 ; N P ; B 16 0 600 676 ; C 81 ; WX 778 ; N Q ; B 35 -176 743 691 ; C 82 ; WX 722 ; N R ; B 26 0 715 676 ; C 83 ; WX 556 ; N S ; B 35 -19 513 692 ; C 84 ; WX 667 ; N T ; B 31 0 636 676 ; C 85 ; WX 722 ; N U ; B 16 -19 701 676 ; C 86 ; WX 722 ; N V ; B 16 -18 701 676 ; C 87 ; WX 1000 ; N W ; B 19 -15 981 676 ; C 88 ; WX 722 ; N X ; B 16 0 699 676 ; C 89 ; WX 722 ; N Y ; B 15 0 699 676 ; C 90 ; WX 667 ; N Z ; B 28 0 634 676 ; C 91 ; WX 333 ; N bracketleft ; B 67 -149 301 678 ; C 92 ; WX 278 ; N backslash ; B -25 -19 303 691 ; C 93 ; WX 333 ; N bracketright ; B 32 -149 266 678 ; C 94 ; WX 581 ; N asciicircum ; B 73 311 509 676 ; C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; C 96 ; WX 333 ; N quoteleft ; B 70 356 254 691 ; C 97 ; WX 500 ; N a ; B 25 -14 488 473 ; C 98 ; WX 556 ; N b ; B 17 -14 521 676 ; C 99 ; WX 444 ; N c ; B 25 -14 430 473 ; C 100 ; WX 556 ; N d ; B 25 -14 534 676 ; C 101 ; WX 444 ; N e ; B 25 -14 426 473 ; C 102 ; WX 333 ; N f ; B 14 0 389 691 ; L i fi ; L l fl ; C 103 ; WX 500 ; N g ; B 28 -206 483 473 ; C 104 ; WX 556 ; N h ; B 16 0 534 676 ; C 105 ; WX 278 ; N i ; B 16 0 255 691 ; C 106 ; WX 333 ; N j ; B -57 -203 263 691 ; C 107 ; WX 556 ; N k ; B 22 0 543 676 ; C 108 ; WX 278 ; N l ; B 16 0 255 676 ; C 109 ; WX 833 ; N m ; B 16 0 814 473 ; C 110 ; WX 556 ; N n ; B 21 0 539 473 ; C 111 ; WX 500 ; N o ; B 25 -14 476 473 ; C 112 ; WX 556 ; N p ; B 19 -205 524 473 ; C 113 ; WX 556 ; N q ; B 34 -205 536 473 ; C 114 ; WX 444 ; N r ; B 29 0 434 473 ; C 115 ; WX 389 ; N s ; B 25 -14 361 473 ; C 116 ; WX 333 ; N t ; B 20 -12 332 630 ; C 117 ; WX 556 ; N u ; B 16 -14 537 461 ; C 118 ; WX 500 ; N v ; B 21 -14 485 461 ; C 119 ; WX 722 ; N w ; B 23 -14 707 461 ; C 120 ; WX 500 ; N x ; B 12 0 484 461 ; C 121 ; WX 500 ; N y ; B 16 -205 480 461 ; C 122 ; WX 444 ; N z ; B 21 0 420 461 ; C 123 ; WX 394 ; N braceleft ; B 22 -175 340 698 ; C 124 ; WX 220 ; N bar ; B 66 -218 154 782 ; C 125 ; WX 394 ; N braceright ; B 54 -175 372 698 ; C 126 ; WX 520 ; N asciitilde ; B 29 173 491 333 ; C 161 ; WX 333 ; N exclamdown ; B 82 -203 252 501 ; C 162 ; WX 500 ; N cent ; B 53 -140 458 588 ; C 163 ; WX 500 ; N sterling ; B 21 -14 477 684 ; C 164 ; WX 167 ; N fraction ; B -168 -12 329 688 ; C 165 ; WX 500 ; N yen ; B -64 0 547 676 ; C 166 ; WX 500 ; N florin ; B 0 -155 498 706 ; C 167 ; WX 500 ; N section ; B 57 -132 443 691 ; C 168 ; WX 500 ; N currency ; B -26 61 526 613 ; C 169 ; WX 278 ; N quotesingle ; B 75 404 204 691 ; C 170 ; WX 500 ; N quotedblleft ; B 32 356 486 691 ; C 171 ; WX 500 ; N guillemotleft ; B 23 36 473 415 ; C 172 ; WX 333 ; N guilsinglleft ; B 51 36 305 415 ; C 173 ; WX 333 ; N guilsinglright ; B 28 36 282 415 ; C 174 ; WX 556 ; N fi ; B 14 0 536 691 ; C 175 ; WX 556 ; N fl ; B 14 0 536 691 ; C 177 ; WX 500 ; N endash ; B 0 181 500 271 ; C 178 ; WX 500 ; N dagger ; B 47 -134 453 691 ; C 179 ; WX 500 ; N daggerdbl ; B 45 -132 456 691 ; C 180 ; WX 250 ; N periodcentered ; B 41 248 210 417 ; C 182 ; WX 540 ; N paragraph ; B 0 -186 519 676 ; C 183 ; WX 350 ; N bullet ; B 35 198 315 478 ; C 184 ; WX 333 ; N quotesinglbase ; B 79 -180 263 155 ; C 185 ; WX 500 ; N quotedblbase ; B 14 -180 468 155 ; C 186 ; WX 500 ; N quotedblright ; B 14 356 468 691 ; C 187 ; WX 500 ; N guillemotright ; B 27 36 477 415 ; C 188 ; WX 1000 ; N ellipsis ; B 82 -13 917 156 ; C 189 ; WX 1000 ; N perthousand ; B 7 -29 995 706 ; C 191 ; WX 500 ; N questiondown ; B 55 -201 443 501 ; C 193 ; WX 333 ; N grave ; B 8 528 246 713 ; C 194 ; WX 333 ; N acute ; B 86 528 324 713 ; C 195 ; WX 333 ; N circumflex ; B -2 528 335 704 ; C 196 ; WX 333 ; N tilde ; B -16 547 349 674 ; C 197 ; WX 333 ; N macron ; B 1 565 331 637 ; C 198 ; WX 333 ; N breve ; B 15 528 318 691 ; C 199 ; WX 333 ; N dotaccent ; B 103 536 258 691 ; C 200 ; WX 333 ; N dieresis ; B -2 537 335 667 ; C 202 ; WX 333 ; N ring ; B 60 527 273 740 ; C 203 ; WX 333 ; N cedilla ; B 68 -218 294 0 ; C 205 ; WX 333 ; N hungarumlaut ; B -13 528 425 713 ; C 206 ; WX 333 ; N ogonek ; B 90 -193 319 24 ; C 207 ; WX 333 ; N caron ; B -2 528 335 704 ; C 208 ; WX 1000 ; N emdash ; B 0 181 1000 271 ; C 225 ; WX 1000 ; N AE ; B 4 0 951 676 ; C 227 ; WX 300 ; N ordfeminine ; B -1 397 301 688 ; C 232 ; WX 667 ; N Lslash ; B 19 0 638 676 ; C 233 ; WX 778 ; N Oslash ; B 35 -74 743 737 ; C 234 ; WX 1000 ; N OE ; B 22 -5 981 684 ; C 235 ; WX 330 ; N ordmasculine ; B 18 397 312 688 ; C 241 ; WX 722 ; N ae ; B 33 -14 693 473 ; C 245 ; WX 278 ; N dotlessi ; B 16 0 255 461 ; C 248 ; WX 278 ; N lslash ; B -22 0 303 676 ; C 249 ; WX 500 ; N oslash ; B 25 -92 476 549 ; C 250 ; WX 722 ; N oe ; B 22 -14 696 473 ; C 251 ; WX 556 ; N germandbls ; B 19 -12 517 691 ; C -1 ; WX 389 ; N Idieresis ; B 20 0 370 877 ; C -1 ; WX 444 ; N eacute ; B 25 -14 426 713 ; C -1 ; WX 500 ; N abreve ; B 25 -14 488 691 ; C -1 ; WX 556 ; N uhungarumlaut ; B 16 -14 557 713 ; C -1 ; WX 444 ; N ecaron ; B 25 -14 426 704 ; C -1 ; WX 722 ; N Ydieresis ; B 15 0 699 877 ; C -1 ; WX 570 ; N divide ; B 33 -31 537 537 ; C -1 ; WX 722 ; N Yacute ; B 15 0 699 923 ; C -1 ; WX 722 ; N Acircumflex ; B 9 0 689 914 ; C -1 ; WX 500 ; N aacute ; B 25 -14 488 713 ; C -1 ; WX 722 ; N Ucircumflex ; B 16 -19 701 914 ; C -1 ; WX 500 ; N yacute ; B 16 -205 480 713 ; C -1 ; WX 389 ; N scommaaccent ; B 25 -218 361 473 ; C -1 ; WX 444 ; N ecircumflex ; B 25 -14 426 704 ; C -1 ; WX 722 ; N Uring ; B 16 -19 701 935 ; C -1 ; WX 722 ; N Udieresis ; B 16 -19 701 877 ; C -1 ; WX 500 ; N aogonek ; B 25 -193 504 473 ; C -1 ; WX 722 ; N Uacute ; B 16 -19 701 923 ; C -1 ; WX 556 ; N uogonek ; B 16 -193 539 461 ; C -1 ; WX 667 ; N Edieresis ; B 16 0 641 877 ; C -1 ; WX 722 ; N Dcroat ; B 6 0 690 676 ; C -1 ; WX 250 ; N commaaccent ; B 47 -218 203 -50 ; C -1 ; WX 747 ; N copyright ; B 26 -19 721 691 ; C -1 ; WX 667 ; N Emacron ; B 16 0 641 847 ; C -1 ; WX 444 ; N ccaron ; B 25 -14 430 704 ; C -1 ; WX 500 ; N aring ; B 25 -14 488 740 ; C -1 ; WX 722 ; N Ncommaaccent ; B 16 -188 701 676 ; C -1 ; WX 278 ; N lacute ; B 16 0 297 923 ; C -1 ; WX 500 ; N agrave ; B 25 -14 488 713 ; C -1 ; WX 667 ; N Tcommaaccent ; B 31 -218 636 676 ; C -1 ; WX 722 ; N Cacute ; B 49 -19 687 923 ; C -1 ; WX 500 ; N atilde ; B 25 -14 488 674 ; C -1 ; WX 667 ; N Edotaccent ; B 16 0 641 901 ; C -1 ; WX 389 ; N scaron ; B 25 -14 363 704 ; C -1 ; WX 389 ; N scedilla ; B 25 -218 361 473 ; C -1 ; WX 278 ; N iacute ; B 16 0 289 713 ; C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ; C -1 ; WX 722 ; N Rcaron ; B 26 0 715 914 ; C -1 ; WX 778 ; N Gcommaaccent ; B 37 -218 755 691 ; C -1 ; WX 556 ; N ucircumflex ; B 16 -14 537 704 ; C -1 ; WX 500 ; N acircumflex ; B 25 -14 488 704 ; C -1 ; WX 722 ; N Amacron ; B 9 0 689 847 ; C -1 ; WX 444 ; N rcaron ; B 29 0 434 704 ; C -1 ; WX 444 ; N ccedilla ; B 25 -218 430 473 ; C -1 ; WX 667 ; N Zdotaccent ; B 28 0 634 901 ; C -1 ; WX 611 ; N Thorn ; B 16 0 600 676 ; C -1 ; WX 778 ; N Omacron ; B 35 -19 743 847 ; C -1 ; WX 722 ; N Racute ; B 26 0 715 923 ; C -1 ; WX 556 ; N Sacute ; B 35 -19 513 923 ; C -1 ; WX 672 ; N dcaron ; B 25 -14 681 682 ; C -1 ; WX 722 ; N Umacron ; B 16 -19 701 847 ; C -1 ; WX 556 ; N uring ; B 16 -14 537 740 ; C -1 ; WX 300 ; N threesuperior ; B 3 268 297 688 ; C -1 ; WX 778 ; N Ograve ; B 35 -19 743 923 ; C -1 ; WX 722 ; N Agrave ; B 9 0 689 923 ; C -1 ; WX 722 ; N Abreve ; B 9 0 689 901 ; C -1 ; WX 570 ; N multiply ; B 48 16 522 490 ; C -1 ; WX 556 ; N uacute ; B 16 -14 537 713 ; C -1 ; WX 667 ; N Tcaron ; B 31 0 636 914 ; C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ; C -1 ; WX 500 ; N ydieresis ; B 16 -205 480 667 ; C -1 ; WX 722 ; N Nacute ; B 16 -18 701 923 ; C -1 ; WX 278 ; N icircumflex ; B -37 0 300 704 ; C -1 ; WX 667 ; N Ecircumflex ; B 16 0 641 914 ; C -1 ; WX 500 ; N adieresis ; B 25 -14 488 667 ; C -1 ; WX 444 ; N edieresis ; B 25 -14 426 667 ; C -1 ; WX 444 ; N cacute ; B 25 -14 430 713 ; C -1 ; WX 556 ; N nacute ; B 21 0 539 713 ; C -1 ; WX 556 ; N umacron ; B 16 -14 537 637 ; C -1 ; WX 722 ; N Ncaron ; B 16 -18 701 914 ; C -1 ; WX 389 ; N Iacute ; B 20 0 370 923 ; C -1 ; WX 570 ; N plusminus ; B 33 0 537 506 ; C -1 ; WX 220 ; N brokenbar ; B 66 -143 154 707 ; C -1 ; WX 747 ; N registered ; B 26 -19 721 691 ; C -1 ; WX 778 ; N Gbreve ; B 37 -19 755 901 ; C -1 ; WX 389 ; N Idotaccent ; B 20 0 370 901 ; C -1 ; WX 600 ; N summation ; B 14 -10 585 706 ; C -1 ; WX 667 ; N Egrave ; B 16 0 641 923 ; C -1 ; WX 444 ; N racute ; B 29 0 434 713 ; C -1 ; WX 500 ; N omacron ; B 25 -14 476 637 ; C -1 ; WX 667 ; N Zacute ; B 28 0 634 923 ; C -1 ; WX 667 ; N Zcaron ; B 28 0 634 914 ; C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ; C -1 ; WX 722 ; N Eth ; B 6 0 690 676 ; C -1 ; WX 722 ; N Ccedilla ; B 49 -218 687 691 ; C -1 ; WX 278 ; N lcommaaccent ; B 16 -218 255 676 ; C -1 ; WX 416 ; N tcaron ; B 20 -12 425 815 ; C -1 ; WX 444 ; N eogonek ; B 25 -193 426 473 ; C -1 ; WX 722 ; N Uogonek ; B 16 -193 701 676 ; C -1 ; WX 722 ; N Aacute ; B 9 0 689 923 ; C -1 ; WX 722 ; N Adieresis ; B 9 0 689 877 ; C -1 ; WX 444 ; N egrave ; B 25 -14 426 713 ; C -1 ; WX 444 ; N zacute ; B 21 0 420 713 ; C -1 ; WX 278 ; N iogonek ; B 16 -193 274 691 ; C -1 ; WX 778 ; N Oacute ; B 35 -19 743 923 ; C -1 ; WX 500 ; N oacute ; B 25 -14 476 713 ; C -1 ; WX 500 ; N amacron ; B 25 -14 488 637 ; C -1 ; WX 389 ; N sacute ; B 25 -14 361 713 ; C -1 ; WX 278 ; N idieresis ; B -37 0 300 667 ; C -1 ; WX 778 ; N Ocircumflex ; B 35 -19 743 914 ; C -1 ; WX 722 ; N Ugrave ; B 16 -19 701 923 ; C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; C -1 ; WX 556 ; N thorn ; B 19 -205 524 676 ; C -1 ; WX 300 ; N twosuperior ; B 0 275 300 688 ; C -1 ; WX 778 ; N Odieresis ; B 35 -19 743 877 ; C -1 ; WX 556 ; N mu ; B 33 -206 536 461 ; C -1 ; WX 278 ; N igrave ; B -27 0 255 713 ; C -1 ; WX 500 ; N ohungarumlaut ; B 25 -14 529 713 ; C -1 ; WX 667 ; N Eogonek ; B 16 -193 644 676 ; C -1 ; WX 556 ; N dcroat ; B 25 -14 534 676 ; C -1 ; WX 750 ; N threequarters ; B 23 -12 733 688 ; C -1 ; WX 556 ; N Scedilla ; B 35 -218 513 692 ; C -1 ; WX 394 ; N lcaron ; B 16 0 412 682 ; C -1 ; WX 778 ; N Kcommaaccent ; B 30 -218 769 676 ; C -1 ; WX 667 ; N Lacute ; B 19 0 638 923 ; C -1 ; WX 1000 ; N trademark ; B 24 271 977 676 ; C -1 ; WX 444 ; N edotaccent ; B 25 -14 426 691 ; C -1 ; WX 389 ; N Igrave ; B 20 0 370 923 ; C -1 ; WX 389 ; N Imacron ; B 20 0 370 847 ; C -1 ; WX 667 ; N Lcaron ; B 19 0 652 682 ; C -1 ; WX 750 ; N onehalf ; B -7 -12 775 688 ; C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ; C -1 ; WX 500 ; N ocircumflex ; B 25 -14 476 704 ; C -1 ; WX 556 ; N ntilde ; B 21 0 539 674 ; C -1 ; WX 722 ; N Uhungarumlaut ; B 16 -19 701 923 ; C -1 ; WX 667 ; N Eacute ; B 16 0 641 923 ; C -1 ; WX 444 ; N emacron ; B 25 -14 426 637 ; C -1 ; WX 500 ; N gbreve ; B 28 -206 483 691 ; C -1 ; WX 750 ; N onequarter ; B 28 -12 743 688 ; C -1 ; WX 556 ; N Scaron ; B 35 -19 513 914 ; C -1 ; WX 556 ; N Scommaaccent ; B 35 -218 513 692 ; C -1 ; WX 778 ; N Ohungarumlaut ; B 35 -19 743 923 ; C -1 ; WX 400 ; N degree ; B 57 402 343 688 ; C -1 ; WX 500 ; N ograve ; B 25 -14 476 713 ; C -1 ; WX 722 ; N Ccaron ; B 49 -19 687 914 ; C -1 ; WX 556 ; N ugrave ; B 16 -14 537 713 ; C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ; C -1 ; WX 722 ; N Dcaron ; B 14 0 690 914 ; C -1 ; WX 444 ; N rcommaaccent ; B 29 -218 434 473 ; C -1 ; WX 722 ; N Ntilde ; B 16 -18 701 884 ; C -1 ; WX 500 ; N otilde ; B 25 -14 476 674 ; C -1 ; WX 722 ; N Rcommaaccent ; B 26 -218 715 676 ; C -1 ; WX 667 ; N Lcommaaccent ; B 19 -218 638 676 ; C -1 ; WX 722 ; N Atilde ; B 9 0 689 884 ; C -1 ; WX 722 ; N Aogonek ; B 9 -193 699 690 ; C -1 ; WX 722 ; N Aring ; B 9 0 689 935 ; C -1 ; WX 778 ; N Otilde ; B 35 -19 743 884 ; C -1 ; WX 444 ; N zdotaccent ; B 21 0 420 691 ; C -1 ; WX 667 ; N Ecaron ; B 16 0 641 914 ; C -1 ; WX 389 ; N Iogonek ; B 20 -193 370 676 ; C -1 ; WX 556 ; N kcommaaccent ; B 22 -218 543 676 ; C -1 ; WX 570 ; N minus ; B 33 209 537 297 ; C -1 ; WX 389 ; N Icircumflex ; B 20 0 370 914 ; C -1 ; WX 556 ; N ncaron ; B 21 0 539 704 ; C -1 ; WX 333 ; N tcommaaccent ; B 20 -218 332 630 ; C -1 ; WX 570 ; N logicalnot ; B 33 108 537 399 ; C -1 ; WX 500 ; N odieresis ; B 25 -14 476 667 ; C -1 ; WX 556 ; N udieresis ; B 16 -14 537 667 ; C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ; C -1 ; WX 500 ; N gcommaaccent ; B 28 -206 483 829 ; C -1 ; WX 500 ; N eth ; B 25 -14 476 691 ; C -1 ; WX 444 ; N zcaron ; B 21 0 420 704 ; C -1 ; WX 556 ; N ncommaaccent ; B 21 -218 539 473 ; C -1 ; WX 300 ; N onesuperior ; B 28 275 273 688 ; C -1 ; WX 278 ; N imacron ; B -8 0 272 637 ; C -1 ; WX 500 ; N Euro ; B 0 0 0 0 ; EndCharMetrics StartKernData StartKernPairs 2242 KPX A C -55 KPX A Cacute -55 KPX A Ccaron -55 KPX A Ccedilla -55 KPX A G -55 KPX A Gbreve -55 KPX A Gcommaaccent -55 KPX A O -45 KPX A Oacute -45 KPX A Ocircumflex -45 KPX A Odieresis -45 KPX A Ograve -45 KPX A Ohungarumlaut -45 KPX A Omacron -45 KPX A Oslash -45 KPX A Otilde -45 KPX A Q -45 KPX A T -95 KPX A Tcaron -95 KPX A Tcommaaccent -95 KPX A U -50 KPX A Uacute -50 KPX A Ucircumflex -50 KPX A Udieresis -50 KPX A Ugrave -50 KPX A Uhungarumlaut -50 KPX A Umacron -50 KPX A Uogonek -50 KPX A Uring -50 KPX A V -145 KPX A W -130 KPX A Y -100 KPX A Yacute -100 KPX A Ydieresis -100 KPX A p -25 KPX A quoteright -74 KPX A u -50 KPX A uacute -50 KPX A ucircumflex -50 KPX A udieresis -50 KPX A ugrave -50 KPX A uhungarumlaut -50 KPX A umacron -50 KPX A uogonek -50 KPX A uring -50 KPX A v -100 KPX A w -90 KPX A y -74 KPX A yacute -74 KPX A ydieresis -74 KPX Aacute C -55 KPX Aacute Cacute -55 KPX Aacute Ccaron -55 KPX Aacute Ccedilla -55 KPX Aacute G -55 KPX Aacute Gbreve -55 KPX Aacute Gcommaaccent -55 KPX Aacute O -45 KPX Aacute Oacute -45 KPX Aacute Ocircumflex -45 KPX Aacute Odieresis -45 KPX Aacute Ograve -45 KPX Aacute Ohungarumlaut -45 KPX Aacute Omacron -45 KPX Aacute Oslash -45 KPX Aacute Otilde -45 KPX Aacute Q -45 KPX Aacute T -95 KPX Aacute Tcaron -95 KPX Aacute Tcommaaccent -95 KPX Aacute U -50 KPX Aacute Uacute -50 KPX Aacute Ucircumflex -50 KPX Aacute Udieresis -50 KPX Aacute Ugrave -50 KPX Aacute Uhungarumlaut -50 KPX Aacute Umacron -50 KPX Aacute Uogonek -50 KPX Aacute Uring -50 KPX Aacute V -145 KPX Aacute W -130 KPX Aacute Y -100 KPX Aacute Yacute -100 KPX Aacute Ydieresis -100 KPX Aacute p -25 KPX Aacute quoteright -74 KPX Aacute u -50 KPX Aacute uacute -50 KPX Aacute ucircumflex -50 KPX Aacute udieresis -50 KPX Aacute ugrave -50 KPX Aacute uhungarumlaut -50 KPX Aacute umacron -50 KPX Aacute uogonek -50 KPX Aacute uring -50 KPX Aacute v -100 KPX Aacute w -90 KPX Aacute y -74 KPX Aacute yacute -74 KPX Aacute ydieresis -74 KPX Abreve C -55 KPX Abreve Cacute -55 KPX Abreve Ccaron -55 KPX Abreve Ccedilla -55 KPX Abreve G -55 KPX Abreve Gbreve -55 KPX Abreve Gcommaaccent -55 KPX Abreve O -45 KPX Abreve Oacute -45 KPX Abreve Ocircumflex -45 KPX Abreve Odieresis -45 KPX Abreve Ograve -45 KPX Abreve Ohungarumlaut -45 KPX Abreve Omacron -45 KPX Abreve Oslash -45 KPX Abreve Otilde -45 KPX Abreve Q -45 KPX Abreve T -95 KPX Abreve Tcaron -95 KPX Abreve Tcommaaccent -95 KPX Abreve U -50 KPX Abreve Uacute -50 KPX Abreve Ucircumflex -50 KPX Abreve Udieresis -50 KPX Abreve Ugrave -50 KPX Abreve Uhungarumlaut -50 KPX Abreve Umacron -50 KPX Abreve Uogonek -50 KPX Abreve Uring -50 KPX Abreve V -145 KPX Abreve W -130 KPX Abreve Y -100 KPX Abreve Yacute -100 KPX Abreve Ydieresis -100 KPX Abreve p -25 KPX Abreve quoteright -74 KPX Abreve u -50 KPX Abreve uacute -50 KPX Abreve ucircumflex -50 KPX Abreve udieresis -50 KPX Abreve ugrave -50 KPX Abreve uhungarumlaut -50 KPX Abreve umacron -50 KPX Abreve uogonek -50 KPX Abreve uring -50 KPX Abreve v -100 KPX Abreve w -90 KPX Abreve y -74 KPX Abreve yacute -74 KPX Abreve ydieresis -74 KPX Acircumflex C -55 KPX Acircumflex Cacute -55 KPX Acircumflex Ccaron -55 KPX Acircumflex Ccedilla -55 KPX Acircumflex G -55 KPX Acircumflex Gbreve -55 KPX Acircumflex Gcommaaccent -55 KPX Acircumflex O -45 KPX Acircumflex Oacute -45 KPX Acircumflex Ocircumflex -45 KPX Acircumflex Odieresis -45 KPX Acircumflex Ograve -45 KPX Acircumflex Ohungarumlaut -45 KPX Acircumflex Omacron -45 KPX Acircumflex Oslash -45 KPX Acircumflex Otilde -45 KPX Acircumflex Q -45 KPX Acircumflex T -95 KPX Acircumflex Tcaron -95 KPX Acircumflex Tcommaaccent -95 KPX Acircumflex U -50 KPX Acircumflex Uacute -50 KPX Acircumflex Ucircumflex -50 KPX Acircumflex Udieresis -50 KPX Acircumflex Ugrave -50 KPX Acircumflex Uhungarumlaut -50 KPX Acircumflex Umacron -50 KPX Acircumflex Uogonek -50 KPX Acircumflex Uring -50 KPX Acircumflex V -145 KPX Acircumflex W -130 KPX Acircumflex Y -100 KPX Acircumflex Yacute -100 KPX Acircumflex Ydieresis -100 KPX Acircumflex p -25 KPX Acircumflex quoteright -74 KPX Acircumflex u -50 KPX Acircumflex uacute -50 KPX Acircumflex ucircumflex -50 KPX Acircumflex udieresis -50 KPX Acircumflex ugrave -50 KPX Acircumflex uhungarumlaut -50 KPX Acircumflex umacron -50 KPX Acircumflex uogonek -50 KPX Acircumflex uring -50 KPX Acircumflex v -100 KPX Acircumflex w -90 KPX Acircumflex y -74 KPX Acircumflex yacute -74 KPX Acircumflex ydieresis -74 KPX Adieresis C -55 KPX Adieresis Cacute -55 KPX Adieresis Ccaron -55 KPX Adieresis Ccedilla -55 KPX Adieresis G -55 KPX Adieresis Gbreve -55 KPX Adieresis Gcommaaccent -55 KPX Adieresis O -45 KPX Adieresis Oacute -45 KPX Adieresis Ocircumflex -45 KPX Adieresis Odieresis -45 KPX Adieresis Ograve -45 KPX Adieresis Ohungarumlaut -45 KPX Adieresis Omacron -45 KPX Adieresis Oslash -45 KPX Adieresis Otilde -45 KPX Adieresis Q -45 KPX Adieresis T -95 KPX Adieresis Tcaron -95 KPX Adieresis Tcommaaccent -95 KPX Adieresis U -50 KPX Adieresis Uacute -50 KPX Adieresis Ucircumflex -50 KPX Adieresis Udieresis -50 KPX Adieresis Ugrave -50 KPX Adieresis Uhungarumlaut -50 KPX Adieresis Umacron -50 KPX Adieresis Uogonek -50 KPX Adieresis Uring -50 KPX Adieresis V -145 KPX Adieresis W -130 KPX Adieresis Y -100 KPX Adieresis Yacute -100 KPX Adieresis Ydieresis -100 KPX Adieresis p -25 KPX Adieresis quoteright -74 KPX Adieresis u -50 KPX Adieresis uacute -50 KPX Adieresis ucircumflex -50 KPX Adieresis udieresis -50 KPX Adieresis ugrave -50 KPX Adieresis uhungarumlaut -50 KPX Adieresis umacron -50 KPX Adieresis uogonek -50 KPX Adieresis uring -50 KPX Adieresis v -100 KPX Adieresis w -90 KPX Adieresis y -74 KPX Adieresis yacute -74 KPX Adieresis ydieresis -74 KPX Agrave C -55 KPX Agrave Cacute -55 KPX Agrave Ccaron -55 KPX Agrave Ccedilla -55 KPX Agrave G -55 KPX Agrave Gbreve -55 KPX Agrave Gcommaaccent -55 KPX Agrave O -45 KPX Agrave Oacute -45 KPX Agrave Ocircumflex -45 KPX Agrave Odieresis -45 KPX Agrave Ograve -45 KPX Agrave Ohungarumlaut -45 KPX Agrave Omacron -45 KPX Agrave Oslash -45 KPX Agrave Otilde -45 KPX Agrave Q -45 KPX Agrave T -95 KPX Agrave Tcaron -95 KPX Agrave Tcommaaccent -95 KPX Agrave U -50 KPX Agrave Uacute -50 KPX Agrave Ucircumflex -50 KPX Agrave Udieresis -50 KPX Agrave Ugrave -50 KPX Agrave Uhungarumlaut -50 KPX Agrave Umacron -50 KPX Agrave Uogonek -50 KPX Agrave Uring -50 KPX Agrave V -145 KPX Agrave W -130 KPX Agrave Y -100 KPX Agrave Yacute -100 KPX Agrave Ydieresis -100 KPX Agrave p -25 KPX Agrave quoteright -74 KPX Agrave u -50 KPX Agrave uacute -50 KPX Agrave ucircumflex -50 KPX Agrave udieresis -50 KPX Agrave ugrave -50 KPX Agrave uhungarumlaut -50 KPX Agrave umacron -50 KPX Agrave uogonek -50 KPX Agrave uring -50 KPX Agrave v -100 KPX Agrave w -90 KPX Agrave y -74 KPX Agrave yacute -74 KPX Agrave ydieresis -74 KPX Amacron C -55 KPX Amacron Cacute -55 KPX Amacron Ccaron -55 KPX Amacron Ccedilla -55 KPX Amacron G -55 KPX Amacron Gbreve -55 KPX Amacron Gcommaaccent -55 KPX Amacron O -45 KPX Amacron Oacute -45 KPX Amacron Ocircumflex -45 KPX Amacron Odieresis -45 KPX Amacron Ograve -45 KPX Amacron Ohungarumlaut -45 KPX Amacron Omacron -45 KPX Amacron Oslash -45 KPX Amacron Otilde -45 KPX Amacron Q -45 KPX Amacron T -95 KPX Amacron Tcaron -95 KPX Amacron Tcommaaccent -95 KPX Amacron U -50 KPX Amacron Uacute -50 KPX Amacron Ucircumflex -50 KPX Amacron Udieresis -50 KPX Amacron Ugrave -50 KPX Amacron Uhungarumlaut -50 KPX Amacron Umacron -50 KPX Amacron Uogonek -50 KPX Amacron Uring -50 KPX Amacron V -145 KPX Amacron W -130 KPX Amacron Y -100 KPX Amacron Yacute -100 KPX Amacron Ydieresis -100 KPX Amacron p -25 KPX Amacron quoteright -74 KPX Amacron u -50 KPX Amacron uacute -50 KPX Amacron ucircumflex -50 KPX Amacron udieresis -50 KPX Amacron ugrave -50 KPX Amacron uhungarumlaut -50 KPX Amacron umacron -50 KPX Amacron uogonek -50 KPX Amacron uring -50 KPX Amacron v -100 KPX Amacron w -90 KPX Amacron y -74 KPX Amacron yacute -74 KPX Amacron ydieresis -74 KPX Aogonek C -55 KPX Aogonek Cacute -55 KPX Aogonek Ccaron -55 KPX Aogonek Ccedilla -55 KPX Aogonek G -55 KPX Aogonek Gbreve -55 KPX Aogonek Gcommaaccent -55 KPX Aogonek O -45 KPX Aogonek Oacute -45 KPX Aogonek Ocircumflex -45 KPX Aogonek Odieresis -45 KPX Aogonek Ograve -45 KPX Aogonek Ohungarumlaut -45 KPX Aogonek Omacron -45 KPX Aogonek Oslash -45 KPX Aogonek Otilde -45 KPX Aogonek Q -45 KPX Aogonek T -95 KPX Aogonek Tcaron -95 KPX Aogonek Tcommaaccent -95 KPX Aogonek U -50 KPX Aogonek Uacute -50 KPX Aogonek Ucircumflex -50 KPX Aogonek Udieresis -50 KPX Aogonek Ugrave -50 KPX Aogonek Uhungarumlaut -50 KPX Aogonek Umacron -50 KPX Aogonek Uogonek -50 KPX Aogonek Uring -50 KPX Aogonek V -145 KPX Aogonek W -130 KPX Aogonek Y -100 KPX Aogonek Yacute -100 KPX Aogonek Ydieresis -100 KPX Aogonek p -25 KPX Aogonek quoteright -74 KPX Aogonek u -50 KPX Aogonek uacute -50 KPX Aogonek ucircumflex -50 KPX Aogonek udieresis -50 KPX Aogonek ugrave -50 KPX Aogonek uhungarumlaut -50 KPX Aogonek umacron -50 KPX Aogonek uogonek -50 KPX Aogonek uring -50 KPX Aogonek v -100 KPX Aogonek w -90 KPX Aogonek y -34 KPX Aogonek yacute -34 KPX Aogonek ydieresis -34 KPX Aring C -55 KPX Aring Cacute -55 KPX Aring Ccaron -55 KPX Aring Ccedilla -55 KPX Aring G -55 KPX Aring Gbreve -55 KPX Aring Gcommaaccent -55 KPX Aring O -45 KPX Aring Oacute -45 KPX Aring Ocircumflex -45 KPX Aring Odieresis -45 KPX Aring Ograve -45 KPX Aring Ohungarumlaut -45 KPX Aring Omacron -45 KPX Aring Oslash -45 KPX Aring Otilde -45 KPX Aring Q -45 KPX Aring T -95 KPX Aring Tcaron -95 KPX Aring Tcommaaccent -95 KPX Aring U -50 KPX Aring Uacute -50 KPX Aring Ucircumflex -50 KPX Aring Udieresis -50 KPX Aring Ugrave -50 KPX Aring Uhungarumlaut -50 KPX Aring Umacron -50 KPX Aring Uogonek -50 KPX Aring Uring -50 KPX Aring V -145 KPX Aring W -130 KPX Aring Y -100 KPX Aring Yacute -100 KPX Aring Ydieresis -100 KPX Aring p -25 KPX Aring quoteright -74 KPX Aring u -50 KPX Aring uacute -50 KPX Aring ucircumflex -50 KPX Aring udieresis -50 KPX Aring ugrave -50 KPX Aring uhungarumlaut -50 KPX Aring umacron -50 KPX Aring uogonek -50 KPX Aring uring -50 KPX Aring v -100 KPX Aring w -90 KPX Aring y -74 KPX Aring yacute -74 KPX Aring ydieresis -74 KPX Atilde C -55 KPX Atilde Cacute -55 KPX Atilde Ccaron -55 KPX Atilde Ccedilla -55 KPX Atilde G -55 KPX Atilde Gbreve -55 KPX Atilde Gcommaaccent -55 KPX Atilde O -45 KPX Atilde Oacute -45 KPX Atilde Ocircumflex -45 KPX Atilde Odieresis -45 KPX Atilde Ograve -45 KPX Atilde Ohungarumlaut -45 KPX Atilde Omacron -45 KPX Atilde Oslash -45 KPX Atilde Otilde -45 KPX Atilde Q -45 KPX Atilde T -95 KPX Atilde Tcaron -95 KPX Atilde Tcommaaccent -95 KPX Atilde U -50 KPX Atilde Uacute -50 KPX Atilde Ucircumflex -50 KPX Atilde Udieresis -50 KPX Atilde Ugrave -50 KPX Atilde Uhungarumlaut -50 KPX Atilde Umacron -50 KPX Atilde Uogonek -50 KPX Atilde Uring -50 KPX Atilde V -145 KPX Atilde W -130 KPX Atilde Y -100 KPX Atilde Yacute -100 KPX Atilde Ydieresis -100 KPX Atilde p -25 KPX Atilde quoteright -74 KPX Atilde u -50 KPX Atilde uacute -50 KPX Atilde ucircumflex -50 KPX Atilde udieresis -50 KPX Atilde ugrave -50 KPX Atilde uhungarumlaut -50 KPX Atilde umacron -50 KPX Atilde uogonek -50 KPX Atilde uring -50 KPX Atilde v -100 KPX Atilde w -90 KPX Atilde y -74 KPX Atilde yacute -74 KPX Atilde ydieresis -74 KPX B A -30 KPX B Aacute -30 KPX B Abreve -30 KPX B Acircumflex -30 KPX B Adieresis -30 KPX B Agrave -30 KPX B Amacron -30 KPX B Aogonek -30 KPX B Aring -30 KPX B Atilde -30 KPX B U -10 KPX B Uacute -10 KPX B Ucircumflex -10 KPX B Udieresis -10 KPX B Ugrave -10 KPX B Uhungarumlaut -10 KPX B Umacron -10 KPX B Uogonek -10 KPX B Uring -10 KPX D A -35 KPX D Aacute -35 KPX D Abreve -35 KPX D Acircumflex -35 KPX D Adieresis -35 KPX D Agrave -35 KPX D Amacron -35 KPX D Aogonek -35 KPX D Aring -35 KPX D Atilde -35 KPX D V -40 KPX D W -40 KPX D Y -40 KPX D Yacute -40 KPX D Ydieresis -40 KPX D period -20 KPX Dcaron A -35 KPX Dcaron Aacute -35 KPX Dcaron Abreve -35 KPX Dcaron Acircumflex -35 KPX Dcaron Adieresis -35 KPX Dcaron Agrave -35 KPX Dcaron Amacron -35 KPX Dcaron Aogonek -35 KPX Dcaron Aring -35 KPX Dcaron Atilde -35 KPX Dcaron V -40 KPX Dcaron W -40 KPX Dcaron Y -40 KPX Dcaron Yacute -40 KPX Dcaron Ydieresis -40 KPX Dcaron period -20 KPX Dcroat A -35 KPX Dcroat Aacute -35 KPX Dcroat Abreve -35 KPX Dcroat Acircumflex -35 KPX Dcroat Adieresis -35 KPX Dcroat Agrave -35 KPX Dcroat Amacron -35 KPX Dcroat Aogonek -35 KPX Dcroat Aring -35 KPX Dcroat Atilde -35 KPX Dcroat V -40 KPX Dcroat W -40 KPX Dcroat Y -40 KPX Dcroat Yacute -40 KPX Dcroat Ydieresis -40 KPX Dcroat period -20 KPX F A -90 KPX F Aacute -90 KPX F Abreve -90 KPX F Acircumflex -90 KPX F Adieresis -90 KPX F Agrave -90 KPX F Amacron -90 KPX F Aogonek -90 KPX F Aring -90 KPX F Atilde -90 KPX F a -25 KPX F aacute -25 KPX F abreve -25 KPX F acircumflex -25 KPX F adieresis -25 KPX F agrave -25 KPX F amacron -25 KPX F aogonek -25 KPX F aring -25 KPX F atilde -25 KPX F comma -92 KPX F e -25 KPX F eacute -25 KPX F ecaron -25 KPX F ecircumflex -25 KPX F edieresis -25 KPX F edotaccent -25 KPX F egrave -25 KPX F emacron -25 KPX F eogonek -25 KPX F o -25 KPX F oacute -25 KPX F ocircumflex -25 KPX F odieresis -25 KPX F ograve -25 KPX F ohungarumlaut -25 KPX F omacron -25 KPX F oslash -25 KPX F otilde -25 KPX F period -110 KPX J A -30 KPX J Aacute -30 KPX J Abreve -30 KPX J Acircumflex -30 KPX J Adieresis -30 KPX J Agrave -30 KPX J Amacron -30 KPX J Aogonek -30 KPX J Aring -30 KPX J Atilde -30 KPX J a -15 KPX J aacute -15 KPX J abreve -15 KPX J acircumflex -15 KPX J adieresis -15 KPX J agrave -15 KPX J amacron -15 KPX J aogonek -15 KPX J aring -15 KPX J atilde -15 KPX J e -15 KPX J eacute -15 KPX J ecaron -15 KPX J ecircumflex -15 KPX J edieresis -15 KPX J edotaccent -15 KPX J egrave -15 KPX J emacron -15 KPX J eogonek -15 KPX J o -15 KPX J oacute -15 KPX J ocircumflex -15 KPX J odieresis -15 KPX J ograve -15 KPX J ohungarumlaut -15 KPX J omacron -15 KPX J oslash -15 KPX J otilde -15 KPX J period -20 KPX J u -15 KPX J uacute -15 KPX J ucircumflex -15 KPX J udieresis -15 KPX J ugrave -15 KPX J uhungarumlaut -15 KPX J umacron -15 KPX J uogonek -15 KPX J uring -15 KPX K O -30 KPX K Oacute -30 KPX K Ocircumflex -30 KPX K Odieresis -30 KPX K Ograve -30 KPX K Ohungarumlaut -30 KPX K Omacron -30 KPX K Oslash -30 KPX K Otilde -30 KPX K e -25 KPX K eacute -25 KPX K ecaron -25 KPX K ecircumflex -25 KPX K edieresis -25 KPX K edotaccent -25 KPX K egrave -25 KPX K emacron -25 KPX K eogonek -25 KPX K o -25 KPX K oacute -25 KPX K ocircumflex -25 KPX K odieresis -25 KPX K ograve -25 KPX K ohungarumlaut -25 KPX K omacron -25 KPX K oslash -25 KPX K otilde -25 KPX K u -15 KPX K uacute -15 KPX K ucircumflex -15 KPX K udieresis -15 KPX K ugrave -15 KPX K uhungarumlaut -15 KPX K umacron -15 KPX K uogonek -15 KPX K uring -15 KPX K y -45 KPX K yacute -45 KPX K ydieresis -45 KPX Kcommaaccent O -30 KPX Kcommaaccent Oacute -30 KPX Kcommaaccent Ocircumflex -30 KPX Kcommaaccent Odieresis -30 KPX Kcommaaccent Ograve -30 KPX Kcommaaccent Ohungarumlaut -30 KPX Kcommaaccent Omacron -30 KPX Kcommaaccent Oslash -30 KPX Kcommaaccent Otilde -30 KPX Kcommaaccent e -25 KPX Kcommaaccent eacute -25 KPX Kcommaaccent ecaron -25 KPX Kcommaaccent ecircumflex -25 KPX Kcommaaccent edieresis -25 KPX Kcommaaccent edotaccent -25 KPX Kcommaaccent egrave -25 KPX Kcommaaccent emacron -25 KPX Kcommaaccent eogonek -25 KPX Kcommaaccent o -25 KPX Kcommaaccent oacute -25 KPX Kcommaaccent ocircumflex -25 KPX Kcommaaccent odieresis -25 KPX Kcommaaccent ograve -25 KPX Kcommaaccent ohungarumlaut -25 KPX Kcommaaccent omacron -25 KPX Kcommaaccent oslash -25 KPX Kcommaaccent otilde -25 KPX Kcommaaccent u -15 KPX Kcommaaccent uacute -15 KPX Kcommaaccent ucircumflex -15 KPX Kcommaaccent udieresis -15 KPX Kcommaaccent ugrave -15 KPX Kcommaaccent uhungarumlaut -15 KPX Kcommaaccent umacron -15 KPX Kcommaaccent uogonek -15 KPX Kcommaaccent uring -15 KPX Kcommaaccent y -45 KPX Kcommaaccent yacute -45 KPX Kcommaaccent ydieresis -45 KPX L T -92 KPX L Tcaron -92 KPX L Tcommaaccent -92 KPX L V -92 KPX L W -92 KPX L Y -92 KPX L Yacute -92 KPX L Ydieresis -92 KPX L quotedblright -20 KPX L quoteright -110 KPX L y -55 KPX L yacute -55 KPX L ydieresis -55 KPX Lacute T -92 KPX Lacute Tcaron -92 KPX Lacute Tcommaaccent -92 KPX Lacute V -92 KPX Lacute W -92 KPX Lacute Y -92 KPX Lacute Yacute -92 KPX Lacute Ydieresis -92 KPX Lacute quotedblright -20 KPX Lacute quoteright -110 KPX Lacute y -55 KPX Lacute yacute -55 KPX Lacute ydieresis -55 KPX Lcommaaccent T -92 KPX Lcommaaccent Tcaron -92 KPX Lcommaaccent Tcommaaccent -92 KPX Lcommaaccent V -92 KPX Lcommaaccent W -92 KPX Lcommaaccent Y -92 KPX Lcommaaccent Yacute -92 KPX Lcommaaccent Ydieresis -92 KPX Lcommaaccent quotedblright -20 KPX Lcommaaccent quoteright -110 KPX Lcommaaccent y -55 KPX Lcommaaccent yacute -55 KPX Lcommaaccent ydieresis -55 KPX Lslash T -92 KPX Lslash Tcaron -92 KPX Lslash Tcommaaccent -92 KPX Lslash V -92 KPX Lslash W -92 KPX Lslash Y -92 KPX Lslash Yacute -92 KPX Lslash Ydieresis -92 KPX Lslash quotedblright -20 KPX Lslash quoteright -110 KPX Lslash y -55 KPX Lslash yacute -55 KPX Lslash ydieresis -55 KPX N A -20 KPX N Aacute -20 KPX N Abreve -20 KPX N Acircumflex -20 KPX N Adieresis -20 KPX N Agrave -20 KPX N Amacron -20 KPX N Aogonek -20 KPX N Aring -20 KPX N Atilde -20 KPX Nacute A -20 KPX Nacute Aacute -20 KPX Nacute Abreve -20 KPX Nacute Acircumflex -20 KPX Nacute Adieresis -20 KPX Nacute Agrave -20 KPX Nacute Amacron -20 KPX Nacute Aogonek -20 KPX Nacute Aring -20 KPX Nacute Atilde -20 KPX Ncaron A -20 KPX Ncaron Aacute -20 KPX Ncaron Abreve -20 KPX Ncaron Acircumflex -20 KPX Ncaron Adieresis -20 KPX Ncaron Agrave -20 KPX Ncaron Amacron -20 KPX Ncaron Aogonek -20 KPX Ncaron Aring -20 KPX Ncaron Atilde -20 KPX Ncommaaccent A -20 KPX Ncommaaccent Aacute -20 KPX Ncommaaccent Abreve -20 KPX Ncommaaccent Acircumflex -20 KPX Ncommaaccent Adieresis -20 KPX Ncommaaccent Agrave -20 KPX Ncommaaccent Amacron -20 KPX Ncommaaccent Aogonek -20 KPX Ncommaaccent Aring -20 KPX Ncommaaccent Atilde -20 KPX Ntilde A -20 KPX Ntilde Aacute -20 KPX Ntilde Abreve -20 KPX Ntilde Acircumflex -20 KPX Ntilde Adieresis -20 KPX Ntilde Agrave -20 KPX Ntilde Amacron -20 KPX Ntilde Aogonek -20 KPX Ntilde Aring -20 KPX Ntilde Atilde -20 KPX O A -40 KPX O Aacute -40 KPX O Abreve -40 KPX O Acircumflex -40 KPX O Adieresis -40 KPX O Agrave -40 KPX O Amacron -40 KPX O Aogonek -40 KPX O Aring -40 KPX O Atilde -40 KPX O T -40 KPX O Tcaron -40 KPX O Tcommaaccent -40 KPX O V -50 KPX O W -50 KPX O X -40 KPX O Y -50 KPX O Yacute -50 KPX O Ydieresis -50 KPX Oacute A -40 KPX Oacute Aacute -40 KPX Oacute Abreve -40 KPX Oacute Acircumflex -40 KPX Oacute Adieresis -40 KPX Oacute Agrave -40 KPX Oacute Amacron -40 KPX Oacute Aogonek -40 KPX Oacute Aring -40 KPX Oacute Atilde -40 KPX Oacute T -40 KPX Oacute Tcaron -40 KPX Oacute Tcommaaccent -40 KPX Oacute V -50 KPX Oacute W -50 KPX Oacute X -40 KPX Oacute Y -50 KPX Oacute Yacute -50 KPX Oacute Ydieresis -50 KPX Ocircumflex A -40 KPX Ocircumflex Aacute -40 KPX Ocircumflex Abreve -40 KPX Ocircumflex Acircumflex -40 KPX Ocircumflex Adieresis -40 KPX Ocircumflex Agrave -40 KPX Ocircumflex Amacron -40 KPX Ocircumflex Aogonek -40 KPX Ocircumflex Aring -40 KPX Ocircumflex Atilde -40 KPX Ocircumflex T -40 KPX Ocircumflex Tcaron -40 KPX Ocircumflex Tcommaaccent -40 KPX Ocircumflex V -50 KPX Ocircumflex W -50 KPX Ocircumflex X -40 KPX Ocircumflex Y -50 KPX Ocircumflex Yacute -50 KPX Ocircumflex Ydieresis -50 KPX Odieresis A -40 KPX Odieresis Aacute -40 KPX Odieresis Abreve -40 KPX Odieresis Acircumflex -40 KPX Odieresis Adieresis -40 KPX Odieresis Agrave -40 KPX Odieresis Amacron -40 KPX Odieresis Aogonek -40 KPX Odieresis Aring -40 KPX Odieresis Atilde -40 KPX Odieresis T -40 KPX Odieresis Tcaron -40 KPX Odieresis Tcommaaccent -40 KPX Odieresis V -50 KPX Odieresis W -50 KPX Odieresis X -40 KPX Odieresis Y -50 KPX Odieresis Yacute -50 KPX Odieresis Ydieresis -50 KPX Ograve A -40 KPX Ograve Aacute -40 KPX Ograve Abreve -40 KPX Ograve Acircumflex -40 KPX Ograve Adieresis -40 KPX Ograve Agrave -40 KPX Ograve Amacron -40 KPX Ograve Aogonek -40 KPX Ograve Aring -40 KPX Ograve Atilde -40 KPX Ograve T -40 KPX Ograve Tcaron -40 KPX Ograve Tcommaaccent -40 KPX Ograve V -50 KPX Ograve W -50 KPX Ograve X -40 KPX Ograve Y -50 KPX Ograve Yacute -50 KPX Ograve Ydieresis -50 KPX Ohungarumlaut A -40 KPX Ohungarumlaut Aacute -40 KPX Ohungarumlaut Abreve -40 KPX Ohungarumlaut Acircumflex -40 KPX Ohungarumlaut Adieresis -40 KPX Ohungarumlaut Agrave -40 KPX Ohungarumlaut Amacron -40 KPX Ohungarumlaut Aogonek -40 KPX Ohungarumlaut Aring -40 KPX Ohungarumlaut Atilde -40 KPX Ohungarumlaut T -40 KPX Ohungarumlaut Tcaron -40 KPX Ohungarumlaut Tcommaaccent -40 KPX Ohungarumlaut V -50 KPX Ohungarumlaut W -50 KPX Ohungarumlaut X -40 KPX Ohungarumlaut Y -50 KPX Ohungarumlaut Yacute -50 KPX Ohungarumlaut Ydieresis -50 KPX Omacron A -40 KPX Omacron Aacute -40 KPX Omacron Abreve -40 KPX Omacron Acircumflex -40 KPX Omacron Adieresis -40 KPX Omacron Agrave -40 KPX Omacron Amacron -40 KPX Omacron Aogonek -40 KPX Omacron Aring -40 KPX Omacron Atilde -40 KPX Omacron T -40 KPX Omacron Tcaron -40 KPX Omacron Tcommaaccent -40 KPX Omacron V -50 KPX Omacron W -50 KPX Omacron X -40 KPX Omacron Y -50 KPX Omacron Yacute -50 KPX Omacron Ydieresis -50 KPX Oslash A -40 KPX Oslash Aacute -40 KPX Oslash Abreve -40 KPX Oslash Acircumflex -40 KPX Oslash Adieresis -40 KPX Oslash Agrave -40 KPX Oslash Amacron -40 KPX Oslash Aogonek -40 KPX Oslash Aring -40 KPX Oslash Atilde -40 KPX Oslash T -40 KPX Oslash Tcaron -40 KPX Oslash Tcommaaccent -40 KPX Oslash V -50 KPX Oslash W -50 KPX Oslash X -40 KPX Oslash Y -50 KPX Oslash Yacute -50 KPX Oslash Ydieresis -50 KPX Otilde A -40 KPX Otilde Aacute -40 KPX Otilde Abreve -40 KPX Otilde Acircumflex -40 KPX Otilde Adieresis -40 KPX Otilde Agrave -40 KPX Otilde Amacron -40 KPX Otilde Aogonek -40 KPX Otilde Aring -40 KPX Otilde Atilde -40 KPX Otilde T -40 KPX Otilde Tcaron -40 KPX Otilde Tcommaaccent -40 KPX Otilde V -50 KPX Otilde W -50 KPX Otilde X -40 KPX Otilde Y -50 KPX Otilde Yacute -50 KPX Otilde Ydieresis -50 KPX P A -74 KPX P Aacute -74 KPX P Abreve -74 KPX P Acircumflex -74 KPX P Adieresis -74 KPX P Agrave -74 KPX P Amacron -74 KPX P Aogonek -74 KPX P Aring -74 KPX P Atilde -74 KPX P a -10 KPX P aacute -10 KPX P abreve -10 KPX P acircumflex -10 KPX P adieresis -10 KPX P agrave -10 KPX P amacron -10 KPX P aogonek -10 KPX P aring -10 KPX P atilde -10 KPX P comma -92 KPX P e -20 KPX P eacute -20 KPX P ecaron -20 KPX P ecircumflex -20 KPX P edieresis -20 KPX P edotaccent -20 KPX P egrave -20 KPX P emacron -20 KPX P eogonek -20 KPX P o -20 KPX P oacute -20 KPX P ocircumflex -20 KPX P odieresis -20 KPX P ograve -20 KPX P ohungarumlaut -20 KPX P omacron -20 KPX P oslash -20 KPX P otilde -20 KPX P period -110 KPX Q U -10 KPX Q Uacute -10 KPX Q Ucircumflex -10 KPX Q Udieresis -10 KPX Q Ugrave -10 KPX Q Uhungarumlaut -10 KPX Q Umacron -10 KPX Q Uogonek -10 KPX Q Uring -10 KPX Q period -20 KPX R O -30 KPX R Oacute -30 KPX R Ocircumflex -30 KPX R Odieresis -30 KPX R Ograve -30 KPX R Ohungarumlaut -30 KPX R Omacron -30 KPX R Oslash -30 KPX R Otilde -30 KPX R T -40 KPX R Tcaron -40 KPX R Tcommaaccent -40 KPX R U -30 KPX R Uacute -30 KPX R Ucircumflex -30 KPX R Udieresis -30 KPX R Ugrave -30 KPX R Uhungarumlaut -30 KPX R Umacron -30 KPX R Uogonek -30 KPX R Uring -30 KPX R V -55 KPX R W -35 KPX R Y -35 KPX R Yacute -35 KPX R Ydieresis -35 KPX Racute O -30 KPX Racute Oacute -30 KPX Racute Ocircumflex -30 KPX Racute Odieresis -30 KPX Racute Ograve -30 KPX Racute Ohungarumlaut -30 KPX Racute Omacron -30 KPX Racute Oslash -30 KPX Racute Otilde -30 KPX Racute T -40 KPX Racute Tcaron -40 KPX Racute Tcommaaccent -40 KPX Racute U -30 KPX Racute Uacute -30 KPX Racute Ucircumflex -30 KPX Racute Udieresis -30 KPX Racute Ugrave -30 KPX Racute Uhungarumlaut -30 KPX Racute Umacron -30 KPX Racute Uogonek -30 KPX Racute Uring -30 KPX Racute V -55 KPX Racute W -35 KPX Racute Y -35 KPX Racute Yacute -35 KPX Racute Ydieresis -35 KPX Rcaron O -30 KPX Rcaron Oacute -30 KPX Rcaron Ocircumflex -30 KPX Rcaron Odieresis -30 KPX Rcaron Ograve -30 KPX Rcaron Ohungarumlaut -30 KPX Rcaron Omacron -30 KPX Rcaron Oslash -30 KPX Rcaron Otilde -30 KPX Rcaron T -40 KPX Rcaron Tcaron -40 KPX Rcaron Tcommaaccent -40 KPX Rcaron U -30 KPX Rcaron Uacute -30 KPX Rcaron Ucircumflex -30 KPX Rcaron Udieresis -30 KPX Rcaron Ugrave -30 KPX Rcaron Uhungarumlaut -30 KPX Rcaron Umacron -30 KPX Rcaron Uogonek -30 KPX Rcaron Uring -30 KPX Rcaron V -55 KPX Rcaron W -35 KPX Rcaron Y -35 KPX Rcaron Yacute -35 KPX Rcaron Ydieresis -35 KPX Rcommaaccent O -30 KPX Rcommaaccent Oacute -30 KPX Rcommaaccent Ocircumflex -30 KPX Rcommaaccent Odieresis -30 KPX Rcommaaccent Ograve -30 KPX Rcommaaccent Ohungarumlaut -30 KPX Rcommaaccent Omacron -30 KPX Rcommaaccent Oslash -30 KPX Rcommaaccent Otilde -30 KPX Rcommaaccent T -40 KPX Rcommaaccent Tcaron -40 KPX Rcommaaccent Tcommaaccent -40 KPX Rcommaaccent U -30 KPX Rcommaaccent Uacute -30 KPX Rcommaaccent Ucircumflex -30 KPX Rcommaaccent Udieresis -30 KPX Rcommaaccent Ugrave -30 KPX Rcommaaccent Uhungarumlaut -30 KPX Rcommaaccent Umacron -30 KPX Rcommaaccent Uogonek -30 KPX Rcommaaccent Uring -30 KPX Rcommaaccent V -55 KPX Rcommaaccent W -35 KPX Rcommaaccent Y -35 KPX Rcommaaccent Yacute -35 KPX Rcommaaccent Ydieresis -35 KPX T A -90 KPX T Aacute -90 KPX T Abreve -90 KPX T Acircumflex -90 KPX T Adieresis -90 KPX T Agrave -90 KPX T Amacron -90 KPX T Aogonek -90 KPX T Aring -90 KPX T Atilde -90 KPX T O -18 KPX T Oacute -18 KPX T Ocircumflex -18 KPX T Odieresis -18 KPX T Ograve -18 KPX T Ohungarumlaut -18 KPX T Omacron -18 KPX T Oslash -18 KPX T Otilde -18 KPX T a -92 KPX T aacute -92 KPX T abreve -52 KPX T acircumflex -52 KPX T adieresis -52 KPX T agrave -52 KPX T amacron -52 KPX T aogonek -92 KPX T aring -92 KPX T atilde -52 KPX T colon -74 KPX T comma -74 KPX T e -92 KPX T eacute -92 KPX T ecaron -92 KPX T ecircumflex -92 KPX T edieresis -52 KPX T edotaccent -92 KPX T egrave -52 KPX T emacron -52 KPX T eogonek -92 KPX T hyphen -92 KPX T i -18 KPX T iacute -18 KPX T iogonek -18 KPX T o -92 KPX T oacute -92 KPX T ocircumflex -92 KPX T odieresis -92 KPX T ograve -92 KPX T ohungarumlaut -92 KPX T omacron -92 KPX T oslash -92 KPX T otilde -92 KPX T period -90 KPX T r -74 KPX T racute -74 KPX T rcaron -74 KPX T rcommaaccent -74 KPX T semicolon -74 KPX T u -92 KPX T uacute -92 KPX T ucircumflex -92 KPX T udieresis -92 KPX T ugrave -92 KPX T uhungarumlaut -92 KPX T umacron -92 KPX T uogonek -92 KPX T uring -92 KPX T w -74 KPX T y -34 KPX T yacute -34 KPX T ydieresis -34 KPX Tcaron A -90 KPX Tcaron Aacute -90 KPX Tcaron Abreve -90 KPX Tcaron Acircumflex -90 KPX Tcaron Adieresis -90 KPX Tcaron Agrave -90 KPX Tcaron Amacron -90 KPX Tcaron Aogonek -90 KPX Tcaron Aring -90 KPX Tcaron Atilde -90 KPX Tcaron O -18 KPX Tcaron Oacute -18 KPX Tcaron Ocircumflex -18 KPX Tcaron Odieresis -18 KPX Tcaron Ograve -18 KPX Tcaron Ohungarumlaut -18 KPX Tcaron Omacron -18 KPX Tcaron Oslash -18 KPX Tcaron Otilde -18 KPX Tcaron a -92 KPX Tcaron aacute -92 KPX Tcaron abreve -52 KPX Tcaron acircumflex -52 KPX Tcaron adieresis -52 KPX Tcaron agrave -52 KPX Tcaron amacron -52 KPX Tcaron aogonek -92 KPX Tcaron aring -92 KPX Tcaron atilde -52 KPX Tcaron colon -74 KPX Tcaron comma -74 KPX Tcaron e -92 KPX Tcaron eacute -92 KPX Tcaron ecaron -92 KPX Tcaron ecircumflex -92 KPX Tcaron edieresis -52 KPX Tcaron edotaccent -92 KPX Tcaron egrave -52 KPX Tcaron emacron -52 KPX Tcaron eogonek -92 KPX Tcaron hyphen -92 KPX Tcaron i -18 KPX Tcaron iacute -18 KPX Tcaron iogonek -18 KPX Tcaron o -92 KPX Tcaron oacute -92 KPX Tcaron ocircumflex -92 KPX Tcaron odieresis -92 KPX Tcaron ograve -92 KPX Tcaron ohungarumlaut -92 KPX Tcaron omacron -92 KPX Tcaron oslash -92 KPX Tcaron otilde -92 KPX Tcaron period -90 KPX Tcaron r -74 KPX Tcaron racute -74 KPX Tcaron rcaron -74 KPX Tcaron rcommaaccent -74 KPX Tcaron semicolon -74 KPX Tcaron u -92 KPX Tcaron uacute -92 KPX Tcaron ucircumflex -92 KPX Tcaron udieresis -92 KPX Tcaron ugrave -92 KPX Tcaron uhungarumlaut -92 KPX Tcaron umacron -92 KPX Tcaron uogonek -92 KPX Tcaron uring -92 KPX Tcaron w -74 KPX Tcaron y -34 KPX Tcaron yacute -34 KPX Tcaron ydieresis -34 KPX Tcommaaccent A -90 KPX Tcommaaccent Aacute -90 KPX Tcommaaccent Abreve -90 KPX Tcommaaccent Acircumflex -90 KPX Tcommaaccent Adieresis -90 KPX Tcommaaccent Agrave -90 KPX Tcommaaccent Amacron -90 KPX Tcommaaccent Aogonek -90 KPX Tcommaaccent Aring -90 KPX Tcommaaccent Atilde -90 KPX Tcommaaccent O -18 KPX Tcommaaccent Oacute -18 KPX Tcommaaccent Ocircumflex -18 KPX Tcommaaccent Odieresis -18 KPX Tcommaaccent Ograve -18 KPX Tcommaaccent Ohungarumlaut -18 KPX Tcommaaccent Omacron -18 KPX Tcommaaccent Oslash -18 KPX Tcommaaccent Otilde -18 KPX Tcommaaccent a -92 KPX Tcommaaccent aacute -92 KPX Tcommaaccent abreve -52 KPX Tcommaaccent acircumflex -52 KPX Tcommaaccent adieresis -52 KPX Tcommaaccent agrave -52 KPX Tcommaaccent amacron -52 KPX Tcommaaccent aogonek -92 KPX Tcommaaccent aring -92 KPX Tcommaaccent atilde -52 KPX Tcommaaccent colon -74 KPX Tcommaaccent comma -74 KPX Tcommaaccent e -92 KPX Tcommaaccent eacute -92 KPX Tcommaaccent ecaron -92 KPX Tcommaaccent ecircumflex -92 KPX Tcommaaccent edieresis -52 KPX Tcommaaccent edotaccent -92 KPX Tcommaaccent egrave -52 KPX Tcommaaccent emacron -52 KPX Tcommaaccent eogonek -92 KPX Tcommaaccent hyphen -92 KPX Tcommaaccent i -18 KPX Tcommaaccent iacute -18 KPX Tcommaaccent iogonek -18 KPX Tcommaaccent o -92 KPX Tcommaaccent oacute -92 KPX Tcommaaccent ocircumflex -92 KPX Tcommaaccent odieresis -92 KPX Tcommaaccent ograve -92 KPX Tcommaaccent ohungarumlaut -92 KPX Tcommaaccent omacron -92 KPX Tcommaaccent oslash -92 KPX Tcommaaccent otilde -92 KPX Tcommaaccent period -90 KPX Tcommaaccent r -74 KPX Tcommaaccent racute -74 KPX Tcommaaccent rcaron -74 KPX Tcommaaccent rcommaaccent -74 KPX Tcommaaccent semicolon -74 KPX Tcommaaccent u -92 KPX Tcommaaccent uacute -92 KPX Tcommaaccent ucircumflex -92 KPX Tcommaaccent udieresis -92 KPX Tcommaaccent ugrave -92 KPX Tcommaaccent uhungarumlaut -92 KPX Tcommaaccent umacron -92 KPX Tcommaaccent uogonek -92 KPX Tcommaaccent uring -92 KPX Tcommaaccent w -74 KPX Tcommaaccent y -34 KPX Tcommaaccent yacute -34 KPX Tcommaaccent ydieresis -34 KPX U A -60 KPX U Aacute -60 KPX U Abreve -60 KPX U Acircumflex -60 KPX U Adieresis -60 KPX U Agrave -60 KPX U Amacron -60 KPX U Aogonek -60 KPX U Aring -60 KPX U Atilde -60 KPX U comma -50 KPX U period -50 KPX Uacute A -60 KPX Uacute Aacute -60 KPX Uacute Abreve -60 KPX Uacute Acircumflex -60 KPX Uacute Adieresis -60 KPX Uacute Agrave -60 KPX Uacute Amacron -60 KPX Uacute Aogonek -60 KPX Uacute Aring -60 KPX Uacute Atilde -60 KPX Uacute comma -50 KPX Uacute period -50 KPX Ucircumflex A -60 KPX Ucircumflex Aacute -60 KPX Ucircumflex Abreve -60 KPX Ucircumflex Acircumflex -60 KPX Ucircumflex Adieresis -60 KPX Ucircumflex Agrave -60 KPX Ucircumflex Amacron -60 KPX Ucircumflex Aogonek -60 KPX Ucircumflex Aring -60 KPX Ucircumflex Atilde -60 KPX Ucircumflex comma -50 KPX Ucircumflex period -50 KPX Udieresis A -60 KPX Udieresis Aacute -60 KPX Udieresis Abreve -60 KPX Udieresis Acircumflex -60 KPX Udieresis Adieresis -60 KPX Udieresis Agrave -60 KPX Udieresis Amacron -60 KPX Udieresis Aogonek -60 KPX Udieresis Aring -60 KPX Udieresis Atilde -60 KPX Udieresis comma -50 KPX Udieresis period -50 KPX Ugrave A -60 KPX Ugrave Aacute -60 KPX Ugrave Abreve -60 KPX Ugrave Acircumflex -60 KPX Ugrave Adieresis -60 KPX Ugrave Agrave -60 KPX Ugrave Amacron -60 KPX Ugrave Aogonek -60 KPX Ugrave Aring -60 KPX Ugrave Atilde -60 KPX Ugrave comma -50 KPX Ugrave period -50 KPX Uhungarumlaut A -60 KPX Uhungarumlaut Aacute -60 KPX Uhungarumlaut Abreve -60 KPX Uhungarumlaut Acircumflex -60 KPX Uhungarumlaut Adieresis -60 KPX Uhungarumlaut Agrave -60 KPX Uhungarumlaut Amacron -60 KPX Uhungarumlaut Aogonek -60 KPX Uhungarumlaut Aring -60 KPX Uhungarumlaut Atilde -60 KPX Uhungarumlaut comma -50 KPX Uhungarumlaut period -50 KPX Umacron A -60 KPX Umacron Aacute -60 KPX Umacron Abreve -60 KPX Umacron Acircumflex -60 KPX Umacron Adieresis -60 KPX Umacron Agrave -60 KPX Umacron Amacron -60 KPX Umacron Aogonek -60 KPX Umacron Aring -60 KPX Umacron Atilde -60 KPX Umacron comma -50 KPX Umacron period -50 KPX Uogonek A -60 KPX Uogonek Aacute -60 KPX Uogonek Abreve -60 KPX Uogonek Acircumflex -60 KPX Uogonek Adieresis -60 KPX Uogonek Agrave -60 KPX Uogonek Amacron -60 KPX Uogonek Aogonek -60 KPX Uogonek Aring -60 KPX Uogonek Atilde -60 KPX Uogonek comma -50 KPX Uogonek period -50 KPX Uring A -60 KPX Uring Aacute -60 KPX Uring Abreve -60 KPX Uring Acircumflex -60 KPX Uring Adieresis -60 KPX Uring Agrave -60 KPX Uring Amacron -60 KPX Uring Aogonek -60 KPX Uring Aring -60 KPX Uring Atilde -60 KPX Uring comma -50 KPX Uring period -50 KPX V A -135 KPX V Aacute -135 KPX V Abreve -135 KPX V Acircumflex -135 KPX V Adieresis -135 KPX V Agrave -135 KPX V Amacron -135 KPX V Aogonek -135 KPX V Aring -135 KPX V Atilde -135 KPX V G -30 KPX V Gbreve -30 KPX V Gcommaaccent -30 KPX V O -45 KPX V Oacute -45 KPX V Ocircumflex -45 KPX V Odieresis -45 KPX V Ograve -45 KPX V Ohungarumlaut -45 KPX V Omacron -45 KPX V Oslash -45 KPX V Otilde -45 KPX V a -92 KPX V aacute -92 KPX V abreve -92 KPX V acircumflex -92 KPX V adieresis -92 KPX V agrave -92 KPX V amacron -92 KPX V aogonek -92 KPX V aring -92 KPX V atilde -92 KPX V colon -92 KPX V comma -129 KPX V e -100 KPX V eacute -100 KPX V ecaron -100 KPX V ecircumflex -100 KPX V edieresis -100 KPX V edotaccent -100 KPX V egrave -100 KPX V emacron -100 KPX V eogonek -100 KPX V hyphen -74 KPX V i -37 KPX V iacute -37 KPX V icircumflex -37 KPX V idieresis -37 KPX V igrave -37 KPX V imacron -37 KPX V iogonek -37 KPX V o -100 KPX V oacute -100 KPX V ocircumflex -100 KPX V odieresis -100 KPX V ograve -100 KPX V ohungarumlaut -100 KPX V omacron -100 KPX V oslash -100 KPX V otilde -100 KPX V period -145 KPX V semicolon -92 KPX V u -92 KPX V uacute -92 KPX V ucircumflex -92 KPX V udieresis -92 KPX V ugrave -92 KPX V uhungarumlaut -92 KPX V umacron -92 KPX V uogonek -92 KPX V uring -92 KPX W A -120 KPX W Aacute -120 KPX W Abreve -120 KPX W Acircumflex -120 KPX W Adieresis -120 KPX W Agrave -120 KPX W Amacron -120 KPX W Aogonek -120 KPX W Aring -120 KPX W Atilde -120 KPX W O -10 KPX W Oacute -10 KPX W Ocircumflex -10 KPX W Odieresis -10 KPX W Ograve -10 KPX W Ohungarumlaut -10 KPX W Omacron -10 KPX W Oslash -10 KPX W Otilde -10 KPX W a -65 KPX W aacute -65 KPX W abreve -65 KPX W acircumflex -65 KPX W adieresis -65 KPX W agrave -65 KPX W amacron -65 KPX W aogonek -65 KPX W aring -65 KPX W atilde -65 KPX W colon -55 KPX W comma -92 KPX W e -65 KPX W eacute -65 KPX W ecaron -65 KPX W ecircumflex -65 KPX W edieresis -65 KPX W edotaccent -65 KPX W egrave -65 KPX W emacron -65 KPX W eogonek -65 KPX W hyphen -37 KPX W i -18 KPX W iacute -18 KPX W iogonek -18 KPX W o -75 KPX W oacute -75 KPX W ocircumflex -75 KPX W odieresis -75 KPX W ograve -75 KPX W ohungarumlaut -75 KPX W omacron -75 KPX W oslash -75 KPX W otilde -75 KPX W period -92 KPX W semicolon -55 KPX W u -50 KPX W uacute -50 KPX W ucircumflex -50 KPX W udieresis -50 KPX W ugrave -50 KPX W uhungarumlaut -50 KPX W umacron -50 KPX W uogonek -50 KPX W uring -50 KPX W y -60 KPX W yacute -60 KPX W ydieresis -60 KPX Y A -110 KPX Y Aacute -110 KPX Y Abreve -110 KPX Y Acircumflex -110 KPX Y Adieresis -110 KPX Y Agrave -110 KPX Y Amacron -110 KPX Y Aogonek -110 KPX Y Aring -110 KPX Y Atilde -110 KPX Y O -35 KPX Y Oacute -35 KPX Y Ocircumflex -35 KPX Y Odieresis -35 KPX Y Ograve -35 KPX Y Ohungarumlaut -35 KPX Y Omacron -35 KPX Y Oslash -35 KPX Y Otilde -35 KPX Y a -85 KPX Y aacute -85 KPX Y abreve -85 KPX Y acircumflex -85 KPX Y adieresis -85 KPX Y agrave -85 KPX Y amacron -85 KPX Y aogonek -85 KPX Y aring -85 KPX Y atilde -85 KPX Y colon -92 KPX Y comma -92 KPX Y e -111 KPX Y eacute -111 KPX Y ecaron -111 KPX Y ecircumflex -111 KPX Y edieresis -71 KPX Y edotaccent -111 KPX Y egrave -71 KPX Y emacron -71 KPX Y eogonek -111 KPX Y hyphen -92 KPX Y i -37 KPX Y iacute -37 KPX Y iogonek -37 KPX Y o -111 KPX Y oacute -111 KPX Y ocircumflex -111 KPX Y odieresis -111 KPX Y ograve -111 KPX Y ohungarumlaut -111 KPX Y omacron -111 KPX Y oslash -111 KPX Y otilde -111 KPX Y period -92 KPX Y semicolon -92 KPX Y u -92 KPX Y uacute -92 KPX Y ucircumflex -92 KPX Y udieresis -92 KPX Y ugrave -92 KPX Y uhungarumlaut -92 KPX Y umacron -92 KPX Y uogonek -92 KPX Y uring -92 KPX Yacute A -110 KPX Yacute Aacute -110 KPX Yacute Abreve -110 KPX Yacute Acircumflex -110 KPX Yacute Adieresis -110 KPX Yacute Agrave -110 KPX Yacute Amacron -110 KPX Yacute Aogonek -110 KPX Yacute Aring -110 KPX Yacute Atilde -110 KPX Yacute O -35 KPX Yacute Oacute -35 KPX Yacute Ocircumflex -35 KPX Yacute Odieresis -35 KPX Yacute Ograve -35 KPX Yacute Ohungarumlaut -35 KPX Yacute Omacron -35 KPX Yacute Oslash -35 KPX Yacute Otilde -35 KPX Yacute a -85 KPX Yacute aacute -85 KPX Yacute abreve -85 KPX Yacute acircumflex -85 KPX Yacute adieresis -85 KPX Yacute agrave -85 KPX Yacute amacron -85 KPX Yacute aogonek -85 KPX Yacute aring -85 KPX Yacute atilde -85 KPX Yacute colon -92 KPX Yacute comma -92 KPX Yacute e -111 KPX Yacute eacute -111 KPX Yacute ecaron -111 KPX Yacute ecircumflex -111 KPX Yacute edieresis -71 KPX Yacute edotaccent -111 KPX Yacute egrave -71 KPX Yacute emacron -71 KPX Yacute eogonek -111 KPX Yacute hyphen -92 KPX Yacute i -37 KPX Yacute iacute -37 KPX Yacute iogonek -37 KPX Yacute o -111 KPX Yacute oacute -111 KPX Yacute ocircumflex -111 KPX Yacute odieresis -111 KPX Yacute ograve -111 KPX Yacute ohungarumlaut -111 KPX Yacute omacron -111 KPX Yacute oslash -111 KPX Yacute otilde -111 KPX Yacute period -92 KPX Yacute semicolon -92 KPX Yacute u -92 KPX Yacute uacute -92 KPX Yacute ucircumflex -92 KPX Yacute udieresis -92 KPX Yacute ugrave -92 KPX Yacute uhungarumlaut -92 KPX Yacute umacron -92 KPX Yacute uogonek -92 KPX Yacute uring -92 KPX Ydieresis A -110 KPX Ydieresis Aacute -110 KPX Ydieresis Abreve -110 KPX Ydieresis Acircumflex -110 KPX Ydieresis Adieresis -110 KPX Ydieresis Agrave -110 KPX Ydieresis Amacron -110 KPX Ydieresis Aogonek -110 KPX Ydieresis Aring -110 KPX Ydieresis Atilde -110 KPX Ydieresis O -35 KPX Ydieresis Oacute -35 KPX Ydieresis Ocircumflex -35 KPX Ydieresis Odieresis -35 KPX Ydieresis Ograve -35 KPX Ydieresis Ohungarumlaut -35 KPX Ydieresis Omacron -35 KPX Ydieresis Oslash -35 KPX Ydieresis Otilde -35 KPX Ydieresis a -85 KPX Ydieresis aacute -85 KPX Ydieresis abreve -85 KPX Ydieresis acircumflex -85 KPX Ydieresis adieresis -85 KPX Ydieresis agrave -85 KPX Ydieresis amacron -85 KPX Ydieresis aogonek -85 KPX Ydieresis aring -85 KPX Ydieresis atilde -85 KPX Ydieresis colon -92 KPX Ydieresis comma -92 KPX Ydieresis e -111 KPX Ydieresis eacute -111 KPX Ydieresis ecaron -111 KPX Ydieresis ecircumflex -111 KPX Ydieresis edieresis -71 KPX Ydieresis edotaccent -111 KPX Ydieresis egrave -71 KPX Ydieresis emacron -71 KPX Ydieresis eogonek -111 KPX Ydieresis hyphen -92 KPX Ydieresis i -37 KPX Ydieresis iacute -37 KPX Ydieresis iogonek -37 KPX Ydieresis o -111 KPX Ydieresis oacute -111 KPX Ydieresis ocircumflex -111 KPX Ydieresis odieresis -111 KPX Ydieresis ograve -111 KPX Ydieresis ohungarumlaut -111 KPX Ydieresis omacron -111 KPX Ydieresis oslash -111 KPX Ydieresis otilde -111 KPX Ydieresis period -92 KPX Ydieresis semicolon -92 KPX Ydieresis u -92 KPX Ydieresis uacute -92 KPX Ydieresis ucircumflex -92 KPX Ydieresis udieresis -92 KPX Ydieresis ugrave -92 KPX Ydieresis uhungarumlaut -92 KPX Ydieresis umacron -92 KPX Ydieresis uogonek -92 KPX Ydieresis uring -92 KPX a v -25 KPX aacute v -25 KPX abreve v -25 KPX acircumflex v -25 KPX adieresis v -25 KPX agrave v -25 KPX amacron v -25 KPX aogonek v -25 KPX aring v -25 KPX atilde v -25 KPX b b -10 KPX b period -40 KPX b u -20 KPX b uacute -20 KPX b ucircumflex -20 KPX b udieresis -20 KPX b ugrave -20 KPX b uhungarumlaut -20 KPX b umacron -20 KPX b uogonek -20 KPX b uring -20 KPX b v -15 KPX comma quotedblright -45 KPX comma quoteright -55 KPX d w -15 KPX dcroat w -15 KPX e v -15 KPX eacute v -15 KPX ecaron v -15 KPX ecircumflex v -15 KPX edieresis v -15 KPX edotaccent v -15 KPX egrave v -15 KPX emacron v -15 KPX eogonek v -15 KPX f comma -15 KPX f dotlessi -35 KPX f i -25 KPX f o -25 KPX f oacute -25 KPX f ocircumflex -25 KPX f odieresis -25 KPX f ograve -25 KPX f ohungarumlaut -25 KPX f omacron -25 KPX f oslash -25 KPX f otilde -25 KPX f period -15 KPX f quotedblright 50 KPX f quoteright 55 KPX g period -15 KPX gbreve period -15 KPX gcommaaccent period -15 KPX h y -15 KPX h yacute -15 KPX h ydieresis -15 KPX i v -10 KPX iacute v -10 KPX icircumflex v -10 KPX idieresis v -10 KPX igrave v -10 KPX imacron v -10 KPX iogonek v -10 KPX k e -10 KPX k eacute -10 KPX k ecaron -10 KPX k ecircumflex -10 KPX k edieresis -10 KPX k edotaccent -10 KPX k egrave -10 KPX k emacron -10 KPX k eogonek -10 KPX k o -15 KPX k oacute -15 KPX k ocircumflex -15 KPX k odieresis -15 KPX k ograve -15 KPX k ohungarumlaut -15 KPX k omacron -15 KPX k oslash -15 KPX k otilde -15 KPX k y -15 KPX k yacute -15 KPX k ydieresis -15 KPX kcommaaccent e -10 KPX kcommaaccent eacute -10 KPX kcommaaccent ecaron -10 KPX kcommaaccent ecircumflex -10 KPX kcommaaccent edieresis -10 KPX kcommaaccent edotaccent -10 KPX kcommaaccent egrave -10 KPX kcommaaccent emacron -10 KPX kcommaaccent eogonek -10 KPX kcommaaccent o -15 KPX kcommaaccent oacute -15 KPX kcommaaccent ocircumflex -15 KPX kcommaaccent odieresis -15 KPX kcommaaccent ograve -15 KPX kcommaaccent ohungarumlaut -15 KPX kcommaaccent omacron -15 KPX kcommaaccent oslash -15 KPX kcommaaccent otilde -15 KPX kcommaaccent y -15 KPX kcommaaccent yacute -15 KPX kcommaaccent ydieresis -15 KPX n v -40 KPX nacute v -40 KPX ncaron v -40 KPX ncommaaccent v -40 KPX ntilde v -40 KPX o v -10 KPX o w -10 KPX oacute v -10 KPX oacute w -10 KPX ocircumflex v -10 KPX ocircumflex w -10 KPX odieresis v -10 KPX odieresis w -10 KPX ograve v -10 KPX ograve w -10 KPX ohungarumlaut v -10 KPX ohungarumlaut w -10 KPX omacron v -10 KPX omacron w -10 KPX oslash v -10 KPX oslash w -10 KPX otilde v -10 KPX otilde w -10 KPX period quotedblright -55 KPX period quoteright -55 KPX quotedblleft A -10 KPX quotedblleft Aacute -10 KPX quotedblleft Abreve -10 KPX quotedblleft Acircumflex -10 KPX quotedblleft Adieresis -10 KPX quotedblleft Agrave -10 KPX quotedblleft Amacron -10 KPX quotedblleft Aogonek -10 KPX quotedblleft Aring -10 KPX quotedblleft Atilde -10 KPX quoteleft A -10 KPX quoteleft Aacute -10 KPX quoteleft Abreve -10 KPX quoteleft Acircumflex -10 KPX quoteleft Adieresis -10 KPX quoteleft Agrave -10 KPX quoteleft Amacron -10 KPX quoteleft Aogonek -10 KPX quoteleft Aring -10 KPX quoteleft Atilde -10 KPX quoteleft quoteleft -63 KPX quoteright d -20 KPX quoteright dcroat -20 KPX quoteright quoteright -63 KPX quoteright r -20 KPX quoteright racute -20 KPX quoteright rcaron -20 KPX quoteright rcommaaccent -20 KPX quoteright s -37 KPX quoteright sacute -37 KPX quoteright scaron -37 KPX quoteright scedilla -37 KPX quoteright scommaaccent -37 KPX quoteright space -74 KPX quoteright v -20 KPX r c -18 KPX r cacute -18 KPX r ccaron -18 KPX r ccedilla -18 KPX r comma -92 KPX r e -18 KPX r eacute -18 KPX r ecaron -18 KPX r ecircumflex -18 KPX r edieresis -18 KPX r edotaccent -18 KPX r egrave -18 KPX r emacron -18 KPX r eogonek -18 KPX r g -10 KPX r gbreve -10 KPX r gcommaaccent -10 KPX r hyphen -37 KPX r n -15 KPX r nacute -15 KPX r ncaron -15 KPX r ncommaaccent -15 KPX r ntilde -15 KPX r o -18 KPX r oacute -18 KPX r ocircumflex -18 KPX r odieresis -18 KPX r ograve -18 KPX r ohungarumlaut -18 KPX r omacron -18 KPX r oslash -18 KPX r otilde -18 KPX r p -10 KPX r period -100 KPX r q -18 KPX r v -10 KPX racute c -18 KPX racute cacute -18 KPX racute ccaron -18 KPX racute ccedilla -18 KPX racute comma -92 KPX racute e -18 KPX racute eacute -18 KPX racute ecaron -18 KPX racute ecircumflex -18 KPX racute edieresis -18 KPX racute edotaccent -18 KPX racute egrave -18 KPX racute emacron -18 KPX racute eogonek -18 KPX racute g -10 KPX racute gbreve -10 KPX racute gcommaaccent -10 KPX racute hyphen -37 KPX racute n -15 KPX racute nacute -15 KPX racute ncaron -15 KPX racute ncommaaccent -15 KPX racute ntilde -15 KPX racute o -18 KPX racute oacute -18 KPX racute ocircumflex -18 KPX racute odieresis -18 KPX racute ograve -18 KPX racute ohungarumlaut -18 KPX racute omacron -18 KPX racute oslash -18 KPX racute otilde -18 KPX racute p -10 KPX racute period -100 KPX racute q -18 KPX racute v -10 KPX rcaron c -18 KPX rcaron cacute -18 KPX rcaron ccaron -18 KPX rcaron ccedilla -18 KPX rcaron comma -92 KPX rcaron e -18 KPX rcaron eacute -18 KPX rcaron ecaron -18 KPX rcaron ecircumflex -18 KPX rcaron edieresis -18 KPX rcaron edotaccent -18 KPX rcaron egrave -18 KPX rcaron emacron -18 KPX rcaron eogonek -18 KPX rcaron g -10 KPX rcaron gbreve -10 KPX rcaron gcommaaccent -10 KPX rcaron hyphen -37 KPX rcaron n -15 KPX rcaron nacute -15 KPX rcaron ncaron -15 KPX rcaron ncommaaccent -15 KPX rcaron ntilde -15 KPX rcaron o -18 KPX rcaron oacute -18 KPX rcaron ocircumflex -18 KPX rcaron odieresis -18 KPX rcaron ograve -18 KPX rcaron ohungarumlaut -18 KPX rcaron omacron -18 KPX rcaron oslash -18 KPX rcaron otilde -18 KPX rcaron p -10 KPX rcaron period -100 KPX rcaron q -18 KPX rcaron v -10 KPX rcommaaccent c -18 KPX rcommaaccent cacute -18 KPX rcommaaccent ccaron -18 KPX rcommaaccent ccedilla -18 KPX rcommaaccent comma -92 KPX rcommaaccent e -18 KPX rcommaaccent eacute -18 KPX rcommaaccent ecaron -18 KPX rcommaaccent ecircumflex -18 KPX rcommaaccent edieresis -18 KPX rcommaaccent edotaccent -18 KPX rcommaaccent egrave -18 KPX rcommaaccent emacron -18 KPX rcommaaccent eogonek -18 KPX rcommaaccent g -10 KPX rcommaaccent gbreve -10 KPX rcommaaccent gcommaaccent -10 KPX rcommaaccent hyphen -37 KPX rcommaaccent n -15 KPX rcommaaccent nacute -15 KPX rcommaaccent ncaron -15 KPX rcommaaccent ncommaaccent -15 KPX rcommaaccent ntilde -15 KPX rcommaaccent o -18 KPX rcommaaccent oacute -18 KPX rcommaaccent ocircumflex -18 KPX rcommaaccent odieresis -18 KPX rcommaaccent ograve -18 KPX rcommaaccent ohungarumlaut -18 KPX rcommaaccent omacron -18 KPX rcommaaccent oslash -18 KPX rcommaaccent otilde -18 KPX rcommaaccent p -10 KPX rcommaaccent period -100 KPX rcommaaccent q -18 KPX rcommaaccent v -10 KPX space A -55 KPX space Aacute -55 KPX space Abreve -55 KPX space Acircumflex -55 KPX space Adieresis -55 KPX space Agrave -55 KPX space Amacron -55 KPX space Aogonek -55 KPX space Aring -55 KPX space Atilde -55 KPX space T -30 KPX space Tcaron -30 KPX space Tcommaaccent -30 KPX space V -45 KPX space W -30 KPX space Y -55 KPX space Yacute -55 KPX space Ydieresis -55 KPX v a -10 KPX v aacute -10 KPX v abreve -10 KPX v acircumflex -10 KPX v adieresis -10 KPX v agrave -10 KPX v amacron -10 KPX v aogonek -10 KPX v aring -10 KPX v atilde -10 KPX v comma -55 KPX v e -10 KPX v eacute -10 KPX v ecaron -10 KPX v ecircumflex -10 KPX v edieresis -10 KPX v edotaccent -10 KPX v egrave -10 KPX v emacron -10 KPX v eogonek -10 KPX v o -10 KPX v oacute -10 KPX v ocircumflex -10 KPX v odieresis -10 KPX v ograve -10 KPX v ohungarumlaut -10 KPX v omacron -10 KPX v oslash -10 KPX v otilde -10 KPX v period -70 KPX w comma -55 KPX w o -10 KPX w oacute -10 KPX w ocircumflex -10 KPX w odieresis -10 KPX w ograve -10 KPX w ohungarumlaut -10 KPX w omacron -10 KPX w oslash -10 KPX w otilde -10 KPX w period -70 KPX y comma -55 KPX y e -10 KPX y eacute -10 KPX y ecaron -10 KPX y ecircumflex -10 KPX y edieresis -10 KPX y edotaccent -10 KPX y egrave -10 KPX y emacron -10 KPX y eogonek -10 KPX y o -25 KPX y oacute -25 KPX y ocircumflex -25 KPX y odieresis -25 KPX y ograve -25 KPX y ohungarumlaut -25 KPX y omacron -25 KPX y oslash -25 KPX y otilde -25 KPX y period -70 KPX yacute comma -55 KPX yacute e -10 KPX yacute eacute -10 KPX yacute ecaron -10 KPX yacute ecircumflex -10 KPX yacute edieresis -10 KPX yacute edotaccent -10 KPX yacute egrave -10 KPX yacute emacron -10 KPX yacute eogonek -10 KPX yacute o -25 KPX yacute oacute -25 KPX yacute ocircumflex -25 KPX yacute odieresis -25 KPX yacute ograve -25 KPX yacute ohungarumlaut -25 KPX yacute omacron -25 KPX yacute oslash -25 KPX yacute otilde -25 KPX yacute period -70 KPX ydieresis comma -55 KPX ydieresis e -10 KPX ydieresis eacute -10 KPX ydieresis ecaron -10 KPX ydieresis ecircumflex -10 KPX ydieresis edieresis -10 KPX ydieresis edotaccent -10 KPX ydieresis egrave -10 KPX ydieresis emacron -10 KPX ydieresis eogonek -10 KPX ydieresis o -25 KPX ydieresis oacute -25 KPX ydieresis ocircumflex -25 KPX ydieresis odieresis -25 KPX ydieresis ograve -25 KPX ydieresis ohungarumlaut -25 KPX ydieresis omacron -25 KPX ydieresis oslash -25 KPX ydieresis otilde -25 KPX ydieresis period -70 EndKernPairs EndKernData EndFontMetrics ruby-prawn-1.0.0~rc2.orig/data/images/0000755000000000000000000000000012161041170016227 5ustar rootrootruby-prawn-1.0.0~rc2.orig/data/images/pigs.jpg0000644000000000000000000002275212161041170017703 0ustar rootrootJFIFHHC  !"$"$C\"F !1"2AQa#$Rq%37Bbcv&TUru#!1"AQ ? ]mOع7o ]=J6I#c\UEO~y?^v1[O>ycl~I,>pihovq~Lιв@u^qX{͚=DԮsjFTF??԰ʭ̼iƍ=O|;`.J1/]Gѿf8q]`[j.V12=F:(5w<5Zn,Mf1>+<ǯ<ƦW6\^= AnL6j"ys|""*{xd4ԝkH{"Qb*"*"udӥ`aMkVNOMS];ddu*Đri +nB"ܪIK"5juX]iTU&mk^ISS/Toy iUU" 0oFVRUbd,]*+Pj*crS xr69ܰ|j{5Z)vVII*"ʬ˭.ݜe *K\+{%d+#i{ZlmsUU_$Aa۝J9i(*h7Tڣ=xQ<6Cyp Y.QXR]4i6@9EjOMUQ4C%7 J韦'O?7-]-ngxmuS [_~<+ڊ؋cS1_oNYm*w%3#[v N4IR_/+^ND_ϏO<&Gj+:SGp㴡|fW="Ek_~*u%5}.IY 'L7OQt)Kxn}KCfO#GK"齺mz_ 8eR^Jhub미dQ=c숭E_v9O z[ߪoK5NV?BrUn5ACwHZ5gmi7[$ԶyQq3,y =:&USF{"*,-WE:͘jys h.%mR׶W(OWD-+گZiJtHXTVB1.V2Vk%}jZ1Y)ڨr֧ɳ3NYq[:[\eY?R5Z;*m|&3g OE>Qq,rba9X`}RkQhg6[ea\dbvmDwwYb Qukr:WVS$2*+ѽUt쩨KW%Xl5$cofTT[%5,U5]姒*"ydk aPaETyV"C"&ZMy59uVM9AEy;If)5; ӎ Y#?}DOG(-at&l5ٺ[ߍJJff9j2WiG2A+s[o)$,*XK_GxcMR"z*:5G#56o$]"Teۅ< k/)䑨9=+΋!foWoV;S6 ZwXk^]xy%Ư$S0_.MSQؽ;};=cXFW7k7J[yCAzu=yzVHjFm~&-|m˒i1*P-+EG5jW8 *؅ޭ*-P= U/r*>,UcQX%erGӗ]hk#|sld6ۮzUDy G:9QkѨEM;FCfb];G[Ή#""1ڢ[] 61PXm$}VUisUr& s\ނY5MIsY'2UQ21~*#S_&g\f=`h1FtUUUdF]vqzع͋_jCk]*QbkjW.6wlzyUC Ww[㬎GDĎ9cXF"5WEm6C)9=)Κ_Ecdh.JfrQ6oV&dEEȩy6f -bwnJ[mbNjZH.7I&v>+تEgej$sԒ,{]\Wj>oe5\i#Z 2R7M^ݵ#\-TD'oƳzQeImǪ+`Jchntl5/ۛi9e 7۽F5F[QmҧU:˝WU'FY 4ʋ'箓J`QqBP_9k)_OUnm U=UQ6ꪻ@* movs*F0o}T?y~O_ĎOK#B)}DDtܨDE_@|I5F9wRdK[YRU{iIY##tj5Wmj(檱Iok疙av+η9Ӌ@[vwGVjOJv#XOz_1?81˟bJȤe;JFNʞQ[[FKQ]zڕxfKVu% j[ޫfk#D&o[0òyJK15Zٮu G'zDwZ9Lg"y7.)8M-OQXOނDucv+ښּa9NjQ$GSl +^PFZMyFgƶ<;',Mjj)ZG9=Ƚ6_]&`C&KpC@]]W5tޔQRdq<~g"8n9=6Kw'"1R.i=rNGxj  z69*(#W5""9wy.Rֻ׎>T~Kzenի۷e~4I*x: &KK(Jʊf%BT"Yr*iWS5v<ڊ3.j٨[N_ kF:'/;o%AXxΑ/wxxQjS̓H6v&urk\w;-=:%UtF=*WZ;<"#Z2 \!m3j#tR$K^_TV xK.yΧ(;!cOU=88|"Fmh ZBƫ|%k Wc3Z5r:&1滳UiQw\/ﶫ^CU9jfDJJZxQݗ-s^yWDM'hg=%.J?u{ױ?/}S^>M5xWUKpəu/jRNn;EkWK])ϟ8w锉Ɯ*Az%r)ڈy<)cT**|<2ݮ^jk$\zK$kU|?z \Ke )h1j1sȥyROoPŷ4w3YȈѲ̩xMoKEL:TreWtDEj7ּ<70F=W\,yaEҾ5IP5LqXrR(s_pj=dm:]OO yCyc4y:yY;=A]RֵV'5G;ǕƹC'ɐEXj'WjZ‹sDj}WNםkɣ;5*3ﵻrm#i,#kTlmscXU]Z_8Uk|NL*jͥ53ay^+yuCtʻe{ub*X=48}(ە.KI%{Zֽ-d t(һwi*/*r>|nY !6-CNڤxSSD̃+nV{*jZ5Q*2vB1R"/9Ihul:+ĒSR-L kFi"O/lmby?/ c 1IiQ^}Ƿjw-wbJoݧ>,%&)(VHO;G=/ʎםkPrJ:~nrUTt#[#z]"_!yc2[v;.OMU]7nJF2dsQ R‹G/dOJzB[7zF"w=6oexsi\G uzTQ% 6[Q#QRIP-k+"}WG:,r:*w?][,Վ%]>O\$},km^/2$]Dcrm+ӯ>Qj+Y~cfzGWzʶe{侥Dt.Qk7uYZո|: cUHݒ8hkۿUn>Xd,Y+tt+Vv9ۦoҩi|\c2+M^LA]鱌z2]ԍ+)əGW]Lm[HaW%<>9i\lזdsI%UWY UC'vdN}P-|0{rZU3Z=db,N܋_3K:㗭ݬoUP6 tiު-vTٯNaeș`nSW_nI'wߍv|.J~sʈSqvvDUG977R>Xk&mMUUYl)629X+9Pˏ"A}vh]̝>{;~4EET縝-V5֛?$,kzz5.wE_6\y[o\tȿtviqĹ.TᐹσtOcie;ߨܖkRȦw^#,GvE*"6TJLkF#%L*;kh%]"*NޓU]ꖚx:!(UUXWkYG7[Ӯ_ j 5Tyow+!T $$-үw+;=tѾDU?T#\Yqx}L{Gtڒ`ruby-prawn-1.0.0~rc2.orig/data/images/fractal.jpg0000644000000000000000000003772612161041170020364 0ustar rootrootJFIFHHAdobedC  !"$"$CMYK D !"1A#2Q3a$4BCRq7 UVv68uCMYK?}>eK#ξ>foO6) o?3;)#@|8:ai0;70@rνvqM}yS&C29/Fiwg?:߶kkuQ<&rPWִ*NŔY?lWճ\lfr2 u̹ͨ.!ȋI/[8Zh\ӫ8ls#č9P < iC"3[.:q_m5[TuZm|;kJT{~4>йVqXGYʼnr&py҇DfV\t|SqgAT(:Zg$j-B5fD?˪Y-~GC5Cp3"B\t~phǬKg f(>/տI3e-*XjAShVA'|zp]aj҉Os [FO)d3mftxW$?hY D6&$$9C:-l'MrI(C0-Z[h)"&J\QHu&{2Gr-iomXܙ)qFJZVl#DdgԙL b+rd)i[D'Rg/ D +g+<_dUGvk>#$ 9VN}}><В6rEZ8kXok%=CL kȩ%90;^?ϵC%=CL kȩ%90;^?ϵC%=CL kȩ%90;^?ϵ@0f1b±+|qd$4K9jeIk”E F7S{,^\XV%o"Lf)g-L>}txR_zeˋ ĭI_Ӆ,婕'ONѯ QZ_qn c6HJv/)nhiFs=hώs+v˞m#AZ4^R6ѢҍHzџWajSaǗ=/F!*iؼmE>;뤗rF8,.3RM2tF(D Q3Y%ܲ;s.K)$Kmu̷*ѲJ%/T|EIq7,cqc9)]s-JlDK35l4zLL'v˪m#HMhFJQEQƏUɗiٹuMz) B;hJ5(j33=Sy20\#Q7.E!6(Gy-Q)FFfg?iuE']J9!jY*1fٟz3ּ~~[mg>NrBԲTc"6ͳ?gx<|u+䅩dDmf-Z3/ZMr*[:ً! e-R;3kV21f_H:˷T1uϳBQ8[kI>wg֭dc̾k@u6+˗oXlcPf,+֣q֒}H(ω[sGFWf6(VCdK;H\4S%(Sey' ϖwa_uآY L.g|"rBiLM(3>[m݅}cbnUd10JZߚԹ CM2R6_xoA(E~ 5c1m$ ;k).hr"Ch7yEԪ,egt٫i$ȘQYIsE{Ey.>Qc,;XdI&DŽK/s܈-o@=}[=&?K={|>~omG/}"ǹd߹?}gOoͿheoX;;/IYOoGR$U_G_jDhǿW9$u"KY|)<Tu^ƤF{1OoGR$U_G_jDhǿWl꼘^uE=8b좦DBKKeV9,D Q3YW. ]THsIcԠu*%*>fk"ݳb7Qzዲic ,z.Z8Q%Gd[ +9r#m7~%g?ZNDqwMǎ;]JVQz>?p6o4zIȎ7GkJ?G |>b1t-QkrD}E)KjARqf|y}X~Waj[ =dB)N[RҔ#3-2+ TZܿQ'bJpڐFA?_`x,seXSݒ]vMW}!._mMTJҒ"Y,xt޾51aNvIu5^dD}7RM+JHdeGgʋz8^;%dzgّuI4)"%[=P?w2}zG=7-]qkbܸ}C9oZk[̇6FMzs\wk2Tcő+M)8Qwuc%F?󯁖-gqkB[aHξZg$Iǭ= n_㾟#:ɯK彚nUdpGINiTMx\-Уppx$F?N6gsNHzŲk.9ofCf "4Rq?Ӛw@<9%9s*iCq0D[>jI't<9%9s*iCq0D[>jI't<9%9s*iCq0D[>jI't4jg HDu"/yrBӲߔ03KpXf{ؠ܄GYJIJI"$-;-Jc4jg HDu"/yrBӲߔQKۜb=7ݼ0V &vJ&x%bQKۜb=7ݼ0V &vJ&x%bQKۜb=7ݼ0V &vJ&x%`!zcWv6ܿQ'bJYIRqf|1+Vn_WT,٤)A3>_^]v/Az؄RilFA/}O6,\E|reO~+k$K=_}tކE+HQ̩u3mduiq:BG>¨s 5/Q9>FmN.'H_}?3}Hvp{ h.8qh_p(^ GxO~o{amհ.- K!¯l-øeš|T]”Ix3 :a*'Eu[[GvrM|Nk{3tTND1ڶ__cN3kuyJahg鄨cmn!ھƜf*M5:Ѯ? q]C_uy[k-Gm~ ]:'|5,&4[~p7Ӵ!oQ^>t$Ok YuM}liohBKƢ-5v|@ma2q3aE~?JYc%+qy$|~_4[b&GtQSOZR6E乧!E)0%*<;ʍ&zҔ\Ѳ/%? 4ت,yI)Q<&Thu56֔捑y.iHyG -Iu\nqeMpg$G"?;m7y2ԙQ%FTVzMr#ӽlyG -Iu\nqeMpg$G"?;;UagGg I"--ohR_gp"XY‡4Dm["Wl~Y\tvp-đ""m(r O+JRlz؎3Od\y r O+JRlz؎3Od\y r O+JRlz؎3Od\y b,E ,z3-6Ӎ>魮-#Kz?i_*>;;,y:x̶7`N4p.G|Ы2ی݃m8m4gW -P9 twi,H"d WȋBW -P9 twi,H"d WȋBW -P9 twi,H"d Wȋ@.m:WURpk[Bg,*7)9Doh򯛽[NjUT5ꐇleÙK A!&NrQ9Z'5Yu ۖ')sg%FmSĞQv+f[fC˿Q3UWPݹor6za"Tfu>Iv+=7TꚟQKkg.QWzY1jf]vOGes_ƭ_ORm-QɥE qH##Bu"3Q7z+պkM#64)dhNF~="1fWM|9=IDf&u3a pǵD_EuW2e1c6SQ.5ӧ֡^&hRF~"2% ]\49PƥMD׿NZIz<%HIRHYLȔ-tWUs/YC>ce5^:}jq%Xh!$iI!g2#"PlzEK"W$BP̔9e4/->yhC`-__A"̚d[-ϑi}qm)BޑmId3%zn&|+KiOFZEeS' MS2D&G|RdHY\*23#NKqVU2pڄU3-Ξ̈́I~kmd}aɥ)FDeȒ#24EeS' MS2D&G|RdHY\*23#NKaVElv+}:xĶ7`N4p.G| B/c]V!%q57žۄipG2=U}z1-6Ӎ>驾-#Kz?i_-i$q7/u3hzxL\toM &i%=Y\ܿJ͠=2r>e_478bۍfrLwr7Q*6\WH)!|f_рrKo*SH"ͳ{iQ-r2=oq .7:U-H E"%fҢ[gd{27T.]otteLZ"DK6DϻeX0/(f|x*%ǐHDf(ŊN_ <`Jo*ق/J\yIOJn~"X0/(f|x*%ǐHDf(TrVTlWGl?>*7eI'f~G)`eNa1ty;vɎmSңx_dvgTrVTlWGl?>*7eI'f~X=Z6PArd5!QKoڄj?i^|{2l@׬jCBF)G}ߵ y ~6Ҽ1b,jdB-˯Yԇ҅F.4RjYmy`5|urikם}u[*JVZ YY>:4nξ:^G +h?IS{,\Zu_GVŊR#4r|֤_~@EyY27NOHrC!i}zIM~1ȋz̏_WOc#tʷ$:v׭$̈qLEyY27NOHrC!i}zIM~1ȋz̏ktؔY<p"4ԨQ_#$kk1)m9y @5DiQ6G3#mD&FI3!K_cbR+rdk4!LRmFfFډ~Lf@&'Km؇2"˧LibQɵ7gǾ$8FI.rN&'Km؇2"˧LibQɵ7gǾ$8FI.rN&'Km؇2"˧LibQɵ7gǾ$8FI.rN xdMO))@\b|qdU4m4L#Qk>^3S Jh3;W)1DM8g+#BG0ϗD 'LwASN6sDЂ5Ƽϲ 9 =3 ?[yaƒzډY܅tg=~}@nQ홙ϛ4N$~(?i#tBl|q^6vi#!E$OG뼉QDzV[c3ضLWGx-Iթ/8(ݔ((Ĉȶ'yeFglL[̓R^q>Q(Q"QlO%GS˯Ymb1]☷'VD|vP.D#" XmO=eݔKk*[q&vC>"ZFq-n7%;.짥[YVN(ۉ7&բ5knt/qwe=-ʲqDI]5ϸEȖ\Ka`9P*YØWQ-BܖZ+xI?JxBlgcY^D^mgrYk+Gw%$)(M e9ezey!enNJ=ܔWL^tOJ|0[..;Jy 5%*2>+222WL^tOJ|0[..;Jy 5%*2>+222WL^tOJ|0[..;Jy 5%*2>+2221dݴju1.ẢJqJKLfFZ2J־J'bɻi2c\┖Ňqeĕ|N/Pœveǯ2%))-2k +Z ;K&>@L?[Uf0L?#YVs?͏Iu%Pp~c 4s0eg8 L?[Uf0L?#YVs?jϮk$5՜ŰۨSim(wG$I%Zs#= ug1l65[e "]IEx\鶱HC]}Y[ ;fBqWqrADQx?$}!ɘ1j̺v*d[;n6I5]j2K#~F'hC1bՙuc*bTv<v:q$mkdGN&c4ū2ǠUĩyl8uHY$w.$=<:ᜊW} Tor6ZaimF^ŒUAӌpE+D*Y}9-0Sn/b*B aNg""|C,Z[Q|d l]YTIiR-|.!rMIOeKC׵'iY~F[>g5U5iTy_ >;\RSR᥵IVi2ߑϥuMtf"qWO$ԔT8im{RvL84_VU &+-'Ma㓞\Z ̌([#-xt5~EYT6ԘQ5[NxB]qk$622%lcLiePRb}Dn99 uŬ˂2׀9pY$Yp;|fzG##x؜Vy,,RBq xKR[e>Hu=|ƼlN\+<I\!8<%-$ddn:ٞQ,%NEt DVhyL5ېڻn-DpVӿ$FBȮ_9NAWIQގIef]IMHWm;Dd,%NEt DVhyL5ېڻn-DpVӿ$F@+'N,r4;qYm yɨ8I3y9OkUƊJB8u,TkdE$IӼ*E%!r:[B^m*5j"NL~d<̱ʦini[.-&6SK2#2J&z?%eU7gsHhu O6qi5!PYVI3/O3,r;G#F[eZyˋI (̈̒I geSrWLdרJvdgsh-'o=7;*.Hg;%0BS#?{AhI?!dYTrE%\9-%')5 FjIFA.zʨ5%(&tFFdyi_"-8]V)QKDkrKQL茌^ȾDZp.S*3|筧}<+Y>1]7ĸ\-:)!>YL'!cWH|c"n-[pz[ uSC })QD$)iBO{/BԮdEtZWKp#TR6dI2R҄^ Tbnޙ\G10ln Ƕ?RdYzerE5HRo[sLJv)Afas !JZIo{i˿ 3`NWUj3&CaVQZI$|LdG`NWUj3&CaVQZI$|LdG`NWUj3&CaVQZI$|LdF1k> uѼl6ER֢.*KKҾ[ڒG0[]fϼmU--j"⤴+${1k> uѼl6ER֢.*KKҾ[ڒFt4k6{-/?h,y3k*f{FD}lZ_:2=~=|ѬXg)T?L:/촾8q>ړ=+eNCfd2-1ÏW Ԙ|[-v^vz'C}e-E-Pf S]K͙'{33"#4N?H:([JZmͧm92NffDFiQ~u ͔PB۶O&sNw /6d̈Ң fC}>#ȯ)+RD2ޒ]#"ђ~b}$G_!-3&RVde% FE%< TH"C0ZgLJ5zJtFJ4y@ہWVcI;OQx)]J|GM;"2/cNEɑ3xvn,4RvDd^Ɯ=ۯ";nq]Yf'H?iFXiw])4Ƚ8{=_&Dan3: L2٩r))]R $x4m&~|kgAql9F˅Stv6?v5[΂ j}JWTe )^ ;FI_,pYwhzJ8l%㴓?E \]:m&F, ~hjy{-$(lyΛf>߻Z2Z^~;I3YK\eMMbtHy#'֥ZI:34lȇRr\o-zlkFf 9>/ԴIԑfD:k+5kdX30^i}֥N'2 =k2gd-Z`XCLD:kysPI&{\Om!J3%#ގYӧfT Yl Yè~鈇Mo.j $ۯk)Fd{;tʃ!@k-b8u}1A$uq=(̖|z0_Z?!]lmH %hjyI3ׁȾ ~Ce1Ͳ)3:,J2њ6g}jXcevRf)2uY#4(e5[m$^u׳Nd3H-e,Ugo#n\I^HRgf=k1gd-ZˠXCLF5$n'ϑG^:zcA [ص@U:ᾘkysPI&{\Om!J3%#ތ(FM5Ll2gR#ꢥㄴG(T|#&fM6Zs3e)uQRqZuJ*>bS3&-LIJ:m-:iJ%y]3\xJh4+UK%=!ԕ-NNyё$]3\xJh4+UK%=!ԕ-NNyё$]3\xJh4+UK%=!ԕ-NNyё$OKXI[Uɰbɉԉm:JJ'=rة2k1Kz6Y1>ڑ6q-6⒣'IIY$G[>U-c&?ioUW&ы&'R&;RTd)+$ˆ`0ycnM]\qf&a \I!YdH"IrycnM]\qf&a \I!YdH"IrycnM]\qf&a \I!YdH"Ir~&* .zfLyjAř+mw $#I&IWғɰJB˞=d*`<ڐifJ}j.I(jIU#42l?P*&dG 6lYZpJ"4d{)0wSsL vVY1ڬv*"}ks.٬/*-F@c/X7ZTD/-EJ#k]Y#?_UM2ZYd_jn_ZFlf>F~>bmbkab핹ǫ(MIm\2/Om3[ l=YDu nrOlԒx|[mXenv#u3xFmf%(̋ d#$vɌ} 1-eۥfZ=ed#$vɌ} 1-eۥfZ=ed#$vɌ} 1-eۥfZ=eYnM]:FWatH^g۪Ru%q5$ّnXsevDUqP'\[RL~YnM]:FWatH^g۪Ru%q5$ّKeԻ 1yGB7!N:$Ȼ\PI3=,:2@p캗}Ay#3q"8/4\)T$k &g'FC[.ݗR2$fn8X ܅8D"qA$3$e%%a{6Y/YsA-DdӏiDL{RPb^e1L!YTFM8GdǾe%%a{6Y/YsA-DdӏiDL8nQќ̎5ZCѪq9,c#ؓI(Ej-\qܣ9[ kdUsLYeLG&Q(=eZGFr2;תk F昲ˊbM$P{Qɨ_Y=ie6ņRrq|vmD_Y=ie6ņRrq|vmD_Y=ie6ņRrq|vmD'`;EaVX%Tzr%ȤHRUI왧F4N:w-}\6SJK#H (3NiIt%ZmYb\9S%ȗG"!IWQ'fҒ#0xSpqJ֣[W2QFqfߧDgzFF$/YFvdͿO!'?BώΌI=M_* Zm^im&J"3"i,NWW {9HKuѵ<(̉;/B!B RF$FG#G)HZVT!iZiROddz2?ŭ6O="KuZڔ33}ŭ6O="KuZڔ33}ŭ6O="KuZڔ33}yLى]re(N:>ҜI))YD13f&uɗ 8_\rpJq$fQD$J?ǔ͘&\}q)Ē~ DJQ(S5Ƹruby-prawn-1.0.0~rc2.orig/data/images/stef.jpg0000644000000000000000000000454612161041170017703 0ustar rootrootJFIFHHPhotoshop 3.08BIMExifMM*1>2ZinACD Systems Digital Imaging2004:08:10 10:14:040220627X]C      C  ]X" )!"#2$1a ?+'.D䀐݉[NMHxb>ea&wA6ؑ{bg9$9j;-'Bm!sp|dܞߺQ.k_ev-pT\>N0>"xaQ=Tٺ=Hz]m5)j`ela 3 DP=e)^Bjj! '~wזa֧N*LZx)!qhrUMar#5V[.>I/zuJ**䆃U;vm5&ֺC\uu_'?9#xq~?alEVJ}읱eʙ#Y/8SI@Ey=wl+=g}R~IVysbQ#AEE kw{-}[jԘ;Bה'"q{Q0U9g*ة`cZKu")IqcXW|857h -^DyeF otJK Caө[1Y&4bR}CɺBٰvl[;|Cۭ+HʄXBT/-b8ؖ< EpGH%%E_g f۵;^U M)Im+R:~xI#D$Ah]B[calԔqnSK!r&B sT_ 16;twTѠK)kN#'}{hGepg-t=}O֭<?<ZЗU_\cc:w5utݡ#a(l [2%q=q[W8<~yove7L:$r I3w/SLr7C//=\_߯jM_J`҂4!؟V&0rbfEk*yqtE-.h*uߜY!N9.;@^xtAכ!ouꍖ42 u֔ 9p/">;;~P}CY:[beÏ ud8?-ccccccccccccccccccccruby-prawn-1.0.0~rc2.orig/data/images/prawn.png0000644000000000000000000003145112114176157020104 0ustar rootrootPNG  IHDR ʋ sRGBbKGD pHYs B(xtIME t IDATxyx]U?k;e7m:7Iǐ ,M VeЦ!-G*N(Ŷ UP@tIҴ;~$$ФTz<\NϹw}{M{ »[859 HҀ @ Q)Gt(;-SU)*<9-m43U Nx*/Rܸw4(5^5qe0m Y8QSv`J=s7h[|&G3NSYYEE9<˘9 Nu.W|1T0'RJ^j^ #n9#r1hOX䉈ωw=8 "V/4TF|H{<w=]6$c_9?[YGE8eB[ WDc@/EWc+яG3O7PmhSl4CU '*Zx$`^"z5Jf0݂'YgZM?47^>4cni1r魗-`f9gAf Vg|Z6lpŹ_(^ru" d(hb #,={$.lʅAWWy˻RY1uהTPw (oorS=< #2+~|Bi?LyGB)5榴7>7 >R;qv |'r >-*m[ ziڧjcLXZ@'%Ax]i%k* 䳎/`9~4aH6l,f.Fc+'gV=@vRJ/zvOhMA. ?6tcZ4 C &R\X~ 4Gƶf. ),,Ko5W3'fzUCEŷalR#s_j:w=hHUB+qb>dZ? ~] 80QW/¤+¾`u9" _w-hde7HϦy~Pа2kr`9ug56XXy 5 y׼Kay6]4 >YW7\x)߃Vc*ꈝtIQ{嵔[[7ہQX | Qcy<kd|N1ugzKV;JZ+ƸMBYV/ 4[5g=`4GܟVgPل6HT.0MDmcS~_)y]~;BE%7¡aeޯ+@9jNM)zrX@Ӫߡ @R[{\ǜmĜH?);5>@=bwaǗN%,Y4WFzhѻ)k!"tA+X!M+[,hF)(ы=(빩6ZX(F|ڧmg\1KYonN5k7~A>,𠃦`U:  S7r|D~WS UyQ/ oUW3w-! ,&39«qrb4u .}0'x铭1h~됟uV#O19c~ˎ;K'/pf $ Wx.TȺo?+{PO_8(f,c+@P`eh'xr,C\EפtܵboB3|cW|Ϥi 'Y]lC;?>K~#D>\SЀ~Ղ?%^zwgG O&t~xUtAښݻw񧺎j`lཋD:cۨئNS|&߷c; 8 +^C~77TԁMC%*P#œa[U ՟('e-m ~SQ.f2$'|InvwäI _d?fSآ&c~fݵDƐ7+m 0۷oG%??/=O4ۢ?Y~<)h,-w_{}HMʝ֭ʻMocK 4,^č瀱'\u}Y~NCȐgA-&I=\|t/? Y(F`].h ܘdD2K .e堿bN_efQDr߫@._77aC#y@~c=_y3q*o|yuwˇ>?Uv ƟIJŤL›3f"O{:bY~ʗܰo# 4 VG4;KHLfNwc$s>-{@'\]N7z aBEy& }OAp8yGBy,[ T~osrb[,-8M-mf8GԞ0Z߀QFhvPeK2\p3v=*9&nI&%{H!>L$ #t9o+TTTp '_L_rqId-s[䩧#’Zw5JP@rܙNQ$\@8${3 /IHJ+xǯ%pwY4L~Fd˿*҄mmU G=K߼gع erԙ]e|?T,ִF(ow`g0!!H $pI<^N0ެ\í?HtK4?xGoMT;"}}젱 {y-ihW-J{V.Vf]l6ۍ58;|?)&abgcKB|Nۦzܚx\ԩO[a9Mڠds=hV-Xro oAЬ1fy&Bcŧx )Cא5$ycp"LZ-&I bIU[wv>ծE30{iEŏ N8Ի^7T-˟s*lPk#$y GxTa<>Lj&u xbUh4|Mu-X-AD~\^4?%`-wpU®xM0!V+F/W0xx$KK<%&U}>+_p֔q8\yE<ѺhZb.QWIw; 1}K&)6H9bq؋m3*;;U PT򴢒ߴ:9 ;i@EpتMM*]9I ~miĶ4bRq''8Ʊ-=1_>?Sp't+#&LFu6ܬ_gmi$wn>gBa'W_27u\A>K848#dtd$V~1g|F+J$ ~UR lǕEӀ d_KK-3P`KllgƟJXyē ȇƋ= w2qƬJJ`f h4L|i[:r"#j-Eb`Hm#Vv?z$1'2ysMimz# D;#2n{%캧!lU[[Erj{/i=q҄$qBYN;hõg+=>k]@"#;v IӍN#/d )&yh */sQ-wg N4L|Yʤo5iv]p+ȶ=rԪs s_P0⇛pz4$^? 5nP$n)ߙ{.q+dhkXs̔߿dnj4ɽk''i/#UAv~1+&7Ԡ &岲ݰC5qw9j5|EKN@$:#4X0;È\\xQ*Flzh Df$3iz+W[׌ )؞O 2o)6X$u,۹(/dW:_H7{SaZ\tV ,{gF.rW:x)VTr߯F..ߩS֊~yNcu4Coo5mMBVZ JF+w!^4ܿC2^ La* ({|vn㗊e]>S$%s}A..Ot#E)q!5`o_<]M146IQ`:d25n{&fۻ3n0Tl e*:lŋ=Y\JGD[M ([s%?d /'&7;_4./ TV9vq>IJNiS;}gD܃=So.3o(27EQ;ƣJ&Fd؂}*W^rܑ5{˗k'o{R>_D.A@&U~w䑙k>eg$į^N=KsGnL})fڈKu V;T/|Xl}uY ru #i:IUo;f׊c<>%1#H+ YN)KA0OҌ٥kK"Ʈ@'Բ@hI}ԥ6RA5$N´Sr~o|4CJf˖`Z\=}o49v5*)q:A/sw#7'Fo^vXwŵ\(}_Um C\wA[dY~TxFYU"=*nT6PS[2/-&v X5H9$Ci+}8YT t2˗wȬhcKT _rN%zJo'|8YµX۵+'lG_$(˳ vHFkMB>$\ܩ&OuQsgm7)Yճ|RX>[~ѕ{1#nFP|%>ٵb)eI-ysB&&NщC\gtW1Kܪ_p1X5(miCifle{hṢS*ւ가&.^w[]n=!VTm뮉;o\tjѦvUwRF:ڱ+mE[,7_ FZ[;V0*/!0k#+(MOƝ6#L:9{0@;#qnm3Q4=O-#Ƽټt:.yzfޥǟzCֿZ&˓㫼6kWwZ}XDn~^pׇ$ )RZ_3GQ7̸?_jnTFMoY"#Ҭ_m~qs@|y\壙Yt/M^8d Ή7z`F^թqO0 ۊq-[Ma.[6bvr֬7̙%qv88d"Ӳ-r#!(@>[>e/h1"{[2:%$G5˄{OsVjV1CigtMـFT_{͢c~fDpgB!Ql,nYe9ASLݓpq8_WN6TPšAi6W._|?>U6]xaŴʛ=vxvd}fš|ZeSY~DI\{,0'7*#@ϡ}4驗BҎDBv]"⑤]=SU }aoeٲNۻ8cVjAv!#Kصli-;FGTj䕲{sUqhyR"zC'Tܕq48vi^&HQUR'-vq*p6Jѿ"z; ѿp?đPsϲ9_D oנ#cUk>Fs2-]Aa|LힸU]q꣖$'-&cL۟Isk W粒 WI$6Du[4^_BD~*,GN#www Fc 09ަ8e]:M[jK ="d1ƿEpϞS?稫Y=[#LNpRzu8ꢼV+5./UZJ)kJ9+ˬ/ђH2bUBڨhyt׮ARAV"f|k|쨋rU 9cmz֡;kxϸU-3´9rY v?_SycS{hQ0+&1<sE,Mn"1b|]ۺn<xtacѨwi>&'{y@(ӄ$MHb\&+m:OG:WnϲO8Z{vٲ߾YyP;$&`l$mE%TGSQLXv$ )N秪%Φa{$Xy&–xbt ǝWS.iP\VIaRҺ7] mIemcb4 ,rap8Ac`\sLy9H92>dFMWô{O$31juVen.[SܩK-˟#g?bprshON}͸?_O\af6C>^=r' !jTfOCtuZ dx7!dag}U)Gu{ٲyۊ]G匝8bhtN| &MH==E0<};"z0st~AD^%S=̛XÛQ6U%~X0.#3M1p}5XZA/Iīǽ{d`*Ep)tRq~/ ZKnJ"Nŵk M7~G=PZ_%^x$yMUY!/e1j#0hĬ.uR[hKmG:omp؎& 1V91=@V]16Utä;> c$9/oT6;qPSof^3H;eV u]bKnLLFBwo,qy߬[+T L.(SS̛Uy3.ϩ)n^6WGj&dXf3oF63{L>ڪ麁bw>,|Éù hɿ|~ 'RB#q–<+c|@ewCeBCfKMPuD\®EcNM{v\[q'xpN$zTvwuq*b% (Im2TiE>Ĝ TTEB 5>M ~oԄ\!k8mBsĬ^(uQmդJxd Qˎ(qbkDpbU^0yfacWl 0Q+d0PbV{8}{Jq"|0x\ϹoS/F%8Z'8!39Z>~>T6q$R< S/[4 Ii)a,\Hp Z8`v 0XNM @Q-AGl*ڳ,4f5,$!;tD\꣖KjD^C%jk&g__şg b.U2cl*cqThҒ=ϐ̅{^}x&lY ]JmJٶcxGokPWl / Dbj9 :t1`{zٲ9#Zo[vG}%>caBՕ^9'0i_c {o%̴T/ޞ"v0svW_y՛E%3' \}[52"ECMo.LmM8:fz&$9L x9}vimMXPb@y"ן8pLߥhtUUUm)n X)) ԉȟhFٔdž"ne F|'ڧƒ]2טV52B,?=I4渥9[ms1~Äaxcj2?; S:)pYEqVb:GUT}] X1e$|tLQqβ(``٤CkJګPVDKpRsVOi奪 3Zܪ/d/p.Y4o, Q.ZvWɈ Íe&ǭWN*-ZHUGk_y-FZpʻSmO0[ZolonI=y}i2$K qmcҎYi'gűF{쨏pL>ܥvSD䡺fg@9"\\1G@zV螒#Y9}Vg|b$n\;M|zof^jgyӺmĮ6Qivҟ E6‹/ K~zuԍk>7qyeʭr Ѷ˳C~ǜk\=.j0'3&¤芢Dtn>is`4_85F 6XX|TQbP,<|\,*ct NYJΩbe1pʂm +9) mHO3p6a?hdWj$]\*ڸcdo~V峈 8^ANRjw^Tg "9ȺU oWD. J4wO' GAĈvҔxyn w#3g:-=؆RQ0 >pb A>+Ќ&&e0]jQ`GG_0i.hv=xhƛP+HʼkG_P1-p)Pjh hBE%7z`~QWwgZڳCE>;(1ؓ_5x :8W G|c[D qHv~}m7xD?bl~S1)LCp1hb^ԩ%Q:@ S㪼Qj)˧wQn,G"ߦIo(f=xlpf }8 mG\#s"d2oc ¤Հ(X4ne_5Kw=鴓V-ZjHt#PSc,r [/Ոɑb8gް ܌$jQq0V}skdWV+|U 43tڧjG9MT]hG{Kꠍ)2}r3r~DՈinUy'CK @VpXg39S[/ƭ^_GA ,Z荠'уg}qkdKȕ}+X3W5xC,_Eـ8Wg[sm[bPMoe2Ѡi.NMGJYm(U'/K7DNG( dwz5%/Uhz\Q]rBj}^i<܄{76 8W-p-y 02ejx48ic݁oiXwO |42>DKQݎVQn {MHD={ %';I~56D_*3Uuf("7D6)7H1 >X&-|T]pNkG_bqM?GީwM$]㵧O֘'WF5l@P `-NB!]-;Lo.6IENDB`ruby-prawn-1.0.0~rc2.orig/data/pdfs/0000755000000000000000000000000012114176157015732 5ustar rootrootruby-prawn-1.0.0~rc2.orig/data/pdfs/form.pdf0000644000000000000000000026566012114176157017407 0ustar rootroot%PDF-1.3 % 1 0 obj << /CreationDate /GTS_PDFXVersion /Creator /Producer /GTS_PDFXConformance /ModDate /Title /Trapped /False >> endobj 2 0 obj << /Metadata 3 0 R /Pages 4 0 R /Type /Catalog >> endobj 3 0 obj << /Subtype /XML /Length 16724 /Type /Metadata >> stream application/pdf slip Adobe Illustrator CS3 2010-04-23T21:02:21-07:00 2010-04-23T21:02:21-07:00 2010-04-23T21:02:21-07:00 220 256 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADcAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYqw Dzp+dnkzyvLJZmR9S1OMlWtLQBgjDtJKaIu+xAqR4ZnYNBkyb8h5uFm1+OBrmXn11/zkvrrXckdp oFvFHGGNJZnlYhRWtVWIb/LM+PZEesi66XbJoEAI7Rv+cm4TxOuaG8MJbibizlEhrTf91IE6f6+V 5OyD/DL5tuPtcXUh8nqWkec9K8w6RJqHlmSPU5IwC1qzmCQEioVg6kqT2qKHxzWz05hKp+n7XPGp 44GWP1EdLpht3+eP1O4ktrrQJYbiJuMkTzhWUjsQY8zo9mWLEvs/a6OXtEYmjjII8/2Ic/n/AGw/ 6Ur/APSQP+qeS/ko/wA77P2o/wBEg/mf7L9i0/8AOQNsP+lI/wD0kD/qnj/JR/nfZ+1P+iMfzP8A ZfsWn/nIW1H/AEo3/wCkgf8AVPH+ST/O+z9rL/REP5n+y/YtP/ORFqP+lG//AEkj/qnj/JJ/nfZ+ 1P8Aog/of7L9i0/85F2o/wClE/8A0kj/AKp4f5JP877P2p/l/wDofb+xYf8AnI61H/Shk/6SR/1T x/kk/wA77P2p/l7+h9v7Fp/5yStB/wBKGT/pJH/VLH+ST/O+z9rL+Xf6H2/sWn/nJW0H/Sgk/wCk lf8Aqlj/ACSf532ftT/Lf9D7f2LD/wA5MWg/6Z+T/pKX/qlj/JB/nfZ+1P8ALX9D7f2LT/zk5Zj/ AKZ+T/pKX/qlj/JB/nfZ+1l/LP8AR+39iw/85P2Y/wCmek/6Sl/6pY/yQf532ftT/K/9H7f2ND/n KKx5Dl5elC13IulJp8vSGH+SD/O+z9rIdrf0ft/Yyzyv+fXkHXJktpZ5NJu3ICx3wCRsx7LKpZP+ CK5i5uzssN/qHk5WLtDHPY7e96MCCAQag7gjMBznYq7FXYq7FXYq7FXYq7FXiX51fmneR6ivkzy7 O8d1KRHqV7Af3itJ8K28Z7NuC5Br+z45uOz9GK8SfLp+t0/aGsI9GM79f1Jt5h/KDyNqOq3V7LHc wSTzNPJFbyIsRkb7bBWR2XmdzRs038v5cQ4KBpycnZOOc+OyL7v7EXD+Vn5bt10puZX0zL9Yn5ca U6epxr9GQh2/mJ5/YEnsfT1Vfaf1vOPzH/KJPLsEF/p8z3WhKxEpkAM0TtSnqFAqlWI2ag8PCvS6 DtEZ9jtL73Qdo6CWn9cTcTt7mBaXq2teXNUXXNOuWtL0GkaL0df5JF6FNuhzPy4ozjUhs42m1MoE cB5dXtGuDTPzF8jp5v0uIQ61Ypx1K1X7REY+NT48R8aN3Xbr01GEy0+Tw5fSeTsO0tPHU4vGh9ce fu/Z08nlTZtnlUbqXl3XtOtkur/T7i1tpGCRzSxsiszAsACR3AJyEMsJGgQS5M9PkgLlEgeYS+1s 7u9uY7Wzhe4uZTSOGNSzsaV2A3ycpACzyRCBkaAsq2reXtd0lI31OwnsllJERnjZORHWnICtK5GG WMvpILbPBPH9UTH3hKmyxiFJsWQUmwtgUmxZBRbCzCm2LMJtN5H84xzWsD6LeLNe8haRmFw0pRC7 cBT4qIOW3bKRqMe54hs5HgT29J38ko1XS9S0u8ey1G2ktLuMAvBMpRwGAYVU77g1yyMxIWDYUxMT RFFL2yaQ9X/Jn85bzy/fwaDrtwZfL87COGaQ1Nmx6EE/7qJ+0P2eo7g63XaETHFH6vvdlo9WYHhl 9P3PqIEEVHTOdd47FXYq7FXYq7FXYql/mLV49G0HUdWkAZbC2luOJ/aMaFgu3iRTLMUOOQj3lryz 4YmXcHy9+VQuNQ/MbTLrUJEuxc3jXM7sQT65DSB6GhDepQ50usHDgkB3PK6ecZaiPFzt9FXYPqtX qDnmef6i9oGDeedT/MOOb6v5VtVjt7eOOa81B4/WdvVk9P07eLfm0agyPt0oBv1lhA6t2MR/iY/5 ludQ8y6Do1p5otpLbULeIzXdvG7Qj1pNo2aNSaMEVWoenIigPSvL2mcGQAC686+52um7IjmxSPFX FsNgfvYzN5TtJHLmQluxZQ1PkNhmyj7a5+sIfa6o+wOH+HLMD3BNNAjl8u294LK9niS8Cm8cycQw jBArTiAByOafX9v6rVEWeGukdvt5vQ9nezul0kSAOL+tv9nJLtdjsYogioqXFQQqgA8WFamnYggj N77LnWyzcUjM4SP4rryq/wBDyPtpHs6GDgxjGM4lygBY7+Kv09eXV6p+dYJ8h6UAKk3kAAH/ADDy 50XZ396fcfvDoO2/8Wh/WH+5LXkXytpvkTy9N5n8wkR6g8dSjAcoUb7MKDvK/f7vEl1WeWefBDl+ PsXQaWOkxHNl+r7vL3n8dXnesQedfzEvL3XbWz9eztCY0hWWICCNRyChXZWY03JA3P3Zn4zi04EC dz9rqsgz6uRyAWB5jZjGgeWNc8xXklno1t9auY4zM6c446IGCk8pGRerDauZOXNHGLkaDi6fTzyy 4YCyoeYfLms+X776hq9sbW6KCURlkeqMSAQ0bMvY98OLLHILibDLNgnilwzFFMNR/LTzzY3FnbXO lOLjUCy2kKPFK7lAGb4Y3YqFB3LUAyuGrxSBIPJyJ6HNAgGO8uSPP5H/AJlFOX6LStK8PrNvX5f3 lPxyv+UcPf8AYXIHZef+b9o/WxOfyt5ih1xdBk0+ZdXZgi2fGrkkVqKbFab8q0pvmSM0DHiv0uP4 MxLgr1dyf3n5KfmVbWj3T6QXVF5PHFNDJJSldkVyzH2WuUDX4Sa4nLPZ+YC+H7nrv5oHzSp8mHys obXg8/1NW9Kn+8Z9T++Ij/u+XX9earScHr4/p2+922r4/wB3wfVv93mwfy5+Xvmrzd+Yt7N5+sTK lvGqam8csMfGQwg24pbvvVKfZ+nMzLqYYsQ8I+79PNxcWmnkynxB7+XdtySjzj+QvnNfMl8vlrRj JoYdfqTtdW9SvBa/3sof7VeoyzB2jj4Bxy9XuK5dBPiPCPT7w8kmRkdkYUZSVYe42zZBww+u/wAi fNE3mD8vLNrlzJd6a7WE7salvSAMZP8AzydRXuc5ntDFwZTXI7u/0WTixjy2ehZguW7FXYq7FXYq 7FWG/nEsjflnr4j6i3Bb/UWRC/Y/sg5l6H++i4utvwpU+Y/KGoQ6frFhqMNvIXsp4p9mrX02DU/Y G9M6XJATiY94ePlkljmJWNjb6suvRkImgbnDKA8bjoVYVBzzTV4uGZD32OQkARyKTeZbzUrHSmns ErJyAkkpyMaUNWpmBqJThC4ux7Nw48mXhyHb7z3PLrzUZGuWkufVlkk+JpgjSVPgeIYj6Rmmoy3J 3exiIwAiBQ8kM95PIONrEw8Z5lKItO5VuLt9Ap7jCIDr8gssm23zPJT8vSaRqXnLStEYtqM91OFm cn4I0QF3KgUUHip3UV8TnSaH2fzzgcmQeHjHT+KX6a9/wDzGu9o8EZDHhPi5D1/hj+gn3fEoj81l iXz7qiRACNPQUBeg428YpnoPZ4rDEfjm+SdsyvVTPu+4PaPNXmjTfLfl/Tb/AFC0N3C00ESqoUsj GNnEg5d1CHNNgwyyTIBrm9Vq9VHBijKQ4hY+7mxv82dDvPNXlmz1nQ7o3dnaq05s491lRhvIoG5d KU4n3pQ7HJ0OQYpmMxRLh9rYTqMQyYzcRvX6feGN/wDOP2piPV9V0xjtcwJOoPjC3EgfMS/hmR2r D0iXcXE7AyVOUe8X8v7Uw/LzS/8AC1p551ZgB+jZJ7W2c/8ALqHkoP8AW5R5DVz8U449+/z/AAW7 s/F4Ec0/5tgfD8Bv8wtHTzHrnkPV405Raq0MVzTcCMlLgD/gGkwaXJ4cckf5v9n6meuxeLPDP+fV /f8ApLPIbqK6/MK5grybS9NjA/yWvJiz/etvHmCY1hB/nS+7+12glxagj+bH7z+wPP7rSvMh8zSa l/ysa0hgF2Zv0f8AXWEaxiSvpGLmEoF+GhXM4ThwV4R5c6daYZOPi8aPPlxfoZdHL5f1T80LG/sr q3vZ7fR7lS8EiSlSLiEL9gmm0zjfxzFInHAQQR6h9xc4GE9QJAg1A/f+14p59/MjzvZ+f9V+qaxc wQ2N28Vvao5EASJuKhovsNXjvUb5ttNpcZxC4jcOo1OryjLKpHY/c9v8wzet5x8iTU4+pNevx605 afIaZp8QrHkHu/3Tu8pvJjPv+5itlqeoR/8AORN/p8dzIljcWiST2wYiN3S1TizL0JHbMmUB+UBr e/0uNGRGrIvb9jzX82fPnnTTvzD1qysNbvbW0hlQRQRTuiKDEhoqg0G5zP0enxyxRJiCXE1WeYyk CR+byiRmZizGrMaknuTmxcQPo3/nFf1f8Pa5WvpfW4+Phy9L4qfRTNF2v9Ufc7js3kXuGah2bsVd irsVdirsVQes6ZBqukXumT7Q30ElvIaVosqFCaHwrk8c+GQkOjDJDiiY9741mtb7StRudO1OUwzW UrwSQody0bFTQL+ztsc6+ExIAjkXidRi4ZEAbvpryDcm+8h6JctUn0DEOVa0hkaJfwQZxHbOIDPK nreypE6eN+75GmR28NSK5rsUHYEvKvzM8yaFb3kum6TZwLcxEi9vlUAhx1RANqj9onvm/wBF7PYJ jjyQG/Tl83Sdo+0+pxnwsMztzPP4C3lOq6i8nwTTSJXeNwxK/cM32n7P0+D+7hGJ7wN/nzedzdoa nUf3k5THcT+jkzf/AJx/0Oe680XfmK9YfUNFgcR3DEcfWmUqaN4LFz5eFRlHamWoCA5ydr2ThiJH JyER+PsSDzJqn6W16/1LcLdTvIgPUIW+AfQtBmXhhwQEe4PNanN4mSU/5xJelfm35l0DUvJenWmn 6hBdXMd1C8kMThmCrBKpJA8CwGazQYZxykkUK/SHoe1tViyaeMYyBII+4sc/Kz8xm8u3o0zUpCdE uW+0d/q8h/bH+Qf2h9PzyddpPEHFH6h9ridldo+DLhl/dn7PP9bIbiXyXov5had5l0TVrT6jdSPF qdokq0iMyFfVUA/Y5EFh+yfbpjAZZ4TCQNjk5sjgxamOXHIcJO47r6+5Ffmf5u8qL5L1Kz0O/t7m 61a5Rp44ZA7CpVpHoOxEQB+eR0eDJ4gMgQIhu7R1WHwZRxkEzlv+Pgq/lv5y8ot5O0WHWtSt7a/0 iWQxRzSBWBAkjRqHt6U1Mjq9Pk8SRiCRL8foZ9n6vF4MROQEoH9f6CxzQPzO0my/NjXdRv5/9xOo 1tYrpAXRRblUhkotTwZUO4HevjmRl0cjgjEfUN3Hwa+MdTKUj6ZbfLkuu/IX5T3WtSa0fOFslhLP 9Yk08yQcvifm0YqwbjvT7HTBHU5xHh4DfezOk05lxeIOG+X4/U63/MP8udF/Mmyn0K3itNE+qy2e oX0EJRWeVldWCU5lUaJRWnc9uqdLmnhIkbldgMo6vDDODAVCqJb82eVfyb1HV7jzNcea40guZPrF 1YW8kUsjt+2EReUq8z/k4MObURiIcHLqzz4NPKRnx7HoyTXPzB8l3Xmjybexatarb20t3JdVlT9w JbF0USUJA+JgvzzHx6bIITFHevvcrJqsZnAg7C/hswe+8/eXNP8Az7bzB9bS40WWJIJLyD94qhrZ U5fDWoVx8VMzI6actNwV6v2uIdREanjv0/sZnFqX5S6L5u1Lz9/ia3mub+D0/qccqSldkDFYo+Uv JvSGxG2/0YZjnnAYuHk5olhjM5OLm+Y9cv11DWL+/RDGl5cSzqh3KiVy4BPtXOgxx4YgdzpybJL6 x/IrytN5e/LyyS5Upd6k7ahOh6r6wURg/wDPJEJ8DnNdoZuPKa5DZ32ix8OMX13eg5hOW7FXYq7F XYq7FXYq8l/Of8pZNfceZNDhEmtQIFurPZfrSIKKQf8AfiDbf7S7dhm00GtGP0S+n7nV9o6I5BxR +r8fayf8vNOvLP8AL/RILyMx3PoerLGy8GUzO0tGU0oRz3zWdqETykhyuz8Xh4YxRXm/V30Lynqm qptLbwn0T4SSERofoZgcr7PwceWMSy1+Y48MpDnX37PlmbVyVindi/Mss1dyTtv89652weEGEkkI zyr5R1/zdqp0nTIjJaghpr5wfSgQ7h2bxI6L1P45Tn1EcUbk7DSaOWUjh59XrHnLUdG8neVYvIfl 1uUhX/cpcj7Z5UL8yP25e/gvw/LWaXHLLPxZ/Bye1dZHFj/L4+f8R/Hf92zy1s2rzKm2FmFJsWYU 2xZBSbCzCk2LIKTYWwKTYsgothZhTbFmFJsWYUXxZhRbCzD1n8mPyavdev7fX9etzDoEDCWCGQUa 7cbqAp/3T/Mf2ug7kazXa4QHDH6vu/a7LR6QzPFL6fvfUAAAoOmc87x2KuxV2KuxV2KuxV2KuxVa yBuuAxtUg87+UV80eXLjRTdGzE5Q/WAnqEcGBpx5J1+eX6XL4M+KrcfVafxocJNMI0b/AJxw8m2j K2pXd3qYVgxhZlhiNPERjn9z5mz7VyHkAHEh2VjBsklnk3lkW2ijSfLksWg2+4LW8AZhXqV+JAGP djU5hxzXLimOL4uRm08jDgxy8P4ftYLJ+Q8Mjs8muSO7ks7tACSTuSSZMzx2p/R+39joz7N3v4n+ x/apn8gLY/8AS6f/AKRx/wBVMP8AKp/m/b+xf9DY/n/7H9q0/wDOP1sf+l2//SOP+qmP8qn+b9v7 E/6HB/P/ANj+1af+cerU/wDS8f8A6Rx/1Ux/lY/zft/Yy/0Oj+f/ALH9q0/8472p/wCl4/8A0jD/ AKqY/wArH+b9v7E/6H/6f+x/atP/ADjpan/pev8A9Iw/6qYf5WP837f2J/kD+n9n7Vh/5xxtT/0v pP8ApGH/AFUx/lY/zft/Yn+Qf6f2ftWn/nG20P8A0vpP+kYf9Vcf5WP837f2Mv5C/p/Z+1af+car Q/8AS/k/6Rl/6q4/ysf5v2/sT/In9P7P2rD/AM4z2h/6aCT/AKRV/wCquP8AK5/m/b+xP8i/0/s/ atP/ADjHZn/poJP+kVf+quP8rn+b9v7GX8jf0vs/asP/ADjBZn/poZP+kVf+quP8rn+b9v7E/wAk f0vs/a0v/OLthyHPzDKV7gWyg/eZDj/K5/m/ayHZP9L7P2st8t/kL+X2iv60ltJqlyAQJb1wwUkd VRAiA+BIJHY5jZe0cs/L3OVi7Pxx8/enPlXyXrWias95d+ZbzVbVrYQCwuSzRrL+75TKXkkap9Nt u3I0ynNnjMUIgbt2LCYmzIllmYzkOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVDajqVhptlJe 386WtpDT1Z5TxRQzBQWJ6bkYoJAFlUtbu1u4EuLWZLi3kFY5omDow8Qykg4qDaril2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KpB+jPOn/V9tf+4ef+ynA18Mu/7Hfozzp/1fbX/uHn/spx Xhl3/Y79GedP+r7a/wDcPP8A2U4rwy7/ALHfozzp/wBX21/7h5/7KcV4Zd/2O/RnnT/q+2v/AHDz /wBlOK8Mu/7Hfozzp/1fbX/uHn/spxXhl3/Y79GedP8Aq+2v/cPP/ZTivDLv+x36M86f9X21/wC4 ef8AspxXhl3/AGMR/NrTvNS/l3rJutVguoPTjD28dkY3esyAAP6703/yTiWrOJcB3eTfl1+Xn5xe ul3ojT6BbuQzXFy7QRuP8qAhmkHhWMjIgFxMOLJzGz6W0G21q20yKHWb2PUL9f7y6ih+rq2w/Y5O K17inyGTdlEEDdMMWTsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir//2Q== uuid:13528DD4AD50DF11A0AE9F14AB4BE47F uuid:cf4bb206-1326-d74d-bcf6-c7318f4a6bf4 uuid:2fbdcaaa-a095-1547-b943-336f0e642cc3 uuid:EDE785FDC44FDF119846FECADDC9E06B False Adobe PDF library 8.00 PDF/X-3:2002 PDF/X-3:2002 1 False False 612.000000 792.000000 Points Cyan Magenta Yellow Black Default Swatch Group 0 endstream endobj 4 0 obj << /Count 2 /Type /Pages /Kids [5 0 R 34 0 R] >> endobj 5 0 obj << /CropBox [0.0 0.0 612.0 792.0] /Parent 4 0 R /Contents [6 0 R 7 0 R 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R 32 0 R] /Rotate 0 /BleedBox [0.0 0.0 612.0 792.0] /PieceInfo << /Illustrator 14 0 R >> /ArtBox [169.333 395.725 392.999 656.252] /MediaBox [0.0 0.0 612.0 792.0] /TrimBox [0.0 0.0 612.0 792.0] /Resources << /Shading << /Sh0 21 0 R /Sh1 26 0 R /Sh2 27 0 R /Sh3 30 0 R >> /ColorSpace << /CS0 22 0 R /CS1 22 0 R >> /Properties << /MC0 << /Color [20224 32768 65535] /Visible true /Editable true /Dimmed false /Preview true /Printed true /Title >> >> /ExtGState << /GS0 31 0 R >> >> /Type /Page /LastModified >> endobj 6 0 obj << /Length 464 /Filter /FlateDecode >> stream H|Tn0 +kޚ͵0 ߗ%qIzo?|qen\l^9Fe r ,挬;BCJ0:ZBIgsFV٢OH B QegdݑetlNgsFVs3?MF0%ױF^3\盅 >Óy*'9g9Ĥ fEgRL0@yn* < Fw qY*UUم:_Έ1 Ō"q߽M C+b;>N7=7 73>eA5P5z!Q˪[7>}g8{V6NX!K=ŀeꃆfg|i,_ZYt P@u!TW"{O}y;Б2Iӥ_B]1JFR˿`= endstream endobj 7 0 obj << /Length 461 /Filter /FlateDecode >> stream HTSq,1 ˯ 5/^Q$:fr S(Ըh'Q_dϽ&y3mBU\@p[uAAw.I,$)K}bԳ{faNH dSvooy'Xt9+eS।!wCNZQ|ǩu'ػ~ -{\džx_o5(̭^˜65r`+~Qq$*2{`aJ%<= eNY* pMdƼ> stream H\SKSA ܿSނQ>BdAb"!q{NSj %Eg dbL8 ^IsLp& 1ʢ-Ҫ- W⨺]St0-Lbr޾/|!w r8$e}zkYܾ5hh2j XG.*uHm:|!vil@ӶGԯӀJYcrI}fG V0ʨg$, =w10! |\l @׆'Jp/ zBv{[R w+e~z0MGs8 5CӆP#>#LߊhPLx"XH`# endstream endobj 9 0 obj << /Length 547 /Filter /FlateDecode >> stream HLSQ$9 S/vl'3t㬍;ͫH iWULmYV1h#`[Y, $-ƉnfYGy6>0E6<o  b0q61gɽå<3lr64L[8EK|4)HX0{x0ռD( va; SK<K6Y 8 |=7vh*"\@xf䝯dTU_Jo+cZ*?)Q)S6rͪަ$DQh4"L7ʣ ͖)mYwk%:,~֔[cY6(CDdW Q,C2ip{qh> stream HlTѪ0 }WYm}l0 1` zGNڦM%H>cłؼ)w]趘q*{m5^s ҹjpm  X5H; T½))G4Z U(f u|\.W*\/w %^>/hw􉄾_`AjPG{mɥeu\T+d#`` .WTpAgWʇ~o?p1ܿ,;ҖfRΆ+\0%'[NbeUrceh`l^_Jy~wrV֛=)3#c cD{aDEYZr3O_v\#QY@ZL(/95緿18[NÅ8Z(3؛ Xsx+rF<ΆM @'|Oퟍ=yۇ0d#`-mqd/awB{C endstream endobj 11 0 obj << /Length 516 /Filter /FlateDecode >> stream H\TK1)C \z& v6c5F(<΋V}\iYsܻ{Ikyự/=Ek6΂<(GM2ͮ^Y%GfGUPCw |_ëxUNY0TnB |5bůFZ!}0 6r;V?ցa~g#[NxqZ'N~y|_ǟ,a|!sq Ş< ' e :ع8IpU h GsiJG@ Vi"X$Nh|70RD 1m[J?7|a_-\VALcV/LzWGohlfOޫ.5ByG `7% EQRWZLKt6uQra#/Pom+ ؾq`Jq-4#)F#]Co8ο #ߺ endstream endobj 12 0 obj << /Length 533 /Filter /FlateDecode >> stream HlT[0 )t"E1z~d?萊gLQN!nv2i髝夵=`Hl3}X;֔)y um:>܆*G>4y 3rrb> stream HlSAn0 HIyc 萶7̡ %]GK\7sk+tOGF8w_C9#ުϱs++LE^OKլPmd;.B*=xv]XTsn>fg4j>Pu|*A%+M >> endobj 15 0 obj << /RoundtripVersion 13 /CreatorVersion 13 /ContainerVersion 9 /AIMetaData 16 0 R /AIPDFPrivateData1 17 0 R /AIPDFPrivateData2 18 0 R /AIPDFPrivateData3 19 0 R /AIPDFPrivateData4 20 0 R /NumBlock 4 >> endobj 16 0 obj << /Length 870 >> stream %!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 13.0 %%AI8_CreatorVersion: 13.0.2 %%For: (Capps) () %%Title: (slipz.pdf) %%CreationDate: 4/23/10 9:02 PM %%BoundingBox: 169 395 393 657 %%HiResBoundingBox: 169.3335 395.7251 392.999 656.252 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 9.0 %AI12_BuildNumber: 434 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_TemplateBox: 306.5 395.5 306.5 395.5 %AI3_TileBox: 18 40 594 774 %AI3_DocumentPreview: None %AI5_ArtSize: 612 792 %AI5_RulerUnits: 2 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -607 918 1 1829 1055 26 0 0 50 75 0 0 1 1 1 0 1 %AI5_OpenViewLayers: 7 %%PageOrigin:0 0 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 17 0 obj << /Length 6351 >> stream %%BoundingBox: 169 395 393 657 %%HiResBoundingBox: 169.3335 395.7251 392.999 656.252 %AI7_Thumbnail: 112 128 8 %%BeginData: 6202 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD92FF848484A9A9FD05FFA9FFFFFFAFFFFFFFAFFFFFFFAFFFFFFF %AFFFFFFFAFFFFFFFAFFFFFFFAFFFFFFFAFFFFFFFAFFFFFFFAFFFFFFFAFFF %FFFFAFFFFFFFAFFD2EFF5A36070D0D0D07303684FFFFAF60143C363C363C %3636363CFD0636353636363536363635363636353635362F3635362F362F %362F362F362F362F362F362F302F7E84FD29FF5A0707070D060EFD040D06 %2F7EFFFF3C0D1413140D140D140D140D140D140D130D140D0D0D14FD0E0D %070D0D0D070D070D070D070D060D0707060D0D84FD25FFA9840D0E070E14 %36360E0D360D300D0D5AFFFF611436143614361336143613361336133613 %360D360D360D360D360D360D360D360D300D360D300D300D2F0D300D2F0D %2F0D2F072F0D0D075AAFFD22FFA80D5AFF5A8484CFA8FF845AFD040D070D %2FFFFF3C1314133613140D360D140D360D140D360D140D360D130D360D0D %0D360D0D0D2FFD0A0D070D0D0D070D070D070D070D062FA8FD21FF2F0785 %CFCFCECFCECFCAFFFF850D360D360D0D5AFFA93614361336131413361336 %0D140D140D360D360D360D360D360D360D360D300D360D2F0D300D2F0D2F %0D0D072F070D072F0D2F072F072F062FFD20FF5A060D84CFA7CEA7CEA7CF %A7FFFF600D360D0D060D84FF361413140D85845A0D140D135A8584360D14 %0D130D140D0D0D13FD0E0D0736845A2FA95A0D060D070D060D070D065AFD %1EFFAF0D1436FFCFCFA7CEA7CFADCFCFCF4B2F14140D360D36CAC97C7C13 %36FFFF841414145AFFFFAF0D3613360D360D360D360D360D360D360D360D %300D360D2F0D0D5AFFA884FFAF072F0D2F072F072F072F07A9FD1DFF5307 %0760CFCFA7CEA7CEA0514AA7A79A52592E352E7675BBBAC1BA7C13AFFF84 %0D1436FFFFAF0D130D360D130D140D0D0D14FD0E0D075AFFA90D2F0D0D59 %FF5A07060D070D06072FFD1DFF300D0D5AFFA7CFA7CEA7754B4B75C8BBC1 %BAC1BBC1BAC1BBC1BAC17614AFFF601436FFFFFF133635360D360D360D36 %0D360D360D0D0D363536FD050D362F0D2FFFA92F072F0D84FFA9072F072F %072F072FA9FD1BFFA9070D0D60CFCFA7CEA7A7A0CF7CA798C198C198C198 %C198C198A0521413AFFF600DAFFFFF130D35FFA8360D5AFFFF5A0D0D84FF %605AFD05FF350D2FAFFFFFAF84FFA959FF7E84FD06FF060D06070684FD1B %FF840D0D3036FFC9CFA7CEA7CFCFCFC1C1BBC1BBC1BBC1999998C1A81514 %36AFFFAFAFFFFF36140D36FFFF361484FFFFFF0D36A9FF60FFFF855A85FF %FF0DAFFFFF8485FFFF845AFFAF36FFFFFF84A97E2F072F070D5AFD1BFF84 %070E0D36A8CFA7CEA7CEA7C998BB98C1BBC1BAC1989998C1C9FF0D1413AF %FD04FFA8140D140DAFFF600DAFAFAFFF360DFFA885FFA9070D0DA9FF5AA9 %FF2F0D075AFFA95AFF840D5AFF7E070607060D0707065AFD1BFF7E0D0D30 %0D85CFCFA7CFCECFBBC1BB9999C1999974C1BB9F2EFFFF361336AFFF8460 %FFFF84360D1460FF8436FFAF60FF365AFFAF5AFFAFAFA8AFFFFF5AFFFF36 %0D0D36FF845AFFAF0784FF84072F070D072F07072FFD1BFF84060D0D1436 %FFA7CEA7CFA7C998BB9899989998C19958070DCBAF131413AFFF600D60FF %FF84140D5AFFA936FF5A36FF605AFF5A60FFAFFD04845A5AA8FF2F0D065A %FFA959FF84075AFF7E07062F0707060D065AFD1BFFA9300D360D36AECFA7 %CFCECFCFCFC8C8C1A07C7D2F360E0E2FFF84141336AFFF60141385FFFF84 %1436FFAF85FF6013FFA8AFFF5A5AFF840D0D0D365A2FFFFF36070D5AFF84 %60FFAF0784FF850685FF5A072F07077EFD1CFF2F0D070D0DAFCFCFA7CFA8 %CFAEFFAF60131414140D0D077EFF600D1413FFFF840D140D85FFFF5A0DA8 %FFAFFF350DA8FFAFFF0D36FFFF363535FFFF5A84FF84362FAFFFA959FFA8 %075AFFA836A8FF2F07060D07A9FD1CFF840736141484FFCFCFA7CFCFFFAF %611436143614360D2FA9FF36361436AFFF8414133613AFFFFF5A85FFFFAF %360D85FFFFA9360DAFFD05FFAF0D5AFD04FFA8FFA85AFFAF0730AFFFFFFF %A82F072F065AFD1DFFA92F070D0784CFCFA7CFA8CFCF600D360D14FD040D %35FF84140D1413605A360D140D1413605A6035605A5A0D0D0D605A5A0D0D %0D365A845A360D0D0D365A842F2F355A2F5A2F0D072F59842F0D060D0607 %84FD1EFF840D0D1484FFCFCFCFFFFFAF143614360D360D0D0DFFFF3C1336 %143613141336133613360D140D140D140D360D360D0E0D360D360D0E0D0D %0D360D2FFD080D070D0D2F070D070D072F07072FFD20FF590D0D84CFCFA8 %CFA8FF36140D360D0D0D0E07A9FF851314133613140D360D140D360D140D %360D140D360D130D360D0D0D360D0D0D2FFD0A0D070D0D0D070D070D070D %070D06070DFD22FF5A0DA8FFCFFFCFFFA8360D360D360D0D07A9FFAF1336 %143613361436133613360D3613360D360D360D360D360D360D360D360D30 %0D360D2F0D300D2F0D2F0D2F0D2F0D2F072F0D2F072F07070DFD24FF5AFF %CFCFA8FFCF85070D0D0D060D0DA9FFAF13140D1413140D140D140D140D14 %0D140D140D140D130D140D0D0D13FD0E0D070D0D0D070D070D070D070D06 %0753FD28FFCFFFFFFF5A0D070D07305AFFFFAF1414133614141336141413 %3613140D3613140D360D140D360D140D360D140D360D0E0D300D0D0D300D %0D0D2F0D0D0D2F0D0D072F070D075A5A857EFD28FFCFFFFF840D5A5A84A9 %FFFF851336363613363636133636361336363613363536133635360D3635 %360D362F360D362F360D362F360D362F350D362F2F0D362F2F0D5A5AA9FF %FF532F7EFD32FFAFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD %FCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD %FCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD %FCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD %FCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD13FFA858A8FD6DFFA80B0558 %83FD48FF7D837D847D837D847D837D847D837D847D837D847D837D847D83 %7D847D837D847D837D7D052D0505057DA8FD46FFAFFFA8FFFFFFA8FFFFFF %A8FFAFFFA8FFAFFFA8FFAFFFA8FFFFFFA8FFAFFFA8FFFFFF832D052E52A8 %AEFD69FFA82D83A8FD48FFFF %%EndData endstream endobj 18 0 obj << /Length 15844 /Filter [/FlateDecode] >> stream HnHށs 2 p$F`8%AKO?9U\Ȏ й?jgSgygl}&q$<)7tڜF\X,݆9BEvn& ~ZNI%ݢEv1_9Yޟtg5ݡN$OIXFg/Q_|y]ੋ3(5iLRL4 ^9DZ[ߴfunjlOt^f],VGbz_O5|n/yY٫ͻbu#b(JTl/_ܠXG{y1^ i؜a/ڛtҌCKoG82NGֆ _~FVbٝĢDFI_fh7oEլ]`ow1p .vy+K*l/O- !^ˋկgil#/I9EIlL$Sđ5ag ˡ{7.if~=_UlQoI6WeX1T|9mLgsToM;Cщ\FL&. ӓX1.d@]4ESƄ(F2ьaR` 2~@ AR%7Y)) y eUU5hZպ6 -Ȁ LRt5M$@6эicL5c))] Ă HXH4".#tuJR PbNF 9.4&1haIMfr'BPgSb,᱕V[cu5,Ͳ, jK\JQ6wy7E%(㝑cgt. OƏh3p\+-% `=JIYYR\$X)0K!?9/IICU E^N'_݉ΒeH4t4 IC I T:9YPFnk@SY 8ĸ %.Pg^,&oP hВ,~ 糰94&t m8mGd1S&r)OC$42Pߙ, `!I,o@l=?IlKʐ!H: 1(FԂ>\'dGB$ɐ9bgt#F)q>($q$ V>T#se>I3jO:[E]-~c z׹y(9P凧~x<_mJoNtVZc{YB=km&YM,AJd;1t^B5yp2rU]ج&8DdaqR/p '|N!"ı8F:6CWoՑ#{aRf +)$AGj`@4RdVhBT@{xv0D%B 1PP9]1khxX3nq}W ]]1:V:)`&ɇNCeCeA?E_\KmuQCN:=8EdJpXf8P>`C1֌? zxd<"z|7"}djLfؗ ٻU܅JE_/B<)H1Chz%p 1$#8} ]Iv6[wHJشkǽsGiei5F"dB vF:Fޯ!P+b.q07Fw;>`h3g,N}*QIO!"!dOR!yCa ">1zQIb݀c\;8\Klh$FB՜{P(pC%|R(zד#1} uyJP)秔`Rc 9b'쐷9kt٪c!cr$D}[תkbL6>MEHkV rFzӌ;D\Q^nDv +8Hoa>CA џ#qU x8;'kE[!єAxF?D-m` ; Z!Xڐ 8ILBE.~}8s$Q&nR )M 1ɿQgDQMI=)s„9qVO zBfQ`8$fQ+>ȠJKK"qi. 9$2OqH@g"DI^ 9BD/K\<%jI*u6f#}]s1mߴLAщB`aaln6؎ؚha[fߵp|ʡ:Hedp|d qqhxze|t`s2]^qY3ĝ Ѐ2a[E$sXq'#sNN,iZRDeFX`e^ȽyxC>ωi,wsdtӂq6X^.hEyʗ˿5i#/ =qVyO4"UN@lnff:ReݱHAkJ)e Ucjc ՠ;F4;bk?q2σA b"H.1|Z. @N*<,=UrW] Y|YuX7rH;V;{t[6Vɟ.,֖Jt{$V7(hyDXmե};e6$-))><-crK6U{FYUip"3) ɽ)Obކrz%%uCX]/ՏQ ~ CSda7čPB63 Vw IfW:M_DJeoq>$ SL3LF"R#%P W\= civpRi>ͅբZ?P/J[QKrYKwonw{J+ƁEң:;澱һUN7(/Wt7?|,W힞,U5I|;% XZUhh(⮫tXFޔWeJR u8su~o~Pwi1 ׼io*3,Q;yl.Fj<vuquY?X unϚdڝeZjǠOԲP_ЫUvXN) eQgmk~{ӷn^Sqfнᧃa#V㝆f ͖*1-Y'-1\^[ .ad$6*pRml 1LޣEU8yo,t=Z}:ZVs_Fh}!өJ;%>6R-sݣbk*ٵ;zN.=vEŽ`SߒOOu?tG̜P {1ж%=fإ`Wt'kɍy-{}e۩F(KeW;/UږD!\G'l" 3.:j'@Kt:x?V&iA$'յ:QZ֞#'[߽{I5ZqRx)5:y/LCi>ަVS/mjրJ{S|nw6k:ǣ\zx|ѿ\ܥΛkwg};/`tJ?SU鷕_n~!?:yhm"ufga^HMS~/Y[+vyէ-v>?&GRl?S5+=sj>UOU顓z85[ՕFtNMaJCݽ᝵u*YEEYn oq僆^[o]}|:m~y1;CcH%ϗZ}i=ڨS9+]㗛{<=lc򇵑۰.6r=KdVI*LJv>{ٮ5mNX[|\}WEX cv*;iI{2z௮yBU:1TAj!~˽"X_~˭oPހ-iX'SRmomrF c'c̑BNY9_ xհnKƇcu6U 0 XCDgٱ9b2%+X?5Iy*b"L<#OA,  YN*N =7h0لE1Ml c^YF8*ن])FQH @P^;D( ʨnqY3RJx²t#+}lBJ-N-1ȩԴGX 8g4̰3q|)J73FKk 2F58Gpuv^c  i Zj,BȲ8R&Us8m)KwXq ^yw[륤׼#0c,_~80WOw3Ძ8ͼX`zyּVll- m7rQ3h$tC*ml:Jș`'U&TW w1框2TE*Ե4'p8(H945ApǦ\ઇ e u$P+ACGʦ"C٫'P7\6#?䦭=A =>Ά .8>q@缗Vfs:tzw"&bxy< n 1 !l%@׬Uo5ܤ.y+nm7sE3gm-6eLD1.]aHM/̓޵<عli/ bD1!_I0knיB7;n ]S1͵{=y}7R>q%N%a0&M2!iTuMSxxS ,u-I#m- 5- Yg[ sYʾam,+QnIJg)67 LHE9Ŏ/{{ڼopx(Z YTTdH򻢼2ւty vH+jJdn %sëq);(QAx1qrX<ۍptV 99&L:3NWb%ևׂ R͎-!~6=o̞ŷWhdI҈xN"ҭ:nr(JXYwxiYvKP^3+/X婈#hUbBF} z)qA#X]a/ DUxYP}Y,y{RPR&,f@&,P]4墥uBr{ >Cl4y#Pv0F0aR[Tu<(B,7->Jv3Y * p˖DS5XOW_Q\GKϬ:ŪA<`J mj+1B@xi.#^c WaVs -u X(48t)f3|ǿfA+@gC,xoф 9jrXc(|IB& ^ RYٻ}`mtaiQAy?rOPV ]lwio=kb{YMK铎fכ!/xۇA}pP8imsU|3L ߏ_3DxtH<%=r"7[cדU8|^(bXR%=K1 zgCsW?<3;󛲳Q ɍ:+q56sM<~RK%_OгM9vmYYyRVEfת*ð}eV+r^# (5}@5TEɨTHLMAlݐ욌YeƪY1K祲 GԔO3_=8Se֜vP)9KWa(tk5< kAuC_Qv8KCXXb!ͿXP(.—ZXYqXA@^P,Ϭ}[P + TuA~,'h\rZZ\ ΜA%b g5< Ʒg4ϊHg?XP RI|S  U3bx 5U*I*0r|~2AY^-(8{(84>LA#E5Cl"Csl!bMxB)Q]ǧA3y"O&&wk#YM<46*L7#ҧۘw0Pqy&7nBǺMZyGB ENCEաZ sB ښʵ MQ *0^W:hDHh_H:C@bW@@|\B aaxggj~*Y ]/~uEwCۅ2)ePtJ Nذ6 ?HΦ+$AgMft)XӮd;x섆ՠ! (cSoBЂz6 { K^():;ky`F`#磰 %G7TyNt7T2C|Сň;QVenݓЭhl:+w?HpY3yoLkPqe4x@X)>T;^d@d0hV؄W߉jQ~+LsYˇC*?%oWI ]Wk^n3{b*G a餓Ԛj=ENQ\έ <šae5kOy/!ޖE98[E#pkNu!Fb~ڼ-CƻfĬ4Şub Ѕ!wμ!˾}zsl^͒fLc*! ^X?bIe,T_]hIxPy9L}S:::'kb*6<\םsn*xuBˎok?y/ڗqYzoS4!$K6[7YXXt<;4T †M}8JNgvhg[٠kZP@|[%Vm;84>:҉(M ]"6.idFjH%/cAkte5ʀ]C:o]}/vwq!lBٜϵuی?Xڪ-_em(kvg@~s&u{eCHM'p4w5L|)R!@Ϛ/?J.}ڏ8y=dm׵C~r bBhh,>aP,GXqcZ^Vco3enϟ bX>6@-?~tkeYue*fmt_)=bU_+R/$ko`F=j6BT .T'OK+ip}3ck4W ځN uFwe yROץ&B9¾,}+*{9 zT1:fvcJ@ #L+aDŽ1QK'L:wu{xie aOSk cÓ>:aUl%wNhKF`)WoxY8NmSr&T{`ěQdmD޶/{g}t_ɔ-̝=!?7>~ڹR+gG%"k;גsڎ%nRoOίbiEt_8+-nX͋rp[3\NCvq. ^[nϟbUO%R엇c2'1T>HksNڿT9~iZ4WYk۱+JßerZ{뵇8[Ể͋ӕrlv,կx| !OXh'unmN:R%)5PrC.]\ԕkSGܻZ8يV\zDF͍ A2C3y9UZ՜+JhW*y~1> a8%+*_K[iWڊG DEb)-}]cɽ]}R FFrE;W+W;;iR\d00,2߮/zl,w'ε=K:ЬNwԁCӻ{b>О,/$|?Z%vt#!Ά-s^MԊ)7i>}u]noS\2./zD~6 u=̮*eV^ny]L+@A=ɩU֞W:F^&27ƅ<;/&cY[c-"tsW&AKi}Ŵ5],D qL.9\6h嬼 Jh}H 설;gFqJZoO9Rзߵ$f/Љ8Y l,}.̎Wĉq f^%Y7-ej*z,`p%9.`z`<.нl8%Fs|aclG.;h"ņb}/b(bqa$=+#ņb.fDaC +Ӟr A KBSŅ.W@לϣX ~s(Jte|ҵ1:H BRZcIIhuD#;7qy-?<lJ>Rs%΋""\Z"} 1ͷ53``7 Rǥ$+RT0wњl.X29vK۱F&Ĩ<$q$FXsͷ F;QH Jqr@gDވbW5O|S׷{5__^3NtU;UM!#R \-꧟KhC T^p߽H7_RIO֌P6Pe֌5!w[hi6PTkt9) -ɤ'3:'Op.m}$Er{e0;F>M`$Dǵte-lVkǗxWRz,{ͲN 1K/%Bpc#'O\01٫4G;vD-P%Yic(!@Skݫ;iNO[bJy}vTd荧\.=ʅ(HIz@GV"#(ju$o2L bM )%%.޽w1nvs[JRZIJOl:t|2%TR/H Rc1A(CKI}ah}]-7D5qtĎ}[wL7bԎ9S%1]0iCe09lnY\##;%:ȶ4OsA3;?,` cmOq+X'"9eyeMƅ K$AYs?. $$P{m70coRd! Nm(dz2G8d ػm.Y 3TAɢXaq3;C0bTWۓ۝]1'Xd5g8^QGzqDg(^QgGG(bq3dDQU|nZ%j0_~N?cRtq #GA0!NN,CWa "s&sd]MQ #,v(q"&ŎtQb's)~OrݼutgdJqC]lZ?%EGjyΰ #*mN?6!lsL-Rԁb ᘄƄ_`$V|0f[iRjʍP n|?@2T҅"#//t}0Gi^ev{[할ʺWb\S/Ni?f NDa1 !~51zep"&(TE^lyJ$k: TF(X+ҴFl2S_ ;abcpMRMlNT'C9FEEz)7B \/lDJΡ+eu9^V5SޛӻO7ƳƉzSi2Vhd7,[luk8 o> stream HWZH}<KK`EA]YGFAݝtt7NR+ YZƧ=0d3|^fgLOd$(Z~]Kkoi#~Scjd~|JRz =VT}| U9(o^JƸ[Aj+XZbCWۚz%:Er\ >Cp:!;܍iOl4/2Ŏm61௝bd"Ajf%EV{s1XؠMF#IMEMwe&C?*YFP`}H{ c{X0M hl< cO r: cD /+X]%B% $tVY5ri4;` Gc=M αT/g=^ݍq;bݕSpze.u'^o R] R9^[<cA`,,q=a`ەE.cS迂. +_u@9'.xʗzmQ\#x s[A1APF RO4H j: OZ`4.ȋ({7ɕЦ?.Bl}?826t n;/ @Fg,"mʾI|VX$bLv.g4!믆G+ ΫHf:;-LJ#ܳ qvcGO? VgDqzq5 `w5=e1Hl˽ubMZǁ+PTj+bXHDzzH z[ۘ.{7b}(XFFNv}Z^{9'_}Œ?,Ȼrc}Ҕ[ rƕdH̱1|ЬJf/ጄt࿱$ :mЛ^$,;nݝzeo1P~zn;nAEϧƲ(@JVV+ j"+LKwL 1B2 S9F#f M*n>sʅR|h# j6*u ИT͒*YyIZLabU`v/$Iw뮤tbO%A3%U#F ѳW{ߜؕT5x@VR 9 ƾ+)vڇ&㹒jsNu^l?@meAYiC6M"؆S1˃!0E6c`lCq5܋"?TI>N\ΗbN Qe +vBP#c91)I&-xIGFFHI|d )\ zńFa#Id#-l9{K;W 4NI;`-ƷS?,o:哂[̞*kxն$2;[g2"{i#J e!!-Flnsk[ GT WAƐ),/qr\oqK>T+\g XkL;JH>s aj "Ąa5}K5%p1r J5(v[Ms"18#V^o">N,uL3*ߚwx`Wn.λ1FNLPӚDuì=_nf3͟ѬZsef{I=ڣ85j%R-GKi*E1]=1Oߡ4>e3$Va:a4J͓b/* @Hg޴~{M>]Uag; קlW9d8"iiB/>NSTQ"ӕYTMh4I 볭S/<ǝ%9!޻NHxDwZ Nr1;ʧ($?(Bh;HF4S^ 1R7uJwXӞ7 $3x*,zֺFN_hO8WUGܨ ^ dZɿ-jijI+nUZK!w1Hb{_-X5=8$nz-<*81Nρ}\>kBK'Ж(Ol%䏉Nif2W"B3BOOYXc̖vXNaJ2 1z =' rt:h=$X~6̥&AoI{lP0s8ə[ uӵ'(9)K[OIXO?'Cڳd,#˾Ʋd,w8ƴC2?$c1mjW}% _}裄Y&NOI7eǷa?1cQWe vG PVk@(FiLG(dn3sKh|1rR24&,Jڈo^n@+a@S JME1\Xxvgs&ӕz5fx6?B"-,\D,@ .vI"V hG u\<] @Ó0uJBUx.]H]w?Uޗ,E?BQY\J}]r)2S!;3 ?d]ν:g&+dT^*rM \\յ.)7U%Ӕb w:Oif$ɔdvz:$+»ZK2M1],$4Cm/b}CoB{s5`Rl#V=qQ: {mQ:mvqz+K靻@+8SmnNBkP0f0 0L oX5jq8!(U[Qx趗ԻhsJ%gB"R2҅xV,&anPKim_2eKf^I@ (ڀr 3 4z[09GZxU7b?* b10> db!gOQZE%B4]CC@R; yӰ89`$l蹖= a?OCl iC$Tu84bqi^0,L+1ΫD<8 ]z!?d{ccL:WʜޅD~9mJ54;#N P,gci8pՖNHm-eŪjޟH68ak4TNrWhh']ػuV=ۊI +ua4TkL`k81 +Ԏc4WX S05M}AFleςpTK0lCk(ZC9ӑ7LjuЗFczlz `=X,. YÀ 3`\~ ̙YHt_RtPAF +-Ms}jPÜÌľPtCqr"֌;ξ˰X45ձ=hOntq 1.S8[ѕSw!P=?KKY]|`x7"HVf{]̗c#CG3|ƱN;ub\xSOoׯz\ՖX9){nW{>8ENyF>[6xѣ̏wHBC۳]nV jT1AئD1o}OBZ_t%aKl:ŖKpmBŏt@_DCr&\iiG-~n0? /\/gZykfYER {|?UoR>72˳'/.C,W*\9~s.1g>{F_뷺ܫo' V*FBrB3Wh ?/V@#,\ci׶wÕu2WhŎ ׀` Y2\ D r/zU`_Fc),3,L~SѸ),ݱW/cs&0}J)T4aNJ !r̍tOwb4 7O&jqp%c>֥lߟiS_ _('FNNK+a~5TrhҖ#{뾚a]qp[WB{9y BfU\!!D ] Еz+ s$F(HOf #l8XjJbyOsپK[7>H<%AĊ쥴 ¹2CUZT1GUsnZw F\Rr~ξŸ)q -e ]g6C*П تU&f^ÑDtڻ,;mIZК'={{#] ciy̓aHhIE.$> :d إ'J:*ip%(TNJD M9Ă[Yˢ5 {AyIH"߸?d I@POPxjCjʅ2}$DDVƷMf[X\Р7c\nM.{TJnܠ `KK[X|v6V͗N= u RNN8[F'zun'k'{w0  %!4 _ٯ$˶ e-霽O]'p>]W Iv8 t>vpsgX m{4?; ֦z><ж<=B.ZNX;= ׼!H'wD!# pCA@\@^CAH^!z eRcK*Y >B`nyh3 86 H\C:"za00SwP?&J*A9 B=•J2|k-W/+e]^Wоs .G8Fc9&K'G]c!S8& i|=v cTHTBYOQ<P~\Ѭ  o9r+1V?MNI~p i02WR'$zr a}/ZsG:]`;&4,05xm?T3\AiO;WdT-&_NiƄ$k8l@+uجW ;Teڐ@+)LY56]Uk(~6vPkM+~|+=;xQIXӭ`-y0Zco>urw7p饱A`,vkjѾ0{ d ij ߚ^/B4 &C lZ\/ 3YyHhpGXwToS(M@y |WYHXfYɐ=lk{#W ݗ(^Xp~,CVX@C Oo~:XlPFr"PU2pJj(ssZi ;iO$ _rs>]Wϯ_'sښOtz3oSXW6ϣtLrEm48vyB OGG7)JȝLHm=N S]d+u:j&Ң-J[ܔRg9BCi ")_kS8]%OiJ_SXIz5FeB\|8#BxhCǽ%@eo?*"<_W'B'O` 6&<^8)(!AG/޶Mx{etqL&n! ¦`פ2մm*IaچqThYrrG.{84\8 A} xmi(Q)p Kƹ4[[* kT@g_,\$֮U(`CMM;u 8'%\ߣgQ(@ϰv\vwx-Pe+7r-b`D*Mn~Ԥ{\0*D]nt^2l+ Q%Ak= .(nlA=--3}ov{bk>~كdvXjߤ6s}U%=?c?JZou݄#uy@>"cd>X@\|~qj@|v|kMߢ[k] v;4sʄVԂ#&PVx]ngl .uPh>`kUO$HviwOz:CYP|2T# mh8 V𝕝`xS.{ 5ƒ"dzc`f ܯ1تpS/t\%{Ĭݠj@]:..О P.p vBVwIj` (..CG ln;0Rt\7E.!!]R\ ol0leK }kNĽh% 1ʏE"~dG& K1x`Ō501IhNTD⫽+dc~w`k*O6~z$LMMuկ~Uս5HS >Ӷol;<7_Ԟ^ȉ6xw[;4o[pY^EpКe,WH,,l)lqR{wmr12˗rmk5{-Nl"kKsW>}Y/ {c/^xD3 Q: :ň}s`\#: ZuA$01IF;a_Cb Nd! ȎM EW =LzOÁ{7 F_.`FX A4|*]* TyJir,}k|B{P.2#bY/"J' Wڰ+dT"gq8@Up'l?ΞW!mJͰ[nȧŷD.^ 0oS3`l܋F,1 )Y=s@\0"EQR7h츩2* K@kE 9X$iUS:f0K {O*^Qe:%BH7#ET9&Ug!8WQ Su+Z'/6nrt0/A+m8C'.4u 0 NЪf_Fw#MqxIUHH0XLs-zvw/{++Gtu|ܡd=ObL6St>ɗՓ&ۨge8#?dl7Q^^]ꍛv}l>7ه֢{{53]{|a-{Pf˦>})=lM*N['ܨFOz@>U?a{h7OҖw9_*3أwux|6rmV{|m^dGb6V}`z{4oݎG叝\\z mL V%nXF-7ЃJQZp?^3ۧA+V^Z/GJ^[[YaN~~{V罳o*lYUmOC SPD;@lo:׮s䯑/XHhjDY*/R7ӿݪ!IEorHRZ*j'yxq c7-}VC)ZorUagd{&rcPt\ŒEbR94B֋q֛017v̡o%HGUI_=?=MIa! 'BUͻh@5FT2ʌYaSrпW7ō 5g 1tUEIkYsU@ܲQ̒llí@쑏E2NLDLrZj0gC70_hF;E 6 GD۝^8ouDho|\*R&qJ#UUm,~%A 0R ЏAxyCi'VE:U _] HMU1PnBb%gQLۂh:w3hR+)` 3R#K@`b u`՞]UaEb._DvX{[9!.}/h8C;H*Rޛ:~MpTsSAJ[jIhZ2ͪ}SHX]fȯ[Z/9 ?0^/:$Yl25Zà~4enUScG@G`g8T<[a0Ρx<6O^HBY +fÖϜjycK'zN",(3ʯ2Xw\[:6냋PJr-[X?\_;!6e)2H;p d }ᤰyCԿ]W7$̄"a0 ﳍ>)A!>R-{ qSy+X5E&|i"˵$mI=&\Pڽ"#y߾7mJDl Ld[%7i ۶R0oI?<,3>}A[zç mF}Y޽ 0}+ "YC_+}Anv ;;]M3NU:zCp#25& ~w.*VkV-rXk|x?|&; D{dMڌ9aE;h&b۔?:=<~ԼwWlX&j6 B5N[l WH7Gp  RhID€DfHofR\^lqƟLXbV ;XgepZ[ 1V6!85jRáuX [lD#ED %HPBK6_cmJLKkS#>j>jWlnj..^;/^)ع[(pGSN.vms1y-Ll@gm1$Dw87N-p˼{~&KtR!$rօ7mS0piE.Tax9n PxkW,pѰk (æ܌ Yi=WUwuw4r%]872]5%{qKx3S|OipqdwQFه jprzj(%\/1h$Q*0n.6YGvqKImHud,M0[?{Apj}EF3rrތ.S^4=Ϧ_=*.GB:]QQZnS.SՋj5Vvd\[515׸yV*yO39S/~HmB-G{OꦌR9'ۇ]@r~+vL.-zC.kt*mxZF *PTautA:`꒜ɍ9W * {b%y݁y}vs hWh3' Ƀ!H8#p3lp7F<fHVۤ>R:@j3{;iagZt"k$F VtIF3[P#G"ci8}IԈcxK n'O `? oGИ[൝.Am5/ݹiɃ{q/"`K]$QFlTIe4_:ޮ3oPen{ӝoFYlE*ϗɤ(Op:͐[$+YV ̈́'(w>dL l{I+N1,wbk7/]y)1$`D|"02ҴE X:6GXx$V:c˞Psr [ ,F[]|\}/[l e+*E "ɌӢnf&)H}S$ͭJ֗wI %"eh9b}?6zV6i. ¹\+Lc-bp!B}k"Dwm[v=e~FhH'p $Z+B׶b% tИ)rN=%=-%[ZWn ³CI,_+d~a "# 1S0/R +MkWoKbV֝Qpp+(5ü3ޖe!ٕN'?ƙC~H"qc/اvKse5;N6Ql H5+nY_n@'yfq 䡝~V`raEIDr2Ěn$jY^=2z[ _IڅEOTR.鮨tJ7)"-}F|A8ʼ8u?S hc8; Es0l@/<,7]>,M7kޕ Fyᬷ γgQTGt jĭ6rm}nxUf<邢@fmUȺe-7.3>}PM!qxz/Kc&ËkR$r)uت.֫pa}|"<7a'4,"eih7;()I JݗTh&n@ el\w18hL@Pz̺pZ͞M"̔\'Ͼ]+^-me}6d4kH̤|֝dUycZzAgZ=̘?8zTPrm9QI ?؛M+=XO^2J&/\lyEd| ֝tѰy7KV7*acj̺ٞS%[/56'f{~j^S彼^6o#|hxUyN_so՚O q}pz͉.Zlj2E7)a12Ey~ug xB^̀}MM-gi;=އqAfm4P/ ng70KOpٗLV)C.0ekpJo<v?P*4  ^;c*km Ϋ=&EXeSlَ9cvyYq`v~P:WDx(3̑ڈ`%e˾:+5u{&:QX1JyetH>R5{ED1n`FvBD b APnU,Vyu "G-a|5gsL ͥ.[8YQZv8*npnG%x[{/\oysUhCQXj P,Zl4;\=kJMq"cƨvg{^꜊7F#K+h-Ǐ)Q*tMczU4HOvW'6_>,=[-ڿH=ww,8Y<;@]Cjj\q?i:s yGt~p뉨Q.z"H#t{o)^ RE.J䟻*{@7klOHͣklX6 CmzUu[56 G0)iC(Di'I;Ug1Zc<n{aEW 6/p 7XU{#r}pl?>b)W{ J tl0ahydW@U1']7,q ݮsT} 5}Y,տߍef0Bټu( ).ɖָ͝> {j& RCghO=7* {$V|\T4js ;cТy.gBu`YIvYz(,agħKiVnIߖcd{\cƄf%PȕZ9Y@0kYݥ:حv.R /WZ =y]s:-Pe͑}u!¹0z%z5Y/WhHqvrzrʐO_hzq/ľ4\^p?^\lիw5 뵃TeulmA8}_K}~ŭ45^%d Nb~Yr|<]O5f'nbUo ̱ccY>Rr[fh*t>wy6zӥG#E{1'UW~k"APjzxW:r$[NȜA~gքLhѣsX12rK'j<ܠ+D}/N~Qqe縵r~=uhuNoJNxƸ)&FYx8bUhߙ\)V#ْ VLjEPLѰ?u kx F5܏Ac*K>Qa `0zCeR:EP18#3 ˨G], 餋:H> gwSLyR]=±z|9یvb0*c3,5arֵ#W)xwRXPFyTYB 0j]!^NQqE7FK!2_`%ܦYRӈ^ i7z^o'NY9\݌ jm3&`#_Wh0&Y mX!V9҇G/Mx\h ~CҨ_!+WJk=uXV ::H_i+5̟"D>q,\ ׬C#T(/\7dryg3&l1K8a4p2} 3vV^pil<̗ۆVf=Ya`Æ9kYijH6rؽ@/ߛoqw ,hyڂY4Mh0c}`uQ/x@`WH:e9*;!$APf 님tC+*-+͜X('1c?v[QBs:c2=e59FcUU(!AH0 Y "$HXku]xe":W"€ `kc-==EX8ͮfT3,QAʵ͑IpuV$̩:Y.Np+sw#>4Np:w|'zPYWZQ#\:?p-r:g#/|8ph0ZvOΝvN&ۓQVy ӝ43 Ё. 6}Lc d.9?S"ڻsuZݕD ,l͍֕8qX U!yA=홄RÞN&s[^uο,x*:թ|6Nf3MMmœM0윒b-)tqv#JYIdPBwjMHo\} O\ o~x5pd5Wt8|(GpTCa-݄YV'D8Hw5e qv S ޞ>$ؘ.tURMl,aZ#e`.RەC@.dfk\k g$ aۭ0#qI-nlK5\ݵ=v%w\pcuRmPTUO+T )Jt%WB ^0qJ7֊,"бd>x/kNj oU+Ξ0զowMvZLkp9ƚc,>՚`+8?(~N2|u:/GsUKklbC~c`YT")@`+sɫJrx="V4 Q4zf ȸҞ\iA4FC0v*jw.3ƚIJλ=b}m< aCsnCUϞs\Ӕ&7gŴF{mp_MNJBZ\!9_]i=_DZ~1H˴f_qJ,<8&[RJ)q/ %]ҔF6!Cnrƿ$e'>/vPnTo0vɭ¬[/|*ca~0ºhQa.WR)F+rgUw?c)-SkVocJ_ߚy<l4~gY\Un_jti<7">ir^_D\VԞbhSһU!ۏPmyJ"wgseIRw=?& ^0*+"I,B0 Ex+x)6z@h9idO E:Ռ0KDF.nHow5`` )T^Yʹ{k`mv#8լ NL!OM5, xAQ=HxU񯜽E\+VEf|^['5FeVocbm6]!u-.L,Q*nlϒ91UYnj.' ֹ'#CxmWX|uK#cUU0!$"YE1*(41%\go*F: Hnfz() *ru q2Zf\+L0+ګyoz\3WeGoܧmFӡğ ~[^ޞ|K\Y R[-fiV/,M![3Z9T-dLmڠc |T"%G^M~{]ZppS.ǃdNι; ^ݠ0u!%^}e(QaOnLotowݩWd'\-ų^r05[)eV(gb7! ޻0b0H0\ԁMg]ƛݘ 0{E9AGعPFu ԔLr`UȘgm;ʾWzߏKL轹;X%t3=,V[{|_ՃqiaAZcX0>vs=*NαKNWY(.H766*4ߤX` S 1B|blC\~S_[YGC͠ݭ<(-r=ðB'WF:5${w sUcFP+8HŻb}=\ܻ®4Tm9S$.@q˶׫DyYWsg*.)N#UY&Cޕ3M* 41s ;T?wP >@sgo)~$y﯊dhlP.`7?sBn:]} HF&H}>%;`Ao~( :MΠXqXLی,/2&gvQTkX8=I /``0?_Ab&(ad m%yTA~yInlimğS,i^:cd?o?A/2!!kr(PW1zlN rbTTV*b(z{1+6cBUZLCOuAM^sS}rHVP9kk~&!"-~mCŘ/)6Djr(bUGk9!ZFE0$5Pv>Ց'X=5[rP諒il9 >ܬ?u w+: 5PegY OW ӭWZ OydLxb!- xQ,(yf`zp>Jޒ,A/Ce~>OUpieo ˎI3z h FOiDvk_fNu5z'h1ۍ,[gY]o0Z9׫o^SVlK:n2HRlHXD=nC%M(: ;ox%iI<@oS@1f@J4ICA9рO%! Zsd`P^~Ы80pM3 @(thQ%3Ԛ!vP>."}b) ׬rc7_]蠀&o\2Z owQzmԺWa1-ǩch= Nu޳럯a0A쿸^@|ُг=vp/e'rW>c{~dՖcb[r)aeBtfKqrrij^a>j}C' t9Dd7`d ^\slJ;+Osk*q'}0*1oÇYLa W5q|e"AgTIWŭs.X}¡j{:2tAk5˯ uFi(59o֌[0 C(afߚ io_ȍm.ǀ[ zѳժFf/|K.V{RsOju}^fv6&ԧۡA҅8veV?LŜKsh7;tQ離TLN}sj2ZGbk7*Rڕ oH+ AÁV&6nIsl!;z5˹?? lL54?, k0 FJS3Di"({+rgj$rz1* %J&Wa7ב{vm%,/(-sAEQEP u_̲: +kgDdĎ].Y} /.TU<(Q,DM_جHx~TcIg훇H\lJq[-v~Zaps Jo85xظ)Uhzp74l&of @*lvW?3f=7@?LH$n"(wUA.CL{M=/@{&I3*4RAcFcDeTZps~T*n=>u%'z>6)FdvAohsQ9 3& z~1j~ ,0Tcu5\J-&w6L=5%\¬F1=/ Գfm[}.Xbs0-a(_tc"S7]?ov|;'CDBGC.vH:!y&&9Dit̢HfO$1> =?6@Ŵc[|boccG֡l0+EkzJ-5/d1 Ʈ+=Xm,Y5\z.v2 } r27 Mk`dn`A? zLZ0VX01®řz ; v4p#w}ݿퟛGuō沉D9l`X 0$?tk;xAжrϜ 7Aʧ#U[ee.3wTD#XvE:tDQth:<,vv`;~ I/0zq1 smLѓ+~US[g|l?~ޜ1Ftv%]v" UqwWb \hЉ@0VmL  N]/KwQ?%؎a> stream HM7 OPw HQql @/vGnPR҆j] HIE*@rGfR9ˀX%78*`m$3çt٭:1;Q.2ڋ'$dH5uF ʪ5`ToxKO8U<C-D} %\#`.9a.T93y" ہ`yxvG뚖\Fd=XY"A͋ʰ\ 3=YNJӓ_'M2*~ͨ2tfE6i:V"d ^?飯LYva[kG}JKjdoMLuJ;r߭"ECJDd1࣓+zJS_SsŮ)εĪ^J xo1[W {-8M \W d{* 'h0AI=4Ĭ}O+{_0wW.N#Bf++#}I.&[䬲MRhO0;8v #dRey*vdQٌPܲlֶȶ~t2-LbW'F 'uDN}OZ(.fY*tb>@{ 2]_Ygn,y\?xfS]B+ocGNW6_ld ;,eHQuic}t\gʾưԈA;U4NU;3dg ߑyީ3f?~3UVqV+6mOY.>R )"3݊61]GuԱ܆0B_۔'֎g A#>[Jy^cN mIegqe62'X;t{3ܦji !kvPuFca.khg־8NWbݮm>XEAE!3”eZ `n@{<,\-ۜA"ꖹ-9GI_X&q8nU;$^C?cb}@6A{%K(v( f ;-A2Gqe靖i}_ ?b!gHWY`p:j8AI@T0Q8C5{Gb9i>. @mdx.KQ^KatnM}g$ Gnvv+9}0^O_}=߾#z/ݭ/x>EQgĎ0D څO8+|][q__P銅t>nn?az|O2}݇d]~s?2 endstream endobj 21 0 obj << /ColorSpace 22 0 R /AntiAlias false /Coords [0.0 0.0 1.0 0.0] /Function 24 0 R /Extend [true true] /Domain [0.0 1.0] /ShadingType 2 >> endobj 22 0 obj [/ICCBased 23 0 R] endobj 23 0 obj << /Length 2574 /Filter /FlateDecode /N 3 >> stream HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 N')].uJr  wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 24 0 obj << /FunctionType 3 /Encode [0.0 1.0] /Domain [0.0 1.0] /Functions [25 0 R] /Bounds [] >> endobj 25 0 obj << /C0 [0.0 0.733333 0.831373] /C1 [0.0 0.341176 0.631373] /FunctionType 2 /N 1.36471 /Domain [0.0 1.0] >> endobj 26 0 obj << /ColorSpace 22 0 R /AntiAlias false /Coords [0.0 0.0 0.0 0.0 0.0 1.0] /Function 24 0 R /Extend [true true] /Domain [0.0 1.0] /ShadingType 3 >> endobj 27 0 obj << /ColorSpace 22 0 R /AntiAlias false /Coords [0.0 0.0 0.0 0.0 0.0 1.0] /Function 28 0 R /Extend [true true] /Domain [0.0 1.0] /ShadingType 3 >> endobj 28 0 obj << /FunctionType 3 /Encode [1.0 0.0] /Domain [0.0 1.0] /Functions [29 0 R] /Bounds [] >> endobj 29 0 obj << /C0 [0.0 0.619608 0.811765] /C1 [0.635294 0.862745 0.913725] /FunctionType 2 /N 2.54334 /Domain [0.0 1.0] >> endobj 30 0 obj << /Length 12690 /BitsPerCoordinate 32 /BitsPerComponent 8 /ColorSpace 22 0 R /AntiAlias false /BitsPerFlag 8 /ShadingType 7 /Decode [-1262.06 487.27 -1262.06 487.274 0.0 1.0 0.0 1.0 0.0 1.0] >> stream  V dLk  | } ~\ 2^ AM^ ) m8  V dA sAI-_[ x] ao) m^ 2^ AM\ 5 ^s2] ^ 1 Eu _y R A   Հ C(I GD  U) X;Y : 1 E_ˑyGOw)iUo!bL%*W(n8-R]#fx9V| |pD՟])R Ay u _ 1 E e/[ 6e)(5 \+l i  cB!  )qz Ƭ`H UM 1INrHW =O% Gvw N!   cB i (5 \+lݽ ^F 6h^ O= *  {Q $Te! #w H<, w]{ Q_ VQ n 1 E_ˑyGOw)iUo ;79-߶ZE2ur/N' OKK(5 \+le/[ 6e) ˂'o߶ c J[ %(5 \+lN' OKKr/ZE2usP\3u S_5 MIh^ OF 6ݽ ^? yc-UErx\ 5 $T}  W LX) ~"Q3jU j]M oat .d) {h^ O= *  {Qѡ {O ~m?7 EV9ں ٠h^ Od) {at .]M o5 7v~Rt9cyXW~W 7 S_5 MIy J* (n8fTвr1OS`;Y Mj@J=_~b1!k[n 0I,Q)qRYǠ>NƱ1i;n 0Ik[b1!_~v6t9Bt>"iUoo#oOlȷfb V iUo>"tt9BƩ_W_'4aJ9.eZE2u9-߶ ;7C-- Yu,g~ZE2ueJ9.4adx8k l@כdXxa HRvЈRzD usP\3)qz)iEYFD0 ~W 7yXWt9ctWWO V_8.f`F4Y)el:pe=@כdXxa HRvЈRzD*SUKUb@UkZASS`;uZxWW>xUQHY:_~Mj@J=Y |(>xUZhV|@_~:Yt?Tto|}Yn"Qt9B6v{etXc`F<33sCl޷t9Bn"Q}Y|BC̽x#Ğ?#P90t*K4aW_'Ʃ_dQ5Cu,SQm-N4a0t*K#P9#Ğ?[.hb5r# 5n:I#>@כdXxx8k ld:'qi(6r,*2@כdXx:pe=4Y)el.f`F' %q"Su"/Mr"(H.z5r# 5n:I#>3B$-W$}) 䀚/'5VuWoO; c;aU'"~19Mh'UQH>xP ;Smf޷ULh'9M~1rbUA yiBpcA(|Tz|tot?Ttmc(mOϴ||TzpcA(yiB֎cy@&'<y#U`q#Ğ?̽xBCV z 6{D#Ğ?#U`q<y&' vN?<(W!4R$5r# hb[.ht&XchZ*c̣5r# .z(H"/Mr"!S(Ɍ;V1B$H\ N?<(W!4R$.]R~(GRy/CN5 ~ cB N9ZPQPW<@Pf[XZJ~1U'";a;B<DWHoWzW~1XZJ[@Pft-g6|#~s|M⺀it9iyiB rbUA|Bt@}?Wtٽ<yiBit9i|M⺀|#~s S>׬NB5On5HI R&'y@֎cc7qC›D;2Xl&'I R5H5On{Q;SXz SOux?"N?v nM{KjɓwM`N?H\ B$;V1eArr,RkxQ~ePSOux?"r[@llnu@ӆy^QW LBO _-s -U ԇB sA ׇ/ r wM eʨ }L Y Zz k6 1) Tʫ Aʨ }L er wM/ 0 O k @([^: 5; |B ee/ dO J~ x ] 3U ԇ} X?J7hksӴ[B X?/ A ׇB s< UƏF C / B X?[[3t[zQvhzp Kk @( 0 O d9yG\d QB e1 9$K YAl n lfh D5 MQd( N;] >.1 k @([^: 5; | qJ}E R D@ 5k @(1 ] >.( N; O* }rM{>O3t[zQvhzp KB+ C- RRK9[>dwcl n f. `OG Zp xZp x>?J 1sVՅ%`EqiɽSrMQx :lb ft +:`OG Gd 4GQ 7~EzQ9#t9c'M@戊ERkqRxr[sӴ7hk3-N;fj&il[RxrkqERxiKSKk$XS_)h/1u{3t[['y$~6Pw3/Y,3t[1u{)h/$XS_bu"=mn%pšŤXr=ˤYrM{>O=F_V20)C (rMiɽS`EqVՅ%VՅ%U rdQe[B7dKmn%pšŤXr=ˤYiK_`Eq^zgL)Î~t9ctWWO V_8.f`FO{~9}GO=Ks H_i(cnHXkER戊'M@E`eX'kymAdERnHXk_i(c=Ks H ThQS9J`)9*s $XS_KSKkxiSMC͝XC [W7$XS_*s `)99Jr7QA9Ϊ4$ZuZf];T gCjww2CriZfuZ4$KbQj̭ \[!*+mn%eΤZoJ (~{>x$E&Dtu"_mn%dK[B7Qe=+|J-@CO4Hڀj̭ \[!*+R+_PF ~C;tz.f`F{̓S5;V1Ї~|8 up0L*XA÷=Ks H~9}GOO{@ٔhQGYGBl? =Ks H*XA÷p0L8 u6Mr=`dh`tBq9JQS Th2HdH}t9Jqh`tB`dp+<`R97g:Ipts~0;q4$QA9Ϊr7XojM< 3,5x#MG4$0;qts~:Ip"x"VZ"+7]]j̭QKb_.&>R*79wj̭ڀ4HCOR)1+BVSw VZ"+7]] .خ)%+8;V1eArr,Rk^hheEeR$e:UYe{;@8 u|Ї~^gSCjc_N8 ue{;@e:UYeR$!͞@b̙p(gXd/`dr=6M#): VYN]~Wx `dd/(gX̙pav yD sz:IpR97gp+<`v0BD3˗:IpszyD  nkcd9mRbYL)RBO91kVZ"""x]<YLgnM\4K,=lVZ"w BVS1Y?0Xy7N/CQMMMhYL)RBO91k-g1#}19<*FqҎ9ZPQPW<@PfY. FYэ:VDg;by/W Vi &y;bVDgYэ: kާ =ZRSxF|vOeosU5/\T y7du9l@Pft-g6|#~s|NWx%tO2po_Yэ:FY. t$dNa(pK:HjmrTeYэ:o_ptO2oӱizc>F e$=Zާ kl6L|niF ҘvOF|RSx=Zأ25Xi ݅ՇvO4]> 50U%WQl PZ3J& O4]>ՇvөT]Q#3+hN0ӂpAoN9(N=#iR=Zn} LY҇v3+hVf; @WӞH>J`V2c>F e$^QjVZC !}։RcI|#~s S>׬NB5On5&ԏ1X+-9ӹ tO2x%|NW,_}A&vTPO8 tO2ӹ 9+-%ax+biodo]D `pc>F izoӱ[)3nwU5On{Q;SXz SOu.-$+0;,4b-ѲP +-1X5&ԏZ'27.0-pޓF~ +-ѲP 4b-}4y7wunr^Mf}bix+%am6tY K-\c>F `podo]Dbi D>iO XP+ QyV4^]mZy$L29g;8_;>@Qy+ XP 0z+ ,ILXGƒnH>I|NLSR7r9Mei;6bi^Mf}runqNl2EiW 6lf Y iO D>DxRr 5#EK%c f YliW 6eG&c1k b"BNb"BNG I,0z+ )g3#ӣc1k SOu~ePxQr,Rkq'oDl*هsJ(ly}׸4b-0;,.-$+~&"xi&vX|}4b-y}׸sJ(ll*هinne#ca qMh0p3Mnqo!uny7w}4vp7b)l,vpr>unnqo!h0p3Ma qM]RRbY(6Uy\(Nba`#iW 6l2EqNjSPMncP_H5`&f)4&iW 6ba`#\(NUyQO.`N/T[fTb"BNc1k eG&_+$X=UĘJ\vRr,Rk^hheEeR$fI'RcN^=eO;Fl*هoDq'/>:c:AB./l*ه;F=eO^YًhS[RL2u:__ZVa qMe#cinnW?{Uȗ>neR$!͞@b̙p%K9: |]xD?n^cNfI'R"v3hM@#Z^D?n]x |MV`*m3wgR=bL2u:S[RYًh.d9\8}5[za qM_ZV_L2u:FDX+?N>Y9)W<7=UyY(6]RRbn9khQnYFDX+/DfͲ ~9+cD9)WmmƤ٦/Tօֻn/0+ 4T9 `TfXf̙pav ]j1|^ +=V |9:%KH1`@~զSn6} |=V+|^ x.(q[{8jG0xa!fЁwgm3MV`*g/'JRPm Y nkcd9mRbYL)\(n\Z4czlE|^ j1]q> endobj 32 0 obj << /Length 96 >> stream q /DeviceRGB cs 0.000 0.000 0.000 scn /DeviceRGB CS 0.000 0.000 0.000 SCN 1 w 0 J 0 j [ ] 0 d Q endstream endobj 33 0 obj << /Length 540 >> stream q BT 36 741.64 Td /F1.0 20 Tf [<506c656173652066696c6c20696e207468652066> 30 <6f72> -25 <6d2062656c6f> 15 <7720736f2077> 10 <652063616e20636f6e746163742079> 20 <6f753a>] TJ ET BT 36 674.264 Td /F1.0 12 Tf [<4e616d65>] TJ ET 106.000 667.880 200.000 20.000 re S BT 36 644.264 Td /F1.0 12 Tf [<456d61696c>] TJ ET 106.000 637.880 200.000 20.000 re S BT 36 614.264 Td /F1.0 12 Tf [<436f6d70616e> 15 <79>] TJ ET 106.000 607.880 200.000 20.000 re S BT 36 584.264 Td /F1.0 12 Tf [<50686f6e65>] TJ ET 106.000 577.880 200.000 20.000 re S Q endstream endobj 34 0 obj << /Type /Page /Parent 4 0 R /MediaBox [0 0 612.0 792.0] /Contents 33 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F1.0 35 0 R >> >> >> endobj 35 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >> endobj xref 0 36 0000000000 65535 f 0000000015 00000 n 0000000656 00000 n 0000000721 00000 n 0000017528 00000 n 0000017592 00000 n 0000018358 00000 n 0000018894 00000 n 0000019427 00000 n 0000020050 00000 n 0000020669 00000 n 0000021283 00000 n 0000021872 00000 n 0000022478 00000 n 0000022963 00000 n 0000023114 00000 n 0000023331 00000 n 0000024253 00000 n 0000030657 00000 n 0000046578 00000 n 0000073069 00000 n 0000074614 00000 n 0000074768 00000 n 0000074803 00000 n 0000077456 00000 n 0000077561 00000 n 0000077684 00000 n 0000077846 00000 n 0000078008 00000 n 0000078113 00000 n 0000078241 00000 n 0000091160 00000 n 0000091287 00000 n 0000091434 00000 n 0000092026 00000 n 0000092207 00000 n trailer << /Size 36 /Root 2 0 R /Info 1 0 R >> startxref 92305 %%EOF ruby-prawn-1.0.0~rc2.orig/data/pdfs/indirect_reference.pdf0000644000000000000000000000216012114176157022243 0ustar rootroot%PDF-1.3 % 1 0 obj << /Producer (Prawn) /Creator (Prawn) >> endobj 2 0 obj << /Type /Pages /Count 1 /Kids [5 0 R] >> endobj 3 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 4 0 obj << /Length 8 0 R >> stream 0.000 0.000 0.000 rg 0.000 0.000 0.000 RG q BT 36 747.384 Td /F1.0 12 Tf [<5468697320504446206973207573656420696e206f757220756e697420746573747320617320616e2065> 30 <78616d706c65206f6620612066696c6520746861742068617320616e20696e64697265637420726566> 30 <6572656e636520696e20612073747265616d0a>] TJ ET BT 36 733.512 Td /F1.0 12 Tf [<6f626a6563742e>] TJ ET Q endstream endobj 5 0 obj << /MediaBox [0 0 612.0 792.0] /Type /Page /Resources << /Font << /F1.0 7 0 R >> >> /ProcSet 6 0 R /Parent 2 0 R /Contents 4 0 R >> endobj 6 0 obj [/PDF /Text] endobj 7 0 obj << /Type /Font /Encoding /WinAnsiEncoding /Subtype /Type1 /BaseFont /Helvetica >> endobj 8 0 obj 360 endobj xref 0 9 0000000000 65535 f 0000000015 00000 n 0000000071 00000 n 0000000128 00000 n 0000000177 00000 n 0000000590 00000 n 0000000737 00000 n 0000000765 00000 n 0000000862 00000 n trailer << /Info 1 0 R /Root 3 0 R /Size 9 >> startxref 881 %%EOF ruby-prawn-1.0.0~rc2.orig/data/pdfs/multipage_template.pdf0000644000000000000000000000306012114176157022306 0ustar rootroot%PDF-1.3 % 1 0 obj << /Creator /Producer >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 3 0 obj << /Type /Pages /Count 3 /Kids [5 0 R 8 0 R 10 0 R] >> endobj 4 0 obj << /Length 92 >> stream q BT 36 747.384 Td /F1.0 12 Tf [<546869732069732074656d706c61746520706167652031>] TJ ET Q endstream endobj 5 0 obj << /Type /Page /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F1.0 6 0 R >> >> /Parent 3 0 R /Contents 4 0 R /MediaBox [0 0 612.0 792.0] >> endobj 6 0 obj << /BaseFont /Helvetica /Type /Font /Encoding /WinAnsiEncoding /Subtype /Type1 >> endobj 7 0 obj << /Length 92 >> stream q BT 36 747.384 Td /F1.0 12 Tf [<546869732069732074656d706c61746520706167652032>] TJ ET Q endstream endobj 8 0 obj << /Type /Page /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F1.0 6 0 R >> >> /Parent 3 0 R /Contents 7 0 R /MediaBox [0 0 612.0 792.0] >> endobj 9 0 obj << /Length 92 >> stream q BT 36 747.384 Td /F1.0 12 Tf [<546869732069732074656d706c61746520706167652033>] TJ ET Q endstream endobj 10 0 obj << /Type /Page /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F1.0 6 0 R >> >> /Parent 3 0 R /Contents 9 0 R /MediaBox [0 0 612.0 792.0] >> endobj xref 0 11 0000000000 65535 f 0000000015 00000 n 0000000109 00000 n 0000000158 00000 n 0000000228 00000 n 0000000370 00000 n 0000000548 00000 n 0000000645 00000 n 0000000787 00000 n 0000000965 00000 n 0000001107 00000 n trailer << /Size 11 /Info 1 0 R /Root 2 0 R >> startxref 1286 %%EOF ruby-prawn-1.0.0~rc2.orig/data/pdfs/encrypted.pdf0000644000000000000000000000264212114176157020426 0ustar rootroot%PDF-1.3 % 1 0 obj << /Outlines 2 0 R /Pages 3 0 R /Type /Catalog >> endobj 2 0 obj << /Type /Outlines >> endobj 3 0 obj << /MediaBox [0 0 595.28 841.89] /Resources << /Font << /F1 4 0 R >> /ProcSet 5 0 R >> /Kids [6 0 R] /Count 1 /Type /Pages >> endobj 5 0 obj [/PDF /Text] endobj 6 0 obj << /Parent 3 0 R /MediaBox [0 0 595.28 841.89] /Resources << /Font << /F1 4 0 R >> /ProcSet 5 0 R >> /Contents 7 0 R /Type /Page >> endobj 7 0 obj << /Length 94 >> stream (CQ.[VZY/r|k ]Wۢ+I qJ)"%EZm*w<){ЮuhK endstream endobj 8 0 obj << /Differences [240 /aacute] /Type /Encoding /BaseEncoding /WinAnsiEncoding >> endobj 4 0 obj << /BaseFont /Times-Roman /Subtype /Type1 /Name /F1 /Encoding 8 0 R /Type /Font >> endobj 9 0 obj << /R 3 /P -3904 /O (ש[DFe'r\bP/_~\n\\x) /Filter /Standard /Length 128 /V 2 /U (ط|.) >> endobj 10 0 obj << /Creator (?ND3_) /Producer (\rxc`d;y\)m3c\n ) /CreationDate (j UhY`}:) >> endobj xref 0 11 0000000000 65535 f 0000000015 00000 n 0000000082 00000 n 0000000121 00000 n 0000000690 00000 n 0000000266 00000 n 0000000295 00000 n 0000000446 00000 n 0000000593 00000 n 0000000790 00000 n 0000000941 00000 n trailer << /Encrypt 9 0 R /Info 10 0 R /Root 1 0 R /Size 11 /ID [<9a50a636927ba6d5161926c05a44de9a>] >> startxref 1052 %%EOF ruby-prawn-1.0.0~rc2.orig/data/pdfs/complex_template.pdf0000644000000000000000000026301712114176157022000 0ustar rootroot%PDF-1.3 % 4 0 obj <> endobj xref 4 30 0000000016 00000 n 0000001082 00000 n 0000001142 00000 n 0000001746 00000 n 0000001780 00000 n 0000002312 00000 n 0000002841 00000 n 0000003461 00000 n 0000004077 00000 n 0000004687 00000 n 0000005272 00000 n 0000005874 00000 n 0000006355 00000 n 0000009003 00000 n 0000009117 00000 n 0000009212 00000 n 0000009354 00000 n 0000009504 00000 n 0000009623 00000 n 0000009718 00000 n 0000009868 00000 n 0000022776 00000 n 0000022889 00000 n 0000022963 00000 n 0000023170 00000 n 0000024090 00000 n 0000030492 00000 n 0000046409 00000 n 0000072896 00000 n 0000000896 00000 n trailer <<4E18BE5C8D344B8396B2B07B6C4C9940>]>> startxref 0 %%EOF 33 0 obj <>stream xb``f``(π YLYJ'}tبR'p+i+P*ƋX>2h;xP#>7D_j 3c}_ y` endstream endobj 5 0 obj <> endobj 6 0 obj <>/ArtBox[169.333 395.725 392.999 656.252]/MediaBox[0.0 0.0 612.0 792.0]/TrimBox[0.0 0.0 612.0 792.0]/Resources<>/ColorSpace<>/Properties<>>>/ExtGState<>>>/Type/Page/LastModified(D:20100423210221-07'00')>> endobj 7 0 obj [/ICCBased 16 0 R] endobj 8 0 obj <>stream H|Tn0 +kޚ͵0 ߗ%qIzo?|qen\l^9Fe r ,挬;BCJ0:ZBIgsFV٢OH B QegdݑetlNgsFVs3?MF0%ױF^3\盅 >Óy*'9g9Ĥ fEgRL0@yn* < Fw qY*UUم:_Έ1 Ō"q߽M C+b;>N7=7 73>eA5P5z!Q˪[7>}g8{V6NX!K=ŀeꃆfg|i,_ZYt P@u!TW"{O}y;Б2Iӥ_B]1JFR˿`= endstream endobj 9 0 obj <>stream HTSq,1 ˯ 5/^Q$:fr S(Ըh'Q_dϽ&y3mBU\@p[uAAw.I,$)K}bԳ{faNH dSvooy'Xt9+eS।!wCNZQ|ǩu'ػ~ -{\džx_o5(̭^˜65r`+~Qq$*2{`aJ%<= eNY* pMdƼ>stream H\SKSA ܿSނQ>BdAb"!q{NSj %Eg dbL8 ^IsLp& 1ʢ-Ҫ- W⨺]St0-Lbr޾/|!w r8$e}zkYܾ5hh2j XG.*uHm:|!vil@ӶGԯӀJYcrI}fG V0ʨg$, =w10! |\l @׆'Jp/ zBv{[R w+e~z0MGs8 5CӆP#>#LߊhPLx"XH`# endstream endobj 11 0 obj <>stream HLSQ$9 S/vl'3t㬍;ͫH iWULmYV1h#`[Y, $-ƉnfYGy6>0E6<o  b0q61gɽå<3lr64L[8EK|4)HX0{x0ռD( va; SK<K6Y 8 |=7vh*"\@xf䝯dTU_Jo+cZ*?)Q)S6rͪަ$DQh4"L7ʣ ͖)mYwk%:,~֔[cY6(CDdW Q,C2ip{qh>stream HlTѪ0 }WYm}l0 1` zGNڦM%H>cłؼ)w]趘q*{m5^s ҹjpm  X5H; T½))G4Z U(f u|\.W*\/w %^>/hw􉄾_`AjPG{mɥeu\T+d#`` .WTpAgWʇ~o?p1ܿ,;ҖfRΆ+\0%'[NbeUrceh`l^_Jy~wrV֛=)3#c cD{aDEYZr3O_v\#QY@ZL(/95緿18[NÅ8Z(3؛ Xsx+rF<ΆM @'|Oퟍ=yۇ0d#`-mqd/awB{C endstream endobj 13 0 obj <>stream H\TK1)C \z& v6c5F(<΋V}\iYsܻ{Ikyự/=Ek6΂<(GM2ͮ^Y%GfGUPCw |_ëxUNY0TnB |5bůFZ!}0 6r;V?ցa~g#[NxqZ'N~y|_ǟ,a|!sq Ş< ' e :ع8IpU h GsiJG@ Vi"X$Nh|70RD 1m[J?7|a_-\VALcV/LzWGohlfOޫ.5ByG `7% EQRWZLKt6uQra#/Pom+ ؾq`Jq-4#)F#]Co8ο #ߺ endstream endobj 14 0 obj <>stream HlT[0 )t"E1z~d?萊gLQN!nv2i髝夵=`Hl3}X;֔)y um:>܆*G>4y 3rrb>stream HlSAn0 HIyc 萶7̡ %]GK\7sk+tOGF8w_C9#ުϱs++LE^OKլPmd;.B*=xv]XTsn>fg4j>Pu|*A%+M>stream HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 N')].uJr  wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 17 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <> endobj 20 0 obj <> endobj 21 0 obj <> endobj 22 0 obj <> endobj 23 0 obj <> endobj 24 0 obj <>stream  V dLk  | } ~\ 2^ AM^ ) m8  V dA sAI-_[ x] ao) m^ 2^ AM\ 5 ^s2] ^ 1 Eu _y R A   Հ C(I GD  U) X;Y : 1 E_ˑyGOw)iUo!bL%*W(n8-R]#fx9V| |pD՟])R Ay u _ 1 E e/[ 6e)(5 \+l i  cB!  )qz Ƭ`H UM 1INrHW =O% Gvw N!   cB i (5 \+lݽ ^F 6h^ O= *  {Q $Te! #w H<, w]{ Q_ VQ n 1 E_ˑyGOw)iUo ;79-߶ZE2ur/N' OKK(5 \+le/[ 6e) ˂'o߶ c J[ %(5 \+lN' OKKr/ZE2usP\3u S_5 MIh^ OF 6ݽ ^? yc-UErx\ 5 $T}  W LX) ~"Q3jU j]M oat .d) {h^ O= *  {Qѡ {O ~m?7 EV9ں ٠h^ Od) {at .]M o5 7v~Rt9cyXW~W 7 S_5 MIy J* (n8fTвr1OS`;Y Mj@J=_~b1!k[n 0I,Q)qRYǠ>NƱ1i;n 0Ik[b1!_~v6t9Bt>"iUoo#oOlȷfb V iUo>"tt9BƩ_W_'4aJ9.eZE2u9-߶ ;7C-- Yu,g~ZE2ueJ9.4adx8k l@כdXxa HRvЈRzD usP\3)qz)iEYFD0 ~W 7yXWt9ctWWO V_8.f`F4Y)el:pe=@כdXxa HRvЈRzD*SUKUb@UkZASS`;uZxWW>xUQHY:_~Mj@J=Y |(>xUZhV|@_~:Yt?Tto|}Yn"Qt9B6v{etXc`F<33sCl޷t9Bn"Q}Y|BC̽x#Ğ?#P90t*K4aW_'Ʃ_dQ5Cu,SQm-N4a0t*K#P9#Ğ?[.hb5r# 5n:I#>@כdXxx8k ld:'qi(6r,*2@כdXx:pe=4Y)el.f`F' %q"Su"/Mr"(H.z5r# 5n:I#>3B$-W$}) 䀚/'5VuWoO; c;aU'"~19Mh'UQH>xP ;Smf޷ULh'9M~1rbUA yiBpcA(|Tz|tot?Ttmc(mOϴ||TzpcA(yiB֎cy@&'<y#U`q#Ğ?̽xBCV z 6{D#Ğ?#U`q<y&' vN?<(W!4R$5r# hb[.ht&XchZ*c̣5r# .z(H"/Mr"!S(Ɍ;V1B$H\ N?<(W!4R$.]R~(GRy/CN5 ~ cB N9ZPQPW<@Pf[XZJ~1U'";a;B<DWHoWzW~1XZJ[@Pft-g6|#~s|M⺀it9iyiB rbUA|Bt@}?Wtٽ<yiBit9i|M⺀|#~s S>׬NB5On5HI R&'y@֎cc7qC›D;2Xl&'I R5H5On{Q;SXz SOux?"N?v nM{KjɓwM`N?H\ B$;V1eArr,RkxQ~ePSOux?"r[@llnu@ӆy^QW LBO _-s -U ԇB sA ׇ/ r wM eʨ }L Y Zz k6 1) Tʫ Aʨ }L er wM/ 0 O k @([^: 5; |B ee/ dO J~ x ] 3U ԇ} X?J7hksӴ[B X?/ A ׇB s< UƏF C / B X?[[3t[zQvhzp Kk @( 0 O d9yG\d QB e1 9$K YAl n lfh D5 MQd( N;] >.1 k @([^: 5; | qJ}E R D@ 5k @(1 ] >.( N; O* }rM{>O3t[zQvhzp KB+ C- RRK9[>dwcl n f. `OG Zp xZp x>?J 1sVՅ%`EqiɽSrMQx :lb ft +:`OG Gd 4GQ 7~EzQ9#t9c'M@戊ERkqRxr[sӴ7hk3-N;fj&il[RxrkqERxiKSKk$XS_)h/1u{3t[['y$~6Pw3/Y,3t[1u{)h/$XS_bu"=mn%pšŤXr=ˤYrM{>O=F_V20)C (rMiɽS`EqVՅ%VՅ%U rdQe[B7dKmn%pšŤXr=ˤYiK_`Eq^zgL)Î~t9ctWWO V_8.f`FO{~9}GO=Ks H_i(cnHXkER戊'M@E`eX'kymAdERnHXk_i(c=Ks H ThQS9J`)9*s $XS_KSKkxiSMC͝XC [W7$XS_*s `)99Jr7QA9Ϊ4$ZuZf];T gCjww2CriZfuZ4$KbQj̭ \[!*+mn%eΤZoJ (~{>x$E&Dtu"_mn%dK[B7Qe=+|J-@CO4Hڀj̭ \[!*+R+_PF ~C;tz.f`F{̓S5;V1Ї~|8 up0L*XA÷=Ks H~9}GOO{@ٔhQGYGBl? =Ks H*XA÷p0L8 u6Mr=`dh`tBq9JQS Th2HdH}t9Jqh`tB`dp+<`R97g:Ipts~0;q4$QA9Ϊr7XojM< 3,5x#MG4$0;qts~:Ip"x"VZ"+7]]j̭QKb_.&>R*79wj̭ڀ4HCOR)1+BVSw VZ"+7]] .خ)%+8;V1eArr,Rk^hheEeR$e:UYe{;@8 u|Ї~^gSCjc_N8 ue{;@e:UYeR$!͞@b̙p(gXd/`dr=6M#): VYN]~Wx `dd/(gX̙pav yD sz:IpR97gp+<`v0BD3˗:IpszyD  nkcd9mRbYL)RBO91kVZ"""x]<YLgnM\4K,=lVZ"w BVS1Y?0Xy7N/CQMMMhYL)RBO91k-g1#}19<*FqҎ9ZPQPW<@PfY. FYэ:VDg;by/W Vi &y;bVDgYэ: kާ =ZRSxF|vOeosU5/\T y7du9l@Pft-g6|#~s|NWx%tO2po_Yэ:FY. t$dNa(pK:HjmrTeYэ:o_ptO2oӱizc>F e$=Zާ kl6L|niF ҘvOF|RSx=Zأ25Xi ݅ՇvO4]> 50U%WQl PZ3J& O4]>ՇvөT]Q#3+hN0ӂpAoN9(N=#iR=Zn} LY҇v3+hVf; @WӞH>J`V2c>F e$^QjVZC !}։RcI|#~s S>׬NB5On5&ԏ1X+-9ӹ tO2x%|NW,_}A&vTPO8 tO2ӹ 9+-%ax+biodo]D `pc>F izoӱ[)3nwU5On{Q;SXz SOu.-$+0;,4b-ѲP +-1X5&ԏZ'27.0-pޓF~ +-ѲP 4b-}4y7wunr^Mf}bix+%am6tY K-\c>F `podo]Dbi D>iO XP+ QyV4^]mZy$L29g;8_;>@Qy+ XP 0z+ ,ILXGƒnH>I|NLSR7r9Mei;6bi^Mf}runqNl2EiW 6lf Y iO D>DxRr 5#EK%c f YliW 6eG&c1k b"BNb"BNG I,0z+ )g3#ӣc1k SOu~ePxQr,Rkq'oDl*هsJ(ly}׸4b-0;,.-$+~&"xi&vX|}4b-y}׸sJ(ll*هinne#ca qMh0p3Mnqo!uny7w}4vp7b)l,vpr>unnqo!h0p3Ma qM]RRbY(6Uy\(Nba`#iW 6l2EqNjSPMncP_H5`&f)4&iW 6ba`#\(NUyQO.`N/T[fTb"BNc1k eG&_+$X=UĘJ\vRr,Rk^hheEeR$fI'RcN^=eO;Fl*هoDq'/>:c:AB./l*ه;F=eO^YًhS[RL2u:__ZVa qMe#cinnW?{Uȗ>neR$!͞@b̙p%K9: |]xD?n^cNfI'R"v3hM@#Z^D?n]x |MV`*m3wgR=bL2u:S[RYًh.d9\8}5[za qM_ZV_L2u:FDX+?N>Y9)W<7=UyY(6]RRbn9khQnYFDX+/DfͲ ~9+cD9)WmmƤ٦/Tօֻn/0+ 4T9 `TfXf̙pav ]j1|^ +=V |9:%KH1`@~զSn6} |=V+|^ x.(q[{8jG0xa!fЁwgm3MV`*g/'JRPm Y nkcd9mRbYL)\(n\Z4czlE|^ j1]q> endobj 26 0 obj <> endobj 27 0 obj <> endobj 28 0 obj <>stream %!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 13.0 %%AI8_CreatorVersion: 13.0.2 %%For: (Capps) () %%Title: (slipz.pdf) %%CreationDate: 4/23/10 9:02 PM %%BoundingBox: 169 395 393 657 %%HiResBoundingBox: 169.3335 395.7251 392.999 656.252 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 9.0 %AI12_BuildNumber: 434 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_TemplateBox: 306.5 395.5 306.5 395.5 %AI3_TileBox: 18 40 594 774 %AI3_DocumentPreview: None %AI5_ArtSize: 612 792 %AI5_RulerUnits: 2 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -607 918 1 1829 1055 26 0 0 50 75 0 0 1 1 1 0 1 %AI5_OpenViewLayers: 7 %%PageOrigin:0 0 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 29 0 obj <>stream %%BoundingBox: 169 395 393 657 %%HiResBoundingBox: 169.3335 395.7251 392.999 656.252 %AI7_Thumbnail: 112 128 8 %%BeginData: 6202 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD92FF848484A9A9FD05FFA9FFFFFFAFFFFFFFAFFFFFFFAFFFFFFF %AFFFFFFFAFFFFFFFAFFFFFFFAFFFFFFFAFFFFFFFAFFFFFFFAFFFFFFFAFFF %FFFFAFFFFFFFAFFD2EFF5A36070D0D0D07303684FFFFAF60143C363C363C %3636363CFD0636353636363536363635363636353635362F3635362F362F %362F362F362F362F362F362F302F7E84FD29FF5A0707070D060EFD040D06 %2F7EFFFF3C0D1413140D140D140D140D140D140D130D140D0D0D14FD0E0D %070D0D0D070D070D070D070D060D0707060D0D84FD25FFA9840D0E070E14 %36360E0D360D300D0D5AFFFF611436143614361336143613361336133613 %360D360D360D360D360D360D360D360D300D360D300D300D2F0D300D2F0D %2F0D2F072F0D0D075AAFFD22FFA80D5AFF5A8484CFA8FF845AFD040D070D %2FFFFF3C1314133613140D360D140D360D140D360D140D360D130D360D0D %0D360D0D0D2FFD0A0D070D0D0D070D070D070D070D062FA8FD21FF2F0785 %CFCFCECFCECFCAFFFF850D360D360D0D5AFFA93614361336131413361336 %0D140D140D360D360D360D360D360D360D360D300D360D2F0D300D2F0D2F %0D0D072F070D072F0D2F072F072F062FFD20FF5A060D84CFA7CEA7CEA7CF %A7FFFF600D360D0D060D84FF361413140D85845A0D140D135A8584360D14 %0D130D140D0D0D13FD0E0D0736845A2FA95A0D060D070D060D070D065AFD %1EFFAF0D1436FFCFCFA7CEA7CFADCFCFCF4B2F14140D360D36CAC97C7C13 %36FFFF841414145AFFFFAF0D3613360D360D360D360D360D360D360D360D %300D360D2F0D0D5AFFA884FFAF072F0D2F072F072F072F07A9FD1DFF5307 %0760CFCFA7CEA7CEA0514AA7A79A52592E352E7675BBBAC1BA7C13AFFF84 %0D1436FFFFAF0D130D360D130D140D0D0D14FD0E0D075AFFA90D2F0D0D59 %FF5A07060D070D06072FFD1DFF300D0D5AFFA7CFA7CEA7754B4B75C8BBC1 %BAC1BBC1BAC1BBC1BAC17614AFFF601436FFFFFF133635360D360D360D36 %0D360D360D0D0D363536FD050D362F0D2FFFA92F072F0D84FFA9072F072F %072F072FA9FD1BFFA9070D0D60CFCFA7CEA7A7A0CF7CA798C198C198C198 %C198C198A0521413AFFF600DAFFFFF130D35FFA8360D5AFFFF5A0D0D84FF %605AFD05FF350D2FAFFFFFAF84FFA959FF7E84FD06FF060D06070684FD1B %FF840D0D3036FFC9CFA7CEA7CFCFCFC1C1BBC1BBC1BBC1999998C1A81514 %36AFFFAFAFFFFF36140D36FFFF361484FFFFFF0D36A9FF60FFFF855A85FF %FF0DAFFFFF8485FFFF845AFFAF36FFFFFF84A97E2F072F070D5AFD1BFF84 %070E0D36A8CFA7CEA7CEA7C998BB98C1BBC1BAC1989998C1C9FF0D1413AF %FD04FFA8140D140DAFFF600DAFAFAFFF360DFFA885FFA9070D0DA9FF5AA9 %FF2F0D075AFFA95AFF840D5AFF7E070607060D0707065AFD1BFF7E0D0D30 %0D85CFCFA7CFCECFBBC1BB9999C1999974C1BB9F2EFFFF361336AFFF8460 %FFFF84360D1460FF8436FFAF60FF365AFFAF5AFFAFAFA8AFFFFF5AFFFF36 %0D0D36FF845AFFAF0784FF84072F070D072F07072FFD1BFF84060D0D1436 %FFA7CEA7CFA7C998BB9899989998C19958070DCBAF131413AFFF600D60FF %FF84140D5AFFA936FF5A36FF605AFF5A60FFAFFD04845A5AA8FF2F0D065A %FFA959FF84075AFF7E07062F0707060D065AFD1BFFA9300D360D36AECFA7 %CFCECFCFCFC8C8C1A07C7D2F360E0E2FFF84141336AFFF60141385FFFF84 %1436FFAF85FF6013FFA8AFFF5A5AFF840D0D0D365A2FFFFF36070D5AFF84 %60FFAF0784FF850685FF5A072F07077EFD1CFF2F0D070D0DAFCFCFA7CFA8 %CFAEFFAF60131414140D0D077EFF600D1413FFFF840D140D85FFFF5A0DA8 %FFAFFF350DA8FFAFFF0D36FFFF363535FFFF5A84FF84362FAFFFA959FFA8 %075AFFA836A8FF2F07060D07A9FD1CFF840736141484FFCFCFA7CFCFFFAF %611436143614360D2FA9FF36361436AFFF8414133613AFFFFF5A85FFFFAF %360D85FFFFA9360DAFFD05FFAF0D5AFD04FFA8FFA85AFFAF0730AFFFFFFF %A82F072F065AFD1DFFA92F070D0784CFCFA7CFA8CFCF600D360D14FD040D %35FF84140D1413605A360D140D1413605A6035605A5A0D0D0D605A5A0D0D %0D365A845A360D0D0D365A842F2F355A2F5A2F0D072F59842F0D060D0607 %84FD1EFF840D0D1484FFCFCFCFFFFFAF143614360D360D0D0DFFFF3C1336 %143613141336133613360D140D140D140D360D360D0E0D360D360D0E0D0D %0D360D2FFD080D070D0D2F070D070D072F07072FFD20FF590D0D84CFCFA8 %CFA8FF36140D360D0D0D0E07A9FF851314133613140D360D140D360D140D %360D140D360D130D360D0D0D360D0D0D2FFD0A0D070D0D0D070D070D070D %070D06070DFD22FF5A0DA8FFCFFFCFFFA8360D360D360D0D07A9FFAF1336 %143613361436133613360D3613360D360D360D360D360D360D360D360D30 %0D360D2F0D300D2F0D2F0D2F0D2F0D2F072F0D2F072F07070DFD24FF5AFF %CFCFA8FFCF85070D0D0D060D0DA9FFAF13140D1413140D140D140D140D14 %0D140D140D140D130D140D0D0D13FD0E0D070D0D0D070D070D070D070D06 %0753FD28FFCFFFFFFF5A0D070D07305AFFFFAF1414133614141336141413 %3613140D3613140D360D140D360D140D360D140D360D0E0D300D0D0D300D %0D0D2F0D0D0D2F0D0D072F070D075A5A857EFD28FFCFFFFF840D5A5A84A9 %FFFF851336363613363636133636361336363613363536133635360D3635 %360D362F360D362F360D362F360D362F350D362F2F0D362F2F0D5A5AA9FF %FF532F7EFD32FFAFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD %FCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD %FCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD %FCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD %FCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD13FFA858A8FD6DFFA80B0558 %83FD48FF7D837D847D837D847D837D847D837D847D837D847D837D847D83 %7D847D837D847D837D7D052D0505057DA8FD46FFAFFFA8FFFFFFA8FFFFFF %A8FFAFFFA8FFAFFFA8FFAFFFA8FFFFFFA8FFAFFFA8FFFFFF832D052E52A8 %AEFD69FFA82D83A8FD48FFFF %%EndData endstream endobj 30 0 obj <>stream HnHށs 2 p$F`8%AKO?9U\Ȏ й?jgSgygl}&q$<)7tڜF\X,݆9BEvn& ~ZNI%ݢEv1_9Yޟtg5ݡN$OIXFg/Q_|y]ੋ3(5iLRL4 ^9DZ[ߴfunjlOt^f],VGbz_O5|n/yY٫ͻbu#b(JTl/_ܠXG{y1^ i؜a/ڛtҌCKoG82NGֆ _~FVbٝĢDFI_fh7oEլ]`ow1p .vy+K*l/O- !^ˋկgil#/I9EIlL$Sđ5ag ˡ{7.if~=_UlQoI6WeX1T|9mLgsToM;Cщ\FL&. ӓX1.d@]4ESƄ(F2ьaR` 2~@ AR%7Y)) y eUU5hZպ6 -Ȁ LRt5M$@6эicL5c))] Ă HXH4".#tuJR PbNF 9.4&1haIMfr'BPgSb,᱕V[cu5,Ͳ, jK\JQ6wy7E%(㝑cgt. OƏh3p\+-% `=JIYYR\$X)0K!?9/IICU E^N'_݉ΒeH4t4 IC I T:9YPFnk@SY 8ĸ %.Pg^,&oP hВ,~ 糰94&t m8mGd1S&r)OC$42Pߙ, `!I,o@l=?IlKʐ!H: 1(FԂ>\'dGB$ɐ9bgt#F)q>($q$ V>T#se>I3jO:[E]-~c z׹y(9P凧~x<_mJoNtVZc{YB=km&YM,AJd;1t^B5yp2rU]ج&8DdaqR/p '|N!"ı8F:6CWoՑ#{aRf +)$AGj`@4RdVhBT@{xv0D%B 1PP9]1khxX3nq}W ]]1:V:)`&ɇNCeCeA?E_\KmuQCN:=8EdJpXf8P>`C1֌? zxd<"z|7"}djLfؗ ٻU܅JE_/B<)H1Chz%p 1$#8} ]Iv6[wHJشkǽsGiei5F"dB vF:Fޯ!P+b.q07Fw;>`h3g,N}*QIO!"!dOR!yCa ">1zQIb݀c\;8\Klh$FB՜{P(pC%|R(zד#1} uyJP)秔`Rc 9b'쐷9kt٪c!cr$D}[תkbL6>MEHkV rFzӌ;D\Q^nDv +8Hoa>CA џ#qU x8;'kE[!єAxF?D-m` ; Z!Xڐ 8ILBE.~}8s$Q&nR )M 1ɿQgDQMI=)s„9qVO zBfQ`8$fQ+>ȠJKK"qi. 9$2OqH@g"DI^ 9BD/K\<%jI*u6f#}]s1mߴLAщB`aaln6؎ؚha[fߵp|ʡ:Hedp|d qqhxze|t`s2]^qY3ĝ Ѐ2a[E$sXq'#sNN,iZRDeFX`e^ȽyxC>ωi,wsdtӂq6X^.hEyʗ˿5i#/ =qVyO4"UN@lnff:ReݱHAkJ)e Ucjc ՠ;F4;bk?q2σA b"H.1|Z. @N*<,=UrW] Y|YuX7rH;V;{t[6Vɟ.,֖Jt{$V7(hyDXmե};e6$-))><-crK6U{FYUip"3) ɽ)Obކrz%%uCX]/ՏQ ~ CSda7čPB63 Vw IfW:M_DJeoq>$ SL3LF"R#%P W\= civpRi>ͅբZ?P/J[QKrYKwonw{J+ƁEң:;澱һUN7(/Wt7?|,W힞,U5I|;% XZUhh(⮫tXFޔWeJR u8su~o~Pwi1 ׼io*3,Q;yl.Fj<vuquY?X unϚdڝeZjǠOԲP_ЫUvXN) eQgmk~{ӷn^Sqfнᧃa#V㝆f ͖*1-Y'-1\^[ .ad$6*pRml 1LޣEU8yo,t=Z}:ZVs_Fh}!өJ;%>6R-sݣbk*ٵ;zN.=vEŽ`SߒOOu?tG̜P {1ж%=fإ`Wt'kɍy-{}e۩F(KeW;/UږD!\G'l" 3.:j'@Kt:x?V&iA$'յ:QZ֞#'[߽{I5ZqRx)5:y/LCi>ަVS/mjրJ{S|nw6k:ǣ\zx|ѿ\ܥΛkwg};/`tJ?SU鷕_n~!?:yhm"ufga^HMS~/Y[+vyէ-v>?&GRl?S5+=sj>UOU顓z85[ՕFtNMaJCݽ᝵u*YEEYn oq僆^[o]}|:m~y1;CcH%ϗZ}i=ڨS9+]㗛{<=lc򇵑۰.6r=KdVI*LJv>{ٮ5mNX[|\}WEX cv*;iI{2z௮yBU:1TAj!~˽"X_~˭oPހ-iX'SRmomrF c'c̑BNY9_ xհnKƇcu6U 0 XCDgٱ9b2%+X?5Iy*b"L<#OA,  YN*N =7h0لE1Ml c^YF8*ن])FQH @P^;D( ʨnqY3RJx²t#+}lBJ-N-1ȩԴGX 8g4̰3q|)J73FKk 2F58Gpuv^c  i Zj,BȲ8R&Us8m)KwXq ^yw[륤׼#0c,_~80WOw3Ძ8ͼX`zyּVll- m7rQ3h$tC*ml:Jș`'U&TW w1框2TE*Ե4'p8(H945ApǦ\ઇ e u$P+ACGʦ"C٫'P7\6#?䦭=A =>Ά .8>q@缗Vfs:tzw"&bxy< n 1 !l%@׬Uo5ܤ.y+nm7sE3gm-6eLD1.]aHM/̓޵<عli/ bD1!_I0knיB7;n ]S1͵{=y}7R>q%N%a0&M2!iTuMSxxS ,u-I#m- 5- Yg[ sYʾam,+QnIJg)67 LHE9Ŏ/{{ڼopx(Z YTTdH򻢼2ւty vH+jJdn %sëq);(QAx1qrX<ۍptV 99&L:3NWb%ևׂ R͎-!~6=o̞ŷWhdI҈xN"ҭ:nr(JXYwxiYvKP^3+/X婈#hUbBF} z)qA#X]a/ DUxYP}Y,y{RPR&,f@&,P]4墥uBr{ >Cl4y#Pv0F0aR[Tu<(B,7->Jv3Y * p˖DS5XOW_Q\GKϬ:ŪA<`J mj+1B@xi.#^c WaVs -u X(48t)f3|ǿfA+@gC,xoф 9jrXc(|IB& ^ RYٻ}`mtaiQAy?rOPV ]lwio=kb{YMK铎fכ!/xۇA}pP8imsU|3L ߏ_3DxtH<%=r"7[cדU8|^(bXR%=K1 zgCsW?<3;󛲳Q ɍ:+q56sM<~RK%_OгM9vmYYyRVEfת*ð}eV+r^# (5}@5TEɨTHLMAlݐ욌YeƪY1K祲 GԔO3_=8Se֜vP)9KWa(tk5< kAuC_Qv8KCXXb!ͿXP(.—ZXYqXA@^P,Ϭ}[P + TuA~,'h\rZZ\ ΜA%b g5< Ʒg4ϊHg?XP RI|S  U3bx 5U*I*0r|~2AY^-(8{(84>LA#E5Cl"Csl!bMxB)Q]ǧA3y"O&&wk#YM<46*L7#ҧۘw0Pqy&7nBǺMZyGB ENCEաZ sB ښʵ MQ *0^W:hDHh_H:C@bW@@|\B aaxggj~*Y ]/~uEwCۅ2)ePtJ Nذ6 ?HΦ+$AgMft)XӮd;x섆ՠ! (cSoBЂz6 { K^():;ky`F`#磰 %G7TyNt7T2C|Сň;QVenݓЭhl:+w?HpY3yoLkPqe4x@X)>T;^d@d0hV؄W߉jQ~+LsYˇC*?%oWI ]Wk^n3{b*G a餓Ԛj=ENQ\έ <šae5kOy/!ޖE98[E#pkNu!Fb~ڼ-CƻfĬ4Şub Ѕ!wμ!˾}zsl^͒fLc*! ^X?bIe,T_]hIxPy9L}S:::'kb*6<\םsn*xuBˎok?y/ڗqYzoS4!$K6[7YXXt<;4T †M}8JNgvhg[٠kZP@|[%Vm;84>:҉(M ]"6.idFjH%/cAkte5ʀ]C:o]}/vwq!lBٜϵuی?Xڪ-_em(kvg@~s&u{eCHM'p4w5L|)R!@Ϛ/?J.}ڏ8y=dm׵C~r bBhh,>aP,GXqcZ^Vco3enϟ bX>6@-?~tkeYue*fmt_)=bU_+R/$ko`F=j6BT .T'OK+ip}3ck4W ځN uFwe yROץ&B9¾,}+*{9 zT1:fvcJ@ #L+aDŽ1QK'L:wu{xie aOSk cÓ>:aUl%wNhKF`)WoxY8NmSr&T{`ěQdmD޶/{g}t_ɔ-̝=!?7>~ڹR+gG%"k;גsڎ%nRoOίbiEt_8+-nX͋rp[3\NCvq. ^[nϟbUO%R엇c2'1T>HksNڿT9~iZ4WYk۱+JßerZ{뵇8[Ể͋ӕrlv,կx| !OXh'unmN:R%)5PrC.]\ԕkSGܻZ8يV\zDF͍ A2C3y9UZ՜+JhW*y~1> a8%+*_K[iWڊG DEb)-}]cɽ]}R FFrE;W+W;;iR\d00,2߮/zl,w'ε=K:ЬNwԁCӻ{b>О,/$|?Z%vt#!Ά-s^MԊ)7i>}u]noS\2./zD~6 u=̮*eV^ny]L+@A=ɩU֞W:F^&27ƅ<;/&cY[c-"tsW&AKi}Ŵ5],D qL.9\6h嬼 Jh}H 설;gFqJZoO9Rзߵ$f/Љ8Y l,}.̎Wĉq f^%Y7-ej*z,`p%9.`z`<.нl8%Fs|aclG.;h"ņb}/b(bqa$=+#ņb.fDaC +Ӟr A KBSŅ.W@לϣX ~s(Jte|ҵ1:H BRZcIIhuD#;7qy-?<lJ>Rs%΋""\Z"} 1ͷ53``7 Rǥ$+RT0wњl.X29vK۱F&Ĩ<$q$FXsͷ F;QH Jqr@gDވbW5O|S׷{5__^3NtU;UM!#R \-꧟KhC T^p߽H7_RIO֌P6Pe֌5!w[hi6PTkt9) -ɤ'3:'Op.m}$Er{e0;F>M`$Dǵte-lVkǗxWRz,{ͲN 1K/%Bpc#'O\01٫4G;vD-P%Yic(!@Skݫ;iNO[bJy}vTd荧\.=ʅ(HIz@GV"#(ju$o2L bM )%%.޽w1nvs[JRZIJOl:t|2%TR/H Rc1A(CKI}ah}]-7D5qtĎ}[wL7bԎ9S%1]0iCe09lnY\##;%:ȶ4OsA3;?,` cmOq+X'"9eyeMƅ K$AYs?. $$P{m70coRd! Nm(dz2G8d ػm.Y 3TAɢXaq3;C0bTWۓ۝]1'Xd5g8^QGzqDg(^QgGG(bq3dDQU|nZ%j0_~N?cRtq #GA0!NN,CWa "s&sd]MQ #,v(q"&ŎtQb's)~OrݼutgdJqC]lZ?%EGjyΰ #*mN?6!lsL-Rԁb ᘄƄ_`$V|0f[iRjʍP n|?@2T҅"#//t}0Gi^ev{[할ʺWb\S/Ni?f NDa1 !~51zep"&(TE^lyJ$k: TF(X+ҴFl2S_ ;abcpMRMlNT'C9FEEz)7B \/lDJΡ+eu9^V5SޛӻO7ƳƉzSi2Vhd7,[luk8 o>stream HWZH}<KK`EA]YGFAݝtt7NR+ YZƧ=0d3|^fgLOd$(Z~]Kkoi#~Scjd~|JRz =VT}| U9(o^JƸ[Aj+XZbCWۚz%:Er\ >Cp:!;܍iOl4/2Ŏm61௝bd"Ajf%EV{s1XؠMF#IMEMwe&C?*YFP`}H{ c{X0M hl< cO r: cD /+X]%B% $tVY5ri4;` Gc=M αT/g=^ݍq;bݕSpze.u'^o R] R9^[<cA`,,q=a`ەE.cS迂. +_u@9'.xʗzmQ\#x s[A1APF RO4H j: OZ`4.ȋ({7ɕЦ?.Bl}?826t n;/ @Fg,"mʾI|VX$bLv.g4!믆G+ ΫHf:;-LJ#ܳ qvcGO? VgDqzq5 `w5=e1Hl˽ubMZǁ+PTj+bXHDzzH z[ۘ.{7b}(XFFNv}Z^{9'_}Œ?,Ȼrc}Ҕ[ rƕdH̱1|ЬJf/ጄt࿱$ :mЛ^$,;nݝzeo1P~zn;nAEϧƲ(@JVV+ j"+LKwL 1B2 S9F#f M*n>sʅR|h# j6*u ИT͒*YyIZLabU`v/$Iw뮤tbO%A3%U#F ѳW{ߜؕT5x@VR 9 ƾ+)vڇ&㹒jsNu^l?@meAYiC6M"؆S1˃!0E6c`lCq5܋"?TI>N\ΗbN Qe +vBP#c91)I&-xIGFFHI|d )\ zńFa#Id#-l9{K;W 4NI;`-ƷS?,o:哂[̞*kxն$2;[g2"{i#J e!!-Flnsk[ GT WAƐ),/qr\oqK>T+\g XkL;JH>s aj "Ąa5}K5%p1r J5(v[Ms"18#V^o">N,uL3*ߚwx`Wn.λ1FNLPӚDuì=_nf3͟ѬZsef{I=ڣ85j%R-GKi*E1]=1Oߡ4>e3$Va:a4J͓b/* @Hg޴~{M>]Uag; קlW9d8"iiB/>NSTQ"ӕYTMh4I 볭S/<ǝ%9!޻NHxDwZ Nr1;ʧ($?(Bh;HF4S^ 1R7uJwXӞ7 $3x*,zֺFN_hO8WUGܨ ^ dZɿ-jijI+nUZK!w1Hb{_-X5=8$nz-<*81Nρ}\>kBK'Ж(Ol%䏉Nif2W"B3BOOYXc̖vXNaJ2 1z =' rt:h=$X~6̥&AoI{lP0s8ə[ uӵ'(9)K[OIXO?'Cڳd,#˾Ʋd,w8ƴC2?$c1mjW}% _}裄Y&NOI7eǷa?1cQWe vG PVk@(FiLG(dn3sKh|1rR24&,Jڈo^n@+a@S JME1\Xxvgs&ӕz5fx6?B"-,\D,@ .vI"V hG u\<] @Ó0uJBUx.]H]w?Uޗ,E?BQY\J}]r)2S!;3 ?d]ν:g&+dT^*rM \\յ.)7U%Ӕb w:Oif$ɔdvz:$+»ZK2M1],$4Cm/b}CoB{s5`Rl#V=qQ: {mQ:mvqz+K靻@+8SmnNBkP0f0 0L oX5jq8!(U[Qx趗ԻhsJ%gB"R2҅xV,&anPKim_2eKf^I@ (ڀr 3 4z[09GZxU7b?* b10> db!gOQZE%B4]CC@R; yӰ89`$l蹖= a?OCl iC$Tu84bqi^0,L+1ΫD<8 ]z!?d{ccL:WʜޅD~9mJ54;#N P,gci8pՖNHm-eŪjޟH68ak4TNrWhh']ػuV=ۊI +ua4TkL`k81 +Ԏc4WX S05M}AFleςpTK0lCk(ZC9ӑ7LjuЗFczlz `=X,. YÀ 3`\~ ̙YHt_RtPAF +-Ms}jPÜÌľPtCqr"֌;ξ˰X45ձ=hOntq 1.S8[ѕSw!P=?KKY]|`x7"HVf{]̗c#CG3|ƱN;ub\xSOoׯz\ՖX9){nW{>8ENyF>[6xѣ̏wHBC۳]nV jT1AئD1o}OBZ_t%aKl:ŖKpmBŏt@_DCr&\iiG-~n0? /\/gZykfYER {|?UoR>72˳'/.C,W*\9~s.1g>{F_뷺ܫo' V*FBrB3Wh ?/V@#,\ci׶wÕu2WhŎ ׀` Y2\ D r/zU`_Fc),3,L~SѸ),ݱW/cs&0}J)T4aNJ !r̍tOwb4 7O&jqp%c>֥lߟiS_ _('FNNK+a~5TrhҖ#{뾚a]qp[WB{9y BfU\!!D ] Еz+ s$F(HOf #l8XjJbyOsپK[7>H<%AĊ쥴 ¹2CUZT1GUsnZw F\Rr~ξŸ)q -e ]g6C*П تU&f^ÑDtڻ,;mIZК'={{#] ciy̓aHhIE.$> :d إ'J:*ip%(TNJD M9Ă[Yˢ5 {AyIH"߸?d I@POPxjCjʅ2}$DDVƷMf[X\Р7c\nM.{TJnܠ `KK[X|v6V͗N= u RNN8[F'zun'k'{w0  %!4 _ٯ$˶ e-霽O]'p>]W Iv8 t>vpsgX m{4?; ֦z><ж<=B.ZNX;= ׼!H'wD!# pCA@\@^CAH^!z eRcK*Y >B`nyh3 86 H\C:"za00SwP?&J*A9 B=•J2|k-W/+e]^Wоs .G8Fc9&K'G]c!S8& i|=v cTHTBYOQ<P~\Ѭ  o9r+1V?MNI~p i02WR'$zr a}/ZsG:]`;&4,05xm?T3\AiO;WdT-&_NiƄ$k8l@+uجW ;Teڐ@+)LY56]Uk(~6vPkM+~|+=;xQIXӭ`-y0Zco>urw7p饱A`,vkjѾ0{ d ij ߚ^/B4 &C lZ\/ 3YyHhpGXwToS(M@y |WYHXfYɐ=lk{#W ݗ(^Xp~,CVX@C Oo~:XlPFr"PU2pJj(ssZi ;iO$ _rs>]Wϯ_'sښOtz3oSXW6ϣtLrEm48vyB OGG7)JȝLHm=N S]d+u:j&Ң-J[ܔRg9BCi ")_kS8]%OiJ_SXIz5FeB\|8#BxhCǽ%@eo?*"<_W'B'O` 6&<^8)(!AG/޶Mx{etqL&n! ¦`פ2մm*IaچqThYrrG.{84\8 A} xmi(Q)p Kƹ4[[* kT@g_,\$֮U(`CMM;u 8'%\ߣgQ(@ϰv\vwx-Pe+7r-b`D*Mn~Ԥ{\0*D]nt^2l+ Q%Ak= .(nlA=--3}ov{bk>~كdvXjߤ6s}U%=?c?JZou݄#uy@>"cd>X@\|~qj@|v|kMߢ[k] v;4sʄVԂ#&PVx]ngl .uPh>`kUO$HviwOz:CYP|2T# mh8 V𝕝`xS.{ 5ƒ"dzc`f ܯ1تpS/t\%{Ĭݠj@]:..О P.p vBVwIj` (..CG ln;0Rt\7E.!!]R\ ol0leK }kNĽh% 1ʏE"~dG& K1x`Ō501IhNTD⫽+dc~w`k*O6~z$LMMuկ~Uս5HS >Ӷol;<7_Ԟ^ȉ6xw[;4o[pY^EpКe,WH,,l)lqR{wmr12˗rmk5{-Nl"kKsW>}Y/ {c/^xD3 Q: :ň}s`\#: ZuA$01IF;a_Cb Nd! ȎM EW =LzOÁ{7 F_.`FX A4|*]* TyJir,}k|B{P.2#bY/"J' Wڰ+dT"gq8@Up'l?ΞW!mJͰ[nȧŷD.^ 0oS3`l܋F,1 )Y=s@\0"EQR7h츩2* K@kE 9X$iUS:f0K {O*^Qe:%BH7#ET9&Ug!8WQ Su+Z'/6nrt0/A+m8C'.4u 0 NЪf_Fw#MqxIUHH0XLs-zvw/{++Gtu|ܡd=ObL6St>ɗՓ&ۨge8#?dl7Q^^]ꍛv}l>7ه֢{{53]{|a-{Pf˦>})=lM*N['ܨFOz@>U?a{h7OҖw9_*3أwux|6rmV{|m^dGb6V}`z{4oݎG叝\\z mL V%nXF-7ЃJQZp?^3ۧA+V^Z/GJ^[[YaN~~{V罳o*lYUmOC SPD;@lo:׮s䯑/XHhjDY*/R7ӿݪ!IEorHRZ*j'yxq c7-}VC)ZorUagd{&rcPt\ŒEbR94B֋q֛017v̡o%HGUI_=?=MIa! 'BUͻh@5FT2ʌYaSrпW7ō 5g 1tUEIkYsU@ܲQ̒llí@쑏E2NLDLrZj0gC70_hF;E 6 GD۝^8ouDho|\*R&qJ#UUm,~%A 0R ЏAxyCi'VE:U _] HMU1PnBb%gQLۂh:w3hR+)` 3R#K@`b u`՞]UaEb._DvX{[9!.}/h8C;H*Rޛ:~MpTsSAJ[jIhZ2ͪ}SHX]fȯ[Z/9 ?0^/:$Yl25Zà~4enUScG@G`g8T<[a0Ρx<6O^HBY +fÖϜjycK'zN",(3ʯ2Xw\[:6냋PJr-[X?\_;!6e)2H;p d }ᤰyCԿ]W7$̄"a0 ﳍ>)A!>R-{ qSy+X5E&|i"˵$mI=&\Pڽ"#y߾7mJDl Ld[%7i ۶R0oI?<,3>}A[zç mF}Y޽ 0}+ "YC_+}Anv ;;]M3NU:zCp#25& ~w.*VkV-rXk|x?|&; D{dMڌ9aE;h&b۔?:=<~ԼwWlX&j6 B5N[l WH7Gp  RhID€DfHofR\^lqƟLXbV ;XgepZ[ 1V6!85jRáuX [lD#ED %HPBK6_cmJLKkS#>j>jWlnj..^;/^)ع[(pGSN.vms1y-Ll@gm1$Dw87N-p˼{~&KtR!$rօ7mS0piE.Tax9n PxkW,pѰk (æ܌ Yi=WUwuw4r%]872]5%{qKx3S|OipqdwQFه jprzj(%\/1h$Q*0n.6YGvqKImHud,M0[?{Apj}EF3rrތ.S^4=Ϧ_=*.GB:]QQZnS.SՋj5Vvd\[515׸yV*yO39S/~HmB-G{OꦌR9'ۇ]@r~+vL.-zC.kt*mxZF *PTautA:`꒜ɍ9W * {b%y݁y}vs hWh3' Ƀ!H8#p3lp7F<fHVۤ>R:@j3{;iagZt"k$F VtIF3[P#G"ci8}IԈcxK n'O `? oGИ[൝.Am5/ݹiɃ{q/"`K]$QFlTIe4_:ޮ3oPen{ӝoFYlE*ϗɤ(Op:͐[$+YV ̈́'(w>dL l{I+N1,wbk7/]y)1$`D|"02ҴE X:6GXx$V:c˞Psr [ ,F[]|\}/[l e+*E "ɌӢnf&)H}S$ͭJ֗wI %"eh9b}?6zV6i. ¹\+Lc-bp!B}k"Dwm[v=e~FhH'p $Z+B׶b% tИ)rN=%=-%[ZWn ³CI,_+d~a "# 1S0/R +MkWoKbV֝Qpp+(5ü3ޖe!ٕN'?ƙC~H"qc/اvKse5;N6Ql H5+nY_n@'yfq 䡝~V`raEIDr2Ěn$jY^=2z[ _IڅEOTR.鮨tJ7)"-}F|A8ʼ8u?S hc8; Es0l@/<,7]>,M7kޕ Fyᬷ γgQTGt jĭ6rm}nxUf<邢@fmUȺe-7.3>}PM!qxz/Kc&ËkR$r)uت.֫pa}|"<7a'4,"eih7;()I JݗTh&n@ el\w18hL@Pz̺pZ͞M"̔\'Ͼ]+^-me}6d4kH̤|֝dUycZzAgZ=̘?8zTPrm9QI ?؛M+=XO^2J&/\lyEd| ֝tѰy7KV7*acj̺ٞS%[/56'f{~j^S彼^6o#|hxUyN_so՚O q}pz͉.Zlj2E7)a12Ey~ug xB^̀}MM-gi;=އqAfm4P/ ng70KOpٗLV)C.0ekpJo<v?P*4  ^;c*km Ϋ=&EXeSlَ9cvyYq`v~P:WDx(3̑ڈ`%e˾:+5u{&:QX1JyetH>R5{ED1n`FvBD b APnU,Vyu "G-a|5gsL ͥ.[8YQZv8*npnG%x[{/\oysUhCQXj P,Zl4;\=kJMq"cƨvg{^꜊7F#K+h-Ǐ)Q*tMczU4HOvW'6_>,=[-ڿH=ww,8Y<;@]Cjj\q?i:s yGt~p뉨Q.z"H#t{o)^ RE.J䟻*{@7klOHͣklX6 CmzUu[56 G0)iC(Di'I;Ug1Zc<n{aEW 6/p 7XU{#r}pl?>b)W{ J tl0ahydW@U1']7,q ݮsT} 5}Y,տߍef0Bټu( ).ɖָ͝> {j& RCghO=7* {$V|\T4js ;cТy.gBu`YIvYz(,agħKiVnIߖcd{\cƄf%PȕZ9Y@0kYݥ:حv.R /WZ =y]s:-Pe͑}u!¹0z%z5Y/WhHqvrzrʐO_hzq/ľ4\^p?^\lիw5 뵃TeulmA8}_K}~ŭ45^%d Nb~Yr|<]O5f'nbUo ̱ccY>Rr[fh*t>wy6zӥG#E{1'UW~k"APjzxW:r$[NȜA~gքLhѣsX12rK'j<ܠ+D}/N~Qqe縵r~=uhuNoJNxƸ)&FYx8bUhߙ\)V#ْ VLjEPLѰ?u kx F5܏Ac*K>Qa `0zCeR:EP18#3 ˨G], 餋:H> gwSLyR]=±z|9یvb0*c3,5arֵ#W)xwRXPFyTYB 0j]!^NQqE7FK!2_`%ܦYRӈ^ i7z^o'NY9\݌ jm3&`#_Wh0&Y mX!V9҇G/Mx\h ~CҨ_!+WJk=uXV ::H_i+5̟"D>q,\ ׬C#T(/\7dryg3&l1K8a4p2} 3vV^pil<̗ۆVf=Ya`Æ9kYijH6rؽ@/ߛoqw ,hyڂY4Mh0c}`uQ/x@`WH:e9*;!$APf 님tC+*-+͜X('1c?v[QBs:c2=e59FcUU(!AH0 Y "$HXku]xe":W"€ `kc-==EX8ͮfT3,QAʵ͑IpuV$̩:Y.Np+sw#>4Np:w|'zPYWZQ#\:?p-r:g#/|8ph0ZvOΝvN&ۓQVy ӝ43 Ё. 6}Lc d.9?S"ڻsuZݕD ,l͍֕8qX U!yA=홄RÞN&s[^uο,x*:թ|6Nf3MMmœM0윒b-)tqv#JYIdPBwjMHo\} O\ o~x5pd5Wt8|(GpTCa-݄YV'D8Hw5e qv S ޞ>$ؘ.tURMl,aZ#e`.RەC@.dfk\k g$ aۭ0#qI-nlK5\ݵ=v%w\pcuRmPTUO+T )Jt%WB ^0qJ7֊,"бd>x/kNj oU+Ξ0զowMvZLkp9ƚc,>՚`+8?(~N2|u:/GsUKklbC~c`YT")@`+sɫJrx="V4 Q4zf ȸҞ\iA4FC0v*jw.3ƚIJλ=b}m< aCsnCUϞs\Ӕ&7gŴF{mp_MNJBZ\!9_]i=_DZ~1H˴f_qJ,<8&[RJ)q/ %]ҔF6!Cnrƿ$e'>/vPnTo0vɭ¬[/|*ca~0ºhQa.WR)F+rgUw?c)-SkVocJ_ߚy<l4~gY\Un_jti<7">ir^_D\VԞbhSһU!ۏPmyJ"wgseIRw=?& ^0*+"I,B0 Ex+x)6z@h9idO E:Ռ0KDF.nHow5`` )T^Yʹ{k`mv#8լ NL!OM5, xAQ=HxU񯜽E\+VEf|^['5FeVocbm6]!u-.L,Q*nlϒ91UYnj.' ֹ'#CxmWX|uK#cUU0!$"YE1*(41%\go*F: Hnfz() *ru q2Zf\+L0+ګyoz\3WeGoܧmFӡğ ~[^ޞ|K\Y R[-fiV/,M![3Z9T-dLmڠc |T"%G^M~{]ZppS.ǃdNι; ^ݠ0u!%^}e(QaOnLotowݩWd'\-ų^r05[)eV(gb7! ޻0b0H0\ԁMg]ƛݘ 0{E9AGعPFu ԔLr`UȘgm;ʾWzߏKL轹;X%t3=,V[{|_ՃqiaAZcX0>vs=*NαKNWY(.H766*4ߤX` S 1B|blC\~S_[YGC͠ݭ<(-r=ðB'WF:5${w sUcFP+8HŻb}=\ܻ®4Tm9S$.@q˶׫DyYWsg*.)N#UY&Cޕ3M* 41s ;T?wP >@sgo)~$y﯊dhlP.`7?sBn:]} HF&H}>%;`Ao~( :MΠXqXLی,/2&gvQTkX8=I /``0?_Ab&(ad m%yTA~yInlimğS,i^:cd?o?A/2!!kr(PW1zlN rbTTV*b(z{1+6cBUZLCOuAM^sS}rHVP9kk~&!"-~mCŘ/)6Djr(bUGk9!ZFE0$5Pv>Ց'X=5[rP諒il9 >ܬ?u w+: 5PegY OW ӭWZ OydLxb!- xQ,(yf`zp>Jޒ,A/Ce~>OUpieo ˎI3z h FOiDvk_fNu5z'h1ۍ,[gY]o0Z9׫o^SVlK:n2HRlHXD=nC%M(: ;ox%iI<@oS@1f@J4ICA9рO%! Zsd`P^~Ы80pM3 @(thQ%3Ԛ!vP>."}b) ׬rc7_]蠀&o\2Z owQzmԺWa1-ǩch= Nu޳럯a0A쿸^@|ُг=vp/e'rW>c{~dՖcb[r)aeBtfKqrrij^a>j}C' t9Dd7`d ^\slJ;+Osk*q'}0*1oÇYLa W5q|e"AgTIWŭs.X}¡j{:2tAk5˯ uFi(59o֌[0 C(afߚ io_ȍm.ǀ[ zѳժFf/|K.V{RsOju}^fv6&ԧۡA҅8veV?LŜKsh7;tQ離TLN}sj2ZGbk7*Rڕ oH+ AÁV&6nIsl!;z5˹?? lL54?, k0 FJS3Di"({+rgj$rz1* %J&Wa7ב{vm%,/(-sAEQEP u_̲: +kgDdĎ].Y} /.TU<(Q,DM_جHx~TcIg훇H\lJq[-v~Zaps Jo85xظ)Uhzp74l&of @*lvW?3f=7@?LH$n"(wUA.CL{M=/@{&I3*4RAcFcDeTZps~T*n=>u%'z>6)FdvAohsQ9 3& z~1j~ ,0Tcu5\J-&w6L=5%\¬F1=/ Գfm[}.Xbs0-a(_tc"S7]?ov|;'CDBGC.vH:!y&&9Dit̢HfO$1> =?6@Ŵc[|boccG֡l0+EkzJ-5/d1 Ʈ+=Xm,Y5\z.v2 } r27 Mk`dn`A? zLZ0VX01®řz ; v4p#w}ݿퟛGuō沉D9l`X 0$?tk;xAжrϜ 7Aʧ#U[ee.3wTD#XvE:tDQth:<,vv`;~ I/0zq1 smLѓ+~US[g|l?~ޜ1Ftv%]v" UqwWb \hЉ@0VmL  N]/KwQ?%؎a>stream HM7 OPw HQql @/vGnPR҆j] HIE*@rGfR9ˀX%78*`m$3çt٭:1;Q.2ڋ'$dH5uF ʪ5`ToxKO8U<C-D} %\#`.9a.T93y" ہ`yxvG뚖\Fd=XY"A͋ʰ\ 3=YNJӓ_'M2*~ͨ2tfE6i:V"d ^?飯LYva[kG}JKjdoMLuJ;r߭"ECJDd1࣓+zJS_SsŮ)εĪ^J xo1[W {-8M \W d{* 'h0AI=4Ĭ}O+{_0wW.N#Bf++#}I.&[䬲MRhO0;8v #dRey*vdQٌPܲlֶȶ~t2-LbW'F 'uDN}OZ(.fY*tb>@{ 2]_Ygn,y\?xfS]B+ocGNW6_ld ;,eHQuic}t\gʾưԈA;U4NU;3dg ߑyީ3f?~3UVqV+6mOY.>R )"3݊61]GuԱ܆0B_۔'֎g A#>[Jy^cN mIegqe62'X;t{3ܦji !kvPuFca.khg־8NWbݮm>XEAE!3”eZ `n@{<,\-ۜA"ꖹ-9GI_X&q8nU;$^C?cb}@6A{%K(v( f ;-A2Gqe靖i}_ ?b!gHWY`p:j8AI@T0Q8C5{Gb9i>. @mdx.KQ^KatnM}g$ Gnvv+9}0^O_}=߾#z/ݭ/x>EQgĎ0D څO8+|][q__P銅t>nn?az|O2}݇d]~s?2 endstream endobj 1 0 obj <> endobj 2 0 obj <>stream application/pdf slip Adobe Illustrator CS3 2010-04-23T21:02:21-07:00 2010-04-23T21:02:21-07:00 2010-04-23T21:02:21-07:00 220 256 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADcAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYqw Dzp+dnkzyvLJZmR9S1OMlWtLQBgjDtJKaIu+xAqR4ZnYNBkyb8h5uFm1+OBrmXn11/zkvrrXckdp oFvFHGGNJZnlYhRWtVWIb/LM+PZEesi66XbJoEAI7Rv+cm4TxOuaG8MJbibizlEhrTf91IE6f6+V 5OyD/DL5tuPtcXUh8nqWkec9K8w6RJqHlmSPU5IwC1qzmCQEioVg6kqT2qKHxzWz05hKp+n7XPGp 44GWP1EdLpht3+eP1O4ktrrQJYbiJuMkTzhWUjsQY8zo9mWLEvs/a6OXtEYmjjII8/2Ic/n/AGw/ 6Ur/APSQP+qeS/ko/wA77P2o/wBEg/mf7L9i0/8AOQNsP+lI/wD0kD/qnj/JR/nfZ+1P+iMfzP8A ZfsWn/nIW1H/AEo3/wCkgf8AVPH+ST/O+z9rL/REP5n+y/YtP/ORFqP+lG//AEkj/qnj/JJ/nfZ+ 1P8Aog/of7L9i0/85F2o/wClE/8A0kj/AKp4f5JP877P2p/l/wDofb+xYf8AnI61H/Shk/6SR/1T x/kk/wA77P2p/l7+h9v7Fp/5yStB/wBKGT/pJH/VLH+ST/O+z9rL+Xf6H2/sWn/nJW0H/Sgk/wCk lf8Aqlj/ACSf532ftT/Lf9D7f2LD/wA5MWg/6Z+T/pKX/qlj/JB/nfZ+1P8ALX9D7f2LT/zk5Zj/ AKZ+T/pKX/qlj/JB/nfZ+1l/LP8AR+39iw/85P2Y/wCmek/6Sl/6pY/yQf532ftT/K/9H7f2ND/n KKx5Dl5elC13IulJp8vSGH+SD/O+z9rIdrf0ft/Yyzyv+fXkHXJktpZ5NJu3ICx3wCRsx7LKpZP+ CK5i5uzssN/qHk5WLtDHPY7e96MCCAQag7gjMBznYq7FXYq7FXYq7FXYq7FXiX51fmneR6ivkzy7 O8d1KRHqV7Af3itJ8K28Z7NuC5Br+z45uOz9GK8SfLp+t0/aGsI9GM79f1Jt5h/KDyNqOq3V7LHc wSTzNPJFbyIsRkb7bBWR2XmdzRs038v5cQ4KBpycnZOOc+OyL7v7EXD+Vn5bt10puZX0zL9Yn5ca U6epxr9GQh2/mJ5/YEnsfT1Vfaf1vOPzH/KJPLsEF/p8z3WhKxEpkAM0TtSnqFAqlWI2ag8PCvS6 DtEZ9jtL73Qdo6CWn9cTcTt7mBaXq2teXNUXXNOuWtL0GkaL0df5JF6FNuhzPy4ozjUhs42m1MoE cB5dXtGuDTPzF8jp5v0uIQ61Ypx1K1X7REY+NT48R8aN3Xbr01GEy0+Tw5fSeTsO0tPHU4vGh9ce fu/Z08nlTZtnlUbqXl3XtOtkur/T7i1tpGCRzSxsiszAsACR3AJyEMsJGgQS5M9PkgLlEgeYS+1s 7u9uY7Wzhe4uZTSOGNSzsaV2A3ycpACzyRCBkaAsq2reXtd0lI31OwnsllJERnjZORHWnICtK5GG WMvpILbPBPH9UTH3hKmyxiFJsWQUmwtgUmxZBRbCzCm2LMJtN5H84xzWsD6LeLNe8haRmFw0pRC7 cBT4qIOW3bKRqMe54hs5HgT29J38ko1XS9S0u8ey1G2ktLuMAvBMpRwGAYVU77g1yyMxIWDYUxMT RFFL2yaQ9X/Jn85bzy/fwaDrtwZfL87COGaQ1Nmx6EE/7qJ+0P2eo7g63XaETHFH6vvdlo9WYHhl 9P3PqIEEVHTOdd47FXYq7FXYq7FXYql/mLV49G0HUdWkAZbC2luOJ/aMaFgu3iRTLMUOOQj3lryz 4YmXcHy9+VQuNQ/MbTLrUJEuxc3jXM7sQT65DSB6GhDepQ50usHDgkB3PK6ecZaiPFzt9FXYPqtX qDnmef6i9oGDeedT/MOOb6v5VtVjt7eOOa81B4/WdvVk9P07eLfm0agyPt0oBv1lhA6t2MR/iY/5 ludQ8y6Do1p5otpLbULeIzXdvG7Qj1pNo2aNSaMEVWoenIigPSvL2mcGQAC686+52um7IjmxSPFX FsNgfvYzN5TtJHLmQluxZQ1PkNhmyj7a5+sIfa6o+wOH+HLMD3BNNAjl8u294LK9niS8Cm8cycQw jBArTiAByOafX9v6rVEWeGukdvt5vQ9nezul0kSAOL+tv9nJLtdjsYogioqXFQQqgA8WFamnYggj N77LnWyzcUjM4SP4rryq/wBDyPtpHs6GDgxjGM4lygBY7+Kv09eXV6p+dYJ8h6UAKk3kAAH/ADDy 50XZ396fcfvDoO2/8Wh/WH+5LXkXytpvkTy9N5n8wkR6g8dSjAcoUb7MKDvK/f7vEl1WeWefBDl+ PsXQaWOkxHNl+r7vL3n8dXnesQedfzEvL3XbWz9eztCY0hWWICCNRyChXZWY03JA3P3Zn4zi04EC dz9rqsgz6uRyAWB5jZjGgeWNc8xXklno1t9auY4zM6c446IGCk8pGRerDauZOXNHGLkaDi6fTzyy 4YCyoeYfLms+X776hq9sbW6KCURlkeqMSAQ0bMvY98OLLHILibDLNgnilwzFFMNR/LTzzY3FnbXO lOLjUCy2kKPFK7lAGb4Y3YqFB3LUAyuGrxSBIPJyJ6HNAgGO8uSPP5H/AJlFOX6LStK8PrNvX5f3 lPxyv+UcPf8AYXIHZef+b9o/WxOfyt5ih1xdBk0+ZdXZgi2fGrkkVqKbFab8q0pvmSM0DHiv0uP4 MxLgr1dyf3n5KfmVbWj3T6QXVF5PHFNDJJSldkVyzH2WuUDX4Sa4nLPZ+YC+H7nrv5oHzSp8mHys obXg8/1NW9Kn+8Z9T++Ij/u+XX9earScHr4/p2+922r4/wB3wfVv93mwfy5+Xvmrzd+Yt7N5+sTK lvGqam8csMfGQwg24pbvvVKfZ+nMzLqYYsQ8I+79PNxcWmnkynxB7+XdtySjzj+QvnNfMl8vlrRj JoYdfqTtdW9SvBa/3sof7VeoyzB2jj4Bxy9XuK5dBPiPCPT7w8kmRkdkYUZSVYe42zZBww+u/wAi fNE3mD8vLNrlzJd6a7WE7salvSAMZP8AzydRXuc5ntDFwZTXI7u/0WTixjy2ehZguW7FXYq7FXYq 7FWG/nEsjflnr4j6i3Bb/UWRC/Y/sg5l6H++i4utvwpU+Y/KGoQ6frFhqMNvIXsp4p9mrX02DU/Y G9M6XJATiY94ePlkljmJWNjb6suvRkImgbnDKA8bjoVYVBzzTV4uGZD32OQkARyKTeZbzUrHSmns ErJyAkkpyMaUNWpmBqJThC4ux7Nw48mXhyHb7z3PLrzUZGuWkufVlkk+JpgjSVPgeIYj6Rmmoy3J 3exiIwAiBQ8kM95PIONrEw8Z5lKItO5VuLt9Ap7jCIDr8gssm23zPJT8vSaRqXnLStEYtqM91OFm cn4I0QF3KgUUHip3UV8TnSaH2fzzgcmQeHjHT+KX6a9/wDzGu9o8EZDHhPi5D1/hj+gn3fEoj81l iXz7qiRACNPQUBeg428YpnoPZ4rDEfjm+SdsyvVTPu+4PaPNXmjTfLfl/Tb/AFC0N3C00ESqoUsj GNnEg5d1CHNNgwyyTIBrm9Vq9VHBijKQ4hY+7mxv82dDvPNXlmz1nQ7o3dnaq05s491lRhvIoG5d KU4n3pQ7HJ0OQYpmMxRLh9rYTqMQyYzcRvX6feGN/wDOP2piPV9V0xjtcwJOoPjC3EgfMS/hmR2r D0iXcXE7AyVOUe8X8v7Uw/LzS/8AC1p551ZgB+jZJ7W2c/8ALqHkoP8AW5R5DVz8U449+/z/AAW7 s/F4Ec0/5tgfD8Bv8wtHTzHrnkPV405Raq0MVzTcCMlLgD/gGkwaXJ4cckf5v9n6meuxeLPDP+fV /f8ApLPIbqK6/MK5grybS9NjA/yWvJiz/etvHmCY1hB/nS+7+12glxagj+bH7z+wPP7rSvMh8zSa l/ysa0hgF2Zv0f8AXWEaxiSvpGLmEoF+GhXM4ThwV4R5c6daYZOPi8aPPlxfoZdHL5f1T80LG/sr q3vZ7fR7lS8EiSlSLiEL9gmm0zjfxzFInHAQQR6h9xc4GE9QJAg1A/f+14p59/MjzvZ+f9V+qaxc wQ2N28Vvao5EASJuKhovsNXjvUb5ttNpcZxC4jcOo1OryjLKpHY/c9v8wzet5x8iTU4+pNevx605 afIaZp8QrHkHu/3Tu8pvJjPv+5itlqeoR/8AORN/p8dzIljcWiST2wYiN3S1TizL0JHbMmUB+UBr e/0uNGRGrIvb9jzX82fPnnTTvzD1qysNbvbW0hlQRQRTuiKDEhoqg0G5zP0enxyxRJiCXE1WeYyk CR+byiRmZizGrMaknuTmxcQPo3/nFf1f8Pa5WvpfW4+Phy9L4qfRTNF2v9Ufc7js3kXuGah2bsVd irsVdirsVQes6ZBqukXumT7Q30ElvIaVosqFCaHwrk8c+GQkOjDJDiiY9741mtb7StRudO1OUwzW UrwSQody0bFTQL+ztsc6+ExIAjkXidRi4ZEAbvpryDcm+8h6JctUn0DEOVa0hkaJfwQZxHbOIDPK nreypE6eN+75GmR28NSK5rsUHYEvKvzM8yaFb3kum6TZwLcxEi9vlUAhx1RANqj9onvm/wBF7PYJ jjyQG/Tl83Sdo+0+pxnwsMztzPP4C3lOq6i8nwTTSJXeNwxK/cM32n7P0+D+7hGJ7wN/nzedzdoa nUf3k5THcT+jkzf/AJx/0Oe680XfmK9YfUNFgcR3DEcfWmUqaN4LFz5eFRlHamWoCA5ydr2ThiJH JyER+PsSDzJqn6W16/1LcLdTvIgPUIW+AfQtBmXhhwQEe4PNanN4mSU/5xJelfm35l0DUvJenWmn 6hBdXMd1C8kMThmCrBKpJA8CwGazQYZxykkUK/SHoe1tViyaeMYyBII+4sc/Kz8xm8u3o0zUpCdE uW+0d/q8h/bH+Qf2h9PzyddpPEHFH6h9ridldo+DLhl/dn7PP9bIbiXyXov5had5l0TVrT6jdSPF qdokq0iMyFfVUA/Y5EFh+yfbpjAZZ4TCQNjk5sjgxamOXHIcJO47r6+5Ffmf5u8qL5L1Kz0O/t7m 61a5Rp44ZA7CpVpHoOxEQB+eR0eDJ4gMgQIhu7R1WHwZRxkEzlv+Pgq/lv5y8ot5O0WHWtSt7a/0 iWQxRzSBWBAkjRqHt6U1Mjq9Pk8SRiCRL8foZ9n6vF4MROQEoH9f6CxzQPzO0my/NjXdRv5/9xOo 1tYrpAXRRblUhkotTwZUO4HevjmRl0cjgjEfUN3Hwa+MdTKUj6ZbfLkuu/IX5T3WtSa0fOFslhLP 9Yk08yQcvifm0YqwbjvT7HTBHU5xHh4DfezOk05lxeIOG+X4/U63/MP8udF/Mmyn0K3itNE+qy2e oX0EJRWeVldWCU5lUaJRWnc9uqdLmnhIkbldgMo6vDDODAVCqJb82eVfyb1HV7jzNcea40guZPrF 1YW8kUsjt+2EReUq8z/k4MObURiIcHLqzz4NPKRnx7HoyTXPzB8l3Xmjybexatarb20t3JdVlT9w JbF0USUJA+JgvzzHx6bIITFHevvcrJqsZnAg7C/hswe+8/eXNP8Az7bzB9bS40WWJIJLyD94qhrZ U5fDWoVx8VMzI6actNwV6v2uIdREanjv0/sZnFqX5S6L5u1Lz9/ia3mub+D0/qccqSldkDFYo+Uv JvSGxG2/0YZjnnAYuHk5olhjM5OLm+Y9cv11DWL+/RDGl5cSzqh3KiVy4BPtXOgxx4YgdzpybJL6 x/IrytN5e/LyyS5Upd6k7ahOh6r6wURg/wDPJEJ8DnNdoZuPKa5DZ32ix8OMX13eg5hOW7FXYq7F XYq7FXYq8l/Of8pZNfceZNDhEmtQIFurPZfrSIKKQf8AfiDbf7S7dhm00GtGP0S+n7nV9o6I5BxR +r8fayf8vNOvLP8AL/RILyMx3PoerLGy8GUzO0tGU0oRz3zWdqETykhyuz8Xh4YxRXm/V30Lynqm qptLbwn0T4SSERofoZgcr7PwceWMSy1+Y48MpDnX37PlmbVyVindi/Mss1dyTtv89652weEGEkkI zyr5R1/zdqp0nTIjJaghpr5wfSgQ7h2bxI6L1P45Tn1EcUbk7DSaOWUjh59XrHnLUdG8neVYvIfl 1uUhX/cpcj7Z5UL8yP25e/gvw/LWaXHLLPxZ/Bye1dZHFj/L4+f8R/Hf92zy1s2rzKm2FmFJsWYU 2xZBSbCzCk2LIKTYWwKTYsgothZhTbFmFJsWYUXxZhRbCzD1n8mPyavdev7fX9etzDoEDCWCGQUa 7cbqAp/3T/Mf2ug7kazXa4QHDH6vu/a7LR6QzPFL6fvfUAAAoOmc87x2KuxV2KuxV2KuxV2KuxVa yBuuAxtUg87+UV80eXLjRTdGzE5Q/WAnqEcGBpx5J1+eX6XL4M+KrcfVafxocJNMI0b/AJxw8m2j K2pXd3qYVgxhZlhiNPERjn9z5mz7VyHkAHEh2VjBsklnk3lkW2ijSfLksWg2+4LW8AZhXqV+JAGP djU5hxzXLimOL4uRm08jDgxy8P4ftYLJ+Q8Mjs8muSO7ks7tACSTuSSZMzx2p/R+39joz7N3v4n+ x/apn8gLY/8AS6f/AKRx/wBVMP8AKp/m/b+xf9DY/n/7H9q0/wDOP1sf+l2//SOP+qmP8qn+b9v7 E/6HB/P/ANj+1af+cerU/wDS8f8A6Rx/1Ux/lY/zft/Yy/0Oj+f/ALH9q0/8472p/wCl4/8A0jD/ AKqY/wArH+b9v7E/6H/6f+x/atP/ADjpan/pev8A9Iw/6qYf5WP837f2J/kD+n9n7Vh/5xxtT/0v pP8ApGH/AFUx/lY/zft/Yn+Qf6f2ftWn/nG20P8A0vpP+kYf9Vcf5WP837f2Mv5C/p/Z+1af+car Q/8AS/k/6Rl/6q4/ysf5v2/sT/In9P7P2rD/AM4z2h/6aCT/AKRV/wCquP8AK5/m/b+xP8i/0/s/ atP/ADjHZn/poJP+kVf+quP8rn+b9v7GX8jf0vs/asP/ADjBZn/poZP+kVf+quP8rn+b9v7E/wAk f0vs/a0v/OLthyHPzDKV7gWyg/eZDj/K5/m/ayHZP9L7P2st8t/kL+X2iv60ltJqlyAQJb1wwUkd VRAiA+BIJHY5jZe0cs/L3OVi7Pxx8/enPlXyXrWias95d+ZbzVbVrYQCwuSzRrL+75TKXkkap9Nt u3I0ynNnjMUIgbt2LCYmzIllmYzkOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVDajqVhptlJe 386WtpDT1Z5TxRQzBQWJ6bkYoJAFlUtbu1u4EuLWZLi3kFY5omDow8Qykg4qDaril2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KpB+jPOn/V9tf+4ef+ynA18Mu/7Hfozzp/1fbX/uHn/spx Xhl3/Y79GedP+r7a/wDcPP8A2U4rwy7/ALHfozzp/wBX21/7h5/7KcV4Zd/2O/RnnT/q+2v/AHDz /wBlOK8Mu/7Hfozzp/1fbX/uHn/spxXhl3/Y79GedP8Aq+2v/cPP/ZTivDLv+x36M86f9X21/wC4 ef8AspxXhl3/AGMR/NrTvNS/l3rJutVguoPTjD28dkY3esyAAP6703/yTiWrOJcB3eTfl1+Xn5xe ul3ojT6BbuQzXFy7QRuP8qAhmkHhWMjIgFxMOLJzGz6W0G21q20yKHWb2PUL9f7y6ih+rq2w/Y5O K17inyGTdlEEDdMMWTsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir//2Q== uuid:13528DD4AD50DF11A0AE9F14AB4BE47F uuid:cf4bb206-1326-d74d-bcf6-c7318f4a6bf4 uuid:2fbdcaaa-a095-1547-b943-336f0e642cc3 uuid:EDE785FDC44FDF119846FECADDC9E06B False Adobe PDF library 8.00 PDF/X-3:2002 PDF/X-3:2002 1 False False 612.000000 792.000000 Points Cyan Magenta Yellow Black Default Swatch Group 0 endstream endobj 3 0 obj <> endobj xref 0 4 0000000000 65535 f 0000074437 00000 n 0000074488 00000 n 0000091289 00000 n trailer <> startxref 116 %%EOF ruby-prawn-1.0.0~rc2.orig/data/pdfs/contains_ttf_font.pdf0000644000000000000000000001040512114176157022146 0ustar rootroot%PDF-1.3 % 1 0 obj << /Creator (Prawn) /Producer (Prawn) >> endobj 2 0 obj << /Pages 3 0 R /Type /Catalog >> endobj 3 0 obj << /Count 1 /Kids [5 0 R] /Type /Pages >> endobj 4 0 obj << /Length 135 >> stream 0.000 0.000 0.000 rg 0.000 0.000 0.000 RG q BT 36 746.352 Td /F1.0 12 Tf [<48656c6c6f> 18.0 <20> 125.0 <57> 78.0 <6f726c64>] TJ ET Q endstream endobj 5 0 obj << /Parent 3 0 R /ProcSet 6 0 R /Resources << /Font << /F1.0 7 0 R >> >> /Contents 4 0 R /MediaBox [0 0 612.0 792.0] /Type /Page >> endobj 6 0 obj [/PDF /Text] endobj 7 0 obj << /Subtype /TrueType /BaseFont /AAAAAA+Activa /FontDescriptor 9 0 R /FirstChar 32 /Type /Font /LastChar 255 /Widths 11 0 R /ToUnicode 10 0 R >> endobj 8 0 obj << /Length1 3312 /Filter /FlateDecode /Length 1846 >> stream xV}l[W?g?ql~qMi$vlQ+K+LHNѴ"iBeTmB!`Ӫm@Ѥ}EӐ@cV1TMT9gi>{;9ad (>W_)T^X\?w,έ,?#G<_G٥ t!+^Y_JOx_R-/yykqy.O@_ț>d/2f][w_D>t#?>H '/= !nw^t@ghƤPn;r2 "8~ u\st?:zוSPCWN!AbP&IW.BvF/^_]έ./Yώ:Y?[ Z3VQe`Va 9a GaP(qTq^ $h Q{ֱq4jnSܪVg.\fq\_xb <PUwan:'ݹ8ֱncz;k__^G3/e*!dffHz<3M33[Mo=U razO>\Bwڴk'0Ș\$//f3f+N~3?ѣ'~?\c_> ۏM_{7h4S)٨.*WJP( >hX<GL3Qӡ }#T* f>AQ39:TV%@mJ#$w MbLNJF $.q-k!M&!=G&QL% _Q9LaHAw,(IRWL3F0x+G6;M"@=Pxѻ;@-t#mM,nvQ$JhI!&Dr:p:CRTT2`z@ 0ߢ`4TJSY{Dzs3)!a iALv-]N$$ٝ8Ѓ0#ؒ.#! J8P^}\ob}GFb$ZnK,YnrUBQPv%qۺ99i؆mwJ$%gJ]ŽhdT\՜{67S T8uΒGB7/C'xސw9Ko@ߠⷮ`ARh}TdtAA7Hkk_=/~sS_ zśA> endobj 10 0 obj << /Filter /FlateDecode /Length 214 >> stream x]Pˎ >(ҪЇ `R  $J{b43^Zr䃽0ud'?Fqp$'0N GLn"-Yu-3Sv_sp7)B% MI!yK@8|\FV4mGUXdҼg=3q́sCv Rk endstream endobj 11 0 obj [986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 836 986 986 986 986 986 986 986 986 986 986 986 986 986 986 994 986 986 986 986 986 986 986 986 986 986 986 986 545 469 986 986 986 986 986 986 295 986 986 531 986 986 377 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986] endobj xref 0 12 0000000000 65535 f 0000000015 00000 n 0000000071 00000 n 0000000120 00000 n 0000000177 00000 n 0000000363 00000 n 0000000510 00000 n 0000000538 00000 n 0000000698 00000 n 0000002631 00000 n 0000002838 00000 n 0000003125 00000 n trailer << /Info 1 0 R /Root 2 0 R /Size 12 >> startxref 4039 %%EOF ruby-prawn-1.0.0~rc2.orig/data/pdfs/nested_pages.pdf0000644000000000000000000000302412114176157021065 0ustar rootroot%PDF-1.3 % 1 0 obj << /Creator (Prawn) /Producer (Prawn) >> endobj 2 0 obj << /Pages 4 0 R /Type /Catalog >> endobj 3 0 obj << /Count 2 /Type /Pages /Kids [6 0 R 9 0 R] >> endobj 4 0 obj << /Count 2 /Type /Pages /Kids [3 0 R] >> endobj 5 0 obj << /Length 203 >> stream 0.000 0.000 0.000 rg 0.000 0.000 0.000 RG q 0.000 0.000 1.000 rg BT 36 747.384 Td /F1.0 12 Tf [<5468697320697320612073616d706c652066696c6520746861742075736573206e65737465642050> 40 <61676573>] TJ ET Q endstream endobj 6 0 obj << /Contents 5 0 R /MediaBox [0 0 612.0 792.0] /Type /Page /Resources << /Font << /F1.0 7 0 R >> /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] >> /Parent 3 0 R >> endobj 7 0 obj << /Encoding /WinAnsiEncoding /Type /Font /Subtype /Type1 /BaseFont /Helvetica >> endobj 8 0 obj << /Length 174 >> stream 0.000 0.000 1.000 rg 0.000 0.000 0.000 RG q BT 36 748.452 Td /F3.0 12 Tf <5468697320697320612073616d706c652066696c6520746861742075736573206e6573746564205061676573> Tj ET Q endstream endobj 9 0 obj << /Contents 8 0 R /MediaBox [0 0 612.0 792.0] /Type /Page /Resources << /Font << /F3.0 10 0 R >> /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] >> /Parent 3 0 R >> endobj 10 0 obj << /Encoding /WinAnsiEncoding /Type /Font /Subtype /Type1 /BaseFont /Courier >> endobj xref 0 11 0000000000 65535 f 0000000015 00000 n 0000000071 00000 n 0000000120 00000 n 0000000183 00000 n 0000000240 00000 n 0000000494 00000 n 0000000672 00000 n 0000000769 00000 n 0000000994 00000 n 0000001173 00000 n trailer << /Root 2 0 R /Size 11 /Info 1 0 R >> startxref 1269 %%EOF ruby-prawn-1.0.0~rc2.orig/data/pdfs/page_without_mediabox.pdf0000644000000000000000000000740312114176157023000 0ustar rootroot%PDF-1.2 1 0 obj % page object - page 1 << /Type /Page /Parent 7 0 R % back pointer /Resources 3 0 R % font to use /Contents 2 0 R % page image >> endobj 2 0 obj % contents object << /Length 1335 % # of bytes between stream and endstream >> stream % draw three lines of text BT /F1 24 Tf % setfont 1 0 0 1 72 648 Tm % moveto (Hello World) Tj % show 1 0 0 1 72 612 Tm <4D53835383568362834E3234837C834383938367> Tj % shift-jis string 1 0 0 1 72 576 Tm 0.5 g % setgray <82BB82EA82F08A44904682C982B582BD82E082CC> Tj ET % draw filled, dark blue, shougi koma q % gsave 12 0 0 12 72 360 cm % concat - translate and scale 0 0 0.5 rg % setcolor for fill 0 0 m % moveto 12 0 l % lineto 10 11 l 6 12 l 2 11 l f % close path and fill Q % grestore % draw stroked brown egg upright q .5 w % setlinewidth 12 0 0 12 360 360 cm 0.5 0 0 RG % setcolor for stroking 0 0 m 8 0 4 12 0 12 c % curveto -4 12 -8 0 0 0 c S % stroke Q % draw bitmap - dark green steps 0 0.5 0 rg % fill color 144 0 0 144 72 144 cm % scale 16x16 bits to two-inch square BI /W 16 % pixcel width /H 16 % height /BPC 1 % bits per component /F /AHx % filter = ASCII Hex /IM true % imagemask (0 - paint, 1 - transparent) ID 0FFF 0FFF 0FFF 0FFF 00FF 00FF 00FF 00FF 000F 000F 000F 000F 0000 0000 0000 0000> EI endstream endobj % end of page stream 3 0 obj % resource object << /ProcSet [ /PDF /Text ] % operators to use /Font << /F1 4 0 R >> % name the font /F1 >> endobj % Font definition taken from Acrobat 4 PDFWriter (some comments added) 4 0 obj % base font << /Type /Font /Subtype /Type0 % Adobe composite font /BaseFont /#82l#82r#83S#83V#83b#83N % MS-Gothic /DescendantFonts [ 5 0 R ] % points to actual font /Encoding /90ms-RKSJ-H % Shift-JIS encoding >> endobj 5 0 obj % descendent font << /Type /Font /Subtype /CIDFontType2 % TrueType /BaseFont /#82l#82r#83S#83V#83b#83N % MS-Gothic /WinCharSet 128 /FontDescriptor 6 0 R % points to metric info /CIDSystemInfo << /Registry(Adobe) /Ordering(Japan1) /Supplement 2 >> /DW 1000 /W [ 231 389 500 631 631 500 ] >> endobj 6 0 obj % font metric information << /Type /FontDescriptor /FontName /#82l#82r#83S#83V#83b#83N /Flags 39 /FontBBox [ -150 -147 1100 853 ] /MissingWidth 507 /StemV 92 /StemH 92 /ItalicAngle 0 /CapHeight 853 /XHeight 597 /Ascent 853 /Descent -147 /Leading 0 /MaxWidth 1000 /AvgWidth 507 /Style << /Panose <0805020B0609000000000000> >> >> endobj % End of font defintion from PDFWriter 7 0 obj % pages object << /Type /Pages /Kids [ 1 0 R ] % list of pages (only one in this case) /Count 1 % # of pages - one /MediaBox [ 0 0 595 842 ] % A4 portrait >> endobj 8 0 obj % catalog object << /Type /Catalog /Pages 7 0 R % points to pages object >> endobj 9 0 obj % info object << /CreationDate (D:19991115) /Title (Hand-written sample PDF) /Author (ARAI Bunkichi, Yokohama Koubunsha) >> endobj xref 0 10 0000000000 65535 f 0000000012 00000 n 0000000184 00000 n 0000001672 00000 n 0000001888 00000 n 0000002185 00000 n 0000002569 00000 n 0000002992 00000 n 0000003218 00000 n 0000003324 00000 n trailer << /Root 8 0 R % points to catalog object /Info 9 0 R % info object /Size 10 % # of entries in xref >> startxref 3475 %%EOF ruby-prawn-1.0.0~rc2.orig/data/pdfs/version_1_6.pdf0000644000000000000000000000130512114176157020556 0ustar rootroot%PDF-1.6 %???? 1 0 obj << /Creator (Prawn) /Producer (Prawn) >> endobj 2 0 obj << /Kids [5 0 R] /Type /Pages /Count 1 >> endobj 3 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 4 0 obj << /Length 195 >> stream 0.000 0.000 0.000 rg 0.000 0.000 0.000 RG q 1.000 0.000 0.000 rg 136.000 286.000 m 236.000 336.000 l 336.000 286.000 l 336.000 186.000 l 236.000 136.000 l 136.000 186.000 l 136.000 286.000 l f Q endstream endobj 5 0 obj << /Contents 4 0 R /Type /Page /MediaBox [0 0 612.0 792.0] /Parent 2 0 R >> endobj xref 0 6 0000000000 65535 f 0000000015 00000 n 0000000071 00000 n 0000000128 00000 n 0000000177 00000 n 0000000423 00000 n trailer << /Info 1 0 R /Size 6 /Root 3 0 R >> startxref 514 %%EOF ruby-prawn-1.0.0~rc2.orig/data/pdfs/resources_as_indirect_object.pdf0000644000000000000000000000201212114176157024324 0ustar rootroot%PDF-1.3 % 1 0 obj << /Creator (Prawn) /Producer (Prawn) >> endobj 2 0 obj << /Type /Pages /Count 1 /Kids [5 0 R] >> endobj 3 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 4 0 obj << /Length 275 >> stream 0.000 0.000 0.000 rg 0.000 0.000 0.000 RG q 0.000 0.000 1.000 rg BT 36 733.024 Td /F1.0 32 Tf [<412073616d706c65205044462074686174206861732074686520706167650a>] TJ ET BT 36 696.032 Td /F1.0 32 Tf [<7265736f757263657320617320616e20696e646972656374206f626a656374>] TJ ET Q endstream endobj 5 0 obj << /Resources 6 0 R /Type /Page /Contents 4 0 R /MediaBox [0 0 612.0 792.0] /Parent 2 0 R >> endobj 6 0 obj << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F1.0 7 0 R >> >> endobj 7 0 obj << /Subtype /Type1 /Type /Font /Encoding /WinAnsiEncoding /BaseFont /Helvetica >> endobj xref 0 8 0000000000 65535 f 0000000015 00000 n 0000000071 00000 n 0000000128 00000 n 0000000177 00000 n 0000000503 00000 n 0000000611 00000 n 0000000702 00000 n trailer << /Size 8 /Info 1 0 R /Root 3 0 R >> startxref 799 %%EOF ruby-prawn-1.0.0~rc2.orig/data/pdfs/hexagon.pdf0000644000000000000000000000130512114176157020055 0ustar rootroot%PDF-1.3 % 1 0 obj << /Creator (Prawn) /Producer (Prawn) >> endobj 2 0 obj << /Kids [5 0 R] /Type /Pages /Count 1 >> endobj 3 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 4 0 obj << /Length 195 >> stream 0.000 0.000 0.000 rg 0.000 0.000 0.000 RG q 1.000 0.000 0.000 rg 136.000 286.000 m 236.000 336.000 l 336.000 286.000 l 336.000 186.000 l 236.000 136.000 l 136.000 186.000 l 136.000 286.000 l f Q endstream endobj 5 0 obj << /Contents 4 0 R /Type /Page /MediaBox [0 0 612.0 792.0] /Parent 2 0 R >> endobj xref 0 6 0000000000 65535 f 0000000015 00000 n 0000000071 00000 n 0000000128 00000 n 0000000177 00000 n 0000000423 00000 n trailer << /Info 1 0 R /Size 6 /Root 3 0 R >> startxref 514 %%EOF ruby-prawn-1.0.0~rc2.orig/data/pdfs/two_hexagons.pdf0000644000000000000000000000210412114176157021127 0ustar rootroot%PDF-1.3 % 1 0 obj << /Creator (Prawn) /Producer (Prawn) >> endobj 2 0 obj << /Count 2 /Kids [5 0 R 7 0 R] /Type /Pages >> endobj 3 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 4 0 obj << /Length 195 >> stream 0.000 0.000 0.000 rg 0.000 0.000 0.000 RG q 1.000 0.000 0.000 rg 136.000 286.000 m 236.000 336.000 l 336.000 286.000 l 336.000 186.000 l 236.000 136.000 l 136.000 186.000 l 136.000 286.000 l f Q endstream endobj 5 0 obj << /Contents 4 0 R /Parent 2 0 R /MediaBox [0 0 612.0 792.0] /Type /Page >> endobj 6 0 obj << /Length 195 >> stream 1.000 0.000 0.000 rg 0.000 0.000 0.000 RG q 1.000 0.000 0.000 rg 136.000 286.000 m 236.000 336.000 l 336.000 286.000 l 336.000 186.000 l 236.000 136.000 l 136.000 186.000 l 136.000 286.000 l f Q endstream endobj 7 0 obj << /Contents 6 0 R /Parent 2 0 R /MediaBox [0 0 612.0 792.0] /Type /Page >> endobj xref 0 8 0000000000 65535 f 0000000015 00000 n 0000000071 00000 n 0000000134 00000 n 0000000183 00000 n 0000000429 00000 n 0000000520 00000 n 0000000766 00000 n trailer << /Info 1 0 R /Root 3 0 R /Size 8 >> startxref 857 %%EOF ruby-prawn-1.0.0~rc2.orig/Gemfile0000644000000000000000000000046112114176157015361 0ustar rootrootsource :rubygems gem "ttfunk", "~>1.0.3" gem "pdf-reader", "~> 1.2" gem "ruby-rc4" gem "afm" group :development do gem "coderay", "~> 1.0.7" gem "rdoc" end group :test do gem "pdf-inspector", "~> 1.0.2", :require => "pdf/inspector" gem "rspec" gem "mocha", :require => false gem "rake" end