diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj index 99cfe511dc..a884d670db 100644 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj @@ -615,6 +615,7 @@ + diff --git a/src/Main/Base/Project/Src/Dom/IMember.cs b/src/Main/Base/Project/Src/Dom/IMember.cs index 3e2168ebd3..e02a8c9f28 100644 --- a/src/Main/Base/Project/Src/Dom/IMember.cs +++ b/src/Main/Base/Project/Src/Dom/IMember.cs @@ -17,7 +17,7 @@ namespace ICSharpCode.SharpDevelop.Dom IRegion Region { get; } - + string Name { get; } diff --git a/src/Main/Base/Project/Src/Dom/IParameter.cs b/src/Main/Base/Project/Src/Dom/IParameter.cs index 2a6aefa0ef..97e85203f3 100644 --- a/src/Main/Base/Project/Src/Dom/IParameter.cs +++ b/src/Main/Base/Project/Src/Dom/IParameter.cs @@ -28,7 +28,11 @@ namespace ICSharpCode.SharpDevelop.Dom ParameterModifier Modifier { get; } - + + IRegion Region { + get; + } + string Documentation { get; } diff --git a/src/Main/Base/Project/Src/Dom/Implementations/AbstractParameter.cs b/src/Main/Base/Project/Src/Dom/Implementations/AbstractParameter.cs index 061ffaee63..26510a6aaf 100644 --- a/src/Main/Base/Project/Src/Dom/Implementations/AbstractParameter.cs +++ b/src/Main/Base/Project/Src/Dom/Implementations/AbstractParameter.cs @@ -22,8 +22,16 @@ namespace ICSharpCode.SharpDevelop.Dom protected IReturnType returnType; protected ParameterModifier modifier; + protected IRegion region; List attributes; - + + + + public IRegion Region { + get { + return region; + } + } public bool IsOut { get { return (modifier & ParameterModifier.Out) == ParameterModifier.Out; @@ -80,7 +88,7 @@ namespace ICSharpCode.SharpDevelop.Dom modifier = value; } } - + public string Documentation { get { return documentation; diff --git a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/FilePosition.cs b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/FilePosition.cs new file mode 100644 index 0000000000..f79e9095d4 --- /dev/null +++ b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/FilePosition.cs @@ -0,0 +1,29 @@ +/* + * Created by SharpDevelop. + * User: Omnibrain + * Date: 20.01.2005 + * Time: 16:07 + * + * To change this template use Tools | Options | Coding | Edit Standard Headers. + */ + +using System; +using System.Drawing; + +namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver +{ + /// + /// Description of SearchDefinition. + /// + public class FilePosition + { + string filename = ""; + Point position = new Point(0, 0); + + public FilePosition(string filename, Point position) + { + this.filename = filename; + this.position = position; + } + } +} diff --git a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryASTConvertVisitor.cs b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryASTConvertVisitor.cs index 291ed946b7..e70d0c4143 100644 --- a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryASTConvertVisitor.cs +++ b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryASTConvertVisitor.cs @@ -224,7 +224,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver if (methodDeclaration.Parameters != null) { foreach (AST.ParameterDeclarationExpression par in methodDeclaration.Parameters) { ReturnType parType = new ReturnType(par.TypeReference); - Parameter p = new Parameter(par.ParameterName, parType); + Parameter p = new Parameter(par.ParameterName, parType, new DefaultRegion(par.StartLocation, methodDeclaration.Body.EndLocation)); parameters.Add(p); } } @@ -245,7 +245,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver if (constructorDeclaration.Parameters != null) { foreach (AST.ParameterDeclarationExpression par in constructorDeclaration.Parameters) { ReturnType parType = new ReturnType(par.TypeReference); - Parameter p = new Parameter(par.ParameterName, parType); + Parameter p = new Parameter(par.ParameterName, parType, new DefaultRegion(par.StartLocation, constructorDeclaration.Body.EndLocation)); parameters.Add(p); } } @@ -334,7 +334,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver if (indexerDeclaration.Parameters != null) { foreach (AST.ParameterDeclarationExpression par in indexerDeclaration.Parameters) { ReturnType parType = new ReturnType(par.TypeReference); - Parameter p = new Parameter(par.ParameterName, parType); + Parameter p = new Parameter(par.ParameterName, parType, new DefaultRegion(par.StartLocation, indexerDeclaration.EndLocation)); parameters.Add(p); } } diff --git a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs index f0a4569b97..500589757d 100644 --- a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs +++ b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs @@ -33,6 +33,12 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver int caretLine; int caretColumn; + public SupportedLanguages Language { + get { + return language; + } + } + public IProjectContent ProjectContent { get { return projectContent; @@ -306,7 +312,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver bool InStatic() { - IProperty property = Get(); + IProperty property = GetProperty(); if (property != null) { return property.IsStatic; } @@ -471,29 +477,32 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver return between.Y < end.Y || between.X <= end.X; } - IReturnType SearchVariable(string name) + LocalLookupVariable SearchVariable(string name) { ArrayList variables = (ArrayList)lookupTableVisitor.variables[IsCaseSensitive(language) ? name : name.ToLower()]; if (variables == null || variables.Count <= 0) { return null; } - IReturnType found = null; foreach (LocalLookupVariable v in variables) { if (IsInside(new Point(caretColumn, caretLine), v.StartPos, v.EndPos)) { - IClass c = SearchType(v.TypeRef.SystemType, callingClass, cu); - if (c != null) { - found = new ReturnType(c.FullyQualifiedName, v.TypeRef.RankSpecifier, v.TypeRef.PointerNestingLevel); - } else { - found = new ReturnType(v.TypeRef); - } - break; + return v; } } - if (found == null) { + return null; + } + + IReturnType GetVariableType(LocalLookupVariable v) + { + if (v == null) { return null; } - return found; + IClass c = SearchType(v.TypeRef.SystemType, callingClass, cu); + if (c != null) { + return new ReturnType(c.FullyQualifiedName, v.TypeRef.RankSpecifier, v.TypeRef.PointerNestingLevel); + } else { + return new ReturnType(v.TypeRef); + } } /// @@ -502,7 +511,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver public IReturnType DynamicLookup(string typeName) { // try if it exists a variable named typeName - IReturnType variable = SearchVariable(typeName); + IReturnType variable = GetVariableType(SearchVariable(typeName)); if (variable != null) { showStatic = false; return variable; @@ -513,18 +522,18 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver } // try if typeName is a method parameter - IReturnType p = SearchMethodParameter(typeName); - if (p != null) { + IParameter parameter = SearchMethodParameter(typeName); + if (parameter != null) { showStatic = false; - return p; + return parameter.ReturnType; } // check if typeName == value in set method of a property if (typeName == "value") { - p = SearchProperty(); - if (p != null) { + IProperty property = GetProperty(); + if (property != null && property.SetterRegion != null && property.SetterRegion.IsInside(caretLine, caretColumn)) { showStatic = false; - return p; + return property.ReturnType; } } @@ -579,7 +588,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver return null; } - IProperty Get() + IProperty GetProperty() { foreach (IProperty property in callingClass.Properties) { if (property.BodyRegion != null && property.BodyRegion.IsInside(caretLine, caretColumn)) { @@ -599,19 +608,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver return null; } - IReturnType SearchProperty() - { - IProperty property = Get(); - if (property == null) { - return null; - } - if (property.SetterRegion != null && property.SetterRegion.IsInside(caretLine, caretColumn)) { - return property.ReturnType; - } - return null; - } - - IReturnType SearchMethodParameter(string parameter) + IParameter SearchMethodParameter(string parameter) { IMethod method = GetMethod(caretLine, caretColumn); if (method == null) { @@ -619,7 +616,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver } foreach (IParameter p in method.Parameters) { if (IsSameName(p.Name, parameter)) { - return p.ReturnType; + return p; } } return null; @@ -664,6 +661,44 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver return projectContent.SearchType(name, curType, unit, caretLine, caretColumn); } + public FilePosition SearchDefinition(string expression, + int caretLineNumber, + int caretColumn, + string fileName) + { + ICSharpCode.NRefactory.Parser.IParser p = ICSharpCode.NRefactory.Parser.ParserFactory.CreateParser(language, new System.IO.StringReader(expression)); + Expression expr = p.ParseExpression(); + ParseInformation parseInfo = ParserService.GetParseInformation(fileName); + if (parseInfo == null) { + return null; + } + if (expr is IdentifierExpression) { + ICSharpCode.NRefactory.Parser.AST.CompilationUnit fileCompilationUnit = parseInfo.MostRecentCompilationUnit.Tag as ICSharpCode.NRefactory.Parser.AST.CompilationUnit; + lookupTableVisitor = new LookupTableVisitor(); + lookupTableVisitor.Visit(fileCompilationUnit, null); + + // try if it exists a variable named typeName + LocalLookupVariable variable = SearchVariable(expression); + if (variable != null) { + return new FilePosition(fileName, variable.StartPos); + } + + if (callingClass == null) { + return null; + } + + // try if typeName is a method parameter + IParameter parameter = SearchMethodParameter(expression); + if (parameter != null) { + return new FilePosition(fileName, new Point(parameter.Region.BeginLine, parameter.Region.BeginColumn)); + } + } + + NRefactoryASTConvertVisitor cSharpVisitor = new NRefactoryASTConvertVisitor(parseInfo.MostRecentCompilationUnit != null ? parseInfo.MostRecentCompilationUnit.ProjectContent : null); + return null; + } + + public ArrayList NewCompletion(int caretLine, int caretColumn, string fileName) { if (!IsCaseSensitive(language)) { diff --git a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/Parameter.cs b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/Parameter.cs index 81fdedf042..d2c18ca929 100644 --- a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/Parameter.cs +++ b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/Parameter.cs @@ -6,10 +6,11 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver { public class Parameter : AbstractParameter { - public Parameter(string name, ReturnType type) + public Parameter(string name, ReturnType type, IRegion region) { Name = name; returnType = type; + this.region = region; } } } diff --git a/src/Main/StartUp/Project/SharpDevelopMain.cs b/src/Main/StartUp/Project/SharpDevelopMain.cs index 05664becd3..bfb4e06081 100644 --- a/src/Main/StartUp/Project/SharpDevelopMain.cs +++ b/src/Main/StartUp/Project/SharpDevelopMain.cs @@ -41,7 +41,7 @@ namespace ICSharpCode.SharpDevelop static void ShowErrorBox(object sender, ThreadExceptionEventArgs eargs) { DialogResult result = new ExceptionBox(eargs.Exception).ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainForm); - + switch (result) { case DialogResult.Ignore: break; diff --git a/src/SharpDevelop.sln b/src/SharpDevelop.sln index 6cc8fa231b..791fd0d469 100644 --- a/src/SharpDevelop.sln +++ b/src/SharpDevelop.sln @@ -1,5 +1,33 @@ Microsoft Visual Studio Solution File, Format Version 9.00 # SharpDevelop 2.0.0.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Main", "Main", "{5A3EBEBA-0560-41C1-966B-23F7D03A5486}" + ProjectSection(SolutionItems) = postProject + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop", "Main\Base\Project\ICSharpCode.SharpDevelop.csproj", "{2748AD25-9C63-4E12-877B-4DCE96FBED54}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core", "Main\Core\Project\ICSharpCode.Core.csproj", "{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StartUp", "Main\StartUp\Project\StartUp.csproj", "{1152B71B-3C05-4598-B20D-823B5D40559E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core.Tests", "Main\Core\Test\ICSharpCode.Core.Tests.csproj", "{AD6FAA08-D6F5-4DBA-AF85-F4DA9F40C3B5}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{9421EDF4-9769-4BE9-B5A6-C87DE221D73C}" + ProjectSection(SolutionItems) = postProject + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.framework.dll", "Tools\NUnit\src\NUnitFramework\framework\nunit.framework.dll.csproj", "{83DD7E12-A705-4DBA-9D71-09C8973D9382}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.core.dll", "Tools\NUnit\src\NUnitFramework\core\nunit.core.dll.csproj", "{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WinFormsUI", "Libraries\DockPanel_Src\WinFormsUI\WinFormsUI.csproj", "{D3C782BA-178E-4235-A3BA-8C11DEBB6BEE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.TextEditor", "Libraries\ICSharpCode.TextEditor\Project\ICSharpCode.TextEditor.csproj", "{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactory", "Libraries\NRefactory\Project\NRefactory.csproj", "{3A9AE6AA-BC07-4A2F-972C-581E3AE2F195}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.extensions.dll", "Tools\NUnit\src\NUnitFramework\extensions\nunit.extensions.dll.csproj", "{98B10E98-003C-45A0-9587-119142E39986}" +EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AddIns", "AddIns", "{14A277EE-7DF1-4529-B639-7D1EF334C1C5}" ProjectSection(SolutionItems) = postProject EndProjectSection @@ -46,34 +74,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StartPage", "AddIns\Misc\St EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AddinScout", "AddIns\Misc\AddinScout\Project\AddinScout.csproj", "{4B8F0F98-8BE1-402B-AA8B-C8D548577B38}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{9421EDF4-9769-4BE9-B5A6-C87DE221D73C}" - ProjectSection(SolutionItems) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.framework.dll", "Tools\NUnit\src\NUnitFramework\framework\nunit.framework.dll.csproj", "{83DD7E12-A705-4DBA-9D71-09C8973D9382}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.core.dll", "Tools\NUnit\src\NUnitFramework\core\nunit.core.dll.csproj", "{EBD43A7F-AFCA-4281-BB53-5CDD91F966A3}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WinFormsUI", "Libraries\DockPanel_Src\WinFormsUI\WinFormsUI.csproj", "{D3C782BA-178E-4235-A3BA-8C11DEBB6BEE}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.TextEditor", "Libraries\ICSharpCode.TextEditor\Project\ICSharpCode.TextEditor.csproj", "{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NRefactory", "Libraries\NRefactory\Project\NRefactory.csproj", "{3A9AE6AA-BC07-4A2F-972C-581E3AE2F195}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nunit.extensions.dll", "Tools\NUnit\src\NUnitFramework\extensions\nunit.extensions.dll.csproj", "{98B10E98-003C-45A0-9587-119142E39986}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Main", "Main", "{5A3EBEBA-0560-41C1-966B-23F7D03A5486}" - ProjectSection(SolutionItems) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.SharpDevelop", "Main\Base\Project\ICSharpCode.SharpDevelop.csproj", "{2748AD25-9C63-4E12-877B-4DCE96FBED54}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core", "Main\Core\Project\ICSharpCode.Core.csproj", "{35CEF10F-2D4C-45F2-9DD1-161E0FEC583C}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StartUp", "Main\StartUp\Project\StartUp.csproj", "{1152B71B-3C05-4598-B20D-823B5D40559E}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.Core.Tests", "Main\Core\Test\ICSharpCode.Core.Tests.csproj", "{AD6FAA08-D6F5-4DBA-AF85-F4DA9F40C3B5}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -155,6 +155,16 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution + {AD6FAA08-D6F5-4DBA-AF85-F4DA9F40C3B5} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486} + {1152B71B-3C05-4598-B20D-823B5D40559E} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486} + {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486} + {2748AD25-9C63-4E12-877B-4DCE96FBED54} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486} + {98B10E98-003C-45A0-9587-119142E39986} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C} + {3A9AE6AA-BC07-4A2F-972C-581E3AE2F195} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C} + {2D18BE89-D210-49EB-A9DD-2246FBB3DF6D} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C} + {D3C782BA-178E-4235-A3BA-8C11DEBB6BEE} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C} + {EBD43A7F-AFCA-4281-BB53-5CDD91F966A3} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C} + {83DD7E12-A705-4DBA-9D71-09C8973D9382} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C} {CE5B42B7-6E8C-4385-9E97-F4023FC16BF2} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5} {4EA396ED-64AD-4AD0-A67A-AB363F3E0C79} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5} {FEB825FA-4AD8-425D-8E4A-B5A18EE1B81C} = {14A277EE-7DF1-4529-B639-7D1EF334C1C5} @@ -172,15 +182,5 @@ Global {B08385CD-F0CC-488C-B4F4-EEB34B6D2688} = {6604365C-C702-4C10-9BA8-637F1E3D4D0D} {1D18D788-F7EE-4585-A23B-34DC8EC63CB8} = {6604365C-C702-4C10-9BA8-637F1E3D4D0D} {EC06F96A-AEEC-49D6-B03D-AB87C6EB674C} = {6604365C-C702-4C10-9BA8-637F1E3D4D0D} - {98B10E98-003C-45A0-9587-119142E39986} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C} - {3A9AE6AA-BC07-4A2F-972C-581E3AE2F195} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C} - {2D18BE89-D210-49EB-A9DD-2246FBB3DF6D} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C} - {D3C782BA-178E-4235-A3BA-8C11DEBB6BEE} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C} - {EBD43A7F-AFCA-4281-BB53-5CDD91F966A3} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C} - {83DD7E12-A705-4DBA-9D71-09C8973D9382} = {9421EDF4-9769-4BE9-B5A6-C87DE221D73C} - {AD6FAA08-D6F5-4DBA-AF85-F4DA9F40C3B5} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486} - {1152B71B-3C05-4598-B20D-823B5D40559E} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486} - {35CEF10F-2D4C-45F2-9DD1-161E0FEC583C} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486} - {2748AD25-9C63-4E12-877B-4DCE96FBED54} = {5A3EBEBA-0560-41C1-966B-23F7D03A5486} EndGlobalSection EndGlobal