public static void AddDistributeFlag(string flag)
        {
            if (string.IsNullOrEmpty(flag))
            {
                return;
            }
            var flags = GetDistributeFlags();

            if (flags.Length > 0)
            {
                if (flags[flags.Length - 1] == flag)
                {
                    return;
                }
            }
            var fflags = RuntimeForbiddenDFlags;

#if UNITY_EDITOR
            fflags.Remove(flag);
#else
            if (fflags.Remove(flag))
            {
                var sb = new System.Text.StringBuilder();
                foreach (var nflag in fflags)
                {
                    sb.Append('<');
                    sb.Append(nflag);
                }
                PlayerPrefs.SetString("___Pref__ForbiddenDistributeFlags", sb.ToString());
                PlayerPrefs.Save();
            }
#endif
            var exflags = RuntimeExDFlags;
            for (int i = 0; i < exflags.Count; ++i)
            {
                if (exflags[i] == flag)
                {
                    exflags.RemoveAt(i--);
                }
            }
            exflags.Add(flag);
#if !UNITY_EDITOR
            {
                var sb = new System.Text.StringBuilder();
                for (int i = 0; i < exflags.Count; ++i)
                {
                    sb.Append('<');
                    sb.Append(exflags[i]);
                }
                PlayerPrefs.SetString("___Pref__OptionalDistributeFlags", sb.ToString());
                PlayerPrefs.Save();
            }
#endif
            _RuntimeCachedDFlags = null;
#if UNITY_ENGINE || UNITY_5_3_OR_NEWER
            RebuildRuntimeResCache();
#endif
        }
        public static void SetDistributeFlags(IEnumerable <string> toRemove, IEnumerable <string> toAdd)
        {
            var  pflags         = PreRuntimeDFlags;
            var  fflags         = RuntimeForbiddenDFlags;
            bool fflagsChanged  = false;
            var  exflags        = RuntimeExDFlags;
            bool exflagsChanged = false;

            if (toRemove != null)
            {
                foreach (var flag in toRemove)
                {
                    for (int i = 0; i < exflags.Count; ++i)
                    {
                        if (exflags[i] == flag)
                        {
                            exflagsChanged = true;
                            exflags.RemoveAt(i--);
                        }
                    }
                    for (int i = 0; i < pflags.Count; ++i)
                    {
                        if (pflags[i] == flag)
                        {
                            fflagsChanged |= fflags.Add(flag);
                            break;
                        }
                    }
                }
            }
            if (toAdd != null)
            {
                foreach (var flag in toAdd)
                {
                    fflagsChanged |= fflags.Remove(flag);

                    for (int i = 0; i < exflags.Count; ++i)
                    {
                        if (exflags[i] == flag)
                        {
                            exflags.RemoveAt(i--);
                        }
                    }
                    exflags.Add(flag);
                    exflagsChanged = true;
                }
            }
#if !UNITY_EDITOR
            if (exflagsChanged)
            {
                var sb = new System.Text.StringBuilder();
                for (int i = 0; i < exflags.Count; ++i)
                {
                    sb.Append('<');
                    sb.Append(exflags[i]);
                }
                PlayerPrefs.SetString("___Pref__OptionalDistributeFlags", sb.ToString());
            }
            if (fflagsChanged)
            {
                var sb = new System.Text.StringBuilder();
                foreach (var nflag in fflags)
                {
                    sb.Append('<');
                    sb.Append(nflag);
                }
                PlayerPrefs.SetString("___Pref__ForbiddenDistributeFlags", sb.ToString());
            }
#endif
            if (exflagsChanged || fflagsChanged)
            {
#if !UNITY_EDITOR
                PlayerPrefs.Save();
#endif
                _RuntimeCachedDFlags = null;
#if UNITY_ENGINE || UNITY_5_3_OR_NEWER
                RebuildRuntimeResCache();
#endif
            }
        }
        public static void RemoveDistributeFlag(string flag)
        {
            if (string.IsNullOrEmpty(flag))
            {
                return;
            }
            var fflags = RuntimeForbiddenDFlags;

            if (fflags.Contains(flag))
            {
                return;
            }
            var  exflags        = RuntimeExDFlags;
            bool exflagsChanged = false;

            for (int i = 0; i < exflags.Count; ++i)
            {
                if (exflags[i] == flag)
                {
                    exflagsChanged = true;
                    exflags.RemoveAt(i--);
                }
            }
            if (exflagsChanged)
            {
#if !UNITY_EDITOR
                var sb = new System.Text.StringBuilder();
                for (int i = 0; i < exflags.Count; ++i)
                {
                    sb.Append('<');
                    sb.Append(exflags[i]);
                }
                PlayerPrefs.SetString("___Pref__OptionalDistributeFlags", sb.ToString());
                PlayerPrefs.Save();
#endif
                _RuntimeCachedDFlags = null;
            }

            var pflags = PreRuntimeDFlags;
            for (int i = 0; i < pflags.Count; ++i)
            {
                if (pflags[i] == flag)
                {
                    fflags.Add(flag);
#if !UNITY_EDITOR
                    var sb = new System.Text.StringBuilder();
                    foreach (var nflag in fflags)
                    {
                        sb.Append('<');
                        sb.Append(nflag);
                    }
                    PlayerPrefs.SetString("___Pref__ForbiddenDistributeFlags", sb.ToString());
                    PlayerPrefs.Save();
#endif
                    _RuntimeCachedDFlags = null;
                    break;
                }
            }
#if UNITY_ENGINE || UNITY_5_3_OR_NEWER
            RebuildRuntimeResCache();
#endif
        }