From f778b4ad66a9feb05043645660de9b6c76ae46e4 Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期五, 12 九月 2025 12:49:27 +0800
Subject: [PATCH] 0312 热更打包

---
 Assets/Editor/Tool/UpdateAssetBundleName.cs                                              |  317 
 Assets/Editor/AssetBundleBrowser/InspectTab/InspectSingleBundle.cs.meta                  |   12 
 Assets/Editor/AssetBundleBrowser/AssetBundleModel/ABModelBundleInfo.cs.meta              |   12 
 Assets/Editor/AssetBundleBrowser/InspectTab/AssetBundleInspectTab.cs.meta                |   12 
 Assets/Editor/Tool/TableTool.cs                                                          |   63 
 Assets/HybridCLRGenerate/link.xml.meta                                                   |    7 
 Assets/Editor/AssetBundleBrowser/AssetBundleDataSource/AssetDatabaseABDataSource.cs      |   85 
 Assets/Editor/AssetBundleBrowser/MessageList.cs                                          |  120 
 Assets/Editor/AssetBundleBrowser/BundleDetailList.cs                                     |  173 
 Assets/Editor/AssetBundleBrowser/InspectTab/InspectTreeView.cs                           |  111 
 Assets/Editor/AssetBundleBrowser/AssetBundleBuildTab.cs                                  | 1209 ++++++
 Assets/Editor/AssetBundleBrowser/MessageSystem.cs                                        |  198 +
 Assets/Editor/Tool/AssetBundleBuildTool.cs.meta                                          |   11 
 Assets/Resources/VersionConfig.asset                                                     |   30 
 Assets/Editor/AssetBundleBrowser/AssetBundleTree.cs.meta                                 |   12 
 Assets/HybridCLRGenerate/link.xml                                                        |  501 ++
 Assets/Editor/AssetBundleBrowser/AssetBundleBuildTab.cs.meta                             |   12 
 Assets/Editor/AssetBundleBrowser/AssetBundleModel/ABModelAssetInfo.cs.meta               |   12 
 Assets/Editor/Tool/ClientPackage.cs.meta                                                 |   11 
 Assets/Editor/AssetBundleBrowser/AssetBundleDataSource.meta                              |    9 
 Assets/Editor/AssetBundleBrowser/BundleDetailList.cs.meta                                |   12 
 Assets/Editor/Logo/wgyx/TB_DL_Logo.png                                                   |    0 
 Assets/Editor/AssetBundleBrowser/InspectTab/AssetBundleInspectTab.cs                     |  237 +
 Assets/Editor/Tool/BuiltInResourceSetting.cs.meta                                        |   11 
 Assets/Editor/AssetBundleBrowser/Icons/ABundleBrowserIconY1756Basic.png.meta             |   68 
 Assets/Editor/AssetBundleBrowser/AssetBundleManageTab.cs                                 |  254 +
 Assets/Editor/Tool/AssetsVersionCmpMaker.cs                                              |   63 
 Assets/Editor/Tool/AssetsVersionMaker.cs                                                 |   54 
 Assets/Editor/AssetBundleBrowser/AssetListTree.cs                                        |  444 ++
 Assets/Editor/AssetBundleBrowser/AssetBundleModel/ABModelBundleInfo.cs                   |  964 +++++
 Assets/Editor/Logo.meta                                                                  |    8 
 Assets/Editor/AssetBundleBrowser/AssetBundleDataSource/ABDataSourceProvider.cs.meta      |   12 
 Assets/Editor/Logo/wgyx/TB_DL_Logo.png.meta                                              |  127 
 Assets/Editor/Tool/ClientPackage_Standalone.cs                                           |  454 ++
 ProjectSettings/ProjectSettings.asset                                                    |    2 
 Assets/Editor/AssetBundleBrowser/AssetBundleBrowserMain.cs.meta                          |   12 
 Assets/Editor/Tool/AssetBundleBuildExtersion.cs.meta                                     |   11 
 Assets/Editor/Tool/BuildExtersion.cs.meta                                                |   11 
 Assets/Editor/Logo/wgyx/SplashImage.png                                                  |    0 
 Assets/Editor/AssetBundleBrowser.meta                                                    |    8 
 Assets/Editor/AssetBundleBrowser/AssetBundleDataSource/ABDataSource.cs                   |   33 
 Assets/Editor/AssetBundleBrowser/AssetBundleModel/ABModel.cs                             |  773 ++++
 Assets/Editor/Logo/wgyx.meta                                                             |    8 
 Assets/Editor/AssetBundleBrowser/Icons/ABundleBrowserIconY1756Basic.png                  |    0 
 Assets/Editor/AssetBundleBrowser/Icons/ABundleBrowserIconY1756Scene.png.meta             |   68 
 Assets/Editor/AssetBundleBrowser/Icons/ABundleBrowserIconY1756Scene.png                  |    0 
 Assets/Editor/Tool/BuiltInResourceSetting.cs                                             |  174 
 Assets/Editor/Tool/ClientPackageExtension.cs                                             |  115 
 Assets/Editor/VersionConfigs/Versions.txt                                                |    3 
 Assets/Editor/AssetBundleBrowser/MessageSystem.cs.meta                                   |   12 
 Assets/Editor/AssetBundleBrowser/MessageList.cs.meta                                     |   12 
 Assets/Editor/AssetBundleBrowser/InspectTab/InspectTreeView.cs.meta                      |   12 
 Assets/Editor/VersionConfigs/Versions.txt.meta                                           |    8 
 Assets/Editor/Logo/wgyx/SplashImage.png.meta                                             |  127 
 Assets/Editor/AssetBundleBrowser/AssetBundleBrowserMain.cs                               |  222 +
 Assets/Editor/Logo/wgyx/Icon.png.meta                                                    |   92 
 Assets/Editor/AssetBundleBrowser/AssetBundleDataSource/ABDataSourceProvider.cs           |   42 
 Assets/Editor/AssetBundleBrowser/AssetBundleModel/ABModel.cs.meta                        |   12 
 Assets/Editor/AssetBundleBrowser/AssetBundleModel.meta                                   |    9 
 Assets/Editor/Tool/AssetBundleBuildTool.cs                                               |   52 
 Assets/Editor/Tool/ClientPackageExtension.cs.meta                                        |   11 
 Assets/Editor/Tool/AssetsVersionCmpMaker.cs.meta                                         |   11 
 Assets/Editor/Tool/BytesVersionMaker.cs                                                  |   46 
 Assets/HybridCLRGenerate/AOTGenericReferences.cs                                         | 1390 +++++++
 Assets/Resources/VersionConfigEx.txt                                                     |    2 
 Assets/Editor/AssetBundleBrowser/AssetBundleManageTab.cs.meta                            |   12 
 Assets/Editor/AssetBundleBrowser/AssetBundleModel/ABModelAssetInfo.cs                    |  228 +
 Assets/Editor/AssetBundleBrowser/Icons.meta                                              |    9 
 Assets/Editor/AssetBundleBrowser/AssetBundleDataSource/AssetDatabaseABDataSource.cs.meta |   12 
 Assets/Editor/Tool/ClientPackage_Standalone.cs.meta                                      |   11 
 Assets/Editor/AssetBundleBrowser/InspectTab.meta                                         |    9 
 Assets/Editor/Tool/ClientPackage.cs                                                      |  782 ++++
 Assets/HybridCLRGenerate.meta                                                            |    8 
 Assets/Editor/AssetBundleBrowser/InspectTab/InspectSingleBundle.cs                       |   84 
 Assets/HybridCLRGenerate/AOTGenericReferences.cs.meta                                    |   11 
 Assets/Editor/Tool/BytesVersionMaker.cs.meta                                             |   11 
 Assets/Editor/Logo/wgyx/Icon.png                                                         |    0 
 Assets/Editor/Tool/AssetBundleBuildExtersion.cs                                          |  146 
 Assets/Editor/AssetBundleBrowser/AssetBundleDataSource/ABDataSource.cs.meta              |   12 
 Assets/Editor/Tool/BuildExtersion.cs                                                     |  309 +
 Assets/Editor/VersionConfigs.meta                                                        |    8 
 Assets/Editor/AssetBundleBrowser/AssetBundleTree.cs                                      |  638 +++
 Assets/Editor/Tool/TableTool.cs.meta                                                     |   11 
 Assets/Editor/AssetBundleBrowser/AssetListTree.cs.meta                                   |   12 
 Assets/Editor/Tool/AssetsVersionMaker.cs.meta                                            |   11 
 85 files changed, 11,023 insertions(+), 204 deletions(-)

diff --git a/Assets/Editor/AssetBundleBrowser.meta b/Assets/Editor/AssetBundleBrowser.meta
new file mode 100644
index 0000000..15d1bd9
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: f94afd546c58e794a96b426cd811ff8b
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/AssetBundleBrowser/AssetBundleBrowserMain.cs b/Assets/Editor/AssetBundleBrowser/AssetBundleBrowserMain.cs
new file mode 100644
index 0000000..46b26a4
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/AssetBundleBrowserMain.cs
@@ -0,0 +1,222 @@
+using System.Collections.Generic;
+using UnityEditor;
+using UnityEditor.IMGUI.Controls;
+
+namespace UnityEngine.AssetBundles
+{
+
+    public class AssetBundleBrowserMain : EditorWindow, IHasCustomMenu
+    {
+
+        public const float kButtonWidth = 150;
+
+        enum Mode
+        {
+            Browser,
+            Builder,
+            Inspect,
+        }
+        [SerializeField]
+        Mode m_Mode;
+
+        [SerializeField]
+        public AssetBundleManageTab m_ManageTab;
+
+        [SerializeField]
+        public AssetBundleBuildTab m_BuildTab;
+
+        [SerializeField]
+        public AssetBundleInspectTab m_InspectTab;
+
+        private Texture2D m_RefreshTexture;
+
+        const float k_ToolbarPadding = 15;
+        const float k_MenubarPadding = 32;
+
+        [MenuItem("Tools/AssetBundle Browser", priority = 2050)]
+        static void ShowWindow()
+        {
+            var window = GetWindow<AssetBundleBrowserMain>();
+            window.titleContent = new GUIContent("AssetBundles");
+            window.Show();
+        }
+
+        [SerializeField]
+        public bool multiDataSource = false;
+        public virtual void AddItemsToMenu(GenericMenu menu)
+        {
+            //menu.AddSeparator(string.Empty);
+            menu.AddItem(new GUIContent("Custom Sources"), multiDataSource, FlipDataSource);
+        }
+        public void FlipDataSource()
+        {
+            multiDataSource = !multiDataSource;
+        }
+
+        private void OnEnable()
+        {
+
+            Rect subPos = GetSubWindowArea();
+            if(m_ManageTab == null)
+                m_ManageTab = new AssetBundleManageTab();
+            m_ManageTab.OnEnable(subPos, this);
+            if(m_BuildTab == null)
+                m_BuildTab = new AssetBundleBuildTab();
+            m_BuildTab.OnEnable(subPos, this);
+            if (m_InspectTab == null)
+                m_InspectTab = new AssetBundleInspectTab();
+            m_InspectTab.OnEnable(subPos, this);
+
+            m_RefreshTexture = EditorGUIUtility.FindTexture("Refresh");
+
+
+            //determine if we are "multi source" or not...
+            multiDataSource = false;
+            List<System.Type> types = AssetBundleDataSource.ABDataSourceProviderUtility.CustomABDataSourceTypes;
+            if (types.Count > 1)
+                multiDataSource = true;
+        }
+        private void OnDisable()
+        {
+            if (m_BuildTab != null)
+                m_BuildTab.OnDisable();
+            if (m_InspectTab != null)
+                m_InspectTab.OnDisable();
+        }
+
+        private Rect GetSubWindowArea()
+        {
+            float padding = k_MenubarPadding;
+            if (multiDataSource)
+                padding += k_MenubarPadding * 0.5f;
+            Rect subPos = new Rect(0, padding, position.width, position.height - padding);
+            return subPos;
+        }
+
+        private void Update()
+        {
+            switch (m_Mode)
+            {
+                case Mode.Builder:
+                    break;
+                case Mode.Inspect:
+                    break;
+                case Mode.Browser:
+                default:
+                    m_ManageTab.Update();
+                    break;
+            }
+        }
+
+        private void OnGUI()
+        {
+            ModeToggle();
+
+            switch(m_Mode)
+            {
+                case Mode.Builder:
+                    m_BuildTab.OnGUI(GetSubWindowArea());
+                    break;
+                case Mode.Inspect:
+                    m_InspectTab.OnGUI(GetSubWindowArea());
+                    break;
+                case Mode.Browser:
+                default:
+                    m_ManageTab.OnGUI(GetSubWindowArea());
+                    break;
+            }
+        }
+
+        void ModeToggle()
+        {
+            GUILayout.BeginHorizontal();
+            GUILayout.Space(k_ToolbarPadding);
+            bool clicked = false;
+            switch(m_Mode)
+            {
+                case Mode.Browser:
+                    clicked = GUILayout.Button(m_RefreshTexture);
+                    if (clicked)
+                        m_ManageTab.ForceReloadData();
+                    break;
+                case Mode.Builder:
+                    GUILayout.Space(m_RefreshTexture.width + k_ToolbarPadding);
+                    break;
+                case Mode.Inspect:
+                    clicked = GUILayout.Button(m_RefreshTexture);
+                    if (clicked)
+                        m_InspectTab.RefreshBundles();
+                    break;
+            }
+
+            float toolbarWidth = position.width - k_ToolbarPadding * 4 - m_RefreshTexture.width;
+            //string[] labels = new string[2] { "Configure", "Build"};
+            string[] labels = new string[3] { "Configure", "Build", "Inspect" };
+            m_Mode = (Mode)GUILayout.Toolbar((int)m_Mode, labels, "LargeButton", GUILayout.Width(toolbarWidth) );
+            GUILayout.FlexibleSpace();
+            GUILayout.EndHorizontal();
+            if(multiDataSource)
+            {
+                //GUILayout.BeginArea(r);
+                GUILayout.BeginHorizontal();
+
+                using (new EditorGUILayout.HorizontalScope(EditorStyles.toolbar))
+                {
+                    GUILayout.Label("Bundle Data Source:");
+                    GUILayout.FlexibleSpace();
+                    var c = new GUIContent(string.Format("{0} ({1})", AssetBundleModel.Model.DataSource.Name, AssetBundleModel.Model.DataSource.ProviderName), "Select Asset Bundle Set");
+                    if (GUILayout.Button(c , EditorStyles.toolbarPopup) )
+                    {
+                        GenericMenu menu = new GenericMenu();
+                        bool firstItem = true;
+
+                        foreach (var info in AssetBundleDataSource.ABDataSourceProviderUtility.CustomABDataSourceTypes)
+                        {
+                            List<AssetBundleDataSource.ABDataSource> dataSourceList = null;
+                            dataSourceList = info.GetMethod("CreateDataSources").Invoke(null, null) as List<AssetBundleDataSource.ABDataSource>;
+                        
+
+                            if (dataSourceList == null)
+                                continue;
+
+                            if (!firstItem)
+                            {
+                                menu.AddSeparator("");
+                            }
+
+                            foreach (var ds in dataSourceList)
+                            {
+                                menu.AddItem(new GUIContent(string.Format("{0} ({1})", ds.Name, ds.ProviderName)), false,
+                                    () =>
+                                    {
+                                        var thisDataSource = ds;
+                                        AssetBundleModel.Model.DataSource = thisDataSource;
+                                        m_ManageTab.ForceReloadData();
+                                    }
+                                );
+                            }
+
+                            firstItem = false;
+                        }
+
+                        menu.ShowAsContext();
+                    }
+
+                    GUILayout.FlexibleSpace();
+                    if (AssetBundleModel.Model.DataSource.IsReadOnly())
+                    {
+                        GUIStyle tbLabel = new GUIStyle(EditorStyles.toolbar);
+                        tbLabel.alignment = TextAnchor.MiddleRight;
+
+                        GUILayout.Label("Read Only", tbLabel);
+                    }
+                }
+
+                GUILayout.EndHorizontal();
+                //GUILayout.EndArea();
+            }
+        }
+
+
+    }
+}
\ No newline at end of file
diff --git a/Assets/Editor/AssetBundleBrowser/AssetBundleBrowserMain.cs.meta b/Assets/Editor/AssetBundleBrowser/AssetBundleBrowserMain.cs.meta
new file mode 100644
index 0000000..73ae227
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/AssetBundleBrowserMain.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 6783bbbd420e56a40b6b1b4f3edbd7d5
+timeCreated: 1499908886
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/AssetBundleBrowser/AssetBundleBuildTab.cs b/Assets/Editor/AssetBundleBrowser/AssetBundleBuildTab.cs
new file mode 100644
index 0000000..2d7b779
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/AssetBundleBuildTab.cs
@@ -0,0 +1,1209 @@
+using UnityEditor;
+using UnityEditor.IMGUI.Controls;
+using System.Collections.Generic;
+using System.IO;
+using System.Runtime.Serialization.Formatters.Binary;
+
+using UnityEngine.AssetBundles.AssetBundleDataSource;
+using Assets.Editor.Tool;
+using HybridCLR.Editor.Commands;
+using HybridCLR.Editor.Settings;
+//using Mono.Cecil;
+using DG.Tweening.Plugins.Core.PathCore;
+using System;
+using Path = System.IO.Path;
+using HybridCLR.Editor.HotUpdate;
+using HybridCLR.Editor;
+using System.Text;
+
+namespace UnityEngine.AssetBundles
+{
+    [System.Serializable]
+    public class AssetBundleBuildTab
+    {
+        const string k_BuildPrefPrefix = "ABBBuild:";
+        // gui vars
+        //[SerializeField]
+        //private ValidBuildTarget m_BuildTarget = ValidBuildTarget.StandaloneWindows;
+        //[SerializeField]
+        //private CompressOptions m_Compression = CompressOptions.StandardCompression;        
+        //private string m_OutputPath = string.Empty;
+        //[SerializeField]
+        //private bool m_UseDefaultPath = true;
+        private string m_streamingPath
+        {
+            get
+            {
+                switch (m_UserData.m_BuildTarget)
+                {
+                    case ValidBuildTarget.Android:
+                        return StringUtility.Contact("Assets/StreamingAssets", "/android");
+                    case ValidBuildTarget.iOS:
+                        return StringUtility.Contact("Assets/StreamingAssets", "/ios");
+                    case ValidBuildTarget.StandaloneWindows:
+                    case ValidBuildTarget.StandaloneWindows64:
+                        return StringUtility.Contact("Assets/StreamingAssets", "/standalone");
+                    default:
+                        return "Assets/StreamingAssets";
+                }
+            }
+        }
+
+        [SerializeField]
+        private bool m_AdvancedSettings;
+
+        [SerializeField]
+        private Vector2 m_ScrollPosition;
+
+
+        class ToggleData
+        {
+            public ToggleData(bool s,
+                string title,
+                string tooltip,
+                List<string> onToggles,
+                BuildAssetBundleOptions opt = BuildAssetBundleOptions.None)
+            {
+                if (onToggles.Contains(title))
+                    state = true;
+                else
+                    state = s;
+                content = new GUIContent(title, tooltip);
+                option = opt;
+            }
+            //public string prefsKey
+            //{ get { return k_BuildPrefPrefix + content.text; } }
+            public bool state;
+            public GUIContent content;
+            public BuildAssetBundleOptions option;
+        }
+
+        [SerializeField]
+        private BuildTabData m_UserData;
+
+        [SerializeField] int m_Version;
+
+        public string ApkOutputPath
+        {
+            get { return LocalSave.GetString("APKOutPutPath"); }
+            set { LocalSave.SetString("APKOutPutPath", value); }
+        }
+
+        string m_Publishers;
+        public string publishers
+        {
+            get { return LocalSave.GetString("APKPublishers"); }
+            set {
+                if (m_Publishers != value)
+                { 
+                    LocalSave.SetString("APKPublishers", value);
+                    m_Publishers = value;
+                    SetVersionConfig(m_Publishers);
+                }
+            }
+        }
+
+        List<ToggleData> m_ToggleData;
+        ToggleData m_ForceRebuild;
+        ToggleData m_CopyToStreaming;
+        GUIContent m_TargetContent;
+        GUIContent m_CompressionContent;
+        public enum CompressOptions
+        {
+            Uncompressed = 0,
+            StandardCompression,
+            ChunkBasedCompression,
+        }
+        GUIContent[] m_CompressionOptions =
+        {
+            new GUIContent("No Compression"),
+            new GUIContent("Standard Compression (LZMA)"),
+            new GUIContent("Chunk Based Compression (LZ4)")
+        };
+        int[] m_CompressionValues = { 0, 1, 2 };
+
+        int rechargeSkin = 1;
+        string createRoleLevel = "001";
+
+        public AssetBundleBuildTab()
+        {
+            m_AdvancedSettings = false;
+            m_UserData = new BuildTabData();
+            m_UserData.m_OnToggles = new List<string>();
+            m_UserData.m_UseDefaultPath = true;
+        }
+
+        public void OnDisable()
+        {
+            var dataPath = System.IO.Path.GetFullPath(".");
+            dataPath = dataPath.Replace("\\", "/");
+            dataPath += "/Library/AssetBundleBrowserBuild.dat";
+
+            BinaryFormatter bf = new BinaryFormatter();
+            FileStream file = File.Create(dataPath);
+
+            bf.Serialize(file, m_UserData);
+            file.Close();
+
+        }
+        public void OnEnable(Rect pos, EditorWindow parent)
+        {
+
+            //LoadData...
+            var dataPath = System.IO.Path.GetFullPath(".");
+            dataPath = dataPath.Replace("\\", "/");
+            dataPath += "/Library/AssetBundleBrowserBuild.dat";
+
+            if (File.Exists(dataPath))
+            {
+                BinaryFormatter bf = new BinaryFormatter();
+                FileStream file = File.Open(dataPath, FileMode.Open);
+                var data = bf.Deserialize(file) as BuildTabData;
+                if (data != null)
+                    m_UserData = data;
+                file.Close();
+            }
+
+            m_ToggleData = new List<ToggleData>();
+            m_ToggleData.Add(new ToggleData(
+                false,
+                "Exclude Type Information",
+                "涓嶅寘鍚被鍨嬩俊鎭�傚彂甯僿eb骞冲彴鏃讹紝涓嶈兘浣跨敤璇ラ�夐」銆�",
+                m_UserData.m_OnToggles,
+                BuildAssetBundleOptions.DisableWriteTypeTree));
+            m_ToggleData.Add(new ToggleData(
+                false,
+                "Force Rebuild",
+                "寮哄埗閲嶆柊build鎵�鏈塧b鍖呫��",
+                m_UserData.m_OnToggles,
+                BuildAssetBundleOptions.ForceRebuildAssetBundle));
+            m_ToggleData.Add(new ToggleData(
+                false,
+                "Ignore Type Tree Changes",
+                "蹇界暐typetree鐨勫彉鍖栵紝涓嶈兘涓嶥isableWriteTypeTree鍚屾椂浣跨敤銆�",
+                m_UserData.m_OnToggles,
+                BuildAssetBundleOptions.IgnoreTypeTreeChanges));
+            m_ToggleData.Add(new ToggleData(
+                false,
+                "Append Hash",
+                "闄勫姞hash鍒癮ssetbundle鍚嶅瓧涓��",
+                m_UserData.m_OnToggles,
+                BuildAssetBundleOptions.AppendHashToAssetBundleName));
+            m_ToggleData.Add(new ToggleData(
+                false,
+                "Strict Mode",
+                "浣跨敤涓ユ牸妯″紡build ab, 鏈変换浣曢潪鑷村懡鐨別rror閮戒笉浼歜uild鎴愬姛銆�",
+                m_UserData.m_OnToggles,
+                BuildAssetBundleOptions.StrictMode));
+            m_ToggleData.Add(new ToggleData(
+                false,
+                "Dry Run Build",
+                "Do a dry run build.",
+                m_UserData.m_OnToggles,
+                BuildAssetBundleOptions.DryRunBuild));
+
+
+            m_ForceRebuild = new ToggleData(
+                false,
+                "Rebuild",
+                "閫変腑鍚庝細娓呯┖鎵�鏈夋棫鐨勮祫婧愶紝鍏ㄩ儴閲嶆柊鎵撳寘锛堝缓璁祴璇曟椂涓嶅嬀閫夊彲鍔犲揩鎵撳寘閫熷害锛�",
+                m_UserData.m_OnToggles);
+            m_CopyToStreaming = new ToggleData(
+                false,
+                "Copy to StreamingAssets",
+                "璧勬簮鎵撳寘瀹屾垚鍚庯紝浼氬皢鎵�鏈夎祫婧愭嫹璐濊嚦锛�" + m_streamingPath + " for use in stand-alone player.",
+                m_UserData.m_OnToggles);
+
+            m_TargetContent = new GUIContent("Build Target", "Choose target platform to build for.");
+            m_CompressionContent = new GUIContent("Compression", "Choose no compress, standard (LZMA), or chunk based (LZ4)");
+
+            if (m_UserData.m_UseDefaultPath)
+            {
+                ResetPathToDefault();
+            }
+        }
+
+        private static void SetVersionConfig(string _publisher)
+        {
+            var versionName = string.Empty;
+            var fromVersionConfig = ClientPackage.GetVersionConfig(_publisher, out versionName);
+
+            var versionConfig = VersionConfig.Get();
+
+            VersionConfig.Copy(fromVersionConfig, versionConfig);
+
+            EditorUtility.SetDirty(versionConfig);
+        }
+
+        public void OnGUI(Rect pos)
+        {
+            m_ScrollPosition = EditorGUILayout.BeginScrollView(m_ScrollPosition);
+            bool newState = false;
+            var centeredStyle = GUI.skin.GetStyle("Label");
+            centeredStyle.alignment = TextAnchor.UpperCenter;
+            GUILayout.Label(new GUIContent("Example build setup"), centeredStyle);
+            //basic options
+            EditorGUILayout.Space();
+            GUILayout.BeginVertical();
+
+            // build target
+            using (new EditorGUI.DisabledScope(!AssetBundleModel.Model.DataSource.CanSpecifyBuildTarget))
+            {
+                ValidBuildTarget tgt = (ValidBuildTarget)EditorGUILayout.EnumPopup(m_TargetContent, m_UserData.m_BuildTarget);
+                if (tgt != m_UserData.m_BuildTarget)
+                {
+                    m_UserData.m_BuildTarget = tgt;
+                    if (m_UserData.m_UseDefaultPath)
+                    {
+                        m_UserData.m_OutputPath = "AssetBundles/";
+                        m_UserData.m_OutputPath += m_UserData.m_BuildTarget.ToString();
+                        //EditorUserBuildSettings.SetPlatformSettings(EditorUserBuildSettings.activeBuildTarget.ToString(), "AssetBundleOutputPath", m_OutputPath);
+                    }
+                }
+            }
+
+
+            ////output path
+            using (new EditorGUI.DisabledScope(!AssetBundleModel.Model.DataSource.CanSpecifyBuildOutputDirectory))
+            {
+                EditorGUILayout.Space();
+                GUILayout.BeginHorizontal();
+                var newPath = EditorGUILayout.TextField("Output Path", m_UserData.m_OutputPath);
+                if ((newPath != m_UserData.m_OutputPath) &&
+                     (newPath != string.Empty))
+                {
+                    m_UserData.m_UseDefaultPath = false;
+                    m_UserData.m_OutputPath = newPath;
+                    //EditorUserBuildSettings.SetPlatformSettings(EditorUserBuildSettings.activeBuildTarget.ToString(), "AssetBundleOutputPath", m_OutputPath);
+                }
+                GUILayout.EndHorizontal();
+                GUILayout.BeginHorizontal();
+                GUILayout.FlexibleSpace();
+                if (GUILayout.Button("Browse", GUILayout.MaxWidth(75f)))
+                    BrowseForFolder();
+                if (GUILayout.Button("Reset", GUILayout.MaxWidth(75f)))
+                    ResetPathToDefault();
+                //if (string.IsNullOrEmpty(m_OutputPath))
+                //    m_OutputPath = EditorUserBuildSettings.GetPlatformSettings(EditorUserBuildSettings.activeBuildTarget.ToString(), "AssetBundleOutputPath");
+                GUILayout.EndHorizontal();
+                EditorGUILayout.Space();
+
+                newState = GUILayout.Toggle(
+                    m_ForceRebuild.state,
+                    m_ForceRebuild.content);
+                if (newState != m_ForceRebuild.state)
+                {
+                    if (newState)
+                        m_UserData.m_OnToggles.Add(m_ForceRebuild.content.text);
+                    else
+                        m_UserData.m_OnToggles.Remove(m_ForceRebuild.content.text);
+                    m_ForceRebuild.state = newState;
+                }
+                newState = GUILayout.Toggle(
+                    m_CopyToStreaming.state,
+                    m_CopyToStreaming.content);
+                if (newState != m_CopyToStreaming.state)
+                {
+                    if (newState)
+                        m_UserData.m_OnToggles.Add(m_CopyToStreaming.content.text);
+                    else
+                        m_UserData.m_OnToggles.Remove(m_CopyToStreaming.content.text);
+                    m_CopyToStreaming.state = newState;
+                }
+            }
+
+            // advanced options
+            using (new EditorGUI.DisabledScope(!AssetBundleModel.Model.DataSource.CanSpecifyBuildOptions))
+            {
+                EditorGUILayout.Space();
+                m_AdvancedSettings = EditorGUILayout.Foldout(m_AdvancedSettings, "Advanced Settings");
+                if (m_AdvancedSettings)
+                {
+                    var indent = EditorGUI.indentLevel;
+                    EditorGUI.indentLevel = 1;
+                    CompressOptions cmp = (CompressOptions)EditorGUILayout.IntPopup(
+                        m_CompressionContent,
+                        (int)m_UserData.m_Compression,
+                        m_CompressionOptions,
+                        m_CompressionValues);
+
+                    if (cmp != m_UserData.m_Compression)
+                    {
+                        m_UserData.m_Compression = cmp;
+                    }
+                    foreach (var tog in m_ToggleData)
+                    {
+                        newState = EditorGUILayout.ToggleLeft(
+                            tog.content,
+                            tog.state);
+                        if (newState != tog.state)
+                        {
+
+                            if (newState)
+                                m_UserData.m_OnToggles.Add(tog.content.text);
+                            else
+                                m_UserData.m_OnToggles.Remove(tog.content.text);
+                            tog.state = newState;
+                        }
+                    }
+                    EditorGUILayout.Space();
+                    EditorGUI.indentLevel = indent;
+                }
+            }
+            if (GUILayout.Button("HybridclrBuild(涓嶈兘鐑洿)"))
+            {
+                EditorApplication.delayCall += ExcuteBuildHybridclrBuild;
+            }
+            // build.
+            EditorGUILayout.Space();
+            if (GUILayout.Button("Build All Assets"))
+            {
+                EditorApplication.delayCall += ExecuteBuildAll;
+            }
+
+            EditorGUILayout.BeginHorizontal();
+
+            if (GUILayout.Button("Config"))
+            {
+                EditorApplication.delayCall += ExcuteBuildConfig;
+            }
+
+            if (GUILayout.Button("UI"))
+            {
+                EditorApplication.delayCall += ExcuteBuildUI;
+            }
+
+            if (GUILayout.Button("BuiltIn"))
+            {
+                EditorApplication.delayCall += ExcuteBuildBuiltIn;
+            }
+
+            if (GUILayout.Button("Audio"))
+            {
+                EditorApplication.delayCall += ExcuteBuildAudio;
+            }
+
+            if (GUILayout.Button("Video"))
+            {
+                EditorApplication.delayCall += ExcuteBuildVideo;
+            }
+
+            if (GUILayout.Button("Maps"))
+            {
+                EditorApplication.delayCall += ExcuteBuildLevels;
+            }
+
+            if (GUILayout.Button("MobEffectShader"))
+            {
+                EditorApplication.delayCall += ExcuteBuildMobEffectShader;
+            }
+
+            if (GUILayout.Button("HybridclrUpdate"))
+            {
+                EditorApplication.delayCall += ExcuteBuildHybridclrUpdate;
+            }
+            EditorGUILayout.EndHorizontal();
+
+            EditorGUILayout.Space();
+
+
+            EditorGUILayout.Space();
+
+            EditorGUILayout.BeginHorizontal();
+
+            if (GUILayout.Button("Make VersionFile"))
+            {
+                EditorApplication.delayCall += MakeAssetsVersionFile;
+            }
+
+            if (GUILayout.Button("Copy to StreamingAssets"))
+            {
+                EditorApplication.delayCall += CopyToStreamingAssets;
+            }
+
+            EditorGUILayout.EndHorizontal();
+
+            EditorGUILayout.Space();
+            EditorGUILayout.Space();
+            EditorGUILayout.Space();
+#if UNITY_ANDROID
+            GUILayout.BeginHorizontal();
+            EditorGUILayout.TextField("Apk Output Path", ApkOutputPath);
+            if (GUILayout.Button("Browse", GUILayout.MaxWidth(75f)))
+            {
+                BrowseForApkOutput();
+            }
+            GUILayout.EndHorizontal();
+
+            EditorGUILayout.Space();
+#endif
+
+#if UNITY_STANDALONE
+            GUILayout.BeginHorizontal();
+            EditorGUILayout.TextField("EXE Output Path", ApkOutputPath);
+            if (GUILayout.Button("Browse", GUILayout.MaxWidth(75f)))
+            {
+                BrowseForApkOutput();
+            }
+            GUILayout.EndHorizontal();
+
+            EditorGUILayout.Space();
+#endif
+
+            GUILayout.BeginHorizontal();
+            EditorGUILayout.TextField("SDK Project Path", ClientPackage.SDK_PLUGIN_PROJECT);
+            if (GUILayout.Button("Browse", GUILayout.MaxWidth(75f)))
+            {
+                BrowseForSDKProject();
+            }
+            GUILayout.EndHorizontal();
+
+            EditorGUILayout.Space();
+
+#if UNITY_IOS
+            ClientPackage.auditOutTime = EditorGUILayout.TextField("AppStore OutTime", ClientPackage.auditOutTime, GUILayout.Height(20));
+            EditorGUILayout.Space();
+#endif
+            GUILayout.BeginHorizontal();
+
+            ClientPackage.AssetPrior = EditorGUILayout.IntField("AssetPrior", ClientPackage.AssetPrior, GUILayout.Height(50), GUILayout.Width(250));
+            publishers = EditorGUILayout.TextField("Publishers", publishers, GUILayout.Height(50));
+            GUILayout.EndHorizontal();
+
+            EditorGUILayout.Space();
+            GUILayout.BeginHorizontal();
+
+            ClientPackage.includeConfig = EditorGUILayout.Toggle("Include Config ", ClientPackage.includeConfig, GUILayout.Width(250));
+            ClientPackage.includeUI = EditorGUILayout.Toggle("Include UI ", ClientPackage.includeUI, GUILayout.Width(250));
+
+            GUILayout.EndHorizontal();
+            EditorGUILayout.Space();
+            GUILayout.BeginHorizontal();
+
+            //ClientPackage.obfuscatorEnabled = EditorGUILayout.Toggle("Obfuscator Enable ", ClientPackage.obfuscatorEnabled, GUILayout.Width(250));
+
+#if UNITY_STANDALONE
+            if (GUILayout.Button("EXE"))
+            {
+                EditorApplication.delayCall += ExecuteBuildClientPackageStandalone;
+            }
+#elif UNITY_ANDROID
+            if (GUILayout.Button("APK"))
+            {
+                EditorApplication.delayCall += ExecuteBuildClientPackageApk;
+            }
+#elif UNITY_IOS
+            if (GUILayout.Button("IPA_Append "))
+            {
+                EditorApplication.delayCall += ExecuteBuildClientPackageIpaAppend;
+            }
+#endif
+
+#if UNITY_STANDALONE
+            if (GUILayout.Button("EXE Development "))
+            {
+                EditorApplication.delayCall += ExecuteBuildClientPackageStandaloneDevelopment;
+            }
+#elif UNITY_ANDROID
+            if (GUILayout.Button("APK Development"))
+            {
+                EditorApplication.delayCall += ExecuteBuildClientPackageDevelopApk;
+            }
+#elif UNITY_IOS
+            if (GUILayout.Button("IPA_Replace"))
+            {
+                EditorApplication.delayCall += ExecuteBuildClientPackageIpaReplace;
+            }
+#endif
+
+            GUILayout.EndHorizontal();
+
+            GUILayout.Space(20);
+            if (GUILayout.Button("SwitchVersionConfig"))
+            {
+                EditorApplication.delayCall += ExecuteSwitchVersionConfig;
+            }
+
+            GUILayout.Space(20);
+            GUILayout.BeginHorizontal();
+            rechargeSkin = EditorGUILayout.IntField("Recharge Skin", rechargeSkin, GUILayout.Width(250));
+            if (GUILayout.Button("Switch"))
+            {
+                // UpdateSpriteSetting.SetRechargeSkin(rechargeSkin);
+                AssetDatabase.Refresh();
+                UpdateSpritePackingSetting.UpdateAllSpritePackingSetting();
+            }
+
+            createRoleLevel = EditorGUILayout.TextField("CreateRole Level", createRoleLevel, GUILayout.Width(250));
+            if (GUILayout.Button("Switch"))
+            {
+                AssetDatabase.Refresh();
+            }
+            GUILayout.EndHorizontal();
+
+            GUILayout.EndVertical();
+            EditorGUILayout.EndScrollView();
+        }
+
+        private void CopyToStreamingAssets()
+        {
+            if (Directory.Exists(m_streamingPath))
+                Directory.Delete(m_streamingPath, true);
+            DirectoryCopy(m_UserData.m_OutputPath, m_streamingPath);
+        }
+
+        private void ExecuteBuildAll()
+        {
+
+            if (AssetBundleModel.Model.DataSource.CanSpecifyBuildOutputDirectory)
+            {
+                if (string.IsNullOrEmpty(m_UserData.m_OutputPath))
+                {
+                    BrowseForFolder();
+                }
+
+                if (string.IsNullOrEmpty(m_UserData.m_OutputPath)) //in case they hit "cancel" on the open browser
+                {
+                    Debug.LogError("AssetBundle Build: No valid output path for build.");
+                    return;
+                }
+
+                if (m_ForceRebuild.state)
+                {
+                    try
+                    {
+                        if (Directory.Exists(m_UserData.m_OutputPath))
+                        {
+                            Directory.Delete(m_UserData.m_OutputPath, true);
+                        }
+
+                        if (m_CopyToStreaming.state)
+                        {
+                            if (Directory.Exists(m_streamingPath))
+                            {
+                                Directory.Delete(m_streamingPath, true);
+                            }
+                        }
+                    }
+                    catch (System.Exception e)
+                    {
+                        Debug.LogException(e);
+                    }
+                }
+
+                if (!Directory.Exists(m_UserData.m_OutputPath))
+                {
+                    Directory.CreateDirectory(m_UserData.m_OutputPath);
+                }
+            }
+
+            ExcuteBuildAudio();
+            ExcuteBuildVideo();
+            ExcuteBuildMobEffectShader();
+            ExcuteBuildConfig();
+            ExcuteBuildLevels();
+            ExcuteBuildUI();
+            ExcuteBuildBuiltIn();
+            ExcuteBuildHybridclrUpdate();
+
+            AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
+
+            MakeAssetsVersionFile();
+
+            if (m_CopyToStreaming.state)
+            {
+                if (Directory.Exists(m_streamingPath))
+                    Directory.Delete(m_streamingPath, true);
+                DirectoryCopy(m_UserData.m_OutputPath, m_streamingPath);
+            }
+        }
+
+        private void ExcuteBuildAsset(string _category, bool uncompressed = false)
+        {
+            BuildAssetBundleOptions opt = BuildAssetBundleOptions.None;
+            if (AssetBundleModel.Model.DataSource.CanSpecifyBuildOptions)
+            {
+                if (m_UserData.m_Compression == CompressOptions.Uncompressed || uncompressed)
+                {
+                    opt |= BuildAssetBundleOptions.UncompressedAssetBundle;
+                }
+                else if (m_UserData.m_Compression == CompressOptions.ChunkBasedCompression)
+                {
+                    opt |= BuildAssetBundleOptions.ChunkBasedCompression;
+                }
+
+                //opt |= BuildAssetBundleOptions.DeterministicAssetBundle;
+
+                foreach (var tog in m_ToggleData)
+                {
+                    if (tog.state)
+                    {
+                        opt |= tog.option;
+                    }
+                }
+            }
+
+            var outputPath = Application.dataPath.Replace("Assets", m_UserData.m_OutputPath);
+            AssetBundleBuildExtersion.Build(outputPath, _category, opt, (BuildTarget)m_UserData.m_BuildTarget, m_ForceRebuild.state);
+        }
+
+        private void ExcuteBuildBuiltIn()
+        {
+            BuiltInResourceSetting.SetLaunchBackGround(publishers.Split('|')[0], (BuildTarget)m_UserData.m_BuildTarget);
+            BuiltInResourceSetting.SetLoginBackGround(publishers.Split('|')[0], (BuildTarget)m_UserData.m_BuildTarget);
+            BuiltInResourceSetting.SetLoginLogo(publishers.Split('|')[0], (BuildTarget)m_UserData.m_BuildTarget);
+            UpdateBuiltInSetting.SetBuiltinAssetBundleName();
+            ExcuteBuildAsset("builtin");
+        }
+
+        private void ExcuteBuildAudio()
+        {
+            UpdateAudioSetting.SetAllAudioAssetBundleName();
+            ExcuteBuildAsset("audio");
+        }
+
+        private void ExcuteBuildVideo()
+        {
+            UpdateVideoSetting.SetAllVideoAssetBundleName();
+            ExcuteBuildAsset("video");
+        }
+
+        private void ExcuteBuildMobEffectShader()
+        {
+            UpdateEffectPrefabSetting.SetAllEffectPrefabAssetBundleName();
+            UpdateMobSetting.SetAllMobAssetBundleName();
+            UpdateShaderSetting.SetAllShaderAssetBundleName();
+            ExcuteBuildAsset("mobeffectshader");
+        }
+
+        private void ExcuteBuildConfig()
+        {
+            ExcuteBuildAsset("config");
+            TableTool.CopyConfigsToOutPutPath(StringUtility.Contact(m_UserData.m_OutputPath, "/config"));
+        }
+        //鍙戝寘鏃惰幏鍙栫儹鏇磀ll鍜岃鍓狝OT
+        private void ExcuteBuildHybridclrBuild()
+        {
+            //閲嶆柊鐢熸垚鐑洿dll鍜岃鍓狝OT
+            PrebuildCommand.GenerateAll();
+            // 杈撳嚭鍒癆ssetBundles鐩綍
+            var outputPath = Application.dataPath.Replace("Assets", m_UserData.m_OutputPath);
+            outputPath = StringUtility.Contact(outputPath, "/logicbytes");
+            if (Directory.Exists(outputPath))
+                Directory.Delete(outputPath, true);
+            //澶嶅埗鏂扮敓鎴愮殑AOT dll鍒版寚瀹氳矾寰�
+            CopyAOTDataDll(outputPath);
+            //澶嶅埗鐑洿dll鍒版寚瀹氳矾寰�
+            CopyHotUpdateDll(outputPath);
+            AssetDatabase.Refresh();
+        }
+        //鐑洿鏂版椂鑾峰彇鐑洿dll
+        private void ExcuteBuildHybridclrUpdate()
+        {
+            //鐢熸垚鐑洿dll
+            CompileDllCommand.CompileDll(EditorUserBuildSettings.activeBuildTarget);
+            //鍒ゆ柇褰撳墠鐨刣ll鏈夋病鏈変娇鐢ㄤ簡琚鍓殑aot dll
+            if (IsAccessMissingMetadata())
+            {
+                Debug.LogError("褰撳墠鐑洿浠g爜浣跨敤浜嗚瑁佸壀鐨刟ot dll,璇蜂娇鐢℉ybridclrBuild閲嶆柊鐢熸垚,閲嶆柊鍑哄寘");
+                return;
+            }
+            // 杈撳嚭鍒癆ssetBundles鐩綍
+            var outputPath = Application.dataPath.Replace("Assets", m_UserData.m_OutputPath);
+            outputPath = StringUtility.Contact(outputPath, "/logicbytes");
+            CopyHotUpdateDll(outputPath);
+            MakeBytesVersionFile();
+            AssetDatabase.Refresh();
+        }
+
+        private void MakeBytesVersionFile()
+        {
+            var fileInfos = new List<FileInfo>();
+            FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(m_UserData.m_OutputPath, "/logicbytes"), fileInfos);
+            BytesVersionMaker.WriteAssetsVersionFile(Path.Combine(Directory.GetParent(Application.dataPath).FullName, m_UserData.m_OutputPath), fileInfos);
+            Debug.Log("鐑洿鏂颁唬鐮佹洿鏂板畬姣曪紝鐢熸垚md5鏂囦欢");
+        }
+
+        //澶嶅埗瑁佸壀AOT鍒版寚瀹氱洰褰�
+        void CopyAOTDataDll(string outputPath)
+        {
+            //椤圭洰鏍圭洰褰�
+            string rootDir = Directory.GetParent(Application.dataPath).FullName.Replace(@"\", @"/");
+            //褰撳墠鏋勫缓鐨勫钩鍙板悕绉�
+            string platformName = "/" + EditorUserBuildSettings.activeBuildTarget + "/";
+            //涓婃鍑哄寘鏃朵娇鐢ㄧ殑AOT鎵�鍦ㄨ矾寰�
+            string checkAotDir = rootDir + "/HybridCLRData/CheckAssembliesPostIl2CppStrip" + platformName;
+            //HybridCLR Settings闈㈡澘涓婅缃殑瑁佸噺鍚嶢OT dll杈撳嚭鏍圭洰褰�
+            string strippedAOTDllOutputRootDir = "/" + HybridCLRSettings.Instance.strippedAOTDllOutputRootDir;
+            //閲嶆柊鐢熸垚鐨凙OT鎵�鍦ㄨ矾寰�
+            string aotDir = StringUtility.Contact(rootDir, strippedAOTDllOutputRootDir, platformName);
+
+            if (Directory.Exists(checkAotDir))
+            {
+                Directory.Delete(checkAotDir, true);
+                Directory.CreateDirectory(checkAotDir);
+            }
+            //澶嶅埗涓�浠藉嚭鍖呮椂浣跨敤鐨凙OT
+            CopyDirectoryToPath(aotDir, checkAotDir);
+
+            for (int i = 0; i < AOTGenericReferences.PatchedAOTAssemblyList.Count; i++)
+            {
+                string dllFile = StringUtility.Contact(aotDir, AOTGenericReferences.PatchedAOTAssemblyList[i]);
+                var outDllFile = outputPath + "/" + AOTGenericReferences.PatchedAOTAssemblyList[i] + ".bytes";
+                if (!File.Exists(dllFile))
+                {
+                    Debug.LogErrorFormat("閿欒锛歿0} 涓嶅瓨鍦�", dllFile);
+                    return;
+                }
+
+                //FileExtersion.MakeSureDirectory(outDllFile);
+                //File.Copy(dllFile, outDllFile, true);
+                ChangeBytes(dllFile, outDllFile);
+            }
+        }
+
+        //澶嶅埗鐑洿dll鍒版寚瀹氱洰褰�
+        void CopyHotUpdateDll(string outputPath)
+        {
+            //椤圭洰鏍圭洰褰�
+            string rootDir = Directory.GetParent(Application.dataPath).FullName.Replace(@"\", @"/");
+            //褰撳墠鏋勫缓鐨勫钩鍙板悕绉�
+            string platformName = "/" + EditorUserBuildSettings.activeBuildTarget + "/";
+            //HybridCLR Settings闈㈡澘涓婅缃殑鐑洿鏂癲ll缂栬瘧杈撳嚭鏍圭洰褰�
+            string hotUpdateDllCompileOutputRootDir = "/" + HybridCLRSettings.Instance.hotUpdateDllCompileOutputRootDir;
+            //鐑洿DLL鐢熸垚鐩綍
+            string hotDllDir = StringUtility.Contact(rootDir, hotUpdateDllCompileOutputRootDir, platformName);
+            //HybridCLR鐨凷ettings闈㈡澘涓婅缃殑鐑洿鏂癆ssembly Definitions 璧勬簮
+            var assemblyDefinitionAsset = HybridCLRSettings.Instance.hotUpdateAssemblyDefinitions;
+            for (int i = 0; i < assemblyDefinitionAsset.Length; i++)
+            {
+                string assemblyPath = AssetDatabase.GetAssetPath(assemblyDefinitionAsset[i]);
+                string assemblyName = Path.GetFileNameWithoutExtension(assemblyPath);
+
+                string dllFile = StringUtility.Contact(hotDllDir, assemblyName, ".dll");
+                var outDllFile = outputPath + "/" + assemblyName + ".dll.bytes";
+                if (!File.Exists(dllFile))
+                {
+                    Debug.LogErrorFormat("閿欒锛歿0} 涓嶅瓨鍦�", dllFile);
+                    return;
+                }
+                //FileExtersion.MakeSureDirectory(outDllFile);
+                //File.Copy(dllFile, outDllFile, true);
+                ChangeBytes(dllFile, outDllFile);
+            }
+
+            //HybridCLR鐨凷ettings闈㈡澘涓婅缃殑瑕佺儹鏇寸殑DLL璧勬簮
+            string[] hotUpdateAssemblies = HybridCLRSettings.Instance.hotUpdateAssemblies;
+            for (int i = 0; i < hotUpdateAssemblies.Length; i++)
+            {
+                string dllFile = StringUtility.Contact(hotDllDir, hotUpdateAssemblies[i], ".dll");
+                var outDllFile = outputPath + "/" + hotUpdateAssemblies[i] + ".dll.bytes";
+                if (!File.Exists(dllFile))
+                {
+                    Debug.LogErrorFormat("閿欒锛歿0} 涓嶅瓨鍦�", dllFile);
+                    return;
+                }
+                //FileExtersion.MakeSureDirectory(outDllFile);
+                //File.Copy(dllFile, outDllFile, true);
+                ChangeBytes(dllFile, outDllFile);
+            }
+
+            //HybridCLR鐨凷ettings闈㈡澘涓婅缃殑棰勭暀鐨勭儹鏇存柊dlls
+            string[] preserveHotUpdateAssemblies = HybridCLRSettings.Instance.preserveHotUpdateAssemblies;
+            for (int i = 0; i < preserveHotUpdateAssemblies.Length; i++)
+            {
+                string dllFile = StringUtility.Contact(hotDllDir, preserveHotUpdateAssemblies[i], ".dll");
+                var outDllFile = outputPath + "/" + preserveHotUpdateAssemblies[i] + ".dll.bytes";
+                if (!File.Exists(dllFile))
+                {
+                    Debug.LogWarningFormat("璀﹀憡锛氶鐣欑殑鐑洿鏂癲ll: {0} 涓嶅瓨鍦�", dllFile);
+                    continue;
+                }
+                //FileExtersion.MakeSureDirectory(outDllFile);
+                //File.Copy(dllFile, outDllFile, true);
+                ChangeBytes(dllFile, outDllFile);
+            }
+        }
+
+        //妫�鏌ョ洰鏍囨枃浠跺す涓嬫槸鍚︽湁鏂囦欢
+        bool IsFolderNotEmpty(string dir)
+        {
+            if (Directory.Exists(dir))
+            {
+                string[] files = Directory.GetFiles(dir);
+                if (files.Length > 0)
+                    return true;
+            }
+            return false;
+        }
+
+        //妫�鏌ョ儹鏇存柊浠g爜涓槸鍚﹀紩鐢ㄤ簡琚鍓殑绫诲瀷鎴栧嚱鏁�
+        bool IsAccessMissingMetadata()
+        {
+            //椤圭洰鏍圭洰褰�
+            string rootDir = Directory.GetParent(Application.dataPath).FullName.Replace(@"\", @"/");
+            //褰撳墠鏋勫缓鐨勫钩鍙板悕绉�
+            BuildTarget target = EditorUserBuildSettings.activeBuildTarget;
+            string platformName = "/" + target + "/";
+            //涓婃鍑哄寘鏃朵娇鐢ㄧ殑AOT鎵�鍦ㄨ矾寰�
+            string checkAotDir = rootDir + "/HybridCLRData/CheckAssembliesPostIl2CppStrip" + platformName;
+
+            //涓婃鎵撳寘鏃朵繚瀛樼殑AOT鎵�鍦ㄦ枃浠跺す涓嶅瓨鍦ㄦ垨娌℃湁dll鏂囦欢
+            if (!IsFolderNotEmpty(checkAotDir))
+                return true;
+            var checker = new MissingMetadataChecker(checkAotDir, new List<string>());
+            string hotUpdateDir = SettingsUtil.GetHotUpdateDllsOutputDirByTarget(target);
+            for (int i = 0; i < SettingsUtil.HotUpdateAssemblyFilesExcludePreserved.Count; i++)
+            {
+                string dllPath = hotUpdateDir + "/" + SettingsUtil.HotUpdateAssemblyFilesExcludePreserved[i];
+                bool notAnyMissing = checker.Check(dllPath);
+                if (!notAnyMissing)
+                {
+                    return true;
+                }
+            }
+            return false;
+        }
+        private void CopyDirectoryToPath(string sourceDir, string destinationDir)
+        {
+            // 濡傛灉鐩爣璺緞涓嶅瓨鍦紝鍒欏垱寤哄畠
+            if (!Directory.Exists(destinationDir))
+                Directory.CreateDirectory(destinationDir);
+            // 鑾峰彇鎵�鏈夋枃浠跺苟澶嶅埗
+            string[] files = Directory.GetFiles(sourceDir);
+            for (int i = 0; i < files.Length; i++)
+            {
+                string dest = Path.Combine(destinationDir, Path.GetFileName(files[i]));
+                File.Copy(files[i], dest, true); // true琛ㄧず濡傛灉鐩爣瀛樺湪锛屽垯瑕嗙洊
+            }
+        }
+
+        private void ExcuteBuildLevels()
+        {
+            UpdateLevelSetting.SetAllLevelAssetBundleName();
+            ExcuteBuildAsset("maps");
+        }
+
+        private void ExcuteBuildUI()
+        {
+            //CheckFontSwitch.CheckAndReplaceFontSwitch();
+            UpdateUIPrefabSetting.SetAllUIPrefabAssetBundleName();
+            UpdateUIWindowSetting.SetAllUIWindowAssetBundleName();
+            
+            ExcuteBuildAsset("ui");
+        }
+
+        private void SetAssetsVersion()
+        {
+            var fileInfos = new List<FileInfo>();
+            FileExtersion.GetAllDirectoryFileInfos(m_UserData.m_OutputPath, fileInfos);
+            for (int i = 0; i < fileInfos.Count; i++)
+            {
+                var fileInfo = fileInfos[i];
+                var fullName = FileExtersion.RemoveVersionFromFileFullName(fileInfo.FullName);
+                var newFullName = FileExtersion.AddVersionToFileFullName(fullName, m_Version);
+                if (fullName != newFullName)
+                {
+                    File.Copy(fullName, newFullName, true);
+                    File.Delete(fullName);
+                }
+            }
+        }
+
+        private void RemoveAssetsVersion()
+        {
+            var fileInfos = new List<FileInfo>();
+            FileExtersion.GetAllDirectoryFileInfos(m_UserData.m_OutputPath, fileInfos);
+            for (int i = 0; i < fileInfos.Count; i++)
+            {
+                var fileInfo = fileInfos[i];
+                var fullName = FileExtersion.RemoveVersionFromFileFullName(fileInfo.FullName);
+                if (fullName != fileInfo.FullName)
+                {
+                    File.Copy(fileInfo.FullName, fullName, true);
+                    File.Delete(fileInfo.FullName);
+                }
+            }
+        }
+
+        private void MakeAssetsVersionFile()
+        {
+            var fileInfos = new List<FileInfo>();
+            FileExtersion.GetAllDirectoryFileInfos(m_UserData.m_OutputPath, fileInfos);
+            AssetsVersionMaker.WriteAssetsVersionFile(Path.Combine(Directory.GetParent(Application.dataPath).FullName, m_UserData.m_OutputPath), fileInfos);
+
+            Debug.Log("鐢熸垚AssetsVersion.txt鏂囦欢瀹屾瘯");
+        }
+
+        void ChangeBytes(string originalDllBytesFilePath, string outDllFile)
+        {
+            // 涓存椂鏂囦欢鐨勮矾寰勶紝鐢ㄤ簬鍐欏叆"abc"鍚庡啀杩藉姞鍘熷DLL瀛楄妭鍐呭  
+            string tempFilePath;
+            // if (AssetVersionUtility.IsOpenDMHunxiao())
+            //     tempFilePath = AssetVersionUtility.EncodeFileName(outDllFile);
+            // else
+            {
+                tempFilePath = outDllFile;
+                // 鍙湁Assembly-CSharp.dll.bytes鏂囦欢鎵嶉渶瑕佸姞瀵�
+                // if (!outDllFile.Contains("Main.dll.bytes"))
+                {
+                    FileExtersion.MakeSureDirectory(tempFilePath);
+                    File.Copy(originalDllBytesFilePath, outDllFile, true);
+                    return;
+                }
+            }
+
+            FileExtersion.MakeSureDirectory(tempFilePath);
+
+            // 濡傛灉鐩爣鏂囦欢瀛樺湪锛屽垯鍒犻櫎瀹�  
+            if (File.Exists(tempFilePath))
+            {
+                File.Delete(tempFilePath);
+            }
+
+            // 瑕佸啓鍏ョ殑瀛楃涓�
+            string contentToWrite = "kkk";
+
+            // 灏�"abc"杞崲涓哄瓧鑺傛暟缁�  
+            byte[] abcBytes = Encoding.ASCII.GetBytes(contentToWrite);
+
+            // 璇诲彇鍘熷DLL瀛楄妭鍐呭鍒板瓧鑺傛暟缁�  
+            byte[] originalDllBytes = File.ReadAllBytes(originalDllBytesFilePath);
+
+            // 灏�"abc"鍐欏叆涓存椂鏂囦欢  
+            using (FileStream fs = new FileStream(tempFilePath, FileMode.Create, FileAccess.Write))
+            {
+                fs.Write(abcBytes, 0, abcBytes.Length);
+
+                // 杩藉姞鍘熷DLL瀛楄妭鍐呭鍒颁复鏃舵枃浠�  
+                fs.Write(originalDllBytes, 0, originalDllBytes.Length);
+            }
+
+            //ReplaceFile(tempFilePath, originalDllBytesFilePath);
+        }
+
+        public void ReplaceFile(string sourceFile, string targetFile)
+        {
+            // 纭繚婧愭枃浠跺瓨鍦�  
+            if (!File.Exists(sourceFile))
+            {
+                throw new FileNotFoundException("婧愭枃浠舵湭鎵惧埌锛�" + sourceFile);
+            }
+
+            // 濡傛灉鐩爣鏂囦欢瀛樺湪锛屽垯鍒犻櫎瀹�  
+            if (File.Exists(targetFile))
+            {
+                File.Delete(targetFile);
+            }
+
+            // 灏嗘簮鏂囦欢閲嶅懡鍚嶄负鐩爣鏂囦欢  
+            File.Move(sourceFile, targetFile);
+        }
+
+
+        static int packageIndex
+        {
+            get { return LocalSave.GetInt("ClientPackageIndex", 1); }
+            set { LocalSave.SetInt("ClientPackageIndex", value); }
+        }
+
+        private void ExecuteBuildClientPackageIpaAppend()
+        {
+            packageIndex++;
+            var outputPath = Application.dataPath.Replace("Assets", m_UserData.m_OutputPath);
+            ClientPackage.BuildPublishers(ClientPackage.SDK_PLUGIN_PROJECT, outputPath, ApkOutputPath, publishers, packageIndex, false, false);
+        }
+
+        private void ExecuteBuildClientPackageIpaReplace()
+        {
+            packageIndex++;
+            var outputPath = Application.dataPath.Replace("Assets", m_UserData.m_OutputPath);
+            ClientPackage.BuildPublishers(ClientPackage.SDK_PLUGIN_PROJECT, outputPath, ApkOutputPath, publishers, packageIndex, false, true);
+        }
+
+        private void ExecuteBuildClientPackageApk()
+        {
+            packageIndex++;
+            var outputPath = Application.dataPath.Replace("Assets", m_UserData.m_OutputPath);
+            ClientPackage.BuildPublishers(ClientPackage.SDK_PLUGIN_PROJECT, outputPath, ApkOutputPath, publishers, packageIndex, false, false);
+        }
+
+        private void ExecuteBuildClientPackageDevelopApk()
+        {
+            packageIndex++;
+            var outputPath = Application.dataPath.Replace("Assets", m_UserData.m_OutputPath);
+            ClientPackage.BuildPublishers(ClientPackage.SDK_PLUGIN_PROJECT, outputPath, ApkOutputPath, publishers, packageIndex, true, false);
+        }
+
+        private void ExecuteBuildClientPackageStandalone()
+        {
+            packageIndex++;
+            var outputPath = Application.dataPath.Replace("Assets", m_UserData.m_OutputPath);
+            ClientPackage_Standalone.Build(new ClientPackage_Standalone.BuildParams()
+            {
+                assetBundle = outputPath,
+                output = ApkOutputPath,
+                buildIndex = packageIndex,
+                development = false,
+                publisher = publishers,
+            });
+        }
+
+        private void ExecuteBuildClientPackageStandaloneDevelopment()
+        {
+            packageIndex++;
+            var outputPath = Application.dataPath.Replace("Assets", m_UserData.m_OutputPath);
+            ClientPackage_Standalone.Build(new ClientPackage_Standalone.BuildParams()
+            {
+                assetBundle = outputPath,
+                output = ApkOutputPath,
+                buildIndex = packageIndex,
+                development = true,
+                publisher = publishers,
+            });
+        }
+
+        private void ExecuteSwitchVersionConfig()
+        {
+            var newVersionConfigPath = StringUtility.Contact("Assets/Resources/ScriptableObject/Config/VersionConfig", ".asset");
+            var versionsFilePath = Application.dataPath + Path.DirectorySeparatorChar + "Editor/VersionConfigs/Versions.txt";
+
+            var lines = File.ReadAllLines(versionsFilePath);
+            for (int i = 2; i < lines.Length; i++)
+            {
+                var line = lines[i];
+                var lineStrings = line.Split('\t');
+                if (lineStrings[0] == publishers)
+                {
+                    VersionConfig.Get().Read(line);
+                    break;
+                }
+            }
+        }
+
+        private static void DirectoryCopy(string sourceDirName, string destDirName, string excludeEx = null)
+        {
+            // Get the subdirectories for the specified directory.
+            DirectoryInfo dir = new DirectoryInfo(sourceDirName);
+
+            // If the destination directory doesn't exist, create it.
+            if (!Directory.Exists(destDirName))
+            {
+                Directory.CreateDirectory(destDirName);
+            }
+
+            // Get the files in the directory and copy them to the new location.
+            FileInfo[] files = dir.GetFiles();
+            foreach (FileInfo file in files)
+            {
+                string temppath = Path.Combine(destDirName, file.Name);
+                if (excludeEx == null || file.Extension != excludeEx)
+                    file.CopyTo(temppath, false);
+            }
+
+            DirectoryInfo[] dirs = dir.GetDirectories();
+            foreach (DirectoryInfo subdir in dirs)
+            {
+                string temppath = Path.Combine(destDirName, subdir.Name);
+                DirectoryCopy(subdir.FullName, temppath);
+            }
+        }
+
+        private void BrowseForFolder()
+        {
+            m_UserData.m_UseDefaultPath = false;
+            var newPath = EditorUtility.OpenFolderPanel("Bundle Folder", m_UserData.m_OutputPath, string.Empty);
+            if (!string.IsNullOrEmpty(newPath))
+            {
+                var gamePath = System.IO.Path.GetFullPath(".");
+                gamePath = gamePath.Replace("\\", "/");
+                if (newPath.StartsWith(gamePath) && newPath.Length > gamePath.Length)
+                    newPath = newPath.Remove(0, gamePath.Length + 1);
+                m_UserData.m_OutputPath = newPath;
+                //EditorUserBuildSettings.SetPlatformSettings(EditorUserBuildSettings.activeBuildTarget.ToString(), "AssetBundleOutputPath", m_OutputPath);
+            }
+        }
+
+        private void BrowseForApkOutput()
+        {
+            var newPath = EditorUtility.OpenFolderPanel("Apk Folder", ApkOutputPath, string.Empty);
+            if (!string.IsNullOrEmpty(newPath))
+            {
+                var gamePath = System.IO.Path.GetFullPath(".");
+                gamePath = gamePath.Replace("\\", "/");
+                if (newPath.StartsWith(gamePath) && newPath.Length > gamePath.Length)
+                    newPath = newPath.Remove(0, gamePath.Length + 1);
+                ApkOutputPath = newPath;
+            }
+        }
+
+        private void BrowseForSDKProject()
+        {
+            var newPath = EditorUtility.OpenFolderPanel("Apk Folder", ClientPackage.SDK_PLUGIN_PROJECT, string.Empty);
+            if (!string.IsNullOrEmpty(newPath))
+            {
+                var gamePath = System.IO.Path.GetFullPath(".");
+                gamePath = gamePath.Replace("\\", "/");
+                if (newPath.StartsWith(gamePath) && newPath.Length > gamePath.Length)
+                    newPath = newPath.Remove(0, gamePath.Length + 1);
+                ClientPackage.SDK_PLUGIN_PROJECT = newPath;
+            }
+        }
+
+        private void ResetPathToDefault()
+        {
+            m_UserData.m_UseDefaultPath = true;
+            m_UserData.m_OutputPath = "AssetBundles/";
+            m_UserData.m_OutputPath += m_UserData.m_BuildTarget.ToString();
+            //EditorUserBuildSettings.SetPlatformSettings(EditorUserBuildSettings.activeBuildTarget.ToString(), "AssetBundleOutputPath", m_OutputPath);
+        }
+
+        //Note: this is the provided BuildTarget enum with some entries removed as they are invalid in the dropdown
+        public enum ValidBuildTarget
+        {
+            //NoTarget = -2,        --doesn't make sense
+            //iPhone = -1,          --deprecated
+            //BB10 = -1,            --deprecated
+            //MetroPlayer = -1,     --deprecated
+            StandaloneOSXUniversal = 2,
+            StandaloneOSXIntel = 4,
+            StandaloneWindows = 5,
+            WebPlayer = 6,
+            WebPlayerStreamed = 7,
+            iOS = 9,
+            PS3 = 10,
+            XBOX360 = 11,
+            Android = 13,
+            StandaloneLinux = 17,
+            StandaloneWindows64 = 19,
+            WebGL = 20,
+            WSAPlayer = 21,
+            StandaloneLinux64 = 24,
+            StandaloneLinuxUniversal = 25,
+            WP8Player = 26,
+            StandaloneOSXIntel64 = 27,
+            BlackBerry = 28,
+            Tizen = 29,
+            PSP2 = 30,
+            PS4 = 31,
+            PSM = 32,
+            XboxOne = 33,
+            SamsungTV = 34,
+            N3DS = 35,
+            WiiU = 36,
+            tvOS = 37,
+            Switch = 38
+        }
+
+        [System.Serializable]
+        public class BuildTabData
+        {
+            public List<string> m_OnToggles;
+            public ValidBuildTarget m_BuildTarget = ValidBuildTarget.StandaloneWindows;
+            public CompressOptions m_Compression = CompressOptions.StandardCompression;
+            public string m_OutputPath = string.Empty;
+            public bool m_UseDefaultPath = true;
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/Assets/Editor/AssetBundleBrowser/AssetBundleBuildTab.cs.meta b/Assets/Editor/AssetBundleBrowser/AssetBundleBuildTab.cs.meta
new file mode 100644
index 0000000..f419c01
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/AssetBundleBuildTab.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: b1e018d921bf6e941ba3518ba24c14ac
+timeCreated: 1499908886
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/AssetBundleBrowser/AssetBundleDataSource.meta b/Assets/Editor/AssetBundleBrowser/AssetBundleDataSource.meta
new file mode 100644
index 0000000..67da537
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/AssetBundleDataSource.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: af0d51c3f04e6084e8088753c93d3fff
+folderAsset: yes
+timeCreated: 1499908885
+licenseType: Pro
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/AssetBundleBrowser/AssetBundleDataSource/ABDataSource.cs b/Assets/Editor/AssetBundleBrowser/AssetBundleDataSource/ABDataSource.cs
new file mode 100644
index 0000000..817a878
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/AssetBundleDataSource/ABDataSource.cs
@@ -0,0 +1,33 @@
+锘縰sing UnityEditor;
+
+namespace UnityEngine.AssetBundles.AssetBundleDataSource
+{
+    public partial struct ABBuildInfo
+    {
+        public string outputDirectory;
+        public BuildAssetBundleOptions options;
+        public BuildTarget buildTarget;
+    }
+
+    public partial interface ABDataSource
+    {
+        //public static List<ABDataSource> CreateDataSources();
+        string Name { get; }
+        string ProviderName { get; }
+
+        string[] GetAssetPathsFromAssetBundle (string assetBundleName);
+        string GetAssetBundleName(string assetPath);
+        string GetImplicitAssetBundleName(string assetPath);
+        string[] GetAllAssetBundleNames();
+        bool IsReadOnly();
+
+        void SetAssetBundleNameAndVariant (string assetPath, string bundleName, string variantName);
+        void RemoveUnusedAssetBundleNames();
+
+        bool CanSpecifyBuildTarget { get; }
+        bool CanSpecifyBuildOutputDirectory { get; }
+        bool CanSpecifyBuildOptions { get; }
+
+        bool BuildAssetBundles (ABBuildInfo info);
+    }
+}
diff --git a/Assets/Editor/AssetBundleBrowser/AssetBundleDataSource/ABDataSource.cs.meta b/Assets/Editor/AssetBundleBrowser/AssetBundleDataSource/ABDataSource.cs.meta
new file mode 100644
index 0000000..6f71d9c
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/AssetBundleDataSource/ABDataSource.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 27cff74fd1bba9146bcfc85f4c159b2b
+timeCreated: 1499908886
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/AssetBundleBrowser/AssetBundleDataSource/ABDataSourceProvider.cs b/Assets/Editor/AssetBundleBrowser/AssetBundleDataSource/ABDataSourceProvider.cs
new file mode 100644
index 0000000..dfbd86f
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/AssetBundleDataSource/ABDataSourceProvider.cs
@@ -0,0 +1,42 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+
+namespace UnityEngine.AssetBundles.AssetBundleDataSource
+{
+    public class ABDataSourceProviderUtility {
+
+        private static List<Type> s_customNodes;
+
+        public static List<Type> CustomABDataSourceTypes {
+            get {
+                if(s_customNodes == null) {
+                    s_customNodes = BuildCustomABDataSourceList();
+                }
+                return s_customNodes;
+            }
+        }
+
+        private static List<Type> BuildCustomABDataSourceList() {
+            var list = new List<Type>(Assembly
+                .GetExecutingAssembly()
+                .GetTypes()
+                .Where(t => t != typeof(ABDataSource))
+                .Where(t => typeof(ABDataSource).IsAssignableFrom(t)) );
+
+
+            var properList = new List<Type>();
+            properList.Add(null); //empty spot for "default" 
+            for(int count = 0; count < list.Count; count++)
+            {
+                if(list[count].Name == "AssetDatabaseABDataSource")
+                    properList[0] = list[count];
+                else
+                    properList.Add(list[count]);
+            }
+
+            return properList;
+        }
+    }
+}
diff --git a/Assets/Editor/AssetBundleBrowser/AssetBundleDataSource/ABDataSourceProvider.cs.meta b/Assets/Editor/AssetBundleBrowser/AssetBundleDataSource/ABDataSourceProvider.cs.meta
new file mode 100644
index 0000000..bf8bb1a
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/AssetBundleDataSource/ABDataSourceProvider.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: e6e4b74c22791a74598a5887a4dde4f1
+timeCreated: 1499908886
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/AssetBundleBrowser/AssetBundleDataSource/AssetDatabaseABDataSource.cs b/Assets/Editor/AssetBundleBrowser/AssetBundleDataSource/AssetDatabaseABDataSource.cs
new file mode 100644
index 0000000..dc0026d
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/AssetBundleDataSource/AssetDatabaseABDataSource.cs
@@ -0,0 +1,85 @@
+锘縰sing System;
+using UnityEngine;
+using UnityEditor;
+using UnityEngine.Assertions;
+using System.Collections.Generic;
+using System.Linq;
+using UnityEditor.IMGUI.Controls;
+
+namespace UnityEngine.AssetBundles.AssetBundleDataSource
+{
+    public class AssetDatabaseABDataSource : ABDataSource
+    {
+        public static List<ABDataSource> CreateDataSources()
+        {
+            var op = new AssetDatabaseABDataSource();
+            var retList = new List<ABDataSource>();
+            retList.Add(op);
+            return retList;
+        }
+
+        public string Name {
+            get {
+                return "Default";
+            }
+        }
+
+        public string ProviderName {
+            get {
+                return "Built-in";
+            }
+        }
+
+        public string[] GetAssetPathsFromAssetBundle (string assetBundleName) {
+            return AssetDatabase.GetAssetPathsFromAssetBundle(assetBundleName);
+        }
+
+        public string GetAssetBundleName(string assetPath) {
+            var importer = AssetImporter.GetAtPath(assetPath);
+            if (importer == null) {
+                return string.Empty;
+            }
+            var bundleName = importer.assetBundleName;
+            if (importer.assetBundleVariant.Length > 0) {
+                bundleName = bundleName + "." + importer.assetBundleVariant;
+            }
+            return bundleName;
+        }
+
+        public string GetImplicitAssetBundleName(string assetPath) {
+            return AssetDatabase.GetImplicitAssetBundleName (assetPath);
+        }
+
+        public string[] GetAllAssetBundleNames() {
+            return AssetDatabase.GetAllAssetBundleNames ();
+        }
+
+        public bool IsReadOnly() {
+            return false;
+        }
+
+        public void SetAssetBundleNameAndVariant (string assetPath, string bundleName, string variantName) {
+            AssetImporter.GetAtPath(assetPath).SetAssetBundleNameAndVariant(bundleName, variantName);
+        }
+
+        public void RemoveUnusedAssetBundleNames() {
+            AssetDatabase.RemoveUnusedAssetBundleNames ();
+        }
+
+        public bool CanSpecifyBuildTarget { 
+            get { return true; } 
+        }
+        public bool CanSpecifyBuildOutputDirectory { 
+            get { return true; } 
+        }
+
+        public bool CanSpecifyBuildOptions { 
+            get { return true; } 
+        }
+
+        public bool BuildAssetBundles (ABBuildInfo info) {
+            BuildPipeline.BuildAssetBundles(info.outputDirectory, info.options, info.buildTarget);
+            return true;
+        }
+    }
+}
diff --git a/Assets/Editor/AssetBundleBrowser/AssetBundleDataSource/AssetDatabaseABDataSource.cs.meta b/Assets/Editor/AssetBundleBrowser/AssetBundleDataSource/AssetDatabaseABDataSource.cs.meta
new file mode 100644
index 0000000..c7d72ab
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/AssetBundleDataSource/AssetDatabaseABDataSource.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 92f8c138ab1fcfc4397b6fe1f8ac2337
+timeCreated: 1499908886
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/AssetBundleBrowser/AssetBundleManageTab.cs b/Assets/Editor/AssetBundleBrowser/AssetBundleManageTab.cs
new file mode 100644
index 0000000..be0ce87
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/AssetBundleManageTab.cs
@@ -0,0 +1,254 @@
+锘縰sing UnityEditor;
+using UnityEditor.IMGUI.Controls;
+using System.Collections.Generic;
+
+
+namespace UnityEngine.AssetBundles
+{
+    [System.Serializable]
+    public class AssetBundleManageTab 
+    {
+        [SerializeField]
+        TreeViewState m_BundleTreeState;
+        [SerializeField]
+        TreeViewState m_AssetListState;
+        [SerializeField]
+        MultiColumnHeaderState m_AssetListMCHState;
+        [SerializeField]
+        TreeViewState m_BundleDetailState;
+
+        Rect m_Position;
+
+        AssetBundleTree m_BundleTree;
+        AssetListTree m_AssetList;
+        MessageList m_MessageList;
+        BundleDetailList m_DetailsList;
+        bool m_ResizingHorizontalSplitter = false;
+        bool m_ResizingVerticalSplitterRight = false;
+        bool m_ResizingVerticalSplitterLeft = false;
+        Rect m_HorizontalSplitterRect, m_VerticalSplitterRectRight, m_VerticalSplitterRectLeft;
+        [SerializeField]
+        float m_HorizontalSplitterPercent;
+        [SerializeField]
+        float m_VerticalSplitterPercentRight;
+        [SerializeField]
+        float m_VerticalSplitterPercentLeft;
+        const float k_SplitterWidth = 3f;
+        private static float m_UpdateDelay = 0f;
+
+
+        EditorWindow m_Parent = null;
+
+        public AssetBundleManageTab()
+        {
+            m_HorizontalSplitterPercent = 0.4f;
+            m_VerticalSplitterPercentRight = 0.7f;
+            m_VerticalSplitterPercentLeft = 0.85f;
+        }
+
+        public void OnEnable(Rect pos, EditorWindow parent)
+        {
+            m_Parent = parent;
+            m_Position = pos;
+            m_HorizontalSplitterRect = new Rect(
+                (int)(m_Position.x + m_Position.width * m_HorizontalSplitterPercent),
+                m_Position.y,
+                k_SplitterWidth,
+                m_Position.height);
+            m_VerticalSplitterRectRight = new Rect(
+                m_HorizontalSplitterRect.x,
+                (int)(m_Position.y + m_HorizontalSplitterRect.height * m_VerticalSplitterPercentRight),
+                (m_Position.width - m_HorizontalSplitterRect.width) - k_SplitterWidth,
+                k_SplitterWidth);
+            m_VerticalSplitterRectLeft = new Rect(
+                m_Position.x,
+                (int)(m_Position.y + m_HorizontalSplitterRect.height * m_VerticalSplitterPercentLeft),
+                (m_HorizontalSplitterRect.width) - k_SplitterWidth,
+                k_SplitterWidth);
+        }
+
+
+
+        public void Update()
+        {
+            if(Time.realtimeSinceStartup - m_UpdateDelay > 0.1f)
+            {
+                m_UpdateDelay = Time.realtimeSinceStartup;
+
+                if(AssetBundleModel.Model.Update())
+                {
+                    m_Parent.Repaint();
+                }
+
+                if (m_DetailsList != null)
+                    m_DetailsList.Update();
+
+                if (m_AssetList != null)
+                    m_AssetList.Update();
+
+            }
+        }
+
+        public void ForceReloadData()
+        {
+            UpdateSelectedBundles(new List<AssetBundleModel.BundleInfo>());
+            SetSelectedItems(new List<AssetBundleModel.AssetInfo>());
+            AssetBundleModel.Model.ForceReloadData(m_BundleTree);
+            m_Parent.Repaint();
+        }
+
+        public void OnGUI(Rect pos)
+        {
+            m_Position = pos;
+
+            if(m_BundleTree == null)
+            {
+                if (m_AssetListState == null)
+                    m_AssetListState = new TreeViewState();
+
+                var headerState = AssetListTree.CreateDefaultMultiColumnHeaderState();// multiColumnTreeViewRect.width);
+                if (MultiColumnHeaderState.CanOverwriteSerializedFields(m_AssetListMCHState, headerState))
+                    MultiColumnHeaderState.OverwriteSerializedFields(m_AssetListMCHState, headerState);
+                m_AssetListMCHState = headerState;
+
+
+                m_AssetList = new AssetListTree(m_AssetListState, m_AssetListMCHState, this);
+                m_AssetList.Reload();
+                m_MessageList = new MessageList();
+
+                if (m_BundleDetailState == null)
+                    m_BundleDetailState = new TreeViewState();
+                m_DetailsList = new BundleDetailList(m_BundleDetailState);
+                m_DetailsList.Reload();
+
+                if (m_BundleTreeState == null)
+                    m_BundleTreeState = new TreeViewState();
+                m_BundleTree = new AssetBundleTree(m_BundleTreeState, this);
+                m_BundleTree.Refresh();
+                m_Parent.Repaint();
+            }
+            
+            HandleHorizontalResize();
+            HandleVerticalResize();
+
+
+            if (AssetBundleModel.Model.BundleListIsEmpty())
+            {
+                m_BundleTree.OnGUI(m_Position);
+                var style = GUI.skin.label;
+                style.alignment = TextAnchor.MiddleCenter;
+                style.wordWrap = true;
+                GUI.Label(
+                    new Rect(m_Position.x + 1f, m_Position.y + 1f, m_Position.width - 2f, m_Position.height - 2f), 
+                    new GUIContent(AssetBundleModel.Model.GetEmptyMessage()),
+                    style);
+            }
+            else
+            {
+
+                //Left half
+                var bundleTreeRect = new Rect(
+                    m_Position.x,
+                    m_Position.y,
+                    m_HorizontalSplitterRect.x,
+                    m_VerticalSplitterRectLeft.y - m_Position.y);
+                
+                m_BundleTree.OnGUI(bundleTreeRect);
+                m_DetailsList.OnGUI(new Rect(
+                    bundleTreeRect.x,
+                    bundleTreeRect.y + bundleTreeRect.height + k_SplitterWidth,
+                    bundleTreeRect.width,
+                    m_Position.height - bundleTreeRect.height - k_SplitterWidth*2));
+
+
+                //Right half.
+                float panelLeft = m_HorizontalSplitterRect.x + k_SplitterWidth;
+                float panelWidth = m_VerticalSplitterRectRight.width - k_SplitterWidth * 2;
+                float panelHeight = m_VerticalSplitterRectRight.y - m_Position.y;
+                m_AssetList.OnGUI(new Rect(
+                    panelLeft,
+                    m_Position.y,
+                    panelWidth,
+                    panelHeight));
+                m_MessageList.OnGUI(new Rect(
+                    panelLeft,
+                    m_Position.y + panelHeight + k_SplitterWidth,
+                    panelWidth,
+                    (m_Position.height - panelHeight) - k_SplitterWidth * 2));
+
+                if (m_ResizingHorizontalSplitter || m_ResizingVerticalSplitterRight || m_ResizingVerticalSplitterLeft)
+                    m_Parent.Repaint();
+            }
+        }
+
+
+        private void HandleHorizontalResize()
+        {
+            m_HorizontalSplitterRect.x = (int)(m_Position.width * m_HorizontalSplitterPercent);
+            m_HorizontalSplitterRect.height = m_Position.height;
+
+            EditorGUIUtility.AddCursorRect(m_HorizontalSplitterRect, MouseCursor.ResizeHorizontal);
+            if (Event.current.type == EventType.MouseDown && m_HorizontalSplitterRect.Contains(Event.current.mousePosition))
+                m_ResizingHorizontalSplitter = true;
+
+            if (m_ResizingHorizontalSplitter)
+            {
+                m_HorizontalSplitterPercent = Mathf.Clamp(Event.current.mousePosition.x / m_Position.width, 0.1f, 0.9f);
+                m_HorizontalSplitterRect.x = (int)(m_Position.width * m_HorizontalSplitterPercent);
+            }
+
+            if (Event.current.type == EventType.MouseUp)
+                m_ResizingHorizontalSplitter = false;
+        }
+
+        private void HandleVerticalResize()
+        {
+            m_VerticalSplitterRectRight.x = m_HorizontalSplitterRect.x;
+            m_VerticalSplitterRectRight.y = (int)(m_HorizontalSplitterRect.height * m_VerticalSplitterPercentRight);
+            m_VerticalSplitterRectRight.width = m_Position.width - m_HorizontalSplitterRect.x;
+            m_VerticalSplitterRectLeft.y = (int)(m_HorizontalSplitterRect.height * m_VerticalSplitterPercentLeft);
+            m_VerticalSplitterRectLeft.width = m_VerticalSplitterRectRight.width;
+
+
+            EditorGUIUtility.AddCursorRect(m_VerticalSplitterRectRight, MouseCursor.ResizeVertical);
+            if (Event.current.type == EventType.MouseDown && m_VerticalSplitterRectRight.Contains(Event.current.mousePosition))
+                m_ResizingVerticalSplitterRight = true;
+
+            EditorGUIUtility.AddCursorRect(m_VerticalSplitterRectLeft, MouseCursor.ResizeVertical);
+            if (Event.current.type == EventType.MouseDown && m_VerticalSplitterRectLeft.Contains(Event.current.mousePosition))
+                m_ResizingVerticalSplitterLeft = true;
+
+
+            if (m_ResizingVerticalSplitterRight)
+            {
+                m_VerticalSplitterPercentRight = Mathf.Clamp(Event.current.mousePosition.y / m_HorizontalSplitterRect.height, 0.2f, 0.98f);
+                m_VerticalSplitterRectRight.y = (int)(m_HorizontalSplitterRect.height * m_VerticalSplitterPercentRight);
+            }
+            else if (m_ResizingVerticalSplitterLeft)
+            {
+                m_VerticalSplitterPercentLeft = Mathf.Clamp(Event.current.mousePosition.y / m_HorizontalSplitterRect.height, 0.25f, 0.98f);
+                m_VerticalSplitterRectLeft.y = (int)(m_HorizontalSplitterRect.height * m_VerticalSplitterPercentLeft);
+            }
+
+
+            if (Event.current.type == EventType.MouseUp)
+            {
+                m_ResizingVerticalSplitterRight = false;
+                m_ResizingVerticalSplitterLeft = false;
+            }
+        }
+
+        public void UpdateSelectedBundles(IEnumerable<AssetBundleModel.BundleInfo> bundles)
+        {
+            AssetBundleModel.Model.AddBundlesToUpdate(bundles);
+            m_AssetList.SetSelectedBundles(bundles);
+            m_DetailsList.SetItems(bundles);
+            m_MessageList.SetItems(null);
+        }
+
+        public void SetSelectedItems(IEnumerable<AssetBundleModel.AssetInfo> items)
+        {
+            m_MessageList.SetItems(items);
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Editor/AssetBundleBrowser/AssetBundleManageTab.cs.meta b/Assets/Editor/AssetBundleBrowser/AssetBundleManageTab.cs.meta
new file mode 100644
index 0000000..4fc35b5
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/AssetBundleManageTab.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 09f21df0ffab0e841b69215a8a139ff6
+timeCreated: 1499908885
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/AssetBundleBrowser/AssetBundleModel.meta b/Assets/Editor/AssetBundleBrowser/AssetBundleModel.meta
new file mode 100644
index 0000000..6f309f4
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/AssetBundleModel.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: f303c377c98172b43800b835b4b1f4f2
+folderAsset: yes
+timeCreated: 1499908885
+licenseType: Pro
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/AssetBundleBrowser/AssetBundleModel/ABModel.cs b/Assets/Editor/AssetBundleBrowser/AssetBundleModel/ABModel.cs
new file mode 100644
index 0000000..0f607a7
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/AssetBundleModel/ABModel.cs
@@ -0,0 +1,773 @@
+锘縰sing System;
+using UnityEngine;
+using UnityEditor;
+using UnityEngine.Assertions;
+using System.Collections.Generic;
+using System.Linq;
+using UnityEditor.IMGUI.Controls;
+
+using UnityEngine.AssetBundles.AssetBundleDataSource;
+
+namespace UnityEngine.AssetBundles.AssetBundleModel
+{
+    public class Model
+    {
+        const string k_NewBundleBaseName = "newbundle";
+        const string k_NewVariantBaseName = "newvariant";
+        public static /*const*/ Color k_LightGrey = Color.grey * 1.5f;
+
+        private static ABDataSource m_DataSource;
+        private static BundleFolderConcreteInfo m_RootLevelBundles = new BundleFolderConcreteInfo("", null);
+        private static List<ABMoveData> m_MoveData = new List<ABMoveData>();
+        private static List<BundleInfo> m_BundlesToUpdate = new List<BundleInfo>();
+        private static Dictionary<string, AssetInfo> m_GlobalAssetList = new Dictionary<string, AssetInfo>();
+        private static Dictionary<string, HashSet<string>> m_DependencyTracker = new Dictionary<string, HashSet<string>>();
+
+        private static bool m_InErrorState = false;
+        const string k_DefaultEmptyMessage = "Drag assets here or right-click to begin creating bundles.";
+        const string k_ProblemEmptyMessage = "There was a problem parsing the list of bundles. See console.";
+        private static string m_EmptyMessageString;
+
+        static private Texture2D m_folderIcon = null;
+        static private Texture2D m_bundleIcon = null;
+        static private Texture2D m_sceneIcon = null;
+
+        public static ABDataSource DataSource
+        {
+            get
+            {
+                if (m_DataSource == null)
+                {
+                    m_DataSource = new AssetDatabaseABDataSource ();
+                }
+                return m_DataSource;
+            }
+            set { m_DataSource = value; }
+        }
+
+        public static bool Update()
+        {
+            bool shouldRepaint = false;
+            ExecuteAssetMove(false);     //this should never do anything. just a safety check.
+
+            //TODO - look into EditorApplication callback functions.
+            
+            int size = m_BundlesToUpdate.Count;
+            if (size > 0)
+            {
+                m_BundlesToUpdate[size - 1].Update();
+                m_BundlesToUpdate.RemoveAll(item => item.doneUpdating == true);
+                if (m_BundlesToUpdate.Count == 0)
+                {
+                    shouldRepaint = true;
+                    foreach(var bundle in m_RootLevelBundles.GetChildList())
+                    {
+                        bundle.RefreshDupeAssetWarning();
+                    }
+                }
+            }
+            return shouldRepaint;
+        }
+
+        public static void ForceReloadData(TreeView tree)
+        {
+            m_InErrorState = false;
+            Rebuild();
+            tree.Reload();
+            bool doneUpdating = m_BundlesToUpdate.Count == 0;
+
+            EditorUtility.DisplayProgressBar("Updating Bundles", "", 0);
+            int fullBundleCount = m_BundlesToUpdate.Count;
+            while (!doneUpdating && !m_InErrorState)
+            {
+                int currCount = m_BundlesToUpdate.Count;
+                EditorUtility.DisplayProgressBar("Updating Bundles", m_BundlesToUpdate[currCount-1].displayName, (float)(fullBundleCount- currCount) / (float)fullBundleCount);
+                doneUpdating = Update();
+            }
+            EditorUtility.ClearProgressBar();
+        }
+
+        public static void Rebuild()
+        {
+            m_RootLevelBundles = new BundleFolderConcreteInfo("", null);
+            m_MoveData = new List<ABMoveData>();
+            m_BundlesToUpdate = new List<BundleInfo>();
+            m_GlobalAssetList = new Dictionary<string, AssetInfo>();
+            Refresh();
+        }
+
+        public static void AddBundlesToUpdate(IEnumerable<BundleInfo> bundles)
+        {
+            foreach(var bundle in bundles)
+            {
+                bundle.ForceNeedUpdate();
+                m_BundlesToUpdate.Add(bundle);
+            }
+        }
+
+        public static void Refresh()
+        {
+            m_EmptyMessageString = k_ProblemEmptyMessage;
+            if (m_InErrorState)
+                return;
+
+            var bundleList = ValidateBundleList();
+            if(bundleList != null)
+            {
+                m_EmptyMessageString = k_DefaultEmptyMessage;
+                foreach (var bundleName in bundleList)
+                {
+                    AddBundleToModel(bundleName);
+                }
+                AddBundlesToUpdate(m_RootLevelBundles.GetChildList());
+            }
+
+            if(m_InErrorState)
+            {
+                m_RootLevelBundles = new BundleFolderConcreteInfo("", null);
+                m_EmptyMessageString = k_ProblemEmptyMessage;
+            }
+        }
+
+        public static string[] ValidateBundleList()
+        {
+            var bundleList = DataSource.GetAllAssetBundleNames();
+            bool valid = true;
+            HashSet<string> bundleSet = new HashSet<string>();
+            int index = 0;
+            bool attemptedBundleReset = false;
+            while(index < bundleList.Length)
+            {
+                var name = bundleList[index];
+                if (!bundleSet.Add(name))
+                {
+                    LogError("Two bundles share the same name: " + name);
+                    valid = false;
+                }
+
+                int lastDot = name.LastIndexOf('.');
+                if (lastDot > -1)
+                {
+                    var bunName = name.Substring(0, lastDot);
+                    var extraDot = bunName.LastIndexOf('.');
+                    if(extraDot > -1)
+                    {
+                        if(attemptedBundleReset)
+                        {
+                            var message = "Bundle name '" + bunName + "' contains a period.";
+                            message += "  Internally Unity keeps 'bundleName' and 'variantName' separate, but externally treat them as 'bundleName.variantName'.";
+                            message += "  If a bundleName contains a period, the build will (probably) succeed, but this tool cannot tell which portion is bundle and which portion is variant.";
+                            LogError(message);
+                            valid = false;
+                        }
+                        else
+                        {
+                            if (!DataSource.IsReadOnly ())
+                            {
+                                DataSource.RemoveUnusedAssetBundleNames();
+                            }
+                            index = 0;
+                            bundleSet.Clear();
+                            bundleList = DataSource.GetAllAssetBundleNames();
+                            attemptedBundleReset = true;
+                            continue;
+                        }
+                    }
+
+
+                    if (bundleList.Contains(bunName))
+                    {
+                        //there is a bundle.none and a bundle.variant coexisting.  Need to fix that or return an error.
+                        if (attemptedBundleReset)
+                        {
+                            valid = false;
+                            var message = "Bundle name '" + bunName + "' exists without a variant as well as with variant '" + name.Substring(lastDot+1) + "'.";
+                            message += " That is an illegal state that will not build and must be cleaned up.";
+                            LogError(message);
+                        }
+                        else
+                        {
+                            if (!DataSource.IsReadOnly ())
+                            {
+                                DataSource.RemoveUnusedAssetBundleNames();
+                            }
+                            index = 0;
+                            bundleSet.Clear();
+                            bundleList = DataSource.GetAllAssetBundleNames();
+                            attemptedBundleReset = true;
+                            continue;
+                        }
+                    }
+                }
+
+                index++;
+            }
+
+            if (valid)
+                return bundleList;
+            else
+                return null;
+        }
+
+        public static bool BundleListIsEmpty()
+        {
+            return (m_RootLevelBundles.GetChildList().Count() == 0);
+        }
+
+        public static string GetEmptyMessage()
+        {
+            return m_EmptyMessageString;
+        }
+
+        public static BundleInfo CreateEmptyBundle(BundleFolderInfo folder = null, string newName = null)
+        {
+            if ((folder as BundleVariantFolderInfo) != null)
+                return CreateEmptyVariant(folder as BundleVariantFolderInfo);
+
+            folder = (folder == null) ? m_RootLevelBundles : folder;
+            string name = GetUniqueName(folder, newName);
+            BundleNameData nameData;
+            nameData = new BundleNameData(folder.m_Name.bundleName, name);
+            return AddBundleToFolder(folder, nameData);
+        }
+
+        public static BundleInfo CreateEmptyVariant(BundleVariantFolderInfo folder)
+        {
+            string name = GetUniqueName(folder, k_NewVariantBaseName);
+            string variantName = folder.m_Name.bundleName + "." + name;
+            BundleNameData nameData = new BundleNameData(variantName);
+            return AddBundleToFolder(folder.parent, nameData);
+        }
+
+        public static BundleFolderInfo CreateEmptyBundleFolder(BundleFolderConcreteInfo folder = null)
+        {
+            folder = (folder == null) ? m_RootLevelBundles : folder;
+            string name = GetUniqueName(folder) + "/dummy";
+            BundleNameData nameData = new BundleNameData(folder.m_Name.bundleName, name);
+            return AddFoldersToBundle(m_RootLevelBundles, nameData);
+        }
+
+        private static BundleInfo AddBundleToModel(string name)
+        {
+            if (name == null)
+                return null;
+            
+            BundleNameData nameData = new BundleNameData(name);
+
+            BundleFolderInfo folder = AddFoldersToBundle(m_RootLevelBundles, nameData);
+            BundleInfo currInfo = AddBundleToFolder(folder, nameData);
+
+            return currInfo;
+        }
+
+        private static BundleFolderConcreteInfo AddFoldersToBundle(BundleFolderInfo root, BundleNameData nameData)
+        {
+            BundleInfo currInfo = root;
+            var folder = currInfo as BundleFolderConcreteInfo;
+            var size = nameData.pathTokens.Count;
+            for (var index = 0; index < size; index++)
+            {
+                if (folder != null)
+                {
+                    currInfo = folder.GetChild(nameData.pathTokens[index]);
+                    if (currInfo == null)
+                    {
+                        currInfo = new BundleFolderConcreteInfo(nameData.pathTokens, index + 1, folder);
+                        folder.AddChild(currInfo);
+                    }
+
+                    folder = currInfo as BundleFolderConcreteInfo;
+                    if (folder == null)
+                    {
+                        m_InErrorState = true;
+                        LogFolderAndBundleNameConflict(currInfo.m_Name.fullNativeName);
+                        break;
+                    }
+                }
+            }
+            return currInfo as BundleFolderConcreteInfo;
+        }
+
+        private static void LogFolderAndBundleNameConflict(string name)
+        {
+            var message = "Bundle '";
+            message += name;
+            message += "' has a name conflict with a bundle-folder.";
+            message += "Display of bundle data and building of bundles will not work.";
+            message += "\nDetails: If you name a bundle 'x/y', then the result of your build will be a bundle named 'y' in a folder named 'x'.  You thus cannot also have a bundle named 'x' at the same level as the folder named 'x'.";
+            LogError(message);
+        }
+
+        private static BundleInfo AddBundleToFolder(BundleFolderInfo root, BundleNameData nameData)
+        {
+            BundleInfo currInfo = root.GetChild(nameData.shortName);
+            if (nameData.variant != string.Empty)
+            {
+                if(currInfo == null)
+                {
+                    currInfo = new BundleVariantFolderInfo(nameData.bundleName, root);
+                    root.AddChild(currInfo);
+                }
+                var folder = currInfo as BundleVariantFolderInfo;
+                if (folder == null)
+                {
+                    var message = "Bundle named " + nameData.shortName;
+                    message += " exists both as a standard bundle, and a bundle with variants.  ";
+                    message += "This message is not supported for display or actual bundle building.  ";
+                    message += "You must manually fix bundle naming in the inspector.";
+                    
+                    LogError(message);
+                    return null;
+                }
+                
+                
+                currInfo = folder.GetChild(nameData.variant);
+                if (currInfo == null)
+                {
+                    currInfo = new BundleVariantDataInfo(nameData.fullNativeName, folder);
+                    folder.AddChild(currInfo);
+                }
+                
+            }
+            else
+            {
+                if (currInfo == null)
+                {
+                    currInfo = new BundleDataInfo(nameData.fullNativeName, root);
+                    root.AddChild(currInfo);
+                }
+                else
+                {
+                    var dataInfo = currInfo as BundleDataInfo;
+                    if (dataInfo == null)
+                    {
+                        m_InErrorState = true;
+                        LogFolderAndBundleNameConflict(nameData.fullNativeName);
+                    }
+                }
+            }
+            return currInfo;
+        }
+
+        private static string GetUniqueName(BundleFolderInfo folder, string suggestedName = null)
+        {
+            suggestedName = (suggestedName == null) ? k_NewBundleBaseName : suggestedName;
+            string name = suggestedName;
+            int index = 1;
+            bool foundExisting = (folder.GetChild(name) != null);
+            while (foundExisting)
+            {
+                name = suggestedName + index;
+                index++;
+                foundExisting = (folder.GetChild(name) != null);
+            }
+            return name;
+        }
+
+        public static BundleTreeItem CreateBundleTreeView()
+        {
+            return m_RootLevelBundles.CreateTreeView(-1);
+        }
+
+        public static AssetTreeItem CreateAssetListTreeView(IEnumerable<AssetBundleModel.BundleInfo> selectedBundles)
+        {
+            var root = new AssetTreeItem();
+            if (selectedBundles != null)
+            {
+                foreach (var bundle in selectedBundles)
+                {
+                    bundle.AddAssetsToNode(root);
+                }
+            }
+            return root;
+        }
+
+        public static bool HandleBundleRename(BundleTreeItem item, string newName)
+        {
+            var originalName = new BundleNameData(item.bundle.m_Name.fullNativeName);
+
+            var findDot = newName.LastIndexOf('.');
+            var findSlash = newName.LastIndexOf('/');
+            var findBSlash = newName.LastIndexOf('\\');
+            if (findDot == 0 || findSlash == 0 || findBSlash == 0)
+                return false; //can't start a bundle with a / or .
+
+            bool result = item.bundle.HandleRename(newName, 0);
+
+            if (findDot > 0 || findSlash > 0 || findBSlash > 0)
+            {
+                item.bundle.parent.HandleChildRename(newName, string.Empty);
+            }
+
+            ExecuteAssetMove();
+
+            var node = FindBundle(originalName);
+            if (node != null)
+            {
+                var message = "Failed to rename bundle named: ";
+                message += originalName.fullNativeName;
+                message += ".  Most likely this is due to the bundle being assigned to a folder in your Assets directory, AND that folder is either empty or only contains assets that are explicitly assigned elsewhere.";
+                Debug.LogError(message);
+            }
+
+            return result;  
+        }
+
+        public static void HandleBundleReparent(IEnumerable<BundleInfo> bundles, BundleFolderInfo parent)
+        {
+            parent = (parent == null) ? m_RootLevelBundles : parent;
+            foreach (var bundle in bundles)
+            {
+                bundle.HandleReparent(parent.m_Name.bundleName, parent);
+            }
+            ExecuteAssetMove();
+        }
+
+        public static void HandleBundleMerge(IEnumerable<BundleInfo> bundles, BundleDataInfo target)
+        {
+            foreach (var bundle in bundles)
+            {
+                bundle.HandleDelete(true, target.m_Name.bundleName, target.m_Name.variant);
+            }
+            ExecuteAssetMove();
+        }
+
+        public static void HandleBundleDelete(IEnumerable<BundleInfo> bundles)
+        {
+            var nameList = new List<BundleNameData>();
+            foreach (var bundle in bundles)
+            {
+                nameList.Add(bundle.m_Name);
+                bundle.HandleDelete(true);
+            }
+            ExecuteAssetMove();
+
+            //check to see if any bundles are still there...
+            foreach(var name in nameList)
+            {
+                var node = FindBundle(name);
+                if(node != null)
+                {
+                    var message = "Failed to delete bundle named: ";
+                    message += name.fullNativeName;
+                    message += ".  Most likely this is due to the bundle being assigned to a folder in your Assets directory, AND that folder is either empty or only contains assets that are explicitly assigned elsewhere.";
+                    Debug.LogError(message);
+                }
+            }
+        }
+
+        public static BundleInfo FindBundle(BundleNameData name)
+        {
+            BundleInfo currNode = m_RootLevelBundles;
+            foreach (var token in name.pathTokens)
+            {
+                if(currNode is BundleFolderInfo)
+                {
+                    currNode = (currNode as BundleFolderInfo).GetChild(token);
+                    if (currNode == null)
+                        return null;
+                }
+                else
+                {
+                    return null;
+                }
+            }
+
+            if(currNode is BundleFolderInfo)
+            {
+                currNode = (currNode as BundleFolderInfo).GetChild(name.shortName);
+                if(currNode is BundleVariantFolderInfo)
+                {
+                    currNode = (currNode as BundleVariantFolderInfo).GetChild(name.variant);
+                }
+                return currNode;
+            }
+            else
+            {
+                return null;
+            }
+        }
+
+        public static BundleInfo HandleDedupeBundles(IEnumerable<BundleInfo> bundles, bool onlyOverlappedAssets)
+        {
+            var newBundle = CreateEmptyBundle();
+            HashSet<string> dupeAssets = new HashSet<string>();
+            HashSet<string> fullAssetList = new HashSet<string>();
+
+            //if they were just selected, then they may still be updating.
+            bool doneUpdating = m_BundlesToUpdate.Count == 0;
+            while (!doneUpdating)
+                doneUpdating = Update();
+
+            foreach (var bundle in bundles)
+            {
+                foreach (var asset in bundle.GetDependencies())
+                {
+                    if (onlyOverlappedAssets)
+                    {
+                        if (!fullAssetList.Add(asset.fullAssetName))
+                            dupeAssets.Add(asset.fullAssetName);
+                    }
+                    else
+                    {
+                        if (asset.IsMessageSet(MessageSystem.MessageFlag.AssetsDuplicatedInMultBundles))
+                            dupeAssets.Add(asset.fullAssetName);
+                    }
+                }
+            }
+
+            if (dupeAssets.Count == 0)
+                return null;
+            
+            MoveAssetToBundle(dupeAssets, newBundle.m_Name.bundleName, string.Empty);
+            ExecuteAssetMove();
+            return newBundle;
+        }
+
+        public static BundleInfo HandleConvertToVariant(BundleDataInfo bundle)
+        {
+            bundle.HandleDelete(true, bundle.m_Name.bundleName, k_NewVariantBaseName);
+            ExecuteAssetMove();
+            var root = bundle.parent.GetChild(bundle.m_Name.shortName) as BundleVariantFolderInfo;
+
+            if (root != null)
+                return root.GetChild(k_NewVariantBaseName);
+            else
+            {
+                //we got here because the converted bundle was empty.
+                var vfolder = new BundleVariantFolderInfo(bundle.m_Name.bundleName, bundle.parent);
+                var vdata = new BundleVariantDataInfo(bundle.m_Name.bundleName + "." + k_NewVariantBaseName, vfolder);
+                bundle.parent.AddChild(vfolder);
+                vfolder.AddChild(vdata);
+                return vdata;
+            }
+        }
+
+        class ABMoveData
+        {
+            public string assetName;
+            public string bundleName;
+            public string variantName;
+            public ABMoveData(string asset, string bundle, string variant)
+            {
+                assetName = asset;
+                bundleName = bundle;
+                variantName = variant;
+            }
+            public void Apply()
+            {
+                if (!DataSource.IsReadOnly ())
+                {
+                    DataSource.SetAssetBundleNameAndVariant(assetName, bundleName, variantName);
+                }
+            }
+        }
+        public static void MoveAssetToBundle(AssetInfo asset, string bundleName, string variant)
+        {
+            m_MoveData.Add(new ABMoveData(asset.fullAssetName, bundleName, variant));
+        }
+        public static void MoveAssetToBundle(string assetName, string bundleName, string variant)
+        {
+            m_MoveData.Add(new ABMoveData(assetName, bundleName, variant));
+        }
+        public static void MoveAssetToBundle(IEnumerable<AssetInfo> assets, string bundleName, string variant)
+        {
+            foreach (var asset in assets)
+                MoveAssetToBundle(asset, bundleName, variant);
+        }
+        public static void MoveAssetToBundle(IEnumerable<string> assetNames, string bundleName, string variant)
+        {
+            foreach (var assetName in assetNames)
+                MoveAssetToBundle(assetName, bundleName, variant);
+        }
+
+        public static void ExecuteAssetMove(bool forceAct=true)
+        {
+            var size = m_MoveData.Count;
+            if(forceAct)
+            {
+                if (size > 0)
+                {
+                    bool autoRefresh = EditorPrefs.GetBool("kAutoRefresh");
+                    EditorPrefs.SetBool("kAutoRefresh", false);
+                    EditorUtility.DisplayProgressBar("Moving assets to bundles", "", 0);
+                    for (int i = 0; i < size; i++)
+                    {
+                        EditorUtility.DisplayProgressBar("Moving assets to bundle " + m_MoveData[i].bundleName, System.IO.Path.GetFileNameWithoutExtension(m_MoveData[i].assetName), (float)i / (float)size);
+                        m_MoveData[i].Apply();
+                    }
+                    EditorUtility.ClearProgressBar();
+                    EditorPrefs.SetBool("kAutoRefresh", autoRefresh);
+                    m_MoveData.Clear();
+                }
+                if (!DataSource.IsReadOnly ())
+                {
+                    DataSource.RemoveUnusedAssetBundleNames();
+                }
+                Refresh();
+            }
+        }
+        
+        //this version of CreateAsset is only used for dependent assets. 
+        public static AssetInfo CreateAsset(string name, AssetInfo parent)
+        {
+            if (ValidateAsset(name))
+            {
+                var bundleName = GetBundleName(name); 
+                return CreateAsset(name, bundleName, parent);
+            }
+            return null;
+        }
+
+        public static AssetInfo CreateAsset(string name, string bundleName)
+        {
+            if(ValidateAsset(name))
+            {
+                return CreateAsset(name, bundleName, null);
+            }
+            return null;
+        }
+
+        private static AssetInfo CreateAsset(string name, string bundleName, AssetInfo parent)
+        {
+            if(bundleName != string.Empty)
+            {
+                return new AssetInfo(name, bundleName);
+            }
+            else
+            {
+                AssetInfo info = null;
+                if(!m_GlobalAssetList.TryGetValue(name, out info))
+                {
+                    info = new AssetInfo(name, string.Empty);
+                    m_GlobalAssetList.Add(name, info);
+                }
+                info.AddParent(parent.displayName);
+                return info;
+            }
+
+        }
+
+        public static bool ValidateAsset(string name)
+        {
+            if (!name.StartsWith("Assets/"))
+                return false;
+            string ext = System.IO.Path.GetExtension(name);
+            if (ext == ".dll" || ext == ".cs" || ext == ".meta" || ext == ".js" || ext == ".boo")
+                return false;
+
+            return true;
+        }
+
+        internal static string GetBundleName(string asset)
+        {
+            return DataSource.GetAssetBundleName (asset);
+        }
+
+        public static int RegisterAsset(AssetInfo asset, string bundle)
+        {
+            if(m_DependencyTracker.ContainsKey(asset.fullAssetName))
+            {
+                m_DependencyTracker[asset.fullAssetName].Add(bundle);
+                int count = m_DependencyTracker[asset.fullAssetName].Count;
+                if (count > 1)
+                    asset.SetMessageFlag(MessageSystem.MessageFlag.AssetsDuplicatedInMultBundles, true);
+                return count;
+            }
+
+            var bundles = new HashSet<string>();
+            bundles.Add(bundle);
+            m_DependencyTracker.Add(asset.fullAssetName, bundles);
+            return 1;            
+        }
+
+        public static void UnRegisterAsset(AssetInfo asset, string bundle)
+        {
+            if (m_DependencyTracker == null || asset == null)
+                return;
+
+            if (m_DependencyTracker.ContainsKey(asset.fullAssetName))
+            {
+                m_DependencyTracker[asset.fullAssetName].Remove(bundle);
+                int count = m_DependencyTracker[asset.fullAssetName].Count;
+                switch (count)
+                {
+                    case 0:
+                        m_DependencyTracker.Remove(asset.fullAssetName);
+                        break;
+                    case 1:
+                        asset.SetMessageFlag(MessageSystem.MessageFlag.AssetsDuplicatedInMultBundles, false);
+                        break;
+                    default:
+                        break;
+                }
+            }
+        }
+
+        public static IEnumerable<string> CheckDependencyTracker(AssetInfo asset)
+        {
+            if (m_DependencyTracker.ContainsKey(asset.fullAssetName))
+            {
+                return m_DependencyTracker[asset.fullAssetName];
+            }
+            return new HashSet<string>();
+        }
+        
+        //TODO - switch local cache server on and utilize this method to stay up to date.
+        //static List<string> m_importedAssets = new List<string>();
+        //static List<string> m_deletedAssets = new List<string>();
+        //static List<KeyValuePair<string, string>> m_movedAssets = new List<KeyValuePair<string, string>>();
+        //class AssetBundleChangeListener : AssetPostprocessor
+        //{
+        //    static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
+        //    {
+        //        m_importedAssets.AddRange(importedAssets);
+        //        m_deletedAssets.AddRange(deletedAssets);
+        //        for (int i = 0; i < movedAssets.Length; i++)
+        //            m_movedAssets.Add(new KeyValuePair<string, string>(movedFromAssetPaths[i], movedAssets[i]));
+        //        //m_dirty = true;
+        //    }
+        //}
+
+        static public void LogError(string message)
+        {
+            Debug.LogError("AssetBundleBrowser: " + message);
+        }
+        static public void LogWarning(string message)
+        {
+            Debug.LogWarning("AssetBundleBrowser: " + message);
+        }
+
+        static public Texture2D GetFolderIcon()
+        {
+            if (m_folderIcon == null)
+                FindBundleIcons();
+            return m_folderIcon;
+        }
+        static public Texture2D GetBundleIcon()
+        {
+            if (m_bundleIcon == null)
+                FindBundleIcons();
+            return m_bundleIcon;
+        }
+        static public Texture2D GetSceneIcon()
+        {
+            if (m_sceneIcon == null)
+                FindBundleIcons();
+            return m_sceneIcon;
+        }
+        static private void FindBundleIcons()
+        {
+            m_folderIcon = EditorGUIUtility.FindTexture("Folder Icon");
+            string[] icons = AssetDatabase.FindAssets("ABundleBrowserIconY1756");
+            foreach (string i in icons)
+            {
+                string name = AssetDatabase.GUIDToAssetPath(i);
+                if (name.Contains("ABundleBrowserIconY1756Basic.png"))
+                    m_bundleIcon = (Texture2D)AssetDatabase.LoadAssetAtPath(name, typeof(Texture2D));
+                else if (name.Contains("ABundleBrowserIconY1756Scene.png"))
+                    m_sceneIcon = (Texture2D)AssetDatabase.LoadAssetAtPath(name, typeof(Texture2D));
+            }
+        }
+    }
+}
diff --git a/Assets/Editor/AssetBundleBrowser/AssetBundleModel/ABModel.cs.meta b/Assets/Editor/AssetBundleBrowser/AssetBundleModel/ABModel.cs.meta
new file mode 100644
index 0000000..378bc5c
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/AssetBundleModel/ABModel.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 2d70d587215726c40ad3dd9d300187b4
+timeCreated: 1499908886
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/AssetBundleBrowser/AssetBundleModel/ABModelAssetInfo.cs b/Assets/Editor/AssetBundleBrowser/AssetBundleModel/ABModelAssetInfo.cs
new file mode 100644
index 0000000..8210ed2
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/AssetBundleModel/ABModelAssetInfo.cs
@@ -0,0 +1,228 @@
+锘縰sing System;
+using UnityEngine;
+using UnityEditor;
+using System.Collections.Generic;
+using System.Linq;
+using UnityEditor.IMGUI.Controls;
+
+namespace UnityEngine.AssetBundles.AssetBundleModel
+{
+    public class AssetTreeItem : TreeViewItem
+    {
+        private AssetInfo m_asset;
+        public AssetInfo asset
+        {
+            get { return m_asset; }
+        }
+        public AssetTreeItem() : base(-1, -1) { }
+        public AssetTreeItem(AssetInfo a) : base(a != null ? a.fullAssetName.GetHashCode() : Random.Range(int.MinValue, int.MaxValue), 0, a != null ? a.displayName : "failed")
+        {
+            m_asset = a;
+            if (a != null)
+                icon = AssetDatabase.GetCachedIcon(a.fullAssetName) as Texture2D;
+        }
+
+        private Color m_color = new Color(0, 0, 0, 0);
+        public Color itemColor
+        {
+            get
+            {
+                if (m_color.a == 0.0f && m_asset != null)
+                {
+                    m_color = m_asset.GetColor();
+                }
+                return m_color;
+            }
+            set { m_color = value; }
+        }
+        public Texture2D MessageIcon()
+        {
+            return MessageSystem.GetIcon(HighestMessageLevel());
+        }
+        public MessageType HighestMessageLevel()
+        {
+            return m_asset != null ?
+                m_asset.HighestMessageLevel() : MessageType.Error;
+        }
+
+        public bool ContainsChild(AssetInfo asset)
+        {
+            bool contains = false;
+            if (children == null)
+                return contains;
+
+            if (asset == null)
+                return false;
+            foreach (var child in children)
+            {
+                var c = child as AssetTreeItem;
+                if (c != null && c.asset != null && c.asset.fullAssetName == asset.fullAssetName)
+                {
+                    contains = true;
+                    break;
+                }
+            }
+
+            return contains;
+        }
+
+
+    }
+
+    public class AssetInfo
+    {
+        public bool isScene { get; set; }
+        public bool isFolder { get; set; }
+        public long fileSize;
+
+        private HashSet<string> m_Parents;
+        private string m_AssetName;
+        private string m_DisplayName;
+        private string m_BundleName;
+        private MessageSystem.MessageState m_AssetMessages = new MessageSystem.MessageState();
+
+        public AssetInfo(string inName, string bundleName="")
+        {
+            fullAssetName = inName;
+            m_BundleName = bundleName;
+            m_Parents = new HashSet<string>();
+            isScene = false;
+            isFolder = false;
+        }
+
+        public string fullAssetName
+        {
+            get { return m_AssetName; }
+            set
+            {
+                m_AssetName = value;
+                m_DisplayName = System.IO.Path.GetFileNameWithoutExtension(m_AssetName);
+
+                //TODO - maybe there's a way to ask the AssetDatabase for this size info.
+                System.IO.FileInfo fileInfo = new System.IO.FileInfo(m_AssetName);
+                if (fileInfo.Exists)
+                    fileSize = fileInfo.Length;
+                else
+                    fileSize = 0;
+            }
+        }
+        public string displayName
+        {
+            get { return m_DisplayName; }
+        }
+        public string bundleName
+        { get { return m_BundleName == "" ? "auto" : m_BundleName; } }
+        
+        public Color GetColor()
+        {
+            if (m_BundleName == "")
+                return Model.k_LightGrey;
+            else
+                return Color.white;
+        }
+
+        public bool IsMessageSet(MessageSystem.MessageFlag flag)
+        {
+            return m_AssetMessages.IsSet(flag);
+        }
+        public void SetMessageFlag(MessageSystem.MessageFlag flag, bool on)
+        {
+            m_AssetMessages.SetFlag(flag, on);
+        }
+        public MessageType HighestMessageLevel()
+        {
+            return m_AssetMessages.HighestMessageLevel();
+        }
+        public IEnumerable<MessageSystem.Message> GetMessages()
+        {
+            List<MessageSystem.Message> messages = new List<MessageSystem.Message>();
+            if(IsMessageSet(MessageSystem.MessageFlag.SceneBundleConflict))
+            {
+                var message = displayName + "\n";
+                if (isScene)
+                    message += "Is a scene that is in a bundle with non-scene assets. Scene bundles must have only one or more scene assets.";
+                else
+                    message += "Is included in a bundle with a scene. Scene bundles must have only one or more scene assets.";
+                messages.Add(new MessageSystem.Message(message, MessageType.Error));
+            }
+            if(IsMessageSet(MessageSystem.MessageFlag.DependencySceneConflict))
+            {
+                var message = displayName + "\n";
+                message += MessageSystem.GetMessage(MessageSystem.MessageFlag.DependencySceneConflict).message;
+                messages.Add(new MessageSystem.Message(message, MessageType.Error));
+            }
+            if (IsMessageSet(MessageSystem.MessageFlag.AssetsDuplicatedInMultBundles))
+            {
+                var bundleNames = AssetBundleModel.Model.CheckDependencyTracker(this);
+                string message = displayName + "\n" + "Is auto-included in multiple bundles:\n";
+                foreach(var bundleName in bundleNames)
+                {
+                    message += bundleName + ", ";
+                }
+                message = message.Substring(0, message.Length - 2);//remove trailing comma.
+                messages.Add(new MessageSystem.Message(message, MessageType.Warning));
+            }
+
+            if (m_BundleName == string.Empty && m_Parents.Count > 0)
+            {
+                //TODO - refine the parent list to only include those in the current asset list
+                var message = displayName + "\n" + "Is auto included in bundle(s) due to parent(s): \n";
+                foreach (var parent in m_Parents)
+                {
+                    message += parent + ", ";
+                }
+                message = message.Substring(0, message.Length - 2);//remove trailing comma.
+                messages.Add(new MessageSystem.Message(message, MessageType.Info));
+            }
+
+            messages.Add(new MessageSystem.Message(displayName + "\n" + "Path: " + fullAssetName, MessageType.Info));
+
+            return messages;
+        }
+        public void AddParent(string name)
+        {
+            m_Parents.Add(name);
+        }
+        public void RemoveParent(string name)
+        {
+            m_Parents.Remove(name);
+        }
+
+        public string GetSizeString()
+        {
+            if (fileSize == 0)
+                return "--";
+            return EditorUtility.FormatBytes(fileSize);
+        }
+
+        List<AssetInfo> m_dependencies = null;
+        public List<AssetInfo> GetDependencies()
+        {
+            //TODO - not sure this refreshes enough. need to build tests around that.
+            if (m_dependencies == null)
+            {
+                m_dependencies = new List<AssetInfo>();
+                if (AssetDatabase.IsValidFolder(m_AssetName))
+                {
+                    //if we have a folder, its dependencies were already pulled in through alternate means.  no need to GatherFoldersAndFiles
+                    //GatherFoldersAndFiles();
+                }
+                else
+                {
+                    foreach (var dep in AssetDatabase.GetDependencies(m_AssetName, true))
+                    {
+                        if (dep != m_AssetName)
+                        {
+                            var asset = Model.CreateAsset(dep, this);
+                            if (asset != null)
+                                m_dependencies.Add(asset);
+                        }
+                    }
+                }
+            }
+            return m_dependencies;
+        }
+
+    }
+
+}
diff --git a/Assets/Editor/AssetBundleBrowser/AssetBundleModel/ABModelAssetInfo.cs.meta b/Assets/Editor/AssetBundleBrowser/AssetBundleModel/ABModelAssetInfo.cs.meta
new file mode 100644
index 0000000..67109d3
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/AssetBundleModel/ABModelAssetInfo.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: fa05db261cceb4f4e866a0d21a2bf0bd
+timeCreated: 1499908886
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/AssetBundleBrowser/AssetBundleModel/ABModelBundleInfo.cs b/Assets/Editor/AssetBundleBrowser/AssetBundleModel/ABModelBundleInfo.cs
new file mode 100644
index 0000000..527d9b6
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/AssetBundleModel/ABModelBundleInfo.cs
@@ -0,0 +1,964 @@
+锘縰sing System;
+using UnityEngine;
+using UnityEditor;
+using System.Collections.Generic;
+using System.Linq;
+using UnityEditor.IMGUI.Controls;
+
+namespace UnityEngine.AssetBundles.AssetBundleModel
+{
+    public class BundleTreeItem : TreeViewItem
+    {
+        private BundleInfo m_Bundle;
+        public BundleInfo bundle
+        {
+            get { return m_Bundle; }
+        }
+        public BundleTreeItem(BundleInfo b, int depth, Texture2D iconTexture) : base(b.nameHashCode, depth, b.displayName)
+        {
+            m_Bundle = b;
+            icon = iconTexture;
+            children = new List<TreeViewItem>();
+        }
+
+        public MessageSystem.Message BundleMessage()
+        {
+            return m_Bundle.HighestMessage();
+        }
+    }
+
+    public class BundleNameData
+    {
+        private List<string> m_PathTokens;
+        private string m_FullBundleName;
+        private string m_ShortName;
+        private string m_VariantName;
+        private string m_FullNativeName;
+
+        //input (received from native) is a string of format:
+        //  /folder0/.../folderN/name.variant
+        //it's broken into:
+        //  /m_pathTokens[0]/.../m_pathTokens[n]/m_shortName.m_variantName
+        // and...
+        //  m_fullBundleName = /m_pathTokens[0]/.../m_pathTokens[n]/m_shortName
+        // and...
+        //  m_fullNativeName = m_fullBundleName.m_variantName which is the same as the initial input.
+        public BundleNameData(string name) { SetName(name); }
+        public BundleNameData(string path, string name)
+        {
+            string finalName = path == "" ? "" : path + '/';
+            finalName += name;
+            SetName(finalName);
+        }
+        public override int GetHashCode()
+        {
+            return fullNativeName.GetHashCode();
+        }
+        public string fullNativeName
+        { get { return m_FullNativeName; } }
+
+        public void SetBundleName(string bundleName, string variantName)
+        {
+            string name = bundleName;
+            name += (variantName == "") ? "" : "." + variantName;
+            SetName(name);
+        }
+        public string bundleName
+        {
+            get { return m_FullBundleName; }
+            //set { SetName(value); }
+        }
+        public string shortName
+        {
+            get { return m_ShortName; }
+        }
+        public string variant
+        {
+            get { return m_VariantName; }
+            set
+            {
+                m_VariantName = value;
+                m_FullNativeName = m_FullBundleName;
+                m_FullNativeName += (m_VariantName == "") ? "" : "." + m_VariantName;
+            }
+        }
+        public List<string> pathTokens
+        {
+            get { return m_PathTokens; }
+            set
+            {
+                m_PathTokens = value.GetRange(0, value.Count-1);
+                SetShortName(value.Last());
+                GenerateFullName();
+            }
+        }
+
+        private void SetName(string name)
+        {
+            if(m_PathTokens == null)
+                m_PathTokens = new List<string>();
+            else
+                m_PathTokens.Clear();
+
+            int indexOfSlash = name.IndexOf('/');
+            int previousIndex = 0;
+            while(indexOfSlash != -1)
+            {
+                m_PathTokens.Add(name.Substring(previousIndex, (indexOfSlash - previousIndex)));
+                previousIndex = indexOfSlash + 1;
+                indexOfSlash = name.IndexOf('/', previousIndex);
+            }
+            SetShortName(name.Substring(previousIndex));
+            GenerateFullName();
+        }
+        private void SetShortName(string inputName)
+        {
+            m_ShortName = inputName;
+            int indexOfDot = m_ShortName.LastIndexOf('.');
+            if (indexOfDot > -1)
+            {
+                m_VariantName = m_ShortName.Substring(indexOfDot + 1);
+                m_ShortName = m_ShortName.Substring(0, indexOfDot);
+            }
+            else
+                m_VariantName = string.Empty;
+        }
+
+        public void PartialNameChange(string newToken, int indexFromBack)
+        {
+            if(indexFromBack == 0)
+            {
+                 SetShortName(newToken);
+            }
+            else if(indexFromBack-1 < m_PathTokens.Count)
+            {
+                m_PathTokens[m_PathTokens.Count - indexFromBack] = newToken;
+            }
+            GenerateFullName();
+        }
+
+        private void GenerateFullName()
+        {
+            m_FullBundleName = string.Empty;
+            for(int i = 0; i < m_PathTokens.Count; i++)
+            {
+                m_FullBundleName += m_PathTokens[i];
+                m_FullBundleName += '/';
+            }
+            m_FullBundleName += m_ShortName;
+            m_FullNativeName = m_FullBundleName;
+            m_FullNativeName += (m_VariantName == "") ? "" : "." + m_VariantName;
+        }
+    }
+
+    public abstract class BundleInfo
+    {
+        protected BundleFolderInfo m_Parent;
+        protected bool m_DoneUpdating;
+        protected bool m_Dirty;
+        public BundleNameData m_Name;
+        protected MessageSystem.MessageState m_BundleMessages = new MessageSystem.MessageState();
+        protected MessageSystem.Message m_CachedHighMessage = null;
+
+        public BundleInfo(string name, BundleFolderInfo parent)
+        {
+            m_Name = new BundleNameData(name);
+            m_Parent = parent;
+        }
+
+        public BundleFolderInfo parent
+        { get { return m_Parent; } }
+        public virtual string displayName
+        {
+            get { return m_Name.shortName; }
+        }
+        public virtual int nameHashCode
+        {
+            get { return m_Name.GetHashCode(); }
+        }
+        public abstract BundleTreeItem CreateTreeView(int depth);
+
+        protected virtual void RefreshMessages()
+        {
+            RefreshEmptyStatus();
+            RefreshDupeAssetWarning();
+            var flag = m_BundleMessages.HighestMessageFlag();
+            m_CachedHighMessage = MessageSystem.GetMessage(flag);
+        }
+        public abstract bool RefreshEmptyStatus();
+        public abstract bool RefreshDupeAssetWarning();
+        public virtual MessageSystem.Message HighestMessage()
+        {
+            if (m_CachedHighMessage == null)
+                RefreshMessages();
+            return m_CachedHighMessage;
+        }
+        public bool IsMessageSet(MessageSystem.MessageFlag flag)
+        {
+            return m_BundleMessages.IsSet(flag);
+        }
+        public void SetMessageFlag(MessageSystem.MessageFlag flag, bool on)
+        {
+            m_BundleMessages.SetFlag(flag, on);
+        }
+        public List<MessageSystem.Message> GetMessages()
+        {
+            return m_BundleMessages.GetMessages();
+        }
+        public bool HasMessages()
+        {
+            return m_BundleMessages.HasMessages();
+        }
+
+        public virtual bool HandleRename(string newName, int reverseDepth)
+        {
+            if (reverseDepth == 0)
+            {
+                if (!m_Parent.HandleChildRename(m_Name.shortName, newName))
+                    return false;
+            }
+            m_Name.PartialNameChange(newName, reverseDepth);
+            return true;
+        }
+        public virtual void HandleDelete(bool isRootOfDelete, string forcedNewName="", string forcedNewVariant = "")
+        {
+            if(isRootOfDelete)
+            {
+                m_Parent.HandleChildRename(m_Name.shortName, string.Empty);
+            }
+        }
+        abstract public void RefreshAssetList();
+        abstract public void AddAssetsToNode(AssetTreeItem node);
+        abstract public void Update();
+        public virtual bool doneUpdating
+        { get { return m_DoneUpdating; } }
+        public virtual bool dirty
+        { get { return m_Dirty; } }
+        public void ForceNeedUpdate()
+        {
+            m_DoneUpdating = false;
+            m_Dirty = true;
+        }
+
+        abstract public void HandleReparent(string parentName, BundleFolderInfo newParent = null);
+        abstract public List<AssetInfo> GetDependencies();
+    }
+
+    public class BundleDataInfo : BundleInfo
+    {
+        protected List<AssetInfo> m_ConcreteAssets;
+        protected List<AssetInfo> m_DependentAssets;
+        protected HashSet<string> m_BundleDependencies;
+        protected int m_ConcreteCounter;
+        protected int m_DependentCounter;
+        protected bool m_IsSceneBundle;
+        protected long m_TotalSize;
+
+        public BundleDataInfo(string name, BundleFolderInfo parent) : base(name, parent)
+        {
+            m_ConcreteAssets = new List<AssetInfo>();
+            m_DependentAssets = new List<AssetInfo>();
+            m_BundleDependencies = new HashSet<string>();
+            m_ConcreteCounter = 0;
+            m_DependentCounter = 0;
+        }
+        ~BundleDataInfo()
+        {
+            foreach (var asset in m_DependentAssets)
+            {
+                AssetBundleModel.Model.UnRegisterAsset(asset, m_Name.fullNativeName);
+            }
+        }
+        public override bool HandleRename(string newName, int reverseDepth)
+        { 
+            RefreshAssetList();
+            if (!base.HandleRename(newName, reverseDepth))
+                return false;
+            Model.MoveAssetToBundle(m_ConcreteAssets, m_Name.bundleName, m_Name.variant);
+            return true;
+        }
+        public override void HandleDelete(bool isRootOfDelete, string forcedNewName="", string forcedNewVariant="")
+        {
+            RefreshAssetList();
+            base.HandleDelete(isRootOfDelete);
+            Model.MoveAssetToBundle(m_ConcreteAssets, forcedNewName, forcedNewVariant);
+        }
+
+        public string TotalSize()
+        {
+            if (m_TotalSize == 0)
+                return "--";
+            return EditorUtility.FormatBytes(m_TotalSize);
+        }
+
+        public override void RefreshAssetList()
+        {
+            m_BundleMessages.SetFlag(MessageSystem.MessageFlag.AssetsDuplicatedInMultBundles, false);
+            m_BundleMessages.SetFlag(MessageSystem.MessageFlag.SceneBundleConflict, false);
+            m_BundleMessages.SetFlag(MessageSystem.MessageFlag.DependencySceneConflict, false);
+
+            m_ConcreteAssets.Clear();
+            m_TotalSize = 0;
+            m_IsSceneBundle = false;
+
+            foreach (var asset in m_DependentAssets)
+            {
+                AssetBundleModel.Model.UnRegisterAsset(asset, m_Name.fullNativeName);
+            }
+            m_DependentAssets.Clear();
+            m_BundleDependencies.Clear();
+            
+            bool assetInBundle = false;
+            bool sceneError = false;
+            var assets = AssetBundleModel.Model.DataSource.GetAssetPathsFromAssetBundle(m_Name.fullNativeName);
+            foreach(var assetName in assets)
+            {
+                if (AssetDatabase.GetMainAssetTypeAtPath(assetName) == typeof(SceneAsset))
+                {
+                    m_IsSceneBundle = true;
+                    if(assetInBundle)
+                        sceneError = true;
+                }
+                else
+                {
+                    assetInBundle = true;
+                    if (m_IsSceneBundle)
+                        sceneError = true;
+                }
+
+                var bundleName = Model.GetBundleName(assetName);
+                if (bundleName == string.Empty)  
+                {
+                    ///we get here if the current asset is only added due to being in an explicitly added folder
+                    
+
+                    var partialPath = assetName;
+                    while(
+                        partialPath != string.Empty && 
+                        partialPath != "Assets" &&
+                        bundleName == string.Empty)
+                    {
+                        partialPath = partialPath.Substring(0, partialPath.LastIndexOf('/'));
+                        bundleName = Model.GetBundleName(partialPath);
+                    }
+                    if(bundleName != string.Empty)
+                    {
+                        var folderAsset = Model.CreateAsset(partialPath, bundleName);
+                        folderAsset.isFolder = true;
+                        if (m_ConcreteAssets.FindIndex(a => a.displayName == folderAsset.displayName) == -1)
+                        {
+                            m_ConcreteAssets.Add(folderAsset);
+                        }
+                        
+                        m_DependentAssets.Add(Model.CreateAsset(assetName, folderAsset));
+                        if (m_DependentAssets != null && m_DependentAssets.Count > 0)
+                        {
+                            var last = m_DependentAssets.Last();
+                            if (last != null)
+                                m_TotalSize += last.fileSize;
+                        }
+                    }
+                }
+                else
+                {
+                    var newAsset = Model.CreateAsset (assetName, m_Name.fullNativeName);
+                    if (newAsset != null)
+                    {
+                        m_ConcreteAssets.Add(newAsset);
+                        m_TotalSize += m_ConcreteAssets.Last().fileSize;
+                        if (AssetDatabase.GetMainAssetTypeAtPath(assetName) == typeof(SceneAsset))
+                        {
+                            m_IsSceneBundle = true;
+                            m_ConcreteAssets.Last().isScene = true;
+                        }
+                    }
+                }
+            }
+            
+            if(sceneError)
+            {
+                foreach (var asset in m_ConcreteAssets)
+                {
+                    if (asset.isFolder)
+                    {
+                        asset.SetMessageFlag(MessageSystem.MessageFlag.DependencySceneConflict, true);
+                        m_BundleMessages.SetFlag(MessageSystem.MessageFlag.DependencySceneConflict, true);
+                    }
+                    else
+                    {
+                        asset.SetMessageFlag(MessageSystem.MessageFlag.SceneBundleConflict, true);
+                        m_BundleMessages.SetFlag(MessageSystem.MessageFlag.SceneBundleConflict, true);
+                    }
+                }
+            }
+
+
+            m_ConcreteCounter = 0;
+            m_DependentCounter = 0;
+            m_Dirty = true;
+        }
+
+        public override void AddAssetsToNode(AssetTreeItem node)
+        {
+            foreach (var asset in m_ConcreteAssets)
+                node.AddChild(new AssetTreeItem(asset));
+
+            foreach (var asset in m_DependentAssets)
+            {
+                if(!node.ContainsChild(asset))
+                    node.AddChild(new AssetTreeItem(asset));
+            }
+
+            m_Dirty = false;
+        }
+        public HashSet<string> GetBundleDependencies()
+        {
+            return m_BundleDependencies;
+        }
+
+        public override void Update()
+        {
+            int dependents = m_DependentAssets.Count;
+            int bundleDep = m_BundleDependencies.Count;
+            if(m_ConcreteCounter < m_ConcreteAssets.Count)
+            {
+                GatherDependencies(m_ConcreteAssets[m_ConcreteCounter]);
+                m_ConcreteCounter++;
+                m_DoneUpdating = false;
+            }
+            else if (m_DependentCounter < m_DependentAssets.Count)
+            {
+                GatherDependencies(m_DependentAssets[m_DependentCounter], m_Name.fullNativeName);
+                m_DependentCounter++;
+                m_DoneUpdating = false;
+            }
+            else
+            {
+                m_DoneUpdating = true;
+            }
+            m_Dirty = (dependents != m_DependentAssets.Count) || (bundleDep != m_BundleDependencies.Count);
+            if (m_Dirty || m_DoneUpdating)
+                RefreshMessages();
+        }
+
+        private void GatherDependencies(AssetInfo asset, string parentBundle = "")
+        {
+            if (parentBundle == string.Empty)
+                parentBundle = asset.bundleName;
+
+            if (asset == null)
+                return;
+
+            var deps = asset.GetDependencies();
+            if (deps == null)
+                return;
+
+            foreach (var ai in deps)
+            {
+                if (ai == asset || m_ConcreteAssets.Contains(ai) || m_DependentAssets.Contains(ai))
+                    continue;
+
+                var bundleName = AssetBundleModel.Model.DataSource.GetImplicitAssetBundleName(ai.fullAssetName);
+                if (string.IsNullOrEmpty(bundleName))
+                {
+                    m_DependentAssets.Add(ai);
+                    m_TotalSize += ai.fileSize;
+                    if (Model.RegisterAsset(ai, parentBundle) > 1)
+                    {
+                        SetDuplicateWarning();
+                    }
+                }
+                else if(bundleName != m_Name.fullNativeName)
+                {
+                    m_BundleDependencies.Add(bundleName);
+                }
+            }
+        }
+
+        public override bool RefreshDupeAssetWarning()
+        {
+            foreach(var asset in m_DependentAssets)
+            {
+                if (asset != null && asset.IsMessageSet(MessageSystem.MessageFlag.AssetsDuplicatedInMultBundles)) 
+                {
+                    SetDuplicateWarning();
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        public bool IsEmpty()
+        {
+            return (m_ConcreteAssets.Count == 0);
+        }
+
+        public override bool RefreshEmptyStatus()
+        {
+            bool empty = IsEmpty();
+            m_BundleMessages.SetFlag(MessageSystem.MessageFlag.EmptyBundle, empty);
+            return empty;
+        }
+
+        protected void SetDuplicateWarning()
+        {
+            m_BundleMessages.SetFlag(MessageSystem.MessageFlag.AssetsDuplicatedInMultBundles, true);
+            m_Dirty = true;
+        }
+
+        public bool isSceneBundle
+        { get { return m_IsSceneBundle; } }
+
+        public override BundleTreeItem CreateTreeView(int depth)
+        {
+            RefreshAssetList();
+            RefreshMessages();
+            if (isSceneBundle)
+                return new BundleTreeItem(this, depth, Model.GetSceneIcon());
+            else
+                return new BundleTreeItem(this, depth, Model.GetBundleIcon());
+        }
+
+        public override void HandleReparent(string parentName, BundleFolderInfo newParent = null)
+        {
+            RefreshAssetList();
+            string newName = (parentName=="") ? "" : parentName + '/';
+            newName += m_Name.shortName;
+            if (newName == m_Name.bundleName)
+                return;
+            
+            foreach (var asset in m_ConcreteAssets)
+            {
+                Model.MoveAssetToBundle(asset, newName, m_Name.variant);
+            }
+
+            if (newParent != null)
+            {
+                m_Parent.HandleChildRename(m_Name.shortName, string.Empty);
+                m_Parent = newParent;
+                m_Parent.AddChild(this);
+            }
+            m_Name.SetBundleName(newName, m_Name.variant);
+        }
+
+        public override List<AssetInfo> GetDependencies()
+        {
+            return m_DependentAssets;
+        }
+    }
+
+    public class BundleVariantDataInfo : BundleDataInfo
+    {
+        protected List<AssetInfo> m_FolderIncludeAssets = new List<AssetInfo>();
+        public BundleVariantDataInfo(string name, BundleFolderInfo parent) : base(name, parent)
+        {
+        }
+        ~BundleVariantDataInfo()
+        {
+            //parent should be auto called
+        }
+        public override string displayName
+        {
+            get { return m_Name.variant; }
+        }
+        public override void Update()
+        {
+            base.Update();
+            (m_Parent as BundleVariantFolderInfo).ValidateVariants();
+        }
+        public override void RefreshAssetList()
+        {
+            m_FolderIncludeAssets.Clear();
+            base.RefreshAssetList();
+            if(m_DependentAssets.Count > 0)
+                m_FolderIncludeAssets = new List<AssetInfo>(m_DependentAssets);
+        }
+        public bool IsSceneVariant()
+        {
+            RefreshAssetList();
+            return isSceneBundle;
+        }
+        public override bool HandleRename(string newName, int reverseDepth)
+        {
+            if (reverseDepth == 0)
+            {
+                RefreshAssetList();
+                if (!m_Parent.HandleChildRename(m_Name.variant, newName))
+                    return false;
+                m_Name.variant = newName;
+                Model.MoveAssetToBundle(m_ConcreteAssets, m_Name.bundleName, m_Name.variant);
+            }
+            else if (reverseDepth == 1)
+            {
+                RefreshAssetList();
+                m_Name.PartialNameChange(newName + "." + m_Name.variant, 0);
+                Model.MoveAssetToBundle(m_ConcreteAssets, m_Name.bundleName, m_Name.variant);
+            }
+            else
+            {
+                return base.HandleRename(newName, reverseDepth-1);
+            }
+            return true;
+        }
+        public override void HandleDelete(bool isRootOfDelete, string forcedNewName = "", string forcedNewVariant = "")
+        {
+            RefreshAssetList();
+            if (isRootOfDelete)
+            {
+                m_Parent.HandleChildRename(m_Name.variant, string.Empty);
+            }
+            Model.MoveAssetToBundle(m_ConcreteAssets, forcedNewName, forcedNewVariant);
+        }
+
+        public bool FindContentMismatch(BundleVariantDataInfo other)
+        {
+            bool result = false;
+
+            if (m_FolderIncludeAssets.Count != 0 || other.m_FolderIncludeAssets.Count != 0)
+            {
+                var myUniqueAssets = new HashSet<string>();
+                var otherUniqueAssets = new HashSet<string>(other.m_FolderIncludeAssets.Select(x => x.displayName));
+
+                foreach (var asset in m_FolderIncludeAssets)
+                {
+                    if (!otherUniqueAssets.Remove(asset.displayName))
+                    {
+                        myUniqueAssets.Add(asset.displayName);
+                    }
+                }
+
+                if (myUniqueAssets.Count > 0)
+                {
+                    m_BundleMessages.SetFlag(MessageSystem.MessageFlag.VariantBundleMismatch, true);
+                    result = true;
+                }
+                if (otherUniqueAssets.Count > 0)
+                {
+                    other.m_BundleMessages.SetFlag(MessageSystem.MessageFlag.VariantBundleMismatch, true);
+                    result = true;
+                }
+            }
+            else //this doesn't cover the super weird case of including a folder and some explicit assets. TODO - fix that.
+            {
+                var myUniqueAssets = new HashSet<string>();
+                var otherUniqueAssets = new HashSet<string>(other.m_ConcreteAssets.Select(x => x.displayName));
+
+                foreach (var asset in m_ConcreteAssets)
+                {
+                    if (!otherUniqueAssets.Remove(asset.displayName))
+                    {
+                        myUniqueAssets.Add(asset.displayName);
+                    }
+                }
+
+                if (myUniqueAssets.Count > 0)
+                {
+                    m_BundleMessages.SetFlag(MessageSystem.MessageFlag.VariantBundleMismatch, true);
+                    result = true;
+                }
+                if (otherUniqueAssets.Count > 0)
+                {
+                    other.m_BundleMessages.SetFlag(MessageSystem.MessageFlag.VariantBundleMismatch, true);
+                    result = true;
+                }
+            }
+            return result;
+        }
+    }
+
+
+    public abstract class BundleFolderInfo : BundleInfo
+    {
+        protected Dictionary<string, BundleInfo> m_Children;
+
+        public BundleFolderInfo(string name, BundleFolderInfo parent) : base(name, parent)
+        {
+            m_Children = new Dictionary<string, BundleInfo>();
+        }
+        
+        public BundleFolderInfo(List<string> path, int depth, BundleFolderInfo parent) : base("", parent)
+        {
+            m_Children = new Dictionary<string, BundleInfo>();
+            m_Name = new BundleNameData("");
+            m_Name.pathTokens = path.GetRange(0, depth);
+        }
+
+        public BundleInfo GetChild(string name)
+        {
+            if (name == null)
+                return null;
+
+            BundleInfo info = null;
+            if (m_Children.TryGetValue(name, out info))
+                return info;
+            return null;
+        }
+        public Dictionary<string, BundleInfo>.ValueCollection GetChildList()
+        {
+            return m_Children.Values;
+        }
+        public abstract void AddChild(BundleInfo info);
+
+        public override bool HandleRename(string newName, int reverseDepth)
+        {
+            if (!base.HandleRename(newName, reverseDepth))
+                return false;
+
+            foreach (var child in m_Children)
+            {
+                child.Value.HandleRename(newName, reverseDepth + 1);
+            }
+            return true;
+        }
+
+        public override void HandleDelete(bool isRootOfDelete, string forcedNewName="", string forcedNewVariant = "")
+        {
+            base.HandleDelete(isRootOfDelete);
+            foreach (var child in m_Children)
+            {
+                child.Value.HandleDelete(false, forcedNewName, forcedNewVariant);
+            }
+            m_Children.Clear();
+        }
+
+        protected override void RefreshMessages()
+        {
+            m_BundleMessages.SetFlag(MessageSystem.MessageFlag.ErrorInChildren, false);
+            foreach(var child in m_Children)
+            {
+                if (child.Value.IsMessageSet(MessageSystem.MessageFlag.Error))
+                {
+                    m_BundleMessages.SetFlag(MessageSystem.MessageFlag.ErrorInChildren, true);
+                    break;
+                }
+            }
+            base.RefreshMessages();
+        }
+        public override bool RefreshEmptyStatus()
+        {
+            bool empty = m_Children.Count == 0;
+            foreach (var child in m_Children)
+            {
+                empty |= child.Value.RefreshEmptyStatus();
+            }
+            m_BundleMessages.SetFlag(MessageSystem.MessageFlag.EmptyFolder, empty);
+            return empty;
+        }
+
+        public override void RefreshAssetList()
+        {
+            foreach (var child in m_Children)
+            {
+                child.Value.RefreshAssetList();
+            }
+        }
+        public override bool RefreshDupeAssetWarning()
+        {
+            bool dupeWarning = false;
+            foreach (var child in m_Children)
+            {
+                dupeWarning |= child.Value.RefreshDupeAssetWarning();
+            }
+            m_BundleMessages.SetFlag(MessageSystem.MessageFlag.WarningInChildren, dupeWarning);
+            return dupeWarning;
+        }
+        public override void AddAssetsToNode(AssetTreeItem node)
+        {
+            foreach (var child in m_Children)
+            {
+                child.Value.AddAssetsToNode(node);
+            }
+            m_Dirty = false;
+        }
+        public virtual bool HandleChildRename(string oldName, string newName)
+        {
+
+            if (newName != string.Empty && m_Children.ContainsKey(newName))
+            {
+                Model.LogWarning("Attempting to name an item '" + newName + "' which matches existing name at this level in hierarchy.  If your desire is to merge bundles, drag one on top of the other.");
+                return false;
+            }
+
+            BundleInfo info = null;
+            if (m_Children.TryGetValue(oldName, out info))
+            {
+                m_Children.Remove(oldName);
+                if (newName != string.Empty)
+                    m_Children.Add(newName, info);
+            }
+            return true;
+        }
+
+        public override void Update()
+        {
+            m_Dirty = false;
+            m_DoneUpdating = true;
+            foreach (var child in m_Children)
+            {
+                child.Value.Update();
+                m_Dirty |= child.Value.dirty;
+                m_DoneUpdating &= child.Value.doneUpdating;
+            }
+
+            if (m_Dirty || m_DoneUpdating)
+                RefreshMessages();
+        }
+        public override bool doneUpdating
+        {
+            get
+            {
+                foreach (var child in m_Children)
+                {
+                    m_DoneUpdating &= child.Value.doneUpdating;
+                }
+                return base.doneUpdating;
+            }
+        }
+
+
+        public override List<AssetInfo> GetDependencies()
+        {
+            List<AssetInfo> assets = new List<AssetInfo>();
+            foreach (var child in m_Children)
+            {
+                assets.AddRange(child.Value.GetDependencies());
+            }
+            return assets;
+        }
+    }
+
+    public class BundleFolderConcreteInfo : BundleFolderInfo
+    {
+        public BundleFolderConcreteInfo(string name, BundleFolderInfo parent) : base(name, parent)
+        {
+        }
+
+        public BundleFolderConcreteInfo(List<string> path, int depth, BundleFolderInfo parent) : base(path, depth, parent)
+        {
+        }
+
+        public override void AddChild(BundleInfo info)
+        {
+            m_Children.Add(info.displayName, info);
+        }
+        public override BundleTreeItem CreateTreeView(int depth)
+        {
+            RefreshMessages();
+            var result = new BundleTreeItem(this, depth, Model.GetFolderIcon());
+            foreach (var child in m_Children)
+            {
+                result.AddChild(child.Value.CreateTreeView(depth + 1));
+            }
+            return result;
+        }
+        public override void HandleReparent(string parentName, BundleFolderInfo newParent = null)
+        {
+            string newName = (parentName == "") ? "" : parentName + '/';
+            newName += displayName;
+            if (newName == m_Name.bundleName)
+                return;
+            foreach (var child in m_Children)
+            {
+                child.Value.HandleReparent(newName);
+            }
+
+            if (newParent != null)
+            {
+                m_Parent.HandleChildRename(m_Name.shortName, string.Empty);
+                m_Parent = newParent;
+                m_Parent.AddChild(this);
+            }
+            m_Name.SetBundleName(newName, m_Name.variant);
+        }
+    }
+
+
+    public class BundleVariantFolderInfo : BundleFolderInfo
+    {
+        public BundleVariantFolderInfo(string name, BundleFolderInfo parent) : base(name, parent)
+        {
+        }
+        public override void AddChild(BundleInfo info)
+        {
+            m_Children.Add(info.m_Name.variant, info);
+        }
+        private bool m_validated;
+        public override void Update()
+        {
+            m_validated = false;
+            base.Update();
+            if(!m_validated)
+               ValidateVariants();
+        }
+        public void ValidateVariants()
+        {
+            m_validated = true;
+            bool childMismatch = false;
+            if(m_Children.Count > 1)
+            {
+                BundleVariantDataInfo goldChild = null;
+                foreach(var c in m_Children)
+                {
+                    var child = c.Value as BundleVariantDataInfo;
+                    child.SetMessageFlag(MessageSystem.MessageFlag.VariantBundleMismatch, false);
+                    if (goldChild == null)
+                    {
+                        goldChild = child;
+                        continue;
+                    }
+                    childMismatch |= goldChild.FindContentMismatch(child);
+                }
+            }
+            m_BundleMessages.SetFlag(MessageSystem.MessageFlag.VariantBundleMismatch, childMismatch);
+
+        }
+
+        public override BundleTreeItem CreateTreeView(int depth)
+        {
+            RefreshMessages();
+            Texture2D icon = null;
+            if ((m_Children.Count > 0) &&
+                ((m_Children.First().Value as BundleVariantDataInfo).IsSceneVariant()))
+            {
+                icon = Model.GetSceneIcon();
+            }
+            else
+                icon = Model.GetBundleIcon();
+
+            var result = new BundleTreeItem(this, depth, icon);
+            foreach (var child in m_Children)
+            {
+                result.AddChild(child.Value.CreateTreeView(depth + 1));
+            }
+            return result;
+        }
+
+        public override void HandleReparent(string parentName, BundleFolderInfo newParent = null)
+        {
+            string newName = (parentName == "") ? "" : parentName + '/';
+            newName += displayName;
+            if (newName == m_Name.bundleName)
+                return;
+            foreach (var child in m_Children)
+            {
+                child.Value.HandleReparent(parentName);
+            }
+
+            if (newParent != null)
+            {
+                m_Parent.HandleChildRename(m_Name.shortName, string.Empty);
+                m_Parent = newParent;
+                m_Parent.AddChild(this);
+            }
+            m_Name.SetBundleName(newName, string.Empty) ;
+        }
+        public override bool HandleChildRename(string oldName, string newName)
+        {
+            var result = base.HandleChildRename(oldName, newName);
+            if (m_Children.Count == 0)
+                HandleDelete(true);
+            return result;
+        }
+    }
+
+}
diff --git a/Assets/Editor/AssetBundleBrowser/AssetBundleModel/ABModelBundleInfo.cs.meta b/Assets/Editor/AssetBundleBrowser/AssetBundleModel/ABModelBundleInfo.cs.meta
new file mode 100644
index 0000000..a6bad7a
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/AssetBundleModel/ABModelBundleInfo.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 5221bce31edb15f4b929b93f967fe170
+timeCreated: 1499908886
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/AssetBundleBrowser/AssetBundleTree.cs b/Assets/Editor/AssetBundleBrowser/AssetBundleTree.cs
new file mode 100644
index 0000000..b8e409f
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/AssetBundleTree.cs
@@ -0,0 +1,638 @@
+锘縰sing UnityEditor;
+using UnityEditorInternal;
+using System.Collections.Generic;
+using UnityEditor.IMGUI.Controls;
+using System.Linq;
+using System;
+
+
+namespace UnityEngine.AssetBundles
+{
+    internal class AssetBundleTree : TreeView
+    { 
+        AssetBundleManageTab m_Controller;
+        private bool m_ContextOnItem = false;
+        List<UnityEngine.Object> m_EmptyObjectList = new List<Object>();
+
+        public AssetBundleTree(TreeViewState state, AssetBundleManageTab ctrl) : base(state)
+        {
+            AssetBundleModel.Model.Rebuild();
+            m_Controller = ctrl;
+            showBorder = true;
+        }
+
+        protected override bool CanMultiSelect(TreeViewItem item)
+        {
+            return true;
+        }
+
+        protected override bool CanRename(TreeViewItem item)
+        {
+            return item.displayName.Length > 0;
+        }
+
+        protected override void RowGUI(RowGUIArgs args)
+        {
+            var bundleItem = (args.item as AssetBundleModel.BundleTreeItem);
+            if (args.item.icon == null)
+                extraSpaceBeforeIconAndLabel = 16f;
+            else
+                extraSpaceBeforeIconAndLabel = 0f;
+
+            Color old = GUI.color;
+            if ((bundleItem.bundle as AssetBundleModel.BundleVariantFolderInfo) != null)
+                GUI.color = AssetBundleModel.Model.k_LightGrey; //new Color(0.3f, 0.5f, 0.85f);
+            base.RowGUI(args);
+            GUI.color = old;
+
+            var message = bundleItem.BundleMessage();
+            if(message.severity != MessageType.None)
+            {
+                var size = args.rowRect.height;
+                var right = args.rowRect.xMax;
+                Rect messageRect = new Rect(right - size, args.rowRect.yMin, size, size);
+                GUI.Label(messageRect, new GUIContent(message.icon, message.message ));
+            }
+        }
+
+        protected override void RenameEnded(RenameEndedArgs args)
+        { 
+            base.RenameEnded(args);
+            if (args.newName.Length > 0 && args.newName != args.originalName)
+            {
+                args.newName = args.newName.ToLower();
+                args.acceptedRename = true;
+
+                AssetBundleModel.BundleTreeItem renamedItem = FindItem(args.itemID, rootItem) as AssetBundleModel.BundleTreeItem;
+                args.acceptedRename = AssetBundleModel.Model.HandleBundleRename(renamedItem, args.newName);
+                ReloadAndSelect(renamedItem.bundle.nameHashCode, false);
+            }
+            else
+            {
+                args.acceptedRename = false;
+            }
+        }
+
+        protected override TreeViewItem BuildRoot()
+        {
+            AssetBundleModel.Model.Refresh();
+            var root = AssetBundleModel.Model.CreateBundleTreeView();
+            return root;
+        }
+
+        protected override void SelectionChanged(IList<int> selectedIds)
+        {
+
+            var selectedBundles = new List<AssetBundleModel.BundleInfo>();
+            if (selectedIds != null)
+            {
+                foreach (var id in selectedIds)
+                {
+                    var item = FindItem(id, rootItem) as AssetBundleModel.BundleTreeItem;
+                    if(item != null && item.bundle != null)
+                    {
+                        item.bundle.RefreshAssetList();
+                        selectedBundles.Add(item.bundle);
+                    }
+                }
+            }
+
+            m_Controller.UpdateSelectedBundles(selectedBundles);
+        }
+
+        public override void OnGUI(Rect rect)
+        {
+            base.OnGUI(rect);
+            if(Event.current.type == EventType.MouseDown && Event.current.button == 0 && rect.Contains(Event.current.mousePosition))
+            {
+                SetSelection(new int[0], TreeViewSelectionOptions.FireSelectionChanged);
+            }
+        }
+
+
+        protected override void ContextClicked()
+        {
+            if (m_ContextOnItem)
+            {
+                m_ContextOnItem = false;
+                return;
+            }
+
+            List<AssetBundleModel.BundleTreeItem> selectedNodes = new List<AssetBundleModel.BundleTreeItem>();
+            GenericMenu menu = new GenericMenu();
+
+            if (!AssetBundleModel.Model.DataSource.IsReadOnly ()) {
+                menu.AddItem(new GUIContent("Add new bundle"), false, CreateNewBundle, selectedNodes); 
+                menu.AddItem(new GUIContent("Add new folder"), false, CreateFolder, selectedNodes);
+            }
+
+            menu.AddItem(new GUIContent("Reload all data"), false, ForceReloadData, selectedNodes);
+            menu.ShowAsContext();
+        }
+
+        protected override void ContextClickedItem(int id)
+        {
+            if (AssetBundleModel.Model.DataSource.IsReadOnly ()) {
+                return;
+            }
+
+            m_ContextOnItem = true;
+            List<AssetBundleModel.BundleTreeItem> selectedNodes = new List<AssetBundleModel.BundleTreeItem>();
+            foreach (var nodeID in GetSelection())
+            {
+                selectedNodes.Add(FindItem(nodeID, rootItem) as AssetBundleModel.BundleTreeItem);
+            }
+            
+            GenericMenu menu = new GenericMenu();
+            
+            if(selectedNodes.Count == 1)
+            {
+                if ((selectedNodes[0].bundle as AssetBundleModel.BundleFolderConcreteInfo) != null)
+                {
+                    menu.AddItem(new GUIContent("Add Child/New Bundle"), false, CreateNewBundle, selectedNodes);
+                    menu.AddItem(new GUIContent("Add Child/New Folder"), false, CreateFolder, selectedNodes);
+                    menu.AddItem(new GUIContent("Add Sibling/New Bundle"), false, CreateNewSiblingBundle, selectedNodes);
+                    menu.AddItem(new GUIContent("Add Sibling/New Folder"), false, CreateNewSiblingFolder, selectedNodes);
+                }
+                else if( (selectedNodes[0].bundle as AssetBundleModel.BundleVariantFolderInfo) != null)
+                {
+                    menu.AddItem(new GUIContent("Add Child/New Variant"), false, CreateNewVariant, selectedNodes);
+                    menu.AddItem(new GUIContent("Add Sibling/New Bundle"), false, CreateNewSiblingBundle, selectedNodes);
+                    menu.AddItem(new GUIContent("Add Sibling/New Folder"), false, CreateNewSiblingFolder, selectedNodes);
+                }
+                else
+                {
+                    var variant = selectedNodes[0].bundle as AssetBundleModel.BundleVariantDataInfo;
+                    if (variant == null)
+                    {
+                        menu.AddItem(new GUIContent("Add Sibling/New Bundle"), false, CreateNewSiblingBundle, selectedNodes);
+                        menu.AddItem(new GUIContent("Add Sibling/New Folder"), false, CreateNewSiblingFolder, selectedNodes);
+                        menu.AddItem(new GUIContent("Convert to variant"), false, ConvertToVariant, selectedNodes);
+                    }
+                    else
+                    {
+                        menu.AddItem(new GUIContent("Add Sibling/New Variant"), false, CreateNewSiblingVariant, selectedNodes);
+                    }
+                }
+                if(selectedNodes[0].bundle.IsMessageSet(MessageSystem.MessageFlag.AssetsDuplicatedInMultBundles))
+                    menu.AddItem(new GUIContent("Move duplicates to new bundle"), false, DedupeAllBundles, selectedNodes);
+                menu.AddItem(new GUIContent("Rename"), false, RenameBundle, selectedNodes);
+                menu.AddItem(new GUIContent("Delete " + selectedNodes[0].displayName), false, DeleteBundles, selectedNodes);
+                
+            }
+            else if (selectedNodes.Count > 1)
+            { 
+                menu.AddItem(new GUIContent("Move duplicates shared by selected"), false, DedupeOverlappedBundles, selectedNodes);
+                menu.AddItem(new GUIContent("Move duplicates existing in any selected"), false, DedupeAllBundles, selectedNodes);
+                menu.AddItem(new GUIContent("Delete " + selectedNodes.Count + " selected bundles"), false, DeleteBundles, selectedNodes);
+            }
+            menu.ShowAsContext();
+        }
+        void ForceReloadData(object context)
+        {
+            AssetBundleModel.Model.ForceReloadData(this);
+        }
+
+        void CreateNewSiblingFolder(object context)
+        {
+            var selectedNodes = context as List<AssetBundleModel.BundleTreeItem>;
+            if (selectedNodes != null && selectedNodes.Count > 0)
+            {
+                AssetBundleModel.BundleFolderConcreteInfo folder = null;
+                folder = selectedNodes[0].bundle.parent as AssetBundleModel.BundleFolderConcreteInfo;
+                CreateFolderUnderParent(folder);
+            }
+            else
+                Debug.LogError("could not add 'sibling' with no bundles selected");
+        }
+        void CreateFolder(object context)
+        {
+            AssetBundleModel.BundleFolderConcreteInfo folder = null;
+            var selectedNodes = context as List<AssetBundleModel.BundleTreeItem>;
+            if (selectedNodes != null && selectedNodes.Count > 0)
+            {
+                folder = selectedNodes[0].bundle as AssetBundleModel.BundleFolderConcreteInfo;
+            }
+            CreateFolderUnderParent(folder);
+        }
+        void CreateFolderUnderParent(AssetBundleModel.BundleFolderConcreteInfo folder)
+        {
+            var newBundle = AssetBundleModel.Model.CreateEmptyBundleFolder(folder);
+            ReloadAndSelect(newBundle.nameHashCode, true);
+        }
+        void RenameBundle(object context)
+        {
+            var selectedNodes = context as List<AssetBundleModel.BundleTreeItem>;
+            if (selectedNodes != null && selectedNodes.Count > 0)
+            {
+                BeginRename(FindItem(selectedNodes[0].bundle.nameHashCode, rootItem));
+            }
+        }
+
+        void CreateNewSiblingBundle(object context)
+        {
+            var selectedNodes = context as List<AssetBundleModel.BundleTreeItem>;
+            if (selectedNodes != null && selectedNodes.Count > 0)
+            {
+                AssetBundleModel.BundleFolderConcreteInfo folder = null;
+                folder = selectedNodes[0].bundle.parent as AssetBundleModel.BundleFolderConcreteInfo;
+                CreateBundleUnderParent(folder);
+            }
+            else
+                Debug.LogError("could not add 'sibling' with no bundles selected");
+        }
+        void CreateNewBundle(object context)
+        {
+            AssetBundleModel.BundleFolderConcreteInfo folder = null;
+            var selectedNodes = context as List<AssetBundleModel.BundleTreeItem>;
+            if (selectedNodes != null && selectedNodes.Count > 0)
+            {
+                folder = selectedNodes[0].bundle as AssetBundleModel.BundleFolderConcreteInfo;
+            }
+            CreateBundleUnderParent(folder);
+        }
+
+        void CreateBundleUnderParent(AssetBundleModel.BundleFolderInfo folder)
+        {
+            var newBundle = AssetBundleModel.Model.CreateEmptyBundle(folder);
+            ReloadAndSelect(newBundle.nameHashCode, true);
+        }
+
+
+        void CreateNewSiblingVariant(object context)
+        {
+            var selectedNodes = context as List<AssetBundleModel.BundleTreeItem>;
+            if (selectedNodes != null && selectedNodes.Count > 0)
+            {
+                AssetBundleModel.BundleVariantFolderInfo folder = null;
+                folder = selectedNodes[0].bundle.parent as AssetBundleModel.BundleVariantFolderInfo;
+                CreateVariantUnderParent(folder);
+            }
+            else
+                Debug.LogError("could not add 'sibling' with no bundles selected");
+        }
+        void CreateNewVariant(object context)
+        {
+            AssetBundleModel.BundleVariantFolderInfo folder = null;
+            var selectedNodes = context as List<AssetBundleModel.BundleTreeItem>;
+            if (selectedNodes != null && selectedNodes.Count == 1)
+            {
+                folder = selectedNodes[0].bundle as AssetBundleModel.BundleVariantFolderInfo;
+                CreateVariantUnderParent(folder);
+            }
+        }
+        void CreateVariantUnderParent(AssetBundleModel.BundleVariantFolderInfo folder)
+        {
+            if (folder != null)
+            {
+                var newBundle = AssetBundleModel.Model.CreateEmptyVariant(folder);
+                ReloadAndSelect(newBundle.nameHashCode, true);
+            }
+        }
+
+        void ConvertToVariant(object context)
+        {
+            var selectedNodes = context as List<AssetBundleModel.BundleTreeItem>;
+            if (selectedNodes.Count == 1)
+            {
+                var bundle = selectedNodes[0].bundle as AssetBundleModel.BundleDataInfo;
+                var newBundle = AssetBundleModel.Model.HandleConvertToVariant(bundle);
+                int hash = 0;
+                if (newBundle != null)
+                    hash = newBundle.nameHashCode;
+                ReloadAndSelect(hash, true);
+            }
+        }
+
+        void DedupeOverlappedBundles(object context)
+        {
+            DedupeBundles(context, true);
+        }
+        void DedupeAllBundles(object context)
+        {
+            DedupeBundles(context, false);
+        }
+        void DedupeBundles(object context, bool onlyOverlappedAssets)
+        {
+            var selectedNodes = context as List<AssetBundleModel.BundleTreeItem>;
+            var newBundle = AssetBundleModel.Model.HandleDedupeBundles(selectedNodes.Select(item => item.bundle), onlyOverlappedAssets);
+            if(newBundle != null)
+            {
+                var selection = new List<int>();
+                selection.Add(newBundle.nameHashCode);
+                ReloadAndSelect(selection);
+            }
+            else
+            {
+                if (onlyOverlappedAssets)
+                    Debug.LogWarning("There were no duplicated assets that existed across all selected bundles.");
+                else
+                    Debug.LogWarning("No duplicate assets found after refreshing bundle contents.");
+            }
+        }
+
+        void DeleteBundles(object b)
+        {
+            var selectedNodes = b as List<AssetBundleModel.BundleTreeItem>;
+            AssetBundleModel.Model.HandleBundleDelete(selectedNodes.Select(item => item.bundle));
+            ReloadAndSelect(new List<int>());
+
+
+        }
+        protected override void KeyEvent()
+        {
+            if (Event.current.keyCode == KeyCode.Delete && GetSelection().Count > 0)
+            {
+                List<AssetBundleModel.BundleTreeItem> selectedNodes = new List<AssetBundleModel.BundleTreeItem>();
+                foreach (var nodeID in GetSelection())
+                {
+                    selectedNodes.Add(FindItem(nodeID, rootItem) as AssetBundleModel.BundleTreeItem);
+                }
+                DeleteBundles(selectedNodes);
+            }
+        }
+
+        class DragAndDropData
+        {
+            public bool hasBundleFolder = false;
+            public bool hasScene = false;
+            public bool hasNonScene = false;
+            public bool hasVariantChild = false;
+            public List<AssetBundleModel.BundleInfo> draggedNodes;
+            public AssetBundleModel.BundleTreeItem targetNode;
+            public DragAndDropArgs args;
+            public string[] paths;
+
+            public DragAndDropData(DragAndDropArgs a)
+            {
+                args = a;
+                draggedNodes = DragAndDrop.GetGenericData("AssetBundleModel.BundleInfo") as List<AssetBundleModel.BundleInfo>;
+                targetNode = args.parentItem as AssetBundleModel.BundleTreeItem;
+                paths = DragAndDrop.paths;
+
+                if (draggedNodes != null)
+                {
+                    foreach (var bundle in draggedNodes)
+                    {
+                        if ((bundle as AssetBundleModel.BundleFolderInfo) != null)
+                        {
+                            hasBundleFolder = true;
+                        }
+                        else
+                        {
+                            var dataBundle = bundle as AssetBundleModel.BundleDataInfo;
+                            if (dataBundle != null)
+                            {
+                                if (dataBundle.isSceneBundle)
+                                    hasScene = true;
+                                else
+                                    hasNonScene = true;
+
+                                if ( (dataBundle as AssetBundleModel.BundleVariantDataInfo) != null)
+                                    hasVariantChild = true;
+                            }
+                        }
+                    }
+                }
+                else if (DragAndDrop.paths != null)
+                {
+                    foreach (var assetPath in DragAndDrop.paths)
+                    {
+                        if (AssetDatabase.GetMainAssetTypeAtPath(assetPath) == typeof(SceneAsset))
+                            hasScene = true;
+                        else
+                            hasNonScene = true;
+                    }
+                }
+            }
+
+        }
+        protected override DragAndDropVisualMode HandleDragAndDrop(DragAndDropArgs args)
+        {
+            DragAndDropVisualMode visualMode = DragAndDropVisualMode.None;
+            DragAndDropData data = new DragAndDropData(args);
+            
+            if (AssetBundleModel.Model.DataSource.IsReadOnly ()) {
+                return DragAndDropVisualMode.Rejected;
+            }
+
+            if ( (data.hasScene && data.hasNonScene) ||
+                (data.hasVariantChild) )
+                return DragAndDropVisualMode.Rejected;
+            
+            switch (args.dragAndDropPosition)
+            {
+                case DragAndDropPosition.UponItem:
+                    visualMode = HandleDragDropUpon(data);
+                    break;
+                case DragAndDropPosition.BetweenItems:
+                    visualMode = HandleDragDropBetween(data);
+                    break;
+                case DragAndDropPosition.OutsideItems:
+                    if (data.draggedNodes != null)
+                    {
+                        visualMode = DragAndDropVisualMode.Copy;
+                        if (data.args.performDrop)
+                        {
+                            AssetBundleModel.Model.HandleBundleReparent(data.draggedNodes, null);
+                            Reload();
+                        }
+                    }
+                    else if(data.paths != null)
+                    {
+                        visualMode = DragAndDropVisualMode.Copy;
+                        if (data.args.performDrop)
+                        {
+                            DragPathsToNewSpace(data.paths, null);
+                        }
+                    }
+                    break;
+            }
+            return visualMode;
+        }
+
+        private DragAndDropVisualMode HandleDragDropUpon(DragAndDropData data)
+        {
+            DragAndDropVisualMode visualMode = DragAndDropVisualMode.Copy;//Move;
+            var targetDataBundle = data.targetNode.bundle as AssetBundleModel.BundleDataInfo;
+            if (targetDataBundle != null)
+            {
+                if (targetDataBundle.isSceneBundle)
+                {
+                    if(data.hasNonScene)
+                        return DragAndDropVisualMode.Rejected;
+                }
+                else
+                {
+                    if (data.hasBundleFolder)
+                    {
+                        return DragAndDropVisualMode.Rejected;
+                    }
+                    else if (data.hasScene && !targetDataBundle.IsEmpty())
+                    {
+                        return DragAndDropVisualMode.Rejected;
+                    }
+
+                }
+
+               
+                if (data.args.performDrop)
+                {
+                    if (data.draggedNodes != null)
+                    {
+                        AssetBundleModel.Model.HandleBundleMerge(data.draggedNodes, targetDataBundle);
+                        ReloadAndSelect(targetDataBundle.nameHashCode, false);
+                    }
+                    else if (data.paths != null)
+                    {
+                        AssetBundleModel.Model.MoveAssetToBundle(data.paths, targetDataBundle.m_Name.bundleName, targetDataBundle.m_Name.variant);
+                        AssetBundleModel.Model.ExecuteAssetMove();
+                        ReloadAndSelect(targetDataBundle.nameHashCode, false);
+                    }
+                }
+
+            }
+            else
+            {
+                var folder = data.targetNode.bundle as AssetBundleModel.BundleFolderInfo;
+                if (folder != null)
+                {
+                    if (data.args.performDrop)
+                    {
+                        if (data.draggedNodes != null)
+                        {
+                            AssetBundleModel.Model.HandleBundleReparent(data.draggedNodes, folder);
+                            Reload();
+                        }
+                        else if (data.paths != null)
+                        {
+                            DragPathsToNewSpace(data.paths, folder);
+                        }
+                    }
+                }
+                else
+                    visualMode = DragAndDropVisualMode.Rejected; //must be a variantfolder
+                
+            }
+            return visualMode;
+        }
+        private DragAndDropVisualMode HandleDragDropBetween(DragAndDropData data)
+        {
+            DragAndDropVisualMode visualMode = DragAndDropVisualMode.Copy;//Move;
+
+            var parent = (data.args.parentItem as AssetBundleModel.BundleTreeItem);
+
+            if (parent != null)
+            {
+                var variantFolder = parent.bundle as AssetBundleModel.BundleVariantFolderInfo;
+                if (variantFolder != null)
+                    return DragAndDropVisualMode.Rejected;
+
+                if (data.args.performDrop)
+                {
+                    var folder = parent.bundle as AssetBundleModel.BundleFolderConcreteInfo;
+                    if (folder != null)
+                    {
+                        if (data.draggedNodes != null)
+                        {
+                            AssetBundleModel.Model.HandleBundleReparent(data.draggedNodes, folder);
+                            Reload();
+                        }
+                        else if (data.paths != null)
+                        {
+                            DragPathsToNewSpace(data.paths, folder);
+                        }
+                    }
+                }
+            }
+
+            return visualMode;
+        }
+
+        private string[] dragToNewSpacePaths = null;
+        private AssetBundleModel.BundleFolderInfo dragToNewSpaceRoot = null;
+        private void DragPathsAsOneBundle()
+        {
+            var newBundle = AssetBundleModel.Model.CreateEmptyBundle(dragToNewSpaceRoot);
+            AssetBundleModel.Model.MoveAssetToBundle(dragToNewSpacePaths, newBundle.m_Name.bundleName, newBundle.m_Name.variant);
+            AssetBundleModel.Model.ExecuteAssetMove();
+            ReloadAndSelect(newBundle.nameHashCode, true);
+        }
+        private void DragPathsAsManyBundles()
+        {
+            List<int> hashCodes = new List<int>();
+            foreach (var assetPath in dragToNewSpacePaths)
+            {
+                var newBundle = AssetBundleModel.Model.CreateEmptyBundle(dragToNewSpaceRoot, System.IO.Path.GetFileNameWithoutExtension(assetPath).ToLower());
+                AssetBundleModel.Model.MoveAssetToBundle(assetPath, newBundle.m_Name.bundleName, newBundle.m_Name.variant);
+                hashCodes.Add(newBundle.nameHashCode);
+            }
+            AssetBundleModel.Model.ExecuteAssetMove();
+            ReloadAndSelect(hashCodes);
+        }
+
+        private void DragPathsToNewSpace(string[] paths, AssetBundleModel.BundleFolderInfo root)
+        {
+            dragToNewSpacePaths = paths;
+            dragToNewSpaceRoot = root;
+            if (paths.Length > 1)
+            {
+                GenericMenu menu = new GenericMenu();
+                menu.AddItem(new GUIContent("Create 1 Bundle"), false, DragPathsAsOneBundle);
+                var message = "Create ";
+                message += paths.Length;
+                message += " Bundles";
+                menu.AddItem(new GUIContent(message), false, DragPathsAsManyBundles);
+                menu.ShowAsContext();
+            }
+            else
+                DragPathsAsManyBundles();
+        }
+
+        protected override void SetupDragAndDrop(SetupDragAndDropArgs args)
+        {
+            DragAndDrop.PrepareStartDrag();
+
+            var selectedBundles = new List<AssetBundleModel.BundleInfo>();
+            foreach (var id in args.draggedItemIDs)
+            {
+                var item = FindItem(id, rootItem) as AssetBundleModel.BundleTreeItem;
+                selectedBundles.Add(item.bundle);
+            }
+            DragAndDrop.paths = null;
+            DragAndDrop.objectReferences = m_EmptyObjectList.ToArray();
+            DragAndDrop.SetGenericData("AssetBundleModel.BundleInfo", selectedBundles);
+            DragAndDrop.visualMode = DragAndDropVisualMode.Copy;//Move;
+            DragAndDrop.StartDrag("AssetBundleTree");
+        }
+
+        protected override bool CanStartDrag(CanStartDragArgs args)
+        {
+            return true;
+        }
+
+        internal void Refresh()
+        {
+            var selection = GetSelection();
+            Reload();
+            SelectionChanged(selection);
+        }
+
+        private void ReloadAndSelect(int hashCode, bool rename)
+        {
+            var selection = new List<int>();
+            selection.Add(hashCode);
+            ReloadAndSelect(selection);
+            if(rename)
+            {
+                BeginRename(FindItem(hashCode, rootItem), 0.25f);
+            }
+        }
+        private void ReloadAndSelect(IList<int> hashCodes)
+        {
+            Reload();
+            SetSelection(hashCodes, TreeViewSelectionOptions.RevealAndFrame);
+            SelectionChanged(hashCodes);
+        }
+    }
+}
diff --git a/Assets/Editor/AssetBundleBrowser/AssetBundleTree.cs.meta b/Assets/Editor/AssetBundleBrowser/AssetBundleTree.cs.meta
new file mode 100644
index 0000000..0680aa4
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/AssetBundleTree.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 32cb0432916e2e94f991f14040535d8d
+timeCreated: 1499908886
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/AssetBundleBrowser/AssetListTree.cs b/Assets/Editor/AssetBundleBrowser/AssetListTree.cs
new file mode 100644
index 0000000..464b827
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/AssetListTree.cs
@@ -0,0 +1,444 @@
+锘縰sing UnityEditor;
+using UnityEditorInternal;
+using System.Collections.Generic;
+using UnityEditor.IMGUI.Controls;
+using System.Linq;
+using System;
+
+
+namespace UnityEngine.AssetBundles
+{
+    internal class AssetListTree : TreeView
+    {
+        List<AssetBundleModel.BundleInfo> m_SourceBundles = new List<AssetBundleModel.BundleInfo>();
+        AssetBundleManageTab m_Controller;
+        List<UnityEngine.Object> m_EmptyObjectList = new List<Object>();
+
+        public static MultiColumnHeaderState CreateDefaultMultiColumnHeaderState()
+        {
+            return new MultiColumnHeaderState(GetColumns());
+        }
+        private static MultiColumnHeaderState.Column[] GetColumns()
+        {
+            var retVal = new MultiColumnHeaderState.Column[] {
+                new MultiColumnHeaderState.Column(),
+                new MultiColumnHeaderState.Column(),
+                new MultiColumnHeaderState.Column(),
+                new MultiColumnHeaderState.Column()
+            };
+            retVal[0].headerContent = new GUIContent("Asset", "Short name of asset. For full name select asset and see message below");
+            retVal[0].minWidth = 50;
+            retVal[0].width = 100;
+            retVal[0].maxWidth = 300;
+            retVal[0].headerTextAlignment = TextAlignment.Left;
+            retVal[0].canSort = true;
+            retVal[0].autoResize = true;
+
+            retVal[1].headerContent = new GUIContent("Bundle", "Bundle name. 'auto' means asset was pulled in due to dependency");
+            retVal[1].minWidth = 50;
+            retVal[1].width = 100;
+            retVal[1].maxWidth = 300;
+            retVal[1].headerTextAlignment = TextAlignment.Left;
+            retVal[1].canSort = true;
+            retVal[1].autoResize = true;
+
+            retVal[2].headerContent = new GUIContent("Size", "Size on disk");
+            retVal[2].minWidth = 30;
+            retVal[2].width = 75;
+            retVal[2].maxWidth = 100;
+            retVal[2].headerTextAlignment = TextAlignment.Left;
+            retVal[2].canSort = true;
+            retVal[2].autoResize = true;
+
+            retVal[3].headerContent = new GUIContent("!", "Errors, Warnings, or Info");
+            retVal[3].minWidth = 16;
+            retVal[3].width = 16;
+            retVal[3].maxWidth = 16;
+            retVal[3].headerTextAlignment = TextAlignment.Left;
+            retVal[3].canSort = true;
+            retVal[3].autoResize = false;
+
+            return retVal;
+        }
+        enum MyColumns
+        {
+            Asset,
+            Bundle,
+            Size,
+            Message
+        }
+        public enum SortOption
+        {
+            Asset,
+            Bundle,
+            Size,
+            Message
+        }
+        SortOption[] m_SortOptions =
+        {
+            SortOption.Asset,
+            SortOption.Bundle,
+            SortOption.Size,
+            SortOption.Message
+        };
+
+        public AssetListTree(TreeViewState state, MultiColumnHeaderState mchs, AssetBundleManageTab ctrl ) : base(state, new MultiColumnHeader(mchs))
+        {
+            m_Controller = ctrl;
+            showBorder = true;
+            showAlternatingRowBackgrounds = true;
+            DefaultStyles.label.richText = true;
+            multiColumnHeader.sortingChanged += OnSortingChanged;
+        }
+
+
+        public void Update()
+        {
+            bool dirty = false;
+            foreach (var bundle in m_SourceBundles)
+            {
+                dirty |= bundle.dirty;
+            }
+            if (dirty)
+                Reload();
+        }
+        public override void OnGUI(Rect rect)
+        {
+            base.OnGUI(rect);
+            if (Event.current.type == EventType.MouseDown && Event.current.button == 0 && rect.Contains(Event.current.mousePosition))
+            {
+                SetSelection(new int[0], TreeViewSelectionOptions.FireSelectionChanged);
+            }
+        }
+
+
+        protected override IList<TreeViewItem> BuildRows(TreeViewItem root)
+        {
+            var rows = base.BuildRows(root);
+            SortIfNeeded(root, rows);
+            return rows;
+        }
+
+        internal void SetSelectedBundles(IEnumerable<AssetBundleModel.BundleInfo> bundles)
+        {
+            m_Controller.SetSelectedItems(null);
+            m_SourceBundles = bundles.ToList();
+            SetSelection(new List<int>());
+            Reload();
+        }
+        protected override TreeViewItem BuildRoot()
+        {
+            var root = AssetBundleModel.Model.CreateAssetListTreeView(m_SourceBundles);
+            return root;
+        }
+
+        protected override void RowGUI(RowGUIArgs args)
+        {
+            for (int i = 0; i < args.GetNumVisibleColumns(); ++i)
+                CellGUI(args.GetCellRect(i), args.item as AssetBundleModel.AssetTreeItem, args.GetColumn(i), ref args);
+        }
+
+        private void CellGUI(Rect cellRect, AssetBundleModel.AssetTreeItem item, int column, ref RowGUIArgs args)
+        {
+            Color oldColor = GUI.color;
+            CenterRectUsingSingleLineHeight(ref cellRect);
+            if(column != 3)
+               GUI.color = item.itemColor;
+
+            switch (column)
+            {
+                case 0:
+                    {
+                        var iconRect = new Rect(cellRect.x + 1, cellRect.y + 1, cellRect.height - 2, cellRect.height - 2);
+                        GUI.DrawTexture(iconRect, item.icon, ScaleMode.ScaleToFit);
+                        DefaultGUI.Label(
+                            new Rect(cellRect.x + iconRect.xMax + 1, cellRect.y, cellRect.width - iconRect.width, cellRect.height), 
+                            item.displayName, 
+                            args.selected, 
+                            args.focused);
+                    }
+                    break;
+                case 1:
+                    DefaultGUI.Label(cellRect, item.asset.bundleName, args.selected, args.focused);
+                    break;
+                case 2:
+                    DefaultGUI.Label(cellRect, item.asset.GetSizeString(), args.selected, args.focused);
+                    break;
+                case 3:
+                    var icon = item.MessageIcon();
+                    if (icon != null)
+                    {
+                        var iconRect = new Rect(cellRect.x, cellRect.y, cellRect.height, cellRect.height);
+                        GUI.DrawTexture(iconRect, icon, ScaleMode.ScaleToFit);
+                    }
+                    break;
+            }
+            GUI.color = oldColor;
+        }
+
+        protected override void DoubleClickedItem(int id)
+        {
+            var assetItem = FindItem(id, rootItem) as AssetBundleModel.AssetTreeItem;
+            if (assetItem != null)
+            {
+                Object o = AssetDatabase.LoadAssetAtPath<Object>(assetItem.asset.fullAssetName);
+                EditorGUIUtility.PingObject(o);
+                Selection.activeObject = o;
+            }
+        }
+
+        protected override void SelectionChanged(IList<int> selectedIds)
+        {
+            List<Object> selectedObjects = new List<Object>();
+            List<AssetBundleModel.AssetInfo> selectedAssets = new List<AssetBundleModel.AssetInfo>();
+            foreach (var id in selectedIds)
+            {
+                var assetItem = FindItem(id, rootItem) as AssetBundleModel.AssetTreeItem;
+                if (assetItem != null)
+                {
+                    Object o = AssetDatabase.LoadAssetAtPath<Object>(assetItem.asset.fullAssetName);
+                    selectedObjects.Add(o);
+                    Selection.activeObject = o;
+                    selectedAssets.Add(assetItem.asset);
+                }
+            }
+            m_Controller.SetSelectedItems(selectedAssets);
+            Selection.objects = selectedObjects.ToArray();
+        }
+        protected override bool CanBeParent(TreeViewItem item)
+        {
+            return false;
+        }
+
+        protected override bool CanStartDrag(CanStartDragArgs args)
+        {
+            args.draggedItemIDs = GetSelection();
+            return true;
+        }
+
+        protected override void SetupDragAndDrop(SetupDragAndDropArgs args)
+        {
+            DragAndDrop.PrepareStartDrag();
+            DragAndDrop.objectReferences = m_EmptyObjectList.ToArray();
+            List<AssetBundleModel.AssetTreeItem> items = 
+                new List<AssetBundleModel.AssetTreeItem>(args.draggedItemIDs.Select(id => FindItem(id, rootItem) as AssetBundleModel.AssetTreeItem));
+            DragAndDrop.paths = items.Select(a => a.asset.fullAssetName).ToArray();
+            DragAndDrop.SetGenericData("AssetListTreeSource", this);
+            DragAndDrop.StartDrag("AssetListTree");
+        }
+        
+        protected override DragAndDropVisualMode HandleDragAndDrop(DragAndDropArgs args)
+        {
+            if(IsValidDragDrop(args))
+            {
+                if (args.performDrop)
+                {
+                    AssetBundleModel.Model.MoveAssetToBundle(DragAndDrop.paths, m_SourceBundles[0].m_Name.bundleName, m_SourceBundles[0].m_Name.variant);
+                    AssetBundleModel.Model.ExecuteAssetMove();
+                    foreach (var bundle in m_SourceBundles)
+                    {
+                        bundle.RefreshAssetList();
+                    }
+                    m_Controller.UpdateSelectedBundles(m_SourceBundles);
+                }
+                return DragAndDropVisualMode.Copy;//Move;
+            }
+
+            return DragAndDropVisualMode.Rejected;
+        }
+        protected bool IsValidDragDrop(DragAndDropArgs args)
+        {
+            //can't do drag & drop if data source is read only
+            if (AssetBundles.AssetBundleModel.Model.DataSource.IsReadOnly ())
+                return false;
+
+            //can't drag onto none or >1 bundles
+            if (m_SourceBundles.Count == 0 || m_SourceBundles.Count > 1)
+                return false;
+            
+            //can't drag nothing
+            if (DragAndDrop.paths == null || DragAndDrop.paths.Length == 0)
+                return false;
+
+            //can't drag into a folder
+            var folder = m_SourceBundles[0] as AssetBundleModel.BundleFolderInfo;
+            if (folder != null)
+                return false;
+
+            var data = m_SourceBundles[0] as AssetBundleModel.BundleDataInfo;
+            if(data == null)
+                return false; // this should never happen.
+
+            var thing = DragAndDrop.GetGenericData("AssetListTreeSource") as AssetListTree;
+            if (thing != null)
+                return false;
+            
+            if(data.IsEmpty())
+                return true;
+
+
+            if (data.isSceneBundle)
+            {
+                foreach (var assetPath in DragAndDrop.paths)
+                {
+                    if ((AssetDatabase.GetMainAssetTypeAtPath(assetPath) != typeof(SceneAsset)) &&
+                        (!AssetDatabase.IsValidFolder(assetPath)))
+                        return false;
+                }
+            }
+            else
+            {
+                foreach (var assetPath in DragAndDrop.paths)
+                {
+                    if (AssetDatabase.GetMainAssetTypeAtPath(assetPath) == typeof(SceneAsset))
+                        return false;
+                }
+            }
+
+            return true;
+
+        }
+
+        protected override void ContextClickedItem(int id)
+        {
+            if (AssetBundleModel.Model.DataSource.IsReadOnly ()) {
+                return;
+            }
+
+            List<AssetBundleModel.AssetTreeItem> selectedNodes = new List<AssetBundleModel.AssetTreeItem>();
+            foreach(var nodeID in GetSelection())
+            {
+                selectedNodes.Add(FindItem(nodeID, rootItem) as AssetBundleModel.AssetTreeItem);
+            }
+
+            if(selectedNodes.Count > 0)
+            {
+                GenericMenu menu = new GenericMenu();
+                menu.AddItem(new GUIContent("Remove asset(s) from bundle."), false, RemoveAssets, selectedNodes);
+                menu.ShowAsContext();
+            }
+
+        }
+        void RemoveAssets(object obj)
+        {
+            var selectedNodes = obj as List<AssetBundleModel.AssetTreeItem>;
+            var assets = new List<AssetBundleModel.AssetInfo>();
+            //var bundles = new List<AssetBundleModel.BundleInfo>();
+            foreach (var node in selectedNodes)
+            {
+                if (node.asset.bundleName != string.Empty)
+                    assets.Add(node.asset);
+            }
+            AssetBundleModel.Model.MoveAssetToBundle(assets, string.Empty, string.Empty);
+            AssetBundleModel.Model.ExecuteAssetMove();
+            foreach (var bundle in m_SourceBundles)
+            {
+                bundle.RefreshAssetList();
+            }
+            m_Controller.UpdateSelectedBundles(m_SourceBundles);
+            //ReloadAndSelect(new List<int>());
+        }
+
+        protected override void KeyEvent()
+        {
+            if (m_SourceBundles.Count > 0 && Event.current.keyCode == KeyCode.Delete && GetSelection().Count > 0)
+            {
+                List<AssetBundleModel.AssetTreeItem> selectedNodes = new List<AssetBundleModel.AssetTreeItem>();
+                foreach (var nodeID in GetSelection())
+                {
+                    selectedNodes.Add(FindItem(nodeID, rootItem) as AssetBundleModel.AssetTreeItem);
+                }
+
+                RemoveAssets(selectedNodes);
+            }
+        }
+        void OnSortingChanged(MultiColumnHeader multiColumnHeader)
+        {
+            SortIfNeeded(rootItem, GetRows());
+        }
+        void SortIfNeeded(TreeViewItem root, IList<TreeViewItem> rows)
+        {
+            if (rows.Count <= 1)
+                return;
+
+            if (multiColumnHeader.sortedColumnIndex == -1)
+                return;
+
+            SortByColumn();
+
+            rows.Clear();
+            for (int i = 0; i < root.children.Count; i++)
+                rows.Add(root.children[i]);
+
+            Repaint();
+        }
+        void SortByColumn()
+        {
+            var sortedColumns = multiColumnHeader.state.sortedColumns;
+
+            if (sortedColumns.Length == 0)
+                return;
+
+            List<AssetBundleModel.AssetTreeItem> assetList = new List<AssetBundleModel.AssetTreeItem>();
+            foreach(var item in rootItem.children)
+            {
+                assetList.Add(item as AssetBundleModel.AssetTreeItem);
+            }
+            var orderedItems = InitialOrder(assetList, sortedColumns);
+
+            rootItem.children = orderedItems.Cast<TreeViewItem>().ToList();
+        }
+
+        IOrderedEnumerable<AssetBundleModel.AssetTreeItem> InitialOrder(IEnumerable<AssetBundleModel.AssetTreeItem> myTypes, int[] columnList)
+        {
+            SortOption sortOption = m_SortOptions[columnList[0]];
+            bool ascending = multiColumnHeader.IsSortedAscending(columnList[0]);
+            switch (sortOption)
+            {
+                case SortOption.Asset:
+                    return myTypes.Order(l => l.displayName, ascending);
+                case SortOption.Size:
+                    return myTypes.Order(l => l.asset.fileSize, ascending);
+                case SortOption.Message:
+                    return myTypes.Order(l => l.HighestMessageLevel(), ascending);
+                case SortOption.Bundle:
+                default:
+                    return myTypes.Order(l => l.asset.bundleName, ascending);
+            }
+            
+        }
+
+        private void ReloadAndSelect(IList<int> hashCodes)
+        {
+            Reload();
+            SetSelection(hashCodes);
+            SelectionChanged(hashCodes);
+        }
+    }
+    static class MyExtensionMethods
+    {
+        public static IOrderedEnumerable<T> Order<T, TKey>(this IEnumerable<T> source, Func<T, TKey> selector, bool ascending)
+        {
+            if (ascending)
+            {
+                return source.OrderBy(selector);
+            }
+            else
+            {
+                return source.OrderByDescending(selector);
+            }
+        }
+
+        public static IOrderedEnumerable<T> ThenBy<T, TKey>(this IOrderedEnumerable<T> source, Func<T, TKey> selector, bool ascending)
+        {
+            if (ascending)
+            {
+                return source.ThenBy(selector);
+            }
+            else
+            {
+                return source.ThenByDescending(selector);
+            }
+        }
+    }
+}
diff --git a/Assets/Editor/AssetBundleBrowser/AssetListTree.cs.meta b/Assets/Editor/AssetBundleBrowser/AssetListTree.cs.meta
new file mode 100644
index 0000000..0d31391
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/AssetListTree.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 18a3570ba42065e47b3bc4b91c1b6fa7
+timeCreated: 1499908886
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/AssetBundleBrowser/BundleDetailList.cs b/Assets/Editor/AssetBundleBrowser/BundleDetailList.cs
new file mode 100644
index 0000000..e48de2b
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/BundleDetailList.cs
@@ -0,0 +1,173 @@
+锘縰sing UnityEditor;
+using UnityEditorInternal;
+using System.Collections.Generic;
+using UnityEditor.IMGUI.Controls;
+using System.Linq;
+using System;
+
+
+namespace UnityEngine.AssetBundles
+{
+    internal class BundleDetailItem : TreeViewItem
+    {
+        public BundleDetailItem(int id, int depth, string displayName, MessageType type) : base(id, depth, displayName)
+        {
+            MessageLevel = type;
+        }
+
+        public MessageType MessageLevel
+        { get; set; }
+    }
+    internal class BundleDetailList : TreeView
+    {
+        HashSet<AssetBundleModel.BundleDataInfo> m_Selecteditems;
+        Rect m_TotalRect;
+
+        const float k_DoubleIndent = 32f;
+        const string k_SizeHeader = "Size: ";
+        const string k_DependencyHeader = "Dependent On:";
+        const string k_DependencyEmpty = k_DependencyHeader + " - None";
+        const string k_MessageHeader = "Messages:";
+        const string k_MessageEmpty = k_MessageHeader + " - None";
+
+
+        public BundleDetailList(TreeViewState state) : base(state)
+        {
+            m_Selecteditems = new HashSet<AssetBundleModel.BundleDataInfo>();
+            showBorder = true;
+        }
+        public void Update()
+        {
+            bool dirty = false;
+            foreach (var bundle in m_Selecteditems)
+            {
+                dirty |= bundle.dirty;
+            }
+            if (dirty)
+            {
+                Reload();
+                ExpandAll();
+            }
+        }
+        protected override TreeViewItem BuildRoot()
+        {
+            var root = new TreeViewItem(-1, -1);
+            root.children = new List<TreeViewItem>();
+            if (m_Selecteditems != null)
+            {
+                foreach(var bundle in m_Selecteditems)
+                {
+                    root.AddChild(AppendBundleToTree(bundle));
+                }
+            }
+            return root;
+        }
+
+        protected override void RowGUI(RowGUIArgs args)
+        {
+            if ((args.item as BundleDetailItem) != null)
+            {
+                EditorGUI.HelpBox(
+                    new Rect(args.rowRect.x + k_DoubleIndent, args.rowRect.y, args.rowRect.width - k_DoubleIndent, args.rowRect.height), 
+                    args.item.displayName,
+                    (args.item as BundleDetailItem).MessageLevel);
+            }
+            else
+            {
+                Color old = GUI.color;
+                if (args.item.depth == 1 &&
+                    (args.item.displayName == k_MessageEmpty || args.item.displayName == k_DependencyEmpty))
+                    GUI.color = AssetBundleModel.Model.k_LightGrey;
+                base.RowGUI(args);
+                GUI.color = old;
+            }
+        }
+        public override void OnGUI(Rect rect)
+        {
+            m_TotalRect = rect;
+            base.OnGUI(rect);
+        }
+        protected override float GetCustomRowHeight(int row, TreeViewItem item)
+        {
+            if( (item as BundleDetailItem) != null)
+            {
+                float height = DefaultStyles.backgroundEven.CalcHeight(new GUIContent(item.displayName), m_TotalRect.width);
+                return height + 3f;
+            }
+            return base.GetCustomRowHeight(row, item);
+        }
+
+
+        internal TreeViewItem AppendBundleToTree(AssetBundleModel.BundleDataInfo bundle)
+        {
+            var itemName = bundle.m_Name.fullNativeName;
+            var bunRoot = new TreeViewItem(itemName.GetHashCode(), 0, itemName);
+
+            var str = itemName + k_SizeHeader;
+            var sz = new TreeViewItem(str.GetHashCode(), 1, k_SizeHeader + bundle.TotalSize());
+
+            str = itemName + k_DependencyHeader;
+            var dependency = new TreeViewItem(str.GetHashCode(), 1, k_DependencyEmpty);
+            var depList = bundle.GetBundleDependencies();
+            if(depList.Count > 0)
+            {
+                dependency.displayName = k_DependencyHeader;
+                foreach (var dep in bundle.GetBundleDependencies())
+                {
+                    str = itemName + dep;
+                    dependency.AddChild(new TreeViewItem(str.GetHashCode(), 2, dep));
+                }
+            }
+
+            str = itemName + k_MessageHeader;
+            var msg = new TreeViewItem(str.GetHashCode(), 1, k_MessageEmpty);
+            if (bundle.HasMessages())
+            {
+                msg.displayName = k_MessageHeader;
+                var currMessages = bundle.GetMessages();
+
+                foreach(var currMsg in currMessages)
+                {
+                    str = itemName + currMsg.message;
+                    msg.AddChild(new BundleDetailItem(str.GetHashCode(), 2, currMsg.message, currMsg.severity));
+                }
+            }
+
+
+            bunRoot.AddChild(sz);
+            bunRoot.AddChild(dependency);
+            bunRoot.AddChild(msg);
+
+            return bunRoot;
+        }
+
+
+
+        internal void SetItems(IEnumerable<AssetBundleModel.BundleInfo> items)
+        {
+            m_Selecteditems.Clear();
+            foreach(var item in items)
+            {
+                CollectBundles(item);
+            }
+            SetSelection(new List<int>());
+            Reload();
+            ExpandAll();
+        }
+        internal void CollectBundles(AssetBundleModel.BundleInfo bundle)
+        {
+            var bunData = bundle as AssetBundleModel.BundleDataInfo;
+            if (bunData != null)
+                m_Selecteditems.Add(bunData);
+            else
+            {
+                var bunFolder = bundle as AssetBundleModel.BundleFolderInfo;
+                foreach (var bun in bunFolder.GetChildList())
+                {
+                    CollectBundles(bun);
+                }
+            }
+        }
+
+    }
+}
diff --git a/Assets/Editor/AssetBundleBrowser/BundleDetailList.cs.meta b/Assets/Editor/AssetBundleBrowser/BundleDetailList.cs.meta
new file mode 100644
index 0000000..8be667b
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/BundleDetailList.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 7c62cc7d8f2f5a94290ec50aa5195dee
+timeCreated: 1499908886
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/AssetBundleBrowser/Icons.meta b/Assets/Editor/AssetBundleBrowser/Icons.meta
new file mode 100644
index 0000000..fb34097
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/Icons.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 08c232e713e870a4db3d8f89985d8009
+folderAsset: yes
+timeCreated: 1499908885
+licenseType: Pro
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/AssetBundleBrowser/Icons/ABundleBrowserIconY1756Basic.png b/Assets/Editor/AssetBundleBrowser/Icons/ABundleBrowserIconY1756Basic.png
new file mode 100644
index 0000000..de1091a
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/Icons/ABundleBrowserIconY1756Basic.png
Binary files differ
diff --git a/Assets/Editor/AssetBundleBrowser/Icons/ABundleBrowserIconY1756Basic.png.meta b/Assets/Editor/AssetBundleBrowser/Icons/ABundleBrowserIconY1756Basic.png.meta
new file mode 100644
index 0000000..22c9f07
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/Icons/ABundleBrowserIconY1756Basic.png.meta
@@ -0,0 +1,68 @@
+fileFormatVersion: 2
+guid: cfb66cdcbb6d96c4ab5bed7d7101cfa2
+timeCreated: 1499908888
+licenseType: Pro
+TextureImporter:
+  fileIDToRecycleName: {}
+  serializedVersion: 4
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    filterMode: -1
+    aniso: -1
+    mipBias: -1
+    wrapMode: -1
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spritePixelsToUnits: 100
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  platformSettings:
+  - buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+  spritePackingTag: 
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/AssetBundleBrowser/Icons/ABundleBrowserIconY1756Scene.png b/Assets/Editor/AssetBundleBrowser/Icons/ABundleBrowserIconY1756Scene.png
new file mode 100644
index 0000000..26cecc9
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/Icons/ABundleBrowserIconY1756Scene.png
Binary files differ
diff --git a/Assets/Editor/AssetBundleBrowser/Icons/ABundleBrowserIconY1756Scene.png.meta b/Assets/Editor/AssetBundleBrowser/Icons/ABundleBrowserIconY1756Scene.png.meta
new file mode 100644
index 0000000..1311223
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/Icons/ABundleBrowserIconY1756Scene.png.meta
@@ -0,0 +1,68 @@
+fileFormatVersion: 2
+guid: 54684548eedd3744abd8030b861fae40
+timeCreated: 1499908887
+licenseType: Pro
+TextureImporter:
+  fileIDToRecycleName: {}
+  serializedVersion: 4
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    filterMode: -1
+    aniso: -1
+    mipBias: -1
+    wrapMode: -1
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spritePixelsToUnits: 100
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  platformSettings:
+  - buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+  spritePackingTag: 
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/AssetBundleBrowser/InspectTab.meta b/Assets/Editor/AssetBundleBrowser/InspectTab.meta
new file mode 100644
index 0000000..fb3ebd7
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/InspectTab.meta
@@ -0,0 +1,9 @@
+fileFormatVersion: 2
+guid: 390759a6bd7b0e64791496f154446dd0
+folderAsset: yes
+timeCreated: 1499908885
+licenseType: Pro
+DefaultImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/AssetBundleBrowser/InspectTab/AssetBundleInspectTab.cs b/Assets/Editor/AssetBundleBrowser/InspectTab/AssetBundleInspectTab.cs
new file mode 100644
index 0000000..a19b870
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/InspectTab/AssetBundleInspectTab.cs
@@ -0,0 +1,237 @@
+using UnityEditor;
+using UnityEditor.IMGUI.Controls;
+using System.Collections.Generic;
+using System.IO;
+using System.Runtime.Serialization.Formatters.Binary;
+
+namespace UnityEngine.AssetBundles
+{
+    [System.Serializable]
+    public class AssetBundleInspectTab
+    {
+        Rect m_Position;
+        [SerializeField]
+        private Vector2 m_ScrollPosition;
+
+        [SerializeField]
+        private InspectTabData m_Data;
+        
+
+        private List<string> m_BundleList = new List<string>();
+        private InspectBundleTree m_BundleTreeView;
+        [SerializeField]
+        private TreeViewState m_BundleTreeState;
+
+        public Editor m_Editor = null;
+
+        //[SerializeField] 
+        private List<AssetBundle> m_LoadedBundles;
+
+        private SingleBundleInspector m_SingleInspector;
+
+
+        public AssetBundleInspectTab()
+        {
+            m_LoadedBundles = new List<AssetBundle>();
+            m_SingleInspector = new SingleBundleInspector();
+        }
+
+        public void SaveBundle(AssetBundle b)
+        { 
+            m_LoadedBundles.Add(b);
+        }
+
+        public void OnEnable(Rect pos, EditorWindow parent)
+        {
+            m_Position = pos;
+            if (m_Data == null)
+                m_Data = new InspectTabData();
+
+            //LoadData...
+            var dataPath = System.IO.Path.GetFullPath(".");
+            dataPath = dataPath.Replace("\\", "/");
+            dataPath += "/Library/AssetBundleBrowserInspect.dat";
+
+            if (File.Exists(dataPath))
+            {
+                BinaryFormatter bf = new BinaryFormatter();
+                FileStream file = File.Open(dataPath, FileMode.Open);
+                var data = bf.Deserialize(file) as InspectTabData;
+                if (data != null)
+                    m_Data = data;
+                file.Close();
+            }
+
+
+            if (m_BundleList == null)
+                m_BundleList = new List<string>(); 
+
+            if (m_BundleTreeState == null)
+                m_BundleTreeState = new TreeViewState();
+            m_BundleTreeView = new InspectBundleTree(m_BundleTreeState, this);
+            m_BundleTreeView.Reload();
+
+
+            RefreshBundles();
+            
+        }
+
+        public void OnDisable()
+        {
+            ClearData();
+
+            var dataPath = System.IO.Path.GetFullPath(".");
+            dataPath = dataPath.Replace("\\", "/");
+            dataPath += "/Library/AssetBundleBrowserInspect.dat";
+
+            BinaryFormatter bf = new BinaryFormatter();
+            FileStream file = File.Create(dataPath);
+
+            bf.Serialize(file, m_Data);
+            file.Close();
+        }
+
+        public void OnGUI(Rect pos)
+        {
+            m_Position = pos;
+
+            if (Application.isPlaying)
+            {
+                var style = GUI.skin.label;
+                style.alignment = TextAnchor.MiddleCenter;
+                style.wordWrap = true;
+                GUI.Label(
+                    new Rect(m_Position.x + 1f, m_Position.y + 1f, m_Position.width - 2f, m_Position.height - 2f),
+                    new GUIContent("Inspector unavailable while in PLAY mode"),
+                    style);
+            }
+            else
+            {
+                OnGUIEditor();
+            }
+        }
+
+        private void OnGUIEditor()
+        {
+            //////input path
+            EditorGUILayout.Space();
+            GUILayout.BeginHorizontal();
+            var originalPath = m_Data.m_BundlePath;
+            m_Data.m_BundlePath = EditorGUILayout.TextField("Bundle Path", m_Data.m_BundlePath);
+            
+            if (GUILayout.Button("Browse", GUILayout.MaxWidth(75f)))
+                BrowseForFolder();
+            GUILayout.EndHorizontal();
+            EditorGUILayout.Space();
+
+            if (originalPath != m_Data.m_BundlePath)
+            {
+                RefreshBundles();
+            }
+
+            if (m_BundleList.Count > 0)
+            {
+                m_BundleTreeView.OnGUI(new Rect(m_Position.x, m_Position.y + 30, m_Position.width / 2.0f, m_Position.height - 30));
+                m_SingleInspector.OnGUI(new Rect(m_Position.x + m_Position.width / 2.0f, m_Position.y + 30, m_Position.width / 2.0f, m_Position.height - 30));
+            }
+        }
+
+        //TODO - this is largely copied from BuildTab, should maybe be shared code.
+        private void BrowseForFolder()
+        {
+            var newPath = EditorUtility.OpenFolderPanel("Bundle Folder", m_Data.m_BundlePath, string.Empty);
+            if (!string.IsNullOrEmpty(newPath))
+            {
+                var gamePath = System.IO.Path.GetFullPath(".");//TODO - FileUtil.GetProjectRelativePath??
+                gamePath = gamePath.Replace("\\", "/");
+                if (newPath.StartsWith(gamePath))
+                    newPath = newPath.Remove(0, gamePath.Length + 1);
+                m_Data.m_BundlePath = newPath;
+            }
+        }
+        public void RefreshBundles()
+        {
+            ClearData();
+
+            //DesignDebug.Log("Did someone say refresh?");
+            //do some loading
+            LoadBundles();
+        }
+        private void ClearData()
+        {
+            m_SingleInspector.SetBundle(null);
+
+            foreach (var bundle in m_LoadedBundles)
+            {
+                if (bundle != null) //get into this situation on a rare restart weirdness.
+                    bundle.Unload(true);
+            }
+            m_LoadedBundles.Clear();
+        }
+        private void AddFilePathToList(string path)
+        {
+            //////////////////////////////////////
+            /// code to handle appended hash things
+            //var files = Directory.GetFiles(path);
+            //Array.Sort(files);
+            //int size = files.Length;
+            //for (int i = 0; i < size; i++)
+            //{
+            //    ... do something...
+            //}
+            //////////////////////////////////////
+
+
+            foreach (var file in Directory.GetFiles(path))
+            {
+                if (Path.GetExtension(file) == ".manifest")
+                {
+                    var f = file.Substring(0, file.LastIndexOf('.')).Replace('\\', '/');
+                    if (File.Exists(f))
+                        m_BundleList.Add(f);
+                    else
+                        Debug.Log("Expected bundle not found: " + f + ". Note: Browser does not yet support inspecting bundles with hash appended.");
+                }
+            }
+
+            foreach (var dir in Directory.GetDirectories(path))
+            {
+                AddFilePathToList(dir);
+            }
+        }
+        private void LoadBundles()
+        {
+            if (m_Data.m_BundlePath == string.Empty)
+                return;
+            
+            //find assets
+            if (m_BundleList == null)
+                m_BundleList = new List<string>();
+
+            m_BundleList.Clear();
+            if (Directory.Exists(m_Data.m_BundlePath))
+            {
+                AddFilePathToList(m_Data.m_BundlePath);
+            }
+            m_BundleTreeView.Reload();
+        }
+
+        public List<string> BundleList
+        { get { return m_BundleList; } }
+
+
+        public void SetBundleItem(InspectTreeItem selected)
+        {
+            if (selected == null)
+                m_SingleInspector.SetBundle(null);
+            else
+                m_SingleInspector.SetBundle(selected.bundle, selected.bundlePath);
+        }
+
+        [System.Serializable]
+        public class InspectTabData
+        {
+            public string m_BundlePath = string.Empty;
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Editor/AssetBundleBrowser/InspectTab/AssetBundleInspectTab.cs.meta b/Assets/Editor/AssetBundleBrowser/InspectTab/AssetBundleInspectTab.cs.meta
new file mode 100644
index 0000000..1ae7c2c
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/InspectTab/AssetBundleInspectTab.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 390e28c21cef1024a87a0e52278e0314
+timeCreated: 1499908886
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/AssetBundleBrowser/InspectTab/InspectSingleBundle.cs b/Assets/Editor/AssetBundleBrowser/InspectTab/InspectSingleBundle.cs
new file mode 100644
index 0000000..eb570ac
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/InspectTab/InspectSingleBundle.cs
@@ -0,0 +1,84 @@
+using UnityEditor;
+using UnityEditor.IMGUI.Controls;
+using System.Collections.Generic;
+using System.IO;
+using System;
+
+namespace UnityEngine.AssetBundles
+{
+    class SingleBundleInspector
+    {
+        public static string currentPath { get; set; }
+
+
+        public SingleBundleInspector() { }
+
+        private Editor m_Editor = null;
+
+        private Rect m_Position;
+
+        [SerializeField]
+        private Vector2 m_ScrollPosition;
+
+        public void SetBundle(AssetBundle bundle, string path = "")
+        {
+            //static var...
+            currentPath = path;
+
+            //members
+            m_Editor = null;
+            if (bundle != null)
+                m_Editor = Editor.CreateEditor(bundle);
+        }
+
+        public void OnGUI(Rect pos)
+        {
+            if (m_Editor == null)
+                return;
+
+            m_Position = pos;
+
+            DrawBundleData();
+        }
+
+        private void DrawBundleData()
+        {
+            GUILayout.BeginArea(m_Position);
+            m_ScrollPosition = EditorGUILayout.BeginScrollView(m_ScrollPosition);
+            m_Editor.OnInspectorGUI();
+            EditorGUILayout.EndScrollView();
+            GUILayout.EndArea();
+        }
+    }
+
+    [CustomEditor(typeof(AssetBundle))]
+    public class LevelScriptEditor : Editor
+    {
+        public override void OnInspectorGUI()
+        {
+            AssetBundle bundle = target as AssetBundle;
+
+            using (new EditorGUI.DisabledScope(true))
+            {
+                var leftStyle = GUI.skin.GetStyle("Label");
+                leftStyle.alignment = TextAnchor.UpperLeft;
+                GUILayout.Label(new GUIContent("Name: " + bundle.name), leftStyle);
+
+                long fileSize = -1;
+                if(SingleBundleInspector.currentPath != string.Empty && File.Exists(SingleBundleInspector.currentPath) )
+                {
+                    System.IO.FileInfo fileInfo = new System.IO.FileInfo(SingleBundleInspector.currentPath);
+                    fileSize = fileInfo.Length;
+                }
+
+                if (fileSize < 0)
+                    GUILayout.Label(new GUIContent("Size: unknown"), leftStyle);
+                else
+                    GUILayout.Label(new GUIContent("Size: " + EditorUtility.FormatBytes(fileSize)), leftStyle);
+
+            }
+
+            base.OnInspectorGUI();
+        }
+    }
+}
\ No newline at end of file
diff --git a/Assets/Editor/AssetBundleBrowser/InspectTab/InspectSingleBundle.cs.meta b/Assets/Editor/AssetBundleBrowser/InspectTab/InspectSingleBundle.cs.meta
new file mode 100644
index 0000000..1c25501
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/InspectTab/InspectSingleBundle.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 32505061201db464096788f93e39fe4d
+timeCreated: 1499908886
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/AssetBundleBrowser/InspectTab/InspectTreeView.cs b/Assets/Editor/AssetBundleBrowser/InspectTab/InspectTreeView.cs
new file mode 100644
index 0000000..b8a7dd7
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/InspectTab/InspectTreeView.cs
@@ -0,0 +1,111 @@
+using UnityEditor;
+using UnityEditor.IMGUI.Controls;
+using System.Collections.Generic;
+using System.IO;
+using System;
+
+namespace UnityEngine.AssetBundles
+{
+	public class InspectTreeItem : TreeViewItem
+	{
+		private string m_BundlePath;
+        public string bundlePath
+        {
+            get { return m_BundlePath; }
+        }
+		private AssetBundle m_Bundle;
+
+		private AssetBundleInspectTab m_InspectTab;
+		//public InspectTreeItem(int id, int depth, string displayName) : base(id, depth, displayName)
+		public InspectTreeItem(string path, AssetBundleInspectTab inspectTab) : base(path.GetHashCode(), 0, path)
+		{
+			m_BundlePath = path;
+			m_Bundle = null;
+			m_InspectTab = inspectTab;
+		}
+		public AssetBundle bundle
+		{
+			get
+			{
+                if (m_Bundle == null)
+                    LoadBundle();
+				return m_Bundle;
+			}
+		}
+		public void LoadBundle()
+		{
+			if (m_Bundle == null)
+			{
+				m_Bundle = AssetBundle.LoadFromFile(m_BundlePath);
+                m_InspectTab.SaveBundle(m_Bundle);
+
+                //AssetBundleManifest manifest = m_Bundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
+                //if (manifest != null)
+                //{
+                //    //this is where we could get some overall data. if we wanted it. which we might. someday.
+                //}
+
+
+                //gotta actually load assets to keep inspector from crashing :(
+                var content = m_Bundle.GetAllAssetNames();
+                foreach (var c in content)
+                {
+                    m_Bundle.LoadAsset(c);
+                }
+            }
+		}
+	}
+
+	class InspectBundleTree : TreeView
+	{
+		AssetBundleInspectTab m_InspectTab;
+		public InspectBundleTree(TreeViewState s, AssetBundleInspectTab parent) : base(s)
+		{
+			m_InspectTab = parent;
+			showBorder = true;
+		}
+
+		protected override TreeViewItem BuildRoot()
+		{
+			var root = new TreeViewItem(-1, -1);
+			root.children = new List<TreeViewItem>();
+			if (m_InspectTab == null)
+				Debug.Log("Unknown problem in AssetBundle Browser Inspect tab.  Restart Browser and try again, or file ticket on github.");
+			else
+			{
+				foreach (var b in m_InspectTab.BundleList)
+				{
+					root.AddChild(new InspectTreeItem(b, m_InspectTab));
+				}
+			}
+			return root;
+		}
+
+		public override void OnGUI(Rect rect)
+		{
+			base.OnGUI(rect);
+			if (Event.current.type == EventType.MouseDown && Event.current.button == 0 && rect.Contains(Event.current.mousePosition))
+			{
+				SetSelection(new int[0], TreeViewSelectionOptions.FireSelectionChanged);
+			}
+		}
+
+		protected override void SelectionChanged(IList<int> selectedIds)
+		{
+			base.SelectionChanged(selectedIds);
+			
+			if (selectedIds.Count > 0)
+			{
+				m_InspectTab.SetBundleItem(FindItem(selectedIds[0], rootItem) as InspectTreeItem);
+			}
+			else
+				m_InspectTab.SetBundleItem(null);
+		}
+
+		protected override bool CanMultiSelect(TreeViewItem item)
+		{
+			return false;
+		}
+	}
+
+}
diff --git a/Assets/Editor/AssetBundleBrowser/InspectTab/InspectTreeView.cs.meta b/Assets/Editor/AssetBundleBrowser/InspectTab/InspectTreeView.cs.meta
new file mode 100644
index 0000000..c2a49f7
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/InspectTab/InspectTreeView.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: adb20806b5333c64aa5e67e4f9343622
+timeCreated: 1499908886
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/AssetBundleBrowser/MessageList.cs b/Assets/Editor/AssetBundleBrowser/MessageList.cs
new file mode 100644
index 0000000..830df7a
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/MessageList.cs
@@ -0,0 +1,120 @@
+锘縰sing UnityEditor;
+using UnityEditorInternal;
+using System.Collections.Generic;
+using UnityEditor.IMGUI.Controls;
+using System.Linq;
+using System;
+
+
+namespace UnityEngine.AssetBundles
+{
+    internal class MessageList
+    {
+        private Vector2 m_ScrollPosition = Vector2.zero;
+
+        private GUIStyle[] m_Style = new GUIStyle[2];
+
+        IEnumerable<AssetBundleModel.AssetInfo> m_Selecteditems;
+        List<MessageSystem.Message> m_Messages;
+
+        Vector2 m_Dimensions = new Vector2(0, 0);
+        const float k_ScrollbarPadding = 16f;
+        const float k_BorderSize = 1f;
+
+
+        public MessageList()
+        {
+            Init();
+        }
+        private void Init()
+        {
+            m_Style[0] = "OL EntryBackOdd";
+            m_Style[1] = "OL EntryBackEven";
+            m_Style[0].wordWrap = true;
+            m_Style[1].wordWrap = true;
+            m_Style[0].padding = new RectOffset(32, 0, 1, 4);
+            m_Style[1].padding = new RectOffset(32, 0, 1, 4);
+            m_Messages = new List<MessageSystem.Message>();
+
+        }
+        public void OnGUI(Rect fullPos)
+        {
+            DrawOutline(fullPos, 1f);
+
+            Rect pos = new Rect(fullPos.x + k_BorderSize, fullPos.y + k_BorderSize, fullPos.width - 2 * k_BorderSize, fullPos.height - 2 * k_BorderSize);
+            
+
+            if (m_Dimensions.y == 0 || m_Dimensions.x != pos.width - k_ScrollbarPadding)
+            {
+                //recalculate height.
+                m_Dimensions.x = pos.width - k_ScrollbarPadding;
+                m_Dimensions.y = 0;
+                foreach (var message in m_Messages)
+                {
+                    m_Dimensions.y += m_Style[0].CalcHeight(new GUIContent(message.message), m_Dimensions.x);
+                }
+            }
+
+            m_ScrollPosition = GUI.BeginScrollView(pos, m_ScrollPosition, new Rect(0, 0, m_Dimensions.x, m_Dimensions.y));
+            int counter = 0;
+            float runningHeight = 0.0f;
+            foreach (var message in m_Messages) 
+            {
+                int index = counter % 2;
+                var content = new GUIContent(message.message);
+                float height = m_Style[index].CalcHeight(content, m_Dimensions.x);
+
+                GUI.Box(new Rect(0, runningHeight, m_Dimensions.x, height), content, m_Style[index]);
+                GUI.DrawTexture(new Rect(0, runningHeight, 32f, 32f), message.icon);
+                //TODO - cleanup formatting issues and switch to HelpBox
+                //EditorGUI.HelpBox(new Rect(0, runningHeight, m_dimensions.x, height), message.message, (MessageType)message.severity);
+
+                counter++;
+                runningHeight += height;
+            }
+            GUI.EndScrollView();
+        }
+
+        internal void SetItems(IEnumerable<AssetBundleModel.AssetInfo> items)
+        {
+            m_Selecteditems = items;
+            CollectMessages();
+        }
+
+        internal void CollectMessages()
+        {
+            m_Messages.Clear();
+            m_Dimensions.y = 0f;
+            if(m_Selecteditems != null)
+            {
+                foreach (var asset in m_Selecteditems)
+                {
+                    m_Messages.AddRange(asset.GetMessages());
+                }
+            }
+        }
+
+        internal void DrawOutline(Rect rect, float size)
+        {
+            Color color = new Color(0.6f, 0.6f, 0.6f, 1.333f);
+            if(EditorGUIUtility.isProSkin)
+            {
+                color.r = 0.12f;
+                color.g = 0.12f;
+                color.b = 0.12f;
+            }
+
+            if (Event.current.type != EventType.Repaint)
+                return;
+
+            Color orgColor = GUI.color;
+            GUI.color = GUI.color * color;
+            GUI.DrawTexture(new Rect(rect.x, rect.y, rect.width, size), EditorGUIUtility.whiteTexture);
+            GUI.DrawTexture(new Rect(rect.x, rect.yMax - size, rect.width, size), EditorGUIUtility.whiteTexture);
+            GUI.DrawTexture(new Rect(rect.x, rect.y + 1, size, rect.height - 2 * size), EditorGUIUtility.whiteTexture);
+            GUI.DrawTexture(new Rect(rect.xMax - size, rect.y + 1, size, rect.height - 2 * size), EditorGUIUtility.whiteTexture);
+
+            GUI.color = orgColor;
+        }
+    }
+}
diff --git a/Assets/Editor/AssetBundleBrowser/MessageList.cs.meta b/Assets/Editor/AssetBundleBrowser/MessageList.cs.meta
new file mode 100644
index 0000000..e9e8b48
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/MessageList.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: e71964deafc80d94489d3315d34b579d
+timeCreated: 1499908886
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/AssetBundleBrowser/MessageSystem.cs b/Assets/Editor/AssetBundleBrowser/MessageSystem.cs
new file mode 100644
index 0000000..116a298
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/MessageSystem.cs
@@ -0,0 +1,198 @@
+锘縰sing System;
+using UnityEngine;
+using UnityEditor;
+using UnityEngine.Assertions;
+using System.Collections.Generic;
+using System.Linq;
+using UnityEditor.IMGUI.Controls;
+
+namespace UnityEngine.AssetBundles
+{
+    public class MessageSystem
+    {
+        private static Texture2D m_ErrorIcon = null;
+        private static Texture2D m_WarningIcon = null;
+        private static Texture2D m_InfoIcon = null;
+        private static Dictionary<MessageFlag, Message> m_MessageLookup = null;
+
+        [Flags]
+        public enum MessageFlag
+        {
+            None = 0x0,
+
+            Info = 0x80,                  //this flag is only used to check bits, not set.
+            EmptyBundle = 0x81,
+            EmptyFolder = 0x82,
+
+            Warning = 0x8000,                  //this flag is only used to check bits, not set.
+            WarningInChildren = 0x8100,
+            AssetsDuplicatedInMultBundles = 0x8200,
+            VariantBundleMismatch = 0x8400,
+
+            Error = 0x800000,                  //this flag is only used to check bits, not set.
+            ErrorInChildren = 0x810000,
+            SceneBundleConflict = 0x820000,
+            DependencySceneConflict = 0x840000,
+        }
+
+        public class MessageState
+        {
+            //I have an enum and a set of enums to make some logic cleaner.  
+            // The enum has masks for Error/Warning/Info that won't ever be in the set
+            // this allows for easy checking of IsSet for error rather than specific errors. 
+            private MessageFlag m_MessageFlags;
+            private HashSet<MessageFlag> m_MessageSet;
+
+
+            public MessageState()
+            {
+                m_MessageFlags = MessageFlag.None;
+                m_MessageSet = new HashSet<MessageFlag>();
+            }
+
+            public void Clear()
+            {
+                m_MessageFlags = MessageFlag.None;
+                m_MessageSet.Clear();
+            }
+
+            public void SetFlag(MessageFlag flag, bool on)
+            {
+                if (flag == MessageFlag.Info || flag == MessageFlag.Warning || flag == MessageFlag.Error)
+                    return;
+
+                if (on)
+                {
+                    m_MessageFlags |= flag;
+                    m_MessageSet.Add(flag);
+                }
+                else
+                {
+                    m_MessageFlags &= ~flag;
+                    m_MessageSet.Remove(flag);
+                }
+            }
+            public bool IsSet(MessageFlag flag)
+            {
+                return (m_MessageFlags & flag) == flag;
+            }
+            public bool HasMessages()
+            {
+                return (m_MessageFlags != MessageFlag.None);
+            }
+
+            public MessageType HighestMessageLevel()
+            {
+                if (IsSet(MessageFlag.Error))
+                    return MessageType.Error;
+                if (IsSet(MessageFlag.Warning))
+                    return MessageType.Warning;
+                if (IsSet(MessageFlag.Info))
+                    return MessageType.Info;
+                return MessageType.None;
+            }
+            public MessageFlag HighestMessageFlag()
+            {
+                MessageFlag high = MessageFlag.None;
+                foreach(var f in m_MessageSet)
+                {
+                    if (f > high)
+                        high = f;
+                }
+                return high;
+            }
+
+            public List<Message> GetMessages()
+            {
+                var msgs = new List<Message>();
+                foreach(var f in m_MessageSet)
+                {
+                    msgs.Add(GetMessage(f));
+                }
+                return msgs;
+            }
+        }
+        public static Texture2D GetIcon(MessageType sev)
+        {
+            if (sev == MessageType.Error)
+                return GetErrorIcon();
+            else if (sev == MessageType.Warning)
+                return GetWarningIcon();
+            else if (sev == MessageType.Info)
+                return GetInfoIcon();
+            else
+                return null;
+        }
+        private static Texture2D GetErrorIcon()
+        {
+            if (m_ErrorIcon == null)
+                FindMessageIcons();
+            return m_ErrorIcon;
+        }
+        private static Texture2D GetWarningIcon()
+        {
+            if (m_WarningIcon == null)
+                FindMessageIcons();
+            return m_WarningIcon;
+        }
+        private static Texture2D GetInfoIcon()
+        {
+            if (m_InfoIcon == null)
+                FindMessageIcons();
+            return m_InfoIcon;
+        }
+
+        private static void FindMessageIcons()
+        {
+            m_ErrorIcon = EditorGUIUtility.FindTexture("console.errorIcon");
+            m_WarningIcon = EditorGUIUtility.FindTexture("console.warnicon");
+            m_InfoIcon = EditorGUIUtility.FindTexture("console.infoIcon");
+        }
+        public class Message
+        {
+            public Message(string msg, MessageType sev)
+            {
+                message = msg;
+                severity = sev;
+            }
+
+            public MessageType severity;
+            public string message;
+            public Texture2D icon
+            {
+                get
+                {
+                    return GetIcon(severity);
+                }
+            }
+        }
+
+        public static Message GetMessage(MessageFlag lookup)
+        {
+            if (m_MessageLookup == null)
+                InitMessages();
+
+            Message msg = null;
+            m_MessageLookup.TryGetValue(lookup, out msg);
+            if (msg == null)
+                msg = m_MessageLookup[MessageFlag.None];
+            return msg;
+        }
+
+        private static void InitMessages()
+        {
+            m_MessageLookup = new Dictionary<MessageFlag, Message>();
+
+            m_MessageLookup.Add(MessageFlag.None, new Message(string.Empty, MessageType.None));
+            m_MessageLookup.Add(MessageFlag.EmptyBundle, new Message("This bundle is empty.  Empty bundles cannot get saved with the scene and will disappear from this list if Unity restarts or if various other bundle rename or move events occur.", MessageType.Info));
+            m_MessageLookup.Add(MessageFlag.EmptyFolder, new Message("This folder is either empty or contains only empty children.  Empty bundles cannot get saved with the scene and will disappear from this list if Unity restarts or if various other bundle rename or move events occur.", MessageType.Info));
+            m_MessageLookup.Add(MessageFlag.WarningInChildren, new Message("Warning in child(ren)", MessageType.Warning));
+            m_MessageLookup.Add(MessageFlag.AssetsDuplicatedInMultBundles, new Message("Assets being pulled into this bundle due to dependencies are also being pulled into another bundle.  This will cause duplication in memory", MessageType.Warning));
+            m_MessageLookup.Add(MessageFlag.VariantBundleMismatch, new Message("Variants of a given bundle must have exactly the same assets between them based on a Name.Extension (without Path) comparison. These bundle variants fail that check.", MessageType.Warning));
+            m_MessageLookup.Add(MessageFlag.ErrorInChildren, new Message("Error in child(ren)", MessageType.Error));
+            m_MessageLookup.Add(MessageFlag.SceneBundleConflict, new Message("A bundle with one or more scenes must only contain scenes.  This bundle has scenes and non-scene assets.", MessageType.Error));
+            m_MessageLookup.Add(MessageFlag.DependencySceneConflict, new Message("The folder added to this bundle has pulled in scenes and non-scene assets.  A bundle must only have one type or the other.", MessageType.Error));
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/Assets/Editor/AssetBundleBrowser/MessageSystem.cs.meta b/Assets/Editor/AssetBundleBrowser/MessageSystem.cs.meta
new file mode 100644
index 0000000..201b315
--- /dev/null
+++ b/Assets/Editor/AssetBundleBrowser/MessageSystem.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 4082a2bafddd01345ac7078067be0095
+timeCreated: 1499908886
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/Logo.meta b/Assets/Editor/Logo.meta
new file mode 100644
index 0000000..e3a37ac
--- /dev/null
+++ b/Assets/Editor/Logo.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 313d5849e9346cf4f9c4ffaca2ba740a
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/Logo/wgyx.meta b/Assets/Editor/Logo/wgyx.meta
new file mode 100644
index 0000000..bd9c297
--- /dev/null
+++ b/Assets/Editor/Logo/wgyx.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 04d3b2485bb96954eb4d7ed84f06c65c
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/Logo/wgyx/Icon.png b/Assets/Editor/Logo/wgyx/Icon.png
new file mode 100644
index 0000000..36957a0
--- /dev/null
+++ b/Assets/Editor/Logo/wgyx/Icon.png
Binary files differ
diff --git a/Assets/Editor/Logo/wgyx/Icon.png.meta b/Assets/Editor/Logo/wgyx/Icon.png.meta
new file mode 100644
index 0000000..3947e06
--- /dev/null
+++ b/Assets/Editor/Logo/wgyx/Icon.png.meta
@@ -0,0 +1,92 @@
+fileFormatVersion: 2
+guid: 9e3d4bd47e11f374b83b36b52d73139c
+timeCreated: 1521082299
+licenseType: Pro
+TextureImporter:
+  fileIDToRecycleName: {}
+  serializedVersion: 4
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 0
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    filterMode: -1
+    aniso: -1
+    mipBias: -1
+    wrapMode: -1
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spritePixelsToUnits: 100
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  platformSettings:
+  - buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+  - buildTarget: Standalone
+    maxTextureSize: 2048
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+  - buildTarget: iPhone
+    maxTextureSize: 2048
+    textureFormat: 4
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 1
+  - buildTarget: Android
+    maxTextureSize: 2048
+    textureFormat: 4
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 1
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+  spritePackingTag: 
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/Logo/wgyx/SplashImage.png b/Assets/Editor/Logo/wgyx/SplashImage.png
new file mode 100644
index 0000000..ba15fcf
--- /dev/null
+++ b/Assets/Editor/Logo/wgyx/SplashImage.png
Binary files differ
diff --git a/Assets/Editor/Logo/wgyx/SplashImage.png.meta b/Assets/Editor/Logo/wgyx/SplashImage.png.meta
new file mode 100644
index 0000000..766c6b2
--- /dev/null
+++ b/Assets/Editor/Logo/wgyx/SplashImage.png.meta
@@ -0,0 +1,127 @@
+fileFormatVersion: 2
+guid: 6f6375f0a7461c94fa85598a6041a02e
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 13
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 0
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+    flipGreenChannel: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  ignoreMipmapLimit: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 0
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 1
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 1
+  spriteTessellationDetail: -1
+  textureType: 8
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  swizzle: 50462976
+  cookieLightType: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    ignorePlatformSupport: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    ignorePlatformSupport: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    ignorePlatformSupport: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 5e97eb03825dee720800000000000000
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+    nameFileIdTable: {}
+  mipmapLimitGroupName: 
+  pSDRemoveMatte: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/Logo/wgyx/TB_DL_Logo.png b/Assets/Editor/Logo/wgyx/TB_DL_Logo.png
new file mode 100644
index 0000000..68ee171
--- /dev/null
+++ b/Assets/Editor/Logo/wgyx/TB_DL_Logo.png
Binary files differ
diff --git a/Assets/Editor/Logo/wgyx/TB_DL_Logo.png.meta b/Assets/Editor/Logo/wgyx/TB_DL_Logo.png.meta
new file mode 100644
index 0000000..91f6960
--- /dev/null
+++ b/Assets/Editor/Logo/wgyx/TB_DL_Logo.png.meta
@@ -0,0 +1,127 @@
+fileFormatVersion: 2
+guid: c632ba4f91a75f9438abec4eb267744c
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 13
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 0
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+    flipGreenChannel: 0
+  isReadable: 0
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  ignoreMipmapLimit: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 1
+    wrapV: 1
+    wrapW: 1
+  nPOTScale: 0
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 1
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 1
+  spriteTessellationDetail: -1
+  textureType: 8
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  swizzle: 50462976
+  cookieLightType: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    ignorePlatformSupport: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    ignorePlatformSupport: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    ignorePlatformSupport: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 5e97eb03825dee720800000000000000
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+    nameFileIdTable: {}
+  mipmapLimitGroupName: 
+  pSDRemoveMatte: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/Tool/AssetBundleBuildExtersion.cs b/Assets/Editor/Tool/AssetBundleBuildExtersion.cs
new file mode 100644
index 0000000..ed51f41
--- /dev/null
+++ b/Assets/Editor/Tool/AssetBundleBuildExtersion.cs
@@ -0,0 +1,146 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEditor;
+using System.IO;
+
+public class AssetBundleBuildExtersion
+{
+    public static void Build(string output, string category, BuildAssetBundleOptions bundleOption, BuildTarget buildTarget, bool rebuild = true)
+    {
+        var assetBundles = AssetDatabase.GetAllAssetBundleNames();
+        var targetAssetBundles = new List<string>();
+
+        if (category == "mobeffectshader")
+        {
+            for (int i = 0; i < assetBundles.Length; i++)
+            {
+                var bundleName = assetBundles[i];
+                if (bundleName.StartsWith("gmodels") || bundleName.StartsWith("effect") || bundleName.StartsWith("graphic"))
+                {
+                    targetAssetBundles.Add(bundleName);
+                }
+            }
+        }
+        else
+        {
+            for (int i = 0; i < assetBundles.Length; i++)
+            {
+                var bundleName = assetBundles[i];
+                if (bundleName.StartsWith(category))
+                {
+                    targetAssetBundles.Add(bundleName);
+                }
+            }
+        }
+
+        if (targetAssetBundles.Count == 0)
+            return;
+
+        var assets = new List<AssetBundleBuild>();
+
+        for (int i = 0; i < targetAssetBundles.Count; i++)
+        {
+            var assetBundleBuild = new AssetBundleBuild();
+            assetBundleBuild.assetBundleName = AssetVersionUtility.EncodeFileName(targetAssetBundles[i]);
+            assetBundleBuild.assetNames = AssetDatabase.GetAssetPathsFromAssetBundle(targetAssetBundles[i]);
+            assets.Add(assetBundleBuild);
+        }
+
+        var rootPath = StringUtility.Contact(output, Path.AltDirectorySeparatorChar, category);
+        var mainFile = StringUtility.Contact(output, Path.AltDirectorySeparatorChar, GetMainFestFileName(buildTarget));//鏀瑰悕瀛楀墠
+        var mainFileRename = StringUtility.Contact(output, Path.AltDirectorySeparatorChar, AssetVersionUtility.EncodeFileName(category), "_assetbundle");//鏀瑰悕瀛楀悗
+        var manifest = StringUtility.Contact(output, Path.AltDirectorySeparatorChar, GetMainFestFileName(buildTarget), ".manifest");
+        var manifestRename = StringUtility.Contact(output, Path.AltDirectorySeparatorChar, AssetVersionUtility.EncodeFileName(category), "_assetbundle.manifest");
+
+        if (rebuild && Directory.Exists(rootPath))
+            Directory.Delete(rootPath, true);
+
+        // if (!Directory.Exists(rootPath))
+        //     Directory.CreateDirectory(rootPath);
+
+        if (File.Exists(mainFileRename))
+        {
+            File.Delete(mainFileRename);
+        }
+
+        if (File.Exists(manifestRename))
+        {
+            File.Delete(manifestRename);
+        }
+
+        BuildPipeline.BuildAssetBundles(output, assets.ToArray(), bundleOption, buildTarget);
+
+        if (File.Exists(mainFile))
+            File.Move(mainFile, mainFileRename);
+        if (File.Exists(manifest))
+            File.Move(manifest, manifestRename);
+    }
+
+    static string GetMainFestFileName(BuildTarget _target)
+    {
+        switch (_target)
+        {
+            case BuildTarget.StandaloneWindows:
+                return "standalone";
+            case BuildTarget.Android:
+                return "android";
+            case BuildTarget.iOS:
+                return "ios";
+            default:
+                return string.Empty;
+        }
+    }
+
+    [MenuItem("Assets/BuildAssetBundle ( Test )")]
+    public static void BuildTest()
+    {
+        if (Selection.activeObject != null)
+        {
+            var path = AssetDatabase.GetAssetPath(Selection.activeObject);
+            var importer = AssetImporter.GetAtPath(path);
+
+            if (importer != null)
+            {
+                var ab = importer.assetBundleName;
+                if (!string.IsNullOrEmpty(ab))
+                {
+
+                    var assetBundles = AssetDatabase.GetAllAssetBundleNames();
+
+                    List<string> targetAssetBundles = new List<string>();
+                    for (int i = 0; i < assetBundles.Length; i++)
+                    {
+                        var bundleName = assetBundles[i];
+                        if (bundleName == ab)
+                        {
+                            targetAssetBundles.Add(bundleName);
+                        }
+                    }
+
+                    var assets = new List<AssetBundleBuild>();
+                    for (int i = 0; i < targetAssetBundles.Count; i++)
+                    {
+                        var assetBundleBuild = new AssetBundleBuild();
+                        assetBundleBuild.assetBundleName = targetAssetBundles[i];
+                        assetBundleBuild.assetNames = AssetDatabase.GetAssetPathsFromAssetBundle(targetAssetBundles[i]);
+                        assets.Add(assetBundleBuild);
+                    }
+
+                    var opt = BuildAssetBundleOptions.None
+                        | BuildAssetBundleOptions.ChunkBasedCompression
+                        | BuildAssetBundleOptions.DeterministicAssetBundle;
+
+                    var dirctory = Application.dataPath + "/BundleTest";
+                    if (!Directory.Exists(dirctory))
+                    {
+                        Directory.CreateDirectory(dirctory);
+                    }
+                    BuildPipeline.BuildAssetBundles(dirctory, assets.ToArray(), opt, BuildTarget.Android);
+                }
+            }
+
+        }
+    }
+
+}
diff --git a/Assets/Editor/Tool/AssetBundleBuildExtersion.cs.meta b/Assets/Editor/Tool/AssetBundleBuildExtersion.cs.meta
new file mode 100644
index 0000000..e59467f
--- /dev/null
+++ b/Assets/Editor/Tool/AssetBundleBuildExtersion.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: ea7303043dbc1e045a181374361c82e5
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/Tool/AssetBundleBuildTool.cs b/Assets/Editor/Tool/AssetBundleBuildTool.cs
new file mode 100644
index 0000000..6c70301
--- /dev/null
+++ b/Assets/Editor/Tool/AssetBundleBuildTool.cs
@@ -0,0 +1,52 @@
+锘縰sing UnityEngine;
+using UnityEditor;
+using System.IO;
+using System.Collections.Generic;
+
+namespace Assets.Editor.Tool
+
+{
+    // public class AssetBundleBuildTool
+    // {
+    //     [MenuItem("Tools/AB澧為噺鎵撳寘(涓嶈缃甃abel)")]
+    //     static void DoIt()
+    //     {
+    //         BuildAssetBundleOptions opt = BuildAssetBundleOptions.ChunkBasedCompression | BuildAssetBundleOptions.DeterministicAssetBundle | BuildAssetBundleOptions.StrictMode;
+
+    //         string outputPath = StringUtility.Contact(System.Environment.CurrentDirectory, "/AssetBundles/", EditorUserBuildSettings.activeBuildTarget.ToString());
+    //         string streamingPath = StringUtility.Contact(Application.streamingAssetsPath, Path.AltDirectorySeparatorChar, EditorUserBuildSettings.activeBuildTarget.ToString());
+
+    //         if (!Directory.Exists(outputPath))
+    //             Directory.CreateDirectory(outputPath);
+
+    //         AssetBundleBuildExtersion.Build(outputPath, "builtin", opt, EditorUserBuildSettings.activeBuildTarget, false);
+
+    //         AssetBundleBuildExtersion.Build(outputPath, "audio", opt, EditorUserBuildSettings.activeBuildTarget, false);
+
+    //         AssetBundleBuildExtersion.Build(outputPath, "mobeffectshader", opt, EditorUserBuildSettings.activeBuildTarget, false);
+
+    //         AssetBundleBuildExtersion.Build(outputPath, "config", opt, EditorUserBuildSettings.activeBuildTarget, false);
+    //         TableTool.CopyConfigsToOutPutPath(StringUtility.Contact(outputPath, "/config"));
+
+    //         LuaBuildHelper.OnPreBuild();
+    //         UpdateLuaSetting.SetAllLuaAssetBundleName();
+    //         AssetBundleBuildExtersion.Build(outputPath, "lua", opt, EditorUserBuildSettings.activeBuildTarget, false);
+    //         LuaBuildHelper.OnPostBuild();
+
+    //         AssetBundleBuildExtersion.Build(outputPath, "maps", opt, EditorUserBuildSettings.activeBuildTarget, false);
+
+    //         AssetBundleBuildExtersion.Build(outputPath, "ui", opt, EditorUserBuildSettings.activeBuildTarget, false);
+
+    //         var fileInfos = new List<FileInfo>();
+    //         FileExtersion.GetAllDirectoryFileInfos(outputPath, fileInfos);
+    //         AssetsVersionMaker.WriteAssetsVersionFile(outputPath, fileInfos);
+
+    //         if (Directory.Exists(streamingPath))
+    //             Directory.Delete(streamingPath, true);
+
+    //         FileExtersion.DirectoryCopy(outputPath, streamingPath);
+
+    //     }
+    // }
+
+}
\ No newline at end of file
diff --git a/Assets/Editor/Tool/AssetBundleBuildTool.cs.meta b/Assets/Editor/Tool/AssetBundleBuildTool.cs.meta
new file mode 100644
index 0000000..20e8714
--- /dev/null
+++ b/Assets/Editor/Tool/AssetBundleBuildTool.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 6ae44973a0901dc4eb7060e6c1ea792c
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/Tool/AssetsVersionCmpMaker.cs b/Assets/Editor/Tool/AssetsVersionCmpMaker.cs
new file mode 100644
index 0000000..8fd0e3f
--- /dev/null
+++ b/Assets/Editor/Tool/AssetsVersionCmpMaker.cs
@@ -0,0 +1,63 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using System;
+using System.IO;
+using UnityEngine;
+
+
+//鏀惧湪Resources涓� 鐢ㄤ簬瀵规瘮闅忓寘璧勬簮鏄惁涓嬭浇
+public class AssetsVersionCmpMaker
+{
+    public static void WriteAssetsVersionFile(string _path, List<FileInfo> _fileInfos)
+    {
+        var relativePath = string.Empty;
+        var extersion = string.Empty;
+        var fileSize = 0L;
+        var md5 = string.Empty;
+
+        var lines = new List<string>();
+        for (int i = 0; i < _fileInfos.Count; i++)
+        {
+            var fileInfo = _fileInfos[i];
+            if (fileInfo.Name == "AssetsVersion.txt")
+            {
+                continue;
+            }
+
+            if (fileInfo.Name == "AssetsVersionCmp.txt")
+            {
+                continue;
+            }
+
+            if (fileInfo.Name.Contains(".meta"))
+            {
+                continue;
+            }
+
+            if (fileInfo.FullName.Contains("DS_Store") || fileInfo.FullName.Contains("ds_store"))
+            {
+                continue;
+            }
+            if (fileInfo.FullName.Contains("logicbytes"))
+            {
+                continue;
+            }
+
+            relativePath = FileExtersion.GetFileRelativePath(_path, fileInfo.FullName);
+            extersion = fileInfo.Extension;
+            fileSize = fileInfo.Length;
+            md5 = FileExtersion.GetMD5HashFromFile(fileInfo.FullName);
+
+            lines.Add(StringUtility.Contact(relativePath, "\t", extersion, "\t", fileSize, "\t", md5));
+        }
+
+        var assetVersionFile = StringUtility.Contact(Application.dataPath, "/Resources/AssetsVersionCmp.txt");
+        if (File.Exists(assetVersionFile))
+        {
+            File.Delete(assetVersionFile);
+        }
+
+        File.WriteAllText(assetVersionFile, string.Join(FileExtersion.lineSplit, lines.ToArray()));
+    }
+
+}
diff --git a/Assets/Editor/Tool/AssetsVersionCmpMaker.cs.meta b/Assets/Editor/Tool/AssetsVersionCmpMaker.cs.meta
new file mode 100644
index 0000000..b22923f
--- /dev/null
+++ b/Assets/Editor/Tool/AssetsVersionCmpMaker.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: aa463c319d02a3047af7494e454a0ad0
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/Tool/AssetsVersionMaker.cs b/Assets/Editor/Tool/AssetsVersionMaker.cs
new file mode 100644
index 0000000..4f476ff
--- /dev/null
+++ b/Assets/Editor/Tool/AssetsVersionMaker.cs
@@ -0,0 +1,54 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using System;
+using System.IO;
+
+public class AssetsVersionMaker
+{
+    public static void WriteAssetsVersionFile(string _path, List<FileInfo> _fileInfos)
+    {
+        var relativePath = string.Empty;
+        var extersion = string.Empty;
+        var fileSize = 0L;
+        var md5 = string.Empty;
+
+        var lines = new List<string>();
+        for (int i = 0; i < _fileInfos.Count; i++)
+        {
+            var fileInfo = _fileInfos[i];
+            if (fileInfo.Name == "AssetsVersion.txt")
+            {
+                continue;
+            }
+            if (fileInfo.Name == "AssetsVersionCmp.txt")
+            {
+                continue;
+            }
+
+            if (fileInfo.FullName.Contains("DS_Store") || fileInfo.FullName.Contains("ds_store"))
+            {
+                continue;
+            }
+            if (fileInfo.FullName.Contains("logicbytes"))
+            {
+                continue;
+            }
+
+            relativePath = FileExtersion.GetFileRelativePath(_path, fileInfo.FullName);
+            extersion = fileInfo.Extension;
+            fileSize = fileInfo.Length;
+            md5 = FileExtersion.GetMD5HashFromFile(fileInfo.FullName);
+
+            lines.Add(StringUtility.Contact(relativePath, "\t", extersion, "\t", fileSize, "\t", md5));
+        }
+
+        var assetVersionFile = StringUtility.Contact(_path, Path.DirectorySeparatorChar, "AssetsVersion.txt");
+        if (File.Exists(assetVersionFile))
+        {
+            File.Delete(assetVersionFile);
+        }
+
+        File.WriteAllText(StringUtility.Contact(_path, Path.DirectorySeparatorChar, "AssetsVersion.txt"), string.Join(FileExtersion.lineSplit, lines.ToArray()));
+    }
+
+}
diff --git a/Assets/Editor/Tool/AssetsVersionMaker.cs.meta b/Assets/Editor/Tool/AssetsVersionMaker.cs.meta
new file mode 100644
index 0000000..e0652a6
--- /dev/null
+++ b/Assets/Editor/Tool/AssetsVersionMaker.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: c125bc092e6e0bf46aff016aa52ab914
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/Tool/BuildExtersion.cs b/Assets/Editor/Tool/BuildExtersion.cs
new file mode 100644
index 0000000..1d50699
--- /dev/null
+++ b/Assets/Editor/Tool/BuildExtersion.cs
@@ -0,0 +1,309 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEditor;
+using System.IO;
+using System;
+
+//锛侊紒锛佽鏂囦欢浠g爜娌℃湁琚皟鐢�
+public class BuildExtersion
+{
+
+    public static void BuildMap()
+    {
+        try
+        {
+            var buildParameters = new BuildParameters();
+            if (!buildParameters.error)
+            {
+                var levelPattern = "001";
+                var versionsFilePath = Application.dataPath + Path.DirectorySeparatorChar + "Editor/VersionConfigs/Versions.txt";
+                var lines = File.ReadAllLines(versionsFilePath);
+                for (int i = 2; i < lines.Length; i++)
+                {
+                    var line = lines[i];
+                    var lineStrings = line.Split('\t');
+                    if (lineStrings[0] == buildParameters.publisher)
+                    {
+                        levelPattern = lineStrings[23];
+                        break;
+                    }
+                }
+
+                if (!string.IsNullOrEmpty(levelPattern))
+                {
+                    AssetDatabase.Refresh();
+                }
+
+                UpdateLevelSetting.SetAllLevelAssetBundleName();
+                ExcuteBuildAsset("maps", buildParameters);
+            }
+            else
+            {
+                EditorApplication.Exit(1);
+            }
+        }
+        catch (Exception ex)
+        {
+            Debug.Log("鎵撳寘鍦板浘澶辫触");
+            Debug.Log(ex);
+            EditorApplication.Exit(1);
+        }
+    }
+
+    public static void BuildEffect()
+    {
+
+    }
+
+    public static void BuildMobEffectShader()
+    {
+        try
+        {
+            var buildParameters = new BuildParameters();
+            if (!buildParameters.error)
+            {
+                UpdateEffectPrefabSetting.SetAllEffectPrefabAssetBundleName();
+                UpdateMobSetting.SetAllMobAssetBundleName();
+                UpdateShaderSetting.SetAllShaderAssetBundleName();
+                ExcuteBuildAsset("mobeffectshader", buildParameters);
+            }
+            else
+            {
+                EditorApplication.Exit(1);
+            }
+        }
+        catch (Exception ex)
+        {
+            Debug.Log("鎵撳寘NPC妯″瀷 鐗规晥 shader澶辫触");
+            Debug.Log(ex);
+            EditorApplication.Exit(1);
+        }
+    }
+
+    public static void BuildConfig()
+    {
+        try
+        {
+            var buildParameters = new BuildParameters();
+            if (!buildParameters.error)
+            {
+                ExcuteBuildAsset("config", buildParameters);
+                TableTool.CopyConfigsToOutPutPath(StringUtility.Contact(buildParameters.GetWholeOutPutPath(), "/config"));
+            }
+            else
+            {
+                EditorApplication.Exit(1);
+            }
+        }
+        catch (Exception ex)
+        {
+            Debug.Log("鎵撳寘閰嶇疆琛ㄥけ璐�");
+            Debug.Log(ex);
+            EditorApplication.Exit(1);
+        }
+    }
+
+    public static void BuildAudio()
+    {
+        try
+        {
+            var buildParameters = new BuildParameters();
+            if (!buildParameters.error)
+            {
+                UpdateAudioSetting.SetAllAudioAssetBundleName();
+                ExcuteBuildAsset("audio", buildParameters);
+
+               // UpdateVideoSetting.SetAllVideoAssetBundleName();
+               // ExcuteBuildAsset("video", buildParameters);
+            }
+            else
+            {
+                EditorApplication.Exit(1);
+            }
+        }
+        catch (Exception ex)
+        {
+            Debug.Log("鎵撳寘闊虫晥澶辫触");
+            Debug.Log(ex);
+            EditorApplication.Exit(1);
+        }
+    }
+
+    public static void BuildShader()
+    {
+
+    }
+
+    public static void BuildUI()
+    {
+        try
+        {
+            var buildParameters = new BuildParameters();
+            if (!buildParameters.error)
+            {
+                //CheckFontSwitch.CheckAndReplaceFontSwitch();
+                UpdateUIPrefabSetting.SetAllUIPrefabAssetBundleName();
+                UpdateUIWindowSetting.SetAllUIWindowAssetBundleName();
+
+                var rechargePattern = 1;
+                var versionsFilePath = Application.dataPath + Path.DirectorySeparatorChar + "Editor/VersionConfigs/Versions.txt";
+                var lines = File.ReadAllLines(versionsFilePath);
+                for (int i = 2; i < lines.Length; i++)
+                {
+                    var line = lines[i];
+                    var lineStrings = line.Split('\t');
+                    if (lineStrings[0] == buildParameters.publisher)
+                    {
+                        rechargePattern = int.Parse(lineStrings[22]);
+                        break;
+                    }
+                }
+
+                // UpdateSpriteSetting.SetRechargeSkin(rechargePattern);
+                AssetDatabase.Refresh();
+                UpdateSpritePackingSetting.UpdateAllSpritePackingSetting();
+                UpdateSpriteSetting.SetAllSpriteAssetBundleName();
+
+                ExcuteBuildAsset("ui", buildParameters);
+            }
+            else
+            {
+                EditorApplication.Exit(1);
+            }
+        }
+        catch (Exception ex)
+        {
+            Debug.Log("鎵撳寘ui澶辫触");
+            Debug.Log(ex);
+            EditorApplication.Exit(1);
+        }
+    }
+
+    public static void BuildBuiltIn()
+    {
+        try
+        {
+            var buildParameters = new BuildParameters();
+            if (!buildParameters.error)
+            {
+                var publisher = buildParameters.publisher;
+                BuiltInResourceSetting.SetLaunchBackGround(publisher, buildParameters.buildTarget);
+                BuiltInResourceSetting.SetLoginBackGround(publisher, buildParameters.buildTarget);
+                BuiltInResourceSetting.SetLoginLogo(publisher, buildParameters.buildTarget);
+                UpdateBuiltInSetting.SetBuiltinAssetBundleName();
+                ExcuteBuildAsset("builtin", buildParameters);
+            }
+            else
+            {
+                EditorApplication.Exit(1);
+            }
+        }
+        catch (Exception ex)
+        {
+            Debug.Log("鎵撳寘builtin澶辫触");
+            Debug.Log(ex);
+            EditorApplication.Exit(1);
+        }
+    }
+
+    public static void MakeAssetVersionFile()
+    {
+        try
+        {
+            var buildParameters = new BuildParameters();
+            if (!buildParameters.error)
+            {
+                var fileInfoes = new List<FileInfo>();
+                FileExtersion.GetAllDirectoryFileInfos(buildParameters.GetWholeOutPutPath(), fileInfoes);
+                AssetsVersionMaker.WriteAssetsVersionFile(buildParameters.GetWholeOutPutPath(), fileInfoes);
+            }
+            else
+            {
+                EditorApplication.Exit(1);
+            }
+        }
+        catch (Exception ex)
+        {
+            Debug.Log("鐢熸垚AssetVersion澶辫触");
+            Debug.Log(ex);
+            EditorApplication.Exit(1);
+        }
+    }
+
+    private static void ExcuteBuildAsset(string category, BuildParameters @params)
+    {
+        var opt = BuildAssetBundleOptions.None;
+        opt |= BuildAssetBundleOptions.ChunkBasedCompression;
+        opt |= BuildAssetBundleOptions.DeterministicAssetBundle;
+
+        AssetBundleBuildExtersion.Build(@params.GetWholeOutPutPath(), category, opt, @params.buildTarget);
+    }
+
+    class BuildParameters
+    {
+        public bool error = false;
+        public string outputPath;
+        public string publisher;
+        public BuildTarget buildTarget;
+
+        public BuildParameters()
+        {
+            try
+            {
+                var args = Environment.GetCommandLineArgs();
+                for (int i = 0; i < args.Length; i++)
+                {
+                    var arg = args[i];
+                    if (arg.ToLower() == "-outputpath")
+                    {
+                        outputPath = args[i + 1];
+                    }
+                    else if (arg.ToLower() == "-buildtarget")
+                    {
+                        switch (args[i + 1].ToLower())
+                        {
+                            case "android":
+                                buildTarget = BuildTarget.Android;
+                                break;
+                            case "ios":
+                                buildTarget = BuildTarget.iOS;
+                                break;
+                            case "standalone":
+                                buildTarget = BuildTarget.StandaloneWindows;
+                                break;
+                        }
+                    }
+                    else if (arg.ToLower() == "-publisher")
+                    {
+                        publisher = args[i + 1];
+                    }
+                }
+
+                error = false;
+            }
+            catch (Exception ex)
+            {
+                error = true;
+                Debug.LogException(ex);
+                EditorApplication.Exit(1);
+            }
+        }
+
+        public string GetWholeOutPutPath()
+        {
+            switch (buildTarget)
+            {
+                case BuildTarget.Android:
+                    return StringUtility.Contact(outputPath, "/android");
+                case BuildTarget.iOS:
+                    return StringUtility.Contact(outputPath, "/ios");
+                case BuildTarget.StandaloneWindows:
+                    return StringUtility.Contact(outputPath, "/standalone");
+                default:
+                    return string.Empty;
+            }
+        }
+    }
+
+}
diff --git a/Assets/Editor/Tool/BuildExtersion.cs.meta b/Assets/Editor/Tool/BuildExtersion.cs.meta
new file mode 100644
index 0000000..f94b23c
--- /dev/null
+++ b/Assets/Editor/Tool/BuildExtersion.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 38b07376fdcdbab41983adfa63ce473b
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/Tool/BuiltInResourceSetting.cs b/Assets/Editor/Tool/BuiltInResourceSetting.cs
new file mode 100644
index 0000000..71fe95c
--- /dev/null
+++ b/Assets/Editor/Tool/BuiltInResourceSetting.cs
@@ -0,0 +1,174 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEditor;
+using System.IO;
+
+public class BuiltInResourceSetting
+{
+    public static void SetLaunchBackGround(string publisher, BuildTarget buildTarget)
+    {
+        // var fileNames = new List<string>() { };
+
+        // for (var i = 0; i < fileNames.Count; i++)
+        // {
+        //     var fileName = fileNames[i];
+        //     var fromPath = "Assets/Editor/Logo/" + GetVersionName(publisher) + "/" + fileName;
+        //     var toPath = "Assets/ResourcesOut/BuiltIn/Sprites/" + fileName;
+        //     AssetDatabase.DeleteAsset(toPath);
+
+        //     if (AssetDatabase.LoadAssetAtPath<Texture>(fromPath) == null)
+        //     {
+        //         continue;
+        //     }
+
+        //     AssetDatabase.CopyAsset(fromPath, toPath);
+
+        //     var importerPath = toPath;
+        //     var importer = AssetImporter.GetAtPath(importerPath);
+        //     var textureImporter = importer as TextureImporter;
+        //     if (textureImporter != null)
+        //     {
+        //         textureImporter.textureType = TextureImporterType.Sprite;
+        //         textureImporter.assetBundleName = "builtin/sprites";
+
+        //         var platformSetting = new TextureImporterPlatformSettings();
+        //         switch (buildTarget)
+        //         {
+        //             case BuildTarget.Android:
+        //                 platformSetting.overridden = true;
+        //                 platformSetting.allowsAlphaSplitting = false;
+        //                 platformSetting.name = "Android";
+        //                 platformSetting.maxTextureSize = 1024;
+        //                 platformSetting.format = TextureImporterFormat.ASTC_6x6;
+        //                 platformSetting.compressionQuality = 1;
+        //                 break;
+        //             case BuildTarget.iOS:
+        //                 platformSetting.overridden = true;
+        //                 platformSetting.allowsAlphaSplitting = false;
+        //                 platformSetting.name = "iOS";
+        //                 platformSetting.maxTextureSize = 1024;
+        //                 platformSetting.format = TextureImporterFormat.ASTC_6x6;
+        //                 platformSetting.compressionQuality = 1;
+        //                 break;
+        //         }
+
+        //         textureImporter.SetPlatformTextureSettings(platformSetting);
+        //         AssetDatabase.ImportAsset(importerPath);
+        //         EditorUtility.SetDirty(textureImporter);
+        //     }
+        // }
+    }
+
+    public static void SetLoginBackGround(string publisher, BuildTarget buildTarget)
+    {
+        // var fromPath = "Assets/Editor/Logo/" + GetVersionName(publisher) + "/LoginBackGround.png";
+        // var toPath = "Assets/ResourcesOut/BuiltIn/Sprites/LoginBackGround.png";
+        // AssetDatabase.DeleteAsset(toPath);
+        // if (!File.Exists(Application.dataPath + "/Editor/Logo/" + GetVersionName(publisher) + "/LoginBackGround.png"))
+        // {
+        //     return;
+        // }
+        // AssetDatabase.CopyAsset(fromPath, toPath);
+
+        // var importerPath = "Assets/ResourcesOut/BuiltIn/Sprites/LoginBackGround.png";
+        // var importer = AssetImporter.GetAtPath(importerPath);
+        // var textureImporter = importer as TextureImporter;
+        // if (textureImporter != null)
+        // {
+        //     textureImporter.textureType = TextureImporterType.Sprite;
+        //     textureImporter.assetBundleName = "builtin/sprites";
+
+        //     var platformSetting = new TextureImporterPlatformSettings();
+        //     switch (buildTarget)
+        //     {
+        //         case BuildTarget.Android:
+        //             platformSetting.overridden = true;
+        //             platformSetting.allowsAlphaSplitting = false;
+        //             platformSetting.name = "Android";
+        //             platformSetting.maxTextureSize = 1024;
+        //             platformSetting.format = TextureImporterFormat.ASTC_6x6;
+        //             platformSetting.compressionQuality = 1;
+        //             break;
+        //         case BuildTarget.iOS:
+        //             platformSetting.overridden = true;
+        //             platformSetting.allowsAlphaSplitting = false;
+        //             platformSetting.name = "iOS";
+        //             platformSetting.maxTextureSize = 1024;
+        //             platformSetting.format = TextureImporterFormat.ASTC_6x6;
+        //             platformSetting.compressionQuality = 1;
+        //             break;
+        //     }
+
+        //     textureImporter.SetPlatformTextureSettings(platformSetting);
+        //     AssetDatabase.ImportAsset(importerPath);
+        //     EditorUtility.SetDirty(textureImporter);
+        // }
+    }
+
+    public static void SetLoginLogo(string publisher, BuildTarget buildTarget)
+    {
+        var fromPath = "Assets/Editor/Logo/" + GetVersionName(publisher) + "/TB_DL_Logo.png";
+        var toPath = "Assets/ResourcesOut/BuiltIn/Sprites/TB_DL_Logo.png";
+        AssetDatabase.DeleteAsset(toPath);
+        var root = Application.dataPath.Substring(0, Application.dataPath.Length - 6) + "/";
+        File.Copy(root + fromPath, root + toPath);
+
+        AssetDatabase.SaveAssets();
+        AssetDatabase.Refresh();
+
+        var importerPath = "Assets/ResourcesOut/BuiltIn/Sprites/TB_DL_Logo.png";
+        var importer = AssetImporter.GetAtPath(importerPath);
+        var textureImporter = importer as TextureImporter;
+        if (textureImporter != null)
+        {
+            textureImporter.textureType = TextureImporterType.Sprite;
+            textureImporter.assetBundleName = "builtin/sprites";
+
+            var platformSetting = new TextureImporterPlatformSettings();
+            switch (buildTarget)
+            {
+                case BuildTarget.Android:
+                    platformSetting.overridden = true;
+                    platformSetting.allowsAlphaSplitting = false;
+                    platformSetting.name = "Android";
+                    platformSetting.maxTextureSize = 1024;
+                    platformSetting.format = TextureImporterFormat.ASTC_6x6;
+                    platformSetting.compressionQuality = 1;
+                    break;
+                case BuildTarget.iOS:
+                    platformSetting.overridden = true;
+                    platformSetting.allowsAlphaSplitting = false;
+                    platformSetting.name = "iOS";
+                    platformSetting.maxTextureSize = 1024;
+                    platformSetting.format = TextureImporterFormat.ASTC_6x6;
+                    platformSetting.compressionQuality = 1;
+                    break;
+            }
+
+            textureImporter.SetPlatformTextureSettings(platformSetting);
+            AssetDatabase.ImportAsset(importerPath);
+            EditorUtility.SetDirty(textureImporter);
+        }
+    }
+
+    static string GetVersionName(string _publisher)
+    {
+        var lines = File.ReadAllLines(ClientPackage.versionsFilePath);
+        for (int i = 2; i < lines.Length; i++)
+        {
+            var line = lines[i];
+            var lineStrings = line.Split('\t');
+            if (lineStrings[0] == _publisher)
+            {
+                if (!string.IsNullOrEmpty(lineStrings[24]))
+                    return lineStrings[24];
+                return lineStrings[1];
+            }
+
+        }
+
+        return string.Empty;
+    }
+
+}
diff --git a/Assets/Editor/Tool/BuiltInResourceSetting.cs.meta b/Assets/Editor/Tool/BuiltInResourceSetting.cs.meta
new file mode 100644
index 0000000..b1ab433
--- /dev/null
+++ b/Assets/Editor/Tool/BuiltInResourceSetting.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 8888ce92adab0f94da7f3dc32fa30a15
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/Tool/BytesVersionMaker.cs b/Assets/Editor/Tool/BytesVersionMaker.cs
new file mode 100644
index 0000000..2fdc1bf
--- /dev/null
+++ b/Assets/Editor/Tool/BytesVersionMaker.cs
@@ -0,0 +1,46 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using System;
+using System.IO;
+
+public class BytesVersionMaker
+{
+    public static void WriteAssetsVersionFile(string _path, List<FileInfo> _fileInfos)
+    {
+        var relativePath = string.Empty;
+        var extersion = string.Empty;
+        var fileSize = 0L;
+        var md5 = string.Empty;
+
+        var lines = new List<string>();
+        for (int i = 0; i < _fileInfos.Count; i++)
+        {
+            var fileInfo = _fileInfos[i];
+            if (fileInfo.Name == "logicbytes.txt")
+            {
+                continue;
+            }
+
+            if (fileInfo.FullName.Contains("DS_Store") || fileInfo.FullName.Contains("ds_store"))
+            {
+                continue;
+            }
+
+            relativePath = FileExtersion.GetFileRelativePath(_path, fileInfo.FullName);
+            extersion = fileInfo.Extension;
+            fileSize = fileInfo.Length;
+            md5 = FileExtersion.GetMD5HashFromFile(fileInfo.FullName);
+
+            lines.Add(StringUtility.Contact(relativePath, "\t", extersion, "\t", fileSize, "\t", md5));
+        }
+
+        var assetVersionFile = StringUtility.Contact(_path, Path.DirectorySeparatorChar, "logicbytes.txt");
+        if (File.Exists(assetVersionFile))
+        {
+            File.Delete(assetVersionFile);
+        }
+
+        File.WriteAllText(StringUtility.Contact(_path, Path.DirectorySeparatorChar, "logicbytes.txt"), string.Join(FileExtersion.lineSplit, lines.ToArray()));
+    }
+
+}
diff --git a/Assets/Editor/Tool/BytesVersionMaker.cs.meta b/Assets/Editor/Tool/BytesVersionMaker.cs.meta
new file mode 100644
index 0000000..be29708
--- /dev/null
+++ b/Assets/Editor/Tool/BytesVersionMaker.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 5b09c69ed2c9dd14696747815a3ad06b
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/Tool/ClientPackage.cs b/Assets/Editor/Tool/ClientPackage.cs
new file mode 100644
index 0000000..b525a3a
--- /dev/null
+++ b/Assets/Editor/Tool/ClientPackage.cs
@@ -0,0 +1,782 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using System;
+using UnityEditor;
+using System.IO;
+using System.Text.RegularExpressions;
+using System.Text;
+
+//using Beebyte.Obfuscator;
+
+public class ClientPackage
+{
+    public static readonly string versionsFilePath = Application.dataPath + "/Editor/VersionConfigs/Versions.txt";
+    public static readonly string[] baseLevels = new string[] { "Assets/Resources/Scenes/Launch.unity" };
+
+    public static string auditOutTime = string.Empty;
+
+    public static string SDK_PLUGIN_PROJECT
+    {
+        get { return LocalSave.GetString("SDK_PROJECT_PATH"); }
+        set { LocalSave.SetString("SDK_PROJECT_PATH", value); }
+    }
+
+    public static bool obfuscatorEnabled
+    {
+        get { return LocalSave.GetBool("obfuscatorEnabled", false); }
+        set { LocalSave.SetBool("obfuscatorEnabled", value); }
+    }
+    public static bool includeConfig
+    {
+        get { return LocalSave.GetBool("client_pg_includeConfig", false); }
+        set { LocalSave.SetBool("client_pg_includeConfig", value); }
+    }
+
+    public static bool includeUI
+    {
+        get { return LocalSave.GetBool("client_pg_includeUI", false); }
+        set { LocalSave.SetBool("client_pg_includeUI", value); }
+    }
+
+    public static int AssetPrior
+    {
+        get { return LocalSave.GetInt("HalfAssetPrior", 1); }
+        set { LocalSave.SetInt("HalfAssetPrior", value); }
+    }
+
+    static string THE_2TH_WORLD_SDK_PATH = Application.dataPath + "/Plugins/Android/bin";
+    static string MANIFEST_PATH = Application.dataPath + "/Plugins/Android/AndroidManifest.xml";
+    static string iOS_PLUGIN_PATH = Application.dataPath + "/Plugins/iOS/Channel";
+
+    static string File_baseProjectTemplate = Application.dataPath + "/Plugins/Android/baseProjectTemplate.gradle";
+    static string File_google_services = Application.dataPath + "/Plugins/Android/google-services.json";
+    static string File_gradleTemplate = Application.dataPath + "/Plugins/Android/gradleTemplate.properties";
+    static string File_LauncherManifest = Application.dataPath + "/Plugins/Android/LauncherManifest.xml";
+    static string File_launcherTemplate = Application.dataPath + "/Plugins/Android/launcherTemplate.gradle";
+    static string File_mainTemplate = Application.dataPath + "/Plugins/Android/mainTemplate.gradle";
+    static string File_deps = Application.dataPath + "/Plugins/Android/deps.gradle";
+    static string File_settingGradle = Application.dataPath + "/Plugins/Android/settingsTemplate.gradle";
+    static string File_huawei_services = Application.dataPath + "/Plugins/Android/agconnect-services.json";
+
+    /// <summary>
+    /// 鎵撳寘
+    /// </summary>
+    /// <param name="_sdkPath">鏁村悎sdk璺緞</param>
+    /// <param name="_assetBundlePath">_assetBundle鐨勮祫婧愯矾寰勶紝榛樿鍦ㄩ」鐩洰褰曚笅鐨� AssetBundles/android</param>
+    /// <param name="_output">鎵撳寘瀹屾垚鍚庣殑杈撳嚭璺緞</param>
+    /// <param name="_publisherString">娓犻亾id锛屽彲鎵撳涓寘锛岀敤|鍒嗗壊</param>
+    /// <param name="_buildIndex">鎵撳寘搴忓簭鍙凤紝鐢ㄤ簬鏍囪瘑鍚嶇О</param>
+    /// <param name="_development">鏄惁涓哄紑鍙戠増</param>
+    /// <param name="_replace">ios鎵撳寘瀵煎嚭xcode宸ョ▼妯″紡锛孉ppend鍜孯eplace</param>
+    public static void BuildPublishers(string _sdkPath, string _assetBundlePath, string _output, string _publisherString, int _buildIndex, bool _development, bool _replace)
+    {
+
+        var publisherIds = new List<string>();
+        var tempStrings = _publisherString.Split(StringUtility.splitSeparator, StringSplitOptions.RemoveEmptyEntries);
+
+        for (int i = 0; i < tempStrings.Length; i++)
+        {
+            var temp = tempStrings[i];
+            var matches = Regex.Matches(temp, "\\d+");
+            switch (matches.Count)
+            {
+                case 1:
+                    var id = int.Parse(matches[0].Value);
+                    publisherIds.Add(id.ToString());
+                    break;
+                case 2:
+                    var min = int.Parse(matches[0].Value);
+                    var max = int.Parse(matches[1].Value);
+                    for (int j = min; j <= max; j++)
+                    {
+                        publisherIds.Add(j.ToString());
+                    }
+                    break;
+            }
+        }
+
+        var smallPackages = new List<string>();
+        var halfPackages = new List<string>();
+        var bigPackages = new List<string>();
+
+        for (int i = 0; i < publisherIds.Count; i++)
+        {
+            try
+            {
+                var publisher = publisherIds[i];
+                var versionName = string.Empty;
+                var versionConfig = GetVersionConfig(publisher, out versionName);
+                switch (versionConfig.assetAccess)
+                {
+                    case InstalledAsset.NullAsset:
+                        smallPackages.Add(publisher);
+                        break;
+                    case InstalledAsset.HalfAsset:
+                        halfPackages.Add(publisher);
+                        break;
+                    case InstalledAsset.FullAsset:
+                    case InstalledAsset.IngoreDownLoad:
+                        bigPackages.Add(publisher);
+                        break;
+
+                }
+            }
+            catch (Exception ex)
+            {
+                Debug.Log(ex);
+            }
+        }
+
+        if (Directory.Exists(ResourcesPath.Instance.StreamingAssetPath))
+        {
+            Directory.Delete(ResourcesPath.Instance.StreamingAssetPath, true);
+        }
+
+        if (smallPackages.Count > 0)
+        {
+            var files = new List<FileInfo>();
+            var builtInFiles = new List<FileInfo>();
+
+            FileExtersion.GetAllDirectoryFileInfos(_assetBundlePath, files);
+            foreach (var file in files)
+            {
+                var fileName = Path.GetFileName(file.FullName);
+
+                if (file.FullName.Contains("builtin"))
+                {
+                    builtInFiles.Add(file);
+                    continue;
+                }
+
+            }
+
+            var totalCount = builtInFiles.Count;
+            var completeCount = 0;
+            foreach (var item in builtInFiles)
+            {
+                var extension = Path.GetExtension(item.FullName);
+                if (extension == ".meta")
+                {
+                    continue;
+                }
+
+                var relativePath = FileExtersion.GetFileRelativePath(_assetBundlePath, item.FullName);
+                var to = StringUtility.Contact(ResourcesPath.Instance.StreamingAssetPath, relativePath);
+                var directory = Path.GetDirectoryName(to);
+                if (!Directory.Exists(directory))
+                {
+                    Directory.CreateDirectory(directory);
+                }
+
+                File.Copy(item.FullName, to, true);
+                completeCount++;
+            }
+
+            EditorUtility.ClearProgressBar();
+
+            for (int i = 0; i < smallPackages.Count; i++)
+            {
+#if UNITY_ANDROID
+                BuildApk(_sdkPath, _output, smallPackages[i], _buildIndex, _development);
+#elif UNITY_IOS
+                BuildIpa(_sdkPath, smallPackages[i], _buildIndex, _replace);
+#endif
+            }
+        }
+
+        if (halfPackages.Count > 0)
+        {
+            PriorBundleConfig.LazyInit();
+
+            var fromFiles = new List<FileInfo>();
+            FileExtersion.GetAllDirectoryFileInfos(_assetBundlePath, fromFiles);
+
+            var excludeFileFullNames = new List<string>();
+            var tempFiles = new List<FileInfo>();
+            FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(_assetBundlePath, "/gmodels"), tempFiles);
+            foreach (var file in tempFiles)
+            {
+                var extersion = Path.GetExtension(file.FullName);
+                var fileName = Path.GetFileNameWithoutExtension(file.FullName);
+                var prior = PriorBundleConfig.GetAssetPrior(AssetVersion.AssetCategory.Mob, AssetVersionUtility.DecodeFileName(fileName));
+                if (prior > AssetPrior)
+                {
+                    excludeFileFullNames.Add(file.FullName);
+                }
+            }
+
+            tempFiles.Clear();
+            FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(_assetBundlePath, "/maps"), tempFiles);
+            foreach (var file in tempFiles)
+            {
+                var extersion = Path.GetExtension(file.FullName);
+                var fileName = Path.GetFileNameWithoutExtension(file.FullName);
+                var prior = PriorBundleConfig.GetAssetPrior(AssetVersion.AssetCategory.Scene, AssetVersionUtility.DecodeFileName(fileName));
+                if (prior > AssetPrior)
+                {
+                    excludeFileFullNames.Add(file.FullName);
+                }
+            }
+
+            tempFiles.Clear();
+            FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(_assetBundlePath, "/audio"), tempFiles);
+            foreach (var file in tempFiles)
+            {
+                var extersion = Path.GetExtension(file.FullName);
+                var fileName = Path.GetFileNameWithoutExtension(file.FullName);
+                var prior = PriorBundleConfig.GetAssetPrior(AssetVersion.AssetCategory.Audio, AssetVersionUtility.DecodeFileName(fileName));
+                if (prior > AssetPrior)
+                {
+                    excludeFileFullNames.Add(file.FullName);
+                }
+            }
+
+            tempFiles.Clear();
+            FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(_assetBundlePath, "/effect"), tempFiles);
+            foreach (var file in tempFiles)
+            {
+                var extersion = Path.GetExtension(file.FullName);
+                var fileName = Path.GetFileNameWithoutExtension(file.FullName);
+                var prior = PriorBundleConfig.GetAssetPrior(AssetVersion.AssetCategory.Effect, AssetVersionUtility.DecodeFileName(fileName));
+                if (prior > AssetPrior)
+                {
+                    excludeFileFullNames.Add(file.FullName);
+                }
+            }
+
+            //鍓旈櫎瑙嗛璧勬簮
+            tempFiles.Clear();
+            var videoPath = StringUtility.Contact(_assetBundlePath, "/video");
+            if (File.Exists(videoPath))
+            {
+                FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(_assetBundlePath, "/video"), tempFiles);
+                foreach (var file in tempFiles)
+                {
+                    var extersion = Path.GetExtension(file.FullName);
+                    var fileName = Path.GetFileNameWithoutExtension(file.FullName);
+                    var prior = PriorBundleConfig.GetAssetPrior(AssetVersion.AssetCategory.Video, AssetVersionUtility.DecodeFileName(fileName));
+                    if (prior > AssetPrior)
+                    {
+                        excludeFileFullNames.Add(file.FullName);
+                    }
+                }
+            }
+
+
+
+            //鍓旈櫎琛ㄨ祫婧�
+            if (!includeConfig)
+            {
+                tempFiles.Clear();
+                FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(_assetBundlePath, "/config"), tempFiles);
+                foreach (var file in tempFiles)
+                {
+                    excludeFileFullNames.Add(file.FullName);
+                }
+            }
+
+            //鍓旈櫎UI璧勬簮
+            //tempFiles.Clear();
+            //FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(_assetBundlePath, "/ui/sprite"), tempFiles);
+            //foreach (var file in tempFiles)
+            //{
+            //    var fileName = Path.GetFileName(file.FullName);
+            //    if (fileName == "loadingbg")
+            //    {
+            //        excludeFileFullNames.Add(file.FullName);
+            //    }
+            //}
+            if (!includeUI)
+            {
+                tempFiles.Clear();
+                FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(_assetBundlePath, "/ui"), tempFiles);
+                foreach (var file in tempFiles)
+                {
+                    excludeFileFullNames.Add(file.FullName);
+                }
+            }
+            else
+            {
+#if !UNITY_IOS
+                //鍓旈櫎UI璧勬簮
+                tempFiles.Clear();
+                FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(_assetBundlePath, "/ui"), tempFiles);
+                foreach (var file in tempFiles)
+                {
+                    var extersion = Path.GetExtension(file.FullName);
+                    var fileName = Path.GetFileNameWithoutExtension(file.FullName);
+                    var prior = PriorBundleConfig.GetAssetPrior(AssetVersion.AssetCategory.UI, fileName);
+                    if (prior > AssetPrior)
+                    {
+                        excludeFileFullNames.Add(file.FullName);
+                    }
+                }
+#endif
+            }
+
+            for (int i = fromFiles.Count - 1; i >= 0; i--)
+            {
+                var item = fromFiles[i];
+                if (excludeFileFullNames.Contains(item.FullName))
+                {
+                    fromFiles.RemoveAt(i);
+                }
+            }
+
+            var totalCount = fromFiles.Count;
+            var completeCount = 0;
+            foreach (var item in fromFiles)
+            {
+                var relativePath = FileExtersion.GetFileRelativePath(_assetBundlePath, item.FullName);
+                var to = StringUtility.Contact(ResourcesPath.Instance.StreamingAssetPath, relativePath);
+                if (relativePath.StartsWith("patch"))//涓嶅寘鍚玬eta鏂囦欢鍜岃ˉ涓�
+                    continue;
+
+                var directory = Path.GetDirectoryName(to);
+                if (!Directory.Exists(directory))
+                    Directory.CreateDirectory(directory);
+
+                var extension = Path.GetExtension(item.FullName);
+                if (extension == ".meta")
+                    continue;
+
+                File.Copy(item.FullName, to, true);
+                completeCount++;
+            }
+
+            EditorUtility.ClearProgressBar();
+            for (int i = 0; i < halfPackages.Count; i++)
+            {
+#if UNITY_ANDROID
+                BuildApk(_sdkPath, _output, halfPackages[i], _buildIndex, _development);
+#elif UNITY_IOS
+                BuildIpa(_sdkPath, halfPackages[i], _buildIndex, _replace);
+#endif
+            }
+        }
+
+        if (bigPackages.Count > 0)
+        {
+            var fromFiles = new List<FileInfo>();
+            FileExtersion.GetAllDirectoryFileInfos(_assetBundlePath, fromFiles);
+
+            var totalCount = fromFiles.Count;
+            var completeCount = 0;
+            foreach (var item in fromFiles)
+            {
+                var relativePath = FileExtersion.GetFileRelativePath(_assetBundlePath, item.FullName);
+                var to = StringUtility.Contact(ResourcesPath.Instance.StreamingAssetPath, relativePath);
+                if (relativePath.StartsWith("patch"))//涓嶅寘鍚玬eta鏂囦欢鍜岃ˉ涓�
+                    continue;
+
+                var directory = Path.GetDirectoryName(to);
+                if (!Directory.Exists(directory))
+                    Directory.CreateDirectory(directory);
+
+                var extension = Path.GetExtension(item.FullName);
+                if (extension == ".meta")
+                    continue;
+
+                File.Copy(item.FullName, to, true);
+                completeCount++;
+            }
+
+            for (int i = 0; i < bigPackages.Count; i++)
+            {
+#if UNITY_ANDROID
+                BuildApk(_sdkPath, _output, bigPackages[i], _buildIndex, _development);
+#elif UNITY_IOS
+                BuildIpa(_sdkPath, bigPackages[i], _buildIndex, _replace);
+#endif
+            }
+        }
+
+    }
+
+    public static void BuildApk(string _sdkPath, string _output, string _publisher, int _buildIndex, bool _development)
+    {
+        PreBuild(_publisher, _buildIndex);
+        var auditTimeFile = StringUtility.Contact(Application.dataPath, Path.DirectorySeparatorChar, "Resources/Config/AuditTime.txt");
+        if (File.Exists(auditTimeFile))
+        {
+            File.Delete(auditTimeFile);
+        }
+
+        var versionName = string.Empty;
+        var versionConfig = GetVersionConfig(_publisher, out versionName);
+        var versionConfigCSpath = Application.dataPath + "/Scripts/System/ClientVersion/VersionConfig.cs";
+        var text = File.ReadAllText(versionConfigCSpath);
+
+        if (text.Contains("VERSION_ALTERNATIVE"))
+        {
+            var pattern = "VERSION_ALTERNATIVE = \".*\"";
+            text = Regex.Replace(text, pattern, StringUtility.Contact("VERSION_ALTERNATIVE = ", "\"", versionConfig.m_Version, "\""));
+
+            bool encoderShouldEmitUTF8Identifier = true;
+            bool throwOnInvalidBytes = false;
+            UTF8Encoding encoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier, throwOnInvalidBytes);
+            bool append = false;
+            StreamWriter streamWriter = new StreamWriter(versionConfigCSpath, append, encoding);
+            streamWriter.Write(text);
+            streamWriter.Close();
+            AssetDatabase.ImportAsset(versionConfigCSpath);
+        }
+
+        // 閽堝鏌愪竴浜涙墦鍖呯殑鐗规畩鎬�, 杩欓噷鐗规寚渚濊禆鐨勭涓夋柟搴撳惈鏈夎祫婧愮殑闂
+        // 杩欓噷瀵规湁杩欑鐗瑰瀷鐨勬笭閬撶殑sdk鍦ㄦ墦鍖呯殑鏃跺�欏樊寮傚寲gradle鏂囦欢
+        // 鏇村悕鍘熸湁鏂囦欢
+        // string _gradleTemplateUrl = EditorApplication.applicationContentsPath + "/PlaybackEngines/AndroidPlayer/Tools/GradleTemplates/";
+        // string _gradleFileUrl = _gradleTemplateUrl + "mainTemplate.gradle";
+        // string _diffGradleFileUrl = StringUtility.Contact(_sdkPath, "/GradleDiff/", versionConfig.appId, "/mainTemplate.gradle");
+        // FileInfo _fileInfo = new FileInfo(_diffGradleFileUrl);
+
+        // if (!_fileInfo.Exists)
+        // {
+        //     EditorUtility.DisplayDialog("璀﹀憡", "Gradle妯″紡闇�瑕侀厤缃樊寮傛枃浠�,浣嗘槸娌℃湁鎵惧埌璇ユ枃浠�: " + _diffGradleFileUrl, "@Hale");
+        //     return;
+        // }
+
+        // _fileInfo.CopyTo(_gradleFileUrl, true);
+
+        // 绉诲姩閰嶇疆鏂囦欢鑷虫墦鍖呭伐浣滅洰褰曚腑
+        var keystorePath = Application.dataPath + "/Editor/Keystore/" + versionConfig.keystoreFileName + ".keystore";
+        if (!File.Exists(keystorePath))
+        {
+            Debug.LogError("绛惧悕鏂囦欢涓嶅瓨鍦�");
+            return;
+        }
+        PlayerSettings.Android.keystoreName = keystorePath;
+        PlayerSettings.Android.keystorePass = versionConfig.keystorePassword;
+        PlayerSettings.Android.keyaliasName = versionConfig.keystoreAlias;
+        PlayerSettings.Android.keyaliasPass = versionConfig.keystoreAliasPassword;
+        // PlayerSettings.Android.targetSdkVersion = AndroidSdkVersions.AndroidApiLevel22;
+        PlayerSettings.Android.bundleVersionCode = VersionConfig.GetVersionNumber(versionConfig.version);
+
+        PlayerSettings.enableInternalProfiler = _development;
+
+        //鍒犻櫎鍘焥dk鏂囦欢
+        if (Directory.Exists(THE_2TH_WORLD_SDK_PATH))
+            Directory.Delete(THE_2TH_WORLD_SDK_PATH, true);
+        if (File.Exists(MANIFEST_PATH))
+            File.Delete(MANIFEST_PATH);
+        if (File.Exists(File_baseProjectTemplate))
+            File.Delete(File_baseProjectTemplate);
+        if (File.Exists(File_google_services))
+            File.Delete(File_google_services);
+        if (File.Exists(File_gradleTemplate))
+            File.Delete(File_gradleTemplate);
+        if (File.Exists(File_LauncherManifest))
+            File.Delete(File_LauncherManifest);
+        if (File.Exists(File_launcherTemplate))
+            File.Delete(File_launcherTemplate);
+        if (File.Exists(File_mainTemplate))
+            File.Delete(File_mainTemplate);
+        if (File.Exists(File_deps))
+            File.Delete(File_deps);
+        if (File.Exists(File_huawei_services))
+            File.Delete(File_huawei_services);
+        if (File.Exists(File_settingGradle))
+            File.Delete(File_settingGradle);
+
+
+        var variant = _development ? "debug" : "release";
+
+        string channelSdkPath;
+        string copySdkFile;
+
+        channelSdkPath = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/", variant);
+        copySdkFile = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/AndroidManifest.xml");
+        File.Copy(copySdkFile, MANIFEST_PATH);
+        copySdkFile = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/baseProjectTemplate.gradle");
+        File.Copy(copySdkFile, File_baseProjectTemplate);
+        copySdkFile = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/deps.gradle");
+        File.Copy(copySdkFile, File_deps);
+        copySdkFile = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/google-services.json");
+        File.Copy(copySdkFile, File_google_services);
+        copySdkFile = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/gradleTemplate.properties");
+        File.Copy(copySdkFile, File_gradleTemplate);
+        //copySdkFile = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.appId, "/LauncherManifest.xml");
+        //File.Copy(copySdkFile, File_LauncherManifest);
+        copySdkFile = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/launcherTemplate.gradle");
+        File.Copy(copySdkFile, File_launcherTemplate);
+        copySdkFile = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/mainTemplate.gradle");
+        File.Copy(copySdkFile, File_mainTemplate);
+        copySdkFile = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/settingsTemplate.gradle");
+        File.Copy(copySdkFile, File_settingGradle);
+
+        if (versionConfig.sdkFileName == "hyyngame_huawei")
+        {
+            copySdkFile = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/agconnect-services.json");
+            File.Copy(copySdkFile, File_huawei_services);
+        }
+
+        Debug.LogFormat("Android 娓呭崟绛夋枃浠舵嫹璐濇垚鍔�");
+
+
+
+        if (Directory.Exists(channelSdkPath))
+        {
+            FileExtersion.DirectoryCopy(channelSdkPath, THE_2TH_WORLD_SDK_PATH);
+            Debug.LogFormat("鎵цAndroid 娓犻亾SDK 鏂囦欢鎷疯礉锛宖rom:{0};to:{1}", channelSdkPath, THE_2TH_WORLD_SDK_PATH);
+        }
+        else
+        {
+            Debug.LogFormat("Android 娓犻亾SDK鏂囦欢涓嶅瓨鍦紝{0}", channelSdkPath);
+            return;
+        }
+
+        //var option = AssetDatabase.LoadAssetAtPath<Options>("Assets/Editor/Beebyte/Obfuscator/ObfuscatorOptions.asset");
+        //if (option != null)
+        //{
+        //    option.enabled = obfuscatorEnabled;
+        //    EditorUtility.SetDirty(option);
+        //}
+
+        AssetDatabase.SaveAssets();
+        AssetDatabase.Refresh();
+
+
+        if (_development)
+        {
+            var apkName = StringUtility.Contact(_output, "/", versionName, "_", versionConfig.clientPackageFlag, "_v", versionConfig.m_Version, "_", _buildIndex, "_development.apk");
+            BuildPipeline.BuildPlayer(baseLevels, apkName, BuildTarget.Android, BuildOptions.Development | BuildOptions.ConnectWithProfiler | BuildOptions.AllowDebugging);
+        }
+        else
+        {
+            string apkName;
+            if (EditorUserBuildSettings.buildAppBundle)
+            {
+                Debug.Log("鍕鹃�変簡 Build App Bundle (Google Play) 鎵撳寘aab");
+                apkName = StringUtility.Contact(_output, "/", versionName, "_", versionConfig.clientPackageFlag, "_v", versionConfig.m_Version, "_", _buildIndex, ".aab");
+            }
+            else
+            {
+                Debug.Log("娌℃湁鍕鹃�� Build App Bundle (Google Play) 鎵撳寘apk");
+                apkName = StringUtility.Contact(_output, "/", versionName, "_", versionConfig.clientPackageFlag, "_v", versionConfig.m_Version, "_", _buildIndex, ".apk");
+            }
+            BuildPipeline.BuildPlayer(baseLevels, apkName, BuildTarget.Android, BuildOptions.None);
+        }
+    }
+
+    public static VersionConfig versionConfig1 = null;
+    public static void BuildIpa(string _sdkPath, string _publisher, int _buildIndex, bool _replace)
+    {
+        PreBuild(_publisher, _buildIndex);
+
+        var versionName = string.Empty;
+        versionConfig1 = GetVersionConfig(_publisher, out versionName);
+
+        if (Directory.Exists(iOS_PLUGIN_PATH))
+        {
+            Directory.Delete(iOS_PLUGIN_PATH, true);
+        }
+
+        if (versionConfig1.sdkFileName.Trim().Length != 0)
+        {
+            FileExtersion.DirectoryCopy(StringUtility.Contact(_sdkPath, "/Channel/iOS/", versionConfig1.sdkFileName, "/Plugins"), iOS_PLUGIN_PATH);
+        }
+        else
+        {
+            FileExtersion.DirectoryCopy(StringUtility.Contact(_sdkPath, "/Channel/iOS/", versionConfig1.appId, "/Plugins"), iOS_PLUGIN_PATH);
+        }
+
+        DateTime outTime;
+        var correct = DateTime.TryParse(auditOutTime, out outTime);
+        var directory = Application.dataPath + Path.DirectorySeparatorChar + "Resources/Config";
+        if (!Directory.Exists(directory))
+        {
+            Directory.CreateDirectory(directory);
+        }
+        File.WriteAllText(Application.dataPath + Path.DirectorySeparatorChar + "Resources/Config/AuditTime.txt", correct ? auditOutTime : "");
+
+        //var option = AssetDatabase.LoadAssetAtPath<Options>("Assets/Editor/Beebyte/Obfuscator/ObfuscatorOptions.asset");
+        //if (option != null)
+        //{
+        //    option.enabled = obfuscatorEnabled;
+        //    EditorUtility.SetDirty(option);
+        //}
+
+        AssetDatabase.SaveAssets();
+        AssetDatabase.Refresh();
+        PlayerSettings.iOS.buildNumber = VersionConfig.Get().buildIndex.ToString();
+        PlayerSettings.iOS.appleDeveloperTeamID = VersionConfig.Get().appleDeveloperTeamID;
+
+#if UNITY_IOS
+        if (_replace)
+        {
+            XCodeProjectMod.BuildIOSProject_Replace();
+        }
+        else
+        {
+            XCodeProjectMod.BuildIOSProject_Append();
+        }
+#endif
+    }
+
+    //闅忓寘瀹夎鐨勮祫婧愪笉鍚屽钩鍙颁笉涓�瀹氬彲浠ヨ幏鍙朏ileInfo锛屾墍浠ラ渶瑕佷笅杞戒竴涓枃浠舵潵鑾峰彇璧勬簮鐨凪D5淇℃伅
+    //璇ユ枃浠跺湪鎵撳寘鏃剁敓鎴� 璁板綍闅忓寘鐨勬墍鏈夎祫婧愮殑淇℃伅
+    //璇ユ枃浠惰褰曠殑璧勬簮鍦ㄥ寘涓偗瀹氬瓨鍦紝鎵�浠ヤ笉鐢ㄥ幓鍙栨寚瀹氱殑璧勬簮鏂囦欢鑾峰緱FileInfo 璁$畻MD5
+    //閫氳繃鏂囦欢鍜孉ssetsVersion.txt鐨勬枃浠跺仛姣旇緝锛屾潵鍒ゆ柇鏄惁闇�瑕佷笅杞借祫婧�
+    //logicbytes.txt 鍖呭惈鍏冩暟鎹拰浠g爜 濡傛灉涓嶉殢鍖呬篃瑕佸鐞�
+    static void MakePackageMD5File()
+    {
+        var fileInfos = new List<FileInfo>();
+        FileExtersion.GetAllDirectoryFileInfos(ResourcesPath.Instance.StreamingAssetPath, fileInfos);
+        AssetsVersionCmpMaker.WriteAssetsVersionFile(ResourcesPath.Instance.StreamingAssetPath, fileInfos);
+        Debug.Log("--鐢熸垚AssetsVersionCmp.txt鏂囦欢瀹屾瘯");
+    }
+
+    private static void PreBuild(string _publisher, int _buildIndex)
+    {
+        MakePackageMD5File();
+        var newVersionConfigPath = StringUtility.Contact("Assets/Resources/VersionConfig", ".asset");
+        var versionName = string.Empty;
+        var fromVersionConfig = GetVersionConfig(_publisher, out versionName);
+        var newVersionConfig = ScriptableObject.CreateInstance<VersionConfig>();
+        if (File.Exists(newVersionConfigPath))
+        {
+            AssetDatabase.DeleteAsset(newVersionConfigPath);
+        }
+
+        VersionConfig.Copy(fromVersionConfig, newVersionConfig);
+        newVersionConfig.buildTime = DateTime.Now.ToString("yy/MM/dd--HH:mm");
+        newVersionConfig.buildIndex = _buildIndex;
+
+        if (File.Exists(Application.dataPath + "/Resources/Game.txt"))
+        {
+            File.Delete(Application.dataPath + "/Resources/Game.txt");
+        }
+
+        File.WriteAllText(Application.dataPath + "/Resources/Game.txt", GetGameId(_publisher));
+
+        AssetDatabase.CreateAsset(newVersionConfig, newVersionConfigPath);
+        EditorUtility.SetDirty(newVersionConfig);
+
+        //鐢熸垚VersionConfigEx.txt 鎻愪緵缁橝OT鍚姩鏃朵娇鐢�
+        var json = JsonUtility.ToJson(newVersionConfig);
+        string versionConfigExFile = Application.dataPath + "/Resources/VersionConfigEx.txt";
+        if (File.Exists(versionConfigExFile))
+        {
+            File.Delete(versionConfigExFile);
+        }
+        File.WriteAllText(versionConfigExFile, json);
+
+
+        SetIconAndSplashImage(versionName);
+        //SetCreateRoleAnimation();
+
+        PlayerSettings.companyName = "xmsw";
+        PlayerSettings.productName = newVersionConfig.productName;
+        PlayerSettings.applicationIdentifier = newVersionConfig.bundleIdentifier;
+        PlayerSettings.defaultInterfaceOrientation = UIOrientation.AutoRotation;
+        PlayerSettings.allowedAutorotateToLandscapeLeft = true;
+        PlayerSettings.allowedAutorotateToLandscapeRight = true;
+        PlayerSettings.allowedAutorotateToPortrait = false;
+        PlayerSettings.allowedAutorotateToPortraitUpsideDown = false;
+        PlayerSettings.bundleVersion = VersionConfig.GetVersionNumber(newVersionConfig.version).ToString();
+
+
+        AssetDatabase.SaveAssets();
+        AssetDatabase.Refresh();
+    }
+
+    public static VersionConfig GetVersionConfig(string _publisher, out string _versionName)
+    {
+        var lines = File.ReadAllLines(versionsFilePath);
+
+        for (int i = 2; i < lines.Length; i++)
+        {
+            var line = lines[i];
+            var lineStrings = line.Split('\t');
+            if (lineStrings[0] == _publisher)
+            {
+                var config = new VersionConfig();
+                config.Read(line);
+                _versionName = lineStrings[1];
+                if (!string.IsNullOrEmpty(lineStrings[24]))
+                    _versionName = lineStrings[24];
+                return config;
+            }
+        }
+
+        _versionName = string.Empty;
+        return null;
+    }
+
+    static string GetGameId(string _publisher)
+    {
+        var lines = File.ReadAllLines(versionsFilePath);
+        for (int i = 2; i < lines.Length; i++)
+        {
+            var line = lines[i];
+            var lineStrings = line.Split('\t');
+            if (lineStrings[0] == _publisher)
+            {
+                return lineStrings[7];
+            }
+        }
+
+        return "xbqy";
+    }
+
+    static void SetIconAndSplashImage(string _versionName)
+    {
+        var buildTarget = GetBuildTarget();
+        var texture = AssetDatabase.LoadAssetAtPath<Texture2D>(StringUtility.Contact("Assets/Editor/Logo/", _versionName, "/Icon.png"));
+        var iconSizes = PlayerSettings.GetIconSizesForTargetGroup(buildTarget);
+        var icons = new Texture2D[iconSizes.Length];
+        for (int i = 0; i < iconSizes.Length; i++)
+        {
+            icons[i] = texture;
+        }
+
+        PlayerSettings.SetIconsForTargetGroup(buildTarget, icons);
+
+        PlayerSettings.SplashScreen.show = false;
+        PlayerSettings.SplashScreen.showUnityLogo = false;
+        PlayerSettings.SplashScreen.unityLogoStyle = PlayerSettings.SplashScreen.UnityLogoStyle.LightOnDark;
+
+        var splashImage = AssetDatabase.LoadAssetAtPath<Sprite>(StringUtility.Contact("Assets/Editor/Logo/", _versionName, "/SplashImage.png"));
+        var splashScreenLogo = PlayerSettings.SplashScreenLogo.Create(3, splashImage);
+        PlayerSettings.SplashScreen.logos = new PlayerSettings.SplashScreenLogo[] { splashScreenLogo };
+
+        if (buildTarget == BuildTargetGroup.Android)
+        {
+            var projectSettings = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/ProjectSettings.asset")[0]);
+            var splashImageSetting = projectSettings.FindProperty("androidSplashScreen");
+            splashImageSetting.objectReferenceValue = splashImage.texture;
+            projectSettings.ApplyModifiedProperties();
+
+            PlayerSettings.Android.splashScreenScale = AndroidSplashScreenScale.ScaleToFill;
+        }
+    }
+
+    public static void SetCreateRoleAnimation()
+    {
+        var from = "Assets/Editor/Video/CreateRoleMovie.mp4";
+        var to = "Assets/StreamingAssets/CreateRoleMovie.mp4";
+
+        if (!Directory.Exists(Application.dataPath + "StreamingAssets"))
+        {
+            Directory.CreateDirectory(Application.dataPath + "StreamingAssets");
+        }
+
+        if (AssetDatabase.LoadAssetAtPath<UnityEngine.Video.VideoClip>(to) == null)
+        {
+            AssetDatabase.CopyAsset(from, to);
+        }
+    }
+
+    static BuildTargetGroup GetBuildTarget()
+    {
+#if UNITY_ANDROID
+        return BuildTargetGroup.Android;
+#elif UNITY_IOS
+        return BuildTargetGroup.iOS;
+#else
+        return BuildTargetGroup.Standalone;
+#endif
+    }
+
+}
diff --git a/Assets/Editor/Tool/ClientPackage.cs.meta b/Assets/Editor/Tool/ClientPackage.cs.meta
new file mode 100644
index 0000000..8b2b917
--- /dev/null
+++ b/Assets/Editor/Tool/ClientPackage.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 061f42011b45e9144a5e740e789ec540
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/Tool/ClientPackageExtension.cs b/Assets/Editor/Tool/ClientPackageExtension.cs
new file mode 100644
index 0000000..51c0a4e
--- /dev/null
+++ b/Assets/Editor/Tool/ClientPackageExtension.cs
@@ -0,0 +1,115 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using System;
+using UnityEditor;
+
+public class ClientPackageExtension
+{
+
+    public static void BuildApk()
+    {
+        var parameters = new BuildParameters();
+
+        if (!parameters.error)
+        {
+            try
+            {
+                ClientPackage.AssetPrior = 1;
+                ClientPackage.BuildPublishers(parameters.sdkPath, parameters.assetbundlePath, parameters.outputPath, parameters.publishers, parameters.buildIndex, false, false);
+            }
+            catch (Exception ex)
+            {
+                Debug.Log("鎵撳寘apk澶辫触");
+                Debug.Log(ex);
+                EditorApplication.Exit(1);
+            }
+        }
+        else
+        {
+            EditorApplication.Exit(1);
+        }
+
+    }
+
+    public static void BuildEXE()
+    {
+        var parameters = new BuildParameters();
+        if (!parameters.error)
+        {
+            try
+            {
+                ClientPackage_Standalone.AssetPrior = 1;
+                ClientPackage_Standalone.Build(new ClientPackage_Standalone.BuildParams()
+                {
+                    assetBundle = parameters.assetbundlePath,
+                    output = parameters.outputPath,
+                    buildIndex = parameters.buildIndex,
+                    development = false,
+                    publisher = parameters.publishers,
+                });
+            }
+            catch (Exception ex)
+            {
+                Debug.Log("鎵撳寘EXE澶辫触");
+                Debug.Log(ex);
+                EditorApplication.Exit(1);
+            }
+        }
+        else
+        {
+            EditorApplication.Exit(1);
+        }
+    }
+
+    class BuildParameters
+    {
+        public bool error = false;
+        public string assetbundlePath;
+        public string outputPath;
+        public string publishers;
+        public int buildIndex;
+        public string sdkPath;
+
+        public BuildParameters()
+        {
+            try
+            {
+                var args = Environment.GetCommandLineArgs();
+                for (int i = 0; i < args.Length; i++)
+                {
+                    var arg = args[i];
+                    if (arg.ToLower() == "-outputpath")
+                    {
+                        outputPath = args[i + 1];
+                    }
+                    else if (arg.ToLower() == "-assetbundlepath")
+                    {
+                        assetbundlePath = args[i + 1];
+                    }
+                    else if (arg.ToLower() == "-publishers")
+                    {
+                        publishers = args[i + 1];
+                    }
+                    else if (arg.ToLower() == "-buildindex")
+                    {
+                        int.TryParse(args[i + 1], out buildIndex);
+                    }
+                    else if (arg.ToLower() == "-sdkpath")
+                    {
+                        sdkPath = args[i + 1];
+                    }
+                }
+
+                error = false;
+            }
+            catch (Exception ex)
+            {
+                error = true;
+                Debug.LogException(ex);
+                EditorApplication.Exit(1);
+            }
+        }
+    }
+
+}
diff --git a/Assets/Editor/Tool/ClientPackageExtension.cs.meta b/Assets/Editor/Tool/ClientPackageExtension.cs.meta
new file mode 100644
index 0000000..42818fa
--- /dev/null
+++ b/Assets/Editor/Tool/ClientPackageExtension.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 47c39d2ed824a364f892cec5d8e5375d
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/Tool/ClientPackage_Standalone.cs b/Assets/Editor/Tool/ClientPackage_Standalone.cs
new file mode 100644
index 0000000..bc3bcb5
--- /dev/null
+++ b/Assets/Editor/Tool/ClientPackage_Standalone.cs
@@ -0,0 +1,454 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using System;
+using UnityEditor;
+using System.IO;
+using System.Text.RegularExpressions;
+using System.Text;
+//using Beebyte.Obfuscator;
+
+public class ClientPackage_Standalone
+{
+    static readonly string versionsFilePath = Application.dataPath + Path.DirectorySeparatorChar + "Editor/VersionConfigs/Versions.txt";
+    static readonly string[] baseLevels = new string[] { "Assets/Resources/Scenes/Launch.unity", "Assets/Resources/Scenes/Empty.unity" };
+    static readonly List<string> builtinConfigs = new List<string>() {
+        "Contact.txt","HelpInfo.txt","PriorBundle.txt","PriorLanguage.txt","ApkUpdateUrl.txt","InitialFunction.txt"
+    };
+
+    public static bool obfuscatorEnabled
+    {
+        get { return LocalSave.GetBool("obfuscatorEnabled", false); }
+        set { LocalSave.SetBool("obfuscatorEnabled", value); }
+    }
+
+    public static int AssetPrior
+    {
+        get { return LocalSave.GetInt("Standalone_HalfAssetPrior", 1); }
+        set { LocalSave.SetInt("Standalone_HalfAssetPrior", value); }
+    }
+
+    public struct BuildParams
+    {
+        public string publisher;
+        public string assetBundle;
+        public string output;
+        public int buildIndex;
+        public bool development;
+    }
+
+    public static void Build(BuildParams buildParams)
+    {
+        var packageIds = new List<int>();
+        var tempStrings = buildParams.publisher.Split(StringUtility.splitSeparator, StringSplitOptions.RemoveEmptyEntries);
+        foreach (var temp in tempStrings)
+        {
+            var matches = Regex.Matches(temp, "\\d+");
+            switch (matches.Count)
+            {
+                case 1:
+                    var id = int.Parse(matches[0].Value);
+                    packageIds.Add(id);
+                    break;
+                case 2:
+                    var min = int.Parse(matches[0].Value);
+                    var max = int.Parse(matches[1].Value);
+                    for (int index = min; index <= max; index++)
+                    {
+                        packageIds.Add(index);
+                    }
+                    break;
+            }
+        }
+
+        var smallPackages = new List<int>();
+        var middlePackages = new List<int>();
+        var bigPackages = new List<int>();
+        foreach (var id in packageIds)
+        {
+            var versionName = string.Empty;
+            var versionConfig = GetVersionConfig(id.ToString(), out versionName);
+            switch (versionConfig.assetAccess)
+            {
+                case InstalledAsset.NullAsset:
+                    smallPackages.Add(id);
+                    break;
+                case InstalledAsset.HalfAsset:
+                    middlePackages.Add(id);
+                    break;
+                case InstalledAsset.FullAsset:
+                case InstalledAsset.IngoreDownLoad:
+                    bigPackages.Add(id);
+                    break;
+
+            }
+        }
+
+        BuildSmallPackage(smallPackages, buildParams.assetBundle, buildParams.output, buildParams.buildIndex, buildParams.development);
+        BuildMiddlePackage(middlePackages, buildParams.assetBundle, buildParams.output, buildParams.buildIndex, buildParams.development);
+        BuildBigPackage(bigPackages, buildParams.assetBundle, buildParams.output, buildParams.buildIndex, buildParams.development);
+    }
+
+    static void BuildSmallPackage(List<int> packageIds, string assetPath, string output, int buildIndex, bool development)
+    {
+        if (Directory.Exists(ResourcesPath.Instance.StreamingAssetPath))
+        {
+            Directory.Delete(ResourcesPath.Instance.StreamingAssetPath, true);
+        }
+
+        if (packageIds.IsNullOrEmpty())
+        {
+            return;
+        }
+
+        var builtInFiles = new List<FileInfo>();
+        var files = new List<FileInfo>();
+        FileExtersion.GetAllDirectoryFileInfos(assetPath, files);
+        foreach (var file in files)
+        {
+            var fileName = Path.GetFileName(file.FullName);
+            if (file.FullName.Contains("builtin") || builtinConfigs.Contains(fileName))
+            {
+                builtInFiles.Add(file);
+            }
+            else
+            {
+                File.Delete(file.FullName);
+            }
+        }
+
+        foreach (var item in builtInFiles)
+        {
+            var directory = Path.GetDirectoryName(item.FullName);
+            if (!Directory.Exists(directory))
+            {
+                Directory.CreateDirectory(directory);
+            }
+
+            var relativePath = FileExtersion.GetFileRelativePath(assetPath, item.FullName);
+            var to = StringUtility.Contact(ResourcesPath.Instance.StreamingAssetPath, relativePath);
+            File.Copy(item.FullName, to, true);
+        }
+
+        foreach (var id in packageIds)
+        {
+            BuildPackage(id, output, buildIndex, development);
+        }
+    }
+
+    static void BuildMiddlePackage(List<int> packageIds, string assetPath, string output, int buildIndex, bool development)
+    {
+        if (Directory.Exists(ResourcesPath.Instance.StreamingAssetPath))
+        {
+            Directory.Delete(ResourcesPath.Instance.StreamingAssetPath, true);
+        }
+
+        if (packageIds.IsNullOrEmpty())
+        {
+            return;
+        }
+
+        PriorBundleConfig.LazyInit();
+
+        var fromFiles = new List<FileInfo>();
+        FileExtersion.GetAllDirectoryFileInfos(assetPath, fromFiles);
+
+        var excludeFileFullNames = new List<string>();
+        var tempFiles = new List<FileInfo>();
+        FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(assetPath, "/gmodels"), tempFiles);
+        foreach (var file in tempFiles)
+        {
+            var extersion = Path.GetExtension(file.FullName);
+            var fileName = Path.GetFileName(file.FullName);
+            if (!string.IsNullOrEmpty(extersion))
+            {
+                fileName = fileName.Replace(extersion, "");
+            }
+
+            var prior = PriorBundleConfig.GetAssetPrior(AssetVersion.AssetCategory.Mob, AssetVersionUtility.DecodeFileName(fileName));
+            if (prior > AssetPrior)
+            {
+                excludeFileFullNames.Add(file.FullName);
+            }
+        }
+
+        tempFiles.Clear();
+        FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(assetPath, "/maps"), tempFiles);
+        foreach (var file in tempFiles)
+        {
+            var extersion = Path.GetExtension(file.FullName);
+            var fileName = Path.GetFileName(file.FullName);
+            if (!string.IsNullOrEmpty(extersion))
+            {
+                fileName = fileName.Replace(extersion, "");
+            }
+
+            var prior = PriorBundleConfig.GetAssetPrior(AssetVersion.AssetCategory.Scene, AssetVersionUtility.DecodeFileName(fileName));
+            if (prior > AssetPrior)
+            {
+                excludeFileFullNames.Add(file.FullName);
+            }
+        }
+
+        tempFiles.Clear();
+        FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(assetPath, "/audio"), tempFiles);
+        foreach (var file in tempFiles)
+        {
+            var extersion = Path.GetExtension(file.FullName);
+            var fileName = Path.GetFileName(file.FullName);
+            if (!string.IsNullOrEmpty(extersion))
+            {
+                fileName = fileName.Replace(extersion, "");
+            }
+
+            var prior = PriorBundleConfig.GetAssetPrior(AssetVersion.AssetCategory.Audio, AssetVersionUtility.DecodeFileName(fileName));
+            if (prior > AssetPrior)
+            {
+                excludeFileFullNames.Add(file.FullName);
+            }
+        }
+
+        tempFiles.Clear();
+        FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(assetPath, "/effect"), tempFiles);
+        foreach (var file in tempFiles)
+        {
+            var extersion = Path.GetExtension(file.FullName);
+            var fileName = Path.GetFileName(file.FullName);
+            if (!string.IsNullOrEmpty(extersion))
+            {
+                fileName = fileName.Replace(extersion, "");
+            }
+
+            var prior = PriorBundleConfig.GetAssetPrior(AssetVersion.AssetCategory.Effect, AssetVersionUtility.DecodeFileName(fileName));
+            if (prior > AssetPrior)
+            {
+                excludeFileFullNames.Add(file.FullName);
+            }
+        }
+
+        tempFiles.Clear();
+        FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(assetPath, "/ui/sprite"), tempFiles);
+        foreach (var file in tempFiles)
+        {
+            var fileName = Path.GetFileName(file.FullName);
+            if (fileName == AssetVersionUtility.EncodeFileName("loadingbg"))
+            {
+                excludeFileFullNames.Add(file.FullName);
+            }
+        }
+
+        for (int i = fromFiles.Count - 1; i >= 0; i--)
+        {
+            var item = fromFiles[i];
+            if (excludeFileFullNames.Contains(item.FullName))
+            {
+                fromFiles.RemoveAt(i);
+            }
+        }
+
+        foreach (var item in fromFiles)
+        {
+            var relativePath = FileExtersion.GetFileRelativePath(assetPath, item.FullName);
+            var to = StringUtility.Contact(ResourcesPath.Instance.StreamingAssetPath, relativePath);
+            var directory = Path.GetDirectoryName(to);
+            if (!Directory.Exists(directory))
+            {
+                Directory.CreateDirectory(directory);
+            }
+            File.Copy(item.FullName, to, true);
+        }
+
+        foreach (var id in packageIds)
+        {
+            BuildPackage(id, output, buildIndex, development);
+        }
+    }
+
+    static void BuildBigPackage(List<int> packageIds, string assetPath, string output, int buildIndex, bool development)
+    {
+        if (Directory.Exists(ResourcesPath.Instance.StreamingAssetPath))
+        {
+            Directory.Delete(ResourcesPath.Instance.StreamingAssetPath, true);
+        }
+
+        if (packageIds.IsNullOrEmpty())
+        {
+            return;
+        }
+
+        var fromFiles = new List<FileInfo>();
+        FileExtersion.GetAllDirectoryFileInfos(assetPath, fromFiles);
+        foreach (var item in fromFiles)
+        {
+            var relativePath = FileExtersion.GetFileRelativePath(assetPath, item.FullName);
+            var to = StringUtility.Contact(ResourcesPath.Instance.StreamingAssetPath, relativePath);
+            var directory = Path.GetDirectoryName(to);
+            if (!Directory.Exists(directory))
+            {
+                Directory.CreateDirectory(directory);
+            }
+
+            File.Copy(item.FullName, to, true);
+        }
+
+        foreach (var id in packageIds)
+        {
+            BuildPackage(id, output, buildIndex, development);
+        }
+    }
+
+    static void BuildPackage(int packageId, string output, int buildIndex, bool development)
+    {
+        PreBuild(packageId, buildIndex, development);
+
+        var versionName = string.Empty;
+        var versionConfig = GetVersionConfig(packageId.ToString(), out versionName);
+        var versionConfigCSpath = Application.dataPath + "/Scripts/System/ClientVersion/VersionConfig.cs";
+        var text = File.ReadAllText(versionConfigCSpath);
+
+        if (text.Contains("VERSION_ALTERNATIVE"))
+        {
+            var pattern = "VERSION_ALTERNATIVE = \".*\"";
+            text = Regex.Replace(text, pattern, StringUtility.Contact("VERSION_ALTERNATIVE = ", "\"", versionConfig.m_Version, "\""));
+
+            var encoderShouldEmitUTF8Identifier = true;
+            var throwOnInvalidBytes = false;
+            var encoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier, throwOnInvalidBytes);
+            var append = false;
+            var streamWriter = new StreamWriter(versionConfigCSpath, append, encoding);
+            streamWriter.Write(text);
+            streamWriter.Close();
+            AssetDatabase.ImportAsset(versionConfigCSpath);
+        }
+
+        //var option = AssetDatabase.LoadAssetAtPath<Options>("Assets/Editor/Beebyte/Obfuscator/ObfuscatorOptions.asset");
+        //if (option != null)
+        //{
+        //    option.enabled = obfuscatorEnabled;
+        //    EditorUtility.SetDirty(option);
+        //}
+
+        AssetDatabase.SaveAssets();
+        AssetDatabase.Refresh();
+
+        if (development)
+        {
+            var name = StringUtility.Contact(output, "/", versionName, "_", versionConfig.clientPackageFlag, "_v", versionConfig.m_Version, "_", buildIndex, "_development.exe");
+            BuildPipeline.BuildPlayer(baseLevels, name, BuildTarget.StandaloneWindows, BuildOptions.Development | BuildOptions.ConnectWithProfiler | BuildOptions.AllowDebugging);
+        }
+        else
+        {
+            var name = StringUtility.Contact(output, "/", versionName, "_", versionConfig.clientPackageFlag, "_v", versionConfig.m_Version, "_", buildIndex, ".exe");
+            BuildPipeline.BuildPlayer(baseLevels, name, BuildTarget.StandaloneWindows, BuildOptions.None);
+        }
+    }
+
+    private static void PreBuild(int packageId, int buildIndex, bool development)
+    {
+        try
+        {
+            var newVersionConfigPath = StringUtility.Contact("Assets/Resources/VersionConfig", ".asset");
+            var versionName = string.Empty;
+            var fromVersionConfig = GetVersionConfig(packageId.ToString(), out versionName);
+            var newVersionConfig = ScriptableObject.CreateInstance<VersionConfig>();
+            if (File.Exists(newVersionConfigPath))
+            {
+                AssetDatabase.DeleteAsset(newVersionConfigPath);
+            }
+
+            VersionConfig.Copy(fromVersionConfig, newVersionConfig);
+            newVersionConfig.buildTime = DateTime.Now.ToString("yy/MM/dd--HH:mm");
+            newVersionConfig.buildIndex = buildIndex;
+
+            AssetDatabase.CreateAsset(newVersionConfig, newVersionConfigPath);
+            EditorUtility.SetDirty(newVersionConfig);
+
+            SetIconAndSplashImage(versionName);
+            //SetCreateRoleAnimation();
+
+            PlayerSettings.companyName = "SW";
+            PlayerSettings.productName = newVersionConfig.productName;
+            PlayerSettings.applicationIdentifier = newVersionConfig.bundleIdentifier;
+            PlayerSettings.bundleVersion = VersionConfig.GetVersionNumber(newVersionConfig.version).ToString();
+
+            PlayerSettings.usePlayerLog = development;
+            PlayerSettings.SetAspectRatio(AspectRatio.Aspect16by9, true);
+            PlayerSettings.SetAspectRatio(AspectRatio.Aspect4by3, false);
+            PlayerSettings.SetAspectRatio(AspectRatio.Aspect16by10, false);
+            PlayerSettings.SetAspectRatio(AspectRatio.Aspect5by4, false);
+            PlayerSettings.SetAspectRatio(AspectRatio.AspectOthers, false);
+
+            PlayerSettings.fullScreenMode = FullScreenMode.FullScreenWindow;
+            PlayerSettings.enableInternalProfiler = development;
+        }
+        catch (Exception ex)
+        {
+            Debug.Log(ex);
+        }
+        finally
+        {
+            AssetDatabase.SaveAssets();
+            AssetDatabase.Refresh();
+        }
+
+    }
+
+    static VersionConfig GetVersionConfig(string packageId, out string versionName)
+    {
+        var lines = File.ReadAllLines(versionsFilePath);
+        for (int i = 2; i < lines.Length; i++)
+        {
+            var line = lines[i];
+            var lineStrings = line.Split('\t');
+            if (lineStrings[0] == packageId)
+            {
+                var config = new VersionConfig();
+                config.Read(line);
+                versionName = lineStrings[1];
+                return config;
+            }
+        }
+
+        versionName = string.Empty;
+        return null;
+    }
+
+    static void SetIconAndSplashImage(string _versionName)
+    {
+        var buildTarget = BuildTargetGroup.Standalone;
+        var texture = AssetDatabase.LoadAssetAtPath<Texture2D>(StringUtility.Contact("Assets/Editor/Logo/", _versionName, "/Icon.png"));
+        var iconSizes = PlayerSettings.GetIconSizesForTargetGroup(buildTarget);
+        var icons = new Texture2D[iconSizes.Length];
+        for (int i = 0; i < iconSizes.Length; i++)
+        {
+            icons[i] = texture;
+        }
+
+        PlayerSettings.SetIconsForTargetGroup(buildTarget, icons);
+
+        PlayerSettings.SplashScreen.show = false;
+        PlayerSettings.SplashScreen.showUnityLogo = false;
+        PlayerSettings.SplashScreen.unityLogoStyle = PlayerSettings.SplashScreen.UnityLogoStyle.LightOnDark;
+
+        var splashImage = AssetDatabase.LoadAssetAtPath<Sprite>(StringUtility.Contact("Assets/Editor/Logo/", _versionName, "/SplashImage.png"));
+        var splashScreenLogo = PlayerSettings.SplashScreenLogo.Create(3, splashImage);
+        PlayerSettings.SplashScreen.logos = new PlayerSettings.SplashScreenLogo[] { splashScreenLogo };
+    }
+
+    public static void SetCreateRoleAnimation()
+    {
+        var from = "Assets/Editor/Video/CreateRoleMovie.mp4";
+        var to = "Assets/Resources/CreateRoleMovie.mp4";
+
+        if (!Directory.Exists(Application.dataPath + "Resources"))
+        {
+            Directory.CreateDirectory(Application.dataPath + "Resources");
+        }
+
+        if (AssetDatabase.LoadAssetAtPath<UnityEngine.Video.VideoClip>(to) == null)
+        {
+            AssetDatabase.CopyAsset(from, to);
+        }
+    }
+
+}
diff --git a/Assets/Editor/Tool/ClientPackage_Standalone.cs.meta b/Assets/Editor/Tool/ClientPackage_Standalone.cs.meta
new file mode 100644
index 0000000..34aadfd
--- /dev/null
+++ b/Assets/Editor/Tool/ClientPackage_Standalone.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: b80df072980227d49bc49dd8ede029b5
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/Tool/TableTool.cs b/Assets/Editor/Tool/TableTool.cs
new file mode 100644
index 0000000..9eb341c
--- /dev/null
+++ b/Assets/Editor/Tool/TableTool.cs
@@ -0,0 +1,63 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using UnityEditor;
+using UnityEngine;
+
+public class TableTool : EditorWindow
+{
+
+    public static string configOutPutPath;
+
+
+    
+    public static void CopyConfigsToOutPutPath(string _outPath)
+    {
+        configOutPutPath = _outPath;
+        var root1 = UnityEngine.Application.dataPath + "/ResourcesOut/Config";
+        var configFiles = new List<FileInfo>();
+        configFiles.AddRange(FileExtersion.GetFileInfos(root1, new string[] { "*.txt", "*.TXT" }));
+        var root2 = UnityEngine.Application.dataPath + "/Resources/Config";
+        if (Directory.Exists(root2))
+        {
+            var fileInfos = FileExtersion.GetFileInfos(root2, new string[] { "*.txt", "*.TXT" });
+            if (fileInfos != null)
+            {
+                configFiles.AddRange(fileInfos);
+            }
+        }
+
+        foreach (var file in configFiles)
+        {
+            var fileInfo = new FileInfo(file.FullName);
+
+            CopyTxt(fileInfo);
+        }
+    }
+
+    
+    private static void CopyTxt(FileInfo fileInfo)
+    {
+        string fileName = fileInfo.Name.Split('.')[0];
+
+        if (!Directory.Exists(configOutPutPath))
+        {
+            Directory.CreateDirectory(configOutPutPath);
+        }
+
+        string filePath = configOutPutPath + "/" + fileName + ".txt";
+        if (File.Exists(filePath))
+        {
+            File.Delete(filePath);
+        }
+
+        File.Copy(fileInfo.FullName, filePath);
+    }
+
+    
+
+
+}
+
diff --git a/Assets/Editor/Tool/TableTool.cs.meta b/Assets/Editor/Tool/TableTool.cs.meta
new file mode 100644
index 0000000..d56a258
--- /dev/null
+++ b/Assets/Editor/Tool/TableTool.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: b375f0495ff2e854caa4f70a756ebca7
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/Tool/UpdateAssetBundleName.cs b/Assets/Editor/Tool/UpdateAssetBundleName.cs
index 39f427c..d23c5c9 100644
--- a/Assets/Editor/Tool/UpdateAssetBundleName.cs
+++ b/Assets/Editor/Tool/UpdateAssetBundleName.cs
@@ -16,7 +16,6 @@
         UpdateEffectPrefabSetting.SetAllEffectPrefabAssetBundleName();
         UpdateMobSetting.SetAllMobAssetBundleName();
         UpdateShaderSetting.SetAllShaderAssetBundleName();
-        UpdateScriptableObjectsSetting.SetAllScriptableObjectAssetBundleName();
         UpdateLevelSetting.SetAllLevelAssetBundleName();
         UpdateAudioSetting.SetAllAudioAssetBundleName();
         UpdateVideoSetting.SetAllVideoAssetBundleName();
@@ -34,15 +33,15 @@
 
     public static void SetRechargeSkin(int pattern)
     {
-        var toDirectory = Application.dataPath + "/ResourcesOut/Sprite/Recharge";
-        var oldFiles = new DirectoryInfo(toDirectory).GetFiles("*.png", SearchOption.AllDirectories);
-        foreach (var item in oldFiles)
-        {
-            File.Delete(item.FullName);
-        }
+        // var toDirectory = Application.dataPath + "/ResourcesOut/Sprite/Recharge";
+        // var oldFiles = new DirectoryInfo(toDirectory).GetFiles("*.png", SearchOption.AllDirectories);
+        // foreach (var item in oldFiles)
+        // {
+        //     File.Delete(item.FullName);
+        // }
 
-        var fromDirectory = Application.dataPath + "/Editor/RechargeSprites/Pattern_" + pattern;
-        FileExtersion.DirectoryCopy(fromDirectory, toDirectory);
+        // var fromDirectory = Application.dataPath + "/Editor/RechargeSprites/Pattern_" + pattern;
+        // FileExtersion.DirectoryCopy(fromDirectory, toDirectory);
     }
 
     [MenuItem("绋嬪簭/璁剧疆璧勬簮鍖呭悕/鏇存柊Sprite(All) AssetBundleName")]
@@ -131,22 +130,58 @@
 
 public class UpdateEffectPrefabSetting
 {
-    static string rootPath = Application.dataPath + "/ResourcesOut/Effect/";
-    static string assetPath = "Assets/ResourcesOut/Effect/";
+    static string rootPath = Application.dataPath + "/ResourcesOut/UIEffect/";
+    static string assetPath = "Assets/ResourcesOut/UIEffect/";
 
     [MenuItem("绋嬪簭/璁剧疆璧勬簮鍖呭悕/鏇存柊Effect(All) AssetBundleName")]
     public static void SetAllEffectPrefabAssetBundleName()
     {
-        var allFiles = new DirectoryInfo(rootPath).GetFiles("*.prefab", SearchOption.AllDirectories);
+        var allFiles = new DirectoryInfo(rootPath).GetFiles("*.asset", SearchOption.AllDirectories);
 
         foreach (var file in allFiles)
         {
-            var pathStringArray = file.DirectoryName.Split(Path.DirectorySeparatorChar);
+            var pathStringArray = file.DirectoryName.Split("UIEffect");
             var importerPath = assetPath + pathStringArray[pathStringArray.Length - 1] + Path.DirectorySeparatorChar + file.Name;
+            Debug.Log(importerPath);
             var importer = AssetImporter.GetAtPath(importerPath);
-            importer.assetBundleName = "effect/" + pathStringArray[pathStringArray.Length - 1].ToLower();
+            importer.assetBundleName = "uieffect/" + pathStringArray[pathStringArray.Length - 1].ToLower();
             // EditorUtility.SetDirty(importer);
         }
+
+        allFiles = new DirectoryInfo(rootPath).GetFiles("*.json", SearchOption.AllDirectories);
+
+        foreach (var file in allFiles)
+        {
+            var pathStringArray = file.DirectoryName.Split("UIEffect");
+            var importerPath = assetPath + pathStringArray[pathStringArray.Length - 1] + Path.DirectorySeparatorChar + file.Name;
+            var importer = AssetImporter.GetAtPath(importerPath);
+            importer.assetBundleName = "uieffect/" + pathStringArray[pathStringArray.Length - 1].ToLower();
+            // EditorUtility.SetDirty(importer);
+        }
+
+        allFiles = new DirectoryInfo(rootPath).GetFiles("*.txt", SearchOption.AllDirectories);
+
+        foreach (var file in allFiles)
+        {
+            var pathStringArray = file.DirectoryName.Split("UIEffect");
+            var importerPath = assetPath + pathStringArray[pathStringArray.Length - 1] + Path.DirectorySeparatorChar + file.Name;
+            var importer = AssetImporter.GetAtPath(importerPath);
+            importer.assetBundleName = "uieffect/" + pathStringArray[pathStringArray.Length - 1].ToLower();
+            // EditorUtility.SetDirty(importer);
+        }
+
+        allFiles = new DirectoryInfo(rootPath).GetFiles("*.png", SearchOption.AllDirectories);
+
+        foreach (var file in allFiles)
+        {
+            var pathStringArray = file.DirectoryName.Split("UIEffect");
+            var importerPath = assetPath + pathStringArray[pathStringArray.Length - 1] + Path.DirectorySeparatorChar + file.Name;
+            var importer = AssetImporter.GetAtPath(importerPath);
+            importer.assetBundleName = "uieffect/" + pathStringArray[pathStringArray.Length - 1].ToLower();
+            // EditorUtility.SetDirty(importer);
+        }
+
+
         Debug.Log("Effect璧勬簮鍖呭悕鏇存柊瀹屾垚!");
         // AssetDatabase.SaveAssets();
         // AssetDatabase.Refresh();
@@ -155,134 +190,57 @@
 
 public class UpdateMobSetting
 {
-    static string rootPath = Application.dataPath + "/ResourcesOut/Gmodels";
-    static string assetPath = "Assets/ResourcesOut/Gmodels";
-    static string createroleRoot = Application.dataPath + "/ResourcesOut/Gmodels/CreateRole";
-    static string createroleAssetPath = "Assets/ResourcesOut/Gmodels/CreateRole";
-
-    static string zsMaterialPath_Origin = Application.dataPath + "/Art/Role/A_Zs/Materials";
-    static string fsMaterialPath_Origin = Application.dataPath + "/Art/Role/A_Fs/Materials";
-
-    static string zsMaterialPath_OutPut = Application.dataPath + "/ResourcesOut/Gmodels/A_Zs/Materials";
-    static string fsMaterialPath_OutPut = Application.dataPath + "/ResourcesOut/Gmodels/A_Fs/Materials";
+    static string rootPath = Application.dataPath + "/ResourcesOut/Hero";
+    static string assetPath = "Assets/ResourcesOut/Hero";
 
     [MenuItem("绋嬪簭/璁剧疆璧勬簮鍖呭悕/鏇存柊Mob(All) AssetBundleName")]
     public static void SetAllMobAssetBundleName()
     {
-        var allFiles = new DirectoryInfo(rootPath).GetFiles("*.prefab", SearchOption.TopDirectoryOnly);
+        var allFiles = new DirectoryInfo(rootPath).GetFiles("*.asset", SearchOption.AllDirectories);
+
         foreach (var file in allFiles)
         {
-            var importerPath = assetPath + Path.DirectorySeparatorChar + file.Name;
-            var extersion = Path.GetExtension(file.FullName);
+            var pathStringArray = file.DirectoryName.Split("Hero");
+            var importerPath = assetPath + pathStringArray[pathStringArray.Length - 1] + Path.DirectorySeparatorChar + file.Name;
             var importer = AssetImporter.GetAtPath(importerPath);
-            var hostfix = file.Name.Replace("Prefab_Secondary", "")
-                                                 .Replace("Prefab_Weapon", "")
-                                                 .Replace("Prefab_Wing", "")
-                                                 .Replace("Prefab_Race", "")
-                                                 .Replace("Prefab_Horse", "")
-                                                 .Replace("_UI", "")
-                                                 .Replace(".prefab", "")
-                                                 .Replace("Prefab_Hand", "");
-
-            importer.assetBundleName = StringUtility.Contact("gmodels/prefab_race", hostfix);
+            importer.assetBundleName = "hero/" + pathStringArray[pathStringArray.Length - 1].ToLower();
             // EditorUtility.SetDirty(importer);
         }
 
-        allFiles = new DirectoryInfo(createroleRoot).GetFiles("*.prefab", SearchOption.TopDirectoryOnly);
+        allFiles = new DirectoryInfo(rootPath).GetFiles("*.json", SearchOption.AllDirectories);
+
         foreach (var file in allFiles)
         {
-            var importerPath = createroleAssetPath + Path.DirectorySeparatorChar + file.Name;
-            var extersion = Path.GetExtension(file.FullName);
+            var pathStringArray = file.DirectoryName.Split("Hero");
+            var importerPath = assetPath + pathStringArray[pathStringArray.Length - 1] + Path.DirectorySeparatorChar + file.Name;
             var importer = AssetImporter.GetAtPath(importerPath);
-            importer.assetBundleName = "gmodels/createrole";
+            importer.assetBundleName = "hero/" + pathStringArray[pathStringArray.Length - 1].ToLower();
             // EditorUtility.SetDirty(importer);
         }
 
-        //var zsMaterialFiles = new DirectoryInfo(zsMaterialPath_Origin).GetFiles("*.mat", SearchOption.TopDirectoryOnly);
-        //if (!Directory.Exists(zsMaterialPath_OutPut))
-        //{
-        //    Directory.CreateDirectory(zsMaterialPath_OutPut);
-        //}
+        allFiles = new DirectoryInfo(rootPath).GetFiles("*.txt", SearchOption.AllDirectories);
 
-        //foreach (var file in zsMaterialFiles)
-        //{
-        //    var fileName = Path.GetFileName(file.FullName);
-        //    File.Copy(file.FullName, StringUtility.Contact(zsMaterialPath_OutPut, "/", fileName), true);
-        //}
-
-        //var fsMaterialFiles = new DirectoryInfo(fsMaterialPath_Origin).GetFiles("*.mat", SearchOption.TopDirectoryOnly);
-        //if (!Directory.Exists(fsMaterialPath_OutPut))
-        //{
-        //    Directory.CreateDirectory(fsMaterialPath_OutPut);
-        //}
-
-        //foreach (var file in fsMaterialFiles)
-        //{
-        //    var fileName = Path.GetFileName(file.FullName);
-        //    File.Copy(file.FullName, StringUtility.Contact(fsMaterialPath_OutPut, "/", fileName), true);
-        //}
-
-        var zsMaterialPathOutFiles = new DirectoryInfo(zsMaterialPath_OutPut).GetFiles("*.mat", SearchOption.TopDirectoryOnly);
-        foreach (var _file in zsMaterialPathOutFiles)
+        foreach (var file in allFiles)
         {
-            var _fileName = Path.GetFileName(_file.FullName);
-            var _importerPath = assetPath + "/A_Zs/Materials/" + _file.Name;
-            var _importer = AssetImporter.GetAtPath(_importerPath);
-            if (_file.Name.StartsWith("A_Zs_Sz"))
-            {
-                string _abName = Path.GetFileNameWithoutExtension(_file.Name).Replace("_Dm", "");
-                _importer.assetBundleName = "gmodels/prefab_race_" + _abName;
-            }
-            else
-            {
-                string _abName = Path.GetFileNameWithoutExtension(_file.Name).Replace("_02", "").Replace("_Dm", "").Replace("_Dm_02", "");
-                _importer.assetBundleName = "gmodels/prefab_race_" + _abName;
-            }
-            // EditorUtility.SetDirty(_importer);
+            var pathStringArray = file.DirectoryName.Split("Hero");
+            var importerPath = assetPath + pathStringArray[pathStringArray.Length - 1] + Path.DirectorySeparatorChar + file.Name;
+            var importer = AssetImporter.GetAtPath(importerPath);
+            importer.assetBundleName = "hero/" + pathStringArray[pathStringArray.Length - 1].ToLower();
+            // EditorUtility.SetDirty(importer);
         }
 
-        var fsMaterialPathOutFiles = new DirectoryInfo(fsMaterialPath_OutPut).GetFiles("*.mat", SearchOption.TopDirectoryOnly);
-        foreach (var _file in fsMaterialPathOutFiles)
+        allFiles = new DirectoryInfo(rootPath).GetFiles("*.png", SearchOption.AllDirectories);
+
+        foreach (var file in allFiles)
         {
-            var _fileName = Path.GetFileName(_file.FullName);
-            var _importerPath = assetPath + "/A_Fs/Materials/" + _file.Name;
-            var _importer = AssetImporter.GetAtPath(_importerPath);
-            if (_file.Name.StartsWith("A_Fs_Sz"))
-            {
-                string _abName = Path.GetFileNameWithoutExtension(_file.Name).Replace("_Dm", "");
-                _importer.assetBundleName = "gmodels/prefab_race_" + _abName;
-            }
-            else
-            {
-                string _abName = Path.GetFileNameWithoutExtension(_file.Name).Replace("_02", "").Replace("_Dm", "").Replace("_Dm_02", "");
-                _importer.assetBundleName = "gmodels/prefab_race_" + _abName;
-            }
-            // EditorUtility.SetDirty(_importer);
+            var pathStringArray = file.DirectoryName.Split("Hero");
+            var importerPath = assetPath + pathStringArray[pathStringArray.Length - 1] + Path.DirectorySeparatorChar + file.Name;
+            var importer = AssetImporter.GetAtPath(importerPath);
+            importer.assetBundleName = "hero/" + pathStringArray[pathStringArray.Length - 1].ToLower();
+            // EditorUtility.SetDirty(importer);
         }
 
-        // AssetDatabase.SaveAssets();
-        // AssetDatabase.Refresh();
-
-        //foreach (var file in zsMaterialFiles)
-        //{
-        //    var fileName = Path.GetFileName(file.FullName);
-        //    var importerPath = assetPath + "/A_Zs/Materials/" + file.Name;
-        //    var importer = AssetImporter.GetAtPath(importerPath);
-
-        //    importer.assetBundleName = "gmodels/a_zs_materials";
-        //    EditorUtility.SetDirty(importer);
-        //}
-
-        //foreach (var file in fsMaterialFiles)
-        //{
-        //    var fileName = Path.GetFileName(file.FullName);
-        //    var importerPath = assetPath + "/A_Fs/Materials/" + file.Name;
-        //    var importer = AssetImporter.GetAtPath(importerPath);
-
-        //    importer.assetBundleName = "gmodels/a_fs_materials";
-        //    EditorUtility.SetDirty(importer);
-        //}
-        Debug.Log("Gmodels璧勬簮鍖呭悕鏇存柊瀹屾垚!");
+        Debug.Log("Hero璧勬簮鍖呭悕鏇存柊瀹屾垚!");
         //AssetDatabase.SaveAssets();
         //AssetDatabase.Refresh();
     }
@@ -312,32 +270,32 @@
 
 public class UpdateScriptableObjectsSetting
 {
-    static string rootPath = Application.dataPath + "/ResourcesOut/Refdata/ScriptableObject/";
-    static string assetPath = "Assets/ResourcesOut/Refdata/ScriptableObject/";
-    static string[] relativePaths = new string[] { "SoTreasure3D", "SoTreasureMeridian", "SoActor", "SoDeadFly", "SoBodyControl",
-        "SoCameraSFX", "SoFlyObject", "SoSkill", "SoSweepHit", "SoGhostShadow", "SoNewBieGuide", "SoMapObjectGenerate","SoDemonDungeon",
-        "SoHazyMapNpc","SoProcessNode"};
+    // static string rootPath = Application.dataPath + "/ResourcesOut/Refdata/ScriptableObject/";
+    // static string assetPath = "Assets/ResourcesOut/Refdata/ScriptableObject/";
+    // static string[] relativePaths = new string[] { "SoTreasure3D", "SoTreasureMeridian", "SoActor", "SoDeadFly", "SoBodyControl",
+    //     "SoCameraSFX", "SoFlyObject", "SoSkill", "SoSweepHit", "SoGhostShadow", "SoNewBieGuide", "SoMapObjectGenerate","SoDemonDungeon",
+    //     "SoHazyMapNpc","SoProcessNode"};
 
-    [MenuItem("绋嬪簭/璁剧疆璧勬簮鍖呭悕/鏇存柊ScriptableObject(All) AssetBundleName")]
-    public static void SetAllScriptableObjectAssetBundleName()
-    {
-        for (int i = 0; i < relativePaths.Length; i++)
-        {
-            var relativePath = relativePaths[i];
-            var allFiles = new DirectoryInfo(rootPath + relativePath).GetFiles("*.asset", SearchOption.TopDirectoryOnly);
+    // [MenuItem("绋嬪簭/璁剧疆璧勬簮鍖呭悕/鏇存柊ScriptableObject(All) AssetBundleName")]
+    // public static void SetAllScriptableObjectAssetBundleName()
+    // {
+    //     for (int i = 0; i < relativePaths.Length; i++)
+    //     {
+    //         var relativePath = relativePaths[i];
+    //         var allFiles = new DirectoryInfo(rootPath + relativePath).GetFiles("*.asset", SearchOption.TopDirectoryOnly);
 
-            foreach (var file in allFiles)
-            {
-                var importerPath = assetPath + relativePath + Path.DirectorySeparatorChar + file.Name;
-                var importer = AssetImporter.GetAtPath(importerPath);
-                importer.assetBundleName = "config/scriptableobjects";
-                // EditorUtility.SetDirty(importer);
-            }
-        }
-        Debug.Log("ScriptableObject璧勬簮鍖呭悕鏇存柊瀹屾垚!");
-        // AssetDatabase.SaveAssets();
-        // AssetDatabase.Refresh();
-    }
+    //         foreach (var file in allFiles)
+    //         {
+    //             var importerPath = assetPath + relativePath + Path.DirectorySeparatorChar + file.Name;
+    //             var importer = AssetImporter.GetAtPath(importerPath);
+    //             importer.assetBundleName = "config/scriptableobjects";
+    //             // EditorUtility.SetDirty(importer);
+    //         }
+    //     }
+    //     Debug.Log("ScriptableObject璧勬簮鍖呭悕鏇存柊瀹屾垚!");
+    //     // AssetDatabase.SaveAssets();
+    //     // AssetDatabase.Refresh();
+    // }
 }
 
 public class UpdateLevelSetting
@@ -347,58 +305,43 @@
     static string assetPath = "Assets/Art/Maps/Scenes";
     static HashSet<string> exportMaps;//鍘婚櫎鐨勫湴鍥惧垪琛�
 
-    public static void SetCreateRoleLevel(string pattern)
-    {
-        var root = Application.dataPath + "/Art/Maps/Scenes/Map_CreateRole";
-        var from = Application.dataPath + "/Art/Maps/Scenes/Map_CreateRole/" + "CreateRole_" + pattern + ".unity";
-        var to = Application.dataPath + "/Art/Maps/Scenes/" + "CreateRole_001.unity";
-
-        if (File.Exists(from))
-        {
-            if (File.Exists(to))
-            {
-                File.Delete(to);
-            }
-            File.Copy(from, to);
-        }
-    }
 
     [MenuItem("绋嬪簭/璁剧疆璧勬簮鍖呭悕/鏇存柊Level(All) AssetBundleName")]
     public static void SetAllLevelAssetBundleName()
     {
-        ReadExportConfig();
+        // ReadExportConfig();
 
-        var allFiles = new DirectoryInfo(rootPath).GetFiles("*.unity", SearchOption.TopDirectoryOnly);
-        foreach (var file in allFiles)
-        {
-            var importerPath = assetPath + Path.DirectorySeparatorChar + file.Name;
-            var importer = AssetImporter.GetAtPath(importerPath);
-            var name = Path.GetFileNameWithoutExtension(file.FullName);
-            if (exportMaps.Contains(name)) //鍒ゆ柇杩欎釜鍦板浘鏄惁琚帓闄わ紝琚帓闄や笉鎵撳寘
-                importer.assetBundleName = "";
-            else
-                importer.assetBundleName = "maps/" + name.ToLower();
+        // var allFiles = new DirectoryInfo(rootPath).GetFiles("*.unity", SearchOption.TopDirectoryOnly);
+        // foreach (var file in allFiles)
+        // {
+        //     var importerPath = assetPath + Path.DirectorySeparatorChar + file.Name;
+        //     var importer = AssetImporter.GetAtPath(importerPath);
+        //     var name = Path.GetFileNameWithoutExtension(file.FullName);
+        //     if (exportMaps.Contains(name)) //鍒ゆ柇杩欎釜鍦板浘鏄惁琚帓闄わ紝琚帓闄や笉鎵撳寘
+        //         importer.assetBundleName = "";
+        //     else
+        //         importer.assetBundleName = "maps/" + name.ToLower();
 
-            // EditorUtility.SetDirty(importer);
-        }
+        //     // EditorUtility.SetDirty(importer);
+        // }
 
-        var createRoleAssets = AssetDatabase.FindAssets("t:prefab", new string[] { "Assets/ResourcesOut/Scene/CreateRole" });
-        foreach (var item in createRoleAssets)
-        {
-            var importer = AssetImporter.GetAtPath(AssetDatabase.GUIDToAssetPath(item));
-            importer.assetBundleName = "maps/createrole";
-            // EditorUtility.SetDirty(importer);
-        }
+        // var createRoleAssets = AssetDatabase.FindAssets("t:prefab", new string[] { "Assets/ResourcesOut/Scene/CreateRole" });
+        // foreach (var item in createRoleAssets)
+        // {
+        //     var importer = AssetImporter.GetAtPath(AssetDatabase.GUIDToAssetPath(item));
+        //     importer.assetBundleName = "maps/createrole";
+        //     // EditorUtility.SetDirty(importer);
+        // }
 
-        var textures = AssetDatabase.FindAssets("t:Texture2D", new string[] { "Assets/ResourcesOut/Scene/Textures" });
-        foreach (var item in textures)
-        {
-            var importer = AssetImporter.GetAtPath(AssetDatabase.GUIDToAssetPath(item));
-            importer.assetBundleName = "maps/textures";
-            // EditorUtility.SetDirty(importer);
-        }
-        exportMaps?.Clear();
-        exportMaps = null;
+        // var textures = AssetDatabase.FindAssets("t:Texture2D", new string[] { "Assets/ResourcesOut/Scene/Textures" });
+        // foreach (var item in textures)
+        // {
+        //     var importer = AssetImporter.GetAtPath(AssetDatabase.GUIDToAssetPath(item));
+        //     importer.assetBundleName = "maps/textures";
+        //     // EditorUtility.SetDirty(importer);
+        // }
+        // exportMaps?.Clear();
+        // exportMaps = null;
         Debug.Log("map璧勬簮鍖呭悕鏇存柊瀹屾垚!");
         // AssetDatabase.SaveAssets();
         // AssetDatabase.Refresh();
diff --git a/Assets/Editor/VersionConfigs.meta b/Assets/Editor/VersionConfigs.meta
new file mode 100644
index 0000000..a79f0c5
--- /dev/null
+++ b/Assets/Editor/VersionConfigs.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b6c415141c40ff045abc1d3560da8f2b
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Editor/VersionConfigs/Versions.txt b/Assets/Editor/VersionConfigs/Versions.txt
new file mode 100644
index 0000000..8a384e8
--- /dev/null
+++ b/Assets/Editor/VersionConfigs/Versions.txt
@@ -0,0 +1,3 @@
+锘縄d	name	AppId	VersionAuthority	m_Version	m_ClientPackageFlag	m_Branch	m_GameId	m_AssetAccess	m_PartAssetPackage	m_ProductName	m_BundleIdentifier	m_KeystoreFileName	m_KeystorePassword	m_KeystoreAlias	m_KeystoreAliasPassword	m_AppleDeveloperTeamID	m_DebugVersion	m_IsBanShu	m_LogoPosition	m_BanHao	m_SpID	m_Recharge	m_CreateRolePattern	SdkFileName
+鐗堟湰鏍囪瘑	鐗堟湰鍚嶇О	娓犻亾id	鐗堟湰鏉冮檺锛�0鏄祴璇曠増鏈紝1鏄彂甯冪増鏈�	鐗堟湰鍙�	瀹㈡埛绔爣璇�	鍒嗘敮	娓告垙椤圭洰鏍囪瘑	璧勬簮,0NullAsset,1HalfAsset,2FullAsset,3IgnoreDownLoad	鏄惁鍒嗗寘锛�0涓嶅垎鍖咃紝1鍒嗗寘	浜у搧鍚�	浜у搧鍖呭悕	绛惧悕鏂囦欢鍚�	绛惧悕鏂囦欢瀵嗙爜	绛惧悕鏂囦欢鍒悕	绛惧悕鏂囦欢鍒悕瀵嗙爜	寮�鍙戣�呰处鍙峰瘑鐮�	鏄惁debug鐗堟湰锛�0鍚�1鏄�	鏄惁鐗堢讲鐗堟湰锛�0鍚�1鏄�	鐧诲綍鐣岄潰鐨凩ogo浣嶇疆	鐗堝彿	杩愯惀鍟咺D	鍏呭�肩晫闈㈤鏍�	鍒涜鍦烘櫙椋庢牸	sdk鐩綍鍒悕
+9999	wgyx	test	0	1.0.1	2021	1	sgxs	1	1	鍍忕礌涓夊浗	com.wgyx.xssg	wgyx	wgyx2025	wgyx	wgyx2025		0	0	(-32,144)			0		
diff --git a/Assets/Editor/VersionConfigs/Versions.txt.meta b/Assets/Editor/VersionConfigs/Versions.txt.meta
new file mode 100644
index 0000000..0fda5f2
--- /dev/null
+++ b/Assets/Editor/VersionConfigs/Versions.txt.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: df025b07adf9a4c4b9123d1ff283fcc5
+timeCreated: 1515224027
+licenseType: Free
+TextScriptImporter:
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/HybridCLRGenerate.meta b/Assets/HybridCLRGenerate.meta
new file mode 100644
index 0000000..e96f03f
--- /dev/null
+++ b/Assets/HybridCLRGenerate.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 8993fc485417b8e4794a2378379b4a1e
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/HybridCLRGenerate/AOTGenericReferences.cs b/Assets/HybridCLRGenerate/AOTGenericReferences.cs
new file mode 100644
index 0000000..46ff9c5
--- /dev/null
+++ b/Assets/HybridCLRGenerate/AOTGenericReferences.cs
@@ -0,0 +1,1390 @@
+using System.Collections.Generic;
+public class AOTGenericReferences : UnityEngine.MonoBehaviour
+{
+
+	// {{ AOT assemblies
+	public static readonly IReadOnlyList<string> PatchedAOTAssemblyList = new List<string>
+	{
+		"DOTween.dll",
+		"Launch.dll",
+		"System.Core.dll",
+		"UniTask.dll",
+		"UnityEngine.AndroidJNIModule.dll",
+		"UnityEngine.AssetBundleModule.dll",
+		"UnityEngine.CoreModule.dll",
+		"UnityEngine.JSONSerializeModule.dll",
+		"UnityEngine.UI.dll",
+		"mscorlib.dll",
+		"spine-csharp.dll",
+	};
+	// }}
+
+	// {{ constraint implement type
+	// }} 
+
+	// {{ AOT generic types
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<AdaptiveLayout.<Co_DelayShow>d__22>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<AssetBundleUtility.<Co_DoLoadAsset>d__23>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<AssetBundleUtility.<Co_DoLoadAsset>d__24>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<AssetBundleUtility.<Co_LoadAssetBundle>d__21,object>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<AssetBundleUtility.<Co_LoadAssetBundleDependenice>d__22>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<AssetBundleUtility.<Initialize>d__16>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<ChatCenter.<Co_CheckAfterCollect>d__59>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<ChatSendComponent.<Co_ClientBan>d__32>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<ConfigManager.<InitConfigs>d__6>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<CyclicScroll.<Co_StepByStepAppear>d__68>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<DownLoadAndDiscompressTask.<Co_StartDownLoad>d__33>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<DownloadTask.<Co_DownloadFile>d__40>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<DownloadTask.<Co_GetHeader>d__39>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<EffectPlayer.<PlayAsync>d__34>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<EquipExchangeCell.<RefreshEffect>d__31>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<EquipOnMainUI.<FlyToEquipCell>d__12>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<EquipTipWin.<RefreshEffect>d__21>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<GameObjectPoolManager.<CheckPoolUsage>d__13>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<HeroCallResultCell.<DisplayAsync>d__7>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<HeroCallResultWin.<MoveToNextState>d__35>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<HeroGiftWashWin.<SendPack>d__19>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<HeroPosWin.<RunTaskAsync>d__46>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<HeroScenePosCell.<DelayShow>d__13>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<LayoutElementSizeClamp.<UpdateRect>d__9>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<Main.<InitManagers>d__4>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<ServerTipDetails.<Co_StageLoadFinish>d__4>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<SmallTipWin.<UpdatePos>d__10>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<StageManager.<OnLoading>d__9>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<SysNotifyMgr.<Co_Instance>d__11>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<SystemSetting.<Co_WaitFewMinute>d__35>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<UIBase.<ApplyClickEmptySpaceClose>d__34>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<UniTaskExtension.<DelayFrameInternal>d__2>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask.<>c<UniTaskExtension.<DelayTimeInternal>d__8>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<AdaptiveLayout.<Co_DelayShow>d__22>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<AssetBundleUtility.<Co_DoLoadAsset>d__23>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<AssetBundleUtility.<Co_DoLoadAsset>d__24>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<AssetBundleUtility.<Co_LoadAssetBundle>d__21,object>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<AssetBundleUtility.<Co_LoadAssetBundleDependenice>d__22>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<AssetBundleUtility.<Initialize>d__16>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<ChatCenter.<Co_CheckAfterCollect>d__59>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<ChatSendComponent.<Co_ClientBan>d__32>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<ConfigManager.<InitConfigs>d__6>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<CyclicScroll.<Co_StepByStepAppear>d__68>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<DownLoadAndDiscompressTask.<Co_StartDownLoad>d__33>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<DownloadTask.<Co_DownloadFile>d__40>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<DownloadTask.<Co_GetHeader>d__39>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<EffectPlayer.<PlayAsync>d__34>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<EquipExchangeCell.<RefreshEffect>d__31>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<EquipOnMainUI.<FlyToEquipCell>d__12>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<EquipTipWin.<RefreshEffect>d__21>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<GameObjectPoolManager.<CheckPoolUsage>d__13>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<HeroCallResultCell.<DisplayAsync>d__7>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<HeroCallResultWin.<MoveToNextState>d__35>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<HeroGiftWashWin.<SendPack>d__19>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<HeroPosWin.<RunTaskAsync>d__46>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<HeroScenePosCell.<DelayShow>d__13>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<LayoutElementSizeClamp.<UpdateRect>d__9>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<Main.<InitManagers>d__4>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<ServerTipDetails.<Co_StageLoadFinish>d__4>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<SmallTipWin.<UpdatePos>d__10>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<StageManager.<OnLoading>d__9>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<SysNotifyMgr.<Co_Instance>d__11>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<SystemSetting.<Co_WaitFewMinute>d__35>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<UIBase.<ApplyClickEmptySpaceClose>d__34>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<UniTaskExtension.<DelayFrameInternal>d__2>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTask<UniTaskExtension.<DelayTimeInternal>d__8>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder<object>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskVoid.<>c<StageManager.<ToGameScene>d__8>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskVoid.<>c<StageManager.<ToLoginScene>d__6>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskVoid<StageManager.<ToGameScene>d__8>
+	// Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskVoid<StageManager.<ToLoginScene>d__6>
+	// Cysharp.Threading.Tasks.CompilerServices.IStateMachineRunnerPromise<object>
+	// Cysharp.Threading.Tasks.ITaskPoolNode<object>
+	// Cysharp.Threading.Tasks.IUniTaskSource<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>>>
+	// Cysharp.Threading.Tasks.IUniTaskSource<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>>
+	// Cysharp.Threading.Tasks.IUniTaskSource<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>
+	// Cysharp.Threading.Tasks.IUniTaskSource<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>
+	// Cysharp.Threading.Tasks.IUniTaskSource<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>
+	// Cysharp.Threading.Tasks.IUniTaskSource<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>
+	// Cysharp.Threading.Tasks.IUniTaskSource<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>
+	// Cysharp.Threading.Tasks.IUniTaskSource<System.ValueTuple<byte,System.ValueTuple<byte,object>>>
+	// Cysharp.Threading.Tasks.IUniTaskSource<System.ValueTuple<byte,object>>
+	// Cysharp.Threading.Tasks.IUniTaskSource<object>
+	// Cysharp.Threading.Tasks.UniTask.Awaiter<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>>>
+	// Cysharp.Threading.Tasks.UniTask.Awaiter<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>>
+	// Cysharp.Threading.Tasks.UniTask.Awaiter<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>
+	// Cysharp.Threading.Tasks.UniTask.Awaiter<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>
+	// Cysharp.Threading.Tasks.UniTask.Awaiter<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>
+	// Cysharp.Threading.Tasks.UniTask.Awaiter<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>
+	// Cysharp.Threading.Tasks.UniTask.Awaiter<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>
+	// Cysharp.Threading.Tasks.UniTask.Awaiter<System.ValueTuple<byte,System.ValueTuple<byte,object>>>
+	// Cysharp.Threading.Tasks.UniTask.Awaiter<System.ValueTuple<byte,object>>
+	// Cysharp.Threading.Tasks.UniTask.Awaiter<object>
+	// Cysharp.Threading.Tasks.UniTask.IsCanceledSource<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>>>
+	// Cysharp.Threading.Tasks.UniTask.IsCanceledSource<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>>
+	// Cysharp.Threading.Tasks.UniTask.IsCanceledSource<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>
+	// Cysharp.Threading.Tasks.UniTask.IsCanceledSource<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>
+	// Cysharp.Threading.Tasks.UniTask.IsCanceledSource<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>
+	// Cysharp.Threading.Tasks.UniTask.IsCanceledSource<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>
+	// Cysharp.Threading.Tasks.UniTask.IsCanceledSource<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>
+	// Cysharp.Threading.Tasks.UniTask.IsCanceledSource<System.ValueTuple<byte,System.ValueTuple<byte,object>>>
+	// Cysharp.Threading.Tasks.UniTask.IsCanceledSource<System.ValueTuple<byte,object>>
+	// Cysharp.Threading.Tasks.UniTask.IsCanceledSource<object>
+	// Cysharp.Threading.Tasks.UniTask.MemoizeSource<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>>>
+	// Cysharp.Threading.Tasks.UniTask.MemoizeSource<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>>
+	// Cysharp.Threading.Tasks.UniTask.MemoizeSource<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>
+	// Cysharp.Threading.Tasks.UniTask.MemoizeSource<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>
+	// Cysharp.Threading.Tasks.UniTask.MemoizeSource<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>
+	// Cysharp.Threading.Tasks.UniTask.MemoizeSource<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>
+	// Cysharp.Threading.Tasks.UniTask.MemoizeSource<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>
+	// Cysharp.Threading.Tasks.UniTask.MemoizeSource<System.ValueTuple<byte,System.ValueTuple<byte,object>>>
+	// Cysharp.Threading.Tasks.UniTask.MemoizeSource<System.ValueTuple<byte,object>>
+	// Cysharp.Threading.Tasks.UniTask.MemoizeSource<object>
+	// Cysharp.Threading.Tasks.UniTask<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>>>>
+	// Cysharp.Threading.Tasks.UniTask<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>>>
+	// Cysharp.Threading.Tasks.UniTask<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>>
+	// Cysharp.Threading.Tasks.UniTask<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>
+	// Cysharp.Threading.Tasks.UniTask<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>
+	// Cysharp.Threading.Tasks.UniTask<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>
+	// Cysharp.Threading.Tasks.UniTask<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>
+	// Cysharp.Threading.Tasks.UniTask<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>
+	// Cysharp.Threading.Tasks.UniTask<System.ValueTuple<byte,System.ValueTuple<byte,object>>>
+	// Cysharp.Threading.Tasks.UniTask<System.ValueTuple<byte,object>>
+	// Cysharp.Threading.Tasks.UniTask<object>
+	// Cysharp.Threading.Tasks.UniTaskCompletionSourceCore<Cysharp.Threading.Tasks.AsyncUnit>
+	// Cysharp.Threading.Tasks.UniTaskCompletionSourceCore<object>
+	// DG.Tweening.Core.DOGetter<float>
+	// DG.Tweening.Core.DOSetter<float>
+	// DG.Tweening.TweenCallback<float>
+	// SingletonMonobehaviour<object>
+	// Spine.ExposedList.Enumerator<object>
+	// Spine.ExposedList<object>
+	// System.Action<HourMinute>
+	// System.Action<InGameDownLoad.Reward>
+	// System.Action<Int2>
+	// System.Action<Item>
+	// System.Action<Jace.Execution.ParameterInfo>
+	// System.Action<Jace.Tokenizer.Token>
+	// System.Action<LanguageVerify.MatchString>
+	// System.Action<OperationTime>
+	// System.Action<RoleParticularModel.AlchemyDrug>
+	// System.Action<RoleParticularModel.HorseInfo>
+	// System.Action<RoleParticularModel.PetInfo>
+	// System.Action<ServerData>
+	// System.Action<ServerDataCouple>
+	// System.Action<ShopItemInfo>
+	// System.Action<System.Collections.Generic.KeyValuePair<object,object>>
+	// System.Action<TimeMgr.Syntony>
+	// System.Action<UnityEngine.EventSystems.RaycastResult>
+	// System.Action<UnityEngine.Rect>
+	// System.Action<UnityEngine.UIVertex>
+	// System.Action<UnityEngine.Vector2>
+	// System.Action<UnityEngine.Vector3>
+	// System.Action<WindowConfig.OrderTable>
+	// System.Action<byte,byte>
+	// System.Action<byte,int>
+	// System.Action<byte,object>
+	// System.Action<byte>
+	// System.Action<double>
+	// System.Action<float>
+	// System.Action<int,byte>
+	// System.Action<int,int,int>
+	// System.Action<int,int,object>
+	// System.Action<int,int>
+	// System.Action<int,object,byte>
+	// System.Action<int,object,int,int,int>
+	// System.Action<int,object,object>
+	// System.Action<int,object>
+	// System.Action<int>
+	// System.Action<long>
+	// System.Action<object,byte,byte>
+	// System.Action<object,byte>
+	// System.Action<object,int,UnityEngine.Vector3>
+	// System.Action<object,int>
+	// System.Action<object,object,object>
+	// System.Action<object,object>
+	// System.Action<object>
+	// System.Action<uint>
+	// System.Action<ulong>
+	// System.Action<ushort>
+	// System.Buffers.ArrayPool<int>
+	// System.Buffers.TlsOverPerCoreLockedStacksArrayPool.LockedStack<int>
+	// System.Buffers.TlsOverPerCoreLockedStacksArrayPool.PerCoreLockedStacks<int>
+	// System.Buffers.TlsOverPerCoreLockedStacksArrayPool<int>
+	// System.ByReference<UnityEngine.jvalue>
+	// System.ByReference<int>
+	// System.Collections.Concurrent.ConcurrentDictionary.<GetEnumerator>d__35<object,object>
+	// System.Collections.Concurrent.ConcurrentDictionary.DictionaryEnumerator<object,object>
+	// System.Collections.Concurrent.ConcurrentDictionary.Node<object,object>
+	// System.Collections.Concurrent.ConcurrentDictionary.Tables<object,object>
+	// System.Collections.Concurrent.ConcurrentDictionary<object,object>
+	// System.Collections.Generic.ArraySortHelper<HourMinute>
+	// System.Collections.Generic.ArraySortHelper<InGameDownLoad.Reward>
+	// System.Collections.Generic.ArraySortHelper<Int2>
+	// System.Collections.Generic.ArraySortHelper<Item>
+	// System.Collections.Generic.ArraySortHelper<Jace.Execution.ParameterInfo>
+	// System.Collections.Generic.ArraySortHelper<Jace.Tokenizer.Token>
+	// System.Collections.Generic.ArraySortHelper<LanguageVerify.MatchString>
+	// System.Collections.Generic.ArraySortHelper<OperationTime>
+	// System.Collections.Generic.ArraySortHelper<RoleParticularModel.AlchemyDrug>
+	// System.Collections.Generic.ArraySortHelper<RoleParticularModel.HorseInfo>
+	// System.Collections.Generic.ArraySortHelper<RoleParticularModel.PetInfo>
+	// System.Collections.Generic.ArraySortHelper<ServerData>
+	// System.Collections.Generic.ArraySortHelper<ServerDataCouple>
+	// System.Collections.Generic.ArraySortHelper<ShopItemInfo>
+	// System.Collections.Generic.ArraySortHelper<System.Collections.Generic.KeyValuePair<object,object>>
+	// System.Collections.Generic.ArraySortHelper<TimeMgr.Syntony>
+	// System.Collections.Generic.ArraySortHelper<UnityEngine.EventSystems.RaycastResult>
+	// System.Collections.Generic.ArraySortHelper<UnityEngine.Rect>
+	// System.Collections.Generic.ArraySortHelper<UnityEngine.UIVertex>
+	// System.Collections.Generic.ArraySortHelper<UnityEngine.Vector3>
+	// System.Collections.Generic.ArraySortHelper<WindowConfig.OrderTable>
+	// System.Collections.Generic.ArraySortHelper<double>
+	// System.Collections.Generic.ArraySortHelper<int>
+	// System.Collections.Generic.ArraySortHelper<long>
+	// System.Collections.Generic.ArraySortHelper<object>
+	// System.Collections.Generic.ArraySortHelper<uint>
+	// System.Collections.Generic.ArraySortHelper<ulong>
+	// System.Collections.Generic.ArraySortHelper<ushort>
+	// System.Collections.Generic.Comparer<HourMinute>
+	// System.Collections.Generic.Comparer<InGameDownLoad.Reward>
+	// System.Collections.Generic.Comparer<Int2>
+	// System.Collections.Generic.Comparer<Item>
+	// System.Collections.Generic.Comparer<Jace.Execution.ParameterInfo>
+	// System.Collections.Generic.Comparer<Jace.Tokenizer.Token>
+	// System.Collections.Generic.Comparer<LanguageVerify.MatchString>
+	// System.Collections.Generic.Comparer<OperationTime>
+	// System.Collections.Generic.Comparer<RoleParticularModel.AlchemyDrug>
+	// System.Collections.Generic.Comparer<RoleParticularModel.HorseInfo>
+	// System.Collections.Generic.Comparer<RoleParticularModel.PetInfo>
+	// System.Collections.Generic.Comparer<ServerData>
+	// System.Collections.Generic.Comparer<ServerDataCouple>
+	// System.Collections.Generic.Comparer<ShopItemInfo>
+	// System.Collections.Generic.Comparer<System.Collections.Generic.KeyValuePair<object,object>>
+	// System.Collections.Generic.Comparer<System.DateTime>
+	// System.Collections.Generic.Comparer<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>>
+	// System.Collections.Generic.Comparer<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>
+	// System.Collections.Generic.Comparer<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>
+	// System.Collections.Generic.Comparer<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>
+	// System.Collections.Generic.Comparer<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>
+	// System.Collections.Generic.Comparer<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>
+	// System.Collections.Generic.Comparer<System.ValueTuple<byte,System.ValueTuple<byte,object>>>
+	// System.Collections.Generic.Comparer<System.ValueTuple<byte,object>>
+	// System.Collections.Generic.Comparer<TimeMgr.Syntony>
+	// System.Collections.Generic.Comparer<UnityEngine.EventSystems.RaycastResult>
+	// System.Collections.Generic.Comparer<UnityEngine.Rect>
+	// System.Collections.Generic.Comparer<UnityEngine.UIVertex>
+	// System.Collections.Generic.Comparer<UnityEngine.Vector3>
+	// System.Collections.Generic.Comparer<WindowConfig.OrderTable>
+	// System.Collections.Generic.Comparer<byte>
+	// System.Collections.Generic.Comparer<double>
+	// System.Collections.Generic.Comparer<int>
+	// System.Collections.Generic.Comparer<long>
+	// System.Collections.Generic.Comparer<object>
+	// System.Collections.Generic.Comparer<uint>
+	// System.Collections.Generic.Comparer<ulong>
+	// System.Collections.Generic.Comparer<ushort>
+	// System.Collections.Generic.Dictionary.Enumerator<UnityEngine.Vector2,object>
+	// System.Collections.Generic.Dictionary.Enumerator<int,ChatBubbleManager.BubbleBox>
+	// System.Collections.Generic.Dictionary.Enumerator<int,ChatBubbleManager.ChatBubble>
+	// System.Collections.Generic.Dictionary.Enumerator<int,DailyQuestTimes>
+	// System.Collections.Generic.Dictionary.Enumerator<int,InvestModel.InvestInfo>
+	// System.Collections.Generic.Dictionary.Enumerator<int,Item>
+	// System.Collections.Generic.Dictionary.Enumerator<int,RechargeCount>
+	// System.Collections.Generic.Dictionary.Enumerator<int,System.Collections.Generic.KeyValuePair<int,int>>
+	// System.Collections.Generic.Dictionary.Enumerator<int,System.DateTime>
+	// System.Collections.Generic.Dictionary.Enumerator<int,byte>
+	// System.Collections.Generic.Dictionary.Enumerator<int,float>
+	// System.Collections.Generic.Dictionary.Enumerator<int,int>
+	// System.Collections.Generic.Dictionary.Enumerator<int,long>
+	// System.Collections.Generic.Dictionary.Enumerator<int,object>
+	// System.Collections.Generic.Dictionary.Enumerator<int,ulong>
+	// System.Collections.Generic.Dictionary.Enumerator<long,object>
+	// System.Collections.Generic.Dictionary.Enumerator<object,System.DateTime>
+	// System.Collections.Generic.Dictionary.Enumerator<object,double>
+	// System.Collections.Generic.Dictionary.Enumerator<object,int>
+	// System.Collections.Generic.Dictionary.Enumerator<object,object>
+	// System.Collections.Generic.Dictionary.Enumerator<uint,object>
+	// System.Collections.Generic.Dictionary.Enumerator<ushort,int>
+	// System.Collections.Generic.Dictionary.Enumerator<ushort,object>
+	// System.Collections.Generic.Dictionary.KeyCollection.Enumerator<UnityEngine.Vector2,object>
+	// System.Collections.Generic.Dictionary.KeyCollection.Enumerator<int,ChatBubbleManager.BubbleBox>
+	// System.Collections.Generic.Dictionary.KeyCollection.Enumerator<int,ChatBubbleManager.ChatBubble>
+	// System.Collections.Generic.Dictionary.KeyCollection.Enumerator<int,DailyQuestTimes>
+	// System.Collections.Generic.Dictionary.KeyCollection.Enumerator<int,InvestModel.InvestInfo>
+	// System.Collections.Generic.Dictionary.KeyCollection.Enumerator<int,Item>
+	// System.Collections.Generic.Dictionary.KeyCollection.Enumerator<int,RechargeCount>
+	// System.Collections.Generic.Dictionary.KeyCollection.Enumerator<int,System.Collections.Generic.KeyValuePair<int,int>>
+	// System.Collections.Generic.Dictionary.KeyCollection.Enumerator<int,System.DateTime>
+	// System.Collections.Generic.Dictionary.KeyCollection.Enumerator<int,byte>
+	// System.Collections.Generic.Dictionary.KeyCollection.Enumerator<int,float>
+	// System.Collections.Generic.Dictionary.KeyCollection.Enumerator<int,int>
+	// System.Collections.Generic.Dictionary.KeyCollection.Enumerator<int,long>
+	// System.Collections.Generic.Dictionary.KeyCollection.Enumerator<int,object>
+	// System.Collections.Generic.Dictionary.KeyCollection.Enumerator<int,ulong>
+	// System.Collections.Generic.Dictionary.KeyCollection.Enumerator<long,object>
+	// System.Collections.Generic.Dictionary.KeyCollection.Enumerator<object,System.DateTime>
+	// System.Collections.Generic.Dictionary.KeyCollection.Enumerator<object,double>
+	// System.Collections.Generic.Dictionary.KeyCollection.Enumerator<object,int>
+	// System.Collections.Generic.Dictionary.KeyCollection.Enumerator<object,object>
+	// System.Collections.Generic.Dictionary.KeyCollection.Enumerator<uint,object>
+	// System.Collections.Generic.Dictionary.KeyCollection.Enumerator<ushort,int>
+	// System.Collections.Generic.Dictionary.KeyCollection.Enumerator<ushort,object>
+	// System.Collections.Generic.Dictionary.KeyCollection<UnityEngine.Vector2,object>
+	// System.Collections.Generic.Dictionary.KeyCollection<int,ChatBubbleManager.BubbleBox>
+	// System.Collections.Generic.Dictionary.KeyCollection<int,ChatBubbleManager.ChatBubble>
+	// System.Collections.Generic.Dictionary.KeyCollection<int,DailyQuestTimes>
+	// System.Collections.Generic.Dictionary.KeyCollection<int,InvestModel.InvestInfo>
+	// System.Collections.Generic.Dictionary.KeyCollection<int,Item>
+	// System.Collections.Generic.Dictionary.KeyCollection<int,RechargeCount>
+	// System.Collections.Generic.Dictionary.KeyCollection<int,System.Collections.Generic.KeyValuePair<int,int>>
+	// System.Collections.Generic.Dictionary.KeyCollection<int,System.DateTime>
+	// System.Collections.Generic.Dictionary.KeyCollection<int,byte>
+	// System.Collections.Generic.Dictionary.KeyCollection<int,float>
+	// System.Collections.Generic.Dictionary.KeyCollection<int,int>
+	// System.Collections.Generic.Dictionary.KeyCollection<int,long>
+	// System.Collections.Generic.Dictionary.KeyCollection<int,object>
+	// System.Collections.Generic.Dictionary.KeyCollection<int,ulong>
+	// System.Collections.Generic.Dictionary.KeyCollection<long,object>
+	// System.Collections.Generic.Dictionary.KeyCollection<object,System.DateTime>
+	// System.Collections.Generic.Dictionary.KeyCollection<object,double>
+	// System.Collections.Generic.Dictionary.KeyCollection<object,int>
+	// System.Collections.Generic.Dictionary.KeyCollection<object,object>
+	// System.Collections.Generic.Dictionary.KeyCollection<uint,object>
+	// System.Collections.Generic.Dictionary.KeyCollection<ushort,int>
+	// System.Collections.Generic.Dictionary.KeyCollection<ushort,object>
+	// System.Collections.Generic.Dictionary.ValueCollection.Enumerator<UnityEngine.Vector2,object>
+	// System.Collections.Generic.Dictionary.ValueCollection.Enumerator<int,ChatBubbleManager.BubbleBox>
+	// System.Collections.Generic.Dictionary.ValueCollection.Enumerator<int,ChatBubbleManager.ChatBubble>
+	// System.Collections.Generic.Dictionary.ValueCollection.Enumerator<int,DailyQuestTimes>
+	// System.Collections.Generic.Dictionary.ValueCollection.Enumerator<int,InvestModel.InvestInfo>
+	// System.Collections.Generic.Dictionary.ValueCollection.Enumerator<int,Item>
+	// System.Collections.Generic.Dictionary.ValueCollection.Enumerator<int,RechargeCount>
+	// System.Collections.Generic.Dictionary.ValueCollection.Enumerator<int,System.Collections.Generic.KeyValuePair<int,int>>
+	// System.Collections.Generic.Dictionary.ValueCollection.Enumerator<int,System.DateTime>
+	// System.Collections.Generic.Dictionary.ValueCollection.Enumerator<int,byte>
+	// System.Collections.Generic.Dictionary.ValueCollection.Enumerator<int,float>
+	// System.Collections.Generic.Dictionary.ValueCollection.Enumerator<int,int>
+	// System.Collections.Generic.Dictionary.ValueCollection.Enumerator<int,long>
+	// System.Collections.Generic.Dictionary.ValueCollection.Enumerator<int,object>
+	// System.Collections.Generic.Dictionary.ValueCollection.Enumerator<int,ulong>
+	// System.Collections.Generic.Dictionary.ValueCollection.Enumerator<long,object>
+	// System.Collections.Generic.Dictionary.ValueCollection.Enumerator<object,System.DateTime>
+	// System.Collections.Generic.Dictionary.ValueCollection.Enumerator<object,double>
+	// System.Collections.Generic.Dictionary.ValueCollection.Enumerator<object,int>
+	// System.Collections.Generic.Dictionary.ValueCollection.Enumerator<object,object>
+	// System.Collections.Generic.Dictionary.ValueCollection.Enumerator<uint,object>
+	// System.Collections.Generic.Dictionary.ValueCollection.Enumerator<ushort,int>
+	// System.Collections.Generic.Dictionary.ValueCollection.Enumerator<ushort,object>
+	// System.Collections.Generic.Dictionary.ValueCollection<UnityEngine.Vector2,object>
+	// System.Collections.Generic.Dictionary.ValueCollection<int,ChatBubbleManager.BubbleBox>
+	// System.Collections.Generic.Dictionary.ValueCollection<int,ChatBubbleManager.ChatBubble>
+	// System.Collections.Generic.Dictionary.ValueCollection<int,DailyQuestTimes>
+	// System.Collections.Generic.Dictionary.ValueCollection<int,InvestModel.InvestInfo>
+	// System.Collections.Generic.Dictionary.ValueCollection<int,Item>
+	// System.Collections.Generic.Dictionary.ValueCollection<int,RechargeCount>
+	// System.Collections.Generic.Dictionary.ValueCollection<int,System.Collections.Generic.KeyValuePair<int,int>>
+	// System.Collections.Generic.Dictionary.ValueCollection<int,System.DateTime>
+	// System.Collections.Generic.Dictionary.ValueCollection<int,byte>
+	// System.Collections.Generic.Dictionary.ValueCollection<int,float>
+	// System.Collections.Generic.Dictionary.ValueCollection<int,int>
+	// System.Collections.Generic.Dictionary.ValueCollection<int,long>
+	// System.Collections.Generic.Dictionary.ValueCollection<int,object>
+	// System.Collections.Generic.Dictionary.ValueCollection<int,ulong>
+	// System.Collections.Generic.Dictionary.ValueCollection<long,object>
+	// System.Collections.Generic.Dictionary.ValueCollection<object,System.DateTime>
+	// System.Collections.Generic.Dictionary.ValueCollection<object,double>
+	// System.Collections.Generic.Dictionary.ValueCollection<object,int>
+	// System.Collections.Generic.Dictionary.ValueCollection<object,object>
+	// System.Collections.Generic.Dictionary.ValueCollection<uint,object>
+	// System.Collections.Generic.Dictionary.ValueCollection<ushort,int>
+	// System.Collections.Generic.Dictionary.ValueCollection<ushort,object>
+	// System.Collections.Generic.Dictionary<UnityEngine.Vector2,object>
+	// System.Collections.Generic.Dictionary<int,ChatBubbleManager.BubbleBox>
+	// System.Collections.Generic.Dictionary<int,ChatBubbleManager.ChatBubble>
+	// System.Collections.Generic.Dictionary<int,DailyQuestTimes>
+	// System.Collections.Generic.Dictionary<int,InvestModel.InvestInfo>
+	// System.Collections.Generic.Dictionary<int,Item>
+	// System.Collections.Generic.Dictionary<int,RechargeCount>
+	// System.Collections.Generic.Dictionary<int,System.Collections.Generic.KeyValuePair<int,int>>
+	// System.Collections.Generic.Dictionary<int,System.DateTime>
+	// System.Collections.Generic.Dictionary<int,byte>
+	// System.Collections.Generic.Dictionary<int,float>
+	// System.Collections.Generic.Dictionary<int,int>
+	// System.Collections.Generic.Dictionary<int,long>
+	// System.Collections.Generic.Dictionary<int,object>
+	// System.Collections.Generic.Dictionary<int,ulong>
+	// System.Collections.Generic.Dictionary<long,object>
+	// System.Collections.Generic.Dictionary<object,System.DateTime>
+	// System.Collections.Generic.Dictionary<object,double>
+	// System.Collections.Generic.Dictionary<object,int>
+	// System.Collections.Generic.Dictionary<object,object>
+	// System.Collections.Generic.Dictionary<uint,object>
+	// System.Collections.Generic.Dictionary<ushort,int>
+	// System.Collections.Generic.Dictionary<ushort,object>
+	// System.Collections.Generic.EqualityComparer<ChatBubbleManager.BubbleBox>
+	// System.Collections.Generic.EqualityComparer<ChatBubbleManager.ChatBubble>
+	// System.Collections.Generic.EqualityComparer<DailyQuestTimes>
+	// System.Collections.Generic.EqualityComparer<InvestModel.InvestInfo>
+	// System.Collections.Generic.EqualityComparer<Item>
+	// System.Collections.Generic.EqualityComparer<RechargeCount>
+	// System.Collections.Generic.EqualityComparer<System.Collections.Generic.KeyValuePair<int,int>>
+	// System.Collections.Generic.EqualityComparer<System.DateTime>
+	// System.Collections.Generic.EqualityComparer<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>>
+	// System.Collections.Generic.EqualityComparer<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>
+	// System.Collections.Generic.EqualityComparer<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>
+	// System.Collections.Generic.EqualityComparer<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>
+	// System.Collections.Generic.EqualityComparer<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>
+	// System.Collections.Generic.EqualityComparer<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>
+	// System.Collections.Generic.EqualityComparer<System.ValueTuple<byte,System.ValueTuple<byte,object>>>
+	// System.Collections.Generic.EqualityComparer<System.ValueTuple<byte,object>>
+	// System.Collections.Generic.EqualityComparer<UnityEngine.Vector2>
+	// System.Collections.Generic.EqualityComparer<byte>
+	// System.Collections.Generic.EqualityComparer<double>
+	// System.Collections.Generic.EqualityComparer<float>
+	// System.Collections.Generic.EqualityComparer<int>
+	// System.Collections.Generic.EqualityComparer<long>
+	// System.Collections.Generic.EqualityComparer<object>
+	// System.Collections.Generic.EqualityComparer<uint>
+	// System.Collections.Generic.EqualityComparer<ulong>
+	// System.Collections.Generic.EqualityComparer<ushort>
+	// System.Collections.Generic.HashSet.Enumerator<int>
+	// System.Collections.Generic.HashSet.Enumerator<object>
+	// System.Collections.Generic.HashSet<int>
+	// System.Collections.Generic.HashSet<object>
+	// System.Collections.Generic.HashSetEqualityComparer<int>
+	// System.Collections.Generic.HashSetEqualityComparer<object>
+	// System.Collections.Generic.ICollection<HourMinute>
+	// System.Collections.Generic.ICollection<InGameDownLoad.Reward>
+	// System.Collections.Generic.ICollection<Int2>
+	// System.Collections.Generic.ICollection<Item>
+	// System.Collections.Generic.ICollection<Jace.Execution.ParameterInfo>
+	// System.Collections.Generic.ICollection<Jace.Tokenizer.Token>
+	// System.Collections.Generic.ICollection<LanguageVerify.MatchString>
+	// System.Collections.Generic.ICollection<OperationTime>
+	// System.Collections.Generic.ICollection<RoleParticularModel.AlchemyDrug>
+	// System.Collections.Generic.ICollection<RoleParticularModel.HorseInfo>
+	// System.Collections.Generic.ICollection<RoleParticularModel.PetInfo>
+	// System.Collections.Generic.ICollection<ServerData>
+	// System.Collections.Generic.ICollection<ServerDataCouple>
+	// System.Collections.Generic.ICollection<ShopItemInfo>
+	// System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<UnityEngine.Vector2,object>>
+	// System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<int,ChatBubbleManager.BubbleBox>>
+	// System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<int,ChatBubbleManager.ChatBubble>>
+	// System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<int,DailyQuestTimes>>
+	// System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<int,InvestModel.InvestInfo>>
+	// System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<int,Item>>
+	// System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<int,RechargeCount>>
+	// System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<int,System.Collections.Generic.KeyValuePair<int,int>>>
+	// System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<int,System.DateTime>>
+	// System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<int,byte>>
+	// System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<int,float>>
+	// System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<int,int>>
+	// System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<int,long>>
+	// System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<int,object>>
+	// System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<int,ulong>>
+	// System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<long,object>>
+	// System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<object,System.DateTime>>
+	// System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<object,double>>
+	// System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<object,int>>
+	// System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<object,object>>
+	// System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<uint,object>>
+	// System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<ushort,int>>
+	// System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<ushort,object>>
+	// System.Collections.Generic.ICollection<TimeMgr.Syntony>
+	// System.Collections.Generic.ICollection<UnityEngine.EventSystems.RaycastResult>
+	// System.Collections.Generic.ICollection<UnityEngine.Rect>
+	// System.Collections.Generic.ICollection<UnityEngine.UIVertex>
+	// System.Collections.Generic.ICollection<UnityEngine.Vector3>
+	// System.Collections.Generic.ICollection<WindowConfig.OrderTable>
+	// System.Collections.Generic.ICollection<double>
+	// System.Collections.Generic.ICollection<float>
+	// System.Collections.Generic.ICollection<int>
+	// System.Collections.Generic.ICollection<long>
+	// System.Collections.Generic.ICollection<object>
+	// System.Collections.Generic.ICollection<uint>
+	// System.Collections.Generic.ICollection<ulong>
+	// System.Collections.Generic.ICollection<ushort>
+	// System.Collections.Generic.IComparer<HourMinute>
+	// System.Collections.Generic.IComparer<InGameDownLoad.Reward>
+	// System.Collections.Generic.IComparer<Int2>
+	// System.Collections.Generic.IComparer<Item>
+	// System.Collections.Generic.IComparer<Jace.Execution.ParameterInfo>
+	// System.Collections.Generic.IComparer<Jace.Tokenizer.Token>
+	// System.Collections.Generic.IComparer<LanguageVerify.MatchString>
+	// System.Collections.Generic.IComparer<OperationTime>
+	// System.Collections.Generic.IComparer<RoleParticularModel.AlchemyDrug>
+	// System.Collections.Generic.IComparer<RoleParticularModel.HorseInfo>
+	// System.Collections.Generic.IComparer<RoleParticularModel.PetInfo>
+	// System.Collections.Generic.IComparer<ServerData>
+	// System.Collections.Generic.IComparer<ServerDataCouple>
+	// System.Collections.Generic.IComparer<ShopItemInfo>
+	// System.Collections.Generic.IComparer<System.Collections.Generic.KeyValuePair<object,object>>
+	// System.Collections.Generic.IComparer<System.DateTime>
+	// System.Collections.Generic.IComparer<TimeMgr.Syntony>
+	// System.Collections.Generic.IComparer<UnityEngine.EventSystems.RaycastResult>
+	// System.Collections.Generic.IComparer<UnityEngine.Rect>
+	// System.Collections.Generic.IComparer<UnityEngine.UIVertex>
+	// System.Collections.Generic.IComparer<UnityEngine.Vector3>
+	// System.Collections.Generic.IComparer<WindowConfig.OrderTable>
+	// System.Collections.Generic.IComparer<double>
+	// System.Collections.Generic.IComparer<int>
+	// System.Collections.Generic.IComparer<long>
+	// System.Collections.Generic.IComparer<object>
+	// System.Collections.Generic.IComparer<uint>
+	// System.Collections.Generic.IComparer<ulong>
+	// System.Collections.Generic.IComparer<ushort>
+	// System.Collections.Generic.IDictionary<object,LitJson.ArrayMetadata>
+	// System.Collections.Generic.IDictionary<object,LitJson.ObjectMetadata>
+	// System.Collections.Generic.IDictionary<object,LitJson.PropertyMetadata>
+	// System.Collections.Generic.IDictionary<object,double>
+	// System.Collections.Generic.IDictionary<object,object>
+	// System.Collections.Generic.IEnumerable<HourMinute>
+	// System.Collections.Generic.IEnumerable<InGameDownLoad.Reward>
+	// System.Collections.Generic.IEnumerable<Int2>
+	// System.Collections.Generic.IEnumerable<Item>
+	// System.Collections.Generic.IEnumerable<Jace.Execution.ParameterInfo>
+	// System.Collections.Generic.IEnumerable<Jace.Tokenizer.Token>
+	// System.Collections.Generic.IEnumerable<LanguageVerify.MatchString>
+	// System.Collections.Generic.IEnumerable<OperationTime>
+	// System.Collections.Generic.IEnumerable<RoleParticularModel.AlchemyDrug>
+	// System.Collections.Generic.IEnumerable<RoleParticularModel.HorseInfo>
+	// System.Collections.Generic.IEnumerable<RoleParticularModel.PetInfo>
+	// System.Collections.Generic.IEnumerable<ServerData>
+	// System.Collections.Generic.IEnumerable<ServerDataCouple>
+	// System.Collections.Generic.IEnumerable<ShopItemInfo>
+	// System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<UnityEngine.Vector2,object>>
+	// System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<int,ChatBubbleManager.BubbleBox>>
+	// System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<int,ChatBubbleManager.ChatBubble>>
+	// System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<int,DailyQuestTimes>>
+	// System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<int,InvestModel.InvestInfo>>
+	// System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<int,Item>>
+	// System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<int,RechargeCount>>
+	// System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<int,System.Collections.Generic.KeyValuePair<int,int>>>
+	// System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<int,System.DateTime>>
+	// System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<int,byte>>
+	// System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<int,float>>
+	// System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<int,int>>
+	// System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<int,long>>
+	// System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<int,object>>
+	// System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<int,ulong>>
+	// System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<long,object>>
+	// System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<object,System.DateTime>>
+	// System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<object,double>>
+	// System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<object,int>>
+	// System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<object,object>>
+	// System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<uint,object>>
+	// System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<ushort,int>>
+	// System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<ushort,object>>
+	// System.Collections.Generic.IEnumerable<TimeMgr.Syntony>
+	// System.Collections.Generic.IEnumerable<UnityEngine.EventSystems.RaycastResult>
+	// System.Collections.Generic.IEnumerable<UnityEngine.Rect>
+	// System.Collections.Generic.IEnumerable<UnityEngine.UIVertex>
+	// System.Collections.Generic.IEnumerable<UnityEngine.Vector3>
+	// System.Collections.Generic.IEnumerable<WindowConfig.OrderTable>
+	// System.Collections.Generic.IEnumerable<double>
+	// System.Collections.Generic.IEnumerable<float>
+	// System.Collections.Generic.IEnumerable<int>
+	// System.Collections.Generic.IEnumerable<long>
+	// System.Collections.Generic.IEnumerable<object>
+	// System.Collections.Generic.IEnumerable<uint>
+	// System.Collections.Generic.IEnumerable<ulong>
+	// System.Collections.Generic.IEnumerable<ushort>
+	// System.Collections.Generic.IEnumerator<HourMinute>
+	// System.Collections.Generic.IEnumerator<InGameDownLoad.Reward>
+	// System.Collections.Generic.IEnumerator<Int2>
+	// System.Collections.Generic.IEnumerator<Item>
+	// System.Collections.Generic.IEnumerator<Jace.Execution.ParameterInfo>
+	// System.Collections.Generic.IEnumerator<Jace.Tokenizer.Token>
+	// System.Collections.Generic.IEnumerator<LanguageVerify.MatchString>
+	// System.Collections.Generic.IEnumerator<OperationTime>
+	// System.Collections.Generic.IEnumerator<RoleParticularModel.AlchemyDrug>
+	// System.Collections.Generic.IEnumerator<RoleParticularModel.HorseInfo>
+	// System.Collections.Generic.IEnumerator<RoleParticularModel.PetInfo>
+	// System.Collections.Generic.IEnumerator<ServerData>
+	// System.Collections.Generic.IEnumerator<ServerDataCouple>
+	// System.Collections.Generic.IEnumerator<ShopItemInfo>
+	// System.Collections.Generic.IEnumerator<System.Collections.Generic.KeyValuePair<UnityEngine.Vector2,object>>
+	// System.Collections.Generic.IEnumerator<System.Collections.Generic.KeyValuePair<int,ChatBubbleManager.BubbleBox>>
+	// System.Collections.Generic.IEnumerator<System.Collections.Generic.KeyValuePair<int,ChatBubbleManager.ChatBubble>>
+	// System.Collections.Generic.IEnumerator<System.Collections.Generic.KeyValuePair<int,DailyQuestTimes>>
+	// System.Collections.Generic.IEnumerator<System.Collections.Generic.KeyValuePair<int,InvestModel.InvestInfo>>
+	// System.Collections.Generic.IEnumerator<System.Collections.Generic.KeyValuePair<int,Item>>
+	// System.Collections.Generic.IEnumerator<System.Collections.Generic.KeyValuePair<int,RechargeCount>>
+	// System.Collections.Generic.IEnumerator<System.Collections.Generic.KeyValuePair<int,System.Collections.Generic.KeyValuePair<int,int>>>
+	// System.Collections.Generic.IEnumerator<System.Collections.Generic.KeyValuePair<int,System.DateTime>>
+	// System.Collections.Generic.IEnumerator<System.Collections.Generic.KeyValuePair<int,byte>>
+	// System.Collections.Generic.IEnumerator<System.Collections.Generic.KeyValuePair<int,float>>
+	// System.Collections.Generic.IEnumerator<System.Collections.Generic.KeyValuePair<int,int>>
+	// System.Collections.Generic.IEnumerator<System.Collections.Generic.KeyValuePair<int,long>>
+	// System.Collections.Generic.IEnumerator<System.Collections.Generic.KeyValuePair<int,object>>
+	// System.Collections.Generic.IEnumerator<System.Collections.Generic.KeyValuePair<int,ulong>>
+	// System.Collections.Generic.IEnumerator<System.Collections.Generic.KeyValuePair<long,object>>
+	// System.Collections.Generic.IEnumerator<System.Collections.Generic.KeyValuePair<object,System.DateTime>>
+	// System.Collections.Generic.IEnumerator<System.Collections.Generic.KeyValuePair<object,double>>
+	// System.Collections.Generic.IEnumerator<System.Collections.Generic.KeyValuePair<object,int>>
+	// System.Collections.Generic.IEnumerator<System.Collections.Generic.KeyValuePair<object,object>>
+	// System.Collections.Generic.IEnumerator<System.Collections.Generic.KeyValuePair<uint,object>>
+	// System.Collections.Generic.IEnumerator<System.Collections.Generic.KeyValuePair<ushort,int>>
+	// System.Collections.Generic.IEnumerator<System.Collections.Generic.KeyValuePair<ushort,object>>
+	// System.Collections.Generic.IEnumerator<TimeMgr.Syntony>
+	// System.Collections.Generic.IEnumerator<UnityEngine.EventSystems.RaycastResult>
+	// System.Collections.Generic.IEnumerator<UnityEngine.Rect>
+	// System.Collections.Generic.IEnumerator<UnityEngine.UIVertex>
+	// System.Collections.Generic.IEnumerator<UnityEngine.Vector3>
+	// System.Collections.Generic.IEnumerator<WindowConfig.OrderTable>
+	// System.Collections.Generic.IEnumerator<double>
+	// System.Collections.Generic.IEnumerator<float>
+	// System.Collections.Generic.IEnumerator<int>
+	// System.Collections.Generic.IEnumerator<long>
+	// System.Collections.Generic.IEnumerator<object>
+	// System.Collections.Generic.IEnumerator<uint>
+	// System.Collections.Generic.IEnumerator<ulong>
+	// System.Collections.Generic.IEnumerator<ushort>
+	// System.Collections.Generic.IEqualityComparer<UnityEngine.Vector2>
+	// System.Collections.Generic.IEqualityComparer<int>
+	// System.Collections.Generic.IEqualityComparer<long>
+	// System.Collections.Generic.IEqualityComparer<object>
+	// System.Collections.Generic.IEqualityComparer<uint>
+	// System.Collections.Generic.IEqualityComparer<ushort>
+	// System.Collections.Generic.IList<HourMinute>
+	// System.Collections.Generic.IList<InGameDownLoad.Reward>
+	// System.Collections.Generic.IList<Int2>
+	// System.Collections.Generic.IList<Item>
+	// System.Collections.Generic.IList<Jace.Execution.ParameterInfo>
+	// System.Collections.Generic.IList<Jace.Tokenizer.Token>
+	// System.Collections.Generic.IList<LanguageVerify.MatchString>
+	// System.Collections.Generic.IList<OperationTime>
+	// System.Collections.Generic.IList<RoleParticularModel.AlchemyDrug>
+	// System.Collections.Generic.IList<RoleParticularModel.HorseInfo>
+	// System.Collections.Generic.IList<RoleParticularModel.PetInfo>
+	// System.Collections.Generic.IList<ServerData>
+	// System.Collections.Generic.IList<ServerDataCouple>
+	// System.Collections.Generic.IList<ShopItemInfo>
+	// System.Collections.Generic.IList<System.Collections.Generic.KeyValuePair<object,object>>
+	// System.Collections.Generic.IList<TimeMgr.Syntony>
+	// System.Collections.Generic.IList<UnityEngine.EventSystems.RaycastResult>
+	// System.Collections.Generic.IList<UnityEngine.Rect>
+	// System.Collections.Generic.IList<UnityEngine.UIVertex>
+	// System.Collections.Generic.IList<UnityEngine.Vector3>
+	// System.Collections.Generic.IList<WindowConfig.OrderTable>
+	// System.Collections.Generic.IList<double>
+	// System.Collections.Generic.IList<float>
+	// System.Collections.Generic.IList<int>
+	// System.Collections.Generic.IList<long>
+	// System.Collections.Generic.IList<object>
+	// System.Collections.Generic.IList<uint>
+	// System.Collections.Generic.IList<ulong>
+	// System.Collections.Generic.IList<ushort>
+	// System.Collections.Generic.KeyValuePair<UnityEngine.Vector2,object>
+	// System.Collections.Generic.KeyValuePair<int,ChatBubbleManager.BubbleBox>
+	// System.Collections.Generic.KeyValuePair<int,ChatBubbleManager.ChatBubble>
+	// System.Collections.Generic.KeyValuePair<int,DailyQuestTimes>
+	// System.Collections.Generic.KeyValuePair<int,InvestModel.InvestInfo>
+	// System.Collections.Generic.KeyValuePair<int,Item>
+	// System.Collections.Generic.KeyValuePair<int,RechargeCount>
+	// System.Collections.Generic.KeyValuePair<int,System.Collections.Generic.KeyValuePair<int,int>>
+	// System.Collections.Generic.KeyValuePair<int,System.DateTime>
+	// System.Collections.Generic.KeyValuePair<int,byte>
+	// System.Collections.Generic.KeyValuePair<int,float>
+	// System.Collections.Generic.KeyValuePair<int,int>
+	// System.Collections.Generic.KeyValuePair<int,long>
+	// System.Collections.Generic.KeyValuePair<int,object>
+	// System.Collections.Generic.KeyValuePair<int,ulong>
+	// System.Collections.Generic.KeyValuePair<long,object>
+	// System.Collections.Generic.KeyValuePair<object,System.DateTime>
+	// System.Collections.Generic.KeyValuePair<object,double>
+	// System.Collections.Generic.KeyValuePair<object,int>
+	// System.Collections.Generic.KeyValuePair<object,long>
+	// System.Collections.Generic.KeyValuePair<object,object>
+	// System.Collections.Generic.KeyValuePair<uint,object>
+	// System.Collections.Generic.KeyValuePair<ushort,int>
+	// System.Collections.Generic.KeyValuePair<ushort,object>
+	// System.Collections.Generic.List.Enumerator<HourMinute>
+	// System.Collections.Generic.List.Enumerator<InGameDownLoad.Reward>
+	// System.Collections.Generic.List.Enumerator<Int2>
+	// System.Collections.Generic.List.Enumerator<Item>
+	// System.Collections.Generic.List.Enumerator<Jace.Execution.ParameterInfo>
+	// System.Collections.Generic.List.Enumerator<Jace.Tokenizer.Token>
+	// System.Collections.Generic.List.Enumerator<LanguageVerify.MatchString>
+	// System.Collections.Generic.List.Enumerator<OperationTime>
+	// System.Collections.Generic.List.Enumerator<RoleParticularModel.AlchemyDrug>
+	// System.Collections.Generic.List.Enumerator<RoleParticularModel.HorseInfo>
+	// System.Collections.Generic.List.Enumerator<RoleParticularModel.PetInfo>
+	// System.Collections.Generic.List.Enumerator<ServerData>
+	// System.Collections.Generic.List.Enumerator<ServerDataCouple>
+	// System.Collections.Generic.List.Enumerator<ShopItemInfo>
+	// System.Collections.Generic.List.Enumerator<System.Collections.Generic.KeyValuePair<object,object>>
+	// System.Collections.Generic.List.Enumerator<TimeMgr.Syntony>
+	// System.Collections.Generic.List.Enumerator<UnityEngine.EventSystems.RaycastResult>
+	// System.Collections.Generic.List.Enumerator<UnityEngine.Rect>
+	// System.Collections.Generic.List.Enumerator<UnityEngine.UIVertex>
+	// System.Collections.Generic.List.Enumerator<UnityEngine.Vector3>
+	// System.Collections.Generic.List.Enumerator<WindowConfig.OrderTable>
+	// System.Collections.Generic.List.Enumerator<double>
+	// System.Collections.Generic.List.Enumerator<int>
+	// System.Collections.Generic.List.Enumerator<long>
+	// System.Collections.Generic.List.Enumerator<object>
+	// System.Collections.Generic.List.Enumerator<uint>
+	// System.Collections.Generic.List.Enumerator<ulong>
+	// System.Collections.Generic.List.Enumerator<ushort>
+	// System.Collections.Generic.List<HourMinute>
+	// System.Collections.Generic.List<InGameDownLoad.Reward>
+	// System.Collections.Generic.List<Int2>
+	// System.Collections.Generic.List<Item>
+	// System.Collections.Generic.List<Jace.Execution.ParameterInfo>
+	// System.Collections.Generic.List<Jace.Tokenizer.Token>
+	// System.Collections.Generic.List<LanguageVerify.MatchString>
+	// System.Collections.Generic.List<OperationTime>
+	// System.Collections.Generic.List<RoleParticularModel.AlchemyDrug>
+	// System.Collections.Generic.List<RoleParticularModel.HorseInfo>
+	// System.Collections.Generic.List<RoleParticularModel.PetInfo>
+	// System.Collections.Generic.List<ServerData>
+	// System.Collections.Generic.List<ServerDataCouple>
+	// System.Collections.Generic.List<ShopItemInfo>
+	// System.Collections.Generic.List<System.Collections.Generic.KeyValuePair<object,object>>
+	// System.Collections.Generic.List<TimeMgr.Syntony>
+	// System.Collections.Generic.List<UnityEngine.EventSystems.RaycastResult>
+	// System.Collections.Generic.List<UnityEngine.Rect>
+	// System.Collections.Generic.List<UnityEngine.UIVertex>
+	// System.Collections.Generic.List<UnityEngine.Vector3>
+	// System.Collections.Generic.List<WindowConfig.OrderTable>
+	// System.Collections.Generic.List<double>
+	// System.Collections.Generic.List<int>
+	// System.Collections.Generic.List<long>
+	// System.Collections.Generic.List<object>
+	// System.Collections.Generic.List<uint>
+	// System.Collections.Generic.List<ulong>
+	// System.Collections.Generic.List<ushort>
+	// System.Collections.Generic.ObjectComparer<HourMinute>
+	// System.Collections.Generic.ObjectComparer<InGameDownLoad.Reward>
+	// System.Collections.Generic.ObjectComparer<Int2>
+	// System.Collections.Generic.ObjectComparer<Item>
+	// System.Collections.Generic.ObjectComparer<Jace.Execution.ParameterInfo>
+	// System.Collections.Generic.ObjectComparer<Jace.Tokenizer.Token>
+	// System.Collections.Generic.ObjectComparer<LanguageVerify.MatchString>
+	// System.Collections.Generic.ObjectComparer<OperationTime>
+	// System.Collections.Generic.ObjectComparer<RoleParticularModel.AlchemyDrug>
+	// System.Collections.Generic.ObjectComparer<RoleParticularModel.HorseInfo>
+	// System.Collections.Generic.ObjectComparer<RoleParticularModel.PetInfo>
+	// System.Collections.Generic.ObjectComparer<ServerData>
+	// System.Collections.Generic.ObjectComparer<ServerDataCouple>
+	// System.Collections.Generic.ObjectComparer<ShopItemInfo>
+	// System.Collections.Generic.ObjectComparer<System.Collections.Generic.KeyValuePair<object,object>>
+	// System.Collections.Generic.ObjectComparer<System.DateTime>
+	// System.Collections.Generic.ObjectComparer<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>
+	// System.Collections.Generic.ObjectComparer<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>
+	// System.Collections.Generic.ObjectComparer<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>
+	// System.Collections.Generic.ObjectComparer<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>
+	// System.Collections.Generic.ObjectComparer<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>
+	// System.Collections.Generic.ObjectComparer<System.ValueTuple<byte,System.ValueTuple<byte,object>>>
+	// System.Collections.Generic.ObjectComparer<System.ValueTuple<byte,object>>
+	// System.Collections.Generic.ObjectComparer<TimeMgr.Syntony>
+	// System.Collections.Generic.ObjectComparer<UnityEngine.EventSystems.RaycastResult>
+	// System.Collections.Generic.ObjectComparer<UnityEngine.Rect>
+	// System.Collections.Generic.ObjectComparer<UnityEngine.UIVertex>
+	// System.Collections.Generic.ObjectComparer<UnityEngine.Vector3>
+	// System.Collections.Generic.ObjectComparer<WindowConfig.OrderTable>
+	// System.Collections.Generic.ObjectComparer<byte>
+	// System.Collections.Generic.ObjectComparer<double>
+	// System.Collections.Generic.ObjectComparer<int>
+	// System.Collections.Generic.ObjectComparer<long>
+	// System.Collections.Generic.ObjectComparer<object>
+	// System.Collections.Generic.ObjectComparer<uint>
+	// System.Collections.Generic.ObjectComparer<ulong>
+	// System.Collections.Generic.ObjectComparer<ushort>
+	// System.Collections.Generic.ObjectEqualityComparer<ChatBubbleManager.BubbleBox>
+	// System.Collections.Generic.ObjectEqualityComparer<ChatBubbleManager.ChatBubble>
+	// System.Collections.Generic.ObjectEqualityComparer<DailyQuestTimes>
+	// System.Collections.Generic.ObjectEqualityComparer<InvestModel.InvestInfo>
+	// System.Collections.Generic.ObjectEqualityComparer<Item>
+	// System.Collections.Generic.ObjectEqualityComparer<RechargeCount>
+	// System.Collections.Generic.ObjectEqualityComparer<System.Collections.Generic.KeyValuePair<int,int>>
+	// System.Collections.Generic.ObjectEqualityComparer<System.DateTime>
+	// System.Collections.Generic.ObjectEqualityComparer<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>
+	// System.Collections.Generic.ObjectEqualityComparer<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>
+	// System.Collections.Generic.ObjectEqualityComparer<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>
+	// System.Collections.Generic.ObjectEqualityComparer<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>
+	// System.Collections.Generic.ObjectEqualityComparer<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>
+	// System.Collections.Generic.ObjectEqualityComparer<System.ValueTuple<byte,System.ValueTuple<byte,object>>>
+	// System.Collections.Generic.ObjectEqualityComparer<System.ValueTuple<byte,object>>
+	// System.Collections.Generic.ObjectEqualityComparer<UnityEngine.Vector2>
+	// System.Collections.Generic.ObjectEqualityComparer<byte>
+	// System.Collections.Generic.ObjectEqualityComparer<double>
+	// System.Collections.Generic.ObjectEqualityComparer<float>
+	// System.Collections.Generic.ObjectEqualityComparer<int>
+	// System.Collections.Generic.ObjectEqualityComparer<long>
+	// System.Collections.Generic.ObjectEqualityComparer<object>
+	// System.Collections.Generic.ObjectEqualityComparer<uint>
+	// System.Collections.Generic.ObjectEqualityComparer<ulong>
+	// System.Collections.Generic.ObjectEqualityComparer<ushort>
+	// System.Collections.Generic.Queue.Enumerator<int>
+	// System.Collections.Generic.Queue.Enumerator<object>
+	// System.Collections.Generic.Queue<int>
+	// System.Collections.Generic.Queue<object>
+	// System.Collections.Generic.Stack.Enumerator<Jace.Tokenizer.Token>
+	// System.Collections.Generic.Stack.Enumerator<int>
+	// System.Collections.Generic.Stack.Enumerator<object>
+	// System.Collections.Generic.Stack<Jace.Tokenizer.Token>
+	// System.Collections.Generic.Stack<int>
+	// System.Collections.Generic.Stack<object>
+	// System.Collections.Generic.ValueListBuilder<int>
+	// System.Collections.ObjectModel.ReadOnlyCollection<HourMinute>
+	// System.Collections.ObjectModel.ReadOnlyCollection<InGameDownLoad.Reward>
+	// System.Collections.ObjectModel.ReadOnlyCollection<Int2>
+	// System.Collections.ObjectModel.ReadOnlyCollection<Item>
+	// System.Collections.ObjectModel.ReadOnlyCollection<Jace.Execution.ParameterInfo>
+	// System.Collections.ObjectModel.ReadOnlyCollection<Jace.Tokenizer.Token>
+	// System.Collections.ObjectModel.ReadOnlyCollection<LanguageVerify.MatchString>
+	// System.Collections.ObjectModel.ReadOnlyCollection<OperationTime>
+	// System.Collections.ObjectModel.ReadOnlyCollection<RoleParticularModel.AlchemyDrug>
+	// System.Collections.ObjectModel.ReadOnlyCollection<RoleParticularModel.HorseInfo>
+	// System.Collections.ObjectModel.ReadOnlyCollection<RoleParticularModel.PetInfo>
+	// System.Collections.ObjectModel.ReadOnlyCollection<ServerData>
+	// System.Collections.ObjectModel.ReadOnlyCollection<ServerDataCouple>
+	// System.Collections.ObjectModel.ReadOnlyCollection<ShopItemInfo>
+	// System.Collections.ObjectModel.ReadOnlyCollection<System.Collections.Generic.KeyValuePair<object,object>>
+	// System.Collections.ObjectModel.ReadOnlyCollection<TimeMgr.Syntony>
+	// System.Collections.ObjectModel.ReadOnlyCollection<UnityEngine.EventSystems.RaycastResult>
+	// System.Collections.ObjectModel.ReadOnlyCollection<UnityEngine.Rect>
+	// System.Collections.ObjectModel.ReadOnlyCollection<UnityEngine.UIVertex>
+	// System.Collections.ObjectModel.ReadOnlyCollection<UnityEngine.Vector3>
+	// System.Collections.ObjectModel.ReadOnlyCollection<WindowConfig.OrderTable>
+	// System.Collections.ObjectModel.ReadOnlyCollection<double>
+	// System.Collections.ObjectModel.ReadOnlyCollection<int>
+	// System.Collections.ObjectModel.ReadOnlyCollection<long>
+	// System.Collections.ObjectModel.ReadOnlyCollection<object>
+	// System.Collections.ObjectModel.ReadOnlyCollection<uint>
+	// System.Collections.ObjectModel.ReadOnlyCollection<ulong>
+	// System.Collections.ObjectModel.ReadOnlyCollection<ushort>
+	// System.Comparison<HourMinute>
+	// System.Comparison<InGameDownLoad.Reward>
+	// System.Comparison<Int2>
+	// System.Comparison<Item>
+	// System.Comparison<Jace.Execution.ParameterInfo>
+	// System.Comparison<Jace.Tokenizer.Token>
+	// System.Comparison<LanguageVerify.MatchString>
+	// System.Comparison<OperationTime>
+	// System.Comparison<RoleParticularModel.AlchemyDrug>
+	// System.Comparison<RoleParticularModel.HorseInfo>
+	// System.Comparison<RoleParticularModel.PetInfo>
+	// System.Comparison<ServerData>
+	// System.Comparison<ServerDataCouple>
+	// System.Comparison<ShopItemInfo>
+	// System.Comparison<System.Collections.Generic.KeyValuePair<object,object>>
+	// System.Comparison<TimeMgr.Syntony>
+	// System.Comparison<UnityEngine.EventSystems.RaycastResult>
+	// System.Comparison<UnityEngine.Rect>
+	// System.Comparison<UnityEngine.UIVertex>
+	// System.Comparison<UnityEngine.Vector3>
+	// System.Comparison<WindowConfig.OrderTable>
+	// System.Comparison<double>
+	// System.Comparison<int>
+	// System.Comparison<long>
+	// System.Comparison<object>
+	// System.Comparison<uint>
+	// System.Comparison<ulong>
+	// System.Comparison<ushort>
+	// System.Dynamic.Utils.CacheDict.Entry<object,object>
+	// System.Dynamic.Utils.CacheDict<object,object>
+	// System.Func<Cysharp.Threading.Tasks.UniTask>
+	// System.Func<Jace.Execution.ParameterInfo,byte>
+	// System.Func<System.Collections.Generic.KeyValuePair<object,double>,byte>
+	// System.Func<System.Collections.Generic.KeyValuePair<object,object>,byte>
+	// System.Func<System.Collections.Generic.KeyValuePair<object,object>,long>
+	// System.Func<System.Collections.Generic.KeyValuePair<object,object>,object>
+	// System.Func<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>
+	// System.Func<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>
+	// System.Func<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>
+	// System.Func<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>
+	// System.Func<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>
+	// System.Func<System.ValueTuple<byte,System.ValueTuple<byte,object>>>
+	// System.Func<System.ValueTuple<byte,object>>
+	// System.Func<byte,object,byte>
+	// System.Func<byte>
+	// System.Func<double,byte>
+	// System.Func<double,double,double,double,double,double,double,double,double,double,double,double,double,double,double,double,double>
+	// System.Func<double,double,double,double,double,double,double,double,double,double,double,double,double,double,double,double>
+	// System.Func<double,double,double,double,double,double,double,double,double,double,double,double,double,double,double>
+	// System.Func<double,double,double,double,double,double,double,double,double,double,double,double,double,double>
+	// System.Func<double,double,double,double,double,double,double,double,double,double,double,double,double>
+	// System.Func<double,double,double,double,double,double,double,double,double,double,double,double>
+	// System.Func<double,double,double,double,double,double,double,double,double,double,double>
+	// System.Func<double,double,double,double,double,double,double,double,double,double>
+	// System.Func<double,double,double,double,double,double,double,double,double>
+	// System.Func<double,double,double,double,double,double,double,double>
+	// System.Func<double,double,double,double,double,double,double>
+	// System.Func<double,double,double,double,double,double>
+	// System.Func<double,double,double,double,double>
+	// System.Func<double,double,double,double>
+	// System.Func<double,double,double>
+	// System.Func<double,double>
+	// System.Func<double,object>
+	// System.Func<double>
+	// System.Func<float>
+	// System.Func<int,byte>
+	// System.Func<int,object>
+	// System.Func<int>
+	// System.Func<object,System.DateTime>
+	// System.Func<object,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>
+	// System.Func<object,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>
+	// System.Func<object,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>
+	// System.Func<object,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>
+	// System.Func<object,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>
+	// System.Func<object,System.ValueTuple<byte,System.ValueTuple<byte,object>>>
+	// System.Func<object,System.ValueTuple<byte,object>>
+	// System.Func<object,byte>
+	// System.Func<object,double>
+	// System.Func<object,int>
+	// System.Func<object,object,byte,object,object>
+	// System.Func<object,object,byte>
+	// System.Func<object,object,double>
+	// System.Func<object,object,object>
+	// System.Func<object,object>
+	// System.Func<object>
+	// System.IComparable<double>
+	// System.IComparable<object>
+	// System.Linq.Buffer<Jace.Execution.ParameterInfo>
+	// System.Linq.Buffer<System.Collections.Generic.KeyValuePair<object,object>>
+	// System.Linq.Buffer<object>
+	// System.Linq.Enumerable.<CastIterator>d__99<object>
+	// System.Linq.Enumerable.<DistinctIterator>d__68<int>
+	// System.Linq.Enumerable.<TakeIterator>d__25<object>
+	// System.Linq.Enumerable.Iterator<System.Collections.Generic.KeyValuePair<object,object>>
+	// System.Linq.Enumerable.Iterator<double>
+	// System.Linq.Enumerable.Iterator<int>
+	// System.Linq.Enumerable.Iterator<object>
+	// System.Linq.Enumerable.WhereArrayIterator<System.Collections.Generic.KeyValuePair<object,object>>
+	// System.Linq.Enumerable.WhereArrayIterator<object>
+	// System.Linq.Enumerable.WhereEnumerableIterator<System.Collections.Generic.KeyValuePair<object,object>>
+	// System.Linq.Enumerable.WhereEnumerableIterator<double>
+	// System.Linq.Enumerable.WhereEnumerableIterator<int>
+	// System.Linq.Enumerable.WhereEnumerableIterator<object>
+	// System.Linq.Enumerable.WhereListIterator<System.Collections.Generic.KeyValuePair<object,object>>
+	// System.Linq.Enumerable.WhereListIterator<object>
+	// System.Linq.Enumerable.WhereSelectArrayIterator<System.Collections.Generic.KeyValuePair<object,object>,object>
+	// System.Linq.Enumerable.WhereSelectArrayIterator<double,object>
+	// System.Linq.Enumerable.WhereSelectArrayIterator<int,object>
+	// System.Linq.Enumerable.WhereSelectArrayIterator<object,double>
+	// System.Linq.Enumerable.WhereSelectArrayIterator<object,int>
+	// System.Linq.Enumerable.WhereSelectArrayIterator<object,object>
+	// System.Linq.Enumerable.WhereSelectEnumerableIterator<System.Collections.Generic.KeyValuePair<object,object>,object>
+	// System.Linq.Enumerable.WhereSelectEnumerableIterator<double,object>
+	// System.Linq.Enumerable.WhereSelectEnumerableIterator<int,object>
+	// System.Linq.Enumerable.WhereSelectEnumerableIterator<object,double>
+	// System.Linq.Enumerable.WhereSelectEnumerableIterator<object,int>
+	// System.Linq.Enumerable.WhereSelectEnumerableIterator<object,object>
+	// System.Linq.Enumerable.WhereSelectListIterator<System.Collections.Generic.KeyValuePair<object,object>,object>
+	// System.Linq.Enumerable.WhereSelectListIterator<double,object>
+	// System.Linq.Enumerable.WhereSelectListIterator<int,object>
+	// System.Linq.Enumerable.WhereSelectListIterator<object,double>
+	// System.Linq.Enumerable.WhereSelectListIterator<object,int>
+	// System.Linq.Enumerable.WhereSelectListIterator<object,object>
+	// System.Linq.EnumerableSorter<System.Collections.Generic.KeyValuePair<object,object>,long>
+	// System.Linq.EnumerableSorter<System.Collections.Generic.KeyValuePair<object,object>>
+	// System.Linq.EnumerableSorter<object,System.DateTime>
+	// System.Linq.EnumerableSorter<object>
+	// System.Linq.Expressions.Expression<object>
+	// System.Linq.OrderedEnumerable.<GetEnumerator>d__1<System.Collections.Generic.KeyValuePair<object,object>>
+	// System.Linq.OrderedEnumerable.<GetEnumerator>d__1<object>
+	// System.Linq.OrderedEnumerable<System.Collections.Generic.KeyValuePair<object,object>,long>
+	// System.Linq.OrderedEnumerable<System.Collections.Generic.KeyValuePair<object,object>>
+	// System.Linq.OrderedEnumerable<object,System.DateTime>
+	// System.Linq.OrderedEnumerable<object>
+	// System.Linq.Set<int>
+	// System.Nullable<CellInfo>
+	// System.Nullable<ChatExtraData>
+	// System.Nullable<Jace.Tokenizer.Token>
+	// System.Nullable<UnityEngine.Color>
+	// System.Nullable<int>
+	// System.Nullable<object>
+	// System.Predicate<HourMinute>
+	// System.Predicate<InGameDownLoad.Reward>
+	// System.Predicate<Int2>
+	// System.Predicate<Item>
+	// System.Predicate<Jace.Execution.ParameterInfo>
+	// System.Predicate<Jace.Tokenizer.Token>
+	// System.Predicate<LanguageVerify.MatchString>
+	// System.Predicate<OperationTime>
+	// System.Predicate<RoleParticularModel.AlchemyDrug>
+	// System.Predicate<RoleParticularModel.HorseInfo>
+	// System.Predicate<RoleParticularModel.PetInfo>
+	// System.Predicate<ServerData>
+	// System.Predicate<ServerDataCouple>
+	// System.Predicate<ShopItemInfo>
+	// System.Predicate<System.Collections.Generic.KeyValuePair<object,object>>
+	// System.Predicate<TimeMgr.Syntony>
+	// System.Predicate<UnityEngine.EventSystems.RaycastResult>
+	// System.Predicate<UnityEngine.Rect>
+	// System.Predicate<UnityEngine.UIVertex>
+	// System.Predicate<UnityEngine.Vector3>
+	// System.Predicate<WindowConfig.OrderTable>
+	// System.Predicate<double>
+	// System.Predicate<int>
+	// System.Predicate<long>
+	// System.Predicate<object>
+	// System.Predicate<uint>
+	// System.Predicate<ulong>
+	// System.Predicate<ushort>
+	// System.ReadOnlySpan<UnityEngine.jvalue>
+	// System.ReadOnlySpan<int>
+	// System.Runtime.CompilerServices.AsyncTaskMethodBuilder<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>>
+	// System.Runtime.CompilerServices.AsyncTaskMethodBuilder<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>
+	// System.Runtime.CompilerServices.AsyncTaskMethodBuilder<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>
+	// System.Runtime.CompilerServices.AsyncTaskMethodBuilder<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>
+	// System.Runtime.CompilerServices.AsyncTaskMethodBuilder<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>
+	// System.Runtime.CompilerServices.AsyncTaskMethodBuilder<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>
+	// System.Runtime.CompilerServices.AsyncTaskMethodBuilder<System.ValueTuple<byte,System.ValueTuple<byte,object>>>
+	// System.Runtime.CompilerServices.AsyncTaskMethodBuilder<System.ValueTuple<byte,object>>
+	// System.Runtime.CompilerServices.AsyncTaskMethodBuilder<object>
+	// System.Runtime.CompilerServices.ConfiguredTaskAwaitable.ConfiguredTaskAwaiter<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>
+	// System.Runtime.CompilerServices.ConfiguredTaskAwaitable.ConfiguredTaskAwaiter<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>
+	// System.Runtime.CompilerServices.ConfiguredTaskAwaitable.ConfiguredTaskAwaiter<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>
+	// System.Runtime.CompilerServices.ConfiguredTaskAwaitable.ConfiguredTaskAwaiter<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>
+	// System.Runtime.CompilerServices.ConfiguredTaskAwaitable.ConfiguredTaskAwaiter<System.ValueTuple<byte,System.ValueTuple<byte,object>>>
+	// System.Runtime.CompilerServices.ConfiguredTaskAwaitable.ConfiguredTaskAwaiter<System.ValueTuple<byte,object>>
+	// System.Runtime.CompilerServices.ConfiguredTaskAwaitable.ConfiguredTaskAwaiter<object>
+	// System.Runtime.CompilerServices.ConfiguredTaskAwaitable<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>
+	// System.Runtime.CompilerServices.ConfiguredTaskAwaitable<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>
+	// System.Runtime.CompilerServices.ConfiguredTaskAwaitable<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>
+	// System.Runtime.CompilerServices.ConfiguredTaskAwaitable<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>
+	// System.Runtime.CompilerServices.ConfiguredTaskAwaitable<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>
+	// System.Runtime.CompilerServices.ConfiguredTaskAwaitable<System.ValueTuple<byte,System.ValueTuple<byte,object>>>
+	// System.Runtime.CompilerServices.ConfiguredTaskAwaitable<System.ValueTuple<byte,object>>
+	// System.Runtime.CompilerServices.ConfiguredTaskAwaitable<object>
+	// System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable.ConfiguredValueTaskAwaiter<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>
+	// System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable.ConfiguredValueTaskAwaiter<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>
+	// System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable.ConfiguredValueTaskAwaiter<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>
+	// System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable.ConfiguredValueTaskAwaiter<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>
+	// System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable.ConfiguredValueTaskAwaiter<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>
+	// System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable.ConfiguredValueTaskAwaiter<System.ValueTuple<byte,System.ValueTuple<byte,object>>>
+	// System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable.ConfiguredValueTaskAwaiter<System.ValueTuple<byte,object>>
+	// System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable.ConfiguredValueTaskAwaiter<object>
+	// System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>>
+	// System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>
+	// System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>
+	// System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>
+	// System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>
+	// System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>
+	// System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable<System.ValueTuple<byte,System.ValueTuple<byte,object>>>
+	// System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable<System.ValueTuple<byte,object>>
+	// System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable<object>
+	// System.Runtime.CompilerServices.ReadOnlyCollectionBuilder.Enumerator<object>
+	// System.Runtime.CompilerServices.ReadOnlyCollectionBuilder<object>
+	// System.Runtime.CompilerServices.TaskAwaiter<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>
+	// System.Runtime.CompilerServices.TaskAwaiter<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>
+	// System.Runtime.CompilerServices.TaskAwaiter<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>
+	// System.Runtime.CompilerServices.TaskAwaiter<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>
+	// System.Runtime.CompilerServices.TaskAwaiter<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>
+	// System.Runtime.CompilerServices.TaskAwaiter<System.ValueTuple<byte,System.ValueTuple<byte,object>>>
+	// System.Runtime.CompilerServices.TaskAwaiter<System.ValueTuple<byte,object>>
+	// System.Runtime.CompilerServices.TaskAwaiter<object>
+	// System.Runtime.CompilerServices.TrueReadOnlyCollection<object>
+	// System.Runtime.CompilerServices.ValueTaskAwaiter<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>>
+	// System.Runtime.CompilerServices.ValueTaskAwaiter<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>
+	// System.Runtime.CompilerServices.ValueTaskAwaiter<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>
+	// System.Runtime.CompilerServices.ValueTaskAwaiter<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>
+	// System.Runtime.CompilerServices.ValueTaskAwaiter<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>
+	// System.Runtime.CompilerServices.ValueTaskAwaiter<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>
+	// System.Runtime.CompilerServices.ValueTaskAwaiter<System.ValueTuple<byte,System.ValueTuple<byte,object>>>
+	// System.Runtime.CompilerServices.ValueTaskAwaiter<System.ValueTuple<byte,object>>
+	// System.Runtime.CompilerServices.ValueTaskAwaiter<object>
+	// System.Span<UnityEngine.jvalue>
+	// System.Span<int>
+	// System.Threading.Tasks.ContinuationTaskFromResultTask<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>
+	// System.Threading.Tasks.ContinuationTaskFromResultTask<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>
+	// System.Threading.Tasks.ContinuationTaskFromResultTask<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>
+	// System.Threading.Tasks.ContinuationTaskFromResultTask<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>
+	// System.Threading.Tasks.ContinuationTaskFromResultTask<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>
+	// System.Threading.Tasks.ContinuationTaskFromResultTask<System.ValueTuple<byte,System.ValueTuple<byte,object>>>
+	// System.Threading.Tasks.ContinuationTaskFromResultTask<System.ValueTuple<byte,object>>
+	// System.Threading.Tasks.ContinuationTaskFromResultTask<object>
+	// System.Threading.Tasks.Sources.IValueTaskSource<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>>
+	// System.Threading.Tasks.Sources.IValueTaskSource<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>
+	// System.Threading.Tasks.Sources.IValueTaskSource<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>
+	// System.Threading.Tasks.Sources.IValueTaskSource<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>
+	// System.Threading.Tasks.Sources.IValueTaskSource<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>
+	// System.Threading.Tasks.Sources.IValueTaskSource<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>
+	// System.Threading.Tasks.Sources.IValueTaskSource<System.ValueTuple<byte,System.ValueTuple<byte,object>>>
+	// System.Threading.Tasks.Sources.IValueTaskSource<System.ValueTuple<byte,object>>
+	// System.Threading.Tasks.Sources.IValueTaskSource<object>
+	// System.Threading.Tasks.Task<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>>
+	// System.Threading.Tasks.Task<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>
+	// System.Threading.Tasks.Task<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>
+	// System.Threading.Tasks.Task<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>
+	// System.Threading.Tasks.Task<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>
+	// System.Threading.Tasks.Task<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>
+	// System.Threading.Tasks.Task<System.ValueTuple<byte,System.ValueTuple<byte,object>>>
+	// System.Threading.Tasks.Task<System.ValueTuple<byte,object>>
+	// System.Threading.Tasks.Task<object>
+	// System.Threading.Tasks.TaskFactory.<>c__DisplayClass35_0<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>
+	// System.Threading.Tasks.TaskFactory.<>c__DisplayClass35_0<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>
+	// System.Threading.Tasks.TaskFactory.<>c__DisplayClass35_0<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>
+	// System.Threading.Tasks.TaskFactory.<>c__DisplayClass35_0<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>
+	// System.Threading.Tasks.TaskFactory.<>c__DisplayClass35_0<System.ValueTuple<byte,System.ValueTuple<byte,object>>>
+	// System.Threading.Tasks.TaskFactory.<>c__DisplayClass35_0<System.ValueTuple<byte,object>>
+	// System.Threading.Tasks.TaskFactory.<>c__DisplayClass35_0<object>
+	// System.Threading.Tasks.TaskFactory<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>
+	// System.Threading.Tasks.TaskFactory<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>
+	// System.Threading.Tasks.TaskFactory<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>
+	// System.Threading.Tasks.TaskFactory<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>
+	// System.Threading.Tasks.TaskFactory<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>
+	// System.Threading.Tasks.TaskFactory<System.ValueTuple<byte,System.ValueTuple<byte,object>>>
+	// System.Threading.Tasks.TaskFactory<System.ValueTuple<byte,object>>
+	// System.Threading.Tasks.TaskFactory<object>
+	// System.Threading.Tasks.ValueTask.ValueTaskSourceAsTask.<>c<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>
+	// System.Threading.Tasks.ValueTask.ValueTaskSourceAsTask.<>c<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>
+	// System.Threading.Tasks.ValueTask.ValueTaskSourceAsTask.<>c<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>
+	// System.Threading.Tasks.ValueTask.ValueTaskSourceAsTask.<>c<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>
+	// System.Threading.Tasks.ValueTask.ValueTaskSourceAsTask.<>c<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>
+	// System.Threading.Tasks.ValueTask.ValueTaskSourceAsTask.<>c<System.ValueTuple<byte,System.ValueTuple<byte,object>>>
+	// System.Threading.Tasks.ValueTask.ValueTaskSourceAsTask.<>c<System.ValueTuple<byte,object>>
+	// System.Threading.Tasks.ValueTask.ValueTaskSourceAsTask.<>c<object>
+	// System.Threading.Tasks.ValueTask.ValueTaskSourceAsTask<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>>
+	// System.Threading.Tasks.ValueTask.ValueTaskSourceAsTask<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>
+	// System.Threading.Tasks.ValueTask.ValueTaskSourceAsTask<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>
+	// System.Threading.Tasks.ValueTask.ValueTaskSourceAsTask<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>
+	// System.Threading.Tasks.ValueTask.ValueTaskSourceAsTask<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>
+	// System.Threading.Tasks.ValueTask.ValueTaskSourceAsTask<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>
+	// System.Threading.Tasks.ValueTask.ValueTaskSourceAsTask<System.ValueTuple<byte,System.ValueTuple<byte,object>>>
+	// System.Threading.Tasks.ValueTask.ValueTaskSourceAsTask<System.ValueTuple<byte,object>>
+	// System.Threading.Tasks.ValueTask.ValueTaskSourceAsTask<object>
+	// System.Threading.Tasks.ValueTask<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>>>
+	// System.Threading.Tasks.ValueTask<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>>
+	// System.Threading.Tasks.ValueTask<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>
+	// System.Threading.Tasks.ValueTask<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>
+	// System.Threading.Tasks.ValueTask<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>
+	// System.Threading.Tasks.ValueTask<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>
+	// System.Threading.Tasks.ValueTask<System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>
+	// System.Threading.Tasks.ValueTask<System.ValueTuple<byte,System.ValueTuple<byte,object>>>
+	// System.Threading.Tasks.ValueTask<System.ValueTuple<byte,object>>
+	// System.Threading.Tasks.ValueTask<object>
+	// System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>>>
+	// System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>>
+	// System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>>
+	// System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>>
+	// System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>>
+	// System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>>
+	// System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>>
+	// System.ValueTuple<byte,System.ValueTuple<byte,System.ValueTuple<byte,object>>>
+	// System.ValueTuple<byte,System.ValueTuple<byte,object>>
+	// System.ValueTuple<byte,object>
+	// UnityEngine.EventSystems.ExecuteEvents.EventFunction<object>
+	// UnityEngine.Events.InvokableCall<UnityEngine.Vector2>
+	// UnityEngine.Events.InvokableCall<byte>
+	// UnityEngine.Events.InvokableCall<float>
+	// UnityEngine.Events.InvokableCall<int>
+	// UnityEngine.Events.InvokableCall<object>
+	// UnityEngine.Events.UnityAction<UnityEngine.Vector2>
+	// UnityEngine.Events.UnityAction<byte>
+	// UnityEngine.Events.UnityAction<float>
+	// UnityEngine.Events.UnityAction<int>
+	// UnityEngine.Events.UnityAction<object>
+	// UnityEngine.Events.UnityEvent<UnityEngine.Vector2>
+	// UnityEngine.Events.UnityEvent<byte>
+	// UnityEngine.Events.UnityEvent<float>
+	// UnityEngine.Events.UnityEvent<int>
+	// UnityEngine.Events.UnityEvent<object>
+	// UnityEngine.Pool.CollectionPool.<>c<object,object>
+	// UnityEngine.Pool.CollectionPool<object,object>
+	// }}
+
+	public void RefMethods()
+	{
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter,AdaptiveLayout.<Co_DelayShow>d__22>(Cysharp.Threading.Tasks.UniTask.Awaiter&,AdaptiveLayout.<Co_DelayShow>d__22&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter,AssetBundleUtility.<Co_DoLoadAsset>d__24>(Cysharp.Threading.Tasks.UniTask.Awaiter&,AssetBundleUtility.<Co_DoLoadAsset>d__24&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter,AssetBundleUtility.<Initialize>d__16>(Cysharp.Threading.Tasks.UniTask.Awaiter&,AssetBundleUtility.<Initialize>d__16&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter,ConfigManager.<InitConfigs>d__6>(Cysharp.Threading.Tasks.UniTask.Awaiter&,ConfigManager.<InitConfigs>d__6&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter,CyclicScroll.<Co_StepByStepAppear>d__68>(Cysharp.Threading.Tasks.UniTask.Awaiter&,CyclicScroll.<Co_StepByStepAppear>d__68&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter,DownLoadAndDiscompressTask.<Co_StartDownLoad>d__33>(Cysharp.Threading.Tasks.UniTask.Awaiter&,DownLoadAndDiscompressTask.<Co_StartDownLoad>d__33&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter,DownloadTask.<Co_DownloadFile>d__40>(Cysharp.Threading.Tasks.UniTask.Awaiter&,DownloadTask.<Co_DownloadFile>d__40&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter,DownloadTask.<Co_GetHeader>d__39>(Cysharp.Threading.Tasks.UniTask.Awaiter&,DownloadTask.<Co_GetHeader>d__39&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter,EffectPlayer.<PlayAsync>d__34>(Cysharp.Threading.Tasks.UniTask.Awaiter&,EffectPlayer.<PlayAsync>d__34&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter,EquipExchangeCell.<RefreshEffect>d__31>(Cysharp.Threading.Tasks.UniTask.Awaiter&,EquipExchangeCell.<RefreshEffect>d__31&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter,EquipTipWin.<RefreshEffect>d__21>(Cysharp.Threading.Tasks.UniTask.Awaiter&,EquipTipWin.<RefreshEffect>d__21&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter,GameObjectPoolManager.<CheckPoolUsage>d__13>(Cysharp.Threading.Tasks.UniTask.Awaiter&,GameObjectPoolManager.<CheckPoolUsage>d__13&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter,HeroCallResultCell.<DisplayAsync>d__7>(Cysharp.Threading.Tasks.UniTask.Awaiter&,HeroCallResultCell.<DisplayAsync>d__7&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter,HeroCallResultWin.<MoveToNextState>d__35>(Cysharp.Threading.Tasks.UniTask.Awaiter&,HeroCallResultWin.<MoveToNextState>d__35&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter,HeroGiftWashWin.<SendPack>d__19>(Cysharp.Threading.Tasks.UniTask.Awaiter&,HeroGiftWashWin.<SendPack>d__19&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter,HeroPosWin.<RunTaskAsync>d__46>(Cysharp.Threading.Tasks.UniTask.Awaiter&,HeroPosWin.<RunTaskAsync>d__46&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter,HeroScenePosCell.<DelayShow>d__13>(Cysharp.Threading.Tasks.UniTask.Awaiter&,HeroScenePosCell.<DelayShow>d__13&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter,LayoutElementSizeClamp.<UpdateRect>d__9>(Cysharp.Threading.Tasks.UniTask.Awaiter&,LayoutElementSizeClamp.<UpdateRect>d__9&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter,SmallTipWin.<UpdatePos>d__10>(Cysharp.Threading.Tasks.UniTask.Awaiter&,SmallTipWin.<UpdatePos>d__10&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter,StageManager.<OnLoading>d__9>(Cysharp.Threading.Tasks.UniTask.Awaiter&,StageManager.<OnLoading>d__9&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter,SystemSetting.<Co_WaitFewMinute>d__35>(Cysharp.Threading.Tasks.UniTask.Awaiter&,SystemSetting.<Co_WaitFewMinute>d__35&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter,UIBase.<ApplyClickEmptySpaceClose>d__34>(Cysharp.Threading.Tasks.UniTask.Awaiter&,UIBase.<ApplyClickEmptySpaceClose>d__34&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter,UniTaskExtension.<DelayFrameInternal>d__2>(Cysharp.Threading.Tasks.UniTask.Awaiter&,UniTaskExtension.<DelayFrameInternal>d__2&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter,UniTaskExtension.<DelayTimeInternal>d__8>(Cysharp.Threading.Tasks.UniTask.Awaiter&,UniTaskExtension.<DelayTimeInternal>d__8&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter<object>,AssetBundleUtility.<Co_DoLoadAsset>d__23>(Cysharp.Threading.Tasks.UniTask.Awaiter<object>&,AssetBundleUtility.<Co_DoLoadAsset>d__23&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter<object>,AssetBundleUtility.<Co_LoadAssetBundleDependenice>d__22>(Cysharp.Threading.Tasks.UniTask.Awaiter<object>&,AssetBundleUtility.<Co_LoadAssetBundleDependenice>d__22&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter<object>,AssetBundleUtility.<Initialize>d__16>(Cysharp.Threading.Tasks.UniTask.Awaiter<object>&,AssetBundleUtility.<Initialize>d__16&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UnityAsyncExtensions.AssetBundleRequestAwaiter,AssetBundleUtility.<Co_DoLoadAsset>d__23>(Cysharp.Threading.Tasks.UnityAsyncExtensions.AssetBundleRequestAwaiter&,AssetBundleUtility.<Co_DoLoadAsset>d__23&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UnityAsyncExtensions.UnityWebRequestAsyncOperationAwaiter,DownloadTask.<Co_GetHeader>d__39>(Cysharp.Threading.Tasks.UnityAsyncExtensions.UnityWebRequestAsyncOperationAwaiter&,DownloadTask.<Co_GetHeader>d__39&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.YieldAwaitable.Awaiter,AssetBundleUtility.<Co_DoLoadAsset>d__23>(Cysharp.Threading.Tasks.YieldAwaitable.Awaiter&,AssetBundleUtility.<Co_DoLoadAsset>d__23&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.YieldAwaitable.Awaiter,ChatCenter.<Co_CheckAfterCollect>d__59>(Cysharp.Threading.Tasks.YieldAwaitable.Awaiter&,ChatCenter.<Co_CheckAfterCollect>d__59&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.YieldAwaitable.Awaiter,ChatSendComponent.<Co_ClientBan>d__32>(Cysharp.Threading.Tasks.YieldAwaitable.Awaiter&,ChatSendComponent.<Co_ClientBan>d__32&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.YieldAwaitable.Awaiter,EquipOnMainUI.<FlyToEquipCell>d__12>(Cysharp.Threading.Tasks.YieldAwaitable.Awaiter&,EquipOnMainUI.<FlyToEquipCell>d__12&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.YieldAwaitable.Awaiter,Main.<InitManagers>d__4>(Cysharp.Threading.Tasks.YieldAwaitable.Awaiter&,Main.<InitManagers>d__4&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.YieldAwaitable.Awaiter,ServerTipDetails.<Co_StageLoadFinish>d__4>(Cysharp.Threading.Tasks.YieldAwaitable.Awaiter&,ServerTipDetails.<Co_StageLoadFinish>d__4&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.YieldAwaitable.Awaiter,StageManager.<OnLoading>d__9>(Cysharp.Threading.Tasks.YieldAwaitable.Awaiter&,StageManager.<OnLoading>d__9&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.YieldAwaitable.Awaiter,SysNotifyMgr.<Co_Instance>d__11>(Cysharp.Threading.Tasks.YieldAwaitable.Awaiter&,SysNotifyMgr.<Co_Instance>d__11&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder<object>.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter,AssetBundleUtility.<Co_LoadAssetBundle>d__21>(Cysharp.Threading.Tasks.UniTask.Awaiter&,AssetBundleUtility.<Co_LoadAssetBundle>d__21&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder<object>.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UnityAsyncExtensions.AssetBundleCreateRequestAwaiter,AssetBundleUtility.<Co_LoadAssetBundle>d__21>(Cysharp.Threading.Tasks.UnityAsyncExtensions.AssetBundleCreateRequestAwaiter&,AssetBundleUtility.<Co_LoadAssetBundle>d__21&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder<object>.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.YieldAwaitable.Awaiter,AssetBundleUtility.<Co_LoadAssetBundle>d__21>(Cysharp.Threading.Tasks.YieldAwaitable.Awaiter&,AssetBundleUtility.<Co_LoadAssetBundle>d__21&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<AdaptiveLayout.<Co_DelayShow>d__22>(AdaptiveLayout.<Co_DelayShow>d__22&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<AssetBundleUtility.<Co_DoLoadAsset>d__23>(AssetBundleUtility.<Co_DoLoadAsset>d__23&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<AssetBundleUtility.<Co_DoLoadAsset>d__24>(AssetBundleUtility.<Co_DoLoadAsset>d__24&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<AssetBundleUtility.<Co_LoadAssetBundleDependenice>d__22>(AssetBundleUtility.<Co_LoadAssetBundleDependenice>d__22&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<AssetBundleUtility.<Co_LoadMainfestFile>d__17>(AssetBundleUtility.<Co_LoadMainfestFile>d__17&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<AssetBundleUtility.<Initialize>d__16>(AssetBundleUtility.<Initialize>d__16&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<ChatCenter.<Co_CheckAfterCollect>d__59>(ChatCenter.<Co_CheckAfterCollect>d__59&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<ChatSendComponent.<Co_ClientBan>d__32>(ChatSendComponent.<Co_ClientBan>d__32&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<ConfigManager.<InitConfigs>d__6>(ConfigManager.<InitConfigs>d__6&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<ConfigManager.<LoadConfig>d__9<object>>(ConfigManager.<LoadConfig>d__9<object>&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<ConfigManager.<LoadConfigs>d__7>(ConfigManager.<LoadConfigs>d__7&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<CyclicScroll.<Co_StepByStepAppear>d__68>(CyclicScroll.<Co_StepByStepAppear>d__68&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<DownLoadAndDiscompressTask.<Co_StartDownLoad>d__33>(DownLoadAndDiscompressTask.<Co_StartDownLoad>d__33&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<DownloadTask.<Co_DownloadFile>d__40>(DownloadTask.<Co_DownloadFile>d__40&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<DownloadTask.<Co_GetHeader>d__39>(DownloadTask.<Co_GetHeader>d__39&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<DownloadTask.<Move>d__41>(DownloadTask.<Move>d__41&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<EffectPlayer.<PlayAsync>d__34>(EffectPlayer.<PlayAsync>d__34&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<EquipExchangeCell.<RefreshEffect>d__31>(EquipExchangeCell.<RefreshEffect>d__31&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<EquipOnMainUI.<FlyToEquipCell>d__12>(EquipOnMainUI.<FlyToEquipCell>d__12&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<EquipTipWin.<RefreshEffect>d__21>(EquipTipWin.<RefreshEffect>d__21&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<GameObjectPoolManager.<CheckPoolUsage>d__13>(GameObjectPoolManager.<CheckPoolUsage>d__13&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<HeroCallResultCell.<DisplayAsync>d__7>(HeroCallResultCell.<DisplayAsync>d__7&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<HeroCallResultWin.<MoveToNextState>d__35>(HeroCallResultWin.<MoveToNextState>d__35&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<HeroGiftWashWin.<SendPack>d__19>(HeroGiftWashWin.<SendPack>d__19&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<HeroPosWin.<RunTaskAsync>d__46>(HeroPosWin.<RunTaskAsync>d__46&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<HeroScenePosCell.<DelayShow>d__13>(HeroScenePosCell.<DelayShow>d__13&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<LayoutElementSizeClamp.<UpdateRect>d__9>(LayoutElementSizeClamp.<UpdateRect>d__9&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<Main.<InitManagers>d__4>(Main.<InitManagers>d__4&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<ServerTipDetails.<Co_StageLoadFinish>d__4>(ServerTipDetails.<Co_StageLoadFinish>d__4&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<SmallTipWin.<UpdatePos>d__10>(SmallTipWin.<UpdatePos>d__10&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<StageManager.<OnLoading>d__9>(StageManager.<OnLoading>d__9&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<SysNotifyMgr.<Co_Instance>d__11>(SysNotifyMgr.<Co_Instance>d__11&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<SystemSetting.<Co_WaitFewMinute>d__35>(SystemSetting.<Co_WaitFewMinute>d__35&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<UIBase.<ApplyClickEmptySpaceClose>d__34>(UIBase.<ApplyClickEmptySpaceClose>d__34&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<UniTaskExtension.<DelayFrameInternal>d__2>(UniTaskExtension.<DelayFrameInternal>d__2&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder.Start<UniTaskExtension.<DelayTimeInternal>d__8>(UniTaskExtension.<DelayTimeInternal>d__8&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder<object>.Start<AssetBundleUtility.<Co_LoadAssetBundle>d__21>(AssetBundleUtility.<Co_LoadAssetBundle>d__21&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskVoidMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter,StageManager.<ToGameScene>d__8>(Cysharp.Threading.Tasks.UniTask.Awaiter&,StageManager.<ToGameScene>d__8&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskVoidMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter,StageManager.<ToLoginScene>d__6>(Cysharp.Threading.Tasks.UniTask.Awaiter&,StageManager.<ToLoginScene>d__6&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskVoidMethodBuilder.Start<StageManager.<ToGameScene>d__8>(StageManager.<ToGameScene>d__8&)
+		// System.Void Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskVoidMethodBuilder.Start<StageManager.<ToLoginScene>d__6>(StageManager.<ToLoginScene>d__6&)
+		// object DG.Tweening.TweenExtensions.Pause<object>(object)
+		// object DG.Tweening.TweenExtensions.Play<object>(object)
+		// object DG.Tweening.TweenSettingsExtensions.OnComplete<object>(object,DG.Tweening.TweenCallback)
+		// object DG.Tweening.TweenSettingsExtensions.SetEase<object>(object,DG.Tweening.Ease)
+		// object DG.Tweening.TweenSettingsExtensions.SetEase<object>(object,UnityEngine.AnimationCurve)
+		// ItemTipUtility.CustomItemPlus LitJson.JsonMapper.ToObject<ItemTipUtility.CustomItemPlus>(string)
+		// LocalChatHistory.LocalChat LitJson.JsonMapper.ToObject<LocalChatHistory.LocalChat>(string)
+		// LocalChatHistory.LocalFriendChat LitJson.JsonMapper.ToObject<LocalChatHistory.LocalFriendChat>(string)
+		// UnityEngine.Vector2 LitJson.JsonMapper.ToObject<UnityEngine.Vector2>(string)
+		// object LitJson.JsonMapper.ToObject<object>(string)
+		// object System.Activator.CreateInstance<object>()
+		// object[] System.Array.Empty<object>()
+		// int System.Array.IndexOf<int>(int[],int)
+		// int System.Array.IndexOf<object>(object[],object)
+		// int System.Array.IndexOfImpl<int>(int[],int,int,int)
+		// int System.Array.IndexOfImpl<object>(object[],object,int,int)
+		// System.Void System.Array.Resize<byte>(byte[]&,int)
+		// System.Void System.Array.Resize<int>(int[]&,int)
+		// System.Void System.Array.Resize<uint>(uint[]&,int)
+		// System.Void System.Array.Sort<object>(object[],System.Comparison<object>)
+		// System.Collections.ObjectModel.ReadOnlyCollection<object> System.Dynamic.Utils.CollectionExtensions.ToReadOnly<object>(System.Collections.Generic.IEnumerable<object>)
+		// int System.Enum.Parse<int>(string)
+		// int System.Enum.Parse<int>(string,bool)
+		// bool System.Linq.Enumerable.All<int>(System.Collections.Generic.IEnumerable<int>,System.Func<int,bool>)
+		// bool System.Linq.Enumerable.All<object>(System.Collections.Generic.IEnumerable<object>,System.Func<object,bool>)
+		// bool System.Linq.Enumerable.Any<Jace.Execution.ParameterInfo>(System.Collections.Generic.IEnumerable<Jace.Execution.ParameterInfo>,System.Func<Jace.Execution.ParameterInfo,bool>)
+		// bool System.Linq.Enumerable.Any<System.Collections.Generic.KeyValuePair<object,double>>(System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<object,double>>,System.Func<System.Collections.Generic.KeyValuePair<object,double>,bool>)
+		// bool System.Linq.Enumerable.Any<object>(System.Collections.Generic.IEnumerable<object>)
+		// bool System.Linq.Enumerable.Any<object>(System.Collections.Generic.IEnumerable<object>,System.Func<object,bool>)
+		// System.Collections.Generic.IEnumerable<object> System.Linq.Enumerable.Cast<object>(System.Collections.IEnumerable)
+		// System.Collections.Generic.IEnumerable<object> System.Linq.Enumerable.CastIterator<object>(System.Collections.IEnumerable)
+		// bool System.Linq.Enumerable.Contains<int>(System.Collections.Generic.IEnumerable<int>,int)
+		// bool System.Linq.Enumerable.Contains<int>(System.Collections.Generic.IEnumerable<int>,int,System.Collections.Generic.IEqualityComparer<int>)
+		// int System.Linq.Enumerable.Count<object>(System.Collections.Generic.IEnumerable<object>,System.Func<object,bool>)
+		// System.Collections.Generic.IEnumerable<int> System.Linq.Enumerable.Distinct<int>(System.Collections.Generic.IEnumerable<int>)
+		// System.Collections.Generic.IEnumerable<int> System.Linq.Enumerable.DistinctIterator<int>(System.Collections.Generic.IEnumerable<int>,System.Collections.Generic.IEqualityComparer<int>)
+		// int System.Linq.Enumerable.First<int>(System.Collections.Generic.IEnumerable<int>)
+		// object System.Linq.Enumerable.First<object>(System.Collections.Generic.IEnumerable<object>)
+		// object System.Linq.Enumerable.FirstOrDefault<object>(System.Collections.Generic.IEnumerable<object>,System.Func<object,bool>)
+		// float System.Linq.Enumerable.Last<float>(System.Collections.Generic.IEnumerable<float>)
+		// int System.Linq.Enumerable.Last<int>(System.Collections.Generic.IEnumerable<int>)
+		// object System.Linq.Enumerable.Last<object>(System.Collections.Generic.IEnumerable<object>)
+		// System.Linq.IOrderedEnumerable<System.Collections.Generic.KeyValuePair<object,object>> System.Linq.Enumerable.OrderBy<System.Collections.Generic.KeyValuePair<object,object>,long>(System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<object,object>>,System.Func<System.Collections.Generic.KeyValuePair<object,object>,long>)
+		// System.Linq.IOrderedEnumerable<object> System.Linq.Enumerable.OrderByDescending<object,System.DateTime>(System.Collections.Generic.IEnumerable<object>,System.Func<object,System.DateTime>)
+		// System.Collections.Generic.IEnumerable<double> System.Linq.Enumerable.Select<object,double>(System.Collections.Generic.IEnumerable<object>,System.Func<object,double>)
+		// System.Collections.Generic.IEnumerable<int> System.Linq.Enumerable.Select<object,int>(System.Collections.Generic.IEnumerable<object>,System.Func<object,int>)
+		// System.Collections.Generic.IEnumerable<object> System.Linq.Enumerable.Select<System.Collections.Generic.KeyValuePair<object,object>,object>(System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<object,object>>,System.Func<System.Collections.Generic.KeyValuePair<object,object>,object>)
+		// System.Collections.Generic.IEnumerable<object> System.Linq.Enumerable.Select<double,object>(System.Collections.Generic.IEnumerable<double>,System.Func<double,object>)
+		// System.Collections.Generic.IEnumerable<object> System.Linq.Enumerable.Select<int,object>(System.Collections.Generic.IEnumerable<int>,System.Func<int,object>)
+		// System.Collections.Generic.IEnumerable<object> System.Linq.Enumerable.Select<object,object>(System.Collections.Generic.IEnumerable<object>,System.Func<object,object>)
+		// System.Collections.Generic.IEnumerable<object> System.Linq.Enumerable.Take<object>(System.Collections.Generic.IEnumerable<object>,int)
+		// System.Collections.Generic.IEnumerable<object> System.Linq.Enumerable.TakeIterator<object>(System.Collections.Generic.IEnumerable<object>,int)
+		// Jace.Execution.ParameterInfo[] System.Linq.Enumerable.ToArray<Jace.Execution.ParameterInfo>(System.Collections.Generic.IEnumerable<Jace.Execution.ParameterInfo>)
+		// object[] System.Linq.Enumerable.ToArray<object>(System.Collections.Generic.IEnumerable<object>)
+		// System.Collections.Generic.List<Item> System.Linq.Enumerable.ToList<Item>(System.Collections.Generic.IEnumerable<Item>)
+		// System.Collections.Generic.List<double> System.Linq.Enumerable.ToList<double>(System.Collections.Generic.IEnumerable<double>)
+		// System.Collections.Generic.List<int> System.Linq.Enumerable.ToList<int>(System.Collections.Generic.IEnumerable<int>)
+		// System.Collections.Generic.List<object> System.Linq.Enumerable.ToList<object>(System.Collections.Generic.IEnumerable<object>)
+		// System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<object,object>> System.Linq.Enumerable.Where<System.Collections.Generic.KeyValuePair<object,object>>(System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<object,object>>,System.Func<System.Collections.Generic.KeyValuePair<object,object>,bool>)
+		// System.Collections.Generic.IEnumerable<object> System.Linq.Enumerable.Where<object>(System.Collections.Generic.IEnumerable<object>,System.Func<object,bool>)
+		// System.Collections.Generic.IEnumerable<double> System.Linq.Enumerable.Iterator<object>.Select<double>(System.Func<object,double>)
+		// System.Collections.Generic.IEnumerable<int> System.Linq.Enumerable.Iterator<object>.Select<int>(System.Func<object,int>)
+		// System.Collections.Generic.IEnumerable<object> System.Linq.Enumerable.Iterator<System.Collections.Generic.KeyValuePair<object,object>>.Select<object>(System.Func<System.Collections.Generic.KeyValuePair<object,object>,object>)
+		// System.Collections.Generic.IEnumerable<object> System.Linq.Enumerable.Iterator<double>.Select<object>(System.Func<double,object>)
+		// System.Collections.Generic.IEnumerable<object> System.Linq.Enumerable.Iterator<int>.Select<object>(System.Func<int,object>)
+		// System.Collections.Generic.IEnumerable<object> System.Linq.Enumerable.Iterator<object>.Select<object>(System.Func<object,object>)
+		// System.Linq.Expressions.Expression<object> System.Linq.Expressions.Expression.Lambda<object>(System.Linq.Expressions.Expression,System.Linq.Expressions.ParameterExpression[])
+		// System.Linq.Expressions.Expression<object> System.Linq.Expressions.Expression.Lambda<object>(System.Linq.Expressions.Expression,bool,System.Collections.Generic.IEnumerable<System.Linq.Expressions.ParameterExpression>)
+		// System.Linq.Expressions.Expression<object> System.Linq.Expressions.Expression.Lambda<object>(System.Linq.Expressions.Expression,string,bool,System.Collections.Generic.IEnumerable<System.Linq.Expressions.ParameterExpression>)
+		// System.Void System.Runtime.CompilerServices.AsyncVoidMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter,DamageContent.<SetDamage>d__7>(Cysharp.Threading.Tasks.UniTask.Awaiter&,DamageContent.<SetDamage>d__7&)
+		// System.Void System.Runtime.CompilerServices.AsyncVoidMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter,GroupButtonExManager.<ExecuteNextFrame>d__10>(Cysharp.Threading.Tasks.UniTask.Awaiter&,GroupButtonExManager.<ExecuteNextFrame>d__10&)
+		// System.Void System.Runtime.CompilerServices.AsyncVoidMethodBuilder.AwaitUnsafeOnCompleted<Cysharp.Threading.Tasks.UniTask.Awaiter,UIBase.<ExecuteNextFrame>d__36>(Cysharp.Threading.Tasks.UniTask.Awaiter&,UIBase.<ExecuteNextFrame>d__36&)
+		// System.Void System.Runtime.CompilerServices.AsyncVoidMethodBuilder.Start<DamageContent.<SetDamage>d__7>(DamageContent.<SetDamage>d__7&)
+		// System.Void System.Runtime.CompilerServices.AsyncVoidMethodBuilder.Start<GroupButtonExManager.<ExecuteNextFrame>d__10>(GroupButtonExManager.<ExecuteNextFrame>d__10&)
+		// System.Void System.Runtime.CompilerServices.AsyncVoidMethodBuilder.Start<UIBase.<ExecuteNextFrame>d__36>(UIBase.<ExecuteNextFrame>d__36&)
+		// object& System.Runtime.CompilerServices.Unsafe.As<object,object>(object&)
+		// System.Void* System.Runtime.CompilerServices.Unsafe.AsPointer<object>(object&)
+		// object UnityEngine.AndroidJNIHelper.ConvertFromJNIArray<object>(System.IntPtr)
+		// System.IntPtr UnityEngine.AndroidJNIHelper.GetFieldID<object>(System.IntPtr,string,bool)
+		// System.IntPtr UnityEngine.AndroidJNIHelper.GetMethodID<object>(System.IntPtr,string,object[],bool)
+		// object UnityEngine.AndroidJavaObject.Call<object>(string,object[])
+		// object UnityEngine.AndroidJavaObject.FromJavaArrayDeleteLocalRef<object>(System.IntPtr)
+		// object UnityEngine.AndroidJavaObject.GetStatic<object>(string)
+		// object UnityEngine.AndroidJavaObject._Call<object>(System.IntPtr,object[])
+		// object UnityEngine.AndroidJavaObject._Call<object>(string,object[])
+		// object UnityEngine.AndroidJavaObject._GetStatic<object>(System.IntPtr)
+		// object UnityEngine.AndroidJavaObject._GetStatic<object>(string)
+		// object UnityEngine.AssetBundle.LoadAsset<object>(string)
+		// object UnityEngine.Component.GetComponent<object>()
+		// object UnityEngine.Component.GetComponentInChildren<object>()
+		// object UnityEngine.Component.GetComponentInChildren<object>(bool)
+		// object UnityEngine.Component.GetComponentInParent<object>()
+		// object[] UnityEngine.Component.GetComponents<object>()
+		// System.Void UnityEngine.Component.GetComponentsInChildren<object>(bool,System.Collections.Generic.List<object>)
+		// object[] UnityEngine.Component.GetComponentsInChildren<object>()
+		// object[] UnityEngine.Component.GetComponentsInChildren<object>(bool)
+		// bool UnityEngine.EventSystems.ExecuteEvents.Execute<object>(UnityEngine.GameObject,UnityEngine.EventSystems.BaseEventData,UnityEngine.EventSystems.ExecuteEvents.EventFunction<object>)
+		// System.Void UnityEngine.EventSystems.ExecuteEvents.GetEventList<object>(UnityEngine.GameObject,System.Collections.Generic.IList<UnityEngine.EventSystems.IEventSystemHandler>)
+		// bool UnityEngine.EventSystems.ExecuteEvents.ShouldSendToComponent<object>(UnityEngine.Component)
+		// object UnityEngine.GameObject.AddComponent<object>()
+		// object UnityEngine.GameObject.GetComponent<object>()
+		// object UnityEngine.GameObject.GetComponentInChildren<object>(bool)
+		// System.Void UnityEngine.GameObject.GetComponents<object>(System.Collections.Generic.List<object>)
+		// object[] UnityEngine.GameObject.GetComponents<object>()
+		// System.Void UnityEngine.GameObject.GetComponentsInChildren<object>(bool,System.Collections.Generic.List<object>)
+		// object[] UnityEngine.GameObject.GetComponentsInChildren<object>()
+		// object[] UnityEngine.GameObject.GetComponentsInChildren<object>(bool)
+		// object UnityEngine.JsonUtility.FromJson<object>(string)
+		// object UnityEngine.Object.Instantiate<object>(object)
+		// object UnityEngine.Object.Instantiate<object>(object,UnityEngine.Transform)
+		// object UnityEngine.Object.Instantiate<object>(object,UnityEngine.Transform,bool)
+		// object UnityEngine.Object.Instantiate<object>(object,UnityEngine.Vector3,UnityEngine.Quaternion)
+		// object UnityEngine.Resources.Load<object>(string)
+		// object UnityEngine.ScriptableObject.CreateInstance<object>()
+		// object UnityEngine._AndroidJNIHelper.ConvertFromJNIArray<object>(System.IntPtr)
+		// System.IntPtr UnityEngine._AndroidJNIHelper.GetFieldID<object>(System.IntPtr,string,bool)
+		// System.IntPtr UnityEngine._AndroidJNIHelper.GetMethodID<object>(System.IntPtr,string,object[],bool)
+		// string UnityEngine._AndroidJNIHelper.GetSignature<object>(object[])
+	}
+}
\ No newline at end of file
diff --git a/Assets/HybridCLRGenerate/AOTGenericReferences.cs.meta b/Assets/HybridCLRGenerate/AOTGenericReferences.cs.meta
new file mode 100644
index 0000000..17dffd7
--- /dev/null
+++ b/Assets/HybridCLRGenerate/AOTGenericReferences.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: dd39fcb67f4448749be12e722bac9035
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/HybridCLRGenerate/link.xml b/Assets/HybridCLRGenerate/link.xml
new file mode 100644
index 0000000..142f319
--- /dev/null
+++ b/Assets/HybridCLRGenerate/link.xml
@@ -0,0 +1,501 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<linker>
+  <assembly fullname="DOTween">
+    <type fullname="DG.Tweening.Core.DOGetter`1" preserve="all" />
+    <type fullname="DG.Tweening.Core.DOSetter`1" preserve="all" />
+    <type fullname="DG.Tweening.Core.TweenerCore`3" preserve="all" />
+    <type fullname="DG.Tweening.DOTween" preserve="all" />
+    <type fullname="DG.Tweening.DOVirtual" preserve="all" />
+    <type fullname="DG.Tweening.Ease" preserve="all" />
+    <type fullname="DG.Tweening.PathMode" preserve="all" />
+    <type fullname="DG.Tweening.PathType" preserve="all" />
+    <type fullname="DG.Tweening.Plugins.Core.PathCore.Path" preserve="all" />
+    <type fullname="DG.Tweening.Plugins.Options.ColorOptions" preserve="all" />
+    <type fullname="DG.Tweening.Plugins.Options.FloatOptions" preserve="all" />
+    <type fullname="DG.Tweening.Plugins.Options.PathOptions" preserve="all" />
+    <type fullname="DG.Tweening.Plugins.Options.StringOptions" preserve="all" />
+    <type fullname="DG.Tweening.Plugins.Options.VectorOptions" preserve="all" />
+    <type fullname="DG.Tweening.ScrambleMode" preserve="all" />
+    <type fullname="DG.Tweening.Sequence" preserve="all" />
+    <type fullname="DG.Tweening.ShortcutExtensions" preserve="all" />
+    <type fullname="DG.Tweening.Tween" preserve="all" />
+    <type fullname="DG.Tweening.TweenCallback" preserve="all" />
+    <type fullname="DG.Tweening.TweenCallback`1" preserve="all" />
+    <type fullname="DG.Tweening.TweenExtensions" preserve="all" />
+    <type fullname="DG.Tweening.TweenSettingsExtensions" preserve="all" />
+    <type fullname="DG.Tweening.Tweener" preserve="all" />
+  </assembly>
+  <assembly fullname="DOTween.Modules">
+    <type fullname="DG.Tweening.DOTweenModuleUI" preserve="all" />
+  </assembly>
+  <assembly fullname="Launch">
+    <type fullname="AssetSource" preserve="all" />
+    <type fullname="Clock" preserve="all" />
+    <type fullname="FileExtersion" preserve="all" />
+    <type fullname="HttpBehaviour" preserve="all" />
+    <type fullname="HttpRequest" preserve="all" />
+    <type fullname="Launch" preserve="all" />
+    <type fullname="LitJson.JsonData" preserve="all" />
+    <type fullname="LitJson.JsonMapper" preserve="all" />
+    <type fullname="LocalResManager" preserve="all" />
+    <type fullname="LocalSave" preserve="all" />
+    <type fullname="LogicEngine" preserve="all" />
+    <type fullname="ResourcesPath" preserve="all" />
+    <type fullname="SingletonMonobehaviour`1" preserve="all" />
+    <type fullname="Singleton`1" preserve="all" />
+    <type fullname="StringUtility" preserve="all" />
+    <type fullname="TextUnline" preserve="all" />
+  </assembly>
+  <assembly fullname="System">
+    <type fullname="System.CodeDom.Compiler.GeneratedCodeAttribute" preserve="all" />
+    <type fullname="System.Collections.Generic.Queue`1" preserve="all" />
+    <type fullname="System.Collections.Generic.Queue`1/Enumerator" preserve="all" />
+    <type fullname="System.Collections.Generic.Stack`1" preserve="all" />
+    <type fullname="System.Collections.Specialized.OrderedDictionary" preserve="all" />
+    <type fullname="System.ComponentModel.EditorBrowsableAttribute" preserve="all" />
+    <type fullname="System.ComponentModel.EditorBrowsableState" preserve="all" />
+    <type fullname="System.Diagnostics.Process" preserve="all" />
+    <type fullname="System.Diagnostics.ProcessStartInfo" preserve="all" />
+    <type fullname="System.Diagnostics.Stopwatch" preserve="all" />
+    <type fullname="System.Net.Dns" preserve="all" />
+    <type fullname="System.Net.EndPoint" preserve="all" />
+    <type fullname="System.Net.IPAddress" preserve="all" />
+    <type fullname="System.Net.IPEndPoint" preserve="all" />
+    <type fullname="System.Net.NetworkInformation.NetworkInterface" preserve="all" />
+    <type fullname="System.Net.NetworkInformation.PhysicalAddress" preserve="all" />
+    <type fullname="System.Net.ServicePointManager" preserve="all" />
+    <type fullname="System.Net.Sockets.AddressFamily" preserve="all" />
+    <type fullname="System.Net.Sockets.ProtocolType" preserve="all" />
+    <type fullname="System.Net.Sockets.Socket" preserve="all" />
+    <type fullname="System.Net.Sockets.SocketFlags" preserve="all" />
+    <type fullname="System.Net.Sockets.SocketShutdown" preserve="all" />
+    <type fullname="System.Net.Sockets.SocketType" preserve="all" />
+    <type fullname="System.Net.WebRequest" preserve="all" />
+    <type fullname="System.Net.WebResponse" preserve="all" />
+    <type fullname="System.Text.RegularExpressions.Capture" preserve="all" />
+    <type fullname="System.Text.RegularExpressions.Group" preserve="all" />
+    <type fullname="System.Text.RegularExpressions.GroupCollection" preserve="all" />
+    <type fullname="System.Text.RegularExpressions.Match" preserve="all" />
+    <type fullname="System.Text.RegularExpressions.MatchCollection" preserve="all" />
+    <type fullname="System.Text.RegularExpressions.Regex" preserve="all" />
+    <type fullname="System.Text.RegularExpressions.RegexOptions" preserve="all" />
+  </assembly>
+  <assembly fullname="System.Core">
+    <type fullname="System.Collections.Generic.HashSet`1" preserve="all" />
+    <type fullname="System.Collections.Generic.HashSet`1/Enumerator" preserve="all" />
+    <type fullname="System.Func`10" preserve="all" />
+    <type fullname="System.Func`11" preserve="all" />
+    <type fullname="System.Func`12" preserve="all" />
+    <type fullname="System.Func`13" preserve="all" />
+    <type fullname="System.Func`14" preserve="all" />
+    <type fullname="System.Func`15" preserve="all" />
+    <type fullname="System.Func`16" preserve="all" />
+    <type fullname="System.Func`17" preserve="all" />
+    <type fullname="System.Linq.Enumerable" preserve="all" />
+    <type fullname="System.Linq.Expressions.BinaryExpression" preserve="all" />
+    <type fullname="System.Linq.Expressions.BlockExpression" preserve="all" />
+    <type fullname="System.Linq.Expressions.ConditionalExpression" preserve="all" />
+    <type fullname="System.Linq.Expressions.ConstantExpression" preserve="all" />
+    <type fullname="System.Linq.Expressions.Expression" preserve="all" />
+    <type fullname="System.Linq.Expressions.Expression`1" preserve="all" />
+    <type fullname="System.Linq.Expressions.InvocationExpression" preserve="all" />
+    <type fullname="System.Linq.Expressions.LabelTarget" preserve="all" />
+    <type fullname="System.Linq.Expressions.LambdaExpression" preserve="all" />
+    <type fullname="System.Linq.Expressions.MemberExpression" preserve="all" />
+    <type fullname="System.Linq.Expressions.MethodCallExpression" preserve="all" />
+    <type fullname="System.Linq.Expressions.NewArrayExpression" preserve="all" />
+    <type fullname="System.Linq.Expressions.NewExpression" preserve="all" />
+    <type fullname="System.Linq.Expressions.ParameterExpression" preserve="all" />
+    <type fullname="System.Linq.Expressions.UnaryExpression" preserve="all" />
+    <type fullname="System.Linq.IOrderedEnumerable`1" preserve="all" />
+  </assembly>
+  <assembly fullname="UniTask">
+    <type fullname="Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder" preserve="all" />
+    <type fullname="Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskMethodBuilder`1" preserve="all" />
+    <type fullname="Cysharp.Threading.Tasks.CompilerServices.AsyncUniTaskVoidMethodBuilder" preserve="all" />
+    <type fullname="Cysharp.Threading.Tasks.PlayerLoopTiming" preserve="all" />
+    <type fullname="Cysharp.Threading.Tasks.UniTask" preserve="all" />
+    <type fullname="Cysharp.Threading.Tasks.UniTask/Awaiter" preserve="all" />
+    <type fullname="Cysharp.Threading.Tasks.UniTaskExtensions" preserve="all" />
+    <type fullname="Cysharp.Threading.Tasks.UniTaskVoid" preserve="all" />
+    <type fullname="Cysharp.Threading.Tasks.UniTask`1" preserve="all" />
+    <type fullname="Cysharp.Threading.Tasks.UniTask`1/Awaiter" preserve="all" />
+    <type fullname="Cysharp.Threading.Tasks.UnityAsyncExtensions" preserve="all" />
+    <type fullname="Cysharp.Threading.Tasks.UnityAsyncExtensions/AssetBundleCreateRequestAwaiter" preserve="all" />
+    <type fullname="Cysharp.Threading.Tasks.UnityAsyncExtensions/AssetBundleRequestAwaiter" preserve="all" />
+    <type fullname="Cysharp.Threading.Tasks.UnityAsyncExtensions/UnityWebRequestAsyncOperationAwaiter" preserve="all" />
+    <type fullname="Cysharp.Threading.Tasks.YieldAwaitable" preserve="all" />
+    <type fullname="Cysharp.Threading.Tasks.YieldAwaitable/Awaiter" preserve="all" />
+  </assembly>
+  <assembly fullname="UnityEngine.AndroidJNIModule">
+    <type fullname="UnityEngine.AndroidJavaClass" preserve="all" />
+    <type fullname="UnityEngine.AndroidJavaObject" preserve="all" />
+  </assembly>
+  <assembly fullname="UnityEngine.AnimationModule">
+    <type fullname="UnityEngine.AnimationClip" preserve="all" />
+    <type fullname="UnityEngine.Animator" preserve="all" />
+    <type fullname="UnityEngine.AnimatorStateInfo" preserve="all" />
+  </assembly>
+  <assembly fullname="UnityEngine.AssetBundleModule">
+    <type fullname="UnityEngine.AssetBundle" preserve="all" />
+    <type fullname="UnityEngine.AssetBundleCreateRequest" preserve="all" />
+    <type fullname="UnityEngine.AssetBundleManifest" preserve="all" />
+    <type fullname="UnityEngine.AssetBundleRequest" preserve="all" />
+  </assembly>
+  <assembly fullname="UnityEngine.AudioModule">
+    <type fullname="UnityEngine.AudioClip" preserve="all" />
+    <type fullname="UnityEngine.AudioSource" preserve="all" />
+  </assembly>
+  <assembly fullname="UnityEngine.CoreModule">
+    <type fullname="UnityEngine.AddComponentMenu" preserve="all" />
+    <type fullname="UnityEngine.AnimationCurve" preserve="all" />
+    <type fullname="UnityEngine.Application" preserve="all" />
+    <type fullname="UnityEngine.Application/LogCallback" preserve="all" />
+    <type fullname="UnityEngine.AsyncOperation" preserve="all" />
+    <type fullname="UnityEngine.Behaviour" preserve="all" />
+    <type fullname="UnityEngine.Bounds" preserve="all" />
+    <type fullname="UnityEngine.Camera" preserve="all" />
+    <type fullname="UnityEngine.Color" preserve="all" />
+    <type fullname="UnityEngine.Color32" preserve="all" />
+    <type fullname="UnityEngine.Component" preserve="all" />
+    <type fullname="UnityEngine.ContextMenu" preserve="all" />
+    <type fullname="UnityEngine.Coroutine" preserve="all" />
+    <type fullname="UnityEngine.CreateAssetMenuAttribute" preserve="all" />
+    <type fullname="UnityEngine.Debug" preserve="all" />
+    <type fullname="UnityEngine.DepthTextureMode" preserve="all" />
+    <type fullname="UnityEngine.DisallowMultipleComponent" preserve="all" />
+    <type fullname="UnityEngine.Events.UnityAction" preserve="all" />
+    <type fullname="UnityEngine.Events.UnityAction`1" preserve="all" />
+    <type fullname="UnityEngine.Events.UnityEvent" preserve="all" />
+    <type fullname="UnityEngine.Events.UnityEventBase" preserve="all" />
+    <type fullname="UnityEngine.Events.UnityEvent`1" preserve="all" />
+    <type fullname="UnityEngine.ExecuteAlways" preserve="all" />
+    <type fullname="UnityEngine.FilterMode" preserve="all" />
+    <type fullname="UnityEngine.GL" preserve="all" />
+    <type fullname="UnityEngine.GameObject" preserve="all" />
+    <type fullname="UnityEngine.Graphics" preserve="all" />
+    <type fullname="UnityEngine.Hash128" preserve="all" />
+    <type fullname="UnityEngine.HeaderAttribute" preserve="all" />
+    <type fullname="UnityEngine.HideFlags" preserve="all" />
+    <type fullname="UnityEngine.HideInInspector" preserve="all" />
+    <type fullname="UnityEngine.KeyCode" preserve="all" />
+    <type fullname="UnityEngine.Keyframe" preserve="all" />
+    <type fullname="UnityEngine.LayerMask" preserve="all" />
+    <type fullname="UnityEngine.LogType" preserve="all" />
+    <type fullname="UnityEngine.Material" preserve="all" />
+    <type fullname="UnityEngine.Mathf" preserve="all" />
+    <type fullname="UnityEngine.MonoBehaviour" preserve="all" />
+    <type fullname="UnityEngine.NetworkReachability" preserve="all" />
+    <type fullname="UnityEngine.Object" preserve="all" />
+    <type fullname="UnityEngine.PlayerPrefs" preserve="all" />
+    <type fullname="UnityEngine.Profiling.Profiler" preserve="all" />
+    <type fullname="UnityEngine.PropertyAttribute" preserve="all" />
+    <type fullname="UnityEngine.QualitySettings" preserve="all" />
+    <type fullname="UnityEngine.Quaternion" preserve="all" />
+    <type fullname="UnityEngine.Random" preserve="all" />
+    <type fullname="UnityEngine.RangeAttribute" preserve="all" />
+    <type fullname="UnityEngine.Rect" preserve="all" />
+    <type fullname="UnityEngine.RectOffset" preserve="all" />
+    <type fullname="UnityEngine.RectTransform" preserve="all" />
+    <type fullname="UnityEngine.RenderTexture" preserve="all" />
+    <type fullname="UnityEngine.RenderTextureFormat" preserve="all" />
+    <type fullname="UnityEngine.Renderer" preserve="all" />
+    <type fullname="UnityEngine.RequireComponent" preserve="all" />
+    <type fullname="UnityEngine.Resolution" preserve="all" />
+    <type fullname="UnityEngine.Resources" preserve="all" />
+    <type fullname="UnityEngine.RuntimePlatform" preserve="all" />
+    <type fullname="UnityEngine.SceneManagement.SceneManager" preserve="all" />
+    <type fullname="UnityEngine.Screen" preserve="all" />
+    <type fullname="UnityEngine.ScriptableObject" preserve="all" />
+    <type fullname="UnityEngine.Serialization.FormerlySerializedAsAttribute" preserve="all" />
+    <type fullname="UnityEngine.SerializeField" preserve="all" />
+    <type fullname="UnityEngine.Shader" preserve="all" />
+    <type fullname="UnityEngine.SortingLayer" preserve="all" />
+    <type fullname="UnityEngine.Sprite" preserve="all" />
+    <type fullname="UnityEngine.Sprites.DataUtility" preserve="all" />
+    <type fullname="UnityEngine.SystemInfo" preserve="all" />
+    <type fullname="UnityEngine.SystemLanguage" preserve="all" />
+    <type fullname="UnityEngine.TextAsset" preserve="all" />
+    <type fullname="UnityEngine.Texture" preserve="all" />
+    <type fullname="UnityEngine.Texture2D" preserve="all" />
+    <type fullname="UnityEngine.TextureFormat" preserve="all" />
+    <type fullname="UnityEngine.TextureWrapMode" preserve="all" />
+    <type fullname="UnityEngine.ThreadPriority" preserve="all" />
+    <type fullname="UnityEngine.Time" preserve="all" />
+    <type fullname="UnityEngine.TooltipAttribute" preserve="all" />
+    <type fullname="UnityEngine.Transform" preserve="all" />
+    <type fullname="UnityEngine.U2D.SpriteAtlas" preserve="all" />
+    <type fullname="UnityEngine.Vector2" preserve="all" />
+    <type fullname="UnityEngine.Vector3" preserve="all" />
+    <type fullname="UnityEngine.Vector4" preserve="all" />
+    <type fullname="UnityEngine.WaitForSeconds" preserve="all" />
+  </assembly>
+  <assembly fullname="UnityEngine.IMGUIModule">
+    <type fullname="UnityEngine.GUILayout" preserve="all" />
+    <type fullname="UnityEngine.GUILayoutOption" preserve="all" />
+  </assembly>
+  <assembly fullname="UnityEngine.InputLegacyModule">
+    <type fullname="UnityEngine.Input" preserve="all" />
+    <type fullname="UnityEngine.Touch" preserve="all" />
+  </assembly>
+  <assembly fullname="UnityEngine.JSONSerializeModule">
+    <type fullname="UnityEngine.JsonUtility" preserve="all" />
+  </assembly>
+  <assembly fullname="UnityEngine.ParticleSystemModule">
+    <type fullname="UnityEngine.ParticleSystem" preserve="all" />
+  </assembly>
+  <assembly fullname="UnityEngine.TextRenderingModule">
+    <type fullname="UnityEngine.Font" preserve="all" />
+    <type fullname="UnityEngine.HorizontalWrapMode" preserve="all" />
+    <type fullname="UnityEngine.TextAnchor" preserve="all" />
+    <type fullname="UnityEngine.TextGenerationSettings" preserve="all" />
+    <type fullname="UnityEngine.TextGenerator" preserve="all" />
+    <type fullname="UnityEngine.UIVertex" preserve="all" />
+    <type fullname="UnityEngine.VerticalWrapMode" preserve="all" />
+  </assembly>
+  <assembly fullname="UnityEngine.UI">
+    <type fullname="UnityEngine.EventSystems.BaseEventData" preserve="all" />
+    <type fullname="UnityEngine.EventSystems.EventSystem" preserve="all" />
+    <type fullname="UnityEngine.EventSystems.EventTrigger" preserve="all" />
+    <type fullname="UnityEngine.EventSystems.ExecuteEvents" preserve="all" />
+    <type fullname="UnityEngine.EventSystems.ExecuteEvents/EventFunction`1" preserve="all" />
+    <type fullname="UnityEngine.EventSystems.IBeginDragHandler" preserve="all" />
+    <type fullname="UnityEngine.EventSystems.IDragHandler" preserve="all" />
+    <type fullname="UnityEngine.EventSystems.IEndDragHandler" preserve="all" />
+    <type fullname="UnityEngine.EventSystems.IEventSystemHandler" preserve="all" />
+    <type fullname="UnityEngine.EventSystems.IInitializePotentialDragHandler" preserve="all" />
+    <type fullname="UnityEngine.EventSystems.IPointerClickHandler" preserve="all" />
+    <type fullname="UnityEngine.EventSystems.IPointerDownHandler" preserve="all" />
+    <type fullname="UnityEngine.EventSystems.IPointerEnterHandler" preserve="all" />
+    <type fullname="UnityEngine.EventSystems.IPointerExitHandler" preserve="all" />
+    <type fullname="UnityEngine.EventSystems.IPointerUpHandler" preserve="all" />
+    <type fullname="UnityEngine.EventSystems.ISubmitHandler" preserve="all" />
+    <type fullname="UnityEngine.EventSystems.PointerEventData" preserve="all" />
+    <type fullname="UnityEngine.EventSystems.PointerEventData/InputButton" preserve="all" />
+    <type fullname="UnityEngine.EventSystems.RaycastResult" preserve="all" />
+    <type fullname="UnityEngine.EventSystems.UIBehaviour" preserve="all" />
+    <type fullname="UnityEngine.UI.BaseMeshEffect" preserve="all" />
+    <type fullname="UnityEngine.UI.Button" preserve="all" />
+    <type fullname="UnityEngine.UI.Button/ButtonClickedEvent" preserve="all" />
+    <type fullname="UnityEngine.UI.CanvasScaler" preserve="all" />
+    <type fullname="UnityEngine.UI.CanvasScaler/ScaleMode" preserve="all" />
+    <type fullname="UnityEngine.UI.CanvasScaler/ScreenMatchMode" preserve="all" />
+    <type fullname="UnityEngine.UI.ColorBlock" preserve="all" />
+    <type fullname="UnityEngine.UI.DefaultControls" preserve="all" />
+    <type fullname="UnityEngine.UI.DefaultControls/Resources" preserve="all" />
+    <type fullname="UnityEngine.UI.Dropdown" preserve="all" />
+    <type fullname="UnityEngine.UI.Dropdown/DropdownEvent" preserve="all" />
+    <type fullname="UnityEngine.UI.Graphic" preserve="all" />
+    <type fullname="UnityEngine.UI.GraphicRaycaster" preserve="all" />
+    <type fullname="UnityEngine.UI.GridLayoutGroup" preserve="all" />
+    <type fullname="UnityEngine.UI.HorizontalLayoutGroup" preserve="all" />
+    <type fullname="UnityEngine.UI.HorizontalOrVerticalLayoutGroup" preserve="all" />
+    <type fullname="UnityEngine.UI.Image" preserve="all" />
+    <type fullname="UnityEngine.UI.InputField" preserve="all" />
+    <type fullname="UnityEngine.UI.InputField/OnChangeEvent" preserve="all" />
+    <type fullname="UnityEngine.UI.InputField/OnValidateInput" preserve="all" />
+    <type fullname="UnityEngine.UI.LayoutElement" preserve="all" />
+    <type fullname="UnityEngine.UI.LayoutGroup" preserve="all" />
+    <type fullname="UnityEngine.UI.LayoutRebuilder" preserve="all" />
+    <type fullname="UnityEngine.UI.MaskableGraphic" preserve="all" />
+    <type fullname="UnityEngine.UI.Outline" preserve="all" />
+    <type fullname="UnityEngine.UI.RawImage" preserve="all" />
+    <type fullname="UnityEngine.UI.ScrollRect" preserve="all" />
+    <type fullname="UnityEngine.UI.ScrollRect/ScrollRectEvent" preserve="all" />
+    <type fullname="UnityEngine.UI.Scrollbar" preserve="all" />
+    <type fullname="UnityEngine.UI.Selectable" preserve="all" />
+    <type fullname="UnityEngine.UI.Shadow" preserve="all" />
+    <type fullname="UnityEngine.UI.Slider" preserve="all" />
+    <type fullname="UnityEngine.UI.Slider/SliderEvent" preserve="all" />
+    <type fullname="UnityEngine.UI.Text" preserve="all" />
+    <type fullname="UnityEngine.UI.Toggle" preserve="all" />
+    <type fullname="UnityEngine.UI.Toggle/ToggleEvent" preserve="all" />
+    <type fullname="UnityEngine.UI.VertexHelper" preserve="all" />
+    <type fullname="UnityEngine.UI.VerticalLayoutGroup" preserve="all" />
+  </assembly>
+  <assembly fullname="UnityEngine.UIModule">
+    <type fullname="UnityEngine.AdditionalCanvasShaderChannels" preserve="all" />
+    <type fullname="UnityEngine.Canvas" preserve="all" />
+    <type fullname="UnityEngine.CanvasGroup" preserve="all" />
+    <type fullname="UnityEngine.ICanvasRaycastFilter" preserve="all" />
+    <type fullname="UnityEngine.RectTransformUtility" preserve="all" />
+  </assembly>
+  <assembly fullname="UnityEngine.UnityWebRequestModule">
+    <type fullname="UnityEngine.Networking.DownloadHandler" preserve="all" />
+    <type fullname="UnityEngine.Networking.DownloadHandlerFile" preserve="all" />
+    <type fullname="UnityEngine.Networking.UnityWebRequest" preserve="all" />
+    <type fullname="UnityEngine.Networking.UnityWebRequest/Result" preserve="all" />
+    <type fullname="UnityEngine.Networking.UnityWebRequestAsyncOperation" preserve="all" />
+  </assembly>
+  <assembly fullname="UnityEngine.VideoModule">
+    <type fullname="UnityEngine.Video.VideoClip" preserve="all" />
+  </assembly>
+  <assembly fullname="mscorlib">
+    <type fullname="System.Action" preserve="all" />
+    <type fullname="System.Action`1" preserve="all" />
+    <type fullname="System.Action`2" preserve="all" />
+    <type fullname="System.Action`3" preserve="all" />
+    <type fullname="System.Action`5" preserve="all" />
+    <type fullname="System.Activator" preserve="all" />
+    <type fullname="System.ArgumentException" preserve="all" />
+    <type fullname="System.ArgumentNullException" preserve="all" />
+    <type fullname="System.ArgumentOutOfRangeException" preserve="all" />
+    <type fullname="System.Array" preserve="all" />
+    <type fullname="System.AsyncCallback" preserve="all" />
+    <type fullname="System.AttributeTargets" preserve="all" />
+    <type fullname="System.AttributeUsageAttribute" preserve="all" />
+    <type fullname="System.BitConverter" preserve="all" />
+    <type fullname="System.Boolean" preserve="all" />
+    <type fullname="System.Byte" preserve="all" />
+    <type fullname="System.Char" preserve="all" />
+    <type fullname="System.Collections.ArrayList" preserve="all" />
+    <type fullname="System.Collections.Concurrent.ConcurrentDictionary`2" preserve="all" />
+    <type fullname="System.Collections.DictionaryEntry" preserve="all" />
+    <type fullname="System.Collections.Generic.Dictionary`2" preserve="all" />
+    <type fullname="System.Collections.Generic.Dictionary`2/Enumerator" preserve="all" />
+    <type fullname="System.Collections.Generic.Dictionary`2/KeyCollection" preserve="all" />
+    <type fullname="System.Collections.Generic.Dictionary`2/KeyCollection/Enumerator" preserve="all" />
+    <type fullname="System.Collections.Generic.Dictionary`2/ValueCollection" preserve="all" />
+    <type fullname="System.Collections.Generic.Dictionary`2/ValueCollection/Enumerator" preserve="all" />
+    <type fullname="System.Collections.Generic.ICollection`1" preserve="all" />
+    <type fullname="System.Collections.Generic.IDictionary`2" preserve="all" />
+    <type fullname="System.Collections.Generic.IEnumerable`1" preserve="all" />
+    <type fullname="System.Collections.Generic.IEnumerator`1" preserve="all" />
+    <type fullname="System.Collections.Generic.IList`1" preserve="all" />
+    <type fullname="System.Collections.Generic.KeyValuePair`2" preserve="all" />
+    <type fullname="System.Collections.Generic.List`1" preserve="all" />
+    <type fullname="System.Collections.Generic.List`1/Enumerator" preserve="all" />
+    <type fullname="System.Collections.ICollection" preserve="all" />
+    <type fullname="System.Collections.IDictionaryEnumerator" preserve="all" />
+    <type fullname="System.Collections.IEnumerable" preserve="all" />
+    <type fullname="System.Collections.IEnumerator" preserve="all" />
+    <type fullname="System.Collections.IList" preserve="all" />
+    <type fullname="System.Comparison`1" preserve="all" />
+    <type fullname="System.Convert" preserve="all" />
+    <type fullname="System.DateTime" preserve="all" />
+    <type fullname="System.DayOfWeek" preserve="all" />
+    <type fullname="System.Delegate" preserve="all" />
+    <type fullname="System.Diagnostics.ConditionalAttribute" preserve="all" />
+    <type fullname="System.Diagnostics.DebuggableAttribute" preserve="all" />
+    <type fullname="System.Diagnostics.DebuggableAttribute/DebuggingModes" preserve="all" />
+    <type fullname="System.Diagnostics.DebuggerHiddenAttribute" preserve="all" />
+    <type fullname="System.Double" preserve="all" />
+    <type fullname="System.Enum" preserve="all" />
+    <type fullname="System.Environment" preserve="all" />
+    <type fullname="System.Exception" preserve="all" />
+    <type fullname="System.Func`1" preserve="all" />
+    <type fullname="System.Func`2" preserve="all" />
+    <type fullname="System.Func`3" preserve="all" />
+    <type fullname="System.Func`4" preserve="all" />
+    <type fullname="System.Func`5" preserve="all" />
+    <type fullname="System.Func`6" preserve="all" />
+    <type fullname="System.Func`7" preserve="all" />
+    <type fullname="System.Func`8" preserve="all" />
+    <type fullname="System.Func`9" preserve="all" />
+    <type fullname="System.Globalization.CultureInfo" preserve="all" />
+    <type fullname="System.Globalization.NumberFormatInfo" preserve="all" />
+    <type fullname="System.Globalization.NumberStyles" preserve="all" />
+    <type fullname="System.Globalization.TextInfo" preserve="all" />
+    <type fullname="System.Globalization.UnicodeCategory" preserve="all" />
+    <type fullname="System.IAsyncResult" preserve="all" />
+    <type fullname="System.IComparable`1" preserve="all" />
+    <type fullname="System.IDisposable" preserve="all" />
+    <type fullname="System.IFormatProvider" preserve="all" />
+    <type fullname="System.IO.Directory" preserve="all" />
+    <type fullname="System.IO.DirectoryInfo" preserve="all" />
+    <type fullname="System.IO.File" preserve="all" />
+    <type fullname="System.IO.FileAccess" preserve="all" />
+    <type fullname="System.IO.FileInfo" preserve="all" />
+    <type fullname="System.IO.FileMode" preserve="all" />
+    <type fullname="System.IO.FileStream" preserve="all" />
+    <type fullname="System.IO.FileSystemInfo" preserve="all" />
+    <type fullname="System.IO.Path" preserve="all" />
+    <type fullname="System.IO.Stream" preserve="all" />
+    <type fullname="System.IO.StreamReader" preserve="all" />
+    <type fullname="System.IO.StreamWriter" preserve="all" />
+    <type fullname="System.IO.TextReader" preserve="all" />
+    <type fullname="System.IO.TextWriter" preserve="all" />
+    <type fullname="System.Int16" preserve="all" />
+    <type fullname="System.Int32" preserve="all" />
+    <type fullname="System.Int64" preserve="all" />
+    <type fullname="System.InvalidOperationException" preserve="all" />
+    <type fullname="System.Math" preserve="all" />
+    <type fullname="System.MulticastDelegate" preserve="all" />
+    <type fullname="System.NotSupportedException" preserve="all" />
+    <type fullname="System.NullReferenceException" preserve="all" />
+    <type fullname="System.Nullable`1" preserve="all" />
+    <type fullname="System.Object" preserve="all" />
+    <type fullname="System.ObsoleteAttribute" preserve="all" />
+    <type fullname="System.OperationCanceledException" preserve="all" />
+    <type fullname="System.ParamArrayAttribute" preserve="all" />
+    <type fullname="System.Predicate`1" preserve="all" />
+    <type fullname="System.Random" preserve="all" />
+    <type fullname="System.Reflection.Assembly" preserve="all" />
+    <type fullname="System.Reflection.BindingFlags" preserve="all" />
+    <type fullname="System.Reflection.ConstructorInfo" preserve="all" />
+    <type fullname="System.Reflection.DefaultMemberAttribute" preserve="all" />
+    <type fullname="System.Reflection.FieldInfo" preserve="all" />
+    <type fullname="System.Reflection.IntrospectionExtensions" preserve="all" />
+    <type fullname="System.Reflection.MemberInfo" preserve="all" />
+    <type fullname="System.Reflection.MethodBase" preserve="all" />
+    <type fullname="System.Reflection.MethodInfo" preserve="all" />
+    <type fullname="System.Reflection.ParameterInfo" preserve="all" />
+    <type fullname="System.Reflection.RuntimeReflectionExtensions" preserve="all" />
+    <type fullname="System.Reflection.TypeInfo" preserve="all" />
+    <type fullname="System.Runtime.CompilerServices.AsyncStateMachineAttribute" preserve="all" />
+    <type fullname="System.Runtime.CompilerServices.AsyncVoidMethodBuilder" preserve="all" />
+    <type fullname="System.Runtime.CompilerServices.CompilationRelaxationsAttribute" preserve="all" />
+    <type fullname="System.Runtime.CompilerServices.CompilerGeneratedAttribute" preserve="all" />
+    <type fullname="System.Runtime.CompilerServices.ExtensionAttribute" preserve="all" />
+    <type fullname="System.Runtime.CompilerServices.IAsyncStateMachine" preserve="all" />
+    <type fullname="System.Runtime.CompilerServices.IsReadOnlyAttribute" preserve="all" />
+    <type fullname="System.Runtime.CompilerServices.IteratorStateMachineAttribute" preserve="all" />
+    <type fullname="System.Runtime.CompilerServices.RuntimeCompatibilityAttribute" preserve="all" />
+    <type fullname="System.Runtime.CompilerServices.RuntimeHelpers" preserve="all" />
+    <type fullname="System.RuntimeFieldHandle" preserve="all" />
+    <type fullname="System.RuntimeTypeHandle" preserve="all" />
+    <type fullname="System.Single" preserve="all" />
+    <type fullname="System.String" preserve="all" />
+    <type fullname="System.StringSplitOptions" preserve="all" />
+    <type fullname="System.Text.Encoding" preserve="all" />
+    <type fullname="System.Text.StringBuilder" preserve="all" />
+    <type fullname="System.Threading.CancellationToken" preserve="all" />
+    <type fullname="System.Threading.CancellationTokenSource" preserve="all" />
+    <type fullname="System.Threading.Interlocked" preserve="all" />
+    <type fullname="System.Threading.Monitor" preserve="all" />
+    <type fullname="System.Threading.Thread" preserve="all" />
+    <type fullname="System.Threading.ThreadPool" preserve="all" />
+    <type fullname="System.Threading.ThreadStart" preserve="all" />
+    <type fullname="System.Threading.WaitCallback" preserve="all" />
+    <type fullname="System.TimeSpan" preserve="all" />
+    <type fullname="System.Type" preserve="all" />
+    <type fullname="System.UInt16" preserve="all" />
+    <type fullname="System.UInt32" preserve="all" />
+    <type fullname="System.UInt64" preserve="all" />
+    <type fullname="System.ValueType" preserve="all" />
+  </assembly>
+  <assembly fullname="spine-csharp">
+    <type fullname="Spine.Animation" preserve="all" />
+    <type fullname="Spine.AnimationState" preserve="all" />
+    <type fullname="Spine.AnimationState/TrackEntryDelegate" preserve="all" />
+    <type fullname="Spine.AnimationStateData" preserve="all" />
+    <type fullname="Spine.BlendMode" preserve="all" />
+    <type fullname="Spine.ExposedList`1" preserve="all" />
+    <type fullname="Spine.ExposedList`1/Enumerator" preserve="all" />
+    <type fullname="Spine.Skeleton" preserve="all" />
+    <type fullname="Spine.SkeletonData" preserve="all" />
+    <type fullname="Spine.Slot" preserve="all" />
+    <type fullname="Spine.SlotData" preserve="all" />
+    <type fullname="Spine.TrackEntry" preserve="all" />
+  </assembly>
+  <assembly fullname="spine-unity">
+    <type fullname="Spine.Unity.ISkeletonAnimation" preserve="all" />
+    <type fullname="Spine.Unity.MeshGenerator" preserve="all" />
+    <type fullname="Spine.Unity.MeshGenerator/Settings" preserve="all" />
+    <type fullname="Spine.Unity.SkeletonAnimation" preserve="all" />
+    <type fullname="Spine.Unity.SkeletonDataAsset" preserve="all" />
+    <type fullname="Spine.Unity.SkeletonGraphic" preserve="all" />
+    <type fullname="Spine.Unity.SkeletonRenderer" preserve="all" />
+    <type fullname="Spine.Unity.UpdateBonesDelegate" preserve="all" />
+  </assembly>
+</linker>
\ No newline at end of file
diff --git a/Assets/HybridCLRGenerate/link.xml.meta b/Assets/HybridCLRGenerate/link.xml.meta
new file mode 100644
index 0000000..35282e0
--- /dev/null
+++ b/Assets/HybridCLRGenerate/link.xml.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: db74ff97eb2b389468cec837b1bdb75f
+TextScriptImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Resources/VersionConfig.asset b/Assets/Resources/VersionConfig.asset
index 1a7607c..8a5254b 100644
--- a/Assets/Resources/VersionConfig.asset
+++ b/Assets/Resources/VersionConfig.asset
@@ -13,24 +13,24 @@
   m_Name: VersionConfig
   m_EditorClassIdentifier: 
   m_AppId: test
-  m_SpID: test
+  m_SpID: 
   m_VersionAuthority: 0
-  m_Version: 1.000.0
-  m_ClientPackageFlag: 2025
+  m_Version: 1.0.1
+  m_ClientPackageFlag: 2021
   m_Branch: 1
-  m_AssetAccess: 3
-  m_PartAssetPackage: 0
-  m_ProductName: testname
-  m_BundleIdentifier: com.testapk.game
-  m_KeystoreFileName: 
-  m_KeystorePassword: 
-  m_KeystoreAlias: 
-  m_KeystoreAliasPassword: 
+  m_AssetAccess: 1
+  m_PartAssetPackage: 1
+  m_ProductName: "\u50CF\u7D20\u4E09\u56FD"
+  m_BundleIdentifier: com.wgyx.xssg
+  m_KeystoreFileName: wgyx
+  m_KeystorePassword: wgyx2025
+  m_KeystoreAlias: wgyx
+  m_KeystoreAliasPassword: wgyx2025
   m_AppleDeveloperTeamID: 
-  m_DebugVersion: 1
+  m_DebugVersion: 0
   m_IsBanShu: 0
-  m_BuildTime: 2025/05/22--1549
+  m_BuildTime: 
   m_BuildIndex: 6
-  m_LogoPosition: {x: 0, y: 150}
-  m_BanHao: 1
+  m_LogoPosition: {x: -32, y: 144}
+  m_BanHao: 
   m_SdkFileName: 
diff --git a/Assets/Resources/VersionConfigEx.txt b/Assets/Resources/VersionConfigEx.txt
index a47c2e1..a295881 100644
--- a/Assets/Resources/VersionConfigEx.txt
+++ b/Assets/Resources/VersionConfigEx.txt
@@ -1 +1 @@
-{"m_AppId":"test","m_SpID":"test","m_VersionAuthority":0,"m_Version":"1.000.0","m_ClientPackageFlag":"2025","m_Branch":1,"m_AssetAccess":3,"m_PartAssetPackage":false,"m_ProductName":"testname","m_BundleIdentifier":"com.testapk.game","m_KeystoreFileName":"","m_KeystorePassword":"","m_KeystoreAlias":"","m_KeystoreAliasPassword":"","m_AppleDeveloperTeamID":"","m_DebugVersion":true,"m_IsBanShu":false,"m_BuildTime":"2025/05/22--1549","m_BuildIndex":6,"m_LogoPosition":{"x":0.0,"y":150.0},"m_BanHao":"1","m_SdkFileName":""}
\ No newline at end of file
+{"m_AppId":"test","m_SpID":"","m_VersionAuthority":0,"m_Version":"1.0.1","m_ClientPackageFlag":"2021","m_Branch":1,"m_AssetAccess":3,"m_PartAssetPackage":false,"m_ProductName":"鍍忕礌涓夊浗","m_BundleIdentifier":"com.wgyx.xssg","m_KeystoreFileName":"wgyx","m_KeystorePassword":"wgyx2025","m_KeystoreAlias":"wgyx","m_KeystoreAliasPassword":"wgyx2025","m_AppleDeveloperTeamID":"","m_DebugVersion":false,"m_IsBanShu":false,"m_BuildTime":"","m_BuildIndex":6,"m_LogoPosition":{"x":-32.0,"y":144.0},"m_BanHao":"","m_SdkFileName":""}
\ No newline at end of file
diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset
index fcf3d52..9d6ea2f 100644
--- a/ProjectSettings/ProjectSettings.asset
+++ b/ProjectSettings/ProjectSettings.asset
@@ -813,7 +813,7 @@
   embeddedLinuxEnableGamepadInput: 1
   hmiLogStartupTiming: 0
   hmiCpuConfiguration: 
-  apiCompatibilityLevel: 6
+  apiCompatibilityLevel: 3
   activeInputHandler: 0
   windowsGamepadBackendHint: 0
   cloudProjectId: 

--
Gitblit v1.8.0