changeset 20:1f99e150f336

fix folder and add Object Mapper.
author Kazuma Takeda
date Thu, 15 Dec 2016 22:52:48 +0900
parents 0865819106cf
children 03c58d4b2ccf
files .DS_Store Main.meta Main/ObjectMapper.meta Main/ObjectMapper/ConvertObject.cs Main/ObjectMapper/ConvertObject.cs.meta Main/ObjectMapper/SceneNode.cs Main/ObjectMapper/SceneNode.cs.meta Main/jungle-main.meta Main/jungle-main/DefaultJungle.cs Main/jungle-main/DefaultJungle.cs.meta Main/jungle-main/DefaultJungleTree.cs Main/jungle-main/DefaultJungleTree.cs.meta Main/jungle-main/Jungle.cs Main/jungle-main/Jungle.cs.meta Main/jungle-main/JungleTree.cs Main/jungle-main/JungleTree.cs.meta Main/jungle-main/JungleTreeEditor.cs Main/jungle-main/JungleTreeEditor.cs.meta Main/jungle-main/core.meta Main/jungle-main/core/Attributes.cs Main/jungle-main/core/Attributes.cs.meta Main/jungle-main/core/Children.cs Main/jungle-main/core/Children.cs.meta Main/jungle-main/data.meta Main/jungle-main/data/list.meta Main/jungle-main/data/list/DefaultNode.cs Main/jungle-main/data/list/DefaultNode.cs.meta Main/jungle-main/data/list/List.cs Main/jungle-main/data/list/List.cs.meta Main/jungle-main/data/list/Node.cs Main/jungle-main/data/list/Node.cs.meta Main/jungle-main/data/list/TailNode.cs Main/jungle-main/data/list/TailNode.cs.meta Main/jungle-main/data/list/headNode.cs Main/jungle-main/data/list/headNode.cs.meta Main/jungle-main/data/treemap.meta Main/jungle-main/data/treemap/BlackNode.cs Main/jungle-main/data/treemap/BlackNode.cs.meta Main/jungle-main/data/treemap/EmptyClass.cs Main/jungle-main/data/treemap/EmptyClass.cs.meta Main/jungle-main/data/treemap/EmptyNode.cs Main/jungle-main/data/treemap/EmptyNode.cs.meta Main/jungle-main/data/treemap/RedNode.cs Main/jungle-main/data/treemap/RedNode.cs.meta Main/jungle-main/data/treemap/Rotate.cs Main/jungle-main/data/treemap/Rotate.cs.meta Main/jungle-main/data/treemap/TreeMap.cs Main/jungle-main/data/treemap/TreeMap.cs.meta Main/jungle-main/data/treemap/TreeMapNode.cs Main/jungle-main/data/treemap/TreeMapNode.cs.meta Main/jungle-main/data/treemap/rebuildNode.cs Main/jungle-main/data/treemap/rebuildNode.cs.meta Main/jungle-main/persistent.meta Main/jungle-main/persistent/ChangeList.cs Main/jungle-main/persistent/ChangeList.cs.meta Main/jungle-main/persistent/ChangeListReader.cs Main/jungle-main/persistent/ChangeListReader.cs.meta Main/jungle-main/persistent/ChangeListWriter.cs Main/jungle-main/persistent/ChangeListWriter.cs.meta Main/jungle-main/persistent/Journal.cs Main/jungle-main/persistent/Journal.cs.meta Main/jungle-main/persistent/NullJournal.cs Main/jungle-main/persistent/NullJournal.cs.meta Main/jungle-main/persistent/Result.cs Main/jungle-main/persistent/Result.cs.meta Main/jungle-main/persistent/SingletonMessage.cs Main/jungle-main/persistent/SingletonMessage.cs.meta Main/jungle-main/persistent/msgpack.meta Main/jungle-main/persistent/msgpack/.git/HEAD Main/jungle-main/persistent/msgpack/.git/config Main/jungle-main/persistent/msgpack/.git/description Main/jungle-main/persistent/msgpack/.git/hooks/applypatch-msg.sample Main/jungle-main/persistent/msgpack/.git/hooks/commit-msg.sample Main/jungle-main/persistent/msgpack/.git/hooks/post-update.sample Main/jungle-main/persistent/msgpack/.git/hooks/pre-applypatch.sample Main/jungle-main/persistent/msgpack/.git/hooks/pre-commit.sample Main/jungle-main/persistent/msgpack/.git/hooks/pre-push.sample Main/jungle-main/persistent/msgpack/.git/hooks/pre-rebase.sample Main/jungle-main/persistent/msgpack/.git/hooks/prepare-commit-msg.sample Main/jungle-main/persistent/msgpack/.git/hooks/update.sample Main/jungle-main/persistent/msgpack/.git/index Main/jungle-main/persistent/msgpack/.git/info/exclude Main/jungle-main/persistent/msgpack/.git/logs/HEAD Main/jungle-main/persistent/msgpack/.git/logs/refs/heads/master Main/jungle-main/persistent/msgpack/.git/logs/refs/remotes/origin/HEAD Main/jungle-main/persistent/msgpack/.git/objects/00/c8e51cd16ac10c74dd2f9974e6261ae72dfe4c Main/jungle-main/persistent/msgpack/.git/objects/04/bd98d0918f4e21e0aa28f957af42639481ec72 Main/jungle-main/persistent/msgpack/.git/objects/05/4668352f9f1e28268bc74604ad4c73a3a24e74 Main/jungle-main/persistent/msgpack/.git/objects/18/17b354ce3301394fc5af5f8a2a17b690812ec1 Main/jungle-main/persistent/msgpack/.git/objects/1f/116ad7ca93823183d33d8223139c717df069c3 Main/jungle-main/persistent/msgpack/.git/objects/2d/f9bb3e0866da49532c79177f5a2febd5b8973e Main/jungle-main/persistent/msgpack/.git/objects/30/6b516bef3bf54505433f44b53d4fc99311ecd6 Main/jungle-main/persistent/msgpack/.git/objects/34/d46e7bef952bd8fabb5f2847d7a283855b83fe Main/jungle-main/persistent/msgpack/.git/objects/46/d080685b602b8ccec7a343da7c62256c35ad0c Main/jungle-main/persistent/msgpack/.git/objects/50/bcb39015be539af4a654036cef49a5f08c0321 Main/jungle-main/persistent/msgpack/.git/objects/57/543770118822a5eb91efa7cac5037297df169d Main/jungle-main/persistent/msgpack/.git/objects/5e/618130994ffb0591f53545cf84a89f552df84f Main/jungle-main/persistent/msgpack/.git/objects/5e/cbb52610087bad1c48572c99c998a4928013d5 Main/jungle-main/persistent/msgpack/.git/objects/61/c2225fc4a2b7742c3b8d3ec6cb6f78aac73868 Main/jungle-main/persistent/msgpack/.git/objects/6c/4d4e0b98bd4200dea587f867232aaf94fb7efa Main/jungle-main/persistent/msgpack/.git/objects/79/4aff4f6de364bc022a7653c2cde3116f184e8f Main/jungle-main/persistent/msgpack/.git/objects/79/a31fc6b0d5d061f5151d9e1ada8e54346e2c98 Main/jungle-main/persistent/msgpack/.git/objects/8c/c971fe5e16554747f616b1f65e26103b5f71ec Main/jungle-main/persistent/msgpack/.git/objects/9a/c0ec3d0fb15a1b74cb749b1d25189f5bab7ff1 Main/jungle-main/persistent/msgpack/.git/objects/9c/6d483546704aaa1453f57ca14c6471830c91ac Main/jungle-main/persistent/msgpack/.git/objects/a7/c97a61698cdf1839fcdcd447b37ecdd4ffd88e Main/jungle-main/persistent/msgpack/.git/objects/ae/899d9608dcb968d6073329c2cd45a4b9b825de Main/jungle-main/persistent/msgpack/.git/objects/be/c4d4c4558d625539410a5b3a2e69f48ec48f48 Main/jungle-main/persistent/msgpack/.git/objects/d5/40b060aeccc5b4e1ab26aec45267e8ae7393c2 Main/jungle-main/persistent/msgpack/.git/objects/e7/c80cc200584b818c491a184cfc6f2b5f9e17a8 Main/jungle-main/persistent/msgpack/.git/objects/e9/8430e1f9a9d93e5971d6e65d0d70a771e6a070 Main/jungle-main/persistent/msgpack/.git/packed-refs Main/jungle-main/persistent/msgpack/.git/refs/heads/master Main/jungle-main/persistent/msgpack/.git/refs/remotes/origin/HEAD Main/jungle-main/persistent/msgpack/.gitignore Main/jungle-main/persistent/msgpack/README.md Main/jungle-main/persistent/msgpack/README.md.meta Main/jungle-main/persistent/msgpack/src.meta Main/jungle-main/persistent/msgpack/src/BoxingPacker.cs Main/jungle-main/persistent/msgpack/src/BoxingPacker.cs.meta Main/jungle-main/persistent/msgpack/src/CompiledPacker.cs Main/jungle-main/persistent/msgpack/src/CompiledPacker.cs.meta Main/jungle-main/persistent/msgpack/src/Compiler.meta Main/jungle-main/persistent/msgpack/src/Compiler/EmitExtensions.cs Main/jungle-main/persistent/msgpack/src/Compiler/EmitExtensions.cs.meta Main/jungle-main/persistent/msgpack/src/Compiler/PackILGenerator.cs Main/jungle-main/persistent/msgpack/src/Compiler/PackILGenerator.cs.meta Main/jungle-main/persistent/msgpack/src/Compiler/Variable.cs Main/jungle-main/persistent/msgpack/src/Compiler/Variable.cs.meta Main/jungle-main/persistent/msgpack/src/Compiler/VariableType.cs Main/jungle-main/persistent/msgpack/src/Compiler/VariableType.cs.meta Main/jungle-main/persistent/msgpack/src/MsgPackReader.cs Main/jungle-main/persistent/msgpack/src/MsgPackReader.cs.meta Main/jungle-main/persistent/msgpack/src/MsgPackWriter.cs Main/jungle-main/persistent/msgpack/src/MsgPackWriter.cs.meta Main/jungle-main/persistent/msgpack/src/ObjectPacker.cs Main/jungle-main/persistent/msgpack/src/ObjectPacker.cs.meta Main/jungle-main/persistent/msgpack/src/ReflectionCache.cs Main/jungle-main/persistent/msgpack/src/ReflectionCache.cs.meta Main/jungle-main/persistent/msgpack/src/ReflectionCacheEntry.cs Main/jungle-main/persistent/msgpack/src/ReflectionCacheEntry.cs.meta Main/jungle-main/persistent/msgpack/src/TypePrefixes.cs Main/jungle-main/persistent/msgpack/src/TypePrefixes.cs.meta Main/jungle-main/store.meta Main/jungle-main/store/Command.cs Main/jungle-main/store/Command.cs.meta Main/jungle-main/store/NodeEditorError.cs Main/jungle-main/store/NodeEditorError.cs.meta Main/jungle-main/store/NodePath.cs Main/jungle-main/store/NodePath.cs.meta Main/jungle-main/store/TreeContext.cs Main/jungle-main/store/TreeContext.cs.meta Main/jungle-main/store/TreeEditor.cs Main/jungle-main/store/TreeEditor.cs.meta Main/jungle-main/store/impl.meta Main/jungle-main/store/impl/DefaultNodePath.cs Main/jungle-main/store/impl/DefaultNodePath.cs.meta Main/jungle-main/store/impl/DefaultTreeEditor.cs Main/jungle-main/store/impl/DefaultTreeEditor.cs.meta Main/jungle-main/store/impl/TreeNode.cs Main/jungle-main/store/impl/TreeNode.cs.meta Main/jungle-main/store/impl/TreeNodeAttributes.cs Main/jungle-main/store/impl/TreeNodeAttributes.cs.meta Main/jungle-main/store/impl/TreeNodeChildren.cs Main/jungle-main/store/impl/TreeNodeChildren.cs.meta Main/jungle-main/store/impl/logger.meta Main/jungle-main/store/impl/logger/DefaultOperationLog.cs Main/jungle-main/store/impl/logger/DefaultOperationLog.cs.meta Main/jungle-main/store/impl/logger/DefaultTreeOperationLog.cs Main/jungle-main/store/impl/logger/DefaultTreeOperationLog.cs.meta Main/jungle-main/store/impl/logger/LoggingAttributes.cs Main/jungle-main/store/impl/logger/LoggingAttributes.cs.meta Main/jungle-main/store/impl/logger/LoggingChildren.cs Main/jungle-main/store/impl/logger/LoggingChildren.cs.meta Main/jungle-main/store/impl/logger/LoggingNode.cs Main/jungle-main/store/impl/logger/LoggingNode.cs.meta Main/jungle-main/store/impl/logger/OperationLog.cs Main/jungle-main/store/impl/logger/OperationLog.cs.meta Main/jungle-main/store/impl/logger/TreeOperationLog.cs Main/jungle-main/store/impl/logger/TreeOperationLog.cs.meta Main/jungle-main/store/index.meta Main/jungle-main/store/index/ParentIndex.cs Main/jungle-main/store/index/ParentIndex.cs.meta Main/jungle-main/store/operations.meta Main/jungle-main/store/operations/AppendChildAtOperation.cs Main/jungle-main/store/operations/AppendChildAtOperation.cs.meta Main/jungle-main/store/operations/DefaultTreeOperation.cs Main/jungle-main/store/operations/DefaultTreeOperation.cs.meta Main/jungle-main/store/operations/DeleteAttributeOperation.cs Main/jungle-main/store/operations/DeleteAttributeOperation.cs.meta Main/jungle-main/store/operations/DeleteChildAtOperation.cs Main/jungle-main/store/operations/DeleteChildAtOperation.cs.meta Main/jungle-main/store/operations/NodeOperation.cs Main/jungle-main/store/operations/NodeOperation.cs.meta Main/jungle-main/store/operations/PutAttributeOperation.cs Main/jungle-main/store/operations/PutAttributeOperation.cs.meta Main/jungle-main/store/operations/ReplaceRootNodeOperation.cs Main/jungle-main/store/operations/ReplaceRootNodeOperation.cs.meta Main/jungle-main/store/operations/TreeOperation.cs Main/jungle-main/store/operations/TreeOperation.cs.meta Main/jungle-main/store/transformer.meta Main/jungle-main/store/transformer/AppendChildAt.cs Main/jungle-main/store/transformer/AppendChildAt.cs.meta Main/jungle-main/store/transformer/DeleteAttribute.cs Main/jungle-main/store/transformer/DeleteAttribute.cs.meta Main/jungle-main/store/transformer/DeleteChildAt.cs Main/jungle-main/store/transformer/DeleteChildAt.cs.meta Main/jungle-main/store/transformer/NodeEditor.cs Main/jungle-main/store/transformer/NodeEditor.cs.meta Main/jungle-main/store/transformer/PutAttribute.cs Main/jungle-main/store/transformer/PutAttribute.cs.meta Main/jungle-main/store/transformer/replaceRootNodeAt.cs Main/jungle-main/store/transformer/replaceRootNodeAt.cs.meta Main/jungle-main/transaction.meta Main/jungle-main/transaction/AtomicReference.cs Main/jungle-main/transaction/AtomicReference.cs.meta Main/jungle-main/transaction/DefaultJungleTreeEditor.cs Main/jungle-main/transaction/DefaultJungleTreeEditor.cs.meta Main/jungle-main/transaction/DefaultTransactionManager.cs Main/jungle-main/transaction/DefaultTransactionManager.cs.meta Main/jungle-main/transaction/DefaultTreeContext.cs Main/jungle-main/transaction/DefaultTreeContext.cs.meta Main/jungle-main/transaction/DefaultTreeNode.cs Main/jungle-main/transaction/DefaultTreeNode.cs.meta Main/jungle-main/transaction/DefaultTreeNodeAttribute.cs Main/jungle-main/transaction/DefaultTreeNodeAttribute.cs.meta Main/jungle-main/transaction/DefaultTreeNodeChildren.cs Main/jungle-main/transaction/DefaultTreeNodeChildren.cs.meta Main/jungle-main/transaction/TransactionManager.cs Main/jungle-main/transaction/TransactionManager.cs.meta Main/jungle-main/traverser.meta Main/jungle-main/traverser/DefaultEvaluation.cs Main/jungle-main/traverser/DefaultEvaluation.cs.meta Main/jungle-main/traverser/DefaultEvaluator.cs Main/jungle-main/traverser/DefaultEvaluator.cs.meta Main/jungle-main/traverser/DefaultTraverser.cs Main/jungle-main/traverser/DefaultTraverser.cs.meta Main/jungle-main/traverser/Direction.cs Main/jungle-main/traverser/Direction.cs.meta Main/jungle-main/traverser/Evaluation.cs Main/jungle-main/traverser/Evaluation.cs.meta Main/jungle-main/traverser/Evaluator.cs Main/jungle-main/traverser/Evaluator.cs.meta Main/jungle-main/traverser/InterfaceTraverser.cs Main/jungle-main/traverser/InterfaceTraverser.cs.meta Main/jungle-main/traverser/Traversal.cs Main/jungle-main/traverser/Traversal.cs.meta Main/jungle-main/traverser/Traverser.cs Main/jungle-main/traverser/Traverser.cs.meta Main/jungle-main/traverser/TraverserError.cs Main/jungle-main/traverser/TraverserError.cs.meta Main/jungle-main/util.meta Main/jungle-main/util/DefaultEither.cs Main/jungle-main/util/DefaultEither.cs.meta Main/jungle-main/util/DefaultError.cs Main/jungle-main/util/DefaultError.cs.meta Main/jungle-main/util/Either.cs Main/jungle-main/util/Either.cs.meta Main/jungle-main/util/Error.cs Main/jungle-main/util/Error.cs.meta Main/jungle-main/util/GetOldTreeError.cs Main/jungle-main/util/GetOldTreeError.cs.meta Main/jungle-main/util/IterableConverter.cs Main/jungle-main/util/IterableConverter.cs.meta Main/jungle-main/util/Pair.cs Main/jungle-main/util/Pair.cs.meta Main/jungle-network.meta Main/jungle-network/core.meta Main/jungle-network/core/NetworkDefaultJungle.cs Main/jungle-network/core/NetworkDefaultJungle.cs.meta Main/jungle-network/operations.meta Main/jungle-network/operations/NetworkAppendChildAtOperation.cs Main/jungle-network/operations/NetworkAppendChildAtOperation.cs.meta Main/jungle-network/operations/NetworkDeleteAttributeOperation.cs Main/jungle-network/operations/NetworkDeleteAttributeOperation.cs.meta Main/jungle-network/operations/NetworkDeleteChildAtOperation.cs Main/jungle-network/operations/NetworkDeleteChildAtOperation.cs.meta Main/jungle-network/operations/NetworkNodeOperation.cs Main/jungle-network/operations/NetworkNodeOperation.cs.meta Main/jungle-network/operations/NetworkNodePath.cs Main/jungle-network/operations/NetworkNodePath.cs.meta Main/jungle-network/operations/NetworkPutAttributeOperation.cs Main/jungle-network/operations/NetworkPutAttributeOperation.cs.meta Main/jungle-network/operations/NetworkTreeOperation.cs Main/jungle-network/operations/NetworkTreeOperation.cs.meta Main/jungle-network/operations/NetworkTreeOperationLog.cs Main/jungle-network/operations/NetworkTreeOperationLog.cs.meta Main/jungle-network/transaction.meta Main/jungle-network/transaction/NetworkDefaultJungleTree.cs Main/jungle-network/transaction/NetworkDefaultJungleTree.cs.meta Main/jungle-network/transaction/NetworkDefaultJungleTreeEditor.cs Main/jungle-network/transaction/NetworkDefaultJungleTreeEditor.cs.meta Main/jungle-network/transaction/NetworkTransactionManager.cs Main/jungle-network/transaction/NetworkTransactionManager.cs.meta Test.meta Test/junge-main.meta Test/junge-main/DefaultJungleTreeTest.cs Test/junge-main/DefaultJungleTreeTest.cs.meta Test/junge-main/data.meta Test/junge-main/data/list.meta Test/junge-main/data/list/ListTest.cs Test/junge-main/data/list/ListTest.cs.meta Test/junge-main/data/list/deleteTest.cs Test/junge-main/data/list/deleteTest.cs.meta Test/junge-main/data/list/listAdd.cs Test/junge-main/data/list/listAdd.cs.meta Test/junge-main/data/list/replaceTest.cs Test/junge-main/data/list/replaceTest.cs.meta Test/junge-main/data/treemap.meta Test/junge-main/data/treemap/TreeMapDelete.cs Test/junge-main/data/treemap/TreeMapDelete.cs.meta Test/junge-main/data/treemap/TreeMapTest.cs Test/junge-main/data/treemap/TreeMapTest.cs.meta Test/junge-main/jungle.meta Test/junge-main/jungle/core.meta Test/junge-main/jungle/core/nodeeditor.meta Test/junge-main/jungle/core/nodeeditor/PutAttributeTest.cs Test/junge-main/jungle/core/nodeeditor/PutAttributeTest.cs.meta Test/jungle-network.meta Test/jungle-network/operations.meta Test/jungle-network/operations/NetworkAppendChildOperationTest.cs Test/jungle-network/operations/NetworkAppendChildOperationTest.cs.meta Test/jungle-network/operations/NetworkDeleteAttributeOperationTest.cs Test/jungle-network/operations/NetworkDeleteAttributeOperationTest.cs.meta Test/jungle-network/operations/NetworkDeleteChildAtOperationTest.cs Test/jungle-network/operations/NetworkDeleteChildAtOperationTest.cs.meta Test/jungle-network/operations/NetworkNodeOperationTest.cs Test/jungle-network/operations/NetworkNodeOperationTest.cs.meta Test/jungle-network/operations/NetworkPutAttributeOperationTest.cs Test/jungle-network/operations/NetworkPutAttributeOperationTest.cs.meta Test/jungle-network/operations/NetworkTreeOperationLogTest.cs Test/jungle-network/operations/NetworkTreeOperationLogTest.cs.meta
diffstat 332 files changed, 9483 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
Binary file .DS_Store has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 72add325a6b777445b640803bc458291
+folderAsset: yes
+timeCreated: 1477164409
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/ObjectMapper.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: a1b0a053a92e54759a8c77c8f3cc86f7
+folderAsset: yes
+timeCreated: 1481524195
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/ObjectMapper/ConvertObject.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,28 @@
+using UnityEngine;
+using System.Collections;
+using System;
+using System.Runtime.Serialization.Formatters.Binary;
+using System.Runtime.Serialization;
+using System.IO;
+[Serializable]
+public class ConvertObject : MonoBehaviour {
+
+	public static byte[] Convert (object target) {
+		IFormatter formatter = new BinaryFormatter();
+		MemoryStream ms = new MemoryStream();
+		formatter.Serialize(ms, target);
+		byte[] myByteArray = ms.ToArray();
+		return myByteArray;
+	}
+
+	public static object UnConvert(byte[] target) {
+		using (var memStream = new MemoryStream())
+		{
+			var binForm = new BinaryFormatter();
+			memStream.Write(target, 0, target.Length);
+			memStream.Seek(0, SeekOrigin.Begin);
+			var obj = binForm.Deserialize(memStream);
+			return obj;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/ObjectMapper/ConvertObject.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 93eca2cf0788247b7b77b054c193bf8c
+timeCreated: 1481614756
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/ObjectMapper/SceneNode.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,52 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using System;
+namespace JungleDB {
+	[Serializable]
+	public class SceneNode {
+
+		public GameObject obj;
+		public string Name;
+
+		public SceneNode m_parent;
+
+		[SerializeField]
+		public System.Collections.Generic.List<SceneNode> m_childs;
+
+		public SceneNode(GameObject obj, SceneNode parent=null){
+			this.obj = obj;
+			this.Name = obj.name;
+			m_parent = parent;
+			m_childs = new System.Collections.Generic.List<SceneNode>();
+		}
+
+		public void OnAdded () {}
+
+		public void OnRemoved () {} 
+
+		public bool AddChild (SceneNode toAdd){
+			toAdd.m_parent = this;
+			m_childs.Add(toAdd);
+			toAdd.OnAdded();
+			return true;
+		}
+
+		public bool RemoveChild (SceneNode toRemove) {
+			toRemove.OnRemoved();
+			return m_childs.Remove(toRemove);
+		}
+
+		public void RemoveAllChildren () {
+			int childcount = m_childs.Count;
+			for(int i = 0; i < childcount ;++i){
+				m_childs[i].RemoveAllChildren();
+			}
+
+			for(int i = 0; i < childcount ;++i){
+				m_childs[i].OnRemoved();
+			}
+			m_childs.Clear();
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/ObjectMapper/SceneNode.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: ea5236c11274b49dcab44a3320be44cf
+timeCreated: 1481524197
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 68c016a1f8eea894f9a4ce7aa2f8e1b4
+folderAsset: yes
+timeCreated: 1477164409
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/DefaultJungle.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,99 @@
+using System.Collections;
+using System.Collections.Generic;
+using System;
+using UnityEngine;
+
+namespace JungleDB {
+	public class DefaultJungle : Jungle {
+		private Journal journal;
+		private TreeMap <string, JungleTree> trees;
+		private string uuid;
+		private TreeEditor editor;
+
+		public void Start(){
+			DefaultJungle j = new DefaultJungle(null, "hoge", new DefaultTreeEditor(new DefaultTraverser()));
+			JungleTree t = j.createNewTree ("fuga");
+
+			JungleTreeEditor e1 = t.getTreeEditor ();
+
+			DefaultNodePath root = new DefaultNodePath ();
+			Either<Error, JungleTreeEditor> either = e1.addNewChildAt (root, 0);
+			e1 = either.b();
+			either = e1.addNewChildAt (root.add (0), 0);
+			e1 = either.b ();
+			e1.commit ();
+		}
+
+		public DefaultJungle(Journal journal, string uuid, TreeEditor editor){
+			this.journal = new NullJournal();
+			this.trees = new TreeMap <string, JungleTree>();
+			this.uuid = uuid;
+			this.editor = editor;
+		}
+
+		public JungleTree getTreeByName(string name) {
+			
+			JungleTree jungle_tree = trees.get(name);
+			if (jungle_tree != null) {
+				return jungle_tree;
+			} else {
+				Debug.Log ("そのTreeは無いようですね。");
+				return null;
+			}
+		}
+
+		public JungleTree createNewTree(string name) {
+			ChangeList list = new InnerChangeList(uuid,name);
+			DefaultTreeNode root = new DefaultTreeNode ();
+			InterfaceTraverser traverser = new InterfaceTraverser (root, true);
+			TreeContext tc = new DefaultTreeContext (root, null, list, uuid, name, 0, traverser);
+			JungleTree newTree = new DefaultJungleTree (tc, uuid, journal.getWriter (), editor);
+			if (newTree != null) {
+				trees = trees.put (name, newTree);
+			} else {
+				Debug.Log ("こんばんは、nullです。");
+			}
+			return newTree;
+		} 
+
+		public class InnerChangeList : ChangeList {
+
+			string uuid;
+			string name;
+
+
+			IEnumerator IEnumerable.GetEnumerator()
+			{
+				return this.GetEnumerator();
+			}
+				
+			public IEnumerator<TreeOperation> GetEnumerator()
+			{
+				return iterator ();
+			}
+
+			// construct
+			public InnerChangeList(string _uuid, string _name) {
+				this.uuid = _uuid;
+				this.name = _name;
+			}
+
+			public IEnumerator<TreeOperation> iterator() {
+				List<TreeOperation> nil = new List<TreeOperation>();
+				return nil.iterator();
+			}
+
+			public string uuids() {
+				return uuid;
+			}
+
+			public string getTreeName() {
+				return name;
+			}
+
+			public TreeOperationLog getLog() {
+				return new DefaultTreeOperationLog();
+			}
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/DefaultJungle.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 9d4ad0a7a3b73ef44ac8e7637b768198
+timeCreated: 1477164412
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/DefaultJungleTree.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,83 @@
+
+
+namespace JungleDB {
+public class DefaultJungleTree : JungleTree {
+
+	private AtomicReference<TreeContext> repository;
+	private string uuid;
+	private ChangeListWriter writer;
+	private TreeEditor treeEditor;
+
+
+	public DefaultJungleTree(TreeContext tc, string uuid, ChangeListWriter writer, TreeEditor editor) {
+		this.repository = new AtomicReference<TreeContext>(tc);
+		this.uuid = uuid;
+		this.writer = writer;
+		this.treeEditor = editor;
+	}
+
+	public JungleTreeEditor getTreeEditor() {
+		TreeContext tc = repository.Get ();
+		DefaultTransactionManager txManager = new DefaultTransactionManager(writer, tc, repository, uuid);
+		TreeNode root = tc.getRoot();
+		return new DefaultJungleTreeEditor(root, txManager, treeEditor);
+	}
+
+	public JungleTreeEditor getLocalTreeEditor() {
+		return getTreeEditor ();
+	}
+
+	public TreeNode getRootNode() {
+		TreeContext tc = repository.Get();
+		return tc.getRoot(); // default jungle innner change list?
+	}
+
+	public InterfaceTraverser getTraverser(bool useIndex) {
+		TreeContext tc = repository.Get();
+		return tc.getTraverser();
+	}
+
+	public TreeMap<string, TreeMap<string, List<TreeNode>>> getIndex() {
+		TreeContext tc = repository.Get();
+		return tc.getIndex();
+	}
+
+	public long revision() {
+		TreeContext tc = repository.Get(); // 確かにnull どこから来てる? repositoryのインスタンスを生成してないからかも
+		return tc.getRevision();
+	}
+
+	public Either<Error, JungleTree> getOldTree(long revision) {
+		TreeContext tc = repository.Get();
+
+		for (; tc.getRevision() != revision; ) {
+			tc = tc.prev();
+			if (tc == null)
+				return DefaultEither<Error, JungleTree>.newA(GetOldTreeError.OLD_TREE_NOT_FOUND);
+		}
+
+
+		string oldTreeUuid = uuid + revision;
+		JungleTree oldTree = new DefaultJungleTree(tc, oldTreeUuid, writer, treeEditor);
+		return DefaultEither<Error, JungleTree>.newB(oldTree);
+	}
+
+	public Either<Error, TreeNode> getNodeOfPath(NodePath path) { //eitherはどちらのインターフェースをつかうか、みたいな
+		TreeNode node = repository.Get().getRoot();
+		foreach (int num in path) {
+			if (num == -1)
+				continue;
+			Either<Error, TreeNode> either = node.getChildren().at(num);
+			if (either.isA())
+				return either;
+			node = either.b();
+		}
+		return DefaultEither<Error, TreeNode>.newB(node);
+	}
+
+	public void setBufferSize(int _bufferSize) {
+		// not use
+	}
+
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/DefaultJungleTree.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: ef5c75a2b183ac043b339706e77f4ab1
+timeCreated: 1477164413
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/Jungle.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,7 @@
+
+namespace JungleDB {
+	public interface Jungle {
+		JungleTree getTreeByName (string name);
+		JungleTree createNewTree (string name);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/Jungle.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 477efe01bb26a5445bc957fae6418723
+timeCreated: 1477164411
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/JungleTree.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,23 @@
+
+namespace JungleDB {
+	public interface JungleTree  {
+		
+		JungleTreeEditor getTreeEditor();
+
+		JungleTreeEditor getLocalTreeEditor();
+
+		TreeNode getRootNode();
+
+		long revision();
+
+		Either<Error, JungleTree> getOldTree(long revision);
+
+		TreeMap<string, TreeMap<string, List<TreeNode>>> getIndex();
+
+		// InterfaceTraverser getTraverser(bool useIndex);
+
+		Either<Error, TreeNode> getNodeOfPath(NodePath path);
+
+		void setBufferSize(int _bufferSize);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/JungleTree.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 0edc6411130c4be428af3c34bd5006c9
+timeCreated: 1477164410
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/JungleTreeEditor.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,14 @@
+
+namespace JungleDB {
+	public interface JungleTreeEditor {
+		Either<Error,JungleTreeEditor> addNewChildAt(NodePath path,int pos);
+		Either<Error,JungleTreeEditor> deleteChildAt(NodePath path,int pos);
+		Either<Error,JungleTreeEditor> putAttribute(NodePath path,string key, byte[] value);
+		Either<Error,JungleTreeEditor> deleteAttribute(NodePath path,string key);
+		Either<Error, JungleTreeEditor> replaceNewRootNode();
+		Either<Error,JungleTreeEditor> edit(NodePath path,NodeEditor editor);
+		Either<Error,JungleTreeEditor> commit();
+		Either<Error,JungleTreeEditor> flushSuccess();
+
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/JungleTreeEditor.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: a83a7c1a691005f4dbabccd68a45824b
+timeCreated: 1477164412
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/core.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: cd10cbf6cc1b9b1449970908d387aada
+folderAsset: yes
+timeCreated: 1477164409
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/core/Attributes.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,5 @@
+using UnityEngine;
+public interface Attributes{
+	byte[] get (string key);
+	string getString (string key);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/core/Attributes.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 8b5f9c6f5264df34d9c713a438baaa51
+timeCreated: 1477164411
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/core/Children.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,6 @@
+namespace JungleDB {
+	public interface Children {
+		Either<Error, TreeNode> at (int pos);
+		int size();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/core/Children.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: e530765d6685158459e40a12f0de9775
+timeCreated: 1477164413
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/data.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: f986c647ab8f3d944bf09692d3e8cd86
+folderAsset: yes
+timeCreated: 1477164409
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/data/list.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: c03c69b8360fbcc42a0ec4a1ee50346e
+folderAsset: yes
+timeCreated: 1477164410
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/data/list/DefaultNode.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,74 @@
+using UnityEngine;
+using System.Collections;
+using System;
+
+public class DefaultNode<T> : Node<T> {
+	private readonly T attribute;
+	private readonly Node<T> next;
+    //private TailNode<T> tailNode;
+
+    public DefaultNode(T attribute, Node<T> next) {
+		this.attribute = attribute;
+		this.next = next;
+	}
+
+    public Node<T> getNext() {
+		return next;
+	}
+
+	public T getAttribute() {
+		return attribute;
+	}
+
+	public Node<T> addLast(T attribute) {
+		Node<T> node = next.addLast(attribute);
+		return new DefaultNode<T>(this.attribute, node);
+	}
+
+	public Node<T> add(int currentNum, int num, T attribute) {
+		if (currentNum == num) {
+			Node<T> newNode = new DefaultNode<T>(attribute, this.next);
+			return new DefaultNode<T>(this.attribute,  newNode);
+		}
+
+		Node<T> newNodes = next.add(currentNum + 1, num, attribute);
+		if (newNodes == null)
+			return null;
+
+		return new DefaultNode<T>(this.attribute, newNodes);
+	}
+
+	public Node<T> delete(int currentNum, int deleteNum) {
+		if (currentNum == deleteNum) {
+			return new DefaultNode<T> (this.attribute, this.next.getNext ());
+		}
+
+		Node<T> newNode = next.delete (currentNum + 1, deleteNum);
+		if (newNode == null) {
+			return null;
+		}
+		return new DefaultNode<T>(this.attribute, newNode);
+	}
+
+	public Node<T> replaceNode(int currentNum, int num, T attribute) {
+		if (currentNum == num) {
+			return new DefaultNode<T>(attribute, this.getNext());
+		}
+
+		Node<T> newNode = next.replaceNode(currentNum + 1, num, attribute);
+		if (newNode == null) {
+			return null;
+		}
+		return new DefaultNode<T>(this.attribute, newNode);
+	}
+
+
+	public int length() {
+		return next.length() + 1;
+	}
+
+    public T getAttribure()
+    {
+        throw new NotImplementedException();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/data/list/DefaultNode.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 93a130acd316c9d458e9f92b5994e556
+timeCreated: 1477164411
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/data/list/List.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,121 @@
+using UnityEngine;
+using System.Collections;
+using System.Collections.Generic;
+using System;
+
+public class List<T> : IEnumerable<T> {
+	private readonly Node<T> head;
+
+    public List() {
+        this.head = new headNode<T>();
+    }
+
+	// T...はC#だとparamsらしい 可変引数型というみたいだ
+	public List(params T[] attributes) {
+		List<T> list = new List<T> ();
+		foreach (T attribute_local in attributes) {
+			list = list.addLast (attribute_local);
+		}
+	}
+
+    private List(Node<T> head) {
+        this.head = head;
+    }
+
+    public Node<T> getHead() {
+        return head;
+    }
+
+	public List<T> add(int num, T attribute) {
+        Node<T> newHead = head.add(0, num, attribute);
+        if (newHead == null)
+            return this;
+        return new List<T>(newHead);
+    }
+
+    public List<T> addLast(T attribute) {
+        Node<T> newHead = head.addLast(attribute);
+		return new List<T>(newHead);
+    }
+
+
+    public T index(int num) {
+        int count = 0;
+        Node<T> currentNode = head.getNext();
+        while (currentNode != null) {
+			if (count == num) {
+				return currentNode.getAttribute ();
+			}
+            currentNode = currentNode.getNext();
+            count++;
+        }
+        return default(T);
+    }
+
+	public IEnumerator<T> iterator() {
+		Node<T> currentNode = head.getNext();
+		int count = 0;
+		int len = currentNode.length();
+		while (len != count) {
+			yield return (T)currentNode.getAttribute();
+			currentNode = currentNode.getNext ();
+			count++;
+		}
+	}
+
+	IEnumerator IEnumerable.GetEnumerator()
+	{
+		return this.GetEnumerator();
+	}
+
+	public IEnumerator<T> GetEnumerator()
+	{
+		return iterator ();
+	}
+		
+
+	public List<T> delete(int num) {
+		Node<T> newNode = head.delete(0, num);
+		if (newNode == null)
+			return this;
+		return new List<T>(newNode);
+	}
+
+	public List<T> replace(int num, T attribute) {
+		Node<T> newHead = head.replaceNode(0, num, attribute);
+		if (newHead == null)
+			return this;
+		return new List<T>(newHead);
+	}
+
+	public T tail() {
+		return index(length() - 1);
+	}
+
+	// java code head.
+	public T headList() {
+		return index(0);
+	}
+
+	public List<T> deleteLast() {
+		return delete(head.length() - 1);
+	}
+
+	public List<T> deleteHead() {
+		return delete(0);
+	}
+
+	public int length() {
+		return head.length();
+	}
+
+	public List<T> append(List<T> list) {
+		IEnumerator<T> iterator = list.iterator();
+		List<T> newList = this;
+		while (iterator.MoveNext()) {
+			T attribute = iterator.Current;
+			newList = newList.addLast(attribute);
+		}
+		return newList;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/data/list/List.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 988c71903140e9943bf4e02cd68b83a3
+timeCreated: 1477164411
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/data/list/Node.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,17 @@
+
+public interface Node<T> {
+
+    Node<T> getNext();
+
+	Node<T> add(int currentNum, int num, T attribute);
+
+	Node<T> addLast(T attribute);
+
+	Node<T> delete(int currentNum, int num);
+
+	Node<T> replaceNode(int currentNum, int num, T attribute);
+
+    int length();
+
+    T getAttribute();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/data/list/Node.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: c093d5cb0f302df45be934955066bd2e
+timeCreated: 1477164412
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/data/list/TailNode.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,40 @@
+using UnityEngine;
+using System.Collections;
+using System;
+
+public class TailNode<T> : Node<T> {
+
+	public Node<T> getNext() {
+		return null;
+	}
+
+	public T getAttribute() {
+		return default(T);
+	}
+
+	public Node<T> add(int currentNum, int num, T attribute) {
+		return null;
+	}
+
+	public Node<T> delete(int currentNum, int num) {
+		return null;
+	}
+
+	public Node<T> replaceNode(int currentNum, int num, T attribute) {
+		return null;
+	}
+
+	public Node<T> addLast(T attribute) {
+		return new DefaultNode<T> (attribute, this);
+	}
+		
+    public T getAttribure()
+    {
+        throw new NotImplementedException();
+    }
+
+    public int length()
+    {
+		return 0;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/data/list/TailNode.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 42ce5176c868f9c468e9722e00eb7d57
+timeCreated: 1477164410
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/data/list/headNode.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,69 @@
+using UnityEngine;
+using System.Collections;
+using System;
+
+public class headNode<T> : Node<T>{
+	private readonly Node<T> next;
+
+	public headNode(){
+		this.next = new TailNode<T> ();
+	}
+
+	public headNode(Node<T> next){
+		this.next = next;
+	}
+
+	public Node<T> getNext(){
+		return next;
+	}
+
+	public T getAttribute(){
+		return default(T);
+	}
+
+	public Node<T> add(int currentNum, int num, T attribute) {
+		if (num == 0) {
+			Node<T> newNode = new DefaultNode<T>(attribute, next);
+			return new headNode<T>(newNode);
+		}
+		Node<T> newNodes = next.add(currentNum + 1, num, attribute);
+		if (newNodes == null) {
+			return this;
+		}
+		return new headNode<T>(newNodes);
+	}
+
+	public Node<T> addLast(T attribute) {
+		Node<T> node = next.addLast(attribute);
+		return new headNode<T>(node);
+	}
+
+	public Node<T> delete(int currentNum, int deleteNum) {
+		if (currentNum == deleteNum) {
+			return new headNode<T>(this.next.getNext());
+		}
+
+		Node<T> newNode = next.delete(currentNum + 1, deleteNum);
+		if (newNode == null) {
+			return this;
+		}
+		return new headNode<T>(newNode);
+	}
+
+	public Node<T> replaceNode(int currentNum, int num, T attribute) {
+		Node<T> nextNode = getNext();
+		Node<T> newNode = nextNode.replaceNode(currentNum, num, attribute);
+		if (newNode == null)
+			return this;
+		return new headNode<T>(newNode);
+	}
+
+	public int length() {
+		return next.length();
+	}
+
+    public T getAttribure()
+    {
+        throw new NotImplementedException();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/data/list/headNode.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: c0c8ddcddce1719498a052c9b50fbe5d
+timeCreated: 1477164412
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/data/treemap.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: ad16a47d84b0f6c4fa8510bd852ec767
+folderAsset: yes
+timeCreated: 1477164409
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/data/treemap/BlackNode.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,126 @@
+using UnityEngine;
+using System.Collections.Generic;
+using System.Collections;
+using System;
+
+public class BlackNode<K,V> 
+	:TreeMapNode<K,V>
+{
+	
+	public BlackNode (K key, V value, TreeMapNode<K, V> left, TreeMapNode<K, V> right)
+		: base (key, value, left, right)
+	{
+	}
+
+	public override rebuildNode<K,V> deleteNode ()
+	{
+		EmptyNode<K, V> emptyNode = new EmptyNode<K,V> (key);
+		return new rebuildNode<K,V> (true, emptyNode);
+	}
+
+	public override int checkDepth (int count, int minCount)
+	{ // test method
+		count++;
+		minCount = lefts ().checkDepth (count, minCount);
+		minCount = rights ().checkDepth (count, minCount);
+		return minCount;
+	}
+
+	public override bool isNotEmpty ()
+	{
+		return true;
+	}
+
+	public override TreeMapNode<K, V> createNode (K key, V value, TreeMapNode<K, V> left, TreeMapNode<K, V> right)
+	{
+		return new BlackNode<K,V> (key, value, left, right);
+	}
+
+	public override TreeMapNode<K, V> insBalance ()
+	{
+		Rotate spin = left.checkRotate (Rotate.L);
+
+		if (spin == Rotate.R) {
+			TreeMapNode<K, V> leftChild = new BlackNode<K,V> (left.lefts ().getKey (), left.lefts ().getValue (), left.lefts ().lefts (), left.lefts ().rights ());
+			TreeMapNode<K, V> rightChild = new BlackNode<K,V> (getKey (), getValue (), left.rights (), right);
+			return new RedNode<K,V> (left.getKey (), left.getValue (), leftChild, rightChild);
+
+		} else if (spin == Rotate.LR) {
+			TreeMapNode<K, V> leftChild = new BlackNode<K,V> (left.getKey (), left.getValue (), left.lefts (), left.rights ().lefts ());
+			TreeMapNode<K, V> rightChild = new BlackNode<K,V> (getKey (), getValue (), left.rights ().rights (), right);
+			return new RedNode<K,V> (left.rights ().getKey (), left.rights ().getValue (), leftChild, rightChild);
+
+		}
+
+		spin = right.checkRotate (Rotate.R);
+		if (spin == Rotate.L) {
+			TreeMapNode<K, V> leftChild = new BlackNode<K,V> (getKey (), getValue (), left, right.lefts ());
+			TreeMapNode<K, V> rightChild = new BlackNode<K,V> (right.rights ().getKey (), right.rights ().getValue (), right.rights ().lefts (), right.rights ().rights ());
+			return new RedNode<K,V> (right.getKey (), right.getValue (), leftChild, rightChild);
+
+		} else if (spin == Rotate.RL) {
+			TreeMapNode<K, V> leftChild = new BlackNode<K,V> (getKey (), getValue (), left, right.lefts ().lefts ());
+			TreeMapNode<K, V> rightChild = new BlackNode<K,V> (right.getKey (), right.getValue (), right.lefts ().rights (), right.rights ());
+			return new RedNode<K,V> (right.lefts ().getKey (), right.lefts ().getValue (), leftChild, rightChild);
+
+		}
+
+		return this;
+	}
+
+	public override Rotate checkRotate (Rotate side)
+	{
+		return Rotate.N;
+	}
+
+	public override bool isRed ()
+	{
+		return false;
+	}
+
+	public override rebuildNode<K,V> replaceNode (TreeMapNode<K, V> parent, Comparer<K> ctr)
+	{
+		TreeMapNode<K, V> newNode;
+		if (!this.lefts ().isNotEmpty () && !this.rights ().isNotEmpty ()) { //自身を削除する
+			return deleteNode ();//黒が1つ減るので木のバランスを取る
+		} else if (this.lefts ().isNotEmpty () && !this.rights ().isNotEmpty ()) { //左の部分木を昇格させる
+			newNode = createNode (lefts ().getKey (), lefts ().getValue (), lefts ().lefts (), lefts ().rights ());
+			if (!this.lefts ().isRed ()) //昇格させる木のrootが黒だったらバランスを取る
+				return new rebuildNode<K,V> (true, newNode);
+			return new rebuildNode<K,V> (false, newNode);
+		} else if (!this.lefts ().isNotEmpty () && this.rights ().isNotEmpty ()) { //右の部分木を昇格させる
+			newNode = createNode (rights ().getKey (), rights ().getValue (), rights ().lefts (), rights ().rights ());
+			if (!this.rights ().isRed ()) //昇格させる木のrootが黒だったらバランスを取る
+				return new rebuildNode<K,V> (true, newNode);
+			return new rebuildNode<K,V> (false, newNode);
+		} else {//子ノードが左右にある場合 二回目はここには入らない
+			//左の部分木の最大の値を持つNodeと自身を置き換える
+			TreeMapNode<K, V> cur = this.lefts ();
+			while (cur.rights ().isNotEmpty ()) { //左の部分期の最大値を持つNodeを取得する
+				cur = cur.rights ();
+			}
+			if (this.lefts ().rights ().isNotEmpty ()) { //左の部分木が右の子を持っているか
+				rebuildNode<K, V> leftSubTreeNodeRebuildNode = this.lefts ().deleteSubTreeMaxNode (null, ctr, Rotate.L);//最大値を削除した左の部分木を返す。rootはthisと同じ。
+				if (leftSubTreeNodeRebuildNode.rebuilds ()) {
+					TreeMapNode<K, V> leftSubTreeNode = leftSubTreeNodeRebuildNode.getNode ();
+					TreeMapNode<K, V> newParent = createNode (cur.getKey (), cur.getValue (), leftSubTreeNode, this.rights ());
+					return leftSubTreeNode.deleteBalance (newParent, ctr);
+				}
+				//same name onece used.
+				TreeMapNode<K, V> leftSubTreeNodes = leftSubTreeNodeRebuildNode.getNode ();
+				newNode = createNode (cur.getKey (), cur.getValue (), leftSubTreeNodes, this.rights ()); //rootをcurと入れ替えることでNodeの削除は完了する
+				return new rebuildNode<K,V> (false, newNode);
+			} else {
+				rebuildNode<K, V> leftSubTreeNodeRebuildNode = this.lefts ().replaceNode (this, ctr);//右の子がいなかった場合、左の子を昇格させるだけで良い。
+				if (leftSubTreeNodeRebuildNode.rebuilds ()) {
+					TreeMapNode<K, V> node = leftSubTreeNodeRebuildNode.getNode ();
+					TreeMapNode<K, V> newParent = createNode (this.lefts ().getKey (), this.lefts ().getValue (), node, this.rights ());
+					return node.deleteBalance (newParent, ctr);
+				}
+				TreeMapNode<K,V> leftSubTreeNode = leftSubTreeNodeRebuildNode.getNode ();
+				newNode = createNode (this.lefts ().getKey (), this.lefts ().getValue (), leftSubTreeNode, this.rights ());
+				return new rebuildNode<K,V> (false, newNode);
+			}
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/data/treemap/BlackNode.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 93f422f161c5b5e42a7aadda007ae55e
+timeCreated: 1477164411
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/data/treemap/EmptyClass.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+using System;
+
+namespace AssemblyCSharpfirstpass
+{
+	public class NULL
+	{
+		public NULL ()
+		{
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/data/treemap/EmptyClass.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 82002694108fdbb4794b121c403895a6
+timeCreated: 1477164411
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/data/treemap/EmptyNode.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,69 @@
+using UnityEngine;
+using System.Collections;
+using System.Collections.Generic;
+using System;
+
+public class EmptyNode<K,V> : TreeMapNode<K,V>{
+	//static V values;
+	// Use this for initialization
+	public EmptyNode ()
+		: base (default(K),default(V))
+	{
+	}
+
+	public EmptyNode (K key)
+		: base (key,default(V))
+	{
+	}
+
+	public override TreeMapNode<K,V> lefts(){
+		return new EmptyNode<K,V>();
+	}
+
+	public override TreeMapNode<K,V> rights(){
+		return new EmptyNode<K,V>();
+	}
+
+	public override bool isNotEmpty(){
+		return false;
+	}
+
+	public override TreeMapNode<K,V> createNode(K key,V value,TreeMapNode<K,V> left, TreeMapNode<K,V> right){
+		return new RedNode<K,V> (key, value, new EmptyNode<K,V> (), new EmptyNode<K,V> ());
+	}
+
+	public TreeMapNode<K,V> put(K k,V value){
+		return new RedNode<K, V> (k, value, new EmptyNode<K,V> (), new EmptyNode<K,V> ());
+	}
+
+	//I don't know only Comparator method.
+	public override rebuildNode<K, V> replaceNode(TreeMapNode<K, V> parent, Comparer<K> ctr) { // not use method
+		return new rebuildNode<K,V>(false, this);
+	}
+
+	public override rebuildNode<K,V> deleteNode(){
+		return new rebuildNode<K, V> (false, this);
+	}
+		
+	public override TreeMapNode<K,V> insBalance(){
+		return insBalance();
+	}
+
+	public override Rotate checkRotate(Rotate side){
+		return Rotate.N;
+	}
+
+	public override bool isRed(){
+		return false;
+	}
+
+	public override int checkDepth(int count, int minCount) { // test method
+		if (count < minCount || minCount == 0) {
+			minCount = count;
+		}
+			//c# is there assert??
+			//Assert.assertTrue(count <= 2 * minCount);
+		return minCount;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/data/treemap/EmptyNode.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: a0321bf79fae55942bb3f7f3a7533b06
+timeCreated: 1477164412
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/data/treemap/RedNode.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,101 @@
+using UnityEngine;
+using System.Collections;
+using System;
+using System.Collections.Generic;
+
+public class RedNode<K,V> : TreeMapNode<K,V>{
+
+	// Use this for initialization
+	public RedNode (K key, V value, TreeMapNode<K,V> left, TreeMapNode<K,V> right)
+		: base (key, value, left, right)
+	{
+	}
+	
+	// Update is called once per frame
+	public override bool isNotEmpty ()
+	{
+		return true;
+	}
+
+	public override rebuildNode<K,V> deleteNode() {
+		TreeMapNode<K,V> emptyNode = new EmptyNode<K,V>(this.getKey());
+		return new rebuildNode<K,V>(false, emptyNode);
+	}
+
+	public override Rotate checkRotate(Rotate side) {
+		if (side == Rotate.L) {
+			if (left.isRed())
+				return Rotate.R;
+			else if (right.isRed())
+				return Rotate.LR;
+			return Rotate.N;
+		} else {
+			if (left.isRed())
+				return Rotate.RL;
+			else if (right.isRed())
+				return Rotate.L;
+			return Rotate.N;
+		}
+	}
+
+	public override rebuildNode<K,V> replaceNode(TreeMapNode<K, V> parent, Comparer<K> ctr) {
+		TreeMapNode<K, V> newNode;
+		if (!this.lefts().isNotEmpty() && !this.rights().isNotEmpty()) { //自身を削除する
+			return deleteNode();
+		} else if (this.lefts().isNotEmpty() && !this.rights().isNotEmpty()) { //左の部分木を昇格させる
+			newNode = lefts().createNode(lefts().getKey(), lefts().getValue(), lefts().lefts(), lefts().rights());
+			return new rebuildNode<K,V>(false, newNode);
+		} else if (!this.lefts().isNotEmpty() && this.rights().isNotEmpty()) { //右の部分木を昇格させる
+			newNode = rights().createNode(rights().getKey(), rights().getValue(), rights().lefts(), rights().rights());
+			return new rebuildNode<K,V>(false, newNode);
+		} else {//子ノードが左右にある場合
+			//左の部分木の最大の値を持つNodeと自身を置き換える
+			TreeMapNode<K, V> cur = this.lefts();
+			
+			while (cur.rights().isNotEmpty()) {
+				cur = cur.rights();
+			}
+			if (this.lefts().rights().isNotEmpty()) {
+				rebuildNode<K, V> leftSubTreeNodeRebuildNode = this.lefts().deleteSubTreeMaxNode(null, ctr, Rotate.L);
+				if (leftSubTreeNodeRebuildNode.rebuilds()) {
+					TreeMapNode<K, V> node = leftSubTreeNodeRebuildNode.getNode();
+					TreeMapNode<K, V> newParent = createNode(cur.getKey(), cur.getValue(), node, this.rights());
+					return node.deleteBalance(newParent, ctr);
+				}
+				TreeMapNode<K, V> leftSubTreeNode = leftSubTreeNodeRebuildNode.getNode();
+				newNode = createNode(cur.getKey(), cur.getValue(), leftSubTreeNode, this.rights());
+				return new rebuildNode<K,V>(false, newNode);
+			} else {
+				rebuildNode<K, V> leftSubTreeNodeRebuildNode = this.lefts().replaceNode(this, ctr);
+				if (leftSubTreeNodeRebuildNode.rebuilds()) {
+					TreeMapNode<K, V> node = leftSubTreeNodeRebuildNode.getNode();
+					TreeMapNode<K, V> newParent = createNode(this.lefts().getKey(), this.lefts().getValue(), node, this.rights());
+					return node.deleteBalance(newParent, ctr);
+				}
+				TreeMapNode<K, V> leftSubTreeNode = leftSubTreeNodeRebuildNode.getNode();
+				newNode = createNode(cur.getKey(), cur.getValue(), leftSubTreeNode, this.rights());
+				return new rebuildNode<K,V>(false, newNode);
+			}
+			
+		}
+	}
+
+	public override bool isRed() {
+		return true;
+	}
+
+	public override TreeMapNode<K, V> createNode(K key, V value, TreeMapNode<K, V> left, TreeMapNode<K, V> right) {
+		return new RedNode<K,V>(key, value, left, right);
+	}
+
+	public override TreeMapNode<K, V> insBalance() {
+		return this;
+	}
+
+	public override int checkDepth(int count, int minCount) { // test method
+		count++;
+		minCount = lefts().checkDepth(count, minCount);
+		minCount = rights().checkDepth(count, minCount);
+		return minCount;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/data/treemap/RedNode.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: ed91abb32f987f44787cd6b455938fbd
+timeCreated: 1477164413
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/data/treemap/Rotate.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,7 @@
+using UnityEngine;
+using System.Collections;
+
+public enum Rotate{
+	R,L,RL,LR,N
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/data/treemap/Rotate.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 50cb0e4c272e25c46bbda905191174e3
+timeCreated: 1477164411
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/data/treemap/TreeMap.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,131 @@
+using UnityEngine;
+using System.Collections;
+using System.Collections.Generic;
+using System;
+
+namespace JungleDB {
+	public class TreeMap<K, V> {
+		TreeMapNode<K, V> root;
+		Comparer<K> comparator;
+
+
+		public TreeMap(IComparer icompere) {
+			this.root = new EmptyNode<K, V> ();
+		}
+
+		public TreeMap() {
+			this.root = new EmptyNode<K, V> ();
+			this.comparator =  Comparer<K>.Default;
+		}
+
+		public TreeMap(TreeMapNode<K, V> root) {
+			this.root = root;
+		}
+
+		public TreeMap(TreeMapNode<K, V> root, Comparer<K> comparator) {
+			this.root = root;
+			this.comparator = comparator;
+		}
+
+		public TreeMapNode<K, V> getRoot() {
+			return root;
+		}
+
+		public V get(K key) {
+			return root.get(key, this.comparator);
+		}
+
+		public TreeMap<K, V> put(K key, V value) {
+			if(isEmpty()) {
+				TreeMapNode<K, V> newRoot = new BlackNode<K, V> (key, value, new EmptyNode<K, V> (), new EmptyNode<K, V> ());
+				return new TreeMap<K, V> (newRoot, this.comparator);
+			}
+
+			TreeMapNode<K, V> newEntry = root.put (key, value, this.comparator);
+			TreeMapNode<K, V> newRoots = new BlackNode<K, V> (newEntry.getKey (), newEntry.getValue (), newEntry.lefts (), newEntry.rights ());
+			return new TreeMap<K, V> (newRoots, this.comparator);
+		}
+			
+		public bool isEmpty() {
+			return !root.isNotEmpty ();
+		}
+
+		public TreeMap<K, V> delete(K key) {
+			if (key.Equals(default(K))) {
+				return this;
+			}
+			rebuildNode<K, V> rootRebuildNode = root.delete (key, null, this.comparator, Rotate.N);
+			if (!rootRebuildNode.notEmpty ()) {
+				return this;
+			}
+			TreeMapNode<K, V> roots = rootRebuildNode.getNode ();
+			if (!root.isNotEmpty ()) {
+				return new TreeMap<K, V> (new EmptyNode<K, V> (), this.comparator);
+			}
+			TreeMapNode<K, V> newRoot = new BlackNode<K, V> (roots.getKey (), roots.getValue (), roots.lefts (), roots.rights ());
+			return new TreeMap<K, V> (newRoot, this.comparator);
+		}
+		// like to iterator and IEmurator.
+		public IEnumerator<K> keys() {
+			return new iterators<K> ();
+		}
+
+
+		public void checkDepth() {
+			root.checkDepth (0, 0);
+			Debug.Log ("-----------------------------------");
+		}
+
+		public class iterators<K> : IEnumerator<K> {
+			Stack<TreeMapNode<K,V>> nodeStack = new Stack<TreeMapNode<K,V>>();
+			TreeMapNode<K,V> currentNode = new TreeMap<K,V>().getRoot();
+			public List<K> appLines { get; set; }
+			private int position;
+
+
+			public bool MoveNext() {
+							return currentNode != null;
+						}
+				
+
+			public K Current{
+				get {
+					K key = currentNode.getKey ();
+					if (currentNode.lefts ().isNotEmpty ()) {
+						nodeStack.Push (currentNode);
+						currentNode = currentNode.lefts ();
+						return key;
+					} else if (currentNode.rights ().isNotEmpty ()) {
+						currentNode = currentNode.rights ();
+						return key;
+					} else if (nodeStack.Count == 0) {
+						currentNode = null;
+						return key;
+					}
+					do {
+						currentNode = nodeStack.Pop ().rights ();
+						if (currentNode.isNotEmpty ()) {
+							return key;
+						}
+					}while (nodeStack.Count != 0);
+					return key;
+				}
+			}
+
+			object IEnumerator.Current
+			{
+				get { return appLines; }
+			}
+
+			public void Dispose() {
+				((IEnumerator<K>)this.appLines).Dispose ();
+			}
+
+			public void Reset() {
+				((IEnumerator<K>)this.appLines).Reset();
+			}
+
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/data/treemap/TreeMap.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: e2a5593baff94104f8388d181f9417ef
+timeCreated: 1477164412
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/data/treemap/TreeMapNode.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,332 @@
+using System.Collections;
+using System;
+using UnityEngine;
+using System.Collections.Generic;
+
+
+public abstract class  TreeMapNode<K,V>
+{
+
+	protected  K key = default(K);
+	protected  V value = default(V);
+
+	public TreeMapNode<K,V> right;
+	public TreeMapNode<K,V> left;
+
+
+	//  Use this for initialization
+	public TreeMapNode (K key, V value)
+	{
+		this.key = key;
+		this.value = value;
+	}
+
+	public TreeMapNode (K key, V value, TreeMapNode<K,V> left, TreeMapNode<K,V> right)
+	{
+		this.key = key;
+		this.value = value;
+		this.right = right;
+		this.left = left;
+	}
+
+	public virtual TreeMapNode<K,V> lefts ()
+	{
+		return left;
+	}
+		
+
+	public int compare(K compareKey, Comparer<K> ctr)  {
+		return ctr.Compare (compareKey, this.getKey ());
+	}
+    
+	public V get (K key, Comparer<K> ctr){
+ 		TreeMapNode<K,V> cur = this;
+		while (cur.isNotEmpty ()) { // getでEmpty nodeを返している ? compareでKeyが0になっている
+			int result = cur.compare (key, ctr);
+			if (result > 0) {
+				cur = cur.rights ();
+			} else if (result < 0) {
+				cur = cur.lefts ();
+			} else if (result == 0) {
+				if (cur != null) {
+					return cur.getValue ();
+				}
+			}
+		}
+		return default(V);
+	}
+
+
+
+	public virtual TreeMapNode<K,V> rights () {
+		return right;
+	}
+
+	public K getKey () {
+		return key;
+	}
+
+	public V getValue () {
+		return value;
+	}
+
+	public TreeMapNode<K,V> put (K k, V v,Comparer<K> ctr) {
+
+		if (!isNotEmpty ()) {
+			return createNode (k, v, left, right);
+		}
+
+		int result = compare (k, ctr);
+		if (result > 0) {
+			TreeMapNode<K,V> node = right.put (k, v, ctr);
+			node = createNode (key, this.value, left, node);
+			return node.insBalance ();
+		} else if (result < 0) {
+			TreeMapNode<K,V> node = left.put (k, v,ctr);
+			return createNode (key, this.value, node, right).insBalance ();
+		}
+		return createNode (key, v, left, right);
+	}
+		
+	public rebuildNode<K,V> delete (K key, TreeMapNode<K,V> parent, Comparer<K> ctr, Rotate side)
+	{
+		if (this.isNotEmpty ()) {
+			rebuildNode<K,V> rebuildNode = null;
+			int result = compare(key, ctr);
+			if (result > 0) {
+				rebuildNode = right.delete (key, this, ctr, Rotate.R);
+			} else if (result < 0) {
+				rebuildNode = left.delete (key, this, ctr, Rotate.L);
+			} else if (result == 0){
+				rebuildNode = replaceNode (parent, ctr);
+			}
+			if (parent == null) {
+				return rebuildNode;
+			}
+			TreeMapNode<K,V> node = rebuildNode.getNode ();
+			if (rebuildNode.rebuilds ()) {
+				// ここのエラーは後で
+				return node.deleteBalance (parent, ctr);
+			}
+			TreeMapNode<K,V> newParent;
+			if (side == Rotate.L) {
+				newParent = parent.createNode (parent.getKey (), parent.getValue (), node, parent.rights ());
+			} else {
+				newParent = parent.createNode (parent.getKey (), parent.getValue (), parent.lefts (), node);
+			}
+			return new rebuildNode<K,V> (false, newParent);
+		}
+		return null;
+	}
+
+	public rebuildNode<K,V> deleteSubTreeMaxNode (TreeMapNode<K, V> parent, Comparer<K> ctr, Rotate side)
+	{
+		rebuildNode<K,V> rebuildNode;
+		TreeMapNode<K, V> node;
+		if (rights ().isNotEmpty ()) {// 最大値のノードが取得できるまで潜る
+			rebuildNode = rights ().deleteSubTreeMaxNode (this, ctr, Rotate.R);
+		} else {
+			rebuildNode = this.replaceNode (parent, ctr);
+		}
+		if (parent == null)
+			return rebuildNode;
+
+		if (rebuildNode.rebuilds ()) {
+			node = rebuildNode.getNode ();
+			return node.deleteBalance (parent, ctr);
+		}
+		if (side == Rotate.R)
+			node = parent.createNode (parent.getKey (), parent.getValue (), parent.lefts (), rebuildNode.getNode ());
+		else
+			node = parent.createNode (parent.getKey (), parent.getValue (), rebuildNode.getNode (), parent.rights ());
+		return new rebuildNode<K,V> (false, node);
+	}
+
+
+	public rebuildNode<K, V> deleteBalance (TreeMapNode<K, V> parent, Comparer<K> ctr)
+	{
+		TreeMapNode<K, V> newNode = null;
+		if (!isRed ()) {
+			if (0 > compare (parent.getKey (), ctr)) {
+				bool rightChild = parent.lefts ().rights ().isRed ();
+				bool leftChild = parent.lefts ().lefts ().isRed ();
+
+				if (!parent.isRed ()) {
+					if (!parent.lefts ().isRed ()) {
+						if (!rightChild && !leftChild) {
+							newNode = rebuildThree (parent, Rotate.R);
+							return new rebuildNode<K,V> (true, newNode);
+						}
+						if (rightChild) {
+							newNode = rebuildfive (parent, Rotate.R);
+							return new rebuildNode<K,V> (false, newNode);
+						} else {
+							newNode = rebuildsix (parent, Rotate.R);
+							return new rebuildNode<K,V> (false, newNode);
+						}
+					} else { // 左の子が赤
+						newNode = rebuildTwo (parent, ctr, Rotate.R);
+						return new rebuildNode<K,V> (false, newNode);
+					}
+				} else { // 親が赤
+					if (!rightChild && !leftChild) {
+						newNode = rebuildFour (parent, Rotate.R);
+						return new rebuildNode<K,V> (false, newNode);
+					}
+					if (rightChild) {
+						newNode = rebuildfive (parent, Rotate.R);
+						return new rebuildNode<K,V> (false, newNode);
+					} else {
+						newNode = rebuildsix (parent, Rotate.R);
+						return new rebuildNode<K,V> (false, newNode);
+					}
+				}
+			} else {
+				bool rightChild = parent.rights ().rights ().isRed ();
+				bool leftChild = parent.rights ().lefts ().isRed ();
+
+				if (!parent.isRed ()) { // 親が黒
+					if (!parent.rights ().isRed ()) { // 左の子が黒
+						if (!rightChild && !leftChild) {
+							newNode = rebuildThree (parent, Rotate.L);
+							return new rebuildNode<K,V> (true, newNode);
+						}
+						if (rightChild) {
+							newNode = rebuildsix (parent, Rotate.L);
+							return new rebuildNode<K,V> (false, newNode);
+						} else {
+							newNode = rebuildfive (parent, Rotate.L);
+							return new rebuildNode<K,V> (false, newNode);
+						}
+					} else { // 左の子が赤
+						newNode = rebuildTwo (parent, ctr, Rotate.L);
+						return new rebuildNode<K,V> (false, newNode);
+					}
+				} else { // 親が赤
+					if (!rightChild && !leftChild) {
+						newNode = rebuildFour (parent, Rotate.L);
+						return new rebuildNode<K,V> (false, newNode);
+					}
+					if (rightChild) {
+						newNode = rebuildsix (parent, Rotate.L);
+						return new rebuildNode<K,V> (false, newNode);
+					} else {
+						newNode = rebuildfive (parent, Rotate.L);
+						return new rebuildNode<K,V> (false, newNode);
+					}
+				}
+			}
+		}
+		if (0 > (compare (parent.getKey (), ctr))) {
+			newNode = parent.createNode (parent.getKey (), parent.getValue (), parent.lefts (), this);
+			return new rebuildNode<K,V> (false, newNode);
+		} else {
+			newNode = parent.createNode (parent.getKey (), parent.getValue (), this, parent.rights ());
+			return new rebuildNode<K,V> (false, newNode);
+		}
+	}
+
+	protected TreeMapNode<K, V> rebuildTwo (TreeMapNode<K, V> parent, Comparer<K> ctr, Rotate side)
+	{ //  case2
+		if (side == Rotate.L) { //  rotate Left
+			TreeMapNode<K, V> node = parent.rights ();
+			TreeMapNode<K, V> leftSubTreeRoot = node.createNode (parent.getKey (), parent.getValue (), this, node.lefts ()); //  check
+			rebuildNode<K, V> rebuildNode = new rebuildNode<K,V> (false, leftSubTreeRoot);
+			rebuildNode<K, V> leftNodeRebuildNode = this.deleteBalance (rebuildNode.getNode (), ctr);
+			TreeMapNode<K, V> rightNode = node.rights ();
+			return parent.createNode (node.getKey (), node.getValue (), leftNodeRebuildNode.getNode (), rightNode);
+		} else {  //  rotate Right
+			TreeMapNode<K, V> node = parent.lefts ();
+			TreeMapNode<K, V> rightSubTreeRoot = node.createNode (parent.getKey (), parent.getValue (), node.rights (), this);
+			rebuildNode<K, V> rightSubTreeRebuildNode = new rebuildNode<K,V> (false, rightSubTreeRoot);
+			rebuildNode<K, V> rightNodeRebuildNode = this.deleteBalance (rightSubTreeRebuildNode.getNode (), ctr);
+			TreeMapNode<K, V> leftNode = node.lefts ();
+			return parent.createNode (node.getKey (), node.getValue (), leftNode, rightNodeRebuildNode.getNode ());
+		}
+	}
+
+	protected TreeMapNode<K, V> rebuildThree (TreeMapNode<K, V> parent, Rotate side)
+	{ //  case3 再帰
+		if (side == Rotate.L) {
+			TreeMapNode<K, V> rightNode;
+			if (parent.rights ().isNotEmpty ())
+				rightNode = new RedNode<K,V> (parent.rights ().getKey (), parent.rights ().getValue (), parent.rights ().lefts (), parent.rights ().rights ()); //  check
+			else
+				rightNode = new EmptyNode<K,V> ();
+			return parent.createNode (parent.getKey (), parent.getValue (), this, rightNode);
+		} else {
+			TreeMapNode<K, V> leftNode;
+			if (parent.lefts ().isNotEmpty ())
+				leftNode = new RedNode<K,V> (parent.lefts ().getKey (), parent.lefts ().getValue (), parent.lefts ().lefts (), parent.lefts ().rights ()); //  check
+			else
+				leftNode = new EmptyNode<K,V> ();
+			return parent.createNode (parent.getKey (), parent.getValue (), leftNode, this);
+		}
+	}
+
+	protected TreeMapNode<K, V> rebuildFour (TreeMapNode<K, V> parent, Rotate side)
+	{ // case 4
+		if (side == Rotate.R) {
+			TreeMapNode<K, V> leftNode = new RedNode<K,V> (parent.lefts ().getKey (), parent.lefts ().getValue (), parent.lefts ().lefts (), parent.lefts ().rights ());
+			return new BlackNode<K,V> (parent.getKey (), parent.getValue (), leftNode, this);
+		} else {
+			TreeMapNode<K, V> rightNode = new RedNode<K,V> (parent.rights ().getKey (), parent.rights ().getValue (), parent.rights ().lefts (), parent.rights ().rights ());
+			return new BlackNode<K,V> (parent.getKey (), parent.getValue (), this, rightNode);
+		}
+	}
+
+	protected TreeMapNode<K, V> rebuildfive (TreeMapNode<K, V> parent, Rotate side)
+	{ // case5
+		if (side == Rotate.R) { //  rotate Left
+			TreeMapNode<K, V> leftChild = new RedNode<K,V> (parent.lefts ().getKey (), parent.lefts ().getValue (), parent.lefts ().lefts (), parent.lefts ().rights ().lefts ());
+			TreeMapNode<K, V> rightChild = parent.lefts ().rights ().rights ();
+			TreeMapNode<K, V> leftSubTreeRoot = new BlackNode<K,V> (parent.lefts ().rights ().getKey (), parent.lefts ().rights ().getValue (), leftChild, rightChild);
+			TreeMapNode<K, V> newParent = parent.createNode (parent.getKey (), parent.getValue (), leftSubTreeRoot, this);
+			return this.rebuildsix (newParent, Rotate.R);
+		} else {  //  rotate Right 修正済み
+			TreeMapNode<K, V> leftChild = parent.rights ().lefts ().lefts ();
+			TreeMapNode<K, V> rightChild = new RedNode<K,V> (parent.rights ().getKey (), parent.rights ().getValue (), parent.rights ().lefts ().rights (), parent.rights ().rights ());
+			TreeMapNode<K, V> rightSubTreeRoot = new BlackNode<K,V> (parent.rights ().lefts ().getKey (), parent.rights ().lefts ().getValue (), leftChild, rightChild);
+			TreeMapNode<K, V> newParent = parent.createNode (parent.getKey (), parent.getValue (), this, rightSubTreeRoot);
+			return this.rebuildsix (newParent, Rotate.L);
+		}
+	}
+
+	protected TreeMapNode<K, V> rebuildsix (TreeMapNode<K, V> parent, Rotate side)
+	{ // case6
+		if (side == Rotate.L) { //  rotate Left
+			TreeMapNode<K, V> leftChild = parent.rights ().createNode (parent.getKey (), parent.getValue (), this, parent.rights ().lefts ()); // check
+			TreeMapNode<K, V> rightChild = new BlackNode<K,V> (parent.rights ().rights ().getKey (), parent.rights ().rights ().getValue (), parent.rights ().rights ().lefts (), parent.rights ().rights ().rights ());
+			return parent.createNode (parent.rights ().getKey (), parent.rights ().getValue (), leftChild, rightChild);
+		} else {  //  rotate Right
+			TreeMapNode<K, V> leftChild = new BlackNode<K,V> (parent.lefts ().lefts ().getKey (), parent.lefts ().lefts ().getValue (), parent.lefts ().lefts ().lefts (), parent.lefts ().lefts ().rights ());
+			TreeMapNode<K, V> rightChild = parent.lefts ().createNode (parent.getKey (), parent.getValue (), parent.lefts ().rights (), this);
+			return parent.createNode (parent.lefts ().getKey (), parent.lefts ().getValue (), leftChild, rightChild);
+		}
+	}
+
+
+
+
+
+
+
+
+	public abstract bool isNotEmpty ();
+
+	public abstract TreeMapNode<K,V> createNode (K key, V value, TreeMapNode<K,V> left, TreeMapNode<K,V> right);
+
+	public abstract TreeMapNode<K,V> insBalance ();
+
+
+	public abstract Rotate checkRotate (Rotate side);
+
+	public abstract bool isRed ();
+
+	public abstract rebuildNode<K,V> replaceNode (TreeMapNode<K,V> parent, Comparer<K> ctr);
+
+	public abstract rebuildNode<K,V> deleteNode ();
+
+	// test method
+	public abstract int checkDepth (int count, int minCount);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/data/treemap/TreeMapNode.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 99047788a46bd2047af1b3f9fe101ef5
+timeCreated: 1477164411
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/data/treemap/rebuildNode.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,25 @@
+using UnityEngine;
+using System.Collections;
+using System;
+
+public class rebuildNode<K,V> {
+	private bool rebuild;
+	TreeMapNode<K,V> node;
+
+	public rebuildNode(bool l,TreeMapNode<K,V> node){
+		this.rebuild = l;
+		this.node = node;
+	}
+	//don't same name.
+	public bool rebuilds(){
+		return rebuild;
+	}
+
+	public TreeMapNode<K,V> getNode(){
+		return node;
+	}
+
+	public bool notEmpty(){
+		return node != null;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/data/treemap/rebuildNode.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 1f42bbadfd1bcea45997a29dbdf2965e
+timeCreated: 1477164410
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: d8a045f73fb6d25438b37ab98657403b
+folderAsset: yes
+timeCreated: 1477164409
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/ChangeList.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,10 @@
+using UnityEngine;
+using System.Collections.Generic;
+
+namespace JungleDB {
+	public interface ChangeList : IEnumerable<TreeOperation> {
+		string uuids();
+		string getTreeName();
+		TreeOperationLog getLog();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/ChangeList.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 5fdae932150a74448bf775b479a33833
+timeCreated: 1477164411
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/ChangeListReader.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,7 @@
+
+namespace JungleDB {
+	public interface ChangeListReader{
+		ChangeListReader newReader();
+		ChangeList read();
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/ChangeListReader.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: c0cc64e8eb988ef40abca20c0fd04529
+timeCreated: 1477164412
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/ChangeListWriter.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,8 @@
+using UnityEngine;
+using System.Collections;
+
+namespace JungleDB {
+	public interface ChangeListWriter {
+		Result write (ChangeList operations);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/ChangeListWriter.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: ce5a2dd540e79be45ac570ebc3fcffc2
+timeCreated: 1477164412
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/Journal.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,7 @@
+
+namespace JungleDB {
+	public interface Journal {
+		ChangeListReader getReader();
+		ChangeListWriter getWriter();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/Journal.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 2f638429ccc96c643a757dab88ce1a3c
+timeCreated: 1477164410
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/NullJournal.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,37 @@
+using System.Collections.Generic;
+
+namespace JungleDB {
+	public class NullJournal : Journal {
+
+		private static NullChangeListWriter NULL_WRITER = new NullChangeListWriter();
+		private static NullChangeListReader NULL_READER = new NullChangeListReader();
+
+		public ChangeListReader getReader() {
+			return NULL_READER;
+		}
+
+		public ChangeListWriter getWriter() {
+			return NULL_WRITER;
+		}
+
+		private class NullChangeListWriter : ChangeListWriter{
+			public Result write(ChangeList operations){
+				return Result.SUCCESS;
+			}
+		}
+
+		private class NullChangeListReader : ChangeListReader { 
+			public ChangeListReader newReader() {
+				return this;
+			}
+
+			public ChangeList read() {
+				return null;
+			}
+
+			public IEnumerator<ChangeList> iterator() {
+				return null;
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/NullJournal.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 51e1e118fb016444e8e0626ebb4eecf4
+timeCreated: 1477164411
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/Result.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,19 @@
+
+public class Result {
+	public static Result ACCEPT = new Result("ACCEPT");
+	public static Result CONTINUE = new Result("CONTINUE");
+	public static Result BREAK = new Result("BREAK");
+	public static Result GOAL = new Result("GOAL");
+	public static Result SUCCESS = new Result ("SUCCESS");
+
+	private string name;
+
+	private Result(string _name) {
+		name = _name;
+	}
+
+	private string toString() {
+		return name;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/Result.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: b8fa38ddc1a944349b51a069813f11dc
+timeCreated: 1477164412
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/SingletonMessage.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,9 @@
+using UnityEngine;
+using System.Collections;
+
+public class SingletonMessage : MonoBehaviour {
+
+	public static MsgPack.ObjectPacker getInstance () {
+		return new MsgPack.ObjectPacker();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/SingletonMessage.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 2b823ee441970d84f91c778d32b1651a
+timeCreated: 1477164627
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: a2b4ae7b760328d43a20652173ed61b3
+folderAsset: yes
+timeCreated: 1477164443
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/.git/HEAD	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,1 @@
+ref: refs/heads/master
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/.git/config	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,13 @@
+[core]
+	repositoryformatversion = 0
+	filemode = false
+	bare = false
+	logallrefupdates = true
+	symlinks = false
+	ignorecase = true
+[remote "origin"]
+	url = https://github.com/masharada/msgpack-unity.git
+	fetch = +refs/heads/*:refs/remotes/origin/*
+[branch "master"]
+	remote = origin
+	merge = refs/heads/master
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/.git/description	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,1 @@
+Unnamed repository; edit this file 'description' to name the repository.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/.git/hooks/applypatch-msg.sample	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,15 @@
+#!/bin/sh
+#
+# An example hook script to check the commit log message taken by
+# applypatch from an e-mail message.
+#
+# The hook should exit with non-zero status after issuing an
+# appropriate message if it wants to stop the commit.  The hook is
+# allowed to edit the commit message file.
+#
+# To enable this hook, rename this file to "applypatch-msg".
+
+. git-sh-setup
+commitmsg="$(git rev-parse --git-path hooks/commit-msg)"
+test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"}
+:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/.git/hooks/commit-msg.sample	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,24 @@
+#!/bin/sh
+#
+# An example hook script to check the commit log message.
+# Called by "git commit" with one argument, the name of the file
+# that has the commit message.  The hook should exit with non-zero
+# status after issuing an appropriate message if it wants to stop the
+# commit.  The hook is allowed to edit the commit message file.
+#
+# To enable this hook, rename this file to "commit-msg".
+
+# Uncomment the below to add a Signed-off-by line to the message.
+# Doing this in a hook is a bad idea in general, but the prepare-commit-msg
+# hook is more suited to it.
+#
+# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
+# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
+
+# This example catches duplicate Signed-off-by lines.
+
+test "" = "$(grep '^Signed-off-by: ' "$1" |
+	 sort | uniq -c | sed -e '/^[ 	]*1[ 	]/d')" || {
+	echo >&2 Duplicate Signed-off-by lines.
+	exit 1
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/.git/hooks/post-update.sample	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,8 @@
+#!/bin/sh
+#
+# An example hook script to prepare a packed repository for use over
+# dumb transports.
+#
+# To enable this hook, rename this file to "post-update".
+
+exec git update-server-info
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/.git/hooks/pre-applypatch.sample	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,14 @@
+#!/bin/sh
+#
+# An example hook script to verify what is about to be committed
+# by applypatch from an e-mail message.
+#
+# The hook should exit with non-zero status after issuing an
+# appropriate message if it wants to stop the commit.
+#
+# To enable this hook, rename this file to "pre-applypatch".
+
+. git-sh-setup
+precommit="$(git rev-parse --git-path hooks/pre-commit)"
+test -x "$precommit" && exec "$precommit" ${1+"$@"}
+:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/.git/hooks/pre-commit.sample	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,49 @@
+#!/bin/sh
+#
+# An example hook script to verify what is about to be committed.
+# Called by "git commit" with no arguments.  The hook should
+# exit with non-zero status after issuing an appropriate message if
+# it wants to stop the commit.
+#
+# To enable this hook, rename this file to "pre-commit".
+
+if git rev-parse --verify HEAD >/dev/null 2>&1
+then
+	against=HEAD
+else
+	# Initial commit: diff against an empty tree object
+	against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
+fi
+
+# If you want to allow non-ASCII filenames set this variable to true.
+allownonascii=$(git config --bool hooks.allownonascii)
+
+# Redirect output to stderr.
+exec 1>&2
+
+# Cross platform projects tend to avoid non-ASCII filenames; prevent
+# them from being added to the repository. We exploit the fact that the
+# printable range starts at the space character and ends with tilde.
+if [ "$allownonascii" != "true" ] &&
+	# Note that the use of brackets around a tr range is ok here, (it's
+	# even required, for portability to Solaris 10's /usr/bin/tr), since
+	# the square bracket bytes happen to fall in the designated range.
+	test $(git diff --cached --name-only --diff-filter=A -z $against |
+	  LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
+then
+	cat <<\EOF
+Error: Attempt to add a non-ASCII file name.
+
+This can cause problems if you want to work with people on other platforms.
+
+To be portable it is advisable to rename the file.
+
+If you know what you are doing you can disable this check using:
+
+  git config hooks.allownonascii true
+EOF
+	exit 1
+fi
+
+# If there are whitespace errors, print the offending file names and fail.
+exec git diff-index --check --cached $against --
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/.git/hooks/pre-push.sample	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,53 @@
+#!/bin/sh
+
+# An example hook script to verify what is about to be pushed.  Called by "git
+# push" after it has checked the remote status, but before anything has been
+# pushed.  If this script exits with a non-zero status nothing will be pushed.
+#
+# This hook is called with the following parameters:
+#
+# $1 -- Name of the remote to which the push is being done
+# $2 -- URL to which the push is being done
+#
+# If pushing without using a named remote those arguments will be equal.
+#
+# Information about the commits which are being pushed is supplied as lines to
+# the standard input in the form:
+#
+#   <local ref> <local sha1> <remote ref> <remote sha1>
+#
+# This sample shows how to prevent push of commits where the log message starts
+# with "WIP" (work in progress).
+
+remote="$1"
+url="$2"
+
+z40=0000000000000000000000000000000000000000
+
+while read local_ref local_sha remote_ref remote_sha
+do
+	if [ "$local_sha" = $z40 ]
+	then
+		# Handle delete
+		:
+	else
+		if [ "$remote_sha" = $z40 ]
+		then
+			# New branch, examine all commits
+			range="$local_sha"
+		else
+			# Update to existing branch, examine new commits
+			range="$remote_sha..$local_sha"
+		fi
+
+		# Check for WIP commit
+		commit=`git rev-list -n 1 --grep '^WIP' "$range"`
+		if [ -n "$commit" ]
+		then
+			echo >&2 "Found WIP commit in $local_ref, not pushing"
+			exit 1
+		fi
+	fi
+done
+
+exit 0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/.git/hooks/pre-rebase.sample	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,169 @@
+#!/bin/sh
+#
+# Copyright (c) 2006, 2008 Junio C Hamano
+#
+# The "pre-rebase" hook is run just before "git rebase" starts doing
+# its job, and can prevent the command from running by exiting with
+# non-zero status.
+#
+# The hook is called with the following parameters:
+#
+# $1 -- the upstream the series was forked from.
+# $2 -- the branch being rebased (or empty when rebasing the current branch).
+#
+# This sample shows how to prevent topic branches that are already
+# merged to 'next' branch from getting rebased, because allowing it
+# would result in rebasing already published history.
+
+publish=next
+basebranch="$1"
+if test "$#" = 2
+then
+	topic="refs/heads/$2"
+else
+	topic=`git symbolic-ref HEAD` ||
+	exit 0 ;# we do not interrupt rebasing detached HEAD
+fi
+
+case "$topic" in
+refs/heads/??/*)
+	;;
+*)
+	exit 0 ;# we do not interrupt others.
+	;;
+esac
+
+# Now we are dealing with a topic branch being rebased
+# on top of master.  Is it OK to rebase it?
+
+# Does the topic really exist?
+git show-ref -q "$topic" || {
+	echo >&2 "No such branch $topic"
+	exit 1
+}
+
+# Is topic fully merged to master?
+not_in_master=`git rev-list --pretty=oneline ^master "$topic"`
+if test -z "$not_in_master"
+then
+	echo >&2 "$topic is fully merged to master; better remove it."
+	exit 1 ;# we could allow it, but there is no point.
+fi
+
+# Is topic ever merged to next?  If so you should not be rebasing it.
+only_next_1=`git rev-list ^master "^$topic" ${publish} | sort`
+only_next_2=`git rev-list ^master           ${publish} | sort`
+if test "$only_next_1" = "$only_next_2"
+then
+	not_in_topic=`git rev-list "^$topic" master`
+	if test -z "$not_in_topic"
+	then
+		echo >&2 "$topic is already up-to-date with master"
+		exit 1 ;# we could allow it, but there is no point.
+	else
+		exit 0
+	fi
+else
+	not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"`
+	/usr/bin/perl -e '
+		my $topic = $ARGV[0];
+		my $msg = "* $topic has commits already merged to public branch:\n";
+		my (%not_in_next) = map {
+			/^([0-9a-f]+) /;
+			($1 => 1);
+		} split(/\n/, $ARGV[1]);
+		for my $elem (map {
+				/^([0-9a-f]+) (.*)$/;
+				[$1 => $2];
+			} split(/\n/, $ARGV[2])) {
+			if (!exists $not_in_next{$elem->[0]}) {
+				if ($msg) {
+					print STDERR $msg;
+					undef $msg;
+				}
+				print STDERR " $elem->[1]\n";
+			}
+		}
+	' "$topic" "$not_in_next" "$not_in_master"
+	exit 1
+fi
+
+exit 0
+
+################################################################
+
+This sample hook safeguards topic branches that have been
+published from being rewound.
+
+The workflow assumed here is:
+
+ * Once a topic branch forks from "master", "master" is never
+   merged into it again (either directly or indirectly).
+
+ * Once a topic branch is fully cooked and merged into "master",
+   it is deleted.  If you need to build on top of it to correct
+   earlier mistakes, a new topic branch is created by forking at
+   the tip of the "master".  This is not strictly necessary, but
+   it makes it easier to keep your history simple.
+
+ * Whenever you need to test or publish your changes to topic
+   branches, merge them into "next" branch.
+
+The script, being an example, hardcodes the publish branch name
+to be "next", but it is trivial to make it configurable via
+$GIT_DIR/config mechanism.
+
+With this workflow, you would want to know:
+
+(1) ... if a topic branch has ever been merged to "next".  Young
+    topic branches can have stupid mistakes you would rather
+    clean up before publishing, and things that have not been
+    merged into other branches can be easily rebased without
+    affecting other people.  But once it is published, you would
+    not want to rewind it.
+
+(2) ... if a topic branch has been fully merged to "master".
+    Then you can delete it.  More importantly, you should not
+    build on top of it -- other people may already want to
+    change things related to the topic as patches against your
+    "master", so if you need further changes, it is better to
+    fork the topic (perhaps with the same name) afresh from the
+    tip of "master".
+
+Let's look at this example:
+
+		   o---o---o---o---o---o---o---o---o---o "next"
+		  /       /           /           /
+		 /   a---a---b A     /           /
+		/   /               /           /
+	       /   /   c---c---c---c B         /
+	      /   /   /             \         /
+	     /   /   /   b---b C     \       /
+	    /   /   /   /             \     /
+    ---o---o---o---o---o---o---o---o---o---o---o "master"
+
+
+A, B and C are topic branches.
+
+ * A has one fix since it was merged up to "next".
+
+ * B has finished.  It has been fully merged up to "master" and "next",
+   and is ready to be deleted.
+
+ * C has not merged to "next" at all.
+
+We would want to allow C to be rebased, refuse A, and encourage
+B to be deleted.
+
+To compute (1):
+
+	git rev-list ^master ^topic next
+	git rev-list ^master        next
+
+	if these match, topic has not merged in next at all.
+
+To compute (2):
+
+	git rev-list master..topic
+
+	if this is empty, it is fully merged to "master".
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/.git/hooks/prepare-commit-msg.sample	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,36 @@
+#!/bin/sh
+#
+# An example hook script to prepare the commit log message.
+# Called by "git commit" with the name of the file that has the
+# commit message, followed by the description of the commit
+# message's source.  The hook's purpose is to edit the commit
+# message file.  If the hook fails with a non-zero status,
+# the commit is aborted.
+#
+# To enable this hook, rename this file to "prepare-commit-msg".
+
+# This hook includes three examples.  The first comments out the
+# "Conflicts:" part of a merge commit.
+#
+# The second includes the output of "git diff --name-status -r"
+# into the message, just before the "git status" output.  It is
+# commented because it doesn't cope with --amend or with squashed
+# commits.
+#
+# The third example adds a Signed-off-by line to the message, that can
+# still be edited.  This is rarely a good idea.
+
+case "$2,$3" in
+  merge,)
+    /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;;
+
+# ,|template,)
+#   /usr/bin/perl -i.bak -pe '
+#      print "\n" . `git diff --cached --name-status -r`
+#	 if /^#/ && $first++ == 0' "$1" ;;
+
+  *) ;;
+esac
+
+# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
+# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/.git/hooks/update.sample	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,128 @@
+#!/bin/sh
+#
+# An example hook script to block unannotated tags from entering.
+# Called by "git receive-pack" with arguments: refname sha1-old sha1-new
+#
+# To enable this hook, rename this file to "update".
+#
+# Config
+# ------
+# hooks.allowunannotated
+#   This boolean sets whether unannotated tags will be allowed into the
+#   repository.  By default they won't be.
+# hooks.allowdeletetag
+#   This boolean sets whether deleting tags will be allowed in the
+#   repository.  By default they won't be.
+# hooks.allowmodifytag
+#   This boolean sets whether a tag may be modified after creation. By default
+#   it won't be.
+# hooks.allowdeletebranch
+#   This boolean sets whether deleting branches will be allowed in the
+#   repository.  By default they won't be.
+# hooks.denycreatebranch
+#   This boolean sets whether remotely creating branches will be denied
+#   in the repository.  By default this is allowed.
+#
+
+# --- Command line
+refname="$1"
+oldrev="$2"
+newrev="$3"
+
+# --- Safety check
+if [ -z "$GIT_DIR" ]; then
+	echo "Don't run this script from the command line." >&2
+	echo " (if you want, you could supply GIT_DIR then run" >&2
+	echo "  $0 <ref> <oldrev> <newrev>)" >&2
+	exit 1
+fi
+
+if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then
+	echo "usage: $0 <ref> <oldrev> <newrev>" >&2
+	exit 1
+fi
+
+# --- Config
+allowunannotated=$(git config --bool hooks.allowunannotated)
+allowdeletebranch=$(git config --bool hooks.allowdeletebranch)
+denycreatebranch=$(git config --bool hooks.denycreatebranch)
+allowdeletetag=$(git config --bool hooks.allowdeletetag)
+allowmodifytag=$(git config --bool hooks.allowmodifytag)
+
+# check for no description
+projectdesc=$(sed -e '1q' "$GIT_DIR/description")
+case "$projectdesc" in
+"Unnamed repository"* | "")
+	echo "*** Project description file hasn't been set" >&2
+	exit 1
+	;;
+esac
+
+# --- Check types
+# if $newrev is 0000...0000, it's a commit to delete a ref.
+zero="0000000000000000000000000000000000000000"
+if [ "$newrev" = "$zero" ]; then
+	newrev_type=delete
+else
+	newrev_type=$(git cat-file -t $newrev)
+fi
+
+case "$refname","$newrev_type" in
+	refs/tags/*,commit)
+		# un-annotated tag
+		short_refname=${refname##refs/tags/}
+		if [ "$allowunannotated" != "true" ]; then
+			echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2
+			echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2
+			exit 1
+		fi
+		;;
+	refs/tags/*,delete)
+		# delete tag
+		if [ "$allowdeletetag" != "true" ]; then
+			echo "*** Deleting a tag is not allowed in this repository" >&2
+			exit 1
+		fi
+		;;
+	refs/tags/*,tag)
+		# annotated tag
+		if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1
+		then
+			echo "*** Tag '$refname' already exists." >&2
+			echo "*** Modifying a tag is not allowed in this repository." >&2
+			exit 1
+		fi
+		;;
+	refs/heads/*,commit)
+		# branch
+		if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then
+			echo "*** Creating a branch is not allowed in this repository" >&2
+			exit 1
+		fi
+		;;
+	refs/heads/*,delete)
+		# delete branch
+		if [ "$allowdeletebranch" != "true" ]; then
+			echo "*** Deleting a branch is not allowed in this repository" >&2
+			exit 1
+		fi
+		;;
+	refs/remotes/*,commit)
+		# tracking branch
+		;;
+	refs/remotes/*,delete)
+		# delete tracking branch
+		if [ "$allowdeletebranch" != "true" ]; then
+			echo "*** Deleting a tracking branch is not allowed in this repository" >&2
+			exit 1
+		fi
+		;;
+	*)
+		# Anything else (is there anything else?)
+		echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2
+		exit 1
+		;;
+esac
+
+# --- Finished
+exit 0
Binary file Main/jungle-main/persistent/msgpack/.git/index has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/.git/info/exclude	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,6 @@
+# git ls-files --others --exclude-from=.git/info/exclude
+# Lines that start with '#' are comments.
+# For a project mostly in C, the following would be a good set of
+# exclude patterns (uncomment them if you want to use them):
+# *.[oa]
+# *~
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/.git/logs/HEAD	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,1 @@
+0000000000000000000000000000000000000000 e7c80cc200584b818c491a184cfc6f2b5f9e17a8 Kazuma Takeda <kazuma-arashi@hotmail.co.jp> 1477164441 +0900	clone: from https://github.com/masharada/msgpack-unity.git
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/.git/logs/refs/heads/master	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,1 @@
+0000000000000000000000000000000000000000 e7c80cc200584b818c491a184cfc6f2b5f9e17a8 Kazuma Takeda <kazuma-arashi@hotmail.co.jp> 1477164441 +0900	clone: from https://github.com/masharada/msgpack-unity.git
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/.git/logs/refs/remotes/origin/HEAD	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,1 @@
+0000000000000000000000000000000000000000 e7c80cc200584b818c491a184cfc6f2b5f9e17a8 Kazuma Takeda <kazuma-arashi@hotmail.co.jp> 1477164441 +0900	clone: from https://github.com/masharada/msgpack-unity.git
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/.git/objects/00/c8e51cd16ac10c74dd2f9974e6261ae72dfe4c	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,5 @@
+xSn05
+"촇[Ѓf.E8Bɓ^/a_8Iv-|QJ
+w~/`|bt~7g0Q3V,fP
5BX>]dh
+.B1ht[р*TCZXR,Hޖ*E[}*>xj	J(Ы@#
vu]k^
ntO.Nh-^ICrDIRBԠ
 ŜfʵN|V\-2LZgdRWuJtgBA?!pQ<"n	bΖ4&u3}p7zH~d4hJָ`EqS)ISy%r\@HhL-̘R!	n‹	y^e97níU))e=O-ZWƟUB^CZp/d۽Ez˦$Qi|}2|:#${||B6>G}
+<Z01(T0h?W,|vhUF&iMK0MVhv璉FP.l<891X^v'O޴77Oi
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/.git/objects/04/bd98d0918f4e21e0aa28f957af42639481ec72	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,2 @@
+xmTMs0_b ^C:L (ۋQ%W_ߕ0-޾qcfA֊DrN<(鎽`ǽp}{e-)r"j
wF,Aca)V/A~<oY-nOH*cH9N&LXcĔ3FJ%z Zn3Zi0B0T։<gB#7ci̭%g[zuePǪز
Dnu;zV(^;W$n_AIaCތA̤b¢̩`/ȡ1=ZɄ%O
+X2;#\Ng~\c-fh6hRT3q~;c$cy$pL1v?y(>UPɓ8,J5jѱ|DӻL'u~M6OV*\,%}P<
~WGI&"	*2C3Ìj#TV\-uSiqVMПon:߄qnxϣm`}:	:7̣'܆Nrn\J2)uTk[R"αLUL!XJ2>uDӎZ.yW/[t
\ No newline at end of file
Binary file Main/jungle-main/persistent/msgpack/.git/objects/05/4668352f9f1e28268bc74604ad4c73a3a24e74 has changed
Binary file Main/jungle-main/persistent/msgpack/.git/objects/18/17b354ce3301394fc5af5f8a2a17b690812ec1 has changed
Binary file Main/jungle-main/persistent/msgpack/.git/objects/1f/116ad7ca93823183d33d8223139c717df069c3 has changed
Binary file Main/jungle-main/persistent/msgpack/.git/objects/2d/f9bb3e0866da49532c79177f5a2febd5b8973e has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/.git/objects/30/6b516bef3bf54505433f44b53d4fc99311ecd6	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,1 @@
+xUR͎0<Ũ'JESmIQ'45
h+0.|ߏVpů?$JXj3Zn../G
q@Ț+RjUM 5X2!'X+/eOջ@1:Ai#`{n	"T3-=K8']zqf?hmInm̸d-Wyz-#w%җ-G@#*,EhhX yY5pzt%69}> yZ@V}Zd"<d<mU-,7M6>@?m,$/i
D&,>WPo[<읡\54+Y%؅N;OHaGN&X㥔*5{43})a{bݍ]Gjh=G75
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/.git/objects/34/d46e7bef952bd8fabb5f2847d7a283855b83fe	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,1 @@
+x}Sn06y^RIbT25ݦ	!产,=<m]UVs3_|ϯq1UQk,QLĚUr.8J(5 `J.Q$EuN[EJذP$a`)rXX`#T®N9C-#8i8*bntM'8='m˅k`YlNFsV2TYBf}0ji+\c$@43&3H!I;~&iߑ\%\
xRLa8$d2,i^-K@6%.Rt,Φ@.S4,C
jI@ԐG7akCaXכ)<GS?C6hh9Lu3rNC8Q).ya@EtfV;]'>4BG5G4Xx+iktӃ?
J0XyGk6zby$%KOC|iG-lyNo:6^ϧʼn~%GwNvWtϠnX6t	Mg_F8j:ԍK'/aLom?vVw_
\ No newline at end of file
Binary file Main/jungle-main/persistent/msgpack/.git/objects/46/d080685b602b8ccec7a343da7c62256c35ad0c has changed
Binary file Main/jungle-main/persistent/msgpack/.git/objects/50/bcb39015be539af4a654036cef49a5f08c0321 has changed
Binary file Main/jungle-main/persistent/msgpack/.git/objects/57/543770118822a5eb91efa7cac5037297df169d has changed
Binary file Main/jungle-main/persistent/msgpack/.git/objects/5e/618130994ffb0591f53545cf84a89f552df84f has changed
Binary file Main/jungle-main/persistent/msgpack/.git/objects/5e/cbb52610087bad1c48572c99c998a4928013d5 has changed
Binary file Main/jungle-main/persistent/msgpack/.git/objects/61/c2225fc4a2b7742c3b8d3ec6cb6f78aac73868 has changed
Binary file Main/jungle-main/persistent/msgpack/.git/objects/6c/4d4e0b98bd4200dea587f867232aaf94fb7efa has changed
Binary file Main/jungle-main/persistent/msgpack/.git/objects/79/4aff4f6de364bc022a7653c2cde3116f184e8f has changed
Binary file Main/jungle-main/persistent/msgpack/.git/objects/79/a31fc6b0d5d061f5151d9e1ada8e54346e2c98 has changed
Binary file Main/jungle-main/persistent/msgpack/.git/objects/8c/c971fe5e16554747f616b1f65e26103b5f71ec has changed
Binary file Main/jungle-main/persistent/msgpack/.git/objects/9a/c0ec3d0fb15a1b74cb749b1d25189f5bab7ff1 has changed
Binary file Main/jungle-main/persistent/msgpack/.git/objects/9c/6d483546704aaa1453f57ca14c6471830c91ac has changed
Binary file Main/jungle-main/persistent/msgpack/.git/objects/a7/c97a61698cdf1839fcdcd447b37ecdd4ffd88e has changed
Binary file Main/jungle-main/persistent/msgpack/.git/objects/ae/899d9608dcb968d6073329c2cd45a4b9b825de has changed
Binary file Main/jungle-main/persistent/msgpack/.git/objects/be/c4d4c4558d625539410a5b3a2e69f48ec48f48 has changed
Binary file Main/jungle-main/persistent/msgpack/.git/objects/d5/40b060aeccc5b4e1ab26aec45267e8ae7393c2 has changed
Binary file Main/jungle-main/persistent/msgpack/.git/objects/e7/c80cc200584b818c491a184cfc6f2b5f9e17a8 has changed
Binary file Main/jungle-main/persistent/msgpack/.git/objects/e9/8430e1f9a9d93e5971d6e65d0d70a771e6a070 has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/.git/packed-refs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,2 @@
+# pack-refs with: peeled fully-peeled 
+e7c80cc200584b818c491a184cfc6f2b5f9e17a8 refs/remotes/origin/master
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/.git/refs/heads/master	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,1 @@
+e7c80cc200584b818c491a184cfc6f2b5f9e17a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/.git/refs/remotes/origin/HEAD	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,1 @@
+ref: refs/remotes/origin/master
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/.gitignore	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,6 @@
+# Build Folders (you can keep bin if you'd like, to store dlls and pdbs)
+bin
+obj
+
+# mstest test results
+TestResults
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/README.md	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,34 @@
+# MessagePack for Unity
+
+## What is it?
+
+This is MessagePack serialization/deserialization for Unity (or Unity Pro.)
+
+This library is based on Kazuki's MessagePack for C#
+(not the current official for CLI, because it depends on .NET framework 4.0.) 
+
+## Install
+
+To install this, copy files in src to Assets folder in your project.
+
+## See also
+
+  Official Library           : https://github.com/msgpack/msgpack
+  
+  Original C# Implementation : https://github.com/kazuki/msgpack
+  
+## License
+
+    Copyright (C) 2011-2012 Kazuki Oikawa, Kazunari Kida
+    
+       Licensed under the Apache License, Version 2.0 (the "License");
+       you may not use this file except in compliance with the License.
+       You may obtain a copy of the License at
+    
+           http://www.apache.org/licenses/LICENSE-2.0
+    
+       Unless required by applicable law or agreed to in writing, software
+       distributed under the License is distributed on an "AS IS" BASIS,
+       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+       See the License for the specific language governing permissions and
+       limitations under the License.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/README.md.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: be78f1d6b69133e43a6590b77281770a
+timeCreated: 1477164443
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/src.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 14a09b08e67951c41a5fc0c8244e2605
+folderAsset: yes
+timeCreated: 1477164443
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/src/BoxingPacker.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,184 @@
+//
+// Copyright 2011 Kazuki Oikawa
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+using System.Reflection;
+
+namespace MsgPack
+{
+	public class BoxingPacker
+	{
+		static Type KeyValuePairDefinitionType;
+
+		static BoxingPacker ()
+		{
+			KeyValuePairDefinitionType = typeof (KeyValuePair<object,object>).GetGenericTypeDefinition ();
+		}
+
+		public void Pack (Stream strm, object o)
+		{
+			MsgPackWriter writer = new MsgPackWriter (strm);
+			Pack (writer, o);
+		}
+
+		public byte[] Pack (object o)
+		{
+			using (MemoryStream ms = new MemoryStream ()) {
+				Pack (ms, o);
+				return ms.ToArray ();
+			}
+		}
+
+		void Pack (MsgPackWriter writer, object o)
+		{
+			if (o == null) {
+				writer.WriteNil ();
+				return;
+			}
+
+			Type t = o.GetType ();
+			if (t.IsPrimitive) {
+				if (t.Equals (typeof (int))) writer.Write ((int)o);
+				else if (t.Equals (typeof (uint))) writer.Write ((uint)o);
+				else if (t.Equals (typeof (float))) writer.Write ((float)o);
+				else if (t.Equals (typeof (double))) writer.Write ((double)o);
+				else if (t.Equals (typeof (long))) writer.Write ((long)o);
+				else if (t.Equals (typeof (ulong))) writer.Write ((ulong)o);
+				else if (t.Equals (typeof (bool))) writer.Write ((bool)o);
+				else if (t.Equals (typeof (byte))) writer.Write ((byte)o);
+				else if (t.Equals (typeof (sbyte))) writer.Write ((sbyte)o);
+				else if (t.Equals (typeof (short))) writer.Write ((short)o);
+				else if (t.Equals (typeof (ushort))) writer.Write ((ushort)o);
+				else throw new NotSupportedException ();  // char?
+				return;
+			}
+
+			IDictionary dic = o as IDictionary;
+			if (dic != null) {
+				writer.WriteMapHeader (dic.Count);
+				foreach (System.Collections.DictionaryEntry e in dic) {
+					Pack (writer, e.Key);
+					Pack (writer, e.Value);
+				}
+				return;
+			}
+			
+			if (t.IsArray) {
+				Array ary = (Array)o;
+				Type et = t.GetElementType ();
+
+				// KeyValuePair<K,V>[] (Map Type)
+				if (et.IsGenericType && et.GetGenericTypeDefinition ().Equals (KeyValuePairDefinitionType)) {
+					PropertyInfo propKey = et.GetProperty ("Key");
+					PropertyInfo propValue = et.GetProperty ("Value");
+					writer.WriteMapHeader (ary.Length);
+					for (int i = 0; i < ary.Length; i ++) {
+						object e = ary.GetValue (i);
+						Pack (writer, propKey.GetValue (e, null));
+						Pack (writer, propValue.GetValue (e, null));
+					}
+					return;
+				}
+
+				// Array
+				writer.WriteArrayHeader (ary.Length);
+				for (int i = 0; i < ary.Length; i ++)
+					Pack (writer, ary.GetValue (i));
+				return;
+			}
+		}
+
+		public object Unpack (Stream strm)
+		{
+			MsgPackReader reader = new MsgPackReader (strm);
+			return Unpack (reader);
+		}
+
+		public object Unpack (byte[] buf, int offset, int size)
+		{
+			using (MemoryStream ms = new MemoryStream (buf, offset, size)) {
+				return Unpack (ms);
+			}
+		}
+
+		public object Unpack (byte[] buf)
+		{
+			return Unpack (buf, 0, buf.Length);
+		}
+
+		object Unpack (MsgPackReader reader)
+		{
+			if (!reader.Read ())
+				throw new FormatException ();
+
+			switch (reader.Type) {
+				case TypePrefixes.PositiveFixNum:
+				case TypePrefixes.NegativeFixNum:
+				case TypePrefixes.Int8:
+				case TypePrefixes.Int16:
+				case TypePrefixes.Int32:
+					return reader.ValueSigned;
+				case TypePrefixes.Int64:
+					return reader.ValueSigned64;
+				case TypePrefixes.UInt8:
+				case TypePrefixes.UInt16:
+				case TypePrefixes.UInt32:
+					return reader.ValueUnsigned;
+				case TypePrefixes.UInt64:
+					return reader.ValueUnsigned64;
+				case TypePrefixes.True:
+					return true;
+				case TypePrefixes.False:
+					return false;
+				case TypePrefixes.Float:
+					return reader.ValueFloat;
+				case TypePrefixes.Double:
+					return reader.ValueDouble;
+				case TypePrefixes.Nil:
+					return null;
+				case TypePrefixes.FixRaw:
+				case TypePrefixes.Raw16:
+				case TypePrefixes.Raw32:
+					byte[] raw = new byte[reader.Length];
+					reader.ReadValueRaw (raw, 0, raw.Length);
+					return raw;
+				case TypePrefixes.FixArray:
+				case TypePrefixes.Array16:
+				case TypePrefixes.Array32:
+					object[] ary = new object[reader.Length];
+					for (int i = 0; i < ary.Length; i ++)
+						ary[i] = Unpack (reader);
+					return ary;
+				case TypePrefixes.FixMap:
+				case TypePrefixes.Map16:
+				case TypePrefixes.Map32:
+					IDictionary<object, object> dic = new Dictionary<object, object> ((int)reader.Length);
+					int count = (int)reader.Length;
+					for (int i = 0; i < count; i ++) {
+						object k = Unpack (reader);
+						object v = Unpack (reader);
+						dic.Add (k, v);
+					}
+					return dic;
+				default:
+					throw new FormatException ();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/src/BoxingPacker.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: cf4df4e8511bc9048a391981ececa845
+timeCreated: 1477164444
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/src/CompiledPacker.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,549 @@
+//
+// Copyright 2011 Kazuki Oikawa
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Reflection;
+using System.Reflection.Emit;
+using System.Threading;
+using MsgPack.Compiler;
+
+namespace MsgPack
+{
+	public class CompiledPacker
+	{
+		static PackerBase _publicFieldPacker, _allFieldPacker;
+		PackerBase _packer;
+
+		static CompiledPacker ()
+		{
+			_publicFieldPacker = new MethodBuilderPacker ();
+			_allFieldPacker = new DynamicMethodPacker ();
+		}
+
+		public CompiledPacker () : this (false) {}
+		public CompiledPacker (bool packPrivateField)
+		{
+			_packer = (packPrivateField ? _allFieldPacker : _publicFieldPacker);
+		}
+
+		public void Prepare<T> ()
+		{
+			_packer.CreatePacker<T> ();
+			_packer.CreateUnpacker<T> ();
+		}
+
+		#region Generics Pack/Unpack Methods
+		public byte[] Pack<T> (T o)
+		{
+			using (MemoryStream ms = new MemoryStream ()) {
+				Pack<T> (ms, o);
+				return ms.ToArray ();
+			}
+		}
+
+		public void Pack<T> (Stream strm, T o)
+		{
+			_packer.CreatePacker<T> () (new MsgPackWriter (strm), o);
+		}
+
+		public T Unpack<T> (byte[] buf)
+		{
+			return Unpack<T> (buf, 0, buf.Length);
+		}
+
+		public T Unpack<T> (byte[] buf, int offset, int size)
+		{
+			using (MemoryStream ms = new MemoryStream (buf, offset, size)) {
+				return Unpack<T> (ms);
+			}
+		}
+
+		public T Unpack<T> (Stream strm)
+		{
+			return _packer.CreateUnpacker<T> () (new MsgPackReader (strm));
+		}
+		#endregion
+
+		#region Non-generics Pack/Unpack Methods
+		public byte[] Pack (object o)
+		{
+			using (MemoryStream ms = new MemoryStream ()) {
+				Pack (ms, o);
+				return ms.ToArray ();
+			}
+		}
+
+		public void Pack (Stream strm, object o)
+		{
+			throw new NotImplementedException ();
+		}
+
+		public object Unpack (Type t, byte[] buf)
+		{
+			return Unpack (t, buf, 0, buf.Length);
+		}
+
+		public object Unpack (Type t, byte[] buf, int offset, int size)
+		{
+			using (MemoryStream ms = new MemoryStream (buf, offset, size)) {
+				return Unpack (t, ms);
+			}
+		}
+
+		public object Unpack (Type t, Stream strm)
+		{
+			throw new NotImplementedException ();
+		}
+		#endregion
+
+		#region Compiled Packer Implementations
+		public abstract class PackerBase
+		{
+			Dictionary<Type, Delegate> _packers = new Dictionary<Type, Delegate> ();
+			Dictionary<Type, Delegate> _unpackers = new Dictionary<Type, Delegate> ();
+
+			protected Dictionary<Type, MethodInfo> _packMethods = new Dictionary<Type, MethodInfo> ();
+			protected Dictionary<Type, MethodInfo> _unpackMethods = new Dictionary<Type, MethodInfo> ();
+
+			protected PackerBase ()
+			{
+				DefaultPackMethods.Register (_packMethods, _unpackMethods);
+			}
+
+			public Action<MsgPackWriter, T> CreatePacker<T> ()
+			{
+				Delegate d;
+				lock (_packers) {
+					if (!_packers.TryGetValue (typeof (T), out d)) {
+						d = CreatePacker_Internal<T> ();
+						_packers.Add (typeof (T), d);
+					}
+				}
+				return (Action<MsgPackWriter, T>)d;
+			}
+
+			public Func<MsgPackReader, T> CreateUnpacker<T> ()
+			{
+				Delegate d;
+				lock (_unpackers) {
+					if (!_unpackers.TryGetValue (typeof (T), out d)) {
+						d = CreateUnpacker_Internal<T> ();
+						_unpackers.Add (typeof (T), d);
+					}
+				}
+				return (Func<MsgPackReader, T>)d;
+			}
+
+			protected abstract Action<MsgPackWriter, T> CreatePacker_Internal<T> ();
+			protected abstract Func<MsgPackReader, T> CreateUnpacker_Internal<T> ();
+		}
+		public sealed class DynamicMethodPacker : PackerBase
+		{
+			 private static MethodInfo LookupMemberMappingMethod;
+			static Dictionary<Type, IDictionary<string, int>> UnpackMemberMappings;
+
+			static DynamicMethodPacker ()
+			{
+				UnpackMemberMappings = new Dictionary<Type, IDictionary<string, int>> ();
+				LookupMemberMappingMethod = typeof (DynamicMethodPacker).GetMethod ("LookupMemberMapping", BindingFlags.Static | BindingFlags.NonPublic);
+			}
+
+			public DynamicMethodPacker () : base ()
+			{
+			}
+
+			protected override Action<MsgPackWriter, T> CreatePacker_Internal<T> ()
+			{
+				DynamicMethod dm = CreatePacker (typeof (T), CreatePackDynamicMethod (typeof (T)));
+				return (Action<MsgPackWriter, T>)dm.CreateDelegate (typeof (Action<MsgPackWriter, T>));
+			}
+
+			protected override Func<MsgPackReader, T> CreateUnpacker_Internal<T> ()
+			{
+				DynamicMethod dm = CreateUnpacker (typeof (T), CreateUnpackDynamicMethod (typeof (T)));
+				return (Func<MsgPackReader, T>)dm.CreateDelegate (typeof (Func<MsgPackReader, T>));
+			}
+
+			DynamicMethod CreatePacker (Type t, DynamicMethod dm)
+			{
+				ILGenerator il = dm.GetILGenerator ();
+				_packMethods.Add (t, dm);
+				PackILGenerator.EmitPackCode (t, dm, il, LookupMembers, FormatMemberName, LookupPackMethod);
+				return dm;
+			}
+
+			DynamicMethod CreateUnpacker (Type t, DynamicMethod dm)
+			{
+				ILGenerator il = dm.GetILGenerator ();
+				_unpackMethods.Add (t, dm);
+				PackILGenerator.EmitUnpackCode (t, dm, il, LookupMembers, FormatMemberName, LookupUnpackMethod,
+					LookupMemberMapping, LookupMemberMappingMethod);
+				return dm;
+			}
+
+			static DynamicMethod CreatePackDynamicMethod (Type t)
+			{
+				return CreateDynamicMethod (typeof (void), new Type[] {typeof (MsgPackWriter), t});
+			}
+
+			static DynamicMethod CreateUnpackDynamicMethod (Type t)
+			{
+				return CreateDynamicMethod (t, new Type[] {typeof (MsgPackReader)});
+			}
+
+			static MemberInfo[] LookupMembers (Type t)
+			{
+				BindingFlags baseFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
+				System.Collections.Generic.List<MemberInfo> list = new System.Collections.Generic.List<MemberInfo> ();
+				list.AddRange (t.GetFields (baseFlags));
+				// TODO: Add NonSerialized Attribute Filter ?
+				return list.ToArray ();
+			}
+
+			MethodInfo LookupPackMethod (Type t)
+			{
+				MethodInfo mi;
+				DynamicMethod dm;
+				if (_packMethods.TryGetValue (t, out mi))
+					return mi;
+				dm = CreatePackDynamicMethod (t);
+				return CreatePacker (t, dm);
+			}
+
+			MethodInfo LookupUnpackMethod (Type t)
+			{
+				MethodInfo mi;
+				if (_unpackMethods.TryGetValue (t, out mi))
+					return mi;
+				DynamicMethod dm = CreateUnpackDynamicMethod (t);
+				return CreateUnpacker (t, dm);
+			}
+
+			static string FormatMemberName (MemberInfo m)
+			{
+				if (m.MemberType != MemberTypes.Field)
+					return m.Name;
+
+				int pos;
+				string name = m.Name;
+				if (name[0] == '<' && (pos = name.IndexOf ('>')) > 1)
+					name = name.Substring (1, pos - 1); // Auto-Property (\<.+\>) <ab>
+				return name;
+			}
+
+			static int _dynamicMethodIdx = 0;
+			static DynamicMethod CreateDynamicMethod (Type returnType, Type[] parameterTypes)
+			{
+				string name = "_" + Interlocked.Increment (ref _dynamicMethodIdx).ToString ();
+				return new DynamicMethod (name, returnType, parameterTypes, true);
+			}
+
+			internal static IDictionary<string,int> LookupMemberMapping (Type t)
+			{
+				IDictionary<string, int> mapping;
+				lock (UnpackMemberMappings) {
+					if (!UnpackMemberMappings.TryGetValue (t, out mapping)) {
+						mapping = new Dictionary<string, int> ();
+						UnpackMemberMappings.Add (t, mapping);
+					}
+				}
+				return mapping;
+			}
+		}
+		public sealed class MethodBuilderPacker : PackerBase
+		{
+			public const string AssemblyName = "MessagePackInternalAssembly";
+			static AssemblyName DynamicAsmName;
+			static AssemblyBuilder DynamicAsmBuilder;
+			static ModuleBuilder DynamicModuleBuilder;
+
+			private static MethodInfo LookupMemberMappingMethod;
+			static Dictionary<Type, IDictionary<string, int>> UnpackMemberMappings;
+
+			static MethodBuilderPacker ()
+			{
+				UnpackMemberMappings = new Dictionary<Type, IDictionary<string, int>> ();
+				LookupMemberMappingMethod = typeof (MethodBuilderPacker).GetMethod ("LookupMemberMapping", BindingFlags.Static | BindingFlags.NonPublic);
+
+				DynamicAsmName = new AssemblyName (AssemblyName);
+				DynamicAsmBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly (DynamicAsmName, AssemblyBuilderAccess.Run);
+				DynamicModuleBuilder = DynamicAsmBuilder.DefineDynamicModule (DynamicAsmName.Name);
+			}
+
+			public MethodBuilderPacker () : base ()
+			{
+			}
+
+			protected override Action<MsgPackWriter, T> CreatePacker_Internal<T> ()
+			{
+				TypeBuilder tb;
+				MethodBuilder mb;
+				CreatePackMethodBuilder (typeof (T), out tb, out mb);
+				_packMethods.Add (typeof (T), mb);
+				CreatePacker (typeof (T), mb);
+				MethodInfo mi = ToCallableMethodInfo (typeof (T), tb, true);
+				return (Action<MsgPackWriter, T>)Delegate.CreateDelegate (typeof (Action<MsgPackWriter, T>), mi);
+			}
+
+			protected override Func<MsgPackReader, T> CreateUnpacker_Internal<T> ()
+			{
+				TypeBuilder tb;
+				MethodBuilder mb;
+				CreateUnpackMethodBuilder (typeof (T), out tb, out mb);
+				_unpackMethods.Add (typeof (T), mb);
+				CreateUnpacker (typeof (T), mb);
+				MethodInfo mi = ToCallableMethodInfo (typeof (T), tb, false);
+				return (Func<MsgPackReader, T>)Delegate.CreateDelegate (typeof (Func<MsgPackReader, T>), mi);
+			}
+
+			void CreatePacker (Type t, MethodBuilder mb)
+			{
+				ILGenerator il = mb.GetILGenerator ();
+				PackILGenerator.EmitPackCode (t, mb, il, LookupMembers, FormatMemberName, LookupPackMethod);
+			}
+
+			void CreateUnpacker (Type t, MethodBuilder mb)
+			{
+				ILGenerator il = mb.GetILGenerator ();
+				PackILGenerator.EmitUnpackCode (t, mb, il, LookupMembers, FormatMemberName, LookupUnpackMethod,
+					LookupMemberMapping, LookupMemberMappingMethod);
+			}
+
+			MethodInfo ToCallableMethodInfo (Type t, TypeBuilder tb, bool isPacker)
+			{
+				Type type = tb.CreateType ();
+				MethodInfo mi = type.GetMethod (isPacker ? "Pack" : "Unpack", BindingFlags.Static | BindingFlags.Public);
+				if (isPacker) {
+					_packMethods[t] = mi;
+				} else {
+					_unpackMethods[t] = mi;
+				}
+				return mi;
+			}
+
+			MethodInfo LookupPackMethod (Type t)
+			{
+				MethodInfo mi;
+				TypeBuilder tb;
+				MethodBuilder mb;
+				if (_packMethods.TryGetValue (t, out mi))
+					return mi;
+				CreatePackMethodBuilder (t, out tb, out mb);
+				_packMethods.Add (t, mb);
+				CreatePacker (t, mb);
+				return ToCallableMethodInfo (t, tb, true);
+			}
+
+			MethodInfo LookupUnpackMethod (Type t)
+			{
+				MethodInfo mi;
+				TypeBuilder tb;
+				MethodBuilder mb;
+				if (_unpackMethods.TryGetValue (t, out mi))
+					return mi;
+				CreateUnpackMethodBuilder (t, out tb, out mb);
+				_unpackMethods.Add (t, mb);
+				CreateUnpacker (t, mb);
+				return ToCallableMethodInfo (t, tb, false);
+			}
+
+			static string FormatMemberName (MemberInfo m)
+			{
+				return m.Name;
+			}
+
+			static MemberInfo[] LookupMembers (Type t)
+			{
+				BindingFlags baseFlags = BindingFlags.Instance | BindingFlags.Public;
+				System.Collections.Generic.List<MemberInfo> list = new System.Collections.Generic.List<MemberInfo> ();
+				list.AddRange (t.GetFields (baseFlags));
+				// TODO: Add NonSerialized Attribute Filter ?
+				return list.ToArray ();
+			}
+
+			static void CreatePackMethodBuilder (Type t, out TypeBuilder tb, out MethodBuilder mb)
+			{
+				tb = DynamicModuleBuilder.DefineType (t.Name + "PackerType", TypeAttributes.Public);
+				mb = tb.DefineMethod ("Pack", MethodAttributes.Static | MethodAttributes.Public, typeof (void), new Type[] {typeof (MsgPackWriter), t});
+			}
+
+			static void CreateUnpackMethodBuilder (Type t, out TypeBuilder tb, out MethodBuilder mb)
+			{
+				tb = DynamicModuleBuilder.DefineType (t.Name + "UnpackerType", TypeAttributes.Public);
+				mb = tb.DefineMethod ("Unpack", MethodAttributes.Static | MethodAttributes.Public, t, new Type[] {typeof (MsgPackReader)});
+			}
+
+			internal static IDictionary<string,int> LookupMemberMapping (Type t)
+			{
+				IDictionary<string, int> mapping;
+				lock (UnpackMemberMappings) {
+					if (!UnpackMemberMappings.TryGetValue (t, out mapping)) {
+						mapping = new Dictionary<string, int> ();
+						UnpackMemberMappings.Add (t, mapping);
+					}
+				}
+				return mapping;
+			}
+		}
+		#endregion
+
+		#region default pack/unpack methods
+		internal static class DefaultPackMethods
+		{
+			public static void Register (Dictionary<Type, MethodInfo> packMethods, Dictionary<Type, MethodInfo> unpackMethods)
+			{
+				RegisterPackMethods (packMethods);
+				RegisterUnpackMethods (unpackMethods);
+			}
+
+			#region Pack
+			static void RegisterPackMethods (Dictionary<Type, MethodInfo> packMethods)
+			{
+				Type type = typeof (DefaultPackMethods);
+				MethodInfo[] methods = type.GetMethods (BindingFlags.Static | BindingFlags.NonPublic);
+				string methodName = "Pack";
+				for (int i = 0; i < methods.Length; i ++) {
+					if (!methodName.Equals (methods[i].Name))
+						continue;
+					ParameterInfo[] parameters = methods[i].GetParameters ();
+					if (parameters.Length != 2 || parameters[0].ParameterType != typeof (MsgPackWriter))
+						continue;
+					packMethods.Add (parameters[1].ParameterType, methods[i]);
+				}
+			}
+
+			internal static void Pack (MsgPackWriter writer, string x)
+			{
+				if (x == null) {
+					writer.WriteNil ();
+				} else {
+					writer.Write (x, false);
+				}
+			}
+			#endregion
+
+			#region Unpack
+			static void RegisterUnpackMethods (Dictionary<Type, MethodInfo> unpackMethods)
+			{
+				BindingFlags flags = BindingFlags.Static | BindingFlags.NonPublic;
+				Type type = typeof (DefaultPackMethods);
+				MethodInfo mi = type.GetMethod ("Unpack_Signed", flags);
+				unpackMethods.Add (typeof (sbyte), mi);
+				unpackMethods.Add (typeof (short), mi);
+				unpackMethods.Add (typeof (int), mi);
+
+				mi = type.GetMethod ("Unpack_Signed64", flags);
+				unpackMethods.Add (typeof (long), mi);
+
+				mi = type.GetMethod ("Unpack_Unsigned", flags);
+				unpackMethods.Add (typeof (byte), mi);
+				unpackMethods.Add (typeof (ushort), mi);
+				unpackMethods.Add (typeof (char), mi);
+				unpackMethods.Add (typeof (uint), mi);
+
+				mi = type.GetMethod ("Unpack_Unsigned64", flags);
+				unpackMethods.Add (typeof (ulong), mi);
+
+				mi = type.GetMethod ("Unpack_Boolean", flags);
+				unpackMethods.Add (typeof (bool), mi);
+
+				mi = type.GetMethod ("Unpack_Float", flags);
+				unpackMethods.Add (typeof (float), mi);
+
+				mi = type.GetMethod ("Unpack_Double", flags);
+				unpackMethods.Add (typeof (double), mi);
+
+				mi = type.GetMethod ("Unpack_String", flags);
+				unpackMethods.Add (typeof (string), mi);
+			}
+
+			internal static int Unpack_Signed (MsgPackReader reader)
+			{
+				if (!reader.Read () || !reader.IsSigned ())
+					UnpackFailed ();
+				return reader.ValueSigned;
+			}
+
+			internal static long Unpack_Signed64 (MsgPackReader reader)
+			{
+				if (!reader.Read ())
+					UnpackFailed ();
+				if (reader.IsSigned ())
+					return reader.ValueSigned;
+				if (reader.IsSigned64 ())
+					return reader.ValueSigned64;
+				UnpackFailed ();
+				return 0; // unused
+			}
+
+			internal static uint Unpack_Unsigned (MsgPackReader reader)
+			{
+				if (!reader.Read () || !reader.IsUnsigned ())
+					UnpackFailed ();
+				return reader.ValueUnsigned;
+			}
+
+			internal static ulong Unpack_Unsigned64 (MsgPackReader reader)
+			{
+				if (!reader.Read ())
+					UnpackFailed ();
+				if (reader.IsUnsigned ())
+					return reader.ValueUnsigned;
+				if (reader.IsUnsigned64 ())
+					return reader.ValueUnsigned64;
+				UnpackFailed ();
+				return 0; // unused
+			}
+
+			internal static bool Unpack_Boolean (MsgPackReader reader)
+			{
+				if (!reader.Read () || !reader.IsBoolean ())
+					UnpackFailed ();
+				return reader.ValueBoolean;
+			}
+
+			internal static float Unpack_Float (MsgPackReader reader)
+			{
+				if (!reader.Read () || reader.Type != TypePrefixes.Float)
+					UnpackFailed ();
+				return reader.ValueFloat;
+			}
+
+			internal static double Unpack_Double (MsgPackReader reader)
+			{
+				if (!reader.Read () || reader.Type != TypePrefixes.Double)
+					UnpackFailed ();
+				return reader.ValueDouble;
+			}
+
+			internal static string Unpack_String (MsgPackReader reader)
+			{
+				if (!reader.Read () || !reader.IsRaw ())
+					UnpackFailed ();
+				return reader.ReadRawString ();
+			}
+
+			internal static void UnpackFailed ()
+			{
+				throw new FormatException ();
+			}
+			#endregion
+		}
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/src/CompiledPacker.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 8faab5bc2c44e434ca26679316f75cdb
+timeCreated: 1477164444
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/src/Compiler.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 6ac6bb9d43df8d64fa50aaa3b8ce1ce5
+folderAsset: yes
+timeCreated: 1477164443
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/src/Compiler/EmitExtensions.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,191 @@
+//
+// Copyright 2011 Kazuki Oikawa
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+using System;
+using System.Reflection;
+using System.Reflection.Emit;
+
+namespace MsgPack.Compiler
+{
+	public static class EmitExtensions
+	{
+		public static void EmitLd (this ILGenerator il, Variable v)
+		{
+			switch (v.VarType) {
+				case VariableType.Arg:
+					EmitLdarg (il, v);
+					break;
+				case VariableType.Local:
+					EmitLdloc (il, v);
+					break;
+				default:
+					throw new ArgumentException ();
+			}
+		}
+
+		public static void EmitLd (this ILGenerator il, params Variable[] list)
+		{
+			for (int i = 0; i < list.Length; i ++)
+				EmitLd (il, list[i]);
+		}
+
+		public static void EmitLdarg (this ILGenerator il, Variable v)
+		{
+			if (v.VarType != VariableType.Arg)
+				throw new ArgumentException ();
+
+			switch (v.Index) {
+				case 0: il.Emit (OpCodes.Ldarg_0); return;
+				case 1: il.Emit (OpCodes.Ldarg_1); return;
+				case 2: il.Emit (OpCodes.Ldarg_2); return;
+				case 3: il.Emit (OpCodes.Ldarg_3); return;
+			}
+			if (v.Index <= byte.MaxValue) {
+				il.Emit (OpCodes.Ldarg_S, (byte)v.Index);
+			} else if (v.Index <= short.MaxValue) {
+				il.Emit (OpCodes.Ldarg, v.Index);
+			} else {
+				throw new FormatException ();
+			}
+		}
+
+		public static void EmitLdloc (this ILGenerator il, Variable v)
+		{
+			if (v.VarType != VariableType.Local)
+				throw new ArgumentException ();
+
+			switch (v.Index) {
+				case 0: il.Emit (OpCodes.Ldloc_0); return;
+				case 1: il.Emit (OpCodes.Ldloc_1); return;
+				case 2: il.Emit (OpCodes.Ldloc_2); return;
+				case 3: il.Emit (OpCodes.Ldloc_3); return;
+			}
+			if (v.Index <= byte.MaxValue) {
+				il.Emit (OpCodes.Ldloc_S, (byte)v.Index);
+			} else if (v.Index <= short.MaxValue) {
+				il.Emit (OpCodes.Ldloc, v.Index);
+			} else {
+				throw new FormatException ();
+			}
+		}
+
+		public static void EmitSt (this ILGenerator il, Variable v)
+		{
+			switch (v.VarType) {
+				case VariableType.Arg:
+					EmitStarg (il, v);
+					break;
+				case VariableType.Local:
+					EmitStloc (il, v);
+					break;
+				default:
+					throw new ArgumentException ();
+			}
+		}
+
+		public static void EmitStarg (this ILGenerator il, Variable v)
+		{
+			if (v.VarType != VariableType.Arg)
+				throw new ArgumentException ();
+
+			if (v.Index <= byte.MaxValue) {
+				il.Emit (OpCodes.Starg_S, (byte)v.Index);
+			} else if (v.Index <= short.MaxValue) {
+				il.Emit (OpCodes.Starg, v.Index);
+			} else {
+				throw new FormatException ();
+			}
+		}
+
+		public static void EmitStloc (this ILGenerator il, Variable v)
+		{
+			if (v.VarType != VariableType.Local)
+				throw new ArgumentException ();
+
+			switch (v.Index) {
+				case 0: il.Emit (OpCodes.Stloc_0); return;
+				case 1: il.Emit (OpCodes.Stloc_1); return;
+				case 2: il.Emit (OpCodes.Stloc_2); return;
+				case 3: il.Emit (OpCodes.Stloc_3); return;
+			}
+			if (v.Index <= byte.MaxValue) {
+				il.Emit (OpCodes.Stloc_S, (byte)v.Index);
+			} else if (v.Index <= short.MaxValue) {
+				il.Emit (OpCodes.Stloc, v.Index);
+			} else {
+				throw new FormatException ();
+			}
+		}
+
+		public static void EmitLdc (this ILGenerator il, int v)
+		{
+			switch (v) {
+				case 0: il.Emit (OpCodes.Ldc_I4_0); return;
+				case 1: il.Emit (OpCodes.Ldc_I4_1); return;
+				case 2: il.Emit (OpCodes.Ldc_I4_2); return;
+				case 3: il.Emit (OpCodes.Ldc_I4_3); return;
+				case 4: il.Emit (OpCodes.Ldc_I4_4); return;
+				case 5: il.Emit (OpCodes.Ldc_I4_5); return;
+				case 6: il.Emit (OpCodes.Ldc_I4_6); return;
+				case 7: il.Emit (OpCodes.Ldc_I4_7); return;
+				case 8: il.Emit (OpCodes.Ldc_I4_8); return;
+				case -1: il.Emit (OpCodes.Ldc_I4_M1); return;
+			}
+			if (v <= sbyte.MaxValue && v >= sbyte.MinValue) {
+				il.Emit (OpCodes.Ldc_I4_S, (sbyte)v);
+			} else {
+				il.Emit (OpCodes.Ldc_I4, v);
+			}
+		}
+
+		public static void EmitLd_False (this ILGenerator il)
+		{
+			il.Emit (OpCodes.Ldc_I4_1);
+		}
+
+		public static void EmitLd_True (this ILGenerator il)
+		{
+			il.Emit (OpCodes.Ldc_I4_1);
+		}
+
+		public static void EmitLdstr (this ILGenerator il, string v)
+		{
+			il.Emit (OpCodes.Ldstr, v);
+		}
+
+		public static void EmitLdMember (this ILGenerator il, MemberInfo m)
+		{
+			if (m.MemberType == MemberTypes.Field) {
+				il.Emit (OpCodes.Ldfld, (FieldInfo)m);
+			} else if (m.MemberType == MemberTypes.Property) {
+				il.Emit (OpCodes.Callvirt, ((PropertyInfo)m).GetGetMethod (true));
+			} else {
+				throw new ArgumentException ();
+			}
+		}
+
+		public static void EmitStMember (this ILGenerator il, MemberInfo m)
+		{
+			if (m.MemberType == MemberTypes.Field) {
+				il.Emit (OpCodes.Stfld, (FieldInfo)m);
+			} else if (m.MemberType == MemberTypes.Property) {
+				il.Emit (OpCodes.Callvirt, ((PropertyInfo)m).GetSetMethod (true));
+			} else {
+				throw new ArgumentException ();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/src/Compiler/EmitExtensions.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 25568e12b4722ff418067d5e16eb81ba
+timeCreated: 1477164444
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/src/Compiler/PackILGenerator.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,386 @@
+//
+// Copyright 2011 Kazuki Oikawa
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using System.Reflection.Emit;
+using System.Runtime.Serialization;
+
+namespace MsgPack.Compiler
+{
+	static class PackILGenerator
+	{
+		#region Pack IL Generator
+		public static void EmitPackCode (Type type, MethodInfo mi, ILGenerator il,
+			Func<Type,MemberInfo[]> targetMemberSelector,
+			Func<MemberInfo,string> memberNameFormatter,
+			Func<Type, MethodInfo> lookupPackMethod)
+		{
+			if (type.IsPrimitive || type.IsInterface)
+				throw new NotSupportedException ();
+
+			Variable arg_writer = Variable.CreateArg (0);
+			Variable arg_obj = Variable.CreateArg (1);
+			Variable local_i = Variable.CreateLocal (il.DeclareLocal (typeof (int)));
+
+			if (!type.IsValueType) { // null check
+				Label notNullLabel = il.DefineLabel ();
+				il.EmitLd (arg_obj);
+				il.Emit (OpCodes.Brtrue_S, notNullLabel);
+				il.EmitLd (arg_writer);
+				il.Emit (OpCodes.Call, typeof(MsgPackWriter).GetMethod("WriteNil", new Type[0]));
+				il.Emit (OpCodes.Ret);
+				il.MarkLabel (notNullLabel);
+			}
+
+			if (type.IsArray) {
+				EmitPackArrayCode (mi, il, type, arg_writer, arg_obj, local_i, lookupPackMethod);
+				goto FinallyProcess;
+			}
+
+			// MsgPackWriter.WriteMapHeader
+			MemberInfo[] members = targetMemberSelector (type);
+			il.EmitLd (arg_writer);
+			il.EmitLdc (members.Length);
+			il.Emit (OpCodes.Callvirt, typeof (MsgPackWriter).GetMethod("WriteMapHeader", new Type[]{typeof (int)}));
+
+			for (int i = 0; i < members.Length; i ++) {
+				MemberInfo m = members[i];
+				Type mt = m.GetMemberType ();
+
+				// write field-name
+				il.EmitLd (arg_writer);
+				il.EmitLdstr (memberNameFormatter (m));
+				il.EmitLd_True ();
+				il.Emit (OpCodes.Call, typeof (MsgPackWriter).GetMethod("Write", new Type[]{typeof (string), typeof (bool)}));
+
+				// write value
+				EmitPackMemberValueCode (mt, il, arg_writer, arg_obj, m, null, type, mi, lookupPackMethod);
+			}
+
+FinallyProcess:
+      il.Emit (OpCodes.Ret);
+		}
+
+		static void EmitPackArrayCode (MethodInfo mi, ILGenerator il, Type t, Variable var_writer, Variable var_obj, Variable var_loop, Func<Type, MethodInfo> lookupPackMethod)
+		{
+			Type et = t.GetElementType ();
+			il.EmitLd (var_writer, var_obj);
+			il.Emit (OpCodes.Ldlen);
+			il.Emit (OpCodes.Call, typeof(MsgPackWriter).GetMethod("WriteArrayHeader", new Type[]{ typeof(int) }));
+
+			Label beginLabel = il.DefineLabel ();
+			Label exprLabel = il.DefineLabel ();
+
+			// for-loop: init loop counter
+			il.EmitLdc (0);
+			il.EmitSt (var_loop);
+
+			// jump
+			il.Emit (OpCodes.Br_S, exprLabel);
+
+			// mark begin-label
+			il.MarkLabel (beginLabel);
+
+			// write element
+			EmitPackMemberValueCode (et, il, var_writer, var_obj, null, var_loop, t, mi, lookupPackMethod);
+
+			// increment loop-counter
+			il.EmitLd (var_loop);
+			il.Emit (OpCodes.Ldc_I4_1);
+			il.Emit (OpCodes.Add);
+			il.EmitSt (var_loop);
+
+			// mark expression label
+			il.MarkLabel (exprLabel);
+
+			// expression
+			il.EmitLd (var_loop, var_obj);
+			il.Emit (OpCodes.Ldlen);
+			il.Emit (OpCodes.Blt_S, beginLabel);
+		}
+
+		/// <param name="m">(optional)</param>
+		/// <param name="elementIdx">(optional)</param>
+		static void EmitPackMemberValueCode (Type type, ILGenerator il, Variable var_writer, Variable var_obj,
+			MemberInfo m, Variable elementIdx, Type currentType, MethodInfo currentMethod, Func<Type, MethodInfo> lookupPackMethod)
+		{
+			MethodInfo mi;
+			il.EmitLd (var_writer, var_obj);
+			if (m != null)
+				il.EmitLdMember (m);
+			if (elementIdx != null) {
+				il.EmitLd (elementIdx);
+				il.Emit (OpCodes.Ldelem, type);
+			}
+			if (type.IsPrimitive) {
+				mi = typeof(MsgPackWriter).GetMethod("Write", new Type[]{type});
+			} else {
+				if (currentType == type) {
+					mi = currentMethod;
+				} else {
+					mi = lookupPackMethod (type);
+				}
+			}
+			il.Emit (OpCodes.Call, mi);
+		}
+		#endregion
+
+		#region Unpack IL Generator
+		public static void EmitUnpackCode (Type type, MethodInfo mi, ILGenerator il,
+			Func<Type,MemberInfo[]> targetMemberSelector,
+			Func<MemberInfo,string> memberNameFormatter,
+			Func<Type, MethodInfo> lookupUnpackMethod,
+			Func<Type, IDictionary<string,int>> lookupMemberMapping,
+			MethodInfo lookupMemberMappingMethod)
+		{
+			if (type.IsArray) {
+				EmitUnpackArrayCode (type, mi, il, targetMemberSelector, memberNameFormatter, lookupUnpackMethod);
+			} else {
+				EmitUnpackMapCode (type, mi, il, targetMemberSelector, memberNameFormatter, lookupUnpackMethod, lookupMemberMapping, lookupMemberMappingMethod);
+			}
+		}
+
+		static void EmitUnpackMapCode (Type type, MethodInfo mi, ILGenerator il,
+			Func<Type,MemberInfo[]> targetMemberSelector,
+			Func<MemberInfo,string> memberNameFormatter,
+			Func<Type, MethodInfo> lookupUnpackMethod,
+			Func<Type, IDictionary<string,int>> lookupMemberMapping,
+			MethodInfo lookupMemberMappingMethod)
+		{
+			MethodInfo failedMethod = typeof (PackILGenerator).GetMethod ("UnpackFailed", BindingFlags.Static | BindingFlags.NonPublic);
+			MemberInfo[] members = targetMemberSelector (type);
+			IDictionary<string, int> member_mapping = lookupMemberMapping (type);
+			for (int i = 0; i < members.Length; i ++)
+				member_mapping.Add (memberNameFormatter (members[i]), i);
+
+			Variable msgpackReader = Variable.CreateArg (0);
+			Variable obj = Variable.CreateLocal (il.DeclareLocal (type));
+			Variable num_of_fields = Variable.CreateLocal (il.DeclareLocal (typeof (int)));
+			Variable loop_idx = Variable.CreateLocal (il.DeclareLocal (typeof (int)));
+			Variable mapping = Variable.CreateLocal (il.DeclareLocal (typeof (IDictionary<string, int>)));
+			Variable switch_idx = Variable.CreateLocal (il.DeclareLocal (typeof (int)));
+			Variable var_type = Variable.CreateLocal (il.DeclareLocal (typeof (Type)));
+
+			// if (!MsgPackReader.Read()) UnpackFailed ();
+			// if (MsgPackReader.Type == TypePrefixes.Nil) return null;
+			// if (!MsgPackReader.IsMap ()) UnpackFailed ();
+			EmitUnpackReadAndTypeCheckCode (il, msgpackReader, typeof (MsgPackReader).GetMethod ("IsMap"), failedMethod, true);
+			
+			// type = typeof (T)
+			il.Emit (OpCodes.Ldtoken, type);
+			il.Emit (OpCodes.Call, typeof(Type).GetMethod ("GetTypeFromHandle"));
+			il.EmitSt (var_type);
+
+			// mapping = LookupMemberMapping (typeof (T))
+			il.EmitLd (var_type);
+			il.Emit (OpCodes.Call, lookupMemberMappingMethod);
+			il.EmitSt (mapping);
+
+			// object o = FormatterServices.GetUninitializedObject (Type);
+			il.EmitLd (var_type);
+			il.Emit (OpCodes.Call, typeof (FormatterServices).GetMethod ("GetUninitializedObject"));
+			il.Emit (OpCodes.Castclass, type);
+			il.EmitSt (obj);
+
+			// num_of_fields = (int)reader.Length
+			il.EmitLd (msgpackReader);
+			il.Emit (OpCodes.Call, typeof (MsgPackReader).GetProperty ("Length").GetGetMethod ());
+			il.EmitSt (num_of_fields);
+
+			// Loop labels
+			Label lblLoopStart = il.DefineLabel ();
+			Label lblLoopExpr = il.DefineLabel ();
+			
+			// i = 0;
+			il.EmitLdc (0);
+			il.EmitSt (loop_idx);
+			il.Emit (OpCodes.Br, lblLoopExpr);
+			il.MarkLabel (lblLoopStart);
+
+			/* process */
+			// if (!MsgPackReader.Read() || !MsgPackReader.IsRaw()) UnpackFailed();
+			EmitUnpackReadAndTypeCheckCode (il, msgpackReader, typeof (MsgPackReader).GetMethod ("IsRaw"), failedMethod, false);
+
+			// MsgPackReader.ReadRawString ()
+			// if (!Dictionary.TryGetValue (,)) UnpackFailed();
+			Label lbl3 = il.DefineLabel ();
+			il.EmitLd (mapping);
+			il.EmitLd (msgpackReader);
+			il.Emit (OpCodes.Call, typeof (MsgPackReader).GetMethod ("ReadRawString", new Type[0]));
+			il.Emit (OpCodes.Ldloca_S, (byte)switch_idx.Index);
+			il.Emit (OpCodes.Callvirt, typeof (IDictionary<string,int>).GetMethod ("TryGetValue"));
+			il.Emit (OpCodes.Brtrue, lbl3);
+			il.Emit (OpCodes.Call, failedMethod);
+			il.MarkLabel (lbl3);
+
+			// switch
+			Label[] switchCases = new Label[members.Length];
+			for (int i = 0; i < switchCases.Length; i ++)
+				switchCases[i] = il.DefineLabel ();
+			Label switchCaseEndLabel = il.DefineLabel ();
+			il.EmitLd (switch_idx);
+			il.Emit (OpCodes.Switch, switchCases);
+			il.Emit (OpCodes.Call, failedMethod);
+
+			for (int i = 0; i < switchCases.Length; i ++) {
+				il.MarkLabel (switchCases[i]);
+				MemberInfo minfo = members[i];
+				Type mt = minfo.GetMemberType ();
+				MethodInfo unpack_method = lookupUnpackMethod (mt);
+				il.EmitLd (obj);
+				il.EmitLd (msgpackReader);
+				il.Emit (OpCodes.Call, unpack_method);
+				il.EmitStMember (minfo);
+				il.Emit (OpCodes.Br, switchCaseEndLabel);
+			}
+			il.MarkLabel (switchCaseEndLabel);
+
+			// i ++
+			il.EmitLd (loop_idx);
+			il.EmitLdc (1);
+			il.Emit (OpCodes.Add);
+			il.EmitSt (loop_idx);
+
+			// i < num_of_fields;
+			il.MarkLabel (lblLoopExpr);
+			il.EmitLd (loop_idx);
+			il.EmitLd (num_of_fields);
+			il.Emit (OpCodes.Blt, lblLoopStart);
+			
+			// return
+			il.EmitLd (obj);
+			il.Emit (OpCodes.Ret);
+		}
+
+		static void EmitUnpackArrayCode (Type arrayType, MethodInfo mi, ILGenerator il,
+			Func<Type,MemberInfo[]> targetMemberSelector,
+			Func<MemberInfo,string> memberNameFormatter,
+			Func<Type, MethodInfo> lookupUnpackMethod)
+		{
+			Type elementType = arrayType.GetElementType ();
+			MethodInfo failedMethod = typeof (PackILGenerator).GetMethod ("UnpackFailed", BindingFlags.Static | BindingFlags.NonPublic);
+
+			Variable msgpackReader = Variable.CreateArg (0);
+			Variable obj = Variable.CreateLocal (il.DeclareLocal (arrayType));
+			Variable num_of_elements = Variable.CreateLocal (il.DeclareLocal (typeof (int)));
+			Variable loop_idx = Variable.CreateLocal (il.DeclareLocal (typeof (int)));
+			Variable type = Variable.CreateLocal (il.DeclareLocal (typeof (Type)));
+
+			// if (!MsgPackReader.Read() || !MsgPackReader.IsArray ()) UnpackFailed ();
+			EmitUnpackReadAndTypeCheckCode (il, msgpackReader, typeof (MsgPackReader).GetMethod ("IsArray"), failedMethod, true);
+
+			// type = typeof (T)
+			il.Emit (OpCodes.Ldtoken, elementType);
+			il.Emit (OpCodes.Call, typeof(Type).GetMethod ("GetTypeFromHandle"));
+			il.EmitSt (type);
+
+			// num_of_elements = (int)reader.Length
+			il.EmitLd (msgpackReader);
+			il.Emit (OpCodes.Call, typeof (MsgPackReader).GetProperty ("Length").GetGetMethod ());
+			il.EmitSt (num_of_elements);
+
+			// object o = Array.CreateInstance (Type, Length);
+			il.EmitLd (type);
+			il.EmitLd (num_of_elements);
+			il.Emit (OpCodes.Call, typeof (Array).GetMethod ("CreateInstance", new Type[] {typeof (Type), typeof (int)}));
+			il.Emit (OpCodes.Castclass, arrayType);
+			il.EmitSt (obj);
+
+			// Unpack element method
+			MethodInfo unpack_method = lookupUnpackMethod (elementType);
+
+			// Loop labels
+			Label lblLoopStart = il.DefineLabel ();
+			Label lblLoopExpr = il.DefineLabel ();
+			
+			// i = 0;
+			il.EmitLdc (0);
+			il.EmitSt (loop_idx);
+			il.Emit (OpCodes.Br, lblLoopExpr);
+			il.MarkLabel (lblLoopStart);
+
+			/* process */
+			il.EmitLd (obj, loop_idx);
+			il.EmitLd (msgpackReader);
+			il.Emit (OpCodes.Call, unpack_method);
+			il.Emit (OpCodes.Stelem, elementType);
+
+			// i ++
+			il.EmitLd (loop_idx);
+			il.EmitLdc (1);
+			il.Emit (OpCodes.Add);
+			il.EmitSt (loop_idx);
+
+			// i < num_of_fields;
+			il.MarkLabel (lblLoopExpr);
+			il.EmitLd (loop_idx);
+			il.EmitLd (num_of_elements);
+			il.Emit (OpCodes.Blt, lblLoopStart);
+			
+			// return
+			il.EmitLd (obj);
+			il.Emit (OpCodes.Ret);
+		}
+
+		static void EmitUnpackReadAndTypeCheckCode (ILGenerator il, Variable msgpackReader, MethodInfo typeCheckMethod, MethodInfo failedMethod, bool nullCheckAndReturn)
+		{
+			Label lblFailed = il.DefineLabel ();
+			Label lblNullReturn = nullCheckAndReturn ? il.DefineLabel () : default(Label);
+			Label lblPassed = il.DefineLabel ();
+			il.EmitLd (msgpackReader);
+			il.Emit (OpCodes.Call, typeof (MsgPackReader).GetMethod ("Read"));
+			il.Emit (OpCodes.Brfalse_S, lblFailed);
+			if (nullCheckAndReturn) {
+				il.EmitLd (msgpackReader);
+				il.Emit (OpCodes.Call, typeof (MsgPackReader).GetProperty ("Type").GetGetMethod ());
+				il.EmitLdc ((int)TypePrefixes.Nil);
+				il.Emit (OpCodes.Beq_S, lblNullReturn);
+			}
+			il.EmitLd (msgpackReader);
+			il.Emit (OpCodes.Call, typeCheckMethod);
+			il.Emit (OpCodes.Brtrue_S, lblPassed);
+			il.Emit (OpCodes.Br, lblFailed);
+			if (nullCheckAndReturn) {
+				il.MarkLabel (lblNullReturn);
+				il.Emit (OpCodes.Ldnull);
+				il.Emit (OpCodes.Ret);
+			}
+			il.MarkLabel (lblFailed);
+			il.Emit (OpCodes.Call, failedMethod);
+			il.MarkLabel (lblPassed);
+		}
+		
+		/// <summary>Exception Helper</summary>
+		internal static void UnpackFailed ()
+		{
+			throw new FormatException ();
+		}
+		#endregion
+
+		#region Misc
+		static Type GetMemberType (this MemberInfo mi)
+		{
+			if (mi.MemberType == MemberTypes.Field)
+				return ((FieldInfo)mi).FieldType;
+			if (mi.MemberType == MemberTypes.Property)
+				return ((PropertyInfo)mi).PropertyType;
+			throw new ArgumentException ();
+		}
+		#endregion
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/src/Compiler/PackILGenerator.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: b04deedffaa18a04c8bf4295c96c5276
+timeCreated: 1477164444
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/src/Compiler/Variable.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,42 @@
+//
+// Copyright 2011 Kazuki Oikawa
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+using System.Reflection.Emit;
+
+namespace MsgPack.Compiler
+{
+	public class Variable
+	{
+		Variable (VariableType type, int index)
+		{
+			this.VarType = type;
+			this.Index = index;
+		}
+
+		public static Variable CreateLocal (LocalBuilder local)
+		{
+			return new Variable (VariableType.Local, local.LocalIndex);
+		}
+
+		public static Variable CreateArg (int idx)
+		{
+			return new Variable (VariableType.Arg, idx);
+		}
+
+		public VariableType VarType { get; set; }
+		public int Index { get; set; }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/src/Compiler/Variable.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: e16f8ce97a8740d4ba0d3ab03ec929fa
+timeCreated: 1477164444
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/src/Compiler/VariableType.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,24 @@
+//
+// Copyright 2011 Kazuki Oikawa
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+namespace MsgPack.Compiler
+{
+	public enum VariableType
+	{
+		Local,
+		Arg
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/src/Compiler/VariableType.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 046af49fc8c276b418aaae10632826b5
+timeCreated: 1477164443
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/src/MsgPackReader.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,258 @@
+//
+// Copyright 2011 Kazuki Oikawa
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+using System;
+using System.IO;
+using System.Text;
+
+namespace MsgPack
+{
+	public class MsgPackReader
+	{
+		Stream _strm;
+		byte[] _tmp0 = new byte[8];
+		byte[] _tmp1 = new byte[8];
+
+		Encoding _encoding = Encoding.UTF8;
+		//Decoder _decoder = Encoding.UTF8.GetDecoder ();
+		byte[] _buf = new byte[64];
+
+		public MsgPackReader (Stream strm)
+		{
+			_strm = strm;
+		}
+
+		public TypePrefixes Type { get; private set; }
+
+		public bool ValueBoolean { get; private set; }
+		public uint Length { get; private set; }
+
+		public uint ValueUnsigned { get; private set; }
+		public ulong ValueUnsigned64 { get; private set; }
+
+		public int ValueSigned { get; private set; }
+		public long ValueSigned64 { get; private set; }
+
+		public float ValueFloat { get; private set; }
+		public double ValueDouble { get; private set; }
+
+		public bool IsSigned ()
+		{
+			return this.Type == TypePrefixes.NegativeFixNum ||
+				this.Type == TypePrefixes.PositiveFixNum ||
+				this.Type == TypePrefixes.Int8 ||
+				this.Type == TypePrefixes.Int16 ||
+				this.Type == TypePrefixes.Int32;
+		}
+
+		public bool IsBoolean ()
+		{
+			return this.Type == TypePrefixes.True || this.Type == TypePrefixes.False;
+		}
+
+		public bool IsSigned64 ()
+		{
+			return this.Type == TypePrefixes.Int64;
+		}
+
+		public bool IsUnsigned ()
+		{
+			return this.Type == TypePrefixes.PositiveFixNum ||
+				this.Type == TypePrefixes.UInt8 ||
+				this.Type == TypePrefixes.UInt16 ||
+				this.Type == TypePrefixes.UInt32;
+		}
+
+		public bool IsUnsigned64 ()
+		{
+			return this.Type == TypePrefixes.UInt64;
+		}
+
+		public bool IsRaw ()
+		{
+			return this.Type == TypePrefixes.FixRaw || this.Type == TypePrefixes.Raw16 || this.Type == TypePrefixes.Raw32;
+		}
+
+		public bool IsArray ()
+		{
+			return this.Type == TypePrefixes.FixArray || this.Type == TypePrefixes.Array16 || this.Type == TypePrefixes.Array32;
+		}
+
+		public bool IsMap ()
+		{
+			return this.Type == TypePrefixes.FixMap || this.Type == TypePrefixes.Map16 || this.Type == TypePrefixes.Map32;
+		}
+
+		public bool Read ()
+		{
+			byte[] tmp0 = _tmp0, tmp1 = _tmp1;
+			int x = _strm.ReadByte ();
+			if (x < 0)
+				return false; // EOS
+			
+			if (x >= 0x00 && x <= 0x7f) {
+				this.Type = TypePrefixes.PositiveFixNum;
+			} else if (x >= 0xe0 && x <= 0xff) {
+				this.Type = TypePrefixes.NegativeFixNum;
+			} else if (x >= 0xa0 && x <= 0xbf) {
+				this.Type = TypePrefixes.FixRaw;
+			} else if (x >= 0x90 && x <= 0x9f) {
+				this.Type = TypePrefixes.FixArray;
+			} else if (x >= 0x80 && x <= 0x8f) {
+				this.Type = TypePrefixes.FixMap;
+			} else {
+				this.Type = (TypePrefixes)x;
+			}
+
+			switch (this.Type) {
+				case TypePrefixes.Nil:
+					break;
+				case TypePrefixes.False:
+					ValueBoolean = false;
+					break;
+				case TypePrefixes.True:
+					ValueBoolean = true;
+					break;
+				case TypePrefixes.Float:
+					_strm.Read (tmp0, 0, 4);
+					if (BitConverter.IsLittleEndian) {
+						tmp1[0] = tmp0[3];
+						tmp1[1] = tmp0[2];
+						tmp1[2] = tmp0[1];
+						tmp1[3] = tmp0[0];
+						ValueFloat = BitConverter.ToSingle (tmp1, 0);
+					} else {
+						ValueFloat = BitConverter.ToSingle (tmp0, 0);
+					}
+					break;
+				case TypePrefixes.Double:
+					_strm.Read (tmp0, 0, 8);
+					if (BitConverter.IsLittleEndian) {
+						tmp1[0] = tmp0[7];
+						tmp1[1] = tmp0[6];
+						tmp1[2] = tmp0[5];
+						tmp1[3] = tmp0[4];
+						tmp1[4] = tmp0[3];
+						tmp1[5] = tmp0[2];
+						tmp1[6] = tmp0[1];
+						tmp1[7] = tmp0[0];
+						ValueDouble = BitConverter.ToDouble (tmp1, 0);
+					} else {
+						ValueDouble = BitConverter.ToDouble (tmp0, 0);
+					}
+					break;
+				case TypePrefixes.NegativeFixNum:
+					ValueSigned = (x & 0x1f) - 0x20;
+					break;
+				case TypePrefixes.PositiveFixNum:
+					ValueSigned = x & 0x7f;
+					ValueUnsigned = (uint)ValueSigned;
+					break;
+				case TypePrefixes.UInt8:
+					x = _strm.ReadByte ();
+					if (x < 0)
+						throw new FormatException ();
+					ValueUnsigned = (uint)x;
+					break;
+				case TypePrefixes.UInt16:
+					if (_strm.Read (tmp0, 0, 2) != 2)
+						throw new FormatException ();
+					ValueUnsigned = ((uint)tmp0[0] << 8) | (uint)tmp0[1];
+					break;
+				case TypePrefixes.UInt32:
+					if (_strm.Read (tmp0, 0, 4) != 4)
+						throw new FormatException ();
+					ValueUnsigned = ((uint)tmp0[0] << 24) | ((uint)tmp0[1] << 16) | ((uint)tmp0[2] << 8) | (uint)tmp0[3];
+					break;
+				case TypePrefixes.UInt64:
+					if (_strm.Read (tmp0, 0, 8) != 8)
+						throw new FormatException ();
+					ValueUnsigned64 = ((ulong)tmp0[0] << 56) | ((ulong)tmp0[1] << 48) | ((ulong)tmp0[2] << 40) | ((ulong)tmp0[3] << 32) | ((ulong)tmp0[4] << 24) | ((ulong)tmp0[5] << 16) | ((ulong)tmp0[6] << 8) | (ulong)tmp0[7];
+					break;
+				case TypePrefixes.Int8:
+					x = _strm.ReadByte ();
+					if (x < 0)
+						throw new FormatException ();
+					ValueSigned = (sbyte)x;
+					break;
+				case TypePrefixes.Int16:
+					if (_strm.Read (tmp0, 0, 2) != 2)
+						throw new FormatException ();
+					ValueSigned = (short)((tmp0[0] << 8) | tmp0[1]);
+					break;
+				case TypePrefixes.Int32:
+					if (_strm.Read (tmp0, 0, 4) != 4)
+						throw new FormatException ();
+					ValueSigned = (tmp0[0] << 24) | (tmp0[1] << 16) | (tmp0[2] << 8) | tmp0[3];
+					break;
+				case TypePrefixes.Int64:
+					if (_strm.Read (tmp0, 0, 8) != 8)
+						throw new FormatException ();
+					ValueSigned64 = ((long)tmp0[0] << 56) | ((long)tmp0[1] << 48) | ((long)tmp0[2] << 40) | ((long)tmp0[3] << 32) | ((long)tmp0[4] << 24) | ((long)tmp0[5] << 16) | ((long)tmp0[6] << 8) | (long)tmp0[7];
+					break;
+				case TypePrefixes.FixRaw:
+					Length = (uint)(x & 0x1f);
+					break;
+				case TypePrefixes.FixArray:
+				case TypePrefixes.FixMap:
+					Length = (uint)(x & 0xf);
+					break;
+				case TypePrefixes.Raw16:
+				case TypePrefixes.Array16:
+				case TypePrefixes.Map16:
+					if (_strm.Read (tmp0, 0, 2) != 2)
+						throw new FormatException ();
+					Length = ((uint)tmp0[0] << 8) | (uint)tmp0[1];
+					break;
+				case TypePrefixes.Raw32:
+				case TypePrefixes.Array32:
+				case TypePrefixes.Map32:
+					if (_strm.Read (tmp0, 0, 4) != 4)
+						throw new FormatException ();
+					Length = ((uint)tmp0[0] << 24) | ((uint)tmp0[1] << 16) | ((uint)tmp0[2] << 8) | (uint)tmp0[3];
+					break;
+				default:
+					throw new FormatException ();
+			}
+			return true;
+		}
+
+		public int ReadValueRaw (byte[] buf, int offset, int count)
+		{
+			return _strm.Read (buf, offset, count);
+		}
+
+		public string ReadRawString ()
+		{
+			return ReadRawString (_buf);
+		}
+
+		public string ReadRawString (byte[] buf)
+		{
+			if (this.Length < buf.Length) {
+				if (ReadValueRaw (buf, 0, (int)this.Length) != this.Length)
+					throw new FormatException ();
+				return _encoding.GetString (buf, 0, (int)this.Length);
+			}
+
+			// Poor implementation
+			byte[] tmp = new byte[(int)this.Length];
+			if (ReadValueRaw (tmp, 0, tmp.Length) != tmp.Length)
+				throw new FormatException ();
+			return _encoding.GetString (tmp);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/src/MsgPackReader.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: ff57bb43a0eea9646b78dd44178c44f1
+timeCreated: 1477164444
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/src/MsgPackWriter.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,321 @@
+//
+// Copyright 2011 Kazuki Oikawa, Kazunari Kida
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+using System;
+using System.IO;
+using System.Text;
+
+namespace MsgPack
+{
+	public class MsgPackWriter
+	{
+		Stream _strm;
+		//Encoding _encoding = Encoding.UTF8;
+		Encoder _encoder = Encoding.UTF8.GetEncoder ();
+		byte[] _tmp = new byte[9];
+		byte[] _buf = new byte[64];
+
+		public MsgPackWriter (Stream strm)
+		{
+			_strm = strm;
+		}
+
+		public void Write (byte x)
+		{
+			if (x < 128) {
+				_strm.WriteByte (x);
+			} else {
+				byte[] tmp = _tmp;
+				tmp[0] = 0xcc; 
+				tmp[1] = x;
+				_strm.Write (tmp, 0, 2);
+			}
+		}
+
+		public void Write (ushort x)
+		{
+			if (x < 0x100) {
+				Write ((byte)x);
+			} else {
+				byte[] tmp = _tmp;
+				tmp[0] = 0xcd; 
+				tmp[1] = (byte)(x >> 8);
+				tmp[2] = (byte)x;
+				_strm.Write (tmp, 0, 3);
+			}
+		}
+
+		public void Write (char x)
+		{
+			Write ((ushort)x);
+		}
+
+		public void Write (uint x)
+		{
+			if (x < 0x10000) {
+				Write ((ushort)x);
+			} else {
+				byte[] tmp = _tmp;
+				tmp[0] = 0xce; 
+				tmp[1] = (byte)(x >> 24);
+				tmp[2] = (byte)(x >> 16);
+				tmp[3] = (byte)(x >>  8);
+				tmp[4] = (byte)x;
+				_strm.Write (tmp, 0, 5);
+			}
+		}
+
+		public void Write (ulong x)
+		{
+			if (x < 0x100000000) {
+				Write ((uint)x);
+			} else {
+				byte[] tmp = _tmp;
+				tmp[0] = 0xcf; 
+				tmp[1] = (byte)(x >> 56);
+				tmp[2] = (byte)(x >> 48);
+				tmp[3] = (byte)(x >> 40);
+				tmp[4] = (byte)(x >> 32);
+				tmp[5] = (byte)(x >> 24);
+				tmp[6] = (byte)(x >> 16);
+				tmp[7] = (byte)(x >>  8);
+				tmp[8] = (byte)x;
+				_strm.Write (tmp, 0, 9);
+			}
+		}
+
+		public void Write (sbyte x)
+		{
+			if (x >= -32 && x <= -1) {
+				_strm.WriteByte ((byte)(0xe0 | (byte)x));
+			} else if (x >= 0 && x <= 127) {
+				_strm.WriteByte ((byte)x);
+			} else {
+				byte[] tmp = _tmp;
+				tmp[0] = 0xd0;
+				tmp[1] = (byte)x;
+				_strm.Write (tmp, 0, 2);
+			}
+		}
+
+		public void Write (short x)
+		{
+			if (x >= sbyte.MinValue && x <= sbyte.MaxValue) {
+				Write ((sbyte)x);
+			} else {
+				byte[] tmp = _tmp;
+				tmp[0] = 0xd1;
+				tmp[1] = (byte)(x >> 8);
+				tmp[2] = (byte)x;
+				_strm.Write (tmp, 0, 3);
+			}
+		}
+
+		public void Write (int x)
+		{
+			if (x >= short.MinValue && x <= short.MaxValue) {
+				Write ((short)x);
+			} else {
+				byte[] tmp = _tmp;
+				tmp[0] = 0xd2;
+				tmp[1] = (byte)(x >> 24);
+				tmp[2] = (byte)(x >> 16);
+				tmp[3] = (byte)(x >> 8);
+				tmp[4] = (byte)x;
+				_strm.Write (tmp, 0, 5);
+			}
+		}
+
+		public void Write (long x)
+		{
+			if (x >= int.MinValue && x <= int.MaxValue) {
+				Write ((int)x);
+			} else {
+				byte[] tmp = _tmp;
+				tmp[0] = 0xd3;
+				tmp[1] = (byte)(x >> 56);
+				tmp[2] = (byte)(x >> 48);
+				tmp[3] = (byte)(x >> 40);
+				tmp[4] = (byte)(x >> 32);
+				tmp[5] = (byte)(x >> 24);
+				tmp[6] = (byte)(x >> 16);
+				tmp[7] = (byte)(x >> 8);
+				tmp[8] = (byte)x;
+				_strm.Write (tmp, 0, 9);
+			}
+		}
+
+		public void WriteNil ()
+		{
+			_strm.WriteByte (0xc0);
+		}
+
+		public void Write (bool x)
+		{
+			_strm.WriteByte ((byte)(x ? 0xc3 : 0xc2));
+		}
+
+		public void Write (float x)
+		{
+			byte[] raw = BitConverter.GetBytes (x); // unsafeコードを使う?
+			byte[] tmp = _tmp;
+
+			tmp[0] = 0xca;
+			if (BitConverter.IsLittleEndian) {
+				tmp[1] = raw[3];
+				tmp[2] = raw[2];
+				tmp[3] = raw[1];
+				tmp[4] = raw[0];
+			} else {
+				tmp[1] = raw[0];
+				tmp[2] = raw[1];
+				tmp[3] = raw[2];
+				tmp[4] = raw[3];
+			}
+			_strm.Write (tmp, 0, 5);
+		}
+
+		public void Write (double x)
+		{
+			byte[] raw = BitConverter.GetBytes (x); // unsafeコードを使う?
+			byte[] tmp = _tmp;
+
+			tmp[0] = 0xcb;
+			if (BitConverter.IsLittleEndian) {
+				tmp[1] = raw[7];
+				tmp[2] = raw[6];
+				tmp[3] = raw[5];
+				tmp[4] = raw[4];
+				tmp[5] = raw[3];
+				tmp[6] = raw[2];
+				tmp[7] = raw[1];
+				tmp[8] = raw[0];
+			} else {
+				tmp[1] = raw[0];
+				tmp[2] = raw[1];
+				tmp[3] = raw[2];
+				tmp[4] = raw[3];
+				tmp[5] = raw[4];
+				tmp[6] = raw[5];
+				tmp[7] = raw[6];
+				tmp[8] = raw[7];
+			}
+			_strm.Write (tmp, 0, 9);
+		}
+		
+		public void Write (byte[] bytes)
+		{
+			WriteRawHeader (bytes.Length);
+			_strm.Write (bytes, 0, bytes.Length);
+		}
+
+		public void WriteRawHeader (int N)
+		{
+			WriteLengthHeader (N, 32, 0xa0, 0xda, 0xdb);
+		}
+
+		public void WriteArrayHeader (int N)
+		{
+			WriteLengthHeader (N, 16, 0x90, 0xdc, 0xdd);
+		}
+
+		public void WriteMapHeader (int N)
+		{
+			WriteLengthHeader (N, 16, 0x80, 0xde, 0xdf);
+		}
+
+		void WriteLengthHeader (int N, int fix_length, byte fix_prefix, byte len16bit_prefix, byte len32bit_prefix)
+		{
+			if (N < fix_length) {
+				_strm.WriteByte ((byte)(fix_prefix | N));
+			} else {
+				byte[] tmp = _tmp;
+				int header_len;
+				if (N < 0x10000) {
+					tmp[0] = len16bit_prefix;
+					tmp[1] = (byte)(N >> 8);
+					tmp[2] = (byte)N;
+					header_len = 3;
+				} else {
+					tmp[0] = len32bit_prefix;
+					tmp[1] = (byte)(N >> 24);
+					tmp[2] = (byte)(N >> 16);
+					tmp[3] = (byte)(N >>  8);
+					tmp[4] = (byte)N;
+					header_len = 5;
+				}
+				_strm.Write (tmp, 0, header_len);
+			}
+		}
+
+		public void Write (string x)
+		{
+			Write (x, false);
+		}
+		
+		public void Write (string x, bool highProbAscii)
+		{
+			Write (x, _buf, highProbAscii);
+		}
+
+		public void Write (string x, byte[] buf)
+		{
+			Write (x, buf, false);
+		}
+
+		public void Write (string x, byte[] buf, bool highProbAscii)
+		{
+			Encoder encoder = _encoder;
+			//fixed (char *pstr = x)
+			//fixed (byte *pbuf = buf) {
+			char[] str = x.ToCharArray();
+				if (highProbAscii && x.Length <= buf.Length) {
+					bool isAsciiFullCompatible = true;
+					for (int i = 0; i < x.Length; i ++) { 
+						//int v = (int)pstr[i];
+						int v = (int)(x[i]);
+						if (v > 0x7f) {
+							isAsciiFullCompatible = false;
+							break;
+						}
+						buf[i] = (byte)v;
+					}
+					if (isAsciiFullCompatible) {
+						WriteRawHeader (x.Length);
+						_strm.Write (buf, 0, x.Length);
+						return;
+					}
+				}
+
+				//WriteRawHeader (encoder.GetByteCount (pstr, x.Length, true));
+				WriteRawHeader (encoder.GetByteCount (str, 0, x.Length, true));
+				int str_len = x.Length;
+				//char *p = pstr;
+				int convertedChars, bytesUsed;
+				bool completed = true;
+				int j = 0;
+				while (str_len > 0 || !completed) {
+					//encoder.Convert (p, str_len, pbuf, buf.Length, false, out convertedChars, out bytesUsed, out completed);
+					encoder.Convert (str, j, str_len, buf, 0, buf.Length, false, out convertedChars, out bytesUsed, out completed);
+					_strm.Write (buf, 0, bytesUsed);
+					str_len -= convertedChars;
+					//p += convertedChars;
+					j += convertedChars;
+				}
+			//}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/src/MsgPackWriter.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 10a1d40ab78473c4d9b6e3b60cb43452
+timeCreated: 1477164443
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/src/ObjectPacker.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,259 @@
+//
+// Copyright 2011 Kazuki Oikawa
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Reflection;
+using System.Runtime.Serialization;
+using System.Text;
+
+namespace MsgPack
+{
+	public class ObjectPacker
+	{
+		byte[] _buf = new byte[64];
+		//Encoding _encoding = Encoding.UTF8;
+		static Dictionary<Type, PackDelegate> PackerMapping;
+		static Dictionary<Type, UnpackDelegate> UnpackerMapping;
+
+		delegate void PackDelegate (ObjectPacker packer, MsgPackWriter writer, object o);
+		delegate object UnpackDelegate (ObjectPacker packer, MsgPackReader reader);
+
+		static ObjectPacker ()
+		{
+			PackerMapping = new Dictionary<Type, PackDelegate> ();
+			UnpackerMapping = new Dictionary<Type, UnpackDelegate> ();
+
+			PackerMapping.Add (typeof (string), StringPacker);
+			UnpackerMapping.Add (typeof (string), StringUnpacker);
+		}
+
+		public byte[] Pack (object o)
+		{
+			using (MemoryStream ms = new MemoryStream ()) {
+				Pack (ms, o);
+				return ms.ToArray ();
+			}
+		}
+
+		public void Pack (Stream strm, object o)
+		{
+			if (o != null && o.GetType ().IsPrimitive)
+				throw new NotSupportedException ();
+			MsgPackWriter writer = new MsgPackWriter (strm);
+			Pack (writer, o);
+		}
+
+		void Pack (MsgPackWriter writer, object o)
+		{
+			if (o == null) {
+				writer.WriteNil ();
+				return;
+			}
+
+			Type t = o.GetType ();
+			if (t.IsPrimitive) {
+				if (t.Equals (typeof (int))) writer.Write ((int)o);
+				else if (t.Equals (typeof (uint))) writer.Write ((uint)o);
+				else if (t.Equals (typeof (float))) writer.Write ((float)o);
+				else if (t.Equals (typeof (double))) writer.Write ((double)o);
+				else if (t.Equals (typeof (long))) writer.Write ((long)o);
+				else if (t.Equals (typeof (ulong))) writer.Write ((ulong)o);
+				else if (t.Equals (typeof (bool))) writer.Write ((bool)o);
+				else if (t.Equals (typeof (byte))) writer.Write ((byte)o);
+				else if (t.Equals (typeof (sbyte))) writer.Write ((sbyte)o);
+				else if (t.Equals (typeof (short))) writer.Write ((short)o);
+				else if (t.Equals (typeof (ushort))) writer.Write ((ushort)o);
+				else if (t.Equals (typeof (char))) writer.Write ((ushort)(char)o);
+				else throw new NotSupportedException ();
+				return;
+			}
+
+			PackDelegate packer;
+			if (PackerMapping.TryGetValue (t, out packer)) {
+				packer (this, writer, o);
+				return;
+			}
+
+			if (t.IsArray) {
+				Array ary = (Array)o;
+				writer.WriteArrayHeader (ary.Length);
+				for (int i = 0; i < ary.Length; i ++)
+					Pack (writer, ary.GetValue (i));
+				return;
+			}
+
+			ReflectionCacheEntry entry = ReflectionCache.Lookup (t);
+			writer.WriteMapHeader (entry.FieldMap.Count);
+			foreach (KeyValuePair<string, FieldInfo> pair in entry.FieldMap) {
+				writer.Write (pair.Key, _buf);
+				object v = pair.Value.GetValue (o);
+				if (pair.Value.FieldType.IsInterface && v != null) {
+					writer.WriteArrayHeader (2);
+					writer.Write (v.GetType().FullName);
+				}
+				Pack (writer, v);
+			}
+		}
+
+		public T Unpack<T> (byte[] buf)
+		{
+			return Unpack<T> (buf, 0, buf.Length);
+		}
+
+		public T Unpack<T> (byte[] buf, int offset, int size)
+		{
+			using (MemoryStream ms = new MemoryStream (buf, offset, size)) {
+				return Unpack<T> (ms);
+			}
+		}
+
+		public T Unpack<T> (Stream strm)
+		{
+			if (typeof (T).IsPrimitive)
+				throw new NotSupportedException ();
+			MsgPackReader reader = new MsgPackReader (strm);
+			return (T)Unpack (reader, typeof (T));
+		}
+
+		public object Unpack (Type type, byte[] buf)
+		{
+			return Unpack (type, buf, 0, buf.Length);
+		}
+
+		public object Unpack (Type type, byte[] buf, int offset, int size)
+		{
+			using (MemoryStream ms = new MemoryStream (buf, offset, size)) {
+				return Unpack (type, ms);
+			}
+		}
+
+		public object Unpack (Type type, Stream strm)
+		{
+			if (type.IsPrimitive)
+				throw new NotSupportedException ();
+			MsgPackReader reader = new MsgPackReader (strm);
+			return Unpack (reader, type);
+		}
+
+		object Unpack (MsgPackReader reader, Type t)
+		{
+			if (t.IsPrimitive) {
+				if (!reader.Read ()) throw new FormatException ();
+				if (t.Equals (typeof (int)) && reader.IsSigned ()) return reader.ValueSigned;
+				else if (t.Equals (typeof (uint)) && reader.IsUnsigned ()) return reader.ValueUnsigned;
+				else if (t.Equals (typeof (float)) && reader.Type == TypePrefixes.Float) return reader.ValueFloat;
+				else if (t.Equals (typeof (double)) && reader.Type == TypePrefixes.Double) return reader.ValueDouble;
+				else if (t.Equals (typeof (long))) {
+					if (reader.IsSigned64 ())
+						return reader.ValueSigned64;
+					if (reader.IsSigned ())
+						return (long)reader.ValueSigned;
+				} else if (t.Equals (typeof (ulong))) {
+					if (reader.IsUnsigned64 ())
+						return reader.ValueUnsigned64;
+					if (reader.IsUnsigned ())
+						return (ulong)reader.ValueUnsigned;
+				} else if (t.Equals (typeof (bool)) && reader.IsBoolean ()) return (reader.Type == TypePrefixes.True);
+				else if (t.Equals (typeof (byte)) && reader.IsUnsigned ()) return (byte)reader.ValueUnsigned;
+				else if (t.Equals (typeof (sbyte)) && reader.IsSigned ()) return (sbyte)reader.ValueSigned;
+				else if (t.Equals (typeof (short)) && reader.IsSigned ()) return (short)reader.ValueSigned;
+				else if (t.Equals (typeof (ushort)) && reader.IsUnsigned ()) return (ushort)reader.ValueUnsigned;
+				else if (t.Equals (typeof (char)) && reader.IsUnsigned ()) return (char)reader.ValueUnsigned;
+				else throw new NotSupportedException ();
+			}
+
+			UnpackDelegate unpacker;
+			if (UnpackerMapping.TryGetValue (t, out unpacker))
+				return unpacker (this, reader);
+
+			if (t.IsArray) {
+				if (!reader.Read () || (!reader.IsArray () && reader.Type != TypePrefixes.Nil))
+					throw new FormatException ();
+				if (reader.Type == TypePrefixes.Nil)
+					return null;
+				Type et = t.GetElementType ();
+				Array ary = Array.CreateInstance (et, (int)reader.Length);
+				for (int i = 0; i < ary.Length; i ++)
+					ary.SetValue (Unpack (reader, et), i);
+				return ary;
+			}
+
+			if (!reader.Read ())
+				throw new FormatException ();
+			if (reader.Type == TypePrefixes.Nil)
+					return null;
+			if (t.IsInterface) {
+				if (reader.Type != TypePrefixes.FixArray && reader.Length != 2)
+					throw new FormatException ();
+				if (!reader.Read () || !reader.IsRaw ())
+					throw new FormatException ();
+				CheckBufferSize ((int)reader.Length);
+				reader.ReadValueRaw (_buf, 0, (int)reader.Length);
+				t = Type.GetType (Encoding.UTF8.GetString (_buf, 0, (int)reader.Length));
+				if (!reader.Read () || reader.Type == TypePrefixes.Nil)
+					throw new FormatException ();
+			}
+			if (!reader.IsMap ())
+				throw new FormatException ();
+
+			object o = FormatterServices.GetUninitializedObject (t);
+			ReflectionCacheEntry entry = ReflectionCache.Lookup (t);
+			int members = (int)reader.Length;
+			for (int i = 0; i < members; i ++) {
+				if (!reader.Read () || !reader.IsRaw ())
+					throw new FormatException ();
+				CheckBufferSize ((int)reader.Length);
+				reader.ReadValueRaw (_buf, 0, (int)reader.Length);
+				string name = Encoding.UTF8.GetString (_buf, 0, (int)reader.Length);
+				FieldInfo f;
+				if (!entry.FieldMap.TryGetValue (name, out f))
+					throw new FormatException ();
+				f.SetValue (o, Unpack (reader, f.FieldType));
+			}
+
+			IDeserializationCallback callback = o as IDeserializationCallback;
+			if (callback != null)
+				callback.OnDeserialization (this);
+			return o;
+		}
+
+		void CheckBufferSize (int size)
+		{
+			if (_buf.Length < size)
+				Array.Resize<byte> (ref _buf, size);
+		}
+
+		static void StringPacker (ObjectPacker packer, MsgPackWriter writer, object o)
+		{
+			writer.Write (Encoding.UTF8.GetBytes ((string)o));
+		}
+
+		static object StringUnpacker (ObjectPacker packer, MsgPackReader reader)
+		{
+			if (!reader.Read ())
+				throw new FormatException ();
+			if (reader.Type == TypePrefixes.Nil)
+				return null;
+			if (!reader.IsRaw ())
+				throw new FormatException ();
+			packer.CheckBufferSize ((int)reader.Length);
+			reader.ReadValueRaw (packer._buf, 0, (int)reader.Length);
+			return Encoding.UTF8.GetString (packer._buf, 0, (int)reader.Length);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/src/ObjectPacker.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 12c727b7b1a5e7e4aa80713e6890f40a
+timeCreated: 1477164443
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/src/ReflectionCache.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,60 @@
+//
+// Copyright 2011 Kazuki Oikawa
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+using System;
+using System.Collections.Generic;
+
+namespace MsgPack
+{
+	public static class ReflectionCache
+	{
+		static Dictionary<Type, ReflectionCacheEntry> _cache;
+
+		static ReflectionCache ()
+		{
+			_cache = new Dictionary<Type,ReflectionCacheEntry> ();
+		}
+
+		public static ReflectionCacheEntry Lookup (Type type)
+		{
+			ReflectionCacheEntry entry;
+			lock (_cache) {
+				if (_cache.TryGetValue (type, out entry))
+					return entry;
+			}
+
+			entry = new ReflectionCacheEntry (type);
+			lock (_cache) {
+				_cache[type] = entry;
+			}
+			return entry;
+		}
+
+		public static void RemoveCache (Type type)
+		{
+			lock (_cache) {
+				_cache.Remove (type);
+			}
+		}
+
+		public static void Clear ()
+		{
+			lock (_cache) {
+				_cache.Clear ();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/src/ReflectionCache.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 02b548ab17290e4438e9930601dfcd48
+timeCreated: 1477164443
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/src/ReflectionCacheEntry.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,44 @@
+//
+// Copyright 2011 Kazuki Oikawa
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+
+namespace MsgPack
+{
+	public class ReflectionCacheEntry
+	{
+		const BindingFlags FieldBindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField | BindingFlags.SetField;
+		
+		public ReflectionCacheEntry (Type t)
+		{
+			FieldInfo[] fields = t.GetFields (FieldBindingFlags);
+			IDictionary<string, FieldInfo> map = new Dictionary<string, FieldInfo> (fields.Length);
+			for (int i = 0; i < fields.Length; i ++) {
+				FieldInfo f = fields[i];
+				string name = f.Name;
+				int pos;
+				if (name[0] == '<' && (pos = name.IndexOf ('>')) > 1)
+					name = name.Substring (1, pos - 1); // Auto-Property (\<.+\>) <ab>
+				map[name] = f;
+			}
+			FieldMap = map;
+		}
+
+		public IDictionary<string, FieldInfo> FieldMap { get; private set; }
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/src/ReflectionCacheEntry.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 168d5114c2615144d8a139ad0baf07d7
+timeCreated: 1477164443
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/src/TypePrefixes.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,48 @@
+//
+// Copyright 2011 Kazuki Oikawa
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+namespace MsgPack
+{
+	public enum TypePrefixes : byte
+	{
+		PositiveFixNum = 0x00, // 0x00 - 0x7f
+		NegativeFixNum = 0xe0, // 0xe0 - 0xff
+
+		Nil = 0xc0,
+		False = 0xc2,
+		True = 0xc3,
+		Float = 0xca,
+		Double = 0xcb,
+		UInt8 = 0xcc,
+		UInt16 = 0xcd,
+		UInt32 = 0xce,
+		UInt64 = 0xcf,
+		Int8 = 0xd0,
+		Int16 = 0xd1,
+		Int32 = 0xd2,
+		Int64 = 0xd3,
+		Raw16 = 0xda,
+		Raw32 = 0xdb,
+		Array16 = 0xdc,
+		Array32 = 0xdd,
+		Map16 = 0xde,
+		Map32 = 0xdf,
+
+		FixRaw = 0xa0,   // 0xa0 - 0xbf
+		FixArray = 0x90, // 0x90 - 0x9f
+		FixMap = 0x80,   // 0x80 - 0x8f
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/persistent/msgpack/src/TypePrefixes.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: a842a9b0e71f967429ef3fbcedabae00
+timeCreated: 1477164444
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 2390aa4f0c28ee04ca94b1dce62da178
+folderAsset: yes
+timeCreated: 1477164409
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/Command.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,8 @@
+public enum Command{
+	APPEND_CHILD,
+	DELETE_CHILD,
+	PUT_ATTRIBUTE,
+	DELETE_ATTRIBUTE,
+	REPLACE_ROOT,
+	DEFAULT
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/Command.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: d687beee49742204fa26af185fa65c6c
+timeCreated: 1477164412
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/NodeEditorError.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,10 @@
+using UnityEngine;
+using System.Collections;
+
+public class NodeEditorError{
+
+	public static Error INDEX_OUT_OF_BOUNDS = new DefaultError();
+	public static Error DELETE_KEY_NOT_FOUND = new DefaultError();
+	public static Error NULL_VALUE_NOT_ALLOWED = new DefaultError();
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/NodeEditorError.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 4a937c83b8e69d346b0fab0de72b3999
+timeCreated: 1477164411
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/NodePath.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,8 @@
+using System.Collections.Generic;
+public interface NodePath : IEnumerable<int> {
+	NodePath add (int pos);
+	Pair<int,NodePath> pop();
+	NodePath tail();
+	int size();
+	Pair<int, NodePath> last();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/NodePath.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 49ab66a1eb535894fbc39ce3994b7cc8
+timeCreated: 1477164411
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/TreeContext.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,22 @@
+
+namespace JungleDB {
+	public interface TreeContext {
+		TreeNode getRoot();
+
+		TreeContext prev();
+
+		string getUuid();
+
+		string getTreeName();
+
+		long getRevision();
+
+		TreeMap<string, TreeMap<string, List<TreeNode>>> getIndex();
+
+	    // Iterable<TreeOperation> getOperations();
+
+		// ParentIndex getParentIndex(); do not use, in the game.
+
+		InterfaceTraverser getTraverser();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/TreeContext.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 26a87e25475baf54bb68c07fa9e7e116
+timeCreated: 1477164410
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/TreeEditor.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,5 @@
+namespace JungleDB {
+	public interface TreeEditor {
+		Either<Error, LoggingNode> edit (TreeNode root, NodePath path, NodeEditor transformer);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/TreeEditor.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 9fe0b17a014bedb4ca7e138184d19bbe
+timeCreated: 1477164412
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/impl.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 3a816248957d6bd4ab00fcc4949a72e3
+folderAsset: yes
+timeCreated: 1477164409
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/impl/DefaultNodePath.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,88 @@
+using UnityEngine;
+using System.Collections.Generic;
+using System.Collections;
+
+public class DefaultNodePath : NodePath {
+	private List<int> path = new List<int>();
+
+	IEnumerator IEnumerable.GetEnumerator()
+	{
+		// call the generic version of the method
+		return this.GetEnumerator();
+	}
+
+	public IEnumerator<int> GetEnumerator()
+	{
+		return path.iterator ();
+	}
+
+	public DefaultNodePath() {
+		path = new List<int> ().addLast (-1);
+	}
+
+	private DefaultNodePath(List<int> path) {
+		this.path = path;
+	}
+
+	/// <summary>
+	/// Listに追加します。
+	/// path = path.add(0)を2回する
+	/// path = path.add(0).add(0)する
+	/// これは同じ
+	/// </summary>
+	/// <param name="pos">Position.</param>
+
+	public NodePath add(int pos) {
+		List<int> newPath = path.addLast(pos);
+		return new DefaultNodePath(newPath);
+	}
+
+	public Pair<int, NodePath> pop() {
+		int head = path.headList();
+		List<int> tail = path.deleteHead();
+		return new Pair<int, NodePath>(head, new DefaultNodePath(tail));
+	}
+
+	public Pair<int, NodePath> last() {
+		int last = path.headList();
+		List<int> list = path.deleteHead();
+		return new Pair<int, NodePath>(last, new DefaultNodePath(list));
+	}
+
+	public override string ToString() {
+		string s = "List <";
+		int list_count = this.path.length();
+		int count = 0;
+		foreach(var i in this.path) {
+			if (count != list_count -1){
+				s += i.ToString() + ",";
+			} else {
+				s += i.ToString();
+			}
+			count++;
+		}
+		return s + ">";
+	}
+
+	public int size() {
+		return path.length();
+	}
+
+	public NodePath tail() {
+		List<int> tail = path.deleteLast ();
+		return new DefaultNodePath (tail);
+	}
+
+	public List<DefaultNodePath> inits() {
+		List<DefaultNodePath> paths = new List<DefaultNodePath> ();
+		List<int> coursePath = new List<int> ();
+		foreach (int tmpPath in path) {
+			List<int> tmp = coursePath.addLast (tmpPath);
+			paths = paths.addLast (new DefaultNodePath (tmp));
+			coursePath = tmp;
+		}
+		return paths;
+	}
+
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/impl/DefaultNodePath.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: cd3f46a0bb5789343a715f897d28b075
+timeCreated: 1477164412
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/impl/DefaultTreeEditor.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,60 @@
+using UnityEngine;
+using System.Collections;
+using System.Collections.Generic;
+
+namespace JungleDB {
+	public class DefaultTreeEditor : TreeEditor {
+		private Traverser traverser;
+		public DefaultTreeEditor(Traverser traverser){
+			this.traverser = traverser;
+		}
+
+		public Either<Error,LoggingNode> edit(TreeNode root,NodePath path, NodeEditor editor){
+			DefaultEvaluator e = new DefaultEvaluator (path);
+			Either<Error, Traversal> either = traverser.traverse (root, e);
+
+			if (either.isA ()) {
+				return DefaultEither<Error, LoggingNode>.newA (either.a ());
+			}
+			Traversal t = either.b ();
+			return clone (t, editor);
+		}
+
+		private Either<Error, LoggingNode> clone(Traversal t, NodeEditor editor){
+			List<Direction<TreeNode>> path = new List<Direction<TreeNode>> ();
+
+			foreach (Direction<TreeNode> direction in t) {
+				path = path.addLast (direction);
+			}
+
+			Direction<TreeNode> targetDirection = path.headList ();
+			TreeNode target = targetDirection.getTarget ();
+			Either<Error, LoggingNode> either = editor.edit (target);
+			if (either.isA ()) {
+				return DefaultEither<Error, LoggingNode>.newA (either.a ());
+			}
+
+			LoggingNode newWrap = either.b ();
+
+			int pos = targetDirection.getPosition ();
+			TreeNode child = newWrap.getWrap ();
+
+			foreach (Direction<TreeNode> parentDirection in path.deleteHead()) {
+				TreeNodeChildren chs = parentDirection.getTarget ().getChildren ();
+
+				Either<Error, TreeNode> ret = chs.replaceNode (pos, child);
+				if (ret.isA ()) {
+					return DefaultEither<Error, LoggingNode>.newA (ret.a ());
+				}
+
+				child = ret.b ();
+				pos = parentDirection.getPosition ();
+			}
+
+			TreeNode newRoot = child;
+			LoggingNode logNode = editor.wrap (newRoot, newWrap.getOperationLog ());
+			return DefaultEither<Error, LoggingNode>.newB (logNode);
+
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/impl/DefaultTreeEditor.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 1b3c37ab69942144ca3a29cfde899bf6
+timeCreated: 1477164410
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/impl/TreeNode.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,13 @@
+using System.Collections.Generic;
+
+namespace JungleDB {
+	public interface TreeNode {
+		TreeNodeChildren getChildren();
+
+		TreeNodeAttributes getAttributes();
+
+		TreeNode createNewNode();
+
+		Either<Error, TreeNode> appendRootNode();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/impl/TreeNode.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: f063e8875c109bd4b8824782f247c95d
+timeCreated: 1477164413
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/impl/TreeNodeAttributes.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,9 @@
+using System.Collections.Generic;
+namespace JungleDB {
+	public interface TreeNodeAttributes : Attributes {
+		Either<Error, TreeNode> delete(string key);
+		Either<Error, TreeNode> put(string key, byte[] value);
+		TreeMap<string, byte[]> getAttributesAsRawMap();
+		IEnumerator<string> getKeys();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/impl/TreeNodeAttributes.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 00585164e6a1d634e83e18e704bcef82
+timeCreated: 1477164410
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/impl/TreeNodeChildren.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,9 @@
+namespace JungleDB {
+	public interface TreeNodeChildren : Children {
+		Either<Error, TreeNode> addNewChildAt (int pos);
+		Either<Error, TreeNode> deleteChildAt(int pos);
+		Either<Error,TreeNode> addNewChildAt(int pos,TreeNode newChild);
+		Either<Error,TreeNode> replaceNode(int pos,TreeNode replacement);
+		List<TreeNode> getChildrenAsRawList();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/impl/TreeNodeChildren.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: f1a64aa7c5481574187ec6a9775fa735
+timeCreated: 1477164413
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/impl/logger.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: e0bc457e92c3bc248838d3e81783f5db
+folderAsset: yes
+timeCreated: 1477164410
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/impl/logger/DefaultOperationLog.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,50 @@
+using System.Collections.Generic;
+using System.Collections;
+using System;
+
+namespace JungleDB {
+	public class DefaultOperationLog : OperationLog {
+		private List<NodeOperation> log;
+
+
+		IEnumerator IEnumerable.GetEnumerator()
+		{
+			// call the generic version of the method
+			return this.GetEnumerator();
+		}
+
+		public IEnumerator<NodeOperation> GetEnumerator()
+		{
+			return iterator ();
+		}
+
+		private static List<NodeOperation> EMPTY = new List<NodeOperation>();
+
+		public DefaultOperationLog()
+			: this(EMPTY)
+		{
+		}
+
+		private DefaultOperationLog(List<NodeOperation> _log)
+		{
+			log = _log;
+		}
+
+		public IEnumerator<NodeOperation> iterator()
+		{
+			return log.iterator();
+		}
+
+
+		public OperationLog add(NodeOperation _op)
+		{
+			return new DefaultOperationLog(log.addLast(_op));
+		}
+			
+		public int length()
+		{
+			return log.length();
+		}
+
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/impl/logger/DefaultOperationLog.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 5511b639ac999c944adacff6fc137111
+timeCreated: 1477164411
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/impl/logger/DefaultTreeOperationLog.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,67 @@
+using UnityEngine;
+using System.Collections.Generic;
+using System;
+using System.Collections;
+using System.Linq;
+
+namespace JungleDB {
+	public class DefaultTreeOperationLog : TreeOperationLog {
+		private IEnumerable<TreeOperation> list;
+		private int size;
+
+		IEnumerator IEnumerable.GetEnumerator()
+		{
+			// call the generic version of the method
+			return this.GetEnumerator();
+		}
+
+		public IEnumerator<TreeOperation> GetEnumerator()
+		{
+			foreach (var i in list) {
+				yield return i;
+			}
+		}
+
+
+		public DefaultTreeOperationLog()
+		{
+			list = new List<TreeOperation>();
+			size = 0;
+		}
+
+		public DefaultTreeOperationLog(IEnumerable<TreeOperation> _list,int _size)
+		{
+			list = _list;
+			size = _size;
+		}
+
+	//	public IEnumerator<TreeOperation> iterator()
+	//	{
+	//		return list.itetator();
+	//	}
+
+		public TreeOperationLog add(NodePath _p, NodeOperation _op)
+		{
+			TreeOperation op = new DefaultTreeOperation(_p,_op);
+			List<TreeOperation> newList =  new List<TreeOperation>(op);
+			// java write Iterables.concat ここは間違い
+			IEnumerable<TreeOperation> concat = list.Union<TreeOperation>(newList);
+
+			return new DefaultTreeOperationLog(concat,size + 1);
+		}
+
+		public TreeOperationLog append(TreeOperationLog _log)
+		{
+			int argumentLogSize = _log.length();
+			// java write Iterables.concat
+			IEnumerable<TreeOperation> concat = list.Union<TreeOperation>(_log);
+
+			return new DefaultTreeOperationLog(concat,argumentLogSize + size);
+		}
+
+
+		public int length(){
+			return size;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/impl/logger/DefaultTreeOperationLog.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 45f4cfd975cd7a744ae07afc2cf5a75c
+timeCreated: 1477164411
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/impl/logger/LoggingAttributes.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,47 @@
+
+namespace JungleDB {
+	public class LoggingAttributes {
+
+		private TreeNode wrap;
+		private OperationLog log;
+
+		public LoggingAttributes(TreeNode _wrap,OperationLog _log)
+		{
+			wrap = _wrap;
+			log = _log;
+		}	
+
+		public byte[] get(string _key)
+		{
+			TreeNodeAttributes attributes = wrap.getAttributes();
+			return attributes.get(_key);
+		}
+
+		private Either<Error,LoggingNode> edit(NodeOperation _op)
+		{
+			Either<Error,TreeNode> either = _op.invoke(wrap);
+			if(either.isA()){
+				return DefaultEither<Error,LoggingNode>.newA(either.a());
+			}
+
+			TreeNode newNode = either.b();
+			OperationLog newLog = log.add(_op); 
+			LoggingNode newLogNode = new LoggingNode(newNode,newLog);
+
+			return DefaultEither<Error,LoggingNode>.newB(newLogNode);
+		}
+
+		public Either<Error,LoggingNode> delete(string _key)
+		{
+
+			DeleteAttributeOperation deleteAttribute = new DeleteAttributeOperation(_key);
+			return edit(deleteAttribute);
+		}
+
+		public Either<Error,LoggingNode> put(string _key, byte[] _value)
+		{
+			PutAttributeOperation putAttribute = new PutAttributeOperation(_key,_value);
+			return edit(putAttribute);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/impl/logger/LoggingAttributes.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: ffdd92c38e6228540835ba42bf3f22f5
+timeCreated: 1477164413
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/impl/logger/LoggingChildren.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,61 @@
+using System.Collections;
+using UnityEngine;
+
+namespace JungleDB {
+	public class LoggingChildren {
+		private TreeNode wrap;
+		private OperationLog log;
+
+		public LoggingChildren(TreeNode _wrap,OperationLog _log)
+		{
+			wrap = _wrap;
+			log = _log;
+		}
+
+		public int size()
+		{
+			Children children = wrap.getChildren();
+			return children.size();
+		}
+
+		public Either<Error,LoggingNode> edit(NodeOperation _op)
+		{
+			Either<Error,TreeNode> either = _op.invoke(wrap);
+			if(either.isA()){
+				return DefaultEither<Error,LoggingNode>.newA(either.a());
+			}
+
+			TreeNode newWrap = either.b();
+			OperationLog newLog = log.add(_op);
+			LoggingNode newLoggingNode = new LoggingNode(newWrap,newLog);
+			return DefaultEither<Error,LoggingNode>.newB(newLoggingNode);
+		}
+
+		public Either<Error,LoggingNode> addNewChildAt(int _pos)
+		{
+			Debug.Log ("in addNewChild");
+			NodeOperation addNewChildAt = new AppendChildAtOperation(_pos);
+			return edit(addNewChildAt);
+		}
+
+		public Either<Error,LoggingNode> deleteChildAt(int _pos)
+		{
+			NodeOperation deleteChildAt = new DeleteChildAtOperation(_pos);
+			return edit(deleteChildAt);
+		}
+
+		public Either<Error,LoggingNode> at(int _pos)
+		{
+			Children children = wrap.getChildren();
+			Either<Error,TreeNode> either = children.at(_pos);
+			if(either.isA()){
+				return DefaultEither<Error,LoggingNode>.newA(either.a());
+			}
+
+			TreeNode node = either.b();
+			LoggingNode logNode = new LoggingNode(node);
+			return DefaultEither<Error,LoggingNode>.newB(logNode);
+		}
+
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/impl/logger/LoggingChildren.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 60da4a01e3c63e245b73bb61b20f301b
+timeCreated: 1477164411
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/impl/logger/LoggingNode.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,59 @@
+using UnityEngine;
+using System.Collections;
+
+namespace JungleDB {
+	public class LoggingNode {
+		private TreeNode wrap;
+		private OperationLog log;
+
+		public LoggingNode(TreeNode _wrap)
+			: this(_wrap,new DefaultOperationLog())
+		{
+		}
+
+		public LoggingNode(TreeNode _wrap,OperationLog _log)
+		{
+			wrap = _wrap;
+			log = _log;
+		}
+
+		public LoggingAttributes getAttributes()
+		{
+			return new LoggingAttributes(wrap,log);
+		}
+
+		public LoggingChildren getChildren()
+		{
+			Debug.Log ("in gtChildren");
+			return new LoggingChildren(wrap,log);
+		}
+
+
+		public OperationLog getOperationLog()
+		{
+			return log;
+		}
+
+		public Either<Error, LoggingNode> replaceNewRootNode() {
+			NodeOperation replaceRootNode = new ReplaceRootNodeOperation();
+			return edit(replaceRootNode);
+		}
+
+		public Either<Error, LoggingNode> edit(NodeOperation op){
+			Either<Error,TreeNode> either = op.invoke(wrap);
+			if(either.isA()){
+				return DefaultEither<Error, LoggingNode>.newA(either.a());
+			}
+
+			TreeNode newWrap = either.b();
+			OperationLog newLog = log.add(op);
+			LoggingNode newLoggingNode = new LoggingNode(newWrap,newLog);
+			return DefaultEither<Error, LoggingNode>.newB(newLoggingNode);
+		}
+
+		public TreeNode getWrap()
+		{
+			return wrap;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/impl/logger/LoggingNode.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 67f57fc27eee02346ba82e87a2793d8f
+timeCreated: 1477164411
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/impl/logger/OperationLog.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,7 @@
+using System.Collections.Generic;
+namespace JungleDB {
+	public interface OperationLog : IEnumerable<NodeOperation> {
+		OperationLog add (NodeOperation _op);
+		int length();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/impl/logger/OperationLog.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 78c980ae4a9174e49896c7ac6218f3a7
+timeCreated: 1477164411
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/impl/logger/TreeOperationLog.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,8 @@
+using System.Collections.Generic;
+namespace JungleDB {
+	public interface TreeOperationLog : IEnumerable<TreeOperation> {
+		TreeOperationLog add (NodePath _p, NodeOperation _op);
+		TreeOperationLog append (TreeOperationLog _log);
+		int length();
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/impl/logger/TreeOperationLog.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: b77e6a85d05d98747a89edfd44a89f9c
+timeCreated: 1477164412
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/index.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: b79bdad8650648a4abdee3375bd82910
+folderAsset: yes
+timeCreated: 1477164410
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/index/ParentIndex.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,50 @@
+namespace JungleDB {
+	public class ParentIndex {
+		
+		private TreeMap<TreeNode, TreeNode> parentIndex;
+
+		public ParentIndex() {
+			parentIndex = new TreeMap<TreeNode, TreeNode>();
+		}
+
+		public bool isEmpty(){
+			return parentIndex.isEmpty();
+		}
+
+		public TreeNode get(TreeNode child) {
+			// return parentIndex.get(child).get();
+			return null;
+		}
+
+		public ParentIndex set(TreeNode parent ,TreeNode child) {
+			parentIndex = parentIndex.put(child, parent);
+			return this;
+		}
+
+		public ParentIndex delete(TreeNode child) {
+			parentIndex = parentIndex.delete(child);
+			return this;
+		}
+
+		public ParentIndex deleteAllChildren(TreeNode parentNode) {
+			//TreeNodeChildren children = parentNode.getChildren();
+			// Iterator<TreeNode> childrenIterator = children.iterator();
+	//		for (; childrenIterator.hasNext();) {
+	//			TreeNode child = childrenIterator.next();
+	//			parentIndex = parentIndex.delete(child);
+	//		}
+			return this;
+		}
+
+		public ParentIndex addAllChildren(TreeNode parentNode) {
+			//TreeNodeChildren children = parentNode.getChildren();
+			// Iterator<TreeNode> childrenIterator = children.iterator();
+	//		for (; childrenIterator.hasNext();) {
+	//			TreeNode child = childrenIterator.next();
+	//			parentIndex = parentIndex.put(child, parentNode);
+	//		}
+			return this;
+		}
+
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/index/ParentIndex.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: b9a0333deccae8e488b4cc01e589c635
+timeCreated: 1477164412
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/operations.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: cd5e1d78ef7593142b937d9816134569
+folderAsset: yes
+timeCreated: 1477164410
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/operations/AppendChildAtOperation.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,40 @@
+using UnityEngine;
+using System.Collections;
+using System;
+
+namespace JungleDB {
+	public class AppendChildAtOperation : NodeOperation {
+		private int pos;
+
+		public AppendChildAtOperation(int _pos)
+		{
+			pos = _pos;
+		}
+
+		public Command getCommand()
+		{
+			return Command.APPEND_CHILD;
+		}
+
+		public Either<Error,TreeNode> invoke(TreeNode _target)
+		{
+			return _target.getChildren().addNewChildAt(pos);
+		}
+
+		public int getPosition()
+		{
+			return pos;
+		}
+
+		public string getKey()
+		{
+			return null;
+		}
+
+		public byte[] getValue()
+		{
+			return new byte[1]{0};
+		}
+
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/operations/AppendChildAtOperation.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 0523879de223e9947a2346bf76fce774
+timeCreated: 1477164410
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/operations/DefaultTreeOperation.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,22 @@
+using UnityEngine;
+using System.Collections;
+
+namespace JungleDB {
+	public class DefaultTreeOperation : TreeOperation {
+		private NodePath path;
+		private NodeOperation operation;
+
+		public DefaultTreeOperation(NodePath _path, NodeOperation _operation){
+			path = _path;
+			operation = _operation;
+		}
+
+		public NodePath getNodePath() {
+			return path;
+		}
+
+		public NodeOperation getNodeOperation() {
+			return operation;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/operations/DefaultTreeOperation.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: e348937a30bf29b4b94be8cfa58ad19a
+timeCreated: 1477164413
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/operations/DeleteAttributeOperation.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,33 @@
+using UnityEngine;
+using System.Collections;
+using System;
+
+namespace JungleDB {
+	public class DeleteAttributeOperation : NodeOperation {
+		private string key;
+
+		public DeleteAttributeOperation(string _key) {
+			key = _key;
+		}
+
+		public Command getCommand() {
+			return Command.DELETE_ATTRIBUTE;
+		}
+
+		public Either<Error, TreeNode> invoke(TreeNode _target) {
+			return _target.getAttributes ().delete (key);
+		}
+
+		public int getPosition() {
+			return -1;
+		}
+
+		public string getKey() {
+			return key;
+		}
+
+		public byte[] getValue() {
+			return new byte[1]{0};
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/operations/DeleteAttributeOperation.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: c23e7109cff63f8498d5b86898300a5d
+timeCreated: 1477164412
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/operations/DeleteChildAtOperation.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,41 @@
+using UnityEngine;
+using System.Collections;
+using System;
+
+namespace JungleDB {
+	public class DeleteChildAtOperation : NodeOperation {
+		private int pos;
+
+		public DeleteChildAtOperation(int _pos)
+		{
+			pos = _pos;
+		}
+
+
+		public Command getCommand()
+		{
+			return Command.DELETE_CHILD;
+		}
+
+		public Either<Error, TreeNode> invoke(TreeNode _target) 
+		{
+			return _target.getChildren().deleteChildAt(pos);
+		}
+
+		public int getPosition()
+		{
+			return pos;
+		}
+
+		public string getKey()
+		{
+			return null;
+		}
+
+		public byte[] getValue()
+		{
+			return new byte[1]{0};
+		}
+
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/operations/DeleteChildAtOperation.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 9897047d8fc06404eaae6303b85521d5
+timeCreated: 1477164411
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/operations/NodeOperation.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,9 @@
+namespace JungleDB {
+	public interface NodeOperation {
+		Command getCommand();
+		Either<Error,TreeNode> invoke (TreeNode _target);
+		int getPosition();
+		string getKey();
+		byte[] getValue();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/operations/NodeOperation.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: c80263c3ebe94c44fa912b70158d9519
+timeCreated: 1477164412
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/operations/PutAttributeOperation.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,37 @@
+namespace JungleDB {
+	public class PutAttributeOperation : NodeOperation {
+		private string key;
+		private byte[] value;
+
+		public PutAttributeOperation(string _key, byte[] _value)
+		{
+			key = _key;
+			value = _value;
+		}
+
+
+		public Command getCommand()
+		{
+			return Command.PUT_ATTRIBUTE;
+		}
+
+		public Either<Error,TreeNode> invoke(TreeNode _target)
+		{
+			return _target.getAttributes().put(key,value);
+		}
+		public int getPosition()
+		{
+			return -1;
+		}
+
+		public string getKey()
+		{
+			return key;
+		}
+
+		public byte[] getValue()
+		{
+			return value;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/operations/PutAttributeOperation.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 0ddc863fe2cdfdf4080dae936bab596a
+timeCreated: 1477164410
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/operations/ReplaceRootNodeOperation.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,28 @@
+using UnityEngine;
+using System.Collections;
+using System;
+
+namespace JungleDB {
+	public class ReplaceRootNodeOperation : NodeOperation {
+		
+		public Command getCommand() {
+			return Command.REPLACE_ROOT;
+		}
+
+		public Either<Error, TreeNode> invoke(TreeNode target) {
+			return  target.appendRootNode();
+		}
+
+		public int getPosition() {
+			return -1;
+		}
+
+		public string getKey() {
+			return null;
+		}
+
+		public byte[] getValue() {
+			return new byte[1]{0};
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/operations/ReplaceRootNodeOperation.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 28da3db3d84207440a39dd7e795fd0a1
+timeCreated: 1477164410
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/operations/TreeOperation.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,7 @@
+
+namespace JungleDB {
+	public interface TreeOperation  {
+		NodePath getNodePath();
+		NodeOperation getNodeOperation();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/operations/TreeOperation.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 6779d11d1748e5f4faeaebe690a04e08
+timeCreated: 1477164411
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/transformer.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 78319f8f0586b594a84e21fbf350a2d7
+folderAsset: yes
+timeCreated: 1477164409
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/transformer/AppendChildAt.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,35 @@
+using UnityEngine;
+using System.Collections;
+
+namespace JungleDB {
+	public class AppendChildAt : NodeEditor {
+		private int pos;
+
+		public AppendChildAt(int _pos){
+			pos = _pos;
+		}
+
+		public Either<Error, LoggingNode> _edit(LoggingNode _e) 
+		{
+			Either<Error,LoggingNode> either = _e.getChildren().addNewChildAt(pos);
+			if(either.isA()){
+				// error
+				return either;
+			}
+			return DefaultEither<Error, LoggingNode>.newB(either.b());
+		}
+
+		public Either<Error, LoggingNode> edit(TreeNode _e) {
+			LoggingNode logNode = wrap(_e);
+			return _edit(logNode);
+		}
+
+		public LoggingNode wrap(TreeNode node) {
+			return new LoggingNode(node);
+		}
+
+		public LoggingNode wrap(TreeNode node, OperationLog op) {
+			return new LoggingNode(node, op);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/transformer/AppendChildAt.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 02b3a361912c098468382182e68ef609
+timeCreated: 1477164410
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/transformer/DeleteAttribute.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,36 @@
+using UnityEngine;
+using System.Collections;
+
+namespace JungleDB {
+	public class DeleteAttribute : NodeEditor {
+		private string key;
+
+		public DeleteAttribute(string _key)
+		{
+			key = _key;
+		}
+
+		public Either<Error,LoggingNode> _edit(LoggingNode logNode)
+		{
+			Either<Error,LoggingNode> either = logNode.getAttributes().delete(key);
+			if(either.isA()){
+				// error
+				return either;
+			}
+			return DefaultEither<Error, LoggingNode>.newB(either.b());
+		}
+
+		public Either<Error, LoggingNode> edit(TreeNode _e) {
+			LoggingNode logNode = wrap(_e);
+			return _edit(logNode);
+		}
+
+		public LoggingNode wrap(TreeNode node) {
+			return new LoggingNode(node);
+		}
+
+		public LoggingNode wrap(TreeNode node, OperationLog op) {
+			return new LoggingNode(node, op);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/transformer/DeleteAttribute.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: c522a53c524cbb746bdf4524bc42fbe4
+timeCreated: 1477164412
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/transformer/DeleteChildAt.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,36 @@
+using UnityEngine;
+using System.Collections;
+
+namespace JungleDB {
+	public class DeleteChildAt : NodeEditor {
+		private int pos;
+
+		public DeleteChildAt(int _pos)
+		{
+			pos = _pos;
+		}
+
+		public Either<Error, LoggingNode> _edit(LoggingNode logNode)
+		{
+			Either<Error,LoggingNode> either = logNode.getChildren().deleteChildAt(pos);
+			if(either.isA()){
+				// error
+				return either;
+			}
+			return DefaultEither<Error, LoggingNode>.newB(either.b());
+		}
+
+		public Either<Error, LoggingNode> edit(TreeNode _e) {
+			LoggingNode logNode = wrap(_e);
+			return _edit(logNode);
+		}
+
+		public LoggingNode wrap(TreeNode node) {
+			return new LoggingNode(node);
+		}
+
+		public LoggingNode wrap(TreeNode node, OperationLog op) {
+			return new LoggingNode(node, op);
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/transformer/DeleteChildAt.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: bea835f0c1013dd41bf6f47616d2e2de
+timeCreated: 1477164412
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/transformer/NodeEditor.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,6 @@
+namespace JungleDB {
+	public interface NodeEditor {
+		Either<Error, LoggingNode> edit (TreeNode _e);
+		LoggingNode wrap (TreeNode node, OperationLog op);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/transformer/NodeEditor.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 7764d56dc1c5cfb449bd81e66b823fb3
+timeCreated: 1477164411
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/transformer/PutAttribute.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,38 @@
+using UnityEngine;
+using System.Collections;
+
+namespace JungleDB {
+	public class PutAttribute : NodeEditor {
+		private string key;
+		private byte[] value;
+
+		public PutAttribute(string _key, byte[] _value)
+		{
+			key = _key;
+			value = _value;
+		}
+
+		public Either<Error,LoggingNode> _edit(LoggingNode _e)
+		{
+			Either<Error,LoggingNode> either = _e.getAttributes().put(key,value);
+			if(either.isA()){
+				// error
+				return either;
+			}
+			return DefaultEither<Error, LoggingNode>.newB(either.b());
+		}
+
+		public Either<Error, LoggingNode> edit(TreeNode _e) {
+			LoggingNode logNode = wrap(_e);
+			return _edit(logNode);
+		}
+
+		public LoggingNode wrap(TreeNode node) {
+			return new LoggingNode(node);
+		}
+
+		public LoggingNode wrap(TreeNode node, OperationLog op) {
+			return new LoggingNode(node, op);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/transformer/PutAttribute.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: e2055099f7d5d364a9e4bbb5d132916b
+timeCreated: 1477164412
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/transformer/replaceRootNodeAt.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,29 @@
+using System.Collections;
+
+namespace JungleDB {
+	public class replaceRootNodeAt : NodeEditor {
+		public Either<Error, LoggingNode> _edit(LoggingNode _e)
+		{
+			Either<Error,LoggingNode> either = _e.replaceNewRootNode();
+			if(either.isA()){
+				// error
+				return either;
+			}
+			return DefaultEither<Error, LoggingNode>.newB(either.b());
+		}
+
+		public Either<Error, LoggingNode> edit(TreeNode _e) {
+			LoggingNode logNode = wrap(_e);
+			return _edit(logNode);
+		}
+
+		public LoggingNode wrap(TreeNode node) {
+			return new LoggingNode(node);
+		}
+
+
+		public LoggingNode wrap(TreeNode node, OperationLog op) {
+			return new LoggingNode(node, op);
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/store/transformer/replaceRootNodeAt.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 08f7c41f52283b94ea00666ecb27b6f5
+timeCreated: 1477164410
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/transaction.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 894271a640f4ac449a95276b05cb6ad5
+folderAsset: yes
+timeCreated: 1477164409
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/transaction/AtomicReference.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,24 @@
+using System.Threading;
+
+public class AtomicReference <T> where T : class {
+	private T value;
+
+	public AtomicReference(T value) {
+		this.value = value;
+	}
+
+	public bool CompareAndSet(T newValue, T prevValue) {
+		T oldValue = value;
+		if (oldValue == prevValue) {
+			Interlocked.CompareExchange (ref value, newValue, prevValue);
+			return true;
+		} else {
+			return false;
+		}
+	}
+		
+
+	public T Get() {
+		return value;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/transaction/AtomicReference.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 0da9607890c31124faba9aa6297ab163
+timeCreated: 1477164410
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/transaction/DefaultJungleTreeEditor.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,117 @@
+using UnityEngine;
+using System.Collections.Generic;
+
+namespace JungleDB {
+	public class DefaultJungleTreeEditor : JungleTreeEditor {
+
+		private TransactionManager txManager;
+		private TreeNode root;
+		private TreeEditor editor;
+		private TreeOperationLog log;
+
+		public DefaultJungleTreeEditor(TreeNode _root,TransactionManager _txManager,TreeEditor _editor)
+			: this(_root, _txManager, _editor, new DefaultTreeOperationLog())
+		{
+		}
+
+
+
+		public DefaultJungleTreeEditor(TreeNode newNode,TransactionManager txManager,TreeEditor editor,TreeOperationLog log)
+		{
+			this.root = newNode;
+			this.txManager = txManager;
+			this.editor = editor;
+			this.log = log;
+		}
+
+
+
+		private Either<Error,JungleTreeEditor> _edit(NodePath _path,NodeEditor _e)
+		{
+			Either<Error, LoggingNode> either = editor.edit (root, _path, _e);
+			if (either.isA ()) {
+				return DefaultEither<Error, JungleTreeEditor>.newA (either.a ());
+			}
+
+			LoggingNode newLogging = either.b ();
+			OperationLog newLog = newLogging.getOperationLog ();
+			TreeNode newNode = newLogging.getWrap ();
+
+			IterableConverter<TreeOperation,NodeOperation>.Converter<TreeOperation, NodeOperation> converter = new InnerConverter (_path);
+				
+
+			IEnumerable<TreeOperation> iterable = new IterableConverter<TreeOperation, NodeOperation> (newLog, converter);
+			DefaultTreeOperationLog treeOperationLog = new DefaultTreeOperationLog (iterable, newLog.length ());
+			TreeOperationLog newTreeOpLog = log.append (treeOperationLog);
+
+			JungleTreeEditor newEditor = new DefaultJungleTreeEditor (newNode, txManager, editor, newTreeOpLog);
+			return DefaultEither<Error, JungleTreeEditor>.newB (newEditor);
+
+		}
+
+
+		public Either<Error, JungleTreeEditor> replaceNewRootNode() {
+			replaceRootNodeAt appendChildAt = new replaceRootNodeAt ();
+			return _edit (new DefaultNodePath(), appendChildAt);
+		}
+
+		public Either<Error, JungleTreeEditor> addNewChildAt(NodePath _path, int _pos) {
+			AppendChildAt appendChildAt = new AppendChildAt (_pos);
+			return _edit (_path, appendChildAt);
+		}
+
+		public Either<Error,JungleTreeEditor> deleteChildAt(NodePath _path, int _pos) {
+			DeleteChildAt deleteChildAt = new DeleteChildAt(_pos);
+			return _edit(_path,deleteChildAt);
+		}
+
+		public Either<Error, JungleTreeEditor> putAttribute(NodePath _path, string _key, byte[] _value) {
+			PutAttribute putAttribute = new PutAttribute (_key, _value);
+			return _edit (_path, putAttribute);
+		}
+
+		public Either<Error, JungleTreeEditor> deleteAttribute(NodePath _path, string _key) {
+			DeleteAttribute deleteAttribute = new DeleteAttribute (_key);
+			return _edit (_path, deleteAttribute);
+		}
+
+		public Either<Error,JungleTreeEditor> edit(NodePath _path,NodeEditor _editor) {
+			return _edit(_path,_editor);
+		}
+
+		/// <summary>
+		/// Treeを変更したあとSuccess(push)を行う
+		/// </summary>
+
+		public Either<Error,JungleTreeEditor> commit() {
+			Either<Error,TransactionManager> either = this.txManager.commit(this.root, this.log);
+			// このlogをサーバにpushする?
+			if(either.isA()){
+				return DefaultEither<Error, JungleTreeEditor>.newA(either.a());
+			}
+
+			TransactionManager newTxManager = either.b();
+			JungleTreeEditor newTreeEditor = new DefaultJungleTreeEditor(this.root, newTxManager, this.editor);
+
+			return DefaultEither<Error, JungleTreeEditor>.newB(newTreeEditor);
+		}
+			
+		public Either<Error, JungleTreeEditor> flushSuccess() {
+			return commit();
+		}
+
+		public class InnerConverter : IterableConverter<TreeOperation,NodeOperation>.Converter<TreeOperation,NodeOperation>{
+
+			NodePath path;
+
+			public InnerConverter(NodePath _path) {
+				path = _path;
+			}
+
+
+			public TreeOperation conv(NodeOperation _b){
+				return new DefaultTreeOperation(path,_b);
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/transaction/DefaultJungleTreeEditor.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 95c5bce8d2a69ec4eac64938743916e3
+timeCreated: 1477164411
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/transaction/DefaultTransactionManager.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,94 @@
+using System.Collections.Generic;
+using System.Collections;
+using System;
+
+namespace JungleDB {
+	public class DefaultTransactionManager : TransactionManager {
+		private AtomicReference<TreeContext> repository;
+		private TreeContext tip;
+		private ChangeListWriter writer;
+		private string uuid;
+
+
+		public DefaultTransactionManager(ChangeListWriter _writer, TreeContext _tip, AtomicReference<TreeContext> _repository, string _uuid) {
+			repository = _repository;
+			tip = _tip;
+			writer = _writer;
+			uuid = _uuid;
+		}
+
+		public Either<Error, TransactionManager> commit(TreeNode newRoot, TreeOperationLog _log) {
+			long currentRevision = tip.getRevision();
+			long nextRevision = currentRevision + 1;
+
+			string _treeName = tip.getTreeName();
+			// 通信時に必要?
+			ChangeList list = new InnerChangeList(_log, _treeName, uuid);
+
+			InterfaceTraverser traverser = new InterfaceTraverser(newRoot, true);
+			// traverser.createIndex();
+			TreeContext newTreeContext = new DefaultTreeContext(newRoot , tip, list, uuid, _treeName, nextRevision,traverser);
+			// compare and setがどういう役割か?Javaで
+			if  (repository.CompareAndSet(newTreeContext, newTreeContext.prev())) { // CompareAndSetが成功した場合に処理を実行
+				TransactionManager txManager = new DefaultTransactionManager(writer, newTreeContext, repository, uuid);
+				return DefaultEither<Error, TransactionManager>.newB(txManager);
+			}
+
+			return DefaultEither<Error, TransactionManager>.newA((Error) new DefaultError());
+		}
+
+		public Either<Error, TransactionManager> firstcommit(TreeNode _newRoot, TreeOperationLog _log) {
+			return commit(_newRoot,_log);
+		}
+
+		public string getUUID() {
+			return uuid;
+		}
+
+		public long getRevision() {
+			return tip.getRevision();
+		}
+
+		public class InnerChangeList : ChangeList{
+
+			TreeOperationLog log;
+			string treeName;
+			string uuid;
+
+
+			IEnumerator IEnumerable.GetEnumerator()
+			{
+				// call the generic version of the method
+				return this.GetEnumerator();
+			}
+
+			public IEnumerator<TreeOperation> GetEnumerator()
+			{
+				return iterator ();
+			}
+
+
+			public InnerChangeList(TreeOperationLog _log, string _treeName, string _uuid){
+				this.log = _log;
+				this.treeName = _treeName;
+				this.uuid = _uuid;
+			}
+
+			public IEnumerator<TreeOperation> iterator() {
+				return log.GetEnumerator();
+			}
+
+			public string getTreeName() {
+				return treeName;
+			}
+
+			public TreeOperationLog getLog() {
+				return log;
+			}
+
+			public string uuids() {
+				return uuid;
+			}
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/transaction/DefaultTransactionManager.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 999df8a86f830e5469eb26a1e22a5996
+timeCreated: 1477164412
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/transaction/DefaultTreeContext.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,65 @@
+using UnityEngine;
+using System.Collections.Generic;
+
+// override need? 
+
+namespace JungleDB {
+	public class DefaultTreeContext : TreeContext {
+		private TreeNode root;
+		private TreeContext previous;
+		private ChangeList changeList;
+		private string uuid;
+		private string treeName;
+		private long revision;
+		private InterfaceTraverser traverser;
+
+		public DefaultTreeContext(TreeNode _node, TreeContext _prev, ChangeList _log, string _uuid, string _treeName, long _revision, InterfaceTraverser traverser) {
+			this.root = _node;
+			this.previous = _prev;
+			this.changeList = _log;
+			this.uuid = _uuid;
+			this.treeName = _treeName;
+			this.revision = _revision;
+			this.traverser = traverser;
+		}
+
+		public TreeNode getRoot() {
+			return root;
+		}
+
+		public TreeContext prev() {
+			return previous;
+		}
+
+		public ChangeList getChangeList() {
+			return changeList;
+		}
+			
+		public string getUuid() {
+			return uuid;
+		}
+
+		public string getTreeName() {
+			return treeName;
+		}
+
+		public long getRevision() {
+			return revision;
+		}
+
+		public IEnumerable<TreeOperation> getOperations() {
+			return changeList;
+		}
+
+		public TreeMap<string, TreeMap<string, List<TreeNode>>> getIndex() {
+			return traverser.getIndex ();
+		}
+
+		// don't write parent Index.
+
+		public InterfaceTraverser getTraverser() {
+			return traverser;
+		}
+
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/transaction/DefaultTreeContext.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: fe30eb50b720a7047b42a6924057a07b
+timeCreated: 1477164413
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/transaction/DefaultTreeNode.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,46 @@
+using UnityEngine;
+
+namespace JungleDB {
+	public class DefaultTreeNode : TreeNode {
+		
+		private List<TreeNode> children;
+		private TreeMap<string,byte[]> attrs;
+		private static readonly List<TreeNode> NIL_LIST = new List<TreeNode>();
+
+		public DefaultTreeNode() 
+			: this (NIL_LIST, new TreeMap<string,byte[]> ())
+		{
+		}
+
+		public DefaultTreeNode(List<TreeNode> _children, TreeMap<string, byte[]> _attrs) {
+			attrs = _attrs;
+			children = _children;
+		}
+
+		public TreeNodeChildren getChildren() {
+			return new DefaultTreeNodeChildren(children, attrs);
+		}
+
+		public TreeNodeAttributes getAttributes() {
+			return new DefaultTreeNodeAttribute(children, attrs); // count = null.
+		}
+
+		public TreeNode createNewNode() {
+			return new DefaultTreeNode();
+		}
+
+		public DefaultTreeNode clone() {
+			return new DefaultTreeNode(children, attrs);
+		}
+
+		public Either<Error, TreeNode> appendRootNode() {
+			TreeNodeChildren newRootChildren = new DefaultTreeNodeChildren(NIL_LIST, new TreeMap<string, byte[]>());
+			Either<Error, TreeNode> either = newRootChildren.addNewChildAt(0,this);
+			return either;
+		}
+
+		public int compareTo(TreeNode o) {
+			return this.GetHashCode() - o.GetHashCode();
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/transaction/DefaultTreeNode.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 0632916a950ff214a8ca5bc2a043a05f
+timeCreated: 1477164410
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/transaction/DefaultTreeNodeAttribute.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,74 @@
+using UnityEngine;
+using System.Collections;
+using System.Collections.Generic;
+using System;
+using System.Text;
+
+namespace JungleDB {
+	public class DefaultTreeNodeAttribute : TreeNodeAttributes {
+		public List<TreeNode> children;
+		public TreeMap<string, byte[]> attrs;
+
+		public DefaultTreeNodeAttribute(List<TreeNode> _children, TreeMap<string, byte[]> _attrs){
+			children = _children; // null?
+			attrs = _attrs;
+		}
+
+		public TreeMap<string, byte[]> getAttributesAsRawMap(){
+			return attrs;
+		}
+
+		public Either<Error, TreeNode> delete(string _key) {
+			if (_key == null) {
+				return DefaultEither<Error,TreeNode>.newA (NodeEditorError.NULL_VALUE_NOT_ALLOWED);
+			}
+
+			if (null == attrs.getRoot()) {
+				return DefaultEither<Error,TreeNode>.newA(NodeEditorError.DELETE_KEY_NOT_FOUND);
+			}
+
+			TreeMap<string, byte[]> newMap = attrs.delete(_key);
+			TreeNode newNode = new DefaultTreeNode(children, newMap);
+			return DefaultEither<Error,TreeNode>.newB(newNode);
+		}
+
+		public Either<Error, TreeNode> put(string _key, byte[] _value){
+			if (_key == null || _value == null) {
+				return DefaultEither<Error, TreeNode>.newA (NodeEditorError.NULL_VALUE_NOT_ALLOWED);
+			}
+
+			TreeMap<string, byte[]> newMap = attrs.put (_key, _value);
+
+			TreeNode newNode = new DefaultTreeNode (children, newMap);
+
+			return DefaultEither<Error, TreeNode>.newB (newNode);
+		}
+
+		public byte[] get(string _key) {
+			if (_key == null) {
+				return new byte[1]{0};
+			}
+			byte[] op = attrs.get(_key); //null
+			if (op != null) {
+				return op;
+			}
+			return new byte[1]{0};
+		}
+
+		public string getString(string key, Encoding enc) {
+			char[] attribute = key.ToCharArray();
+			if (attribute != null){
+				return new string(attribute);
+			}
+			return null;
+		}
+
+		public string getString(string key) {
+			return null;
+		}
+		public IEnumerator<string> getKeys(){
+			return attrs.keys ();
+		}
+
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/transaction/DefaultTreeNodeAttribute.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: f51ab094cfe23e64283b86da2d6614d1
+timeCreated: 1477164413
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/transaction/DefaultTreeNodeChildren.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,95 @@
+using UnityEngine;
+using System.Collections;
+
+namespace JungleDB {
+	public class DefaultTreeNodeChildren : TreeNodeChildren {
+
+		public List<TreeNode> children;
+		public TreeMap<string, byte[]> attrs;
+
+		public DefaultTreeNodeChildren(List<TreeNode> _children, TreeMap<string, byte[]> _attrs){
+			children = _children;
+			attrs = _attrs;
+		}
+
+		private bool boundaryCheck(int _pos) {
+			int size = children.length ();
+			if (size < _pos) {
+				return false;
+			}
+			return true;
+		}
+
+		public List<TreeNode> getChildrenAsRawList() {
+			return children;
+		}
+
+		public Either<Error, TreeNode> addNewChildAt(int _pos) {
+			if (!boundaryCheck(_pos) || _pos < 0) {
+				return DefaultEither<Error, TreeNode>.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS);
+			}
+
+			List<TreeNode> newChildren = children.add(_pos, new DefaultTreeNode());
+			TreeNode newNode = new DefaultTreeNode(newChildren, attrs);
+			return DefaultEither<Error, TreeNode>.newB(newNode);
+		}
+
+
+		public Either<Error, TreeNode> deleteChildAt(int _pos) {
+			if (!boundaryCheck(_pos) || _pos < 0 || size() == 0) {
+				return DefaultEither<Error, TreeNode>.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS);
+			}
+
+			List<TreeNode> newChildren = children.delete(_pos);
+			TreeNode newNode = new DefaultTreeNode(newChildren, attrs);
+
+			return DefaultEither<Error, TreeNode>.newB(newNode);
+		}
+
+
+		public int size() {
+			return children.length();
+		}
+
+
+	//	public Iterator<TreeNode> iterator() {
+	//		return children.iterator();
+	//	}
+
+
+		public Either<Error, TreeNode> replaceNode(int _pos, TreeNode _replacement) {
+			int size = children.length();
+			if (!(0 <= _pos && _pos < size)) {
+				return DefaultEither<Error, TreeNode>.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS);
+			}
+			TreeNode replacement = _replacement;
+
+			List<TreeNode> newChildren = children.replace(_pos, replacement);
+			TreeNode node = new DefaultTreeNode(newChildren, attrs);
+			return DefaultEither<Error, TreeNode>.newB(node);
+		}
+
+
+		public Either<Error, TreeNode> at(int _pos) {
+			if (children.length() < _pos + 1) {
+				return DefaultEither<Error, TreeNode>.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS);
+			}
+
+			TreeNode Node = children.index(_pos);
+
+			return DefaultEither<Error, TreeNode>.newB(Node);
+		}
+
+
+		public Either<Error, TreeNode> addNewChildAt(int _pos, TreeNode _newChild) {
+			if (!boundaryCheck(_pos) || _pos < 0) {
+				return DefaultEither<Error, TreeNode>.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS);
+			}
+			List<TreeNode> newChildren = children.add(_pos, _newChild);
+			TreeNode newNode = new DefaultTreeNode(newChildren, attrs);
+
+			return DefaultEither<Error, TreeNode>.newB(newNode);
+		}
+
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/transaction/DefaultTreeNodeChildren.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: aad4e17a0c06655489435de5d1940e61
+timeCreated: 1477164412
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/transaction/TransactionManager.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,9 @@
+
+namespace JungleDB {
+	public interface TransactionManager  {
+		Either<Error, TransactionManager> commit(TreeNode _newRoot, TreeOperationLog _log);
+		Either<Error, TransactionManager> firstcommit(TreeNode _newRoot, TreeOperationLog _log);
+		string getUUID();
+		long getRevision();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/transaction/TransactionManager.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 01691d4133a56a041800362ff28da91f
+timeCreated: 1477164410
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/traverser.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 62dd18e62fb9bc841af0de74ff5f42de
+folderAsset: yes
+timeCreated: 1477164409
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/traverser/DefaultEvaluation.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,22 @@
+using UnityEngine;
+using System.Collections;
+
+namespace JungleDB {
+	public class DefaultEvaluation : Evaluation {
+		private Result result;
+		private Evaluator evaluator;
+
+		public DefaultEvaluation(Result _result, Evaluator _evaluator) {
+			result = _result;
+			evaluator = _evaluator;
+		}
+
+		public Result results() {
+			return result;
+		}
+
+		public Evaluator evaluators() {
+			return evaluator;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/traverser/DefaultEvaluation.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: ceea8d81befe44847b389f3eca9c684a
+timeCreated: 1477164412
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/traverser/DefaultEvaluator.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,35 @@
+using UnityEngine;
+using System.Collections;
+
+namespace JungleDB {
+	public class DefaultEvaluator : Evaluator {
+		private NodePath path;
+
+		public DefaultEvaluator(NodePath _path) {
+			path = _path;
+		}
+
+		public Evaluation evaluate(TreeNode _current, int _pos){
+			Pair<int, NodePath> pop = path.pop ();
+			int head = pop.lefts ();
+
+			if (path.size () == 1) {
+				if (head == _pos) {
+					return new DefaultEvaluation (Result.GOAL, null);
+				}
+			}
+
+			DefaultEvaluator nextEvaluator;
+			Result result;
+			if (head == _pos) {
+				result = Result.ACCEPT;
+				nextEvaluator = new DefaultEvaluator (pop.rights ());
+			} else {
+				result = Result.CONTINUE;
+				nextEvaluator = null;
+			}
+
+			return new DefaultEvaluation (result, nextEvaluator);
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/traverser/DefaultEvaluator.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 91fa3b1eea78ce34ea11e08cb46a6ff4
+timeCreated: 1477164411
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/traverser/DefaultTraverser.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,162 @@
+using System.Collections.Generic;
+using System.Collections;
+using UnityEngine;
+using System;
+
+namespace JungleDB {
+	public class DefaultTraverser : Traverser  {
+
+
+		public Either<Error, Traversal> traverse(TreeNode _root, Evaluator _evaluator) {
+			Children warper = new InnerChildren(_root, _evaluator);
+
+			Children chs = warper;
+			Either<Error, List<Direction<TreeNode>>> ret = _traverse(chs, _evaluator, -1);
+
+			if (ret.isA ()) {
+				return DefaultEither<Error, Traversal>.newA (ret.a ());
+			}
+
+			List<Direction<TreeNode>> list = ret.b ();
+			IEnumerator<Direction<TreeNode>> iterable = list.iterator ();
+			TreeNode destination = ret.b ().headList ().getTarget ();
+
+			Traversal traversal = new InnerTraversal (iterable, destination);
+
+			return DefaultEither<Error, Traversal>.newB (traversal);
+
+		}
+
+
+		private Either<Error, List<Direction<TreeNode>>> _traverse(Children _chs, Evaluator _evaluator, int _pos) {
+			int pos = _pos;
+			TreeNode ch;
+			for (int i = 0; i < _chs.size(); i++) {
+				Either<Error,TreeNode> either = _chs.at(i);
+				if (either.isA ()) {
+					break;
+				}
+
+				ch = either.b();
+				Evaluation e = _evaluator.evaluate (ch, pos);
+				Result r = e.results();
+
+				if (r == Result.ACCEPT) {
+					return _accept (ch, pos, e.evaluators ());
+				}
+
+				if (r == Result.GOAL) {
+					return DefaultEither<Error,List<Direction<TreeNode>>>.newB(_goal(ch, pos));
+				}
+
+				if (r == Result.BREAK) {
+					break;
+				}
+
+				if (r == Result.CONTINUE) {
+					pos++;
+					continue;
+				}
+
+				return DefaultEither<Error, List<Direction<TreeNode>>>.newA (TraverserError.UNDEFINED_OPERATOR);
+			}
+			return DefaultEither<Error, List<Direction<TreeNode>>>.newA (TraverserError.PATH_NOT_FOUND);
+		}
+
+
+		private List<Direction<TreeNode>> _goal( TreeNode _current, int _pos) {
+			Direction<TreeNode> d  = new InnerDirection<TreeNode> (_pos, _current);
+
+			List<Direction<TreeNode>> list = new List<Direction<TreeNode>> ();
+			List<Direction<TreeNode>> newList = list.addLast (d);
+
+			return newList;
+		}
+
+
+		private Either<Error, List<Direction<TreeNode>>> _accept(TreeNode _current, int _pos,Evaluator _evaluator)
+		{
+			Children chs = _current.getChildren ();
+			Either<Error, List<Direction<TreeNode>>> either = _traverse (chs, _evaluator, 0);
+			if (either.isA ()) {
+				return either;
+			}
+			List<Direction<TreeNode>> list = either.b ();
+			Direction<TreeNode> d = new InnerDirection<TreeNode> (_pos, _current);
+
+			List<Direction<TreeNode>> newList = list.addLast (d);
+			return DefaultEither<Error,List<Direction<TreeNode>>>.newB (newList);
+		}
+
+		public class InnerTraversal : Traversal{
+			IEnumerator<Direction<TreeNode>> iterable;
+			TreeNode destination;
+
+			IEnumerator IEnumerable.GetEnumerator()
+			{
+				return this.GetEnumerator();
+			}
+
+			public IEnumerator<Direction<TreeNode>> GetEnumerator()
+			{
+				return iterable;
+			}
+
+
+			public InnerTraversal(IEnumerator<Direction<TreeNode>> _iterable, TreeNode _distination){
+				this.iterable = _iterable;
+				this.destination = _distination;
+			}
+
+		
+			public TreeNode destinations() {
+				return destination;
+			}
+
+		}
+
+		public class InnerChildren : Children{
+			TreeNode root;
+			Evaluator evaluator;
+
+			public InnerChildren(TreeNode _root, Evaluator _evaluator){
+				this.root = _root;
+				this.evaluator = _evaluator;
+			}
+
+			public IEnumerator<TreeNode> iterator() {
+				List<TreeNode> list = new List<TreeNode> ();
+				return list.addLast (root).iterator ();
+			}
+
+			public int size() {
+				return 1;
+			}
+
+			public Either<Error, TreeNode> at(int _pos) {
+				if (_pos != 0) {
+					return DefaultEither<Error, TreeNode>.newA (NodeEditorError.INDEX_OUT_OF_BOUNDS);
+				}
+				return DefaultEither<Error, TreeNode>.newB (root);
+			}
+		}
+
+		public class InnerDirection<TreeNode> : Direction<TreeNode>{
+			int pos;
+			TreeNode current;
+
+			public InnerDirection(int _pos, TreeNode _current) {
+				this.pos = _pos;
+				this.current = _current;
+			}
+
+			public int getPosition() {
+				return pos;
+			}
+
+			public TreeNode getTarget(){
+				return current;
+			}
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/traverser/DefaultTraverser.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 980408d2be7e4244883b420492279cbe
+timeCreated: 1477164411
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/traverser/Direction.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,6 @@
+
+
+public interface Direction<T> {
+	int getPosition();
+	T getTarget();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/traverser/Direction.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 248dd0b79d0102b4d8167c0ccb05a947
+timeCreated: 1477164410
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/traverser/Evaluation.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,7 @@
+
+namespace JungleDB {
+	public interface Evaluation {
+		Result results();
+		Evaluator evaluators();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/traverser/Evaluation.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: baee26f02b32b294aba70808d6faf7db
+timeCreated: 1477164412
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/traverser/Evaluator.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,5 @@
+namespace JungleDB {
+	public interface Evaluator {
+		Evaluation evaluate (TreeNode _current, int _pos);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/traverser/Evaluator.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 29e3b76d4424592448f6f4a037863244
+timeCreated: 1477164410
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/traverser/InterfaceTraverser.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,39 @@
+
+namespace JungleDB {
+	public class InterfaceTraverser {
+		TreeNode root;
+		TreeMap<string, TreeMap<string, List<TreeNode>>> indexList;
+		ParentIndex parentIndex;
+		bool parentUpdateFlag;
+		bool useIndex;
+
+		public InterfaceTraverser(TreeNode root, bool indexFlag) 
+			: this (root, new TreeMap<string, TreeMap<string, List<TreeNode>>> (), new ParentIndex (), indexFlag)
+		{
+		}
+
+		public InterfaceTraverser(TreeNode root, TreeMap<string, TreeMap<string, List<TreeNode>>> index,
+			ParentIndex parentIndex, bool useIndex) {
+			this.root = root;
+			this.indexList = index;
+			this.parentIndex = parentIndex;
+			if (parentIndex.isEmpty())
+				parentUpdateFlag = true;
+			else
+				parentUpdateFlag = false;
+			this.useIndex = useIndex;
+		}
+
+		public TreeMap<string, TreeMap<string, List<TreeNode>>> getIndex() {
+			return indexList;
+		}
+
+		public void commit() {
+			parentUpdateFlag = false;
+		}
+
+		public ParentIndex getParentIndex() {
+			return parentIndex;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/traverser/InterfaceTraverser.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 6594043bbdc687a458a165dcf329f8cd
+timeCreated: 1477164411
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/traverser/Traversal.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,7 @@
+using System.Collections.Generic;
+
+namespace JungleDB {
+	public interface Traversal : IEnumerable<Direction<TreeNode>> {
+		TreeNode destinations();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/traverser/Traversal.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 2d031dbf23e4fa84cadaa70fe677af4c
+timeCreated: 1477164410
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/traverser/Traverser.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,7 @@
+
+namespace JungleDB {
+	public interface Traverser {
+		
+		Either<Error, Traversal> traverse ( TreeNode _root, Evaluator _evaluator);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/traverser/Traverser.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 8f73d79a1b5f0f44f8725b3e539850ee
+timeCreated: 1477164411
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/traverser/TraverserError.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,5 @@
+
+public class TraverserError {
+	public static Error UNDEFINED_OPERATOR = new DefaultError();
+	public static Error PATH_NOT_FOUND = new DefaultError();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/traverser/TraverserError.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 255979b1cc0bc4742893459d13a0ff41
+timeCreated: 1477164410
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/util.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: a80eabd5eda649b4f8a46d88e4ba8aa6
+folderAsset: yes
+timeCreated: 1477164409
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/util/DefaultEither.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,44 @@
+
+public class DefaultEither<A,B> : Either<A,B> {
+	private A theA;
+	private B theB;
+
+	private DefaultEither(A _theA, B _theB){
+		theA = _theA;
+		theB = _theB;
+	}
+
+	public static DefaultEither<A,B> newA(A _theA)
+	{
+		return new DefaultEither<A,B>(_theA,default(B));
+	}
+
+	public static DefaultEither<A,B> newB(B _theB)
+	{
+		return new DefaultEither<A,B>(default(A),_theB);
+	}
+		
+	public A a()
+	{
+		return theA;
+	}
+
+
+	public bool isA()
+	{
+		return theA != null;
+	}
+
+
+	public B b()
+	{
+		return theB;
+	}
+
+
+	public bool isB()
+	{
+		return theB != null;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/util/DefaultEither.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 08c0247d5d3a4ae4a8512ec60da56d38
+timeCreated: 1477164410
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/util/DefaultError.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,5 @@
+
+
+public class DefaultError : Error {
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/util/DefaultError.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 59855795de1cb2348a2ee6c8eabfbc79
+timeCreated: 1477164411
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/util/Either.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,7 @@
+
+public interface Either<A,B> {	
+	A a();
+	bool isA();
+	B b();
+	bool isB();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/util/Either.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 9ef9a184c843f6b46b792ba58213e0d6
+timeCreated: 1477164412
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/util/Error.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,4 @@
+
+public interface Error {
+	
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/util/Error.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: a4549be06075cc24b80e1b9741aea977
+timeCreated: 1477164412
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/util/GetOldTreeError.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,4 @@
+
+public class GetOldTreeError : Error {
+	public static Error OLD_TREE_NOT_FOUND = new DefaultError();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/util/GetOldTreeError.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: cb38025bf67dd914ebcb1f60b0cc46c8
+timeCreated: 1477164412
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/util/IterableConverter.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,79 @@
+using UnityEngine;
+using System.Collections.Generic;
+using System.Collections;
+using System;
+
+public class IterableConverter<A,B> : IEnumerable<A> {
+	private IEnumerable<B> iterable;
+	private Converter<A,B> converter;
+
+
+	IEnumerator IEnumerable.GetEnumerator()
+	{
+		// call the generic version of the method
+		return this.GetEnumerator();
+	}
+
+	public IEnumerator<A> GetEnumerator()
+	{
+		return iterator ();
+	}
+
+	public IterableConverter(IEnumerable<B> _iterable,Converter<A,B> _converter)
+	{
+		iterable = _iterable;
+		converter = _converter;
+	}
+
+	public IEnumerator<A> iterator()
+	{
+		return new IteratorConverter<A,B>(iterable.GetEnumerator(),converter);
+	}
+
+	private class IteratorConverter<A,B> : IEnumerator<A>
+	{
+		public List<A> appLines { get; set; }
+
+		private IEnumerator<B> iterator;
+		private Converter<A,B> converter;
+
+		public IteratorConverter(IEnumerator<B> _iterator,Converter<A,B> _converter)
+		{
+			iterator = _iterator;
+			converter = _converter;
+		}
+
+		public bool MoveNext()
+		{
+			return iterator.MoveNext();
+		}
+
+		public A Current
+		{
+			get{
+				return converter.conv (iterator.Current);
+			}
+		}
+
+		public void Reset()
+		{
+			// ホントはremove?
+			iterator.Reset();
+		}
+
+		object IEnumerator.Current
+		{
+			get { return appLines; }
+		}
+
+		public void Dispose() {
+			((IEnumerator<A>)this.appLines).Dispose ();
+		}
+	}
+
+
+	public interface Converter<A,B>{
+		A conv (B _b);
+	}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/util/IterableConverter.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 161d593d0659680458539ede6f5c5306
+timeCreated: 1477164410
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/util/Pair.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,21 @@
+using UnityEngine;
+using System.Collections;
+
+public class Pair<L, R> {
+	private L left;
+	private R right;
+
+	public Pair(L _left,R _right){
+		left = _left;
+		right = _right;
+	}
+	// not same name , add s.
+	public L lefts(){
+		return left;
+	}
+
+	public R rights(){
+		return right;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-main/util/Pair.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: bff6c747cbf39ba4f9b21adbe6d7f8b3
+timeCreated: 1477164412
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-network.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 257471bdf6283da4f8601b67642836c1
+folderAsset: yes
+timeCreated: 1477166756
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-network/core.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 3dd684c0892edc5489f868ab6ce99761
+folderAsset: yes
+timeCreated: 1477166842
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-network/core/NetworkDefaultJungle.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,76 @@
+using UnityEngine;
+using System.Collections;
+using System.Collections.Generic;
+namespace JungleDB {
+	public class NetworkDefaultJungle : Jungle {
+
+		private Journal Journal;
+		private TreeMap<string, JungleTree> Trees;
+		private string Uuid;
+		private TreeEditor Editor;
+
+		public NetworkDefaultJungle(Journal jou, string uid, TreeEditor edit) {
+			this.Journal = jou;
+			this.Trees   = new TreeMap<string, JungleTree>();
+			this.Uuid    = uid;
+			this.Editor  = edit;
+		}
+
+		public JungleTree getTreeByName (string name) {
+			return Trees.get(name);
+		}
+
+		public JungleTree createNewTree(string name) {
+			ChangeList list  = new InnerChangeList(this.Uuid, name);
+			TreeNode root                = new DefaultTreeNode();
+			InterfaceTraverser traverser = new InterfaceTraverser(root, true);
+			TreeContext tc               = new DefaultTreeContext(root, null, list, this.Uuid, name, 0, traverser);
+			JungleTree newTree = new NetworkDefaultJungleTree(name, tc, this.Uuid, Journal.getWriter(), this.Editor);
+			if (Trees.put(name, newTree) != null) {
+				return null;
+			}
+			return newTree;
+		}
+
+
+		public class InnerChangeList : ChangeList {
+
+			string uuid;
+			string name;
+
+
+			IEnumerator IEnumerable.GetEnumerator()
+			{
+				return this.GetEnumerator();
+			}
+
+			public IEnumerator<TreeOperation> GetEnumerator()
+			{
+				return iterator ();
+			}
+
+			// construct
+			public InnerChangeList(string _uuid, string _name) {
+				this.uuid = _uuid;
+				this.name = _name;
+			}
+
+			public IEnumerator<TreeOperation> iterator() {
+				List<TreeOperation> nil = new List<TreeOperation>();
+				return nil.iterator();
+			}
+
+			public string uuids() {
+				return uuid;
+			}
+
+			public string getTreeName() {
+				return name;
+			}
+
+			public TreeOperationLog getLog() {
+				return new DefaultTreeOperationLog();
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-network/core/NetworkDefaultJungle.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: b6fbf0bfbabbed14394a802eed9536b0
+timeCreated: 1477166885
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-network/operations.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: f3af5df6fded0474cad06f101e72c8d9
+folderAsset: yes
+timeCreated: 1477166767
+licenseType: Free
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-network/operations/NetworkAppendChildAtOperation.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,37 @@
+using UnityEngine;
+using System.Collections;
+
+namespace JungleDB {
+	public class NetworkAppendChildAtOperation : NodeOperation {
+
+		private int Position;
+
+		public NetworkAppendChildAtOperation() {
+			this.Position = -2;
+		}
+
+		public NetworkAppendChildAtOperation(int pos){
+			this.Position = pos;
+		}
+
+		public Command getCommand() {
+			return Command.APPEND_CHILD;
+		}
+
+		public Either<Error, TreeNode> invoke (TreeNode target) {
+			return target.getChildren().addNewChildAt(this.Position);
+		}
+
+		public int getPosition () {
+			return this.Position;
+		}
+
+		public string getKey() {
+			return null;
+		}
+
+		public byte[] getValue() {
+			return null;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-network/operations/NetworkAppendChildAtOperation.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 05852e6f2f412224c891d37b9a7185bf
+timeCreated: 1477182695
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-network/operations/NetworkDeleteAttributeOperation.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,37 @@
+using UnityEngine;
+using System.Collections;
+
+namespace JungleDB {
+	public class NetworkDeleteAttributeOperation : NodeOperation {
+
+		private string Key;
+
+		public NetworkDeleteAttributeOperation() {
+			this.Key = null;
+		}
+
+		public NetworkDeleteAttributeOperation(string key){
+			this.Key = key;
+		}
+
+		public Command getCommand() {
+			return Command.DELETE_ATTRIBUTE;
+		}
+
+		public Either<Error, TreeNode> invoke (TreeNode target) {
+			return target.getAttributes().delete(this.Key);
+		}
+
+		public int getPosition () {
+			return -1;
+		}
+
+		public string getKey() {
+			return this.Key;
+		}
+
+		public byte[] getValue() {
+			return null;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-network/operations/NetworkDeleteAttributeOperation.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: c6b7b0ce1247c5d40ad6983fc512536b
+timeCreated: 1477182724
+licenseType: Free
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-network/operations/NetworkDeleteChildAtOperation.cs	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,37 @@
+using UnityEngine;
+using System.Collections;
+
+namespace JungleDB {
+	public class NetworkDeleteChildAtOperation : NodeOperation {
+
+		private int Position;
+
+		public NetworkDeleteChildAtOperation () {
+
+		}
+
+		public NetworkDeleteChildAtOperation(int pos) {
+			this.Position = pos;
+		}
+
+		public Command getCommand () {
+			return Command.DELETE_CHILD;
+		}
+
+		public Either<Error, TreeNode> invoke (TreeNode target) {
+			return target.getChildren().deleteChildAt(this.Position);
+		}
+
+		public int getPosition () {
+			return this.Position;
+		}
+
+		public string getKey() {
+			return null;
+		}
+
+		public byte[] getValue () {
+			return null;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Main/jungle-network/operations/NetworkDeleteChildAtOperation.cs.meta	Thu Dec 15 22:52:48 2016 +0900
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: b4f092420abfa1145a4690ba2d67bef4
+timeCreated: 1477182761
+li