diff --git a/lib/haxe/src/org/apache/thrift/AbstractMethodError.hx b/lib/haxe/src/org/apache/thrift/AbstractMethodError.hx
index 9fb9bbb..54b8153 100644
--- a/lib/haxe/src/org/apache/thrift/AbstractMethodError.hx
+++ b/lib/haxe/src/org/apache/thrift/AbstractMethodError.hx
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
- 
+
 package org.apache.thrift;
 
 #if flash
@@ -25,16 +25,16 @@
 import org.apache.thrift.TException;
 #end
 
-class AbstractMethodError 
+class AbstractMethodError
 #if flash
-extends IllegalOperationError 
+extends IllegalOperationError
 #else
 extends TException
 #end
 {
 
-	public function new(message : String="") {
-  		super("Attempt to call an abstract method");
-	}
+    public function new(message : String="") {
+          super("Attempt to call an abstract method");
+    }
 
 }
diff --git a/lib/haxe/src/org/apache/thrift/ArgumentError.hx b/lib/haxe/src/org/apache/thrift/ArgumentError.hx
index 8a5df6f..3ca04fd 100644
--- a/lib/haxe/src/org/apache/thrift/ArgumentError.hx
+++ b/lib/haxe/src/org/apache/thrift/ArgumentError.hx
@@ -16,14 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
- 
+
 package org.apache.thrift;
 
 #if ! flash
 // predefined for flash only
 class ArgumentError extends TException {
-	public function new(msg : String = "") {
-		super(msg);
-	}
+    public function new(msg : String = "") {
+        super(msg);
+    }
 }
 #end
diff --git a/lib/haxe/src/org/apache/thrift/Limits.hx b/lib/haxe/src/org/apache/thrift/Limits.hx
index 7d2aa5d..44eec3a 100644
--- a/lib/haxe/src/org/apache/thrift/Limits.hx
+++ b/lib/haxe/src/org/apache/thrift/Limits.hx
@@ -16,29 +16,29 @@
  * specific language governing permissions and limitations
  * under the License.
  */
