private static bool CanSerializeAsInnerDefaultString(string filter, string name, Type type, ObjectPersistData persistData, PersistenceMode mode, DataBindingCollection dataBindings, ExpressionBindingCollection expressions)
 {
     if (((((type == typeof(string)) && (filter.Length == 0)) && ((mode == PersistenceMode.InnerDefaultProperty) || (mode == PersistenceMode.EncodedInnerDefaultProperty))) && ((dataBindings == null) || (dataBindings[name] == null))) && ((expressions == null) || (expressions[name] == null)))
     {
         if (persistData == null)
         {
             return true;
         }
         ICollection propertyAllFilters = persistData.GetPropertyAllFilters(name);
         if (propertyAllFilters.Count == 0)
         {
             return true;
         }
         if (propertyAllFilters.Count == 1)
         {
             foreach (PropertyEntry entry in propertyAllFilters)
             {
                 if ((entry.Filter.Length == 0) && (entry is ComplexPropertyEntry))
                 {
                     return true;
                 }
             }
         }
     }
     return false;
 }
 private static string LocalizeObject(IServiceProvider serviceProvider, object obj, ObjectPersistData persistData, ResourceExpressionEditor resEditor, IDesignTimeResourceWriter resourceWriter, string resourceKey, string objectModelName, object topLevelObject, string filter, bool shouldLocalizeInnerContent, bool isComplexProperty, bool implicitlyLocalizeComplexProperty)
 {
     bool flag;
     if (isComplexProperty)
     {
         flag = implicitlyLocalizeComplexProperty;
     }
     else
     {
         flag = (persistData == null) || persistData.Localize;
     }
     PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(obj);
     for (int i = 0; i < properties.Count; i++)
     {
         try
         {
             PropertyDescriptor propertyDescriptor = properties[i];
             if (string.Equals(propertyDescriptor.Name, "Controls", StringComparison.Ordinal))
             {
                 Control control = obj as Control;
                 if ((control != null) && shouldLocalizeInnerContent)
                 {
                     if (!ParseChildren(control.GetType()))
                     {
                         foreach (Control control2 in control.Controls)
                         {
                             IControlBuilderAccessor accessor = control2;
                             ControlBuilder controlBuilder = accessor.ControlBuilder;
                             if (controlBuilder != null)
                             {
                                 string str = controlBuilder.GetResourceKey();
                                 string b = LocalizeObject(serviceProvider, control2, controlBuilder.GetObjectPersistData(), resEditor, resourceWriter, str, string.Empty, control2, string.Empty, true, false, false);
                                 if (!string.Equals(str, b, StringComparison.OrdinalIgnoreCase))
                                 {
                                     controlBuilder.SetResourceKey(b);
                                 }
                             }
                         }
                     }
                     continue;
                 }
             }
             PersistenceModeAttribute attribute = (PersistenceModeAttribute) propertyDescriptor.Attributes[typeof(PersistenceModeAttribute)];
             string str3 = (objectModelName.Length > 0) ? (objectModelName + '.' + propertyDescriptor.Name) : propertyDescriptor.Name;
             if ((attribute.Mode == PersistenceMode.Attribute) && (propertyDescriptor.SerializationVisibility == DesignerSerializationVisibility.Content))
             {
                 resourceKey = LocalizeObject(serviceProvider, propertyDescriptor.GetValue(obj), persistData, resEditor, resourceWriter, resourceKey, str3, topLevelObject, filter, true, true, flag);
             }
             else if ((attribute.Mode == PersistenceMode.Attribute) || (propertyDescriptor.PropertyType == typeof(string)))
             {
                 bool flag2 = false;
                 bool flag3 = false;
                 object obj2 = null;
                 string name = string.Empty;
                 if (persistData != null)
                 {
                     PropertyEntry filteredProperty = persistData.GetFilteredProperty(string.Empty, str3);
                     if (filteredProperty is BoundPropertyEntry)
                     {
                         BoundPropertyEntry entry2 = (BoundPropertyEntry) filteredProperty;
                         if (!entry2.Generated)
                         {
                             if (string.Equals(entry2.ExpressionPrefix, "resources", StringComparison.OrdinalIgnoreCase))
                             {
                                 System.Web.Compilation.ResourceExpressionFields parsedExpressionData = entry2.ParsedExpressionData as System.Web.Compilation.ResourceExpressionFields;
                                 if ((parsedExpressionData != null) && string.IsNullOrEmpty(parsedExpressionData.ClassKey))
                                 {
                                     name = parsedExpressionData.ResourceKey;
                                     obj2 = resEditor.EvaluateExpression(entry2.Expression, entry2.ParsedExpressionData, propertyDescriptor.PropertyType, serviceProvider);
                                     if (obj2 != null)
                                     {
                                         flag3 = true;
                                     }
                                     flag2 = true;
                                 }
                             }
                         }
                         else
                         {
                             flag2 = true;
                         }
                     }
                     else
                     {
                         flag2 = flag && IsPropertyLocalizable(propertyDescriptor);
                     }
                 }
                 else
                 {
                     flag2 = flag && IsPropertyLocalizable(propertyDescriptor);
                 }
                 if (flag2)
                 {
                     if (!flag3)
                     {
                         obj2 = propertyDescriptor.GetValue(obj);
                     }
                     if (name.Length == 0)
                     {
                         if (string.IsNullOrEmpty(resourceKey))
                         {
                             resourceKey = resourceWriter.CreateResourceKey(null, topLevelObject);
                         }
                         name = resourceKey + '.' + str3;
                         if (filter.Length != 0)
                         {
                             name = filter + ':' + name;
                         }
                     }
                     resourceWriter.AddResource(name, obj2);
                 }
                 if (persistData != null)
                 {
                     foreach (PropertyEntry entry3 in persistData.GetPropertyAllFilters(str3))
                     {
                         if (entry3.Filter.Length > 0)
                         {
                             if (entry3 is SimplePropertyEntry)
                             {
                                 if (flag && IsPropertyLocalizable(propertyDescriptor))
                                 {
                                     if (name.Length == 0)
                                     {
                                         if (string.IsNullOrEmpty(resourceKey))
                                         {
                                             resourceKey = resourceWriter.CreateResourceKey(null, topLevelObject);
                                         }
                                         name = resourceKey + '.' + str3;
                                     }
                                     string str5 = entry3.Filter + ':' + name;
                                     resourceWriter.AddResource(str5, ((SimplePropertyEntry) entry3).Value);
                                 }
                             }
                             else if (!(entry3 is ComplexPropertyEntry) && (entry3 is BoundPropertyEntry))
                             {
                                 BoundPropertyEntry entry4 = (BoundPropertyEntry) entry3;
                                 if (!entry4.Generated && string.Equals(entry4.ExpressionPrefix, "resources", StringComparison.OrdinalIgnoreCase))
                                 {
                                     System.Web.Compilation.ResourceExpressionFields fields2 = entry4.ParsedExpressionData as System.Web.Compilation.ResourceExpressionFields;
                                     if ((fields2 != null) && string.IsNullOrEmpty(fields2.ClassKey))
                                     {
                                         object obj3 = resEditor.EvaluateExpression(entry4.Expression, entry4.ParsedExpressionData, entry3.PropertyInfo.PropertyType, serviceProvider);
                                         if (obj3 == null)
                                         {
                                             obj3 = string.Empty;
                                         }
                                         resourceWriter.AddResource(fields2.ResourceKey, obj3);
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
             else if (shouldLocalizeInnerContent)
             {
                 if (typeof(ICollection).IsAssignableFrom(propertyDescriptor.PropertyType))
                 {
                     if (persistData != null)
                     {
                         foreach (ComplexPropertyEntry entry5 in persistData.GetPropertyAllFilters(propertyDescriptor.Name))
                         {
                             foreach (ComplexPropertyEntry entry6 in entry5.Builder.GetObjectPersistData().CollectionItems)
                             {
                                 ControlBuilder builder = entry6.Builder;
                                 object obj4 = builder.BuildObject();
                                 string str6 = builder.GetResourceKey();
                                 string str7 = LocalizeObject(serviceProvider, obj4, builder.GetObjectPersistData(), resEditor, resourceWriter, str6, string.Empty, obj4, string.Empty, true, false, false);
                                 if (!string.Equals(str6, str7, StringComparison.OrdinalIgnoreCase))
                                 {
                                     builder.SetResourceKey(str7);
                                 }
                             }
                         }
                     }
                 }
                 else if (typeof(ITemplate).IsAssignableFrom(propertyDescriptor.PropertyType))
                 {
                     if (persistData != null)
                     {
                         foreach (TemplatePropertyEntry entry7 in persistData.GetPropertyAllFilters(propertyDescriptor.Name))
                         {
                             TemplateBuilder builder3 = (TemplateBuilder) entry7.Builder;
                             IDesignerHost designerHost = (IDesignerHost) serviceProvider.GetService(typeof(IDesignerHost));
                             Control[] controlArray = ControlParser.ParseControls(designerHost, builder3.Text);
                             for (int j = 0; j < controlArray.Length; j++)
                             {
                                 if (!(controlArray[j] is LiteralControl) && !(controlArray[j] is DesignerDataBoundLiteralControl))
                                 {
                                     LocalizeControl(controlArray[j], serviceProvider, resourceWriter, true);
                                 }
                             }
                             StringBuilder builder4 = new StringBuilder();
                             for (int k = 0; k < controlArray.Length; k++)
                             {
                                 if (controlArray[k] is LiteralControl)
                                 {
                                     builder4.Append(((LiteralControl) controlArray[k]).Text);
                                 }
                                 else
                                 {
                                     builder4.Append(ControlPersister.PersistControl(controlArray[k], designerHost));
                                 }
                             }
                             builder3.Text = builder4.ToString();
                         }
                     }
                 }
                 else if (persistData != null)
                 {
                     object obj5 = propertyDescriptor.GetValue(obj);
                     ObjectPersistData objectPersistData = null;
                     ComplexPropertyEntry entry8 = (ComplexPropertyEntry) persistData.GetFilteredProperty(string.Empty, propertyDescriptor.Name);
                     if (entry8 != null)
                     {
                         objectPersistData = entry8.Builder.GetObjectPersistData();
                     }
                     resourceKey = LocalizeObject(serviceProvider, obj5, objectPersistData, resEditor, resourceWriter, resourceKey, str3, topLevelObject, string.Empty, true, true, flag);
                     foreach (ComplexPropertyEntry entry9 in persistData.GetPropertyAllFilters(propertyDescriptor.Name))
                     {
                         if (entry9.Filter.Length > 0)
                         {
                             ControlBuilder builder5 = entry9.Builder;
                             objectPersistData = builder5.GetObjectPersistData();
                             obj5 = builder5.BuildObject();
                             resourceKey = LocalizeObject(serviceProvider, obj5, objectPersistData, resEditor, resourceWriter, resourceKey, str3, topLevelObject, entry9.Filter, true, true, flag);
                         }
                     }
                 }
             }
         }
         catch (Exception exception)
         {
             if (serviceProvider != null)
             {
                 IComponentDesignerDebugService service = serviceProvider.GetService(typeof(IComponentDesignerDebugService)) as IComponentDesignerDebugService;
                 if (service != null)
                 {
                     service.Fail(exception.Message);
                 }
             }
         }
     }
     return resourceKey;
 }
 private static void SerializeAttribute(object obj, PropertyDescriptor propDesc, DataBindingCollection dataBindings, ExpressionBindingCollection expressions, IDesignerHost host, string prefix, ObjectPersistData persistData, string filter, ArrayList attributes, bool topLevelInDesigner)
 {
     DesignOnlyAttribute attribute = (DesignOnlyAttribute) propDesc.Attributes[typeof(DesignOnlyAttribute)];
     if ((attribute == null) || !attribute.IsDesignOnly)
     {
         string name = propDesc.Name;
         Type propertyType = propDesc.PropertyType;
         PersistenceMode mode = ((PersistenceModeAttribute) propDesc.Attributes[typeof(PersistenceModeAttribute)]).Mode;
         bool flag = (dataBindings != null) && (dataBindings[name] != null);
         bool flag2 = (expressions != null) && (expressions[name] != null);
         if (((flag || flag2) || (propDesc.SerializationVisibility != DesignerSerializationVisibility.Hidden)) && (((mode == PersistenceMode.Attribute) || ((flag && flag2) && (propertyType == typeof(string)))) || ((mode != PersistenceMode.InnerProperty) && (propertyType == typeof(string)))))
         {
             string str2 = string.Empty;
             if (prefix.Length > 0)
             {
                 str2 = prefix + "-" + name;
             }
             else
             {
                 str2 = name;
             }
             if (propDesc.SerializationVisibility == DesignerSerializationVisibility.Content)
             {
                 SerializeAttributesRecursive(propDesc.GetValue(obj), host, str2, persistData, filter, attributes, dataBindings, expressions, topLevelInDesigner);
             }
             else
             {
                 IAttributeAccessor accessor = obj as IAttributeAccessor;
                 if (!propDesc.IsReadOnly || ((accessor != null) && (accessor.GetAttribute(str2) != null)))
                 {
                     string str3 = ConvertPersistToObjectModelName(str2);
                     if (!FilterableAttribute.IsPropertyFilterable(propDesc))
                     {
                         filter = string.Empty;
                     }
                     if (CanSerializeAsInnerDefaultString(filter, str3, propertyType, persistData, mode, dataBindings, expressions))
                     {
                         if (topLevelInDesigner)
                         {
                             attributes.Add(new Triplet(filter, str2, null));
                         }
                     }
                     else
                     {
                         bool flag3 = true;
                         object objB = null;
                         object objA = propDesc.GetValue(obj);
                         BindingType none = BindingType.None;
                         if (dataBindings != null)
                         {
                             DataBinding binding = dataBindings[str3];
                             if (binding != null)
                             {
                                 objA = binding.Expression;
                                 none = BindingType.Data;
                             }
                         }
                         if (none == BindingType.None)
                         {
                             if (expressions != null)
                             {
                                 ExpressionBinding binding2 = expressions[str3];
                                 if ((binding2 != null) && !binding2.Generated)
                                 {
                                     objA = binding2.ExpressionPrefix + ":" + binding2.Expression;
                                     none = BindingType.Expression;
                                 }
                             }
                             else if (persistData != null)
                             {
                                 BoundPropertyEntry filteredProperty = persistData.GetFilteredProperty(filter, name) as BoundPropertyEntry;
                                 if ((filteredProperty != null) && !filteredProperty.Generated)
                                 {
                                     objB = GetPropertyDefaultValue(propDesc, str2, persistData, filter, host);
                                     if (object.Equals(objA, objB))
                                     {
                                         objA = filteredProperty.ExpressionPrefix + ":" + filteredProperty.Expression;
                                         none = BindingType.Expression;
                                     }
                                 }
                             }
                         }
                         if (filter.Length == 0)
                         {
                             bool useResult = false;
                             bool flag5 = false;
                             if (none == BindingType.None)
                             {
                                 flag5 = GetShouldSerializeValue(obj, name, out useResult);
                             }
                             if (useResult)
                             {
                                 flag3 = flag5;
                             }
                             else
                             {
                                 objB = GetPropertyDefaultValue(propDesc, str2, persistData, filter, host);
                                 flag3 = !object.Equals(objA, objB);
                             }
                         }
                         else
                         {
                             objB = GetPropertyDefaultValue(propDesc, str2, persistData, filter, host);
                             flag3 = !object.Equals(objA, objB);
                         }
                         if (flag3)
                         {
                             string z = GetPersistValue(propDesc, propertyType, objA, none, topLevelInDesigner);
                             if (((topLevelInDesigner && (objB != null)) && ((z == null) || (z.Length == 0))) && ShouldPersistBlankValue(objB, propertyType))
                             {
                                 z = string.Empty;
                             }
                             if ((z != null) && (!propertyType.IsArray || (z.Length > 0)))
                             {
                                 attributes.Add(new Triplet(filter, str2, z));
                             }
                             else if (topLevelInDesigner)
                             {
                                 attributes.Add(new Triplet(filter, str2, null));
                             }
                         }
                         else if (topLevelInDesigner)
                         {
                             attributes.Add(new Triplet(filter, str2, null));
                         }
                         if (persistData != null)
                         {
                             foreach (PropertyEntry entry2 in persistData.GetPropertyAllFilters(str3))
                             {
                                 if (string.Compare(entry2.Filter, filter, StringComparison.OrdinalIgnoreCase) != 0)
                                 {
                                     string str5 = string.Empty;
                                     if (entry2 is SimplePropertyEntry)
                                     {
                                         SimplePropertyEntry entry3 = (SimplePropertyEntry) entry2;
                                         if (entry3.UseSetAttribute)
                                         {
                                             str5 = entry3.Value.ToString();
                                         }
                                         else
                                         {
                                             str5 = GetPersistValue(propDesc, entry2.Type, entry3.Value, BindingType.None, topLevelInDesigner);
                                         }
                                     }
                                     else if (entry2 is BoundPropertyEntry)
                                     {
                                         BoundPropertyEntry entry4 = (BoundPropertyEntry) entry2;
                                         if (entry4.Generated)
                                         {
                                             continue;
                                         }
                                         string propValue = entry4.Expression.Trim();
                                         none = BindingType.Data;
                                         string expressionPrefix = entry4.ExpressionPrefix;
                                         if (expressionPrefix.Length > 0)
                                         {
                                             propValue = expressionPrefix + ":" + propValue;
                                             none = BindingType.Expression;
                                         }
                                         str5 = GetPersistValue(propDesc, entry2.Type, propValue, none, topLevelInDesigner);
                                     }
                                     else if (entry2 is ComplexPropertyEntry)
                                     {
                                         ComplexPropertyEntry entry5 = (ComplexPropertyEntry) entry2;
                                         str5 = (string) entry5.Builder.BuildObject();
                                     }
                                     attributes.Add(new Triplet(entry2.Filter, str2, str5));
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
 }
 private static void SerializeTemplateProperty(object obj, IDesignerHost host, PropertyDescriptor propDesc, ObjectPersistData persistData, TextWriter writer, string filter)
 {
     string name = propDesc.Name;
     string b = string.Empty;
     ITemplate template = (ITemplate) propDesc.GetValue(obj);
     if (template != null)
     {
         b = SerializeTemplate(template, host);
         string a = string.Empty;
         if ((filter.Length > 0) && (persistData != null))
         {
             TemplatePropertyEntry filteredProperty = persistData.GetFilteredProperty(string.Empty, name) as TemplatePropertyEntry;
             if (filteredProperty != null)
             {
                 a = SerializeTemplate(filteredProperty.Builder as ITemplate, host);
             }
         }
         IDictionary expandos = GetExpandos(filter, name, persistData);
         if ((((template != null) && (expandos != null)) && (expandos.Count > 0)) || !string.Equals(a, b))
         {
             WriteInnerPropertyBeginTag(writer, filter, name, expandos, false);
             if ((b.Length > 0) && !b.StartsWith("\r\n", StringComparison.Ordinal))
             {
                 writer.WriteLine();
             }
             writer.Write(b);
             if ((b.Length > 0) && !b.EndsWith("\r\n", StringComparison.Ordinal))
             {
                 writer.WriteLine();
             }
             WriteInnerPropertyEndTag(writer, filter, name);
         }
     }
     if (persistData != null)
     {
         foreach (TemplatePropertyEntry entry2 in persistData.GetPropertyAllFilters(name))
         {
             if (string.Compare(entry2.Filter, filter, StringComparison.OrdinalIgnoreCase) != 0)
             {
                 IDictionary dictionary2 = GetExpandos(entry2.Filter, name, persistData);
                 WriteInnerPropertyBeginTag(writer, entry2.Filter, name, dictionary2, false);
                 string str4 = SerializeTemplate((ITemplate) entry2.Builder, host);
                 if (str4 != null)
                 {
                     if (!str4.StartsWith("\r\n", StringComparison.Ordinal))
                     {
                         writer.WriteLine();
                     }
                     writer.Write(str4);
                     if (!str4.EndsWith("\r\n", StringComparison.Ordinal))
                     {
                         writer.WriteLine();
                     }
                     WriteInnerPropertyEndTag(writer, entry2.Filter, name);
                 }
             }
         }
     }
 }
 private static void SerializeStringProperty(object obj, IDesignerHost host, PropertyDescriptor propDesc, ObjectPersistData persistData, PersistenceMode persistenceMode, TextWriter writer, string filter)
 {
     string name = propDesc.Name;
     DataBindingCollection dataBindings = null;
     if (obj is IDataBindingsAccessor)
     {
         dataBindings = ((IDataBindingsAccessor) obj).DataBindings;
     }
     ExpressionBindingCollection expressions = null;
     if (obj is IExpressionsAccessor)
     {
         expressions = ((IExpressionsAccessor) obj).Expressions;
     }
     if ((persistenceMode == PersistenceMode.InnerProperty) || CanSerializeAsInnerDefaultString(filter, name, propDesc.PropertyType, persistData, persistenceMode, dataBindings, expressions))
     {
         ArrayList list = new ArrayList();
         if (((dataBindings == null) || (dataBindings[name] == null)) || ((expressions == null) || (expressions[name] == null)))
         {
             string y = string.Empty;
             object objA = propDesc.GetValue(obj);
             if (objA != null)
             {
                 y = objA.ToString();
             }
             bool flag = true;
             if (filter.Length == 0)
             {
                 bool flag2;
                 bool flag3 = GetShouldSerializeValue(obj, name, out flag2);
                 if (flag2)
                 {
                     flag = flag3;
                 }
                 else
                 {
                     object objB = GetPropertyDefaultValue(propDesc, name, persistData, filter, host);
                     flag = !object.Equals(objA, objB);
                 }
             }
             else
             {
                 object obj4 = GetPropertyDefaultValue(propDesc, name, persistData, filter, host);
                 flag = !object.Equals(objA, obj4);
             }
             if (flag)
             {
                 IDictionary z = GetExpandos(filter, name, persistData);
                 list.Add(new Triplet(filter, y, z));
             }
         }
         if (persistData != null)
         {
             foreach (PropertyEntry entry in persistData.GetPropertyAllFilters(name))
             {
                 if ((string.Compare(entry.Filter, filter, StringComparison.OrdinalIgnoreCase) != 0) && (entry is ComplexPropertyEntry))
                 {
                     ComplexPropertyEntry entry2 = (ComplexPropertyEntry) entry;
                     string str3 = entry2.Builder.BuildObject().ToString();
                     IDictionary dictionary2 = GetExpandos(entry.Filter, name, persistData);
                     list.Add(new Triplet(entry.Filter, str3, dictionary2));
                 }
             }
         }
         foreach (Triplet triplet in list)
         {
             bool flag4 = false;
             IDictionary third = triplet.Third as IDictionary;
             if (((list.Count == 1) && (triplet.First.ToString().Length == 0)) && ((third == null) || (third.Count == 0)))
             {
                 if (persistenceMode == PersistenceMode.InnerDefaultProperty)
                 {
                     writer.Write(triplet.Second.ToString());
                     flag4 = true;
                 }
                 else if (persistenceMode == PersistenceMode.EncodedInnerDefaultProperty)
                 {
                     HttpUtility.HtmlEncode(triplet.Second.ToString(), writer);
                     flag4 = true;
                 }
             }
             if (!flag4)
             {
                 string str4 = triplet.First.ToString();
                 WriteInnerPropertyBeginTag(writer, str4, name, third, true);
                 writer.Write(triplet.Second.ToString());
                 WriteInnerPropertyEndTag(writer, str4, name);
             }
         }
     }
 }
 private static void SerializeComplexProperty(object obj, IDesignerHost host, PropertyDescriptor propDesc, ObjectPersistData persistData, TextWriter writer, string filter)
 {
     string name = propDesc.Name;
     object obj2 = propDesc.GetValue(obj);
     ObjectPersistData objectPersistData = null;
     if (persistData != null)
     {
         ComplexPropertyEntry filteredProperty = persistData.GetFilteredProperty(string.Empty, name) as ComplexPropertyEntry;
         if (filteredProperty != null)
         {
             objectPersistData = filteredProperty.Builder.GetObjectPersistData();
         }
     }
     StringWriter writer2 = new StringWriter(CultureInfo.InvariantCulture);
     SerializeInnerProperties(obj2, host, objectPersistData, writer2, filter);
     string str2 = writer2.ToString();
     ArrayList list = SerializeAttributes(obj2, host, string.Empty, objectPersistData, filter, false);
     StringWriter writer3 = new StringWriter(CultureInfo.InvariantCulture);
     bool flag = true;
     foreach (Triplet triplet in list)
     {
         string str3 = triplet.First.ToString();
         if (str3 != ControlBuilder.DesignerFilter)
         {
             flag = false;
         }
         WriteAttribute(writer3, str3, triplet.Second.ToString(), triplet.Third.ToString());
     }
     string str4 = string.Empty;
     if (!flag || (str2.Length > 0))
     {
         str4 = writer3.ToString();
     }
     if ((str4.Length + str2.Length) > 0)
     {
         writer.WriteLine();
         writer.Write('<');
         writer.Write(name);
         writer.Write(str4);
         writer.Write('>');
         writer.Write(str2);
         WriteInnerPropertyEndTag(writer, string.Empty, name);
     }
     if (persistData != null)
     {
         foreach (ComplexPropertyEntry entry2 in persistData.GetPropertyAllFilters(name))
         {
             if (entry2.Filter.Length > 0)
             {
                 object obj3 = entry2.Builder.BuildObject();
                 writer.WriteLine();
                 writer.Write('<');
                 writer.Write(entry2.Filter);
                 writer.Write(':');
                 writer.Write(name);
                 SerializeAttributes(obj3, host, string.Empty, null, writer, string.Empty);
                 writer.Write('>');
                 SerializeInnerProperties(obj3, host, null, writer, string.Empty);
                 WriteInnerPropertyEndTag(writer, entry2.Filter, name);
             }
         }
     }
 }
 private static void SerializeCollectionProperty(object obj, IDesignerHost host, PropertyDescriptor propDesc, ObjectPersistData persistData, PersistenceMode persistenceMode, TextWriter writer, string filter)
 {
     string name = propDesc.Name;
     bool flag = false;
     ICollection is2 = propDesc.GetValue(obj) as ICollection;
     int count = 0;
     if (is2 != null)
     {
         count = is2.Count;
     }
     int num2 = 0;
     ObjectPersistData objectPersistData = null;
     if (persistData != null)
     {
         ComplexPropertyEntry filteredProperty = persistData.GetFilteredProperty(string.Empty, name) as ComplexPropertyEntry;
         if (filteredProperty != null)
         {
             objectPersistData = filteredProperty.Builder.GetObjectPersistData();
             num2 = objectPersistData.CollectionItems.Count;
         }
     }
     if (filter.Length == 0)
     {
         flag = true;
     }
     else if (persistData != null)
     {
         if (persistData.GetFilteredProperty(filter, name) is ComplexPropertyEntry)
         {
             flag = true;
         }
         else if (num2 != count)
         {
             flag = true;
         }
         else if (objectPersistData != null)
         {
             IEnumerator enumerator = is2.GetEnumerator();
             IEnumerator enumerator2 = objectPersistData.CollectionItems.GetEnumerator();
             while (enumerator.MoveNext())
             {
                 enumerator2.MoveNext();
                 ComplexPropertyEntry current = (ComplexPropertyEntry) enumerator2.Current;
                 if (enumerator.Current.GetType() != current.Builder.ControlType)
                 {
                     flag = true;
                     break;
                 }
             }
         }
     }
     bool flag2 = false;
     ArrayList list = new ArrayList();
     if (count > 0)
     {
         StringWriter writer2 = new StringWriter(CultureInfo.InvariantCulture);
         IDictionary table = new Hashtable(ReferenceKeyComparer.Default);
         if (objectPersistData != null)
         {
             foreach (ComplexPropertyEntry entry3 in objectPersistData.CollectionItems)
             {
                 ObjectPersistData data2 = entry3.Builder.GetObjectPersistData();
                 if (data2 != null)
                 {
                     data2.AddToObjectControlBuilderTable(table);
                 }
             }
         }
         if (!flag)
         {
             flag2 = true;
             foreach (object obj2 in is2)
             {
                 string tagName = GetTagName(obj2.GetType(), host);
                 ObjectPersistData data3 = null;
                 ControlBuilder builder = (ControlBuilder) table[obj2];
                 if (builder != null)
                 {
                     data3 = builder.GetObjectPersistData();
                 }
                 writer2.Write('<');
                 writer2.Write(tagName);
                 SerializeAttributes(obj2, host, string.Empty, data3, writer2, filter);
                 writer2.Write('>');
                 SerializeInnerProperties(obj2, host, data3, writer2, filter);
                 writer2.Write("</");
                 writer2.Write(tagName);
                 writer2.WriteLine('>');
             }
             IDictionary z = GetExpandos(filter, name, objectPersistData);
             list.Add(new Triplet(string.Empty, writer2, z));
         }
         else
         {
             foreach (object obj3 in is2)
             {
                 string str3 = GetTagName(obj3.GetType(), host);
                 if (obj3 is Control)
                 {
                     SerializeControl((Control) obj3, host, writer2, string.Empty);
                 }
                 else
                 {
                     writer2.Write('<');
                     writer2.Write(str3);
                     ObjectPersistData data4 = null;
                     ControlBuilder builder2 = (ControlBuilder) table[obj3];
                     if (builder2 != null)
                     {
                         data4 = builder2.GetObjectPersistData();
                     }
                     if ((filter.Length == 0) && (data4 != null))
                     {
                         SerializeAttributes(obj3, host, string.Empty, data4, writer2, string.Empty);
                         writer2.Write('>');
                         SerializeInnerProperties(obj3, host, data4, writer2, string.Empty);
                     }
                     else
                     {
                         SerializeAttributes(obj3, host, string.Empty, null, writer2, string.Empty);
                         writer2.Write('>');
                         SerializeInnerProperties(obj3, host, null, writer2, string.Empty);
                     }
                     writer2.Write("</");
                     writer2.Write(str3);
                     writer2.WriteLine('>');
                 }
             }
             IDictionary dictionary3 = GetExpandos(filter, name, persistData);
             list.Add(new Triplet(filter, writer2, dictionary3));
         }
     }
     else if (num2 > 0)
     {
         IDictionary dictionary4 = GetExpandos(filter, name, persistData);
         list.Add(new Triplet(filter, new StringWriter(CultureInfo.InvariantCulture), dictionary4));
     }
     if (persistData != null)
     {
         foreach (ComplexPropertyEntry entry4 in persistData.GetPropertyAllFilters(name))
         {
             StringWriter writer3 = new StringWriter(CultureInfo.InvariantCulture);
             if ((string.Compare(entry4.Filter, filter, StringComparison.OrdinalIgnoreCase) != 0) && (!flag2 || (entry4.Filter.Length > 0)))
             {
                 ObjectPersistData data5 = entry4.Builder.GetObjectPersistData();
                 data5.CollectionItems.GetEnumerator();
                 foreach (ComplexPropertyEntry entry5 in data5.CollectionItems)
                 {
                     object obj4 = entry5.Builder.BuildObject();
                     if (obj4 is Control)
                     {
                         SerializeControl((Control) obj4, host, writer3, string.Empty);
                     }
                     else
                     {
                         string str4 = GetTagName(obj4.GetType(), host);
                         ObjectPersistData data6 = entry5.Builder.GetObjectPersistData();
                         writer3.Write('<');
                         writer3.Write(str4);
                         SerializeAttributes(obj4, host, string.Empty, data6, writer3, string.Empty);
                         writer3.Write('>');
                         SerializeInnerProperties(obj4, host, data6, writer3, string.Empty);
                         writer3.Write("</");
                         writer3.Write(str4);
                         writer3.WriteLine('>');
                     }
                 }
                 IDictionary dictionary5 = GetExpandos(entry4.Filter, name, persistData);
                 list.Add(new Triplet(entry4.Filter, writer3, dictionary5));
             }
         }
     }
     foreach (Triplet triplet in list)
     {
         string str5 = triplet.First.ToString();
         IDictionary third = (IDictionary) triplet.Third;
         if ((((list.Count == 1) && (str5.Length == 0)) && (persistenceMode != PersistenceMode.InnerProperty)) && ((third == null) || (third.Count == 0)))
         {
             writer.Write(triplet.Second.ToString());
         }
         else
         {
             string str6 = triplet.Second.ToString().Trim();
             if (str6.Length > 0)
             {
                 WriteInnerPropertyBeginTag(writer, str5, name, third, true);
                 writer.WriteLine(str6);
                 WriteInnerPropertyEndTag(writer, str5, name);
             }
         }
     }
 }