 	import flash.errors.IllegalOperationError;
 	import flash.errors.IOError;
 	import flash.utils.describeType
+	import flash.utils.Dictionary;
 	import flash.utils.getDefinitionByName;
 	import flash.utils.IDataInput
 	import flash.utils.IDataOutput

				break
			}
		}
		private static function printMessageFields(output:IDataOutput,
				message:Message,
				printSetting:PrintSetting,
				currentIndent:String = ""):void {
			var isFirst:Boolean = true
			const type:Class = Object(message).constructor
			const description:XML = describeType(type)
			// Not description.constant,
			// because haXe will replace constant to variable, WTF!
			for each (var fieldDescriptorName:String in description.*.
					(0 == String(@type).search(
					/^com.netease.protobuf.fieldDescriptors::(Repeated)?FieldDescriptor\$/)
					).@name) {
				const fieldDescriptor:BaseFieldDescriptor =
						type[fieldDescriptorName]
				if (fieldDescriptor.name.search(/\/\./) != -1) {
					// extend on other message
					continue
				}
		
				const shortName:String = fieldDescriptor.fullName.substring(
						fieldDescriptor.fullName.lastIndexOf('.') + 1)
				if (fieldDescriptor.type == Array) {

			output.writeUTFBytes("00000000".substring(0, 8 - hexString.length))
			output.writeUTFBytes(hexString)
		}
		private static const allEnumValues:Dictionary = new Dictionary
		private static function printEnum(output:IDataOutput,
				value:int, enumType:Class):void {
			var enumValues:Array
			if (enumType in allEnumValues) {
				enumValues = allEnumValues[enumType]
			} else {
				const enumTypeDescription:XML = describeType(enumType)
				// Not enumTypeDescription.*.@name,
				// because haXe will replace all constants to variables, WTF!
				const xmlNames:XMLList = enumTypeDescription.*.@name
				enumValues = []
				for each(var name:String in xmlNames) {
					enumValues[enumType[name]] = name
				}
				allEnumValues[enumType] = enumValues
			}
			if (value in enumValues) {
				output.writeUTFBytes(enumValues[value])
			} else {
				throw new IOError(value + " is invalid for " +
						enumTypeDescription.@name)
			}
		}
		private static function printBytes(output:IDataOutput,
				value:ByteArray):void {