- 
+
 package org.apache.thrift;
 
 class Limits {
-    
-	// Haxe limits are not fixed values, they depend on the target platform
-	// For example, neko limits an int to 31 bits instead of 32. So we detect 
-	// the values once during intialisation in order to
-	// (a) get the right values for the current  platform, and 
-	// (b) prevent us from dependecies to a bunch of defines
-	
-	public static var I32_MAX = {
-		var last : Int = 0;
-		var next : Int = 0;
-		for(bit in 0 ... 32) {
-			last = next;
-			next = last | (1 << bit);
-			if(next < 0) {
-				break;
-			}
-		}
-		last; // final value
-	}
 
-	// add whatever you need 
+    // Haxe limits are not fixed values, they depend on the target platform
+    // For example, neko limits an int to 31 bits instead of 32. So we detect
+    // the values once during intialisation in order to
+    // (a) get the right values for the current  platform, and
+    // (b) prevent us from dependecies to a bunch of defines
+
+    public static var I32_MAX = {
+        var last : Int = 0;
+        var next : Int = 0;
+        for(bit in 0 ... 32) {
+            last = next;
+            next = last | (1 << bit);
+            if(next < 0) {
+                break;
+            }
+        }
+        last; // final value
+    }
+
+    // add whatever you need
 }
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/TApplicationException.hx b/lib/haxe/src/org/apache/thrift/TApplicationException.hx
index 012a802..4287a85 100644
--- a/lib/haxe/src/org/apache/thrift/TApplicationException.hx
+++ b/lib/haxe/src/org/apache/thrift/TApplicationException.hx
@@ -30,9 +30,9 @@
    */
 class TApplicationException extends TException {
 
-	private static var TAPPLICATION_EXCEPTION_STRUCT = { new TStruct("TApplicationException"); };
-	private static var MESSAGE_FIELD = { new TField("message", TType.STRING, 1); };
-	private static var TYPE_FIELD = { new TField("type", TType.I32, 2); };
+    private static var TAPPLICATION_EXCEPTION_STRUCT = { new TStruct("TApplicationException"); };
+    private static var MESSAGE_FIELD = { new TField("message", TType.STRING, 1); };
+    private static var TYPE_FIELD = { new TField("type", TType.I32, 2); };
 
     public static inline var UNKNOWN : Int = 0;
     public static inline var UNKNOWN_METHOD : Int = 1;
diff --git a/lib/haxe/src/org/apache/thrift/TBase.hx b/lib/haxe/src/org/apache/thrift/TBase.hx
index 5d8bfc1..a35c752 100644
--- a/lib/haxe/src/org/apache/thrift/TBase.hx
+++ b/lib/haxe/src/org/apache/thrift/TBase.hx
@@ -26,38 +26,38 @@
    *
    */
 interface TBase {
-  
+
     /**
      * Reads the TObject from the given input protocol.
      *
      * @param iprot Input protocol
      */
     function read(iprot:TProtocol) : Void;
-  
+
     /**
      * Writes the objects out to the protocol
      *
      * @param oprot Output protocol
      */
     function write(oprot:TProtocol) : Void;
-  
+
     /**
      * Check if a field is currently set or unset.
      *
      * @param fieldId The field's id tag as found in the IDL.
      */
     function isSet(fieldId : Int) : Bool;
-  
+
     /**
-     * Get a field's value by id. Primitive types will be wrapped in the 
+     * Get a field's value by id. Primitive types will be wrapped in the
      * appropriate "boxed" types.
      *
      * @param fieldId The field's id tag as found in the IDL.
      */
     function getFieldValue(fieldId : Int) : Dynamic;
-  
+
     /**
-     * Set a field's value by id. Primitive types must be "boxed" in the 
+     * Set a field's value by id. Primitive types must be "boxed" in the
      * appropriate object wrapper type.
      *
      * @param fieldId The field's id tag as found in the IDL.
diff --git a/lib/haxe/src/org/apache/thrift/TException.hx b/lib/haxe/src/org/apache/thrift/TException.hx
index ed630ba..54fa1ff 100644
--- a/lib/haxe/src/org/apache/thrift/TException.hx
+++ b/lib/haxe/src/org/apache/thrift/TException.hx
@@ -16,20 +16,21 @@
  * specific language governing permissions and limitations
  * under the License.
  */
- 
+
 package org.apache.thrift;
 
 class TException {
-    
-	@:isVar 
-	public var errorID(default,null) : Int;
-	@:isVar 
-	public var errorMsg(default,null) : String;
 
-	
-	public function new(msg : String = "", id : Int = 0) {
-		errorID = id;
-		errorMsg = msg;
-	}
-    
+    @:isVar
+    public var errorID(default,null) : Int;
+    @:isVar
+    public var errorMsg(default,null) : String;
+
+
+    public function new(msg : String = "", id : Int = 0) {
+        errorID = id;
+        errorMsg = msg;
+    }
+
 }
+ 
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/TFieldRequirementType.hx b/lib/haxe/src/org/apache/thrift/TFieldRequirementType.hx
index 70f698f..7c22030 100644
--- a/lib/haxe/src/org/apache/thrift/TFieldRequirementType.hx
+++ b/lib/haxe/src/org/apache/thrift/TFieldRequirementType.hx
@@ -27,5 +27,5 @@
     public static inline var REQUIRED : Int  = 1;
     public static inline var OPTIONAL : Int = 2;
     public static inline var DEFAULT : Int = 3;
-  
+
 }
diff --git a/lib/haxe/src/org/apache/thrift/TProcessor.hx b/lib/haxe/src/org/apache/thrift/TProcessor.hx
index 78ce5a7..0cb6f7d 100644
--- a/lib/haxe/src/org/apache/thrift/TProcessor.hx
+++ b/lib/haxe/src/org/apache/thrift/TProcessor.hx
@@ -26,5 +26,5 @@
  * writes to some output stream.
  */
 interface TProcessor {
-	function process(input:TProtocol, output:TProtocol) : Bool;
+    function process(input:TProtocol, output:TProtocol) : Bool;
 }
diff --git a/lib/haxe/src/org/apache/thrift/helper/Int64Map.hx b/lib/haxe/src/org/apache/thrift/helper/Int64Map.hx
index 8d9e4e1..6d6a6a1 100644
--- a/lib/haxe/src/org/apache/thrift/helper/Int64Map.hx
+++ b/lib/haxe/src/org/apache/thrift/helper/Int64Map.hx
@@ -29,187 +29,187 @@
 
 class Int64Map<T> implements IMap< Int64, T> {
 
-	private var SubMaps : IntMap< IntMap< T>>;  // Hi -> Lo -> Value
-	
-	public function new() : Void {
-		SubMaps = new IntMap< IntMap< T>>();
-	};
+    private var SubMaps : IntMap< IntMap< T>>;  // Hi -> Lo -> Value
 
-	private function GetSubMap( hi : haxe.Int32, canCreate : Bool) : IntMap< T> {
-		if( SubMaps.exists(hi)) {
-			return SubMaps.get(hi);
-		} 
-		
-		if( ! canCreate) {
-			return null;
-		} 
-		
-		var lomap = new IntMap< T>();
-		SubMaps.set( hi, lomap);
-		return lomap;
-	}
-	
-	/**
-		Maps `key` to `value`.
-		If `key` already has a mapping, the previous value disappears.
-		If `key` is null, the result is unspecified.
-	**/
-	public function set( key : Int64, value : T ) : Void {
-		if( key ==  null) {
-			return;
-		}
+    public function new() : Void {
+        SubMaps = new IntMap< IntMap< T>>();
+    };
 
-		var lomap = GetSubMap( Int64.getHigh(key), true);
-		lomap.set( Int64.getLow(key), value);
-	}
-	
+    private function GetSubMap( hi : haxe.Int32, canCreate : Bool) : IntMap< T> {
+        if( SubMaps.exists(hi)) {
+            return SubMaps.get(hi);
+        }
 
-	/**
-		Returns the current mapping of `key`.
-		If no such mapping exists, null is returned.
-		If `key` is null, the result is unspecified.
+        if( ! canCreate) {
+            return null;
+        }
 
-		Note that a check like `map.get(key) == null` can hold for two reasons:
+        var lomap = new IntMap< T>();
+        SubMaps.set( hi, lomap);
+        return lomap;
+    }
 
-			1. the map has no mapping for `key`
-			2. the map has a mapping with a value of `null`
+    /**
+        Maps `key` to `value`.
+        If `key` already has a mapping, the previous value disappears.
+        If `key` is null, the result is unspecified.
+    **/
+    public function set( key : Int64, value : T ) : Void {
+        if( key ==  null) {
+            return;
+        }
 
-		If it is important to distinguish these cases, `exists()` should be
-		used.
-
-	**/
-	public function get( key : Int64) : Null<T> {
-		if( key ==  null) {
-			return null;
-		}
-		
-		var lomap = GetSubMap( Int64.getHigh(key), false);
-		if( lomap == null) {
-			return null;
-		}
-
-		return lomap.get( Int64.getLow(key));
-	}
-
-	/**
-		Returns true if `key` has a mapping, false otherwise.
-		If `key` is null, the result is unspecified.
-	**/
-	public function exists( key : Int64) : Bool {
-		if( key ==  null) {
-			return false;
-		}
-		
-		var lomap = GetSubMap( Int64.getHigh(key), false);
-		if( lomap == null) {
-			return false;
-		}
-
-		return lomap.exists( Int64.getLow(key));
-	}
-
-	/**
-		Removes the mapping of `key` and returns true if such a mapping existed,
-		false otherwise. If `key` is null, the result is unspecified.
-	**/
-	public function remove( key : Int64) : Bool {
-		if( key ==  null) {
-			return false;
-		}
-		
-		var lomap = GetSubMap( Int64.getHigh(key), false);
-		if( lomap == null) {
-			return false;
-		}
-
-		return lomap.remove( Int64.getLow(key));
-	}
+        var lomap = GetSubMap( Int64.getHigh(key), true);
+        lomap.set( Int64.getLow(key), value);
+    }
 
 
-	/**
-		Returns an Iterator over the keys of `this` Map.
-		The order of keys is undefined.
-	**/
-	public function keys() : Iterator<Int64> {
-		return new Int64KeyIterator<T>(SubMaps);
-	}
+    /**
+        Returns the current mapping of `key`.
+        If no such mapping exists, null is returned.
+        If `key` is null, the result is unspecified.
 
-	/**
-		Returns an Iterator over the values of `this` Map.
-		The order of values is undefined.
-	**/
-	public function iterator() : Iterator<T> {
-		return new Int64ValueIterator<T>(SubMaps);
-	}
+        Note that a check like `map.get(key) == null` can hold for two reasons:
 
-	/**
-		Returns a String representation of `this` Map.
-		The exact representation depends on the platform and key-type.
-	**/
-	public function toString() : String {
-		var result : String = "{"; 
+            1. the map has no mapping for `key`
+            2. the map has a mapping with a value of `null`
 
-		var first = true;
-		for( key in this.keys()) {
-			if( first) {
-				first = false;
-			} else {
-				result += ", ";
-			}
-			
-			var value = this.get(key);
-			result += Int64.toStr(key) + ' => $value';
-		}
+        If it is important to distinguish these cases, `exists()` should be
+        used.
 
-		return result + "}";
-	}
+    **/
+    public function get( key : Int64) : Null<T> {
+        if( key ==  null) {
+            return null;
+        }
+
+        var lomap = GetSubMap( Int64.getHigh(key), false);
+        if( lomap == null) {
+            return null;
+        }
+
+        return lomap.get( Int64.getLow(key));
+    }
+
+    /**
+        Returns true if `key` has a mapping, false otherwise.
+        If `key` is null, the result is unspecified.
+    **/
+    public function exists( key : Int64) : Bool {
+        if( key ==  null) {
+            return false;
+        }
+
+        var lomap = GetSubMap( Int64.getHigh(key), false);
+        if( lomap == null) {
+            return false;
+        }
+
+        return lomap.exists( Int64.getLow(key));
+    }
+
+    /**
+        Removes the mapping of `key` and returns true if such a mapping existed,
+        false otherwise. If `key` is null, the result is unspecified.
+    **/
+    public function remove( key : Int64) : Bool {
+        if( key ==  null) {
+            return false;
+        }
+
+        var lomap = GetSubMap( Int64.getHigh(key), false);
+        if( lomap == null) {
+            return false;
+        }
+
+        return lomap.remove( Int64.getLow(key));
+    }
+
+
+    /**
+        Returns an Iterator over the keys of `this` Map.
+        The order of keys is undefined.
+    **/
+    public function keys() : Iterator<Int64> {
+        return new Int64KeyIterator<T>(SubMaps);
+    }
+
+    /**
+        Returns an Iterator over the values of `this` Map.
+        The order of values is undefined.
+    **/
+    public function iterator() : Iterator<T> {
+        return new Int64ValueIterator<T>(SubMaps);
+    }
+
+    /**
+        Returns a String representation of `this` Map.
+        The exact representation depends on the platform and key-type.
+    **/
+    public function toString() : String {
+        var result : String = "{";
+
+        var first = true;
+        for( key in this.keys()) {
+            if( first) {
+                first = false;
+            } else {
+                result += ", ";
+            }
+
+            var value = this.get(key);
+            result += Int64.toStr(key) + ' => $value';
+        }
+
+        return result + "}";
+    }
 
 }
 
-	
+
 // internal helper class for Int64Map<T>
 // all class with matching methods can be used as iterator (duck typing)
 private class Int64MapIteratorBase<T> {
 
-	private var SubMaps : IntMap< IntMap< T>>;  // Hi -> Lo -> Value
-	
-	private var HiIterator : Iterator< Int> = null;
-	private var LoIterator : Iterator< Int> = null;
-	private var CurrentHi : Int = 0;
-	
-	public function new( data : IntMap< IntMap< T>>) : Void {
-		SubMaps = data;
-		HiIterator = SubMaps.keys();
-		LoIterator = null;
-		CurrentHi = 0;
-	};
+    private var SubMaps : IntMap< IntMap< T>>;  // Hi -> Lo -> Value
 
-	/**
-		Returns false if the iteration is complete, true otherwise.
+    private var HiIterator : Iterator< Int> = null;
+    private var LoIterator : Iterator< Int> = null;
+    private var CurrentHi : Int = 0;
 
-		Usually iteration is considered to be complete if all elements of the
-		underlying data structure were handled through calls to next(). However,
-		in custom iterators any logic may be used to determine the completion
-		state.
-	**/
-	public function hasNext() : Bool {
-		
-		if( (LoIterator != null) && LoIterator.hasNext()) {
-			return true;
-		}
-		
-		while( (HiIterator != null) && HiIterator.hasNext()) {
-			CurrentHi = HiIterator.next();
-			LoIterator = SubMaps.get(CurrentHi).keys();
-			if( (LoIterator != null) && LoIterator.hasNext()) {
-				return true;
-			}
-		}
-		
-		HiIterator = null;
-		LoIterator = null;
-		return false;
-	}
+    public function new( data : IntMap< IntMap< T>>) : Void {
+        SubMaps = data;
+        HiIterator = SubMaps.keys();
+        LoIterator = null;
+        CurrentHi = 0;
+    };
+
+    /**
+        Returns false if the iteration is complete, true otherwise.
+
+        Usually iteration is considered to be complete if all elements of the
+        underlying data structure were handled through calls to next(). However,
+        in custom iterators any logic may be used to determine the completion
+        state.
+    **/
+    public function hasNext() : Bool {
+
+        if( (LoIterator != null) && LoIterator.hasNext()) {
+            return true;
+        }
+
+        while( (HiIterator != null) && HiIterator.hasNext()) {
+            CurrentHi = HiIterator.next();
+            LoIterator = SubMaps.get(CurrentHi).keys();
+            if( (LoIterator != null) && LoIterator.hasNext()) {
+                return true;
+            }
+        }
+
+        HiIterator = null;
+        LoIterator = null;
+        return false;
+    }
 
 }
 
@@ -218,23 +218,23 @@
 // all class with matching methods can be used as iterator (duck typing)
 private class Int64KeyIterator<T>extends Int64MapIteratorBase<T> {
 
-	public function new( data : IntMap< IntMap< T>>) : Void {
-		super(data);
-	};
+    public function new( data : IntMap< IntMap< T>>) : Void {
+        super(data);
+    };
 
-	/**
-		Returns the current item of the Iterator and advances to the next one.
+    /**
+        Returns the current item of the Iterator and advances to the next one.
 
-		This method is not required to check hasNext() first. A call to this
-		method while hasNext() is false yields unspecified behavior.
-	**/
-	public function next() : Int64 {
-		if( hasNext()) {
-			return Int64.make( CurrentHi, LoIterator.next());
-		} else {
-			throw "no more elements";
-		}
-	}
+        This method is not required to check hasNext() first. A call to this
+        method while hasNext() is false yields unspecified behavior.
+    **/
+    public function next() : Int64 {
+        if( hasNext()) {
+            return Int64.make( CurrentHi, LoIterator.next());
+        } else {
+            throw "no more elements";
+        }
+    }
 }
 
 
@@ -242,23 +242,23 @@
 // all class with matching methods can be used as iterator (duck typing)
 private class Int64ValueIterator<T> extends Int64MapIteratorBase<T> {
 
-	public function new( data : IntMap< IntMap< T>>) : Void {
-		super(data);
-	};
+    public function new( data : IntMap< IntMap< T>>) : Void {
+        super(data);
+    };
 
-	/**
-		Returns the current item of the Iterator and advances to the next one.
+    /**
+        Returns the current item of the Iterator and advances to the next one.
 
-		This method is not required to check hasNext() first. A call to this
-		method while hasNext() is false yields unspecified behavior.
-	**/
-	public function next() : T {
-		if( hasNext()) {
-			return SubMaps.get(CurrentHi).get(LoIterator.next());
-		} else {
-			throw "no more elements";
-		}
-	}
+        This method is not required to check hasNext() first. A call to this
+        method while hasNext() is false yields unspecified behavior.
+    **/
+    public function next() : T {
+        if( hasNext()) {
+            return SubMaps.get(CurrentHi).get(LoIterator.next());
+        } else {
+            throw "no more elements";
+        }
+    }
 }
 
 
diff --git a/lib/haxe/src/org/apache/thrift/helper/IntSet.hx b/lib/haxe/src/org/apache/thrift/helper/IntSet.hx
index 214f3bd..91e5d8e 100644
--- a/lib/haxe/src/org/apache/thrift/helper/IntSet.hx
+++ b/lib/haxe/src/org/apache/thrift/helper/IntSet.hx
@@ -18,79 +18,79 @@
  */
 
 package org.apache.thrift.helper;
-  
+
 import Map;
 
 
 class IntSet {
-    
+
     private var _elements = new haxe.ds.IntMap<Int>();
     private var _size : Int = 0;
     public var size(get,never) : Int;
-    
+
     public function new( values : Array<Int> = null) {
-		if ( values != null) {
-			for ( value in values) {
-				 add(value);
-			}
-		}
+        if ( values != null) {
+            for ( value in values) {
+                 add(value);
+            }
+        }
     }
 
-	public function iterator():Iterator<Int> {
-		return _elements.keys();
-	}
+    public function iterator():Iterator<Int> {
+        return _elements.keys();
+    }
 
-	public function traceAll() : Void {
-		trace('$_size entries');
-		for(entry in this) {
-			var yes = contains(entry);
-			trace('- $entry, contains() = $yes');
-		}
-	}
+    public function traceAll() : Void {
+        trace('$_size entries');
+        for(entry in this) {
+            var yes = contains(entry);
+            trace('- $entry, contains() = $yes');
+        }
+    }
 
     public function add(o : Int) : Bool {
-		if( _elements.exists(o)) {
-			return false;
-		}
+        if( _elements.exists(o)) {
+            return false;
+        }
         _size++;
         _elements.set(o,_size);
-		return true;
+        return true;
     }
 
     public function clear() : Void {
-		while( _size > 0) {
-			remove( _elements.keys().next());			
-		}
+        while( _size > 0) {
+            remove( _elements.keys().next());
+        }
     }
-    
+
     public function contains(o : Int) : Bool {
-		return _elements.exists(o);
+        return _elements.exists(o);
     }
-    
+
     public function isEmpty() : Bool {
-		return _size == 0;
+        return _size == 0;
     }
-    
+
     public function remove(o : Int) : Bool {
-		if (contains(o)) {
-			_elements.remove(o);
-			_size--;
-			return true;
-		} else {
-			return false;
-		}
+        if (contains(o)) {
+            _elements.remove(o);
+            _size--;
+            return true;
+        } else {
+            return false;
+        }
     }
-    
+
     public function toArray() : Array<Int> {
-		var ret : Array<Int> = new Array<Int>();
-		for (key in _elements.keys()) {
-			ret.push(key);
-		}
-		return ret;
+        var ret : Array<Int> = new Array<Int>();
+        for (key in _elements.keys()) {
+            ret.push(key);
+        }
+        return ret;
     }
-    
-    public function get_size() : Int {		
-		return _size;
+
+    public function get_size() : Int {
+        return _size;
     }
 }
-	
\ No newline at end of file
+    
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/helper/ObjectSet.hx b/lib/haxe/src/org/apache/thrift/helper/ObjectSet.hx
index c590c75..bcf72fb 100644
--- a/lib/haxe/src/org/apache/thrift/helper/ObjectSet.hx
+++ b/lib/haxe/src/org/apache/thrift/helper/ObjectSet.hx
@@ -18,79 +18,79 @@
  */
 
 package org.apache.thrift.helper;
-  
+
 import Map;
 
 
 class ObjectSet<K> {
-    
+
     private var _elements = new haxe.ds.ObjectMap<K,Int>();
     private var _size : Int = 0;
     public var size(get,never) : Int;
-    
+
     public function new( values : Array<K> = null) {
-		if ( values != null) {
-			for ( value in values) {
-				 add(value);
-			}
-		}
+        if ( values != null) {
+            for ( value in values) {
+                 add(value);
+            }
+        }
     }
 
-	public function iterator():Iterator<K> {
-		return _elements.keys();
-	}
+    public function iterator():Iterator<K> {
+        return _elements.keys();
+    }
 
-	public function traceAll() : Void {
-		trace('$_size entries');
-		for(entry in this) {
-			var yes = contains(entry);
-			trace('- $entry, contains() = $yes');
-		}
-	}
+    public function traceAll() : Void {
+        trace('$_size entries');
+        for(entry in this) {
+            var yes = contains(entry);
+            trace('- $entry, contains() = $yes');
+        }
+    }
 
     public function add(o : K) : Bool {
-		if( _elements.exists(o)) {
-			return false;
-		}
+        if( _elements.exists(o)) {
+            return false;
+        }
         _size++;
         _elements.set(o,_size);
-		return true;
+        return true;
     }
 
     public function clear() : Void {
-		while( _size > 0) {
-			remove( _elements.keys().next());			
-		}
+        while( _size > 0) {
+            remove( _elements.keys().next());
+        }
     }
-    
+
     public function contains(o : K) : Bool {
-		return _elements.exists(o);
+        return _elements.exists(o);
     }
-    
+
     public function isEmpty() : Bool {
-		return _size == 0;
+        return _size == 0;
     }
-    
+
     public function remove(o : K) : Bool {
-		if (contains(o)) {
-			_elements.remove(o);
-			_size--;
-			return true;
-		} else {
-			return false;
-		}
+        if (contains(o)) {
+            _elements.remove(o);
+            _size--;
+            return true;
+        } else {
+            return false;
+        }
     }
-    
+
     public function toArray() : Array<K> {
-		var ret : Array<K> = new Array<K>();
-		for (key in _elements.keys()) {
-			ret.push(key);
-		}
-		return ret;
+        var ret : Array<K> = new Array<K>();
+        for (key in _elements.keys()) {
+            ret.push(key);
+        }
+        return ret;
     }
-    
-    public function get_size() : Int {		
-		return _size;
+
+    public function get_size() : Int {
+        return _size;
     }
 }
-	
\ No newline at end of file
+    
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/helper/StringSet.hx b/lib/haxe/src/org/apache/thrift/helper/StringSet.hx
index ee772c7..d8c0d90 100644
--- a/lib/haxe/src/org/apache/thrift/helper/StringSet.hx
+++ b/lib/haxe/src/org/apache/thrift/helper/StringSet.hx
@@ -18,79 +18,79 @@
  */
 
 package org.apache.thrift.helper;
-  
+
 import Map;
 
 
 class StringSet {
-    
+
     private var _elements = new haxe.ds.StringMap<Int>();
     private var _size : Int = 0;
     public var size(get,never) : Int;
-    
+
     public function new( values : Array<String> = null) {
-		if ( values != null) {
-			for ( value in values) {
-				 add(value);
-			}
-		}
+        if ( values != null) {
+            for ( value in values) {
+                 add(value);
+            }
+        }
     }
 
-	public function iterator():Iterator<String> {
-		return _elements.keys();
-	}
+    public function iterator():Iterator<String> {
+        return _elements.keys();
+    }
 
-	public function traceAll() : Void {
-		trace('$_size entries');
-		for(entry in this) {
-			var yes = contains(entry);
-			trace('- $entry, contains() = $yes');
-		}
-	}
+    public function traceAll() : Void {
+        trace('$_size entries');
+        for(entry in this) {
+            var yes = contains(entry);
+            trace('- $entry, contains() = $yes');
+        }
+    }
 
     public function add(o : String) : Bool {
-		if( _elements.exists(o)) {
-			return false;
-		}
+        if( _elements.exists(o)) {
+            return false;
+        }
         _size++;
         _elements.set(o,_size);
-		return true;
+        return true;
     }
 
     public function clear() : Void {
-		while( _size > 0) {
-			remove( _elements.keys().next());			
-		}
+        while( _size > 0) {
+            remove( _elements.keys().next());
+        }
     }
-    
+
     public function contains(o : String) : Bool {
-		return _elements.exists(o);
+        return _elements.exists(o);
     }
-    
+
     public function isEmpty() : Bool {
-		return _size == 0;
+        return _size == 0;
     }
-    
+
     public function remove(o : String) : Bool {
-		if (contains(o)) {
-			_elements.remove(o);
-			_size--;
-			return true;
-		} else {
-			return false;
-		}
+        if (contains(o)) {
+            _elements.remove(o);
+            _size--;
+            return true;
+        } else {
+            return false;
+        }
     }
-    
+
     public function toArray() : Array<String> {
-		var ret : Array<String> = new Array<String>();
-		for (key in _elements.keys()) {
-			ret.push(key);
-		}
-		return ret;
+        var ret : Array<String> = new Array<String>();
+        for (key in _elements.keys()) {
+            ret.push(key);
+        }
+        return ret;
     }
-    
-    public function get_size() : String {		
-		return _size;
+
+    public function get_size() : String {
+        return _size;
     }
 }
-	
\ No newline at end of file
+    
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/meta_data/FieldMetaData.hx b/lib/haxe/src/org/apache/thrift/meta_data/FieldMetaData.hx
index 147eed9..26db113 100644
--- a/lib/haxe/src/org/apache/thrift/meta_data/FieldMetaData.hx
+++ b/lib/haxe/src/org/apache/thrift/meta_data/FieldMetaData.hx
@@ -27,19 +27,19 @@
 *
 */
 class FieldMetaData {
-  
+
   public var fieldName : String;
   public var requirementType : Int;
   public var valueMetaData:FieldValueMetaData;
-  
+
   private static var structMap:Dictionary = new Dictionary();
-  
+
   public function FieldMetaData(name : String, req : Int, vMetaData:FieldValueMetaData) {
     this.fieldName = name;
     this.requirementType = req;
     this.valueMetaData = vMetaData;
   }
-  
+
   public static function addStructMetaDataMap(sClass:Class, map:Dictionary) : Void{
     structMap[sClass] = map;
   }
diff --git a/lib/haxe/src/org/apache/thrift/meta_data/FieldValueMetaData.hx b/lib/haxe/src/org/apache/thrift/meta_data/FieldValueMetaData.hx
index 06c7f48..8879d91 100644
--- a/lib/haxe/src/org/apache/thrift/meta_data/FieldValueMetaData.hx
+++ b/lib/haxe/src/org/apache/thrift/meta_data/FieldValueMetaData.hx
@@ -26,17 +26,17 @@
  * the value(s) of a field
  */
 class FieldValueMetaData {
-  
-  public var type : Int;  
- 
+
+  public var type : Int;
+
   public function FieldValueMetaData(type : Int) {
     this.type = type;
   }
-  
+
   public function isStruct() : Bool {
-    return type == TType.STRUCT; 
+    return type == TType.STRUCT;
   }
-  
+
   public function isContainer() : Bool {
     return type == TType.LIST || type == TType.MAP || type == TType.SET;
   }
diff --git a/lib/haxe/src/org/apache/thrift/meta_data/ListMetaData.hx b/lib/haxe/src/org/apache/thrift/meta_data/ListMetaData.hx
index 36bb2d1..40ca31b 100644
--- a/lib/haxe/src/org/apache/thrift/meta_data/ListMetaData.hx
+++ b/lib/haxe/src/org/apache/thrift/meta_data/ListMetaData.hx
@@ -18,13 +18,14 @@
  */
 
 package org.apache.thrift.meta_data;
-  
+
 class ListMetaData extends FieldValueMetaData {
-    
+
     public var elemMetaData:FieldValueMetaData;
-  
+
     public function ListMetaData(type : Int, eMetaData:FieldValueMetaData) {
       super(type);
       this.elemMetaData = eMetaData;
-    }    
+    }
 }
+ 
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/meta_data/MapMetaData.hx b/lib/haxe/src/org/apache/thrift/meta_data/MapMetaData.hx
index bf0502a..5463e62 100644
--- a/lib/haxe/src/org/apache/thrift/meta_data/MapMetaData.hx
+++ b/lib/haxe/src/org/apache/thrift/meta_data/MapMetaData.hx
@@ -20,13 +20,14 @@
 package org.apache.thrift.meta_data;
 
 class MapMetaData extends FieldValueMetaData {
-  
+
     public var keyMetaData:FieldValueMetaData;
     public var valueMetaData:FieldValueMetaData;
-  
+
     public function MapMetaData(type : Int, kMetaData:FieldValueMetaData, vMetaData:FieldValueMetaData) {
       super(type);
       this.keyMetaData = kMetaData;
       this.valueMetaData = vMetaData;
     }
-}    
+}
+   
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/meta_data/SetMetaData.hx b/lib/haxe/src/org/apache/thrift/meta_data/SetMetaData.hx
index 0ee6c93..a3367f4 100644
--- a/lib/haxe/src/org/apache/thrift/meta_data/SetMetaData.hx
+++ b/lib/haxe/src/org/apache/thrift/meta_data/SetMetaData.hx
@@ -20,11 +20,11 @@
 package org.apache.thrift.meta_data;
 
 class SetMetaData extends FieldValueMetaData {
-  
+
     public var elemMetaData:FieldValueMetaData;
-  
+
     public function SetMetaData(type : Int, eMetaData:FieldValueMetaData) {
       super(type);
-      this.elemMetaData = eMetaData; 
+      this.elemMetaData = eMetaData;
     }
 }
diff --git a/lib/haxe/src/org/apache/thrift/meta_data/StructMetaData.hx b/lib/haxe/src/org/apache/thrift/meta_data/StructMetaData.hx
index bbf11e7..1822dd3 100644
--- a/lib/haxe/src/org/apache/thrift/meta_data/StructMetaData.hx
+++ b/lib/haxe/src/org/apache/thrift/meta_data/StructMetaData.hx
@@ -20,9 +20,9 @@
 package org.apache.thrift.meta_data;
 
 class StructMetaData extends FieldValueMetaData {
-    
+
     public var structClass:Class;
-  
+
     public function StructMetaData(type : Int, sClass:Class) {
       super(type);
       this.structClass = sClass;
diff --git a/lib/haxe/src/org/apache/thrift/protocol/TBinaryProtocol.hx b/lib/haxe/src/org/apache/thrift/protocol/TBinaryProtocol.hx
index 9693b35..c37b74e 100644
--- a/lib/haxe/src/org/apache/thrift/protocol/TBinaryProtocol.hx
+++ b/lib/haxe/src/org/apache/thrift/protocol/TBinaryProtocol.hx
@@ -33,264 +33,264 @@
 */
 class TBinaryProtocol implements TProtocol {
 
-	private static var ANONYMOUS_STRUCT:TStruct = new TStruct();
+    private static var ANONYMOUS_STRUCT:TStruct = new TStruct();
 
-	private static inline var VERSION_MASK : haxe.Int32 = 0xffff0000;
-	private static inline var VERSION_1 : haxe.Int32 = 0x80010000;
+    private static inline var VERSION_MASK : haxe.Int32 = 0xffff0000;
+    private static inline var VERSION_1 : haxe.Int32 = 0x80010000;
 
-	private var strictRead_ : Bool = false;
-	private var strictWrite_ : Bool = true;
-	private var trans_ : TTransport;
+    private var strictRead_ : Bool = false;
+    private var strictWrite_ : Bool = true;
+    private var trans_ : TTransport;
 
-	/**
-	 * Constructor
-	 */
-	public function new(trans:TTransport, strictRead : Bool=false, strictWrite : Bool=true) {
-	  trans_ = trans;
-	  strictRead_ = strictRead;
-	  strictWrite_ = strictWrite;
-	}
+    /**
+     * Constructor
+     */
+    public function new(trans:TTransport, strictRead : Bool=false, strictWrite : Bool=true) {
+      trans_ = trans;
+      strictRead_ = strictRead;
+      strictWrite_ = strictWrite;
+    }
 
-	public function getTransport():TTransport {
-	  return trans_;
-	}
+    public function getTransport():TTransport {
+      return trans_;
+    }
 
-	public function writeMessageBegin(message:TMessage) : Void {
-		if (strictWrite_) {
-		  var version : Int = VERSION_1 | message.type;
-		  writeI32(version);
-		  writeString(message.name);
-		  writeI32(message.seqid);
-		} else {
-		  writeString(message.name);
-		  writeByte(message.type);
-		  writeI32(message.seqid);
-		}
-	}
+    public function writeMessageBegin(message:TMessage) : Void {
+        if (strictWrite_) {
+          var version : Int = VERSION_1 | message.type;
+          writeI32(version);
+          writeString(message.name);
+          writeI32(message.seqid);
+        } else {
+          writeString(message.name);
+          writeByte(message.type);
+          writeI32(message.seqid);
+        }
+    }
 
     public function writeMessageEnd() : Void {}
 
-	public function writeStructBegin(struct:TStruct) : Void {}
+    public function writeStructBegin(struct:TStruct) : Void {}
 
-	public function writeStructEnd() : Void {}
+    public function writeStructEnd() : Void {}
 
-	public function writeFieldBegin(field:TField) : Void {
-	  writeByte(field.type);
-	  writeI16(field.id);
-	}
+    public function writeFieldBegin(field:TField) : Void {
+      writeByte(field.type);
+      writeI16(field.id);
+    }
 
-	public function writeFieldEnd() : Void {}
+    public function writeFieldEnd() : Void {}
 
-	public function writeFieldStop() : Void {
-	  writeByte(TType.STOP);
-	}
+    public function writeFieldStop() : Void {
+      writeByte(TType.STOP);
+    }
 
-	public function writeMapBegin(map:TMap) : Void {
-	  writeByte(map.keyType);
-	  writeByte(map.valueType);
-	  writeI32(map.size);
-	}
+    public function writeMapBegin(map:TMap) : Void {
+      writeByte(map.keyType);
+      writeByte(map.valueType);
+      writeI32(map.size);
+    }
 
-	public function writeMapEnd() : Void {}
+    public function writeMapEnd() : Void {}
 
-	public function writeListBegin(list:TList) : Void {
-		writeByte(list.elemType);
-		writeI32(list.size);
-	}
+    public function writeListBegin(list:TList) : Void {
+        writeByte(list.elemType);
+        writeI32(list.size);
+    }
 
-	public function writeListEnd() : Void {}
+    public function writeListEnd() : Void {}
 
-	public function writeSetBegin(set:TSet) : Void {
-		writeByte(set.elemType);
-		writeI32(set.size);
-	}
+    public function writeSetBegin(set:TSet) : Void {
+        writeByte(set.elemType);
+        writeI32(set.size);
+    }
 
-	public function writeSetEnd() : Void {}
+    public function writeSetEnd() : Void {}
 
-	public function writeBool(b : Bool) : Void {
-		writeByte(b ? 1 : 0);
-	}
+    public function writeBool(b : Bool) : Void {
+        writeByte(b ? 1 : 0);
+    }
 
 
-	public function writeByte(b : Int) : Void {
-		var out = new BytesOutput();
-		out.bigEndian = true;
-		out.writeByte(b);
-		trans_.write(out.getBytes(), 0, 1);
-	}
+    public function writeByte(b : Int) : Void {
+        var out = new BytesOutput();
+        out.bigEndian = true;
+        out.writeByte(b);
+        trans_.write(out.getBytes(), 0, 1);
+    }
 
-	public function writeI16(i16 : Int) : Void {
-		var out = new BytesOutput();
-		out.bigEndian = true;
-		out.writeInt16(i16);
-		trans_.write(out.getBytes(), 0, 2);
-	}
+    public function writeI16(i16 : Int) : Void {
+        var out = new BytesOutput();
+        out.bigEndian = true;
+        out.writeInt16(i16);
+        trans_.write(out.getBytes(), 0, 2);
+    }
 
-	public function writeI32(i32 : Int) : Void {
-		var out = new BytesOutput();
-		out.bigEndian = true;
-		out.writeInt32(i32);
-		trans_.write(out.getBytes(), 0, 4);
-	}
+    public function writeI32(i32 : Int) : Void {
+        var out = new BytesOutput();
+        out.bigEndian = true;
+        out.writeInt32(i32);
+        trans_.write(out.getBytes(), 0, 4);
+    }
 
-	public function writeI64(i64 : haxe.Int64) : Void {
-		var out = new BytesOutput();
-		out.bigEndian = true;
-		var hi = Int64.getHigh(i64);
-		var lo = Int64.getLow(i64);
-		out.writeInt32(hi);
-		out.writeInt32(lo);
-		trans_.write(out.getBytes(), 0, 8);
-	}
+    public function writeI64(i64 : haxe.Int64) : Void {
+        var out = new BytesOutput();
+        out.bigEndian = true;
+        var hi = Int64.getHigh(i64);
+        var lo = Int64.getLow(i64);
+        out.writeInt32(hi);
+        out.writeInt32(lo);
+        trans_.write(out.getBytes(), 0, 8);
+    }
 
-	public function writeDouble(dub:Float) : Void {
-		var out = new BytesOutput();
-		out.bigEndian = true;
-		out.writeDouble(dub);
-		trans_.write(out.getBytes(), 0, 8);
-	}
+    public function writeDouble(dub:Float) : Void {
+        var out = new BytesOutput();
+        out.bigEndian = true;
+        out.writeDouble(dub);
+        trans_.write(out.getBytes(), 0, 8);
+    }
 
-	public function writeString(str : String) : Void {
-		var out = new BytesOutput();
-		out.bigEndian = true;
-		out.writeString(str);
-		var bytes = out.getBytes();
-		writeI32( bytes.length);
-		trans_.write( bytes, 0, bytes.length);
-	}
+    public function writeString(str : String) : Void {
+        var out = new BytesOutput();
+        out.bigEndian = true;
+        out.writeString(str);
+        var bytes = out.getBytes();
+        writeI32( bytes.length);
+        trans_.write( bytes, 0, bytes.length);
+    }
 
-	public function writeBinary(bin:Bytes) : Void {
-		writeI32(bin.length);
-		trans_.write(bin, 0, bin.length);
-	}
+    public function writeBinary(bin:Bytes) : Void {
+        writeI32(bin.length);
+        trans_.write(bin, 0, bin.length);
+    }
 
-	/**
-	 * Reading methods.
-	 */
+    /**
+     * Reading methods.
+     */
 
-	public function readMessageBegin():TMessage {
-		var size : Int = readI32();
-		if (size < 0) {
-			var version : Int = size & VERSION_MASK;
-			if (version != VERSION_1) {
-				throw new TProtocolException(TProtocolException.BAD_VERSION, "Bad version in readMessageBegin");
-			}
-			return new TMessage(readString(), size & 0x000000ff, readI32());
-		} else {
-			if (strictRead_) {
-				throw new TProtocolException(TProtocolException.BAD_VERSION, "Missing version in readMessageBegin, old client?");
-			}
-			return new TMessage(readStringBody(size), readByte(), readI32());
-		}
-	}
+    public function readMessageBegin():TMessage {
+        var size : Int = readI32();
+        if (size < 0) {
+            var version : Int = size & VERSION_MASK;
+            if (version != VERSION_1) {
+                throw new TProtocolException(TProtocolException.BAD_VERSION, "Bad version in readMessageBegin");
+            }
+            return new TMessage(readString(), size & 0x000000ff, readI32());
+        } else {
+            if (strictRead_) {
+                throw new TProtocolException(TProtocolException.BAD_VERSION, "Missing version in readMessageBegin, old client?");
+            }
+            return new TMessage(readStringBody(size), readByte(), readI32());
+        }
+    }
 
-	public function readMessageEnd() : Void {}
+    public function readMessageEnd() : Void {}
 
-	public function readStructBegin():TStruct {
-		return ANONYMOUS_STRUCT;
-	}
+    public function readStructBegin():TStruct {
+        return ANONYMOUS_STRUCT;
+    }
 
-	public function readStructEnd() : Void {}
+    public function readStructEnd() : Void {}
 
-	public function readFieldBegin() : TField {
-		var type : Int = readByte();
-		var id : Int = 0;
-		if (type != TType.STOP)
-		{
-			id = readI16();
-		}
-		return new TField("", type, id);
-	}
+    public function readFieldBegin() : TField {
+        var type : Int = readByte();
+        var id : Int = 0;
+        if (type != TType.STOP)
+        {
+            id = readI16();
+        }
+        return new TField("", type, id);
+    }
 
-	public function readFieldEnd() : Void {}
+    public function readFieldEnd() : Void {}
 
-	public function readMapBegin() : TMap {
-		return new TMap(readByte(), readByte(), readI32());
-	}
+    public function readMapBegin() : TMap {
+        return new TMap(readByte(), readByte(), readI32());
+    }
 
-	public function readMapEnd() : Void {}
+    public function readMapEnd() : Void {}
 
-	public function readListBegin():TList {
-		return new TList(readByte(), readI32());
-	}
+    public function readListBegin():TList {
+        return new TList(readByte(), readI32());
+    }
 
-	public function readListEnd() : Void {}
+    public function readListEnd() : Void {}
 
-	public function readSetBegin() : TSet {
-	  return new TSet(readByte(), readI32());
-	}
+    public function readSetBegin() : TSet {
+      return new TSet(readByte(), readI32());
+    }
 
-	public function readSetEnd() : Void {}
+    public function readSetEnd() : Void {}
 
-	public function readBool() : Bool {
-		return (readByte() == 1);
-	}
+    public function readBool() : Bool {
+        return (readByte() == 1);
+    }
 
 
-	public function readByte() : Int {
-		var buffer = new BytesBuffer();
-		var len = trans_.readAll( buffer, 0, 1);        
-		var inp = new BytesInput( buffer.getBytes(), 0, 1);
-		inp.bigEndian = true;
-		return inp.readByte();
-	}
+    public function readByte() : Int {
+        var buffer = new BytesBuffer();
+        var len = trans_.readAll( buffer, 0, 1);
+        var inp = new BytesInput( buffer.getBytes(), 0, 1);
+        inp.bigEndian = true;
+        return inp.readByte();
+    }
 
-	public function readI16() : Int {
-		var buffer = new BytesBuffer();
-		var len = trans_.readAll( buffer, 0, 2);        
-		var inp = new BytesInput( buffer.getBytes(), 0, 2);
-		inp.bigEndian = true;
-		return inp.readInt16();
-	}
+    public function readI16() : Int {
+        var buffer = new BytesBuffer();
+        var len = trans_.readAll( buffer, 0, 2);
+        var inp = new BytesInput( buffer.getBytes(), 0, 2);
+        inp.bigEndian = true;
+        return inp.readInt16();
+    }
 
-	public function readI32() : Int {
-		var buffer = new BytesBuffer();
-		var len = trans_.readAll( buffer, 0, 4);        
-		var inp = new BytesInput( buffer.getBytes(), 0, 4);
-		inp.bigEndian = true;
-		return inp.readInt32();
-	}
+    public function readI32() : Int {
+        var buffer = new BytesBuffer();
+        var len = trans_.readAll( buffer, 0, 4);
+        var inp = new BytesInput( buffer.getBytes(), 0, 4);
+        inp.bigEndian = true;
+        return inp.readInt32();
+    }
 
-	public function readI64() : haxe.Int64 {
-		var buffer = new BytesBuffer();
-		var len = trans_.readAll( buffer, 0, 8);        
-		var inp = new BytesInput( buffer.getBytes(), 0, 8);
-		inp.bigEndian = true;
-		var hi = inp.readInt32();
-		var lo = inp.readInt32();
-		return Int64.make(hi,lo);
-	}
+    public function readI64() : haxe.Int64 {
+        var buffer = new BytesBuffer();
+        var len = trans_.readAll( buffer, 0, 8);
+        var inp = new BytesInput( buffer.getBytes(), 0, 8);
+        inp.bigEndian = true;
+        var hi = inp.readInt32();
+        var lo = inp.readInt32();
+        return Int64.make(hi,lo);
+    }
 
-	public function readDouble():Float {
-		var buffer = new BytesBuffer();
-		var len = trans_.readAll( buffer, 0, 8);        
-		var inp = new BytesInput( buffer.getBytes(), 0, 8);
-		inp.bigEndian = true;
-		return inp.readDouble();
-	}
+    public function readDouble():Float {
+        var buffer = new BytesBuffer();
+        var len = trans_.readAll( buffer, 0, 8);
+        var inp = new BytesInput( buffer.getBytes(), 0, 8);
+        inp.bigEndian = true;
+        return inp.readDouble();
+    }
 
-	public function readString() : String {
-		return readStringBody( readI32());
-	}
+    public function readString() : String {
+        return readStringBody( readI32());
+    }
 
-	public function readStringBody(len : Int) : String {
-		if( len > 0) {
-			var buffer = new BytesBuffer();
-			trans_.readAll( buffer, 0, len);
-			var inp = new BytesInput( buffer.getBytes(), 0, len);
-			inp.bigEndian = true;
-			return inp.readString(len);
-		} else {
-			return "";
-		}
-	}
+    public function readStringBody(len : Int) : String {
+        if( len > 0) {
+            var buffer = new BytesBuffer();
+            trans_.readAll( buffer, 0, len);
+            var inp = new BytesInput( buffer.getBytes(), 0, len);
+            inp.bigEndian = true;
+            return inp.readString(len);
+        } else {
+            return "";
+        }
+    }
 
-	public function readBinary() : Bytes {
-		var len : Int = readI32();
-		var buffer = new BytesBuffer();
-		trans_.readAll( buffer, 0, len);
-		return buffer.getBytes();
-	}
+    public function readBinary() : Bytes {
+        var len : Int = readI32();
+        var buffer = new BytesBuffer();
+        trans_.readAll( buffer, 0, len);
+        return buffer.getBytes();
+    }
 
 }
 
diff --git a/lib/haxe/src/org/apache/thrift/protocol/TBinaryProtocolFactory.hx b/lib/haxe/src/org/apache/thrift/protocol/TBinaryProtocolFactory.hx
index 0d7c7c5..f4a9bec 100644
--- a/lib/haxe/src/org/apache/thrift/protocol/TBinaryProtocolFactory.hx
+++ b/lib/haxe/src/org/apache/thrift/protocol/TBinaryProtocolFactory.hx
@@ -26,20 +26,20 @@
 * Binary Protocol Factory
 */
 class TBinaryProtocolFactory implements TProtocolFactory {
-	
-	private var strictRead_ : Bool = false;
-	private var strictWrite_ : Bool = true;
 
-	public function new( strictRead : Bool = false, strictWrite : Bool = true) {
-		strictRead_  = strictRead;
-		strictWrite_ = strictWrite;
-	}
+    private var strictRead_ : Bool = false;
+    private var strictWrite_ : Bool = true;
 
-	public function getProtocol( trans : TTransport) : TProtocol  {
-		return new TBinaryProtocol( trans, strictRead_, strictWrite_);
-	}
+    public function new( strictRead : Bool = false, strictWrite : Bool = true) {
+        strictRead_  = strictRead;
+        strictWrite_ = strictWrite;
+    }
+
+    public function getProtocol( trans : TTransport) : TProtocol  {
+        return new TBinaryProtocol( trans, strictRead_, strictWrite_);
+    }
 }
 
 
 
-	
\ No newline at end of file
+    
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/protocol/TField.hx b/lib/haxe/src/org/apache/thrift/protocol/TField.hx
index 20f3fb9..3f5498d 100644
--- a/lib/haxe/src/org/apache/thrift/protocol/TField.hx
+++ b/lib/haxe/src/org/apache/thrift/protocol/TField.hx
@@ -16,28 +16,28 @@
  * specific language governing permissions and limitations
  * under the License.
  */
- 
+
 package org.apache.thrift.protocol;
-    
+
 class TField {
-    
+
     public var name : String;
     public var type : Int;
     public var id : Int;
-      
+
     public function new(n : String = "", t : Int = 0, i : Int = 0) {
       name = n;
       type = t;
       id = i;
     }
-    
+
     public function toString() : String {
       return '<TField name:"$name" type:"$type" field-id:"$id">';
     }
-    
+
     public function equals( otherField : TField) : Bool {
-      return (type == otherField.type) 
+      return (type == otherField.type)
           && (id == otherField.id);
     }
-  
+
 }
diff --git a/lib/haxe/src/org/apache/thrift/protocol/TJSONProtocol.hx b/lib/haxe/src/org/apache/thrift/protocol/TJSONProtocol.hx
index 1a93332..aeed8f4 100644
--- a/lib/haxe/src/org/apache/thrift/protocol/TJSONProtocol.hx
+++ b/lib/haxe/src/org/apache/thrift/protocol/TJSONProtocol.hx
@@ -47,747 +47,747 @@
 */
 class TJSONProtocol implements TProtocol {
 
-	public var trans(default,null) : TTransport;
+    public var trans(default,null) : TTransport;
 
-	// Stack of nested contexts that we may be in
-	private var contextStack : GenericStack<JSONBaseContext> = new GenericStack<JSONBaseContext>();
+    // Stack of nested contexts that we may be in
+    private var contextStack : GenericStack<JSONBaseContext> = new GenericStack<JSONBaseContext>();
 
-	// Current context that we are in
-	private var context : JSONBaseContext;
+    // Current context that we are in
+    private var context : JSONBaseContext;
 
-	// Reader that manages a 1-byte buffer
-	private var reader : LookaheadReader;
+    // Reader that manages a 1-byte buffer
+    private var reader : LookaheadReader;
 
-	// whether the underlying system holds Strings as UTF-8
-	// http://old.haxe.org/manual/encoding
-	private static var utf8Strings = haxe.Utf8.validate("Ç-ß-Æ-Ю-Ш");
+    // whether the underlying system holds Strings as UTF-8
+    // http://old.haxe.org/manual/encoding
+    private static var utf8Strings = haxe.Utf8.validate("Ç-ß-Æ-Ю-Ш");
 
-	// TJSONProtocol Constructor
-	public function new( trans : TTransport)
-	{
-		this.trans = trans;
-		this.context = new JSONBaseContext(this);
-		this.reader = new LookaheadReader(this);
-	}
+    // TJSONProtocol Constructor
+    public function new( trans : TTransport)
+    {
+        this.trans = trans;
+        this.context = new JSONBaseContext(this);
+        this.reader = new LookaheadReader(this);
+    }
 
-	public function getTransport() : TTransport {
-	  return trans;
-	}
+    public function getTransport() : TTransport {
+      return trans;
+    }
 
-	public function writeMessageBegin(message:TMessage) : Void {
-		WriteJSONArrayStart();
-		WriteJSONInteger( JSONConstants.VERSION);
-		WriteJSONString( BytesFromString(message.name));
-		WriteJSONInteger( message.type);
-		WriteJSONInteger( message.seqid);
-	}
+    public function writeMessageBegin(message:TMessage) : Void {
+        WriteJSONArrayStart();
+        WriteJSONInteger( JSONConstants.VERSION);
+        WriteJSONString( BytesFromString(message.name));
+        WriteJSONInteger( message.type);
+        WriteJSONInteger( message.seqid);
+    }
 
-	public function writeMessageEnd() : Void {
-		WriteJSONArrayEnd();
-	}
+    public function writeMessageEnd() : Void {
+        WriteJSONArrayEnd();
+    }
 
-	public function writeStructBegin(struct:TStruct) : Void {
-		WriteJSONObjectStart();
-	}
+    public function writeStructBegin(struct:TStruct) : Void {
+        WriteJSONObjectStart();
+    }
 
-	public function writeStructEnd() : Void {
-		WriteJSONObjectEnd();
-	}
+    public function writeStructEnd() : Void {
+        WriteJSONObjectEnd();
+    }
 
-	public function writeFieldBegin(field:TField) : Void {
-		WriteJSONInteger( field.id );
-		WriteJSONObjectStart();
-		WriteJSONString( BytesFromString( JSONConstants.GetTypeNameForTypeID( field.type)));
-	}
+    public function writeFieldBegin(field:TField) : Void {
+        WriteJSONInteger( field.id );
+        WriteJSONObjectStart();
+        WriteJSONString( BytesFromString( JSONConstants.GetTypeNameForTypeID( field.type)));
+    }
 
-	public function writeFieldEnd() : Void {
-		WriteJSONObjectEnd();
-	}
+    public function writeFieldEnd() : Void {
+        WriteJSONObjectEnd();
+    }
 
-	public function writeFieldStop() : Void { }
+    public function writeFieldStop() : Void { }
 
-	public function writeMapBegin(map:TMap) : Void {
-		WriteJSONArrayStart();
-		WriteJSONString( BytesFromString( JSONConstants.GetTypeNameForTypeID( map.keyType)));
-		WriteJSONString( BytesFromString( JSONConstants.GetTypeNameForTypeID( map.valueType)));
-		WriteJSONInteger( map.size);
-		WriteJSONObjectStart();
-	}
+    public function writeMapBegin(map:TMap) : Void {
+        WriteJSONArrayStart();
+        WriteJSONString( BytesFromString( JSONConstants.GetTypeNameForTypeID( map.keyType)));
+        WriteJSONString( BytesFromString( JSONConstants.GetTypeNameForTypeID( map.valueType)));
+        WriteJSONInteger( map.size);
+        WriteJSONObjectStart();
+    }
 
-	public function writeMapEnd() : Void {
-		WriteJSONObjectEnd();
-		WriteJSONArrayEnd();
-	}
+    public function writeMapEnd() : Void {
+        WriteJSONObjectEnd();
+        WriteJSONArrayEnd();
+    }
 
-	public function writeListBegin(list:TList) : Void {
-		WriteJSONArrayStart();
-		WriteJSONString( BytesFromString( JSONConstants.GetTypeNameForTypeID( list.elemType )));
-		WriteJSONInteger( list.size);
-	}
+    public function writeListBegin(list:TList) : Void {
+        WriteJSONArrayStart();
+        WriteJSONString( BytesFromString( JSONConstants.GetTypeNameForTypeID( list.elemType )));
+        WriteJSONInteger( list.size);
+    }
 
-	public function writeListEnd() : Void {
-		WriteJSONArrayEnd();
-	}
+    public function writeListEnd() : Void {
+        WriteJSONArrayEnd();
+    }
 
-	public function writeSetBegin(set:TSet) : Void {
-		WriteJSONArrayStart();
-		WriteJSONString( BytesFromString( JSONConstants.GetTypeNameForTypeID( set.elemType)));
-		WriteJSONInteger( set.size);
-	}
+    public function writeSetBegin(set:TSet) : Void {
+        WriteJSONArrayStart();
+        WriteJSONString( BytesFromString( JSONConstants.GetTypeNameForTypeID( set.elemType)));
+        WriteJSONInteger( set.size);
+    }
 
-	public function writeSetEnd() : Void {
-		WriteJSONArrayEnd();
-	}
+    public function writeSetEnd() : Void {
+        WriteJSONArrayEnd();
+    }
 
-	public function writeBool(b : Bool) : Void {
-		if( b)
-			WriteJSONInteger( 1);
-		else
-			WriteJSONInteger( 0);
-	}
+    public function writeBool(b : Bool) : Void {
+        if( b)
+            WriteJSONInteger( 1);
+        else
+            WriteJSONInteger( 0);
+    }
 
-	public function writeByte(b : Int) : Void {
-		WriteJSONInteger( b);
-	}
+    public function writeByte(b : Int) : Void {
+        WriteJSONInteger( b);
+    }
 
-	public function writeI16(i16 : Int) : Void {
-		WriteJSONInteger( i16);
-	}
+    public function writeI16(i16 : Int) : Void {
+        WriteJSONInteger( i16);
+    }
 
-	public function writeI32(i32 : Int) : Void {
-		WriteJSONInteger( i32);
-	}
+    public function writeI32(i32 : Int) : Void {
+        WriteJSONInteger( i32);
+    }
 
-	public function writeI64(i64 : haxe.Int64) : Void {
-		WriteJSONInt64( i64);
-	}
+    public function writeI64(i64 : haxe.Int64) : Void {
+        WriteJSONInt64( i64);
+    }
 
-	public function writeDouble(dub:Float) : Void {
-		WriteJSONDouble(dub);
-	}
+    public function writeDouble(dub:Float) : Void {
+        WriteJSONDouble(dub);
+    }
 
-	public function writeString(str : String) : Void {
-		WriteJSONString( BytesFromString(str));
-	}
+    public function writeString(str : String) : Void {
+        WriteJSONString( BytesFromString(str));
+    }
 
-	public function writeBinary(bin:Bytes) : Void {
-		WriteJSONBase64(bin);
-	}
+    public function writeBinary(bin:Bytes) : Void {
+        WriteJSONBase64(bin);
+    }
 
-	public function readMessageBegin():TMessage {
-		var message : TMessage = new TMessage();
-		ReadJSONArrayStart();
-		if (ReadJSONInteger() != JSONConstants.VERSION)
-		{
-			throw new TProtocolException(TProtocolException.BAD_VERSION,
-										 "Message contained bad version.");
-		}
+    public function readMessageBegin():TMessage {
+        var message : TMessage = new TMessage();
+        ReadJSONArrayStart();
+        if (ReadJSONInteger() != JSONConstants.VERSION)
+        {
+            throw new TProtocolException(TProtocolException.BAD_VERSION,
+                                         "Message contained bad version.");
+        }
 
-		message.name = ReadJSONString(false);
-		message.type = ReadJSONInteger();
-		message.seqid = ReadJSONInteger();
-		return message;
-	}
+        message.name = ReadJSONString(false);
+        message.type = ReadJSONInteger();
+        message.seqid = ReadJSONInteger();
+        return message;
+    }
 
-	public function readMessageEnd() : Void {
-		ReadJSONArrayEnd();
-	}
+    public function readMessageEnd() : Void {
+        ReadJSONArrayEnd();
+    }
 
-	public function readStructBegin():TStruct {
-		ReadJSONObjectStart();
-		return new TStruct();
-	}
+    public function readStructBegin():TStruct {
+        ReadJSONObjectStart();
+        return new TStruct();
+    }
 
-	public function readStructEnd() : Void {
-		ReadJSONObjectEnd();
-	}
+    public function readStructEnd() : Void {
+        ReadJSONObjectEnd();
+    }
 
-	public function readFieldBegin() : TField {
-		var field : TField = new TField();
-		var ch = reader.Peek();
-		if (StringFromBytes(ch) == JSONConstants.RBRACE)
-		{
-			field.type = TType.STOP;
-		}
-		else
-		{
-			field.id = ReadJSONInteger();
-			ReadJSONObjectStart();
-			field.type = JSONConstants.GetTypeIDForTypeName( ReadJSONString(false));
-		}
-		return field;
-	}
+    public function readFieldBegin() : TField {
+        var field : TField = new TField();
+        var ch = reader.Peek();
+        if (StringFromBytes(ch) == JSONConstants.RBRACE)
+        {
+            field.type = TType.STOP;
+        }
+        else
+        {
+            field.id = ReadJSONInteger();
+            ReadJSONObjectStart();
+            field.type = JSONConstants.GetTypeIDForTypeName( ReadJSONString(false));
+        }
+        return field;
+    }
 
-	public function readFieldEnd() : Void {
-		ReadJSONObjectEnd();
-	}
+    public function readFieldEnd() : Void {
+        ReadJSONObjectEnd();
+    }
 
-	public function readMapBegin() : TMap {
-		ReadJSONArrayStart();
-		var KeyType = JSONConstants.GetTypeIDForTypeName( ReadJSONString(false));
-		var ValueType = JSONConstants.GetTypeIDForTypeName( ReadJSONString(false));
-		var Count : Int = ReadJSONInteger();
-		ReadJSONObjectStart();
+    public function readMapBegin() : TMap {
+        ReadJSONArrayStart();
+        var KeyType = JSONConstants.GetTypeIDForTypeName( ReadJSONString(false));
+        var ValueType = JSONConstants.GetTypeIDForTypeName( ReadJSONString(false));
+        var Count : Int = ReadJSONInteger();
+        ReadJSONObjectStart();
 
-		var map = new TMap( KeyType, ValueType, Count);
-		return map;
-	}
+        var map = new TMap( KeyType, ValueType, Count);
+        return map;
+    }
 
-	public function readMapEnd() : Void {
-		ReadJSONObjectEnd();
-		ReadJSONArrayEnd();
-	}
+    public function readMapEnd() : Void {
+        ReadJSONObjectEnd();
+        ReadJSONArrayEnd();
+    }
 
-	public function readListBegin():TList {
-		ReadJSONArrayStart();
-		var ElementType = JSONConstants.GetTypeIDForTypeName( ReadJSONString(false));
-		var Count : Int = ReadJSONInteger();
+    public function readListBegin():TList {
+        ReadJSONArrayStart();
+        var ElementType = JSONConstants.GetTypeIDForTypeName( ReadJSONString(false));
+        var Count : Int = ReadJSONInteger();
 
-		var list = new TList( ElementType, Count);
-		return list;
-	}
+        var list = new TList( ElementType, Count);
+        return list;
+    }
 
-	public function readListEnd() : Void {
-		ReadJSONArrayEnd();
-	}
+    public function readListEnd() : Void {
+        ReadJSONArrayEnd();
+    }
 
-	public function readSetBegin() : TSet {
-		ReadJSONArrayStart();
-		var ElementType = JSONConstants.GetTypeIDForTypeName( ReadJSONString(false));
-		var Count : Int = ReadJSONInteger();
+    public function readSetBegin() : TSet {
+        ReadJSONArrayStart();
+        var ElementType = JSONConstants.GetTypeIDForTypeName( ReadJSONString(false));
+        var Count : Int = ReadJSONInteger();
 
-		var set = new TSet( ElementType, Count);
-		return set;
-	}
+        var set = new TSet( ElementType, Count);
+        return set;
+    }
 
-	public function readSetEnd() : Void {
-		ReadJSONArrayEnd();
-	}
+    public function readSetEnd() : Void {
+        ReadJSONArrayEnd();
+    }
 
-	public function readBool() : Bool {
-		return (ReadJSONInteger() != 0);
-	}
+    public function readBool() : Bool {
+        return (ReadJSONInteger() != 0);
+    }
 
-	public function readByte() : Int {
-		return ReadJSONInteger();
-	}
+    public function readByte() : Int {
+        return ReadJSONInteger();
+    }
 
-	public function readI16() : Int {
-		return ReadJSONInteger();
-	}
+    public function readI16() : Int {
+        return ReadJSONInteger();
+    }
 
-	public function readI32() : Int {
-		return ReadJSONInteger();
-	}
+    public function readI32() : Int {
+        return ReadJSONInteger();
+    }
 
-	public function readI64() : haxe.Int64 {
-		return ReadJSONInt64();
-	}
+    public function readI64() : haxe.Int64 {
+        return ReadJSONInt64();
+    }
 
-	public function readDouble():Float {
-		return ReadJSONDouble();
-	}
+    public function readDouble():Float {
+        return ReadJSONDouble();
+    }
 
-	public function readString() : String {
+    public function readString() : String {
         return ReadJSONString(false);
-	}
+    }
 
-	public function readBinary() : Bytes {
-		return ReadJSONBase64();
-	}
+    public function readBinary() : Bytes {
+        return ReadJSONBase64();
+    }
 
-	// Push a new JSON context onto the stack.
-	private function  PushContext(c : JSONBaseContext) : Void {
-		contextStack.add(context);
-		context = c;
-	}
+    // Push a new JSON context onto the stack.
+    private function  PushContext(c : JSONBaseContext) : Void {
+        contextStack.add(context);
+        context = c;
+    }
 
-	// Pop the last JSON context off the stack
-	private function  PopContext() : Void {
-		context = contextStack.pop();
-	}
+    // Pop the last JSON context off the stack
+    private function  PopContext() : Void {
+        context = contextStack.pop();
+    }
 
 
-	// Write the bytes in array buf as a JSON characters, escaping as needed
-	private function WriteJSONString( b : Bytes) : Void {
-		context.Write();
+    // Write the bytes in array buf as a JSON characters, escaping as needed
+    private function WriteJSONString( b : Bytes) : Void {
+        context.Write();
 
-		var tmp = BytesFromString( JSONConstants.QUOTE);
-		trans.write( tmp, 0, tmp.length);
+        var tmp = BytesFromString( JSONConstants.QUOTE);
+        trans.write( tmp, 0, tmp.length);
 
-		for (i in 0 ... b.length) {
-			var value = b.get(i);
+        for (i in 0 ... b.length) {
+            var value = b.get(i);
 
-			if ((value & 0x00FF) >= 0x30)
-			{
-				if (String.fromCharCode(value) == JSONConstants.BACKSLASH.charAt(0))
-				{
-					tmp = BytesFromString( JSONConstants.BACKSLASH + JSONConstants.BACKSLASH);
-					trans.write( tmp, 0, tmp.length);
-				}
-				else
-				{
-					trans.write( b, i, 1);
-				}
-			}
-			else
-			{
-				var num = JSONConstants.JSON_CHAR_TABLE[value];
-				if (num == 1)
-				{
-					trans.write( b, i, 1);
-				}
-				else if (num > 1)
-				{
-					var buf = new BytesBuffer();
-					buf.addString( JSONConstants.BACKSLASH);
-					buf.addByte( num);
-					tmp = buf.getBytes();
-					trans.write( tmp, 0, tmp.length);
-				}
-				else
-				{
-					var buf = new BytesBuffer();
-					buf.addString( JSONConstants.ESCSEQ);
-					buf.addString( HexChar( (value & 0xFF000000) >> 12));
-					buf.addString( HexChar( (value & 0x00FF0000) >> 8));
-					buf.addString( HexChar( (value & 0x0000FF00) >> 4));
-					buf.addString( HexChar( value & 0x000000FF));
-					tmp = buf.getBytes();
-					trans.write( tmp, 0, tmp.length);
-				}
-			}
-		}
+            if ((value & 0x00FF) >= 0x30)
+            {
+                if (String.fromCharCode(value) == JSONConstants.BACKSLASH.charAt(0))
+                {
+                    tmp = BytesFromString( JSONConstants.BACKSLASH + JSONConstants.BACKSLASH);
+                    trans.write( tmp, 0, tmp.length);
+                }
+                else
+                {
+                    trans.write( b, i, 1);
+                }
+            }
+            else
+            {
+                var num = JSONConstants.JSON_CHAR_TABLE[value];
+                if (num == 1)
+                {
+                    trans.write( b, i, 1);
+                }
+                else if (num > 1)
+                {
+                    var buf = new BytesBuffer();
+                    buf.addString( JSONConstants.BACKSLASH);
+                    buf.addByte( num);
+                    tmp = buf.getBytes();
+                    trans.write( tmp, 0, tmp.length);
+                }
+                else
+                {
+                    var buf = new BytesBuffer();
+                    buf.addString( JSONConstants.ESCSEQ);
+                    buf.addString( HexChar( (value & 0xFF000000) >> 12));
+                    buf.addString( HexChar( (value & 0x00FF0000) >> 8));
+                    buf.addString( HexChar( (value & 0x0000FF00) >> 4));
+                    buf.addString( HexChar( value & 0x000000FF));
+                    tmp = buf.getBytes();
+                    trans.write( tmp, 0, tmp.length);
+                }
+            }
+        }
 
-		tmp = BytesFromString( JSONConstants.QUOTE);
-		trans.write( tmp, 0, tmp.length);
-	}
+        tmp = BytesFromString( JSONConstants.QUOTE);
+        trans.write( tmp, 0, tmp.length);
+    }
 
-	// Write out number as a JSON value. If the context dictates so,
-	// it will be wrapped in quotes to output as a JSON string.
-	private function WriteJSONInteger( num : Int) : Void {
-		context.Write();
+    // Write out number as a JSON value. If the context dictates so,
+    // it will be wrapped in quotes to output as a JSON string.
+    private function WriteJSONInteger( num : Int) : Void {
+        context.Write();
 
-		var str : String = "";
-		var escapeNum : Bool = context.EscapeNumbers();
+        var str : String = "";
+        var escapeNum : Bool = context.EscapeNumbers();
 
-		if (escapeNum) {
-			str += JSONConstants.QUOTE;
-		}
+        if (escapeNum) {
+            str += JSONConstants.QUOTE;
+        }
 
-		str += Std.string(num);
+        str += Std.string(num);
 
-		if (escapeNum) {
-			str += JSONConstants.QUOTE;
-		}
+        if (escapeNum) {
+            str += JSONConstants.QUOTE;
+        }
 
-		var tmp = BytesFromString( str);
-		trans.write( tmp, 0, tmp.length);
-	}
+        var tmp = BytesFromString( str);
+        trans.write( tmp, 0, tmp.length);
+    }
 
-	// Write out number as a JSON value. If the context dictates so,
-	// it will be wrapped in quotes to output as a JSON string.
-	private function WriteJSONInt64( num : Int64) : Void {
-		context.Write();
+    // Write out number as a JSON value. If the context dictates so,
+    // it will be wrapped in quotes to output as a JSON string.
+    private function WriteJSONInt64( num : Int64) : Void {
+        context.Write();
 
-		var str : String = "";
-		var escapeNum : Bool = context.EscapeNumbers();
+        var str : String = "";
+        var escapeNum : Bool = context.EscapeNumbers();
 
-		if (escapeNum) {
-			str += JSONConstants.QUOTE;
-		}
+        if (escapeNum) {
+            str += JSONConstants.QUOTE;
+        }
 
-		str += Std.string(num);
+        str += Std.string(num);
 
-		if (escapeNum) {
-			str += JSONConstants.QUOTE;
-		}
+        if (escapeNum) {
+            str += JSONConstants.QUOTE;
+        }
 
-		var tmp = BytesFromString( str);
-		trans.write( tmp, 0, tmp.length);
-	}
+        var tmp = BytesFromString( str);
+        trans.write( tmp, 0, tmp.length);
+    }
 
-	// Write out a double as a JSON value. If it is NaN or infinity or if the
-	// context dictates escaping, Write out as JSON string.
-	private function WriteJSONDouble(num : Float) : Void {
-		context.Write();
+    // Write out a double as a JSON value. If it is NaN or infinity or if the
+    // context dictates escaping, Write out as JSON string.
+    private function WriteJSONDouble(num : Float) : Void {
+        context.Write();
 
 
-		var special : Bool = false;
-		var rendered : String = "";
-		if( Math.isNaN(num)) {
-			special = true;
-			rendered = JSONConstants.FLOAT_IS_NAN;
-		} else if (! Math.isFinite(num)) {
-			special = true;
-			if( num > 0) {
-				rendered = JSONConstants.FLOAT_IS_POS_INF;
-			} else {
-				rendered = JSONConstants.FLOAT_IS_NEG_INF;
-			}
-		} else {
-			rendered = Std.string(num);  // plain and simple float number
-		}
+        var special : Bool = false;
+        var rendered : String = "";
+        if( Math.isNaN(num)) {
+            special = true;
+            rendered = JSONConstants.FLOAT_IS_NAN;
+        } else if (! Math.isFinite(num)) {
+            special = true;
+            if( num > 0) {
+                rendered = JSONConstants.FLOAT_IS_POS_INF;
+            } else {
+                rendered = JSONConstants.FLOAT_IS_NEG_INF;
+            }
+        } else {
+            rendered = Std.string(num);  // plain and simple float number
+        }
 
-		// compose output
-		var escapeNum : Bool = special || context.EscapeNumbers();
-		var str : String = "";
-		if (escapeNum) {
-			str += JSONConstants.QUOTE;
-		}
-		str += rendered;
-		if (escapeNum) {
-			str += JSONConstants.QUOTE;
-		}
+        // compose output
+        var escapeNum : Bool = special || context.EscapeNumbers();
+        var str : String = "";
+        if (escapeNum) {
+            str += JSONConstants.QUOTE;
+        }
+        str += rendered;
+        if (escapeNum) {
+            str += JSONConstants.QUOTE;
+        }
 
-		var tmp = BytesFromString( str);
-		trans.write( tmp, 0, tmp.length);
-	}
+        var tmp = BytesFromString( str);
+        trans.write( tmp, 0, tmp.length);
+    }
 
-	// Write out contents of byte array b as a JSON string with base-64 encoded data
-	private function WriteJSONBase64( b : Bytes) : Void {
-		context.Write();
+    // Write out contents of byte array b as a JSON string with base-64 encoded data
+    private function WriteJSONBase64( b : Bytes) : Void {
+        context.Write();
 
-		var buf = new BytesBuffer();
-		buf.addString( JSONConstants.QUOTE);
-		buf.addString( Base64.encode(b));
-		buf.addString( JSONConstants.QUOTE);
+        var buf = new BytesBuffer();
+        buf.addString( JSONConstants.QUOTE);
+        buf.addString( Base64.encode(b));
+        buf.addString( JSONConstants.QUOTE);
 
-		var tmp = buf.getBytes();
-		trans.write( tmp, 0, tmp.length);
-	}
+        var tmp = buf.getBytes();
+        trans.write( tmp, 0, tmp.length);
+    }
 
-	private function WriteJSONObjectStart() : Void {
-		context.Write();
-		var tmp = BytesFromString( JSONConstants.LBRACE);
-		trans.write( tmp, 0, tmp.length);
-		PushContext( new JSONPairContext(this));
-	}
+    private function WriteJSONObjectStart() : Void {
+        context.Write();
+        var tmp = BytesFromString( JSONConstants.LBRACE);
+        trans.write( tmp, 0, tmp.length);
+        PushContext( new JSONPairContext(this));
+    }
 
-	private function WriteJSONObjectEnd() : Void {
-		PopContext();
-		var tmp = BytesFromString( JSONConstants.RBRACE);
-		trans.write( tmp, 0, tmp.length);
-	}
+    private function WriteJSONObjectEnd() : Void {
+        PopContext();
+        var tmp = BytesFromString( JSONConstants.RBRACE);
+        trans.write( tmp, 0, tmp.length);
+    }
 
-	private function WriteJSONArrayStart() : Void {
-		context.Write();
-		var tmp = BytesFromString( JSONConstants.LBRACKET);
-		trans.write( tmp, 0, tmp.length);
-		PushContext( new JSONListContext(this));
-	}
+    private function WriteJSONArrayStart() : Void {
+        context.Write();
+        var tmp = BytesFromString( JSONConstants.LBRACKET);
+        trans.write( tmp, 0, tmp.length);
+        PushContext( new JSONListContext(this));
+    }
 
-	private function WriteJSONArrayEnd() : Void {
-		PopContext();
-		var tmp = BytesFromString( JSONConstants.RBRACKET);
-		trans.write( tmp, 0, tmp.length);
-	}
+    private function WriteJSONArrayEnd() : Void {
+        PopContext();
+        var tmp = BytesFromString( JSONConstants.RBRACKET);
+        trans.write( tmp, 0, tmp.length);
+    }
 
 
-	/**
-	 * Reading methods.
-	 */
+    /**
+     * Reading methods.
+     */
 
-	// Read a byte that must match char, otherwise an exception is thrown.
-	public function ReadJSONSyntaxChar( char : String) : Void {
-		var b = BytesFromString( char);
-		
-		var ch = reader.Read();
-		if (ch.get(0) != b.get(0))
-		{
-			throw new TProtocolException(TProtocolException.INVALID_DATA,
-										 'Unexpected character: $ch');
-		}
-	}
+    // Read a byte that must match char, otherwise an exception is thrown.
+    public function ReadJSONSyntaxChar( char : String) : Void {
+        var b = BytesFromString( char);
 
-	// Read in a JSON string, unescaping as appropriate.
+        var ch = reader.Read();
+        if (ch.get(0) != b.get(0))
+        {
+            throw new TProtocolException(TProtocolException.INVALID_DATA,
+                                         'Unexpected character: $ch');
+        }
+    }
+
+    // Read in a JSON string, unescaping as appropriate.
     // Skip Reading from the context if skipContext is true.
-	private function ReadJSONString(skipContext : Bool) : String
-	{
-		if (!skipContext)
-		{
-			context.Read();
-		}
+    private function ReadJSONString(skipContext : Bool) : String
+    {
+        if (!skipContext)
+        {
+            context.Read();
+        }
 
-		var buffer : BytesBuffer = new BytesBuffer();
+        var buffer : BytesBuffer = new BytesBuffer();
 
-		ReadJSONSyntaxChar( JSONConstants.QUOTE);
-		while (true)
-		{
-			var ch = reader.Read();
+        ReadJSONSyntaxChar( JSONConstants.QUOTE);
+        while (true)
+        {
+            var ch = reader.Read();
 
-			// end of string?
-			if (StringFromBytes(ch) == JSONConstants.QUOTE)
-			{
-				break;
-			}
+            // end of string?
+            if (StringFromBytes(ch) == JSONConstants.QUOTE)
+            {
+                break;
+            }
 
-			// escaped?
-			if (StringFromBytes(ch) != JSONConstants.ESCSEQ.charAt(0))
-			{
-				buffer.addByte( ch.get(0));
-				continue;
-			}
+            // escaped?
+            if (StringFromBytes(ch) != JSONConstants.ESCSEQ.charAt(0))
+            {
+                buffer.addByte( ch.get(0));
+                continue;
+            }
 
-			// distinguish between \uXXXX (hex unicode) and \X (control chars)
-			ch = reader.Read();
-			if (StringFromBytes(ch) != JSONConstants.ESCSEQ.charAt(1))
-			{
-				var value = JSONConstants.ESCAPE_CHARS_TO_VALUES[ch.get(0)];
-				if( value == null)
-				{
-					throw new TProtocolException( TProtocolException.INVALID_DATA, "Expected control char");
-				}
-				buffer.addByte( value);
-				continue;
-			}
+            // distinguish between \uXXXX (hex unicode) and \X (control chars)
+            ch = reader.Read();
+            if (StringFromBytes(ch) != JSONConstants.ESCSEQ.charAt(1))
+            {
+                var value = JSONConstants.ESCAPE_CHARS_TO_VALUES[ch.get(0)];
+                if( value == null)
+                {
+                    throw new TProtocolException( TProtocolException.INVALID_DATA, "Expected control char");
+                }
+                buffer.addByte( value);
+                continue;
+            }
 
 
-			// it's \uXXXX
-			var hexbuf = new BytesBuffer();
-			var hexlen = trans.readAll( hexbuf, 0, 4);
-			if( hexlen != 4)
-			{
-				throw new TProtocolException( TProtocolException.INVALID_DATA, "Not enough data for \\uNNNN sequence");
-			}
+            // it's \uXXXX
+            var hexbuf = new BytesBuffer();
+            var hexlen = trans.readAll( hexbuf, 0, 4);
+            if( hexlen != 4)
+            {
+                throw new TProtocolException( TProtocolException.INVALID_DATA, "Not enough data for \\uNNNN sequence");
+            }
 
-			var hexdigits = hexbuf.getBytes();
-			var charcode = 0;
-			charcode = (charcode << 4) + HexVal( String.fromCharCode(hexdigits.get(0)));
-			charcode = (charcode << 4) + HexVal( String.fromCharCode(hexdigits.get(1)));
-			charcode = (charcode << 4) + HexVal( String.fromCharCode(hexdigits.get(2)));
-			charcode = (charcode << 4) + HexVal( String.fromCharCode(hexdigits.get(3)));
-			buffer.addString( String.fromCharCode(charcode));
-		}
+            var hexdigits = hexbuf.getBytes();
+            var charcode = 0;
+            charcode = (charcode << 4) + HexVal( String.fromCharCode(hexdigits.get(0)));
+            charcode = (charcode << 4) + HexVal( String.fromCharCode(hexdigits.get(1)));
+            charcode = (charcode << 4) + HexVal( String.fromCharCode(hexdigits.get(2)));
+            charcode = (charcode << 4) + HexVal( String.fromCharCode(hexdigits.get(3)));
+            buffer.addString( String.fromCharCode(charcode));
+        }
 
-		return StringFromBytes( buffer.getBytes());
-	}
+        return StringFromBytes( buffer.getBytes());
+    }
 
-	// Return true if the given byte could be a valid part of a JSON number.
-	private function IsJSONNumeric(b : Int) : Bool {
-		switch (b)
-		{
-			case "+".code:  return true;
-			case "-".code:  return true;
-			case ".".code:  return true;
-			case "0".code:  return true;
-			case "1".code:  return true;
-			case "2".code:  return true;
-			case "3".code:  return true;
-			case "4".code:  return true;
-			case "5".code:  return true;
-			case "6".code:  return true;
-			case "7".code:  return true;
-			case "8".code:  return true;
-			case "9".code:  return true;
-			case "E".code:  return true;
-			case "e".code:  return true;
-		}
-		return false;
-	}
+    // Return true if the given byte could be a valid part of a JSON number.
+    private function IsJSONNumeric(b : Int) : Bool {
+        switch (b)
+        {
+            case "+".code:  return true;
+            case "-".code:  return true;
+            case ".".code:  return true;
+            case "0".code:  return true;
+            case "1".code:  return true;
+            case "2".code:  return true;
+            case "3".code:  return true;
+            case "4".code:  return true;
+            case "5".code:  return true;
+            case "6".code:  return true;
+            case "7".code:  return true;
+            case "8".code:  return true;
+            case "9".code:  return true;
+            case "E".code:  return true;
+            case "e".code:  return true;
+        }
+        return false;
+    }
 
-	// Read in a sequence of characters that are all valid in JSON numbers. Does
-	// not do a complete regex check to validate that this is actually a number.
-	private function ReadJSONNumericChars() : String
-	{
-		var buffer : BytesBuffer = new BytesBuffer();
-		while (true)
-		{
-			var ch = reader.Peek();
-			if( ! IsJSONNumeric( ch.get(0)))
-			{
-				break;
-			}
-			buffer.addByte( reader.Read().get(0));
-		}
-		return StringFromBytes( buffer.getBytes());
-	}
+    // Read in a sequence of characters that are all valid in JSON numbers. Does
+    // not do a complete regex check to validate that this is actually a number.
+    private function ReadJSONNumericChars() : String
+    {
+        var buffer : BytesBuffer = new BytesBuffer();
+        while (true)
+        {
+            var ch = reader.Peek();
+            if( ! IsJSONNumeric( ch.get(0)))
+            {
+                break;
+            }
+            buffer.addByte( reader.Read().get(0));
+        }
+        return StringFromBytes( buffer.getBytes());
+    }
 
-	// Read in a JSON number. If the context dictates, Read in enclosing quotes.
-	private function ReadJSONInteger() : Int {
-		context.Read();
+    // Read in a JSON number. If the context dictates, Read in enclosing quotes.
+    private function ReadJSONInteger() : Int {
+        context.Read();
 
-		if (context.EscapeNumbers()) {
-			ReadJSONSyntaxChar( JSONConstants.QUOTE);
-		}
+        if (context.EscapeNumbers()) {
+            ReadJSONSyntaxChar( JSONConstants.QUOTE);
+        }
 
-		var str : String = ReadJSONNumericChars();
+        var str : String = ReadJSONNumericChars();
 
-		if (context.EscapeNumbers()) {
-			ReadJSONSyntaxChar( JSONConstants.QUOTE);
-		}
+        if (context.EscapeNumbers()) {
+            ReadJSONSyntaxChar( JSONConstants.QUOTE);
+        }
 
-		var value = Std.parseInt(str);
-		if( value == null) {
-			throw new TProtocolException(TProtocolException.INVALID_DATA, 'Bad numeric data: $str');
-		}
+        var value = Std.parseInt(str);
+        if( value == null) {
+            throw new TProtocolException(TProtocolException.INVALID_DATA, 'Bad numeric data: $str');
+        }
 
-		return value;
-	}
+        return value;
+    }
 
-	// Read in a JSON number. If the context dictates, Read in enclosing quotes.
-	private function ReadJSONInt64() : haxe.Int64 {
-		context.Read();
+    // Read in a JSON number. If the context dictates, Read in enclosing quotes.
+    private function ReadJSONInt64() : haxe.Int64 {
+        context.Read();
 
-		if (context.EscapeNumbers()) {
-			ReadJSONSyntaxChar( JSONConstants.QUOTE);
-		}
+        if (context.EscapeNumbers()) {
+            ReadJSONSyntaxChar( JSONConstants.QUOTE);
+        }
 
-		var str : String = ReadJSONNumericChars();
-		if( str.length == 0) {
-			throw new TProtocolException(TProtocolException.INVALID_DATA, 'Bad numeric data: $str');
-		}
+        var str : String = ReadJSONNumericChars();
+        if( str.length == 0) {
+            throw new TProtocolException(TProtocolException.INVALID_DATA, 'Bad numeric data: $str');
+        }
 
-		if (context.EscapeNumbers()) {
-			ReadJSONSyntaxChar( JSONConstants.QUOTE);
-		}
+        if (context.EscapeNumbers()) {
+            ReadJSONSyntaxChar( JSONConstants.QUOTE);
+        }
 
-	    // process sign
-		var bMinus = false;
-		var startAt = 0;
-		if( (str.charAt(0) == "+") || (str.charAt(0) == "-")) {
-			bMinus = (str.charAt(0) == "-");
-			startAt++;
-		}
+        // process sign
+        var bMinus = false;
+        var startAt = 0;
+        if( (str.charAt(0) == "+") || (str.charAt(0) == "-")) {
+            bMinus = (str.charAt(0) == "-");
+            startAt++;
+        }
 
-		// process digits
-		var value : Int64 = Int64.make(0,0);
-		var bGotDigits = false;
-		for( i in startAt ... str.length) {
-			var ch = str.charAt(i);
-			var digit = JSONConstants.DECIMAL_DIGITS[ch];
-			if( digit == null) {
-				throw new TProtocolException(TProtocolException.INVALID_DATA, 'Bad numeric data: $str');
-			}
-			bGotDigits = true;
+        // process digits
+        var value : Int64 = Int64.make(0,0);
+        var bGotDigits = false;
+        for( i in startAt ... str.length) {
+            var ch = str.charAt(i);
+            var digit = JSONConstants.DECIMAL_DIGITS[ch];
+            if( digit == null) {
+                throw new TProtocolException(TProtocolException.INVALID_DATA, 'Bad numeric data: $str');
+            }
+            bGotDigits = true;
 
-			// these are decimal digits
-			value = Int64.mul( value, Int64.make(0,10));
-			value = Int64.add( value, Int64.make(0,digit));
-		}
+            // these are decimal digits
+            value = Int64.mul( value, Int64.make(0,10));
+            value = Int64.add( value, Int64.make(0,digit));
+        }
 
-		// process pending minus sign, if applicable
-		// this should also handle the edge case MIN_INT64 correctly
-		if( bMinus && (Int64.compare(value,Int64.make(0,0)) > 0)) {
-			value = Int64.neg( value);
-			bMinus = false;
-		}
+        // process pending minus sign, if applicable
+        // this should also handle the edge case MIN_INT64 correctly
+        if( bMinus && (Int64.compare(value,Int64.make(0,0)) > 0)) {
+            value = Int64.neg( value);
+            bMinus = false;
+        }
 
-		if( ! bGotDigits) {
-			throw new TProtocolException(TProtocolException.INVALID_DATA, 'Bad numeric data: $str');
-		}
-			
-		return value;
-	}
+        if( ! bGotDigits) {
+            throw new TProtocolException(TProtocolException.INVALID_DATA, 'Bad numeric data: $str');
+        }
 
-	// Read in a JSON double value. Throw if the value is not wrapped in quotes
-	// when expected or if wrapped in quotes when not expected.
-	private function ReadJSONDouble() : Float {
-		context.Read();
-		
-		var str : String = "";
-		if (StringFromBytes(reader.Peek()) == JSONConstants.QUOTE) {
-			str = ReadJSONString(true);
-			
-			// special cases
-			if( str == JSONConstants.FLOAT_IS_NAN) {
-				return Math.NaN;
-			}
-			if( str == JSONConstants.FLOAT_IS_POS_INF) {
-				return Math.POSITIVE_INFINITY;
-			}
-			if( str == JSONConstants.FLOAT_IS_NEG_INF) {
-				return Math.NEGATIVE_INFINITY;
-			}
-			
-			if( ! context.EscapeNumbers())	{
-				// throw - we should not be in a string in this case
-				throw new TProtocolException(TProtocolException.INVALID_DATA, "Numeric data unexpectedly quoted");
-			}
-		}
-		else
-		{
-			if( context.EscapeNumbers())	{
-				// This will throw - we should have had a quote if EscapeNumbers() == true
-				ReadJSONSyntaxChar( JSONConstants.QUOTE);
-			}
+        return value;
+    }
 
-			str = ReadJSONNumericChars();
-		}
+    // Read in a JSON double value. Throw if the value is not wrapped in quotes
+    // when expected or if wrapped in quotes when not expected.
+    private function ReadJSONDouble() : Float {
+        context.Read();
 
-		// parse and check - we should have at least one valid digit
-		var dub = Std.parseFloat( str);
-		if( (str.length == 0) || Math.isNaN(dub)) {
-			throw new TProtocolException(TProtocolException.INVALID_DATA, 'Bad numeric data: $str');
-		}
+        var str : String = "";
+        if (StringFromBytes(reader.Peek()) == JSONConstants.QUOTE) {
+            str = ReadJSONString(true);
 
-		return dub;
-	}
+            // special cases
+            if( str == JSONConstants.FLOAT_IS_NAN) {
+                return Math.NaN;
+            }
+            if( str == JSONConstants.FLOAT_IS_POS_INF) {
+                return Math.POSITIVE_INFINITY;
+            }
+            if( str == JSONConstants.FLOAT_IS_NEG_INF) {
+                return Math.NEGATIVE_INFINITY;
+            }
 
-	// Read in a JSON string containing base-64 encoded data and decode it.
-	private function ReadJSONBase64() : Bytes
-	{
-		var str = ReadJSONString(false);
-		return Base64.decode( str);
-	}
+            if( ! context.EscapeNumbers())    {
+                // throw - we should not be in a string in this case
+                throw new TProtocolException(TProtocolException.INVALID_DATA, "Numeric data unexpectedly quoted");
+            }
+        }
+        else
+        {
+            if( context.EscapeNumbers())    {
+                // This will throw - we should have had a quote if EscapeNumbers() == true
+                ReadJSONSyntaxChar( JSONConstants.QUOTE);
+            }
 
-	private function ReadJSONObjectStart() : Void {
-		context.Read();
-		ReadJSONSyntaxChar( JSONConstants.LBRACE);
-		PushContext(new JSONPairContext(this));
-	}
+            str = ReadJSONNumericChars();
+        }
 
-	private function ReadJSONObjectEnd() : Void {
-		ReadJSONSyntaxChar( JSONConstants.RBRACE);
-		PopContext();
-	}
+        // parse and check - we should have at least one valid digit
+        var dub = Std.parseFloat( str);
+        if( (str.length == 0) || Math.isNaN(dub)) {
+            throw new TProtocolException(TProtocolException.INVALID_DATA, 'Bad numeric data: $str');
+        }
 
-	private function ReadJSONArrayStart() : Void {
-		context.Read();
-		ReadJSONSyntaxChar( JSONConstants.LBRACKET);
-		PushContext(new JSONListContext(this));
-	}
+        return dub;
+    }
 
-	private function ReadJSONArrayEnd() : Void {
-		ReadJSONSyntaxChar( JSONConstants.RBRACKET);
-		PopContext();
-	}
+    // Read in a JSON string containing base-64 encoded data and decode it.
+    private function ReadJSONBase64() : Bytes
+    {
+        var str = ReadJSONString(false);
+        return Base64.decode( str);
+    }
+
+    private function ReadJSONObjectStart() : Void {
+        context.Read();
+        ReadJSONSyntaxChar( JSONConstants.LBRACE);
+        PushContext(new JSONPairContext(this));
+    }
+
+    private function ReadJSONObjectEnd() : Void {
+        ReadJSONSyntaxChar( JSONConstants.RBRACE);
+        PopContext();
+    }
+
+    private function ReadJSONArrayStart() : Void {
+        context.Read();
+        ReadJSONSyntaxChar( JSONConstants.LBRACKET);
+        PushContext(new JSONListContext(this));
+    }
+
+    private function ReadJSONArrayEnd() : Void {
+        ReadJSONSyntaxChar( JSONConstants.RBRACKET);
+        PopContext();
+    }
 
 
-	public static function BytesFromString( str : String) : Bytes {
-		var buf = new BytesBuffer();
-		if( utf8Strings)
-			buf.addString( str);  // no need to encode on UTF8 targets, the string is just fine
-		else
-			buf.addString( Utf8.encode( str));
-		return buf.getBytes();
-	}
+    public static function BytesFromString( str : String) : Bytes {
+        var buf = new BytesBuffer();
+        if( utf8Strings)
+            buf.addString( str);  // no need to encode on UTF8 targets, the string is just fine
+        else
+            buf.addString( Utf8.encode( str));
+        return buf.getBytes();
+    }
 
-	public static function StringFromBytes( buf : Bytes) : String {
-		var inp = new BytesInput( buf);
-		if( buf.length == 0)
-			return "";  // readString() would return null in that case, which is wrong
-		var str = inp.readString( buf.length);
-		if( utf8Strings)
-			return str;  // no need to decode on UTF8 targets, the string is just fine
-		else
-			return Utf8.decode( str);
-	}
+    public static function StringFromBytes( buf : Bytes) : String {
+        var inp = new BytesInput( buf);
+        if( buf.length == 0)
+            return "";  // readString() would return null in that case, which is wrong
+        var str = inp.readString( buf.length);
+        if( utf8Strings)
+            return str;  // no need to decode on UTF8 targets, the string is just fine
+        else
+            return Utf8.decode( str);
+    }
 
-	// Convert a byte containing a hex char ('0'-'9' or 'a'-'f') into its corresponding hex value
-	private static function HexVal(char : String) : Int {
-		var value = JSONConstants.HEX_DIGITS[char];
-		if( value == null) {
-			throw new TProtocolException(TProtocolException.INVALID_DATA, 'Expected hex character: $char');
-		}
-		return value;
-	}
+    // Convert a byte containing a hex char ('0'-'9' or 'a'-'f') into its corresponding hex value
+    private static function HexVal(char : String) : Int {
+        var value = JSONConstants.HEX_DIGITS[char];
+        if( value == null) {
+            throw new TProtocolException(TProtocolException.INVALID_DATA, 'Expected hex character: $char');
+        }
+        return value;
+    }
 
-	// Convert a byte containing a hex nibble to its corresponding hex character
-	private static function HexChar(nibble : Int) : String
-	{
-		return "0123456789abcdef".charAt(nibble & 0x0F);
-	}
+    // Convert a byte containing a hex nibble to its corresponding hex character
+    private static function HexChar(nibble : Int) : String
+    {
+        return "0123456789abcdef".charAt(nibble & 0x0F);
+    }
 
 
 }
@@ -795,136 +795,136 @@
 
 @:allow(TJSONProtocol)
 class JSONConstants {
-	public static var COMMA = ",";
-	public static var COLON = ":";
-	public static var LBRACE = "{";
-	public static var RBRACE = "}";
-	public static var LBRACKET = "[";
-	public static var RBRACKET = "]";
-	public static var QUOTE = "\"";
-	public static var BACKSLASH = "\\";
+    public static var COMMA = ",";
+    public static var COLON = ":";
+    public static var LBRACE = "{";
+    public static var RBRACE = "}";
+    public static var LBRACKET = "[";
+    public static var RBRACKET = "]";
+    public static var QUOTE = "\"";
+    public static var BACKSLASH = "\\";
 
-	public static var ESCSEQ = "\\u";
+    public static var ESCSEQ = "\\u";
 
-	public static var FLOAT_IS_NAN = "NaN";
-	public static var FLOAT_IS_POS_INF = "Infinity";
-	public static var FLOAT_IS_NEG_INF = "-Infinity";
-	
-	public static var VERSION = 1;
-	public static var JSON_CHAR_TABLE = [
-		0,  0,  0,  0,  0,  0,  0,  0,
-		"b".code, "t".code, "n".code,  0, "f".code, "r".code,  0,  0,
-		0,  0,  0,  0,  0,  0,  0,  0,
-		0,  0,  0,  0,  0,  0,  0,  0,
-		1,  1, "\"".code,  1,  1,  1,  1,  1,
-		1,  1,  1,  1,  1,  1,  1,  1,
-	];
+    public static var FLOAT_IS_NAN = "NaN";
+    public static var FLOAT_IS_POS_INF = "Infinity";
+    public static var FLOAT_IS_NEG_INF = "-Infinity";
 
-	public static var ESCAPE_CHARS     = ['"','\\','/','b','f','n','r','t'];
-	public static var ESCAPE_CHARS_TO_VALUES = [
-		"\"".code => 0x22,
-		"\\".code => 0x5C,
-		"/".code  => 0x2F,
-		"b".code  => 0x08,
-		"f".code  => 0x0C,
-		"n".code  => 0x0A,
-		"r".code  => 0x0D,
-		"t".code  => 0x09
-	];
+    public static var VERSION = 1;
+    public static var JSON_CHAR_TABLE = [
+        0,  0,  0,  0,  0,  0,  0,  0,
+        "b".code, "t".code, "n".code,  0, "f".code, "r".code,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,
+        1,  1, "\"".code,  1,  1,  1,  1,  1,
+        1,  1,  1,  1,  1,  1,  1,  1,
+    ];
 
-	public static var DECIMAL_DIGITS = [
-		"0" => 0,
-		"1" => 1,
-		"2" => 2,
-		"3" => 3,
-		"4" => 4,
-		"5" => 5,
-		"6" => 6,
-		"7" => 7,
-		"8" => 8,
-		"9" => 9
-	];
+    public static var ESCAPE_CHARS     = ['"','\\','/','b','f','n','r','t'];
+    public static var ESCAPE_CHARS_TO_VALUES = [
+        "\"".code => 0x22,
+        "\\".code => 0x5C,
+        "/".code  => 0x2F,
+        "b".code  => 0x08,
+        "f".code  => 0x0C,
+        "n".code  => 0x0A,
+        "r".code  => 0x0D,
+        "t".code  => 0x09
+    ];
 
-	public static var HEX_DIGITS = [
-		"0" => 0,
-		"1" => 1,
-		"2" => 2,
-		"3" => 3,
-		"4" => 4,
-		"5" => 5,
-		"6" => 6,
-		"7" => 7,
-		"8" => 8,
-		"9" => 9,
-		"A" => 10,
-		"a" => 10,
-		"B" => 11,
-		"b" => 11,
-		"C" => 12,
-		"c" => 12,
-		"D" => 13,
-		"d" => 13,
-		"E" => 14,
-		"e" => 14,
-		"F" => 15,
-		"f" => 15
-	];
+    public static var DECIMAL_DIGITS = [
+        "0" => 0,
+        "1" => 1,
+        "2" => 2,
+        "3" => 3,
+        "4" => 4,
+        "5" => 5,
+        "6" => 6,
+        "7" => 7,
+        "8" => 8,
+        "9" => 9
+    ];
+
+    public static var HEX_DIGITS = [
+        "0" => 0,
+        "1" => 1,
+        "2" => 2,
+        "3" => 3,
+        "4" => 4,
+        "5" => 5,
+        "6" => 6,
+        "7" => 7,
+        "8" => 8,
+        "9" => 9,
+        "A" => 10,
+        "a" => 10,
+        "B" => 11,
+        "b" => 11,
+        "C" => 12,
+        "c" => 12,
+        "D" => 13,
+        "d" => 13,
+        "E" => 14,
+        "e" => 14,
+        "F" => 15,
+        "f" => 15
+    ];
 
 
-	public static var DEF_STRING_SIZE = 16;
+    public static var DEF_STRING_SIZE = 16;
 
-	public static var NAME_BOOL   = 'tf';
-	public static var NAME_BYTE   = 'i8';
-	public static var NAME_I16    = 'i16';
-	public static var NAME_I32    = 'i32';
-	public static var NAME_I64    = 'i64';
-	public static var NAME_DOUBLE = 'dbl';
-	public static var NAME_STRUCT = 'rec';
-	public static var NAME_STRING = 'str';
-	public static var NAME_MAP    = 'map';
-	public static var NAME_LIST   = 'lst';
-	public static var NAME_SET    = 'set';
+    public static var NAME_BOOL   = 'tf';
+    public static var NAME_BYTE   = 'i8';
+    public static var NAME_I16    = 'i16';
+    public static var NAME_I32    = 'i32';
+    public static var NAME_I64    = 'i64';
+    public static var NAME_DOUBLE = 'dbl';
+    public static var NAME_STRUCT = 'rec';
+    public static var NAME_STRING = 'str';
+    public static var NAME_MAP    = 'map';
+    public static var NAME_LIST   = 'lst';
+    public static var NAME_SET    = 'set';
 
-	public static function GetTypeNameForTypeID(typeID : Int) : String {
-		switch (typeID)
-		{
-			case TType.BOOL:     return NAME_BOOL;
-			case TType.BYTE:     return NAME_BYTE;
-			case TType.I16:		 return NAME_I16;
-			case TType.I32:		 return NAME_I32;
-			case TType.I64:		 return NAME_I64;
-			case TType.DOUBLE:	 return NAME_DOUBLE;
-			case TType.STRING:	 return NAME_STRING;
-			case TType.STRUCT:	 return NAME_STRUCT;
-			case TType.MAP:		 return NAME_MAP;
-			case TType.SET:		 return NAME_SET;
-			case TType.LIST:	 return NAME_LIST;
-		}
-		throw new TProtocolException(TProtocolException.NOT_IMPLEMENTED, "Unrecognized type");
-	}
+    public static function GetTypeNameForTypeID(typeID : Int) : String {
+        switch (typeID)
+        {
+            case TType.BOOL:     return NAME_BOOL;
+            case TType.BYTE:     return NAME_BYTE;
+            case TType.I16:         return NAME_I16;
+            case TType.I32:         return NAME_I32;
+            case TType.I64:         return NAME_I64;
+            case TType.DOUBLE:     return NAME_DOUBLE;
+            case TType.STRING:     return NAME_STRING;
+            case TType.STRUCT:     return NAME_STRUCT;
+            case TType.MAP:         return NAME_MAP;
+            case TType.SET:         return NAME_SET;
+            case TType.LIST:     return NAME_LIST;
+        }
+        throw new TProtocolException(TProtocolException.NOT_IMPLEMENTED, "Unrecognized type");
+    }
 
-	private static var NAMES_TO_TYPES = [
-		NAME_BOOL   => TType.BOOL,
-		NAME_BYTE   => TType.BYTE,
-		NAME_I16    => TType.I16,
-		NAME_I32    => TType.I32,
-		NAME_I64    => TType.I64,
-		NAME_DOUBLE => TType.DOUBLE,
-		NAME_STRING => TType.STRING,
-		NAME_STRUCT => TType.STRUCT,
-		NAME_MAP    => TType.MAP,
-		NAME_SET    => TType.SET,
-		NAME_LIST   => TType.LIST
-	];
+    private static var NAMES_TO_TYPES = [
+        NAME_BOOL   => TType.BOOL,
+        NAME_BYTE   => TType.BYTE,
+        NAME_I16    => TType.I16,
+        NAME_I32    => TType.I32,
+        NAME_I64    => TType.I64,
+        NAME_DOUBLE => TType.DOUBLE,
+        NAME_STRING => TType.STRING,
+        NAME_STRUCT => TType.STRUCT,
+        NAME_MAP    => TType.MAP,
+        NAME_SET    => TType.SET,
+        NAME_LIST   => TType.LIST
+    ];
 
-	public static function GetTypeIDForTypeName(name : String) : Int
-	{
-		var type = NAMES_TO_TYPES[name];
-		if( null != type) {
-			return type;
-		}
-		throw new TProtocolException(TProtocolException.NOT_IMPLEMENTED, "Unrecognized type");
-	}
+    public static function GetTypeIDForTypeName(name : String) : Int
+    {
+        var type = NAMES_TO_TYPES[name];
+        if( null != type) {
+            return type;
+        }
+        throw new TProtocolException(TProtocolException.NOT_IMPLEMENTED, "Unrecognized type");
+    }
 
 }
 
@@ -934,19 +934,19 @@
 @:allow(TJSONProtocol)
 class JSONBaseContext
 {
-	private var proto : TJSONProtocol;
+    private var proto : TJSONProtocol;
 
-	public function new(proto : TJSONProtocol )
-	{
-		this.proto = proto;
-	}
+    public function new(proto : TJSONProtocol )
+    {
+        this.proto = proto;
+    }
 
-	public function Write() : Void { }
-	public function Read() : Void { }
+    public function Write() : Void { }
+    public function Read() : Void { }
 
-	public function EscapeNumbers() : Bool {
-		return false;
-	}
+    public function EscapeNumbers() : Bool {
+        return false;
+    }
 }
 
 
@@ -955,36 +955,36 @@
 @:allow(TJSONProtocol)
 class JSONListContext extends JSONBaseContext
 {
-	public function new( proto : TJSONProtocol) {
-		super(proto);
-	}
+    public function new( proto : TJSONProtocol) {
+        super(proto);
+    }
 
-	private var first : Bool = true;
+    private var first : Bool = true;
 
-	public override function Write() : Void {
-		if (first)
-		{
-			first = false;
-		}
-		else
-		{
-			var buf = new BytesBuffer();
-			buf.addString( JSONConstants.COMMA);
-			var tmp = buf.getBytes();
-			proto.trans.write( tmp, 0, tmp.length);
-		}
-	}
+    public override function Write() : Void {
+        if (first)
+        {
+            first = false;
+        }
+        else
+        {
+            var buf = new BytesBuffer();
+            buf.addString( JSONConstants.COMMA);
+            var tmp = buf.getBytes();
+            proto.trans.write( tmp, 0, tmp.length);
+        }
+    }
 
-	public override function Read() : Void {
-		if (first)
-		{
-			first = false;
-		}
-		else
-		{
-			proto.ReadJSONSyntaxChar( JSONConstants.COMMA);
-		}
-	}
+    public override function Read() : Void {
+        if (first)
+        {
+            first = false;
+        }
+        else
+        {
+            proto.ReadJSONSyntaxChar( JSONConstants.COMMA);
+        }
+    }
 }
 
 
@@ -996,78 +996,78 @@
 @:allow(TJSONProtocol)
 class JSONPairContext extends JSONBaseContext
 {
-	public function new( proto : TJSONProtocol ) {
-		super( proto);
-	}
+    public function new( proto : TJSONProtocol ) {
+        super( proto);
+    }
 
-	private var first : Bool = true;
-	private var colon : Bool  = true;
+    private var first : Bool = true;
+    private var colon : Bool  = true;
 
-	public override function Write() : Void {
-		if (first)
-		{
-			first = false;
-			colon = true;
-		}
-		else
-		{
-			var buf = new BytesBuffer();
-			buf.addString( colon ? JSONConstants.COLON : JSONConstants.COMMA);
-			var tmp = buf.getBytes();
-			proto.trans.write( tmp, 0, tmp.length);
-			colon = !colon;
-		}
-	}
+    public override function Write() : Void {
+        if (first)
+        {
+            first = false;
+            colon = true;
+        }
+        else
+        {
+            var buf = new BytesBuffer();
+            buf.addString( colon ? JSONConstants.COLON : JSONConstants.COMMA);
+            var tmp = buf.getBytes();
+            proto.trans.write( tmp, 0, tmp.length);
+            colon = !colon;
+        }
+    }
 
-	public override function Read() : Void {
-		if (first)
-		{
-			first = false;
-			colon = true;
-		}
-		else
-		{
-			proto.ReadJSONSyntaxChar( colon ? JSONConstants.COLON : JSONConstants.COMMA);
-			colon = !colon;
-		}
-	}
+    public override function Read() : Void {
+        if (first)
+        {
+            first = false;
+            colon = true;
+        }
+        else
+        {
+            proto.ReadJSONSyntaxChar( colon ? JSONConstants.COLON : JSONConstants.COMMA);
+            colon = !colon;
+        }
+    }
 
-	public override function EscapeNumbers() : Bool
-	{
-		return colon;
-	}
+    public override function EscapeNumbers() : Bool
+    {
+        return colon;
+    }
 }
 
 // Holds up to one byte from the transport
 @:allow(TJSONProtocol)
 class LookaheadReader {
 
-	private var proto : TJSONProtocol;
-	private var data : Bytes;
+    private var proto : TJSONProtocol;
+    private var data : Bytes;
 
-	public function new( proto : TJSONProtocol ) {
-		this.proto = proto;
-		data = null;
-	}
+    public function new( proto : TJSONProtocol ) {
+        this.proto = proto;
+        data = null;
+    }
 
-	
-	// Return and consume the next byte to be Read, either taking it from the
-	// data buffer if present or getting it from the transport otherwise.
-	public function Read() : Bytes {
-		var retval = Peek();
-		data = null;
-		return retval;
-	}
 
-	// Return the next byte to be Read without consuming, filling the data
-	// buffer if it has not been filled alReady.
-	public function Peek() : Bytes {
-		if (data == null) {
-			var buf = new BytesBuffer();
-			proto.trans.readAll(buf, 0, 1);
-			data = buf.getBytes();
-		}
-		return data;
-	}
+    // Return and consume the next byte to be Read, either taking it from the
+    // data buffer if present or getting it from the transport otherwise.
+    public function Read() : Bytes {
+        var retval = Peek();
+        data = null;
+        return retval;
+    }
+
+    // Return the next byte to be Read without consuming, filling the data
+    // buffer if it has not been filled alReady.
+    public function Peek() : Bytes {
+        if (data == null) {
+            var buf = new BytesBuffer();
+            proto.trans.readAll(buf, 0, 1);
+            data = buf.getBytes();
+        }
+        return data;
+    }
 }
 
diff --git a/lib/haxe/src/org/apache/thrift/protocol/TJSONProtocolFactory.hx b/lib/haxe/src/org/apache/thrift/protocol/TJSONProtocolFactory.hx
index 169629a..363558a 100644
--- a/lib/haxe/src/org/apache/thrift/protocol/TJSONProtocolFactory.hx
+++ b/lib/haxe/src/org/apache/thrift/protocol/TJSONProtocolFactory.hx
@@ -26,15 +26,15 @@
 * JSON Protocol Factory
 */
 class TJSONProtocolFactory implements TProtocolFactory {
-	
-	public function new() {
-	}
 
-	public function getProtocol( trans : TTransport) : TProtocol  {
-		return new TJSONProtocol( trans);
-	}
+    public function new() {
+    }
+
+    public function getProtocol( trans : TTransport) : TProtocol  {
+        return new TJSONProtocol( trans);
+    }
 }
 
 
 
-	
\ No newline at end of file
+    
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/protocol/TList.hx b/lib/haxe/src/org/apache/thrift/protocol/TList.hx
index d6c15c1..5a1fb55 100644
--- a/lib/haxe/src/org/apache/thrift/protocol/TList.hx
+++ b/lib/haxe/src/org/apache/thrift/protocol/TList.hx
@@ -16,14 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
- 
+
 package org.apache.thrift.protocol;
-  
+
 class TList {
 
     public var elemType : Int;
     public var size : Int;
-  
+
       public function new(t : Int = 0, s : Int = 0) {
         elemType = t;
         size = s;
diff --git a/lib/haxe/src/org/apache/thrift/protocol/TMap.hx b/lib/haxe/src/org/apache/thrift/protocol/TMap.hx
index 5af8c4e..f4e6288 100644
--- a/lib/haxe/src/org/apache/thrift/protocol/TMap.hx
+++ b/lib/haxe/src/org/apache/thrift/protocol/TMap.hx
@@ -16,19 +16,19 @@
  * specific language governing permissions and limitations
  * under the License.
  */
- 
+
 package org.apache.thrift.protocol;
 
 class TMap {
-    
+
     public var keyType : Int;
     public var valueType : Int;
     public var size : Int;
-  
+
     public function new(k : Int = 0, v : Int = 0, s : Int = 0) {
       keyType = k;
       valueType = v;
       size = s;
     }
- 
+
 }
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/protocol/TMessage.hx b/lib/haxe/src/org/apache/thrift/protocol/TMessage.hx
index 98c883b..58d71a9 100644
--- a/lib/haxe/src/org/apache/thrift/protocol/TMessage.hx
+++ b/lib/haxe/src/org/apache/thrift/protocol/TMessage.hx
@@ -16,25 +16,25 @@
  * specific language governing permissions and limitations
  * under the License.
  */
- 
+
 package org.apache.thrift.protocol;
-  
+
 class TMessage {
-    
+
     public var name : String;
     public var type : Int;
     public var seqid : Int;
-  
+
     public function new(n : String = "", t : Int = 0, s : Int = 0) {
       name = n;
       type = t;
       seqid = s;
     }
-    
+
     public function toString() : String {
       return "<TMessage name:'" + name + "' type: " + type + " seqid:" + seqid + ">";
     }
-    
+
     public function equals(other:TMessage) : Bool {
       return name == other.name && type == other.type && seqid == other.seqid;
     }
diff --git a/lib/haxe/src/org/apache/thrift/protocol/TMessageType.hx b/lib/haxe/src/org/apache/thrift/protocol/TMessageType.hx
index b141940..7cb38b3 100644
--- a/lib/haxe/src/org/apache/thrift/protocol/TMessageType.hx
+++ b/lib/haxe/src/org/apache/thrift/protocol/TMessageType.hx
@@ -16,12 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
- 
+
 package org.apache.thrift.protocol;
-  
+
 class TMessageType {
     public static inline var CALL      : Int = 1;
-    public static inline var REPLY 	   : Int = 2;
+    public static inline var REPLY        : Int = 2;
     public static inline var EXCEPTION : Int = 3;
     public static inline var ONEWAY    : Int = 4;
 }
diff --git a/lib/haxe/src/org/apache/thrift/protocol/TProtocol.hx b/lib/haxe/src/org/apache/thrift/protocol/TProtocol.hx
index 58873da..0998e92 100644
--- a/lib/haxe/src/org/apache/thrift/protocol/TProtocol.hx
+++ b/lib/haxe/src/org/apache/thrift/protocol/TProtocol.hx
@@ -27,7 +27,7 @@
 * Protocol interface definition
 */
 interface TProtocol {
-  
+
     function getTransport() : TTransport;
 
     /**
@@ -39,44 +39,44 @@
     function writeStructEnd() : Void;
     function writeFieldBegin(field:TField) : Void;
     function writeFieldEnd() : Void;
-    function writeFieldStop() : Void;    
-    function writeMapBegin(map:TMap) : Void;    
-    function writeMapEnd() : Void;    
-    function writeListBegin(list:TList) : Void;    
-    function writeListEnd() : Void;    
-    function writeSetBegin(set:TSet) : Void;    
-    function writeSetEnd() : Void;    
-    function writeBool(b : Bool) : Void;    
-    function writeByte(b : Int) : Void;    
-    function writeI16(i16 : Int) : Void;    
-    function writeI32(i32 : Int) : Void;    
-    function writeI64(i64 : haxe.Int64) : Void;    
-    function writeDouble(dub : Float) : Void;    
-    function writeString(str : String) : Void;    
-    function writeBinary(bin : Bytes) : Void;    
-	
+    function writeFieldStop() : Void;
+    function writeMapBegin(map:TMap) : Void;
+    function writeMapEnd() : Void;
+    function writeListBegin(list:TList) : Void;
+    function writeListEnd() : Void;
+    function writeSetBegin(set:TSet) : Void;
+    function writeSetEnd() : Void;
+    function writeBool(b : Bool) : Void;
+    function writeByte(b : Int) : Void;
+    function writeI16(i16 : Int) : Void;
+    function writeI32(i32 : Int) : Void;
+    function writeI64(i64 : haxe.Int64) : Void;
+    function writeDouble(dub : Float) : Void;
+    function writeString(str : String) : Void;
+    function writeBinary(bin : Bytes) : Void;
+
     /**
      * Reading methods.
      */
-    function readMessageBegin():TMessage;   
-    function readMessageEnd() : Void;    
-    function readStructBegin():TStruct;    
-    function readStructEnd() : Void;    
-    function readFieldBegin():TField;    
-    function readFieldEnd() : Void;    
-    function readMapBegin():TMap;    
-    function readMapEnd() : Void;    
-    function readListBegin():TList;    
-    function readListEnd() : Void;    
-    function readSetBegin():TSet;    
-    function readSetEnd() : Void;    
-    function readBool() : Bool;    
-    function readByte() : Int;    
-    function readI16() : Int;    
-    function readI32() : Int;    
-    function readI64() : haxe.Int64;     
-    function readDouble() : Float;    
-    function readString() : String;    
+    function readMessageBegin():TMessage;
+    function readMessageEnd() : Void;
+    function readStructBegin():TStruct;
+    function readStructEnd() : Void;
+    function readFieldBegin():TField;
+    function readFieldEnd() : Void;
+    function readMapBegin():TMap;
+    function readMapEnd() : Void;
+    function readListBegin():TList;
+    function readListEnd() : Void;
+    function readSetBegin():TSet;
+    function readSetEnd() : Void;
+    function readBool() : Bool;
+    function readByte() : Int;
+    function readI16() : Int;
+    function readI32() : Int;
+    function readI64() : haxe.Int64;
+    function readDouble() : Float;
+    function readString() : String;
     function readBinary() : Bytes;
 
 }
diff --git a/lib/haxe/src/org/apache/thrift/protocol/TProtocolException.hx b/lib/haxe/src/org/apache/thrift/protocol/TProtocolException.hx
index dbbcb8c..6e528cb 100644
--- a/lib/haxe/src/org/apache/thrift/protocol/TProtocolException.hx
+++ b/lib/haxe/src/org/apache/thrift/protocol/TProtocolException.hx
@@ -18,11 +18,11 @@
  */
 
 package org.apache.thrift.protocol;
-  
+
 import org.apache.thrift.TException;
 
 class TProtocolException extends TException {
-    
+
     public static inline var UNKNOWN : Int = 0;
     public static inline var INVALID_DATA : Int = 1;
     public static inline var NEGATIVE_SIZE : Int = 2;
@@ -30,10 +30,10 @@
     public static inline var BAD_VERSION : Int = 4;
     public static inline var NOT_IMPLEMENTED : Int = 5;
     public static inline var DEPTH_LIMIT : Int = 6;
-  
+
     public function new(error : Int = UNKNOWN, message : String = "") {
       super(message, error);
     }
-    
-  
-}
\ No newline at end of file
+
+
+} 
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/protocol/TProtocolFactory.hx b/lib/haxe/src/org/apache/thrift/protocol/TProtocolFactory.hx
index d231dbe..1c2d62e 100644
--- a/lib/haxe/src/org/apache/thrift/protocol/TProtocolFactory.hx
+++ b/lib/haxe/src/org/apache/thrift/protocol/TProtocolFactory.hx
@@ -20,7 +20,7 @@
 package org.apache.thrift.protocol;
 
 import org.apache.thrift.transport.TTransport;
-  
+
 interface TProtocolFactory {
      function getProtocol(trans:TTransport):TProtocol;
 }
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/protocol/TSet.hx b/lib/haxe/src/org/apache/thrift/protocol/TSet.hx
index 77806e6..44eab36 100644
--- a/lib/haxe/src/org/apache/thrift/protocol/TSet.hx
+++ b/lib/haxe/src/org/apache/thrift/protocol/TSet.hx
@@ -18,15 +18,15 @@
  */
 
 package org.apache.thrift.protocol;
-  
+
 class TSet {
 
     public var elemType : Int;
     public var size : Int;
-  
+
       public function new(t : Int = 0, s : Int = 0) {
         elemType = t;
         size = s;
       }
-      
-}
\ No newline at end of file
+
+}    
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/protocol/TStruct.hx b/lib/haxe/src/org/apache/thrift/protocol/TStruct.hx
index faeef40..9e0b7dd 100644
--- a/lib/haxe/src/org/apache/thrift/protocol/TStruct.hx
+++ b/lib/haxe/src/org/apache/thrift/protocol/TStruct.hx
@@ -18,13 +18,13 @@
  */
 
 package org.apache.thrift.protocol;
-  
+
 class TStruct {
-    
+
     public var name : String;
-    
+
     public function new(n : String = "") {
       name = n;
     }
-    
-}
\ No newline at end of file
+
+}  
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/protocol/TType.hx b/lib/haxe/src/org/apache/thrift/protocol/TType.hx
index 0534399..1e093c2 100644
--- a/lib/haxe/src/org/apache/thrift/protocol/TType.hx
+++ b/lib/haxe/src/org/apache/thrift/protocol/TType.hx
@@ -18,9 +18,9 @@
  */
 
 package org.apache.thrift.protocol;
-  
+
 class TType {
-    
+
     public static inline var STOP : Int   = 0;
     public static inline var VOID : Int   = 1;
     public static inline var BOOL : Int   = 2;
diff --git a/lib/haxe/src/org/apache/thrift/server/TServer.hx b/lib/haxe/src/org/apache/thrift/server/TServer.hx
index 37105bd..e689b32 100644
--- a/lib/haxe/src/org/apache/thrift/server/TServer.hx
+++ b/lib/haxe/src/org/apache/thrift/server/TServer.hx
@@ -33,73 +33,74 @@
     private var inputProtocolFactory : TProtocolFactory = null;
     private var outputProtocolFactory : TProtocolFactory = null;
 
-	// server events
-	public var serverEventHandler : TServerEventHandler = null;
+    // server events
+    public var serverEventHandler : TServerEventHandler = null;
 
     // Log delegation
     private var _logDelegate : Dynamic->Void  = null;
     public var logDelegate(default,set) : Dynamic->Void;
-	
+
     public function new( processor : TProcessor,
-						 serverTransport : TServerTransport,
-						 inputTransportFactory : TTransportFactory = null,
-						 outputTransportFactory : TTransportFactory = null,
-						 inputProtocolFactory : TProtocolFactory = null,
-						 outputProtocolFactory : TProtocolFactory = null,
-						 logDelegate : Dynamic->Void = null)
+                         serverTransport : TServerTransport,
+                         inputTransportFactory : TTransportFactory = null,
+                         outputTransportFactory : TTransportFactory = null,
+                         inputProtocolFactory : TProtocolFactory = null,
+                         outputProtocolFactory : TProtocolFactory = null,
+                         logDelegate : Dynamic->Void = null)
     {
       this.processor = processor;
       this.serverTransport = serverTransport;
-      this.inputTransportFactory = inputTransportFactory;	
+      this.inputTransportFactory = inputTransportFactory;
       this.outputTransportFactory = outputTransportFactory;
       this.inputProtocolFactory = inputProtocolFactory;
       this.outputProtocolFactory = outputProtocolFactory;
       this.logDelegate = logDelegate;
 
-	  ApplyMissingDefaults();
-	}
-	
-	private function ApplyMissingDefaults() {
-		if( processor == null) 
-			throw "Invalid server configuration: processor missing";
-		if( serverTransport == null)
-			throw "Invalid server configuration: serverTransport missing";
-		if( inputTransportFactory == null)
-			inputTransportFactory = new TTransportFactory();
-		if( outputTransportFactory  == null)
-			outputTransportFactory = new TTransportFactory();
-		if( inputProtocolFactory  == null)
-			inputProtocolFactory = new TBinaryProtocolFactory();
-		if( outputProtocolFactory == null)
-			outputProtocolFactory= new TBinaryProtocolFactory();
-		if( logDelegate == null)
-			logDelegate = DefaultLogDelegate;
+      ApplyMissingDefaults();
+    }
+
+    private function ApplyMissingDefaults() {
+        if( processor == null)
+            throw "Invalid server configuration: processor missing";
+        if( serverTransport == null)
+            throw "Invalid server configuration: serverTransport missing";
+        if( inputTransportFactory == null)
+            inputTransportFactory = new TTransportFactory();
+        if( outputTransportFactory  == null)
+            outputTransportFactory = new TTransportFactory();
+        if( inputProtocolFactory  == null)
+            inputProtocolFactory = new TBinaryProtocolFactory();
+        if( outputProtocolFactory == null)
+            outputProtocolFactory= new TBinaryProtocolFactory();
+        if( logDelegate == null)
+            logDelegate = DefaultLogDelegate;
     }
 
 
-	private function set_logDelegate(value : Dynamic->Void) : Dynamic->Void {
-		if(value != null) {
-			_logDelegate = value;
-		} else {
-			_logDelegate = DefaultLogDelegate; 
-		}
-		return _logDelegate;
-    }
-    
-		
-	private function DefaultLogDelegate(value : Dynamic) : Void  {
-		trace( value);
+    private function set_logDelegate(value : Dynamic->Void) : Dynamic->Void {
+        if(value != null) {
+            _logDelegate = value;
+        } else {
+            _logDelegate = DefaultLogDelegate;
+        }
+        return _logDelegate;
     }
 
-    
-		
+
+    private function DefaultLogDelegate(value : Dynamic) : Void  {
+        trace( value);
+    }
+
+
+
     public function Serve() : Void {
-		throw new AbstractMethodError();
-	}
-		
-	
+        throw new AbstractMethodError();
+    }
+
+
     public function Stop() : Void {
-		throw new AbstractMethodError();
-	}
-	
+        throw new AbstractMethodError();
+    }
+
 }
+ 
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/server/TServerEventHandler.hx b/lib/haxe/src/org/apache/thrift/server/TServerEventHandler.hx
index 83bff95..9bc9927 100644
--- a/lib/haxe/src/org/apache/thrift/server/TServerEventHandler.hx
+++ b/lib/haxe/src/org/apache/thrift/server/TServerEventHandler.hx
@@ -27,15 +27,15 @@
 // Interface implemented by server users to handle events from the server
 interface TServerEventHandler {
 
-	// Called before the server begins 
+    // Called before the server begins
     function preServe() : Void;
-	
-    // Called when a new client has connected and is about to being processing 
+
+    // Called when a new client has connected and is about to being processing
     function createContext( input : TProtocol, output : TProtocol) : Dynamic;
-    
-	// Called when a client has finished request-handling to delete server context 
+
+    // Called when a client has finished request-handling to delete server context
     function deleteContext( serverContext : Dynamic, input : TProtocol, output : TProtocol) : Void;
-    
-	// Called when a client is about to call the processor 
+
+    // Called when a client is about to call the processor
     function processContext( serverContext : Dynamic, transport : TTransport) : Void;
 }
diff --git a/lib/haxe/src/org/apache/thrift/server/TSimpleServer.hx b/lib/haxe/src/org/apache/thrift/server/TSimpleServer.hx
index c516b78..cb7cbd6 100644
--- a/lib/haxe/src/org/apache/thrift/server/TSimpleServer.hx
+++ b/lib/haxe/src/org/apache/thrift/server/TSimpleServer.hx
@@ -30,92 +30,92 @@
     private var stop : Bool = false;
 
     public function new( processor : TProcessor,
-						 serverTransport : TServerTransport,
-						 transportFactory : TTransportFactory = null,
-						 protocolFactory : TProtocolFactory = null,
-						 logDelegate : Dynamic->Void = null) {
+                         serverTransport : TServerTransport,
+                         transportFactory : TTransportFactory = null,
+                         protocolFactory : TProtocolFactory = null,
+                         logDelegate : Dynamic->Void = null) {
       super( processor, serverTransport,
-			 transportFactory, transportFactory,
-			 protocolFactory, protocolFactory,
-			 logDelegate);
+             transportFactory, transportFactory,
+             protocolFactory, protocolFactory,
+             logDelegate);
     }
 
 
-	
-    public override function Serve() : Void 
-	{
-		try
-		{
-			serverTransport.Listen();
-		}
-		catch (ttx : TTransportException)
-		{
-			logDelegate(ttx);
-			return;
-		}
 
-		// Fire the preServe server event when server is up, 
-		// but before any client connections
-		if (serverEventHandler != null) {
-			serverEventHandler.preServe();
-		}
+    public override function Serve() : Void
+    {
+        try
+        {
+            serverTransport.Listen();
+        }
+        catch (ttx : TTransportException)
+        {
+            logDelegate(ttx);
+            return;
+        }
 
-		while( ! stop)
-		{
-			var client : TTransport = null;
-			var inputTransport : TTransport = null;
-			var outputTransport : TTransport = null;
-			var inputProtocol : TProtocol = null;
-			var outputProtocol : TProtocol = null;
-			var connectionContext : Dynamic = null;
-			try
-			{
-				client = serverTransport.Accept();
-				if (client != null) {
-					inputTransport = inputTransportFactory.getTransport( client);
-					outputTransport = outputTransportFactory.getTransport( client);
-					inputProtocol = inputProtocolFactory.getProtocol( inputTransport);
-					outputProtocol = outputProtocolFactory.getProtocol( outputTransport);
+        // Fire the preServe server event when server is up,
+        // but before any client connections
+        if (serverEventHandler != null) {
+            serverEventHandler.preServe();
+        }
 
-					// Recover event handler (if any) and fire createContext 
-					// server event when a client connects
-					if (serverEventHandler != null) {
-						connectionContext = serverEventHandler.createContext(inputProtocol, outputProtocol);
-					}
+        while( ! stop)
+        {
+            var client : TTransport = null;
+            var inputTransport : TTransport = null;
+            var outputTransport : TTransport = null;
+            var inputProtocol : TProtocol = null;
+            var outputProtocol : TProtocol = null;
+            var connectionContext : Dynamic = null;
+            try
+            {
+                client = serverTransport.Accept();
+                if (client != null) {
+                    inputTransport = inputTransportFactory.getTransport( client);
+                    outputTransport = outputTransportFactory.getTransport( client);
+                    inputProtocol = inputProtocolFactory.getProtocol( inputTransport);
+                    outputProtocol = outputProtocolFactory.getProtocol( outputTransport);
 
-					// Process client requests until client disconnects
-					while( true) {
-						// Fire processContext server event
-						// N.B. This is the pattern implemented in C++ and the event fires provisionally.
-						// That is to say it may be many minutes between the event firing and the client request
-						// actually arriving or the client may hang up without ever makeing a request.
-						if (serverEventHandler != null) {
-							serverEventHandler.processContext(connectionContext, inputTransport);
-						}
-							
-						//Process client request (blocks until transport is readable)
-						if( ! processor.process( inputProtocol, outputProtocol)) {
-							break;
-						}
-					}
-				}
-			}
-			catch( ttx : TTransportException)
-			{
-			  	// Usually a client disconnect, expected
-			}
-			catch( e : Dynamic)
-			{
-				// Unexpected
-			  	logDelegate(e); 
-			}
+                    // Recover event handler (if any) and fire createContext
+                    // server event when a client connects
+                    if (serverEventHandler != null) {
+                        connectionContext = serverEventHandler.createContext(inputProtocol, outputProtocol);
+                    }
 
-			// Fire deleteContext server event after client disconnects
-			if (serverEventHandler != null) {
-				serverEventHandler.deleteContext(connectionContext, inputProtocol, outputProtocol);
-			}
-		}
-	}
+                    // Process client requests until client disconnects
+                    while( true) {
+                        // Fire processContext server event
+                        // N.B. This is the pattern implemented in C++ and the event fires provisionally.
+                        // That is to say it may be many minutes between the event firing and the client request
+                        // actually arriving or the client may hang up without ever makeing a request.
+                        if (serverEventHandler != null) {
+                            serverEventHandler.processContext(connectionContext, inputTransport);
+                        }
+
+                        //Process client request (blocks until transport is readable)
+                        if( ! processor.process( inputProtocol, outputProtocol)) {
+                            break;
+                        }
+                    }
+                }
+            }
+            catch( ttx : TTransportException)
+            {
+                  // Usually a client disconnect, expected
+            }
+            catch( e : Dynamic)
+            {
+                // Unexpected
+                  logDelegate(e);
+            }
+
+            // Fire deleteContext server event after client disconnects
+            if (serverEventHandler != null) {
+                serverEventHandler.deleteContext(connectionContext, inputProtocol, outputProtocol);
+            }
+        }
+    }
 
     public override function Stop() : Void
     {
diff --git a/lib/haxe/src/org/apache/thrift/transport/TFileStream.hx b/lib/haxe/src/org/apache/thrift/transport/TFileStream.hx
index 03e031f..cd8ad17 100644
--- a/lib/haxe/src/org/apache/thrift/transport/TFileStream.hx
+++ b/lib/haxe/src/org/apache/thrift/transport/TFileStream.hx
@@ -26,75 +26,76 @@
 
 
 enum TFileMode {
-	CreateNew;
-	Append;
-	Read;
+    CreateNew;
+    Append;
+    Read;
 }
-	
+
 
 class TFileStream implements TStream {
 
-	public var FileName(default,null) : String;
-	
-	private var Input  : sys.io.FileInput;
-	private var Output : sys.io.FileOutput;
-	
-	
-	public function new( fname : String, mode : TFileMode) {
-		FileName = fname;	
-		switch ( mode)
-		{
-			case TFileMode.CreateNew:
-				Output = sys.io.File.write( fname, true);
+    public var FileName(default,null) : String;
 
-			case TFileMode.Append:
-				Output = sys.io.File.append( fname, true);
+    private var Input  : sys.io.FileInput;
+    private var Output : sys.io.FileOutput;
 
-			case TFileMode.Read:
-				Input = sys.io.File.read( fname, true);
 
-			default:
-				throw new TTransportException( TTransportException.UNKNOWN,
-											   "Unsupported mode");
-		}
+    public function new( fname : String, mode : TFileMode) {
+        FileName = fname;
+        switch ( mode)
+        {
+            case TFileMode.CreateNew:
+                Output = sys.io.File.write( fname, true);
 
-	}
-	
-	public function Close() : Void {
-		if( Input != null) {
-			Input.close();
-			Input = null;
-		}
-		if( Output != null) { 
-			Output.close();
-			Output = null;
-		}
-	}
-	
-	public function Peek() : Bool {
-		if( Input == null)
-			throw new TTransportException( TTransportException.NOT_OPEN, "File not open for input");
+            case TFileMode.Append:
+                Output = sys.io.File.append( fname, true);
 
-		return (! Input.eof());
-	}
-	
-	public function Read( buf : Bytes, offset : Int, count : Int) : Int {
-		if( Input == null)
-			throw new TTransportException( TTransportException.NOT_OPEN, "File not open for input");
+            case TFileMode.Read:
+                Input = sys.io.File.read( fname, true);
 
-		return Input.readBytes( buf, offset, count);
-	}
-	
-	public function Write( buf : Bytes, offset : Int, count : Int) : Void {
-		if( Output == null)
-			throw new TTransportException( TTransportException.NOT_OPEN, "File not open for output");
-		
-		Output.writeBytes( buf, offset, count);			
-	}
+            default:
+                throw new TTransportException( TTransportException.UNKNOWN,
+                                               "Unsupported mode");
+        }
 
-	public function Flush() : Void {
-		if( Output != null) 
-			Output.flush();
-	}
-	
+    }
+
+    public function Close() : Void {
+        if( Input != null) {
+            Input.close();
+            Input = null;
+        }
+        if( Output != null) {
+            Output.close();
+            Output = null;
+        }
+    }
+
+    public function Peek() : Bool {
+        if( Input == null)
+            throw new TTransportException( TTransportException.NOT_OPEN, "File not open for input");
+
+        return (! Input.eof());
+    }
+
+    public function Read( buf : Bytes, offset : Int, count : Int) : Int {
+        if( Input == null)
+            throw new TTransportException( TTransportException.NOT_OPEN, "File not open for input");
+
+        return Input.readBytes( buf, offset, count);
+    }
+
+    public function Write( buf : Bytes, offset : Int, count : Int) : Void {
+        if( Output == null)
+            throw new TTransportException( TTransportException.NOT_OPEN, "File not open for output");
+
+        Output.writeBytes( buf, offset, count);
+    }
+
+    public function Flush() : Void {
+        if( Output != null)
+            Output.flush();
+    }
+
 }
+ 
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/transport/TFramedTransport.hx b/lib/haxe/src/org/apache/thrift/transport/TFramedTransport.hx
index 77335e7..5f0168a 100644
--- a/lib/haxe/src/org/apache/thrift/transport/TFramedTransport.hx
+++ b/lib/haxe/src/org/apache/thrift/transport/TFramedTransport.hx
@@ -56,86 +56,86 @@
      * Constructor wraps around another transport
      */
     public function new( transport : TTransport, maxLength : Int = DEFAULT_MAX_LENGTH) {
-    	transport_ = transport;
-    	maxLength_ = maxLength;
+        transport_ = transport;
+        maxLength_ = maxLength;
     }
 
     public override function open() : Void {
-    	transport_.open();
+        transport_.open();
     }
 
     public override function isOpen() : Bool {
-    	return transport_.isOpen();
+        return transport_.isOpen();
     }
 
     public override function close() : Void {
-    	transport_.close();
+        transport_.close();
     }
 
     public override function read(buf : BytesBuffer, off : Int, len : Int) : Int {
-		var data = Bytes.alloc(len);
-		
-    	if (readBuffer_ != null) {
-    		var got : Int = readBuffer_.readBytes(data, off, len);
-    		if (got > 0) {
-				buf.addBytes(data,0,got);
-    			return got;
-    		};
-    	};
-		
-    	// Read another frame of data
-    	readFrame();
+        var data = Bytes.alloc(len);
 
-    	var got = readBuffer_.readBytes(data, off, len);
-		buf.addBytes(data,0,got);
-		return got;
+        if (readBuffer_ != null) {
+            var got : Int = readBuffer_.readBytes(data, off, len);
+            if (got > 0) {
+                buf.addBytes(data,0,got);
+                return got;
+            };
+        };
+
+        // Read another frame of data
+        readFrame();
+
+        var got = readBuffer_.readBytes(data, off, len);
+        buf.addBytes(data,0,got);
+        return got;
     }
 
 
     function readFrameSize() : Int {
-    	var buffer = new BytesBuffer();
-    	var len = transport_.readAll( buffer, 0, 4);
-    	var inp = new BytesInput( buffer.getBytes(), 0, 4);
-    	inp.bigEndian = true;
-    	return inp.readInt32();
+        var buffer = new BytesBuffer();
+        var len = transport_.readAll( buffer, 0, 4);
+        var inp = new BytesInput( buffer.getBytes(), 0, 4);
+        inp.bigEndian = true;
+        return inp.readInt32();
     }
 
 
     function readFrame() : Void {
-    	var size : Int = readFrameSize();
-		
-    	if (size < 0) {
-    		throw new TTransportException(TTransportException.UNKNOWN, 'Read a negative frame size ($size)!');
-    	};
-    	if (size > maxLength_) {
-    		throw new TTransportException(TTransportException.UNKNOWN, 'Frame size ($size) larger than max length ($maxLength_)!');
-    	};
+        var size : Int = readFrameSize();
 
-    	var buffer = new BytesBuffer();
-    	size = transport_.readAll( buffer, 0, size);
-    	readBuffer_ = new BytesInput( buffer.getBytes(), 0, size);
-    	readBuffer_.bigEndian = true;
+        if (size < 0) {
+            throw new TTransportException(TTransportException.UNKNOWN, 'Read a negative frame size ($size)!');
+        };
+        if (size > maxLength_) {
+            throw new TTransportException(TTransportException.UNKNOWN, 'Frame size ($size) larger than max length ($maxLength_)!');
+        };
+
+        var buffer = new BytesBuffer();
+        size = transport_.readAll( buffer, 0, size);
+        readBuffer_ = new BytesInput( buffer.getBytes(), 0, size);
+        readBuffer_.bigEndian = true;
     }
 
     public override function write(buf : Bytes, off : Int, len : Int) : Void {
-    	writeBuffer_.writeBytes(buf, off, len);
+        writeBuffer_.writeBytes(buf, off, len);
     }
 
     function writeFrameSize(len : Int) : Void {
-		var out = new BytesOutput();
-		out.bigEndian = true;
-		out.writeInt32(len);
-		transport_.write(out.getBytes(), 0, 4);
+        var out = new BytesOutput();
+        out.bigEndian = true;
+        out.writeInt32(len);
+        transport_.write(out.getBytes(), 0, 4);
     }
 
     public override function flush( callback : Dynamic->Void =null) : Void {
-    	var buf : Bytes = writeBuffer_.getBytes();
-    	var len : Int = buf.length;
-    	writeBuffer_ = new BytesOutput();
+        var buf : Bytes = writeBuffer_.getBytes();
+        var len : Int = buf.length;
+        writeBuffer_ = new BytesOutput();
 
-		writeFrameSize(len);
-    	transport_.write(buf, 0, len);
-    	transport_.flush();
+        writeFrameSize(len);
+        transport_.write(buf, 0, len);
+        transport_.flush();
     }
 }
 
diff --git a/lib/haxe/src/org/apache/thrift/transport/TFramedTransportFactory.hx b/lib/haxe/src/org/apache/thrift/transport/TFramedTransportFactory.hx
index 3cca1f8..8d45a64 100644
--- a/lib/haxe/src/org/apache/thrift/transport/TFramedTransportFactory.hx
+++ b/lib/haxe/src/org/apache/thrift/transport/TFramedTransportFactory.hx
@@ -27,11 +27,11 @@
     var maxLength_ : Int;
 
     public function new(maxLength : Int = TFramedTransport.DEFAULT_MAX_LENGTH) {
-		super();
-    	maxLength_ = maxLength;
+        super();
+        maxLength_ = maxLength;
     }
 
     public override function getTransport(base : TTransport) : TTransport {
-    	return new TFramedTransport(base, maxLength_);
+        return new TFramedTransport(base, maxLength_);
     }
 }
diff --git a/lib/haxe/src/org/apache/thrift/transport/TFullDuplexHttpClient.hx b/lib/haxe/src/org/apache/thrift/transport/TFullDuplexHttpClient.hx
index 4e898f8..3cd2e51 100644
--- a/lib/haxe/src/org/apache/thrift/transport/TFullDuplexHttpClient.hx
+++ b/lib/haxe/src/org/apache/thrift/transport/TFullDuplexHttpClient.hx
@@ -73,15 +73,15 @@
             socket.close()
         }
 
-    	public override function peek()  :  Bool
-    	{
-			if(socket.connected)
-			{
-				trace("Bytes remained:" + socket.bytesAvailable);
-				return socket.bytesAvailable>0;
-			}
-			return false;
-		}
+        public override function peek()  :  Bool
+        {
+            if(socket.connected)
+            {
+                trace("Bytes remained:" + socket.bytesAvailable);
+                return socket.bytesAvailable>0;
+            }
+            return false;
+        }
 
         public override function read(buf : Bytes, off  :  Int, len  :  Int)  :  Int
         {
@@ -137,11 +137,11 @@
                 trace(e);
                 throw new TTransportException(TTransportException.UNKNOWN, "No more data available.");
             }
-			catch (e : TException)
-			{
-				trace('TException $e');
-				throw e;
-			}
+            catch (e : TException)
+            {
+                trace('TException $e');
+                throw e;
+            }
             catch (e : Error)
             {
                 trace(e);
@@ -217,7 +217,7 @@
 
         public function socketDataHandler(event : ProgressEvent)  :  Void
         {
-        	trace("Got Data call:" +ioCallback);
+            trace("Got Data call:" +ioCallback);
             if (ioCallback != null)
             {
                 ioCallback(null);
diff --git a/lib/haxe/src/org/apache/thrift/transport/THttpClient.hx b/lib/haxe/src/org/apache/thrift/transport/THttpClient.hx
index 52a9d26..79f8661 100644
--- a/lib/haxe/src/org/apache/thrift/transport/THttpClient.hx
+++ b/lib/haxe/src/org/apache/thrift/transport/THttpClient.hx
@@ -19,7 +19,7 @@
 
 package org.apache.thrift.transport;
 
-	
+
 import haxe.io.Bytes;
 import haxe.io.BytesBuffer;
 import haxe.io.BytesOutput;
@@ -28,76 +28,76 @@
 import haxe.Http;
 
 
-	
+
 /**
 * HTTP implementation of the TTransport interface. Used for working with a
 * Thrift web services implementation.
 */
-	
+
 class THttpClient extends TTransport {
 
     private var requestBuffer_  : BytesOutput = new BytesOutput();
     private var responseBuffer_ : BytesInput = null;
 
-	private var request_        : Http = null;
+    private var request_        : Http = null;
 
-    
-	public function new( requestUrl : String) : Void {
-	  	request_ = new Http(requestUrl);
-		request_.addHeader( "contentType", "application/x-thrift");
+
+    public function new( requestUrl : String) : Void {
+          request_ = new Http(requestUrl);
+        request_.addHeader( "contentType", "application/x-thrift");
     }
-    
-   
+
+
     public override function open() : Void {
     }
 
     public override function close() : Void {
     }
- 
+
     public override function isOpen() : Bool {
       return true;
     }
-    
+
     public override function read(buf:BytesBuffer, off : Int, len : Int) : Int {
-		if (responseBuffer_ == null) {
-        	throw new TTransportException(TTransportException.UNKNOWN, "Response buffer is empty, no request.");
-		}
-		
+        if (responseBuffer_ == null) {
+            throw new TTransportException(TTransportException.UNKNOWN, "Response buffer is empty, no request.");
+        }
+
         var data =Bytes.alloc(len);
-		len = responseBuffer_.readBytes(data, off, len);
-		buf.addBytes(data,0,len);
-		return len;
+        len = responseBuffer_.readBytes(data, off, len);
+        buf.addBytes(data,0,len);
+        return len;
     }
 
     public override function write(buf:Bytes, off : Int, len : Int) : Void {
       requestBuffer_.writeBytes(buf, off, len);
     }
 
-	
+
     public override function flush(callback:Dynamic->Void = null) : Void {
-		var buffer = requestBuffer_;
-		requestBuffer_ = new BytesOutput();
-		responseBuffer_ = null;
-			
-		request_.onData = function(data : String) { 
-			var tmp = new BytesBuffer();
-			tmp.addString(data);
-			responseBuffer_ = new BytesInput(tmp.getBytes());
-			if( callback != null) {
-				callback(null);
-			}
-		};
-		
-		request_.onError = function(msg : String) {
-			if( callback != null) {
-				callback(new TTransportException(TTransportException.UNKNOWN, "IOError: " + msg));
-			}
-		};
-		
-		request_.setPostData(buffer.getBytes().toString());
-		request_.request(true/*POST*/);
+        var buffer = requestBuffer_;
+        requestBuffer_ = new BytesOutput();
+        responseBuffer_ = null;
+
+        request_.onData = function(data : String) {
+            var tmp = new BytesBuffer();
+            tmp.addString(data);
+            responseBuffer_ = new BytesInput(tmp.getBytes());
+            if( callback != null) {
+                callback(null);
+            }
+        };
+
+        request_.onError = function(msg : String) {
+            if( callback != null) {
+                callback(new TTransportException(TTransportException.UNKNOWN, "IOError: " + msg));
+            }
+        };
+
+        request_.setPostData(buffer.getBytes().toString());
+        request_.request(true/*POST*/);
     }
-		
+
 }
 
-	
\ No newline at end of file
+    
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/transport/TServerSocket.hx b/lib/haxe/src/org/apache/thrift/transport/TServerSocket.hx
index 0eae931..f38b584 100644
--- a/lib/haxe/src/org/apache/thrift/transport/TServerSocket.hx
+++ b/lib/haxe/src/org/apache/thrift/transport/TServerSocket.hx
@@ -19,7 +19,7 @@
 
 package org.apache.thrift.transport;
 
-import haxe.remoting.SocketProtocol;	
+import haxe.remoting.SocketProtocol;
 import haxe.io.Bytes;
 import haxe.io.BytesBuffer;
 import haxe.io.BytesInput;
@@ -29,104 +29,104 @@
 import haxe.io.Eof;
 
 //import flash.net.ServerSocket; - not yet available on Haxe 3.1.3
-#if ! (flash || html5) 
-	
+#if ! (flash || html5)
+
 import sys.net.Host;
 
 
 class TServerSocket extends TServerTransport {
 
-	// Underlying server with socket
-	private var _socket : Socket= null;
+    // Underlying server with socket
+    private var _socket : Socket= null;
 
-	// Port to listen on
-	private var _port : Int = 0;
+    // Port to listen on
+    private var _port : Int = 0;
 
-	// Timeout for client sockets from accept
-	private var _clientTimeout : Int = 0;
+    // Timeout for client sockets from accept
+    private var _clientTimeout : Int = 0;
 
-	// Whether or not to wrap new TSocket connections in buffers
-	private var _useBufferedSockets : Bool = false;
-
-	
-	public function new( port : Int, clientTimeout : Int = 0, useBufferedSockets : Bool = false)
-	{
-		_port = port;
-		_clientTimeout = clientTimeout;
-		_useBufferedSockets = useBufferedSockets;
-
-		try
-		{
-			_socket = new Socket();
-			_socket.bind( new Host('localhost'), port);
-		}
-		catch (e : Dynamic)
-		{
-			_socket = null;
-			throw new TTransportException( TTransportException.UNKNOWN, 'Could not create ServerSocket on port $port: $e');
-		}
-	}
+    // Whether or not to wrap new TSocket connections in buffers
+    private var _useBufferedSockets : Bool = false;
 
 
-	public override function Listen() : Void
-	{
-		// Make sure not to block on accept
-		if (_socket != null)	{
-			try
-			{
-				_socket.listen(1);
-			}
-			catch (e : Dynamic)
-			{
-				trace('Error $e');
-				throw new TTransportException( TTransportException.UNKNOWN, 'Could not accept on listening socket: $e');
-			}
-		}
-	}
+    public function new( port : Int, clientTimeout : Int = 0, useBufferedSockets : Bool = false)
+    {
+        _port = port;
+        _clientTimeout = clientTimeout;
+        _useBufferedSockets = useBufferedSockets;
 
-	private override function AcceptImpl() : TTransport
-	{
-		if (_socket == null) {
-			throw new TTransportException( TTransportException.NOT_OPEN, "No underlying server socket.");
-		}
-		
-		try
-		{
-			var accepted = _socket.accept();
-			var result = TSocket.fromSocket(accepted);
-			accepted.setTimeout( _clientTimeout);
+        try
+        {
+            _socket = new Socket();
+            _socket.bind( new Host('localhost'), port);
+        }
+        catch (e : Dynamic)
+        {
+            _socket = null;
+            throw new TTransportException( TTransportException.UNKNOWN, 'Could not create ServerSocket on port $port: $e');
+        }
+    }
 
-			if( _useBufferedSockets)
-			{
-				throw "buffered transport not yet supported";  // TODO
-				//result = new TBufferedTransport(result);
-			}
 
-			return result;
-		}
-		catch (e : Dynamic)
-		{
-			trace('Error $e');
-			throw new TTransportException( TTransportException.UNKNOWN, '$e');
-		}
-	}
+    public override function Listen() : Void
+    {
+        // Make sure not to block on accept
+        if (_socket != null)    {
+            try
+            {
+                _socket.listen(1);
+            }
+            catch (e : Dynamic)
+            {
+                trace('Error $e');
+                throw new TTransportException( TTransportException.UNKNOWN, 'Could not accept on listening socket: $e');
+            }
+        }
+    }
 
-	public override function Close() : Void
-	{
-		if (_socket != null)
-		{
-			try
-			{
-				_socket.close();
-			}
-			catch (e : Dynamic)
-			{
-				trace('Error $e');
-				throw new TTransportException( TTransportException.UNKNOWN, 'WARNING: Could not close server socket: $e');
-			}
-			_socket = null;
-		}
-	}
+    private override function AcceptImpl() : TTransport
+    {
+        if (_socket == null) {
+            throw new TTransportException( TTransportException.NOT_OPEN, "No underlying server socket.");
+        }
+
+        try
+        {
+            var accepted = _socket.accept();
+            var result = TSocket.fromSocket(accepted);
+            accepted.setTimeout( _clientTimeout);
+
+            if( _useBufferedSockets)
+            {
+                throw "buffered transport not yet supported";  // TODO
+                //result = new TBufferedTransport(result);
+            }
+
+            return result;
+        }
+        catch (e : Dynamic)
+        {
+            trace('Error $e');
+            throw new TTransportException( TTransportException.UNKNOWN, '$e');
+        }
+    }
+
+    public override function Close() : Void
+    {
+        if (_socket != null)
+        {
+            try
+            {
+                _socket.close();
+            }
+            catch (e : Dynamic)
+            {
+                trace('Error $e');
+                throw new TTransportException( TTransportException.UNKNOWN, 'WARNING: Could not close server socket: $e');
+            }
+            _socket = null;
+        }
+    }
 }
 
 #end
diff --git a/lib/haxe/src/org/apache/thrift/transport/TServerTransport.hx b/lib/haxe/src/org/apache/thrift/transport/TServerTransport.hx
index 5819803..2189981 100644
--- a/lib/haxe/src/org/apache/thrift/transport/TServerTransport.hx
+++ b/lib/haxe/src/org/apache/thrift/transport/TServerTransport.hx
@@ -21,23 +21,23 @@
 
 class TServerTransport {
 
-	public function Accept() : TTransport {
-		var transport = AcceptImpl();
-		if (transport == null) {
-		  throw new TTransportException( TTransportException.UNKNOWN, "accept() may not return NULL");
-		}
-		return transport;
-	}
-	
-	public function Listen() : Void {
-		throw new AbstractMethodError();
-	}
-	
-	public function Close() : Void {
-		throw new AbstractMethodError();
-	}
-	
-	private function AcceptImpl() : TTransport {
-		throw new AbstractMethodError();
-	}
+    public function Accept() : TTransport {
+        var transport = AcceptImpl();
+        if (transport == null) {
+          throw new TTransportException( TTransportException.UNKNOWN, "accept() may not return NULL");
+        }
+        return transport;
+    }
+
+    public function Listen() : Void {
+        throw new AbstractMethodError();
+    }
+
+    public function Close() : Void {
+        throw new AbstractMethodError();
+    }
+
+    private function AcceptImpl() : TTransport {
+        throw new AbstractMethodError();
+    }
 }
diff --git a/lib/haxe/src/org/apache/thrift/transport/TSocket.hx b/lib/haxe/src/org/apache/thrift/transport/TSocket.hx
index 306730d..9d5e2dc 100644
--- a/lib/haxe/src/org/apache/thrift/transport/TSocket.hx
+++ b/lib/haxe/src/org/apache/thrift/transport/TSocket.hx
@@ -24,7 +24,7 @@
 #elseif js
 import js.html.WebSocket;
 #else
-import haxe.remoting.SocketProtocol;	
+import haxe.remoting.SocketProtocol;
 #end
 
 import haxe.io.Bytes;
@@ -47,250 +47,250 @@
    */
 
 class TSocket extends TTransport  {
-	
+
     #if (flash || js)
-	private var host  :  String;
-	#else
-	private var host  :  Host;
-	#end
-	
+    private var host  :  String;
+    #else
+    private var host  :  Host;
+    #end
+
     private var port  :  Int;
 
-	#if js
+    #if js
     private var socket : WebSocket = null;
-	#else
+    #else
     private var socket : Socket = null;
-	#end
+    #end
 
-	#if js
+    #if js
     private var input : Dynamic = null;
     private var output : WebSocket = null;
-	#elseif flash
+    #elseif flash
     private var input : Socket = null;
     private var output : Socket = null;
-	#else 
-	private var input : Input = null;
+    #else
+    private var input : Input = null;
     private var output : Output = null;
-	#end
+    #end
 
-	private var obuffer : BytesOutput = new BytesOutput();
+    private var obuffer : BytesOutput = new BytesOutput();
     private var ioCallback : TException->Void = null;
-	private var readCount : Int = 0;
-	
+    private var readCount : Int = 0;
+
     public function new(host : String, port  :  Int)  :  Void  {
-		#if (flash || js)
-		this.host = host;
-		#else
-		this.host = new Host(host);
-		#end
-		this.port = port;
+        #if (flash || js)
+        this.host = host;
+        #else
+        this.host = new Host(host);
+        #end
+        this.port = port;
     }
 
-	#if ! (flash || js)
-	// used by TSocketServer
+    #if ! (flash || js)
+    // used by TSocketServer
     public static function fromSocket( socket : Socket) : TSocket  {
-		var result = new TSocket("",0);
-		result.assignSocket(socket);
-		return result;
+        var result = new TSocket("",0);
+        result.assignSocket(socket);
+        return result;
     }
-	#end
+    #end
 
     public override function close()  :  Void  {
-		input = null;
-		output = null;
-		socket.close();
+        input = null;
+        output = null;
+        socket.close();
     }
 
     public override function peek()  :  Bool  {
-		if( (input == null) || (socket == null)) {
-			return false;
-		} else {
-			#if flash 
-			return (input.bytesAvailable > 0);
-			#elseif js
-			return true;
-			#else
-			var ready = Socket.select( [socket], null, null, 0);
-			return (ready.read.length > 0);
-			#end
-		}
+        if( (input == null) || (socket == null)) {
+            return false;
+        } else {
+            #if flash
+            return (input.bytesAvailable > 0);
+            #elseif js
+            return true;
+            #else
+            var ready = Socket.select( [socket], null, null, 0);
+            return (ready.read.length > 0);
+            #end
+        }
     }
 
-	
-	public override function read( buf : BytesBuffer, off : Int, len : Int) : Int   {
-		try
-		{
-			#if flash
 
-			var remaining = len;	
-			while( remaining > 0) {
-				buf.addByte( input.readByte());
-				--remaining;
-			}
-			return len;
-			
-			#elseif js
-			
-			if( input == null) {
-				throw new TTransportException(TTransportException.UNKNOWN, "Still no data ");  // don't block
-			}
-			var nr = len;	
-			while( nr < len) {
-				buf.addByte( input.get(off+nr));
-				++nr;
-			}
-			return len;
-			
-			#else
-			
-			socket.waitForRead();
-			if(readCount < off) {
-				input.read(off-readCount);	
-				readCount = off;
-			}
-			var data = input.read(len);
-			readCount += data.length;
-			buf.add(data);
-			return data.length;
-			
-			#end
-		}
-		catch (e : Eof)
-		{
-			trace('Eof $e');
-			throw new TTransportException(TTransportException.END_OF_FILE, "No more data available.");
-		}
-		catch (e : TException)
-		{
-			trace('TException $e');
-			throw e;
-		}
-		catch (e : Dynamic)
-		{
-			trace('Error $e');
-			throw new TTransportException(TTransportException.UNKNOWN, 'Bad IO error : $e');
-		}
+    public override function read( buf : BytesBuffer, off : Int, len : Int) : Int   {
+        try
+        {
+            #if flash
+
+            var remaining = len;
+            while( remaining > 0) {
+                buf.addByte( input.readByte());
+                --remaining;
+            }
+            return len;
+
+            #elseif js
+
+            if( input == null) {
+                throw new TTransportException(TTransportException.UNKNOWN, "Still no data ");  // don't block
+            }
+            var nr = len;
+            while( nr < len) {
+                buf.addByte( input.get(off+nr));
+                ++nr;
+            }
+            return len;
+
+            #else
+
+            socket.waitForRead();
+            if(readCount < off) {
+                input.read(off-readCount);
+                readCount = off;
+            }
+            var data = input.read(len);
+            readCount += data.length;
+            buf.add(data);
+            return data.length;
+
+            #end
+        }
+        catch (e : Eof)
+        {
+            trace('Eof $e');
+            throw new TTransportException(TTransportException.END_OF_FILE, "No more data available.");
+        }
+        catch (e : TException)
+        {
+            trace('TException $e');
+            throw e;
+        }
+        catch (e : Dynamic)
+        {
+            trace('Error $e');
+            throw new TTransportException(TTransportException.UNKNOWN, 'Bad IO error : $e');
+        }
     }
-		
-	
+
+
     public override function write(buf : Bytes, off  :  Int, len  :  Int)  :  Void
     {
-		obuffer.writeBytes(buf, off, len);
+        obuffer.writeBytes(buf, off, len);
     }
 
 
-		
+
     public override function flush(callback : Dynamic->Void = null)  :  Void
     {
-		if( ! isOpen())
-		{
-			throw new TTransportException(TTransportException.NOT_OPEN, "Transport not open");
-		}
+        if( ! isOpen())
+        {
+            throw new TTransportException(TTransportException.NOT_OPEN, "Transport not open");
+        }
 
-		#if flash
-			
-		var bytes = new flash.utils.ByteArray();
-		var data = obuffer.getBytes();
-		var len = 0;
-		while( len < data.length) {
-			bytes.writeByte(data.get(len));
-			++len;
-		}
+        #if flash
 
-		#elseif js
-		
-		var data = obuffer.getBytes();
-		var outbuf = new js.html.Int8Array(data.length);
-		var len = 0;
-		while( len < data.length) {
-			outbuf.set( [data.get(len)], len);
-			++len;
-		}
-		var bytes = outbuf.buffer;
-		
+        var bytes = new flash.utils.ByteArray();
+        var data = obuffer.getBytes();
+        var len = 0;
+        while( len < data.length) {
+            bytes.writeByte(data.get(len));
+            ++len;
+        }
 
-		#else
-		
-		var bytes = obuffer.getBytes();
-		var len = bytes.length;
-		
-		#end
-			
-		obuffer = new BytesOutput();
+        #elseif js
 
-		
-		ioCallback = callback;
-		try {
-			readCount = 0;
-			#if js
-			output.send( bytes);
-			#else
-			output.writeBytes( bytes, 0, bytes.length);
-			#end
-			if(ioCallback != null) {
-				ioCallback(null);  // success call 
-			}
-		}
-		catch (e : TException)
-		{
-			trace('TException $e');
-			if(ioCallback != null) {
-				ioCallback(e);
-			}
-		}
-		catch (e : Dynamic) {
-			trace(e);
-			if(ioCallback != null) {
-				ioCallback(new TTransportException(TTransportException.UNKNOWN, 'Bad IO error : $e'));
-			}
-		}
+        var data = obuffer.getBytes();
+        var outbuf = new js.html.Int8Array(data.length);
+        var len = 0;
+        while( len < data.length) {
+            outbuf.set( [data.get(len)], len);
+            ++len;
+        }
+        var bytes = outbuf.buffer;
+
+
+        #else
+
+        var bytes = obuffer.getBytes();
+        var len = bytes.length;
+
+        #end
+
+        obuffer = new BytesOutput();
+
+
+        ioCallback = callback;
+        try {
+            readCount = 0;
+            #if js
+            output.send( bytes);
+            #else
+            output.writeBytes( bytes, 0, bytes.length);
+            #end
+            if(ioCallback != null) {
+                ioCallback(null);  // success call
+            }
+        }
+        catch (e : TException)
+        {
+            trace('TException $e');
+            if(ioCallback != null) {
+                ioCallback(e);
+            }
+        }
+        catch (e : Dynamic) {
+            trace(e);
+            if(ioCallback != null) {
+                ioCallback(new TTransportException(TTransportException.UNKNOWN, 'Bad IO error : $e'));
+            }
+        }
     }
 
     public override function isOpen()  :  Bool
     {
-		return (socket != null);
+        return (socket != null);
     }
 
     public override function open()  :  Void
     {
-		#if js
-		var socket = new WebSocket();
-		socket.onmessage = function( event : js.html.MessageEvent) {
-			this.input = event.data;
-		}
-		
-		#elseif flash
-			
-		var socket = new Socket();
-		socket.connect(host, port);
+        #if js
+        var socket = new WebSocket();
+        socket.onmessage = function( event : js.html.MessageEvent) {
+            this.input = event.data;
+        }
 
-		#else
-			
-		var socket = new Socket();
-		socket.setBlocking(true);
-		socket.setFastSend(true);
-		socket.connect(host, port);
+        #elseif flash
 
-		#end
-			
-		assignSocket( socket);
+        var socket = new Socket();
+        socket.connect(host, port);
+
+        #else
+
+        var socket = new Socket();
+        socket.setBlocking(true);
+        socket.setFastSend(true);
+        socket.connect(host, port);
+
+        #end
+
+        assignSocket( socket);
     }
 
-	#if js
-	private function assignSocket( socket : WebSocket)  :  Void
-	#else
-	private function assignSocket( socket : Socket)  :  Void
-	#end
+    #if js
+    private function assignSocket( socket : WebSocket)  :  Void
+    #else
+    private function assignSocket( socket : Socket)  :  Void
+    #end
     {
-		this.socket = socket;
-		
-		#if (flash || js)
-		output = socket;
-      	input = socket;
-		#else
-      	output = socket.output;
-      	input = socket.input;
-		#end
+        this.socket = socket;
+
+        #if (flash || js)
+        output = socket;
+          input = socket;
+        #else
+          output = socket.output;
+          input = socket.input;
+        #end
     }
 
 }
diff --git a/lib/haxe/src/org/apache/thrift/transport/TStream.hx b/lib/haxe/src/org/apache/thrift/transport/TStream.hx
index 0e1b52d..50b3ed3 100644
--- a/lib/haxe/src/org/apache/thrift/transport/TStream.hx
+++ b/lib/haxe/src/org/apache/thrift/transport/TStream.hx
@@ -24,9 +24,9 @@
 
 
 interface TStream {
-	function Close() : Void;
-	function Peek() : Bool;
-	function Read( buf : Bytes, offset : Int, count : Int) : Int;
-	function Write( buf : Bytes, offset : Int, count : Int) : Void;
-	function Flush() : Void;
+    function Close() : Void;
+    function Peek() : Bool;
+    function Read( buf : Bytes, offset : Int, count : Int) : Int;
+    function Write( buf : Bytes, offset : Int, count : Int) : Void;
+    function Flush() : Void;
 }
diff --git a/lib/haxe/src/org/apache/thrift/transport/TStreamTransport.hx b/lib/haxe/src/org/apache/thrift/transport/TStreamTransport.hx
index 99203b4..31a7c14 100644
--- a/lib/haxe/src/org/apache/thrift/transport/TStreamTransport.hx
+++ b/lib/haxe/src/org/apache/thrift/transport/TStreamTransport.hx
@@ -29,75 +29,75 @@
 
 
 class TStreamTransport extends TTransport {
-	
-	public var InputStream(default,null) : TStream;
-	public var OutputStream(default,null) : TStream;
+
+    public var InputStream(default,null) : TStream;
+    public var OutputStream(default,null) : TStream;
 
 
-	public function new( input : TStream, output : TStream) {
-		this.InputStream = input;
-		this.OutputStream = output;
-	}
-	
-	public override function isOpen() : Bool {
-		return true;
-	}
-	
+    public function new( input : TStream, output : TStream) {
+        this.InputStream = input;
+        this.OutputStream = output;
+    }
+
+    public override function isOpen() : Bool {
+        return true;
+    }
+
     public override function peek() : Bool {
-		return (InputStream != null);
-	}
+        return (InputStream != null);
+    }
 
     public override function open() : Void {
-	}
+    }
 
-	public override function close() : Void {
-		if (InputStream != null)
-		{
-			InputStream.Close();
-			InputStream = null;
-		}
-		if (OutputStream != null)
-		{
-			OutputStream.Close();
-			OutputStream = null;
-		}
-	}
+    public override function close() : Void {
+        if (InputStream != null)
+        {
+            InputStream.Close();
+            InputStream = null;
+        }
+        if (OutputStream != null)
+        {
+            OutputStream.Close();
+            OutputStream = null;
+        }
+    }
 
-	public override function read( buf : BytesBuffer, off : Int, len : Int) : Int {
-		if (InputStream == null)
-		{
-			throw new TTransportException( TTransportException.NOT_OPEN, 
-								  		   "Cannot read from null InputStream");
-		}
+    public override function read( buf : BytesBuffer, off : Int, len : Int) : Int {
+        if (InputStream == null)
+        {
+            throw new TTransportException( TTransportException.NOT_OPEN,
+                                             "Cannot read from null InputStream");
+        }
 
-		var data : Bytes =  Bytes.alloc(len);
-		var size = InputStream.Read( data, off, len);
-		buf.addBytes( data, 0, size);
-		return size;
-	}
+        var data : Bytes =  Bytes.alloc(len);
+        var size = InputStream.Read( data, off, len);
+        buf.addBytes( data, 0, size);
+        return size;
+    }
 
     public override function write(buf:Bytes, off : Int, len : Int) : Void {
-		if (OutputStream == null)
-		{
-			throw new TTransportException( TTransportException.NOT_OPEN, 
-										   "Cannot write to null OutputStream");
-		}
+        if (OutputStream == null)
+        {
+            throw new TTransportException( TTransportException.NOT_OPEN,
+                                           "Cannot write to null OutputStream");
+        }
 
-		OutputStream.Write(buf, off, len);
-	}
+        OutputStream.Write(buf, off, len);
+    }
 
     public override function flush(callback:Dynamic->Void =null) : Void {
-		if (OutputStream == null)
-		{
-			var err = new TTransportException( TTransportException.NOT_OPEN,
-											   "Cannot flush null OutputStream");
-	    	if(callback != null)
-				callback(err);
-			else
-				throw err;
-		}
+        if (OutputStream == null)
+        {
+            var err = new TTransportException( TTransportException.NOT_OPEN,
+                                               "Cannot flush null OutputStream");
+            if(callback != null)
+                callback(err);
+            else
+                throw err;
+        }
 
-		OutputStream.Flush();
-	}
+        OutputStream.Flush();
+    }
 
 }
diff --git a/lib/haxe/src/org/apache/thrift/transport/TTransport.hx b/lib/haxe/src/org/apache/thrift/transport/TTransport.hx
index 35303d5..4a3bd90 100644
--- a/lib/haxe/src/org/apache/thrift/transport/TTransport.hx
+++ b/lib/haxe/src/org/apache/thrift/transport/TTransport.hx
@@ -22,7 +22,7 @@
 import haxe.io.Bytes;
 import haxe.io.BytesBuffer;
 import org.apache.thrift.AbstractMethodError;
-  
+
 class TTransport {
 
     /**
@@ -31,16 +31,16 @@
      * @return True if the transport is open.
      */
     public function isOpen() : Bool {
-      	throw new AbstractMethodError();
+          throw new AbstractMethodError();
     }
-    
+
     /**
      * Is there more data to be read?
      *
      * @return True if the remote side is still alive and feeding us
      */
     public function peek() : Bool {
-      	return isOpen();
+          return isOpen();
     }
 
     /**
@@ -49,14 +49,14 @@
      * @throws TTransportException if the transport could not be opened
      */
     public function open() : Void {
-      	throw new AbstractMethodError();
+          throw new AbstractMethodError();
     }
 
     /**
      * Closes the transport.
      */
     public function close() : Void {
-      	throw new AbstractMethodError();
+          throw new AbstractMethodError();
     };
 
     /**
@@ -69,7 +69,7 @@
      * @throws TTransportException if there was an error reading data
      */
      public function read( buf : BytesBuffer, off : Int, len : Int) : Int {
-      	throw new AbstractMethodError();
+          throw new AbstractMethodError();
      }
 
     /**
@@ -82,14 +82,14 @@
      * @throws TTransportException if there was an error reading data
      */
     public function readAll(buf : BytesBuffer, off : Int, len : Int) : Int {
-		var got : Int = 0;
-		var ret : Int = 0;
+        var got : Int = 0;
+        var ret : Int = 0;
         while (got < len) {
             ret = read(buf, off+got, len-got);
             if (ret <= 0) {
-              throw new TTransportException(TTransportException.UNKNOWN, 
-										"Cannot read. Remote side has closed. Tried to read " 
-										+ len + " bytes, but only got " + got + " bytes.");
+              throw new TTransportException(TTransportException.UNKNOWN,
+                                        "Cannot read. Remote side has closed. Tried to read "
+                                        + len + " bytes, but only got " + got + " bytes.");
             }
             got += ret;
         }
@@ -103,7 +103,7 @@
      * @throws TTransportException if an error occurs writing data
      */
     public function writeAll(buf:Bytes) : Void {
-		write(buf, 0, buf.length);
+        write(buf, 0, buf.length);
     }
 
     /**
@@ -115,7 +115,7 @@
      * @throws TTransportException if there was an error writing data
      */
     public function write(buf:Bytes, off : Int, len : Int) : Void {
-    	throw new AbstractMethodError();
+        throw new AbstractMethodError();
     }
 
     /**
@@ -124,10 +124,10 @@
      * @throws TTransportException if there was an error writing out data.
      */
     public function flush(callback:Dynamic->Void =null) : Void {
-    	if(callback != null)
-			callback(new AbstractMethodError());
-		else
-			throw new AbstractMethodError();
+        if(callback != null)
+            callback(new AbstractMethodError());
+        else
+            throw new AbstractMethodError();
     }
- 
+
 }
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/transport/TTransportException.hx b/lib/haxe/src/org/apache/thrift/transport/TTransportException.hx
index 3db6456..f930c52 100644
--- a/lib/haxe/src/org/apache/thrift/transport/TTransportException.hx
+++ b/lib/haxe/src/org/apache/thrift/transport/TTransportException.hx
@@ -16,21 +16,22 @@
  * specific language governing permissions and limitations
  * under the License.
  */
- 
+
 package org.apache.thrift.transport;
-  
+
 import org.apache.thrift.TException;
 
 class TTransportException extends TException {
-    
+
     public static inline var UNKNOWN : Int = 0;
     public static inline var NOT_OPEN : Int = 1;
     public static inline var ALREADY_OPEN : Int = 2;
     public static inline var TIMED_OUT : Int = 3;
     public static inline var END_OF_FILE : Int = 4;
-  
+
     public function new(error : Int = UNKNOWN, message : String = "") {
-		super(message, error);
+        super(message, error);
     }
-    
+
 }
+ 
\ No newline at end of file
diff --git a/lib/haxe/src/org/apache/thrift/transport/TTransportFactory.hx b/lib/haxe/src/org/apache/thrift/transport/TTransportFactory.hx
index f20321f..361f35f 100644
--- a/lib/haxe/src/org/apache/thrift/transport/TTransportFactory.hx
+++ b/lib/haxe/src/org/apache/thrift/transport/TTransportFactory.hx
@@ -28,17 +28,17 @@
  */
 class TTransportFactory {
 
-	public function new() {
-	}
+    public function new() {
+    }
 
-	/**
-	* Return a wrapped instance of the base Transport.
-	*
-	* @param trans The base transport
-	* @return Wrapped Transport
-	*/
-	public function getTransport( trans : TTransport) : TTransport {
-		return trans;
-	}
+    /**
+    * Return a wrapped instance of the base Transport.
+    *
+    * @param trans The base transport
+    * @return Wrapped Transport
+    */
+    public function getTransport( trans : TTransport) : TTransport {
+        return trans;
+    }
 
 }
diff --git a/lib/haxe/test/src/Main.hx b/lib/haxe/test/src/Main.hx
index fff8be5..da0a7f5 100644
--- a/lib/haxe/test/src/Main.hx
+++ b/lib/haxe/test/src/Main.hx
@@ -31,15 +31,15 @@
 {
     static public function main()
     {
-		try
-		{
-        	StreamTest.Run();
-			
-			trace("All tests completed.");
-		}
-		catch( e: Dynamic)
-		{
-			trace('$e');
-		}
-	}
+        try
+        {
+            StreamTest.Run();
+
+            trace("All tests completed.");
+        }
+        catch( e: Dynamic)
+        {
+            trace('$e');
+        }
+    }
 }
\ No newline at end of file
diff --git a/lib/haxe/test/src/StreamTest.hx b/lib/haxe/test/src/StreamTest.hx
index b28c8e9..7500eee 100644
--- a/lib/haxe/test/src/StreamTest.hx
+++ b/lib/haxe/test/src/StreamTest.hx
@@ -31,62 +31,62 @@
 
 
 class StreamTest extends TestBase {
-	
 
-	private inline static var tmpfile : String = "bin/data.tmp";
-	
 
-	private static function Expect( expr : Bool, info : String, ?pos : haxe.PosInfos) : Void {
-		if( ! expr) {
-			throw ('Test "$info" failed at '+pos.methodName+' in '+pos.fileName+':'+pos.lineNumber);
-		}			
-	}
-	
-	private static function MakeTestData() : Xtruct {
-		var data : Xtruct = new Xtruct();
-		data.string_thing = "Streamtest";
-		data.byte_thing = -128;
-		data.i32_thing = 4711;
-		data.i64_thing = Int64.make(0x12345678,0x9ABCDEF0);
-		return data;
-	}
-	
-	public static function WriteData() : Xtruct
-	{
-		var stream : TStream = new TFileStream( tmpfile, CreateNew);
-		var trans : TTransport = new TStreamTransport( null, stream);
-		var prot = new TJSONProtocol( trans);
+    private inline static var tmpfile : String = "bin/data.tmp";
 
-		var data = MakeTestData();	
-		data.write(prot);
-		trans.close();
-		
-		return data;
-	}
-	
-	public static function ReadData() : Xtruct
-	{
-		var stream : TStream = new TFileStream( tmpfile, Read);
-		var trans : TTransport = new TStreamTransport( stream, null);
-		var prot = new TJSONProtocol( trans);
 
-		var data : Xtruct = new Xtruct();
-		data.read(prot);
-		trans.close();
-		
-		return data;
-	}
-	
-	public static override function Run() : Void
-	{
-		var written = WriteData();
-		var read = ReadData();
+    private static function Expect( expr : Bool, info : String, ?pos : haxe.PosInfos) : Void {
+        if( ! expr) {
+            throw ('Test "$info" failed at '+pos.methodName+' in '+pos.fileName+':'+pos.lineNumber);
+        }
+    }
 
-		Expect( read.string_thing == written.string_thing, "string data");
-		Expect( read.byte_thing == written.byte_thing, "byte data");
-		Expect( read.i32_thing == written.i32_thing, "i32 data");
-		Expect( Int64.compare( read.i64_thing, written.i64_thing) == 0, "i64 data");
-	}
+    private static function MakeTestData() : Xtruct {
+        var data : Xtruct = new Xtruct();
+        data.string_thing = "Streamtest";
+        data.byte_thing = -128;
+        data.i32_thing = 4711;
+        data.i64_thing = Int64.make(0x12345678,0x9ABCDEF0);
+        return data;
+    }
+
+    public static function WriteData() : Xtruct
+    {
+        var stream : TStream = new TFileStream( tmpfile, CreateNew);
+        var trans : TTransport = new TStreamTransport( null, stream);
+        var prot = new TJSONProtocol( trans);
+
+        var data = MakeTestData();
+        data.write(prot);
+        trans.close();
+
+        return data;
+    }
+
+    public static function ReadData() : Xtruct
+    {
+        var stream : TStream = new TFileStream( tmpfile, Read);
+        var trans : TTransport = new TStreamTransport( stream, null);
+        var prot = new TJSONProtocol( trans);
+
+        var data : Xtruct = new Xtruct();
+        data.read(prot);
+        trans.close();
+
+        return data;
+    }
+
+    public static override function Run() : Void
+    {
+        var written = WriteData();
+        var read = ReadData();
+
+        Expect( read.string_thing == written.string_thing, "string data");
+        Expect( read.byte_thing == written.byte_thing, "byte data");
+        Expect( read.i32_thing == written.i32_thing, "i32 data");
+        Expect( Int64.compare( read.i64_thing, written.i64_thing) == 0, "i64 data");
+    }
 
 }
 
diff --git a/lib/haxe/test/src/TestBase.hx b/lib/haxe/test/src/TestBase.hx
index 03b66dd..2a344d6 100644
--- a/lib/haxe/test/src/TestBase.hx
+++ b/lib/haxe/test/src/TestBase.hx
@@ -28,12 +28,13 @@
 import thrift.test.*;  // generated code
 
 class TestBase {
-	
-	private function new() {
-		// override, if necessary
-	}
-	
-	public static function Run() : Void {
-      	throw new AbstractMethodError();
-	}	
+
+    private function new() {
+        // override, if necessary
+    }
+
+    public static function Run() : Void {
+          throw new AbstractMethodError();
+    }
 }
+ 
\ No newline at end of file
