diff --git a/.gitignore b/.gitignore
index e69de29..4e3996b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1 @@
+/SnakeYAML-all-1.8.zip
diff --git a/snakeyaml-gdata+base64coder+cobertura-addition.patch b/snakeyaml-gdata+base64coder+cobertura-addition.patch
new file mode 100644
index 0000000..2150001
--- /dev/null
+++ b/snakeyaml-gdata+base64coder+cobertura-addition.patch
@@ -0,0 +1,33 @@
+diff -Naur snakeyaml.orig/pom.xml snakeyaml/pom.xml
+--- snakeyaml.orig/pom.xml 2011-02-15 12:02:01.000000000 +0100
++++ snakeyaml/pom.xml 2011-05-30 18:21:05.915253296 +0200
+@@ -46,6 +46,16 @@
+
+
+
++ com.google.gdata
++ gdata-core
++ 1.0
++
++
++ biz.source_code
++ base64coder
++ 2010-12-19
++
++
+ junit
+ junit
+ 4.7
+@@ -79,6 +79,12 @@
+ 1.6
+ test
+
++
++ org.codehaus.mojo
++ cobertura-maven-plugin
++ 2.4
++ test
++
+
+
+
diff --git a/snakeyaml-issue121-file-handle-leaks.patch b/snakeyaml-issue121-file-handle-leaks.patch
new file mode 100644
index 0000000..c93e1b7
--- /dev/null
+++ b/snakeyaml-issue121-file-handle-leaks.patch
@@ -0,0 +1,406 @@
+diff -Naur snakeyaml.orig/src/test/java/examples/LoadExampleTest.java snakeyaml/src/test/java/examples/LoadExampleTest.java
+--- snakeyaml.orig/src/test/java/examples/LoadExampleTest.java 2011-01-16 14:39:08.000000000 +0100
++++ snakeyaml/src/test/java/examples/LoadExampleTest.java 2011-06-09 14:07:02.000000000 +0200
+@@ -19,7 +19,7 @@
+ import java.io.ByteArrayInputStream;
+ import java.io.File;
+ import java.io.FileInputStream;
+-import java.io.FileNotFoundException;
++import java.io.IOException;
+ import java.io.InputStream;
+ import java.util.List;
+ import java.util.Map;
+@@ -40,12 +40,13 @@
+ public void testLoadFromString() {
+ Yaml yaml = new Yaml();
+ String document = "hello: 25";
+- Map map = (Map) yaml.load(document);
++ @SuppressWarnings("unchecked")
++ Map map = (Map) yaml.load(document);
+ assertEquals("{hello=25}", map.toString());
+ assertEquals(new Integer(25), map.get("hello"));
+ }
+
+- public void testLoadFromStream() throws FileNotFoundException {
++ public void testLoadFromStream() throws IOException {
+ InputStream input = new FileInputStream(new File("src/test/resources/reader/utf-8.txt"));
+ Yaml yaml = new Yaml();
+ Object data = yaml.load(input);
+@@ -53,9 +54,10 @@
+ //
+ data = yaml.load(new ByteArrayInputStream("test2".getBytes()));
+ assertEquals("test2", data);
++ input.close();
+ }
+
+- public void testLoadManyDocuments() throws FileNotFoundException {
++ public void testLoadManyDocuments() throws IOException {
+ InputStream input = new FileInputStream(new File(
+ "src/test/resources/specification/example2_28.yaml"));
+ Yaml yaml = new Yaml();
+@@ -66,5 +68,6 @@
+ counter++;
+ }
+ assertEquals(3, counter);
++ input.close();
+ }
+ }
+diff -Naur snakeyaml.orig/src/test/java/org/pyyaml/AnInstance.java snakeyaml/src/test/java/org/pyyaml/AnInstance.java
+--- snakeyaml.orig/src/test/java/org/pyyaml/AnInstance.java 2011-01-12 13:56:10.000000000 +0100
++++ snakeyaml/src/test/java/org/pyyaml/AnInstance.java 2011-06-09 14:07:02.000000000 +0200
+@@ -43,5 +43,4 @@
+ public void setBar(Object bar) {
+ this.bar = bar;
+ }
+-
+ }
+\ Chybí znak konce řádku na konci souboru
+diff -Naur snakeyaml.orig/src/test/java/org/pyyaml/PyCanonicalTest.java snakeyaml/src/test/java/org/pyyaml/PyCanonicalTest.java
+--- snakeyaml.orig/src/test/java/org/pyyaml/PyCanonicalTest.java 2011-01-12 13:56:10.000000000 +0100
++++ snakeyaml/src/test/java/org/pyyaml/PyCanonicalTest.java 2011-06-09 14:07:02.000000000 +0200
+@@ -35,7 +35,9 @@
+ File[] files = getStreamsByExtension(".canonical");
+ assertTrue("No test files found.", files.length > 0);
+ for (int i = 0; i < files.length; i++) {
+- List tokens = canonicalScan(new FileInputStream(files[i]));
++ InputStream input = new FileInputStream(files[i]);
++ List tokens = canonicalScan(input);
++ input.close();
+ assertFalse(tokens.isEmpty());
+ }
+ }
+@@ -59,7 +61,9 @@
+ File[] files = getStreamsByExtension(".canonical");
+ assertTrue("No test files found.", files.length > 0);
+ for (int i = 0; i < files.length; i++) {
+- List tokens = canonicalParse(new FileInputStream(files[i]));
++ InputStream input = new FileInputStream(files[i]);
++ List tokens = canonicalParse(input);
++ input.close();
+ assertFalse(tokens.isEmpty());
+ }
+ }
+diff -Naur snakeyaml.orig/src/test/java/org/pyyaml/PyEmitterTest.java snakeyaml/src/test/java/org/pyyaml/PyEmitterTest.java
+--- snakeyaml.orig/src/test/java/org/pyyaml/PyEmitterTest.java 2011-01-12 13:56:10.000000000 +0100
++++ snakeyaml/src/test/java/org/pyyaml/PyEmitterTest.java 2011-06-09 14:07:02.000000000 +0200
+@@ -19,6 +19,7 @@
+ import java.io.File;
+ import java.io.FileInputStream;
+ import java.io.IOException;
++import java.io.InputStream;
+ import java.io.StringWriter;
+ import java.util.ArrayList;
+ import java.util.Arrays;
+@@ -63,7 +64,9 @@
+ // continue;
+ // }
+ try {
+- List events = parse(new FileInputStream(file));
++ InputStream input = new FileInputStream(file);
++ List events = parse(input);
++ input.close();
+ //
+ StringWriter stream = new StringWriter();
+ DumperOptions options = new DumperOptions();
+@@ -116,23 +119,24 @@
+ }
+ }
+
+- @SuppressWarnings("unchecked")
+ public void testEmitterStyles() throws IOException {
+ File[] canonicalFiles = getStreamsByExtension(".canonical", false);
+ assertTrue("No test files found.", canonicalFiles.length > 0);
+ File[] dataFiles = getStreamsByExtension(".data", true);
+ assertTrue("No test files found.", dataFiles.length > 0);
+- List allFiles = new ArrayList(Arrays.asList(canonicalFiles));
++ List allFiles = new ArrayList(Arrays.asList(canonicalFiles));
+ allFiles.addAll(Arrays.asList(dataFiles));
+ for (File file : allFiles) {
+ try {
+ List events = new ArrayList();
+- StreamReader reader = new StreamReader(new UnicodeReader(new FileInputStream(file)));
++ InputStream input = new FileInputStream(file);
++ StreamReader reader = new StreamReader(new UnicodeReader(input));
+ Parser parser = new ParserImpl(reader);
+ while (parser.peekEvent() != null) {
+ Event event = parser.getEvent();
+ events.add(event);
+ }
++ input.close();
+ //
+ for (Boolean flowStyle : new Boolean[] { Boolean.FALSE, Boolean.TRUE }) {
+ for (DumperOptions.ScalarStyle style : DumperOptions.ScalarStyle.values()) {
+@@ -140,19 +144,19 @@
+ for (Event event : events) {
+ if (event instanceof ScalarEvent) {
+ ScalarEvent scalar = (ScalarEvent) event;
+- event = new ScalarEvent(scalar.getAnchor(), scalar.getTag(), scalar
+- .getImplicit(), scalar.getValue(), scalar.getStartMark(),
+- scalar.getEndMark(), style.getChar());
++ event = new ScalarEvent(scalar.getAnchor(), scalar.getTag(),
++ scalar.getImplicit(), scalar.getValue(),
++ scalar.getStartMark(), scalar.getEndMark(), style.getChar());
+ } else if (event instanceof SequenceStartEvent) {
+ SequenceStartEvent seqStart = (SequenceStartEvent) event;
+- event = new SequenceStartEvent(seqStart.getAnchor(), seqStart
+- .getTag(), seqStart.getImplicit(), seqStart.getStartMark(),
+- seqStart.getEndMark(), flowStyle);
++ event = new SequenceStartEvent(seqStart.getAnchor(),
++ seqStart.getTag(), seqStart.getImplicit(),
++ seqStart.getStartMark(), seqStart.getEndMark(), flowStyle);
+ } else if (event instanceof MappingStartEvent) {
+ MappingStartEvent mapStart = (MappingStartEvent) event;
+- event = new MappingStartEvent(mapStart.getAnchor(), mapStart
+- .getTag(), mapStart.getImplicit(), mapStart.getStartMark(),
+- mapStart.getEndMark(), flowStyle);
++ event = new MappingStartEvent(mapStart.getAnchor(),
++ mapStart.getTag(), mapStart.getImplicit(),
++ mapStart.getStartMark(), mapStart.getEndMark(), flowStyle);
+ }
+ styledEvents.add(event);
+ }
+diff -Naur snakeyaml.orig/src/test/java/org/pyyaml/PyErrorsTest.java snakeyaml/src/test/java/org/pyyaml/PyErrorsTest.java
+--- snakeyaml.orig/src/test/java/org/pyyaml/PyErrorsTest.java 2011-01-12 13:56:10.000000000 +0100
++++ snakeyaml/src/test/java/org/pyyaml/PyErrorsTest.java 2011-06-09 14:07:02.000000000 +0200
+@@ -19,6 +19,7 @@
+ import java.io.File;
+ import java.io.FileInputStream;
+ import java.io.FileNotFoundException;
++import java.io.InputStream;
+ import java.io.StringWriter;
+ import java.io.Writer;
+ import java.util.ArrayList;
+@@ -54,9 +55,11 @@
+ continue;
+ }
+ try {
+- for (Object document : loadAll(new FileInputStream(files[i]))) {
++ InputStream input = new FileInputStream(files[i]);
++ for (Object document : loadAll(input)) {
+ assertNotNull("File " + files[i], document);
+ }
++ input.close();
+ fail("Loading must fail for " + files[i].getAbsolutePath());
+ // System.err.println("Loading must fail for " +
+ // files[i].getAbsolutePath());
+diff -Naur snakeyaml.orig/src/test/java/org/pyyaml/PyImportTest.java snakeyaml/src/test/java/org/pyyaml/PyImportTest.java
+--- snakeyaml.orig/src/test/java/org/pyyaml/PyImportTest.java 2011-01-12 13:56:10.000000000 +0100
++++ snakeyaml/src/test/java/org/pyyaml/PyImportTest.java 2011-06-09 14:07:02.000000000 +0200
+@@ -98,6 +98,7 @@
+ while (parser.peekEvent() != null) {
+ result.add(parser.getEvent());
+ }
++ input2.close();
+ return result;
+ }
+
+@@ -108,6 +109,7 @@
+ while (parser.peekEvent() != null) {
+ result.add(parser.getEvent());
+ }
++ input.close();
+ return result;
+ }
+
+diff -Naur snakeyaml.orig/src/test/java/org/pyyaml/PyReaderTest.java snakeyaml/src/test/java/org/pyyaml/PyReaderTest.java
+--- snakeyaml.orig/src/test/java/org/pyyaml/PyReaderTest.java 2011-01-12 13:56:10.000000000 +0100
++++ snakeyaml/src/test/java/org/pyyaml/PyReaderTest.java 2011-06-09 14:07:02.000000000 +0200
+@@ -19,6 +19,7 @@
+ import java.io.File;
+ import java.io.FileInputStream;
+ import java.io.IOException;
++import java.io.InputStream;
+
+ import org.yaml.snakeyaml.reader.ReaderException;
+ import org.yaml.snakeyaml.reader.StreamReader;
+@@ -32,8 +33,8 @@
+ public void testReaderUnicodeErrors() throws IOException {
+ File[] inputs = getStreamsByExtension(".stream-error");
+ for (int i = 0; i < inputs.length; i++) {
+- StreamReader stream = new StreamReader(
+- new UnicodeReader(new FileInputStream(inputs[i])));
++ InputStream input = new FileInputStream(inputs[i]);
++ StreamReader stream = new StreamReader(new UnicodeReader(input));
+ try {
+ while (stream.peek() != '\u0000') {
+ stream.forward();
+@@ -41,10 +42,11 @@
+ fail("Invalid stream must not be accepted: " + inputs[i].getAbsolutePath()
+ + "; encoding=" + stream.getEncoding());
+ } catch (ReaderException e) {
+- assertTrue(e.toString(), e.toString().contains(
+- " special characters are not allowed"));
++ assertTrue(e.toString(),
++ e.toString().contains(" special characters are not allowed"));
++ } finally {
++ input.close();
+ }
+ }
+ }
+-
+ }
+diff -Naur snakeyaml.orig/src/test/java/org/pyyaml/PyStructureTest.java snakeyaml/src/test/java/org/pyyaml/PyStructureTest.java
+--- snakeyaml.orig/src/test/java/org/pyyaml/PyStructureTest.java 2011-01-12 13:56:10.000000000 +0100
++++ snakeyaml/src/test/java/org/pyyaml/PyStructureTest.java 2011-06-09 14:07:02.000000000 +0200
+@@ -85,7 +85,9 @@
+ continue;
+ }
+ try {
+- List events1 = parse(new FileInputStream(file));
++ InputStream input = new FileInputStream(file);
++ List events1 = parse(input);
++ input.close();
+ assertFalse(events1.isEmpty());
+ int index = file.getAbsolutePath().lastIndexOf('.');
+ String canonicalName = file.getAbsolutePath().substring(0, index) + ".canonical";
+@@ -106,7 +108,9 @@
+ assertTrue("No test files found.", canonicalFiles.length > 0);
+ for (File file : canonicalFiles) {
+ try {
+- List events1 = parse(new FileInputStream(file));
++ InputStream input = new FileInputStream(file);
++ List events1 = parse(input);
++ input.close();
+ assertFalse(events1.isEmpty());
+ List events2 = canonicalParse(new FileInputStream(file));
+ assertFalse(events2.isEmpty());
+@@ -157,11 +161,15 @@
+ assertTrue("No test files found.", files.length > 0);
+ for (File file : files) {
+ try {
+- List events1 = compose_all(new FileInputStream(file));
++ InputStream input = new FileInputStream(file);
++ List events1 = compose_all(input);
++ input.close();
+ int index = file.getAbsolutePath().lastIndexOf('.');
+ String canonicalName = file.getAbsolutePath().substring(0, index) + ".canonical";
+ File canonical = new File(canonicalName);
+- List events2 = canonical_compose_all(new FileInputStream(canonical));
++ InputStream input2 = new FileInputStream(canonical);
++ List events2 = canonical_compose_all(input2);
++ input2.close();
+ assertEquals(events1.size(), events2.size());
+ Iterator iter1 = events1.iterator();
+ Iterator iter2 = events2.iterator();
+@@ -268,11 +276,14 @@
+ Yaml canonicalYaml = new CanonicalLoader();
+ for (File file : files) {
+ try {
+- Iterable