diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/.classpath b/bundles/org.eclipse.wst.jsdt.debug.core/.classpath
deleted file mode 100644
index 2fbb7a2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/.project b/bundles/org.eclipse.wst.jsdt.debug.core/.project
deleted file mode 100644
index 8dca928..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.jsdt.debug.core</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.wst.jsdt.debug.core/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index de9eac3..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,90 +0,0 @@
-#Fri Apr 30 10:04:28 CDT 2010
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
-org.eclipse.jdt.core.compiler.problem.deadCode=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=error
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=error
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=error
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=error
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/.settings/org.eclipse.pde.api.tools.prefs b/bundles/org.eclipse.wst.jsdt.debug.core/.settings/org.eclipse.pde.api.tools.prefs
deleted file mode 100644
index fd31153..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/.settings/org.eclipse.pde.api.tools.prefs
+++ /dev/null
@@ -1,94 +0,0 @@
-#Fri Feb 19 09:13:55 CST 2010
-ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
-ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
-ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
-ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
-ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
-API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
-API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
-API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
-API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
-CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
-CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
-CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
-CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
-CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
-CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
-CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
-CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
-CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
-CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
-CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
-CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
-CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
-CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
-CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
-CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
-CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
-CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
-ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
-ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
-ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
-ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
-ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
-ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
-FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
-FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
-FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
-FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
-FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
-FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
-FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
-FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
-FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
-FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
-ILLEGAL_EXTEND=Error
-ILLEGAL_IMPLEMENT=Error
-ILLEGAL_INSTANTIATE=Error
-ILLEGAL_OVERRIDE=Error
-ILLEGAL_REFERENCE=Error
-INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
-INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
-INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
-INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
-INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
-INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
-INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
-INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
-INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
-INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
-INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
-INVALID_JAVADOC_TAG=Error
-INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Error
-LEAK_EXTEND=Error
-LEAK_FIELD_DECL=Error
-LEAK_IMPLEMENT=Error
-LEAK_METHOD_PARAM=Error
-LEAK_METHOD_RETURN_TYPE=Error
-METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
-METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
-METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
-METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
-METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
-METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
-METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
-METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
-METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
-METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
-TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
-TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
-TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
-TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
-TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
-TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
-UNUSED_PROBLEM_FILTERS=Error
-automatically_removed_unused_problem_filters=Enabled
-eclipse.preferences.version=1
-incompatible_api_component_version=Error
-incompatible_api_component_version_include_major_without_breaking_change=Disabled
-incompatible_api_component_version_include_minor_without_api_change=Disabled
-invalid_since_tag_version=Error
-malformed_since_tag=Error
-missing_since_tag=Error
-report_api_breakage_when_major_version_incremented=Disabled
-report_resolution_errors_api_component=Error
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.jsdt.debug.core/META-INF/MANIFEST.MF
deleted file mode 100644
index 80e18a7..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,25 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %bundleName.name
-Bundle-SymbolicName: org.eclipse.wst.jsdt.debug.core;singleton:=true
-Bundle-Version: 2.0.200.qualifier
-Bundle-Activator: org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin
-Bundle-Vendor: %providerName
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.debug.core
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.wst.jsdt.debug.core.breakpoints,
- org.eclipse.wst.jsdt.debug.core.jsdi,
- org.eclipse.wst.jsdt.debug.core.jsdi.connect,
- org.eclipse.wst.jsdt.debug.core.jsdi.event,
- org.eclipse.wst.jsdt.debug.core.jsdi.request,
- org.eclipse.wst.jsdt.debug.core.model,
- org.eclipse.wst.jsdt.debug.internal.core;x-friends:="org.eclipse.wst.jsdt.debug.ui",
- org.eclipse.wst.jsdt.debug.internal.core.breakpoints;x-friends:="org.eclipse.wst.jsdt.debug.ui",
- org.eclipse.wst.jsdt.debug.internal.core.launching;x-friends:="org.eclipse.wst.jsdt.debug.ui,org.eclipse.wst.jsdt.debug.rhino.ui",
- org.eclipse.wst.jsdt.debug.internal.core.model;x-friends:="org.eclipse.wst.jsdt.debug.ui,org.eclipse.wst.jsdt.debug.rhino.ui"
-Import-Package: org.eclipse.jface.text,
- org.eclipse.text.edits,
- org.eclipse.wst.jsdt.core,
- org.eclipse.wst.jsdt.core.formatter
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/OSGI-INF/l10n/bundle.properties b/bundles/org.eclipse.wst.jsdt.debug.core/OSGI-INF/l10n/bundle.properties
deleted file mode 100644
index 8eb1c46..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/OSGI-INF/l10n/bundle.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-###############################################################################
-# Copyright (c) 2010, 2011 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-launchConfigurationType.name = Remote JavaScript
-breakpoint.name = JavaScript Breakpoint
-linebreakpoint.name = JavaScript Line Breakpoint
-methodbreakpoint.name = JavaScript Function Breakpoint
-scriptloadbreakpoint.name = JavaScript Script Load Breakpoint
-exceptionbreakpoint.name = JavaScript Exception Breakpoint
-launchDelegate.name = JavaScript Launcher
-launchDelegate.description = Launches a Javascript session
-sourceLocator.name = JavaScript Source Locator
-providerName = Eclipse Web Tools Platform
-bundleName.name = JavaScript Debug Core
-connectorsExtPoint.name = connectors
-remoteJsLaunchDelegate.name = Remote JavaScript
-breakpointParticipantsExt.name = Breakpoint Participants
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/about.html b/bundles/org.eclipse.wst.jsdt.debug.core/about.html
deleted file mode 100755
index b4a1c56..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>March 10, 2010</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
-indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/build.properties b/bundles/org.eclipse.wst.jsdt.debug.core/build.properties
deleted file mode 100644
index 7c53cd9..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/build.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-###############################################################################
-# Copyright (c) 2010, 2011 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               OSGI-INF/,\
-               OSGI-INF/l10n/,\
-               about.html,\
-               OSGI-INF/l10n/bundle.properties
-src.includes = about.html,\
-               schema/
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/plugin.xml b/bundles/org.eclipse.wst.jsdt.debug.core/plugin.xml
deleted file mode 100644
index e5bb471..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/plugin.xml
+++ /dev/null
@@ -1,166 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?><!--
-    Copyright (c) 2010, 2011 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-   
-    Contributors:
-        IBM Corporation - initial API and implementation
- -->
-
-<plugin>
-   <extension-point id="launchingConnectors" name="%connectorsExtPoint.name" schema="schema/launchingConnectors.exsd"/>
-   <extension-point id="breakpointParticipants" name="%breakpointParticipantsExt.name" schema="schema/breakpointParticipants.exsd"/>
-   <extension-point id="scriptResolvers" name="scriptResolvers" schema="schema/scriptResolvers.exsd"/>
-   <extension
-         point="org.eclipse.debug.core.launchConfigurationTypes">
-      <launchConfigurationType
-            id="org.eclipse.wst.jsdt.debug.core.launchConfigurationType"
-            modes="run,debug"
-            name="%launchConfigurationType.name"
-            public="true">
-      </launchConfigurationType>
-   </extension>
-   <extension
-         id="org.eclipse.wst.jsdt.debug.core.line.breakpoint.marker"
-         name="%linebreakpoint.name"
-         point="org.eclipse.core.resources.markers">
-      <super
-            type="org.eclipse.wst.jsdt.debug.core.breakpoint.marker">
-      </super>
-      <super
-            type="org.eclipse.debug.core.lineBreakpointMarker">
-      </super>
-      <persistent
-            value="true">
-      </persistent>
-   </extension>
-   <extension
-         id="org.eclipse.wst.jsdt.debug.core.function.breakpoint.marker"
-         name="%methodbreakpoint.name"
-         point="org.eclipse.core.resources.markers">
-      <super
-            type="org.eclipse.wst.jsdt.debug.core.breakpoint.marker">
-      </super>
-      <super
-            type="org.eclipse.jdt.debug.javaMethodBreakpointMarker">
-      </super>
-      <persistent
-            value="true">
-      </persistent>
-   </extension>
-   <extension
-         id="org.eclipse.wst.jsdt.debug.core.scriptload.breakpoint.marker"
-         name="%scriptloadbreakpoint.name"
-         point="org.eclipse.core.resources.markers">
-      <super
-            type="org.eclipse.wst.jsdt.debug.core.breakpoint.marker">
-      </super>
-      <super
-            type="org.eclipse.jdt.debug.javaClassPrepareBreakpointMarker">
-      </super>
-      <persistent
-            value="true">
-      </persistent>
-   </extension>
-   <extension
-         id="org.eclipse.wst.jsdt.debug.core.breakpoint.marker"
-         name="%breakpoint.name"
-         point="org.eclipse.core.resources.markers">
-      <super
-            type="org.eclipse.debug.core.breakpointMarker">
-      </super>
-   </extension>
-   <extension
-         id="org.eclipse.wst.jsdt.debug.core.exception.breakpoint.marker"
-         name="%exceptionbreakpoint.name"
-         point="org.eclipse.core.resources.markers">
-      <super
-            type="org.eclipse.wst.jsdt.debug.core.breakpoint.marker">
-      </super>
-      <super
-            type="org.eclipse.jdt.debug.javaExceptionBreakpointMarker">
-      </super>
-      <persistent
-            value="true">
-      </persistent>
-   </extension>
-   <extension
-         point="org.eclipse.debug.core.breakpoints">
-      <breakpoint
-            class="org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptLineBreakpoint"
-            id="org.eclipse.wst.jsdt.debug.core.linebreakpoint"
-            markerType="org.eclipse.wst.jsdt.debug.core.line.breakpoint.marker"
-            name="%linebreakpoint.name">
-      </breakpoint>
-      <breakpoint
-            class="org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptFunctionBreakpoint"
-            id="org.eclipse.wst.jsdt.debug.core.functionbreakpoint"
-            markerType="org.eclipse.wst.jsdt.debug.core.function.breakpoint.marker"
-            name="%methodbreakpoint.name">
-      </breakpoint>
-      <breakpoint
-            class="org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptLoadBreakpoint"
-            id="org.eclipse.wst.jsdt.debug.core.scriptloadbreakpoint"
-            markerType="org.eclipse.wst.jsdt.debug.core.scriptload.breakpoint.marker"
-            name="%scriptloadbreakpoint.name">
-      </breakpoint>
-      <breakpoint
-            class="org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptExceptionBreakpoint"
-            id="org.eclipse.wst.jsdt.debug.core.exceptionbreakpoint"
-            markerType="org.eclipse.wst.jsdt.debug.core.exception.breakpoint.marker"
-            name="%exceptionbreakpoint.name">
-      </breakpoint>
-   </extension>
-   <extension
-         point="org.eclipse.debug.core.launchDelegates">
-      <launchDelegate
-            delegate="org.eclipse.wst.jsdt.debug.internal.core.launching.RemoteJavaScriptLaunchDelegate"
-            delegateDescription="Remote JavaScript"
-            id="org.eclipse.wst.jsdt.debug.core.remoteLaunchDelegate"
-            modes="debug"
-            name="%remoteJsLaunchDelegate.name"
-            sourceLocatorId="org.eclipse.wst.jsdt.debug.core.sourceLocator"
-            sourcePathComputerId="org.eclipse.wst.jsdt.debug.core.source.path.computer"
-            type="org.eclipse.wst.jsdt.debug.core.launchConfigurationType">
-      </launchDelegate>
-   </extension>
-   <extension
-         point="org.eclipse.debug.core.sourceLocators">
-      <sourceLocator
-            class="org.eclipse.wst.jsdt.debug.internal.core.launching.JavaScriptSourceDirector"
-            id="org.eclipse.wst.jsdt.debug.core.sourceLocator"
-            name="%sourceLocator.name">
-      </sourceLocator>
-   </extension>
-   <extension
-         point="org.eclipse.debug.core.watchExpressionDelegates">
-      <watchExpressionDelegate
-            debugModel="org.eclipse.wst.jsdt.debug.model"
-            delegateClass="org.eclipse.wst.jsdt.debug.internal.core.JavaScriptWatchExpressionDelegate">
-      </watchExpressionDelegate>
-   </extension>
-   <extension
-         point="org.eclipse.core.runtime.preferences">
-      <initializer
-            class="org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPreferenceInitializer">
-      </initializer>
-   </extension>
-   <extension
-         point="org.eclipse.wst.jsdt.debug.core.breakpointParticipants">
-      <participant
-            class="org.eclipse.wst.jsdt.debug.internal.core.breakpoints.DefaultJavaScriptBreakpointParticipant"
-            kind="*">
-      </participant>
-   </extension>
-   <extension
-         point="org.eclipse.debug.core.sourcePathComputers">
-      <sourcePathComputer
-            class="org.eclipse.wst.jsdt.debug.internal.core.launching.JavaScriptSourcePathComputerDelegate"
-            id="org.eclipse.wst.jsdt.debug.core.source.path.computer">
-      </sourcePathComputer>
-   </extension>
-
-</plugin>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/schema/breakpointParticipants.exsd b/bundles/org.eclipse.wst.jsdt.debug.core/schema/breakpointParticipants.exsd
deleted file mode 100644
index abd0bc9..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/schema/breakpointParticipants.exsd
+++ /dev/null
@@ -1,146 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.jsdt.debug.core" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.wst.jsdt.debug.core" id="breakpointParticipants" name="Breakpoint Participants"/>
-      </appinfo>
-      <documentation>
-         This extension point allows consumers to provide a breakpoint participant that will be consulted during the decision to suspend the kind of breakpoint the participant applies to.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appinfo>
-            <meta.element />
-         </appinfo>
-      </annotation>
-      <complexType>
-         <sequence minOccurs="1" maxOccurs="unbounded">
-            <element ref="participant"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="participant">
-      <annotation>
-         <documentation>
-            The breakpoint participant
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The class attribute is required and must implement &lt;code&gt;org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpointParticipant&lt;/code&gt;
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn=":org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpointParticipant"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="kind" use="required">
-            <annotation>
-               <documentation>
-                  This attribute specifies the kind of breakpoint this participant should apply to the value &lt;em&gt;*&lt;/em&gt; means it applies to all breakpoint kinds. The value must be one of &lt;em&gt;function&lt;/em&gt;, &lt;em&gt;line&lt;/em&gt;, &lt;em&gt;script&lt;/em&gt; or &lt;em&gt;*&lt;/em&gt;.
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="function">
-                  </enumeration>
-                  <enumeration value="line">
-                  </enumeration>
-                  <enumeration value="script">
-                  </enumeration>
-                  <enumeration value="*">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         1.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         The following example is the real life definition of the Mozilla Rhino participant for line breakpoints.
-&lt;pre&gt;
-&lt;extension point=&quot;org.eclipse.wst.jsdt.debug.core.breakpointParticipants&quot;&gt;
-  &lt;participant
-     class=&quot;org.eclipse.wst.jsdt.debug.internal.rhino.breakpoints.RhinoBreakpointParticipant&quot;
-     kind=&quot;*&quot;&gt;
-  &lt;/participant&gt;
-&lt;/extension&gt;
-&lt;/pre&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiinfo"/>
-      </appinfo>
-      <documentation>
-         The class attribute is required and must implement &lt;code&gt;org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpointParticipant&lt;/code&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2010 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which 
-accompanies this distribution, and is available at 
-&lt;a href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/schema/launchingConnectors.exsd b/bundles/org.eclipse.wst.jsdt.debug.core/schema/launchingConnectors.exsd
deleted file mode 100644
index c7a50c8..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/schema/launchingConnectors.exsd
+++ /dev/null
@@ -1,122 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.jsdt.debug.core" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.wst.jsdt.debug.core" id="launchingConnectors" name="Launching Connectors"/>
-      </appinfo>
-      <documentation>
-         This extension point allows contributors to specify their own definition of a connector
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appinfo>
-            <meta.element />
-         </appinfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="connector"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="connector">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The connector class that implements org.eclipse.e4.languages.javascript.jsdi.connect.Connector
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn=":org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  An id unique to this connector
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         1.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         The following example is the real life definition of the Mozilla Rhino attaching connector.
-&lt;pre&gt;
- &lt;extension
-         point=&quot;org.eclipse.wst.jsdt.debug.core.connectors&quot;&gt;
-      &lt;connector
-            class=&quot;org.eclipse.wst.jsdt.debug.rhino.connect.RhinoAttachingConnector&quot;
-            id=&quot;rhino.attaching.connector&quot;&gt;
-      &lt;/connector&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiinfo"/>
-      </appinfo>
-      <documentation>
-         The class attribute is required and must implement &lt;code&gt;org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector&lt;/code&gt;
-      </documentation>
-   </annotation>
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2010 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which 
-accompanies this distribution, and is available at 
-&lt;a href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/schema/scriptResolvers.exsd b/bundles/org.eclipse.wst.jsdt.debug.core/schema/scriptResolvers.exsd
deleted file mode 100644
index 2de3e5c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/schema/scriptResolvers.exsd
+++ /dev/null
@@ -1,128 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.jsdt.debug.core" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.wst.jsdt.debug.core" id="scriptResolvers" name="scriptResolvers"/>
-      </appinfo>
-      <documentation>
-         This extension point is used to contribute a script solver that is consulted any place in JSDT where a &lt;code&gt;ScriptReference&lt;/code&gt; must be resolved to a workspace-local &lt;code&gt;IFile&lt;/code&gt;.
-&lt;br&gt;&lt;br&gt;
-An example of typical usage is resolving if a breakpoint&apos;s workspace path matches that of a given &lt;code&gt;ScriptReference&lt;/code&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appinfo>
-            <meta.element />
-         </appinfo>
-      </annotation>
-      <complexType>
-         <sequence minOccurs="1" maxOccurs="unbounded">
-            <element ref="scriptResolver"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="scriptResolver">
-      <annotation>
-         <documentation>
-            A resolver that can help determine equality between workspace-local IFiles and JavaScript ScriptReferences
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The fully qualified name of the Java class that implements org.eclipse.wst.jsdt.debug.core.model.ScriptResolver
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.wst.jsdt.debug.core.model.ScriptResolver:"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         3.4
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         The following is an example of the default script resolver:
-&lt;pre&gt;
-   &lt;extension point=&quot;org.eclipse.wst.jsdt.debug.core.scriptResolvers&quot;&gt;
-      &lt;scriptResolver
-            class=&quot;org.eclipse.wst.jsdt.debug.internal.core.model.DefaultScriptResolver&quot;&gt;
-      &lt;/scriptResolver&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiinfo"/>
-      </appinfo>
-      <documentation>
-         The class field must specify the fully qualified name of the the class the extends &lt;code&gt;org.eclipse.wst.jsdt.debug.core.model.AbstractScriptResolver&lt;/code&gt;.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2011 IBM Corporation and others.&lt;br&gt;
-All rights reserved. This program and the accompanying materials are made 
-available under the terms of the Eclipse Public License v1.0 which 
-accompanies this distribution, and is available at 
-&lt;a href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/breakpoints/IJavaScriptBreakpoint.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/breakpoints/IJavaScriptBreakpoint.java
deleted file mode 100644
index df35e1d..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/breakpoints/IJavaScriptBreakpoint.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.breakpoints;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.wst.jsdt.core.IJavaScriptElement;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-
-/**
- * General JavaScript breakpoint
- * 
- * @since 1.0
- */
-public interface IJavaScriptBreakpoint extends IBreakpoint {
-	
-	/**
-	 * The id of the root breakpoint marker type for JavaScript breakpoints
-	 * <br><br>
-	 * Value is: <code>org.eclipse.wst.jsdt.debug.core.breakpoint.marker</code>
-	 * @since 1.1
-	 */
-	public static final String MARKER_ID = "org.eclipse.wst.jsdt.debug.core.breakpoint.marker"; //$NON-NLS-1$
-	/**
-	 * The suspend policy for the breakpoint
-	 */
-	public static final String SUSPEND_POLICY = JavaScriptDebugPlugin.PLUGIN_ID + ".suspend_policy"; //$NON-NLS-1$
-	/**
-	 * The type name within the script
-	 */
-	public static final String TYPE_NAME = JavaScriptDebugPlugin.PLUGIN_ID + ".type_name"; //$NON-NLS-1$
-	/**
-	 * Breakpoint attribute for the path of the script
-	 */
-	public static final String SCRIPT_PATH = JavaScriptDebugPlugin.PLUGIN_ID + ".script_path"; //$NON-NLS-1$
-	/**
-	 * The hit count set in the breakpoint
-	 */
-	public static final String HIT_COUNT = JavaScriptDebugPlugin.PLUGIN_ID + ".hit_count"; //$NON-NLS-1$
-	
-	/**
-	 * Suspend policy for suspending the current thread of execution
-	 */
-	public static final int SUSPEND_THREAD = 1;
-	/**
-	 * Suspend policy for suspending the current target
-	 */
-	public static final int SUSPEND_TARGET = 2;
-	/**
-	 * JSDT member handle
-	 */
-	public static final String ELEMENT_HANDLE = JavaScriptDebugPlugin.PLUGIN_ID + ".handle"; //$NON-NLS-1$
-	
-	/**
-	 * Returns the path of the script as it was set when the breakpoint was created.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the path of the script this breakpoint was created on never <code>null</code>
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public String getScriptPath() throws CoreException;
-	
-	/**
-	 * Returns the type name that the breakpoint is set within.<br>
-	 * <br>
-	 * This method can return <code>null</code> when the breakpoint is set
-	 * on a top-level type i.e. set on the root source
-	 * 
-	 * @return the type name or <code>null</code>
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public String getTypeName() throws CoreException;
-	
-	/**
-	 * Returns the hit count set for this breakpoint 
-	 * or -1 if no hit count has been set.
-	 * 
-	 * @return the hit count
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public int getHitCount() throws CoreException;
-	
-	/**
-	 * Sets the given hit count for the breakpoint, 
-	 * throws an {@link IllegalArgumentException} if the given count is less than 1.
-	 * 
-	 * @param count the count to set, must be &gt; 0
-	 * @throws CoreException
-	 * @throws IllegalArgumentException if count &lt; 1
-	 */
-	public void setHitCount(int count) throws CoreException, IllegalArgumentException;
-	
-	/**
-	 * Returns the suspend policy for this breakpoint, 
-	 * default suspend policy is to suspend the thread
-	 * 
-	 * @see #SUSPEND_THREAD
-	 * @see #SUSPEND_TARGET
-	 * @return the suspend policy
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public int getSuspendPolicy() throws CoreException;
-	
-	/**
-	 * Sets the suspend policy for this breakpoint. Anything 
-	 * other than {@link #SUSPEND_THREAD} or {@link #SUSPEND_TARGET}
-	 * will be ignored.
-	 * 
-	 * @see #SUSPEND_THREAD
-	 * @see #SUSPEND_TARGET
-	 * @param policy the policy to set
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public void setSuspendPolicy(int policy) throws CoreException;
-	
-	/**
-	 * Returns the {@link IJavaScriptElement} handle for the member
-	 * this breakpoint is set on.<br>
-	 * <br>
-	 * This method can return <code>null</code> if no element handle has been set
-	 * 
-	 * @return the {@link IJavaScriptElement} handle or <code>null</code>
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public String getJavaScriptElementHandle() throws CoreException;
-	
-	/**
-	 * Allows the {@link IJavaScriptElement} handle to be set for this breakpoint.
-	 * 
-	 * @param handle the new handle to set, <code>null</code> will remove any existing handle
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public void setJavaScriptElementHandle(String handle) throws CoreException;
-	
-	/**
-	 * Returns if the breakpoint is currently installed or not.
-	 * 
-	 * @return <code>true</code> if the breakpoint is installed <code>false</code> otherwise
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public boolean isInstalled() throws CoreException;
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/breakpoints/IJavaScriptBreakpointParticipant.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/breakpoints/IJavaScriptBreakpointParticipant.java
deleted file mode 100644
index b2c7f36..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/breakpoints/IJavaScriptBreakpointParticipant.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.breakpoints;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread;
-
-/**
- * Describes a participant that will be consulted during the 
- * suspending / resuming of an {@link IJavaScriptBreakpoint}.<br>
- * <br>
- * Every participant has a distinct vote to resume or suspend a breakpoint.
- * 
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface IJavaScriptBreakpointParticipant {
-
-	/**
-	 * Return code in response to a "breakpoint hit" notification, indicating
-	 * a vote to suspend the associated thread.
-	 */
-	public static int SUSPEND = 0x0001;
-	/**
-	 * Return code in response to a "breakpoint hit" notification, indicating
-	 * a vote to not suspend (i.e. resume) the associated thread.
-	 */
-	public static int DONT_SUSPEND = 0x0002;
-	/**
-	 * Return code indicating that this listener should not be considered
-	 * in a vote to suspend a thread or install a breakpoint.
-	 */
-	public static int DONT_CARE = 0x0000;
-	
-	/**
-	 * Notification that the given breakpoint has been hit
-	 * in the specified thread. Allows this listener to
-	 * vote to determine if the given thread should be suspended in
-	 * response to the breakpoint. If at least one listener votes to
-	 * <code>SUSPEND</code>, the thread will suspend. If there
-	 * are no votes to suspend the thread, there must be at least one
-	 * <code>DONT_SUSPEND</code> vote to avoid the suspension (resume). If all
-	 * listeners vote <code>DONT_CARE</code>, the thread will suspend by default.
-	 * <p>
-	 * The thread the breakpoint has been encountered in is now suspended. Listeners
-	 * may query thread state and perform evaluations. All subsequent breakpoints
-	 * in this thread will be ignored until voting has completed.
-	 * </p>
-	 * @param thread the JavaScript thread
-	 * @param breakpoint the {@link IJavaScriptBreakpoint}
-	 * @return whether the thread should suspend or whether this
-	 *  listener doesn't care - one of <code>SUSPEND</code>, 
-	 *  <code>DONT_SUSPEND</code>, or <code>DONT_CARE</code>
-	 */
-	public int breakpointHit(IJavaScriptThread thread, IJavaScriptBreakpoint breakpoint);
-	
-	/**
-	 * Notification that the given {@link ScriptReference} has been loaded
-	 * in the specified thread. Allows this listener to
-	 * vote to determine if the given thread should be suspended in
-	 * response to the breakpoint. If at least one listener votes to
-	 * <code>SUSPEND</code>, the thread will suspend. If there
-	 * are no votes to suspend the thread, there must be at least one
-	 * <code>DONT_SUSPEND</code> vote to avoid the suspension (resume). If all
-	 * listeners vote <code>DONT_CARE</code>, the thread will suspend by default.
-	 * <p>
-	 * The thread the breakpoint has been encountered in is now suspended. Listeners
-	 * may query thread state and perform evaluations. All subsequent breakpoints
-	 * in this thread will be ignored until voting has completed.
-	 * </p>
-	 * @param thread the JavaScript thread
-	 * @param script the {@link ScriptReference} that has been loaded
-	 * @param breakpoint the {@link IJavaScriptBreakpoint}
-	 * @return whether the thread should suspend or whether this
-	 *  listener doesn't care - one of <code>SUSPEND</code>, 
-	 *  <code>DONT_SUSPEND</code>, or <code>DONT_CARE</code>
-	 */
-	public int scriptLoaded(IJavaScriptThread thread, ScriptReference script, IJavaScriptBreakpoint breakpoint);
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/breakpoints/IJavaScriptFunctionBreakpoint.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/breakpoints/IJavaScriptFunctionBreakpoint.java
deleted file mode 100644
index 5f005ba..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/breakpoints/IJavaScriptFunctionBreakpoint.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.breakpoints;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-
-/**
- * Abstract description of a JavaScript function breakpoint
- * 
- * @since 1.0
- */
-public interface IJavaScriptFunctionBreakpoint extends IJavaScriptLineBreakpoint {
-
-	/**
-	 * The id of the attribute for a method signature
-	 */
-	public static final String FUNCTION_SIGNAURE = JavaScriptDebugPlugin.PLUGIN_ID + ".function_signature"; //$NON-NLS-1$
-	/**
-	 * The id of the attribute for the function name
-	 */
-	public static final String FUNCTION_NAME = JavaScriptDebugPlugin.PLUGIN_ID + ".function_name"; //$NON-NLS-1$
-	/**
-	 * Registered marker id for a JavaScript function breakpoint
-	 */
-	public static final String MARKER_ID = "org.eclipse.wst.jsdt.debug.core.function.breakpoint.marker"; //$NON-NLS-1$
-
-	/**
-	 * Returns if the breakpoint will suspend when the function is entered.
-	 * 
-	 * @return <code>true</code> if the breakpoint is set to suspend when entering the function <code>false</code> otherwise
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public boolean isEntry() throws CoreException;
-	
-	/**
-	 * Sets if this will be a function entry breakpoint.
-	 * 
-	 * @param isentry if the breakpoint should suspend when the function is entered
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public void setEntry(boolean isentry) throws CoreException;
-	
-	/**
-	 * Returns if the breakpoint will suspend when the function is exited.
-	 * 
-	 * @return <code>true</code> if the breakpoint is set to suspend when exiting the function <code>false</code> otherwise
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public boolean isExit() throws CoreException;
-	
-	/**
-	 * Sets if this will be a function exit breakpoint.
-	 * 
-	 * @param isexit if the breakpoint should suspend when the function is exited
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public void setExit(boolean isexit) throws CoreException;
-	
-	/**
-	 * Returns the function name set in the breakpoint.
-	 * 
-	 * @return the function name or <code>null</code> if none
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public String getFunctionName() throws CoreException;
-	
-	/**
-	 * Returns the function signature set in the breakpoint.
-	 * 
-	 * @return the function signature or <code>null</code> if none
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public String getSignature() throws CoreException;
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/breakpoints/IJavaScriptLineBreakpoint.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/breakpoints/IJavaScriptLineBreakpoint.java
deleted file mode 100644
index eb2e5d9..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/breakpoints/IJavaScriptLineBreakpoint.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.breakpoints;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.model.ILineBreakpoint;
-
-/**
- * Abstract description of a line breakpoint for JavaScript
- * 
- * @since 1.0
- */
-public interface IJavaScriptLineBreakpoint extends ILineBreakpoint, IJavaScriptBreakpoint {
-
-	/**
-	 * Registered marker id for a JavaScript line breakpoint
-	 */
-	public static final String MARKER_ID = "org.eclipse.wst.jsdt.debug.core.line.breakpoint.marker"; //$NON-NLS-1$
-	
-	/**
-	 * Returns the condition set for this breakpoint or <code>null</code>.
-	 * 
-	 * @return the condition or <code>null</code> if one has not been set
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public String getCondition() throws CoreException;
-	
-	/**
-	 * Sets the given condition for the breakpoint.
-	 * 
-	 * @param condition the new condition to set. <code>null</code> has the effect of erasing the current condition
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public void setCondition(String condition) throws CoreException;
-	
-	/**
-	 * Returns if the condition for this breakpoint is enabled or not
-	 * 
-	 * @return if the condition is enabled
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public boolean isConditionEnabled() throws CoreException;
-	
-	/**
-	 * Allows the enabled state of the condition to be set
-	 * 
-	 * @param enabled if the condition should be enabled. Disabling a condition does not remove it.
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public void setConditionEnabled(boolean enabled) throws CoreException;
-	
-	/**
-	 * Returns if the breakpoint should suspend when the assigned condition evaluates to <code>true</code>.
-	 * 
-	 * @return true if the breakpoint should suspend when the condition is true
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public boolean isConditionSuspendOnTrue() throws CoreException;
-	
-	/**
-	 * Sets if the condition for this breakpoint will suspend when it evaluates to <code>true</code>.
-	 * 
-	 * @param suspendontrue if the condition should suspend when it evaluates to <code>true</code>
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public void setConditionSuspendOnTrue(boolean suspendontrue) throws CoreException;
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/breakpoints/IJavaScriptLoadBreakpoint.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/breakpoints/IJavaScriptLoadBreakpoint.java
deleted file mode 100644
index 819d8db..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/breakpoints/IJavaScriptLoadBreakpoint.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.breakpoints;
-
-/**
- * Abstract description of a JavaScript script load breakpoint
- * 
- * @since 1.0
- */
-public interface IJavaScriptLoadBreakpoint extends IJavaScriptLineBreakpoint {
-
-	/**
-	 * Registered marker id for a JavaScript script load breakpoint
-	 */
-	public static final String MARKER_ID = "org.eclipse.wst.jsdt.debug.core.scriptload.breakpoint.marker"; //$NON-NLS-1$
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/ArrayReference.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/ArrayReference.java
deleted file mode 100644
index d97498b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/ArrayReference.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi;
-
-import java.util.List;
-
-/**
- * Abstract representation of an array.
- * 
- * @see ObjectReference
- * @see Value
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface ArrayReference extends ObjectReference {
-
-	/**
-	 * Returns the current number of {@link Value}s in this array.
-	 * 
-	 * @return the number of {@link Value}s in the array
-	 */
-	public int length();
-
-	/**
-	 * Returns the {@link Value} at the given index in this array. If the bounds are outside of the
-	 * array bounds an {@link ArrayIndexOutOfBoundsException} is thrown. If there is a <code>null</code> entry
-	 * in the array {@link NullValue} is returned.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @param index the index of the {@link Value} to retrieve
-	 * 
-	 * @return the {@link Value} at the given index
-	 * @throws IndexOutOfBoundsException if the index is outside the bounds of this array. 
-	 * For example if <code>index &lt; 0</code> or <code>index &gt; {@link #length()}</code>
-	 */
-	public Value getValue(int index) throws IndexOutOfBoundsException;
-
-	/**
-	 * Returns the live list of {@link Value}s in the array or an empty list.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the live list of {@link Value}s in this array or an empty list, never <code>null</code>
-	 */
-	public List/* <Value> */getValues();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/BooleanValue.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/BooleanValue.java
deleted file mode 100644
index 02e3412..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/BooleanValue.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi;
-
-/**
- * Represents a boolean value with-respect-to JavaScript debugging.
- * 
- * @see Value
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface BooleanValue extends PrimitiveValue {
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/FunctionReference.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/FunctionReference.java
deleted file mode 100644
index f01816c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/FunctionReference.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi;
-
-/**
- * Abstract representation of a function object with-respect-to Javascript debugging.
- * 
- * @see ObjectReference
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface FunctionReference extends ObjectReference {
-
-	/**
-	 * Returns the name of the function as it has been defined at the creation time of this value.
-	 * 
-	 * @return the name of the function
-	 */
-	public String functionName();
-	
-	/**
-	 * Returns the source code for the body of the function.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the source code for the function body
-	 */
-	public String functionBody();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/IncompatibleThreadStateException.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/IncompatibleThreadStateException.java
deleted file mode 100644
index 6baf57f..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/IncompatibleThreadStateException.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi;
-
-/**
- * Exception that is thrown when a request is made to a {@link ThreadReference}
- * which is not allowed based on its current state.
- * 
- * Clients can instantiate this class.
- * 
- * @since 1.0
- */
-public final class IncompatibleThreadStateException extends Exception {
-    private static final long serialVersionUID = 1L;
-   
-	/**
-	 * Constructor
-	 * 
-	 * @param message the backing message for the exception
-	 * @param cause the cause (if any) for this exception. <code>null</code> is
-	 * accepted.
-	 */
-	public IncompatibleThreadStateException(String message, Throwable cause) {
-		super(message, cause);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/IncompatibleVmStateException.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/IncompatibleVmStateException.java
deleted file mode 100644
index 39546d2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/IncompatibleVmStateException.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi;
-
-/**
- * Exception that is thrown when a request is made to a {@link VirtualMachine}
- * that is not allowed based on its current state.
- * 
- * Clients can instantiate this class.
- * 
- * @since 1.0
- */
-public final class IncompatibleVmStateException extends Exception {
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param message the backing message for the exception
-	 * @param cause the cause (if any) for this exception. <code>null</code> is
-	 * accepted.
-	 */
-	public IncompatibleVmStateException(String message, Throwable cause) {
-		super(message, cause);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Locatable.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Locatable.java
deleted file mode 100644
index 6b20329..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Locatable.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi;
-
-/**
- * Description of a JSDI element that has a location
- * 
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface Locatable {
-
-	/**
-	 * Returns the {@link Location}.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the {@link Location} or <code>null</code> if the location could not be computed
-	 */
-	public Location location();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Location.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Location.java
deleted file mode 100644
index c24a992..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Location.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi;
-
-/**
- * Abstract representation of a given location in a {@link ScriptReference}.<br>
- * <br>
- * A {@link Location} can be a line number and / or a function name.
- * 
- * @see ScriptReference
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface Location {
-
-	/**
-	 * Returns the underlying {@link ScriptReference} for this {@link Location} or <code>null</code> if there was an exception creating the location.
-	 * 
-	 * @return the underlying {@link ScriptReference} or <code>null</code>.
-	 */
-	public ScriptReference scriptReference();
-
-	/**
-	 * Returns the line number of this location within its underlying {@link ScriptReference}
-	 * 
-	 * @return the line number in the {@link ScriptReference}
-	 */
-	public int lineNumber();
-
-	/**
-	 * Returns the name of the function this location resides in, if any
-	 * 
-	 * @return the function name this location resides in or <code>null</code> if this location is not enclosed by a function
-	 */
-	public String functionName();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Mirror.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Mirror.java
deleted file mode 100644
index 8e9f684..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Mirror.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-
-/**
- * Abstract representation of an object that can be mirrored in a {@link VirtualMachine}.
- * 
- * @see Event
- * @see EventRequest
- * @see EventSet
- * @see Property
- * @see ScriptReference
- * @see StackFrame
- * @see ThreadReference
- * @see Value
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface Mirror {
-
-	/**
-	 * Returns the handle to the {@link VirtualMachine} that this mirror object was spawned from
-	 * 
-	 * @return the {@link VirtualMachine} handle that this mirror was spawned from
-	 */
-	public VirtualMachine virtualMachine();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/NullValue.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/NullValue.java
deleted file mode 100644
index fc47f8b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/NullValue.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi;
-
-/**
- * Abstract representation of the value Null (<code>null</code>).
- * 
- * @see Value
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface NullValue extends Value {
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/NumberValue.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/NumberValue.java
deleted file mode 100644
index e6f9605..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/NumberValue.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi;
-
-/**
- * Abstract representation of a {@link Number} value with-respect-to JavaScript debugging.
- * 
- * @see Value
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface NumberValue extends PrimitiveValue {
-
-	/**
-	 * Represents the value for 'Not A Number'
-	 */
-	public static final String NAN = "NaN"; //$NON-NLS-1$
-	/**
-	 * Represents the value for negative infinity
-	 */
-	public static final String NEG_INFINITY = "-Infinity"; //$NON-NLS-1$
-	/**
-	 * Represents the value for positive infinity
-	 */
-	public static final String INFINITY = "Infinity"; //$NON-NLS-1$
-
-	/**
-	 * Returns the underlying {@link Number} value for this value.<br>
-	 * <br>
-	 * This method can return <code>null</code> if its value is not a number.
-	 * 
-	 * @return the underlying {@link Number} value
-	 * @see #NAN
-	 * @see #NEG_INFINITY
-	 * @see #INFINITY
-	 */
-	public Number value();
-
-	/**
-	 * Returns if the this {@link NumberValue} is a valid number or not.
-	 * 
-	 * @return true if this is a valid number false otherwise.
-	 * @see #NAN
-	 * @see #NEG_INFINITY
-	 * @see #INFINITY
-	 */
-	public boolean isNaN();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/ObjectReference.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/ObjectReference.java
deleted file mode 100644
index e0d7947..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/ObjectReference.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi;
-
-import java.util.List;
-
-/**
- * Abstract representation of an object with-respect-to JavaScript debugging
- * 
- * @see Value
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface ObjectReference extends Value {
-
-	/**
-	 * The name of the class represented by the {@link ObjectReference} or <code>null</code> if one cannot be determined.<br>
-	 * <br>
-	 * In ECMA this will typically be the same as {@link prototype().className()}.
-	 * 
-	 * @return the name of the class or <code>null</code>
-	 */
-	public String className();
-
-	/**
-	 * The {@link FunctionReference} that can be used to create a reflected instance of the underlying class for this object or {@link NullValue} if one cannot be determined.
-	 * 
-	 * @return the {@link FunctionReference} used to create a reflected instance of the underlying class or {@link NullValue}
-	 */
-	public Value constructor();
-
-	/**
-	 * The prototype object for this {@link ObjectReference} or {@link NullValue} if one cannot be determined.<br>
-	 * <br>
-	 * 
-	 * The prototype should be the smallest enclosing prototype that parents this {@link ObjectReference}. If no prototype can be determined <code>Object.prototype</code> should be returned, but {@link NullValue} is allowed.
-	 * 
-	 * @return the prototype for this {@link ObjectReference} or {@link NullValue}
-	 */
-	public Value prototype();
-
-	/**
-	 * The properties for this {@link ObjectReference} or an empty list, never <code>null</code>
-	 * 
-	 * @return the list of {@link Property} objects for this {@link ObjectReference} or an empty listing.
-	 */
-	public List/* <PropertyReference> */properties();
-
-	/**
-	 * The object reference id - this value should be unique and never <code>null</code>
-	 * 
-	 * @return the id of this {@link ObjectReference} never <code>null</code>
-	 */
-	public Number id();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/PrimitiveValue.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/PrimitiveValue.java
deleted file mode 100644
index e3f6664..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/PrimitiveValue.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi;
-
-/**
- * Abstract representation of a primitive value with-respect-to JavaScript debugging
- * 
- * @see Value
- * @see BooleanValue
- * @see NumberValue
- * @see StringValue
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface PrimitiveValue extends Value {
-
-	/**
-	 * Returns the integer for the value.
-	 * 
-	 * @return the integer value
-	 */
-	public int intValue();
-	
-	/**
-	 * Returns the double for the value.
-	 * 
-	 * @return the double value
-	 */
-	public double doubleValue();
-	
-	/**
-	 * Returns the boolean for the value.
-	 * 
-	 * @return the boolean value
-	 */
-	public boolean booleanValue();
-	
-	/**
-	 * Returns the String value for the value.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the {@link String} value
-	 */
-	public String stringValue();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Property.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Property.java
deleted file mode 100644
index a4aaf3c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Property.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi;
-
-/**
- * Abstract description of an object property.
- * 
- * @see Mirror
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface Property extends Mirror {
-
-	/**
-	 * Returns the name of this {@link Property} or <code>null</code> if one could not be determined.
-	 * 
-	 * @return the name of this {@link Property} or <code>null</code>.
-	 */
-	public String name();
-	
-	/**
-	 * Returns the value of this {@link Property}.
-	 * 
-	 * @return the value of this {@link Property}.
-	 */
-	public Value value();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/ScriptReference.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/ScriptReference.java
deleted file mode 100644
index 9accd8a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/ScriptReference.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi;
-
-import java.net.URI;
-import java.util.List;
-
-/**
- * Describes a JavaScript script object.<br>
- * <br>
- * A script object has {@link Location} information for all of the lines and {@link FunctionReference}s contained within it.
- * 
- * @see FunctionReference
- * @see Location
- * @see Mirror
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface ScriptReference extends Mirror {
-
-	/**
-	 * Returns the complete live list of line locations in this script. <br>
-	 * <br>
-	 * This method cannot return <code>null</code>.
-	 * 
-	 * @return the line locations in this script or an empty list, never <code>null</code>
-	 * @see Location
-	 * @see #lineLocation(int)
-	 */
-	public List/* <Location> */allLineLocations();
-
-	/**
-	 * Returns the {@link Location} information for the given line number in this script.<br>
-	 * <br>
-	 * This method can return <code>null</code>.
-	 * 
-	 * @param lineNumber
-	 * @return the {@link Location} information for the given line number or <code>null</code>.
-	 * @see Location
-	 * @see #allLineLocations()
-	 */
-	public Location lineLocation(int lineNumber);
-
-	/**
-	 * Returns the complete live list of function locations in this script.<br>
-	 * <br>
-	 * This method can return <code>null</code>.
-	 * 
-	 * @return the function locations in this script
-	 * @see Location
-	 * @see #functionLocation(String)
-	 */
-	public List/* <Location> */allFunctionLocations();
-
-	/**
-	 * Returns the {@link Location} information for a function with the given name in this script.<br>
-	 * <br>
-	 * This method can return <code>null</code>.
-	 * 
-	 * @param functionName
-	 * @return the {@link Location} information for a function with the given name
-	 * @see Location
-	 * @see #allFunctionLocations()
-	 */
-	public Location functionLocation(String functionName);
-
-	/**
-	 * Returns the entire known source for this script at the time this method is called.<br>
-	 * <br>
-	 * This method can return <code>null</code>.
-	 * 
-	 * @return the source for this script
-	 */
-	public String source();
-
-	/**
-	 * Returns the {@link URI} to the source of this script.<br>
-	 * <br>
-	 * This method will not return <code>null</code>.
-	 * 
-	 * @return the {@link URI} to the source of this script
-	 */
-	public URI sourceURI();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/StackFrame.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/StackFrame.java
deleted file mode 100644
index 1628482..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/StackFrame.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi;
-
-import java.util.List;
-
-/**
- * Abstract description of a stack frame
- * 
- * @see Location
- * @see Mirror
- * @see Value
- * @see Variable
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface StackFrame extends Mirror {
-
-	/**
-	 * Returns the value of <code>this</code> for the current frame.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the 'this' ObjectReference never <code>null</code>
-	 */
-	public Variable thisObject();
-
-	/**
-	 * The visible variables for this {@link StackFrame}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>.
-	 * 
-	 * @return the list of {@link Variable} objects for this {@link StackFrame} or an empty list, never <code>null</code>
-	 */
-	public List/* <Variable> */variables();
-
-	/**
-	 * The current {@link Location} associated with this {@link StackFrame}.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the {@link Location} associated with this {@link StackFrame} or <code>null</code>
-	 */
-	public Location location();
-
-	/**
-	 * Evaluates the given expression in the context of this {@link StackFrame}
-	 * and returns the resulting {@link Value}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code> but can return the {@link NullValue}
-	 * 
-	 * @return the {@link Value} result of evaluating the expression never <code>null</code>
-	 */
-	public Value evaluate(String expression);
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/StringValue.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/StringValue.java
deleted file mode 100644
index e13d168..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/StringValue.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi;
-
-/**
- * Abstract representation of a String literal with-respect-to JavaScript debugging
- * 
- * @see Value
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface StringValue extends Value {
-
-	/**
-	 * Returns the underlying value of the string.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the value of the string or <code>null</code>
-	 */
-	public String value();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/ThreadReference.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/ThreadReference.java
deleted file mode 100644
index 3ef8c2f..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/ThreadReference.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi;
-
-import java.util.List;
-
-/**
- * Abstract description of a thread
- * 
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface ThreadReference extends Mirror {
-
-	/**
-	 * Constant indicating the state of the thread is unknown<br>
-	 * <br>
-	 * Value is: <code>-1</code> 
-	 */
-	public static final int THREAD_STATUS_UNKNOWN = -1;
-	/**
-	 * Constant indicating the thread is in a zombie state<br>
-	 * <br>
-	 * Value is: <code>0</code>
-	 */
-	public static final int THREAD_STATUS_ZOMBIE = 0;
-	/**
-	 * Constant indicating the thread is in a running state<br>
-	 * <br>
-	 * Value is: <code>1</code>
-	 */
-	public static final int THREAD_STATUS_RUNNING = 1;
-	/**
-	 * Constant indicating the thread is in a sleeping state<br>
-	 * <br>
-	 * Value is: <code>2</code>
-	 */
-	public static final int THREAD_STATUS_SLEEPING = 2;
-	/**
-	 * Constant indicating the thread is holding a monitor<br>
-	 * <br>
-	 * Value is: <code>3</code>
-	 */
-	public static final int THREAD_STATUS_MONITOR = 3;
-	/**
-	 * Constant indicating the thread is waiting for a monitor<br>
-	 * <br>
-	 * Value is: <code>4</code>
-	 */
-	public static final int THREAD_STATUS_WAIT = 4;
-	/**
-	 * Constant indicating the thread has not been started<br>
-	 * <br>
-	 * Value is: <code>5</code>
-	 */
-	public static final int THREAD_STATUS_NOT_STARTED = 5;
-
-	/**
-	 * Returns the total stack frame count for this thread
-	 * 
-	 * @return the total stack frame count
-	 */
-	public int frameCount();
-
-	/**
-	 * Returns the stack frame for the given index in this thread.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the stack frame at the given index or <code>null</code>
-	 */
-	public StackFrame frame(int index);
-
-	/**
-	 * Returns the live list of stack frames for this thread.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the list of stack frames from this thread or an empty list, never <code>null</code>
-	 */
-	public List /*<StackFrame>*/ frames();
-
-	/**
-	 * Send a request to interrupt this threads' execution.
-	 */
-	public void interrupt();
-
-	/**
-	 * Sends a request to resume this thread, iff it is in the suspended state.
-	 */
-	public void resume();
-
-	/**
-	 * Sends a request to suspend this thread, iff it is not already in a suspended state.
-	 */
-	public void suspend();
-
-	/**
-	 * Returns the status of this thread.
-	 * 
-	 * @see #THREAD_STATUS_MONITOR
-	 * @see #THREAD_STATUS_NOT_STARTED
-	 * @see #THREAD_STATUS_RUNNING
-	 * @see #THREAD_STATUS_SLEEPING
-	 * @see #THREAD_STATUS_UNKNOWN
-	 * @see #THREAD_STATUS_WAIT
-	 * @see #THREAD_STATUS_ZOMBIE
-	 * 
-	 * @return the status of this thread
-	 */
-	public int status();
-
-	/**
-	 * Returns whether or not this thread is currently suspended on a breakpoint.
-	 * 
-	 * @return <code>true</code> if the thread is suspended on a breakpoint <code>false</code> otherwise
-	 */
-	public boolean isAtBreakpoint();
-
-	/**
-	 * Returns if this thread is currently in a suspended state.
-	 * 
-	 * @return <code>true</code> if the thread is suspended <code>false</code> otherwise
-	 */
-	public boolean isSuspended();
-
-	/**
-	 * Returns the simple name of this thread.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the name of the thread or <code>null</code>
-	 */
-	public String name();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/UndefinedValue.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/UndefinedValue.java
deleted file mode 100644
index 11313bf..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/UndefinedValue.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi;
-
-/**
- * Abstract representation of the JavaScript value <code>undefined</code>
- * 
- * @see StringValue
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface UndefinedValue extends Value {
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Value.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Value.java
deleted file mode 100644
index 44b11ff..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Value.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi;
-
-/**
- * Abstract representation of a value.
- * 
- * @see Mirror
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface Value extends Mirror {
-	/**
-	 * Returns the string representation of the value.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the string representation of the value or <code>null</code>
-	 */
-	public String valueString();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Variable.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Variable.java
deleted file mode 100644
index d85bb5b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Variable.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi;
-
-/**
- * Abstract description of a variable.
- * 
- * @see Property
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface Variable extends Property {
-
-	/**
-	 * Returns <code>true</code> if this variable is an argument <code>false</code> otherwise.
-	 * 
-	 * @return <code>true</code> if this variable is an argument <code>false</code> otherwise
-	 */
-	public boolean isArgument();
-
-	/**
-	 * Returns <code>true</code> if this variable is externally visible in the context of the given {@link StackFrame}.
-	 * 
-	 * @param frame the {@link StackFrame} context
-	 * @return <code>true</code> if this variable is externally visible within the given {@link StackFrame} <code>false</code> otherwise
-	 */
-	public boolean isVisible(StackFrame frame);
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/VirtualMachine.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/VirtualMachine.java
deleted file mode 100644
index 6842c3c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/VirtualMachine.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi;
-
-import java.util.List;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager;
-
-/**
- * Abstract description of a VM. 
- * This interface is used to abstract the platform model from the underlying connection / debugger protocol.
- * 
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface VirtualMachine {
-	
-	public final int DEFAULT_TIMEOUT = 30000;
-	
-	/**
-	 * Sends a resume request to the VM
-	 */
-	public void resume();
-
-	/**
-	 * Sends a suspend request to the VM
-	 */
-	public void suspend();
-
-	/**
-	 * Terminates and disconnects the VM
-	 */
-	public void terminate();
-
-	/**
-	 * Returns the name of the {@link VirtualMachine}.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the name of the {@link VirtualMachine} or <code>null</code>
-	 */
-	public String name();
-
-	/**
-	 * Returns the description of the {@link VirtualMachine}.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the description of the {@link VirtualMachine} or <code>null</code>
-	 */
-	public String description();
-
-	/**
-	 * Returns the version string of the {@link VirtualMachine}.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the version string of the {@link VirtualMachine} or <code>null</code>
-	 */
-	public String version();
-
-	/**
-	 * Returns the live list of {@link ThreadReference}s in the {@link VirtualMachine} 
-	 * or an empty list.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the live list of {@link ThreadReference}s in the {@link VirtualMachine} 
-	 * or an empty list, never <code>null</code>
-	 */
-	public List /*<ThreadReference>*/ allThreads();
-
-	/**
-	 * Returns the live list of {@link ScriptReference}s loaded in the {@link VirtualMachine} 
-	 * or an empty list.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the live list of loaded {@link ScriptReference}s 
-	 * or an empty list, never <code>null</code>
-	 */
-	public List /*<ScriptReference>*/ allScripts();
-
-	/**
-	 * Disposes the {@link VirtualMachine} and cleans up held objects
-	 */
-	public void dispose();
-
-	/**
-	 * Returns the {@link UndefinedValue} value.
-	 * 
-	 * @return the {@link UndefinedValue} value
-	 */
-	public UndefinedValue mirrorOfUndefined();
-
-	/**
-	 * Returns the {@link NullValue} value.
-	 * 
-	 * @return the {@link NullValue} value.
-	 */
-	public NullValue mirrorOfNull();
-
-	/**
-	 * Returns a new {@link BooleanValue}.
-	 * 
-	 * @param bool the boolean primitive to mirror in the {@link VirtualMachine}
-	 * 
-	 * @return a new {@link BooleanValue}
-	 */
-	public BooleanValue mirrorOf(boolean bool);
-
-	/**
-	 * Returns a new {@link NumberValue}.
-	 * 
-	 * @param number the {@link Number} to mirror in the {@link VirtualMachine}
-	 * 
-	 * @return a new {@link NumberValue}
-	 */
-	public NumberValue mirrorOf(Number number);
-
-	/**
-	 * Returns a {@link StringValue} initialized to the given {@link String}.
-	 * 
-	 * @param string the initial value for the mirrored {@link StringValue}
-	 * 
-	 * @return a new {@link StringValue}
-	 */
-	public StringValue mirrorOf(String string);
-
-	/**
-	 * Returns the {@link EventRequestManager} associated with this {@link VirtualMachine}.<br>
-	 * <br>
-	 * This method can return <code>null</code> if the {@link VirtualMachine} has been disposed or terminated.
-	 * 
-	 * @return the {@link EventRequestManager} for this {@link VirtualMachine} or <code>null</code>
-	 */
-	public EventRequestManager eventRequestManager();
-
-	/**
-	 * Returns the {@link EventQueue} associated with this {@link VirtualMachine}.<br>
-	 * <br>
-	 * This method can return <code>null</code> if the {@link VirtualMachine} has been disposed or terminated.
-	 * 
-	 * @return the {@link EventQueue} for this {@link VirtualMachine} or <code>null</code>
-	 */
-	public EventQueue eventQueue();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/connect/AttachingConnector.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/connect/AttachingConnector.java
deleted file mode 100644
index a5c2289..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/connect/AttachingConnector.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.connect;
-
-import java.io.IOException;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Description of a {@link VirtualMachine} {@link Connector} that attaches to a 
- * running {@link VirtualMachine}.
- * 
- * Clients can implement or extend this interface.
- * 
- * @see Argument
- * @see Connector
- * @see VirtualMachine
- * @since 1.0
- */
-public interface AttachingConnector extends Connector {
-	
-	/**
-	 * Attaches to a {@link VirtualMachine} described by the
-	 * given map of arguments.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>. If a connection cannot be made 
-	 * an {@link IOException} is thrown.
-	 * 
-	 * @param arguments the map of connection arguments which cannot be <code>null</code>
-	 * @see BooleanArgument
-	 * @see IntegerArgument
-	 * @see StringArgument
-	 * @see SelectedArgument
-	 * 
-	 * @return the {@link VirtualMachine} that has been connected to never <code>null</code>
-	 * @throws IOException if the {@link Connector} failed to connect
-	 */
-	public VirtualMachine attach(Map arguments) throws IOException;
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/connect/Connector.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/connect/Connector.java
deleted file mode 100644
index d34dff7..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/connect/Connector.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.connect;
-
-import java.io.Serializable;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Describes an extensible connector for JSDI.
- * 
- * Clients can implement or extend this interface.
- * 
- * @since 1.0
- */
-public interface Connector {
-	
-	/**
-	 * Default description of an argument that this {@link Connector} can support
-	 */
-	public interface Argument extends Serializable {
-		/**
-		 * A human readable description of the {@link Argument}.<br>
-		 * <br>
-		 * This method can return <code>null</code>
-		 * 
-		 * @return the description of the {@link Argument} or <code>null</code>
-		 */
-		public String description();
-
-		/**
-		 * The simple label of the {@link Argument}.<br>
-		 * <br>
-		 * This method can return <code>null</code>
-		 * 
-		 * @return the label for this {@link Argument} or <code>null</code>
-		 */
-		public String label();
-
-		/**
-		 * Returns <code>true</code> if this {@link Argument} is required <code>false</code> otherwise.
-		 * 
-		 * @return <code>true</code> if this {@link Argument} is required <code>false</code> otherwise
-		 */
-		public boolean mustSpecify();
-
-		/**
-		 * The name of the {@link Argument}.<br>
-		 * <br>
-		 * This method can return <code>null</code>
-		 * 
-		 * @return the name or the {@link Argument} or <code>null</code>
-		 */
-		public String name();
-
-		/**
-		 * Returns if the given value is valid with-respect-to this {@link Argument}
-		 * 
-		 * @param value the value to test for validity, <code>null</code> is accepted
-		 * 
-		 * @return <code>true</code> if the {@link Argument} is valid <code>false</code> otherwise
-		 */
-		public boolean isValid(String value);
-
-		/**
-		 * Sets the value of the {@link Argument} to be the given value.
-		 * 
-		 * @param value the new value to set, <code>null</code> is accepted
-		 */
-		public void setValue(String value);
-
-		/**
-		 * Returns the value of the {@link Argument}.<br>
-		 * <br>
-		 * This method can return <code>null</code>
-		 * 
-		 * @return the string value of the {@link Argument} or <code>null</code>
-		 */
-		public String value();
-	}
-
-	/**
-	 * Integer specialization of an {@link Argument}
-	 * 
-	 * @see Argument
-	 */
-	public interface IntegerArgument extends Connector.Argument {
-		/**
-		 * Returns the integer value of the {@link Argument}
-		 * 
-		 * @return the integer value
-		 */
-		public int intValue();
-
-		/**
-		 * If the integer value is valid with-respect-to this argument.
-		 * 
-		 * @param intValue the value to test
-		 * @return <code>true</code> if the given value if valid <code>false</code> otherwise
-		 */
-		public boolean isValid(int intValue);
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#isValid(java.lang.String)
-		 */
-		public boolean isValid(String value);
-
-		/**
-		 * Returns the maximum value that this {@link Argument} will accept as being valid.
-		 * 
-		 * @return the maximum value for this argument
-		 */
-		public int max();
-
-		/**
-		 * Returns the minimum value that this {@link Argument} will accept as being valid.
-		 * 
-		 * @return the minimum value for this argument
-		 */
-		public int min();
-
-		/**
-		 * Sets the integer value of this {@link Argument}.
-		 * 
-		 * @param intValue the new value to set
-		 */
-		public void setValue(int intValue);
-	}
-
-	/**
-	 * Boolean specialization of an {@link Argument}
-	 * 
-	 * @see Argument
-	 */
-	public interface BooleanArgument extends Connector.Argument {
-		/**
-		 * Returns the boolean value for this {@link Argument}.
-		 * 
-		 * @return the boolean value
-		 */
-		public boolean booleanValue();
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#isValid(java.lang.String)
-		 */
-		public boolean isValid(String value);
-
-		/**
-		 * Sets the new boolean value for this {@link Argument}.
-		 * 
-		 * @param booleanValue the new value
-		 */
-		public void setValue(boolean booleanValue);
-	}
-
-	/**
-	 * String specialization of an {@link Argument}
-	 * 
-	 * @see Argument
-	 */
-	public interface StringArgument extends Connector.Argument {
-		/* (non-Javadoc)
-		 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#isValid(java.lang.String)
-		 */
-		public boolean isValid(String arg1);
-	}
-
-	/**
-	 * Specialization of {@link Argument} whose value is a String selected from a list of choices.
-	 */
-	public interface SelectedArgument extends Connector.Argument {
-		/**
-		 * The list of choices for this connector
-		 * 
-		 * @return the complete list of choices for ths connector
-		 */
-		public List choices();
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#isValid(java.lang.String)
-		 */
-		public boolean isValid(String value);
-	}
-
-	/**
-	 * Returns the {@link Map} of default {@link Argument}s for this connector or an
-	 * empty {@link Map} if no {@link Argument}s have been specified.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the {@link Map} of default {@link Argument}s or an empty {@link Map}, never <code>null</code>
-	 */
-	public Map defaultArguments();
-
-	/**
-	 * A human readable description of this {@link Connector}.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the description of this {@link Connector} or <code>null</code>
-	 */
-	public String description();
-
-	/**
-	 * The name of this {@link Connector}.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the name of the {@link Connector}
-	 */
-	public String name();
-
-	/**
-	 * The unique identifier for this {@link Connector}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the identifier of this {@link Connector} never <code>null</code>
-	 */
-	public String id();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/connect/LaunchingConnector.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/connect/LaunchingConnector.java
deleted file mode 100644
index 6a4fc95..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/connect/LaunchingConnector.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.connect;
-
-import java.io.IOException;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Description of a {@link Connector} that launches a {@link VirtualMachine}.
- * 
- * Clients can implement or extend this interface.
- * 
- * @see Argument
- * @see Connector
- * @see VirtualMachine
- * @since 1.0
- */
-public interface LaunchingConnector extends Connector {
-	
-	/**
-	 * Launches a {@link VirtualMachine} with the given map of arguments.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>. If a {@link VirtualMachine} cannot
-	 * be launched an {@link IOException} is thrown.
-	 * 
-	 * @param arguments the map of connection arguments which cannot be <code>null</code>
-	 * 
-	 * @return the {@link VirtualMachine} that has been launched never <code>null</code>
-	 * @throws IOException if the {@link Connector} failed to launch
-	 */
-	public VirtualMachine launch(Map arguments) throws IOException;
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/connect/ListeningConnector.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/connect/ListeningConnector.java
deleted file mode 100644
index d6710be..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/connect/ListeningConnector.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.connect;
-
-import java.io.IOException;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Description of a {@link Connector} that waits and listens for a {@link VirtualMachine}
- * to connect to it.
- * 
- * Clients can implement or extend this interface.
- * 
- * @see Argument
- * @see Connector
- * @see VirtualMachine
- * @since 1.0
- */
-public interface ListeningConnector extends Connector {
-	
-	/**
-	 * Listens for a {@link VirtualMachine} to connect to with the given map of arguments.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>. If the connector cannot accept the 
-	 * connection from the {@link VirtualMachine} an {@link IOException} is thrown.
-	 * 
-	 * @param arguments the map of connection arguments which cannot be <code>null</code>
-	 * 
-	 * @return the {@link VirtualMachine} that has been accepted never <code>null</code>
-	 * @throws IOException if the {@link Connector} failed to accept the connection
-	 */
-	public VirtualMachine accept(Map arguments) throws IOException;
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/connect/SocketUtil.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/connect/SocketUtil.java
deleted file mode 100755
index 270b637..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/connect/SocketUtil.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.connect;
-
-
-import java.io.IOException;
-import java.net.ServerSocket;
-
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-
-/**
- * Utility class to find a port to debug on.
- * 
- * @since 1.0
- * @noinstantiate This class is not intended to be instantiated by clients.
- */
-public final class SocketUtil {
-	
-	/**
-	 * Constructor
-	 * No instantiation
-	 */
-	private SocketUtil() {}
-	
-	/**
-	 * Returns a free port number on localhost, or -1 if unable to find a free port.
-	 * 
-	 * @return a free port number on localhost, or -1 if unable to find a free port
-	 */
-	public static int findFreePort() {
-		ServerSocket socket = null;
-		try {
-			socket = new ServerSocket(0);
-			return socket.getLocalPort();
-		} 
-		catch (IOException e) {
-			JavaScriptDebugPlugin.log(e);
-		} 
-		finally {
-			if (socket != null) {
-				try {
-					socket.close();
-				} 
-				catch (IOException e) {
-					JavaScriptDebugPlugin.log(e);
-				}
-			}
-		}
-		return -1;		
-	}
-	
-	/**
-	 * Returns a free port number encoded as a string
-	 * 
-	 * @return a free port number encoded as a string
-	 */
-	public static String findFreePortString() {
-		return Integer.toString(findFreePort());
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/BreakpointEvent.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/BreakpointEvent.java
deleted file mode 100644
index 4522420..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/BreakpointEvent.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.event;
-
-/**
- * Description of a JSDI event indicating a breakpoint has been encountered.
- * 
- * @see EventQueue
- * @see EventSet
- * @see LocatableEvent
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface BreakpointEvent extends LocatableEvent {
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/DebuggerStatementEvent.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/DebuggerStatementEvent.java
deleted file mode 100644
index 90215a9..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/DebuggerStatementEvent.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.event;
-
-/**
- * Description of a JSDI event indicating a <code>debugger;</code> statement
- * has been encountered.
- * 
- * @see EventQueue
- * @see EventSet
- * @see LocatableEvent
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface DebuggerStatementEvent extends LocatableEvent {
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/Event.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/Event.java
deleted file mode 100644
index 97d2fbe..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/Event.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Mirror;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-
-/**
- * Abstract description of a JSDI event
- * 
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface Event extends Mirror {
-
-	/**
-	 * Returns the underlying {@link EventRequest}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the underlying {@link EventRequest} never <code>null</code>
-	 */
-	public EventRequest request();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/EventQueue.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/EventQueue.java
deleted file mode 100644
index 83b1b16..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/EventQueue.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.event;
-
-/**
- * A queue for JSDI {@link EventSet}s
- * 
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface EventQueue {
-
-	/**
-	 * Removes an {@link EventSet} from the queue waiting for a default timeout if needed.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the top {@link EventSet} on the queue or <code>null</code> if an {@link EventSet} 
-	 * is not available or there was an exception retrieving the top {@link EventSet}
-	 */
-	public EventSet remove();
-
-	/**
-	 * Removes an {@link EventSet} from the queue waiting for the specified timeout if needed.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @param timeout the amount of time (in milliseconds) to wait when trying to remove the next {@link EventSet}
-	 * @return the top {@link EventSet} on the queue or <code>null</code> if an {@link EventSet} 
-	 * is not available or there was an exception retrieving the top {@link EventSet}
-	 */
-	public EventSet remove(int timeout);
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/EventSet.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/EventSet.java
deleted file mode 100644
index 0d22d0a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/EventSet.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.event;
-
-import java.util.Set;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Mirror;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Describes a heterogeneous set of {@link Event}s.
- * 
- * @see Event
- * @see EventQueue
- * @see VirtualMachine
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface EventSet extends Set, Mirror {
-
-	/**
-	 * Returns <code>true</code> if processing of the {@link EventSet} is currently suspended.
-	 * 
-	 * @return <code>true</code> if the {@link EventSet} is suspended <code>false</code> otherwise
-	 */
-	public boolean suspended();
-
-	/**
-	 * Resumes processing of the {@link EventSet}.
-	 */
-	public void resume();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/ExceptionEvent.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/ExceptionEvent.java
deleted file mode 100644
index 7baf374..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/ExceptionEvent.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.event;
-
-/**
- * Description of a JSDI event indicating an exception has occurred.
- * 
- * @see EventQueue
- * @see EventSet
- * @see LocatableEvent
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface ExceptionEvent extends LocatableEvent {
-
-	/**
-	 * Returns the message from the exception.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the message from the exception or <code>null</code>
-	 */
-	public String message();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/LocatableEvent.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/LocatableEvent.java
deleted file mode 100644
index 4288482..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/LocatableEvent.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Locatable;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-
-/**
- * Description of a JSDI event that has a location
- * 
- * @see Event
- * @see EventQueue
- * @see EventSet
- * @see Locatable
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface LocatableEvent extends Event, Locatable {
-
-	/**
-	 * Returns the underlying {@link ThreadReference} the event originated from.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the underlying {@link ThreadReference} the event originated from, never <code>null</code>
-	 */
-	public ThreadReference thread();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/ResumeEvent.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/ResumeEvent.java
deleted file mode 100644
index 6d3688f..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/ResumeEvent.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.event;
-
-/**
- * Description of a JSDI event that indicates a resume event has occurred
- * 
- * @see EventQueue
- * @see EventSet
- * @see LocatableEvent
- * @since 2.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface ResumeEvent extends LocatableEvent {
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/ScriptLoadEvent.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/ScriptLoadEvent.java
deleted file mode 100644
index 1b6b415..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/ScriptLoadEvent.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-
-/**
- * Description of a JSDI event indicating a script has been loaded.
- * 
- * @see EventQueue
- * @see EventSet
- * @see LocatableEvent
- * @see ScriptReference
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface ScriptLoadEvent extends LocatableEvent {
-
-	/**
-	 * Returns the {@link ScriptReference} that has been loaded.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the {@link ScriptReference} that has been loaded never <code>null</code>
-	 */
-	public ScriptReference script();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/StepEvent.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/StepEvent.java
deleted file mode 100644
index 548c333..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/StepEvent.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.event;
-
-/**
- * Description of a JSDI event indicating a stepping event occurred.
- * 
- * @see EventQueue
- * @see EventSet
- * @see LocatableEvent
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface StepEvent extends LocatableEvent {
-	
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/SuspendEvent.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/SuspendEvent.java
deleted file mode 100644
index 81ebba1..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/SuspendEvent.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.event;
-
-/**
- * Description of a JSDI event indicating a suspend event occurred.
- * 
- * @see EventQueue
- * @see EventSet
- * @see LocatableEvent
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface SuspendEvent extends LocatableEvent {
-	
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/ThreadEnterEvent.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/ThreadEnterEvent.java
deleted file mode 100644
index 2b9a8d7..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/ThreadEnterEvent.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.event;
-
-/**
- * Description of a JSDI event indicating a thread context has been entered.
- * 
- * @see EventQueue
- * @see EventSet
- * @see LocatableEvent
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface ThreadEnterEvent extends LocatableEvent {
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/ThreadExitEvent.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/ThreadExitEvent.java
deleted file mode 100644
index b41b4b6..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/ThreadExitEvent.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.event;
-
-/**
- * Description of a JSDI event indicating a thread context has been exited.
- * 
- * @see EventQueue
- * @see EventSet
- * @see LocatableEvent
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface ThreadExitEvent extends LocatableEvent {
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/VMDeathEvent.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/VMDeathEvent.java
deleted file mode 100644
index a2c051a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/VMDeathEvent.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Description of a JSDI event indicating a {@link VirtualMachine} has been stopped in an unexpected way.<br><br>
- * 
- * There are no guarantees this event can be received.<br><br>
- * 
- * This event is sent in a "fire and forget" fashion, such that if the underlying communication channel
- * has not been interrupted the event can be received.
- * 
- * @see Event
- * @see EventQueue
- * @see EventSet
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface VMDeathEvent extends Event {
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/VMDisconnectEvent.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/VMDisconnectEvent.java
deleted file mode 100644
index 49a9223..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/VMDisconnectEvent.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Description of a JSDI event indicating a {@link VirtualMachine} has been disconnected.
- * 
- * @see Event
- * @see EventQueue
- * @see EventSet
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface VMDisconnectEvent extends Event {
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/BreakpointRequest.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/BreakpointRequest.java
deleted file mode 100644
index fcb5eb2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/BreakpointRequest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Locatable;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-
-/**
- * Description of a JSDI request for breakpoints.<br>
- * <br> 
- * A breakpoint request can be filtered by:
- * <ul>
- * <li>A {@link ThreadReference}</li>
- * <li>A {@link String} condition</li>
- * <li>A hit count</li>
- * </ul>
- * Or any combination of the above.
- * 
- * @see EventRequest
- * @see Locatable
- * @see ThreadReference
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface BreakpointRequest extends EventRequest, Locatable {
-
-	/**
-	 * Adds the given {@link ThreadReference} as a filter to the request.
-	 * The {@link ThreadReference} is used to prune matching locations for the request.
-	 * 
-	 * @param thread a {@link ThreadReference} to add as a filter, <code>null</code> is not accepted
-	 */
-	public void addThreadFilter(ThreadReference thread);
-
-	/**
-	 * Adds the given condition filter to the request. 
-	 * The condition is used to prune matching locations for the request.
-	 * 
-	 * @param condition the new condition to add as a filter, <code>null</code> is not accepted
-	 */
-	public void addConditionFilter(String condition);
-
-	/**
-	 * Adds the given hit count filter to the request.
-	 * 
-	 * @param hitcount the new hit count filter to set
-	 */
-	public void addHitCountFilter(int hitcount);
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/DebuggerStatementRequest.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/DebuggerStatementRequest.java
deleted file mode 100644
index 48c5b00..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/DebuggerStatementRequest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-
-/**
- * Description of a JSDI request for a <code>debugger;</code> statement.<br>
- * <br> 
- * A <code>debugger;</code> statement request can be filtered by:
- * <ul>
- * <li>A {@link ThreadReference}</li>
- * </ul>
- * 
- * @see EventRequest
- * @see ThreadReference
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface DebuggerStatementRequest extends EventRequest {
-
-	/**
-	 * Adds the given {@link ThreadReference} as a filter to the request.
-	 * The {@link ThreadReference} is used to prune matching locations for the request.
-	 * 
-	 * @param thread a {@link ThreadReference} to add as a filter, <code>null</code> is not accepted
-	 */
-	public void addThreadFilter(ThreadReference thread);
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/EventRequest.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/EventRequest.java
deleted file mode 100644
index e57316b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/EventRequest.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Mirror;
-
-/**
- * Description of a JSDI request.
- * 
- * @see Mirror
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface EventRequest extends Mirror {
-
-	/**
-	 * Returns if the request is enabled
-	 * @return <code>true</code> if the request is enabled <code>false</code> otherwise
-	 */
-	public boolean isEnabled();
-
-	/**
-	 * Allows the enabled state of the request to be changed.
-	 * 
-	 * @param enabled the new enabled state of the request
-	 */
-	public void setEnabled(boolean enabled);
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/EventRequestManager.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/EventRequestManager.java
deleted file mode 100644
index fe6b01b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/EventRequestManager.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.request;
-
-import java.util.List;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-
-/**
- * Description of a manager for creating {@link EventRequest}s
- * 
- * @see EventRequest
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface EventRequestManager {
-
-	/**
-	 * Creates a new {@link BreakpointRequest} for the given {@link Location}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @param location the {@link Location} to create the breakpoint for, <code>null</code> is not accepted
-	 * 
-	 * @return a new {@link BreakpointRequest} for the given {@link Location}, never <code>null</code>
-	 */
-	public BreakpointRequest createBreakpointRequest(Location location);
-
-	/**
-	 * Returns the live immutable list of {@link BreakpointRequest}s currently queued in the manager.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the list of {@link BreakpointRequest}s or an empty list, never <code>null</code>
-	 */
-	public List /*<BreakpointRequest>*/ breakpointRequests();
-
-	/**
-	 * Creates a new {@link DebuggerStatementRequest}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return a new {@link DebuggerStatementRequest} never <code>null</code>
-	 */
-	public DebuggerStatementRequest createDebuggerStatementRequest();
-
-	/**
-	 * Returns the live immutable list of {@link DebuggerStatementRequest}s currently queued in the manager.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the list of {@link DebuggerStatementRequest}s or an empty list, never <code>null</code>
-	 */
-	public List /*<DebuggerStatementRequest>*/ debuggerStatementRequests();
-
-	/**
-	 * Creates a new {@link ExceptionRequest}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return a new {@link ExceptionRequest} never <code>null</code>
-	 */
-	public ExceptionRequest createExceptionRequest();
-
-	/**
-	 * Returns the live immutable list of {@link ExceptionRequest}s currently queued in the manager.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the list of {@link ExceptionRequest}s or an empty list, never <code>null</code>
-	 */
-	public List /*<ExceptionRequest>*/ exceptionRequests();
-
-	/**
-	 * Creates a new {@link ScriptLoadRequest}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return a new {@link ScriptLoadRequest} never <code>null</code>
-	 */
-	public ScriptLoadRequest createScriptLoadRequest();
-
-	/**
-	 * Returns the live immutable list of {@link ScriptLoadRequest}s currently queued in the manager.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the list of {@link ScriptLoadRequest}s or an empty list, never <code>null</code>
-	 */
-	public List /*<ScriptLoadRequest>*/ scriptLoadRequests();
-
-	/**
-	 * Creates a new {@link StepRequest} for the specified {@link ThreadReference} of the given kind.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @param thread the {@link ThreadReference} to perform the step in
-	 * @param step the kind of step
-	 * @see StepRequest for a complete listing of step kinds
-	 * 
-	 * @return a new {@link StepRequest} never <code>null</code>
-	 */
-	public StepRequest createStepRequest(ThreadReference thread, int step);
-
-	/**
-	 * Returns the live immutable list of {@link StepRequest}s currently queued in the manager.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the list of {@link StepRequest}s or an empty list, never <code>null</code>
-	 */
-	public List /*<StepRequest>*/ stepRequests();
-
-	/**
-	 * Creates a new {@link SuspendRequest} for the specified {@link ThreadReference}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @param thread the {@link ThreadReference} to perform the suspend on
-	 * 
-	 * @return a new {@link SuspendRequest} never <code>null</code>
-	 */
-	public SuspendRequest createSuspendRequest(ThreadReference thread);
-
-	/**
-	 * Returns the live immutable list of {@link SuspendRequest}s currently queued in the manager.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the list of {@link SuspendRequest}s or an empty list, never <code>null</code>
-	 */
-	public List /*<SuspendRequest>*/ suspendRequests();
-
-	/**
-	 * Creates a new {@link ResumeRequest} for the specified {@link ThreadReference}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @param thread the {@link ThreadReference} to perform the suspend on
-	 * 
-	 * @return a new {@link ResumeRequest} never <code>null</code>
-	 */
-	public ResumeRequest createResumeRequest(ThreadReference thread);
-
-	/**
-	 * Returns the live immutable list of {@link ResumeRequest}s currently queued in the manager.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the list of {@link ResumeRequest}s or an empty list, never <code>null</code>
-	 */
-	public List /*<ResumeRequest>*/ resumeRequests();
-	
-	/**
-	 * Creates a new {@link ThreadEnterRequest}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return a new {@link ThreadEnterRequest} never <code>null</code>
-	 */
-	public ThreadEnterRequest createThreadEnterRequest();
-
-	/**
-	 * Returns the live immutable list of {@link ThreadEnterRequest}s currently queued in the manager.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the list of {@link ThreadEnterRequest}s or an empty list, never <code>null</code>
-	 */
-	public List /*<ThreadEnterRequest>*/ threadEnterRequests();
-
-	/**
-	 * Creates a new {@link ThreadExitRequest}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return a new {@link ThreadExitRequest} never <code>null</code>
-	 */
-	public ThreadExitRequest createThreadExitRequest();
-
-	/**
-	 * Returns the live immutable list of {@link ThreadExitRequest}s currently queued in the manager.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the list of {@link ThreadExitRequest}s or an empty list, never <code>null</code>
-	 */
-	public List /*<ThreadExitRequest>*/ threadExitRequests();
-
-	/**
-	 * Deletes the given {@link EventRequest}
-	 * 
-	 * @param eventRequest the {@link EventRequest} to delete, <code>null</code> is not accepted
-	 */
-	public void deleteEventRequest(EventRequest eventRequest);
-
-	/**
-	 * Deletes the list of {@link EventRequest}s
-	 * 
-	 * @param eventRequests the {@link EventRequest}s to delete, <code>null</code> is not accepted
-	 */
-	public void deleteEventRequest(List /*<EventRequest>*/ eventRequests);
-
-	/**
-	 * Creates a new {@link VMDeathRequest}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return a new {@link VMDeathRequest} never <code>null</code>
-	 */
-	public VMDeathRequest createVMDeathRequest();
-
-	/**
-	 * Returns the live immutable list of {@link VMDeathRequest}s currently queued in the manager.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the list of {@link VMDeathRequest}s or an empty list, never <code>null</code>
-	 */
-	public List /*<VMDeathRequest>*/ vmDeathRequests();
-
-	/**
-	 * Creates a new {@link VMDisconnectRequest}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return a new {@link VMDisconnectRequest} never <code>null</code>
-	 */
-	public VMDisconnectRequest createVMDisconnectRequest();
-
-	/**
-	 * Returns the live immutable list of {@link VMDisconnectRequest}s currently queued in the manager.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the list of {@link VMDisconnectRequest}s or an empty list, never <code>null</code>
-	 */
-	public List /*<VMDisconnectRequest>*/ vmDisconnectRequests();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/ExceptionRequest.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/ExceptionRequest.java
deleted file mode 100644
index 51a2488..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/ExceptionRequest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-
-/**
- * Description of a JSDI request for an exception.<br>
- * <br> 
- * An exception request can be filtered by:
- * <ul>
- * <li>A {@link ThreadReference}</li>
- * </ul>
- * 
- * @see EventRequest
- * @see ThreadReference
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface ExceptionRequest extends EventRequest {
-	
-	/**
-	 * Adds the given {@link ThreadReference} as a filter to the request.
-	 * The {@link ThreadReference} is used to prune matching locations for the request.
-	 * 
-	 * @param thread a {@link ThreadReference} to add as a filter, <code>null</code> is not accepted
-	 */
-	public void addThreadFilter(ThreadReference thread);
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/ResumeRequest.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/ResumeRequest.java
deleted file mode 100644
index a82fd85..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/ResumeRequest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-
-/**
- * Description of a JSDI request for a resume operation.
- * 
- * @see EventRequest
- * @see ThreadReference
- * @since 2.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface ResumeRequest extends EventRequest {
-
-	/**
-	 * The underlying {@link ThreadReference} this {@link StepRequest} is for.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the underlying {@link ThreadReference} never <code>null</code>
-	 */
-	public ThreadReference thread();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/ScriptLoadRequest.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/ScriptLoadRequest.java
deleted file mode 100644
index a403702..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/ScriptLoadRequest.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.request;
-
-/**
- * Description of a JSDI request for a <code>debugger;</code> statement.
- * 
- * @see EventRequest
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface ScriptLoadRequest extends EventRequest {
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/StepRequest.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/StepRequest.java
deleted file mode 100644
index f2acc1e..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/StepRequest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-
-/**
- * Description of a JSDI request for a step operation.
- * 
- * @see EventRequest
- * @see ThreadReference
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface StepRequest extends EventRequest {
-
-	/**
-	 * Kind for a step into request
-	 */
-	public static final int STEP_INTO = 1;
-	/**
-	 * Kind for a step over request
-	 */
-	public static final int STEP_OVER = 2;
-	/**
-	 * Kind for a step out request
-	 */
-	public static final int STEP_OUT = 3;
-
-	/**
-	 * Returns the kind of the {@link StepRequest}
-	 * @see #STEP_INTO
-	 * @see #STEP_OUT
-	 * @see #STEP_OVER
-	 * 
-	 * @return the kind of the {@link StepRequest}
-	 */
-	public int step();
-
-	/**
-	 * The underlying {@link ThreadReference} this {@link StepRequest} is for.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the underlying {@link ThreadReference} never <code>null</code>
-	 */
-	public ThreadReference thread();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/SuspendRequest.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/SuspendRequest.java
deleted file mode 100644
index 3fc5921..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/SuspendRequest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-
-/**
- * Description of a JSDI request for a suspend operation.
- * 
- * @see EventRequest
- * @see ThreadReference
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface SuspendRequest extends EventRequest {
-	
-	/**
-	 * The underlying {@link ThreadReference} this {@link StepRequest} is for.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the underlying {@link ThreadReference} never <code>null</code>
-	 */
-	public ThreadReference thread();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/ThreadEnterRequest.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/ThreadEnterRequest.java
deleted file mode 100644
index 2152276..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/ThreadEnterRequest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-
-/**
- * Description of a JSDI request to enter a thread.<br>
- * <br> 
- * A thread enter request can be filtered by:
- * <ul>
- * <li>A {@link ThreadReference}</li>
- * </ul>
- * 
- * @see EventRequest
- * @see ThreadReference
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface ThreadEnterRequest extends EventRequest {
-	
-	/**
-	 * Adds the given {@link ThreadReference} as a filter to the request.
-	 * The {@link ThreadReference} is used to prune matching locations for the request.
-	 * 
-	 * @param thread a {@link ThreadReference} to add as a filter, <code>null</code> is not accepted
-	 */
-	public void addThreadFilter(ThreadReference thread);
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/ThreadExitRequest.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/ThreadExitRequest.java
deleted file mode 100644
index b88387b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/ThreadExitRequest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-
-/**
- * Description of a JSDI request to exit a thread.<br>
- * <br> 
- * A thread exit request can be filtered by:
- * <ul>
- * <li>A {@link ThreadReference}</li>
- * </ul>
- * 
- * @see EventRequest
- * @see ThreadReference
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface ThreadExitRequest extends EventRequest {
-
-	/**
-	 * Adds the given {@link ThreadReference} as a filter to the request.
-	 * The {@link ThreadReference} is used to prune matching locations for the request.
-	 * 
-	 * @param thread a {@link ThreadReference} to add as a filter, <code>null</code> is not accepted
-	 */
-	public void addThreadFilter(ThreadReference thread);
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/VMDeathRequest.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/VMDeathRequest.java
deleted file mode 100644
index b9a5596..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/VMDeathRequest.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Description of a JSDI request to terminate a {@link VirtualMachine}.
- * 
- * @see EventRequest
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface VMDeathRequest extends EventRequest {
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/VMDisconnectRequest.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/VMDisconnectRequest.java
deleted file mode 100644
index 8a16856..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/VMDisconnectRequest.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Description of a JSDI request to disconnect a {@link VirtualMachine}.
- * 
- * @see EventRequest
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface VMDisconnectRequest extends EventRequest {
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IJavaScriptDebugTarget.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IJavaScriptDebugTarget.java
deleted file mode 100644
index e6a9525..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IJavaScriptDebugTarget.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.model;
-
-import java.util.List;
-
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Description of our debug target
- * 
- * @see ScriptReference
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- * @noimplement This interface is not intended to be implemented by clients.
- */
-public interface IJavaScriptDebugTarget extends IDebugTarget {
-
-	/**
-	 * Returns the entire collection of {@link IScript}s currently known to the {@link VirtualMachine}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the complete collection of {@link IScript}s from the {@link VirtualMachine} or an 
-	 * empty collection, never <code>null</code>
-	 */
-	public List/*<IScript>*/ allScripts();
-	
-	/**
-	 * Returns all of the {@link IScript}s currently loaded in the {@link VirtualMachine} that have the
-	 * matching name.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @param name
-	 * @return the complete list of {@link IScript}s loaded in the {@link VirtualMachine} with the given name
-	 * or an empty collection, never <code>null</code>
-	 */
-	public List/*<IScript>*/ allScriptsByName(String name);
-	
-	/**
-	 * Returns the singleton {@link IScriptGroup} for this target.<br>
-	 * <br>
-	 * This method can return <code>null</code> if the target has been disconnected or terminated
-	 * 
-	 * @return the singleton {@link IScriptGroup} for this target
-	 */
-	public IScriptGroup getScriptGroup();
-	
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IJavaScriptPrimitiveValue.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IJavaScriptPrimitiveValue.java
deleted file mode 100644
index 252f3d0..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IJavaScriptPrimitiveValue.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.model;
-
-
-/**
- * Describes a primitive value 
- * 
- * @since 1.0
- * @noimplement This interface is not intended to be implemented by clients.
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface IJavaScriptPrimitiveValue extends IJavaScriptValue {
-
-	/**
-	 * Returns the integer for the value.
-	 * 
-	 * @return the integer value
-	 */
-	public int intValue();
-	
-	/**
-	 * Returns the double for the value.
-	 * 
-	 * @return the double value
-	 */
-	public double doubleValue();
-	
-	/**
-	 * Returns the boolean for the value.
-	 * 
-	 * @return the boolean value
-	 */
-	public boolean booleanValue();
-	
-	/**
-	 * Returns the String value for the value.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the {@link String} value
-	 */
-	public String stringValue();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IJavaScriptStackFrame.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IJavaScriptStackFrame.java
deleted file mode 100644
index 06979ff..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IJavaScriptStackFrame.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.model;
-
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.debug.core.model.IVariable;
-import org.eclipse.wst.jsdt.debug.core.jsdi.NullValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-
-/**
- * @since 1.0
- * @noimplement This interface is not intended to be implemented by clients.
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface IJavaScriptStackFrame extends IStackFrame {
-
-	/**
-	 * Allows the given expression to be evaluated and returns the {@link Value}
-	 * of the evaluation.<br>
-	 * <br>
-	 * This method cannot return <code>null</code> and will return a value with {@link NullValue} instead.
-	 * 
-	 * @param expression the expression to evaluate, <code>null</code> is accepted and will cause a value
-	 * backed by {@link NullValue} to be returned
-	 * @return the {@link IJavaScriptValue} from the evaluation never <code>null</code>
-	 */
-	public IJavaScriptValue evaluate(String expression);
-	
-	/**
-	 * Returns the name of the source backing the stack frame.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the name of the source or <code>null</code>
-	 */
-	public String getSourceName();
-	
-	/**
-	 * Returns the path to the source.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the path to the source or <code>null</code>
-	 */
-	public String getSourcePath();
-	
-	/**
-	 * Returns the underlying source for the frame.<br>
-	 * <br>
-	 * This method can return <code>null</code> if the source cannot be acquired
-	 * 
-	 * @return the underlying source or <code>null</code>
-	 */
-	public String getSource();
-	
-	/**
-	 * Returns the {@link IVariable} for the <code>this</code> object.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 *  
-	 * @return the <code>this</code> {@link IVariable}
-	 */
-	public IVariable getThisObject();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IJavaScriptThread.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IJavaScriptThread.java
deleted file mode 100644
index bf91ae9..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IJavaScriptThread.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.model;
-
-import org.eclipse.debug.core.model.IThread;
-import org.eclipse.wst.jsdt.debug.core.jsdi.NullValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-
-/**
- * JavaScript thread description
- * 
- * @since 1.0
- * @noimplement This interface is not intended to be implemented by clients.
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface IJavaScriptThread extends IThread {
-
-	/**
-	 * Allows the given expression to be evaluated and returns the {@link Value}
-	 * of the evaluation.<br>
-	 * <br>
-	 * This method cannot return <code>null</code> and will return a value with {@link NullValue} instead.
-	 * 
-	 * @param expression the expression to evaluate, <code>null</code> is accepted and will cause a value
-	 * backed by {@link NullValue} to be returned
-	 * @return the {@link IJavaScriptValue} from the evaluation never <code>null</code>
-	 */
-	public IJavaScriptValue evaluate(String expression);
-	
-	/**
-	 * Returns the total stack frame count
-	 * 
-	 * @return the stack frame count
-	 */
-	public int getFrameCount();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IJavaScriptValue.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IJavaScriptValue.java
deleted file mode 100644
index 9e3f5ff..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IJavaScriptValue.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.model;
-
-import org.eclipse.debug.core.model.IValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.NullValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-
-/**
- * Abstract definition of a {@link Value} wrt JavaScript debugging
- * 
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- * @noimplement This interface is not intended to be implemented by clients.
- */
-public interface IJavaScriptValue extends IValue {
-
-	
-	public static final String UNDEFINED = "undefined"; //$NON-NLS-1$
-	public static final String UNKNOWN = "unknown"; //$NON-NLS-1$
-	public static final String NULL = "null"; //$NON-NLS-1$
-	public static final String BOOLEAN = "boolean"; //$NON-NLS-1$
-	public static final String NUMBER = "number"; //$NON-NLS-1$
-	public static final String STRING = "string"; //$NON-NLS-1$
-	public static final String OBJECT = "object"; //$NON-NLS-1$
-	public static final String ARRAY = "array"; //$NON-NLS-1$
-	public static final String FUNCTION = "function"; //$NON-NLS-1$
-
-	/**
-	 * Returns the string to use for details display.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the string to use for details display or <code>null</code>
-	 */
-	public String getDetailString();
-	
-	/**
-	 * Returns if the value is {@link NullValue}
-	 * 
-	 * @return if the value is {@link NullValue}
-	 */
-	public boolean isNull();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IScript.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IScript.java
deleted file mode 100644
index 07ef4a0..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IScript.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.model;
-
-import java.net.URI;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugElement;
-
-/**
- * Description of a {@link JavaScriptDebugElement} for a {@link ScriptReference}
- * 
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- * @noimplement This interface is not intended to be implemented by clients.
- */
-public interface IScript {
-
-	/**
-	 * Returns the source for this script.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the source or <code>null</code>
-	 */
-	public String source();
-	
-	/**
-	 * Returns the {@link URI} for this script.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the {@link URI} for this script never <code>null</code>
-	 */
-	public URI sourceURI();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IScriptGroup.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IScriptGroup.java
deleted file mode 100644
index fcd57f1..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IScriptGroup.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.model;
-
-import java.util.List;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-
-/**
- * Container for a grouping of {@link ScriptReference}s
- * 
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- * @noimplement This interface is not intended to be implemented by clients.
- */
-public interface IScriptGroup {
-
-	/**
-	 * Returns the array of all {@link ScriptReference}s from the backing {@link IJavaScriptDebugTarget}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the complete list of {@link ScriptReference}s from the backing {@link IJavaScriptDebugTarget} 
-	 * or an empty array, never <code>null</code>
-	 */
-	public List/*<IScript>*/ allScripts();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IScriptResolver.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IScriptResolver.java
deleted file mode 100644
index f08c2ab..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IScriptResolver.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.model;
-
-import java.net.URI;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-
-/**
- * This resolver allows contributors to plug-in to the process of resolving a {@link ScriptReference}'s 
- * {@link URI} to a workspace-local {@link IFile}.
- * <br><br>
- * This interface is not intended to be directly implemented. Instead clients must extend the base class {@link ScriptResolver}
- * 
- * @see ScriptResolver
- * @noextend This interface is not intended to be extended by clients.
- * @noimplement This interface is not intended to be implemented by clients.
- * @since 3.4
- */
-public interface IScriptResolver {
-
-	/**
-	 * This method determines if the given {@link IPath} matches the {@link URI} from {@link ScriptReference#sourceURI()}.
-
-	 * @param script the {@link ScriptReference} to compare the source {@link URI} from - never <code>null</code>
-	 * @param path the path to match against the source {@link URI} - never <code>null</code>
-	 * 
-	 * @return <code>true</code> if the source {@link URI} of the given {@link ScriptReference} is considered to match the given {@link IPath}, <code>false</code> otherwise.
-	 */
-	public boolean matches(ScriptReference script, IPath path);
-	
-	/**
-	 * This method is used to find the workspace {@link IFile} that corresponds to the source {@link URI} from the given {@link ScriptReference}.
-	 * <br><br>
-	 * If no file can be determined the method must return <code>null</code>. The result will be checked for existence.
-	 * 
-	 * @param script the {@link ScriptReference} to find the {@link IFile} for
-	 * @return the {@link IFile} for the {@link ScriptReference} or <code>null</code>
-	 */
-	public IFile getFile(ScriptReference script);
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/JavaScriptDebugModel.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/JavaScriptDebugModel.java
deleted file mode 100644
index ec9f12c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/JavaScriptDebugModel.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.model;
-
-import java.util.Map;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptFunctionBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLoadBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue;
-import org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptFunctionBreakpoint;
-import org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptLineBreakpoint;
-import org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptLoadBreakpoint;
-
-/**
- * The JavaScript debug model
- * 
- * @since 1.0
- */
-public class JavaScriptDebugModel {
-
-	/**
-	 * Debug model identifier.<br>
-	 * <br>
-	 * Value is: <code>org.eclipse.wst.jsdt.debug.model</code>
-	 */
-	public static final String MODEL_ID = "org.eclipse.wst.jsdt.debug.model"; //$NON-NLS-1$
-	
-	/**
-	 * Creates a new {@link IJavaScriptLineBreakpoint}
-	 * 
-	 * @param resource the resource to create the breakpoint on
-	 * @param linenumber the line number to place the breakpoint on
-	 * @param charstart the char start or -1
-	 * @param charend the char end or -1
-	 * @param attributes the optional map of attributes or <code>null</code>
-	 * @param register if the breakpoint should be immediately registered or not
-	 * 
-	 * @return a new {@link IJavaScriptLineBreakpoint}
-	 * @throws DebugException if breakpoint creation failed
-	 */
-	public static IJavaScriptLineBreakpoint createLineBreakpoint(final IResource resource, final int linenumber, final int charstart, final int charend, final Map attributes, final boolean register) throws DebugException {
-		return new JavaScriptLineBreakpoint(resource, linenumber, charstart, charend, attributes, register);
-	}
-	
-	/**
-	 * Creates a new {@link IJavaScriptLoadBreakpoint}
-	 * 
-	 * @param resource the resource to associate the breakpoint with, or <code>null</code>
-	 * @param charstart the char start or -1
-	 * @param charend the char end or -1
-	 * @param attributes the optional map of attributes or <code>null</code>
-	 * @param register if the breakpoint should be immediately registered or not
-	 * 
-	 * @return a new {@link IJavaScriptLoadBreakpoint}
-	 * @throws DebugException if breakpoint creation fails
-	 */
-	public static IJavaScriptLoadBreakpoint createScriptLoadBreakpoint(final IResource resource, final int charstart, final int charend, final Map attributes, final boolean register) throws DebugException {
-		return new JavaScriptLoadBreakpoint(resource, charstart, charend, attributes, register);
-	}
-	
-	/**
-	 * Creates a new {@link IJavaScriptFunctionBreakpoint}
-	 * 
-	 * @param resource the resource to create the breakpoint on
-	 * @param name the name of the function
-	 * @param signature the signature of the function
-	 * @param charstart the char start of the function or -1
-	 * @param charend the char end of the function or -1
-	 * @param attributes an optional mapping of attributes or <code>null</code>
-	 * @param register if the breakpoint should immediately be registered or not
-	 * 
-	 * @return a new {@link IJavaScriptFunctionBreakpoint}
-	 * @throws DebugException if breakpoint creation fails
-	 */
-	public static IJavaScriptFunctionBreakpoint createFunctionBreakpoint(final IResource resource, final String name, final String signature, final int charstart, final int charend, final Map attributes, final boolean register) throws DebugException {
-		return new JavaScriptFunctionBreakpoint(resource, name, signature, charstart, charend, attributes, register);
-	}
-
-	/**
-	 * Converts the given double value to a {@link String} removing the trailing .0 in the event the precision is 1
-	 * 
-	 * @param n the number to convert
-	 * @return the {@link String} value of the number with trailing .0 removed iff the precision is 1
-	 */
-	public static String numberToString(Number n) {
-		if(n == null) {
-			return NumberValue.NAN;
-		}
-		double d = n.doubleValue();
-		if (d == Double.POSITIVE_INFINITY) {
-			return NumberValue.INFINITY;
-		}
-		if (d == Double.NEGATIVE_INFINITY) {
-			return NumberValue.NEG_INFINITY;
-		}
-		if (d == 0.0) {
-			return "0"; //$NON-NLS-1$
-		}
-		// we only care about base 10
-		String number = Double.toString(d);
-		// we only convert for a precision equal to 1
-		if (number.endsWith(".0")) { //$NON-NLS-1$
-			number = number.substring(0, number.length() - 2);
-		}
-		return number;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/ScriptResolver.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/ScriptResolver.java
deleted file mode 100644
index fa60a0b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/ScriptResolver.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.core.model;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-
-/**
- * This is the default base class for all {@link IScriptResolver}s
- * <br><br>
- * Clients must extend this class and not directly implement the interface {@link IScriptResolver}
- * 
- * @since 3.4
- */
-public abstract class ScriptResolver implements IScriptResolver {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IScriptResolver#matches(org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference, org.eclipse.core.runtime.IPath)
-	 */
-	public boolean matches(ScriptReference script, IPath path) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IScriptResolver#getFile(org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference)
-	 */
-	public IFile getFile(ScriptReference script) {
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/Constants.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/Constants.java
deleted file mode 100644
index 339dda5..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/Constants.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core;
-
-/**
- * Common constants
- * 
- * @since 1.0
- */
-public interface Constants {
-
-//#########  MISC  ############
-	/**
-	 * Constant representing a space
-	 */
-	public static final String SPACE = " "; //$NON-NLS-1$
-	/**
-	 * Constant representing a colon.<br>
-	 * <br>
-	 * Value is: <code>:</code>
-	 */
-	public static final String COLON = ":"; //$NON-NLS-1$
-	/**
-	 * Constant representing the empty string
-	 */
-	public static final String EMPTY_STRING = ""; //$NON-NLS-1$
-	/**
-	 * UTF-8 encoding constant <br>
-	 * <br>
-	 * Value is: <code>UTF-8</code>
-	 */
-	public static final String UTF_8 = "UTF-8"; //$NON-NLS-1$
-	/**
-	 * The JavaScript file extension<br>
-	 * <br>
-	 * Value is <code>js</code>
-	 * @since 1.1
-	 */
-	public static final String JS_EXTENSION = "js"; //$NON-NLS-1$
-	
-//#########  LAUNCHING  ############
-	/**
-	 * The ID of the default JavaScript launch configuration type
-	 */
-	public static final String LAUNCH_CONFIG_ID = "org.eclipse.wst.jsdt.debug.core.launchConfigurationType"; //$NON-NLS-1$
-	
-//#########  EXTENSION POINTS  ############
-	/**
-	 * the class attribute name
-	 */
-	public static final String CLASS = "class"; //$NON-NLS-1$
-	/**
-	 * the kind attribute
-	 */
-	public static final String KIND = "kind"; //$NON-NLS-1$
-	/**
-	 * The connector attribute
-	 */
-	static final String CONNECTOR = "connector"; //$NON-NLS-1$
-	/**
-	 * the name of the breakpoint participants extension point
-	 */
-	public static final String BREAKPOINT_PARTICIPANTS = "breakpointParticipants"; //$NON-NLS-1$
-	/**
-	 * The name of the launching connectors extension point
-	 */
-	static final String LAUNCHING_CONNECTORS = "launchingConnectors"; //$NON-NLS-1$
-	/**
-	 * The name of the script resolvers extension point
-	 * @since 3.4
-	 */
-	static final String SCRIPT_RESOLVERS = "scriptResolvers"; //$NON-NLS-1$
-	
-//#########  PREFERENCES  ############
-	/**
-	 * Preference to suspend execution when any script loads, i.e. for every script load event
-	 */
-	public static final String SUSPEND_ON_ALL_SCRIPT_LOADS = JavaScriptDebugPlugin.PLUGIN_ID + ".suspend_on_all_script_loads"; //$NON-NLS-1$
-	
-	/**
-	 * Preference to suspend execution when a thrown exception is encountered
-	 * @since 1.1
-	 */
-	public static final String SUSPEND_ON_THROWN_EXCEPTION = JavaScriptDebugPlugin.PLUGIN_ID + ".suspend_on_thrown_exceptions"; //$NON-NLS-1$
-	
-	/**
-	 * Preference to delete the External JavaScript Source project when the workbench exists
-	 * @since 1.1
-	 */
-	public static final String DELETE_EXT_PROJECT_ON_EXIT = JavaScriptDebugPlugin.PLUGIN_ID + ".delete_ext_project_on_exit"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/JavaScriptDebugPlugin.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/JavaScriptDebugPlugin.java
deleted file mode 100644
index 7c5caa1..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/JavaScriptDebugPlugin.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core;
-
-import java.net.URI;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.wst.jsdt.debug.internal.core.launching.ConnectorsManager;
-import org.eclipse.wst.jsdt.debug.internal.core.model.BreakpointParticipantManager;
-import org.eclipse.wst.jsdt.debug.internal.core.model.ScriptResolutionManager;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- * @since 1.0
- */
-public class JavaScriptDebugPlugin extends Plugin {
-
-	/**
-	 * Status code indicating an unexpected internal error.
-	 */
-	public static final int INTERNAL_ERROR = 120;
-	/**
-	 * The ID of the bundle<br>
-	 * <br>
-	 * value is: <code>org.eclipse.wst.jsdt.debug.core</code>
-	 */
-	public static final String PLUGIN_ID = "org.eclipse.wst.jsdt.debug.core"; //$NON-NLS-1$
-
-	/**
-	 * The singleton instance
-	 */
-	private static JavaScriptDebugPlugin plugin;
-
-	/**
-	 * The singleton {@link ConnectorsManager}
-	 */
-	private static ConnectorsManager connectionmanager = null;
-	/**
-	 * Singleton {@link BreakpointParticipantManager}
-	 */
-	private static BreakpointParticipantManager participantmanager = null;
-	/**
-	 * Singleton {@link JavaScriptPreferencesManager}
-	 */
-	private static JavaScriptPreferencesManager prefmanager = null;
-	/**
-	 * Singleton {@link ScriptResolutionManager}
-	 */
-	private static ScriptResolutionManager resolutionmanager = null;
-	/**
-	 * Handle to the 'External JavaScript Source' project
-	 */
-	private static IProject extSrcProject = null;
-	private static Map externalScriptPaths = new HashMap();
-	
-	/**
-	 * Returns the singleton {@link ConnectorsManager} instance
-	 * 
-	 * @return the {@link ConnectorsManager}
-	 */
-	public static synchronized ConnectorsManager getConnectionsManager() {
-		if (connectionmanager == null) {
-			connectionmanager = new ConnectorsManager();
-		}
-		return connectionmanager;
-	}
-	
-	/**
-	 * Returns the singleton {@link BreakpointParticipantManager}
-	 * 
-	 * @return the {@link BreakpointParticipantManager}
-	 */
-	public static synchronized BreakpointParticipantManager getParticipantManager() {
-		if(participantmanager == null) {
-			participantmanager = new BreakpointParticipantManager();
-		}
-		return participantmanager;
-	}
-	
-	/**
-	 * Returns the singleton {@link ScriptResolutionManager}
-	 * @return the {@link ScriptResolutionManager}
-	 * @since 3.4
-	 */
-	public static synchronized ScriptResolutionManager getResolutionManager() {
-		if(resolutionmanager == null) {
-			resolutionmanager = new ScriptResolutionManager();
-		}
-		return resolutionmanager;
-	}
-	
-	/**
-	 * Returns the current handle to the 'External JavaScript Source' project or <code>null</code>. If the project
-	 * is not accessible it can be created by passing <code>true</code> in for the create parameter.
-	 * 
-	 * @param create
-	 * @return the handle to the external source project or <code>null</code>
-	 */
-	public static synchronized IProject getExternalSourceProject(boolean create) {
-		if(extSrcProject == null) {
-			try {
-				IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(Messages.external_javascript_source);
-				if(project.isAccessible()) {
-					extSrcProject = project;
-				}
-				if(project.exists()) {
-					project.open(null);
-					extSrcProject = project;
-				}
-				else if(create) {
-					project.create(null);
-					project.open(null);
-					extSrcProject = project;
-				}
-			}
-			catch(CoreException ce) {
-				log(ce);
-			}
-		}
-		return extSrcProject;
-	}
-	
-	/**
-	 * Returns if the given path is for the 'External JavaScript Source' project
-	 * @param path
-	 * @return <code>true</code> if the path is in the external source project, <code>false</code> otherwise
-	 */
-	public static boolean isExternalSource(IPath path) {
-		if(Messages.external_javascript_source.equals(path.segment(0))) {
-			return true;
-		}
-		//try to look it up. The name might not have the project name in it
-		IProject project = getExternalSourceProject(false);
-		if(project != null) {
-			IResource res = project.findMember(path);
-			return res != null && res.exists();
-		}
-		return false;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		plugin = this;
-		prefmanager = new JavaScriptPreferencesManager();
-		prefmanager.start();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		try {
-			plugin = null;
-			if(connectionmanager != null) {
-				connectionmanager.dispose();
-			}
-			if(participantmanager != null) {
-				participantmanager.dispose();
-			}
-			if(prefmanager != null) {
-				prefmanager.stop();
-			}
-			if(InstanceScope.INSTANCE.getNode(PLUGIN_ID).getBoolean(Constants.DELETE_EXT_PROJECT_ON_EXIT, false)) {
-				if(extSrcProject != null && extSrcProject.exists()) {
-					extSrcProject.delete(true, null);
-				}
-			}
-		}
-		finally {
-			super.stop(context);
-		}
-	}
-
-	/**
-	 * Returns the singleton instance
-	 *
-	 * @return the singleton instance
-	 */
-	public static JavaScriptDebugPlugin getDefault() {
-		return plugin;
-	}
-	
-	/**
-	 * Logs the specified status with this plug-in's log.
-	 * 
-	 * @param status status to log
-	 */
-	public static void log(IStatus status) {
-		if (plugin != null) {
-			plugin.getLog().log(status);
-		}
-	}
-
-	/**
-	 * Logs the specified throwable with this plug-in's log.
-	 * 
-	 * @param t throwable to log 
-	 */
-	public static void log(Throwable t) {
-		log(newErrorStatus("Error logged from JSDT Debug Core: ", t)); //$NON-NLS-1$
-	}
-	
-	/**
-	 * Logs an internal error with the specified message.
-	 * 
-	 * @param message the error message to log
-	 */
-	public static void logErrorMessage(String message) {
-		log(newErrorStatus("Internal message logged from JavaScript Debug Core: " + message, null)); //$NON-NLS-1$	
-	}
-	
-	/**
-	 * Returns a new error status for this plug-in with the given message
-	 * @param message the message to be included in the status
-	 * @param exception the exception to be included in the status or <code>null</code> if none
-	 * @return a new error status
-	 */
-	public static IStatus newErrorStatus(String message, Throwable exception) {
-		return new Status(IStatus.ERROR, PLUGIN_ID, INTERNAL_ERROR, message, exception);
-	}
-
-	/**
-	 * Caches the original {@link URI} script path for the given external source path
-	 *  
-	 * @param path
-	 * @param scriptPath
-	 */
-	public static synchronized void addExternalScriptPath(IPath path, String scriptPath) {
-		externalScriptPaths.put(path.makeAbsolute(), scriptPath);
-	}
-	
-	/**
-	 * Fetches the original {@link URI} script path for the given external source path
-	 * 
-	 * @param path
-	 * @return
-	 */
-	public static synchronized String getExternalScriptPath(IPath path) {
-		return (String) externalScriptPaths.get(path.makeAbsolute());
-	}
-	
-	/**
-	 * Tries to find a local script path given the specified URI.
-	 * Returns <code>null</code> if no mapping is found
-	 * 
-	 * @param uri the URI to find a source mapping for
-	 * @return the absolute local path to the script mapped to the given URI, or <code>null</code>
-	 */
-	public static synchronized String findExternalScriptPathFromURI(String uri) {
-		if(uri != null) {
-			Entry e = null;
-			for (Iterator i = externalScriptPaths.entrySet().iterator(); i.hasNext();) {
-				e = (Entry) i.next();
-				if(uri.equals(e.getValue())) {
-					IPath p = (IPath) e.getKey();
-					return p.toString();
-				}
-			}
-		}
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/JavaScriptDebugPreferenceInitializer.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/JavaScriptDebugPreferenceInitializer.java
deleted file mode 100644
index b93a94a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/JavaScriptDebugPreferenceInitializer.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core;
-
-import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
-import org.eclipse.core.runtime.preferences.DefaultScope;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.osgi.service.prefs.BackingStoreException;
-
-/**
- * Preference Initializer
- * 
- * @since 1.0
- */
-public class JavaScriptDebugPreferenceInitializer extends AbstractPreferenceInitializer {
-
-	/**
-	 * Constructor
-	 */
-	public JavaScriptDebugPreferenceInitializer() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
-	 */
-	public void initializeDefaultPreferences() {
-		IEclipsePreferences prefs = DefaultScope.INSTANCE.getNode(JavaScriptDebugPlugin.PLUGIN_ID);
-		if(prefs != null) {
-			prefs.putBoolean(Constants.SUSPEND_ON_ALL_SCRIPT_LOADS, false);
-			prefs.putBoolean(Constants.SUSPEND_ON_THROWN_EXCEPTION, true);
-			prefs.putBoolean(Constants.DELETE_EXT_PROJECT_ON_EXIT, false);
-			try {
-				prefs.flush();
-			} catch (BackingStoreException e) {
-				JavaScriptDebugPlugin.log(e);
-			}
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/JavaScriptPreferencesManager.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/JavaScriptPreferencesManager.java
deleted file mode 100644
index 08fd5d4..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/JavaScriptPreferencesManager.java
+++ /dev/null
@@ -1,302 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLoadBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.model.JavaScriptDebugModel;
-import org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptExceptionBreakpoint;
-import org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptLoadBreakpoint;
-import org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget;
-
-/**
- * Manager to handle various preferences.<br>
- * <br>
- * Specifically this manager handles the preferences for:
- * <ul>
- * <li>Suspend on all script loads</li>
- * </ul>
- * 
- * @since 1.0
- */
-public class JavaScriptPreferencesManager implements IPreferenceChangeListener {
-
-	/**
-	 * The invisible "suspend on all script loads" breakpoint
-	 */
-	private static IJavaScriptLoadBreakpoint allLoadsBreakpoint = null;
-	
-	/**
-	 * The invisible "suspend on exception" breakpoint
-	 * @since 1.1
-	 */
-	private static JavaScriptExceptionBreakpoint allExceptions = null;
-	
-	class StartJob extends Job {
-		private boolean loads = false;
-		private boolean exceptions = false;
-		/**
-		 * Constructor
-		 */
-		public StartJob(boolean loads, boolean exceptions) {
-			super(Constants.EMPTY_STRING);
-			this.loads = loads;
-			this.exceptions = exceptions;
-		}
-		/* (non-Javadoc)
-		 * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
-		 */
-		protected IStatus run(IProgressMonitor monitor) {
-			if(loads) {
-				allLoadsBreakpoint = createSuspendOnAllLoads();
-			}
-			if(exceptions) {
-				allExceptions = createSuspendOnException();
-			}
-			return Status.OK_STATUS;
-		}
-		
-	}
-	
-	/**
-	 * Starts the manager
-	 */
-	public void start() {
-		IEclipsePreferences node = InstanceScope.INSTANCE.getNode(JavaScriptDebugPlugin.PLUGIN_ID);
-		node.addPreferenceChangeListener(this);
-		StartJob job = new StartJob(node.getBoolean(Constants.SUSPEND_ON_ALL_SCRIPT_LOADS, false), 
-				node.getBoolean(Constants.SUSPEND_ON_THROWN_EXCEPTION, true));
-		job.setSystem(true);
-		job.setPriority(Job.INTERACTIVE);
-		job.schedule();
-	}
-	
-	/**
-	 * Stops the manager and clean up
-	 */
-	public void stop() {
-		IEclipsePreferences node = InstanceScope.INSTANCE.getNode(JavaScriptDebugPlugin.PLUGIN_ID);
-		if(node != null) {
-			node.removePreferenceChangeListener(this);
-		}
-		try {
-			if(allLoadsBreakpoint != null) {
-				allLoadsBreakpoint.delete();
-			}
-			if(allExceptions != null) {
-				allExceptions.delete();
-			}
-		} catch (CoreException e) {
-			JavaScriptDebugPlugin.log(e);
-		}
-		finally {
-			try {
-				//confirm they are all gone
-				//https://bugs.eclipse.org/bugs/show_bug.cgi?id=323152
-				IMarker[] markers = ResourcesPlugin.getWorkspace().getRoot().findMarkers(IJavaScriptBreakpoint.MARKER_ID, true, IResource.DEPTH_ZERO);
-				for (int i = 0; i < markers.length; i++) {
-					markers[i].delete();
-				}
-			}
-			catch(CoreException ce) {
-				JavaScriptDebugPlugin.log(ce);
-			}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener#preferenceChange(org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent)
-	 */
-	public void preferenceChange(PreferenceChangeEvent event) {
-		if(event.getKey().equals(Constants.SUSPEND_ON_ALL_SCRIPT_LOADS)) {
-			Object newval = event.getNewValue();
-			if(newval != null && newval.equals(Boolean.TRUE.toString()) && allLoadsBreakpoint == null) {
-				//create it
-				allLoadsBreakpoint = createSuspendOnAllLoads();
-			}
-			else {
-				deleteSuspendOnAllLoads();
-			}
-			return;
-		}
-		if(event.getKey().equals(Constants.SUSPEND_ON_THROWN_EXCEPTION)) {
-			Object newval = event.getNewValue();
-			if(newval != null && newval.equals(Boolean.TRUE.toString())) {
-				//create it
-				allExceptions = createSuspendOnException();
-			}
-			else {
-				deleteSuspendOnException();
-			}
-		}
-	}
-	
-	/**
-	 * Creates the singleton exception breakpoint
-	 * 
-	 * @return the new {@link JavaScriptExceptionBreakpoint}
-	 * @since 1.1
-	 */
-	private JavaScriptExceptionBreakpoint createSuspendOnException() {
-		try {
-			JavaScriptExceptionBreakpoint breakpoint = new JavaScriptExceptionBreakpoint(new HashMap());
-			breakpoint.setPersisted(false); // do not persist - https://bugs.eclipse.org/bugs/show_bug.cgi?id=323152
-			IDebugTarget[] targets = DebugPlugin.getDefault().getLaunchManager().getDebugTargets();
-			for (int i = 0; i < targets.length; i++) {
-				if(targets[i] instanceof JavaScriptDebugTarget) {
-					((JavaScriptDebugTarget)targets[i]).breakpointAdded(breakpoint);
-				}
-			}
-			return breakpoint;
-		}
-		catch(DebugException de) {
-			JavaScriptDebugPlugin.log(de);
-		} catch (CoreException ce) {
-			JavaScriptDebugPlugin.log(ce);
-		}
-		return null;
-	}
-	
-	/**
-	 * Deletes any set exception breakpoints
-	 * 
-	 * @since 1.1
-	 */
-	private void deleteSuspendOnException() {
-		if(allExceptions != null) {
-			//notify all the targets
-			IDebugTarget[] targets = DebugPlugin.getDefault().getLaunchManager().getDebugTargets();
-			for (int i = 0; i < targets.length; i++) {
-				if(targets[i] instanceof JavaScriptDebugTarget) {
-					((JavaScriptDebugTarget)targets[i]).breakpointRemoved(allExceptions, null);
-				}
-			}
-			try {
-				allExceptions.delete();
-			} catch (CoreException e) {
-				JavaScriptDebugPlugin.log(e);
-			}
-			finally {
-				allExceptions = null;
-			}
-		}
-	}
-	
-	/**
-	 * Deletes the "suspend on all script loads" breakpoint and notifies debug targets
-	 */
-	private void deleteSuspendOnAllLoads() {
-		if(allLoadsBreakpoint != null) {
-			//notify all the targets
-			IDebugTarget[] targets = DebugPlugin.getDefault().getLaunchManager().getDebugTargets();
-			for (int i = 0; i < targets.length; i++) {
-				if(targets[i] instanceof JavaScriptDebugTarget) {
-					((JavaScriptDebugTarget)targets[i]).breakpointRemoved(allLoadsBreakpoint, null);
-				}
-			}
-			try {
-				allLoadsBreakpoint.delete();
-			} catch (CoreException e) {
-				JavaScriptDebugPlugin.log(e);
-			}
-			finally {
-				allLoadsBreakpoint = null;
-			}
-		}
-	}
-	
-	/**
-	 * Creates the "suspend on all script loads" breakpoint and notifies all active debug targets 
-	 * @return the "suspend on all script loads" breakpoint or <code>null</code>
-	 */
-	private IJavaScriptLoadBreakpoint createSuspendOnAllLoads() {
-		try {
-			IJavaScriptLoadBreakpoint breakpoint = null;
-			try {
-				HashMap map = new HashMap();
-				map.put(JavaScriptLoadBreakpoint.GLOBAL_SUSPEND, Boolean.TRUE);
-				breakpoint = JavaScriptDebugModel.createScriptLoadBreakpoint(
-													ResourcesPlugin.getWorkspace().getRoot(), 
-													-1, 
-													-1, 
-													map, 
-													false);
-				breakpoint.setPersisted(false); //do not persist - https://bugs.eclipse.org/bugs/show_bug.cgi?id=323152
-			} catch (DebugException e) {
-				JavaScriptDebugPlugin.log(e);
-			}
-			if(breakpoint != null) {
-				//notify all the targets
-				IDebugTarget[] targets = DebugPlugin.getDefault().getLaunchManager().getDebugTargets();
-				for (int i = 0; i < targets.length; i++) {
-					if(targets[i] instanceof JavaScriptDebugTarget) {
-						((JavaScriptDebugTarget)targets[i]).breakpointAdded(breakpoint);
-					}
-				}
-			}
-			return breakpoint;
-		}
-		catch(CoreException ce) {
-			JavaScriptDebugPlugin.log(ce);
-			return null;
-		}
-	}
-	
-	/**
-	 * Allows the name of the script the global load breakpoint will suspend on
-	 * 
-	 * @param scriptpath the name of the script
-	 */
-	public static void setGlobalSuspendOn(String scriptpath) {
-		if(allLoadsBreakpoint != null) {
-			try {
-				allLoadsBreakpoint.getMarker().setAttribute(IJavaScriptBreakpoint.SCRIPT_PATH, scriptpath);
-			} catch (CoreException e) {
-				JavaScriptDebugPlugin.log(e);
-			}
-		}
-	}
-	
-	/**
-	 * Returns the complete list of breakpoints that this manager
-	 * creates or an empty list, never <code>null</code>
-	 * @return the listing of managed breakpoints never <code>null</code>
-	 */
-	public static IJavaScriptBreakpoint[] getAllManagedBreakpoints() {
-		ArrayList breakpoints = new ArrayList();
-		if(allLoadsBreakpoint != null) {
-			breakpoints.add(allLoadsBreakpoint);
-		}
-		if(allExceptions != null) {
-			breakpoints.add(allExceptions);
-		}
-		return (IJavaScriptBreakpoint[]) breakpoints.toArray(new IJavaScriptBreakpoint[breakpoints.size()]);
-	}
-	
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/JavaScriptWatchExpressionDelegate.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/JavaScriptWatchExpressionDelegate.java
deleted file mode 100644
index 158aaf6..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/JavaScriptWatchExpressionDelegate.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.debug.core.model.IThread;
-import org.eclipse.debug.core.model.IValue;
-import org.eclipse.debug.core.model.IWatchExpressionDelegate;
-import org.eclipse.debug.core.model.IWatchExpressionListener;
-import org.eclipse.debug.core.model.IWatchExpressionResult;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptStackFrame;
-
-/**
- * Default watch expression delegate for the JavaScript debugging
- * 
- * @since 1.0
- */
-public class JavaScriptWatchExpressionDelegate implements IWatchExpressionDelegate {
-
-	/**
-	 * Default result to return from the delegate
-	 */
-	class WatchResult implements IWatchExpressionResult {
-		String expression = null;
-		IValue value = null;
-		String[] errormessages = null;
-		DebugException exception = null;
-		
-		public WatchResult(String expression) {
-			this.expression = expression;
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.core.model.IWatchExpressionResult#getValue()
-		 */
-		public IValue getValue() {
-			return this.value;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.core.model.IWatchExpressionResult#hasErrors()
-		 */
-		public boolean hasErrors() {
-			return this.errormessages != null || this.exception != null;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.core.model.IWatchExpressionResult#getErrorMessages()
-		 */
-		public String[] getErrorMessages() {
-			return this.errormessages;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.core.model.IWatchExpressionResult#getExpressionText()
-		 */
-		public String getExpressionText() {
-			return this.expression;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.core.model.IWatchExpressionResult#getException()
-		 */
-		public DebugException getException() {
-			return this.exception;
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IWatchExpressionDelegate#evaluateExpression(java.lang.String, org.eclipse.debug.core.model.IDebugElement, org.eclipse.debug.core.model.IWatchExpressionListener)
-	 */
-	public void evaluateExpression(String expression, IDebugElement context, IWatchExpressionListener listener) {
-		WatchResult result = new WatchResult(expression);
-		try {
-			IStackFrame fcontext  = getFrameContext(context);
-			if(fcontext instanceof IJavaScriptStackFrame) {
-				IJavaScriptStackFrame frame = (IJavaScriptStackFrame) fcontext;
-				result.value = frame.evaluate(expression);
-			}
-		}
-		catch(DebugException de) {
-			result.exception = de;
-			result.errormessages = new String[] {de.getMessage()};
-		}
-		finally {
-			listener.watchEvaluationFinished(result);
-		}
-	}
-	
-	/**
-	 * Returns the {@link IStackFrame} context to evaluate the expression with
-	 * or <code>null</code> if the element is not an {@link IStackFrame} or an {@link IThread}, or 
-	 * if the call to {@link IThread#getTopStackFrame()} fails.
-	 * 
-	 * @param element the element to get the {@link IStackFrame} context from
-	 * @return the {@link IStackFrame} context or <code>null</code>
-	 * @throws DebugException
-	 */
-	IStackFrame getFrameContext(IDebugElement element) throws DebugException {
-		if(element instanceof IStackFrame) {
-			return (IStackFrame) element;
-		}
-		if(element instanceof IThread) {
-			return ((IThread)element).getTopStackFrame();
-		}
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/Messages.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/Messages.java
deleted file mode 100644
index 349b975..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/Messages.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.internal.core.messages"; //$NON-NLS-1$
-	public static String external_javascript_source;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/TextUtils.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/TextUtils.java
deleted file mode 100644
index dfaea0b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/TextUtils.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core;
-
-/**
- * Utility class with common text handling functions in it
- * 
- * @since 1.0
- */
-public final class TextUtils {
-
-	private TextUtils() {/*no instantiation*/}
-
-	/**
-	 * Shortens the given string to be no longer than the given threshold. Any removed characters are 
-	 * replaced with <code>...</code>.<br><br>
-	 * For example: <code>shortenText("this is a string to shorten text", 8)</code> would result in the string:
-	 * <code>"thi...xt"</code>
-	 * 
-	 * @param string
-	 * @param threshold TODO
-	 * @return the given string shortened to be no longer than the given threshold
-	 */
-	public static String shortenText(String string, int threshold) {
-		int length = string.length(); 
-		if (length > threshold) {
-			int chomp = length - threshold + 3;
-			int begin = Math.round(threshold/2)-1;
-			StringBuffer buff = new StringBuffer();
-			buff.append(string.substring(0, begin)).append("...").append(string.substring(begin+chomp)); //$NON-NLS-1$
-			return buff.toString();
-		}
-		return string;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/DefaultJavaScriptBreakpointParticipant.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/DefaultJavaScriptBreakpointParticipant.java
deleted file mode 100644
index b756be5..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/DefaultJavaScriptBreakpointParticipant.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core.breakpoints;
-
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpointParticipant;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread;
-
-/**
- * A default breakpoint participant
- * 
- * @since 1.1
- */
-public class DefaultJavaScriptBreakpointParticipant implements IJavaScriptBreakpointParticipant {
-
-	/**
-	 * Constructor
-	 */
-	public DefaultJavaScriptBreakpointParticipant() {}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpointParticipant#breakpointHit(org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread, org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint)
-	 */
-	public int breakpointHit(IJavaScriptThread thread, IJavaScriptBreakpoint breakpoint) {
-		return DONT_CARE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpointParticipant#scriptLoaded(org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread, org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference, org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint)
-	 */
-	public int scriptLoaded(IJavaScriptThread thread, ScriptReference script, IJavaScriptBreakpoint breakpoint) {
-		return DONT_CARE;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/JavaScriptBreakpoint.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/JavaScriptBreakpoint.java
deleted file mode 100644
index c9b3fb9..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/JavaScriptBreakpoint.java
+++ /dev/null
@@ -1,506 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core.breakpoints;
-
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.URIUtil;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.model.Breakpoint;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.BreakpointEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.Event;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ScriptLoadEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ScriptLoadRequest;
-import org.eclipse.wst.jsdt.debug.core.model.JavaScriptDebugModel;
-import org.eclipse.wst.jsdt.debug.internal.core.Constants;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.core.launching.SourceLookup;
-import org.eclipse.wst.jsdt.debug.internal.core.model.IJavaScriptEventListener;
-import org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget;
-import org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptThread;
-import org.eclipse.wst.jsdt.debug.internal.core.model.Script;
-
-/**
- * Abstract representation of a JSDI breakpoint
- * 
- * @since 1.0
- */
-public abstract class JavaScriptBreakpoint extends Breakpoint implements IJavaScriptBreakpoint, IJavaScriptEventListener {
-
-	/**
-	 * The total count of all of the targets this breakpoint is installed in
-	 */
-	public static final String INSTALL_COUNT = JavaScriptDebugPlugin.PLUGIN_ID + ".install_count"; //$NON-NLS-1$
-	
-	private HashSet targets = null;
-	private HashMap requestspertarget = new HashMap(4);
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.Breakpoint#setMarker(org.eclipse.core.resources.IMarker)
-	 */
-	public void setMarker(IMarker marker) throws CoreException {
-		super.setMarker(marker);
-		// reset the install count
-		setAttribute(INSTALL_COUNT, 0);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.Breakpoint#setAttribute(java.lang.String, boolean)
-	 */
-	protected void setAttribute(final String attributeName, final boolean value) throws CoreException {
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		IWorkspaceRunnable runnable= new IWorkspaceRunnable() {
-			public void run(IProgressMonitor monitor) throws CoreException {
-				ensureMarker().setAttribute(attributeName, value);
-			}
-		};
-		workspace.run(runnable, getMarkerRule(), IWorkspace.AVOID_UPDATE, null);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.Breakpoint#setAttribute(java.lang.String, java.lang.Object)
-	 */
-	protected void setAttribute(final String attributeName, final Object value) throws CoreException {
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		IWorkspaceRunnable runnable= new IWorkspaceRunnable() {
-			public void run(IProgressMonitor monitor) throws CoreException {
-				ensureMarker().setAttribute(attributeName, value);
-			}
-		};
-		workspace.run(runnable, getMarkerRule(), IWorkspace.AVOID_UPDATE, null);
-	}
-	
-	/**
-	 * Add this breakpoint to the breakpoint manager, or sets it as unregistered.
-	 */
-	protected void register(boolean register) throws CoreException {
-		DebugPlugin plugin = DebugPlugin.getDefault();
-		if (plugin != null && register) {
-			plugin.getBreakpointManager().addBreakpoint(this);
-		} else {
-			setRegistered(false);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IBreakpoint#getModelIdentifier()
-	 */
-	public String getModelIdentifier() {
-		return JavaScriptDebugModel.MODEL_ID;
-	}
-
-	/**
-	 * Returns whether this breakpoint should be "skipped". Breakpoints are skipped if the breakpoint manager is disabled and the breakpoint is registered with the manager
-	 * 
-	 * @return whether this breakpoint should be skipped
-	 */
-	public boolean shouldSkipBreakpoint() throws CoreException {
-		DebugPlugin plugin = DebugPlugin.getDefault();
-		return plugin != null && isRegistered() && !plugin.getBreakpointManager().isEnabled();
-	}
-	
-	/**
-	 * Adds the given debug target to the listing of targets that this breakpoint cares about
-	 * 
-	 * @param target
-	 * @throws CoreException
-	 */
-	public void addToTarget(JavaScriptDebugTarget target) throws CoreException {
-		if (target.isTerminated() || shouldSkipBreakpoint()) {
-			return;
-		}
-		// Add script load handler
-		ScriptLoadRequest request = target.getEventRequestManager().createScriptLoadRequest();
-		request.setEnabled(isEnabled());
-		registerRequest(target, request);
-
-		// Add to all loaded scripts
-		String scriptPath = getScriptPath();
-		if (scriptPath == null) {
-			return;
-		}
-		
-		try {
-			if(JavaScriptDebugPlugin.isExternalSource(new Path(scriptPath))) {
-				scriptPath = getMarker().getResource().getPersistentProperty(SourceLookup.SCRIPT_URL);
-			}
-			if(scriptPath == null) {
-				return;
-			}
-			List/* ScriptReference */scripts = target.underlyingScripts(Script.resolveName(URIUtil.fromString(scriptPath)));
-			boolean success = true;
-			for (Iterator iter = scripts.iterator(); iter.hasNext();) {
-				ScriptReference script = (ScriptReference) iter.next();
-				if (JavaScriptDebugPlugin.getResolutionManager().matches(script, new Path(getScriptPath()))) {
-					success &= createRequest(target, script);
-				}
-			}
-			if (success) {
-				if (this.targets == null) {
-					this.targets = new HashSet();
-				}
-				this.targets.add(target);
-			}
-		}
-		catch(URISyntaxException urise) {
-			JavaScriptDebugPlugin.log(urise);
-		}
-	}
-
-	/**
-	 * Creates a request for the given script in the given target
-	 * 
-	 * @param target
-	 *            the target to register with
-	 * @param script
-	 *            the script we want to set the breakpoint in
-	 * @return true if a new request was created false otherwise
-	 * @throws CoreException
-	 */
-	protected abstract boolean createRequest(JavaScriptDebugTarget target, ScriptReference script) throws CoreException;
-
-	/**
-	 * Configures the request with attributes from the breakpoint
-	 * 
-	 * @param request
-	 * @throws CoreException
-	 */
-	protected void configureRequest(BreakpointRequest request) throws CoreException {
-		request.addHitCountFilter(getHitCount());
-	}
-
-	/**
-	 * Removes the given debug target from the listing of targets this breakpoint cares about
-	 * 
-	 * @param target
-	 */
-	public void removeFromTarget(JavaScriptDebugTarget target) {
-		List requests = getRequests(target);
-		if (requests != null) {
-			for (Iterator iter = requests.iterator(); iter.hasNext();) {
-				EventRequest request = null;
-				try {
-					request = (EventRequest) iter.next();
-					if (target.isAvailable()) {
-						target.getEventRequestManager().deleteEventRequest(request);
-					}
-				} finally {
-					deregisterRequest(target, request);
-				}
-			}
-		}
-		synchronized (this.requestspertarget) {
-			this.requestspertarget.remove(target);
-		}
-		if (this.targets == null) {
-			return;
-		}
-		this.targets.remove(target);
-	}
-
-	/**
-	 * Recreate this breakpoint in all targets
-	 * 
-	 * @throws CoreException
-	 */
-	protected void recreateBreakpoint() throws CoreException {
-		DebugPlugin plugin = DebugPlugin.getDefault();
-		if (plugin != null) {
-			IDebugTarget[] targets = plugin.getLaunchManager().getDebugTargets();
-			for (int i = 0; i < targets.length; i++) {
-				if (targets[i].getModelIdentifier().equals(JavaScriptDebugModel.MODEL_ID)) {
-					recreateBreakpointFor((JavaScriptDebugTarget) targets[i]);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Recreates this breakpoint in the given debug target
-	 * 
-	 * @param target
-	 * @throws CoreException
-	 */
-	void recreateBreakpointFor(JavaScriptDebugTarget target) throws CoreException {
-		if (target.isAvailable() && target.getBreakpoints().contains(this)) {
-			removeFromTarget(target);
-			addToTarget(target);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.Breakpoint#setEnabled(boolean)
-	 */
-	public void setEnabled(boolean enabled) throws CoreException {
-		if(isEnabled() != enabled) {
-			setAttribute(ENABLED, enabled);
-			recreateBreakpoint();
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint#setSuspendPolicy(int)
-	 */
-	public void setSuspendPolicy(int policy) throws CoreException {
-		if(getSuspendPolicy() != policy) {
-			setAttribute(SUSPEND_POLICY, policy);
-			recreateBreakpoint();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint#getSuspendPolicy()
-	 */
-	public int getSuspendPolicy() throws CoreException {
-		return ensureMarker().getAttribute(SUSPEND_POLICY, SUSPEND_THREAD);
-	}
-
-	/**
-	 * Returns if this breakpoint is currently installed in any targets
-	 * 
-	 * @return true if this breakpoint is installed in any targets, false otherwise
-	 * @throws CoreException
-	 */
-	public boolean isInstalled() throws CoreException {
-		return ensureMarker().getAttribute(INSTALL_COUNT, 0) > 0;
-	}
-
-	/**
-	 * Increments the install count of this breakpoint
-	 */
-	protected void incrementInstallCount() throws CoreException {
-		int count = getInstallCount();
-		setAttribute(INSTALL_COUNT, count + 1);
-	}
-
-	/**
-	 * Returns the <code>INSTALL_COUNT</code> attribute of this breakpoint or 0 if the attribute is not set.
-	 */
-	public int getInstallCount() throws CoreException {
-		return ensureMarker().getAttribute(INSTALL_COUNT, 0);
-	}
-
-	/**
-	 * Decrements the install count of this breakpoint.
-	 */
-	protected void decrementInstallCount() throws CoreException {
-		int count = getInstallCount();
-		if (count > 0) {
-			setAttribute(INSTALL_COUNT, count - 1);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint#setHitCount(int)
-	 */
-	public void setHitCount(int count) throws CoreException, IllegalArgumentException {
-		if (count != getHitCount()) {
-			setAttribute(HIT_COUNT, count);
-			recreateBreakpoint();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint#getHitCount()
-	 */
-	public int getHitCount() throws CoreException {
-		return ensureMarker().getAttribute(HIT_COUNT, -1);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint#getScriptPath()
-	 */
-	public String getScriptPath() throws CoreException {
-		return ensureMarker().getAttribute(SCRIPT_PATH, Constants.EMPTY_STRING);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint#getTypeName()
-	 */
-	public String getTypeName() throws CoreException {
-		return ensureMarker().getAttribute(TYPE_NAME, null);
-	}
-
-	/**
-	 * Registers the given request for this breakpoint for the given target
-	 * 
-	 * @param target
-	 * @param request
-	 */
-	protected void registerRequest(JavaScriptDebugTarget target, EventRequest request) {
-		addRequestForTarget(target, request);
-		if (!(request instanceof ScriptLoadRequest)) {
-			try {
-				incrementInstallCount();
-			} catch (CoreException ce) {
-				JavaScriptDebugPlugin.log(ce);
-			}
-		}
-	}
-
-	/**
-	 * Adds the given request to the list of requests for the given target
-	 * @param target
-	 * @param request
-	 */
-	protected synchronized void addRequestForTarget(JavaScriptDebugTarget target, EventRequest request) {
-		ArrayList requests = getRequests(target);
-		if (requests == null) {
-			synchronized (this.requestspertarget) {
-				requests = new ArrayList(2);
-				this.requestspertarget.put(target, requests);
-			}
-		}
-		requests.add(request);
-		target.addJSDIEventListener(this, request);
-	}
-
-	/**
-	 * Returns any existing requests associated with the given target
-	 * 
-	 * @param target
-	 * @return list of requests for the given target
-	 */
-	protected ArrayList getRequests(JavaScriptDebugTarget target) {
-		ArrayList list = null;
-		synchronized (this.requestspertarget) {
-			list = (ArrayList) this.requestspertarget.get(target);
-		}
-		return list;
-	}
-
-	/**
-	 * Remove this breakpoint as an event listener
-	 * 
-	 * @param target
-	 * @param request
-	 */
-	protected void deregisterRequest(JavaScriptDebugTarget target, EventRequest request) {
-		target.removeJSDIEventListener(this, request);
-		if (!(request instanceof ScriptLoadRequest)) {
-			try {
-				decrementInstallCount();
-			} catch (CoreException ce) {
-				JavaScriptDebugPlugin.log(ce);
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.model.IJavaScriptEventListener#handleEvent(org.eclipse.wst.jsdt.debug.core.jsdi.event.Event, org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget, boolean, org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet)
-	 */
-	public boolean handleEvent(Event event, JavaScriptDebugTarget target, boolean suspendVote, EventSet eventSet) {
-		// get the thread and suspend it
-		if (event instanceof BreakpointEvent) {
-			JavaScriptThread thread = target.findThread(((BreakpointEvent) event).thread());
-			if (thread != null) {
-				return !thread.suspendForBreakpoint(this, suspendVote);
-			}
-		}
-		if (event instanceof ScriptLoadEvent) {
-			ScriptLoadEvent sevent = (ScriptLoadEvent) event;
-			ScriptReference script = sevent.script();
-			
-			try {
-				if (JavaScriptDebugPlugin.getResolutionManager().matches(script, new Path(getScriptPath()))) {
-					createRequest(target, script);
-				}
-			} catch (CoreException ce) {
-				JavaScriptDebugPlugin.log(ce);
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * Returns if the type names for the breakpoint are equal or not. Two <code>null</code> type names are considered to be equal.
-	 * 
-	 * @param tname1
-	 * @param tname2
-	 * @return true if the type names are equal, false otherwise
-	 */
-	boolean typeNamesEqual(String tname1, String tname2) {
-		if (tname1 == null && tname2 == null) {
-			return true;
-		}
-		return tname1 != null && tname1.equals(tname2);
-	}
-
-	/**
-	 * Custom comparison to avoid the leading separator issue from saying the paths are not equal
-	 * 
-	 * @param p1
-	 * @param p2
-	 * @return
-	 */
-	boolean pathsEqual(IPath p1, IPath p2) {
-		if (p1.segmentCount() == p2.segmentCount()) {
-			String[] segments = p1.segments();
-			for (int i = 0; i < segments.length; i++) {
-				if (!segments[i].equals(p2.segment(i))) {
-					return false;
-				}
-			}
-		}
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.model.IJavaScriptEventListener#eventSetComplete(org.eclipse.wst.jsdt.debug.core.jsdi.event.Event, org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget, boolean, org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet)
-	 */
-	public void eventSetComplete(Event event, JavaScriptDebugTarget target, boolean suspend, EventSet eventSet) {
-		if (event instanceof BreakpointEvent) {
-			JavaScriptThread thread = target.findThread(((BreakpointEvent) event).thread());
-			if (thread != null) {
-				thread.suspendForBreakpointComplete(this, suspend, eventSet);
-			}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint#setJavaScriptElementHandle(java.lang.String)
-	 */
-	public void setJavaScriptElementHandle(String handle) throws CoreException {
-		ensureMarker().setAttribute(ELEMENT_HANDLE, handle);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint#getJavaScriptElementHandle()
-	 */
-	public String getJavaScriptElementHandle() throws CoreException {
-		return ensureMarker().getAttribute(ELEMENT_HANDLE, null);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/JavaScriptExceptionBreakpoint.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/JavaScriptExceptionBreakpoint.java
deleted file mode 100644
index 385d1f8..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/JavaScriptExceptionBreakpoint.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core.breakpoints;
-
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLoadBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.Event;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ExceptionEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest;
-import org.eclipse.wst.jsdt.debug.core.model.JavaScriptDebugModel;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget;
-import org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptThread;
-
-
-/**
- * Implementation of an exception breakpoint
- * 
- * @since 1.0
- */
-public class JavaScriptExceptionBreakpoint extends JavaScriptBreakpoint {
-	
-	public static final String MESSAGE = JavaScriptDebugPlugin.PLUGIN_ID + ".exception_message"; //$NON-NLS-1$
-	
-	private ExceptionRequest request = null;
-	
-	/**
-	 * Constructor
-	 * 
-	 * Required for persistence / restore
-	 */
-	public JavaScriptExceptionBreakpoint() {}
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param attributes
-	 * @throws DebugException
-	 */
-	public JavaScriptExceptionBreakpoint(final Map attributes) throws DebugException {
-		IWorkspaceRunnable wr = new IWorkspaceRunnable() {
-			public void run(IProgressMonitor monitor) throws CoreException {
-				IMarker marker = ResourcesPlugin.getWorkspace().getRoot().createMarker(IJavaScriptLoadBreakpoint.MARKER_ID);
-				// create the marker
-				setMarker(marker);
-
-				// add attributes
-				attributes.put(IBreakpoint.ID, getModelIdentifier());
-				attributes.put(IBreakpoint.ENABLED, Boolean.valueOf(true));
-				Integer nochar = new Integer(-1);
-				attributes.put(IMarker.CHAR_START, nochar);
-				attributes.put(IMarker.CHAR_END, nochar);
-
-				ensureMarker().setAttributes(attributes);
-
-				// add to breakpoint manager if requested
-				register(false);
-			}
-		};
-		run(getMarkerRule(ResourcesPlugin.getWorkspace().getRoot()), wr);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IBreakpoint#getModelIdentifier()
-	 */
-	public String getModelIdentifier() {
-		return JavaScriptDebugModel.MODEL_ID;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptBreakpoint#addToTarget(org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget)
-	 */
-	public void addToTarget(JavaScriptDebugTarget target) throws CoreException {
-		if (target.isTerminated() || shouldSkipBreakpoint()) {
-			return;
-		}
-		if(request == null) {
-			request = target.getVM().eventRequestManager().createExceptionRequest();
-			request.setEnabled(true);
-			addRequestForTarget(target, request);
-		}
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptBreakpoint#deregisterRequest(org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget, org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest)
-	 */
-	protected void deregisterRequest(JavaScriptDebugTarget target, EventRequest request) {
-		target.removeJSDIEventListener(this, request);
-		this.request = null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptBreakpoint#createRequest(org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget, org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference)
-	 */
-	protected boolean createRequest(JavaScriptDebugTarget target, ScriptReference script) throws CoreException {
-		return true;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptBreakpoint#handleEvent(org.eclipse.wst.jsdt.debug.core.jsdi.event.Event, org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget, boolean, org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet)
-	 */
-	public boolean handleEvent(Event event, JavaScriptDebugTarget target, boolean suspendVote, EventSet eventSet) {
-		if(event instanceof ExceptionEvent) {
-			try {
-				ExceptionEvent eevent = (ExceptionEvent) event;
-				setAttribute(MESSAGE, eevent.message());
-				JavaScriptThread thread = target.findThread(eevent.thread());
-				if (thread != null) {
-					thread.addBreakpoint(this);
-					return false;
-				}
-			}
-			catch(CoreException ce) {
-				JavaScriptDebugPlugin.log(ce);
-			}
-		}
-		return true;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptBreakpoint#eventSetComplete(org.eclipse.wst.jsdt.debug.core.jsdi.event.Event, org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget, boolean, org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet)
-	 */
-	public void eventSetComplete(Event event, JavaScriptDebugTarget target, boolean suspend, EventSet eventSet) {
-		if(event instanceof ExceptionEvent) {
-			JavaScriptThread thread = target.findThread(((ExceptionEvent) event).thread());
-			if (thread != null) {
-				thread.suspendForException(this);
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/JavaScriptFunctionBreakpoint.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/JavaScriptFunctionBreakpoint.java
deleted file mode 100644
index 23dd164..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/JavaScriptFunctionBreakpoint.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core.breakpoints;
-
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptFunctionBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget;
-
-/**
- * JavaScript function breakpoint
- * 
- * @since 1.0
- */
-public class JavaScriptFunctionBreakpoint extends JavaScriptLineBreakpoint implements IJavaScriptFunctionBreakpoint {
-
-	/**
-	 * If this is a function entry breakpoint
-	 */
-	private static final String ENTRY = JavaScriptDebugPlugin.PLUGIN_ID + ".entry"; //$NON-NLS-1$
-
-	/**
-	 * if this is a function exit breakpoint
-	 */
-	private static final String EXIT = JavaScriptDebugPlugin.PLUGIN_ID + ".exit"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 */
-	public JavaScriptFunctionBreakpoint() {
-		// needed for restoring breakpoints via extension point contributions
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param resource
-	 * @param name
-	 * @param signature
-	 * @param charstart
-	 * @param charend
-	 * @param attributes
-	 * @param register
-	 * @throws DebugException
-	 */
-	public JavaScriptFunctionBreakpoint(final IResource resource, final String name, final String signature, final int charstart, final int charend, final Map attributes, final boolean register) throws DebugException {
-		IWorkspaceRunnable wr = new IWorkspaceRunnable() {
-			public void run(IProgressMonitor monitor) throws CoreException {
-
-				// create the marker
-				setMarker(resource.createMarker(IJavaScriptFunctionBreakpoint.MARKER_ID));
-
-				// add attributes
-				attributes.put(IBreakpoint.ID, getModelIdentifier());
-				attributes.put(IBreakpoint.ENABLED, Boolean.valueOf(true));
-				attributes.put(FUNCTION_NAME, name);
-				attributes.put(FUNCTION_SIGNAURE, signature);
-				attributes.put(IMarker.CHAR_START, new Integer(charstart));
-				attributes.put(IMarker.CHAR_END, new Integer(charend));
-				attributes.put(ENTRY, Boolean.valueOf(true));
-
-				ensureMarker().setAttributes(attributes);
-
-				// add to breakpoint manager if requested
-				register(register);
-			}
-		};
-		run(getMarkerRule(resource), wr);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptFunctionBreakpoint#getFunctionName()
-	 */
-	public String getFunctionName() throws CoreException {
-		return ensureMarker().getAttribute(FUNCTION_NAME, null);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptFunctionBreakpoint#getSignature()
-	 */
-	public String getSignature() throws CoreException {
-		return ensureMarker().getAttribute(FUNCTION_SIGNAURE, null);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptLineBreakpoint#createRequest(org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget, org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference)
-	 */
-	protected boolean createRequest(JavaScriptDebugTarget target, ScriptReference script) throws CoreException {
-		Location loc = script.functionLocation(getFunctionName());
-		if (loc == null) {
-			return false;
-		}
-		BreakpointRequest request = target.getEventRequestManager().createBreakpointRequest(loc);
-		registerRequest(target, request);
-		configureRequest(request);
-		request.setEnabled(isEnabled());
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptFunctionBreakpoint#isEntry()
-	 */
-	public boolean isEntry() throws CoreException {
-		return ensureMarker().getAttribute(ENTRY, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptFunctionBreakpoint#setEntry(boolean)
-	 */
-	public void setEntry(boolean isentry) throws CoreException {
-		if (isentry != isEntry()) {
-			if(isentry && !isEnabled()) {
-				setAttributes(
-					new String[] {ENTRY, ENABLED}, 
-					new Object[] {Boolean.valueOf(isentry), Boolean.TRUE});
-			}
-			else if(!isExit()) {
-				setAttributes(
-					new String[] {ENTRY, ENABLED}, 
-					new Object[] {Boolean.valueOf(isentry), Boolean.FALSE});
-			}
-			else {
-				setAttribute(ENTRY, isentry);
-			}	
-			recreateBreakpoint();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptFunctionBreakpoint#isExit()
-	 */
-	public boolean isExit() throws CoreException {
-		return ensureMarker().getAttribute(EXIT, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptFunctionBreakpoint#setExit(boolean)
-	 */
-	public void setExit(boolean isexit) throws CoreException {
-		if (isexit != isExit()) {
-			if(isexit && !isEnabled()) {
-				setAttributes(
-					new String[] {EXIT, ENABLED}, 
-					new Object[] {Boolean.valueOf(isexit), Boolean.TRUE});
-			}
-			else if(!isEntry()) {
-				setAttributes(
-					new String[] {EXIT, ENABLED}, 
-					new Object[] {Boolean.valueOf(isexit), Boolean.FALSE});
-			}
-			else {
-				setAttribute(EXIT, isexit);
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/JavaScriptLineBreakpoint.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/JavaScriptLineBreakpoint.java
deleted file mode 100644
index c795a60..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/JavaScriptLineBreakpoint.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core.breakpoints;
-
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget;
-
-/**
- * Default implementation of a line breakpoint
- * 
- * @since 1.0
- */
-public class JavaScriptLineBreakpoint extends JavaScriptBreakpoint implements IJavaScriptLineBreakpoint {
-
-	/**
-	 * The condition for the breakpoint
-	 */
-	public static final String CONDITION = JavaScriptDebugPlugin.PLUGIN_ID + ".condition"; //$NON-NLS-1$
-	/**
-	 * If the condition is enabled for the breakpoint or not - allows us to keep conditions even if they are not used
-	 */
-	public static final String CONDITION_ENABLED = JavaScriptDebugPlugin.PLUGIN_ID + ".condition_enabled"; //$NON-NLS-1$
-	/**
-	 * If the breakpoint should suspend when the condition evaluates to true
-	 */
-	public static final String CONDITION_SUSPEND_ON_TRUE = JavaScriptDebugPlugin.PLUGIN_ID + ".condition_suspend_on_true"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 */
-	public JavaScriptLineBreakpoint() {
-		// needed for restoring breakpoints via extension point contributions
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param resource
-	 * @param linenumber
-	 * @param charstart
-	 * @param charend
-	 * @param attributes
-	 * @param register
-	 * @throws DebugException
-	 */
-	public JavaScriptLineBreakpoint(final IResource resource, final int linenumber, final int charstart, final int charend, final Map attributes, final boolean register) throws DebugException {
-		IWorkspaceRunnable wr = new IWorkspaceRunnable() {
-			public void run(IProgressMonitor monitor) throws CoreException {
-
-				// create the marker
-				setMarker(resource.createMarker(IJavaScriptLineBreakpoint.MARKER_ID));
-
-				// add attributes
-				attributes.put(IBreakpoint.ID, getModelIdentifier());
-				attributes.put(IBreakpoint.ENABLED, Boolean.valueOf(true));
-				attributes.put(IMarker.LINE_NUMBER, new Integer(linenumber));
-				attributes.put(IMarker.CHAR_START, new Integer(charstart));
-				attributes.put(IMarker.CHAR_END, new Integer(charend));
-
-				ensureMarker().setAttributes(attributes);
-
-				// add to breakpoint manager if requested
-				register(register);
-			}
-		};
-		run(getMarkerRule(resource), wr);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptBreakpoint#createRequest(org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget, org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference)
-	 */
-	protected boolean createRequest(JavaScriptDebugTarget target, ScriptReference script) throws CoreException {
-		Location loc = script.lineLocation(getLineNumber());
-		if (loc == null) {
-			decrementInstallCount();
-			return false;
-		}
-		BreakpointRequest request = target.getEventRequestManager().createBreakpointRequest(loc);
-		registerRequest(target, request);
-		configureRequest(request);
-		request.setEnabled(isEnabled());
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptBreakpoint#configureRequest(org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest)
-	 */
-	protected void configureRequest(BreakpointRequest request) throws CoreException {
-		super.configureRequest(request);
-		request.addConditionFilter(getCondition());
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.ILineBreakpoint#getLineNumber()
-	 */
-	public int getLineNumber() throws CoreException {
-		return ensureMarker().getAttribute(IMarker.LINE_NUMBER, -1);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.ILineBreakpoint#getCharStart()
-	 */
-	public int getCharStart() throws CoreException {
-		return ensureMarker().getAttribute(IMarker.CHAR_START, -1);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.ILineBreakpoint#getCharEnd()
-	 */
-	public int getCharEnd() throws CoreException {
-		return ensureMarker().getAttribute(IMarker.CHAR_END, -1);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint#isConditionEnabled()
-	 */
-	public boolean isConditionEnabled() throws CoreException {
-		return ensureMarker().getAttribute(CONDITION_ENABLED, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint#isConditionSuspendOnTrue()
-	 */
-	public boolean isConditionSuspendOnTrue() throws CoreException {
-		return ensureMarker().getAttribute(CONDITION_SUSPEND_ON_TRUE, true);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint#setConditionSuspendOnTrue(boolean)
-	 */
-	public void setConditionSuspendOnTrue(boolean suspendontrue) throws CoreException {
-		if (suspendontrue != isConditionSuspendOnTrue()) {
-			setAttribute(CONDITION_SUSPEND_ON_TRUE, suspendontrue);
-			recreateBreakpoint();
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint#setCondition(java.lang.String)
-	 */
-	public void setCondition(String condition) throws CoreException {
-		if (condition != null && condition.length() == 0) {
-			setAttribute(CONDITION, null);
-		}
-		else {
-			setAttribute(CONDITION, condition);
-		}
-		recreateBreakpoint();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint#getCondition()
-	 */
-	public String getCondition() throws CoreException {
-		return ensureMarker().getAttribute(CONDITION, null);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint#setConditionEnabled(boolean)
-	 */
-	public void setConditionEnabled(boolean enabled) throws CoreException {
-		if(isConditionEnabled() != enabled) {
-			setAttribute(CONDITION_ENABLED, enabled);
-			recreateBreakpoint();
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/JavaScriptLoadBreakpoint.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/JavaScriptLoadBreakpoint.java
deleted file mode 100644
index 2dd7d85..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/JavaScriptLoadBreakpoint.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core.breakpoints;
-
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpointParticipant;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLoadBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.Event;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ScriptLoadEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ScriptLoadRequest;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptPreferencesManager;
-import org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget;
-import org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptThread;
-
-/**
- * Breakpoint that suspends on {@link ScriptLoadEvent}s
- * 
- * @since 1.0
- */
-public class JavaScriptLoadBreakpoint extends JavaScriptLineBreakpoint implements IJavaScriptLoadBreakpoint {
-
-	/**
-	 * Attribute flag to tag a script load breakpoint as a global suspend load breakpoint
-	 */
-	public static final String GLOBAL_SUSPEND = JavaScriptDebugPlugin.PLUGIN_ID + ".global_suspend"; //$NON-NLS-1$
-	
-	/**
-	 * Constructor
-	 */
-	public JavaScriptLoadBreakpoint() {
-		// used for persistence / restoration
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param resource
-	 * @param charstart
-	 * @param charend
-	 * @param attributes
-	 * @param register
-	 * @throws DebugException
-	 */
-	public JavaScriptLoadBreakpoint(final IResource resource, final int charstart, final int charend, final Map attributes, final boolean register) throws DebugException {
-		IWorkspaceRunnable wr = new IWorkspaceRunnable() {
-			public void run(IProgressMonitor monitor) throws CoreException {
-				IMarker marker = null;
-				if(resource == null) {
-					marker = ResourcesPlugin.getWorkspace().getRoot().createMarker(IJavaScriptLoadBreakpoint.MARKER_ID);
-				}
-				else {
-					marker = resource.createMarker(IJavaScriptLoadBreakpoint.MARKER_ID);
-				}
-				// create the marker
-				setMarker(marker);
-
-				// add attributes
-				attributes.put(IBreakpoint.ID, getModelIdentifier());
-				attributes.put(IBreakpoint.ENABLED, Boolean.valueOf(true));
-				attributes.put(IMarker.CHAR_START, new Integer(charstart));
-				attributes.put(IMarker.CHAR_END, new Integer(charend));
-
-				ensureMarker().setAttributes(attributes);
-
-				// add to breakpoint manager if requested
-				register(register);
-			}
-		};
-		run(getMarkerRule(ResourcesPlugin.getWorkspace().getRoot()), wr);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptBreakpoint#handleEvent(org.eclipse.wst.jsdt.debug.core.jsdi.event.Event, org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget, boolean, org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet)
-	 */
-	public boolean handleEvent(Event event, JavaScriptDebugTarget target, boolean suspendVote, EventSet eventSet) {
-		if (event instanceof ScriptLoadEvent) {
-			ScriptLoadEvent sevent = (ScriptLoadEvent) event;
-			ScriptReference script = sevent.script();
-			JavaScriptThread thread = target.findThread((sevent).thread());
-			if (thread != null) {
-				if(isGlobalLoadSuspend()) {
-					if(!supportsGlobalSuspend(target.getVM())) {
-						return true;
-					}
-					JavaScriptPreferencesManager.setGlobalSuspendOn(script.sourceURI().toString());
-					thread.addBreakpoint(this);
-					return false;
-				} else if(isMatchedScriptLoadSuspend(script, thread, suspendVote)){
-					thread.addBreakpoint(this);
-					return false;
-				}
-			}
-		}
-		return true;
-	}
-	
-	/**
-	 * Returns if this breakpoint matches this script and should suspend
-	 * 
-	 * @param script
-	 * @param thread
-	 * @param suspendVote
-	 * 
-	 * @return <code>true</code> if we should suspend on this script load <code>false</code> otherwise
-	 */
-	private boolean isMatchedScriptLoadSuspend(ScriptReference script, JavaScriptThread thread, boolean suspendVote) {
-		try {
-			if (JavaScriptDebugPlugin.getResolutionManager().matches(script, new Path(getScriptPath()))) {
-				int vote = thread.suspendForScriptLoad(this, script, suspendVote);
-				return (vote & IJavaScriptBreakpointParticipant.SUSPEND) > 0 || vote == IJavaScriptBreakpointParticipant.DONT_CARE;
-			}
-		}
-		catch(CoreException ce) {
-			JavaScriptDebugPlugin.log(ce);
-		}
-		return false;
-	}
-	
-	/**
-	 * Use reflection hack to opt-out of global suspend
-	 * 
-	 * @param vm
-	 * @return <code>true</code> if the backing {@link VirtualMachine} supports global suspend
-	 */
-	boolean supportsGlobalSuspend(VirtualMachine vm) {
-		boolean supports = true;
-		try {
-			//TODO consider supportsSuspendOnScriptLoads for future VirtualMachine extensions
-			Method m = vm.getClass().getMethod("supportsSuspendOnScriptLoads", new Class[0]); //$NON-NLS-1$
-			Boolean b = (Boolean) m.invoke(vm, null);
-			supports = b.booleanValue();
-		} catch (Exception e) {
-			//assume the method is not there / problematic
-			supports = true;
-		}
-		return supports;
-	}
-	
-	/**
-	 * Returns if this breakpoint supports global suspend
-	 * 
-	 * @return <code>true</code> if we should suspend on all script loads <code>false</code> otherwise
-	 */
-	private boolean isGlobalLoadSuspend() {
-		try {
-			return ensureMarker().getAttribute(GLOBAL_SUSPEND, false);
-		}
-		catch(CoreException ce) {
-			JavaScriptDebugPlugin.log(ce);
-		}
-		return false;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptBreakpoint#registerRequest(org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget, org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest)
-	 */
-	protected void registerRequest(JavaScriptDebugTarget target, EventRequest request) {
-		ArrayList requests = getRequests(target);
-		if (requests == null || requests.isEmpty()) {
-			// only add it once per target
-			addRequestForTarget(target, request);
-			try {
-				if (isRegistered()) {
-					incrementInstallCount();
-				}
-			} catch (CoreException ce) {
-				JavaScriptDebugPlugin.log(ce);
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptBreakpoint#deregisterRequest(org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget, org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest)
-	 */
-	protected void deregisterRequest(JavaScriptDebugTarget target, EventRequest request) {
-		target.removeJSDIEventListener(this, request);
-		try {
-			decrementInstallCount();
-		} catch (CoreException ce) {
-			JavaScriptDebugPlugin.log(ce);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptBreakpoint#eventSetComplete(org.eclipse.wst.jsdt.debug.core.jsdi.event.Event, org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget, boolean, org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet)
-	 */
-	public void eventSetComplete(Event event, JavaScriptDebugTarget target, boolean suspend, EventSet eventSet) {
-		if (event instanceof ScriptLoadEvent) {
-			JavaScriptThread thread = target.findThread(((ScriptLoadEvent) event).thread());
-			if (thread != null) {
-				ScriptLoadEvent sevent = (ScriptLoadEvent) event;
-				thread.suspendForScriptLoadComplete(this, sevent.script(), suspend, eventSet);
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptLineBreakpoint#createRequest(org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget, org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference)
-	 */
-	protected boolean createRequest(JavaScriptDebugTarget target, ScriptReference script) throws CoreException {
-		ScriptLoadRequest request = target.getEventRequestManager().createScriptLoadRequest();
-		registerRequest(target, request);
-		request.setEnabled(isEnabled());
-		return false;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/ConnectorsManager.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/ConnectorsManager.java
deleted file mode 100644
index 3a3325a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/ConnectorsManager.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core.launching;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IRegistryEventListener;
-import org.eclipse.core.runtime.InvalidRegistryObjectException;
-import org.eclipse.core.runtime.RegistryFactory;
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector;
-import org.eclipse.wst.jsdt.debug.internal.core.Constants;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-
-/**
- * Manages all of the contributed {@link Connector}s for JSDI
- * 
- * @since 1.0
- */
-public class ConnectorsManager implements IRegistryEventListener {
-
-	private static final String ID = "id"; //$NON-NLS-1$
-	private HashMap connectors;
-
-	/**
-	 * Constructor
-	 */
-	public ConnectorsManager() {
-		RegistryFactory.getRegistry().addListener(this, Constants.LAUNCHING_CONNECTORS);
-	}
-
-	/**
-	 * Returns the live collection of {@link Connector}s the manager currently knows about sorted by name
-	 * 
-	 * @return the collection of {@link Connector}s in the manager
-	 */
-	public synchronized List /*<Connector>*/ getConnectors() {
-		initializeConnectors();
-		ArrayList list = new ArrayList(connectors.values());
-		Collections.sort(list, new Comparator() {
-			public int compare(Object arg0, Object arg1) {
-				if (arg0 instanceof Connector && arg1 instanceof Connector) {
-					return ((Connector) arg0).name().compareTo(((Connector) arg1).name());
-				}
-				return -1;
-			}
-		});
-		return Collections.unmodifiableList(list);
-	}
-
-	/**
-	 * Returns the {@link Connector} with the given id or <code>null</code>
-	 * 
-	 * @param connectorid
-	 * @return the connector with the given id or <code>null</code>
-	 */
-	public synchronized Connector getConnector(String connectorid) {
-		initializeConnectors();
-		return (Connector) connectors.get(connectorid);
-	}
-
-	/**
-	 * Initializes the connector collection
-	 */
-	private synchronized void initializeConnectors() {
-		if (connectors == null) {
-			connectors = new HashMap();
-			IExtensionPoint point = RegistryFactory.getRegistry().getExtensionPoint(JavaScriptDebugPlugin.PLUGIN_ID, Constants.LAUNCHING_CONNECTORS);
-			if(point != null) {
-				IExtension[] extensions = point.getExtensions();
-				for (int i = 0; i < extensions.length; i++) {
-					IExtension extension = extensions[i];
-					try {
-						IConfigurationElement[] elements = extension.getConfigurationElements();
-						for (int j = 0; j < elements.length; j++) {
-							IConfigurationElement element = elements[j];
-							if (!Constants.CONNECTOR.equalsIgnoreCase(element.getName())) {
-								// log it
-								continue;
-							}
-							connectors.put(element.getAttribute(ID), element.createExecutableExtension(Constants.CLASS));
-						}
-					} catch (InvalidRegistryObjectException e) {
-						JavaScriptDebugPlugin.log(e);
-					} catch (CoreException e) {
-						JavaScriptDebugPlugin.log(e);
-					}
-				}
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IRegistryEventListener#added(org.eclipse.core.runtime.IExtension[])
-	 */
-	public void added(IExtension[] extensions) {
-		connectors = null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IRegistryEventListener#added(org.eclipse.core.runtime.IExtensionPoint[])
-	 */
-	public void added(IExtensionPoint[] extensionPoints) {
-		connectors = null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IRegistryEventListener#removed(org.eclipse.core.runtime.IExtension[])
-	 */
-	public void removed(IExtension[] extensions) {
-		connectors = null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IRegistryEventListener#removed(org.eclipse.core.runtime.IExtensionPoint[])
-	 */
-	public void removed(IExtensionPoint[] extensionPoints) {
-		connectors = null;
-	}
-	
-	/**
-	 * Dispose the manager and cleans up resources
-	 */
-	public void dispose() {
-		if(this.connectors != null) {
-			this.connectors.clear();
-			this.connectors = null;
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/ILaunchConstants.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/ILaunchConstants.java
deleted file mode 100644
index ee19ade..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/ILaunchConstants.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core.launching;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector;
-
-/**
- * Constants used for launching
- * 
- * @since 1.0
- */
-public interface ILaunchConstants {
-
-	/**
-	 * Constant for the host name attribute
-	 */
-	public static final String HOST = "host"; //$NON-NLS-1$
-
-	/**
-	 * Constant for the port attribute
-	 */
-	public static final String PORT = "port"; //$NON-NLS-1$
-
-	/**
-	 * Constant for the argument map for a connector attribute
-	 */
-	public static final String ARGUMENT_MAP = "argument_map"; //$NON-NLS-1$
-
-	/**
-	 * Constant for the id of the {@link Connector} used in a connector-based launch
-	 */
-	public static final String CONNECTOR_ID = "connector_id"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/JavaScriptProcess.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/JavaScriptProcess.java
deleted file mode 100644
index f5db73b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/JavaScriptProcess.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core.launching;
-
-import java.util.HashMap;
-
-import org.eclipse.core.runtime.PlatformObject;
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.core.model.IStreamsProxy;
-
-/**
- * General {@link IProcess} for JavaScript
- * 
- * @since 1.1
- */
-public class JavaScriptProcess extends PlatformObject implements IProcess {
-
-	private HashMap attributes = new HashMap();
-	private ILaunch launch = null;
-	private boolean terminated = false;
-	private String name = null;
-	
-	/**
-	 * Constructor
-	 * @param config
-	 * @param name
-	 */
-	public JavaScriptProcess(ILaunch launch, String name) {
-		this.launch = launch;
-		this.name = name;
-		fireEvent(new DebugEvent(this, DebugEvent.CREATE));
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		if(adapter == IProcess.class) {
-			return this;
-		}
-		if(adapter == ILaunch.class) {
-			return launch;
-		}
-		if (adapter.equals(IDebugTarget.class)) {
-			IDebugTarget[] targets = launch.getDebugTargets();
-			for (int i = 0; i < targets.length; i++) {
-				if (this.equals(targets[i].getProcess())) {
-					return targets[i];
-				}
-			}
-			return null;
-		}
-		return super.getAdapter(adapter);
-	}
-
-	/**
-	 * Fires the given debug event.
-	 * 
-	 * @param event debug event to fire
-	 */
-	void fireEvent(DebugEvent event) {
-		DebugPlugin dp = DebugPlugin.getDefault();
-		if (dp != null) {
-			dp.fireDebugEventSet(new DebugEvent[]{event});
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.ITerminate#canTerminate()
-	 */
-	public boolean canTerminate() {
-		synchronized (this) {
-			return !terminated;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.ITerminate#isTerminated()
-	 */
-	public boolean isTerminated() {
-		synchronized (this) {
-			return terminated;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.ITerminate#terminate()
-	 */
-	public void terminate() throws DebugException {
-		synchronized (this) {
-			if(!terminated) {
-				fireEvent(new DebugEvent(this, DebugEvent.TERMINATE));
-				terminated = true;
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IProcess#getLabel()
-	 */
-	public String getLabel() {
-		return name;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IProcess#getLaunch()
-	 */
-	public ILaunch getLaunch() {
-		return launch;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IProcess#getStreamsProxy()
-	 */
-	public IStreamsProxy getStreamsProxy() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IProcess#setAttribute(java.lang.String, java.lang.String)
-	 */
-	public void setAttribute(String key, String value) {
-		if(key != null) {
-			attributes.put(key, value);
-			fireEvent(new DebugEvent(this, DebugEvent.CHANGE));
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IProcess#getAttribute(java.lang.String)
-	 */
-	public String getAttribute(String key) {
-		return (String) attributes.get(key);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IProcess#getExitValue()
-	 */
-	public int getExitValue() throws DebugException {
-		return 0;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/JavaScriptSourceDirector.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/JavaScriptSourceDirector.java
deleted file mode 100644
index 6b72bdd..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/JavaScriptSourceDirector.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core.launching;
-
-import org.eclipse.debug.core.sourcelookup.AbstractSourceLookupDirector;
-import org.eclipse.debug.core.sourcelookup.ISourceLookupParticipant;
-
-/**
- * Default source director for JavaScript debugging.
- * 
- * @since 1.0
- */
-public class JavaScriptSourceDirector extends AbstractSourceLookupDirector {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceLookupDirector#initializeParticipants()
-	 */
-	public void initializeParticipants() {
-		addParticipants(new ISourceLookupParticipant[] { new JavaScriptSourceLookupParticipant() });
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.AbstractSourceLookupDirector#isFindDuplicates()
-	 */
-	public boolean isFindDuplicates() {
-		return true;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/JavaScriptSourceLookupParticipant.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/JavaScriptSourceLookupParticipant.java
deleted file mode 100644
index 9a73b4d..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/JavaScriptSourceLookupParticipant.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core.launching;
-
-import java.net.URI;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.debug.core.sourcelookup.AbstractSourceLookupParticipant;
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptStackFrame;
-import org.eclipse.wst.jsdt.debug.core.model.IScript;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget;
-import org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptStackFrame;
-import org.eclipse.wst.jsdt.debug.internal.core.model.Script;
-
-/**
- * Default source lookup participant
- * 
- * @since 1.0
- */
-public class JavaScriptSourceLookupParticipant extends AbstractSourceLookupParticipant {
-
-	static final Object[] NO_SOURCE = new Object[0];
-
-	private HashMap sourcemap = new HashMap();
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceLookupParticipant#getSourceName(java.lang.Object)
-	 */
-	public String getSourceName(Object object) throws CoreException {
-		return SourceLookup.getSourceName(object);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.sourcelookup.AbstractSourceLookupParticipant#findSourceElements(java.lang.Object)
-	 */
-	public Object[] findSourceElements(Object object) throws CoreException {
-		IFile file = resolveFile(object);
-		if(file != null && file.exists()) {
-			return new IFile[] {file};
-		}
-		ISourceContainer[] containers = getSourceContainers();
-		if(containers != null && containers.length > 0) {
-			String name = getSourceName(object);
-			if(name != null) {
-				Object[] sources = null;
-				for (int i = 0; i < containers.length; i++) {
-					sources = containers[i].findSourceElements(name);
-					if(sources != null && sources.length > 0) {
-						return sources;
-					}
-				}
-			}
-			//did not find anything in the source look up path, create the source
-			//in the external source project and show it
-			URI sourceURI = SourceLookup.getSourceURI(object);
-			if (sourceURI != null) {
-				file = (IFile) sourcemap.get(sourceURI);
-				if(file != null && file.exists()) {
-					return new IFile[] { file };
-				}
-				return showExternalSource(sourceURI, object);
-			}
-		}
-		return NO_SOURCE;
-	}
-
-	/**
-	 * Tries to resolve the workspace local {@link IFile}(s) that match the underlying {@link ScriptReference}
-	 * for either an {@link IJavaScriptStackFrame} or an {@link IScript}
-	 * 
-	 * @param object the object to try and resolve the {@link IFile} from
-	 * @return the corresponding {@link IFile} for the object or <code>null</code> if one could not be determined
-	 * @since 1.4
-	 */
-	IFile resolveFile(Object object) {
-		String uri = null;
-		JavaScriptDebugTarget target = null;
-		if(object instanceof JavaScriptStackFrame) {
-			JavaScriptStackFrame frame = (JavaScriptStackFrame) object;
-			uri = frame.getSourcePath();
-			target = (JavaScriptDebugTarget) frame.getDebugTarget();
-		}
-		if(object instanceof Script) {
-			Script script = (Script) object;
-			uri = script.sourceURI().toString();
-			target = (JavaScriptDebugTarget) script.getDebugTarget();
-		}
-		if(uri != null && target != null) {
-			List scripts = target.getVM().allScripts();
-			for (Iterator i = scripts.iterator(); i.hasNext();) {
-				ScriptReference ref = (ScriptReference) i.next();
-				if(uri.equals(ref.sourceURI().toString())) {
-					return JavaScriptDebugPlugin.getResolutionManager().getFile(ref);
-				}
-			}
-		}
-		return null;
-	}
-	
-	
-	
-	/**
-	 * Shows the source in an external editor
-	 * 
-	 * @param sourceuri
-	 * @param sourceobj
-	 * 
-	 * @return the collection of files to show in external editors
-	 */
-	private Object[] showExternalSource(URI sourceuri, Object sourceobj) {
-		try {
-			IFile file = SourceLookup.getExternalSource(sourceuri, sourceobj);
-			if(file != null) {
-				IPath path = file.getProjectRelativePath();
-				if (JavaScriptDebugPlugin.getExternalScriptPath(path) == null) {
-					JavaScriptDebugPlugin.addExternalScriptPath(path, sourceuri.toString());
-				}
-				sourcemap.put(sourceuri, file);
-				return new Object[] {file};
-			}
-
-		} catch (CoreException ce) {
-			JavaScriptDebugPlugin.log(ce);
-			return NO_SOURCE;
-		}
-		return NO_SOURCE;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.sourcelookup.AbstractSourceLookupParticipant#isFindDuplicates()
-	 */
-	public boolean isFindDuplicates() {
-		return true;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/JavaScriptSourcePathComputerDelegate.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/JavaScriptSourcePathComputerDelegate.java
deleted file mode 100644
index 81936a6..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/JavaScriptSourcePathComputerDelegate.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core.launching;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.ISourcePathComputerDelegate;
-import org.eclipse.debug.core.sourcelookup.containers.ProjectSourceContainer;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-
-/**
- * The default source path computer delegate for JavaScript
- * 
- * @since 1.1
- */
-public class JavaScriptSourcePathComputerDelegate implements ISourcePathComputerDelegate {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourcePathComputerDelegate#computeSourceContainers(org.eclipse.debug.core.ILaunchConfiguration, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public ISourceContainer[] computeSourceContainers(ILaunchConfiguration configuration, IProgressMonitor monitor)	throws CoreException {
-		IProject project = JavaScriptDebugPlugin.getExternalSourceProject(true);
-		ISourceContainer[] cons = new ISourceContainer[] {new ProjectSourceContainer(project, true)};
-		return cons;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/Messages.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/Messages.java
deleted file mode 100644
index fc83781..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/Messages.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core.launching;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * 
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.internal.core.launching.messages"; //$NON-NLS-1$
-	public static String acquiring_connector;
-	public static String argument_map_null;
-	public static String attaching_to_vm;
-	public static String connect_thread;
-	public static String could_not_locate_connector;
-	public static String creating_debug_target;
-	public static String javascript_process_name;
-	public static String launching_js_debug_delegate;
-	public static String waiting_for_vm_to_connect;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/RemoteJavaScriptLaunchDelegate.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/RemoteJavaScriptLaunchDelegate.java
deleted file mode 100644
index 3ce99c9..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/RemoteJavaScriptLaunchDelegate.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core.launching;
-
-import java.text.DateFormat;
-import java.util.Date;
-import java.util.Map;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubMonitor;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.core.model.LaunchConfigurationDelegate;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.AttachingConnector;
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector;
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.ListeningConnector;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget;
-
-/**
- * Default launch delegate for a remote debug connection
- * 
- * @since 1.0
- */
-public class RemoteJavaScriptLaunchDelegate extends LaunchConfigurationDelegate {
-
-	/**
-	 * Polls for connecting to the Rhino interpreter
-	 */
-	class ConnectRunnable implements Runnable {
-
-		VirtualMachine vm = null;
-		Exception exception = null;
-		private Connector connector = null;
-		private Map args = null;
-		
-		ConnectRunnable(Connector connector, Map args) {
-			this.connector = connector;
-			this.args = args;
-		}
-		/* (non-Javadoc)
-		 * @see java.lang.Runnable#run()
-		 */
-		public void run() {
-			try {
-				long start = System.currentTimeMillis();
-				Exception inner = null;
-				do {
-					try {
-						if(connector instanceof AttachingConnector) {
-							vm = ((AttachingConnector)connector).attach(args);
-						}
-						else if(connector instanceof ListeningConnector) {
-							vm = ((ListeningConnector)connector).accept(args);
-						}
-					} 
-					catch(Exception e) {
-						inner = e;
-					}
-				} while(vm == null && System.currentTimeMillis() < start + 5000);
-				if(vm == null) {
-					throw inner;
-				}
-			}
-			catch(Exception e) {
-				exception = e;
-			}
-		}
-	}
-	
-	final static String LAUNCH_URI = "launch_uri"; //$NON-NLS-1$
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ILaunchConfigurationDelegate#launch(org. eclipse.debug.core.ILaunchConfiguration, java.lang.String, org.eclipse.debug.core.ILaunch, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void launch(ILaunchConfiguration configuration, String mode, final ILaunch launch, IProgressMonitor monitor) throws CoreException {
-		SubMonitor localmonitor = SubMonitor.convert(monitor, Messages.launching_js_debug_delegate, 16);
-		try {
-			String name = configuration.getAttribute(ILaunchConstants.CONNECTOR_ID, (String) null);
-			Map argmap = configuration.getAttribute(ILaunchConstants.ARGUMENT_MAP, (Map) null);
-			if (argmap == null) {
-				Status status = new Status(
-						IStatus.ERROR, 
-						JavaScriptDebugPlugin.PLUGIN_ID, 
-						Messages.argument_map_null);
-				throw new CoreException(status);
-			}
-			if(localmonitor.isCanceled()) {
-				return;
-			}
-			localmonitor.worked(4);
-			localmonitor.subTask(Messages.acquiring_connector);
-			Connector connector = JavaScriptDebugPlugin.getConnectionsManager().getConnector(name);
-			
-			VirtualMachine vm = null;
-			if(localmonitor.isCanceled()) {
-				return;
-			}
-			if(connector instanceof AttachingConnector) {
-				localmonitor.subTask(Messages.attaching_to_vm);
-			}
-			else if(connector instanceof ListeningConnector) {
-				localmonitor.subTask(Messages.waiting_for_vm_to_connect);
-			}
-			else {
-				Status status = new Status(
-						IStatus.ERROR, 
-						JavaScriptDebugPlugin.PLUGIN_ID, 
-						NLS.bind(Messages.could_not_locate_connector, new String[] {name}));
-				throw new CoreException(status);
-			}
-			localmonitor.worked(4);
-			ConnectRunnable runnable = new ConnectRunnable(connector, argmap);
-			Thread thread = new Thread(runnable, Messages.connect_thread);
-			thread.setDaemon(true);
-			thread.start();
-			while(thread.isAlive()) {
-				if(localmonitor.isCanceled()) {
-					if(vm != null) {
-						vm.terminate();
-					}
-					thread.interrupt();
-					return;
-				}
-				try {
-					Thread.sleep(100);
-				}
-				catch (Exception e) {
-				}
-			}
-			if(runnable.exception != null) {
-				Status status = new Status(IStatus.ERROR, JavaScriptDebugPlugin.PLUGIN_ID, "Error occured while launching", runnable.exception); //$NON-NLS-1$
-				throw new CoreException(status);
-			}
-			if(localmonitor.isCanceled()) {
-				return;
-			}
-			if(runnable.vm == null) {
-				Status status = new Status(IStatus.ERROR, JavaScriptDebugPlugin.PLUGIN_ID, "Failed to connect to Firefox", runnable.exception); //$NON-NLS-1$
-				throw new CoreException(status);
-			}
-			vm = runnable.vm;
-			localmonitor.worked(4);
-			localmonitor.subTask(Messages.creating_debug_target);
-			JavaScriptProcess process = new JavaScriptProcess(launch, computeProcessName(connector));
-			launch.addProcess(process);
-			JavaScriptDebugTarget target = new JavaScriptDebugTarget(vm, process, launch, true, true);
-			if(localmonitor.isCanceled()) {
-				return;
-			}
-			localmonitor.worked(4);
-			launch.addDebugTarget(target);
-		} finally {
-			localmonitor.done();
-		}
-	}
-	
-	String computeCommandline(Connector connector) {
-		StringBuffer buffer = new StringBuffer();
-		Map args = connector.defaultArguments();
-		if(args != null) {
-			String arg = (String) args.get("host"); //$NON-NLS-1$
-			if(arg != null) {
-				buffer.append(arg);
-			}
-			arg = (String) args.get("port"); //$NON-NLS-1$
-			if(arg != null) {
-				buffer.append(":").append(arg); //$NON-NLS-1$
-			}
-		}
-		return buffer.toString();
-	}
-	
-	/**
-	 * Computes the display name for the {@link IProcess} given the connector
-	 * @param connector
-	 * @return the name for the process
-	 */
-	String computeProcessName(Connector connector) {
-		StringBuffer buffer = new StringBuffer(connector.name());
-		String timestamp = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM).format(new Date(System.currentTimeMillis()));
-		return NLS.bind(Messages.javascript_process_name, new String[] {buffer.toString(), timestamp});
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/SourceLookup.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/SourceLookup.java
deleted file mode 100644
index 29a09da..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/SourceLookup.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core.launching;
-
-import java.io.ByteArrayInputStream;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.QualifiedName;
-import org.eclipse.core.runtime.URIUtil;
-import org.eclipse.wst.jsdt.core.JavaScriptCore;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptStackFrame;
-import org.eclipse.wst.jsdt.debug.core.model.IScript;
-import org.eclipse.wst.jsdt.debug.internal.core.Constants;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-
-/**
- * Utility class to help with looking up source
- * 
- * @since 1.1
- */
-public final class SourceLookup {
-
-	public static final QualifiedName SCRIPT_URL = new QualifiedName(JavaScriptCore.PLUGIN_ID, "scriptURL"); //$NON-NLS-1$
-	public static final IPath TOP_LEVEL_PATH = new Path("/"); //$NON-NLS-1$
-	/**
-	 * Returns the name of the source object to lookup or <code>null</code>
-	 * if the object is not a {@link IJavaScriptStackFrame} or an {@link IScript}
-	 * 
-	 * @param object the object to look up source for
-	 * @return the name of the source element to look up or <code>null</code>
-	 * @since 1.1
-	 */
-	public static String getSourceName(Object object) {
-		String name = null;
-		if (object instanceof IJavaScriptStackFrame) {
-			name = ((IJavaScriptStackFrame) object).getSourceName();
-		}
-		if(object instanceof IScript) {
-			name = URIUtil.lastSegment(((IScript)object).sourceURI());
-		}
-		if(name != null) {
-			if(new Path(name).getFileExtension() == null) {
-				//append .js, there is no case where we would look up a file with no extension from a script node
-				StringBuffer buf = new StringBuffer(name.length()+3);
-				buf.append(name).append('.').append(Constants.JS_EXTENSION);
-				return buf.toString();
-			}
-			return name;
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns the raw element source to use to display an external editor. This method 
-	 * will make a request from the backing {@link VirtualMachine}.
-	 * 
-	 * @param sourceobj the object to get the raw source from
-	 * @return the raw source or <code>null</code>
-	 */
-	public static String getSource(Object sourceobj) {
-		if(sourceobj instanceof IJavaScriptStackFrame) {
-			IJavaScriptStackFrame jframe = (IJavaScriptStackFrame) sourceobj;
-			return jframe.getSource();
-		}
-		if(sourceobj instanceof IScript) {
-			IScript script = (IScript) sourceobj;
-			return script.source();
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the {@link URI} to use to look up source
-	 * 
-	 * @param sourceobj the object to get the source {@link URI} for
-	 * @return the {@link URI} or <code>null</code>
-	 */
-	public static URI getSourceURI(Object sourceobj) {
-		if(sourceobj instanceof IJavaScriptStackFrame) {
-			IJavaScriptStackFrame jframe = (IJavaScriptStackFrame) sourceobj;
-			try {
-				try {
-					return new URI(jframe.getSourcePath());
-				}
-				catch (URISyntaxException use) {
-					return URIUtil.fromString(jframe.getSourcePath());
-				}
-			} catch (URISyntaxException e) {
-				JavaScriptDebugPlugin.log(e);
-			}
-		}
-		if(sourceobj instanceof IScript) {
-			IScript script = (IScript) sourceobj;
-			return script.sourceURI();
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the external source from the given {@link URI}. This method queries the <code>External JavaScript Source</code>
-	 * project and create it and the source {@link IFile} if necessary.
-	 * 
-	 * @param sourceuri the {@link URI} to get the source for
-	 * @param sourceobj the backing object we want to get the source for
-	 * @throws CoreException 
-	 */
-	public static IFile getExternalSource(URI sourceuri, Object sourceobj) throws CoreException {
-		String source = getSource(sourceobj);
-		if(source != null) {
-			IProject project = JavaScriptDebugPlugin.getExternalSourceProject(true);
-			IPath path = getSourcePath(sourceuri);
-			IFile file = project.getFile(path);
-			if(!file.isAccessible()) {
-				IContainer folder = project;
-				for (int i = 0; i < path.segmentCount()-1; i++) {
-					IFolder f = folder.getFolder(new Path(path.segment(i)));
-					if(!f.exists()) {
-						f.create(true, true, null);
-					}
-					folder = f;
-				}
-				file = doFormat(file, source);
-			}
-			else {
-				file = doFormat(file, source);
-			}
-			file.setPersistentProperty(SCRIPT_URL, sourceuri.toString());
-			return file;
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns the source path from the given source {@link URI}. 
-	 * <br>
-	 * This path may be altered as follows:
-	 * <ul>
-	 * <li>if the URI path is only a root ('/') than the returned path is changed to 'page.js'</li>
-	 * <li>if the source URI has a host specification, it is added to the beginning of the source path</li>
-	 * <li>if the total character count of any one segment of the path exceeds 15 chars, the path is pruned to avoid 
-	 * going over the windows 255 char path limit</li>
-	 * </ul>
-	 * @param sourceuri
-	 * @return the {@link IPath} to use to represent the given source {@link URI}
-	 */
-	public static IPath getSourcePath(URI sourceuri) {
-		String uripath = sourceuri.getPath();
-		if(uripath == null) {
-			return null;
-		}
-		if(uripath.trim().equals("/")) { //$NON-NLS-1$
-			uripath = "index.htm"; //$NON-NLS-1$
-		}
-		String host = sourceuri.getHost();
-		IPath path = null;
-		if(host != null) {
-			path = new Path(host);	
-		}
-		if(path == null) {
-			path = new Path(uripath);
-		}
-		else {
-			path = path.append(uripath);
-		}
-		return adjustPath(path);
-	}
-	
-	/**
-	 * Formats the given source into the given file handle
-	 * @param handle
-	 * @param source
-	 * @return the file handle
-	 * @throws CoreException
-	 */
-	static IFile doFormat(IFile handle, String source) throws CoreException {
-		/*CodeFormatter formatter = ToolFactory.createCodeFormatter(null);
-		TextEdit edit = formatter.format(CodeFormatter.K_JAVASCRIPT_UNIT, source, 0, source.length(), 0, null);
-		String localsrc = source;
-		if(edit != null) {
-			Document doc = new Document(source);
-			try {
-				edit.apply(doc);
-				localsrc = doc.get();
-			} catch (Exception e) {
-				JavaScriptDebugPlugin.log(e);
-			} 
-		}*/
-		if(handle.isAccessible()) {
-			handle.setContents(new ByteArrayInputStream(source.getBytes()), IResource.FORCE, null);
-		}
-		else {
-			handle.create(new ByteArrayInputStream(source.getBytes()), true, null);
-		}
-		return handle;
-	}
-	
-	/**
-	 * Makes some sanity adjustments to the path prior to trying to create it.
-	 * <ul>
-	 * <li>make sure no one segment is super long, the current threshold is 15 characters per segment</li>
-	 * <li>make sure no segment following the host part has '.js' in it. This prevents name collisions like:
-	 * www.domain.org/scripts/myscript.js/eval/1.js and www.domain.org/scripts/myscript.js - where myscript.js will cause a 
-	 * collision trying to create a file resource, as it could already exist as a folder and vice versa 
-	 * </li>
-	 * <li>if the script has no extension add .js to make sure Eclipse opens the correct editor for the content type</li>
-	 * <ul>
-	 * @param path
-	 * @return the adjusted path
-	 * @since 1.1
-	 */
-	static IPath adjustPath(IPath path) {
-		String segment = null;
-		ArrayList segments = new ArrayList(path.segmentCount());
-		for (int i = 0; i < path.segments().length; i++) {
-			segment = path.segment(i);
-			if(i > 0) {
-				if(segment.length() > 15) {
-					segment = segment.substring(0, 1) + segment.charAt(segment.length()-1);
-				}
-				if(i < path.segments().length-1) {
-					segment = segment.replaceAll("\\.js", "\\_js"); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-			}
-			segments.add(segment);
-		}
-		IPath newpath = new Path((String) segments.get(0));
-		for (int i = 1; i < segments.size(); i++) {
-			newpath = newpath.append((String) segments.get(i));
-		}
-		String ext = newpath.getFileExtension(); 
-		if(ext == null && !Constants.JS_EXTENSION.equals(ext)) {
-			newpath = newpath.addFileExtension(Constants.JS_EXTENSION);
-		}
-		return newpath; 
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/messages.properties b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/messages.properties
deleted file mode 100644
index 77b29c6..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/messages.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-###############################################################################
-# Copyright (c) 2010 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-acquiring_connector=Acquiring launch connector...
-argument_map_null=Error occured while launching: connecting argument map was null
-attaching_to_vm=Attaching to virtual machine...
-connect_thread=Connect Thread
-could_not_locate_connector=Error occured while launching: could not locate connector: {0}
-creating_debug_target=Creating debug target...
-javascript_process_name={0} ({1})
-launching_js_debug_delegate=Launching JavaScript debugger
-waiting_for_vm_to_connect=Waiting for virtual machine to connect...
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/messages.properties b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/messages.properties
deleted file mode 100644
index 6d946b0..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/messages.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-###############################################################################
-# Copyright (c) 2010 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-external_javascript_source=External JavaScript Source
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/BreakpointParticipantManager.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/BreakpointParticipantManager.java
deleted file mode 100644
index fec73ed..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/BreakpointParticipantManager.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core.model;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpointParticipant;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptFunctionBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLoadBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread;
-import org.eclipse.wst.jsdt.debug.internal.core.Constants;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-
-/**
- * Manager for all {@link IJavaScriptBreakpointParticipant}s
- * 
- * @since 1.0
- */
-public class BreakpointParticipantManager {
-
-	/**
-	 * proxy to a "real" {@link IJavaScriptBreakpointParticipant} to allow lazy loading
-	 * of classes from extension points
-	 */
-	class Participant implements IJavaScriptBreakpointParticipant {
-		
-		private IConfigurationElement element = null;
-		private IJavaScriptBreakpointParticipant delegate = null;
-		
-		/**
-		 * Constructor
-		 * @param element
-		 */
-		public Participant(IConfigurationElement element) {
-			this.element = element;
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpointParticipant#breakpointHit(org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread, org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint)
-		 */
-		public int breakpointHit(IJavaScriptThread thread, IJavaScriptBreakpoint breakpoint) {
-			IJavaScriptBreakpointParticipant part = getDelegate();
-			if(part != null) {
-				return part.breakpointHit(thread, breakpoint);
-			}
-			return DONT_CARE;
-		}
-		
-		/**
-		 * @return the delegate
-		 */
-		synchronized IJavaScriptBreakpointParticipant getDelegate() {
-			if(delegate == null) {
-				try {
-					delegate = (IJavaScriptBreakpointParticipant) element.createExecutableExtension(Constants.CLASS);
-				} catch (CoreException e) {
-					JavaScriptDebugPlugin.log(e);
-				}
-			}
-			return delegate;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpointParticipant#scriptLoaded(org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread, org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference, org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint)
-		 */
-		public int scriptLoaded(IJavaScriptThread thread, ScriptReference script, IJavaScriptBreakpoint breakpoint) {
-			IJavaScriptBreakpointParticipant part = getDelegate();
-			if(part != null) {
-				return part.scriptLoaded(thread, script, breakpoint);
-			}
-			return DONT_CARE;
-		}
-	}
-	
-	static final IJavaScriptBreakpointParticipant[] NO_PARTICIPANTS = new IJavaScriptBreakpointParticipant[0];
-	
-	public static final String ALL = "*"; //$NON-NLS-1$
-	public static final String FUNCTION = "function"; //$NON-NLS-1$
-	public static final String LINE = "line"; //$NON-NLS-1$
-	public static final String SCRIPT = "script"; //$NON-NLS-1$
-	
-	private Map participants = null;
-	
-	
-	IJavaScriptBreakpointParticipant[] getParticipants(String kind) {
-		initialize();
-		ArrayList parts = (ArrayList) this.participants.get(kind);
-		if(parts != null){
-			return (IJavaScriptBreakpointParticipant[]) parts.toArray(new IJavaScriptBreakpointParticipant[parts.size()]);
-		}
-		return NO_PARTICIPANTS;
-	}
-	
-	/**
-	 * Returns the complete collection of {@link IJavaScriptBreakpointParticipant}s for the given
-	 * breakpoint.<br>
-	 * <br>
-	 * This method does not return <code>null</code>, an empty array is returned if no {@link IJavaScriptBreakpointParticipant}s
-	 * have been defined for the given breakpoint.
-	 * 
-	 * @param kind the kind
-	 * @return the complete list of {@link IJavaScriptBreakpointParticipant}s or an empty array, never <code>null</code>
-	 */
-	public IJavaScriptBreakpointParticipant[] getParticipants(IJavaScriptBreakpoint breakpoint) {
-		initialize();
-		ArrayList parts = new ArrayList();
-		ArrayList existing = (ArrayList)this.participants.get(ALL);
-		if(existing != null) {
-			parts.addAll(existing);
-		}
-		if(breakpoint instanceof IJavaScriptFunctionBreakpoint) {
-			existing = (ArrayList)this.participants.get(FUNCTION);
-			if(existing != null) {
-				parts.addAll(existing);
-			}
-		}
-		else if(breakpoint instanceof IJavaScriptLoadBreakpoint) {
-			existing = (ArrayList)this.participants.get(SCRIPT);
-			if(existing != null) {
-				parts.addAll(existing);
-			}
-		}
-		else if(breakpoint instanceof IJavaScriptLineBreakpoint) {
-			existing = (ArrayList)this.participants.get(LINE);
-			if(existing != null) {
-				parts.addAll(existing);
-			}
-		}
-		if(parts.size() < 1) {
-			return NO_PARTICIPANTS;
-		}
-		return (IJavaScriptBreakpointParticipant[]) parts.toArray(new IJavaScriptBreakpointParticipant[parts.size()]);
-	}
-	
-	/**
-	 * Adds the given participant to the manager.
-	 * @param kind the kind, <code>null</code> is not accepted
-	 * @param participant
-	 */
-	public void addParticipant(String kind, IJavaScriptBreakpointParticipant participant) {
-		initialize();
-		Assert.isNotNull(kind);
-		ArrayList parts = (ArrayList) this.participants.get(kind);
-		if(parts == null) {
-			parts = new ArrayList();
-			this.participants.put(kind, parts);
-		}
-		if(!parts.contains(participant)) {
-			parts.add(participant);
-		}
-	}
-	
-	/**
-	 * Load all the extensions
-	 */
-	private synchronized void initialize() {
-		if(this.participants == null) {
-			this.participants = Collections.synchronizedMap(new HashMap());
-			IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(JavaScriptDebugPlugin.PLUGIN_ID, Constants.BREAKPOINT_PARTICIPANTS);
-			IConfigurationElement[] elements = extensionPoint.getConfigurationElements();
-			String kind = null;
-			ArrayList parts = null;
-			for (int i = 0; i < elements.length; i++) {
-				kind = elements[i].getAttribute(Constants.KIND);
-				parts = (ArrayList) this.participants.get(kind);
-				if(parts == null) {
-					parts = new ArrayList();
-					this.participants.put(kind, parts);
-				}
-				parts.add(new Participant(elements[i]));
-			}
-		}
-	}
-	
-	/**
-	 * Disposes and cleans up resources
-	 */
-	public void dispose() {
-		if(this.participants != null) {
-			this.participants.clear();
-			this.participants = null;
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/EventDispatcher.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/EventDispatcher.java
deleted file mode 100644
index 4e70976..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/EventDispatcher.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core.model;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.Event;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-
-/**
- * Event dispatcher that notifies registered model elements
- * 
- * @see IJavaScriptEventListener
- * @since 1.0
- */
-public final class EventDispatcher implements Runnable {
-
-	/**
-	 * Custom debug event kind for when a script is loaded
-	 */
-	public static final int EVENT_SCRIPT_LOADED = 0x0001;
-	
-	private HashMap /*<EventRequest, IJSDIEventListener>*/ listeners = null;
-	private boolean shutdown = false;
-	private JavaScriptDebugTarget target = null;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param target
-	 */
-	public EventDispatcher(JavaScriptDebugTarget target) {
-		this.target = target;
-	}
-
-	/**
-	 * Registers the given listener for the specified request.
-	 * 
-	 * @param listener
-	 * @param request
-	 */
-	public synchronized void addEventListener(IJavaScriptEventListener listener, EventRequest request) {
-		if(this.listeners == null) {
-			this.listeners = new HashMap(4);
-		}
-		this.listeners.put(request, listener);
-	}
-
-	/**
-	 * Removes the given listener for the given request and returns the status of the removal
-	 * as per the contract of {@link Collection#remove(Object)}
-	 * 
-	 * @param listener
-	 * @param request
-	 */
-	public synchronized boolean removeEventListener(IJavaScriptEventListener listener, EventRequest request) {
-		if(this.listeners != null) {
-			return this.listeners.remove(request) != null;
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Runnable#run()
-	 */
-	public void run() {
-		if (shutdown) {
-			return; // no-op
-		}
-		VirtualMachine vm = target.getVM();
-		if (vm != null) {
-			EventQueue queue = vm.eventQueue();
-			EventSet eventset = null;
-			while (!shutdown) {
-				try {
-					eventset = queue.remove();
-					if (eventset != null) {
-						dispatch(eventset);
-					}
-				}
-				catch(RuntimeException rte) {
-					try {
-						this.target.terminate();
-					} catch (DebugException e) {
-						JavaScriptDebugPlugin.log(e);
-					}
-					//JavaScriptDebugPlugin.log(rte);
-				}
-			}
-		}
-	}
-
-	/**
-	 * performs the re-firing of JSDI events up to any model elements listening
-	 * 
-	 * @param eventset
-	 */
-	void dispatch(EventSet eventSet) {
-		Event event = null;
-		boolean resume = true;
-		for (Iterator iter = eventSet.iterator(); iter.hasNext();) {
-			event = (Event) iter.next();
-			if (event == null) {
-				continue;
-			}
-			IJavaScriptEventListener listener = (IJavaScriptEventListener) this.listeners.get(event.request());
-			if(listener != null) {
-				resume &= listener.handleEvent(event, target, false, eventSet);
-			}
-		}
-
-		for (Iterator iter = eventSet.iterator(); iter.hasNext();) {
-			event = (Event) iter.next();
-			if (event == null) {
-				continue;
-			}
-			IJavaScriptEventListener listener = (IJavaScriptEventListener) this.listeners.get(event.request());
-			if(listener != null) {
-				listener.eventSetComplete(event, target, !resume, eventSet);
-			}
-		}
-		if (resume) {
-			eventSet.resume();
-		}
-	}
-
-	/**
-	 * Shut down and clean up the dispatcher
-	 */
-	public void shutdown() {
-		shutdown = true;
-		listeners.clear();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/IJavaScriptEventListener.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/IJavaScriptEventListener.java
deleted file mode 100644
index f11bd57..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/IJavaScriptEventListener.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core.model;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.Event;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet;
-
-/**
- * Describes a listener that is interested in listening / responding to 
- * {@link EventSet}s from the underlying model.
- * 
- * @since 1.0
- */
-public interface IJavaScriptEventListener {
-	/**
-	 * Handles the given event that this listener has registered for and returns whether the thread in which the event occurred should be resumed. All event handlers for the events in an event set are given a chance to vote on whether the thread should be resumed. If all agree, the thread is resumed by the event dispatcher. If any event handler returns <code>false</code> the thread in which the event originated is left in a suspended state.
-	 * <p>
-	 * Event listeners are provided with the current state of the suspend vote. For example, this could allow a conditional breakpoint to not bother running its evaluation since the vote is already to suspend (if it coincides with a step end).
-	 * </p>
-	 * 
-	 * @param event
-	 *            the event to handle
-	 * @param target
-	 *            the debug target in which the event occurred
-	 * @param suspendVote
-	 *            whether the current vote among event listeners is to suspend
-	 * @param eventSet
-	 *            the event set the event is contained in
-	 * @return whether the thread in which the event occurred should be resumed
-	 */
-	public boolean handleEvent(Event event, JavaScriptDebugTarget target, boolean suspendVote, EventSet eventSet);
-
-	/**
-	 * Notification that all event handlers for an event set have handled their associated events and whether the event set will suspend.
-	 * 
-	 * @param event
-	 *            event the listener was registered for/handled
-	 * @param target
-	 *            target in which the event occurred
-	 * @param suspend
-	 *            whether the event will cause the event thread to suspend
-	 * @param eventSet
-	 *            the event set the event is contained in
-	 */
-	public void eventSetComplete(Event event, JavaScriptDebugTarget target, boolean suspend, EventSet eventSet);
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptDebugElement.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptDebugElement.java
deleted file mode 100644
index 8dd7f8d..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptDebugElement.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core.model;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.DebugElement;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IDisconnect;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptDebugTarget;
-import org.eclipse.wst.jsdt.debug.core.model.JavaScriptDebugModel;
-
-/**
- * Default implementation of {@link DebugElement}
- * 
- * @since 1.0
- */
-public class JavaScriptDebugElement extends DebugElement implements IDisconnect {
-
-	/**
-	 * Constructs a new element for the Rhino debug client.
-	 * 
-	 * @param target
-	 */
-	public JavaScriptDebugElement(IJavaScriptDebugTarget target) {
-		super(target);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IDebugElement#getModelIdentifier()
-	 */
-	public String getModelIdentifier() {
-		return JavaScriptDebugModel.MODEL_ID;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.DebugElement#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		if(IDebugTarget.class == adapter) {
-			return getDebugTarget();
-		}
-		if(IJavaScriptDebugTarget.class == adapter) {
-			return getJavaScriptDebugTarget();
-		}
-		if(IDisconnect.class == adapter) {
-			return this;
-		}
-		return super.getAdapter(adapter);
-	}
-	
-	/**
-	 * Returns this element's target.
-	 * 
-	 * @return debug target
-	 */
-	protected JavaScriptDebugTarget getJavaScriptDebugTarget() {
-		return (JavaScriptDebugTarget) getDebugTarget();
-	}
-
-	/**
-	 * @return the {@link VirtualMachine} associated with this debug element
-	 */
-	protected VirtualMachine getVM() {
-		return getJavaScriptDebugTarget().getVM();
-	}
-
-	/**
-	 * @return the {@link EventRequestManager} associated with these model elements
-	 */
-	public EventRequestManager getEventRequestManager() {
-		return getVM().eventRequestManager();
-	}
-
-	/**
-	 * Adds the given listener to this target's event dispatcher's table of listeners for the specified event request. The listener will be notified each time the event occurs.
-	 * 
-	 * @param listener
-	 *            the listener to register
-	 * @param request
-	 *            the event request
-	 */
-	public void addJSDIEventListener(IJavaScriptEventListener listener, EventRequest request) {
-		EventDispatcher dispatcher = ((JavaScriptDebugTarget) getDebugTarget()).getEventDispatcher();
-		if (dispatcher != null) {
-			dispatcher.addEventListener(listener, request);
-		}
-	}
-
-	/**
-	 * Removes the given listener from this target's event dispatcher's table of listeners for the specified event request. The listener will no longer be notified when the event occurs. Listeners are responsible for deleting the event request if desired.
-	 * 
-	 * @param listener
-	 *            the listener to remove
-	 * @param request
-	 *            the event request
-	 */
-	public void removeJSDIEventListener(IJavaScriptEventListener listener, EventRequest request) {
-		EventDispatcher dispatcher = ((JavaScriptDebugTarget) getDebugTarget()).getEventDispatcher();
-		if (dispatcher != null) {
-			dispatcher.removeEventListener(listener, request);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IDisconnect#canDisconnect()
-	 */
-	public boolean canDisconnect() {
-		return getJavaScriptDebugTarget().canDisconnect();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IDisconnect#disconnect()
-	 */
-	public void disconnect() throws DebugException {
-		getJavaScriptDebugTarget().disconnect();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IDisconnect#isDisconnected()
-	 */
-	public boolean isDisconnected() {
-		return getJavaScriptDebugTarget().isDisconnected();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptDebugTarget.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptDebugTarget.java
deleted file mode 100644
index 618fc2d..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptDebugTarget.java
+++ /dev/null
@@ -1,1030 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core.model;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IMarkerDelta;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IBreakpointManager;
-import org.eclipse.debug.core.IDebugEventSetListener;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchListener;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.core.model.IThread;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.DebuggerStatementEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.Event;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ScriptLoadEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ThreadEnterEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ThreadExitEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.VMDeathEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.VMDisconnectEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.DebuggerStatementRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ScriptLoadRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDeathRequest;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptDebugTarget;
-import org.eclipse.wst.jsdt.debug.core.model.IScript;
-import org.eclipse.wst.jsdt.debug.core.model.IScriptGroup;
-import org.eclipse.wst.jsdt.debug.core.model.JavaScriptDebugModel;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptPreferencesManager;
-import org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptBreakpoint;
-
-/**
- * JavaScript debug target
- * 
- * @since 1.0
- */
-public class JavaScriptDebugTarget extends JavaScriptDebugElement implements IJavaScriptDebugTarget, IDebugEventSetListener, ILaunchListener, IJavaScriptEventListener {
-
-	static final String DEFAULT_NAME = ModelMessages.JSDIDebugTarget_jsdi_debug_target;
-	
-	/**
-	 * The cached collection of scripts, sorted by name
-	 */
-	private ArrayList iScriptCache = null;
-	
-	private final IProcess process;
-	private final VirtualMachine vm;
-	private final ILaunch launch;
-	private final boolean supportsTerminate;
-	private final boolean supportsDisconnect;
-	private final EventDispatcher eventDispatcher;
-	private String name;
-	private Object lock = new Object();
-
-	private ArrayList threads = new ArrayList();
-	private ArrayList breakpoints = new ArrayList();
-	
-	private IScriptGroup scriptgroup = null;
-
-	private boolean disconnected = false;
-	private boolean terminating = false;
-	private boolean terminated = false;
-	private boolean suspended = false;
-
-	private ThreadEnterRequest threadEnterRequest;
-	private ThreadExitRequest threadExitRequest;
-	private ScriptLoadRequest scriptLoadrequest;
-	private VMDeathRequest deathRequest;
-
-	private DebuggerStatementRequest debuggerStatementRequest;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param process
-	 * @param launch
-	 * @param supportsTerminate
-	 * @param supportsDisconnect
-	 */
-	public JavaScriptDebugTarget(VirtualMachine vm, IProcess process, ILaunch launch, boolean supportsTerminate, boolean supportsDisconnect) {
-		super(null);
-		this.vm = vm;
-		this.process = process;
-		this.launch = launch;
-		this.supportsTerminate = supportsTerminate;
-		this.supportsDisconnect = supportsDisconnect;
-		this.eventDispatcher = new EventDispatcher(this);
-		this.scriptgroup = new ScriptGroup(this);
-		initialize();
-	}
-
-	/**
-	 * Initialize any threads and breakpoints existing at the time this target
-	 * has been created
-	 */
-	public synchronized void initialize() {
-		// perform initializations
-		initializeThreads();
-		initializeBreakpoints();
-
-		//register listening for script load request
-		scriptLoadrequest = getEventRequestManager().createScriptLoadRequest();
-		scriptLoadrequest.setEnabled(true);
-		addJSDIEventListener(this, scriptLoadrequest);
-		
-		deathRequest = getEventRequestManager().createVMDeathRequest();
-		deathRequest.setEnabled(true);
-		addJSDIEventListener(this, deathRequest);
-		
-		getLaunch().addDebugTarget(this);
-
-		DebugPlugin plugin = DebugPlugin.getDefault();
-		plugin.addDebugEventListener(this);
-		plugin.getLaunchManager().addLaunchListener(this);
-		fireCreationEvent();
-		// begin handling/dispatching events after the creation event is handled
-		// by all listeners
-		plugin.asyncExec(new Runnable() {
-			public void run() {
-				Thread t = new Thread(eventDispatcher, "JavaScriptDebugModel.EventDispatcher"); //$NON-NLS-1$
-				t.setDaemon(true);
-				t.start();
-			}
-		});
-	}
-
-	/**
-	 * Shuts down the target
-	 */
-	public synchronized void shutdown() {
-		try {
-			if (supportsTerminate) {
-				terminate();
-			} else if (supportsDisconnect) {
-				disconnect();
-			}
-		} catch (DebugException e) {
-			JavaScriptDebugPlugin.log(e);
-			//in case we failed
-			cleanup();
-			fireTerminateEvent();
-		}
-	}
-
-	/**
-	 * Cleans up the state of the target
-	 */
-	void cleanup() {
-		DebugPlugin plugin = DebugPlugin.getDefault();
-		plugin.getLaunchManager().removeLaunchListener(this);
-		plugin.removeDebugEventListener(this);
-		getEventDispatcher().shutdown();
-		removeAllThreads();
-		removeAllBreakpoints();
-		removeJSDIEventListener(this, scriptLoadrequest);
-		removeJSDIEventListener(this, deathRequest);
-		this.scriptgroup = null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.DebugElement#getDebugTarget()
-	 */
-	public IDebugTarget getDebugTarget() {
-		return this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.DebugElement#getLaunch()
-	 */
-	public ILaunch getLaunch() {
-		return launch;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IDebugTarget#getName()
-	 */
-	public String getName() throws DebugException {
-		synchronized (lock) {
-			if(name == null) {
-				name = NLS.bind(ModelMessages.debug_target_name, new String[] {vm.name(), vm.version()});
-			}
-		}
-		return name;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IDebugTarget#getProcess()
-	 */
-	public IProcess getProcess() {
-		return process;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ITerminate#canTerminate()
-	 */
-	public boolean canTerminate() {
-		return supportsTerminate && isAvailable();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ITerminate#isTerminated()
-	 */
-	public boolean isTerminated() {
-		return terminated;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IDisconnect#canDisconnect()
-	 */
-	public boolean canDisconnect() {
-		return supportsDisconnect && isAvailable();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IDisconnect#isDisconnected()
-	 */
-	public boolean isDisconnected() {
-		return disconnected;
-	}
-
-	/**
-	 * Returns the collection of underlying {@link ScriptReference}s
-	 * whose name matches the given name
-	 * @param name
-	 * @return the complete list of {@link ScriptReference}s matching the given name
-	 * or an empty collection, never <code>null</code>
-	 */
-	public synchronized List underlyingScripts(String name) {
-		List scripts = getVM().allScripts();
-		if(!scripts.isEmpty()) {
-			List byname = new ArrayList();
-			ScriptReference script = null;
-			for (Iterator iter = scripts.iterator(); iter.hasNext();) {
-				script = (ScriptReference) iter.next();
-				String sname = Script.resolveName(script.sourceURI()); 
-				if (sname.equals(name)) {
-					byname.add(script);
-				}
-			}
-			return byname;
-		}
-		return Collections.EMPTY_LIST;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IJavaScriptDebugTarget#allScriptsByName(java.lang.String)
-	 */
-	public synchronized List allScriptsByName(String name) {
-		List scripts = allScripts();
-		if(scripts.size() > 0) {
-			List byname = new ArrayList();
-			IScript script = null;
-			for (Iterator iter = scripts.iterator(); iter.hasNext();) {
-				script = (IScript) iter.next();
-				if (Script.resolveName(script.sourceURI()).equals(name)) {
-					byname.add(script);
-				}
-			}
-			return byname;
-		}
-		return Collections.EMPTY_LIST;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IJavaScriptDebugTarget#allScripts()
-	 */
-	public synchronized List allScripts() {
-		if(iScriptCache == null) {
-			List all = getVM().allScripts();
-			if(all.size() > 0) { 
-				iScriptCache = new ArrayList(all.size());
-				for (int i = 0; i < all.size(); i++) {
-					iScriptCache.add(new Script(this, (ScriptReference) all.get(i)));
-				}
-				Collections.sort(iScriptCache);
-			}
-		}
-		if(iScriptCache == null) {
-			return Collections.EMPTY_LIST;
-		}
-		return iScriptCache;
-	}
-	
-	/**
-	 * Collects all of the current threads from the {@link VirtualMachine} and
-	 * adds them to the cached list
-	 */
-	private synchronized void initializeThreads() {
-		threadEnterRequest = vm.eventRequestManager().createThreadEnterRequest();
-		threadEnterRequest.setEnabled(true);
-		eventDispatcher.addEventListener(this, threadEnterRequest);
-
-		threadExitRequest = vm.eventRequestManager().createThreadExitRequest();
-		threadExitRequest.setEnabled(true);
-		eventDispatcher.addEventListener(this, threadExitRequest);
-
-		List allThreads = vm.allThreads();
-		ThreadReference threadReference = null;
-		for (Iterator iterator = allThreads.iterator(); iterator.hasNext();) {
-			threadReference = (ThreadReference) iterator.next();
-			createThread(threadReference, false);
-		}
-	}
-
-	/**
-	 * Removes all threads from the target
-	 */
-	private synchronized void removeAllThreads() {
-		Iterator iter = getThreadIterator();
-		while (iter.hasNext()) {
-			JavaScriptThread thread = (JavaScriptThread) iter.next();
-			thread.terminated();
-		}
-		threads.clear();
-		removeJSDIEventListener(this, threadEnterRequest);
-		removeJSDIEventListener(this, threadExitRequest);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IDebugTarget#getThreads()
-	 */
-	public synchronized IThread[] getThreads() throws DebugException {
-		return (IThread[]) threads.toArray(new IThread[this.threads.size()]);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IDebugTarget#hasThreads()
-	 */
-	public synchronized boolean hasThreads() throws DebugException {
-		return !threads.isEmpty();
-	}
-
-	/**
-	 * Installs all JavaScript breakpoints that currently exist in the
-	 * breakpoint manager
-	 */
-	synchronized void initializeBreakpoints() {
-		debuggerStatementRequest = getEventRequestManager().createDebuggerStatementRequest();
-		debuggerStatementRequest.setEnabled(true);
-		addJSDIEventListener(this, debuggerStatementRequest);
-
-		IBreakpointManager manager = DebugPlugin.getDefault().getBreakpointManager();
-		manager.addBreakpointListener(this);
-		IBreakpoint[] managerBreakpoints = manager.getBreakpoints(JavaScriptDebugModel.MODEL_ID);
-		for (int i = 0; i < managerBreakpoints.length; i++) {
-			breakpointAdded(managerBreakpoints[i]);
-		}
-		//add the managed breakpoints
-		IJavaScriptBreakpoint[] breakpoints = JavaScriptPreferencesManager.getAllManagedBreakpoints();
-		for (int i = 0; i < breakpoints.length; i++) {
-			breakpointAdded(breakpoints[i]);
-		}
-	}
-
-	/**
-	 * Removes all breakpoints from this target
-	 */
-	private synchronized void removeAllBreakpoints() {
-		Iterator iter = ((ArrayList)this.breakpoints.clone()).iterator();
-		JavaScriptBreakpoint breakpoint = null;
-		while (iter.hasNext()) {
-			breakpoint = (JavaScriptBreakpoint) iter.next();
-			breakpoint.removeFromTarget(this);
-		}
-		this.breakpoints.clear();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.debug.core.model.IDebugTarget#supportsBreakpoint(org.eclipse.debug.core.model.IBreakpoint)
-	 */
-	public boolean supportsBreakpoint(IBreakpoint breakpoint) {
-		return JavaScriptDebugModel.MODEL_ID.equals(breakpoint.getModelIdentifier());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ISuspendResume#canResume()
-	 */
-	public boolean canResume() {
-		if ((isSuspended() || canResumeThreads()) && isAvailable()) {
-			if (threads.size() == 0) {
-				return true;
-			}
-			Iterator iter = getThreadIterator();
-			while (iter.hasNext()) {
-				IThread thread = (IThread) iter.next();
-				if (thread.canResume()) {
-					// if at least 1 thread can resume the target can be resumed
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @return true if any one of the threads in the target can be resumed,
-	 *         false otherwise
-	 */
-	private boolean canResumeThreads() {
-		Iterator iter = getThreadIterator();
-		IThread thread = null;
-		while (iter.hasNext()) {
-			thread = (IThread) iter.next();
-			if (thread.canResume()) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ISuspendResume#canSuspend()
-	 */
-	public boolean canSuspend() {
-		if (!isSuspended() && isAvailable()) {
-			Iterator iter = getThreadIterator();
-			while (iter.hasNext()) {
-				IThread thread = (IThread) iter.next();
-				if (thread.isSuspended()) {
-					// do not allow the target to suspend if there is already a
-					// suspended thread
-					return false;
-				}
-			}
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Returns an iterator over the collection of threads. The returned iterator
-	 * is made on a copy of the thread list so that it is thread safe. This
-	 * method should always be used instead of getThreadList().iterator()
-	 * 
-	 * @return an iterator over the collection of threads
-	 */
-	private Iterator getThreadIterator() {
-		List threadList;
-		synchronized (this.threads) {
-			threadList = (List) this.threads.clone();
-		}
-		return threadList.iterator();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ISuspendResume#isSuspended()
-	 */
-	public boolean isSuspended() {
-		return this.suspended;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ISuspendResume#resume()
-	 */
-	public void resume() throws DebugException {
-		if (!isAvailable()) {
-			// no-op if the target is not ready
-			return;
-		}
-		// if we are resuming the target resume all of the threads before
-		// resuming the target
-		// this gives the threads a chance to save state, etc before the VM is
-		// resumed
-		Iterator iter = getThreadIterator();
-		JavaScriptThread thread = null;
-		while (iter.hasNext()) {
-			thread = (JavaScriptThread) iter.next();
-			if (thread.isSuspended()) {
-				thread.targetResume();
-			}
-		}
-		this.suspended = false;
-		resumeVM(false);
-		fireResumeEvent(DebugEvent.CLIENT_REQUEST);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ISuspendResume#suspend()
-	 */
-	public void suspend() throws DebugException {
-		if (isSuspended() || !isAvailable()) {
-			// no-op if the target is suspended or not ready
-			return;
-		}
-		try {
-			suspended = true;
-			if (this.vm != null) {
-				this.vm.suspend();
-			}
-			// set all owned, unsuspended threads as suspended if we suspend the
-			// target
-			Iterator iter = getThreadIterator();
-			while (iter.hasNext()) {
-				JavaScriptThread thread = (JavaScriptThread) iter.next();
-				if (!thread.isSuspended()) {
-					thread.markSuspended();
-				}
-			}
-		} finally {
-			fireSuspendEvent(DebugEvent.CLIENT_REQUEST);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IJavaScriptDebugTarget#getScriptGroup()
-	 */
-	public IScriptGroup getScriptGroup() {
-		return scriptgroup;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IDisconnect#disconnect()
-	 */
-	public void disconnect() throws DebugException {
-		if (!isAvailable()) {
-			// already done
-			return;
-		}
-		if (!this.supportsDisconnect) {
-			notSupported(NLS.bind(
-					ModelMessages.JSDIDebugTarget_not_support_disconnect,
-					getName()), null);
-		}
-		try {
-			// first resume the VM, do not leave it in a suspended state
-			// https://bugs.eclipse.org/bugs/show_bug.cgi?id=304574
-			resumeVM(true);
-			if(this.process != null) {
-				this.process.terminate();
-			}
-		}  
-		catch(RuntimeException rte) {}
-		finally {
-			cleanup();
-			disposeVM(true);
-			this.disconnected = true;
-			fireTerminateEvent();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ITerminate#terminate()
-	 */
-	public void terminate() throws DebugException {
-		if (!isAvailable()) {
-			// already done
-			return;
-		}
-		if (!this.supportsTerminate) {
-			notSupported(NLS.bind(
-					ModelMessages.JSDIDebugTarget_not_support_terminate,
-					getName()), null);
-		}
-		this.terminating = true;
-		try {
-			// first resume the VM, do not leave it in a suspended state
-			// https://bugs.eclipse.org/bugs/show_bug.cgi?id=304574
-			resumeVM(true);
-			// next terminate the underlying process
-			if (this.process != null) {
-				this.process.terminate();
-			}
-			this.terminated = true;
-		} finally {
-			disposeVM(true);
-			cleanup();
-			this.terminating = false;
-			fireTerminateEvent();
-		}
-	}
-
-	/**
-	 * disposes the underlying {@link VirtualMachine}
-	 * 
-	 * @param shutdown
-	 * @throws DebugException
-	 */
-	void disposeVM(boolean shutdown) throws DebugException {
-		if(this.vm != null) {
-			try {
-				this.vm.dispose();
-			}
-			catch(RuntimeException rte) {
-				if(!shutdown) {
-					disconnect();
-				}
-			}
-		}
-	}
-	
-	/**
-	 * resumes the underlying {@link VirtualMachine}
-	 * 
-	 * @param shutdown if the method is being called during a terminating call
-	 * @throws DebugException 
-	 */
-	void resumeVM(boolean shutdown) throws DebugException {
-		if(this.vm != null) {
-			try {
-				this.vm.resume();
-			}
-			catch(RuntimeException rte) {
-				if(!shutdown) {
-					disconnect();
-				}
-			}
-		}
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.debug.core.model.IMemoryBlockRetrieval#getMemoryBlock(long,
-	 * long)
-	 */
-	public IMemoryBlock getMemoryBlock(long startAddress, long length) throws DebugException {
-		notSupported(ModelMessages.JSDIDebugTarget_unsupported_operation, null);
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.debug.core.model.IMemoryBlockRetrieval#supportsStorageRetrieval
-	 * ()
-	 */
-	public boolean supportsStorageRetrieval() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugElement#getVM()
-	 */
-	public VirtualMachine getVM() {
-		return this.vm;
-	}
-
-	/**
-	 * @return if the target is available to be disconnected or terminated
-	 */
-	public boolean isAvailable() {
-		return !(this.terminated || this.terminating || this.disconnected);
-	}
-
-	/**
-	 * @return the event dispatcher
-	 */
-	EventDispatcher getEventDispatcher() {
-		return this.eventDispatcher;
-	}
-
-	/**
-	 * Delegate method to create a new {@link JavaScriptThread} and add it to the list
-	 * of threads
-	 * 
-	 * @param thread the underlying {@link ThreadReference}
-	 * @return a new {@link JavaScriptThread}
-	 */
-	private synchronized JavaScriptThread createThread(ThreadReference thread, boolean fireEvent) {
-		if (isDisconnected()) {
-			return null;
-		}
-		JavaScriptThread jsdiThread = findThread(thread);
-		if (jsdiThread != null) {
-			jsdiThread.fireChangeEvent(DebugEvent.CONTENT);
-			return jsdiThread;
-		}
-		jsdiThread = new JavaScriptThread(this, thread);
-		this.threads.add(jsdiThread);
-		if (fireEvent) {
-			jsdiThread.fireCreationEvent();
-		}
-		return jsdiThread;
-	}
-
-	/**
-	 * Terminates the given {@link ThreadReference} if the target is not
-	 * disconnected
-	 * 
-	 * @param thread
-	 */
-	private synchronized void terminateThread(ThreadReference thread) {
-		if (isDisconnected()) {
-			return;
-		}
-		JavaScriptThread jsdiThread = findThread(thread);
-		if (jsdiThread == null) {
-			return;
-		}
-		threads.remove(jsdiThread);
-		jsdiThread.markTerminated();
-		jsdiThread.fireTerminateEvent();
-	}
-
-	/**
-	 * Finds the {@link JavaScriptThread} mapped to the given {@link ThreadReference}
-	 * 
-	 * @param thread
-	 * @return the mapped {@link JavaScriptThread} or <code>null</code>
-	 */
-	public synchronized JavaScriptThread findThread(ThreadReference thread) {
-		for (Iterator iterator = threads.iterator(); iterator.hasNext();) {
-			JavaScriptThread jsdiThread = (JavaScriptThread) iterator.next();
-			if (jsdiThread.matches(thread)) {
-				return jsdiThread;
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.debug.core.model.DebugElement#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		if (adapter == JavaScriptDebugTarget.class) {
-			return this;
-		}
-		return super.getAdapter(adapter);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.debug.core.IBreakpointListener#breakpointAdded(org.eclipse.debug.core.model.IBreakpoint)
-	 */
-	public synchronized void breakpointAdded(IBreakpoint breakpoint) {
-		if (!isAvailable() || !supportsBreakpoint(breakpoint)) {
-			// no-op either not ready or we don't care about the given
-			// breakpoint
-			return;
-		}
-		try {
-			synchronized (this.breakpoints) {
-				if(!this.breakpoints.contains(breakpoint)) {
-					if(!shouldSkipBreakpoint(breakpoint)) {
-						//only add to the VM if it should not be skipped
-						((JavaScriptBreakpoint) breakpoint).addToTarget(this);
-					}
-					this.breakpoints.add(breakpoint);
-				}
-			}
-		} catch (CoreException ce) {
-			JavaScriptDebugPlugin.log(ce);
-		}
-	}
-
-	/**
-	 * Returns if the given breakpoint should be skipped
-	 * 
-	 * @param breakpoint
-	 * @return <code>true</code> if the breakpoint should be skipped, <code>false</code> otherwise
-	 */
-	boolean shouldSkipBreakpoint(IBreakpoint breakpoint) {
-		try {
-			DebugPlugin plugin = DebugPlugin.getDefault();
-			return plugin != null && breakpoint.isRegistered() && !plugin.getBreakpointManager().isEnabled();
-		}
-		catch(CoreException ce) {
-			//there is something wrong, skip it
-			return true;
-		}
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.debug.core.IBreakpointListener#breakpointChanged(org.eclipse.debug.core.model.IBreakpoint, org.eclipse.core.resources.IMarkerDelta)
-	 */
-	public synchronized void breakpointChanged(IBreakpoint breakpoint,IMarkerDelta delta) {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.debug.core.IBreakpointListener#breakpointRemoved(org.eclipse.debug.core.model.IBreakpoint, org.eclipse.core.resources.IMarkerDelta)
-	 */
-	public synchronized void breakpointRemoved(IBreakpoint breakpoint, IMarkerDelta delta) {
-		if (!isAvailable() || !supportsBreakpoint(breakpoint)) {
-			// no-op either not ready or we don't care about the breakpoint
-			return;
-		}
-		((JavaScriptBreakpoint) breakpoint).removeFromTarget(this);
-		synchronized (this.breakpoints) {
-			this.breakpoints.remove(breakpoint);
-		}
-		// remove cached breakpoints from threads
-		if (this.threads != null) {
-			for (Iterator iter = this.threads.iterator(); iter.hasNext();) {
-				((JavaScriptThread) iter.next()).removeBreakpoint((JavaScriptBreakpoint) breakpoint);
-			}
-		}
-	}
-
-	/**
-	 * Returns the live list of breakpoints currently set in this target
-	 * 
-	 * @return the live list of breakpoints
-	 */
-	public List getBreakpoints() {
-		return this.breakpoints;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.debug.core.IDebugEventSetListener#handleDebugEvents(org.eclipse
-	 * .debug.core.DebugEvent[])
-	 */
-	public void handleDebugEvents(DebugEvent[] events) {
-		if (events.length == 1) {
-			DebugEvent event = events[0];
-			switch(event.getKind()) {
-				case DebugEvent.TERMINATE: {
-					if(event.getSource().equals(getProcess())) {
-						shutdown();
-					}
-					break;
-				}
-				case DebugEvent.CHANGE: {
-					if(event.getSource().equals(scriptgroup)) {
-						if(iScriptCache != null) {
-							iScriptCache.clear();
-							iScriptCache = null;
-						}
-					}
-					break;
-				}
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchListener#launchRemoved(org.eclipse.debug.core.ILaunch)
-	 */
-	public void launchRemoved(ILaunch launch) {
-		if (!isAvailable()) {
-			return;
-		}
-		if (launch.equals(getLaunch())) {
-			// This target has been unregistered, but it hasn't successfully
-			// terminated.
-			// Update internal state to reflect that it is disconnected
-			disconnected();
-		}
-	}
-
-	/**
-	 * delegate to clean up if the target has been disconnected and a framework
-	 * method has been called
-	 */
-	protected void disconnected() {
-		if (!isDisconnected()) {
-			this.disconnected = true;
-			shutdown();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchListener#launchAdded(org.eclipse.debug.core.ILaunch)
-	 */
-	public void launchAdded(ILaunch launch) {
-		// ignore
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchListener#launchChanged(org.eclipse.debug.core.ILaunch)
-	 */
-	public void launchChanged(ILaunch launch) {
-		// ignore
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IJSDIEventListener#eventSetComplete(org.eclipse.wst.jsdt.debug.core.jsdi.event.Event, org.eclipse.wst.jsdt.debug.core.model.JSDIDebugTarget, boolean, org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet)
-	 */
-	public void eventSetComplete(Event event, JavaScriptDebugTarget target, boolean suspend, EventSet eventSet) {
-		// thread enter
-		// thread exit
-		// script?
-
-		if (event instanceof DebuggerStatementEvent) {
-			DebuggerStatementEvent debuggerStatementEvent = (DebuggerStatementEvent) event;
-			ThreadReference threadReference = debuggerStatementEvent.thread();
-			JavaScriptThread thread = findThread(threadReference);
-			thread.fireSuspendEvent(DebugEvent.BREAKPOINT);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IJSDIEventListener#handleEvent(org.eclipse.wst.jsdt.debug.core.jsdi.event.Event, org.eclipse.wst.jsdt.debug.core.model.JSDIDebugTarget, boolean, org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet)
-	 */
-	public synchronized boolean handleEvent(Event event, JavaScriptDebugTarget target, boolean suspendVote, EventSet eventSet) {
-		if (event instanceof ThreadEnterEvent) {
-			ThreadEnterEvent threadEnterEvent = (ThreadEnterEvent) event;
-			createThread(threadEnterEvent.thread(), true);
-			return false;
-		}
-		if (event instanceof ThreadExitEvent) {
-			ThreadExitEvent threadExitEvent = (ThreadExitEvent) event;
-			terminateThread(threadExitEvent.thread());
-			//need to update the script node in the event any scripts have been unloaded when the thread exits
-			if(scriptgroup != null) {
-				fireEvent(new DebugEvent(scriptgroup, DebugEvent.CHANGE, DebugEvent.CONTENT));
-			}
-			return false;
-		}
-		if (event instanceof ScriptLoadEvent) {
-			if(iScriptCache != null) {
-				iScriptCache.clear();
-				iScriptCache = null;
-			}
-			fireEvent(new DebugEvent(this.scriptgroup, DebugEvent.MODEL_SPECIFIC, EventDispatcher.EVENT_SCRIPT_LOADED));
-			return true;
-		}
-
-		if (event instanceof DebuggerStatementEvent) {
-			DebuggerStatementEvent debuggerStatementEvent = (DebuggerStatementEvent) event;
-			ThreadReference threadReference = debuggerStatementEvent.thread();
-			JavaScriptThread thread = findThread(threadReference);
-			if(!thread.isSuspended()) {
-				thread.markSuspended();
-			}
-			return false;
-		}
-
-		// handle VM events i.e. death / disconnect
-		if (event instanceof VMDeathEvent) {
-			shutdown();
-			return true;
-		}
-		if (event instanceof VMDisconnectEvent) {
-			try {
-				if (!this.disconnected) {
-					eventCleanup();
-				}
-			} finally {
-				shutdown();
-			}
-			return false;
-		}
-		throw new IllegalArgumentException(NLS.bind(
-				ModelMessages.JSDIDebugTarget_recieved_unknown_event, event
-						.toString()));
-	}
-
-	/**
-	 * Cleans up the target
-	 */
-	void eventCleanup() {
-		try {
-			cleanup();
-		} finally {
-			this.disconnected = true;
-			this.terminated = true;
-			fireTerminateEvent();
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptPrimitiveValue.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptPrimitiveValue.java
deleted file mode 100644
index f77e113..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptPrimitiveValue.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core.model;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IVariable;
-import org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptPrimitiveValue;
-
-/**
- * {@link IJavaScriptPrimitiveValue} implementation
- * @since 1.0
- */
-public class JavaScriptPrimitiveValue extends JavaScriptValue implements IJavaScriptPrimitiveValue {
-
-	/**
-	 * Constructor
-	 * @param target
-	 * @param value
-	 */
-	public JavaScriptPrimitiveValue(JavaScriptDebugTarget target, Value value) {
-		super(target, value);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IValue#isAllocated()
-	 */
-	public boolean isAllocated() throws DebugException {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IValue#getVariables()
-	 */
-	public IVariable[] getVariables() throws DebugException {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IJavaScriptPrimitiveValue#getNumberValue()
-	 */
-	public int intValue() {
-		Value value = getUnderlyingValue();
-		if(value instanceof PrimitiveValue) {
-			return ((PrimitiveValue)value).intValue();
-		}
-		return 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IJavaScriptPrimitiveValue#doubleValue()
-	 */
-	public double doubleValue() {
-		Value value = getUnderlyingValue();
-		if(value instanceof PrimitiveValue) {
-			return ((PrimitiveValue)value).doubleValue();
-		}
-		return intValue();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IJavaScriptPrimitiveValue#getBooleanValue()
-	 */
-	public boolean booleanValue() {
-		Value value = getUnderlyingValue();
-		if(value instanceof PrimitiveValue) {
-			return ((PrimitiveValue)value).booleanValue();
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IJavaScriptPrimitiveValue#getStringValue()
-	 */
-	public String stringValue() {
-		Value value = getUnderlyingValue();
-		if(value instanceof PrimitiveValue) {
-			return ((PrimitiveValue)value).valueString();
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return stringValue();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptProperty.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptProperty.java
deleted file mode 100644
index 8eb6211..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptProperty.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core.model;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IValue;
-import org.eclipse.debug.core.model.IVariable;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Property;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptValue;
-
-/**
- * Default implementation of an {@link IVariable}
- * 
- * @see JavaScriptValue
- * @see JavaScriptStackFrame
- * @since 1.0
- */
-public class JavaScriptProperty extends JavaScriptDebugElement implements IVariable {
-
-	private Property property;
-	private IJavaScriptValue value = null;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param target
-	 */
-	public JavaScriptProperty(JavaScriptValue jsdiValue, Property property) {
-		super(jsdiValue.getJavaScriptDebugTarget());
-		this.property = property;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IVariable#getName()
-	 */
-	public String getName() {
-		return property.name();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IVariable#getReferenceTypeName()
-	 */
-	public String getReferenceTypeName() throws DebugException {
-		return getValue().getReferenceTypeName();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IVariable#getValue()
-	 */
-	public IValue getValue() throws DebugException {
-		if (value == null) {
-			value = JavaScriptValue.createValue(getJavaScriptDebugTarget(), this.property.value());
-		}
-		return value;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IVariable#hasValueChanged()
-	 */
-	public boolean hasValueChanged() throws DebugException {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		if (adapter == JavaScriptProperty.class) {
-			return this;
-		}
-		return super.getAdapter(adapter);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IValueModification#setValue(java.lang.String )
-	 */
-	public void setValue(String expression) throws DebugException {
-		notSupported("Javascript variables do not support being edited", null); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IValueModification#setValue(org.eclipse. debug.core.model.IValue)
-	 */
-	public void setValue(IValue value) throws DebugException {
-		notSupported("Javascript variables do not support being edited", null); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IValueModification#supportsValueModification ()
-	 */
-	public boolean supportsValueModification() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IValueModification#verifyValue(java.lang .String)
-	 */
-	public boolean verifyValue(String expression) throws DebugException {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IValueModification#verifyValue(org.eclipse .debug.core.model.IValue)
-	 */
-	public boolean verifyValue(IValue value) throws DebugException {
-		return false;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptStackFrame.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptStackFrame.java
deleted file mode 100644
index 8b42b11..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptStackFrame.java
+++ /dev/null
@@ -1,383 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core.model;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.URIUtil;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IRegisterGroup;
-import org.eclipse.debug.core.model.IThread;
-import org.eclipse.debug.core.model.IVariable;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Variable;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptStackFrame;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptValue;
-
-/**
- * A JavaScript stack frame
- * 
- * @since 1.0
- */
-public final class JavaScriptStackFrame extends JavaScriptDebugElement implements IJavaScriptStackFrame {
-
-	/**
-	 * Owning thread.
-	 */
-	private JavaScriptThread thread;
-
-	/**
-	 * The underlying {@link StackFrameReference}
-	 */
-	private StackFrame stackFrame = null;
-
-	private ArrayList variables;
-	
-	private IVariable thisvar = null;
-
-	/**
-	 * Constructs a Rhino stack frame in the given thread.
-	 * 
-	 * @param thread
-	 */
-	public JavaScriptStackFrame(JavaScriptThread thread, StackFrame stackFrame) {
-		super(thread.getJavaScriptDebugTarget());
-		this.thread = thread;
-		this.stackFrame = stackFrame;
-	}
-
-	/**
-	 * Returns the underlying JSDI {@link StackFrame}
-	 * 
-	 * @return the underlying JSDI {@link StackFrame}
-	 */
-	StackFrame getUnderlyingStackFrame() {
-		return this.stackFrame;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStackFrame#getCharEnd()
-	 */
-	public int getCharEnd() throws DebugException {
-		return -1;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStackFrame#getCharStart()
-	 */
-	public int getCharStart() throws DebugException {
-		return -1;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStackFrame#getLineNumber()
-	 */
-	public int getLineNumber() throws DebugException {
-		return (stackFrame.location() != null ? stackFrame.location().lineNumber() : -1);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStackFrame#getName()
-	 */
-	public String getName() throws DebugException {
-		return this.stackFrame.location().functionName();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStackFrame#getRegisterGroups()
-	 */
-	public IRegisterGroup[] getRegisterGroups() throws DebugException {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStackFrame#getThread()
-	 */
-	public IThread getThread() {
-		return this.thread;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStackFrame#getVariables()
-	 */
-	public synchronized IVariable[] getVariables() throws DebugException {
-		if (this.variables == null) {
-			List underlyingVariables = this.stackFrame.variables();
-			this.variables = new ArrayList(underlyingVariables.size() + 1);
-			for (Iterator iterator = underlyingVariables.iterator(); iterator.hasNext();) {
-				Variable variable = (Variable) iterator.next();
-				JavaScriptVariable jsdiVariable = new JavaScriptVariable(this, variable);
-				this.variables.add(jsdiVariable);
-			}
-			
-			Collections.sort(variables, new Comparator() {		
-				public int compare(Object arg0, Object arg1) {
-					
-					IVariable var0 = (IVariable) arg0;
-					IVariable var1 = (IVariable) arg1;
-					try {
-						return var0.getName().compareToIgnoreCase(var1.getName());
-					} catch (DebugException e) {
-						return 0;
-					}
-				}
-			});
-			
-			// add the "this" object at the front
-			thisvar = new JavaScriptVariable(this, stackFrame.thisObject());
-			variables.add(0, thisvar);			
-		}
-		return (IVariable[]) this.variables.toArray(new IVariable[this.variables.size()]);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStackFrame#hasRegisterGroups()
-	 */
-	public boolean hasRegisterGroups() throws DebugException {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStackFrame#hasVariables()
-	 */
-	public boolean hasVariables() throws DebugException {
-		return this.stackFrame.variables().size() > 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStep#canStepInto()
-	 */
-	public boolean canStepInto() {
-		return this.thread.canStepInto();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStep#canStepOver()
-	 */
-	public boolean canStepOver() {
-		return this.thread.canStepOver();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStep#canStepReturn()
-	 */
-	public boolean canStepReturn() {
-		return this.thread.canStepReturn();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStep#isStepping()
-	 */
-	public boolean isStepping() {
-		return this.thread.isStepping();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStep#stepInto()
-	 */
-	public void stepInto() throws DebugException {
-		this.thread.stepInto();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStep#stepOver()
-	 */
-	public void stepOver() throws DebugException {
-		this.thread.stepOver();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStep#stepReturn()
-	 */
-	public void stepReturn() throws DebugException {
-		this.thread.stepReturn();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ISuspendResume#canResume()
-	 */
-	public boolean canResume() {
-		return this.thread.canResume();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ISuspendResume#canSuspend()
-	 */
-	public boolean canSuspend() {
-		return this.thread.canSuspend();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ISuspendResume#isSuspended()
-	 */
-	public boolean isSuspended() {
-		return this.thread.isSuspended();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ISuspendResume#resume()
-	 */
-	public void resume() throws DebugException {
-		this.thread.resume();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ISuspendResume#suspend()
-	 */
-	public void suspend() throws DebugException {
-		this.thread.suspend();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ITerminate#canTerminate()
-	 */
-	public boolean canTerminate() {
-		return this.thread.canTerminate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ITerminate#isTerminated()
-	 */
-	public boolean isTerminated() {
-		return this.thread.isTerminated();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ITerminate#terminate()
-	 */
-	public void terminate() throws DebugException {
-		if (this.thread.canTerminate()) {
-			this.thread.terminate();
-		} else {
-			getJavaScriptDebugTarget().terminate();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IJavaScriptStackFrame#evaluate(java.lang.String)
-	 */
-	public IJavaScriptValue evaluate(String expression) {
-		return this.thread.evaluate(expression);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IJavaScriptStackFrame#getSourceName()
-	 */
-	public String getSourceName() {
-		Location loc = getUnderlyingStackFrame().location();
-		if(loc != null) {
-			ScriptReference script = loc.scriptReference();
-			if(script != null) {
-				return URIUtil.lastSegment(script.sourceURI());
-			}
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IJavaScriptStackFrame#getSourcePath()
-	 */
-	public String getSourcePath() {
-		Location loc = getUnderlyingStackFrame().location();
-		if(loc != null) {
-			ScriptReference script = loc.scriptReference();
-			if(script != null) {
-				return script.sourceURI().toString();
-			}
-		}
-		return null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IJavaScriptStackFrame#getSource()
-	 */
-	public String getSource() {
-		Location loc = getUnderlyingStackFrame().location();
-		if(loc != null) {
-			ScriptReference script = loc.scriptReference();
-			if(script != null) {
-				return script.source();
-			}
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugElement#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		if(IJavaScriptStackFrame.class == adapter) {
-			return this;
-		}
-		return super.getAdapter(adapter);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IJavaScriptStackFrame#getThisObject()
-	 */
-	public IVariable getThisObject() {
-		return thisvar;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptThread.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptThread.java
deleted file mode 100644
index 9d4e090..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptThread.java
+++ /dev/null
@@ -1,886 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core.model;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.debug.core.model.IThread;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpointParticipant;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLoadBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.Event;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ResumeEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.StepEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.SuspendEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ResumeRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.SuspendRequest;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptStackFrame;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptValue;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptBreakpoint;
-import org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptExceptionBreakpoint;
-import org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptLoadBreakpoint;
-
-/**
- * A JavaScript thread.
- * 
- * JavaScript threads act as their own event listener for suspend and step
- * events and are called out to from JavaScript breakpoints to handle suspending
- * at a breakpoint.
- * 
- * @since 1.0
- */
-public class JavaScriptThread extends JavaScriptDebugElement implements IJavaScriptThread, IJavaScriptEventListener {
-
-	/**
-	 * handler for stepping
-	 */
-	class StepHandler implements IJavaScriptEventListener {
-
-		private StepRequest request = null;
-
-		/**
-		 * Sends step request
-		 */
-		public void step(int kind, int detail) {
-			pendingstep = this;
-			request = createStepRequest(this, kind);
-			resumeUnderlyingThread();
-			markResumed();
-			fireResumeEvent(detail);
-		}
-
-		/**
-		 * Creates a new step request
-		 * 
-		 * @param listener
-		 *            the element that will respond to the event
-		 * @param step
-		 *            step command to send
-		 * @return the newly created {@link StepRequest}
-		 */
-		private StepRequest createStepRequest(IJavaScriptEventListener listener, int step) {
-			EventRequestManager requestManager = getVM().eventRequestManager();
-			StepRequest stepRequest = requestManager.createStepRequest(thread, step);
-			stepRequest.setEnabled(true);
-			getJavaScriptDebugTarget().addJSDIEventListener(listener, stepRequest);
-			return stepRequest;
-		}
-
-		/**
-		 * Aborts the pending step
-		 */
-		void abort() {
-			try {
-				if (request != null) {
-					deleteRequest(this, request);
-					request = null;
-				}
-			/*	resumeUnderlyingThread();
-				fireResumeEvent(DebugEvent.CLIENT_REQUEST);*/
-			} finally {
-				pendingstep = null;
-			}
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see
-		 * org.eclipse.wst.jsdt.debug.internal.core.model.IJavaScriptEventListener
-		 * #handleEvent(org.eclipse.wst.jsdt.debug.core.jsdi.event.Event,
-		 * org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget,
-		 * boolean, org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet)
-		 */
-		public boolean handleEvent(Event event, JavaScriptDebugTarget target, boolean suspendVote, EventSet eventSet) {
-			StepEvent stepEvent = (StepEvent) event;
-			return stepEvent.thread() != thread;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see
-		 * org.eclipse.wst.jsdt.debug.internal.core.model.IJavaScriptEventListener
-		 * #eventSetComplete(org.eclipse.wst.jsdt.debug.core.jsdi.event.Event,
-		 * org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget,
-		 * boolean, org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet)
-		 */
-		public void eventSetComplete(Event event, JavaScriptDebugTarget target, boolean suspend, EventSet eventSet) {
-			StepEvent stepEvent = (StepEvent) event;
-			stepEnd(this, stepEvent);
-		}
-
-		/**
-		 * Handles a {@link StepEvent}
-		 * 
-		 * @param listener
-		 *            the listener to remove
-		 * @param event
-		 * @return <code>true</code> if the event was not handled (we should
-		 *         resume), <code>false</code> if the event was handled (we
-		 *         should suspend)
-		 */
-		private void stepEnd(IJavaScriptEventListener listener, StepEvent event) {
-			ThreadReference threadReference = event.thread();
-			if (threadReference == thread) {
-				synchronized (JavaScriptThread.this) {
-					pendingstep = null;
-					if (request == event.request()) {
-						deleteRequest(listener, event.request());
-						request = null;
-					}
-					markSuspended();
-					fireSuspendEvent(DebugEvent.STEP_END);
-				}
-			}
-		}
-
-		/**
-		 * Delete the given event request
-		 * 
-		 * @param listener
-		 *            the element that will be removed as a listener
-		 * @param request
-		 */
-		private void deleteRequest(IJavaScriptEventListener listener, EventRequest request) {
-			getJavaScriptDebugTarget().removeJSDIEventListener(listener, request);
-			EventRequestManager requestManager = getVM().eventRequestManager();
-			requestManager.deleteEventRequest(request);
-		}
-	}
-
-	/**
-	 * Constant for no stack frames
-	 * 
-	 * @see #getStackFrames()
-	 */
-	static final IStackFrame[] NO_STACK_FRAMES = new IStackFrame[0];
-
-	/**
-	 * Constant for no breakpoints
-	 * 
-	 * @see #getBreakpoints()
-	 */
-	static final IBreakpoint[] NO_BREAKPOINTS = new IBreakpoint[0];
-
-	// states
-	private static final int UNKNOWN = 0;
-	private static final int SUSPENDED = 1;
-	private static final int RUNNING = 2;
-	private static final int TERMINATED = 4;
-
-	private static final boolean DEBUG = false;
-
-	/**
-	 * Stack frames, or <code>null</code> if none.
-	 */
-	private List frames = null;
-
-	/**
-	 * Breakpoints or empty if none.
-	 */
-	private ArrayList breakpoints = new ArrayList(4);
-
-	/**
-	 * Current state
-	 */
-	private int state = UNKNOWN;
-
-	/**
-	 * The underlying {@link ThreadReference} for this thread
-	 */
-	private final ThreadReference thread;
-
-	/**
-	 * Flag to track if the thread is in the process of suspending
-	 */
-	private volatile boolean suspending = false;
-
-	/**
-	 * {@link StepHandler} handle to know if a step has been initiated
-	 */
-	private StepHandler pendingstep = null;
-	
-	private SuspendRequest suspendreq = null;
-	private ResumeRequest resumereq = null;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param target
-	 *            the target the thread belongs to
-	 * @param thread
-	 *            the underlying {@link ThreadReference}
-	 */
-	public JavaScriptThread(JavaScriptDebugTarget target, ThreadReference thread) {
-		super(target);
-		Assert.isNotNull(thread);
-		this.thread = thread;
-		this.state = thread.isSuspended() ? SUSPENDED : RUNNING;
-		suspendreq = target.getEventRequestManager().createSuspendRequest(this.thread);
-		suspendreq.setEnabled(true);
-		addJSDIEventListener(this, suspendreq);
-		resumereq = target.getEventRequestManager().createResumeRequest(this.thread);
-		suspendreq.setEnabled(true);
-		addJSDIEventListener(this, resumereq);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IThread#getBreakpoints()
-	 */
-	public synchronized IBreakpoint[] getBreakpoints() {
-		if (this.breakpoints.isEmpty()) {
-			return NO_BREAKPOINTS;
-		}
-		return (IBreakpoint[]) this.breakpoints.toArray(new IBreakpoint[this.breakpoints.size()]);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IThread#getName()
-	 */
-	public String getName() throws DebugException {
-		return thread.name();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IThread#getPriority()
-	 */
-	public int getPriority() throws DebugException {
-		return 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IThread#getStackFrames()
-	 */
-	public synchronized IStackFrame[] getStackFrames() throws DebugException {
-		if (!isSuspended() || !thread.isSuspended()) {
-			return NO_STACK_FRAMES;
-		}
-		if (this.frames == null) {
-			this.frames = new ArrayList();
-			List threadFrames = this.thread.frames();
-			for (Iterator iterator = threadFrames.iterator(); iterator.hasNext();) {
-				StackFrame stackFrame = (StackFrame) iterator.next();
-				JavaScriptStackFrame jsdiStackFrame = new JavaScriptStackFrame(this, stackFrame);
-				this.frames.add(jsdiStackFrame);
-			}
-		}
-		return (IStackFrame[]) this.frames.toArray(new IStackFrame[this.frames.size()]);
-	}
-
-	/**
-	 * Clears out old stack frames after resuming.
-	 */
-	private void clearFrames() {
-		if (this.frames != null) {
-			this.frames.clear();
-			this.frames = null;
-		}
-	}
-
-	/**
-	 * Clears out the cached collection of breakpoints
-	 */
-	private void clearBreakpoints() {
-		this.breakpoints.clear();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IThread#getTopStackFrame()
-	 */
-	public IStackFrame getTopStackFrame() throws DebugException {
-		IStackFrame[] stackFrames = getStackFrames();
-		if (stackFrames != null && stackFrames.length > 0) {
-			return stackFrames[0];
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IThread#hasStackFrames()
-	 */
-	public boolean hasStackFrames() throws DebugException {
-		return isSuspended();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ISuspendResume#canResume()
-	 */
-	public synchronized boolean canResume() {
-		return state == SUSPENDED;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ISuspendResume#canSuspend()
-	 */
-	public synchronized boolean canSuspend() {
-		return state == RUNNING;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ISuspendResume#isSuspended()
-	 */
-	public synchronized boolean isSuspended() {
-		return this.state == SUSPENDED;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ISuspendResume#resume()
-	 */
-	public synchronized void resume() throws DebugException {
-		if (getDebugTarget().isSuspended()) {
-			getDebugTarget().resume();
-		} else {
-			resume(true);
-		}
-	}
-
-	/**
-	 * Call-back for the owning target to tell the thread to suspend
-	 */
-	public synchronized void targetResume() {
-		resume(false);
-	}
-
-	/**
-	 * Performs the actual resume of the thread
-	 * 
-	 * @param fireevent
-	 */
-	private void resume(boolean fireevent) {
-		if (canResume()) {
-			if (pendingstep != null) {
-				pendingstep.abort();
-			}
-			resumeUnderlyingThread();
-			markResumed();
-			if (fireevent) {
-				fireResumeEvent(DebugEvent.CLIENT_REQUEST);
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ISuspendResume#suspend()
-	 */
-	public synchronized void suspend() throws DebugException {
-		if (canSuspend()) {
-			suspendUnderlyingThread();
-		}
-	}
-
-	/**
-	 * Resumes the underlying thread
-	 */
-	void resumeUnderlyingThread() {
-		try {
-			this.thread.resume();
-		} catch (Exception e) {
-			try {
-				disconnect();
-			} catch (DebugException de) {
-				/* JavaScriptDebugPlugin.log(de); */
-			}
-		}
-	}
-
-	/**
-	 * Delegate method to suspend the underlying thread
-	 */
-	void suspendUnderlyingThread() {
-		if (suspending) {
-			return;
-		}
-		if (isSuspended()) {
-			fireSuspendEvent(DebugEvent.CLIENT_REQUEST);
-			return;
-		}
-		suspending = true;
-		Thread thread = new Thread(new Runnable() {
-			public void run() {
-				try {
-					JavaScriptThread.this.thread.suspend();
-					long stop = System.currentTimeMillis() + VirtualMachine.DEFAULT_TIMEOUT;
-					boolean suspended = JavaScriptThread.this.thread.isSuspended();
-					while (System.currentTimeMillis() < stop && !suspended) {
-						try {
-							Thread.sleep(50);
-						} catch (InterruptedException e) {
-						}
-						suspended = JavaScriptThread.this.thread.isSuspended();
-						if (suspended) {
-							break;
-						}
-					}
-					if (!suspended) {
-						IStatus status = new Status(IStatus.ERROR, JavaScriptDebugPlugin.PLUGIN_ID, 100, NLS.bind(ModelMessages.thread_timed_out_trying_to_suspend, new String[] { new Integer(VirtualMachine.DEFAULT_TIMEOUT).toString() }), null);
-						JavaScriptDebugPlugin.log(status);
-					}
-					markSuspended();
-					fireSuspendEvent(DebugEvent.CLIENT_REQUEST);
-				} catch (RuntimeException exception) {
-				} finally {
-					suspending = false;
-				}
-			}
-		});
-		thread.setDaemon(true);
-		thread.start();
-	}
-
-	/**
-	 * Suspend the thread because an exception has been caught
-	 * 
-	 * @param breakpoint
-	 * @since 1.1
-	 */
-	public void suspendForException(JavaScriptExceptionBreakpoint breakpoint) {
-		addBreakpoint(breakpoint);
-		markSuspended();
-		fireSuspendEvent(DebugEvent.BREAKPOINT);
-	}
-	
-	/**
-	 * Call-back from a breakpoint that has been hit
-	 * 
-	 * @param breakpoint
-	 * @param vote
-	 * @return if the thread should stay suspended
-	 */
-	public boolean suspendForBreakpoint(IJavaScriptBreakpoint breakpoint, boolean vote) {
-		IJavaScriptBreakpointParticipant[] participants = JavaScriptDebugPlugin.getParticipantManager().getParticipants(breakpoint);
-		int suspend = 0;
-		for (int i = 0; i < participants.length; i++) {
-			suspend |= participants[i].breakpointHit(this, breakpoint);
-		}
-		if ((suspend & IJavaScriptBreakpointParticipant.SUSPEND) > 0 || suspend == IJavaScriptBreakpointParticipant.DONT_CARE) {
-			addBreakpoint(breakpoint);
-			if(pendingstep != null) {
-				pendingstep.abort();
-			}
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Call-back from
-	 * {@link JavaScriptBreakpoint#eventSetComplete(Event, JavaScriptDebugTarget, boolean, EventSet)}
-	 * to handle suspending / cleanup
-	 * 
-	 * @param breakpoint
-	 * @param suspend
-	 *            if the thread should suspend
-	 * @param eventSet
-	 */
-	public void suspendForBreakpointComplete(IJavaScriptBreakpoint breakpoint, boolean suspend, EventSet eventSet) {
-		if (suspend) {
-			try {
-				if (breakpoint.getSuspendPolicy() == IJavaScriptBreakpoint.SUSPEND_THREAD) {
-					markSuspended();
-				} else {
-					getDebugTarget().suspend();
-				}
-				fireSuspendEvent(DebugEvent.BREAKPOINT);
-			} catch (CoreException ce) {
-				JavaScriptDebugPlugin.log(ce);
-			}
-		}
-	}
-
-	/**
-	 * Call-back for a script that has been loaded
-	 * 
-	 * @param breakpoint
-	 * @param script
-	 * @param vote
-	 * @return if the thread should stay suspended
-	 */
-	public int suspendForScriptLoad(IJavaScriptBreakpoint breakpoint, ScriptReference script, boolean vote) {
-		IJavaScriptBreakpointParticipant[] participants = JavaScriptDebugPlugin.getParticipantManager().getParticipants(breakpoint);
-		int suspend = 0;
-		for (int i = 0; i < participants.length; i++) {
-			suspend |= participants[i].scriptLoaded(this, script, breakpoint);
-		}
-		return suspend;
-	}
-
-	/**
-	 * Call-back from
-	 * {@link JavaScriptLoadBreakpoint#eventSetComplete(Event, JavaScriptDebugTarget, boolean, EventSet)}
-	 * to handle suspending / cleanup
-	 * 
-	 * @param breakpoint
-	 * @param script
-	 * @param suspend
-	 *            if the thread should suspend
-	 * @param eventSet
-	 */
-	public void suspendForScriptLoadComplete(IJavaScriptBreakpoint breakpoint, ScriptReference script, boolean suspend, EventSet eventSet) {
-		suspendForBreakpointComplete(breakpoint, suspend, eventSet);
-	}
-
-	/**
-	 * Adds the given breakpoint to the collection for this thread
-	 * 
-	 * @param breakpoint
-	 * @return if the breakpoint added removed an existing entry
-	 */
-	public synchronized boolean addBreakpoint(IJavaScriptBreakpoint breakpoint) {
-		return breakpoints.add(breakpoint);
-	}
-
-	/**
-	 * Removes the breakpoint from the cached collection of breakpoints
-	 * 
-	 * @param breakpoint
-	 * @return if the breakpoint was removed
-	 */
-	public synchronized boolean removeBreakpoint(IJavaScriptBreakpoint breakpoint) {
-		return breakpoints.remove(breakpoint);
-	}
-
-	/**
-	 * Sets the state of the thread to {@link #SUSPENDED}
-	 */
-	synchronized void markSuspended() {
-		if (DEBUG){
-			if (!thread.isSuspended())
-				System.err.println("Warning: model thread marked suspended when underlything thread is not suspended"); //$NON-NLS-1$
-		}
-		this.state = SUSPENDED;
-	}
-
-	/**
-	 * Sets the state of the thread to {@link #RUNNING} and clears any cached
-	 * stack frames
-	 */
-	synchronized void markResumed() {
-		if (DEBUG){
-			if (thread.isSuspended())
-				System.err.println("Warning: model thread marked resumed when underlything thread is suspended"); //$NON-NLS-1$
-		}
-		this.state = RUNNING;
-		clearFrames();
-		clearBreakpoints();
-	}
-
-	/**
-	 * Sets the state of the thread to {@link #TERMINATED}
-	 */
-	synchronized void markTerminated() {
-		this.state = TERMINATED;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStep#canStepInto()
-	 */
-	public synchronized boolean canStepInto() {
-		return canStep() || atScriptLoadBreakpoint();
-	}
-
-	/**
-	 * Returns if the top breakpoint the thread is suspended on is an
-	 * {@link IJavaScriptLoadBreakpoint}
-	 * 
-	 * @return <code>true</code> if the thread is suspended at a script load
-	 *         breakpoint, <code>false</code> otherwise
-	 */
-	private boolean atScriptLoadBreakpoint() {
-		if (this.breakpoints != null && this.breakpoints.size() > 0) {
-			return this.breakpoints.get(0) instanceof IJavaScriptLoadBreakpoint;
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStep#canStepOver()
-	 */
-	public synchronized boolean canStepOver() {
-		return canStep();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStep#canStepReturn()
-	 */
-	public synchronized boolean canStepReturn() {
-		return canStep();
-	}
-
-	/**
-	 * @return <code>true</code> if a step is allowed
-	 */
-	private boolean canStep() {
-		try {
-			return isSuspended() && !isStepping() && getTopStackFrame() != null;
-		} catch (DebugException de) {
-			JavaScriptDebugPlugin.log(de);
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStep#isStepping()
-	 */
-	public synchronized boolean isStepping() {
-		return pendingstep != null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStep#stepInto()
-	 */
-	public synchronized void stepInto() throws DebugException {
-		if (!canStepInto()) {
-			if (DEBUG)
-				System.err.println("Warning: StepInto called on model thread when it canStepInto is false"); //$NON-NLS-1$
-			return;
-		}
-		StepHandler handler = new StepHandler();
-		handler.step(StepRequest.STEP_INTO, DebugEvent.STEP_INTO);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStep#stepOver()
-	 */
-	public synchronized void stepOver() throws DebugException {
-		if (!canStepOver()) {
-			if (DEBUG)
-				System.err.println("Warning: stepOver called on model thread when it canStepOver is false"); //$NON-NLS-1$
-			return;
-		}
-		StepHandler handler = new StepHandler();
-		handler.step(StepRequest.STEP_OVER, DebugEvent.STEP_OVER);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStep#stepReturn()
-	 */
-	public synchronized void stepReturn() throws DebugException {
-		if (!canStepReturn()) {
-			if (DEBUG)
-				System.err.println("Warning: stepReturn called on model thread when it canStepReturn is false"); //$NON-NLS-1$
-			return;
-		}
-		StepHandler handler = new StepHandler();
-		handler.step(StepRequest.STEP_OUT, DebugEvent.STEP_RETURN);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ITerminate#canTerminate()
-	 */
-	public boolean canTerminate() {
-		return getDebugTarget().canTerminate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ITerminate#isTerminated()
-	 */
-	public synchronized boolean isTerminated() {
-		return this.state == TERMINATED;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ITerminate#terminate()
-	 */
-	public void terminate() throws DebugException {
-		getJavaScriptDebugTarget().terminate();
-		getJavaScriptDebugTarget().getEventRequestManager().deleteEventRequest(suspendreq);
-		removeJSDIEventListener(this, suspendreq);
-		removeJSDIEventListener(this, resumereq);
-	}
-
-	/**
-	 * Call-back from the target to terminate the thread during shutdown
-	 */
-	void terminated() {
-		markTerminated();
-		fireTerminateEvent();
-	}
-
-	/**
-	 * Returns if the underlying {@link ThreadReference} of this thread matches
-	 * the given {@link ThreadReference} using pointer equality
-	 * 
-	 * @param thread
-	 * @return true if the {@link ThreadReference}s are the same
-	 */
-	public boolean matches(ThreadReference thread) {
-		return this.thread == thread;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.debug.core.model.DebugElement#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		if (IThread.class == adapter) {
-			return this;
-		}
-		if (IStackFrame.class == adapter) {
-			try {
-				return getTopStackFrame();
-			} catch (DebugException e) {
-				JavaScriptDebugPlugin.log(e);
-			}
-		}
-		if (IJavaScriptThread.class == adapter) {
-			return this;
-		}
-		if (IJavaScriptStackFrame.class == adapter) {
-			try {
-				return getTopStackFrame();
-			} catch (DebugException e) {
-				JavaScriptDebugPlugin.log(e);
-			}
-		}
-		return super.getAdapter(adapter);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread#evaluate(java
-	 * .lang.String)
-	 */
-	public IJavaScriptValue evaluate(String expression) {
-		try {
-			IStackFrame frame = getTopStackFrame();
-			if (frame instanceof JavaScriptStackFrame) {
-				return new JavaScriptValue(getJavaScriptDebugTarget(), ((JavaScriptStackFrame) frame).getUnderlyingStackFrame().evaluate(expression));
-			}
-		} catch (DebugException de) {
-			// do nothing, return
-		}
-		return new JavaScriptValue(getJavaScriptDebugTarget(), getVM().mirrorOfNull());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread#getFrameCount()
-	 */
-	public int getFrameCount() {
-		if (isSuspended()) {
-			return this.thread.frameCount();
-		}
-		return 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.model.IJavaScriptEventListener#handleEvent(org.eclipse.wst.jsdt.debug.core.jsdi.event.Event, org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget, boolean, org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet)
-	 */
-	public boolean handleEvent(Event event, JavaScriptDebugTarget target, boolean suspendVote, EventSet eventSet) {
-		if(event instanceof SuspendEvent) {
-			if(canSuspend()) {
-				if(this.thread.equals(((SuspendEvent)event).thread())) {
-					if(pendingstep != null) {
-						pendingstep.abort();
-					}
-					markSuspended();
-					fireSuspendEvent(DebugEvent.UNSPECIFIED);
-					return false;
-				}
-			}
-		}
-		if(event instanceof ResumeEvent) {
-			if(canResume()) {
-				if(this.thread.equals(((ResumeEvent)event).thread())) {
-					if (pendingstep != null) {
-						pendingstep.abort();
-					}
-					markResumed();
-					fireResumeEvent(DebugEvent.UNSPECIFIED);
-					return false;
-				}
-			}
-			if(pendingstep != null) {
-				//we need to handle the case where a step has caused a resume and no StepEvent has been sent
-				pendingstep.abort();
-				//send an event as we have stepped to resume
-				fireResumeEvent(DebugEvent.UNSPECIFIED);
-			}
-		}
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.model.IJavaScriptEventListener#eventSetComplete(org.eclipse.wst.jsdt.debug.core.jsdi.event.Event, org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget, boolean, org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet)
-	 */
-	public void eventSetComplete(Event event, JavaScriptDebugTarget target, boolean suspend, EventSet eventSet) {
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptValue.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptValue.java
deleted file mode 100644
index a1055f4..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptValue.java
+++ /dev/null
@@ -1,319 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core.model;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IValue;
-import org.eclipse.debug.core.model.IVariable;
-import org.eclipse.jface.text.Document;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.text.edits.TextEdit;
-import org.eclipse.wst.jsdt.core.ToolFactory;
-import org.eclipse.wst.jsdt.core.formatter.CodeFormatter;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ArrayReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.BooleanValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.FunctionReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.NullValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Property;
-import org.eclipse.wst.jsdt.debug.core.jsdi.StringValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.UndefinedValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptValue;
-import org.eclipse.wst.jsdt.debug.core.model.JavaScriptDebugModel;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-
-/**
- * Default implementation of {@link IValue}
- * 
- * @since 1.0
- */
-public class JavaScriptValue extends JavaScriptDebugElement implements IJavaScriptValue {
-
-	public static final IVariable[] NO_VARIABLES = new IVariable[0];
-	
-	/**
-	 * the '[proto]' value
-	 */
-	public static final String PROTO = "[proto]"; //$NON-NLS-1$
-	/**
-	 * the 'constructor' value
-	 */
-	public static final String CONSTRUCTOR = "constructor"; //$NON-NLS-1$
-	/**
-	 * The 'this' value
-	 */
-	public static final String THIS = "this"; //$NON-NLS-1$
-	
-	private Value value;
-	private List properties;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param target
-	 * @param value
-	 */
-	public JavaScriptValue(JavaScriptDebugTarget target, Value value) {
-		super(target);
-		this.value = value;
-	}
-	
-	/**
-	 * Hook to return the underlying value for this {@link JavaScriptValue}
-	 * 
-	 * @return the underlying {@link Value}
-	 */
-	protected Value getUnderlyingValue() {
-		return this.value;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IJavaScriptValue#getDetailString()
-	 */
-	public String getDetailString() {
-		if (this.value instanceof ArrayReference) {
-			ArrayReference array = (ArrayReference) this.value;
-			List values = array.getValues();
-			Iterator iterator = values.iterator();
-			if (! iterator.hasNext())
-			    return "[]"; //$NON-NLS-1$
-			StringBuffer buffer = new StringBuffer();
-			buffer.append('[');
-			for (;;) {
-				Value jsValue = (Value) iterator.next();
-				buffer.append(getValueString(jsValue));
-				if (! iterator.hasNext())
-					return buffer.append(']').toString();
-				buffer.append(", "); //$NON-NLS-1$				
-			}
-		}
-
-		if (this.value instanceof JavaScriptPrimitiveValue) {
-			JavaScriptPrimitiveValue nvalue = (JavaScriptPrimitiveValue)this.value;
-			return nvalue.stringValue();
-		}
-		if(this.value instanceof FunctionReference) {
-			FunctionReference f = (FunctionReference) this.value;
-			String src = f.functionBody();
-			if(src != null) {
-				CodeFormatter formatter = ToolFactory.createCodeFormatter(null);
-				TextEdit edit = formatter.format(CodeFormatter.K_JAVASCRIPT_UNIT, src, 0, src.length(), 0, null);
-				if(edit != null) {
-					Document doc = new Document(src);
-					try {
-						edit.apply(doc);
-						return doc.get();
-					} catch (Exception e) {
-						JavaScriptDebugPlugin.log(e);
-					} 
-				}
-			}
-			return f.valueString();
-		}
-		if(this.value != null) {
-			return this.value.valueString();
-		}
-		return UNDEFINED;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IValue#getReferenceTypeName()
-	 */
-	public String getReferenceTypeName() throws DebugException {
-		if (this.value != null) {
-			if (this.value instanceof ObjectReference) {
-				if (this.value instanceof NullValue) {
-				return NULL;
-				} else if (this.value instanceof ArrayReference) {
-					return ARRAY;
-				}else if (this.value instanceof FunctionReference) {
-					return FUNCTION;
-				}
-				return OBJECT;
-			} else if (this.value instanceof BooleanValue) {
-				return BOOLEAN;
-			} else if (this.value instanceof UndefinedValue) {
-				return UNDEFINED;
-			} else if (this.value instanceof NumberValue) {
-				return NUMBER;
-			} else if (this.value instanceof StringValue) {
-				return STRING;
-			}
-		}
-		return UNKNOWN;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IValue#getValueString()
-	 */
-	public String getValueString() throws DebugException {
-		return getValueString(value);
-	}
-	
-	private static String getValueString(Value jsValue) {
-		if (jsValue instanceof ObjectReference) {
-			ObjectReference ref = (ObjectReference) jsValue;
-			StringBuffer buffer = new StringBuffer();
-			Number id = ref.id();
-			if(id == null) {
-				buffer.append(jsValue.valueString());
-			}
-			else {
-				buffer.append(NLS.bind(ModelMessages.JavaScriptValue_object_value_label, new String[] {jsValue.valueString(), id.toString()}));
-			}
-			return buffer.toString();
-		}
-		if (jsValue instanceof NumberValue) {
-			NumberValue nvalue = (NumberValue) jsValue;
-			if (!nvalue.isNaN()) {
-				return JavaScriptDebugModel.numberToString(nvalue.value());
-			}
-		}
-		if (jsValue instanceof StringValue) {
-			StringBuffer buffer = new StringBuffer();
-			buffer.append('"');
-			buffer.append(jsValue.valueString().replaceAll("\"", "\\\\\"")); //$NON-NLS-1$//$NON-NLS-2$
-			buffer.append('"');
-			return buffer.toString();
-		}
-		
-		return jsValue.valueString();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IValue#getVariables()
-	 */
-	public synchronized IVariable[] getVariables() throws DebugException {
-		if (!hasVariables()) {
-			return NO_VARIABLES;
-		}
-		if (this.properties == null) {
-			final ObjectReference reference = (ObjectReference) this.value;
-			List underlyingProperties = reference.properties();
-			this.properties = new ArrayList(underlyingProperties.size()+1);
-			for (Iterator iterator = underlyingProperties.iterator(); iterator.hasNext();) {
-				Property property = (Property) iterator.next();
-				JavaScriptProperty jsdiProperty = new JavaScriptProperty(this, property);
-				this.properties.add(jsdiProperty);
-			}
-			
-			// sort - array values (e.g integer names) first then alphabetically
-			Collections.sort(properties, new Comparator() {		
-				public int compare(Object arg0, Object arg1) {
-					try {		
-					String name0 = ((IVariable) arg0).getName();
-					String name1 = ((IVariable) arg1).getName();
-					
-					if (Character.isDigit(name0.charAt(0))) {
-						if (Character.isDigit(name1.charAt(0))) 
-							return Integer.valueOf(name0).compareTo(Integer.valueOf(name1));
-						return -1;
-					}
-					if (Character.isDigit(name1.charAt(0)))
-						return 1;
-
-					return name0.compareToIgnoreCase(name1);
-					} catch (DebugException e) {
-						return 0;
-					}
-				}
-			});
-			
-			// add the prototype
-			Property prototype = new Property() {
-				public VirtualMachine virtualMachine() {
-					return reference.virtualMachine();
-				}
-				public String name() {
-					return PROTO;
-				}
-				public Value value() {
-					return reference.prototype();
-				}
-			};
-			properties.add(0, new JavaScriptProperty(this, prototype));
-			
-			//add the constructor
-			Property constructor = new Property() {
-				public VirtualMachine virtualMachine() {
-					return reference.virtualMachine();
-				}
-				public String name() {
-					return CONSTRUCTOR; 
-				}
-				public Value value() {
-					return reference.constructor();
-				}
-			};
-			properties.add(1, new JavaScriptProperty(this, constructor));
-		}
-		return (IVariable[]) this.properties.toArray(new IVariable[this.properties.size()]);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IValue#hasVariables()
-	 */
-	public boolean hasVariables() throws DebugException {
-		if (this.value instanceof ObjectReference) {
-			return !(this.value instanceof NullValue);
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IValue#isAllocated()
-	 */
-	public boolean isAllocated() throws DebugException {
-		return this.properties != null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IJavaScriptValue#isNull()
-	 */
-	public boolean isNull() {
-		return this.value instanceof NullValue;
-	}
-	
-	/**
-	 * Delegate method to create the proper kind of {@link IJavaScriptValue}
-	 * 
-	 * @param target the target to create the value for
-	 * @param value the value to wrap
-	 * @return a new {@link IJavaScriptValue}
-	 */
-	public static IJavaScriptValue createValue(JavaScriptDebugTarget target, Value value) {
-		if(value instanceof BooleanValue ||
-				value instanceof NullValue ||
-				value instanceof NumberValue) {
-			return new JavaScriptPrimitiveValue(target, value);
-		}
-		return new JavaScriptValue(target, value);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptVariable.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptVariable.java
deleted file mode 100644
index 08f19c6..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptVariable.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core.model;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IValue;
-import org.eclipse.debug.core.model.IVariable;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Variable;
-
-/**
- * Default implementation of an {@link IVariable}
- * 
- * @see JavaScriptValue
- * @see JavaScriptStackFrame
- * @see StackFrameReference
- * @see Variable
- * @since 1.0
- */
-public class JavaScriptVariable extends JavaScriptDebugElement implements IVariable {
-
-	private Variable variable;
-	private JavaScriptValue value = null;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param frame
-	 * @param variable
-	 */
-	public JavaScriptVariable(JavaScriptStackFrame frame, Variable variable) {
-		super(frame.getJavaScriptDebugTarget());
-		this.variable = variable;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IVariable#getName()
-	 */
-	public String getName() {
-		return this.variable.name();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IVariable#getReferenceTypeName()
-	 */
-	public String getReferenceTypeName() throws DebugException {
-		return getValue().getReferenceTypeName();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IVariable#getValue()
-	 */
-	public IValue getValue() throws DebugException {
-		if (this.value == null) {
-			this.value = new JavaScriptValue(getJavaScriptDebugTarget(), this.variable.value());
-		}
-		return this.value;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IVariable#hasValueChanged()
-	 */
-	public boolean hasValueChanged() throws DebugException {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		if (adapter == JavaScriptVariable.class) {
-			return this;
-		}
-		return super.getAdapter(adapter);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IValueModification#setValue(java.lang.String)
-	 */
-	public void setValue(String expression) throws DebugException {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IValueModification#setValue(org.eclipse.debug.core.model.IValue)
-	 */
-	public void setValue(IValue value) throws DebugException {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IValueModification#supportsValueModification()
-	 */
-	public boolean supportsValueModification() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IValueModification#verifyValue(java.lang.String)
-	 */
-	public boolean verifyValue(String expression) throws DebugException {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IValueModification#verifyValue(org.eclipse.debug.core.model.IValue)
-	 */
-	public boolean verifyValue(IValue value) throws DebugException {
-		return false;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/ModelMessages.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/ModelMessages.java
deleted file mode 100644
index e8075c8..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/ModelMessages.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core.model;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Message declarations
- * 
- * @since 1.0
- */
-public class ModelMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.internal.core.model.modelmessages"; //$NON-NLS-1$
-	public static String debug_target_name;
-	public static String JavaScriptValue_object_value_label;
-	public static String JSDIDebugTarget_jsdi_debug_target;
-	public static String JSDIDebugTarget_not_support_disconnect;
-	public static String JSDIDebugTarget_not_support_terminate;
-	public static String JSDIDebugTarget_recieved_unknown_event;
-	public static String JSDIDebugTarget_unsupported_operation;
-	public static String thread_timed_out_trying_to_suspend;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, ModelMessages.class);
-	}
-
-	private ModelMessages() {
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/Script.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/Script.java
deleted file mode 100644
index d42eeba..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/Script.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core.model;
-
-import java.net.URI;
-
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.URIUtil;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.ITerminate;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.model.IScript;
-import org.eclipse.wst.jsdt.debug.internal.core.Constants;
-
-/**
- * Wrapper for a {@link ScriptReference} to display it in the debug view
- * 
- * @since 1.0
- */
-public class Script extends JavaScriptDebugElement implements IScript, Comparable, ITerminate {
-
-	private ScriptReference script = null;
-	
-	/**
-	 * Constructor
-	 */
-	public Script(JavaScriptDebugTarget target, ScriptReference script) {
-		super(target);
-		this.script  = script;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IScript#source()
-	 */
-	public String source() {
-		return this.script.source();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IScript#sourceURI()
-	 */
-	public URI sourceURI() {
-		return this.script.sourceURI();
-	}
-
-	/* (non-Javadoc)
-	 * @see java.lang.Comparable#compareTo(java.lang.Object)
-	 */
-	public int compareTo(Object o) {
-		if(o instanceof Script) {
-			Script s2 = (Script) o;
-			return sourceURI().toString().compareTo(s2.sourceURI().toString());
-		}
-		return 0;
-	}
-	
-	/**
-	 * Helper method to compute a usable name in the event the source URI has a path of "/"
-	 * 
-	 * @param sourceuri
-	 * @return the name to use from the URI
-	 */
-	public static String resolveName(URI sourceuri) {
-		String name = URIUtil.lastSegment(sourceuri);
-		if(name == null) {
-			name = new Path(sourceuri.getSchemeSpecificPart()).lastSegment();
-		}
-		if(name != null && !name.toLowerCase().endsWith(Constants.JS_EXTENSION)) {
-			StringBuffer newname = new StringBuffer(name).append('.').append(Constants.JS_EXTENSION);
-			name = newname.toString();
-		}
-		return name;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.ITerminate#canTerminate()
-	 */
-	public boolean canTerminate() {
-		return getJavaScriptDebugTarget().canTerminate();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.ITerminate#isTerminated()
-	 */
-	public boolean isTerminated() {
-		return getJavaScriptDebugTarget().isTerminated();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.ITerminate#terminate()
-	 */
-	public void terminate() throws DebugException {
-		getJavaScriptDebugTarget().terminate();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/ScriptGroup.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/ScriptGroup.java
deleted file mode 100644
index 1fc2a66..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/ScriptGroup.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core.model;
-
-import java.util.List;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.ITerminate;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptDebugTarget;
-import org.eclipse.wst.jsdt.debug.core.model.IScriptGroup;
-
-
-/**
- * Container for all scripts from a target
- * 
- * @since 1.0
- */
-public class ScriptGroup extends JavaScriptDebugElement implements IScriptGroup, ITerminate {
-	
-	/**
-	 * Constructor
-	 */
-	public ScriptGroup(IJavaScriptDebugTarget target) {
-		super(target);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IScriptGroup#allScripts()
-	 */
-	public synchronized List allScripts() {
-		return getJavaScriptDebugTarget().allScripts();
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		if(obj instanceof ScriptGroup) {
-			return ((ScriptGroup)obj).getJavaScriptDebugTarget().equals(getJavaScriptDebugTarget());
-		}
-		return false;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return getJavaScriptDebugTarget().hashCode();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.ITerminate#canTerminate()
-	 */
-	public boolean canTerminate() {
-		return getJavaScriptDebugTarget().canTerminate();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.ITerminate#isTerminated()
-	 */
-	public boolean isTerminated() {
-		return getJavaScriptDebugTarget().isTerminated();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.ITerminate#terminate()
-	 */
-	public void terminate() throws DebugException {
-		getJavaScriptDebugTarget().terminate();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/ScriptResolutionManager.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/ScriptResolutionManager.java
deleted file mode 100644
index 2c54448..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/ScriptResolutionManager.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core.model;
-
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.URIUtil;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.model.IScriptResolver;
-import org.eclipse.wst.jsdt.debug.internal.core.Constants;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.core.Messages;
-import org.eclipse.wst.jsdt.debug.internal.core.launching.SourceLookup;
-
-/**
- * Handles the collection of {@link ScriptResolverExtension}s and provide useful utilities for path / script handling
- * @since 3.4
- */
-public final class ScriptResolutionManager {
-
-	static IScriptResolver[] NO_RESOLVERS = new IScriptResolver[0];
-	ListenerList resolvers = null;
-	
-	/**
-	 * This is a convenience method that consults all of the registered {@link IScriptResolver}s.
-	 * <br><br>
-	 * This method will return <code>true</code> iff any one (or all) of the {@link IScriptResolver}s returns <code>true</code> or
-	 * the default matching algorithm returns <code>true</code> - which is consulted after all extensions have been asked.
-	 * @param script the script to check
-	 * @param path the path to compare against
-	 * @return <code>true</code> if any one (or all) of the {@link IScriptResolver}s return <code>true</code>, <code>false</code> otherwise
-	 */
-	public boolean matches(ScriptReference script, IPath path) {
-		IScriptResolver[] res = getResolvers();
-		for (int i = 0; i < res.length; i++) {
-			if(res[i].matches(script, path)) {
-				return true;
-			}
-		}
-		//no extensions matched, fall-back to the old way
-		return isMatch(script, path);
-	}
-	
-	boolean isMatch(ScriptReference script, IPath path) {
-		if(guessScriptMatches(script, path)) {
-			return true;
-		}
-		//no luck, try an exact match
-		URI sourceURI = script.sourceURI();
-		if (URIUtil.isFileURI(sourceURI)) {
-			IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-			URI workspaceURI = workspaceRoot.getRawLocationURI();			
-			sourceURI = workspaceURI.relativize(sourceURI);
-		}
-		IPath spath = path;
-		if(spath.segmentCount() > 0 && spath.segment(0).equals(Messages.external_javascript_source)) {
-			spath = spath.removeFirstSegments(1).makeAbsolute();
-		}
-		IPath uripath = SourceLookup.getSourcePath(sourceURI);
-		if(uripath != null) {
-			uripath = uripath.makeAbsolute();
-		}
-		return spath.equals(uripath);
-	}
-
-	/**
-	 * Guesses if the paths are considered equal by walking backward from the last segment of the paths and counting the matching segments. 
-	 * The paths are guessed to be equal iff any two or more segments match in order.
-	 * 
-	 * @param script the {@link ScriptReference}
-	 * @param path the path to compare
-	 * @return <code>true</code> if the paths 'match', <code>false</code> otherwise
-	 */
-	boolean guessScriptMatches(ScriptReference script, IPath path) {
-		IPath newpath = path.makeAbsolute();
-		IPath uri = new Path(script.sourceURI().getPath());
-		if(SourceLookup.TOP_LEVEL_PATH.equals(newpath) && SourceLookup.TOP_LEVEL_PATH.equals(uri)) {
-			return true;
-		}
-		uri = uri.makeAbsolute();
-		int matched_segments = 0;
-		int last = uri.segmentCount()-1;
-		for(int i  = newpath.segmentCount()-1; i > -1; i--) {
-			if(last < 0) {
-				break;
-			}
-			if(newpath.segment(i).equals(uri.segment(last))) {
-				matched_segments++;
-				last--;
-			}
-		}
-		return matched_segments > 1;
-	}
-	
-	/**
-	 * Convenience method to consult all of the registered {@link IScriptResolver}s for the matching {@link IFile}.
-	 * <br><br>
-	 * This method will vote on the file to return, and return the {@link IFile} that has the most votes as follows:
-	 * <ul>
-	 * <li>If there is one contributor and it returns an {@link IFile} that one is chosen</li>
-	 * <li>If there is &gt; one contributor the greatest number of matching {@link IFile}s returned is chosen. If there is a tie, the {@link IFile}
-	 * that matches the one selected from the default algorithm will be chosen. In the event the default algorithm returns <code>null</code> the first {@link IFile}
-	 * will be selected.</li>
-	 * <li>If there are no contributors the default algorithm is consulted</li>
-	 * </ul>
-	 * @param script
-	 * @return the matching {@link IFile} or <code>null</code>
-	 */
-	public IFile getFile(ScriptReference script) {
-		IScriptResolver[] resolvers = getResolvers();
-		ArrayList files = new ArrayList();
-		IFile file = null;
-		for (int i = 0; i < resolvers.length; i++) {
-			file = resolvers[i].getFile(script);
-			if(file != null) {
-				if(files.contains(file)) {
-					return file;
-				}
-				files.add(file);
-			}
-		}
-		file = null;
-		IPath p = SourceLookup.getSourcePath(script.sourceURI());
-		IResource res = ResourcesPlugin.getWorkspace().getRoot().findMember(p);
-		if(res != null && res.getType() == IResource.FILE) {
-			file = (IFile) res;
-		}
-		if(files.size() > 0) {
-			if(files.contains(file)) {
-				return file;
-			}
-			return (IFile) files.get(0);
-		}
-		return file;
-	}
-	
-	/**
-	 * Returns the complete listing of {@link IScriptResolver}s or an empty array, never <code>null</code>
-	 * 
-	 * @return the complete listing of {@link IScriptResolver}s
-	 */
-	public IScriptResolver[] getResolvers() {
-		loadResolvers();
-		if(resolvers.size() < 1) {
-			return NO_RESOLVERS;
-		}
-		List res = Arrays.asList(resolvers.getListeners());
-		return (IScriptResolver[]) res.toArray(new IScriptResolver[res.size()]);
-	}
-	
-	/**
-	 * load up all the extension points to the delegate listeners
-	 */
-	void loadResolvers() {
-		if(resolvers == null) {
-			resolvers = new ListenerList();
-			IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(JavaScriptDebugPlugin.PLUGIN_ID, Constants.SCRIPT_RESOLVERS);
-			IConfigurationElement[] elements = extensionPoint.getConfigurationElements();
-			for (int i = 0; i < elements.length; i++) {
-				resolvers.add(new ScriptResolverExtension(elements[i]));
-			}
-		}
-	}
-	
-	/**
-	 * Clean up
-	 */
-	public void dispose() {
-		if(resolvers != null) {
-			resolvers.clear();
-			resolvers = null;
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/ScriptResolverExtension.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/ScriptResolverExtension.java
deleted file mode 100644
index 4d8d0a7..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/ScriptResolverExtension.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.core.model;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.model.IScriptResolver;
-import org.eclipse.wst.jsdt.debug.internal.core.Constants;
-
-/**
- * Default implementation of the delegate class for all {@link IScriptResolver}s
- * 
- * @since 3.4
- */
-public class ScriptResolverExtension implements IScriptResolver {
-
-	private IConfigurationElement element = null;
-	private IScriptResolver delegate = null;
-	
-	/**
-	 * Constructor
-	 * @param element the backing {@link IConfigurationElement} to lazily load and delegate to
-	 */
-	public ScriptResolverExtension(IConfigurationElement element) {
-		this.element = element;
-	}
-	
-	/**
-	 * Returns the delegate {@link IScriptResolver} from the backing {@link IConfigurationElement}
-	 * 
-	 * @return the delegate {@link IScriptResolver}
-	 * @throws CoreException thrown if the delegate class fails to be created
-	 */
-	synchronized IScriptResolver getDelegate() throws CoreException {
-		if(delegate == null) {
-			delegate = (IScriptResolver) element.createExecutableExtension(Constants.CLASS);
-		}
-		return delegate;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IScriptPathResolver#matches(org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference, org.eclipse.core.runtime.IPath)
-	 */
-	public boolean matches(ScriptReference script, IPath path) {
-		try {
-			return getDelegate().matches(script, path);
-		}
-		catch(CoreException ce) {
-			return false;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IScriptPathResolver#getFile(org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference)
-	 */
-	public IFile getFile(ScriptReference script) {
-		try {
-			return getDelegate().getFile(script);
-		}
-		catch(CoreException ce) {
-			return null;
-		}
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/modelmessages.properties b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/modelmessages.properties
deleted file mode 100644
index 4053863..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/modelmessages.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-###############################################################################
-# Copyright (c) 2010, 2011 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-debug_target_name={0} [version - {1}]
-JavaScriptValue_object_value_label={0} (id={1})
-JSDIDebugTarget_jsdi_debug_target=JavaScript Debug Target
-JSDIDebugTarget_not_support_disconnect=JavaScript debug target {0} does not support being disconnected
-JSDIDebugTarget_not_support_terminate=JavaScript debug target {0} does not support being terminated
-JSDIDebugTarget_recieved_unknown_event=Received unknown event: {0}
-JSDIDebugTarget_unsupported_operation=Unsupported Operation
-thread_timed_out_trying_to_suspend=Thread timed out trying to suspend after waiting {0} ms
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.classpath b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.classpath
deleted file mode 100644
index 2fbb7a2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.project b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.project
deleted file mode 100644
index edf6952..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.jsdt.debug.rhino.debugger</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index de9eac3..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,90 +0,0 @@
-#Fri Apr 30 10:04:28 CDT 2010
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
-org.eclipse.jdt.core.compiler.problem.deadCode=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=error
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=error
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=error
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=error
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.settings/org.eclipse.pde.core.prefs b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.settings/org.eclipse.pde.core.prefs
deleted file mode 100644
index b76afaa..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.settings/org.eclipse.pde.core.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Sun Feb 28 13:50:08 EST 2010
-eclipse.preferences.version=1
-pluginProject.extensions=false
-resolve.requirebundle=false
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/META-INF/MANIFEST.MF
deleted file mode 100644
index 8f26cd7..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,16 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Bundle-Name
-Bundle-Vendor: %providerName
-Bundle-SymbolicName: org.eclipse.wst.jsdt.debug.rhino.debugger
-Bundle-Version: 1.0.300.qualifier
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
-Export-Package: org.eclipse.wst.jsdt.debug.internal.rhino.debugger;x-internal:=true,
- org.eclipse.wst.jsdt.debug.internal.rhino.transport;x-friends:="org.eclipse.wst.jsdt.debug.rhino",
- org.eclipse.wst.jsdt.debug.rhino.debugger,
- org.eclipse.wst.jsdt.debug.rhino.debugger.shell
-Import-Package: org.mozilla.javascript;resolution:=optional,
- org.mozilla.javascript.debug;resolution:=optional,
- org.mozilla.javascript.tools;resolution:=optional,
- org.mozilla.javascript.tools.shell;resolution:=optional
-Require-Bundle: org.eclipse.wst.jsdt.debug.transport;bundle-version="1.0.0"
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/OSGI-INF/l10n/bundle.properties b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/OSGI-INF/l10n/bundle.properties
deleted file mode 100644
index 1508f4d..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/OSGI-INF/l10n/bundle.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2010 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-providerName = Eclipse Web Tools Platform
-Bundle-Name = Rhino Debugger
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/about.html b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/about.html
deleted file mode 100755
index b4a1c56..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>March 10, 2010</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
-indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/build.properties b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/build.properties
deleted file mode 100644
index 9710f4f..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/build.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-###############################################################################
-# Copyright (c) 2010, 2011 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               about.html,\
-               OSGI-INF/l10n/bundle.properties,\
-               OSGI-INF/,\
-               OSGI-INF/l10n/
-src.includes = about.html
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/Breakpoint.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/Breakpoint.java
deleted file mode 100644
index 3ebb1bb..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/Breakpoint.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.debugger;
-
-import java.util.HashMap;
-
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-
-
-/**
- * Implementation of a breakpoint wrt Rhino debugging
- * 
- * @since 1.0
- */
-public class Breakpoint {
-
-	final Long breakpointId;
-	final ScriptSource script;
-	final Integer lineNumber;
-	final Object functionName;
-	final String condition;
-	final Long threadId;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param breakpointId the id for the breakpoint
-	 * @param script the script the breakpoint applies to, <code>null</code> is not accepted
-	 * @param lineNumber the line number for the breakpoint
-	 * @param functionName the name of the function the breakpoint is set on, <code>null</code> is accepted
-	 * @param condition the condition for the breakpoint, <code>null</code> is accepted
-	 * @param threadId the id of the thread the breakpoint is for
-	 */
-	public Breakpoint(Long breakpointId, ScriptSource script, Integer lineNumber, String functionName, String condition, Long threadId) {
-		if (script == null) {
-			throw new IllegalArgumentException("The parent script cannot be null"); //$NON-NLS-1$
-		}
-		this.breakpointId = breakpointId;
-		this.script = script;
-		this.lineNumber = lineNumber;
-		this.functionName = functionName;
-		this.condition = condition;
-		this.threadId = threadId;
-	}
-
-	/**
-	 * @return the breakpoint as a JSON entry
-	 */
-	public Object toJSON() {
-		HashMap result = new HashMap();
-		result.put(JSONConstants.BREAKPOINT_ID, breakpointId);
-		result.put(JSONConstants.SCRIPT_ID, script.getId());
-		if (lineNumber != null) {
-			result.put(JSONConstants.LINE, lineNumber);
-		}
-		if (functionName != null) {
-			result.put(JSONConstants.FUNCTION, functionName);
-		}
-		if (condition != null) {
-			result.put(JSONConstants.CONDITION, condition);
-		}
-		if (threadId != null) {
-			result.put(JSONConstants.THREAD_ID, threadId);
-		}
-		return result;
-	}
-
-	/**
-	 * Deletes the breakpoint from the script it is associated with. Does
-	 * not clear any of the handle information so the deleted breakpoint can be 
-	 * returned as an event if required.
-	 */
-	public void delete() {
-		this.script.removeBreakpoint(this);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/ContextData.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/ContextData.java
deleted file mode 100644
index 7a3097a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/ContextData.java
+++ /dev/null
@@ -1,369 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.debugger;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.EventPacket;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-
-/**
- * Rhino implementation of {@link ContextData}
- * 
- * @since 1.0
- */
-public class ContextData {
-	private static final int CONTEXT_RUNNING = 0;
-	private static final int CONTEXT_SUSPENDED = 1;
-
-	private static final int STEP_CONTINUE = 0;
-	private static final int STEP_IN = 1;
-	private static final int STEP_NEXT = 2;
-	private static final int STEP_OUT = 4;
-
-	private final Long threadId;
-	private final Long contextId;
-	private final RhinoDebuggerImpl debugger;
-
-	private final LinkedList frames = new LinkedList();
-
-	private int contextState = CONTEXT_RUNNING;
-	private int stepState = STEP_CONTINUE;
-	private StackFrame stepFrame;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param threadId
-	 * @param contextId
-	 * @param debugger
-	 */
-	public ContextData(Long threadId, Long contextId, RhinoDebuggerImpl debugger) {
-		this.threadId = threadId;
-		this.contextId = contextId;
-		this.debugger = debugger;
-	}
-
-	/**
-	 * Returns the unique id of this context data
-	 * 
-	 * @return the unique id
-	 */
-	public Long getId() {
-		return contextId;
-	}
-
-	/**
-	 * Returns the live list of {@link DebugFrame}s from this context
-	 * 
-	 * @return the live list of {@link DebugFrame}s
-	 */
-	public synchronized List getFrameIds() {
-		List result = new ArrayList();
-		for (Iterator iterator = frames.iterator(); iterator.hasNext();) {
-			result.add(((StackFrame) iterator.next()).getId());
-		}
-		return result;
-	}
-
-	/**
-	 * Returns the {@link DebugFrame} with the given id or <code>null</code> if no such {@link DebugFrame} exists
-	 * 
-	 * @param frameId
-	 * @return the {@link DebugFrame} with the given id or <code>null</code>
-	 */
-	public synchronized StackFrame getFrame(Long frameId) {
-		StackFrame frame = null;
-		for (Iterator iterator = frames.iterator(); iterator.hasNext();) {
-			frame = (StackFrame) iterator.next();
-			if (frame.getId().equals(frameId)) {
-				return frame;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Adds the given frame to the top of the frame stack and sends out a break event as needed
-	 * 
-	 * @param frame
-	 * @param script
-	 * @param lineNumber
-	 * @param functionName
-	 */
-	public synchronized void pushFrame(StackFrame frame, ScriptSource script, Integer lineNumber, String functionName) {
-		frames.addFirst(frame);
-		Breakpoint breakpoint = script.getBreakpoint(lineNumber, functionName);
-		boolean isStepBreak = stepBreak(STEP_IN);
-		if (isStepBreak || breakpoint != null) {
-			if (sendBreakEvent(script, frame.getLineNumber(), functionName, breakpoint, isStepBreak, false)) {
-				suspendState();
-			}
-		}
-	}
-
-	/**
-	 * Returns if the step operation should cause a break
-	 * 
-	 * @param step
-	 * @return true if the operation should break false otherwise
-	 */
-	private boolean stepBreak(int step) {
-		return ((0 != (step & stepState)) && (stepFrame == null || stepFrame == frames.getFirst()));
-	}
-
-	/**
-	 * Suspends the state via {@link #wait()}
-	 */
-	private void suspendState() {
-		contextState = CONTEXT_SUSPENDED;
-		while (contextState == CONTEXT_SUSPENDED) {
-			try {
-				wait();
-			} catch (InterruptedException e) {
-				e.printStackTrace();
-			}
-		}
-	}
-
-	/**
-	 * Removes the first {@link DebugFrame} from the current stack
-	 * 
-	 * @param byThrow
-	 * @param resultOrException
-	 */
-	public synchronized void popFrame(boolean byThrow, Object resultOrException) {
-		if(!frames.isEmpty()) {
-			StackFrame frame = (StackFrame) frames.removeFirst();
-			if (stepFrame == frame) {
-				stepFrame = null;
-				stepState = STEP_OUT;
-			}
-				
-			boolean isStepBreak = stepBreak(STEP_IN | STEP_OUT);
-			if (isStepBreak) {
-				frame = getTopFrame();
-				if (frame != null && sendBreakEvent(frame.getScript(), frame.getLineNumber(), null, null, isStepBreak, false)) {
-					suspendState();
-				}
-			}
-		}
-	}
-
-	/**
-	 * Resume the state with the given step type
-	 * 
-	 * @param stepType
-	 */
-	public synchronized void resume(String stepType) {
-		try {
-			if (stepType == null) {
-				stepState = STEP_CONTINUE;
-				stepFrame = null;
-			} else if (stepType.equals(JSONConstants.STEP_IN)) {
-				stepState = STEP_IN;
-				stepFrame = null;
-			} else if (stepType.equals(JSONConstants.STEP_NEXT)) {
-				stepState = STEP_NEXT;
-				stepFrame = getTopFrame();
-			} else if (stepType.equals(JSONConstants.STEP_OUT)) {
-				if (frames.size() > 1) {
-					stepState = STEP_OUT;
-					stepFrame = (StackFrame) frames.get(1);
-				} else {
-					stepState = STEP_CONTINUE;
-					stepFrame = null;
-				}
-			} else if (stepType.equals(JSONConstants.STEP_ANY)) {
-				stepState = STEP_IN | STEP_OUT | STEP_NEXT;
-				stepFrame = null;
-			} else {
-				throw new IllegalStateException("bad stepType: " + stepType); //$NON-NLS-1$
-			}
-		}
-		finally {
-			contextState = CONTEXT_RUNNING;
-			notifyAll();
-		}
-	}
-
-	/**
-	 * Returns the top stack frame iff there are frames.
-	 * Delegate method to prevent {@link NoSuchElementException}s
-	 * 
-	 * @return the top frame or <code>null</code>
-	 */
-	private StackFrame getTopFrame() {
-		if(this.frames != null && !this.frames.isEmpty()) {
-			return (StackFrame) this.frames.getFirst();
-		}
-		return null;
-	}
-	
-	/**
-	 * Set the step state to the suspend equivalent
-	 */
-	public synchronized void suspend() {
-		stepState = STEP_IN | STEP_NEXT | STEP_OUT;
-		stepFrame = null;
-	}
-
-	/**
-	 * Handles a <code>debugger;</code> statement
-	 * 
-	 * @param script
-	 * @param lineNumber
-	 */
-	public synchronized void debuggerStatement(ScriptSource script, Integer lineNumber) {
-		Breakpoint breakpoint = script.getBreakpoint(lineNumber, null);
-		boolean isStepBreak = stepBreak(STEP_IN | STEP_NEXT);
-		if (sendBreakEvent(script, lineNumber, null, breakpoint, isStepBreak, true)) {
-			suspendState();
-		}
-	}
-
-	/**
-	 * Handles a line change
-	 * 
-	 * @param script
-	 * @param lineNumber
-	 */
-	public synchronized void lineChange(ScriptSource script, Integer lineNumber) {
-		Breakpoint breakpoint = script.getBreakpoint(lineNumber, null);
-		boolean isStepBreak = stepBreak(STEP_IN | STEP_NEXT);
-		if (isStepBreak || breakpoint != null) {
-			if (sendBreakEvent(script, lineNumber, null, breakpoint, isStepBreak, false)) {
-				suspendState();
-			}
-		}
-	}
-
-	/**
-	 * Handles forwarding an exception event
-	 * 
-	 * @param ex
-	 */
-	public synchronized void exceptionThrown(Throwable ex) {
-		StackFrame frame = getTopFrame();
-		if (sendExceptionEvent(frame.getScript(), frame.getLineNumber(), ex)) {
-			suspendState();
-		}
-	}
-
-	/**
-	 * Sends a JSON message for an exception that has occurred
-	 * 
-	 * @param script
-	 * @param lineNumber
-	 * @param ex
-	 * @return true if the message was sent successfully, false otherwise
-	 */
-	private boolean sendExceptionEvent(ScriptSource script, Integer lineNumber, Throwable ex) {
-		EventPacket exceptionEvent = new EventPacket(JSONConstants.EXCEPTION);
-		Map body = exceptionEvent.getBody();
-		body.put(JSONConstants.CONTEXT_ID, contextId);
-		body.put(JSONConstants.THREAD_ID, threadId);
-		body.put(JSONConstants.SCRIPT_ID, script.getId());
-		body.put(JSONConstants.LINE, lineNumber);
-		body.put(JSONConstants.MESSAGE, ex.getMessage());
-		return debugger.sendEvent(exceptionEvent);
-	}
-
-	/**
-	 * Sends a JSON message for a break event
-	 * 
-	 * @param script
-	 * @param lineNumber
-	 * @param functionName
-	 * @param breakpoint
-	 * @param isStepBreak
-	 * @param isDebuggerStatement
-	 * @return true if the message was sent successfully, false otherwise
-	 */
-	private boolean sendBreakEvent(ScriptSource script, Integer lineNumber, String functionName, Breakpoint breakpoint, boolean isStepBreak, boolean isDebuggerStatement) {
-		EventPacket breakEvent = new EventPacket(JSONConstants.BREAK);
-		Map body = breakEvent.getBody();
-		body.put(JSONConstants.THREAD_ID, threadId);
-		body.put(JSONConstants.CONTEXT_ID, contextId);
-		body.put(JSONConstants.SCRIPT_ID, script.getId());
-		if (functionName != null) {
-			body.put(JSONConstants.FUNCTION_NAME, functionName);
-		}
-		body.put(JSONConstants.LINE, lineNumber);
-		if (breakpoint != null) {
-			body.put(JSONConstants.BREAKPOINT, breakpoint.breakpointId);
-		}
-
-		if (isStepBreak) {
-			String stepType;
-			if (stepState == STEP_IN) {
-				stepType = JSONConstants.STEP_IN;
-			} else if (stepState == STEP_NEXT) {
-				stepType = JSONConstants.STEP_NEXT;
-			} else if (stepState == STEP_OUT) {
-				stepType = JSONConstants.STEP_OUT;
-			} else {
-				stepType = JSONConstants.SUSPEND;
-			}
-			body.put(JSONConstants.STEP, stepType);
-			stepState = 0;
-		}
-
-		body.put(JSONConstants.DEBUGGER_STATEMENT, Boolean.valueOf(isDebuggerStatement));
-		return debugger.sendEvent(breakEvent);
-	}
-
-	/**
-	 * Handles a script load event
-	 * 
-	 * @param script
-	 */
-	public synchronized void scriptLoaded(ScriptSource script) {
-		if (sendScriptEvent(script)) {
-			suspendState();
-		}
-	}
-
-	/**
-	 * Send a JSON message for a script event
-	 * 
-	 * @param script
-	 * @return
-	 */
-	private boolean sendScriptEvent(ScriptSource script) {
-		EventPacket scriptEvent = new EventPacket(JSONConstants.SCRIPT);
-		Map body = scriptEvent.getBody();
-		body.put(JSONConstants.THREAD_ID, threadId);
-		body.put(JSONConstants.CONTEXT_ID, contextId);
-		body.put(JSONConstants.SCRIPT_ID, script.getId());
-		return debugger.sendEvent(scriptEvent);
-	}
-
-	/**
-	 * Returns the string representation of the state
-	 * 
-	 * @return the state text
-	 */
-	public synchronized String getState() {
-		return contextState == CONTEXT_RUNNING ? JSONConstants.RUNNING : JSONConstants.SUSPENDED;
-	}
-
-	/**
-	 * Returns the underlying thread id
-	 * 
-	 * @return the underlying thread id
-	 */
-	public Long getThreadId() {
-		return threadId;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/DebugSessionManager.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/DebugSessionManager.java
deleted file mode 100644
index 61fdd0b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/DebugSessionManager.java
+++ /dev/null
@@ -1,290 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.debugger;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.EventPacket;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoResponse;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoTransportService;
-import org.eclipse.wst.jsdt.debug.transport.Connection;
-import org.eclipse.wst.jsdt.debug.transport.DebugSession;
-import org.eclipse.wst.jsdt.debug.transport.ListenerKey;
-import org.eclipse.wst.jsdt.debug.transport.TransportService;
-import org.eclipse.wst.jsdt.debug.transport.exception.DisconnectedException;
-import org.eclipse.wst.jsdt.debug.transport.exception.TimeoutException;
-
-/**
- * Delegate for {@link DebugSession} communication
- * 
- * @since 1.1
- */
-public class DebugSessionManager {
-
-	public class DebugSessionThread extends Thread {
-
-		private ListenerKey listenerKey;
-		private Connection connection;
-		private RequestHandler requestHandler;
-
-		public DebugSessionThread(String name, RhinoDebuggerImpl debugger) {
-			super(name);
-			requestHandler = new RequestHandler(debugger);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see java.lang.Runnable#run()
-		 */
-		public void run() {
-			try {
-				listenerKey = transportService.startListening(address);
-				while (!shutdown) {
-					try {
-						acceptConnection(10000);
-					} catch (IOException e) {
-						if (connection == null) {
-							continue;
-						}
-					}
-					while (!shutdown && connection.isOpen()) {
-						try {
-							RhinoRequest request = (RhinoRequest) debugSession.receive(JSONConstants.REQUEST, 1000);
-							if (DEBUG)
-								System.out.println(request);
-							RhinoResponse response = requestHandler.handleRequest(request);
-							if (DEBUG)
-								System.out.println(response);
-							debugSession.send(response);
-						} catch (TimeoutException e) {
-							// ignore
-						} catch (DisconnectedException e) {
-							break;
-						}
-					}
-					closeConnection();
-				}
-			} catch (IOException e) {
-				sendDeathEvent();
-			} finally {
-				try {
-					if (listenerKey != null)
-						transportService.stopListening(listenerKey);
-				} catch (IOException e) {
-					sendDeathEvent();
-				}
-			}
-		}
-
-		/**
-		 * Close the active connection
-		 * 
-		 * @throws IOException
-		 */
-		private void closeConnection() throws IOException {
-			if (connection != null) {
-				setDebugSession(null);
-				connection.close();
-				connection = null;
-			}
-		}
-
-		/**
-		 * Waits for a connection for the given timeout
-		 * 
-		 * @param timeout
-		 * @throws IOException
-		 */
-		private void acceptConnection(long timeout) throws IOException {
-			if (connection == null) {
-				connection = transportService.accept(listenerKey, timeout, timeout);
-				setDebugSession(new DebugSession(connection));
-			}
-		}
-
-	}
-
-	private static boolean DEBUG = false;
-	
-	private static final String ADDRESS = "address"; //$NON-NLS-1$
-	private static final String SOCKET = "socket"; //$NON-NLS-1$
-	private static final String TRANSPORT = "transport"; //$NON-NLS-1$
-
-	private final TransportService transportService;
-	private final String address;
-	private final boolean startSuspended;
-
-	private DebugSession debugSession;
-	private Thread debuggerThread;
-	private volatile boolean shutdown = false;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param transportService
-	 * @param address
-	 * @param startSuspended
-	 */
-	public DebugSessionManager(TransportService transportService, String address, boolean startSuspended, boolean debug) {
-		this.transportService = transportService;
-		this.address = address;
-		this.startSuspended = startSuspended;
-		DEBUG = debug;
-	}
-
-	/**
-	 * Creates a new session manager
-	 * 
-	 * @param configString
-	 * @return
-	 */
-	static DebugSessionManager create(String configString) {
-		Map config = parseConfigString(configString);
-		String transport = (String) config.get(TRANSPORT);
-		if (!SOCKET.equals(transport)) {
-			throw new IllegalArgumentException("Transport service must be 'socket': " + transport); //$NON-NLS-1$
-		}
-		TransportService parsedTransportService = new RhinoTransportService();
-		String parsedAddress = (String) config.get(ADDRESS);
-		String suspend = (String) config.get(JSONConstants.SUSPEND);
-		boolean parsedStartSuspended = false;
-		if (suspend != null) {
-			parsedStartSuspended = (Boolean.valueOf(suspend).booleanValue() || suspend.trim().equalsIgnoreCase("y")); //$NON-NLS-1$
-		}
-		String debug = (String) config.get("trace"); //$NON-NLS-1$
-		boolean debugging = false;
-		if(debug != null) {
-			debugging = (Boolean.valueOf(debug).booleanValue() || debug.trim().equalsIgnoreCase("y")); //$NON-NLS-1$
-		}
-		return new DebugSessionManager(parsedTransportService, parsedAddress, parsedStartSuspended, debugging);
-	}
-
-	/**
-	 * Parses the command line configuration string
-	 * 
-	 * @param configString
-	 * @return the map of command line arguments
-	 */
-	private static Map parseConfigString(String configString) {
-		Map config = new HashMap();
-		StringTokenizer tokenizer = new StringTokenizer(configString, ","); //$NON-NLS-1$
-		while (tokenizer.hasMoreTokens()) {
-			String token = tokenizer.nextToken();
-			int equalsIndex = token.indexOf('=');
-			if (equalsIndex == -1)
-				config.put(token, null);
-			else
-				config.put(token.substring(0, equalsIndex), token.substring(equalsIndex + 1));
-		}
-		return config;
-	}
-
-	/**
-	 * @return true if the <code>suspend=true</code> command line argument is
-	 *         set
-	 */
-	public boolean isStartSuspended() {
-		return startSuspended;
-	}
-
-	/**
-	 * Returns if a {@link DebugSession} has successfully connected to this
-	 * debugger.
-	 * 
-	 * @return <code>true</code> if the debugger has a connected
-	 *         {@link DebugSession} <code>false</code> otherwise
-	 */
-	public synchronized boolean isConnected() {
-		return debugSession != null;
-	}
-
-	/**
-	 * Starts the debugger
-	 */
-	public synchronized void start(RhinoDebuggerImpl debugger) {
-		debuggerThread = new DebugSessionThread("RhinoDebugger - RhinoRequest Handler", debugger); //$NON-NLS-1$
-		debuggerThread.start();
-		if (startSuspended) {
-			try {
-				wait(300000);
-			} catch (InterruptedException e) {
-				/* e.printStackTrace(); */
-			}
-			// TODO: We might want to check if debugSession is null and if so
-			// call "stop" and throw an exception
-		}
-	}
-
-	/**
-	 * Stops the debugger
-	 */
-	public synchronized void stop() {
-		shutdown = true;
-		try {
-			debuggerThread.interrupt();
-			while(debuggerThread.isAlive()) {
-				wait(1000);
-			}
-			debuggerThread.join();
-		} catch (InterruptedException e) {
-			/* e.printStackTrace(); */
-		}
-	}
-
-	private synchronized void setDebugSession(DebugSession session) {
-		if (debugSession != session) {
-			if (debugSession != null) {
-				debugSession.dispose();
-			}
-			debugSession = session;
-			notify();
-		}
-	}
-
-	/**
-	 * Sends the given {@link EventPacket} using the underlying
-	 * {@link DebugRuntime} and returns if it was sent successfully
-	 * 
-	 * @param event
-	 * @return true if the event was sent successfully, false otherwise
-	 */
-	public synchronized boolean sendEvent(EventPacket event) {
-		try {
-			if (debugSession != null) {
-				if (DEBUG) {
-					System.out.println(event);
-				}
-				debugSession.send(event);
-				return true;
-			}
-		} catch (DisconnectedException e) {
-			e.printStackTrace();
-		}
-		return false;
-	}
-
-	/**
-	 * Sends out an event that the debugger has died in an unexpected way.
-	 * Debugger death can result from:
-	 * <ul>
-	 * <li>an {@link IOException} while the debugger is running</li>
-	 * <li>an {@link InterruptedException} processing I/O</li>
-	 * </ul>
-	 */
-	private void sendDeathEvent() {
-		EventPacket event = new EventPacket(JSONConstants.VMDEATH);
-		sendEvent(event);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/FunctionSource.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/FunctionSource.java
deleted file mode 100644
index 2f207199..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/FunctionSource.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.debugger;
-
-
-/**
- * Handle for a {@link DebuggableScript} function
- * 
- * @since 1.0
- */
-public class FunctionSource {
-	
-	final ScriptSource parent;
-	final String name;
-	String source;
-	final int linenumber;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param script the parent - cannot be <code>null</code>
-	 * @param name the name of the function - can be <code>null</code>
-	 * @param source the underlying source for the function - can be <code>null</code>
-	 */
-	public FunctionSource(ScriptSource script, String name, String source, int linenumber) {
-		if(script == null) {
-			throw new IllegalArgumentException("The parent script cannot be null"); //$NON-NLS-1$
-		}
-		this.parent = script;
-		this.name = name;
-		this.source = source;
-		this.linenumber = linenumber;
-	}
-
-	/**
-	 * @return the parent {@link ScriptSource} this function appears in
-	 */
-	public ScriptSource parent() {
-		return this.parent;
-	}
-	
-	/**
-	 * @return the name of the function
-	 */
-	public String name() {
-		return this.name; 
-	}
-	
-	/**
-	 * @return the source for the function
-	 */
-	public String source() {
-		return this.source;
-	}
-	
-	/**
-	 * Sets the underlying source to the given string
-	 * 
-	 * @param source the new source
-	 */
-	public void setSource(String source) {
-		this.source = source;
-	}
-	
-	/**
-	 * @return the line number this function appears on
-	 */
-	public int linenumber() {
-		return this.linenumber;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("FunctionSource: [name - ").append(this.name).append("] [linenumber - ").append(linenumber).append("]\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		buffer.append("\tparent: ").append(parent.getLocation()); //$NON-NLS-1$
-		buffer.append("\tsource: ").append(this.source).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/LineData.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/LineData.java
deleted file mode 100644
index 1e81c5d..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/LineData.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.debugger;
-
-/**
- * Class to hold information about a given line such as:
- * <ul>
- * <li>FunctionSource at the line</li>
- * <li>Breakpoint set on the line</li>
- * </ul>
- * @since 1.0
- */
-public class LineData {
-
-	Breakpoint breakpoint = null;
-	FunctionSource function = null;
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/RequestHandler.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/RequestHandler.java
deleted file mode 100644
index 417c843..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/RequestHandler.java
+++ /dev/null
@@ -1,454 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.debugger;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoResponse;
-
-/**
- * Rhino request handler used to craft response bodies for given JSON requests
- * 
- * @since 1.0
- */
-public class RequestHandler {
-
-	public static final String VERSION_1_6 = "1.6"; //$NON-NLS-1$
-	private RhinoDebuggerImpl debugger;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param debugger
-	 */
-	public RequestHandler(RhinoDebuggerImpl debugger) {
-		this.debugger = debugger;
-	}
-
-	/**
-	 * Handles a general request - delegating to the correct command type
-	 * 
-	 * @param request
-	 * @return
-	 */
-	public RhinoResponse handleRequest(RhinoRequest request) {
-		String command = request.getCommand();
-		RhinoResponse response = new RhinoResponse(request.getSequence(), command);
-		try {
-			if (command.equals(JSONConstants.VERSION)) {
-				handleVersionRequest(request, response);
-			} else if (command.equals(JSONConstants.SUSPEND)) {
-				handleSuspendRequest(request, response);
-			} else if (command.equals(JSONConstants.CONTINUE)) {
-				handleContinueRequest(request, response);
-			} else if (command.equals(JSONConstants.DISPOSE)) {
-				handleDisposeRequest(request, response);
-			} else if (command.equals(JSONConstants.THREADS)) {
-				handleThreadsRequest(request, response);
-			} else if (command.equals(JSONConstants.THREAD)) {
-				handleThreadRequest(request, response);
-			} else if (command.equals(JSONConstants.FRAMES)) {
-				handleFramesRequest(request, response);
-			} else if (command.equals(JSONConstants.FRAME)) {
-				handleFrameRequest(request, response);
-			} else if (command.equals(JSONConstants.SCRIPTS)) {
-				handleScriptsRequest(request, response);
-			} else if (command.equals(JSONConstants.SCRIPT)) {
-				handleScriptRequest(request, response);
-			} else if (command.equals(JSONConstants.EVALUATE)) {
-				handleEvaluateRequest(request, response);
-			} else if (command.equals(JSONConstants.LOOKUP)) {
-				handleLookupRequest(request, response);
-			} else if (command.equals(JSONConstants.BREAKPOINTS)) {
-				handleBreakpointsRequest(request, response);
-			} else if (command.equals(JSONConstants.BREAKPOINT)) {
-				handleBreakpointRequest(request, response);
-			} else if (command.equals(JSONConstants.SETBREAKPOINT)) {
-				handleSetBreakpointRequest(request, response);
-			} else if (command.equals(JSONConstants.CLEARBREAKPOINT)) {
-				handleClearBreakpointRequest(request, response);
-			} else {
-				response.setSuccess(false);
-				response.setMessage("command not supported"); //$NON-NLS-1$
-			}
-		} catch (Throwable t) {
-			response.setSuccess(false);
-			response.setMessage(t.getClass().getName() + " - " + t.getMessage()); //$NON-NLS-1$
-			t.printStackTrace();
-		}
-		return response;
-	}
-
-	/**
-	 * Handles a clear breakpoint request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleClearBreakpointRequest(RhinoRequest request, RhinoResponse response) {
-		Map arguments = request.getArguments();
-		Long breakpointId = numberToLong((Number) arguments.get(JSONConstants.BREAKPOINT_ID));
-		if (breakpointId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.BREAKPOINT_ID));
-			return;
-		}
-		Breakpoint breakpoint = debugger.clearBreakpoint(breakpointId);
-		if (breakpoint == null) {
-			response.setSuccess(false);
-			response.setMessage(JSONConstants.NOT_FOUND);
-			return;
-		}
-		response.getBody().put(JSONConstants.BREAKPOINT, breakpoint.toJSON());
-	}
-
-	/**
-	 * Handles a set breakpoint request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleSetBreakpointRequest(RhinoRequest request, RhinoResponse response) {
-		Map arguments = request.getArguments();
-		Long scriptId = numberToLong((Number) arguments.get(JSONConstants.SCRIPT_ID));
-		Integer line = numberToInteger((Number) arguments.get(JSONConstants.LINE));
-		String function = (String) arguments.get(JSONConstants.FUNCTION);
-		Long threadId = numberToLong((Number) arguments.get(JSONConstants.THREAD_ID));
-		String condition = (String) arguments.get(JSONConstants.CONDITION);
-		Breakpoint breakpoint = debugger.setBreakpoint(scriptId, line, function, condition, threadId);
-		if(breakpoint != null) {
-			response.getBody().put(JSONConstants.BREAKPOINT, breakpoint.toJSON());
-		}
-	}
-
-	/**
-	 * Handles a breakpoint request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleBreakpointRequest(RhinoRequest request, RhinoResponse response) {
-		Map arguments = request.getArguments();
-		Long breakpointId = numberToLong((Number) arguments.get(JSONConstants.BREAKPOINT_ID));
-		if (breakpointId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.BREAKPOINT_ID));
-			return;
-		}
-		Breakpoint breakpoint = debugger.getBreakpoint(breakpointId);
-		if (breakpoint == null) {
-			response.setSuccess(false);
-			response.setMessage(JSONConstants.NOT_FOUND);
-			return;
-		}
-		response.getBody().put(JSONConstants.BREAKPOINT, breakpoint.toJSON());
-	}
-
-	/**
-	 * Handles a breakpoints request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleBreakpointsRequest(RhinoRequest request, RhinoResponse response) {
-		Collection breakpoints = debugger.getBreakpoints();
-		response.getBody().put(JSONConstants.BREAKPOINTS, breakpoints);
-	}
-
-	/**
-	 * Handles an evaluate request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleEvaluateRequest(RhinoRequest request, RhinoResponse response) {
-		Map arguments = request.getArguments();
-		Long threadId = numberToLong((Number) arguments.get(JSONConstants.THREAD_ID));
-		if (threadId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.THREAD_ID));
-			return;
-		}
-		Long frameId = numberToLong((Number) arguments.get(JSONConstants.FRAME_ID));
-		if (frameId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.FRAME_ID));
-			return;
-		}
-		String evaluate = (String) arguments.get(JSONConstants.EXPRESSION);
-		if (evaluate == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.EXPRESSION));
-			return;
-		}
-		StackFrame frame = debugger.getFrame(threadId, frameId);
-		if (frame == null) {
-			response.setSuccess(false);
-			response.setMessage(JSONConstants.NOT_FOUND);
-			return;
-		}
-		Object result = frame.evaluate(evaluate);
-		response.getBody().put(JSONConstants.EVALUATE, result);
-	}
-
-	/**
-	 * Handles a lookup request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleLookupRequest(RhinoRequest request, RhinoResponse response) {
-		Map arguments = request.getArguments();
-		Long threadId = numberToLong((Number) arguments.get(JSONConstants.THREAD_ID));
-		if (threadId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.THREAD_ID));
-			return;
-		}
-		Long frameId = numberToLong((Number) arguments.get(JSONConstants.FRAME_ID));
-		if (frameId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.FRAME_ID));
-			return;
-		}
-		Long handle = numberToLong((Number) arguments.get(JSONConstants.REF));
-		if (handle == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.REF));
-			return;
-		}
-		StackFrame frame = debugger.getFrame(threadId, frameId);
-		if (frame == null) {
-			response.setSuccess(false);
-			response.setMessage(JSONConstants.NOT_FOUND);
-			return;
-		}
-		Object result = frame.lookup(handle);
-		response.getBody().put(JSONConstants.LOOKUP, result);
-	}
-
-	/**
-	 * Handles a script request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleScriptRequest(RhinoRequest request, RhinoResponse response) {
-		Map arguments = request.getArguments();
-		Long scriptId = numberToLong((Number) arguments.get(JSONConstants.SCRIPT_ID));
-		if (scriptId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.SCRIPT_ID));
-			return;
-		}
-		ScriptSource script = debugger.getScript(scriptId);
-		if (script == null) {
-			response.setSuccess(false);
-			response.setMessage(JSONConstants.NOT_FOUND);
-			return;
-		}
-		response.getBody().put(JSONConstants.SCRIPT, script.toJSON());
-	}
-
-	/**
-	 * Handles a scripts request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleScriptsRequest(RhinoRequest request, RhinoResponse response) {
-		List scriptIds = debugger.getScriptIds();
-		response.getBody().put(JSONConstants.SCRIPTS, scriptIds);
-	}
-
-	/**
-	 * Handles a frame request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleFrameRequest(RhinoRequest request, RhinoResponse response) {
-		Map arguments = request.getArguments();
-		Long threadId = numberToLong((Number) arguments.get(JSONConstants.THREAD_ID));
-		if (threadId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.THREAD_ID));
-			return;
-		}
-		Long frameId = numberToLong((Number) arguments.get(JSONConstants.FRAME_ID));
-		if (frameId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.FRAME_ID));
-			return;
-		}
-		StackFrame frame = debugger.getFrame(threadId, frameId);
-		if (frame == null) {
-			response.setSuccess(false);
-			response.setMessage(JSONConstants.NOT_FOUND);
-			return;
-		}
-		response.getBody().put(JSONConstants.FRAME, frame.toJSON());
-	}
-
-	/**
-	 * Handles a frames request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleFramesRequest(RhinoRequest request, RhinoResponse response) {
-		Map arguments = request.getArguments();
-		Long threadId = numberToLong((Number) arguments.get(JSONConstants.THREAD_ID));
-		if (threadId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.THREAD_ID));
-			return;
-		}
-		List frameIds = debugger.getFrameIds(threadId);
-		response.getBody().put(JSONConstants.FRAMES, frameIds);
-	}
-
-	/**
-	 * Handles a thread request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleThreadRequest(RhinoRequest request, RhinoResponse response) {
-		Map arguments = request.getArguments();
-		Long threadId = numberToLong((Number) arguments.get(JSONConstants.THREAD_ID));
-		if (threadId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.THREAD_ID));
-			return;
-		}
-		ThreadData threadData = debugger.getThreadData(threadId);
-		if (threadData == null) {
-			response.setSuccess(false);
-			response.setMessage(JSONConstants.NOT_FOUND);
-			return;
-		}
-		response.getBody().put(JSONConstants.THREAD, threadData.toJSON());
-	}
-
-	/**
-	 * Reports a missing argument
-	 * 
-	 * @param key
-	 * @return
-	 */
-	private String missingArgument(String key) {
-		// TODO NLS this
-		return "Missing Argument: "+key; //$NON-NLS-1$
-	}
-
-	/**
-	 * Handles a threads request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleThreadsRequest(RhinoRequest request, RhinoResponse response) {
-		List threadIds = debugger.getThreadIds();
-		response.getBody().put(JSONConstants.THREADS, threadIds);
-	}
-
-	/**
-	 * Handles a dispose request by disconnecting the underlying {@link RhinoDebuggerImpl}
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleDisposeRequest(RhinoRequest request, RhinoResponse response) {
-		debugger.disconnect();
-	}
-
-	/**
-	 * Handles a continue request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleContinueRequest(RhinoRequest request, RhinoResponse response) {
-		Map arguments = request.getArguments();
-		Long threadId = numberToLong((Number) arguments.get(JSONConstants.THREAD_ID));
-		if (threadId == null) {
-			debugger.resumeAll();
-			return;
-		}
-		String stepType = (String) arguments.get(JSONConstants.STEP);
-		debugger.resume(threadId, stepType);
-	}
-
-	/**
-	 * Handles a suspend request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleSuspendRequest(RhinoRequest request, RhinoResponse response) {
-		Map arguments = request.getArguments();
-		Long threadId = numberToLong((Number) arguments.get(JSONConstants.THREAD_ID));
-		if (threadId == null) {
-			debugger.suspendAll();
-			return;
-		}
-		debugger.suspend(threadId);
-	}
-
-	/**
-	 * Wrappers the given {@link Number} as a {@link Long}
-	 * 
-	 * @param number
-	 * @return a new {@link Long}
-	 */
-	private static Long numberToLong(Number number) {
-		if (number == null)
-			return null;
-		return new Long(number.longValue());
-	}
-
-	/**
-	 * Wrappers the given {@link Number} as an {@link Integer}
-	 * 
-	 * @param number
-	 * @return a new {@link Integer}
-	 */
-	private Integer numberToInteger(Number number) {
-		if (number == null) {
-			return null;
-		}
-		return new Integer(number.intValue());
-	}
-
-	/**
-	 * Appends version infos to the given response body
-	 * 
-	 * @param request
-	 * @param response
-	 * 
-	 * @see JSONConstants#ECMASCRIPT_VERSION
-	 * @see JSONConstants#JAVASCRIPT_VERSION
-	 * @see JSONConstants#VM_NAME
-	 * @see JSONConstants#VM_VENDOR
-	 * @see JSONConstants#VM_VERSION
-	 */
-	private void handleVersionRequest(RhinoRequest request, RhinoResponse response) {
-		Map body = response.getBody();
-		body.put(JSONConstants.JAVASCRIPT_VERSION, VERSION_1_6);
-		body.put(JSONConstants.ECMASCRIPT_VERSION, "3"); //$NON-NLS-1$
-		body.put(JSONConstants.VM_NAME, "Rhino"); //$NON-NLS-1$
-		body.put(JSONConstants.VM_VERSION, VERSION_1_6);
-		body.put(JSONConstants.VM_VENDOR, "Mozilla"); //$NON-NLS-1$
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/RhinoDebuggerImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/RhinoDebuggerImpl.java
deleted file mode 100644
index d0afacd..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/RhinoDebuggerImpl.java
+++ /dev/null
@@ -1,539 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2011 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.debugger;
-
-import java.io.File;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.EventPacket;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONUtil;
-import org.eclipse.wst.jsdt.debug.transport.TransportService;
-import org.mozilla.javascript.Context;
-import org.mozilla.javascript.ContextFactory;
-import org.mozilla.javascript.debug.DebugFrame;
-import org.mozilla.javascript.debug.DebuggableScript;
-import org.mozilla.javascript.debug.Debugger;
-
-/**
- * Rhino implementation of {@link Debugger}
- * <br><br>
- * Events fired:
- * <ul>
- * <li><b>Thread enter event</b> - when a new context is created see: {@link #contextCreated(Context)}</li>
- * <li><b>Thread exit event</b> - when a context is exited see: {@link #contextReleased(Context)}</li>
- * <li><b>VM death event</b> - if the debugger dies: this event can only be received if the underlying communication channel has not been interrupted</li>
- * </ul>
- * @since 1.0
- */
-public class RhinoDebuggerImpl implements Debugger, ContextFactory.Listener {
-
-	public static final DebuggableScript[] NO_SCRIPTS = new DebuggableScript[0];
-	private static final String RHINO_SCHEME = "rhino"; //$NON-NLS-1$
-	
-	private final Map threadToThreadId = new HashMap();
-	private final Map threadIdToData = new HashMap();
-	private final Map breakpoints = new HashMap();
-
-	private long currentThreadId = 0L;
-	private long currentBreakpointId = 0L;
-	private long currentScriptId = 0L;
-	private ArrayList disabledThreads = new ArrayList();
-
-	/**
-	 * Mapping of the URI string to the {@link ScriptSource}
-	 */
-	private HashMap/*<String, ScriptSource>*/ uriToScript = new HashMap();
-	/**
-	 * Mapping of the id to the {@link ScriptSource}
-	 */
-	private HashMap/*<Long, ScriptSource>*/ idToScript = new HashMap();
-
-	private final DebugSessionManager sessionManager;
-	
-	/**
-	 * This constructor will only accept a <code>transport</code> argument
-	 * of <code>socket</code>. I.e. <code>transport=socket</code>.<br><br>
-	 * 
-	 * To use a differing {@link TransportService} pleas use the other constructor:
-	 * {@link #RhinoDebugger(TransportService, String, boolean)}
-	 * 
-	 * @param configString the configuration string, for example: <code>transport=socket,suspend=y,address=9000</code>
-	 */
-	public RhinoDebuggerImpl(String configString) {
-		sessionManager = DebugSessionManager.create(configString);
-	}
-	
-	/**
-	 * This constructor allows you to specify a custom {@link TransportService} to use other than <code>socket</code>.
-	 * 
-	 * @param transportService the {@link TransportService} to use for debugger communication
-	 * @param address the address to communicate on
-	 * @param startSuspended if the debugger should wait while accepting a connection. The wait time for stating suspended is not indefinite,
-	 * @param trace if the debugger should be in tracing mode, reporting debug statements to the console 
-	 * and is equal to 300000ms.
-	 */
-	public RhinoDebuggerImpl(TransportService transportService, String address, boolean startSuspended, boolean trace) {
-		sessionManager = new DebugSessionManager( transportService,  address,  startSuspended, trace);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.mozilla.javascript.debug.Debugger#getFrame(org.mozilla.javascript.Context, org.mozilla.javascript.debug.DebuggableScript)
-	 */
-	public synchronized DebugFrame getFrame(Context context, DebuggableScript debuggableScript) {
-		ScriptSource script = getScript(debuggableScript);
-		if(script != null && !script.isStdIn()) {
-			ContextData contextData = (ContextData) context.getDebuggerContextData();
-			ThreadData thread = (ThreadData) threadIdToData.get(contextData.getThreadId());
-			FunctionSource function = script.getFunction(debuggableScript);
-			return thread.getFrame(context, function, script);
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns the root {@link ScriptSource} context
-	 * 
-	 * @param script
-	 * @return the root {@link ScriptSource} context
-	 */
-	private ScriptSource getScript(DebuggableScript script) {
-		synchronized (uriToScript) {
-			DebuggableScript root = script;
-			while (!root.isTopLevel()) {
-				root = root.getParent();
-			}
-			URI uri = getSourceUri(root, parseSourceProperties(root.getSourceName()));
-			if(uri != null) {
-				return (ScriptSource) uriToScript.get(uri);
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.mozilla.javascript.debug.Debugger#handleCompilationDone(org.mozilla.javascript.Context, org.mozilla.javascript.debug.DebuggableScript, java.lang.String)
-	 */
-	public void handleCompilationDone(Context context, DebuggableScript script, String source) {
-		if (!script.isTopLevel()) {
-			return;
-		}
-		Map properties = parseSourceProperties(script.getSourceName());
-		URI uri = getSourceUri(script, properties);
-		if(uri == null) {
-			//if the source cannot be located don't load or notify
-			return;
-		}
-		final ScriptSource newscript = new ScriptSource(script, source, uri, script.isGeneratedScript(), properties);
-		synchronized (uriToScript) {
-			ScriptSource old = (ScriptSource) uriToScript.remove(uri);
-			Long id = null;
-			if(old != null) {
-				//recycle the id for a re-loaded script
-				//https://bugs.eclipse.org/bugs/show_bug.cgi?id=306832
-				id = old.getId();
-				idToScript.remove(id);
-				newscript.setId(id);
-				//clean up the cache of breakpoints
-				old.clearBreakpoints(this);
-			}
-			else {
-				//a totally new script is loaded
-				id = scriptId();
-				newscript.setId(id);
-			}
-			uriToScript.put(uri, newscript);
-			idToScript.put(id, newscript);
-		}
-		ContextData contextData = (ContextData) context.getDebuggerContextData();
-		contextData.scriptLoaded(newscript);
-	}
-
-	/**
-	 * Composes a {@link URI} representing the path to the source of the given script
-	 * 
-	 * @param script the script to create a {@link URI} for
-	 * @param properties any special properties @see {@link #parseSourceProperties(String)}
-	 * @return the {@link URI} for the source or <code>null</code>
-	 */
-	private URI getSourceUri(DebuggableScript script, Map properties) {
-			String sourceName = script.getSourceName();
-			if(properties != null) {
-				String jsonName = (String) properties.get(JSONConstants.NAME);
-				if (jsonName != null)
-					sourceName = jsonName;
-			}
-			
-			// handle null sourceName
-			if (sourceName == null)
-				return null;
-			
-			// handle input from the Rhino Shell
-			if (sourceName.equals("<stdin>")) { //$NON-NLS-1$
-				sourceName = "stdin"; //$NON-NLS-1$
-			} 
-			if(sourceName.equals("<command>")) { //$NON-NLS-1$
-				sourceName = "command"; //$NON-NLS-1$
-			}
-			else {	
-				// try to parse it as a file
-				File sourceFile = new File(sourceName);
-				if (sourceFile.exists())
-					return sourceFile.toURI();
-				
-				//try to just create a URI from the name
-				try {
-					return new URI(sourceName);
-				} catch(URISyntaxException e) {
-					//do nothing and fall through
-				}
-			}
-			
-			//fall back to creating a rhino specific URI from the script source name as a path
-			try {
-				if (! (sourceName.charAt(0) == '/'))
-					sourceName = "/" + sourceName; //$NON-NLS-1$
-				return new URI(RHINO_SCHEME, null, sourceName, null);
-			} catch (URISyntaxException e) {
-				return null;
-			}
-	}
-	
-	/**
-	 * Returns any special properties specified in the source name or <code>null</code>
-	 * 
-	 * @param sourceName
-	 * @return any special properties specified in the source name or <code>null</code>
-	 */
-	Map parseSourceProperties(String sourceName) {
-		if (sourceName != null && sourceName.charAt(0) == '{') {
-			try {
-				Object json = JSONUtil.read(sourceName);
-				if (json instanceof Map) {
-					return (Map) json;
-				}
-			} catch (RuntimeException e) {
-				// ignore
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns the next script id to use
-	 * 
-	 * @return the next id
-	 */
-	synchronized Long scriptId() {
-		return new Long(currentScriptId++);
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.mozilla.javascript.ContextFactory.Listener#contextCreated(org.mozilla.javascript.Context)
-	 */
-	public synchronized void contextCreated(Context context) {
-		Thread thread = Thread.currentThread();
-		if (disabledThreads.contains(thread)) {
-			return;
-		}
-		Long threadId = (Long) threadToThreadId.get(thread);
-		if (threadId == null) {
-			threadId = new Long(currentThreadId++);
-			threadToThreadId.put(thread, threadId);
-		}
-		ThreadData threadData = (ThreadData) threadIdToData.get(threadId);
-		if (threadData == null) {
-			threadData = new ThreadData(threadId, this);
-			threadIdToData.put(threadId, threadData);
-			sendThreadEvent(JSONConstants.ENTER, threadId);
-		}
-		threadData.contextCreated(context);
-	}
-
-	/**
-	 * Sends a thread event for the given type
-	 * 
-	 * @param type the type of event to send
-	 * @param threadId the id of the thread the even is for
-	 * 
-	 * @see JSONConstants#ENTER
-	 * @see JSONConstants#EXIT
-	 */
-	private void sendThreadEvent(String type, Long threadId) {
-		EventPacket threadEvent = new EventPacket(JSONConstants.THREAD);
-		Map body = threadEvent.getBody();
-		body.put(JSONConstants.TYPE, type);
-		body.put(JSONConstants.THREAD_ID, threadId);
-		sendEvent(threadEvent);
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.mozilla.javascript.ContextFactory.Listener#contextReleased(org.mozilla.javascript.Context)
-	 */
-	public synchronized void contextReleased(Context context) {
-		Thread thread = Thread.currentThread();
-		if (disabledThreads.contains(thread)) {
-			return;
-		}
-		Long threadId = (Long) threadToThreadId.get(thread);
-		if (threadId == null) {
-			return;
-		}
-		ThreadData threadData = (ThreadData) threadIdToData.get(threadId);
-		threadData.contextReleased(context);
-		if (!threadData.hasContext()) {
-			threadToThreadId.remove(thread);
-			threadIdToData.remove(threadId);
-			sendThreadEvent(JSONConstants.EXIT, threadId);
-		}
-	}
-
-	/**
-	 * Resumes a thread with the given id for the given step type. Has no effect if no such thread exists
-	 * 
-	 * @param threadId
-	 * @param stepType
-	 */
-	public synchronized void resume(Long threadId, String stepType) {
-		ThreadData threadData = (ThreadData) threadIdToData.get(threadId);
-		if (threadData != null) {
-			threadData.resume(stepType);
-		}
-	}
-
-	/**
-	 * Resumes all threads currently in the debugger
-	 */
-	public synchronized void resumeAll() {
-		for (Iterator it = threadIdToData.keySet().iterator(); it.hasNext();) {
-			Long threadId = (Long) it.next();
-			resume(threadId, null);
-		}
-	}
-
-	/**
-	 * Suspend the thread with the given id. Has no effect if no such thread exists
-	 * 
-	 * @param threadId
-	 */
-	public synchronized void suspend(Long threadId) {
-		ThreadData threadData = (ThreadData) threadIdToData.get(threadId);
-		if (threadData != null) {
-			threadData.suspend();
-		}
-	}
-
-	/**
-	 * Suspend all threads currently in the debugger
-	 */
-	public synchronized void suspendAll() {
-		for (Iterator it = threadIdToData.keySet().iterator(); it.hasNext();) {
-			Long threadId = (Long) it.next();
-			suspend(threadId);
-		}
-	}
-
-	/**
-	 * Disconnects the debugger
-	 */
-	public void disconnect() {
-	}
-
-	/**
-	 * Returns all of the stack frame ids for the thread with the given id. Returns an empty list if no such thread exists, never <code>null</code>
-	 * 
-	 * @param threadId
-	 * @return the complete list of stack frame ids from the thread with the given id
-	 */
-	public synchronized List getFrameIds(Long threadId) {
-		ThreadData threadData = (ThreadData) threadIdToData.get(threadId);
-		if (threadData == null) {
-			return Collections.EMPTY_LIST;
-		}
-		return threadData.getFrameIds();
-	}
-
-	/**
-	 * Returns a {@link DebugFrame} with the given id from the thread with the given thread id. Returns <code>null</code> if the no such thread exists with the given id and / or no such {@link DebugFrame} exists with the given id
-	 * 
-	 * @param threadId
-	 * @param frameId
-	 * @return the {@link DebugFrame} with the given id from the thread with the given id
-	 */
-	public synchronized StackFrame getFrame(Long threadId, Long frameId) {
-		ThreadData threadData = (ThreadData) threadIdToData.get(threadId);
-		if (threadData != null) {
-			return threadData.getFrame(frameId);
-		}
-		return null;
-	}
-
-	/**
-	 * @return the ids of all of the scripts currently known to the debugger
-	 */
-	public synchronized List getScriptIds() {
-		return new ArrayList(idToScript.keySet());
-	}
-
-	/**
-	 * Returns the script with the given id or <code>null</code> if no such script exists with the given id
-	 * 
-	 * @param scriptId
-	 * @return the script with the given id or <code>null</code>
-	 */
-	public synchronized ScriptSource getScript(Long scriptId) {
-		return (ScriptSource) idToScript.get(scriptId);
-	}
-
-	/**
-	 * @return the complete collection of breakpoints currently known to the debugger
-	 */
-	public synchronized Collection getBreakpoints() {
-		return breakpoints.keySet();
-	}
-
-	/**
-	 * Creates a breakpoint in the script with the given id and the given breakpoint attributes. 
-	 * Returns the new breakpoint or <code>null</code> if:
-	 * <ul>
-	 * <li>no such script exists with the given id</li>
-	 * <li>the given line number is not a valid line number</li>
-	 * </ul>
-	 * <p>
-	 * If a breakpoint already exists at the given location it is removed and the new breakpoint is set.
-	 * </p>
-	 * @param scriptId
-	 * @param lineNumber
-	 * @param functionName
-	 * @param condition
-	 * @param threadId
-	 * @return the new breakpoint or <code>null</code> if no script exists with the given id
-	 */
-	public synchronized Breakpoint setBreakpoint(Long scriptId, Integer lineNumber, String functionName, String condition, Long threadId) {
-		ScriptSource script = (ScriptSource) idToScript.get(scriptId);
-		if (script == null || !script.isValid(lineNumber, functionName)) {
-			return null;
-		}
-
-		
-		Breakpoint newbreakpoint = new Breakpoint(nextBreakpointId(), script, lineNumber, functionName, condition, threadId);
-		Breakpoint oldbp = script.getBreakpoint(lineNumber, functionName);
-		if(oldbp != null) {
-			breakpoints.remove(oldbp.breakpointId);
-		}
-		breakpoints.put(newbreakpoint.breakpointId, newbreakpoint);
-		script.addBreakpoint(newbreakpoint);
-		return newbreakpoint;
-	}
-
-	/**
-	 * @return the next unique breakpoint id to use
-	 */
-	private synchronized Long nextBreakpointId() {
-		return new Long(currentBreakpointId++);
-	}
-
-	/**
-	 * Clears the breakpoint out of the cache with the given id and returns it. Returns <code>null</code> if no breakpoint exists with the given id.
-	 * 
-	 * @param breakpointId
-	 * @return the removed breakpoint or <code>null</code>
-	 */
-	public synchronized Breakpoint clearBreakpoint(Long breakpointId) {
-		Breakpoint breakpoint = (Breakpoint) breakpoints.remove(breakpointId);
-		if (breakpoint != null) {
-			breakpoint.delete();
-		}
-		return breakpoint;
-	}
-
-	/**
-	 * Sends the given {@link EventPacket} using the underlying {@link DebugRuntime} and returns if it was sent successfully
-	 * 
-	 * @param event
-	 * @return true if the event was sent successfully, false otherwise
-	 */
-	public boolean sendEvent(EventPacket event) {
-		return sessionManager.sendEvent(event);
-	}
-
-	/**
-	 * Gets a breakpoint with the given id, returns <code>null</code> if no such breakpoint exists with the given id
-	 * 
-	 * @param breakpointId
-	 * @return the breakpoint with the given id or <code>null</code>
-	 */
-	public Breakpoint getBreakpoint(Long breakpointId) {
-		return (Breakpoint) breakpoints.get(breakpointId);
-	}
-
-	/**
-	 * Gets the thread for the thread with the given id, returns <code>null</code> if no such thread exists with the given id
-	 * 
-	 * @param threadId
-	 * @return the thread data for the thread with the given id or <code>null</code>
-	 */
-	public synchronized ThreadData getThreadData(Long threadId) {
-		return (ThreadData) threadIdToData.get(threadId);
-	}
-
-	/**
-	 * @return the complete list of thread ids known to the debugger
-	 */
-	public synchronized List getThreadIds() {
-		return new ArrayList(threadIdToData.keySet());
-	}
-
-	/**
-	 * Caches the current thread as disabled
-	 */
-	public synchronized void disableThread() {
-		disabledThreads.add(Thread.currentThread());
-	}
-
-	/**
-	 * Removes the current thread as being disabled
-	 */
-	public synchronized void enableThread() {
-		disabledThreads.remove(Thread.currentThread());
-	}
-
-	public void start() {
-		sessionManager.start(this);
-	}
-
-	public void stop() {
-		sessionManager.stop();
-	}
-	
-	/**
-	 * Returns if a {@link DebugSession} has successfully connected to this debugger.
-	 * 
-	 * @return <code>true</code> if the debugger has a connected {@link DebugSession} <code>false</code> otherwise
-	 */
-	public boolean isConnected() {
-		return sessionManager.isConnected();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/ScriptSource.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/ScriptSource.java
deleted file mode 100644
index d201f7f..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/ScriptSource.java
+++ /dev/null
@@ -1,479 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2011 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.debugger;
-
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.Constants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.mozilla.javascript.debug.DebuggableScript;
-import org.mozilla.javascript.debug.Debugger;
-
-/**
- * Rhino script implementation
- * 
- * @since 1.0
- */
-public class ScriptSource {
-
-	/**
-	 * No line information
-	 */
-	static final LineData[] NO_LINES = new LineData[0];
-	
-	/**
-	 * The id of the script
-	 */
-	private Long scriptId;
-	/**
-	 * Any special source properties to consider
-	 */
-	private final Map properties;
-	/**
-	 * The backing source String that was compiled to give us this proxy
-	 */
-	private final String source;
-	/**
-	 * If this {@link ScriptSource} was generated
-	 */
-	private final boolean generated;
-	/**
-	 * The ordered list of function names
-	 */
-	private ArrayList functionNames = null;
-
-	private Integer firstLine = null;
-	
-	/**
-	 * The location of the script
-	 */
-	private URI uri = null;
-	/**
-	 * The array of cached {@link FunctionSource}s
-	 */
-	private FunctionSource[] functionSources = null;
-	/**
-	 * Sparse array of line information. This array only has entries present for 
-	 * lines that are returned 
-	 */
-	private LineData[] lines = null;
-	/**
-	 * Mapping of the {@link DebuggableScript} backing the FunctionSource to the FunctionSource handle
-	 */
-	private HashMap/*<DebuggableScript, FunctionSource>*/ scriptToFunction = new HashMap();
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param scriptId
-	 * @param debuggableScript
-	 * @param source
-	 */
-	public ScriptSource(DebuggableScript script, String source, URI uri, boolean generated, Map properties) {
-		this.uri = uri;
-		this.source = source;
-		this.properties = properties;
-		this.generated = generated;
-
-		if(isStdIn()) {
-			//do not compute line data
-			return;
-		}
-		int[] rootlines = script.getLineNumbers();		
-		DebuggableScript[] functions = collectFunctions(script);
-		int flength = functions.length;
-		int max = 0;
-		int min = Integer.MAX_VALUE;
-		HashSet lineNumbers = new HashSet(flength+rootlines.length+1);
-		//dump in the line #'s from the root script
-		for (int i = 0; i < rootlines.length; i++) {
-			int line = rootlines[i];
-			if(line > max) {
-				max = line;
-			}
-			if(line < min) {
-				min = line;
-			}
-			lineNumbers.add(new Integer(line));
-		}
-		//dump in the line numbers from the expanded set of functions
-		if(flength > 0) {
-			functionSources = new FunctionSource[flength];
-			functionNames = new ArrayList(flength);
-			
-			int start = 0, end = 0;;
-			for (int i = 0; i < functions.length; i++) {
-				int[] lines = functions[i].getLineNumbers();
-				if(lines != null && lines.length > 0) {
-					start = lines[0] + 1;
-					for (int j = 0; j < lines.length; j++) {
-						int currentLine = lines[j];
-						if(currentLine > max) {
-							max = currentLine;
-						}
-						if(currentLine < min) {
-							min = currentLine;
-						}
-						if (currentLine < start) {
-							start = currentLine;
-						}
-						else if(currentLine > end) {
-							end = currentLine;
-						}
-						lineNumbers.add(new Integer(currentLine));
-					}
-				}
-				String name = functions[i].getFunctionName();
-				name = (name == null ? Constants.EMPTY_STRING : name);
-				functionSources[i] = new FunctionSource(this, name, computeFunctionSource(0, 0, source), start);
-				functionNames.add(name);
-				scriptToFunction.put(functions[i], functionSources[i]);
-				start = 0;
-			}
-		}
-		//create the sparse array and populate the valid line numbers
-		if(max == 0) {
-			this.lines = NO_LINES;
-		}
-		else {
-			this.lines = new LineData[max+1];
-			for (Iterator iter = lineNumbers.iterator(); iter.hasNext();) {
-				Integer value = (Integer) iter.next();
-				this.lines[value.intValue()] = new LineData();
-				iter.remove();
-			}
-			lineNumbers = null;
-		}
-		this.firstLine = new Integer(min);
-	}
-
-	/**
-	 * Returns the first executable line in the script
-	 * 
-	 * @return the first executable line in the script
-	 */
-	public Integer firstLine() {
-		return this.firstLine;
-	}
-	
-	/**
-	 * @return if this script represents the stdin script
-	 */
-	public boolean isStdIn() {
-		return this.uri.toString().endsWith("stdin"); //$NON-NLS-1$
-	}
-	
-	/**
-	 * Clears the breakpoints from this script out of the given {@link Debugger}
-	 */
-	void clearBreakpoints(RhinoDebuggerImpl debugger) {
-		if(this.lines != null) {
-			for (int i = 0; i < this.lines.length; i++) {
-				if(lines[i] != null) {
-					Breakpoint bp = lines[i].breakpoint;
-					if(bp != null) {
-						debugger.clearBreakpoint(bp.breakpointId);
-					}
-				}
-			}
-		}
-	}
-	
-	/**
-	 * Collects all of the {@link DebuggableScript} objects for the functions
-	 * @param root the root script
-	 * @return the collected array of functions - {@link DebuggableScript} - objects or an empty array
-	 */
-	DebuggableScript[] collectFunctions(DebuggableScript root) {
-		ArrayList functions = new ArrayList();
-		collectFunctions(root, functions);
-		int size = functions.size();
-		if(size < 1) {
-			return RhinoDebuggerImpl.NO_SCRIPTS;
-		}
-		DebuggableScript[] funcs = new DebuggableScript[size];
-		functions.toArray(funcs);
-		return funcs;
-	}
-	
-	/**
-	 * Recursively collects function {@link DebuggableScript}s
-	 * 
-	 * @param root
-	 * @param collector
-	 */
-	void collectFunctions(DebuggableScript root, List collector) {
-		if(root.isFunction()) {
-			collector.add(root);
-		}
-		for (int i = 0; i < root.getFunctionCount(); i++) {
-			collectFunctions(root.getFunction(i), collector);
-		}
-	}
-	
-	/**
-	 * Computes the functions' source from the given compiled buffer
-	 * 
-	 * @param start
-	 * @param end
-	 * @param source
-	 * @return the string for the source or <code>null</code> if it could not be computed
-	 */
-	String computeFunctionSource(int start, int end, String source) {
-		if(start > -1 && end <= source.length()) {
-			return source.substring(start, end);
-		}
-		return null;
-	}
-	
-	/**
-	 * Sets the id for the script, <code>null</code> will throw and {@link IllegalArgumentException}
-	 * @param id
-	 * @throws IllegalArgumentException if <code>null</code> is specified as the new id
-	 */
-	public void setId(Long id) throws IllegalArgumentException {
-		if(id == null) {
-			throw new IllegalArgumentException();
-		}
-		this.scriptId = id;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		if(obj instanceof ScriptSource) {
-			return this.uri.toString().equals(((ScriptSource)obj).uri.toString());
-		}
-		return false;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return this.uri.toString().hashCode();
-	}
-
-	/**
-	 * @return a new JSON map
-	 */
-	public Object toJSON() {
-		HashMap result = new HashMap();
-		result.put(JSONConstants.SCRIPT_ID, this.scriptId);
-		result.put(JSONConstants.LOCATION, this.uri.toString());
-		result.put(JSONConstants.PROPERTIES, properties);
-		result.put(JSONConstants.SOURCE, source);
-		result.put(JSONConstants.GENERATED, Boolean.valueOf(generated));
-		if(lines != null) {
-			HashSet lineNumbers = new HashSet();
-			for (int i = 0; i < lines.length; i++) {
-				if(lines[i] != null) {
-					lineNumbers.add(new Integer(i));
-				}
-			}
-			result.put(JSONConstants.LINES, (lineNumbers == null ? Collections.EMPTY_SET : lineNumbers));
-		}
-		else {
-			result.put(JSONConstants.LINES, Collections.EMPTY_SET);
-		}
-		result.put(JSONConstants.FUNCTIONS, (functionNames == null ? Collections.EMPTY_LIST : functionNames));
-		return result;
-	}
-
-	/**
-	 * @return the id for this script object
-	 */
-	public Long getId() {
-		return scriptId;
-	}
-	
-	/**
-	 * Returns the {@link Breakpoint} at the given line number or <code>null</code>
-	 * if there isn't one
-	 * @param lineNumber
-	 * @return
-	 */
-	public Breakpoint getBreakpoint(Integer line, String functionName) {
-		synchronized (lines) {
-			if(line != null) {
-				int value = line.intValue();
-				if (value > -1 && value < lines.length && lines[value] != null) {
-					return lines[value].breakpoint;
-				}
-			}
-			if(functionNames != null) {
-				int index = functionNames.indexOf(functionName);
-				FunctionSource func = functionAt(index);
-				if(func != null && lines[func.linenumber()] != null) {
-					return lines[func.linenumber()].breakpoint;
-				}
-			}
-			return null;
-		}
-	}
-
-	/**
-	 * Returns if the line number is valid wrt this script
-	 * 
-	 * @param lineNumber
-	 * @param functionName
-	 * @return true if the line number is valid wrt this script
-	 */
-	public boolean isValid(Integer line, String functionName) {
-		synchronized (lines) {
-			if(line != null) {
-				int value = line.intValue();
-				if (value > -1 && value < lines.length) {
-					return lines[value] != null;
-				}
-			}
-			if(functionNames != null) {
-				int index = functionNames.indexOf(functionName);
-				FunctionSource func = functionAt(index);
-				if(func != null) {
-					return lines[func.linenumber()] != null;
-				}
-			}
-		}
-		return false;
-	}
-	
-	/**
-	 * Adds a breakpoint to this script
-	 * 
-	 * @param breakpoint
-	 */
-	public void addBreakpoint(Breakpoint breakpoint) {
-		synchronized (lines) {
-			Integer lineNumber = breakpoint.lineNumber;
-			if(lineNumber != null) {
-				int value = lineNumber.intValue();
-				if(lines[value] != null) {
-					lines[value].breakpoint = breakpoint;
-				}
-			}
-			else if(functionNames != null) {
-				int index = functionNames.indexOf(breakpoint.functionName);
-				FunctionSource func = functionAt(index);
-				if(func != null) {
-					if(lines[func.linenumber] != null) {
-						lines[func.linenumber].breakpoint = breakpoint;
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Removes a breakpoint from this script
-	 * 
-	 * @param breakpoint
-	 */
-	public void removeBreakpoint(Breakpoint breakpoint) {
-		synchronized (lines) {
-			Integer lineNumber = breakpoint.lineNumber;
-			if(lineNumber != null) {
-				int value = lineNumber.intValue();
-				if(lines[value] != null) {
-					lines[value].breakpoint = null;
-				}
-			}
-			else if(functionNames != null) {
-				int index = functionNames.indexOf(breakpoint.functionName);
-				FunctionSource func = functionAt(index);
-				if(func != null) {
-					if(lines[func.linenumber] != null) {
-						lines[func.linenumber].breakpoint = null;
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * @return the string location of this script
-	 */
-	public String getLocation() {
-		return this.uri.toString();
-	}
-	
-	/**
-	 * Returns the {@link FunctionSource} at the given position iff the given index
-	 * is within the bounds of the sources array.
-	 * 
-	 * @param index
-	 * @return the {@link FunctionSource} at the given index or <code>null</code>
-	 */
-	public FunctionSource functionAt(int index) {
-		synchronized (functionSources) {
-			if(functionSources != null && (index < functionSources.length && index > -1)) {
-				return functionSources[index];
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns the {@link FunctionSource} for the given {@link DebuggableScript}
-	 * 
-	 * @param script
-	 * @return the {@link FunctionSource} for the given {@link DebuggableScript} or <code>null</code>
-	 */
-	public FunctionSource getFunction(DebuggableScript script) {
-		synchronized (scriptToFunction) {
-			return (FunctionSource) scriptToFunction.get(script);
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("ScriptSource: [id - ").append(scriptId).append("] [uri - ").append(uri.toString()).append("]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		buffer.append("[generated - ").append(generated).append("]\n"); //$NON-NLS-1$ //$NON-NLS-2$
-		if(lines != null) {
-			buffer.append("\tline numbers: {"); //$NON-NLS-1$
-			for (int i = 0; i < lines.length; i++) {
-				if(lines[i] != null) {
-					buffer.append(i);
-					if(i < lines.length-1) {
-						buffer.append(", "); //$NON-NLS-1$
-					}
-				}
-			}
-			buffer.append("}\n"); //$NON-NLS-1$
-		}
-		if(functionNames != null) {
-			buffer.append("\tfunction names: {"); //$NON-NLS-1$
-			for (int i = 0; i < functionNames.size(); i++) {
-				buffer.append(functionNames.get(i));
-				if(i < functionNames.size()-1) {
-					buffer.append(", "); //$NON-NLS-1$
-				}
-			}
-			buffer.append("}\n"); //$NON-NLS-1$
-		}
-		if(functionSources != null) {
-			buffer.append("\tfunction sources:\n"); //$NON-NLS-1$
-			for (int i = 0; i < functionSources.length; i++) {
-				buffer.append(functionSources[i]).append("\n"); //$NON-NLS-1$
-			}
-		}
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/StackFrame.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/StackFrame.java
deleted file mode 100644
index f944ca2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/StackFrame.java
+++ /dev/null
@@ -1,500 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.debugger;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.IdentityHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.mozilla.javascript.BaseFunction;
-import org.mozilla.javascript.Context;
-import org.mozilla.javascript.EcmaError;
-import org.mozilla.javascript.NativeArray;
-import org.mozilla.javascript.NativeJavaObject;
-import org.mozilla.javascript.Script;
-import org.mozilla.javascript.ScriptRuntime;
-import org.mozilla.javascript.Scriptable;
-import org.mozilla.javascript.ScriptableObject;
-import org.mozilla.javascript.Undefined;
-import org.mozilla.javascript.debug.DebugFrame;
-import org.mozilla.javascript.debug.DebuggableObject;
-import org.mozilla.javascript.debug.Debugger;
-
-/**
- * Rhino implementation of {@link DebugFrame}
- * 
- * @since 1.0
- */
-public class StackFrame implements DebugFrame {
-
-	private final Long id;
-	private final Context context;
-	private final ContextData contextData;
-	private final ScriptSource script;
-	private FunctionSource function = null;
-	private final HashMap handles = new HashMap();
-	private final IdentityHashMap handledObjects = new IdentityHashMap();
-	private Scriptable activation;
-	private Scriptable thisObj;
-	private int lineNumber;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param frameId
-	 * @param context
-	 * @param debuggableScript
-	 * @param script
-	 */
-	public StackFrame(Long frameId, Context context, FunctionSource function, ScriptSource script) {
-		this.id = frameId;
-		this.context = context;
-		this.contextData = (ContextData) context.getDebuggerContextData();
-		this.function = function;
-		this.script = script;
-		if(function != null) {
-			this.lineNumber = function.linenumber();
-		}
-		else {
-			this.lineNumber = script.firstLine().intValue();
-		}
-	}
-
-	/**
-	 * Returns the id of the frame
-	 * 
-	 * @return the frame id
-	 */
-	public Long getId() {
-		return id;
-	}
-
-	/**
-	 * Returns the underlying {@link Script}
-	 * 
-	 * @return the underlying {@link Script}
-	 */
-	public ScriptSource getScript() {
-		return script;
-	}
-
-	/**
-	 * Returns the line number for the frame
-	 * 
-	 * @return the frame line number
-	 */
-	public Integer getLineNumber() {
-		return new Integer(lineNumber);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.mozilla.javascript.debug.DebugFrame#onDebuggerStatement(org.mozilla.javascript.Context)
-	 */
-	public void onDebuggerStatement(Context cx) {
-		initializeHandles();
-		this.lineNumber = 1+lineNumber;
-		contextData.debuggerStatement(script, new Integer(lineNumber));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.mozilla.javascript.debug.DebugFrame#onEnter(org.mozilla.javascript.Context, org.mozilla.javascript.Scriptable, org.mozilla.javascript.Scriptable, java.lang.Object[])
-	 */
-	public void onEnter(Context cx, Scriptable activation, Scriptable thisObj, Object[] args) {
-		this.activation = activation;
-		this.thisObj = thisObj;
-		initializeHandles();
-		contextData.pushFrame(this, this.script, new Integer(lineNumber), getFunctionName());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.mozilla.javascript.debug.DebugFrame#onExit(org.mozilla.javascript.Context, boolean, java.lang.Object)
-	 */
-	public void onExit(Context cx, boolean byThrow, Object resultOrException) {
-		this.activation = null;
-		this.thisObj = null;
-		clearHandles();
-		this.contextData.popFrame(byThrow, resultOrException);
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.mozilla.javascript.debug.DebugFrame#onExceptionThrown(org.mozilla.javascript.Context, java.lang.Throwable)
-	 */
-	public void onExceptionThrown(Context cx, Throwable ex) {
-		initializeHandles();
-		this.contextData.exceptionThrown(ex);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.mozilla.javascript.debug.DebugFrame#onLineChange(org.mozilla.javascript.Context, int)
-	 */
-	public void onLineChange(Context cx, int lineNumber) {
-		if (this.lineNumber == lineNumber)
-			return;
-		initializeHandles();
-		this.lineNumber = lineNumber;
-		Integer line = new Integer(this.lineNumber);
-		if(this.script.isValid(line, getFunctionName())) {
-			this.contextData.lineChange(this.script, line);
-		}
-	}
-
-	/**
-	 * @return the name of the function backing this frame or <code>null</code> if there is no function
-	 * or it has no name.
-	 */
-	String getFunctionName() {
-		return (this.function == null ? null : this.function.name());
-	}
-	
-	/**
-	 * Evaluates the given source
-	 * 
-	 * @param source
-	 * @return
-	 */
-	public Object evaluate(String source) {
-		RhinoDebuggerImpl rhinoDebugger = (RhinoDebuggerImpl) context.getDebugger();
-		rhinoDebugger.disableThread();
-
-		Context evalContext = context.getFactory().enter();
-		Debugger debugger = evalContext.getDebugger();
-		Object debuggerContextData = evalContext.getDebuggerContextData();
-		evalContext.setDebugger(null, null);
-		try {
-			Object result = ScriptRuntime.evalSpecial(evalContext, activation, thisObj, new Object[] { source }, "eval", 0); //$NON-NLS-1$
-			Long handle = createHandle(result);
-			return serialize(handle, result);
-		}
-		catch (EcmaError ecma) {
-			return null;
-		}
-		finally {
-			evalContext.setDebugger(debugger, debuggerContextData);
-			Context.exit();
-			rhinoDebugger.enableThread();
-		}
-	}
-
-	/**
-	 * Evaluates the given condition
-	 * 
-	 * @param condition
-	 * @return the status of the condition evaluation
-	 */
-	public boolean evaluateCondition(String condition) {
-		RhinoDebuggerImpl rhinoDebugger = (RhinoDebuggerImpl) context.getDebugger();
-		rhinoDebugger.disableThread();
-
-		Context evalContext = context.getFactory().enter();
-		Debugger debugger = evalContext.getDebugger();
-		Object debuggerContextData = evalContext.getDebuggerContextData();
-		evalContext.setDebugger(null, null);
-		try {
-			Object result = ScriptRuntime.evalSpecial(evalContext, activation, thisObj, new Object[] { condition }, JSONConstants.CONDITION, 0);
-			return ScriptRuntime.toBoolean(result);
-		} finally {
-			evalContext.setDebugger(debugger, debuggerContextData);
-			Context.exit();
-			rhinoDebugger.enableThread();
-		}
-	}
-
-	/**
-	 * Look up the given handle in the known list of handles for this frame
-	 * 
-	 * @param handle
-	 * @return the serialized handle never <code>null</code>
-	 */
-	public Object lookup(Long handle) {
-
-		Object result = handles.get(handle);
-
-		RhinoDebuggerImpl rhinoDebugger = (RhinoDebuggerImpl) context.getDebugger();
-		rhinoDebugger.disableThread();
-
-		Context lookupContext = context.getFactory().enter();
-		Debugger debugger = lookupContext.getDebugger();
-		Object debuggerContextData = lookupContext.getDebuggerContextData();
-		lookupContext.setDebugger(null, null);
-		try {
-			return serialize(handle, result);
-		} finally {
-			lookupContext.setDebugger(debugger, debuggerContextData);
-			Context.exit();
-			rhinoDebugger.enableThread();
-		}
-	}
-
-	/**
-	 * Returns a JSON map
-	 * 
-	 * @return a new JSON object
-	 */
-	public Object toJSON() {
-		Map result = new HashMap();
-		result.put(JSONConstants.THREAD_ID, contextData.getThreadId());
-		result.put(JSONConstants.CONTEXT_ID, contextData.getId());
-		result.put(JSONConstants.FRAME_ID, id);
-		result.put(JSONConstants.SCRIPT_ID, script.getId());
-		result.put(JSONConstants.LINE, new Integer(lineNumber));
-		result.put(JSONConstants.REF, new Integer(0));
-		//TODO update this
-		result.put(JSONConstants.SCOPE_NAME, null);
-		return result;
-	}
-
-	/**
-	 * Serializes a handle object for this frame
-	 * 
-	 * @param handle
-	 * @param object
-	 * @return the serialized handle, never <code>null</code>
-	 */
-	public Object serialize(Long handle, Object object) {
-		Map result = new HashMap();
-		result.put(JSONConstants.REF, handle);
-
-		// "undefined", "null", "boolean", "number", "string", "object", "function" or "frame"
-		if (object == Undefined.instance) {
-			serializeUndefined(result);
-		} else if (object == null) {
-			serializeNull(result);
-		} else if (object instanceof Boolean) {
-			serializeSimpleType(object, JSONConstants.BOOLEAN, result);
-		} else if (object instanceof Number) {
-			Object value = (object == ScriptRuntime.NaNobj) ? null : object;
-			serializeSimpleType(value, JSONConstants.NUMBER, result);
-		} else if (object instanceof String) {
-			serializeSimpleType(object, JSONConstants.STRING, result);
-		} else if (object instanceof Scriptable) {
-			Scriptable scriptable = (Scriptable) object;
-			serializeFunctionOrObject(scriptable, result);
-		} else if (object == this) {
-			serializeFrame(result);
-		} else {
-			serializeUndefined(result);
-		}
-		return result;
-	}
-
-	/**
-	 * Serialize the undefined value
-	 * 
-	 * @param result
-	 * @see JSONConstants#UNDEFINED
-	 */
-	private void serializeUndefined(Map result) {
-		result.put(JSONConstants.TYPE, JSONConstants.UNDEFINED);
-	}
-
-	/**
-	 * Serialize the null value
-	 * 
-	 * @param result
-	 * @see JSONConstants#NULL
-	 */
-	private void serializeNull(Map result) {
-		result.put(JSONConstants.TYPE, JSONConstants.NULL);
-	}
-
-	/**
-	 * Serialize the given simple type
-	 * 
-	 * @param object
-	 * @param type
-	 * @param result
-	 */
-	private void serializeSimpleType(Object object, String type, Map result) {
-		result.put(JSONConstants.TYPE, type);
-		result.put(JSONConstants.VALUE, object);
-	}
-
-	/**
-	 * Serialize a function or object
-	 * 
-	 * @param scriptable
-	 * @param result
-	 * @see JSONConstants#FUNCTION
-	 * @see JSONConstants#OBJECT
-	 */
-	private void serializeFunctionOrObject(Scriptable scriptable, Map result) {
-		if (scriptable instanceof BaseFunction) {
-			result.put(JSONConstants.TYPE, JSONConstants.FUNCTION);
-			result.put(JSONConstants.NAME, ((BaseFunction) scriptable).getFunctionName());
-		} else if (scriptable instanceof NativeArray) {
-			result.put(JSONConstants.TYPE, JSONConstants.ARRAY);
-		} else {
-			result.put(JSONConstants.TYPE, JSONConstants.OBJECT);
-		}
-		result.put(JSONConstants.CLASS_NAME, scriptable.getClassName());
-
-		Object constructorFunction = null;
-		if (ScriptableObject.hasProperty(scriptable, JSONConstants.CONSTRUCTOR)) {
-			constructorFunction = ScriptableObject.getProperty(scriptable, JSONConstants.CONSTRUCTOR);
-		}
-		result.put(JSONConstants.CONSTRUCTOR_FUNCTION, createHandle(constructorFunction));
-		result.put(JSONConstants.PROTOTYPE_OBJECT, createHandle(scriptable.getPrototype()));
-		if (scriptable instanceof NativeJavaObject)
-			result.put(JSONConstants.PROPERTIES, createJavaObjectProperties((NativeJavaObject) scriptable));
-		else
-			result.put(JSONConstants.PROPERTIES, createProperties(scriptable));
-	}
-
-	/**
-	 * @param javaObject
-	 * @return
-	 */
-	private Object createJavaObjectProperties(NativeJavaObject javaObject) {
-		ArrayList properties = new ArrayList();
-		// TODO: The problem here is Rhino treats getters and setters differently and in some cases will call these methods
-		// we need to sort out what's reasonable to display without modifying state
-		return properties;
-	}
-
-	/**
-	 * Serialize a frame
-	 * 
-	 * @param result
-	 * @see JSONConstants#FRAME
-	 * @see JSONConstants#THIS
-	 */
-	private void serializeFrame(Map result) {
-		result.put(JSONConstants.TYPE, JSONConstants.FRAME);
-		Set properties = new HashSet();
-		properties.add(createProperty(JSONConstants.THIS, thisObj));
-		properties.addAll(createProperties(activation));
-		Scriptable parent = activation.getParentScope();
-		while(parent != null) {
-			properties.addAll(createProperties(parent));
-			parent = parent.getParentScope();
-		}		
-		result.put(JSONConstants.PROPERTIES, properties);
-	}
-
-	/**
-	 * Creates the list of properties from the given {@link Scriptable}
-	 * 
-	 * @param scriptable
-	 * @return the live list of properties from the given {@link Scriptable}
-	 */
-	private List createProperties(Scriptable scriptable) {
-		ArrayList properties = new ArrayList();
-		Object[] ids = scriptable.getIds();
-		if (scriptable instanceof DebuggableObject) {
-			HashSet arrayIds = new HashSet(Arrays.asList(ids));
-			arrayIds.addAll(Arrays.asList(((DebuggableObject)scriptable).getAllIds()));
-			ids = arrayIds.toArray();
-		}
-		for (int i = 0; i < ids.length; i++) {
-			Object id = ids[i];
-			Object value = null;
-			if (id instanceof String) {
-				value = ScriptableObject.getProperty(scriptable, (String) id);
-			} else if (id instanceof Number) {
-				value = ScriptableObject.getProperty(scriptable, ((Number) id).intValue());
-			} else
-				continue;
-
-			Map property = createProperty(id, value);
-			properties.add(property);
-		}
-		return properties;
-	}
-
-	/**
-	 * Create a new property map for the given id and value
-	 * 
-	 * @param id
-	 * @param value
-	 * @return a new property map
-	 * @see JSONConstants#NAME
-	 */
-	private Map createProperty(Object id, Object value) {
-		Map property = createRef(value);
-		property.put(JSONConstants.NAME, id);
-		return property;
-	}
-
-	/**
-	 * Create a new ref map for the given object
-	 * 
-	 * @param object
-	 * @return a new ref map
-	 * @see JSONConstants#REF
-	 */
-	private Map createRef(Object object) {
-		Map map = new HashMap(2);
-		map.put(JSONConstants.REF, createHandle(object));
-		return map;
-	}
-
-	/**
-	 * Clears all cached handles from this frame
-	 */
-	private void clearHandles() {
-		handles.clear();
-		handledObjects.clear();
-	}
-
-	/**
-	 * Initializes the set of handles
-	 */
-	private void initializeHandles() {
-		if (handles.size() != 1) {
-			clearHandles();
-			createHandle(this);
-		}
-	}
-
-	/**
-	 * Creates a new handle for the given object and caches it
-	 * 
-	 * @param object
-	 * @return the id of the new handle
-	 */
-	private Long createHandle(Object object) {
-		Long handle = (Long) handledObjects.get(object);
-		if (handle == null) {
-			handle = new Long(nextHandle());
-			handles.put(handle, object);
-			handledObjects.put(object, handle);
-		}
-		return handle;
-	}
-
-	/**
-	 * @return the next handle to use when creating handles
-	 */
-	private int nextHandle() {
-		return handles.size();
-	}
-
-	/**
-	 * @return the thread id for the underlying {@link ContextData}
-	 */
-	public Object getThreadId() {
-		return contextData.getThreadId();
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/ThreadData.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/ThreadData.java
deleted file mode 100644
index 92ab97c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/ThreadData.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.debugger;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.mozilla.javascript.Context;
-import org.mozilla.javascript.debug.DebugFrame;
-
-/**
- * Rhino implementation of thread data
- * 
- * @since 1.0
- */
-public class ThreadData {
-
-	private final LinkedList contexts = new LinkedList();
-	private final Long threadId;
-	private final RhinoDebuggerImpl debugger;
-
-	private long currentContextId = 0L;
-	private long currentFrameId = 0L;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param threadId
-	 * @param debugger
-	 */
-	public ThreadData(Long threadId, RhinoDebuggerImpl debugger) {
-		this.threadId = threadId;
-		this.debugger = debugger;
-	}
-
-	/**
-	 * @return a JSON object for this data
-	 */
-	public synchronized Object toJSON() {
-		Map result = new HashMap();
-		result.put(JSONConstants.THREAD_ID, threadId);
-		if (contexts.isEmpty()) {
-			result.put(JSONConstants.STATE, JSONConstants.RUNNING);
-		} else {
-			Context top = (Context) contexts.getFirst();
-			result.put(JSONConstants.STATE, ((ContextData) top.getDebuggerContextData()).getState());
-		}
-		ArrayList contextIds = new ArrayList(contexts.size());
-		for (Iterator iterator = contexts.iterator(); iterator.hasNext();) {
-			Context context = (Context) iterator.next();
-			ContextData data = (ContextData) context.getDebuggerContextData();
-			contextIds.add(data.getId());
-		}
-		result.put(JSONConstants.CONTEXTS, contextIds);
-		return result;
-	}
-
-	/**
-	 * Caches that the given context has been created
-	 * 
-	 * @param context
-	 */
-	public synchronized void contextCreated(Context context) {
-		context.setGeneratingDebug(true);
-		context.setOptimizationLevel(-1);
-		ContextData contextData = new ContextData(threadId, new Long(currentContextId++), debugger);
-		context.setDebugger(debugger, contextData);
-		contexts.addFirst(context);
-	}
-
-	/**
-	 * Removes the context from the top of the stack
-	 * 
-	 * @param context
-	 */
-	public synchronized void contextReleased(Context context) {
-		if(hasContext()) {
-			contexts.removeFirst();
-		}
-	}
-
-	/**
-	 * @return true if there are any known contexts to this thread data
-	 */
-	public synchronized boolean hasContext() {
-		return !contexts.isEmpty();
-	}
-
-	/**
-	 * Returns all of the frame ids from all of the known contexts in this thread data or an empty list, never <code>null</code>
-	 * 
-	 * @return the complete list of frame ids from all known contexts
-	 */
-	public synchronized List getFrameIds() {
-		ArrayList result = new ArrayList(contexts.size());
-		for (Iterator iterator = contexts.iterator(); iterator.hasNext();) {
-			Context context = (Context) iterator.next();
-			ContextData data = (ContextData) context.getDebuggerContextData();
-			result.addAll(data.getFrameIds());
-		}
-		return result;
-	}
-
-	/**
-	 * Suspends the first context on the stack. has no effect if there are no known contexts for this thread data
-	 */
-	public synchronized void suspend() {
-		if(hasContext()) {
-			Context context = (Context) contexts.getFirst();
-			if (context == null) {
-				return;
-			}
-			ContextData data = (ContextData) context.getDebuggerContextData();
-			data.suspend();
-		}
-	}
-
-	/**
-	 * Resumes the top context for the given type. Has no effect if there are no known contexts
-	 * 
-	 * @param stepType
-	 * 
-	 * @see JSONConstants#STEP_IN
-	 * @see JSONConstants#STEP_NEXT
-	 * @see JSONConstants#STEP_OUT
-	 * @see JSONConstants#STEP_ANY
-	 */
-	public synchronized void resume(String stepType) {
-		if(hasContext()) {
-			Context context = (Context) contexts.getFirst();
-			if (context == null) {
-				return;
-			}
-			ContextData data = (ContextData) context.getDebuggerContextData();
-			data.resume(stepType);
-		}
-	}
-
-	/**
-	 * Returns the {@link DebugFrame} with the given id from the first context containing such a frame. Returns <code>null</code> if no such frame exists with the given id.
-	 * 
-	 * @param frameId
-	 * @return the {@link DebugFrame} with the given id or <code>null</code>
-	 */
-	public synchronized StackFrame getFrame(Long frameId) {
-		for (Iterator iterator = contexts.iterator(); iterator.hasNext();) {
-			Context context = (Context) iterator.next();
-			ContextData data = (ContextData) context.getDebuggerContextData();
-			StackFrame frame = data.getFrame(frameId);
-			if (frame != null)
-				return frame;
-		}
-		return null;
-	}
-
-	/**
-	 * Creates a new {@link DebugFrame} for the given attributes.
-	 * 
-	 * @param context
-	 * @param function
-	 * @param script
-	 * @return a new {@link DebugFrame}
-	 */
-	public synchronized DebugFrame getFrame(Context context, FunctionSource function, ScriptSource script) {
-		return new StackFrame(new Long(currentFrameId++), context, function, script);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/Constants.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/Constants.java
deleted file mode 100644
index e47bae8..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/Constants.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.transport;
-
-/**
- * Common constants
- * 
- * @since 1.0
- */
-public interface Constants {
-
-	/**
-	 * Constant representing a space
-	 */
-	public static final String SPACE = " "; //$NON-NLS-1$
-	/**
-	 * Constant representing a colon.<br>
-	 * <br>
-	 * Value is: <code>:</code>
-	 */
-	public static final String COLON = ":"; //$NON-NLS-1$
-	/**
-	 * Constant representing the empty string
-	 */
-	public static final String EMPTY_STRING = ""; //$NON-NLS-1$
-	/**
-	 * UTF-8 encoding constant <br>
-	 * <br>
-	 * Value is: <code>UTF-8</code>
-	 */
-	public static final String UTF_8 = "UTF-8"; //$NON-NLS-1$
-	/**
-	 * Debug property name <br>
-	 * <br>
-	 * Value is: <code>rhino.debug</code>
-	 */
-	public static final String RHINO_DEBUG = "rhino.debug"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/EventPacket.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/EventPacket.java
deleted file mode 100644
index d0bb401..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/EventPacket.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.transport;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-
-/**
- * An {@link EventPacket} is a specialized {@link RhinoPacket}
- * that only handles <code>event</code> data.
- * 
- * @since 1.0
- */
-public class EventPacket extends RhinoPacket {
-
-	public static final String TYPE = JSONConstants.EVENT;
-	private final String event;
-	private final Map body = Collections.synchronizedMap(new HashMap());
-
-	/**
-	 * Constructor
-	 * @param event
-	 */
-	public EventPacket(String event) {
-		super(TYPE);
-		this.event = event.intern();
-	}
-
-	/**
-	 * Constructor
-	 * @param json
-	 */
-	public EventPacket(Map json) {
-		super(json);
-		String packetEvent = (String) json.get(JSONConstants.EVENT);
-		event = packetEvent.intern();
-		Map packetBody = (Map) json.get(JSONConstants.BODY);
-		body.putAll(packetBody);
-	}
-
-	/**
-	 * Returns the underlying event data
-	 * @return the event data
-	 */
-	public String getEvent() {
-		return event;
-	}
-
-	/**
-	 * Returns the underlying body of the event packet
-	 * @return the body of the packet
-	 */
-	public Map getBody() {
-		return body;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.Packet#toJSON()
-	 */
-	public Map toJSON() {
-		Map json = super.toJSON();
-		json.put(JSONConstants.EVENT, event);
-		json.put(JSONConstants.BODY, body);
-		return json;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("EventPacket: ").append(JSONUtil.write(toJSON())); //$NON-NLS-1$
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/JSONConstants.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/JSONConstants.java
deleted file mode 100644
index 3073856..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/JSONConstants.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.transport;
-
-/**
- * Collection of constants used for JSON
- * 
- * @since 1.0
- */
-public interface JSONConstants {
-
-	// request / response
-	public static final String SEQ = "seq"; //$NON-NLS-1$
-	public static final String REQUEST_SEQ = "request_seq"; //$NON-NLS-1$
-	public static final String TYPE = "type"; //$NON-NLS-1$
-	public static final String REQUEST = "request"; //$NON-NLS-1$
-	public static final String COMMAND = "command"; //$NON-NLS-1$
-	public static final String CONNECT = "connect"; //$NON-NLS-1$
-	public static final String MESSAGE = "message"; //$NON-NLS-1$
-	public static final String ARGUMENTS = "arguments"; //$NON-NLS-1$
-	public static final String BODY = "body"; //$NON-NLS-1$
-	public static final String LINE = "line"; //$NON-NLS-1$
-	public static final String SCRIPT = "script"; //$NON-NLS-1$
-	public static final String SCRIPTS = "scripts"; //$NON-NLS-1$
-	public static final String FUNCTION = "function"; //$NON-NLS-1$
-	public static final String ENTER = "enter"; //$NON-NLS-1$
-	public static final String EXIT = "exit"; //$NON-NLS-1$
-	public static final String FUNCTIONS = "functions"; //$NON-NLS-1$
-	public static final String BREAK = "break"; //$NON-NLS-1$
-	public static final String RESPONSE = "response"; //$NON-NLS-1$
-	public static final String FUNCTION_NAME = "functionName"; //$NON-NLS-1$
-	public static final String EVENT = "event"; //$NON-NLS-1$
-	public static final String NOT_FOUND = "not found"; //$NON-NLS-1$
-	/**
-	 * The type for a VMDeathEvent
-	 * 
-	 * @see EventPacket#getType()
-	 */
-	public static final String VMDEATH = "vmdeath"; //$NON-NLS-1$
-
-	// value constants
-	public static final String UNDEFINED = "undefined"; //$NON-NLS-1$
-	public static final String UNKNOWN = "unknown"; //$NON-NLS-1$
-	public static final String NULL = "null"; //$NON-NLS-1$
-	public static final String BOOLEAN = "boolean"; //$NON-NLS-1$
-	public static final String NUMBER = "number"; //$NON-NLS-1$
-	public static final String STRING = "string"; //$NON-NLS-1$
-	public static final String OBJECT = "object"; //$NON-NLS-1$
-	public static final String ARRAY = "array"; //$NON-NLS-1$
-	public static final String PROPERTY = "property"; //$NON-NLS-1$
-	public static final String VARIABLE = "variable"; //$NON-NLS-1$
-	public static final String THIS = "this"; //$NON-NLS-1$
-	public static final String PROTOTYPE_OBJECT = "prototypeObject"; //$NON-NLS-1$
-	public static final String CONSTRUCTOR_FUNCTION = "constructorFunction"; //$NON-NLS-1$
-
-	// id constants
-	public static final String THREAD_ID = "threadId"; //$NON-NLS-1$
-	public static final String FRAME_ID = "frameId"; //$NON-NLS-1$
-	public static final String BREAKPOINT_ID = "breakpointId"; //$NON-NLS-1$
-	public static final String CONTEXT_ID = "contextId"; //$NON-NLS-1$
-	public static final String SCRIPT_ID = "scriptId"; //$NON-NLS-1$
-
-	// breakpoints
-	public static final String SETBREAKPOINT = "setbreakpoint"; //$NON-NLS-1$
-	public static final String BREAKPOINT = "breakpoint"; //$NON-NLS-1$
-	public static final String BREAKPOINTS = "breakpoints"; //$NON-NLS-1$
-	public static final String CLEARBREAKPOINT = "clearbreakpoint"; //$NON-NLS-1$
-	public static final String CONDITION = "condition"; //$NON-NLS-1$
-	public static final String LINES = "lines"; //$NON-NLS-1$
-	public static final String DEBUGGER_STATEMENT = "debuggerStatement"; //$NON-NLS-1$
-
-	// threads
-	public static final String CONTINUE = "continue"; //$NON-NLS-1$
-	public static final String RUNNING = "running"; //$NON-NLS-1$
-	public static final String BACKTRACE = "backtrace"; //$NON-NLS-1$
-	public static final String SUCCESS = "success"; //$NON-NLS-1$
-	public static final String TOTAL_FRAMES = "totalframes"; //$NON-NLS-1$
-	public static final String STEP_ACTION = "stepaction"; //$NON-NLS-1$
-	public static final String STEP = "step"; //$NON-NLS-1$
-	public static final String STEP_TYPE = "stepType"; //$NON-NLS-1$
-	public static final String STEP_IN = "in"; //$NON-NLS-1$
-	public static final String STEP_NEXT = "next"; //$NON-NLS-1$
-	public static final String STEP_OUT = "out"; //$NON-NLS-1$
-	public static final String STEP_ANY = "any"; //$NON-NLS-1$
-	public static final String CONTEXTS = "contexts"; //$NON-NLS-1$
-	public static final String STATE = "state"; //$NON-NLS-1$
-	public static final String FRAMES = "frames"; //$NON-NLS-1$
-
-	// target
-	public static final String THREADS = "threads"; //$NON-NLS-1$
-	public static final String THREAD = "thread"; //$NON-NLS-1$
-	public static final String VERSION = "version"; //$NON-NLS-1$
-	public static final String DISPOSE = "dispose"; //$NON-NLS-1$
-	public static final String SUSPEND = "suspend"; //$NON-NLS-1$
-	public static final String SUSPENDED = "suspended"; //$NON-NLS-1$
-	public static final String EXCEPTION = "exception"; //$NON-NLS-1$
-	public static final String VM_VERSION = "javascript.vm.version"; //$NON-NLS-1$
-	public static final String VM_NAME = "javascript.vm.name"; //$NON-NLS-1$
-	public static final String VM_VENDOR = "javascript.vm.vendor"; //$NON-NLS-1$
-	public static final String JAVASCRIPT_VERSION = "javascript.version"; //$NON-NLS-1$
-	public static final String ECMASCRIPT_VERSION = "ecmascript.version"; //$NON-NLS-1$
-
-	// stackframe
-	public static final String EVALUATE = "evaluate"; //$NON-NLS-1$
-	public static final String EXPRESSION = "expression"; //$NON-NLS-1$
-	public static final String PROPERTIES = "properties"; //$NON-NLS-1$
-	public static final String NAME = "name"; //$NON-NLS-1$
-	public static final String LOOKUP = "lookup"; //$NON-NLS-1$
-	public static final String REF = "ref"; //$NON-NLS-1$	
-	public static final String CONSTRUCTOR = "constructor"; //$NON-NLS-1$
-	public static final String CLASS_NAME = "className"; //$NON-NLS-1$
-	public static final String VALUE = "value"; //$NON-NLS-1$
-	public static final String SCOPE_NAME = "scopeName"; //$NON-NLS-1$
-	public static final String FRAME = "frame"; //$NON-NLS-1$
-
-	// scripts
-	public static final String GENERATED = "generated"; //$NON-NLS-1$
-	public static final String SOURCE = "source"; //$NON-NLS-1$
-	public static final String LOCATION = "location"; //$NON-NLS-1$
-	public static final String BASE = "base"; //$NON-NLS-1$	
-	public static final String PATH = "path"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/JSONUtil.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/JSONUtil.java
deleted file mode 100644
index fe4ea07..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/JSONUtil.java
+++ /dev/null
@@ -1,465 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.transport;
-
-import java.math.BigDecimal;
-import java.text.CharacterIterator;
-import java.text.StringCharacterIterator;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.mozilla.javascript.Undefined;
-
-
-/**
- * This class provides utilities for working with JSON.
- * <br><br>JSON identifiers map to Java as follows:
- * <ul>
- * <li>string	<--> 	java.lang.String</li>
- * <li>number	<--> 	java.math.Number (BigDecimal)</li>
- * <li>object	<--> 	java.util.Map (HashMap)</li>
- * <li>array	<--> 	java.util.Collection (ArrayList)</li>
- * <li>true		<--> 	java.lang.Boolean.TRUE</li>
- * <li>false	<--> 	java.lang.Boolean.FALSE</li>
- * <li>null		<--> 	null</li>
- * </ul> 
- * 
- * @see JSONConstants
- * @since 1.0
- */
-public final class JSONUtil {
-
-	/**
-	 * Constructor
-	 * no instantiation
-	 */
-	private JSONUtil() {}
-	
-	/**
-	 * Reads an object from the given JSON string.
-	 * <br><br>JSON identifiers map to Java as follows:
-	 * <ul>
-	 * <li>string	<--> 	java.lang.String</li>
-	 * <li>number	<--> 	java.math.Number (BigDecimal)</li>
-	 * <li>object	<--> 	java.util.Map (HashMap)</li>
-	 * <li>array	<--> 	java.util.Collection (ArrayList)</li>
-	 * <li>true		<--> 	java.lang.Boolean.TRUE</li>
-	 * <li>false	<--> 	java.lang.Boolean.FALSE</li>
-	 * <li>null		<--> 	null</li>
-	 * </ul> 
-	 * @param jsonString
-	 * @return the object corresponding to the JSON string or <code>null</code>
-	 */
-	public static Object read(String jsonString) {
-		return parse(new StringCharacterIterator(jsonString));
-	}
-
-	/**
-	 * Writes the given object to JSON
-	 * <br><br>JSON identifiers map to Java as follows:
-	 * <ul>
-	 * <li>string	<--> 	java.lang.String</li>
-	 * <li>number	<--> 	java.math.Number (BigDecimal)</li>
-	 * <li>object	<--> 	java.util.Map (HashMap)</li>
-	 * <li>array	<--> 	java.util.Collection (ArrayList)</li>
-	 * <li>true		<--> 	java.lang.Boolean.TRUE</li>
-	 * <li>false	<--> 	java.lang.Boolean.FALSE</li>
-	 * <li>null		<--> 	null</li>
-	 * </ul> 
-	 * @param jsonObject
-	 * @return the composed JSON string, never <code>null</code>
-	 */
-	public static String write(Object jsonObject) {
-		StringBuffer buffer = new StringBuffer();
-		writeValue(jsonObject, buffer);
-		return buffer.toString();
-	}
-
-	/**
-	 * Creates an {@link IllegalStateException} for the given message and iterator
-	 * 
-	 * @param message the message for the exception
-	 * @param it the iterator
-	 * @return a new {@link IllegalStateException} 
-	 */
-	private static RuntimeException error(String message, CharacterIterator it) {
-		return new IllegalStateException("[" + it.getIndex() + "] " + message); //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-	/**
-	 * Creates an {@link IllegalStateException} for the given message
-	 * 
-	 * @param message the message for the exception
-	 * @return a new {@link IllegalStateException}
-	 */
-	private static RuntimeException error(String message) {
-		return new IllegalStateException(message);
-	}
-
-	/**
-	 * Parses the object value from the JSON string.
-	 * <br><br>JSON identifiers map to Java as follows:
-	 * <ul>
-	 * <li>string	<--> 	java.lang.String</li>
-	 * <li>number	<--> 	java.math.Number (BigDecimal)</li>
-	 * <li>object	<--> 	java.util.Map (HashMap)</li>
-	 * <li>array	<--> 	java.util.Collection (ArrayList)</li>
-	 * <li>true		<--> 	java.lang.Boolean.TRUE</li>
-	 * <li>false	<--> 	java.lang.Boolean.FALSE</li>
-	 * <li>null		<--> 	null</li>
-	 * </ul> 
-	 * @param it
-	 * @return
-	 */
-	private static Object parse(CharacterIterator it) {
-		parseWhitespace(it);
-		Object result = parseValue(it);
-		parseWhitespace(it);
-
-		if (it.current() != CharacterIterator.DONE) {
-			throw error("should be done", it); //$NON-NLS-1$
-		}
-		return result;
-	}
-
-	/**
-	 * Chews up whitespace from the iterator
-	 * 
-	 * @param it
-	 */
-	private static void parseWhitespace(CharacterIterator it) {
-		char c = it.current();
-		while (Character.isWhitespace(c)) {
-			c = it.next();
-		}
-	}
-
-	/**
-	 * Delegate method that calls the correct parse* method for object creation
-	 * <br><br>JSON identifiers map to Java as follows:
-	 * <ul>
-	 * <li>string	<--> 	java.lang.String</li>
-	 * <li>number	<--> 	java.math.Number (BigDecimal)</li>
-	 * <li>object	<--> 	java.util.Map (HashMap)</li>
-	 * <li>array	<--> 	java.util.Collection (ArrayList)</li>
-	 * <li>true		<--> 	java.lang.Boolean.TRUE</li>
-	 * <li>false	<--> 	java.lang.Boolean.FALSE</li>
-	 * <li>null		<--> 	null</li>
-	 * </ul> 
-	 * @param it
-	 * @return
-	 */
-	private static Object parseValue(CharacterIterator it) {
-		switch (it.current()) {
-			case '{' :
-				return parseObject(it);
-			case '[' :
-				return parseArray(it);
-			case '"' :
-				return parseString(it);
-			case '-' :
-			case '0' :
-			case '1' :
-			case '2' :
-			case '3' :
-			case '4' :
-			case '5' :
-			case '6' :
-			case '7' :
-			case '8' :
-			case '9' :
-				return parseNumber(it);
-			case 't' :
-				parseText(Boolean.TRUE.toString(), it);
-				return Boolean.TRUE;
-			case 'f' :
-				parseText(Boolean.FALSE.toString(), it);
-				return Boolean.FALSE;
-			case 'n' :
-				parseText(JSONConstants.NULL, it);
-				return null;
-			case 'u':
-				parseText(JSONConstants.UNDEFINED, it);
-				return null;
-		}
-		throw error("Bad JSON starting character '" + it.current() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$;
-	}
-
-	/**
-	 * Parses an {@link Map} object from the iterator or throws an
-	 * {@link IllegalStateException} if parsing fails.
-	 * 
-	 * @param it
-	 * @return a new {@link Map} object, never <code>null</code>
-	 */
-	private static Map parseObject(CharacterIterator it) {
-		it.next();
-		parseWhitespace(it);
-		if (it.current() == '}') {
-			it.next();
-			return Collections.EMPTY_MAP;
-		}
-
-		Map map = new HashMap();
-		while (true) {
-			if (it.current() != '"')
-				throw error("expected a string start '\"' but was '" + it.current() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$
-			String key = parseString(it);
-			if (map.containsKey(key))
-				throw error("' already defined" + "key '" + key, it); //$NON-NLS-1$ //$NON-NLS-2$
-			parseWhitespace(it);
-			if (it.current() != ':')
-				throw error("expected a pair separator ':' but was '" + it.current() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$
-			it.next();
-			parseWhitespace(it);
-			Object value = parseValue(it);
-			map.put(key, value);
-			parseWhitespace(it);
-			if (it.current() == ',') {
-				it.next();
-				parseWhitespace(it);
-				continue;
-			}
-
-			if (it.current() != '}')
-				throw error("expected an object close '}' but was '" + it.current() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$
-			break;
-		}
-		it.next();
-		return map;
-	}
-
-	/**
-	 * Parses an {@link ArrayList} from the given iterator or throws an
-	 * {@link IllegalStateException} if parsing fails
-	 * 
-	 * @param it
-	 * @return a new {@link ArrayList} object never <code>null</code>
-	 */
-	private static List parseArray(CharacterIterator it) {
-		it.next();
-		parseWhitespace(it);
-		if (it.current() == ']') {
-			it.next();
-			return Collections.EMPTY_LIST;
-		}
-
-		List list = new ArrayList();
-		while (true) {
-			Object value = parseValue(it);
-			list.add(value);
-			parseWhitespace(it);
-			if (it.current() == ',') {
-				it.next();
-				parseWhitespace(it);
-				continue;
-			}
-
-			if (it.current() != ']')
-				throw error("expected an array close ']' but was '" + it.current() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$
-			break;
-		}
-		it.next();
-		return list;
-	}
-
-	private static void parseText(String string, CharacterIterator it) {
-		int length = string.length();
-		char c = it.current();
-		for (int i = 0; i < length; i++) {
-			if (c != string.charAt(i))
-				throw error("expected to parse '" + string + "' but character " + (i + 1) + " was '" + c + "'", it); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$;
-			c = it.next();
-		}
-	}
-
-	private static Object parseNumber(CharacterIterator it) {
-		StringBuffer buffer = new StringBuffer();
-		char c = it.current();
-		while (Character.isDigit(c) || c == '-' || c == '+' || c == '.' || c == 'e' || c == 'E') {
-			buffer.append(c);
-			c = it.next();
-		}
-		try {
-			return new BigDecimal(buffer.toString());
-		} catch (NumberFormatException e) {
-			throw error("expected a number but was '" + buffer.toString() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$;
-		}
-	}
-
-	private static String parseString(CharacterIterator it) {
-		char c = it.next();
-		if (c == '"') {
-			it.next();
-			return ""; //$NON-NLS-1$
-		}
-		StringBuffer buffer = new StringBuffer();
-		while (c != '"') {
-			if (Character.isISOControl(c)) {
-				//XXX we should ignore the ISO control chars and make a best effort to continue
-				c = it.next();
-				continue;
-				//throw error("illegal iso control character: '" + Integer.toHexString(c) + "'", it); //$NON-NLS-1$ //$NON-NLS-2$);
-			}
-			if (c == '\\') {
-				c = it.next();
-				switch (c) {
-					case '"' :
-					case '\\' :
-					case '/' :
-						buffer.append(c);
-						break;
-					case 'b' :
-						buffer.append('\b');
-						break;
-					case 'f' :
-						buffer.append('\f');
-						break;
-					case 'n' :
-						buffer.append('\n');
-						break;
-					case 'r' :
-						buffer.append('\r');
-						break;
-					case 't' :
-						buffer.append('\t');
-						break;
-					case 'u' :
-						StringBuffer unicode = new StringBuffer(4);
-						for (int i = 0; i < 4; i++) {
-							unicode.append(it.next());
-						}
-						try {
-							buffer.append((char) Integer.parseInt(unicode.toString(), 16));
-						} catch (NumberFormatException e) {
-							throw error("expected a unicode hex number but was '" + unicode.toString() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$););
-						}
-						break;
-					default :
-						throw error("illegal escape character '" + c + "'", it); //$NON-NLS-1$ //$NON-NLS-2$););
-				}
-			} else
-				buffer.append(c);
-
-			c = it.next();
-		}
-		c = it.next();
-		return buffer.toString();
-	}
-
-	private static void writeValue(Object value, StringBuffer buffer) {
-		if (value == null)
-			buffer.append(JSONConstants.NULL);
-		else if (value instanceof Boolean)
-			buffer.append(value.toString());
-		else if (value instanceof Number)
-			writeNumber((Number) value, buffer);
-		else if (value instanceof String)
-			writeString((String) value, buffer);
-		else if (value instanceof Collection)
-			writeArray((Collection) value, buffer);
-		else if (value instanceof Map)
-			writeObject((Map) value, buffer);
-		else  if(value instanceof Undefined) {
-			buffer.append(JSONConstants.UNDEFINED);
-		}
-		else
-			throw error("Unexpected object instance type was '" + value.getClass().getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$););
-	}
-
-	private static void writeNumber(Number value, StringBuffer buffer) {
-		if (value instanceof Double) {
-			if (((Double)value).isNaN() || ((Double)value).isInfinite()) {
-				buffer.append(JSONConstants.NULL);
-				return;
-			}
-		} else if (value instanceof Float) {
-			if (((Float)value).isNaN() || ((Float)value).isInfinite()) {
-				buffer.append(JSONConstants.NULL);
-				return;
-			}
-		}
-		buffer.append(value.toString());
-	}
-
-	private static void writeObject(Map map, StringBuffer buffer) {
-		buffer.append('{');
-		for (Iterator iterator = map.keySet().iterator(); iterator.hasNext();) {
-			Object key = iterator.next();
-			if (!(key instanceof String))
-				throw error("Map keys must be an instance of String but was '" + key.getClass().getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$););
-			writeString((String) key, buffer);
-			buffer.append(':');
-			writeValue(map.get(key), buffer);
-			buffer.append(',');
-		}
-		if (buffer.charAt(buffer.length() - 1) == ',')
-			buffer.setCharAt(buffer.length() - 1, '}');
-		else
-			buffer.append('}');
-	}
-
-	private static void writeArray(Collection collection, StringBuffer buffer) {
-		buffer.append('[');
-		for (Iterator iterator = collection.iterator(); iterator.hasNext();) {
-			writeValue(iterator.next(), buffer);
-			buffer.append(',');
-		}
-		if (buffer.charAt(buffer.length() - 1) == ',')
-			buffer.setCharAt(buffer.length() - 1, ']');
-		else
-			buffer.append(']');
-	}
-
-	private static void writeString(String string, StringBuffer buffer) {
-		buffer.append('"');
-		int length = string.length();
-		for (int i = 0; i < length; i++) {
-			char c = string.charAt(i);
-			switch (c) {
-				case '"' :
-				case '\\' :
-				case '/' :
-					buffer.append('\\');
-					buffer.append(c);
-					break;
-				case '\b' :
-					buffer.append("\\b"); //$NON-NLS-1$
-					break;
-				case '\f' :
-					buffer.append("\\f"); //$NON-NLS-1$
-					break;
-				case '\n' :
-					buffer.append("\\n"); //$NON-NLS-1$
-					break;
-				case '\r' :
-					buffer.append("\\r"); //$NON-NLS-1$
-					break;
-				case '\t' :
-					buffer.append("\\t"); //$NON-NLS-1$
-					break;
-				default :
-					if (Character.isISOControl(c)) {
-						buffer.append("\\u"); //$NON-NLS-1$
-						String hexString = Integer.toHexString(c);
-						for (int j = hexString.length(); j < 4; j++)
-							buffer.append('0');
-						buffer.append(hexString);
-					} else
-						buffer.append(c);
-			}
-		}
-		buffer.append('"');
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/PipedConnection.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/PipedConnection.java
deleted file mode 100644
index 7c87ba2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/PipedConnection.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.transport;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Reader;
-import java.io.Writer;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.transport.Connection;
-import org.eclipse.wst.jsdt.debug.transport.packet.Packet;
-
-/**
- * A {@link Connection} implementation that uses streams for communication
- * 
- * @since 1.0
- */
-public class PipedConnection implements Connection {
-
-	private Writer writer;
-	private Reader reader;
-	private boolean open = true;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param is the {@link InputStream} to read from, <code>null</code> is not accepted
-	 * @param os the {@link OutputStream} to write to, <code>null</code> is not accepted
-	 * @throws IOException
-	 */
-	public PipedConnection(InputStream is, OutputStream os) throws IOException {
-		if(is == null) {
-			throw new IllegalArgumentException("You cannot create a new PipedConnection on a null InputStream"); //$NON-NLS-1$
-		}
-		if(os == null) {
-			throw new IllegalArgumentException("You cannot create a new PipedConnection on a null OutputStream"); //$NON-NLS-1$
-		}
-		writer = new BufferedWriter(new OutputStreamWriter(os, Constants.UTF_8));
-		reader = new BufferedReader(new InputStreamReader(is, Constants.UTF_8));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.Connection#isOpen()
-	 */
-	public synchronized boolean isOpen() {
-		return open;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.Connection#close()
-	 */
-	public synchronized void close() throws IOException {
-		open = false;
-		writer.close();
-		reader.close();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.Connection#writePacket(org.eclipse.wst.jsdt.debug.transport.packet.Packet)
-	 */
-	public void writePacket(Packet packet) throws IOException {
-		String jsonString = JSONUtil.write(packet.toJSON());
-		String count = Integer.toString(jsonString.length());
-		writer.write(count);
-		writer.write('\r');
-		writer.write('\n');
-		writer.write(jsonString);
-		writer.flush();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.Connection#readPacket()
-	 */
-	public Packet readPacket() throws IOException {
-		StringBuffer buffer = new StringBuffer();
-		int c;
-		while ((c = reader.read()) != -1) {
-			if (c == '\r')
-				break;
-			buffer.append((char) c);
-			if (buffer.length() > 10) {
-				throw new IOException("Invalid content length: " + buffer.toString()); //$NON-NLS-1$
-			}
-		}
-
-		int length = 0;
-		try {
-			length = Integer.parseInt(buffer.toString());
-		} catch (NumberFormatException e) {
-			throw new IOException("Failed to parse content length: " + buffer.toString()); //$NON-NLS-1$
-		}
-
-		if ('\r' != c || '\n' != (char) reader.read())
-			throw new IOException("Missing CRLF after content length"); //$NON-NLS-1$
-
-		char[] message = new char[length];
-		int n = 0;
-		int off = 0;
-		while (n < length) {
-			int count = reader.read(message, off + n, length - n);
-			if (count < 0)
-				throw new EOFException();
-			n += count;
-		}
-
-		Map json = (Map) JSONUtil.read(new String(message));
-		String type = RhinoPacket.getType(json);
-		if (EventPacket.TYPE.equals(type))
-			return new EventPacket(json);
-		if (JSONConstants.REQUEST.equals(type))
-			return new RhinoRequest(json);
-		if (JSONConstants.RESPONSE.equals(type))
-			return new RhinoResponse(json);
-
-		throw new IOException("Unknown packet type: " + type); //$NON-NLS-1$
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/PipedTransportService.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/PipedTransportService.java
deleted file mode 100644
index dcce3b6..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/PipedTransportService.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.transport;
-
-import java.io.IOException;
-import java.io.PipedInputStream;
-import java.io.PipedOutputStream;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.transport.Connection;
-import org.eclipse.wst.jsdt.debug.transport.ListenerKey;
-import org.eclipse.wst.jsdt.debug.transport.TransportService;
-
-/**
- * {@link TransportService} specialization for a {@link PipedConnection}
- * 
- * @since 1.0
- */
-public class PipedTransportService implements TransportService {
-
-	/**
-	 * Key specialized for a {@link PipedTransportService}
-	 */
-	public static class PipedListenerKey implements ListenerKey {
-
-		private String address;
-
-		public PipedListenerKey(String address) {
-			this.address = address;
-		}
-
-		public String address() {
-			return address;
-		}
-
-		public int hashCode() {
-			final int prime = 31;
-			int result = 1;
-			result = prime * result + ((address == null) ? 0 : address.hashCode());
-			return result;
-		}
-
-		public boolean equals(Object obj) {
-			if (this == obj)
-				return true;
-			if (obj == null)
-				return false;
-			if (getClass() != obj.getClass())
-				return false;
-			PipedListenerKey other = (PipedListenerKey) obj;
-			if (address == null) {
-				if (other.address != null)
-					return false;
-			} else if (!address.equals(other.address))
-				return false;
-			return true;
-		}
-	}
-
-	Map listeners = new HashMap();
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.TransportService#startListening(java.lang.String)
-	 */
-	public synchronized ListenerKey startListening(String address) throws IOException {
-		ListenerKey key = new PipedListenerKey(address == null ? Constants.EMPTY_STRING : address);
-		listeners.put(key, null);
-		return key;
-	};
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.TransportService#stopListening(org.eclipse.wst.jsdt.debug.transport.ListenerKey)
-	 */
-	public void stopListening(ListenerKey key) throws IOException {
-		synchronized (key) {
-			if (listeners.containsKey(key)) {
-				key.notify();
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.TransportService#accept(org.eclipse.wst.jsdt.debug.transport.ListenerKey, long, long)
-	 */
-	public Connection accept(ListenerKey key, long attachTimeout, long handshakeTimeout) throws IOException {
-		long timeout = attachTimeout;
-		if (timeout > 0) {
-			if (timeout > Integer.MAX_VALUE) {
-				timeout = Integer.MAX_VALUE; // approximately 25 days!
-			}
-		}
-
-		synchronized (listeners) {
-			if (!listeners.containsKey(key))
-				throw new IllegalStateException("not listening"); //$NON-NLS-1$
-
-			if (listeners.get(key) != null)
-				throw new IllegalStateException("PipedTransport only accepts one accept at a time"); //$NON-NLS-1$
-
-			PipedInputStream serveris = new PipedInputStream();
-			PipedOutputStream clientos = new PipedOutputStream();
-			serveris.connect(clientos);
-
-			PipedOutputStream serveros = new PipedOutputStream();
-			PipedInputStream clientis = new PipedInputStream();
-			serveros.connect(clientis);
-
-			listeners.put(key, new PipedConnection(clientis, clientos));
-			listeners.notifyAll();
-			long startTime = System.currentTimeMillis();
-			while (true) {
-				try {
-					listeners.wait(timeout);
-				} catch (InterruptedException e) {
-					throw new IOException("accept failed: interrupted"); //$NON-NLS-1$
-				}
-				if (!listeners.containsKey(key))
-					throw new IOException("accept failed: stopped listening"); //$NON-NLS-1$
-
-				if (listeners.get(key) != null) {
-					if (System.currentTimeMillis() - startTime > timeout) {
-						listeners.put(key, null);
-						throw new IOException("accept failed: timed out"); //$NON-NLS-1$
-					}
-					continue;
-				}
-				return new PipedConnection(serveris, serveros);
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.TransportService#attach(java.lang.String, long, long)
-	 */
-	public Connection attach(String address, long attachTimeout, long handshakeTimeout) throws IOException {
-		ListenerKey key = new PipedListenerKey(address == null ? Constants.EMPTY_STRING : address);
-		Connection connection;
-		long startTime = System.currentTimeMillis();
-		synchronized (listeners) {
-			connection = (Connection) listeners.get(key);
-			while (connection == null) {
-				if (System.currentTimeMillis() - startTime > attachTimeout)
-					throw new IOException("attach failed: timed out"); //$NON-NLS-1$
-				try {
-					listeners.wait(attachTimeout);
-				} catch (InterruptedException e) {
-					throw new IOException("attach failed: interrupted"); //$NON-NLS-1$
-				}
-				connection = (Connection) listeners.get(key);
-			}
-			listeners.put(key, null);
-			listeners.notifyAll();
-		}
-		return connection;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/RhinoPacket.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/RhinoPacket.java
deleted file mode 100644
index 64335db..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/RhinoPacket.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.transport;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.transport.packet.Packet;
-
-/**
- * Abstract description of a packet for sending / receiving information to the debug client
- * using JSON
- *  
- *  @since 1.0
- */
-abstract public class RhinoPacket implements Packet {
-
-	private final String type;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param type the type for the {@link RhinoPacket} <code>null</code> is not accepted
-	 */
-	protected RhinoPacket(String type) {
-		if(type == null) {
-			throw new IllegalArgumentException("The type for a packet cannot be null"); //$NON-NLS-1$
-		}
-		this.type = type.intern();
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param json the pre-composed map of attributes for the packet, <code>null</code> is not accepted
-	 */
-	protected RhinoPacket(Map json) {
-		if(json == null) {
-			throw new IllegalArgumentException("The JSON map for a packet cannot be null"); //$NON-NLS-1$
-		}
-		String packetType = (String) json.get(JSONConstants.TYPE);
-		this.type = packetType.intern();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Packet#getType()
-	 */
-	public String getType() {
-		return type;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Packet#toJSON()
-	 */
-	public Map toJSON() {
-		Map json = new HashMap();
-		json.put(JSONConstants.TYPE, type);
-		return json;
-	}
-
-	/**
-	 * Returns the type from the given JSON map.<br>
-	 * <br>
-	 * This method can return <code>null</code> if the map is not correctly
-	 * formed.
-	 * 
-	 * @param json the JSON map, <code>null</code> is not accepted
-	 * @return the type from the JSON map or <code>null</code>
-	 */
-	public static String getType(Map json) {
-		if(json == null) {
-			throw new IllegalArgumentException("A null JSON map is not allowed when trying to get the packet type"); //$NON-NLS-1$
-		}
-		return (String) json.get(JSONConstants.TYPE);
-	}
-
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("RhinoPacket: ").append(JSONUtil.write(toJSON())); //$NON-NLS-1$
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/RhinoRequest.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/RhinoRequest.java
deleted file mode 100644
index 480d429..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/RhinoRequest.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.transport;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.transport.packet.Request;
-
-/**
- * Default request implementation using JSON
- * 
- * @since 1.0
- */
-public class RhinoRequest extends RhinoPacket implements Request {
-
-	private final String command;
-	private final Map arguments = Collections.synchronizedMap(new HashMap());
-	private static int currentSequence = 0;
-	private final int sequence;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param command the command, <code>null</code> is not accepted
-	 */
-	public RhinoRequest(String command) {
-		super(JSONConstants.REQUEST);
-		if(command == null) {
-			throw new IllegalArgumentException("The request command kind cannot be null"); //$NON-NLS-1$
-		}
-		this.command = command.intern();
-		this.sequence = nextSequence();
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param json map of JSON attributes, <code>null</code> is not accepted
-	 */
-	public RhinoRequest(Map json) {
-		super(json);
-		if(json == null) {
-			throw new IllegalArgumentException("The JSON map for a request packet cannot be null"); //$NON-NLS-1$
-		}
-		String packetCommand = (String) json.get(JSONConstants.COMMAND);
-		this.command = packetCommand.intern();
-		Map packetArguments = (Map) json.get(JSONConstants.ARGUMENTS);
-		arguments.putAll(packetArguments);
-		Number packetSeq = (Number) json.get(JSONConstants.SEQ);
-		this.sequence = packetSeq.intValue();
-	}
-
-	/**
-	 * @return a next value for the sequence
-	 */
-	private static synchronized int nextSequence() {
-		return ++currentSequence;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Request#getSequence()
-	 */
-	public int getSequence() {
-		return sequence;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Request#getCommand()
-	 */
-	public String getCommand() {
-		return command;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Request#getArguments()
-	 */
-	public Map getArguments() {
-		return arguments;
-	}
-
-	/**
-	 * Sets the given argument in the JSON map.
-	 * 
-	 * @param key the key for the attribute, <code>null</code> is not accepted
-	 * @param argument the value for the argument, <code>null</code> is not accepted
-	 */
-	public void setArgument(String key, Object argument) {
-		if(key == null) {
-			throw new IllegalArgumentException("The argument key cannot be null"); //$NON-NLS-1$
-		}
-		if(argument == null) {
-			throw new IllegalArgumentException("A null argument is not allowed"); //$NON-NLS-1$
-		}
-		arguments.put(key, argument);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoPacket#toJSON()
-	 */
-	public Map toJSON() {
-		Map json = super.toJSON();
-		json.put(JSONConstants.SEQ, new Integer(sequence));
-		json.put(JSONConstants.COMMAND, command);
-		json.put(JSONConstants.ARGUMENTS, arguments);
-		return json;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("RhinoRequest: ").append(JSONUtil.write(toJSON())); //$NON-NLS-1$
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/RhinoResponse.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/RhinoResponse.java
deleted file mode 100644
index 9d58a7f..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/RhinoResponse.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.transport;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.transport.packet.Response;
-
-/**
- * Default {@link RhinoResponse} implementation using JSON
- * 
- * @since 1.0
- */
-public class RhinoResponse extends RhinoPacket implements Response {
-
-	private final String command;
-	private final int requestSequence;
-	private final Map body = Collections.synchronizedMap(new HashMap());
-	private volatile boolean success = true;
-	private volatile boolean running = true;
-	private volatile String message;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param requestSequence the sequence
-	 * @param command the command, <code>null</code> is not accepted
-	 */
-	public RhinoResponse(int requestSequence, String command) {
-		super(JSONConstants.RESPONSE);
-		if(command == null) {
-			throw new IllegalArgumentException("The command string for a response packet cannot be null"); //$NON-NLS-1$
-		}
-		this.requestSequence = requestSequence;
-		this.command = command.intern();
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param json the JSON map for a response, <code>null</code> is not accepted
-	 */
-	public RhinoResponse(Map json) {
-		super(json);
-		Number packetRequestSeq = (Number) json.get(JSONConstants.REQUEST_SEQ);
-		requestSequence = packetRequestSeq.intValue();
-
-		String packetCommand = (String) json.get(JSONConstants.COMMAND);
-		command = packetCommand.intern();
-
-		Map packetBody = (Map) json.get(JSONConstants.BODY);
-		body.putAll(packetBody);
-
-		Boolean packetSuccess = (Boolean) json.get(JSONConstants.SUCCESS);
-		success = packetSuccess.booleanValue();
-
-		Boolean packetRunning = (Boolean) json.get(JSONConstants.RUNNING);
-		running = packetRunning.booleanValue();
-
-		message = (String) json.get(JSONConstants.MESSAGE);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Response#getRequestSequence()
-	 */
-	public int getRequestSequence() {
-		return requestSequence;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Response#getCommand()
-	 */
-	public String getCommand() {
-		return command;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Response#getBody()
-	 */
-	public Map getBody() {
-		return body;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Response#isSuccess()
-	 */
-	public boolean isSuccess() {
-		return success;
-	}
-
-	/**
-	 * Set the success flag for the response
-	 * 
-	 * @param success the new success flag
-	 */
-	public void setSuccess(boolean success) {
-		this.success = success;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Response#isRunning()
-	 */
-	public boolean isRunning() {
-		return running;
-	}
-
-	/**
-	 * Sets the running state of the underlying command
-	 * 
-	 * @param running the new running state for the underlying command
-	 */
-	public void setRunning(boolean running) {
-		this.running = running;
-	}
-
-	/**
-	 * Returns the status message for this {@link RhinoResponse}.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the status message for this {@link RhinoResponse} or <code>null</code>
-	 */
-	public String getMessage() {
-		return message;
-	}
-
-	/**
-	 * Set the status message for this {@link RhinoResponse}
-	 * 
-	 * @param message the new message, <code>null</code> is accepted
-	 */
-	public void setMessage(String message) {
-		this.message = message;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoPacket#toJSON()
-	 */
-	public Map toJSON() {
-		Map json = super.toJSON();
-		json.put(JSONConstants.REQUEST_SEQ, new Integer(requestSequence));
-		json.put(JSONConstants.COMMAND, command);
-		json.put(JSONConstants.BODY, body);
-		json.put(JSONConstants.SUCCESS, new Boolean(success));
-		json.put(JSONConstants.RUNNING, new Boolean(running));
-		if (message != null) {
-			json.put(JSONConstants.MESSAGE, message);
-		}
-		return json;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("RhinoResponse: ").append(JSONUtil.write(toJSON())); //$NON-NLS-1$
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/RhinoSocketConnection.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/RhinoSocketConnection.java
deleted file mode 100644
index f3d7a00..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/RhinoSocketConnection.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.transport;
-
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.Reader;
-import java.io.Writer;
-import java.net.Socket;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.transport.Connection;
-import org.eclipse.wst.jsdt.debug.transport.packet.Packet;
-import org.eclipse.wst.jsdt.debug.transport.socket.SocketConnection;
-
-/**
- * A specialized {@link Connection} that communicates using {@link Socket}s
- * 
- * @since 1.0
- */
-public class RhinoSocketConnection extends SocketConnection {
-
-	/**
-	 * Constructor
-	 * 
-	 * @param socket the underlying {@link Socket}, <code>null</code> is not accepted
-	 * 
-	 * @throws IOException
-	 */
-	public RhinoSocketConnection(Socket socket) throws IOException {
-		super(socket);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.socket.SocketConnection#writePacket(org.eclipse.wst.jsdt.debug.transport.packet.Packet)
-	 */
-	public void writePacket(Packet packet) throws IOException {
-		String jsonString = JSONUtil.write(packet.toJSON());
-		String count = Integer.toString(jsonString.length());
-		Writer writer = getWriter();
-		writer.write(count);
-		writer.write('\r');
-		writer.write('\n');
-		writer.write(jsonString);
-		writer.flush();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.socket.SocketConnection#readPacket()
-	 */
-	public Packet readPacket() throws IOException {
-		if(!isOpen()) {
-			throw new IOException("Failed to read more packets: the socket is closed"); //$NON-NLS-1$
-		}
-		StringBuffer buffer = new StringBuffer();
-		int c;
-		Reader reader = getReader();
-		while ((c = reader.read()) != -1) {
-			if (c == '\r')
-				break;
-			buffer.append((char) c);
-			if (buffer.length() > 10) {
-				throw new IOException("Invalid content length: " + buffer.toString()); //$NON-NLS-1$
-			}
-		}
-
-		int length = 0;
-		try {
-			length = Integer.parseInt(buffer.toString());
-		} catch (NumberFormatException e) {
-			throw new IOException("Failed to parse content length: " + buffer.toString()); //$NON-NLS-1$
-		}
-		if ('\r' != c || '\n' != (char) reader.read())
-			throw new IOException("Missing CRLF after content length"); //$NON-NLS-1$
-
-		char[] message = new char[length];
-		int n = 0;
-		int off = 0;
-		while (n < length) {
-			int count = reader.read(message, off + n, length - n);
-			if (count < 0)
-				throw new EOFException();
-			n += count;
-		}
-		Map json = (Map) JSONUtil.read(new String(message));
-		String type = RhinoPacket.getType(json);
-		if (EventPacket.TYPE.equals(type))
-			return new EventPacket(json);
-		if (JSONConstants.REQUEST.equals(type))
-			return new RhinoRequest(json);
-		if (JSONConstants.RESPONSE.equals(type))
-			return new RhinoResponse(json);
-
-		throw new IOException("Unknown packet type: " + type); //$NON-NLS-1$
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/RhinoTransportService.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/RhinoTransportService.java
deleted file mode 100644
index 8d7c4b7..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/RhinoTransportService.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.transport;
-
-import java.io.IOException;
-import java.net.Socket;
-
-import org.eclipse.wst.jsdt.debug.transport.Connection;
-import org.eclipse.wst.jsdt.debug.transport.packet.Packet;
-import org.eclipse.wst.jsdt.debug.transport.socket.SocketConnection;
-import org.eclipse.wst.jsdt.debug.transport.socket.SocketTransportService;
-
-/**
- * Implementation of a transport service that using a {@link Socket} for communication
- * 
- * @since 1.0
- */
-public class RhinoTransportService extends SocketTransportService {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.socket.SocketTransportService#getConnection(java.net.Socket)
-	 */
-	public SocketConnection getConnection(Socket socket) throws IOException {
-		return new RhinoSocketConnection(socket);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.socket.SocketTransportService#handleAccept(org.eclipse.wst.jsdt.debug.transport.Connection)
-	 */
-	public void handleAccept(Connection connection) throws IOException {
-		Packet packet = connection.readPacket();
-		if (packet instanceof RhinoRequest) {
-			RhinoRequest request = (RhinoRequest) packet;
-			if (!request.getCommand().equals(JSONConstants.CONNECT)) {
-				throw new IOException("failure establishing connection"); //$NON-NLS-1$
-			}
-			RhinoResponse response = new RhinoResponse(request.getSequence(), request.getCommand());
-			connection.writePacket(response);
-			return;
-		}
-		throw new IOException("failure establishing connection"); //$NON-NLS-1$
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.socket.SocketTransportService#handleAttach(org.eclipse.wst.jsdt.debug.transport.Connection)
-	 */
-	public void handleAttach(Connection connection) throws IOException {
-		RhinoRequest request = new RhinoRequest(JSONConstants.CONNECT);
-		connection.writePacket(request);
-		Packet packet = connection.readPacket();
-		if (packet instanceof RhinoResponse) {
-			RhinoResponse response = (RhinoResponse) packet;
-			if (!response.getCommand().equals(JSONConstants.CONNECT) || response.getRequestSequence() != request.getSequence() || !response.isSuccess() || !response.isRunning()) {
-				throw new IOException("failure establishing connection"); //$NON-NLS-1$
-			}
-			return;
-		}
-		throw new IOException("failure establishing connection"); //$NON-NLS-1$
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/messages.properties b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/messages.properties
deleted file mode 100644
index 432ac35..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/messages.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2010 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-failure_establishing_connection=failure establishing connection
-runtime_disconnected=Runtime disconnected
-time_out_waiting_for_command_packet=Time out waiting for command packet for: {0}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/rhino/debugger/RhinoDebugger.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/rhino/debugger/RhinoDebugger.java
deleted file mode 100644
index 019e95a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/rhino/debugger/RhinoDebugger.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.rhino.debugger;
-
-import org.eclipse.wst.jsdt.debug.internal.rhino.debugger.RhinoDebuggerImpl;
-import org.mozilla.javascript.Context;
-import org.mozilla.javascript.ContextFactory;
-
-/**
- * Rhino debugger
- * 
- * @since 1.0
- */
-public final class RhinoDebugger implements ContextFactory.Listener {
-	
-	/**
-	 * Delegate debugger
-	 */
-	private RhinoDebuggerImpl impl;
-
-	/**
-	 * This constructor will only accept a <code>transport</code> argument
-	 * of <code>socket</code>. I.e. <code>transport=socket</code>.
-	 * 
-	 * @param configString the configuration string, for example: <code>transport=socket,suspend=y,address=9000</code>
-	 */
-	public RhinoDebugger(String configString) {
-		impl = new RhinoDebuggerImpl(configString);
-	}
-	
-	/**
-	 * Starts the debugger
-	 * 
-	 * @throws Exception if the debugger could not start
-	 */
-	public void start() throws Exception {
-		impl.start();
-	}
-
-	/**
-	 * Stops the debugger
-	 */
-	public void stop() throws Exception {
-		impl.stop();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.mozilla.javascript.ContextFactory.Listener#contextCreated(org.mozilla.javascript.Context)
-	 */
-	public void contextCreated(Context context) {
-		impl.contextCreated(context);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.mozilla.javascript.ContextFactory.Listener#contextReleased(org.mozilla.javascript.Context)
-	 */
-	public void contextReleased(Context context) {
-		impl.contextReleased(context);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/rhino/debugger/shell/DebugMain.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/rhino/debugger/shell/DebugMain.java
deleted file mode 100644
index bb19337..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/rhino/debugger/shell/DebugMain.java
+++ /dev/null
@@ -1,365 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.rhino.debugger.shell;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.wst.jsdt.debug.internal.rhino.debugger.RhinoDebuggerImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoTransportService;
-import org.eclipse.wst.jsdt.debug.transport.TransportService;
-import org.mozilla.javascript.Context;
-import org.mozilla.javascript.ContextAction;
-import org.mozilla.javascript.Kit;
-import org.mozilla.javascript.Script;
-import org.mozilla.javascript.Scriptable;
-import org.mozilla.javascript.ScriptableObject;
-import org.mozilla.javascript.tools.ToolErrorReporter;
-import org.mozilla.javascript.tools.shell.Main;
-
-/**
- * A proxy to running {@link Main} that allows us to run a batch of scripts without using the 
- * <code>-e load(...)</code> arguments. As well any argument not paired to a known kind (see below) will be considered
- * as an absolute path to a script (*.js) file.
- * <br><br>
- * This runner supports the following:
- * <ul>
- * <li><code>-debug</code> to have the interpreter generate debugging tracing</li>
- * <li><code>-e [script_src]</code> to evaluate the following argument as a script</li>
- * <li><code>-encoding</code> to set the character encoding to use</li>
- * <li><code>-f [absolute_file_paths]</code> to specify one or more *.js files to evaluate. This argument differs
- * from the Rhino {@link Main} one, in that any following arguments will be treated as absolute
- * paths to script (*.js) files.</li>
- * <li><code>-fatal-warnings</code> to have all warnings are treated as error</li>
- * <li><code>-help</code> or <code>-?</code>, to pretty-print the available commands</li>
- * <li><code>-opt</code> or <code>-O</code> to set the optimization level. Where available levels are -1 (interpret only), 0 (none), 1-9 (all optimizations)</li>
- * <li><code>-port [port]</code> to set the port to communicate on</li>
- * <li><code>-sealedlib</code> to set the standard libraries as sealed - meaning they cannot be modified by any evaluating script(s)</li>
- * <li><code>-strict</code> to set the interpreter in strict mode and report all warnings</li>
- * <li><code>-suspend</code> to set if the debugger should start suspended and wait for a client to connect before continuing</li>
- * <li><code>-trace</code> to enabled debugger tracing</li>
- * <li><code>-version [version_number]</code>, where <code>version_number</code> is one of: 100, 110, 120, 130, 140, 150, 160, 170</li>
- * <li><code>-w</code> to report warnings</li>
- * </ul>
- * <br>
- * The following examples assume you have properly set up your classpath to reference <code>org.mozilla.javascript.jar</code>,
- * <code>org.eclipse.wst.jsdt.debug.rhino.debugger.jar</code> and <code>org.eclipse.wst.jsdt.debug.transport</code>. Also the 
- * fully qualified name use to run DebugMain is <code>org.eclipse.wst.jsdt.debug.rhino.debugger.shell.DebugMain</code>
- * Examples
- * <br><br>
- * <code>%>java DebugMain -opt 7 -strict -f /home/user/scripts/a.js /home/user/scripts/b.js -version 170</code>
- * <code>%> java DebugMain -version 140 -e load('/home/user/scripts/a.js','/home/user/scripts/b.js')</code>
- * @since 1.1
- */
-public class DebugMain {
-
-	/**
-	 * Class to run an evaluated script when using <code>-e</code>
-	 */
-	static class Evaluator implements ContextAction {
-		String scriptsrc = null;
-		String[] scripts = null;
-		
-		/* (non-Javadoc)
-		 * @see org.mozilla.javascript.ContextAction#run(org.mozilla.javascript.Context)
-		 */
-		public Object run(Context cx) {
-			if(scriptsrc == null && scripts == null) {
-				throw Kit.codeBug();
-			}
-			if(scriptsrc != null) {
-				Script script = Main.loadScriptFromSource(cx, scriptsrc, FROM_EVAL, 0, null);
-				if(script != null) {
-					Main.evaluateScript(script, cx, Main.getGlobal());
-				}
-			}
-			Object[] array = new Object[scripts.length];
-	        System.arraycopy(scripts, 0, array, 0, scripts.length);
-			Scriptable argsObj = cx.newArray(Main.global, array);
-	        Main.global.defineProperty(GLOBAL_ARGUMENTS, argsObj, ScriptableObject.DONTENUM);
-	        for (int i = 0; i < scripts.length; i++) {
-				Main.processFile(cx, Main.global, scripts[i]);
-			}
-			return null; 
-		}
-		
-		void reset() {
-			scriptsrc = null;
-			scripts = null;
-		}
-	}
-	
-	/**
-	 * Constant representing the debug argument
-	 * <br><br>
-	 * Value is: <code>-debug</code>
-	 */
-	public static final String ARG_DEBUG = "-debug"; //$NON-NLS-1$
-	/**
-	 * Constant representing the evaluate argument
-	 * <br><br>
-	 * Value is: <code>-e</code>
-	 */
-	public static final String ARG_E = "-e"; //$NON-NLS-1$
-	/**
-	 * Constant representing the encoding argument
-	 * <br><br>
-	 * Value is: <code>-encoding</code>
-	 */
-	public static final String ARG_ENCODING = "-encoding"; //$NON-NLS-1$
-	/**
-	 * Constant representing the script file(s) argument
-	 * <br><br>
-	 * Value is: <code>-f</code>
-	 */
-	public static final String ARG_F = "-f"; //$NON-NLS-1$
-	/**
-	 * Constant representing the fatal-warnings argument
-	 * <br><br>
-	 * Value is: <code>-fatal-warnings</code>
-	 */
-	public static final String ARG_FATAL_WARNINGS = "-fatal-warnings"; //$NON-NLS-1$
-	/**
-	 * Constant representing the help argument
-	 * <br><br>
-	 * Value is: <code>-help</code>
-	 */
-	public static final String ARG_HELP = "-help"; //$NON-NLS-1$
-	/**
-	 * Constant representing the optimization argument
-	 * <br><br>
-	 * Value is: <code>-O</code>
-	 */
-	public static final String ARG_O = "-O"; //$NON-NLS-1$
-	/**
-	 * Constant representing the optimization argument
-	 * <br><br>
-	 * Value is: <code>-opt</code>
-	 */
-	public static final String ARG_OPT = "-opt"; //$NON-NLS-1$
-	/**
-	 * Constant representing the help argument
-	 * <br><br>
-	 * Value is: <code>-?</code>
-	 */
-	public static final String ARG_QM = "-?"; //$NON-NLS-1$
-	/**
-	 * Constant representing the sealed lib argument
-	 * <br><br>
-	 * Value is: <code>-sealedlib</code>
-	 */
-	public static final String ARG_SEALEDLIB = "-sealedlib"; //$NON-NLS-1$
-	/**
-	 * Constant representing the strict argument
-	 * <br><br>
-	 * Value is: <code>-strict</code>
-	 */
-	public static final String ARG_STRICT = "-strict"; //$NON-NLS-1$
-	/**
-	 * Constant representing the version argument
-	 * <br><br>
-	 * Value is: <code>-version</code>
-	 */
-	private static final String ARG_VERSION = "-version"; //$NON-NLS-1$
-	/**
-	 * Constant representing the report warnings argument
-	 * <br><br>
-	 * Value is: <code>-w</code>
-	 */
-	public static final String ARG_W = "-w"; //$NON-NLS-1$
-	/**
-	 * Constant representing the invalid message identifier for {@link Main}
-	 * <br><br>
-	 * Value is: <code>msg.shell.invalid</code>
-	 */
-	public static final String MSG_SHELL_INVALID = "msg.shell.invalid"; //$NON-NLS-1$
-	/**
-	 * Constant representing the invalid usage message identifier for {@link Main}
-	 * <br><br>
-	 * Value is: <code>msg.shell.usage</code>
-	 */
-	public static final String MSG_SHELL_USAGE = "msg.shell.usage"; //$NON-NLS-1$
-	/**
-	 * Copy from {@link Main} to specify as the path when evaluating a script via the <code>-e</code> argument
-	 * <br><br>
-	 * Value is: <code>&lt;command&gt;</code>
-	 */
-	public static final String FROM_EVAL = "<command>"; //$NON-NLS-1$
-	/**
-	 * Constant representing the name of the array containing the original script arguments in the global context
-	 * <br><br>
-	 * Value is: <code>arguments</code>
-	 */
-	public static final String GLOBAL_ARGUMENTS = "arguments"; //$NON-NLS-1$
-
-	private static Evaluator evaluate = new Evaluator();
-	
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args) {
-		ToolErrorReporter reporter = new ToolErrorReporter(true);
-		Main.shellContextFactory.setErrorReporter(reporter);
-		startDebugger(args);
-		ArrayList scripts = new ArrayList();
-		processArgs(args, scripts, reporter);
-		if(scripts.size() > 0) {
-			checkGlobal();
-			evaluate.reset();
-			evaluate.scripts = (String[]) scripts.toArray(new String[scripts.size()]);
-			Main.shellContextFactory.call(evaluate);
-		}
-	}
-
-	static void startDebugger(String[] args) {
-		String port = DebugShell.DEFAULT_PORT;
-		boolean suspend = false, 
-		        trace = false;
-		for (int i = 0; i < args.length; i++) {
-			if (DebugShell.ARG_PORT.equals(args[i])) {
-    			port = args[++i];
-    		} 
-			else if (DebugShell.ARG_SUSPEND.equals(args[i])) {
-				suspend = DebugShell.isSuspend(args[++i]);
-    		}
-    		else if(DebugShell.ARG_TRACE.equals(args[i])) {
-    			trace = Boolean.valueOf(args[++i]).booleanValue();
-    		}
-		}
-		TransportService service = new RhinoTransportService();
-		RhinoDebuggerImpl debugger = new RhinoDebuggerImpl(service, port, suspend, trace);
-		try {
-			debugger.start();
-			Main.shellContextFactory.addListener(debugger);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-	
-	/**
-	 * Walks over the original argument list and sets the corresponding arguments in Rhino
-	 * 
-	 * @param originalargs
-	 * @param scriptcollector
-	 * @param reporter
-	 */
-	static void processArgs(String[] originalargs, List scriptcollector, ToolErrorReporter reporter) {
-		try {
-			for (int i = 0; i < originalargs.length; i++) {
-				String arg = originalargs[i];
-	    		if(ARG_DEBUG.equals(arg)) {
-					Main.shellContextFactory.setGeneratingDebug(true);
-				}
-				else if(ARG_E.equals(arg)) {
-					peekArg(originalargs, i, false);
-					checkGlobal();
-	                evaluate.scriptsrc = originalargs[++i];
-	                Main.shellContextFactory.call(evaluate);
-				}
-				else if(ARG_ENCODING.equals(arg)) {
-					peekArg(originalargs, i, false);
-	                String enc = originalargs[++i];
-	                Main.shellContextFactory.setCharacterEncoding(enc);
-	            }
-				else if (ARG_F.equals(arg)) {
-	                peekArg(originalargs, i, false);
-	                String script = originalargs[++i];
-	                try {
-		                do {
-		                	scriptcollector.add(script);
-		                	peekArg(originalargs, i, false);
-		                	script = originalargs[++i];
-		                } while(true);
-	                }
-	                catch(IllegalArgumentException iae) {
-	                	//do nothing, we are done collecting
-	                }
-	            }
-				else if (ARG_FATAL_WARNINGS.equals(arg)) {
-	                Main.shellContextFactory.setWarningAsError(true);
-	            }
-				else if (ARG_QM.equals(arg) || ARG_HELP.equals(arg)) {
-	                Main.global.getOut().println(ToolErrorReporter.getMessage(MSG_SHELL_USAGE, Main.class.getName()));
-	                System.exit(1);
-		        }
-				else if(ARG_VERSION.equals(arg)) {
-	            	peekArg(originalargs, i, false);
-	                int version;
-	                try {
-	                    version = Integer.parseInt(originalargs[++i]);
-	                } catch (NumberFormatException ex) {
-	                    throw new IllegalArgumentException(originalargs[i]);
-	                }
-	                if (!Context.isValidLanguageVersion(version)) {
-	                	 throw new IllegalArgumentException(originalargs[i]);
-	                }
-	                Main.shellContextFactory.setLanguageVersion(version);
-	            }
-				else if (ARG_OPT.equals(arg) || ARG_O.equals(arg)) {
-					peekArg(originalargs, i, true);
-	                int opt;
-	                try {
-	                    opt = Integer.parseInt(originalargs[++i]);
-	                } catch (NumberFormatException ex) {
-	                   throw new IllegalArgumentException(originalargs[i]);
-	                }
-	                if (opt == -2) {
-	                    // Compatibility with Cocoon Rhino fork
-	                    opt = -1;
-	                } else if (!Context.isValidOptimizationLevel(opt)) {
-	                	throw new IllegalArgumentException(originalargs[i]);
-	                }
-	                Main.shellContextFactory.setOptimizationLevel(opt);
-	            }
-				else  if (ARG_SEALEDLIB.equals(arg)) {
-	            	Main.global.setSealedStdLib(true);
-	            }
-				else if (ARG_STRICT.equals(arg)) {
-	                Main.shellContextFactory.setStrictMode(true);
-	                reporter.setIsReportingWarnings(true);
-	            }
-				else if (ARG_W.equals(arg)) {
-	                reporter.setIsReportingWarnings(true);
-	            }
-			}
-		}
-		catch(IllegalArgumentException iae) {
-			Main.global.getOut().println(ToolErrorReporter.getMessage(MSG_SHELL_INVALID, iae.getMessage()));
-	        Main.global.getOut().println(ToolErrorReporter.getMessage(MSG_SHELL_USAGE, Main.class.getName()));
-	        System.exit(1);
-		}
-	}
-	
-	/**
-	 * Checks to see if the global context has been initialized, if not, it is initialized
-	 */
-	static void checkGlobal() {
-		if(!Main.global.isInitialized()) {
-        	Main.global.init(Main.shellContextFactory);
-        }
-	}
-	
-	/**
-	 * peeks at the next argument entry to see if it exists and is not another <code>-&lt;arg&gt;</code>
-	 * @param args
-	 * @param idx
-	 * @param ignoreswitch
-	 * @throws IllegalArgumentException if the next argument is not valid
-	 */
-	static void peekArg(String[] args, int idx, boolean ignoreswitch) throws IllegalArgumentException {
-		if((idx+1 < args.length)) {
-			if(!args[idx+1].startsWith("-") || ignoreswitch) { //$NON-NLS-1$
-				return;
-			}
-		}
-		throw new IllegalArgumentException(args[idx]);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/rhino/debugger/shell/DebugShell.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/rhino/debugger/shell/DebugShell.java
deleted file mode 100644
index 8397d3b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/rhino/debugger/shell/DebugShell.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.rhino.debugger.shell;
-
-import java.text.DateFormat;
-import java.util.ArrayList;
-import java.util.Calendar;
-
-import org.eclipse.wst.jsdt.debug.internal.rhino.debugger.RhinoDebuggerImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoTransportService;
-import org.eclipse.wst.jsdt.debug.transport.TransportService;
-import org.mozilla.javascript.tools.shell.Main;
-
-/**
- * Entry point for launching a Rhino debugger
- * 
- * @since 1.0
- */
-public final class DebugShell {
-	
-    /**
-	 * Constant representing the default port
-	 * <br><br>
-	 * Value is: <code>9888</code>
-	 */
-	public static final String DEFAULT_PORT = "9888"; //$NON-NLS-1$
-	/**
-	 * Constant representing the trace argument
-	 * <br><br>
-	 * Value is: <code>-trace</code>
-	 */
-	public static final String ARG_TRACE = "-trace"; //$NON-NLS-1$
-	/**
-	 * Constant representing the suspend argument
-	 * <br><br>
-	 * Value is: <code>-suspend</code>
-	 */
-	public static final String ARG_SUSPEND = "-suspend"; //$NON-NLS-1$
-	/**
-	 * Constant representing the port argument
-	 * <br><br>
-	 * Value is: <code>-port</code>
-	 */
-	public static final String ARG_PORT = "-port"; //$NON-NLS-1$
-
-	public static void main(String args[]) {
-    	
-    	String port = DEFAULT_PORT;
-    	boolean suspend = false;
-    	boolean trace = true;
-    	
-    	ArrayList argList = new ArrayList();
-    	for (int i = 0; i < args.length; i++) {
-    		String arg = args[i];
-    		if (ARG_PORT.equals(arg)) {
-    			port = args[++i];
-    			continue;
-    		} else if (ARG_SUSPEND.equals(arg)) {
-    			suspend = isSuspend(args[++i]);
-    			continue;
-    		}
-    		else if(ARG_TRACE.equals(arg)) {
-    			trace = Boolean.valueOf(args[++i]).booleanValue();
-    			continue;
-    		}
-    		//forward all other args to Rhino
-    		argList.add(arg);
-		}
-    	String[] newArgs = (String[]) argList.toArray(new String[0]); 
-    	
-		TransportService service = new RhinoTransportService();
-		RhinoDebuggerImpl debugger = new RhinoDebuggerImpl(service, port, suspend, trace);
-		try {
-			if(trace) {
-				prettyPrintHeader(suspend, port);
-			}
-			debugger.start();
-			Main.shellContextFactory.addListener(debugger);
-			Main.exec(newArgs);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-    }
-	
-	/**
-	 * Pretty print the header for the debugger
-	 * 
-	 * @since 1.1
-	 */
-	static void prettyPrintHeader(boolean suspended, String port) {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("Rhino debugger\n"); //$NON-NLS-1$
-		buffer.append("Start at time: ").append(getStartAtDate()); //$NON-NLS-1$
-		buffer.append("\nListening to socket on "); //$NON-NLS-1$
-		buffer.append("port: ").append(port); //$NON-NLS-1$
-		if (suspended) {
-			buffer.append("\nStarted suspended - waiting for client resume..."); //$NON-NLS-1$
-		}
-		System.out.println(buffer.toString());
-	}
-	
-	/**
-	 * Returns the formatted date
-	 * 
-	 * @return the formatted date
-	 * @see http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4981314
-	 * @since 1.1
-	 */
-	static String getStartAtDate() {
-		try {
-			return DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG).format(Calendar.getInstance().getTime());
-		} catch (Throwable t) {
-			return "<unknown>"; //$NON-NLS-1$
-		}
-	}
-	
-	/**
-	 * Returns if the given argument should suspend 
-	 * @param arg
-	 * @return <code>true</code> if the argument is "true" or "y"
-	 */
-	public static boolean isSuspend(String arg) {
-		return Boolean.valueOf(arg).booleanValue() || 
-		       "y".equals(arg.toLowerCase());  //$NON-NLS-1$
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/.classpath b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/.classpath
deleted file mode 100644
index 2fbb7a2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/.project b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/.project
deleted file mode 100644
index af8f95c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.jsdt.debug.rhino.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index de9eac3..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,90 +0,0 @@
-#Fri Apr 30 10:04:28 CDT 2010
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
-org.eclipse.jdt.core.compiler.problem.deadCode=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=error
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=error
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=error
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=error
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index d1b1a29..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,30 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Bundle-Name
-Bundle-SymbolicName: org.eclipse.wst.jsdt.debug.rhino.ui;singleton:=true
-Bundle-Version: 1.0.1.qualifier
-Bundle-Activator: org.eclipse.wst.jsdt.debug.internal.rhino.ui.RhinoUIPlugin
-Bundle-Vendor: %providerName
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.jdt.launching,
- org.eclipse.debug.core,
- org.eclipse.debug.ui,
- org.eclipse.wst.jsdt.core,
- org.eclipse.wst.jsdt.manipulation,
- org.eclipse.ltk.core.refactoring,
- org.eclipse.wst.jsdt.debug.ui,
- org.eclipse.ui.ide,
- org.eclipse.wst.jsdt.debug.rhino.debugger,
- org.eclipse.wst.jsdt.debug.rhino,
- org.eclipse.wst.jsdt.debug.core,
- org.mozilla.javascript;bundle-version="1.7.2",
- org.eclipse.core.expressions,
- org.eclipse.wst.jsdt.ui
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.wst.jsdt.debug.internal.rhino.ui;x-internal:=true,
- org.eclipse.wst.jsdt.debug.internal.rhino.ui.launching;x-internal:=true,
- org.eclipse.wst.jsdt.debug.internal.rhino.ui.preferences;x-internal:=true,
- org.eclipse.wst.jsdt.debug.internal.rhino.ui.refactoring;x-internal:=true,
- org.eclipse.wst.jsdt.debug.internal.rhino.ui.source;x-internal:=true
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/OSGI-INF/l10n/bundle.properties b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/OSGI-INF/l10n/bundle.properties
deleted file mode 100644
index 54204db..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/OSGI-INF/l10n/bundle.properties
+++ /dev/null
@@ -1,28 +0,0 @@
-###############################################################################
-# Copyright (c) 2010 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-providerName = Eclipse Web Tools Platform
-Bundle-Name = Rhino Debug UI
-launchConfigurationType.name = Rhino JavaScript
-launchDelegate.name = Rhino JavaScript Launcher
-launchDelegate.description = Allows Rhino to be debugged with a single click
-sourceLocator.name = Rhino Source Locator
-launchConfigurationTabGroup.description = This tab group allows you to create and configure launches for Rhino
-scriptRenameParticipant.name = Rhino Script Rename Participant
-scriptMoveParticipant.name = Rhino Script Move Participant
-projectRenameParticipant.name = Rhino Project Rename Participant
-folderRenameParticipant.name = Rhino Folder Rename Participant
-folderMoveParticipant.name = Rhino Folder Move Participant
-shortcut.description = Launches an all-in-one Rhino interpreter and debugger
-shortcut.label = Rhino JavaScript
-description.description = Debugs a script or project of scripts in the Rhino interpreter
-
-rhinoDebugPrefPage.name = Rhino
-rhinoDebugKeyword.label = rhino,debug,debugging,javascript.suspend,breakpoint,stdin,resume
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/about.html b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/about.html
deleted file mode 100644
index b3906a9..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/about.html
+++ /dev/null
@@ -1,87 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>April 20, 2007</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
-indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-<h3>Third Party Content</h3>
-
-<p>The Content includes items that have been sourced from third parties as set out below. If you 
-did not receive this Content directly from the Eclipse Foundation, the following is provided 
-for informational purposes only, and you should look to the Redistributor&rsquo;s license for 
-terms and conditions of use.</p>
-
-<h4>Ispell 3.1.20</h4>
-
-<p>The plug-in is accompanied by software developed by Geoff Kuenning.  The following files:</p>
-<ul>
-	<li>dictionaries/en_US.dictionary</li>
-	<li>dictionaries/en_GB.dictionary</li>
-</ul>
-
-<p>are based on Ispell 3.1.20.  The home page for Ispell is located at <a href="http://lasr.cs.ucla.edu/geoff/ispell.html" target="_blank">http://lasr.cs.ucla.edu/geoff/ispell.html</a>.</p>
-
-<p>Your use of Ispell 3.1.20 in the plug-in is subject to the terms and conditions of the Ispell license.  A copy of the Ispell license is included in
-<a href="about_files/ispell-license.txt" target="_blank">about_files/ispell-license.txt</a> and is also reproduced below:</p>
-
-<blockquote>
-  Copyright 1993, Geoff Kuenning, Granada Hills, CA<br />
-  All rights reserved.<br />
-<br />
-  Redistribution and use in source and binary forms, with or without<br />
-  modification, are permitted provided that the following conditions<br />
-  are met:<br />
-<br />
-  1. Redistributions of source code must retain the above copyright<br />
-     notice, this list of conditions and the following disclaimer.<br />
-  2. Redistributions in binary form must reproduce the above copyright<br />
-     notice, this list of conditions and the following disclaimer in the<br />
-     documentation and/or other materials provided with the distribution.<br />
-  3. All modifications to the source code must be clearly marked as<br />
-     such.  Binary redistributions based on modified source code<br />
-     must be clearly marked as modified versions in the documentation<br />
-     and/or other materials provided with the distribution.<br />
-  4. All advertising materials mentioning features or use of this software<br />
-     must display the following acknowledgment:<br />
-     This product includes software developed by Geoff Kuenning and<br />
-     other unpaid contributors.<br />
-  5. The name of Geoff Kuenning may not be used to endorse or promote<br />
-     products derived from this software without specific prior<br />
-     written permission.<br />
-<br />
-  THIS SOFTWARE IS PROVIDED BY GEOFF KUENNING AND CONTRIBUTORS ``AS<br />
-  IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT<br />
-  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS<br />
-  FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL GEOFF<br />
-  KUENNING OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,<br />
-  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,<br />
-  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;<br />
-  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER<br />
-  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT<br />
-  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN<br />
-  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE<br />
-  POSSIBILITY OF SUCH DAMAGE.<br />
-</blockquote>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/build.properties b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/build.properties
deleted file mode 100644
index 6e8c762..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/build.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-###############################################################################
-# Copyright (c) 2010, 2011 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               OSGI-INF/l10n/bundle.properties,\
-               icons/,\
-               about.html,\
-               OSGI-INF/
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/icons/elcl16/library.gif b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/icons/elcl16/library.gif
deleted file mode 100755
index cb55e33..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/icons/elcl16/library.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/icons/elcl16/main_tab.gif b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/icons/elcl16/main_tab.gif
deleted file mode 100755
index 9b9f79a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/icons/elcl16/main_tab.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/icons/elcl16/rhino.gif b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/icons/elcl16/rhino.gif
deleted file mode 100644
index f3ba88b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/icons/elcl16/rhino.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/icons/elcl16/script.gif b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/icons/elcl16/script.gif
deleted file mode 100644
index 1753b96..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/icons/elcl16/script.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/plugin.xml b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/plugin.xml
deleted file mode 100644
index c7d1819..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/plugin.xml
+++ /dev/null
@@ -1,210 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-<plugin>
-   <extension
-         point="org.eclipse.debug.core.launchConfigurationTypes">
-      <launchConfigurationType
-            id="org.eclipse.wst.jsdt.debug.rhino.ui.launch.config.type"
-            modes="debug"
-            name="%launchConfigurationType.name"
-            public="true"
-            sourceLocatorId="org.eclipse.wst.jsdt.debug.rhino.ui.source.locator">
-      </launchConfigurationType>
-   </extension>
-   <extension
-         point="org.eclipse.debug.core.launchDelegates">
-      <launchDelegate
-            delegate="org.eclipse.wst.jsdt.debug.internal.rhino.ui.launching.RhinoLocalLaunchDelegate"
-            delegateDescription="%launchDelegate.description"
-            id="org.eclipse.wst.jsdt.debug.rhino.ui.local.launch.delegate"
-            modes="debug"
-            name="%launchDelegate.name"
-            sourceLocatorId="org.eclipse.wst.jsdt.debug.rhino.ui.source.locator"
-            sourcePathComputerId="org.eclipse.wst.jsdt.debug.rhino.ui.source.path.computer"
-            type="org.eclipse.wst.jsdt.debug.rhino.ui.launch.config.type">
-      </launchDelegate>
-   </extension>
-   <extension
-         point="org.eclipse.debug.core.sourceLocators">
-      <sourceLocator
-            class="org.eclipse.wst.jsdt.debug.internal.rhino.ui.source.RhinoSourceDirector"
-            id="org.eclipse.wst.jsdt.debug.rhino.ui.source.locator"
-            name="%sourceLocator.name">
-      </sourceLocator>
-   </extension>
-   <extension
-         point="org.eclipse.debug.ui.launchConfigurationTypeImages">
-      <launchConfigurationTypeImage
-            configTypeID="org.eclipse.wst.jsdt.debug.rhino.ui.launch.config.type"
-            icon="$nl$/icons/elcl16/rhino.gif"
-            id="org.eclipse.wst.jsdt.debug.rhino.ui.launch.configuration.image">
-      </launchConfigurationTypeImage>
-   </extension>
-   <extension
-         point="org.eclipse.debug.ui.launchConfigurationTabGroups">
-      <launchConfigurationTabGroup
-            class="org.eclipse.wst.jsdt.debug.internal.rhino.ui.launching.RhinoTabGroup"
-            description="%launchConfigurationTabGroup.description"
-            helpContextId="rhino_tab_group_context"
-            id="org.eclipse.wst.jsdt.debug.rhino.ui.launchConfigurationTabGroup1"
-            type="org.eclipse.wst.jsdt.debug.rhino.ui.launch.config.type">
-      </launchConfigurationTabGroup>
-   </extension>
-   <extension
-         point="org.eclipse.ltk.core.refactoring.renameParticipants">
-      <renameParticipant
-            class="org.eclipse.wst.jsdt.debug.internal.rhino.ui.refactoring.ScriptRenameParticipant"
-            id="org.eclipse.wst.jsdt.debug.rhino.ui.script.rename.participant"
-            name="%scriptRenameParticipant.name">
-         <enablement>
-            <with
-                  variable="element">
-               <instanceof
-                     value="org.eclipse.core.resources.IFile">
-               </instanceof>
-            </with>
-         </enablement>
-      </renameParticipant>
-      <renameParticipant
-            class="org.eclipse.wst.jsdt.debug.internal.rhino.ui.refactoring.ProjectRenameParticipant"
-            id="org.eclipse.wst.jsdt.debug.rhino.ui.project.rename.participant"
-            name="%projectRenameParticipant.name">
-         <enablement>
-            <with
-                  variable="element">
-               <instanceof
-                     value="org.eclipse.core.resources.IProject">
-               </instanceof>
-            </with>
-         </enablement>
-      </renameParticipant>
-      <renameParticipant
-            class="org.eclipse.wst.jsdt.debug.internal.rhino.ui.refactoring.FolderRenameParticipant"
-            id="org.eclipse.wst.jsdt.debug.rhino.ui.folder.rename.participant"
-            name="%folderRenameParticipant.name">
-         <enablement>
-            <with
-                  variable="element">
-               <instanceof
-                     value="org.eclipse.core.resources.IFolder">
-               </instanceof>
-            </with>
-         </enablement>
-      </renameParticipant>
-   </extension>
-   <extension
-         point="org.eclipse.ltk.core.refactoring.moveParticipants">
-      <moveParticipant
-            class="org.eclipse.wst.jsdt.debug.internal.rhino.ui.refactoring.ScriptMoveParticipant"
-            id="org.eclipse.wst.jsdt.debug.rhino.ui.script.move.participant"
-            name="%scriptMoveParticipant.name">
-         <enablement>
-            <with
-                  variable="element">
-               <instanceof
-                     value="org.eclipse.core.resources.IFile">
-               </instanceof>
-            </with>
-         </enablement>
-      </moveParticipant>
-      <moveParticipant
-            class="org.eclipse.wst.jsdt.debug.internal.rhino.ui.refactoring.FolderMoveParticipant"
-            id="org.eclipse.wst.jsdt.debug.rhino.ui.folder.move.participant"
-            name="%folderMoveParticipant.name">
-         <enablement>
-            <with
-                  variable="element">
-               <instanceof
-                     value="org.eclipse.core.resources.IFolder">
-               </instanceof>
-            </with></enablement>
-      </moveParticipant>
-   </extension>
-   <extension
-         point="org.eclipse.debug.ui.launchShortcuts">
-      <shortcut
-            class="org.eclipse.wst.jsdt.debug.internal.rhino.ui.launching.RhinoLaunchShortcut"
-            description="%shortcut.description"
-            helpContextId="rhino_launch_shortcut"
-            icon="$nl$/icons/elcl16/rhino.gif"
-            id="org.eclipse.wst.jsdt.debug.rhino.ui.launch.shortcut"
-            label="%shortcut.label"
-            modes="debug">
-         <description
-               description="%description.description"
-               mode="debug">
-         </description>
-         <configurationType
-               id="org.eclipse.wst.jsdt.debug.rhino.ui.launch.config.type">
-         </configurationType>
-         <contextualLaunch>
-            <enablement>
-               <with
-                     variable="selection">
-                  <count
-                        value="1">
-                  </count>
-                  <iterate>
-                     <and>
-                        <adapt
-                              type="org.eclipse.wst.jsdt.core.IJavaScriptElement">
-                        </adapt>
-                        <test
-                              property="rhino.ui.isScript">
-                        </test>
-                        <with
-                              variable="org.eclipse.core.runtime.Platform">
-                           <test
-                                 args="org.eclipse.wst.jsdt.debug.rhino"
-                                 property="org.eclipse.core.runtime.bundleState"
-                                 value="ACTIVE">
-                           </test>
-                        </with>
-                     </and>
-                  </iterate>
-               </with>
-            </enablement>
-         </contextualLaunch>
-      </shortcut>
-   </extension>
-   <extension
-         point="org.eclipse.debug.core.sourcePathComputers">
-      <sourcePathComputer
-            class="org.eclipse.wst.jsdt.debug.internal.rhino.ui.source.RhinoSourcePathComputer"
-            id="org.eclipse.wst.jsdt.debug.rhino.ui.source.path.computer">
-      </sourcePathComputer>
-   </extension>
-   <extension
-         point="org.eclipse.core.expressions.propertyTesters">
-      <propertyTester
-            class="org.eclipse.wst.jsdt.debug.internal.rhino.ui.RhinoPropertyTester"
-            id="org.eclipse.wst.jsdt.debug.rhino.ui.property.tester"
-            namespace="rhino.ui"
-            properties="isScript"
-            type="org.eclipse.core.runtime.IAdaptable">
-      </propertyTester>
-   </extension>
-   <extension
-         point="org.eclipse.ui.preferencePages">
-      <page
-            category="org.eclipse.wst.jsdt.debug.ui.debug.page"
-            class="org.eclipse.wst.jsdt.debug.internal.rhino.ui.preferences.RhinoDebugPreferencePage"
-            id="org.eclipse.wst.jsdt.debug.rhino.ui.debug.pref.page"
-            name="%rhinoDebugPrefPage.name">
-         <keywordReference
-               id="org.eclipse.wst.jsdt.debug.rhino.ui.pref.page.keyword">
-         </keywordReference>
-         <keywordReference
-               id="org.eclipse.wst.jsdt.debug.ui.debug.pref.page.keyword">
-         </keywordReference>
-      </page>
-   </extension>
-   <extension
-         point="org.eclipse.ui.keywords">
-      <keyword
-            id="org.eclipse.wst.jsdt.debug.rhino.ui.pref.page.keyword"
-            label="%rhinoDebugKeyword.label">
-      </keyword>
-   </extension>
-
-</plugin>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/IHelpConstants.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/IHelpConstants.java
deleted file mode 100644
index 4e2a89a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/IHelpConstants.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.ui;
-
-/**
- * Collection of help constants
- * 
- * @since 1.0
- */
-public interface IHelpConstants {
-	
-	/**
-	 * The help context id for the Rhino main tab in the launch dialog
-	 * <br><br>
-	 * Value is: <code>org.eclipse.wst.jsdt.debug.rhino.ui.rhino_main_tab_context</code>
-	 */
-	public static final String MAIN_TAB_CONTEXT = RhinoUIPlugin.PLUGIN_ID + ".rhino_main_tab_context"; //$NON-NLS-1$
-	/**
-	 * The help context id for the Rhino include tab in the launch dialog
-	 * <br><br>
-	 * Value is: <code>org.eclipse.wst.jsdt.debug.rhino.ui.rhino_include_tab_context</code>
-	 */
-	public static final String INCLUDE_TAB_CONTEXT = RhinoUIPlugin.PLUGIN_ID + ".rhino_include_tab_context"; //$NON-NLS-1$
-	/**
-	 * The help context id for the Rhino source tab in the launch dialog
-	 * <br><br>
-	 * Value is: <code>org.eclipse.wst.jsdt.debug.rhino.ui.rhino_source_tab_context</code>
-	 */
-	public static final String SOURCE_TAB_CONTEXT = RhinoUIPlugin.PLUGIN_ID + ".rhino_source_tab_context"; //$NON-NLS-1$
-	/**
-	 * The help context id for the Rhino common tab in the launch dialog
-	 * <br><br>
-	 * Value is: <code>org.eclipse.wst.jsdt.debug.rhino.ui.rhino_common_tab_context</code>
-	 */
-	public static final String COMMON_TAB_CONTEXT = RhinoUIPlugin.PLUGIN_ID + ".rhino_common_tab_context"; //$NON-NLS-1$
-	/**
-	 * The help context id for the Rhino preference page
-	 * <br><br>
-	 * The value is: <code>org.eclipse.wst.jsdt.debug.rhino.ui.rhino_preference_page</code>
-	 */
-	public static final String RHINO_PREFERENCE_PAGE = RhinoUIPlugin.PLUGIN_ID + ".rhino_preference_page"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/ILaunchConstants.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/ILaunchConstants.java
deleted file mode 100644
index 1d7f9a3..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/ILaunchConstants.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.ui;
-
-/**
- * Constants used for launching
- * 
- * @since 1.0
- */
-public interface ILaunchConstants {
-
-	/**
-	 * The script attribute in a Rhino launch configuration
-	 * <br><br>
-	 * Value is: <code>script</code>
-	 */
-	public static final String ATTR_SCRIPT = "script";  //$NON-NLS-1$
-	/**
-	 * The log attribute in a Rhino launch configuration
-	 * <br><br>
-	 * Value is: <code>logexceptions</code>
-	 */
-	public static final String ATTR_LOG_INTERPRETER_EXCEPTIONS = "logexceptions"; //$NON-NLS-1$
-	/**
-	 * The EMCA version to interpret with attribute in a Rhino configuration
-	 * <br><br>
-	 * Value is: <code>emcaversion</code>
-	 */
-	public static final String ATTR_ECMA_VERSION = "ecmaversion"; //$NON-NLS-1$
-	/**
-	 * The Rhino optimization level attribute for a Rhino configuration
-	 * <br><br>
-	 * Value is: <code>optlevel</code>
-	 */
-	public static final String ATTR_OPT_LEVEL = "optlevel"; //$NON-NLS-1$
-	/**
-	 * The strict mode attribute in a Rhino configuration
-	 * <br><br>
-	 * Value is: <code>strictmode</code>
-	 */
-	public static final String ATTR_STRICT_MODE = "strictmode"; //$NON-NLS-1$
-	/**
-	 * The include path attribute in a Rhino configuration
-	 * <br><br>
-	 * Value is: <code>includepath</code>
-	 */
-	public static final String ATTR_INCLUDE_PATH = "includepath"; //$NON-NLS-1$
-	/**
-	 * The id for the Rhino launch configuration type
-	 * <br><br>
-	 * Value is: <code>org.eclipse.wst.jsdt.debug.rhino.ui.launch.config.type</code>
-	 */
-	public static final String LAUNCH_CONFIG_TYPE = "org.eclipse.wst.jsdt.debug.rhino.ui.launch.config.type"; //$NON-NLS-1$
-	/**
-	 * The empty string
-	 */
-	public static final String EMPTY_STRING = ""; //$NON-NLS-1$
-	/**
-	 * The ECMA version level for 1.7
-	 * <br><br>
-	 * Value is: <code>170</code>
-	 */
-	public static final String ECMA_170 = "170"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/ISharedImages.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/ISharedImages.java
deleted file mode 100644
index 69171ee..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/ISharedImages.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.ui;
-
-/**
- * Describes images that are in the image registry
- * 
- * @since 1.0
- */
-public interface ISharedImages {
-
-	//ELCL
-	/**
-	 * Default script image
-	 */
-	public static final String IMG_SCRIPT = "IMG_SCRIPT"; //$NON-NLS-1$
-	/**
-	 * Image for the Rhino launch configuration type
-	 */
-	public static final String IMG_RHINO = "IMG_RHINO"; //$NON-NLS-1$
-	/**
-	 * Image for the main tab of a Rhino launch configuration
-	 */
-	public static final String IMG_MAIN_TAB = "IMG_MAIN_TAB"; //$NON-NLS-1$
-	/**
-	 * Image for the library object
-	 */
-	public static final String IMG_LIBRARY = "IMG_LIBRARY"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/ImageDescriptorRegistry.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/ImageDescriptorRegistry.java
deleted file mode 100644
index ecef73a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/ImageDescriptorRegistry.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.ui;
-
- 
-import java.util.HashMap;
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * A registry that maps <code>ImageDescriptors</code> to <code>Image</code>.
- * 
- * @since 1.0
- */
-public class ImageDescriptorRegistry {
-
-	private HashMap fRegistry= new HashMap(10);
-	private Display fDisplay;
-	
-	/**
-	 * Creates a new image descriptor registry for the current or default display,
-	 * respectively.
-	 */
-	public ImageDescriptorRegistry() {
-		this(PlatformUI.getWorkbench().getDisplay());
-	}
-	
-	/**
-	 * Creates a new image descriptor registry for the given display. All images
-	 * managed by this registry will be disposed when the display gets disposed.
-	 * 
-	 * @param display the display the images managed by this registry are allocated for 
-	 */
-	public ImageDescriptorRegistry(Display display) {
-		fDisplay= display;
-		Assert.isNotNull(fDisplay);
-		hookDisplay();
-	}
-	
-	/**
-	 * Returns the image associated with the given image descriptor.
-	 * 
-	 * @param descriptor the image descriptor for which the registry manages an image
-	 * @return the image associated with the image descriptor or <code>null</code>
-	 *  if the image descriptor can't create the requested image.
-	 */
-	public Image get(ImageDescriptor descriptor) {
-		ImageDescriptor desc = descriptor;
-		if (desc == null) {
-			desc = ImageDescriptor.getMissingImageDescriptor();
-		}
-		Image result = (Image)fRegistry.get(desc);
-		if (result != null) {
-			return result; 
-		}
-		result = desc.createImage();
-		if (result != null) {
-			fRegistry.put(desc, result);
-		}
-		return result;
-	}
-
-	/**
-	 * Disposes all images managed by this registry.
-	 */	
-	public void dispose() {
-		for (Iterator iter= fRegistry.values().iterator(); iter.hasNext(); ) {
-			Image image= (Image)iter.next();
-			image.dispose();
-		}
-		fRegistry.clear();
-	}
-	
-	private void hookDisplay() {
-		fDisplay.asyncExec(new Runnable() {
-			public void run() {
-			fDisplay.disposeExec(new Runnable() {
-				public void run() {
-					dispose();
-				}	
-			});			
-			}
-		});
-
-	}
-}
-
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/RhinoAdapterFactory.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/RhinoAdapterFactory.java
deleted file mode 100644
index b38b363..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/RhinoAdapterFactory.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.ui;
-
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-import org.eclipse.wst.jsdt.core.IJavaScriptElement;
-
-/**
- * Adapter factory for Rhino UI
- * 
- * @since 1.0
- */
-public class RhinoAdapterFactory implements IAdapterFactory {
-
-	static WorkbenchAdapter wsAdapter = null;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class)
-	 */
-	public synchronized Object getAdapter(Object adaptableObject, Class adapterType) {
-		if (adapterType.equals(IWorkbenchAdapter.class)) {
-			if(wsAdapter == null) {
-				wsAdapter = new WorkbenchAdapter();
-			}
-			return wsAdapter;
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
-	 */
-	public Class[] getAdapterList() {
-		return new Class[] {IWorkbenchAdapter.class};
-	}
-}
-
-/**
- * A workbench adapter
- * 
- * @since 1.0
- */
-class WorkbenchAdapter implements IWorkbenchAdapter {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.model.IWorkbenchAdapter#getChildren(java.lang.Object)
-	 */
-	public Object[] getChildren(Object o) {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.model.IWorkbenchAdapter#getImageDescriptor(java.lang.Object)
-	 */
-	public ImageDescriptor getImageDescriptor(Object object) {
-		
-		return null;
-	}
-
-	/**
-	 * Returns an image descriptor for a JavaScript element, or <code>null</code>
-	 * if none.
-	 * 
-	 * @param element JavaScript element
-	 * @return an image descriptor for a JavaScript element, or <code>null</code>
-	 * if none
-	 */
-	protected ImageDescriptor getImageDescriptor(IJavaScriptElement element) {
-		IWorkbenchAdapter adapter = (IWorkbenchAdapter)element.getAdapter(IWorkbenchAdapter.class);
-		if (adapter != null) {
-			return adapter.getImageDescriptor(element);
-		}
-		return null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.model.IWorkbenchAdapter#getLabel(java.lang.Object)
-	 */
-	public String getLabel(Object o) {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.model.IWorkbenchAdapter#getParent(java.lang.Object)
-	 */
-	public Object getParent(Object o) {
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/RhinoImageRegistry.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/RhinoImageRegistry.java
deleted file mode 100644
index d25156b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/RhinoImageRegistry.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.ui;
-
-import java.net.URL;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.PlatformUI;
-import org.osgi.framework.Bundle;
-
-/**
- * Image registry for shared images used in JavaScript Debug UI
- * 
- * @since 1.0
- */
-public final class RhinoImageRegistry {
-
-	/** 
-	 * The image registry containing <code>Image</code>s and <code>ImageDescriptor</code>s.
-	 */
-	private static ImageRegistry imageRegistry;
-	private static ImageDescriptorRegistry descRegistry;
-	
-	private static String ICONS_PATH = "$nl$/icons/"; //$NON-NLS-1$
-	
-	/**
-	 * Icon paths
-	 */
-	final static String ELCL = ICONS_PATH + "elcl16/"; //enabled - size 16x16 //$NON-NLS-1$
-	final static String OVR = ICONS_PATH + "ovr16/"; //overlays //$NON-NLS-1$
-	final static String DLCL = ICONS_PATH + "dlcl16/"; //disabled icons //$NON-NLS-1$
-	
-	/**
-	 * Declare all images
-	 */
-	private static void declareImages() {
-		//ELCL
-		declareRegistryImage(ISharedImages.IMG_SCRIPT, ELCL + "script.gif"); //$NON-NLS-1$
-		declareRegistryImage(ISharedImages.IMG_RHINO, ELCL + "rhino.gif"); //$NON-NLS-1$
-		declareRegistryImage(ISharedImages.IMG_MAIN_TAB, ELCL + "main_tab.gif"); //$NON-NLS-1$
-		declareRegistryImage(ISharedImages.IMG_LIBRARY, ELCL + "library.gif"); //$NON-NLS-1$
-	}
-	
-	/**
-	 * Declare an Image in the registry table.
-	 * @param key 	The key to use when registering the image
-	 * @param path	The path where the image can be found. This path is relative to where
-	 *				this plugin class is found (i.e. typically the packages directory)
-	 */
-	private final static void declareRegistryImage(String key, String path) {
-		ImageDescriptor desc = ImageDescriptor.getMissingImageDescriptor();
-		Bundle bundle = Platform.getBundle(RhinoUIPlugin.PLUGIN_ID);
-		URL url = null;
-		if (bundle != null){
-			url = FileLocator.find(bundle, new Path(path), null);
-			if(url != null) {
-				desc = ImageDescriptor.createFromURL(url);
-			}
-		}
-		imageRegistry.put(key, desc);
-	}
-	
-	/**
-	 * Returns the shared image for the given key or <code>null</code>.
-	 * @param key
-	 * @return the requested image or <code>null</code> if the image does not exist
-	 */
-	public static Image getSharedImage(String key) {
-		if (imageRegistry == null) {
-			initializeImageRegistry();
-		}
-		return imageRegistry.get(key);
-	}
-	
-	/**
-	 * Initializes the registry if it has not been already
-	 * @return the initialized registry
-	 */
-	private synchronized static ImageRegistry initializeImageRegistry() {
-		if (imageRegistry == null) {
-			imageRegistry = new ImageRegistry(PlatformUI.getWorkbench().getDisplay());
-			declareImages();
-		}
-		return imageRegistry;
-	}
-	
-	/**
-	 * Creates the image from the descriptor and caches it for proper disposal
-	 * @param descriptor
-	 * @return
-	 */
-	public static Image getImage(ImageDescriptor descriptor) {
-		if(descRegistry == null) {
-			descRegistry = new ImageDescriptorRegistry();
-		}
-		return descRegistry.get(descriptor);
-	}
-	
-	/**
-	 * Disposes the image registry
-	 */
-	public static void dispose() {
-		if(imageRegistry != null) {
-			imageRegistry.dispose();
-		}
-		if(descRegistry != null) {
-			descRegistry.dispose();
-		}
-	}
-	
-	/**
-	 * Constructor
-	 */
-	private RhinoImageRegistry() {
-		// no direct instantiation
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/RhinoPropertyTester.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/RhinoPropertyTester.java
deleted file mode 100644
index 60ae97d..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/RhinoPropertyTester.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.ui;
-
-import org.eclipse.core.expressions.PropertyTester;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.wst.jsdt.core.IJavaScriptElement;
-
-/**
- * Property tester for launching, etc
- * <br><br>
- * Provides the following tests:
- * <ol>
- * <li><code>isContainer</code> - if the selected item is a container</li>
- * <li><code>isScript</code> - if the selected element is a script</li>
- * </ol>
- * @since 1.0
- */
-public class RhinoPropertyTester extends PropertyTester {
-
-	static final String IS_SCRIPT = "isScript"; //$NON-NLS-1$
-	
-	/**
-	 * Constructor
-	 */
-	public RhinoPropertyTester() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.expressions.IPropertyTester#test(java.lang.Object, java.lang.String, java.lang.Object[], java.lang.Object)
-	 */
-	public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {
-		if(receiver instanceof IAdaptable) {
-			IAdaptable adaptable = (IAdaptable) receiver;
-			if(IS_SCRIPT.equals(property)) {
-				return isScript(adaptable);
-			}
-		}
-		return false;
-	}
-	
-	/**
-	 * Returns if the element is a container or not
-	 * @param element
-	 * @return <code>true</code> if the element is a script <code>false</code> otherwise
-	 */
-	boolean isScript(IAdaptable element) {
-		IJavaScriptElement jselement = (IJavaScriptElement) element.getAdapter(IJavaScriptElement.class);
-		if(jselement != null) {
-			int type = jselement.getElementType();
-			return type == IJavaScriptElement.JAVASCRIPT_UNIT;
-		}
-		IFile file = (IFile) element.getAdapter(IFile.class);
-		if(file != null) {
-			return "js".equals(file.getFileExtension()); //$NON-NLS-1$
-		}
-		return false;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/RhinoUIPlugin.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/RhinoUIPlugin.java
deleted file mode 100644
index 423f0e8..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/RhinoUIPlugin.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.ui;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.eclipse.ui.preferences.ScopedPreferenceStore;
-import org.eclipse.wst.jsdt.debug.internal.rhino.RhinoDebugPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class RhinoUIPlugin extends AbstractUIPlugin {
-
-	/**
-	 * Status code indicating an unexpected internal error.
-	 */
-	public static final int INTERNAL_ERROR = 120;
-	
-	// The plug-in ID
-	public static final String PLUGIN_ID = "org.eclipse.wst.jsdt.debug.rhino.ui"; //$NON-NLS-1$
-
-	// The shared instance
-	private static RhinoUIPlugin plugin;
-	private static IPreferenceStore corestore = new ScopedPreferenceStore(InstanceScope.INSTANCE, RhinoDebugPlugin.PLUGIN_ID);
-	
-	/**
-	 * The constructor
-	 */
-	public RhinoUIPlugin() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		plugin = this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance
-	 *
-	 * @return the shared instance
-	 */
-	public static RhinoUIPlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Logs the specified status with this plug-in's log.
-	 * 
-	 * @param status status to log
-	 */
-	public static void log(IStatus status) {
-		if (plugin != null) {
-			plugin.getLog().log(status);
-		}
-	}
-
-	/**
-	 * Logs the specified throwable with this plug-in's log.
-	 * 
-	 * @param t throwable to log 
-	 */
-	public static void log(Throwable t) {
-		log(newErrorStatus("Error logged from Rhino Debug: ", t)); //$NON-NLS-1$
-	}
-	
-	/**
-	 * Logs an internal error with the specified message.
-	 * 
-	 * @param message the error message to log
-	 */
-	public static void logErrorMessage(String message) {
-		log(newErrorStatus("Internal message logged from Rhino Debug: " + message, null)); //$NON-NLS-1$	
-	}
-	
-	/**
-	 * Returns a new error status for this plug-in with the given message
-	 * @param message the message to be included in the status
-	 * @param exception the exception to be included in the status or <code>null</code> if none
-	 * @return a new error status
-	 */
-	public static IStatus newErrorStatus(String message, Throwable exception) {
-		return new Status(IStatus.ERROR, PLUGIN_ID, INTERNAL_ERROR, message, exception);
-	}
-	
-	/**
-	 * Returns the active workbench window or <code>null</code> if there is no active window
-	 * 
-	 * @see IWorkbench
-	 * @see IWorkbenchWindow
-	 * @return the active workbench window or <code>null</code>
-	 */
-	public static IWorkbenchWindow getActiveWorkbenchWindow() {
-		return getDefault().getWorkbench().getActiveWorkbenchWindow();
-	}	
-	
-	/**
-	 * Returns the active workbench page or <code>null</code> if it cannot be resolved
-	 * 
-	 * @see IWorkbench
-	 * @see IWorkbenchWindow
-	 * @see IWorkbenchPage
-	 * @return the active workbench page or <code>null</code>
-	 */
-	public static IWorkbenchPage getActivePage() {
-		IWorkbenchWindow w = getActiveWorkbenchWindow();
-		if (w != null) {
-			return w.getActivePage();
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns the {@link IPreferenceStore} wrapper for the {@link RhinoDebugPlugin} preferences
-	 * 
-	 * @return the {@link IPreferenceStore} for the Rhino core preferences
-	 */
-	public static IPreferenceStore getCorePreferenceStore() {
-		return corestore;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/launching/IncludeEntry.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/launching/IncludeEntry.java
deleted file mode 100644
index 8c33c9b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/launching/IncludeEntry.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.ui.launching;
-
-import org.eclipse.debug.core.ILaunchConfiguration;
-
-/**
- * Describes an entry in the include path for a Rhino {@link ILaunchConfiguration}
- * 
- * @since 1.1
- */
-public class IncludeEntry {
-	
-	public static final int LOCAL_SCRIPT = 1;
-	public static final int EXT_SCRIPT = 2;
-	
-	int kind = -1;
-	String path = null;
-	
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param kind
-	 * @param path
-	 * @param index
-	 */
-	public IncludeEntry(int kind, String path) {
-		this.kind = kind;
-		this.path = path;
-	}
-	
-	/**
-	 * @return the kind
-	 */
-	public int getKind() {
-		return kind;
-	}
-	
-	/**
-	 * @return the path
-	 */
-	public String getPath() {
-		return path;
-	}
-	
-	/**
-	 * @return the combined entry for an {@link ILaunchConfiguration} memento
-	 */
-	public String string() {
-		return kind+path;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		if(obj instanceof IncludeEntry) {
-			IncludeEntry entry = (IncludeEntry) obj;
-			return kind == entry.kind && path.equals(entry.path);
-		}
-		return false;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return kind + path.hashCode();
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/launching/IncludeTab.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/launching/IncludeTab.java
deleted file mode 100644
index 8815896..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/launching/IncludeTab.java
+++ /dev/null
@@ -1,399 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.ui.launching;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.Vector;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.jsdt.debug.internal.rhino.ui.IHelpConstants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.ui.ILaunchConstants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.ui.ISharedImages;
-import org.eclipse.wst.jsdt.debug.internal.rhino.ui.RhinoImageRegistry;
-import org.eclipse.wst.jsdt.debug.internal.rhino.ui.refactoring.Refactoring;
-import org.eclipse.wst.jsdt.debug.internal.ui.SWTFactory;
-import org.eclipse.wst.jsdt.debug.internal.ui.dialogs.ScriptSelectionDialog;
-
-/**
- * Launch configuration tab to allows users to specify what additional
- * scripts should be interpreted by Rhino when launching
- * 
- * @since 1.0
- */
-public class IncludeTab extends AbstractLaunchConfigurationTab {
-
-	class Contents implements ITreeContentProvider {
-		public Object[] getElements(Object inputElement) {
-			return ((Vector)inputElement).toArray();
-		}
-		public Object[] getChildren(Object parentElement) {return null;}
-		public void dispose() {}
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}
-		public Object getParent(Object element) {return null;}
-		public boolean hasChildren(Object element) {return false;}
-		
-	}
-	class Labels extends LabelProvider {
-		public Image getImage(Object element) {
-			IncludeEntry entry = (IncludeEntry) element;
-			switch(entry.kind) {
-				case IncludeEntry.LOCAL_SCRIPT: {
-					return RhinoImageRegistry.getSharedImage(ISharedImages.IMG_SCRIPT);
-				}
-				case IncludeEntry.EXT_SCRIPT: {
-					return PlatformUI.getWorkbench().getSharedImages().getImage(org.eclipse.ui.ISharedImages.IMG_OBJ_FILE);
-				}
-			}
-			return null;
-		}
-		public String getText(Object element) {
-			IncludeEntry entry = (IncludeEntry) element;
-			return entry.path;
-		}
-	}
-	
-	/**
-	 * Default filter for the workspace folder selection dialog
-	 */
-	class ContainerFilter extends ViewerFilter {
-		public boolean select(Viewer viewer, Object parentElement, Object element) {
-			return element instanceof IContainer && ((IContainer)element).isAccessible(); 
-		}
-		
-	}
-	
-	/**
-	 * The id for this tab.
-	 * <br><br>
-	 * Value is: <code>thino.include.tab</code>
-	 */
-	public static final String TAB_ID = "rhino.include.tab"; //$NON-NLS-1$
-	/**
-	 * Standard JavaScript extension
-	 * <br><br>
-	 * Value is: <code>*.js</code>
-	 */
-	public static final String JS_EXTENSION = "*.js"; //$NON-NLS-1$
-	
-	private TreeViewer viewer = null;
-	private Button remove = null,
-	               addexternalscript = null,
-	               addscript = null,
-	               defaults = null,
-	               up = null,
-	               down = null;
-	private Vector includes = new Vector();
-	private ILaunchConfiguration backingconfig = null;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite comp = SWTFactory.createComposite(parent, 2, 1, GridData.FILL_HORIZONTAL);
-		SWTFactory.createWrapLabel(comp, Messages.include_path, 2);
-		Tree tree = new Tree(comp, SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER);
-		tree.setLayout(new GridLayout(1, true)); 
-		tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-		viewer = new TreeViewer(tree);
-		viewer.setLabelProvider(new Labels());
-		viewer.setContentProvider(new Contents());
-		viewer.setInput(includes);
-		viewer.addSelectionChangedListener(new ISelectionChangedListener() {
-			public void selectionChanged(SelectionChangedEvent event) {
-				updateButtons((IStructuredSelection) event.getSelection());
-			}
-		});
-		Composite lhs = SWTFactory.createComposite(comp, comp.getFont(), 1, 1, GridData.FILL_VERTICAL, 0, 0);
-		up = SWTFactory.createPushButton(lhs, Messages.up_button, null);
-		up.setEnabled(false);
-		up.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				up(((IStructuredSelection)viewer.getSelection()).getFirstElement());
-			}
-		});
-		down = SWTFactory.createPushButton(lhs, Messages.down_button, null);
-		down.setEnabled(false);
-		down.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				down(((IStructuredSelection)viewer.getSelection()).getFirstElement());
-			}
-		});
-		remove = SWTFactory.createPushButton(lhs, Messages.remove_button, null);
-		remove.setEnabled(false);
-		remove.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				remove((IStructuredSelection)viewer.getSelection());
-			}
-		});
-		addscript = SWTFactory.createPushButton(lhs, Messages.add_script_button, null);
-		addscript.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				addScript();
-			}
-		});
-		addexternalscript = SWTFactory.createPushButton(lhs, Messages.add_ext_script_button, null);
-		addexternalscript.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				addExtScript();
-			}
-		});
-		SWTFactory.createHorizontalSpacer(lhs, 1);
-		defaults = SWTFactory.createPushButton(lhs, Messages.defaults_button, null);
-		defaults.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				defaults();	
-			}
-		});
-		
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(comp, IHelpConstants.INCLUDE_TAB_CONTEXT);
-		setControl(comp);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getHelpContextId()
-	 */
-	public String getHelpContextId() {
-		return IHelpConstants.INCLUDE_TAB_CONTEXT;
-	}
-	
-	/**
-	 * Updates the buttons based on the selection from the viewer
-	 * 
-	 * @param selection
-	 */
-	void updateButtons(IStructuredSelection selection) {
-		int size = selection.size();
-		if(size == 1) {
-			//up / down
-			Object element = selection.getFirstElement();
-			int idx = includes.indexOf(element);
-			up.setEnabled(idx > 0);
-			down.setEnabled(idx < includes.size() -1);
-		}
-		else {
-			if(up != null) {
-				up.setEnabled(false);
-			}
-			if(down != null) {
-				down.setEnabled(false);
-			}
-		}
-		remove.setEnabled(size > 0);
-	}
-	
-	/**
-	 * Prompts the user to select a script from the workspace to include
-	 */
-	void addScript() {
-		ScriptSelectionDialog dialog = new ScriptSelectionDialog(getShell(), true, ResourcesPlugin.getWorkspace().getRoot());
-		if(dialog.open() == IDialogConstants.OK_ID) {
-			Object[] scripts = dialog.getResult();
-			IncludeEntry newentry = null;
-			for (int i = 0; i < scripts.length; i++) {
-				newentry = new IncludeEntry(IncludeEntry.LOCAL_SCRIPT, ((IFile)scripts[i]).getFullPath().makeAbsolute().toString());
-				if(!includes.contains(newentry)) {
-					includes.add(newentry);
-				}
-			}
-			viewer.refresh();
-			updateLaunchConfigurationDialog();
-		}
-	}
-	
-	/**
-	 * Moves the selected element up one spot in the tree
-	 * 
-	 * @param element
-	 */
-	void up(Object element) {
-		int idx = includes.indexOf(element);
-		if(idx < 0) {
-			return;
-		}
-		includes.remove(idx);
-		includes.insertElementAt(element, idx-1);
-		viewer.refresh();
-		updateLaunchConfigurationDialog();
-	}
-	
-	/**
-	 * Moves the selected element down one spot in the tree
-	 * 
-	 * @param element
-	 */
-	void down(Object element) {
-		int idx = includes.indexOf(element);
-		if(idx < 0) {
-			return;
-		}
-		includes.remove(idx);
-		includes.insertElementAt(element, idx+1);
-		viewer.refresh();
-		updateLaunchConfigurationDialog();
-	}
-	
-	/**
-	 * Removes the selected element from the tree
-	 * 
-	 * @param selection
-	 */
-	void remove(IStructuredSelection selection) {
-		includes.removeAll(selection.toList());
-		viewer.refresh();
-		updateLaunchConfigurationDialog();
-	}
-	
-	/**
-	 * Restores the tab to the defaults computed against the currently specified script
-	 */
-	void defaults() {
-		includes.clear();
-		viewer.refresh();
-		/*try {
-			IFile script = Refactoring.getScript(backingconfig);
-			if(script != null) {
-				includes.clear();
-				includes.add(new IncludeEntry(IncludeTab.LOCAL_SCRIPT, script.getFullPath().makeAbsolute().toOSString()));
-				viewer.refresh();
-			}
-		}
-		catch(CoreException ce) {
-			//ignore
-		}*/
-		updateLaunchConfigurationDialog();
-	}
-	
-	/**
-	 * Prompts the user to select a new folder from the local file system to include
-	 */
-	void addExtScript() {
-		FileDialog dialog = new FileDialog(getShell(), SWT.OPEN | SWT.MULTI);
-		dialog.setFilterExtensions(new String[] {JS_EXTENSION});
-		dialog.setFilterIndex(0);
-		dialog.setText(Messages.select_scripts_to_add);
-		if(dialog.open() != null) {
-			String[] names = dialog.getFileNames();
-			if(names != null && names.length > 0) {
-				String path = dialog.getFilterPath();
-				if(path != null) {
-					boolean added = false;
-					for (int i = 0; i < names.length; i++) {
-						File script = new File(path, names[i]);
-						if(script.exists()) {
-							includes.add(new IncludeEntry(IncludeEntry.EXT_SCRIPT, new Path(script.getAbsolutePath()).toString()));
-							added = true;
-						}
-					}
-					if(added) {
-						viewer.refresh();
-						updateLaunchConfigurationDialog();
-					}
-				}
-			}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-	 */
-	public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
-		/*try {
-			IFile script = Refactoring.getScript(configuration);
-			if(script != null) {
-				includes.add(new IncludeEntry(IncludeEntry.LOCAL_SCRIPT, script.getFullPath().makeAbsolute().toString()));
-			}
-			ArrayList list = new ArrayList(includes.size());
-			for (Iterator i = includes.iterator(); i.hasNext();) {
-				list.add(((IncludeEntry)i.next()).string());
-			}
-			configuration.setAttribute(ILaunchConstants.ATTR_INCLUDE_PATH, list);
-		}
-		catch(CoreException ce) {
-			//ignore
-		}*/
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public void initializeFrom(ILaunchConfiguration configuration) {
-		backingconfig = configuration;
-		includes.clear();
-		IncludeEntry[] entries = Refactoring.getIncludeEntries(backingconfig);
-		for (int i = 0; i < entries.length; i++) {
-			includes.add(entries[i]);
-		}
-		viewer.refresh();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-	 */
-	public void performApply(ILaunchConfigurationWorkingCopy configuration) {
-		if(includes.isEmpty()) {
-			configuration.removeAttribute(ILaunchConstants.ATTR_INCLUDE_PATH);
-		}
-		else {
-			ArrayList list = new ArrayList(includes.size());
-			for (Iterator i = includes.iterator(); i.hasNext();) {
-				list.add(((IncludeEntry)i.next()).string());
-			}
-			configuration.setAttribute(ILaunchConstants.ATTR_INCLUDE_PATH, list);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
-	 */
-	public String getName() {
-		return Messages.include_tab_name;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getImage()
-	 */
-	public Image getImage() {
-		return RhinoImageRegistry.getSharedImage(ISharedImages.IMG_LIBRARY);
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getId()
-	 */
-	public String getId() {
-		return TAB_ID;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/launching/Messages.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/launching/Messages.java
deleted file mode 100644
index fa8aacb..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/launching/Messages.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.ui.launching;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * @since 1.0
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.internal.rhino.ui.launching.messages"; //$NON-NLS-1$
-	public static String _script;
-	public static String add_ext_script_button;
-	public static String add_script_button;
-	public static String bro_wse;
-	public static String computing_script_scope;
-	public static String config_name;
-	public static String configuring_rhino_debugger;
-	public static String connect_thread;
-	public static String creating_js_debug_target;
-	public static String creating_rhino_vm;
-	public static String defaults_button;
-	public static String down_button;
-	public static String ecma_version_to_interpret_with;
-	public static String failed_to_compute_scope;
-	public static String include_path;
-	public static String include_tab_name;
-	public static String launch_script;
-	public static String launching__;
-	public static String log_interpreter_exceptions;
-	public static String main;
-	public static String options_group_name;
-	public static String process_label;
-	public static String provide_script_for_project;
-	public static String remove_button;
-	public static String rhino_opt_level;
-	public static String script_not_a_file;
-	public static String script_not_accessible;
-	public static String script_not_in_workspace;
-	public static String script_selection;
-	public static String select_existing_config;
-	public static String select_rhino_config;
-	public static String select_scripts_to_add;
-	public static String starting_rhino_interpreter;
-	public static String starting_rhino_process;
-	public static String strict_mode;
-	public static String up_button;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/launching/RhinoLaunchShortcut.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/launching/RhinoLaunchShortcut.java
deleted file mode 100644
index 96c7c02..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/launching/RhinoLaunchShortcut.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.ui.launching;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.IDebugModelPresentation;
-import org.eclipse.debug.ui.ILaunchShortcut2;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.window.Window;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.dialogs.ElementListSelectionDialog;
-import org.eclipse.wst.jsdt.core.IJavaScriptElement;
-import org.eclipse.wst.jsdt.debug.internal.rhino.ui.ILaunchConstants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.ui.RhinoUIPlugin;
-
-/**
- * Shortcut for launching JavaScript using Rhino
- * 
- * @since 1.0
- */
-public class RhinoLaunchShortcut implements ILaunchShortcut2 {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchShortcut#launch(org.eclipse.jface.viewers.ISelection, java.lang.String)
-	 */
-	public void launch(ISelection selection, String mode) {
-		launch(getLaunchableResource(selection), mode);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchShortcut#launch(org.eclipse.ui.IEditorPart, java.lang.String)
-	 */
-	public void launch(IEditorPart editor, String mode) {
-		launch(getLaunchableResource(editor), mode);
-	}
-
-	/**
-	 * Handles the launch
-	 * 
-	 * @param resource
-	 * @param mode
-	 */
-	void launch(IResource resource, String mode) {
-		if(resource != null) {
-			ILaunchConfiguration config = findConfig(resource);
-			if(config == null) {
-				//TODO should we select a script to launch if a container is selected?
-				ILaunchConfigurationType type = DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurationType(ILaunchConstants.LAUNCH_CONFIG_TYPE);
-				String project = resource.getProject().getName();
-				String script = (resource instanceof IFile ? resource.getFullPath().toString() : null);
-				try {
-					if(script != null) {
-						ILaunchConfigurationWorkingCopy copy = type.newInstance(null, NLS.bind(Messages.config_name, new String[]{project, resource.getName()}));
-						copy.setAttribute(ILaunchConstants.ATTR_SCRIPT, script);
-						copy.setAttribute(ILaunchConstants.ATTR_LOG_INTERPRETER_EXCEPTIONS, true);
-						copy.setAttribute(ILaunchConstants.ATTR_ECMA_VERSION, ILaunchConstants.ECMA_170);
-						copy.setAttribute(ILaunchConstants.ATTR_OPT_LEVEL, -1);
-						copy.setAttribute(ILaunchConstants.ATTR_STRICT_MODE, false);
-						copy.setMappedResources(new IResource[] {resource});
-						config = copy.doSave();
-					}
-				}
-				catch (CoreException ce) {
-					RhinoUIPlugin.log(ce);
-				}
-			}
-			if(config != null) {
-				DebugUITools.launch(config, mode);
-			}
-		}
-	}
-	
-	/**
-	 * Finds an existing configuration to launch, returns <code>null</code> if none found, prompts for selection if
-	 * more than one found.
-	 * 
-	 * @param resource the resource to find the configuration for
-	 * @return
-	 */
-	ILaunchConfiguration findConfig(IResource resource) {
-		List candidates = Collections.EMPTY_LIST;
-		try {
-			ILaunchManager lm = DebugPlugin.getDefault().getLaunchManager();
-			ILaunchConfigurationType type = lm.getLaunchConfigurationType(ILaunchConstants.LAUNCH_CONFIG_TYPE);
-			ILaunchConfiguration[] configs = lm.getLaunchConfigurations(type);
-			candidates = new ArrayList(configs.length);
-			for (int i = 0; i < configs.length; i++) {
-				ILaunchConfiguration config = configs[i];
-				if(config.hasAttribute(ILaunchConstants.ATTR_SCRIPT)) {
-					if (config.getAttribute(ILaunchConstants.ATTR_SCRIPT, ILaunchConstants.EMPTY_STRING).equals(resource.getFullPath().toString())) {
-						candidates.add(config);
-					}
-				}
-			}
-		} catch (CoreException e) {
-			RhinoUIPlugin.log(e);
-		}
-		int candidateCount = candidates.size();
-		if (candidateCount == 1) {
-			return (ILaunchConfiguration) candidates.get(0);
-		} else if (candidateCount > 1) {
-			return chooseConfiguration(candidates);
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns a configuration from the given collection of configurations that should be launched,
-	 * or <code>null</code> to cancel. Default implementation opens a selection dialog that allows
-	 * the user to choose one of the specified launch configurations.  Returns the chosen configuration,
-	 * or <code>null</code> if the user cancels.
-	 * 
-	 * @param configList list of configurations to choose from
-	 * @return configuration to launch or <code>null</code> to cancel
-	 */
-	protected ILaunchConfiguration chooseConfiguration(List configList) {
-		IDebugModelPresentation labelProvider = DebugUITools.newDebugModelPresentation();
-		ElementListSelectionDialog dialog= new ElementListSelectionDialog(RhinoUIPlugin.getActiveWorkbenchWindow().getShell(), labelProvider);
-		dialog.setElements(configList.toArray());
-		dialog.setTitle(Messages.select_rhino_config);  
-		dialog.setMessage(Messages.select_existing_config);
-		dialog.setMultipleSelection(false);
-		int result = dialog.open();
-		labelProvider.dispose();
-		if (result == Window.OK) {
-			return (ILaunchConfiguration) dialog.getFirstResult();
-		}
-		return null;		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchShortcut2#getLaunchConfigurations(org.eclipse.jface.viewers.ISelection)
-	 */
-	public ILaunchConfiguration[] getLaunchConfigurations(ISelection selection) {
-		//framework will resolve based on resource mappings
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchShortcut2#getLaunchConfigurations(org.eclipse.ui.IEditorPart)
-	 */
-	public ILaunchConfiguration[] getLaunchConfigurations(IEditorPart editorpart) {
-		//framework will resolve based on resource mappings
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchShortcut2#getLaunchableResource(org.eclipse.jface.viewers.ISelection)
-	 */
-	public IResource getLaunchableResource(ISelection selection) {
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection ss = (IStructuredSelection)selection;
-			Object obj = ss.getFirstElement();
-			if (obj instanceof IAdaptable) {
-				return getResource((IAdaptable) obj);
-			}
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchShortcut2#getLaunchableResource(org.eclipse.ui.IEditorPart)
-	 */
-	public IResource getLaunchableResource(IEditorPart editorpart) {
-		return getResource(editorpart.getEditorInput());
-	}
-	
-	/**
-	 * Returns the resource backing the {@link IAdaptable} providing it has an {@link IJavaScriptElement}
-	 * adapter.
-	 * 
-	 * @param adaptable
-	 * @return the backing {@link IResource} or <code>null</code>
-	 */
-	IResource getResource(IAdaptable adaptable) {
-		IJavaScriptElement element = (IJavaScriptElement) adaptable.getAdapter(IJavaScriptElement.class);
-		if(element != null) {
-			return element.getResource();
-		}
-		return (IResource) adaptable.getAdapter(IResource.class);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/launching/RhinoLocalLaunchDelegate.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/launching/RhinoLocalLaunchDelegate.java
deleted file mode 100644
index 2fb1c23..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/launching/RhinoLocalLaunchDelegate.java
+++ /dev/null
@@ -1,657 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.ui.launching;
-
-import java.io.File;
-import java.io.FileFilter;
-import java.io.IOException;
-import java.text.CharacterIterator;
-import java.text.DateFormat;
-import java.text.StringCharacterIterator;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubMonitor;
-import org.eclipse.core.runtime.URIUtil;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.model.ILaunchConfigurationDelegate2;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.jdt.internal.launching.StandardVMType;
-import org.eclipse.jdt.launching.IVMInstall;
-import org.eclipse.jdt.launching.JavaRuntime;
-import org.eclipse.jdt.launching.SocketUtil;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.jsdt.core.IJavaScriptModelMarker;
-import org.eclipse.wst.jsdt.core.ITypeRoot;
-import org.eclipse.wst.jsdt.core.JavaScriptCore;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.AttachingConnector;
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector;
-import org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.connect.HostArgument;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.connect.PortArgument;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.connect.RhinoAttachingConnector;
-import org.eclipse.wst.jsdt.debug.internal.rhino.ui.ILaunchConstants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.ui.RhinoUIPlugin;
-import org.eclipse.wst.jsdt.debug.internal.rhino.ui.refactoring.Refactoring;
-import org.mozilla.javascript.JavaScriptException;
-import org.osgi.framework.Bundle;
-
-/**
- * A launch delegate to support launching scripts in a single configuration launch
- * 
- * @since 1.0
- */
-public class RhinoLocalLaunchDelegate implements ILaunchConfigurationDelegate2 {
-
-	/**
-	 * Polls for connecting to the Rhino interpreter
-	 */
-	class ConnectRunnable implements Runnable {
-
-		VirtualMachine vm = null;
-		Exception exception = null;
-		private AttachingConnector connector = null;
-		private Map args = null;
-		
-		ConnectRunnable(AttachingConnector connector, Map args) {
-			this.connector = connector;
-			this.args = args;
-		}
-		/* (non-Javadoc)
-		 * @see java.lang.Runnable#run()
-		 */
-		public void run() {
-			try {
-				long start = System.currentTimeMillis();
-				Exception inner = null;
-				do {
-					try {
-						vm = connector.attach(args);
-					}
-					catch(Exception e) {
-						inner = e;
-					}
-				} while(vm == null && System.currentTimeMillis() < start + 15000);
-				if(vm == null) {
-					throw inner;
-				}
-			}
-			catch(Exception e) {
-				exception = e;
-			}
-		}
-	}
-	
-	class Filter implements FileFilter {
-		public boolean accept(File pathname) {
-			return pathname.isDirectory() || JavaScriptCore.isJavaScriptLikeFileName(pathname.getName());
-		}
-	}
-	
-	/**
-	 * The name of the main class to run
-	 * <br><br>
-	 * Value is: <code>"org.eclipse.wst.jsdt.debug.rhino.debugger.shell.DebugShell"</code>
-	 */
-	public static final String DEBUG_SHELL_CLASS = "org.eclipse.wst.jsdt.debug.rhino.debugger.shell.DebugMain"; //$NON-NLS-1$
-	/**
-	 * The name of the main class to run
-	 * <br><br>
-	 * Value is: <code>"org.mozilla.javascript.tools.shell.Main"</code>
-	 */
-	public static final String RHINO_MAIN_CLASS = "org.mozilla.javascript.tools.shell.Main"; //$NON-NLS-1$
-	/**
-	 * The symbolic name of the Mozilla Rhino bundle
-	 * <br><br>
-	 * Value is: <code>org.mozilla.javascript</code>
-	 */
-	public static final String MOZILLA_JAVASCRIPT_BUNDLE = "org.mozilla.javascript"; //$NON-NLS-1$
-	/**
-	 * The symbolic name of the debug transport bundle
-	 * <br><br>
-	 * Value is: <code>org.eclipse.wst.jsdt.debug.transport</code>
-	 */
-	public static final String DEBUG_TRANSPORT_BUNDLE = "org.eclipse.wst.jsdt.debug.transport"; //$NON-NLS-1$
-	/**
-	 * The symbolic name of the Rhino debug interface bundle
-	 * <br><br>
-	 * Value is: <code>org.eclipse.wst.jsdt.debug.rhino.debugger</code>
-	 */
-	private static final String RHINO_DEBUGGER_BUNDLE = "org.eclipse.wst.jsdt.debug.rhino.debugger"; //$NON-NLS-1$
-	
-	/**
-	 * Array of the bundles required to launch
-	 */
-	public static final String[] REQUIRED_BUNDLES = {MOZILLA_JAVASCRIPT_BUNDLE, DEBUG_TRANSPORT_BUNDLE, RHINO_DEBUGGER_BUNDLE};
-	
-	private ArrayList scope = null;
-	private ITypeRoot script = null;
-	
-	synchronized ITypeRoot getScript(ILaunchConfiguration configuration) throws CoreException {
-		if(this.script == null) {
-			IResource resource = Refactoring.getScript(configuration);
-			if(resource != null) {
-				this.script = (ITypeRoot) JavaScriptCore.create((IFile)resource);
-			}
-		}
-		return this.script;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.ILaunchConfigurationDelegate#launch(org.eclipse.debug.core.ILaunchConfiguration, java.lang.String, org.eclipse.debug.core.ILaunch, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void launch(ILaunchConfiguration configuration, String mode,	ILaunch launch, IProgressMonitor monitor) throws CoreException {
-		SubMonitor localmonitor = SubMonitor.convert(monitor, NLS.bind(Messages.launching__, configuration.getName()), 8);
-		int port = SocketUtil.findFreePort();
-		localmonitor.subTask(Messages.starting_rhino_interpreter);
-		//launch the interpreter
-		if(localmonitor.isCanceled()) {
-			return;
-		}
-		localmonitor.worked(1);
-		VirtualMachine vm = null;
-		Process p = null;
-		try {
-			localmonitor.subTask(Messages.configuring_rhino_debugger);
-			if(localmonitor.isCanceled()) {
-				return;
-			}
-			localmonitor.worked(1);
-			//compute commandline args
-			ArrayList cmdargs = new ArrayList();
-			addVMArgs(configuration, launch, cmdargs);
-			addConnectionArgs(port, cmdargs);
-			addECMAVersion(configuration, cmdargs);
-			addEncoding(launch, cmdargs);
-			addOptLevel(configuration, cmdargs);
-			addStrictMode(configuration, cmdargs);
-			addFArg(cmdargs);
-			
-			p = DebugPlugin.exec((String[]) cmdargs.toArray(new String[cmdargs.size()]), null);
-			HashMap args = new HashMap();
-			args.put(HostArgument.HOST, "localhost"); //$NON-NLS-1$
-			args.put(PortArgument.PORT, Integer.toString(port));
-			
-			localmonitor.subTask(Messages.creating_rhino_vm);
-			if(localmonitor.isCanceled()) {
-				cancel(vm, p);
-				return;
-			}
-			localmonitor.worked(1);
-			RhinoAttachingConnector connector = new RhinoAttachingConnector();
-			ConnectRunnable runnable = new ConnectRunnable(connector, args);
-			Thread thread = new Thread(runnable, Messages.connect_thread);
-			thread.setDaemon(true);
-			thread.start();
-			while(thread.isAlive()) {
-				if(localmonitor.isCanceled()) {
-					cancel(vm, p);
-					thread.interrupt();
-				}
-				try {
-					Thread.sleep(100);
-				}
-				catch (Exception e) {
-				}
-			}
-			if(runnable.exception != null) {
-				throw runnable.exception;
-			}
-			if(runnable.vm == null) {
-				throw new IOException("Failed to connect to Rhino interpreter."); //$NON-NLS-1$
-			}
-			vm = runnable.vm;
-			localmonitor.subTask(Messages.starting_rhino_process);
-			if(localmonitor.isCanceled()) {
-				cancel(vm, p);
-				return;
-			}
-			localmonitor.worked(1);
-			RhinoProcess process = new RhinoProcess(launch, p, computeProcessName(connector, args));
-			process.setAttribute(IProcess.ATTR_CMDLINE, formatCommandlineArgs(cmdargs));
-			launch.addProcess(process);
-			localmonitor.subTask(Messages.creating_js_debug_target);
-			if(localmonitor.isCanceled()) {
-				cancel(vm, p);
-				return;
-			}
-			localmonitor.worked(1);
-			JavaScriptDebugTarget target = new JavaScriptDebugTarget(vm, process, launch, true, false);
-			launch.addDebugTarget(target);
-			if(localmonitor.isCanceled()) {
-				cancel(vm, p);
-				return;
-			}
-			localmonitor.worked(1);
-			return;
-		}
-		catch(IOException ioe) {
-			cancel(vm, p);
-			RhinoUIPlugin.log(ioe);
-		}
-		catch(Exception e) {
-			if(e instanceof JavaScriptException) {
-				//ignore certain exceptions from code
-				if(configuration.getAttribute(ILaunchConstants.ATTR_LOG_INTERPRETER_EXCEPTIONS, true)) {
-					RhinoUIPlugin.log(e);
-				}
-				return;
-			}
-			cancel(vm, p);
-			RhinoUIPlugin.log(e);
-		}
-		finally {
-			if(scope != null) {
-				scope.clear();
-				scope = null;
-			}
-			script = null;
-		}
-		launch.terminate();
-		return;
-	}
-
-	/**
-	 * Stops + cleans up on cancellation / failure
-	 * 
-	 * @param vm
-	 * @param process
-	 */
-	void cancel(VirtualMachine vm, Process process) {
-		if(process != null) {
-			process.destroy();
-		}
-		if(vm != null) {
-			vm.terminate();
-		}
-	}
-	
-	/**
-	 * Adds the script scope to the args
-	 * 
-	 * @param args
-	 */
-	void addFArg(ArrayList args) {
-		args.add("-f"); //$NON-NLS-1$
-		args.addAll(scope);
-	}
-	
-	/**
-	 * Adds the VM executable location and classpath entries to the given arguments list
-	 * 
-	 * @param configuration
-	 * @param launch
-	 * @param args
-	 * @throws CoreException
-	 * @throws IOException 
-	 */
-	void addVMArgs(ILaunchConfiguration configuration, ILaunch launch, ArrayList args) throws CoreException, IOException {
-		IVMInstall vm = JavaRuntime.getDefaultVMInstall();
-		File loc = vm.getInstallLocation();
-		if(loc == null) {
-			throw new CoreException(new Status(IStatus.ERROR, RhinoUIPlugin.PLUGIN_ID, "Could not locate the default VM install")); //$NON-NLS-1$
-		}
-		File exe = StandardVMType.findJavaExecutable(vm.getInstallLocation());
-		if(exe == null) {
-			throw new CoreException(new Status(IStatus.ERROR, RhinoUIPlugin.PLUGIN_ID, "Could not find the Java executable for the default VM install")); //$NON-NLS-1$
-		}
-		args.add(exe.getAbsolutePath());
-		StringBuffer buffer = new StringBuffer();
-		for (int i = 0; i < REQUIRED_BUNDLES.length; i++) {
-			Bundle bundle = Platform.getBundle(REQUIRED_BUNDLES[i]);
-			if(bundle == null) {
-				throw new CoreException(new Status(IStatus.ERROR, RhinoUIPlugin.PLUGIN_ID, NLS.bind("Could not locate the {0} bundle", REQUIRED_BUNDLES[i]))); //$NON-NLS-1$
-			}
-			File file = FileLocator.getBundleFile(bundle);
-			if(file.isDirectory()) {
-				if(MOZILLA_JAVASCRIPT_BUNDLE.equals(REQUIRED_BUNDLES[i])) {
-					buffer.append(escapePath(file, false));
-				}
-				else {
-					//mozilla uses the project as the class file output dir
-					//so we only have to include bin directories for the other ones
-					file = new File(file, "bin"); //$NON-NLS-1$
-					if(file.exists()) {
-						buffer.append(escapePath(file, false));
-					}
-				}
-			}
-			else {
-				buffer.append(escapePath(file, false));
-			}
-			if(i < REQUIRED_BUNDLES.length-1) {
-				appendSep(buffer);
-			}
-		}
-		String encoding = getEncoding(launch);
-		if(encoding != null) {
-			args.add(encoding);
-		}
-		args.add("-cp"); //$NON-NLS-1$
-		args.add(buffer.toString());
-		args.add(DEBUG_SHELL_CLASS);
-	}
-	
-	/**
-	 * Return the <code>-Dfile.encoding</code> VM argument to use or <code>null</code> it no special encoding has been specified
-	 * 
-	 * @param configuration
-	 * @return the file encoding string or <code>null</code>
-	 */
-	String getEncoding(ILaunch launch) {
-		String encoding = launch.getAttribute(DebugPlugin.ATTR_CONSOLE_ENCODING);
-		if(encoding != null) {
-			StringBuffer buffer = new StringBuffer("-Dfile.encoding="); //$NON-NLS-1$
-			buffer.append(encoding);
-			return buffer.toString();
-		}
-		return null;
-	}
-	
-	/**
-	 * Escapes the path of the given file.
-	 * 
-	 * @param file the file to escape the path for
-	 * @return the escaped path
-	 */
-	String escapePath(File file, boolean singlequote) {
-		String path = file.getAbsolutePath();
-		StringCharacterIterator iter = new StringCharacterIterator(path);
-		StringBuffer buffer = new StringBuffer();
-		boolean hasspace = false;
-		char c = iter.current();
-		while(c != CharacterIterator.DONE) {
-			if(c == '\\') {
-				buffer.append("/"); //$NON-NLS-1$
-			}
-			else if(c == '"') {
-				buffer.append("\""); //$NON-NLS-1$
-			}
-			else if(c == ' ') {
-				hasspace = true;
-				buffer.append(c);
-			}
-			else {
-				buffer.append(c);
-			}
-			c = iter.next();
-		}
-		/*if(singlequote) {
-			buffer.insert(0, '\'');
-			buffer.append('\'');
-			return buffer.toString();
-		}
-		else */if(hasspace && !singlequote){
-			buffer.insert(0, "\""); //$NON-NLS-1$
-			buffer.append("\""); //$NON-NLS-1$
-			return buffer.toString();
-		}
-		return path;
-	}
-	
-	/**
-	 * Appends the correct version of a classpath separator to the given buffer
-	 * 
-	 * @param buffer the buffer to add the separator to
-	 */
-	void appendSep(StringBuffer buffer) {
-		if(Platform.getOS().equals(Platform.OS_WIN32)) {
-			buffer.append(';');
-		}
-		else {
-			buffer.append(':');
-		}
-	}
-	
-	/**
-	 * Adds the default connection string to the command line arguments
-	 * 
-	 * @param port
-	 * @param args
-	 */
-	void addConnectionArgs(int port, ArrayList args) {
-		args.add("-port"); //$NON-NLS-1$
-		args.add(Integer.toString(port));
-		args.add("-suspend"); //$NON-NLS-1$
-		args.add("y"); //$NON-NLS-1$
-	}
-	
-	/**
-	 * Adds the -version NNN ECMA version to the interpreter command line options
-	 * 
-	 * @param configuration
-	 * @param args
-	 * @throws CoreException
-	 */
-	void addECMAVersion(ILaunchConfiguration configuration, ArrayList args) throws CoreException {
-		args.add("-version"); //$NON-NLS-1$
-		args.add(configuration.getAttribute(ILaunchConstants.ATTR_ECMA_VERSION, "170")); //$NON-NLS-1$
-	}
-	
-	/**
-	 * Adds the encoding from the launch to the command line for the interpreter
-	 * 
-	 * @param launch
-	 * @param args
-	 */
-	void addEncoding(ILaunch launch, ArrayList args) {
-		String encoding = launch.getAttribute(DebugPlugin.ATTR_CONSOLE_ENCODING);
-		if(encoding != null) {
-			args.add("-encoding"); //$NON-NLS-1$
-			args.add(encoding);
-		}
-	}
-	
-	/**
-	 * Adds the optimization level to the interpreter
-	 * @param configuration
-	 * @param args
-	 * @throws CoreException
-	 */
-	void addOptLevel(ILaunchConfiguration configuration, ArrayList args) throws CoreException {
-		int opt = configuration.getAttribute(ILaunchConstants.ATTR_OPT_LEVEL, -1);
-		args.add("-opt"); //$NON-NLS-1$
-		args.add(Integer.toString(opt));
-	}
-	
-	/**
-	 * Adds the <code>-strict</code> flag if set in the configuration
-	 * 
-	 * @param configuration
-	 * @param args
-	 * @throws CoreException
-	 */
-	void addStrictMode(ILaunchConfiguration configuration, ArrayList args) throws CoreException {
-		boolean strict = configuration.getAttribute(ILaunchConstants.ATTR_STRICT_MODE, false);
-		if(strict) {
-			args.add("-strict"); //$NON-NLS-1$
-		}
-	}
-	
-	/**
-	 * Computes the complete list of scripts to load, with the last loaded script
-	 * being the one desired 
-	 * 
-	 * @param configuration
-	 * @param monitor
-	 * @throws CoreException 
-	 */
-	synchronized void computeScriptScope(ILaunchConfiguration configuration, IProgressMonitor monitor) throws CoreException {
-		//for now we only load the script you want to debug and the ones reported from the JS project as source containers
-		if(this.scope == null) {
-			this.scope = new ArrayList();
-			List list = configuration.getAttribute(ILaunchConstants.ATTR_INCLUDE_PATH, (List)null);
-			if(list != null) {
-				String entry = null;
-				for (Iterator i = list.iterator(); i.hasNext();) {
-					entry = (String) i.next();
-					int kind = Integer.parseInt(entry.substring(0, 1));
-					switch(kind) {
-						case IncludeEntry.LOCAL_SCRIPT: {
-							String value = entry.substring(1);
-							IFile ifile = (IFile) ResourcesPlugin.getWorkspace().getRoot().findMember(value);
-							if(ifile != null && ifile.exists()) {
-								File file = URIUtil.toFile(ifile.getLocationURI());
-								value = escapePath(file, true);
-								if(!scope.contains(value)) {
-									scope.add(value);
-								}
-							}
-							continue;
-						}
-						case IncludeEntry.EXT_SCRIPT: {
-							String f = entry.substring(1);
-							File file = new File(f);
-							if(file.exists() && !scope.contains(file.getAbsolutePath())) {
-								scope.add(file.getAbsolutePath());
-							}
-							continue;
-						}
-					}
-				}
-			}
-			addScriptAttribute(configuration, scope);
-		}
-	}
-	
-	/**
-	 * Adds the absolute path of the script specified in the launch configuration to the listing of arguments
-	 * 
-	 * @param configuration
-	 * @param args
-	 * @throws CoreException
-	 */
-	void addScriptAttribute(ILaunchConfiguration configuration, ArrayList args) throws CoreException {
-		ITypeRoot root = getScript(configuration);
-		File file = URIUtil.toFile(root.getResource().getLocationURI());
-		String value = escapePath(file, true);
-		args.remove(value);
-		//want to make sure it is interpreted last
-		args.add(value);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.ILaunchConfigurationDelegate2#getLaunch(org.eclipse.debug.core.ILaunchConfiguration, java.lang.String)
-	 */
-	public ILaunch getLaunch(ILaunchConfiguration configuration, String mode) throws CoreException {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.ILaunchConfigurationDelegate2#buildForLaunch(org.eclipse.debug.core.ILaunchConfiguration, java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public boolean buildForLaunch(ILaunchConfiguration configuration, String mode, IProgressMonitor monitor) throws CoreException {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.ILaunchConfigurationDelegate2#finalLaunchCheck(org.eclipse.debug.core.ILaunchConfiguration, java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public boolean finalLaunchCheck(ILaunchConfiguration configuration, String mode, IProgressMonitor monitor) throws CoreException {
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.ILaunchConfigurationDelegate2#preLaunchCheck(org.eclipse.debug.core.ILaunchConfiguration, java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public boolean preLaunchCheck(ILaunchConfiguration configuration, String mode, IProgressMonitor monitor) throws CoreException {
-		monitor.subTask(Messages.computing_script_scope);
-		computeScriptScope(configuration, monitor);
-		if(this.scope.isEmpty()) {
-			this.scope = null;
-			throw new CoreException(new Status(IStatus.ERROR, RhinoUIPlugin.PLUGIN_ID, Messages.failed_to_compute_scope));
-		}
-		return true;
-	}
-	
-	/**
-	 * Returns if the script to launch has any JavaScript problems
-	 * 
-	 * @param configuration
-	 * @return
-	 * @throws CoreException
-	 */
-	boolean hasProblems(ILaunchConfiguration configuration) throws CoreException {
-		//TODO this should be expanded to check the entire script scope
-		String name = configuration.getAttribute(ILaunchConstants.ATTR_SCRIPT, ILaunchConstants.EMPTY_STRING);
-		IResource script = ResourcesPlugin.getWorkspace().getRoot().findMember(new Path(name));
-		if(script.isAccessible()) {
-			IMarker[] problems = script.findMarkers(IJavaScriptModelMarker.JAVASCRIPT_MODEL_PROBLEM_MARKER, true, IResource.DEPTH_INFINITE);
-			return problems.length > 0;
-		}
-		return false;
-	}
-	
-	/**
-	 * Turns the command line argument list into a string
-	 * 
-	 * @param args
-	 * @return the command line list as a string
-	 */
-	String formatCommandlineArgs(ArrayList args) {
-		StringBuffer buffer = new StringBuffer();
-		for (int i = 0; i < args.size(); i++) {
-			buffer.append(args.get(i));
-			if(i < args.size()-1) {
-				buffer.append(" "); //$NON-NLS-1$
-			}
-		}
-		return buffer.toString();
-	}
-	
-	/**
-	 * Computes the command line to set on the process attribute
-	 * @param args
-	 * @return
-	 */
-	String formatConnectionArguments(Map args) {
-		StringBuffer buffer = new StringBuffer();
-		Map.Entry entry = null;
-		for(Iterator iter = args.entrySet().iterator(); iter.hasNext();) {
-			entry = (Entry) iter.next();
-			buffer.append(entry.getKey()).append(':').append(entry.getValue());
-			if(iter.hasNext()) {
-				buffer.append(',');
-			}
-		}
-		return buffer.toString();
-	}
-	
-	/**
-	 * Computes the display name for the {@link IProcess} given the connector
-	 * @param connector
-	 * @return the name for the process
-	 */
-	String computeProcessName(Connector connector, Map args) {
-		StringBuffer buffer = new StringBuffer(connector.name());
-		String timestamp = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM).format(new Date(System.currentTimeMillis()));
-		return NLS.bind(Messages.process_label, new String[] {buffer.toString(), formatConnectionArguments(args), timestamp});
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/launching/RhinoMainTab.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/launching/RhinoMainTab.java
deleted file mode 100644
index abebebf..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/launching/RhinoMainTab.java
+++ /dev/null
@@ -1,321 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.ui.launching;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.jsdt.core.IJavaScriptElement;
-import org.eclipse.wst.jsdt.core.IJavaScriptUnit;
-import org.eclipse.wst.jsdt.core.IMember;
-import org.eclipse.wst.jsdt.core.ITypeRoot;
-import org.eclipse.wst.jsdt.core.JavaScriptCore;
-import org.eclipse.wst.jsdt.debug.internal.rhino.ui.IHelpConstants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.ui.ILaunchConstants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.ui.ISharedImages;
-import org.eclipse.wst.jsdt.debug.internal.rhino.ui.RhinoImageRegistry;
-import org.eclipse.wst.jsdt.debug.internal.rhino.ui.RhinoUIPlugin;
-import org.eclipse.wst.jsdt.debug.internal.rhino.ui.refactoring.Refactoring;
-import org.eclipse.wst.jsdt.debug.internal.ui.SWTFactory;
-import org.eclipse.wst.jsdt.debug.internal.ui.dialogs.ScriptSelectionDialog;
-
-/**
- * Rhino specific main tab
- * 
- * @since 1.0
- */
-public class RhinoMainTab extends AbstractLaunchConfigurationTab {
-
-	/**
-	 * The id of the tab
-	 * <br><br>
-	 * Value is: <code>rhino.main.tab</code>
-	 */
-	public static final String TAB_ID = "rhino.main.tab"; //$NON-NLS-1$
-	public static final String[] VERSIONS = {"100", "110", "120", "130", "140", "150", "160", "170"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-	public static final String[] OPTIMIZATIONS = {"-1 [interpret only]", "0 [no optimizations]", "1 [all optimizations]"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-	
-	SelectionAdapter defaultAdapter = new SelectionAdapter() {
-		public void widgetSelected(SelectionEvent e) {
-			updateLaunchConfigurationDialog();
-		};
-	};
-	
-	Text script = null;
-	Button logging = null,
-		   strict = null;
-	Combo ecmaversion = null,
-		  optlevel = null;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite comp = SWTFactory.createComposite(parent, 1, 1, GridData.FILL_HORIZONTAL);
-		Group group = SWTFactory.createGroup(comp, Messages._script, 2, 1, GridData.FILL_HORIZONTAL);
-		script = SWTFactory.createSingleText(group, 1);
-		script.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				updateLaunchConfigurationDialog();
-			}
-		});
-		((GridData) script.getLayoutData()).grabExcessHorizontalSpace = true;
-		Button browse = SWTFactory.createPushButton(group, Messages.bro_wse, null);
-		browse.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				IJavaScriptUnit unit = chooseScript();
-				if(unit != null) {
-					script.setText(unit.getPath().toString());
-				}
-			}
-		});
-		group = SWTFactory.createGroup(comp, Messages.options_group_name, 2, 1, GridData.FILL_HORIZONTAL);
-		Label lbl = SWTFactory.createWrapLabel(group, Messages.ecma_version_to_interpret_with, 1);
-		((GridData)lbl.getLayoutData()).grabExcessHorizontalSpace = true;
-		ecmaversion = SWTFactory.createCombo(group, SWT.READ_ONLY | SWT.SINGLE, 1, VERSIONS);
-		ecmaversion.addSelectionListener(defaultAdapter);
-		GridData data = (GridData) ecmaversion.getLayoutData();
-		data.grabExcessHorizontalSpace = false;
-		data.horizontalAlignment = SWT.END;
-		lbl = SWTFactory.createWrapLabel(group, Messages.rhino_opt_level, 1);
-		((GridData)lbl.getLayoutData()).grabExcessHorizontalSpace = true;
-		optlevel = SWTFactory.createCombo(group, SWT.READ_ONLY | SWT.SINGLE, 1, OPTIMIZATIONS);
-		optlevel.addSelectionListener(defaultAdapter);
-		data = (GridData) optlevel.getLayoutData();
-		data.grabExcessHorizontalSpace = false;
-		data.horizontalAlignment = SWT.END;
-		strict = SWTFactory.createCheckButton(group, Messages.strict_mode, null, false, 2);
-		strict.addSelectionListener(defaultAdapter);
-		logging = SWTFactory.createCheckButton(group, Messages.log_interpreter_exceptions, null, false, 2);
-		logging.addSelectionListener(defaultAdapter);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(comp, IHelpConstants.MAIN_TAB_CONTEXT);
-		setControl(comp);
-	}
-	
-	public String getHelpContextId() {
-		return IHelpConstants.MAIN_TAB_CONTEXT;
-	};
-	
-	/**
-	 * Allows users to select a script from either a project context, if there is one or the workspace
-	 * 
-	 * @return the selected script or <code>null</code>
-	 */
-	IJavaScriptUnit chooseScript() {
-		ScriptSelectionDialog dialog = new ScriptSelectionDialog(getShell(), false, ResourcesPlugin.getWorkspace().getRoot());
-		dialog.setTitle(Messages.script_selection);
-		if(dialog.open() == IDialogConstants.OK_ID) {
-			IFile file = (IFile) dialog.getFirstResult();
-			return (IJavaScriptUnit) JavaScriptCore.create(file);
-		}
-		return null;
-	}
-	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#isValid(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public boolean isValid(ILaunchConfiguration launchConfig) {
-		String text2 = script.getText().trim();
-		boolean hasscript = text2.length() > 0;
-		if(!hasscript) {
-			setErrorMessage(Messages.provide_script_for_project);
-			return false;
-		}
-		IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(new Path(text2));
-		if(resource != null) {
-			if(resource.getType() != IResource.FILE) {
-				setErrorMessage(NLS.bind(Messages.script_not_a_file, text2));
-				return false;
-			}
-			if(!resource.isAccessible()) {
-				setErrorMessage(NLS.bind(Messages.script_not_accessible, text2));
-				return false;
-			}
-		}
-		else {
-			setErrorMessage(NLS.bind(Messages.script_not_in_workspace, text2));
-			return false;
-		}
-		setErrorMessage(null);
-		setMessage(Messages.launch_script);
-		return true;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-	 */
-	public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
-		IJavaScriptElement element = getContext();
-		if(element != null) {
-			if(element instanceof IMember) {
-				IMember member = (IMember) element;
-				if(member.isBinary()) {
-					element = member.getClassFile();
-				}
-				else {
-					element = member.getJavaScriptUnit();
-				}
-			}
-			String pname = element.getJavaScriptProject().getProject().getName();
-			String name = pname;
-			ITypeRoot root = null;
-			if(element.getElementType() == IJavaScriptElement.CLASS_FILE ||
-					element.getElementType() == IJavaScriptElement.JAVASCRIPT_UNIT) {
-				root = (ITypeRoot) element;
-				String tname = root.getElementName();
-				configuration.setAttribute(ILaunchConstants.ATTR_SCRIPT, root.getPath().toString());
-				name = NLS.bind(Messages.config_name, new String[] {pname, tname});
-			}
-			name = getLaunchConfigurationDialog().generateName(name);
-			configuration.rename(name);
-			Refactoring.mapResources(configuration);
-		}
-		configuration.setAttribute(ILaunchConstants.ATTR_LOG_INTERPRETER_EXCEPTIONS, true);
-		configuration.setAttribute(ILaunchConstants.ATTR_ECMA_VERSION, ILaunchConstants.ECMA_170);
-		configuration.setAttribute(ILaunchConstants.ATTR_OPT_LEVEL, -1);
-		configuration.setAttribute(ILaunchConstants.ATTR_STRICT_MODE, false);
-	}
-
-	/**
-	 * Returns the current JavaScript context - project or script file - from the current workbench
-	 * selection or <code>null</code> if:
-	 * <ol>
-	 * <li>there is no active workbench page or part</li>
-	 * <li>there is nothing selected in the active page</li>
-	 * <li>the selected item cannot be resolved to an {@link IJavaScriptElement}</li>
-	 * </ol>
-	 * 
-	 * @return the {@link IJavaScriptElement} context for the current workbench selection or <code>null</code>
-	 */
-	IJavaScriptElement getContext() {
-		IWorkbenchPage page = RhinoUIPlugin.getActivePage();
-		if (page != null) {
-			ISelection selection = page.getSelection();
-			if (selection instanceof IStructuredSelection) {
-				IStructuredSelection ss = (IStructuredSelection)selection;
-				if (!ss.isEmpty()) {
-					Object obj = ss.getFirstElement();
-					if (obj instanceof IJavaScriptElement) {
-						return (IJavaScriptElement)obj;
-					}
-					if (obj instanceof IResource) {
-						IJavaScriptElement je = JavaScriptCore.create((IResource)obj);
-						if (je == null) {
-							IProject pro = ((IResource)obj).getProject();
-							je = JavaScriptCore.create(pro);
-						}
-						if (je != null) {
-							return je;
-						}
-					}
-				}
-			}
-			IEditorPart part = page.getActiveEditor();
-			if (part != null) {
-				IEditorInput input = part.getEditorInput();
-				return (IJavaScriptElement) input.getAdapter(IJavaScriptElement.class);
-			}
-		}
-		return null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public void initializeFrom(ILaunchConfiguration configuration) {
-		try {
-			String text = configuration.getAttribute(ILaunchConstants.ATTR_SCRIPT, (String)null);
-			if(text != null) {
-				script.setText(text);
-			}
-			boolean value = configuration.getAttribute(ILaunchConstants.ATTR_LOG_INTERPRETER_EXCEPTIONS, true);
-			logging.setSelection(value);
-			value = configuration.getAttribute(ILaunchConstants.ATTR_STRICT_MODE, false);
-			strict.setSelection(value);
-			text = configuration.getAttribute(ILaunchConstants.ATTR_ECMA_VERSION, ILaunchConstants.ECMA_170);
-			int idx = ecmaversion.indexOf(text);
-			if(idx < 0) {
-				idx = 7;
-			}
-			ecmaversion.select(idx);
-			int opt = configuration.getAttribute(ILaunchConstants.ATTR_OPT_LEVEL, -1);
-			optlevel.select(opt+1);
-		}
-		catch(CoreException ce) {}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-	 */
-	public void performApply(ILaunchConfigurationWorkingCopy configuration) {
-		String scpt = script.getText().trim();
-		if(scpt.length() < 1) {
-			configuration.removeAttribute(ILaunchConstants.ATTR_SCRIPT);
-		}
-		else {
-			configuration.setAttribute(ILaunchConstants.ATTR_SCRIPT, scpt);
-		}
-		configuration.setAttribute(ILaunchConstants.ATTR_LOG_INTERPRETER_EXCEPTIONS, logging.getSelection());
-		configuration.setAttribute(ILaunchConstants.ATTR_STRICT_MODE, strict.getSelection());
-		configuration.setAttribute(ILaunchConstants.ATTR_ECMA_VERSION, ecmaversion.getText());
-		configuration.setAttribute(ILaunchConstants.ATTR_OPT_LEVEL, optlevel.getSelectionIndex()-1);
-		Refactoring.mapResources(configuration);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
-	 */
-	public String getName() {
-		return Messages.main;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getId()
-	 */
-	public String getId() {
-		return TAB_ID;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getImage()
-	 */
-	public Image getImage() {
-		return RhinoImageRegistry.getSharedImage(ISharedImages.IMG_MAIN_TAB);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/launching/RhinoProcess.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/launching/RhinoProcess.java
deleted file mode 100644
index 115a3bc..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/launching/RhinoProcess.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.ui.launching;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.core.model.IStreamsProxy;
-import org.eclipse.debug.internal.core.StreamsProxy;
-import org.eclipse.wst.jsdt.debug.internal.core.launching.JavaScriptProcess;
-import org.eclipse.wst.jsdt.debug.rhino.debugger.RhinoDebugger;
-
-/**
- * Specialization to terminate the instantiated {@link RhinoDebugger}
- * 
- * @since 1.0
- */
-public class RhinoProcess extends JavaScriptProcess {
-
-	public static final String TYPE = "rhino"; //$NON-NLS-1$
-	
-	private Process process = null;
-	
-	private StreamsProxy streamproxy = null;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param launch the {@link ILaunch} this {@link IProcess} is associated with
-	 * @param p the underlying {@link Process}
-	 * @param name the human readable name for the process
-	 */
-	public RhinoProcess(ILaunch launch, Process p, String name) {
-		super(launch, name);
-		this.process = p;
-		String capture = launch.getAttribute(DebugPlugin.ATTR_CAPTURE_OUTPUT);
-		boolean needsstreams = capture == null ? true : Boolean.valueOf(capture).booleanValue();
-		if(needsstreams) {
-			streamproxy = new StreamsProxy(p, launch.getAttribute(DebugPlugin.ATTR_CONSOLE_ENCODING));
-		}
-		setAttribute(IProcess.ATTR_PROCESS_TYPE, TYPE);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.launching.JavaScriptProcess#terminate()
-	 */
-	public void terminate() throws DebugException {
-		process.destroy();
-		if(streamproxy != null) {
-			streamproxy.close();
-		}
-		super.terminate();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.launching.JavaScriptProcess#getStreamsProxy()
-	 */
-	public IStreamsProxy getStreamsProxy() {
-		return streamproxy;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/launching/RhinoTabGroup.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/launching/RhinoTabGroup.java
deleted file mode 100644
index 663defc..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/launching/RhinoTabGroup.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.ui.launching;
-
-import org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup;
-import org.eclipse.debug.ui.CommonTab;
-import org.eclipse.debug.ui.ILaunchConfigurationDialog;
-import org.eclipse.debug.ui.ILaunchConfigurationTab;
-import org.eclipse.debug.ui.sourcelookup.SourceLookupTab;
-import org.eclipse.wst.jsdt.debug.internal.rhino.ui.IHelpConstants;
-
-/**
- * Rhino specific tab group
- * 
- * @since 1.0
- */
-public class RhinoTabGroup extends AbstractLaunchConfigurationTabGroup {
-
-	/**
-	 * Constructor
-	 */
-	public RhinoTabGroup() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTabGroup#createTabs(org.eclipse.debug.ui.ILaunchConfigurationDialog, java.lang.String)
-	 */
-	public void createTabs(ILaunchConfigurationDialog dialog, String mode) {
-		SourceLookupTab stab = new SourceLookupTab();
-		stab.setHelpContextId(IHelpConstants.SOURCE_TAB_CONTEXT);
-		CommonTab ctab = new CommonTab();
-		ctab.setHelpContextId(IHelpConstants.COMMON_TAB_CONTEXT);
-		setTabs(new ILaunchConfigurationTab[] {
-					new RhinoMainTab(),
-					new IncludeTab(),
-					stab,
-					ctab
-				}
-		);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/launching/messages.properties b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/launching/messages.properties
deleted file mode 100644
index f21195b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/launching/messages.properties
+++ /dev/null
@@ -1,46 +0,0 @@
-###############################################################################
-# Copyright (c) 2010, 2011 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-_script=&Script
-add_ext_script_button=Add E&xternal Scripts...
-add_script_button=Add S&cripts...
-bro_wse=Bro&wse
-computing_script_scope=computing script scope
-config_name={0} - {1}
-configuring_rhino_debugger=configuring Rhino debugger
-connect_thread=Connect Thread
-creating_js_debug_target=creating JavaScript debug target
-creating_rhino_vm=creating Rhino virtual machine
-defaults_button=&Defaults
-down_button=Do&wn
-ecma_version_to_interpret_with=EC&MA script version to interpret with:
-failed_to_compute_scope=Failed to compute the script scope
-include_path=&Include path:
-include_tab_name=Include
-launch_script=Launch a JavaScript script file using Rhino
-launching__=Launching {0}
-log_interpreter_exceptions=&Log interpreter exceptions
-main=Main
-options_group_name=&Options
-process_label={0} [{1}] ({2})
-provide_script_for_project=You must provide a script to debug
-remove_button=Remo&ve
-rhino_opt_level=Rhino optimi&zation level:
-script_not_a_file=Script {0} is not a file
-script_not_accessible=Script {0} is not accessible
-script_not_in_workspace=Script {0} is not in the workspace
-script_selection=Script Selection
-select_existing_config=Select e&xisting configuration:
-select_rhino_config=Select Rhino Configuration
-select_scripts_to_add=Select Scripts To Add
-starting_rhino_interpreter=starting Rhino interpreter
-starting_rhino_process=starting Rhino process
-strict_mode=Strict &mode:
-up_button=&Up
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/preferences/Messages.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/preferences/Messages.java
deleted file mode 100644
index d9d3529..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/preferences/Messages.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.ui.preferences;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.internal.rhino.ui.preferences.messages"; //$NON-NLS-1$
-	public static String rhino_pref_page_desc;
-	public static String suspend_execution;
-	public static String suspend_for_stdin;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/preferences/RhinoDebugPreferencePage.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/preferences/RhinoDebugPreferencePage.java
deleted file mode 100644
index 991513a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/preferences/RhinoDebugPreferencePage.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.ui.preferences;
-
-import org.eclipse.jface.preference.BooleanFieldEditor;
-import org.eclipse.jface.preference.FieldEditor;
-import org.eclipse.jface.preference.FieldEditorPreferencePage;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.jsdt.debug.internal.rhino.Constants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.ui.IHelpConstants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.ui.RhinoUIPlugin;
-import org.eclipse.wst.jsdt.debug.internal.ui.SWTFactory;
-
-/**
- * Default preference page for Rhino preferences
- * 
- * @since 1.0
- */
-public class RhinoDebugPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
-
-	public static final String PAGE_ID = "org.eclipse.wst.jsdt.debug.rhino.ui.debug.pref.page"; //$NON-NLS-1$
-	
-	/**
-	 * Constructor
-	 */
-	public RhinoDebugPreferencePage() {
-		super(GRID);
-		setDescription(Messages.rhino_pref_page_desc);
-		setPreferenceStore(RhinoUIPlugin.getCorePreferenceStore());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
-	 */
-	public void init(IWorkbench workbench) {}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.FieldEditorPreferencePage#createFieldEditors()
-	 */
-	protected void createFieldEditors() {}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		super.createControl(parent);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, IHelpConstants.RHINO_PREFERENCE_PAGE);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.FieldEditorPreferencePage#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		Composite comp = SWTFactory.createComposite(parent, parent.getFont(), 1, 1, GridData.FILL_HORIZONTAL, 0, 0);
-		Group group = SWTFactory.createGroup(comp, Messages.suspend_execution, 1, 1, GridData.FILL_HORIZONTAL);
-		BooleanFieldEditor editor = new BooleanFieldEditor(Constants.SUSPEND_ON_STDIN_LOAD, Messages.suspend_for_stdin, group);
-		initEditor(editor, RhinoUIPlugin.getCorePreferenceStore());
-		//reset the group layout after we add the editors, since they toast the padding
-		GridLayout lo = (GridLayout) group.getLayout();
-		lo.marginWidth = 5;
-		lo.marginHeight = 5;
-		return comp;
-	}
-
-	/**
-	 * Initializes and sets up the given editor
-	 * 
-	 * @param editor
-	 * @param store
-	 */
-	void initEditor(FieldEditor editor, IPreferenceStore store) {
-		addField(editor);
-		editor.setPage(this);
-		editor.setPropertyChangeListener(this);
-		editor.setPreferenceStore(store);
-		editor.load();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/preferences/messages.properties b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/preferences/messages.properties
deleted file mode 100644
index d6ebcc2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/preferences/messages.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2010 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-rhino_pref_page_desc=General settings for Rhino JavaScript debugging
-suspend_execution=Suspend Execution
-suspend_for_stdin=Suspend for <s&tdin> script loads
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/FolderChange.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/FolderChange.java
deleted file mode 100644
index 46b2682..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/FolderChange.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.ui.refactoring;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.wst.jsdt.debug.internal.rhino.ui.ILaunchConstants;
-
-/**
- * Change for a folder being renamed
- * 
- * @since 1.0
- */
-public class FolderChange extends RhinoChange {
-
-	/**
-	 * Constructor
-	 * 
-	 * @param configuration
-	 * @param oldname the old folder name
-	 * @param newname the new folder name
-	 */
-	public FolderChange(ILaunchConfiguration configuration, String oldname, String newname) {
-		super(configuration, oldname, newname);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ltk.core.refactoring.Change#perform(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public Change perform(IProgressMonitor pm) throws CoreException {
-		ILaunchConfigurationWorkingCopy copy = configuration.getWorkingCopy();
-		//move it first
-		if(!configuration.isLocal()) {
-	        IContainer cont = (IContainer) ResourcesPlugin.getWorkspace().getRoot().findMember(newname);
-	        copy.setContainer(cont);
-		}
-		//update the script attribute
-		String script = computeNewScriptName(configuration);
-		if(script != null) {
-			copy.setAttribute(ILaunchConstants.ATTR_SCRIPT, script);
-		}
-		//update the include path
-		updateIncludeEntries(copy);
-		//update resource mappings
-		Refactoring.mapResources(copy);
-		if(copy.isDirty()) {
-			configuration = copy.doSave();
-			return new FolderChange(configuration, newname, oldname);
-		}
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/FolderMoveParticipant.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/FolderMoveParticipant.java
deleted file mode 100644
index e2d45ff..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/FolderMoveParticipant.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.ui.refactoring;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
-import org.eclipse.ltk.core.refactoring.participants.MoveParticipant;
-
-/**
- * Refactoring participant that handles {@link IFolder}s being moved
- * 
- * @since 1.0
- */
-public class FolderMoveParticipant extends MoveParticipant {
-
-	private IFolder folder = null;
-	
-	/**
-	 * Constructor
-	 */
-	public FolderMoveParticipant() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant#initialize(java.lang.Object)
-	 */
-	protected boolean initialize(Object element) {
-		folder = (IFolder) element;
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant#getName()
-	 */
-	public String getName() {
-		return Messages.rhino_lc_participant;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant#checkConditions(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext)
-	 */
-	public RefactoringStatus checkConditions(IProgressMonitor pm, CheckConditionsContext context) throws OperationCanceledException {
-		return new RefactoringStatus();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant#createChange(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException {
-		IContainer locale = (IContainer) getArguments().getDestination();
-		return Refactoring.createChangesForFolderRename(folder, locale.getFullPath().append(folder.getName()).makeAbsolute().toOSString());
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/FolderRenameParticipant.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/FolderRenameParticipant.java
deleted file mode 100644
index 67a0249..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/FolderRenameParticipant.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.ui.refactoring;
-
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
-import org.eclipse.ltk.core.refactoring.participants.RenameParticipant;
-
-/**
- * Rename participant for {@link IFolder}s
- * 
- * @since 1.0
- */
-public class FolderRenameParticipant extends RenameParticipant {
-
-	private IFolder folder = null;
-	
-	/**
-	 * Constructor
-	 */
-	public FolderRenameParticipant() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant#initialize(java.lang.Object)
-	 */
-	protected boolean initialize(Object element) {
-		folder = (IFolder) element;
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant#getName()
-	 */
-	public String getName() {
-		return Messages.rhino_lc_participant;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant#checkConditions(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext)
-	 */
-	public RefactoringStatus checkConditions(IProgressMonitor pm, CheckConditionsContext context) throws OperationCanceledException {
-		return new RefactoringStatus();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant#createChange(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException {
-		IPath name = folder.getFullPath().makeAbsolute();
-		name = name.removeLastSegments(1).append(getArguments().getNewName());
-		return Refactoring.createChangesForFolderRename(folder, name.toOSString());
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/Messages.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/Messages.java
deleted file mode 100644
index 45ce686..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/Messages.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.ui.refactoring;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.internal.rhino.ui.refactoring.messages"; //$NON-NLS-1$
-	public static String config_no_longer_exists;
-	public static String multi_updates;
-	public static String rhino_lc_participant;
-	public static String update_attributes;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/ProjectChange.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/ProjectChange.java
deleted file mode 100644
index ade728e..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/ProjectChange.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.ui.refactoring;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.wst.jsdt.debug.internal.rhino.ui.ILaunchConstants;
-
-public class ProjectChange extends RhinoChange {
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param configuration
-	 * @param oldname
-	 * @param newname
-	 */
-	public ProjectChange(ILaunchConfiguration configuration, String oldname, String newname) {
-		super(configuration, oldname, newname);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ltk.core.refactoring.Change#perform(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public Change perform(IProgressMonitor pm) throws CoreException {
-		ILaunchConfigurationWorkingCopy copy = configuration.getWorkingCopy();
-		//move it first
-		String value = computeNewContainerName(configuration);
-		if(value != null) {
-			IWorkspace workspace = ResourcesPlugin.getWorkspace();
-	        IWorkspaceRoot root = workspace.getRoot();
-	        IProject project = root.getProject(newname);
-	        IContainer cont = (IContainer) project.findMember(value);
-	        copy.setContainer(cont);
-		}
-		//update the attributes
-		value = computeNewScriptName(configuration);
-		if(value != null) {
-			copy.setAttribute(ILaunchConstants.ATTR_SCRIPT, value);
-		}
-		//update include entries
-		updateIncludeEntries(copy);
-		//rename it
-		value = computeNewConfigurationName(configuration);
-		if(value != null) {
-			copy.rename(value);
-		}
-		//update resource mappings
-		Refactoring.mapResources(copy);
-		if(copy.isDirty()) {
-			configuration = copy.doSave();
-			return new ProjectChange(configuration, newname, oldname);
-		}
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/ProjectRenameParticipant.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/ProjectRenameParticipant.java
deleted file mode 100644
index f6946cd..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/ProjectRenameParticipant.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.ui.refactoring;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
-import org.eclipse.ltk.core.refactoring.participants.RenameParticipant;
-
-/**
- * Refactoring participant for a JavaScript project rename
- */
-public class ProjectRenameParticipant extends RenameParticipant {
-	
-	private IProject origproject = null;
-	
-	/**
-	 * Constructor
-	 */
-	public ProjectRenameParticipant() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant#initialize(java.lang.Object)
-	 */
-	protected boolean initialize(Object element) {
-		origproject = (IProject) element;
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant#getName()
-	 */
-	public String getName() {
-		return Messages.rhino_lc_participant;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant#checkConditions(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext)
-	 */
-	public RefactoringStatus checkConditions(IProgressMonitor pm, CheckConditionsContext context) throws OperationCanceledException {
-		return new RefactoringStatus();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant#createChange(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException {
-		return Refactoring.createChangesForProjectRename(origproject, getArguments().getNewName());
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/Refactoring.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/Refactoring.java
deleted file mode 100644
index 4e881c9..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/Refactoring.java
+++ /dev/null
@@ -1,316 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.ui.refactoring;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationType;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.core.ILaunchManager;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.CompositeChange;
-import org.eclipse.wst.jsdt.debug.internal.rhino.ui.ILaunchConstants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.ui.RhinoUIPlugin;
-import org.eclipse.wst.jsdt.debug.internal.rhino.ui.launching.IncludeEntry;
-
-/**
- * Utilities to help with refactoring
- * 
- * @since 1.0
- */
-public class Refactoring {
-
-	public static ILaunchConfiguration[] NO_CONFIGS = new ILaunchConfiguration[0];
-	public static IncludeEntry[] NO_ENTRIES = new IncludeEntry[0];
-	
-	/**
-	 * Creates one or more {@link Change}s required after an {@link IProject} rename
-	 * 
-	 * @param project the renamed {@link IProject}
-	 * @param newname the new name
-	 * @return a new {@link Change}
-	 */
-	public static Change createChangesForProjectRename(IProject project, String newname) {
-		ILaunchConfiguration[] configs = getConfigurationsScopedTo(project.getFullPath().makeAbsolute().toString());
-		if(configs.length < 1) {
-			return null;
-		}
-		ArrayList changes = new ArrayList(configs.length);
-		for (int i = 0; i < configs.length; i++) {
-			changes.add(new ProjectChange(configs[i], project.getName(), newname));
-		}
-		return createChangeFromList(changes, Messages.multi_updates);
-	}
-	
-	/**
-	 * Create one or more {@link Change}s after a script {@link IFile} rename
-	 * 
-	 * @param script the renamed {@link IFile}
-	 * @param newname the new name
-	 * @return a new {@link Change}
-	 */
-	public static Change createChangesForScriptRename(IFile script, String newname) {
-		String scriptname = script.getFullPath().makeAbsolute().toString();
-		ILaunchConfiguration[] configs = getConfigurationsScopedTo(scriptname);
-		if(configs.length < 1) {
-			return null;
-		}
-		ArrayList changes = new ArrayList(configs.length);
-		for (int i = 0; i < configs.length; i++) {
-			changes.add(new ScriptChange(configs[i], scriptname, newname));
-		}
-		return createChangeFromList(changes, Messages.multi_updates);
-	}
-	
-	/**
-	 * Create one or more {@link Change}s after an {@link IFolder} rename
-	 * 
-	 * @param folder the renamed {@link IFolder}
-	 * @param newname the new name
-	 * @return a new {@link Change}
-	 */
-	public static Change createChangesForFolderRename(IFolder folder, String newname) {
-		String foldername = folder.getFullPath().makeAbsolute().toString();
-		ILaunchConfiguration[] configs = getConfigurationsScopedTo(foldername);
-		if(configs.length < 1) {
-			return null;
-		}
-		ArrayList changes = new ArrayList(configs.length);
-		for (int i = 0; i < configs.length; i++) {
-			changes.add(new FolderChange(configs[i], foldername, newname));
-		}
-		return createChangeFromList(changes, Messages.multi_updates);
-	}
-	
-	/**
-	 * Collects the {@link IResource}s associated with the given Rhino launch configuration
-	 * 
-	 * @param configuration
-	 * @return the array of associated {@link IResource}s or an empty array, never <code>null</code>
-	 * @throws CoreException
-	 */
-	public static IResource[] getResources(ILaunchConfiguration configuration) {
-		ArrayList resources = new ArrayList(2);
-		try {
-			IFile script = getScript(configuration);
-			if(script != null) {
-				resources.add(script);
-			}
-		}
-		catch(CoreException ce) {
-			RhinoUIPlugin.log(ce);
-		}
-		return (IResource[]) resources.toArray(new IResource[resources.size()]);
-	}
-	
-	/**
-	 * Fetches the script attribute as an {@link IFile} or returns <code>null</code> if it could not be found
-	 * 
-	 * @param configuration
-	 * @return the {@link IFile} backing the script attribute or <code>null</code> if not found
-	 * @throws CoreException
-	 */
-	public static IFile getScript(ILaunchConfiguration configuration) throws CoreException {
-		String name = configuration.getAttribute(ILaunchConstants.ATTR_SCRIPT, ILaunchConstants.EMPTY_STRING);
-		if(!ILaunchConstants.EMPTY_STRING.equals(name)) {
-			IPath spath = new Path(name); 
-			IResource script = ResourcesPlugin.getWorkspace().getRoot().findMember(spath);
-			if(script != null && script.getType() == IResource.FILE) {
-				return (IFile) script;
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Delegate method to map {@link IResource}s in the given working copy. This method does not save the 
-	 * working and if no resources can be computed any existing resource mapping will be removed
-	 * 
-	 * @param configuration
-	 * @throws CoreException
-	 */
-	public static void mapResources(ILaunchConfigurationWorkingCopy configuration) {
-		IResource[] resources = getResources(configuration);
-		if(resources.length < 1) {
-			configuration.setMappedResources(null);
-		}
-		else {
-			configuration.setMappedResources(resources);
-		}
-	}
-	
-	/**
-	 * Take a list of Changes, and return a unique Change, a CompositeChange, or null.
-	 */
-	public static Change createChangeFromList(List changes, String changeLabel) {
-		int count = changes.size();
-		if (count == 0) {
-			return null;
-		} 
-		else if (count == 1) {
-			return (Change) changes.get(0);
-		} 
-		else {
-			return new CompositeChange(changeLabel, (Change[])changes.toArray(new Change[changes.size()]));
-		}
-	}
-	
-	/**
-	 * Returns the complete known listing of Rhino launch configurations
-	 * 
-	 * @return the complete listing of Rhino launch configurations or an empty array, never <code>null</code>
-	 */
-	public static ILaunchConfiguration[] getRhinoConfigurations() {
-		ILaunchManager lm = DebugPlugin.getDefault().getLaunchManager();
-		ILaunchConfigurationType type = lm.getLaunchConfigurationType(ILaunchConstants.LAUNCH_CONFIG_TYPE);
-		if(type != null) {
-			try {
-				return lm.getLaunchConfigurations(type);
-			} catch (CoreException e) {
-				//ignore just return an empty array
-			}
-		}
-		return NO_CONFIGS;
-	}
-	
-	/**
-	 * Returns the complete listing of Rhino {@link ILaunchConfiguration}s that reference the given path in some way.
-	 * The supported reference kinds are (1) via the script attribute, and (2) via the include path where it could be an exact
-	 * match for a workspace script or a partial match for a local file system script
-	 *  
-	 * @param elementpath the absolute path of the element to find configuration for
-	 * @return the complete listing of Rhino configurations that reference the given path or an empty array, never <code>null</code>
-	 */
-	public static ILaunchConfiguration[] getConfigurationsScopedTo(String elementpath) {
-		if(elementpath == null) {
-			return NO_CONFIGS;
-		}
-		ILaunchConfiguration[] configs = getRhinoConfigurations();
-		ArrayList scoped = new ArrayList(4);
-		List includes = null;
-		String script = null;
-		for (int i = 0; i < configs.length; i++) {
-			try {
-				script = configs[i].getAttribute(ILaunchConstants.ATTR_SCRIPT, ILaunchConstants.EMPTY_STRING);
-				if(elementpath.equals(script) || script.indexOf(elementpath) > -1) {
-					scoped.add(configs[i]);
-				}
-				else {
-					includes = configs[i].getAttribute(ILaunchConstants.ATTR_INCLUDE_PATH, (List)null);
-					if(includes != null && hasIncludeEntryFor(includes, elementpath)) {
-						scoped.add(configs[i]);
-					}
-				}
-			}
-			catch(CoreException ce) {
-				//ignore, just don't report the configuration
-			}
-		}
-		return (ILaunchConfiguration[]) scoped.toArray(new ILaunchConfiguration[scoped.size()]);
-	}
-	
-	/**
-	 * Returns <code>true</code> if the given set of include path entries contains an entry that matches
-	 * the given script path.
-	 * 
-	 * @param includes
-	 * @param elementpath
-	 * @return <code>true</code> if a matching include path entry is found
-	 */
-	public static boolean hasIncludeEntryFor(List includes, String elementpath) {
-		if(includes == null || elementpath == null) {
-			return false;
-		}
-		String entry = null;
-		String path = null;
-		for (int i = 0; i < includes.size(); i++) {
-			entry = (String) includes.get(i);
-			path = entry.substring(1);
-			if(elementpath.equals(path) || path.indexOf(elementpath) > -1) {
-				return true;
-			}
-		}
-		return false;
-	}
-	
-	/**
-	 * Returns the {@link IncludeEntry}'s for the given absolute script path or an empty array.
-	 * <br><br>
-	 * This method avoids creating {@link IncludeEntry} objects unless potential matches are found.
-	 * 
-	 * @param includes the current list of includes to search
-	 * @param elementpath the absolute path of the element to check for
-	 * @return the {@link IncludeEntry}'s of the given script in the include path listing or an empty array, never <code>null</code>
-	 */
-	public static final IncludeEntry[] findIncludeEntries(List includes, String elementpath) {
-		if(includes == null || elementpath == null) {
-			return NO_ENTRIES;
-		}
-		String entry = null;
-		String path = null;
-		ArrayList list = new ArrayList();
-		for (int i = 0; i < includes.size(); i++) {
-			entry = (String) includes.get(i);
-			path = entry.substring(1);
-			if(elementpath.equals(path) || path.indexOf(elementpath) > -1) {
-				try {
-					list.add(new IncludeEntry(Integer.parseInt(entry.substring(0, 1)), path));
-				}
-				catch(NumberFormatException nfe) {
-					//ignore but keep looking
-				}
-			}
-		}
-		return (IncludeEntry[]) list.toArray(new IncludeEntry[list.size()]);
-	}
-	
-	/**
-	 * Returns the complete include path from the given {@link ILaunchConfiguration} as a list of {@link IncludeEntry}s
-	 * in the order they are defined in the configuration.
-	 * 
-	 * @param configuration
-	 * @return the ordered listing of {@link IncludeEntry}s or an empty array, never <code>null</code>
-	 */
-	public static final IncludeEntry[] getIncludeEntries(ILaunchConfiguration configuration) {
-		try {
-			List includes = configuration.getAttribute(ILaunchConstants.ATTR_INCLUDE_PATH, (List)null);
-			if(includes != null) {
-				ArrayList entries = new ArrayList(includes.size());
-				String entry = null;
-				for (int i = 0; i < includes.size(); i++) {
-					entry = (String) includes.get(i);
-					try {
-						entries.add(new IncludeEntry(Integer.parseInt(entry.substring(0, 1)), entry.substring(1)));
-					}
-					catch(NumberFormatException nfe) {
-						//ignore, keep going
-					}
-				}
-				return (IncludeEntry[]) entries.toArray(new IncludeEntry[entries.size()]);
-			}
-		}
-		catch(CoreException ce) {
-			//do nothing return none
-		}
-		return NO_ENTRIES;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/RhinoChange.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/RhinoChange.java
deleted file mode 100644
index d97a07f..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/RhinoChange.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.ui.refactoring;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.jsdt.debug.internal.rhino.ui.ILaunchConstants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.ui.launching.IncludeEntry;
-
-/**
- * Abstract {@link Change} for Rhino configurations.
- * <br><br>
- * By default this change returns the backing {@link ILaunchConfiguration} from the {@link #getModifiedElement()}
- * method and considers the {@link Change} to be valid if the backing {@link ILaunchConfiguration} exists.
- * 
- * @since 1.0
- */
-public abstract class RhinoChange extends Change {
-
-	protected String oldname = null;
-	protected String newname = null;
-	protected ILaunchConfiguration configuration = null;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param configuration the backing {@link ILaunchConfiguration}
-	 * @param oldname the existing name of the element being refactored
-	 * @param newname the computed new name of the element being refactored
-	 */
-	public RhinoChange(ILaunchConfiguration configuration, String oldname, String newname) {
-		this.configuration = configuration;
-		this.oldname = oldname;
-		this.newname = newname;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ltk.core.refactoring.Change#getName()
-	 */
-	public String getName() {
-		return NLS.bind(Messages.update_attributes, new String[] {configuration.getName(), newname});
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ltk.core.refactoring.Change#initializeValidationData(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void initializeValidationData(IProgressMonitor pm) {
-		//do nothing
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ltk.core.refactoring.Change#isValid(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public RefactoringStatus isValid(IProgressMonitor pm) throws CoreException, OperationCanceledException {
-		if(!configuration.exists()) {
-			return RefactoringStatus.createErrorStatus(NLS.bind(Messages.config_no_longer_exists, configuration.getName()));
-		}
-		return new RefactoringStatus();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ltk.core.refactoring.Change#getModifiedElement()
-	 */
-	public Object getModifiedElement() {
-		return configuration;
-	}
-	
-	/**
-	 * Computes a new container name for the configuration or <code>null</code>
-	 * 
-	 * @param configuration
-	 * @return the new container name for the configuration or <code>null</code>
-	 */
-	protected String computeNewContainerName(ILaunchConfiguration configuration) {
-		IFile file = configuration.getFile();
-		if(file != null) {
-			return file.getParent().getProjectRelativePath().toString();
-		}
-		return null;
-	}
-	
-	/**
-	 * Computes a new name for the configuration or <code>null</code> if the name does not need updating
-	 * 
-	 * @param configuration
-	 * @return the new name for the configuration or <code>null</code>
-	 */
-	protected String computeNewConfigurationName(ILaunchConfiguration configuration) {
-		String name = configuration.getName();
-		IPath old = new Path(oldname);
-		String nametofind = (old.segmentCount() > 1 ? old.lastSegment() : oldname);
-		int idx = name.indexOf(nametofind);
-		if(idx > -1) {
-			IPath neww = new Path(newname);
-			String replacement = (neww.segmentCount() > 1 ? neww.lastSegment() : newname);
-			return name.replaceAll(nametofind, replacement);
-		}
-		return null;
-	}
-	
-	/**
-	 * Computes the new name for the script attribute or <code>null</code> if an update is not needed
-	 * 
-	 * @param configuration
-	 * @return the new name or <code>null</code>
-	 */
-	protected String computeNewScriptName(ILaunchConfiguration configuration) {
-		try {
-			String attr = configuration.getAttribute(ILaunchConstants.ATTR_SCRIPT, ILaunchConstants.EMPTY_STRING);
-			return computeNewName(attr);
-		}
-		catch(CoreException ce) {
-			//ignore
-		}
-		return null;
-	}
-	
-	/**
-	 * Updates any include entries with matching elements to the {@link #oldname}
-	 * 
-	 * @param copy
-	 * @throws CoreException
-	 */
-	protected void updateIncludeEntries(ILaunchConfigurationWorkingCopy copy) throws CoreException {
-		//update the include path
-		List includes = copy.getAttribute(ILaunchConstants.ATTR_INCLUDE_PATH, (List)null);
-		if(includes != null) {
-			IncludeEntry[] entries = Refactoring.findIncludeEntries(includes, oldname);
-			String sname = null;
-			for (int i = 0; i < entries.length; i++) {
-				sname = computeNewName(entries[i].getPath());
-				if(sname != null && !oldname.equals(sname)) {
-					int idx = includes.indexOf(entries[i].string());
-					if(idx > -1) {
-						includes.remove(idx);
-						includes.add(idx, new IncludeEntry(entries[i].getKind(), sname).string());
-					}
-				}
-			}
-			copy.setAttribute(ILaunchConstants.ATTR_INCLUDE_PATH, includes);
-		}
-	}
-	
-	/**
-	 * Computes a new element name using {@link #newname} iff: (1) the given name
-	 * has the {@link #oldname} as a prefix or (2) the old name appears in the given name.
-	 * <br><br>
-	 * The computed new name is not guaranteed to exist in any way.
-	 * 
-	 * @param name
-	 * @return the new name to use or <code>null</code>
-	 */
-	protected String computeNewName(String name) {
-		IPath path = new Path(name);
-		IPath old = new Path(oldname);
-		if(old.isPrefixOf(path)) {
-			path = path.removeFirstSegments(old.segmentCount());
-			path = new Path(newname).append(path);
-			return path.makeAbsolute().toString();
-		}
-		return path.toString().replaceAll(oldname, newname);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/ScriptChange.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/ScriptChange.java
deleted file mode 100644
index 8a4ebc4..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/ScriptChange.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.ui.refactoring;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.wst.jsdt.debug.internal.rhino.ui.ILaunchConstants;
-
-/**
- * Change for a script being renamed / moved
- * 
- * @since 1.0
- */
-public class ScriptChange extends RhinoChange {
-	
-	/**
-	 * Constructor
-	 */
-	public ScriptChange(ILaunchConfiguration configuration, String oldname, String newname) {
-		super(configuration, oldname, newname);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ltk.core.refactoring.Change#perform(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public Change perform(IProgressMonitor pm) throws CoreException {
-		ILaunchConfigurationWorkingCopy copy = configuration.getWorkingCopy();
-		//update the script only if matches
-		//this check is in case the configuration has include path-only updates
-		String oldscript = copy.getAttribute(ILaunchConstants.ATTR_SCRIPT, (String)null);
-		if(oldname.equals(oldscript)) {
-			copy.setAttribute(ILaunchConstants.ATTR_SCRIPT, newname);
-		}
-		//update include entries
-		updateIncludeEntries(copy);
-		//rename it
-		String value = computeNewConfigurationName(configuration);
-		if(value != null) {
-			copy.rename(value);
-		}
-		//update resource mappings
-		Refactoring.mapResources(copy);
-		if(copy.isDirty()) {
-			configuration = copy.doSave();
-			return new ScriptChange(configuration, newname, oldname);
-		}
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/ScriptMoveParticipant.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/ScriptMoveParticipant.java
deleted file mode 100644
index b3d3fa4..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/ScriptMoveParticipant.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.ui.refactoring;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
-import org.eclipse.ltk.core.refactoring.participants.MoveParticipant;
-
-/**
- * Refactoring participant to rename launch configurations when a project or script is moved
- * 
- * @since 1.0
- */
-public class ScriptMoveParticipant extends MoveParticipant {
-
-	private IFile script = null;
-	
-	/**
-	 * Constructor
-	 */
-	public ScriptMoveParticipant() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant#initialize(java.lang.Object)
-	 */
-	protected boolean initialize(Object element) {
-		script = (IFile) element;
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant#getName()
-	 */
-	public String getName() {
-		return Messages.rhino_lc_participant;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant#checkConditions(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext)
-	 */
-	public RefactoringStatus checkConditions(IProgressMonitor pm, CheckConditionsContext context) throws OperationCanceledException {
-		return new RefactoringStatus();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant#createChange(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException {
-		IContainer locale = (IContainer) getArguments().getDestination();
-		return Refactoring.createChangesForScriptRename(script, locale.getFullPath().append(script.getName()).makeAbsolute().toOSString());
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/ScriptRenameParticipant.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/ScriptRenameParticipant.java
deleted file mode 100644
index 02b9731..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/ScriptRenameParticipant.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.ui.refactoring;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.ltk.core.refactoring.Change;
-import org.eclipse.ltk.core.refactoring.RefactoringStatus;
-import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
-import org.eclipse.ltk.core.refactoring.participants.RenameParticipant;
-
-/**
- * Refactoring participant to rename projects or scripts in Rhino launch configurations
- * 
- * @since 1.0
- */
-public class ScriptRenameParticipant extends RenameParticipant {
-
-	private IFile script = null;
-	
-	/**
-	 * Constructor
-	 */
-	public ScriptRenameParticipant() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant#initialize(java.lang.Object)
-	 */
-	protected boolean initialize(Object element) {
-		script = (IFile) element;
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant#getName()
-	 */
-	public String getName() {
-		return Messages.rhino_lc_participant;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant#checkConditions(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext)
-	 */
-	public RefactoringStatus checkConditions(IProgressMonitor pm, CheckConditionsContext context) throws OperationCanceledException {
-		return new RefactoringStatus();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant#createChange(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException {
-		IPath name = script.getFullPath().makeAbsolute();
-		name = name.removeLastSegments(1).append(getArguments().getNewName());
-		return Refactoring.createChangesForScriptRename(script, name.toOSString());
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/messages.properties b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/messages.properties
deleted file mode 100644
index e98db42..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/refactoring/messages.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-###############################################################################
-# Copyright (c) 2010 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-config_no_longer_exists=Launch configuration {0} no longer exists
-multi_updates=Launch configuration updates
-rhino_lc_participant=Rhino launch configuration participant
-update_attributes=update attributes of configuration {0} to {1}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/source/RhinoSourceDirector.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/source/RhinoSourceDirector.java
deleted file mode 100644
index 4cca5a0..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/source/RhinoSourceDirector.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.ui.source;
-
-import org.eclipse.debug.core.sourcelookup.AbstractSourceLookupDirector;
-import org.eclipse.debug.core.sourcelookup.ISourceLookupParticipant;
-
-/**
- * Rhino specific source lookup director
- * 
- * @since 1.0
- */
-public class RhinoSourceDirector extends AbstractSourceLookupDirector {
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceLookupDirector#initializeParticipants()
-	 */
-	public void initializeParticipants() {
-		addParticipants(new ISourceLookupParticipant[] {new RhinoSourceLookupParticipant()});
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.AbstractSourceLookupDirector#isFindDuplicates()
-	 */
-	public boolean isFindDuplicates() {
-		return true;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/source/RhinoSourceLookupParticipant.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/source/RhinoSourceLookupParticipant.java
deleted file mode 100644
index 26b99ea..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/source/RhinoSourceLookupParticipant.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.ui.source;
-
-import java.net.URI;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.sourcelookup.AbstractSourceLookupParticipant;
-import org.eclipse.wst.jsdt.debug.internal.core.launching.SourceLookup;
-
-/**
- * Rhino specific source lookup participant
- * 
- * @since 1.0
- */
-public class RhinoSourceLookupParticipant extends AbstractSourceLookupParticipant {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceLookupParticipant#getSourceName(java.lang.Object)
-	 */
-	public String getSourceName(Object object) throws CoreException {
-		return SourceLookup.getSourceName(object);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.AbstractSourceLookupParticipant#findSourceElements(java.lang.Object)
-	 */
-	public Object[] findSourceElements(Object object) throws CoreException {
-		Object[] source = super.findSourceElements(object);
-		if(source.length < 1) {
-			URI uri = SourceLookup.getSourceURI(object);
-			if(uri != null) {
-				IFile file = SourceLookup.getExternalSource(uri, object);
-				if(file != null) {
-					return new Object[] {file};
-				}
-			} 
-		}
-		else {
-			return source;
-		}
-		return EMPTY;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.AbstractSourceLookupParticipant#isFindDuplicates()
-	 */
-	public boolean isFindDuplicates() {
-		return false;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/source/RhinoSourcePathComputer.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/source/RhinoSourcePathComputer.java
deleted file mode 100644
index 19dd470..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.ui/src/org/eclipse/wst/jsdt/debug/internal/rhino/ui/source/RhinoSourcePathComputer.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.ui.source;
-
-import java.io.File;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.sourcelookup.ISourceContainer;
-import org.eclipse.debug.core.sourcelookup.ISourcePathComputerDelegate;
-import org.eclipse.debug.core.sourcelookup.containers.DirectorySourceContainer;
-import org.eclipse.debug.core.sourcelookup.containers.FolderSourceContainer;
-import org.eclipse.wst.jsdt.debug.internal.rhino.ui.ILaunchConstants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.ui.launching.IncludeEntry;
-import org.eclipse.wst.jsdt.debug.internal.rhino.ui.refactoring.Refactoring;
-
-/**
- * Source computer delegate for Rhino
- * 
- * @since 1.0
- */
-public class RhinoSourcePathComputer implements ISourcePathComputerDelegate {
-
-	static final ISourceContainer[] NO_CONTAINERS = new ISourceContainer[0];
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.sourcelookup.ISourcePathComputerDelegate#computeSourceContainers(org.eclipse.debug.core.ILaunchConfiguration, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public ISourceContainer[] computeSourceContainers(ILaunchConfiguration configuration, IProgressMonitor monitor)	throws CoreException {
-		HashSet containers = new HashSet();
-		List includes = configuration.getAttribute(ILaunchConstants.ATTR_INCLUDE_PATH, (List)null); 
-		if(includes != null) {
-			String entry = null, name = null;
-			for (Iterator i = includes.iterator(); i.hasNext();) {
-				entry = (String) i.next();
-				int kind = Integer.parseInt(entry.substring(0, 1));
-				name = entry.substring(1);
-				switch(kind) {
-					case IncludeEntry.LOCAL_SCRIPT: {
-						IFile file = (IFile) ResourcesPlugin.getWorkspace().getRoot().findMember(name);
-						if(file != null) {
-							containers.add(new FolderSourceContainer(file.getParent(), false));
-						}
-						continue;
-					}
-					case IncludeEntry.EXT_SCRIPT: {
-						File file = new File(name);
-						if(file.exists()) {
-							containers.add(new DirectorySourceContainer(file.getParentFile(), false));
-						}
-						continue;
-					}
-				}
-			}
-		}
-		//make sure the folder containing the original script is included
-		IFile script = Refactoring.getScript(configuration);
-		if(script != null) {
-			containers.add(new FolderSourceContainer(script.getParent(), false));
-		}
-		return (ISourceContainer[]) containers.toArray(new ISourceContainer[containers.size()]);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/.classpath b/bundles/org.eclipse.wst.jsdt.debug.rhino/.classpath
deleted file mode 100644
index 2fbb7a2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/.project b/bundles/org.eclipse.wst.jsdt.debug.rhino/.project
deleted file mode 100644
index 742a9ed..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.jsdt.debug.rhino</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.wst.jsdt.debug.rhino/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index de9eac3..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,90 +0,0 @@
-#Fri Apr 30 10:04:28 CDT 2010
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
-org.eclipse.jdt.core.compiler.problem.deadCode=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=error
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=error
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=error
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=error
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.jsdt.debug.rhino/META-INF/MANIFEST.MF
deleted file mode 100644
index d2c3f7b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,28 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Bundle-Name
-Bundle-Vendor: %providerName
-Bundle-SymbolicName: org.eclipse.wst.jsdt.debug.rhino;singleton:=true
-Bundle-Version: 1.0.200.qualifier
-Bundle-Activator: org.eclipse.wst.jsdt.debug.internal.rhino.RhinoDebugPlugin
-Require-Bundle: org.eclipse.core.runtime;bundle-version="3.6.0"
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.wst.jsdt.debug.internal.rhino;x-friends:="org.eclipse.wst.jsdt.debug.rhino.ui",
- org.eclipse.wst.jsdt.debug.internal.rhino.breakpoints;x-friends:="org.eclipse.wst.jsdt.debug.rhino.ui",
- org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;x-friends:="org.eclipse.wst.jsdt.debug.rhino.ui",
- org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.connect;x-friends:="org.eclipse.wst.jsdt.debug.rhino.ui",
- org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event;x-friends:="org.eclipse.wst.jsdt.debug.rhino.ui",
- org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request;x-friends:="org.eclipse.wst.jsdt.debug.rhino.ui"
-Import-Package: org.eclipse.debug.core.model,
- org.eclipse.wst.jsdt.debug.core.breakpoints,
- org.eclipse.wst.jsdt.debug.core.jsdi,
- org.eclipse.wst.jsdt.debug.core.jsdi.connect,
- org.eclipse.wst.jsdt.debug.core.jsdi.event,
- org.eclipse.wst.jsdt.debug.core.jsdi.request,
- org.eclipse.wst.jsdt.debug.core.model,
- org.eclipse.wst.jsdt.debug.internal.rhino.transport,
- org.eclipse.wst.jsdt.debug.transport,
- org.eclipse.wst.jsdt.debug.transport.exception,
- org.eclipse.wst.jsdt.debug.transport.packet,
- org.eclipse.wst.jsdt.debug.transport.socket
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/OSGI-INF/l10n/bundle.properties b/bundles/org.eclipse.wst.jsdt.debug.rhino/OSGI-INF/l10n/bundle.properties
deleted file mode 100644
index c787bbd..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/OSGI-INF/l10n/bundle.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2010 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-providerName = Eclipse Web Tools Platform
-Bundle-Name = Rhino JavaScript Debug
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/about.html b/bundles/org.eclipse.wst.jsdt.debug.rhino/about.html
deleted file mode 100755
index b4a1c56..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>March 10, 2010</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
-indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/build.properties b/bundles/org.eclipse.wst.jsdt.debug.rhino/build.properties
deleted file mode 100644
index 599286f..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/build.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-###############################################################################
-# Copyright (c) 2010, 2011 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               about.html,\
-               OSGI-INF/l10n/bundle.properties,\
-               OSGI-INF/
-src.includes = about.html
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/plugin.xml b/bundles/org.eclipse.wst.jsdt.debug.rhino/plugin.xml
deleted file mode 100644
index 59d383e..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/plugin.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?><!--
-    Copyright (c) 2009 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-   
-    Contributors:
-        IBM Corporation - initial API and implementation
- -->
-
-<plugin>
-   <extension
-         point="org.eclipse.wst.jsdt.debug.core.launchingConnectors">
-      <connector
-            class="org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.connect.RhinoAttachingConnector"
-            id="rhino.attaching.connector">
-      </connector>
-   </extension>
-   <extension
-         point="org.eclipse.wst.jsdt.debug.core.breakpointParticipants">
-      <participant
-            class="org.eclipse.wst.jsdt.debug.internal.rhino.breakpoints.RhinoBreakpointParticipant"
-            kind="*">
-      </participant>
-   </extension>
-   <extension
-         point="org.eclipse.core.runtime.preferences">
-      <initializer
-            class="org.eclipse.wst.jsdt.debug.internal.rhino.RhinoPreferenceInitializer">
-      </initializer>
-   </extension>
-
-</plugin>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/Constants.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/Constants.java
deleted file mode 100644
index a12a140..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/Constants.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino;
-
-/**
- * Collection of constants used in Rhino
- * 
- * @since 1.0
- */
-public interface Constants {
-
-//############## GENERAL ####################
-	public static final String SPACE = " "; //$NON-NLS-1$
-	public static String URI_FILE_SCHEME = "file"; //$NON-NLS-1$
-	public static String STD_IN = "stdin"; //$NON-NLS-1$
-	public static String STD_IN_URI = "<stdin>"; //$NON-NLS-1$
-	
-//############## PREFERENCES ################
-	public static String SUSPEND_ON_STDIN_LOAD = RhinoDebugPlugin.PLUGIN_ID + ".suspend_on_stdin_load"; //$NON-NLS-1$
-	
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/RhinoDebugPlugin.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/RhinoDebugPlugin.java
deleted file mode 100644
index 64b62af..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/RhinoDebugPlugin.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.core.runtime.Status;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- * 
- * @since 1.0
- */
-public class RhinoDebugPlugin extends Plugin {
-
-	/**
-	 * Status code indicating an unexpected internal error.
-	 */
-	public static final int INTERNAL_ERROR = 120;
-	/**
-	 * The ID of the bundle<br>
-	 * <br>
-	 * value is: <code>org.eclipse.wst.jsdt.debug.core</code>
-	 */
-	public static final String PLUGIN_ID = "org.eclipse.wst.jsdt.debug.rhino"; //$NON-NLS-1$
-
-	/**
-	 * The singleton instance
-	 */
-	private static RhinoDebugPlugin plugin;
-	
-	/**
-	 * The constructor
-	 */
-	public RhinoDebugPlugin() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		plugin = this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance
-	 *
-	 * @return the shared instance
-	 */
-	public static RhinoDebugPlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Logs the specified status with this plug-in's log.
-	 * 
-	 * @param status status to log
-	 */
-	public static void log(IStatus status) {
-		if (plugin != null) {
-			plugin.getLog().log(status);
-		}
-	}
-
-	/**
-	 * Logs the specified throwable with this plug-in's log.
-	 * 
-	 * @param t throwable to log 
-	 */
-	public static void log(Throwable t) {
-		log(newErrorStatus("Error logged from Rhino Debug: ", t)); //$NON-NLS-1$
-	}
-	
-	/**
-	 * Logs an internal error with the specified message.
-	 * 
-	 * @param message the error message to log
-	 */
-	public static void logErrorMessage(String message) {
-		log(newErrorStatus("Internal message logged from Rhino Debug: " + message, null)); //$NON-NLS-1$	
-	}
-	
-	/**
-	 * Returns a new error status for this plug-in with the given message
-	 * @param message the message to be included in the status
-	 * @param exception the exception to be included in the status or <code>null</code> if none
-	 * @return a new error status
-	 */
-	public static IStatus newErrorStatus(String message, Throwable exception) {
-		return new Status(IStatus.ERROR, PLUGIN_ID, INTERNAL_ERROR, message, exception);
-	}
-	
-	/**
-	 * Creates a new {@link URI} with the <code>file</code> scheme
-	 * @param path
-	 * @return a new {@link URI}
-	 * @throws URISyntaxException
-	 */
-	public static URI fileURI(IPath path) throws URISyntaxException {
-		return new URI(Constants.URI_FILE_SCHEME, null, path.makeAbsolute().toString(), null);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/RhinoPreferenceInitializer.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/RhinoPreferenceInitializer.java
deleted file mode 100644
index 36992a7..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/RhinoPreferenceInitializer.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino;
-
-import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
-import org.eclipse.core.runtime.preferences.DefaultScope;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.osgi.service.prefs.BackingStoreException;
-
-/**
- * Initializes the preferences for Rhino
- * 
- * @since 1.0
- */
-public class RhinoPreferenceInitializer extends AbstractPreferenceInitializer {
-
-	/**
-	 * Constructor
-	 */
-	public RhinoPreferenceInitializer() {}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
-	 */
-	public void initializeDefaultPreferences() {
-		IEclipsePreferences defaultscope = DefaultScope.INSTANCE.getNode(RhinoDebugPlugin.PLUGIN_ID);
-		defaultscope.putBoolean(Constants.SUSPEND_ON_STDIN_LOAD, false);
-		try {
-			defaultscope.flush();
-		} catch (BackingStoreException e) {
-			RhinoDebugPlugin.log(e);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/RhinoPreferencesManager.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/RhinoPreferencesManager.java
deleted file mode 100644
index e79b9b2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/RhinoPreferencesManager.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-
-/**
- * Handles all of the core Rhino preferences - allows easy access to a variety of preferences
- * and tracks changes to those preferences.
- * 
- * @since 1.0
- */
-public class RhinoPreferencesManager implements IPreferenceChangeListener {
-
-	/**
-	 * Starts the manager
-	 */
-	public void start() {
-		IEclipsePreferences node = InstanceScope.INSTANCE.getNode(RhinoDebugPlugin.PLUGIN_ID);
-		if(node != null) {
-			node.addPreferenceChangeListener(this);
-		}
-		else {
-			//our preference node is bogus report the status
-			RhinoDebugPlugin.logErrorMessage("The Rhino core preference node could not loaded"); //$NON-NLS-1$
-		}
-	}
-	
-	/**
-	 * Stops the manager and frees any resources held
-	 */
-	public void stop() {
-		IEclipsePreferences node = InstanceScope.INSTANCE.getNode(RhinoDebugPlugin.PLUGIN_ID);
-		if(node != null) {
-			node.removePreferenceChangeListener(this);
-		}
-		else {
-			//our preference node is bogus report the status
-			RhinoDebugPlugin.logErrorMessage("The Rhino core preference node could not loaded"); //$NON-NLS-1$
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener#preferenceChange(org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent)
-	 */
-	public void preferenceChange(PreferenceChangeEvent event) {
-	}
-
-	/**
-	 * Returns if we should be suspending on script load events from stdin - i.e. from the Rhino console.
-	 * 
-	 * @return <code>true</code> if we should suspend on a script load for stdin, <code>false</code> otherwise
-	 */
-	public static boolean suspendOnStdinLoad() {
-		return Platform.getPreferencesService().getBoolean(RhinoDebugPlugin.PLUGIN_ID, Constants.SUSPEND_ON_STDIN_LOAD, false, null);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/breakpoints/RhinoBreakpointParticipant.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/breakpoints/RhinoBreakpointParticipant.java
deleted file mode 100644
index f11f18a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/breakpoints/RhinoBreakpointParticipant.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.breakpoints;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.URIUtil;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpointParticipant;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.jsdi.BooleanValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptPrimitiveValue;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptValue;
-import org.eclipse.wst.jsdt.debug.internal.rhino.Constants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.RhinoPreferencesManager;
-
-/**
- * Participant for Rhino
- * 
- * @since 1.0
- */
-public class RhinoBreakpointParticipant implements IJavaScriptBreakpointParticipant {
-
-	/**
-	 * Constructor
-	 */
-	public RhinoBreakpointParticipant() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpointParticipant#breakpointHit(org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread, org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint)
-	 */
-	public int breakpointHit(IJavaScriptThread thread, IJavaScriptBreakpoint breakpoint) {
-		try {
-			if(breakpoint instanceof IJavaScriptLineBreakpoint) {
-				IJavaScriptLineBreakpoint lbp = (IJavaScriptLineBreakpoint) breakpoint;
-				String condition = lbp.getCondition();
-				if (condition != null) {
-					// evaluate it
-					if (thread.getFrameCount() < 1) {
-						return DONT_SUSPEND;
-					}
-					IJavaScriptValue value = thread.evaluate(condition);
-					if (lbp.isConditionSuspendOnTrue()) {
-						if(suspendForValue(value)) {
-							return SUSPEND;
-						}
-					} 
-					if(!suspendForValue(value)) {
-						return SUSPEND; 
-					}
-				}
-				return SUSPEND;
-			}
-		} 
-		catch (CoreException ce) {
-			//ignore, just don't suspend
-		}
-		return DONT_SUSPEND;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpointParticipant#scriptLoaded(org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread, org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference, org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint)
-	 */
-	public int scriptLoaded(IJavaScriptThread thread, ScriptReference script, IJavaScriptBreakpoint breakpoint) {
-		String seg = URIUtil.lastSegment(script.sourceURI());
-		if(seg != null && seg.equals(Constants.STD_IN) && !RhinoPreferencesManager.suspendOnStdinLoad()) {
-			return DONT_SUSPEND;
-		}
-		return SUSPEND;
-	}
-	
-	/**
-	 * If the thread should suspend based on the given {@link Value}. Currently only suspend when the value is non-null and a {@link BooleanValue} that has the value <code>true</code>
-	 * 
-	 * @param value
-	 * @return if we should suspend
-	 */
-	private boolean suspendForValue(IJavaScriptValue value) {
-		if(value instanceof IJavaScriptPrimitiveValue) {
-			return ((IJavaScriptPrimitiveValue)value).booleanValue();
-		}
-		return false;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ArrayReferenceImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ArrayReferenceImpl.java
deleted file mode 100644
index 061e2fd..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ArrayReferenceImpl.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ArrayReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Property;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-
-/**
- * Rhino implementation of {@link ArrayReference}
- * 
- * @see ArrayReference
- * @see ObjectReferenceImpl
- * @since 1.0
- */
-public class ArrayReferenceImpl extends ObjectReferenceImpl implements ArrayReference {
-
-	/**
-	 * Empty array
-	 */
-	protected static final Value[] NO_VALUES = new Value[0];
-
-	/**
-	 * Raw list of {@link Value}s
-	 */
-	private ArrayList values = null;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param stackFrameImpl
-	 * @param body
-	 */
-	public ArrayReferenceImpl(VirtualMachineImpl vm, Map body, StackFrameImpl stackFrameImpl) {
-		super(vm, body, stackFrameImpl);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ArrayReference#getValue(int)
-	 */
-	public Value getValue(int index) throws IndexOutOfBoundsException {
-		Value value = (Value) getValues().get(index);
-		if (value == null) {
-			return vm.mirrorOfNull();
-		}
-		return value;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ArrayReference#getValues()
-	 */
-	public synchronized List getValues() {
-		if (values == null) {
-			Map members = new HashMap();
-			int length = 0;
-			for (Iterator iter = properties().iterator(); iter.hasNext();) {
-				Property property = (Property) iter.next();
-				if (Character.isDigit(property.name().charAt(0))) {
-					members.put(Integer.valueOf(property.name()), property.value());
-				} else if (property.name().equals("length")) { //$NON-NLS-1$
-					length = Integer.parseInt(property.value().valueString());
-				}
-			}
-			values = new ArrayList(length);
-			for (int i = 0; i < length; i++) {
-				Object value = members.get(new Integer(i));
-				if (value == null) {
-					value = new UndefinedValueImpl(vm);
-				}
-				values.add(value);
-			}
-		}
-		return values;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ArrayReference#length()
-	 */
-	public int length() {
-		return getValues().size();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.ObjectReferenceImpl#
-	 * valueString()
-	 */
-	public String valueString() {
-		return "Array"; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.ObjectReferenceImpl#toString
-	 * ()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append(NLS.bind(Messages.ArrayReferenceImpl_array_count_, new String[] {Integer.toString(length()) }));
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/BooleanValueImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/BooleanValueImpl.java
deleted file mode 100644
index 2481c59..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/BooleanValueImpl.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.BooleanValue;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-
-/**
- * Rhino implementation of {@link BooleanValue}
- * 
- * @since 1.0
- */
-public class BooleanValueImpl extends MirrorImpl implements BooleanValue {
-
-	private Boolean value;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param body
-	 */
-	public BooleanValueImpl(VirtualMachineImpl vm, Map body) {
-		this(vm, (Boolean) body.get(JSONConstants.VALUE));
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param bool
-	 */
-	public BooleanValueImpl(VirtualMachineImpl vm, Boolean bool) {
-		super(vm);
-		this.value = bool;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return value.toString();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#intValue()
-	 */
-	public int intValue() {
-		return (value.booleanValue() ? 1 : 0);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#doubleValue()
-	 */
-	public double doubleValue() {
-		return intValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#booleanValue()
-	 */
-	public boolean booleanValue() {
-		return value.booleanValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#stringValue()
-	 */
-	public String stringValue() {
-		return value.toString();
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return stringValue();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/FunctionReferenceImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/FunctionReferenceImpl.java
deleted file mode 100644
index 16817ac..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/FunctionReferenceImpl.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.FunctionReference;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-
-/**
- * Rhino implementation of {@link FunctionReference}
- * 
- * @see FunctionReference
- * @see ObjectReferenceImpl
- * @since 1.0
- */
-public class FunctionReferenceImpl extends ObjectReferenceImpl implements FunctionReference {
-
-	private String functionName;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param body
-	 * @param stackFrameImpl
-	 */
-	public FunctionReferenceImpl(VirtualMachineImpl vm, Map body, StackFrameImpl stackFrameImpl) {
-		super(vm, body, stackFrameImpl);
-		this.functionName = (String) body.get(JSONConstants.NAME);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.FunctionReference#functionName()
-	 */
-	public String functionName() {
-		return functionName;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.ObjectReferenceImpl#valueString()
-	 */
-	public String valueString() {
-		return "Function"; //$NON-NLS-1$
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.FunctionReference#functionBody()
-	 */
-	public String functionBody() {
-		return null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.ObjectReferenceImpl#toString()
-	 */
-	public String toString() {
-		return valueString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/LocationImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/LocationImpl.java
deleted file mode 100644
index 22be41c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/LocationImpl.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.util.Comparator;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-
-/**
- * Rhino implementation of {@link Location}
- * 
- * @since 1.0
- */
-public class LocationImpl extends MirrorImpl implements Location {
-	
-	/**
-	 * Comparator that orders {@link Location}s by line number - useful for debugging
-	 */
-	static class LocationComparator implements Comparator {
-		/* (non-Javadoc)
-		 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
-		 */
-		public int compare(Object o1, Object o2) {
-			int value = -1;
-			if(o1 instanceof Location && o2 instanceof Location) {
-				int first = ((Location)o1).lineNumber();
-				int second = ((Location)o2).lineNumber(); 
-				if(first == second) {
-					value = 0;
-				}
-				else if(first > second) {
-					value = 1;
-				}
-			}
-			return value;
-		}
-		
-	}
-	private static LocationComparator comparator = new LocationComparator();
-	private String functionName;
-	private int lineNumber;
-	private ScriptReferenceImpl scriptReference;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param functionName
-	 * @param lineNumber
-	 * @param scriptReference
-	 */
-	public LocationImpl(VirtualMachineImpl vm, String functionName, int lineNumber, ScriptReferenceImpl scriptReference) {
-		super(vm);
-		this.functionName = functionName;
-		this.lineNumber = lineNumber;
-		this.scriptReference = scriptReference;
-	}
-
-	static LocationComparator getLocationComparator() {
-		return comparator;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Location#functionName()
-	 */
-	public String functionName() {
-		return functionName;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Location#lineNumber()
-	 */
-	public int lineNumber() {
-		return lineNumber;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Location#scriptReference()
-	 */
-	public ScriptReference scriptReference() {
-		return scriptReference;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("LocationImpl: "); //$NON-NLS-1$
-		buffer.append("[script - ").append(scriptReference.sourceURI()).append("] "); //$NON-NLS-1$ //$NON-NLS-2$
-		buffer.append("[function - ").append(functionName).append("] "); //$NON-NLS-1$ //$NON-NLS-2$
-		buffer.append("[line - ").append(lineNumber).append("]"); //$NON-NLS-1$ //$NON-NLS-2$
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/Messages.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/Messages.java
deleted file mode 100644
index ff82d7c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/Messages.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.messages"; //$NON-NLS-1$
-	public static String ArrayReferenceImpl_array_count_;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/MirrorImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/MirrorImpl.java
deleted file mode 100644
index 1d15e66..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/MirrorImpl.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Mirror;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Rhino implementation of {@link Mirror}
- * 
- * @since 1.0
- */
-public class MirrorImpl implements Mirror {
-
-	protected final VirtualMachineImpl vm;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param description
-	 */
-	public MirrorImpl(VirtualMachineImpl vm) {
-		this.vm = vm;
-	}
-
-	/**
-	 * This constructor is only to be used by {@link VirtualMachineImpl}. The name 
-	 * field is not store anywhere or used in any way.
-	 * 
-	 * @param name
-	 * @noreference This constructor is not intended to be referenced by clients.
-	 */
-	public MirrorImpl(String name) {
-		vm = (VirtualMachineImpl)this;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Mirror#virtualMachine()
-	 */
-	public VirtualMachine virtualMachine() {
-		return this.vm;
-	}
-	
-	/**
-	 * Re-throws the given exception as a {@link RuntimeException} with the given message
-	 * @param message
-	 * @param t
-	 * @since 1.1
-	 */
-	protected void handleException(String message, Throwable t) {
-		throw new RuntimeException(message, t);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/NullValueImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/NullValueImpl.java
deleted file mode 100644
index be4da9c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/NullValueImpl.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.NullValue;
-
-/**
- * Rhino implementation of {@link NullValue}
- * 
- * @since 1.0
- */
-public final class NullValueImpl extends MirrorImpl implements NullValue {
-
-	static final String NULL_VALUE = "Null"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param description
-	 */
-	public NullValueImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return NULL_VALUE;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return valueString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/NumberValueImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/NumberValueImpl.java
deleted file mode 100644
index 6bb6842..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/NumberValueImpl.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue;
-import org.eclipse.wst.jsdt.debug.core.model.JavaScriptDebugModel;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-
-/**
- * Rhino implementation of {@link NumberValue}
- * 
- * @since 1.0
- */
-public class NumberValueImpl extends MirrorImpl implements NumberValue {
-
-	/**
-	 * The underlying value
-	 */
-	private Number value;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param body
-	 */
-	public NumberValueImpl(VirtualMachineImpl vm, Map body) {
-		this(vm, (Number) body.get(JSONConstants.VALUE));
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param number
-	 */
-	public NumberValueImpl(VirtualMachineImpl vm, Number number) {
-		super(vm);
-		this.value = number;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue#value()
-	 */
-	public Number value() {
-		return value;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue#isNaN()
-	 */
-	public boolean isNaN() {
-		return value == null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return JavaScriptDebugModel.numberToString(value);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#intValue()
-	 */
-	public int intValue() {
-		return value.intValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#doubleValue()
-	 */
-	public double doubleValue() {
-		return value.doubleValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#booleanValue()
-	 */
-	public boolean booleanValue() {
-		return (value.intValue() > 0 ? true : false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#stringValue()
-	 */
-	public String stringValue() {
-		return JavaScriptDebugModel.numberToString(value);
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return stringValue();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ObjectReferenceImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ObjectReferenceImpl.java
deleted file mode 100644
index d1f49ef..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ObjectReferenceImpl.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Property;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-
-/**
- * Rhino implementation of {@link ObjectReference}
- * 
- * @see MirrorImpl
- * @see ObjectReference
- * @see Property
- * @since 1.0
- */
-public class ObjectReferenceImpl extends MirrorImpl implements ObjectReference {
-
-	protected static final ArrayList NO_PROPERTIES = new ArrayList(0);
-
-	/**
-	 * The name of the class backing this object
-	 */
-	private final String className;
-	/**
-	 * The reference id to the constructor for this object
-	 */
-	private final Number constructorRef;
-	/**
-	 * The reference id to the prototype for this object
-	 */
-	private final Number prototypeRef;
-	/**
-	 * The reference id for this object
-	 */
-	private final Number id;
-	/**
-	 * The stackframe context for this object
-	 */
-	protected StackFrameImpl frame;
-	/**
-	 * The JSDI handle to the constructor for this object - lazily computed in {@link #constructor()}
-	 */
-	private Value constructor = null;
-	/**
-	 * The JSDI handle to the prototype for this object - lazily computed in {@link #prototype()}
-	 */
-	private Value prototype = null;
-	/**
-	 * The backing list of {@link PropertyReference}s for this object
-	 */
-	private List properties = null;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param body
-	 * @param frame
-	 */
-	public ObjectReferenceImpl(VirtualMachineImpl vm, Map body, StackFrameImpl frame) {
-		super(vm);
-		this.frame = frame;
-		this.className = (String) body.get(JSONConstants.CLASS_NAME);
-		this.id = (Number) body.get(JSONConstants.REF);
-		this.constructorRef = (Number) body.get(JSONConstants.CONSTRUCTOR_FUNCTION);
-		this.prototypeRef = (Number) body.get(JSONConstants.PROTOTYPE_OBJECT);
-		List proplist = (List) body.get(JSONConstants.PROPERTIES);
-		if (proplist != null) {
-			this.properties = new ArrayList(proplist.size());
-			Map props = null;
-			for (Iterator iter = proplist.iterator(); iter.hasNext();) {
-				props = (Map) iter.next();
-				this.properties.add(new PropertyImpl(vm, frame, props.get(JSONConstants.NAME).toString(), (Number) props.get(JSONConstants.REF)));
-			}
-		} else {
-			this.properties = NO_PROPERTIES;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#className()
-	 */
-	public String className() {
-		return this.className;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#constructor()
-	 */
-	public Value constructor() {
-		synchronized (this.frame) {
-			if (this.constructor == null) {
-				this.constructor = this.frame.lookupValue(constructorRef);
-				if (this.constructor == null) {
-					this.constructor = this.vm.mirrorOfNull();
-				}
-			}
-		}
-		return this.constructor;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#prototype()
-	 */
-	public Value prototype() {
-		synchronized (this.frame) {
-			if (this.prototype == null) {
-				this.prototype = this.frame.lookupValue(prototypeRef);
-				if (this.prototype == null) {
-					this.prototype = this.vm.mirrorOfNull();
-				}
-			}
-		}
-		return this.prototype;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#properties()
-	 */
-	public List properties() {
-		return this.properties;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("Object Reference\n"); //$NON-NLS-1$
-		return buffer.toString();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return "Object"; //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#id()
-	 */
-	public Number id() {
-		return this.id;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/PropertyImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/PropertyImpl.java
deleted file mode 100644
index 3b63bbc..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/PropertyImpl.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Property;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-
-/**
- * Rhino implementation of {@link Property}
- * 
- * @see MirrorImpl
- * @see Property
- * @see Value
- * @since 1.0
- */
-public class PropertyImpl extends MirrorImpl implements Property {
-
-	/**
-	 * The name of the property
-	 */
-	private String name;
-	/**
-	 * The reference used to look up the property value in the stackframe
-	 * context
-	 */
-	private Number ref;
-	private StackFrameImpl frame;
-	private Value value;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param name
-	 * @param ref
-	 */
-	public PropertyImpl(VirtualMachineImpl vm, StackFrameImpl frame,
-			String name, Number ref) {
-		super(vm);
-		this.frame = frame;
-		this.name = name;
-		this.ref = ref;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Property#name()
-	 */
-	public String name() {
-		return name;
-	}
-
-	/**
-	 * The reference id of this property
-	 * 
-	 * @return the reference id of this property
-	 */
-	public Number getRef() {
-		return ref;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StringValue#value()
-	 */
-	public Value value() {
-		synchronized (this.frame) {
-			if (this.value == null) {
-				this.value = frame.lookupValue(ref);
-			}
-		}
-		return this.value;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ScriptReferenceImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ScriptReferenceImpl.java
deleted file mode 100644
index 286c435..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ScriptReferenceImpl.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.URIUtil;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.internal.rhino.RhinoDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.osgi.framework.Constants;
-
-/**
- * Rhino implementation of {@link ScriptReference}
- * 
- * @see MirrorImpl
- * @see ScriptReference
- * @since 1.0
- */
-public class ScriptReferenceImpl extends MirrorImpl implements ScriptReference {
-
-	/**
-	 * The id of the script - this can be used to look it up in the {@link VirtualMachineImpl}
-	 */
-	private final Long scriptId;
-	private String sourcePath = null;
-	private URI sourceuri = null;
-	private final String source;
-	private final Boolean generated;
-	private final List lineLocations = new ArrayList();
-	private final List functionLocations = new ArrayList();
-	private Map sourceProperties = null;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param jsonScript
-	 */
-	public ScriptReferenceImpl(VirtualMachineImpl vm, Map jsonScript) {
-		super(vm);
-		this.scriptId = new Long(((Number) jsonScript.get(JSONConstants.SCRIPT_ID)).longValue());
-		this.sourcePath = (String) jsonScript.get(JSONConstants.LOCATION);
-		this.sourceProperties = (Map) jsonScript.get(JSONConstants.PROPERTIES);
-		this.source = (String) jsonScript.get(JSONConstants.SOURCE);
-		this.generated = (Boolean) jsonScript.get(JSONConstants.GENERATED);
-		List lines = (List) jsonScript.get(JSONConstants.LINES);
-		for (Iterator iterator = lines.iterator(); iterator.hasNext();) {
-			Number lineNumber = (Number) iterator.next();
-			Location location = new LocationImpl(vm, null, lineNumber.intValue(), this);
-			lineLocations.add(location);
-		}
-		List functions = (List) jsonScript.get(JSONConstants.FUNCTIONS);
-		for (Iterator iterator = functions.iterator(); iterator.hasNext();) {
-			String functionName = (String) iterator.next();
-			Location location = new LocationImpl(vm, functionName, 0, this);
-			functionLocations.add(location);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#allFunctionLocations()
-	 */
-	public List allFunctionLocations() {
-		return Collections.unmodifiableList(functionLocations);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#allLineLocations()
-	 */
-	public List allLineLocations() {
-		return Collections.unmodifiableList(lineLocations);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#functionLocation(java.lang.String)
-	 */
-	public Location functionLocation(String functionName) {
-		for (Iterator iterator = functionLocations.iterator(); iterator.hasNext();) {
-			Location location = (Location) iterator.next();
-			if (location.functionName().equals(functionName))
-				return location;
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#lineLocation(int)
-	 */
-	public Location lineLocation(int lineNumber) {
-		for (Iterator iterator = lineLocations.iterator(); iterator.hasNext();) {
-			Location location = (Location) iterator.next();
-			if (location.lineNumber() == lineNumber)
-				return location;
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#source()
-	 */
-	public String source() {
-		return source;
-	}
-
-	/**
-	 * @return the id of the {@link ScriptReference}
-	 */
-	public Long getScriptId() {
-		return scriptId;
-	}
-
-	
-	/**
-	 * Return if the script is generated or not
-	 * @return <code>true</code> if the script was generated <code>false</code> otherwise
-	 */
-	public boolean isGenerated() {
-		return generated.booleanValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#sourceURI()
-	 */
-	public synchronized URI sourceURI() {
-		if (this.sourceuri == null) {
-			try {
-				if (this.sourceProperties != null) {
-					IPath path = new Path((String) this.sourceProperties.get(Constants.BUNDLE_SYMBOLICNAME));
-					path = path.append((String) this.sourceProperties.get(JSONConstants.PATH));
-					path = path.append((String) this.sourceProperties.get(JSONConstants.NAME));
-					this.sourceuri = URIUtil.fromString(path.toString());
-				} else if (this.sourcePath != null) {
-					try {
-						this.sourceuri = new URI(this.sourcePath);
-					}
-					catch(URISyntaxException use) {
-						this.sourceuri = URIUtil.fromString(sourcePath);
-					}
-				} else {
-					this.sourceuri = RhinoDebugPlugin.fileURI(new Path("script")); //$NON-NLS-1$
-				}
-			} catch (URISyntaxException urise) {
-				RhinoDebugPlugin.log(urise);
-			}
-		}
-		return this.sourceuri;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("ScriptReferenceImpl: "); //$NON-NLS-1$
-		buffer.append("[sourceuri - ").append(sourceURI()).append("]\n"); //$NON-NLS-1$ //$NON-NLS-2$
-		buffer.append("Line locations: \n"); //$NON-NLS-1$
-		List list = new ArrayList(allLineLocations());
-		Collections.sort(list, LocationImpl.getLocationComparator());
-		for (Iterator iter = list.iterator(); iter.hasNext();) {
-			Location loc = (Location) iter.next();
-			buffer.append("\t").append(loc.toString()).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		buffer.append("Function locations: \n"); //$NON-NLS-1$
-		list = new ArrayList(allFunctionLocations());
-		Collections.sort(list, LocationImpl.getLocationComparator());
-		for (Iterator iter = list.iterator(); iter.hasNext();) {
-			Location loc = (Location) iter.next();
-			buffer.append("\t").append(loc.toString()).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		buffer.append("\n"); //$NON-NLS-1$
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/StackFrameImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/StackFrameImpl.java
deleted file mode 100644
index 3144064..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/StackFrameImpl.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Variable;
-import org.eclipse.wst.jsdt.debug.internal.rhino.RhinoDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoResponse;
-import org.eclipse.wst.jsdt.debug.transport.exception.DisconnectedException;
-import org.eclipse.wst.jsdt.debug.transport.exception.TimeoutException;
-
-/**
- * Rhino implementation of {@link StackFrame}
- * 
- * @see MirrorImpl
- * @see StackFrame
- * @since 1.0
- */
-public class StackFrameImpl extends MirrorImpl implements StackFrame {
-
-	private final Number frameId;
-	private final Number threadId;
-	private final Number contextId;
-	private final Number ref;
-	private final Location location;
-	private List variables;
-	private VariableImpl thisVariable;
-	private HashMap cache = new HashMap();
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param jsonFrame
-	 */
-	public StackFrameImpl(VirtualMachineImpl vm, Map jsonFrame) {
-		super(vm);
-		this.threadId = (Number) jsonFrame.get(JSONConstants.THREAD_ID);
-		this.frameId = (Number) jsonFrame.get(JSONConstants.FRAME_ID);
-		this.contextId = (Number) jsonFrame.get(JSONConstants.CONTEXT_ID);
-		this.ref = (Number) jsonFrame.get(JSONConstants.REF);
-
-		Long scriptId = new Long(((Number) jsonFrame.get(JSONConstants.SCRIPT_ID)).longValue());
-		ScriptReferenceImpl script = vm.getScript(scriptId);
-
-		String function = (String) jsonFrame.get(JSONConstants.FUNCTION);
-		if (function != null) {
-			this.location = script.functionLocation(function);
-		} else {
-			Number line = (Number) jsonFrame.get(JSONConstants.LINE);
-			Location lineLocation = script.lineLocation(line.intValue());
-			this.location = lineLocation != null ? lineLocation : new LocationImpl(vm, function, line.intValue(), script);
-		}
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame#evaluate(java.lang.String)
-	 */
-	public Value evaluate(String expression) {
-		RhinoRequest request = new RhinoRequest(JSONConstants.EVALUATE);
-		request.getArguments().put(JSONConstants.THREAD_ID, threadId);
-		request.getArguments().put(JSONConstants.FRAME_ID, frameId);
-		request.getArguments().put(JSONConstants.EXPRESSION, expression);
-		try {
-			RhinoResponse response = vm.sendRequest(request, 30000);
-			return createValue(response.getBody(), true);
-		} catch (DisconnectedException e) {
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-		return null;
-	}
-
-	/**
-	 * Utility method to look up the {@link Value} with the given reference id <br>
-	 * or <code>null</code> if there is no {@link Value} with the given id
-	 * 
-	 * @param ref
-	 * @return the {@link Value} or <code>null</code>
-	 */
-	public Value lookupValue(Number ref) {
-		Value value = (Value) this.cache.get(ref);
-		if (value == null) {
-			RhinoRequest request = new RhinoRequest(JSONConstants.LOOKUP);
-			request.getArguments().put(JSONConstants.THREAD_ID, threadId);
-			request.getArguments().put(JSONConstants.FRAME_ID, frameId);
-			request.getArguments().put(JSONConstants.REF, ref);
-			try {
-				RhinoResponse response = vm.sendRequest(request, 30000);
-				value = createValue(response.getBody(), false);
-				this.cache.put(ref, value);
-				return value;
-			} catch (DisconnectedException e) {
-				handleException(e.getMessage(), e);
-			} catch (TimeoutException e) {
-				RhinoDebugPlugin.log(e);
-			}
-		}
-		return value;
-	}
-
-	/**
-	 * Creates a new type value for the given type description in the map
-	 * 
-	 * @param body
-	 * @param iseval
-	 * @return the new type
-	 * @throws IllegalStateException
-	 *             if the type description in the map is unknown
-	 */
-	private Value createValue(Map body, boolean iseval) throws IllegalStateException {
-		Map value = (Map) body.get((iseval ? JSONConstants.EVALUATE : JSONConstants.LOOKUP));
-		if(value == null) {
-			return vm.nullValue;
-		}
-		String type = (String) value.get(JSONConstants.TYPE);
-		if(type == null) {
-			return vm.nullValue;
-		}
-		// "undefined", "null", "boolean", "number", "string", "object",
-		// "function"
-
-		if (type.equals(JSONConstants.UNDEFINED)) {
-			return vm.undefinedValue;
-		} else if (type.equals(JSONConstants.NULL)) {
-			return vm.nullValue;
-		} else if (type.equals(JSONConstants.BOOLEAN)) {
-			return new BooleanValueImpl(vm, value);
-		} else if (type.equals(JSONConstants.NUMBER)) {
-			return new NumberValueImpl(vm, value);
-		} else if (type.equals(JSONConstants.STRING)) {
-			return new StringValueImpl(vm, value);
-		} else if (type.equals(JSONConstants.OBJECT)) {
-			return new ObjectReferenceImpl(vm, value, this);
-		} else if (type.equals(JSONConstants.FUNCTION)) {
-			return new FunctionReferenceImpl(vm, value, this);
-		} else if (type.equals(JSONConstants.ARRAY)) {
-			return new ArrayReferenceImpl(vm, value, this);
-		}
-		throw new IllegalStateException();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame#location()
-	 */
-	public Location location() {
-		return location;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame#thisObject()
-	 */
-	public synchronized Variable thisObject() {
-		initializeVariables();
-		return thisVariable;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame#variables()
-	 */
-	public synchronized List variables() {
-		initializeVariables();
-		if(variables == null) {
-			//return this to maintain the API contract, and to allow variable initialization happen again
-			return Collections.EMPTY_LIST;
-		}
-		return variables;
-	}
-
-	/**
-	 * Initializes and caches the live set of variables
-	 */
-	private void initializeVariables() {
-		if (variables != null) {
-			return;
-		}
-		RhinoRequest request = new RhinoRequest(JSONConstants.LOOKUP);
-		request.getArguments().put(JSONConstants.THREAD_ID, threadId);
-		request.getArguments().put(JSONConstants.FRAME_ID, frameId);
-		request.getArguments().put(JSONConstants.REF, ref);
-		try {
-			RhinoResponse response = vm.sendRequest(request, 30000);
-			if(response.isSuccess()) {
-				Map lookup = (Map) response.getBody().get(JSONConstants.LOOKUP);
-				List properties = (List) lookup.get(JSONConstants.PROPERTIES);
-				variables = new ArrayList();
-				for (Iterator iterator = properties.iterator(); iterator.hasNext();) {
-					Map property = (Map) iterator.next();
-					String name = (String) property.get(JSONConstants.NAME);
-					Number ref = (Number) property.get(JSONConstants.REF);
-					VariableImpl variable = new VariableImpl(vm, this, name, ref);
-					if (name.equals(JSONConstants.THIS))
-						thisVariable = variable;
-					else
-						variables.add(variable);
-				}
-			}
-		} catch (DisconnectedException e) {
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-	}
-
-	/**
-	 * Returns if this stack frame is visible
-	 * 
-	 * @param variable
-	 * @return true if this frame is visible, false otherwise
-	 */
-	public synchronized boolean isVisible(VariableImpl variable) {
-		return variables != null && (thisVariable == variable || variables.contains(variable));
-	}
-
-	/**
-	 * @return the context id for this frame
-	 */
-	public Number getContextId() {
-		return contextId;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/StringValueImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/StringValueImpl.java
deleted file mode 100644
index 3bf19c2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/StringValueImpl.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.StringValue;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-
-/**
- * Rhino implementation of {@link StringValue}
- * 
- * @since 1.0
- */
-public class StringValueImpl extends MirrorImpl implements StringValue {
-
-	private String value;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param value
-	 */
-	public StringValueImpl(VirtualMachineImpl vm, String value) {
-		super(vm);
-		this.value = value;
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param body
-	 */
-	public StringValueImpl(VirtualMachineImpl vm, Map body) {
-		this(vm, (String) body.get(JSONConstants.VALUE));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StringValue#value()
-	 */
-	public String value() {
-		return value;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return value;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ThreadReferenceImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ThreadReferenceImpl.java
deleted file mode 100644
index a7b717b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ThreadReferenceImpl.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.internal.rhino.RhinoDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoResponse;
-import org.eclipse.wst.jsdt.debug.transport.exception.DisconnectedException;
-import org.eclipse.wst.jsdt.debug.transport.exception.TimeoutException;
-
-/**
- * Rhino implementation of {@link ThreadReference}
- * 
- * @since 1.0
- */
-public class ThreadReferenceImpl extends MirrorImpl implements ThreadReference {
-
-	private Number threadId;
-	private List frames;
-	private int status = THREAD_STATUS_RUNNING;
-	private boolean suspended;
-	private boolean atBreakpoint = false;
-	private String name;
-	private String step;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param jsonThread
-	 */
-	public ThreadReferenceImpl(VirtualMachineImpl vm, Map jsonThread) {
-		super(vm);
-		this.threadId = (Number) jsonThread.get(JSONConstants.THREAD_ID);
-		this.name = (String) jsonThread.get(JSONConstants.NAME);
-		if (this.name == null) {
-			// TODO NLS this
-			this.name = "Rhino - " + threadId; //$NON-NLS-1$
-		}
-		this.suspended = JSONConstants.SUSPENDED.equals(jsonThread.get(JSONConstants.STATE));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#frameCount()
-	 */
-	public synchronized int frameCount() {
-		frames();
-		return (frames == null ? 0 : frames.size());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#frame(int)
-	 */
-	public synchronized StackFrame frame(int index) {
-		frames();
-		return (StackFrame) frames.get(index);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#frames()
-	 */
-	public synchronized List frames() {
-		if (!suspended || status == THREAD_STATUS_ZOMBIE) {
-			return Collections.EMPTY_LIST;
-		}
-		if (frames != null) {
-			return frames;
-		}
-		RhinoRequest request = new RhinoRequest(JSONConstants.FRAMES);
-		request.getArguments().put(JSONConstants.THREAD_ID, threadId);
-		try {
-			RhinoResponse response = vm.sendRequest(request, 30000);
-			List frameIds = (List) response.getBody().get(JSONConstants.FRAMES);
-			if (frameIds.isEmpty()) {
-				return Collections.EMPTY_LIST;
-			}
-			frames = new ArrayList();
-			for (Iterator iterator = frameIds.iterator(); iterator.hasNext();) {
-				Long frameId = new Long(((Number) iterator.next()).longValue());
-				StackFrameImpl frame = createStackFrame(frameId);
-				frames.add(frame);
-			}
-		} catch (DisconnectedException e) {
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-		if(frames != null) {
-			return frames;
-		}
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * Sends a request to make a new {@link StackFrameReference} in the current debugger.
-	 * Returns a new {@link StackFrameReference} on success, <code>null</code> on failure
-	 * 
-	 * @param frameId
-	 * @return a new {@link StackFrameReference} or <code>null</code>
-	 */
-	private StackFrameImpl createStackFrame(Long frameId) {
-		RhinoRequest request = new RhinoRequest(JSONConstants.FRAME);
-		request.getArguments().put(JSONConstants.THREAD_ID, threadId);
-		request.getArguments().put(JSONConstants.FRAME_ID, frameId);
-		try {
-			RhinoResponse response = vm.sendRequest(request);
-			Map jsonFrame = (Map) response.getBody().get(JSONConstants.FRAME);
-			return new StackFrameImpl(vm, jsonFrame);
-		} catch (DisconnectedException e) {
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#isAtBreakpoint()
-	 */
-	public synchronized boolean isAtBreakpoint() {
-		return suspended && atBreakpoint;
-	}
-
-	/**
-	 * Marks the current thread reference as suspended
-	 * 
-	 * @param atBreakpoint
-	 */
-	public synchronized void markSuspended(boolean atBreakpoint) {
-		this.suspended = true;
-		this.atBreakpoint = atBreakpoint;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#isSuspended()
-	 */
-	public synchronized boolean isSuspended() {
-		return suspended;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#name()
-	 */
-	public String name() {
-		return name;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#resume()
-	 */
-	public synchronized void resume() {
-		if (status == THREAD_STATUS_ZOMBIE) {
-			return;
-		}
-		RhinoRequest request = new RhinoRequest(JSONConstants.CONTINUE);
-		request.getArguments().put(JSONConstants.THREAD_ID, threadId);
-		if (step != null) {
-			request.getArguments().put(JSONConstants.STEP, step);
-		}
-		try {
-			RhinoResponse response = vm.sendRequest(request);
-			if (response.isSuccess()) {
-				step = null;
-				frames = null;
-				suspended = false;
-				atBreakpoint = false;
-			}
-		} catch (DisconnectedException e) {
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#suspend()
-	 */
-	public synchronized void suspend() {
-		if (status == THREAD_STATUS_ZOMBIE) {
-			return;
-		}
-		RhinoRequest request = new RhinoRequest(JSONConstants.SUSPEND);
-		request.getArguments().put(JSONConstants.THREAD_ID, threadId);
-		try {
-			RhinoResponse response = vm.sendRequest(request);
-			if(response.isSuccess()) {
-				markSuspended(false);
-			}
-		} catch (DisconnectedException e) {
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#interrupt()
-	 */
-	public void interrupt() {
-		throw new UnsupportedOperationException();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#status()
-	 */
-	public synchronized int status() {
-		return status;
-	}
-
-	/**
-	 * Returns the step type
-	 * 
-	 * @return the step type
-	 * @see JSONConstants#STEP_IN
-	 * @see JSONConstants#STEP_NEXT
-	 * @see JSONConstants#STEP_OUT
-	 */
-	public synchronized String getStep() {
-		return step;
-	}
-
-	/**
-	 * Sets the current step type
-	 * 
-	 * @param step
-	 * @see JSONConstants#STEP_IN
-	 * @see JSONConstants#STEP_NEXT
-	 * @see JSONConstants#STEP_OUT
-	 */
-	public synchronized void setStep(String step) {
-		this.step = step;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/UndefinedValueImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/UndefinedValueImpl.java
deleted file mode 100644
index 191ef70..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/UndefinedValueImpl.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.UndefinedValue;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-
-/**
- * Rhino implementation of {@link UndefinedValue}
- * 
- * @see MirrorImpl
- * @see UndefinedValue
- * @since 1.0
- */
-public class UndefinedValueImpl extends MirrorImpl implements UndefinedValue {
-
-	static final String UNDEFINED_VALUE = "Undefined"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 */
-	public UndefinedValueImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StringValue#value()
-	 */
-	public String value() {
-		return JSONConstants.UNDEFINED;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return UNDEFINED_VALUE;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return valueString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/VariableImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/VariableImpl.java
deleted file mode 100644
index 08fee0f..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/VariableImpl.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Variable;
-
-/**
- * Rhino implementation of a {@link Variable}
- * 
- * @since 1.0
- */
-public class VariableImpl extends PropertyImpl implements Variable {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param frame
-	 * @param name
-	 * @param ref
-	 */
-	public VariableImpl(VirtualMachineImpl vm, StackFrameImpl frame, String name, Number ref) {
-		super(vm, frame, name, ref);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Variable#isArgument()
-	 */
-	public boolean isArgument() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Variable#isVisible(org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame)
-	 */
-	public boolean isVisible(StackFrame frame) {
-		StackFrameImpl frameImpl = (StackFrameImpl) frame;
-		return frameImpl.isVisible(this);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/VirtualMachineImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/VirtualMachineImpl.java
deleted file mode 100644
index d9e316d..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/VirtualMachineImpl.java
+++ /dev/null
@@ -1,449 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.BooleanValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.NullValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.StringValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.UndefinedValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager;
-import org.eclipse.wst.jsdt.debug.internal.rhino.Constants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.RhinoDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event.EventQueueImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request.EventRequestManagerImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.EventPacket;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoResponse;
-import org.eclipse.wst.jsdt.debug.transport.DebugSession;
-import org.eclipse.wst.jsdt.debug.transport.exception.DisconnectedException;
-import org.eclipse.wst.jsdt.debug.transport.exception.TimeoutException;
-
-/**
- * Rhino implementation of {@link VirtualMachine}
- * 
- * @since 1.0
- */
-public class VirtualMachineImpl extends MirrorImpl implements VirtualMachine {
-
-	public final UndefinedValueImpl undefinedValue = new UndefinedValueImpl(this);
-	public final NullValueImpl nullValue = new NullValueImpl(this);
-
-	private final Map scripts = new HashMap();
-	private final DebugSession session;
-	private EventRequestManagerImpl eventRequestManager = new EventRequestManagerImpl(this);
-	private final EventQueue eventQueue = new EventQueueImpl(this, eventRequestManager);
-	private Map threads = new HashMap();
-	private boolean disconnected = false;
-	private String name = null;
-	private String version = null;
-	Object lock = new Object();
-
-	/**
-	 * Constructor
-	 * 
-	 * @param debugSession
-	 */
-	public VirtualMachineImpl(DebugSession debugSession) {
-		super(Constants.SPACE);
-		this.session = debugSession;
-		initalizeScripts();
-	}
-
-	/**
-	 * loads the scripts
-	 */
-	private void initalizeScripts() {
-		RhinoRequest request = new RhinoRequest(JSONConstants.SCRIPTS);
-		try {
-			RhinoResponse response = sendRequest(request);
-			List scriptIds = (List) response.getBody().get(JSONConstants.SCRIPTS);
-			for (Iterator iterator = scriptIds.iterator(); iterator.hasNext();) {
-				Long scriptId = new Long(((Number) iterator.next()).longValue());
-				ScriptReferenceImpl script = createScriptReference(scriptId);
-				if(script != null) {
-					scripts.put(scriptId, script);
-				}
-			}
-		} catch (DisconnectedException e) {
-			disconnectVM();
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-	}
-
-	/**
-	 * Called via reflection to determine if the vm supports suspend on script loads
-	 * @return <code>true</code> if this VM can suspend when a script loads <code>false</code> otherwise
-	 */
-	public boolean supportsSuspendOnScriptLoads() {
-		return true;
-	}
-	
-	/**
-	 * Creates a new {@link ScriptReferenceImpl} for the given ID
-	 * @param scriptId
-	 * @return the new {@link ScriptReferenceImpl} or <code>null</code>
-	 */
-	private ScriptReferenceImpl createScriptReference(Long scriptId) {
-		RhinoRequest request = new RhinoRequest(JSONConstants.SCRIPT);
-		request.getArguments().put(JSONConstants.SCRIPT_ID, scriptId);
-		try {
-			RhinoResponse response = sendRequest(request, DEFAULT_TIMEOUT);
-			Map jsonScript = (Map) response.getBody().get(JSONConstants.SCRIPT);
-			return new ScriptReferenceImpl(this, jsonScript);
-		} catch (DisconnectedException e) {
-			disconnectVM();
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#allScripts()
-	 */
-	public synchronized List allScripts() {
-		return new ArrayList(scripts.values());
-	}
-
-	/**
-	 * Adds a new script to the {@link VirtualMachine} with the given ID and returns
-	 * it.
-	 * @param scriptId
-	 * @param script
-	 */
-	public synchronized ScriptReferenceImpl addScript(Long scriptId) {
-		ScriptReferenceImpl script = createScriptReference(scriptId);
-		if (script != null) {
-			scripts.put(scriptId, script);
-		}
-		return script;
-	}
-
-	/**
-	 * Returns the {@link ScriptReferenceImpl} for the given ID or <code>null</code>
-	 * if no such {@link ScriptReferenceImpl} exists.
-	 * @param scriptId
-	 * @return the {@link ScriptReferenceImpl} for the given ID or <code>null</code>
-	 */
-	public synchronized ScriptReferenceImpl getScript(Long scriptId) {
-		return (ScriptReferenceImpl) scripts.get(scriptId);
-	}
-
-	/**
-	 * @param timeout
-	 * @return
-	 * @throws TimeoutException
-	 * @throws DisconnectedException
-	 */
-	public EventPacket receiveEvent(int timeout) throws TimeoutException, DisconnectedException {
-		return (EventPacket) session.receive(EventPacket.TYPE, timeout);
-	}
-
-	/**
-	 * Sends a request to the backing {@link DebugSession}
-	 * 
-	 * @param request
-	 * @param timeout
-	 * @return the {@link RhinoResponse} for the request
-	 * @throws TimeoutException
-	 * @throws DisconnectedException
-	 */
-	public RhinoResponse sendRequest(RhinoRequest request, int timeout) throws TimeoutException, DisconnectedException {
-		session.send(request);
-		return (RhinoResponse) session.receiveResponse(request.getSequence(), timeout);
-	}
-
-	/**
-	 * Sends the given {@link RhinoRequest} using the default timeout
-	 * @param request
-	 * @return the {@link RhinoResponse} from the request
-	 * @throws TimeoutException
-	 * @throws DisconnectedException
-	 */
-	public RhinoResponse sendRequest(RhinoRequest request) throws TimeoutException, DisconnectedException {
-		return sendRequest(request, DEFAULT_TIMEOUT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#allThreads()
-	 */
-	public synchronized List allThreads() {
-		RhinoRequest request = new RhinoRequest(JSONConstants.THREADS);
-		try {
-			RhinoResponse response = sendRequest(request);
-			List threadIds = (List) response.getBody().get(JSONConstants.THREADS);
-			HashMap allThreads = new HashMap(threadIds.size());
-			for (Iterator iterator = threadIds.iterator(); iterator.hasNext();) {
-				Long threadId = new Long(((Number) iterator.next()).longValue());
-				ThreadReferenceImpl thread = (ThreadReferenceImpl) threads.get(threadId);
-				if (thread == null) {
-					thread = createThreadReference(threadId);
-				}
-				if(thread != null) {
-					allThreads.put(threadId, thread);
-				}
-			}
-			threads = allThreads;
-		} catch (DisconnectedException e) {
-			disconnectVM();
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-		return new ArrayList(threads.values());
-	}
-
-	/**
-	 * Removes the thread with the given ID
-	 * @param threadId
-	 * @return the {@link ThreadReferenceImpl} that has been removed
-	 */
-	public synchronized ThreadReferenceImpl removeThread(Long threadId) {
-		return (ThreadReferenceImpl) threads.remove(threadId);
-	}
-
-	/**
-	 * Creates a new {@link ThreadReferenceImpl} with the given ID
-	 * @param threadId
-	 * @return the new {@link ThreadReferenceImpl} or <code>null</code>
-	 */
-	private ThreadReferenceImpl createThreadReference(Long threadId) {
-		RhinoRequest request = new RhinoRequest(JSONConstants.THREAD);
-		request.getArguments().put(JSONConstants.THREAD_ID, threadId);
-		try {
-			RhinoResponse response = sendRequest(request, DEFAULT_TIMEOUT);
-			Map jsonThread = (Map) response.getBody().get(JSONConstants.THREAD);
-			if (jsonThread == null) {
-				return null;
-			}
-			return new ThreadReferenceImpl(this, jsonThread);
-		} catch (DisconnectedException e) {
-			disconnectVM();
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the {@link ThreadReferenceImpl} with the given ID or 
-	 * create and return a new one if it does not exist
-	 * @param threadId
-	 * @return the {@link ThreadReferenceImpl} for the given ID or <code>null</code>
-	 * if the request to create a new one fails
-	 */
-	public synchronized ThreadReferenceImpl getThread(Long threadId) {
-		ThreadReferenceImpl thread = (ThreadReferenceImpl) threads.get(threadId);
-		if (thread == null) {
-			thread = createThreadReference(threadId);
-			if (thread != null) {
-				threads.put(threadId, thread);
-			}
-		}
-		return thread;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#description()
-	 */
-	public String description() {
-		RhinoRequest request = new RhinoRequest(JSONConstants.VERSION);
-		try {
-			RhinoResponse response = sendRequest(request);
-			StringBuffer buffer = new StringBuffer();
-			buffer.append((String) response.getBody().get(JSONConstants.VM_VENDOR)).append(Constants.SPACE);
-			buffer.append(response.getBody().get(JSONConstants.VM_NAME)).append(Constants.SPACE);
-			buffer.append(response.getBody().get(JSONConstants.VM_VERSION));
-			return buffer.toString();
-		} catch (DisconnectedException e) {
-			disconnectVM();
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#dispose()
-	 */
-	public void dispose() {
-		RhinoRequest request = new RhinoRequest(JSONConstants.DISPOSE);
-		try {
-			sendRequest(request);
-		} catch (DisconnectedException e) {
-			disconnectVM();
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		} finally {
-			disconnectVM();
-			this.eventRequestManager.createVMDeathRequest();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#name()
-	 */
-	public String name() {
-		synchronized (lock) {
-			if(this.name == null) {
-	 			RhinoRequest request = new RhinoRequest(JSONConstants.VERSION);
-				try {
-					RhinoResponse response = sendRequest(request);
-					name = (String) response.getBody().get(JSONConstants.VM_NAME);
-				} catch (DisconnectedException e) {
-					disconnectVM();
-					handleException(e.getMessage(), e);
-				} catch (TimeoutException e) {
-					RhinoDebugPlugin.log(e);
-				}
-			}
-		}
-		return this.name;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#resume()
-	 */
-	public void resume() {
-		RhinoRequest request = new RhinoRequest(JSONConstants.CONTINUE);
-		try {
-			sendRequest(request);
-		} catch (DisconnectedException e) {
-			disconnectVM();
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#suspend()
-	 */
-	public void suspend() {
-		RhinoRequest request = new RhinoRequest(JSONConstants.SUSPEND);
-		try {
-			sendRequest(request);
-		} catch (DisconnectedException e) {
-			disconnectVM();
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#terminate()
-	 */
-	public void terminate() {
-		dispose();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#version()
-	 */
-	public String version() {
-		synchronized (lock) {
-			if(this.version == null) {
-				RhinoRequest request = new RhinoRequest(JSONConstants.VERSION);
-				try {
-					RhinoResponse response = sendRequest(request);
-					this.version = (String) response.getBody().get(JSONConstants.VM_VERSION);
-				} catch (DisconnectedException e) {
-					disconnectVM();
-					handleException(e.getMessage(), e);
-				} catch (TimeoutException e) {
-					RhinoDebugPlugin.log(e);
-				}
-			}
-		}
-		return this.version;
-	}
-
-	/**
-	 * disconnects the VM and creates the correct requests
-	 */
-	public void disconnectVM() {
-		if (this.disconnected) {
-			// no-op it is already disconnected
-			return;
-		}
-		try {
-			this.session.dispose();
-		} finally {
-			this.disconnected = true;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOf(boolean)
-	 */
-	public BooleanValue mirrorOf(boolean bool) {
-		return new BooleanValueImpl(this, Boolean.valueOf(bool));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOf(java.lang.Number)
-	 */
-	public NumberValue mirrorOf(Number number) {
-		return new NumberValueImpl(this, number);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOf(java.lang.String)
-	 */
-	public StringValue mirrorOf(String string) {
-		return new StringValueImpl(this, string);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOfNull()
-	 */
-	public NullValue mirrorOfNull() {
-		return nullValue;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOfUndefined()
-	 */
-	public UndefinedValue mirrorOfUndefined() {
-		return undefinedValue;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#eventRequestManager()
-	 */
-	public EventRequestManager eventRequestManager() {
-		return eventRequestManager;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#eventQueue()
-	 */
-	public EventQueue eventQueue() {
-		return eventQueue;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/HostArgument.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/HostArgument.java
deleted file mode 100644
index 6d7f26a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/HostArgument.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.connect;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.StringArgument;
-
-/**
- * Implementation of a string argument that describes the host argument
- * 
- * @since 1.0
- */
-public class HostArgument implements StringArgument {
-
-	private static final long serialVersionUID = 3057403815318177030L;
-	private String host;
-
-	/**
-	 * Host attribute name
-	 */
-	public static final String HOST = "host"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 * 
-	 * @param host
-	 */
-	public HostArgument(String host) {
-		setValue(host);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#description()
-	 */
-	public String description() {
-		return Messages.HostArgument_description;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.StringArgument#isValid(java.lang.String)
-	 */
-	public boolean isValid(String value) {
-		return value != null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#label()
-	 */
-	public String label() {
-		return Messages.HostArgument_label;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#mustSpecify()
-	 */
-	public boolean mustSpecify() {
-		return true;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#name()
-	 */
-	public String name() {
-		return HOST;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#setValue(java.lang.String)
-	 */
-	public void setValue(String host) {
-		if (!isValid(host)) {
-			throw new IllegalArgumentException();
-		}
-		this.host = host;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#value()
-	 */
-	public String value() {
-		return host;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/Messages.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/Messages.java
deleted file mode 100644
index 2c57f65..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/Messages.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.connect;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Rhino messages
- * 
- * @since 1.0
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.connect.messages"; //$NON-NLS-1$
-	public static String HostArgument_description;
-	public static String HostArgument_label;
-	public static String PortArgument_description;
-	public static String PortArgument_label;
-	public static String RhinoAttachingConnector_description;
-	public static String RhinoAttachingConnector_name;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/PortArgument.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/PortArgument.java
deleted file mode 100644
index c51a547..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/PortArgument.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.connect;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument;
-
-/**
- * Implementation of an {@link IntegerArgument} that describes the port to try connecting to
- * 
- * @since 1.0
- */
-public class PortArgument implements IntegerArgument {
-
-	private static final long serialVersionUID = -1954469572907116388L;
-	private int port;
-
-	/**
-	 * The port attribute name
-	 */
-	public static final String PORT = "port"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 * 
-	 * @param port
-	 */
-	public PortArgument(int port) {
-		setValue(port);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#intValue()
-	 */
-	public int intValue() {
-		return port;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#isValid(int)
-	 */
-	public boolean isValid(int intValue) {
-		return intValue > 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#max()
-	 */
-	public int max() {
-		return Integer.MAX_VALUE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#min()
-	 */
-	public int min() {
-		return 1;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#setValue(int)
-	 */
-	public void setValue(int port) {
-		this.port = port;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#description()
-	 */
-	public String description() {
-		return Messages.PortArgument_description;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#isValid(java.lang.String)
-	 */
-	public boolean isValid(String value) {
-		try {
-			int intValue = Integer.parseInt(value);
-			return isValid(intValue);
-		} catch (NumberFormatException e) {
-			return false;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#label()
-	 */
-	public String label() {
-		return Messages.PortArgument_label;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#mustSpecify()
-	 */
-	public boolean mustSpecify() {
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#name()
-	 */
-	public String name() {
-		return PORT;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#setValue(java.lang.String)
-	 */
-	public void setValue(String value) {
-		try {
-			int intValue = Integer.parseInt(value);
-			setValue(intValue);
-		} catch (NumberFormatException nfe) {
-			// re-throw IllegalArgumentException
-			throw new IllegalArgumentException(nfe.getMessage());
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#value()
-	 */
-	public String value() {
-		return Integer.toString(port);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/RhinoAttachingConnector.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/RhinoAttachingConnector.java
deleted file mode 100644
index 406690c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/RhinoAttachingConnector.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.connect;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.AttachingConnector;
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoTransportService;
-import org.eclipse.wst.jsdt.debug.transport.Connection;
-import org.eclipse.wst.jsdt.debug.transport.DebugSession;
-import org.eclipse.wst.jsdt.debug.transport.TransportService;
-
-/**
- * Rhino {@link Connector} implementation that attaches to a running debug process
- * 
- * @since 1.0
- * @see Connector
- * @see AttachingConnector
- */
-public class RhinoAttachingConnector implements AttachingConnector {
-
-	/**
-	 * Describes the <code>localhost</code> hostname i.e. the <code>127.0.0.1</code> IP address
-	 */
-	public static final String LOCALHOST = "localhost"; //$NON-NLS-1$
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.AttachingConnector#attach(java.util.Map)
-	 */
-	public VirtualMachine attach(Map arguments) throws IOException {
-		TransportService service = new RhinoTransportService();
-		String host = (String) arguments.get(HostArgument.HOST);
-		String port = (String) arguments.get(PortArgument.PORT);
-		Connection c = service.attach(host + ":" + Integer.parseInt(port), 10000, 10000); //$NON-NLS-1$
-		DebugSession session = new DebugSession(c);
-		return new VirtualMachineImpl(session);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#defaultArguments()
-	 */
-	public Map defaultArguments() {
-		Map result = new HashMap();
-		result.put(HostArgument.HOST, new HostArgument(LOCALHOST));
-		result.put(PortArgument.PORT, new PortArgument(9000));
-		return result;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#description()
-	 */
-	public String description() {
-		return Messages.RhinoAttachingConnector_description;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#name()
-	 */
-	public String name() {
-		return Messages.RhinoAttachingConnector_name;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#id()
-	 */
-	public String id() {
-		return "rhino.attaching.connector"; //$NON-NLS-1$
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/messages.properties b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/messages.properties
deleted file mode 100644
index 9c67d26..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/messages.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2009, 2010 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-HostArgument_description=The name of the host address to try attaching to.
-HostArgument_label=&Host:
-PortArgument_description=The port on the host machine to try attaching to.
-PortArgument_label=&Port:
-RhinoAttachingConnector_description=This connector is used to attach to a running Mozilla Rhino debug process.
-RhinoAttachingConnector_name=Mozilla Rhino - Attaching Connector
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/BreakpointEventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/BreakpointEventImpl.java
deleted file mode 100644
index 2b86a87..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/BreakpointEventImpl.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.BreakpointEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link BreakpointEvent}
- * 
- * @since 1.0
- */
-public final class BreakpointEventImpl extends LocatableEventImpl implements BreakpointEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param location
-	 * @param request
-	 */
-	public BreakpointEventImpl(VirtualMachineImpl vm, ThreadReference thread, Location location, BreakpointRequest request) {
-		super(vm, thread, location, request);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/DebuggerStatementEventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/DebuggerStatementEventImpl.java
deleted file mode 100644
index 8e197c4..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/DebuggerStatementEventImpl.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.DebuggerStatementEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.DebuggerStatementRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link DebuggerStatementEvent}
- * 
- * @since 1.0
- */
-public final class DebuggerStatementEventImpl extends LocatableEventImpl implements DebuggerStatementEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param location
-	 * @param request
-	 */
-	public DebuggerStatementEventImpl(VirtualMachineImpl vm, ThreadReference thread, Location location, DebuggerStatementRequest request) {
-		super(vm, thread, location, request);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/EventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/EventImpl.java
deleted file mode 100644
index f559328..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/EventImpl.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.Event;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link Event}
- * 
- * @since 1.0
- */
-public class EventImpl implements Event {
-
-	private final VirtualMachineImpl vm;
-	private final EventRequest request;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param request
-	 */
-	public EventImpl(VirtualMachineImpl vm, EventRequest request) {
-		this.vm = vm;
-		this.request = request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.Event#request()
-	 */
-	public EventRequest request() {
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Mirror#virtualMachine()
-	 */
-	public VirtualMachine virtualMachine() {
-		return vm;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/EventQueueImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/EventQueueImpl.java
deleted file mode 100644
index fb9e31a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/EventQueueImpl.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ScriptLoadRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDeathRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.RhinoDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.MirrorImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.ScriptReferenceImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.ThreadReferenceImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request.BreakpointRequestImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request.DebuggerStatementRequestImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request.EventRequestManagerImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request.StepRequestImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request.SuspendRequestImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.EventPacket;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.eclipse.wst.jsdt.debug.transport.exception.DisconnectedException;
-import org.eclipse.wst.jsdt.debug.transport.exception.TimeoutException;
-
-/**
- * Default implementation of {@link EventQueue}
- * 
- * @since 1.0
- */
-public final class EventQueueImpl extends MirrorImpl implements EventQueue {
-
-	private VirtualMachineImpl vm;
-	private EventRequestManagerImpl eventRequestManager;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param eventRequestManager
-	 */
-	public EventQueueImpl(VirtualMachineImpl vm, EventRequestManagerImpl eventRequestManager) {
-		super(vm);
-		this.vm = vm;
-		this.eventRequestManager = eventRequestManager;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue#remove()
-	 */
-	public EventSet remove() {
-		return remove(-1);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue#remove(int)
-	 */
-	public EventSet remove(int timeout) {
-		try {
-			while (true) {
-				EventPacket event = vm.receiveEvent(timeout);
-				String eventName = event.getEvent();
-				EventSetImpl eventSet = new EventSetImpl(vm);
-				if (eventName.equals(JSONConstants.SCRIPT)) {
-					Long threadId = new Long(((Number) event.getBody().get(JSONConstants.THREAD_ID)).longValue());
-					ThreadReferenceImpl thread = vm.getThread(threadId);
-					if(thread == null) {
-						continue;
-					}
-					eventSet.setThread(thread);
-					Long scriptId = new Long(((Number) event.getBody().get(JSONConstants.SCRIPT_ID)).longValue());
-					ScriptReferenceImpl script = vm.addScript(scriptId);
-					if(script != null) {
-						List scriptLoadRequests = eventRequestManager.scriptLoadRequests();
-						for (Iterator iterator = scriptLoadRequests.iterator(); iterator.hasNext();) {
-							ScriptLoadRequest request = (ScriptLoadRequest) iterator.next();
-							if (request.isEnabled()) {
-								eventSet.add(new ScriptLoadEventImpl(vm, thread, script, request));
-							}
-						}
-					}
-					if (!eventSet.isEmpty()) {
-						thread.markSuspended(false);
-					}
-				} else if (eventName.equals(JSONConstants.BREAK)) {
-					Long threadId = new Long(((Number) event.getBody().get(JSONConstants.THREAD_ID)).longValue());
-					ThreadReferenceImpl thread = vm.getThread(threadId);
-					if(thread == null) {
-						continue;
-					}
-					eventSet.setThread(thread);
-					Long scriptId = new Long(((Number) event.getBody().get(JSONConstants.SCRIPT_ID)).longValue());
-					ScriptReferenceImpl script = vm.getScript(scriptId);
-					if(script != null) {
-						int lineNumber = ((Number) event.getBody().get(JSONConstants.LINE)).intValue();
-						Location location = script.lineLocation(lineNumber);
-						boolean atBreakpoint = false;
-						Number breakpointId = (Number) event.getBody().get(JSONConstants.BREAKPOINT);
-						if (breakpointId != null) {
-							List breakpointRequests = eventRequestManager.breakpointRequests();
-							for (Iterator iterator = breakpointRequests.iterator(); iterator.hasNext();) {
-								BreakpointRequestImpl request = (BreakpointRequestImpl) iterator.next();
-								ThreadReference requestThread = request.thread();
-								if (request.isEnabled() && (requestThread == null || thread == requestThread) && breakpointId.longValue() == request.breakpointId().longValue()) {
-									eventSet.add(new BreakpointEventImpl(vm, thread, location, request));
-									atBreakpoint = true;
-								}
-							}
-						}
-						String stepType = (String) event.getBody().get(JSONConstants.STEP);
-						if (JSONConstants.SUSPENDED.equals(stepType)) {
-							List suspendRequests = eventRequestManager.suspendRequests();
-							for (Iterator iterator = suspendRequests.iterator(); iterator.hasNext();) {
-								SuspendRequestImpl request = (SuspendRequestImpl) iterator.next();
-								ThreadReference requestThread = request.thread();
-								if (request.isEnabled() && (requestThread == null || thread == requestThread)) {
-									eventSet.add(new SuspendEventImpl(vm, thread, location, request));
-								}
-							}
-						} else if (stepType != null) {
-							List stepRequests = eventRequestManager.stepRequests();
-							for (Iterator iterator = stepRequests.iterator(); iterator.hasNext();) {
-								StepRequestImpl request = (StepRequestImpl) iterator.next();
-								ThreadReference requestThread = request.thread();
-								if (request.isEnabled() && (requestThread == null || thread == requestThread)) {
-									eventSet.add(new StepEventImpl(vm, thread, location, request));
-								}
-							}
-						}
-						Boolean debuggerStatement = (Boolean) event.getBody().get(JSONConstants.DEBUGGER_STATEMENT);
-						if (debuggerStatement.booleanValue()) {
-							List debuggerStatementRequests = eventRequestManager.debuggerStatementRequests();
-							for (Iterator iterator = debuggerStatementRequests.iterator(); iterator.hasNext();) {
-								DebuggerStatementRequestImpl request = (DebuggerStatementRequestImpl) iterator.next();
-								ThreadReference requestThread = request.thread();
-								if (request.isEnabled() && (requestThread == null || thread == requestThread)) {
-									eventSet.add(new DebuggerStatementEventImpl(vm, thread, location, request));
-								}
-							}
-						}
-						if (!eventSet.isEmpty()) {
-							thread.markSuspended(atBreakpoint);
-						}
-					}
-				} else if (eventName.equals(JSONConstants.EXCEPTION)) {
-					Long threadId = new Long(((Number) event.getBody().get(JSONConstants.THREAD_ID)).longValue());
-					ThreadReferenceImpl thread = vm.getThread(threadId);
-					if(thread != null) {
-						eventSet.setThread(thread);
-						Long scriptId = new Long(((Number) event.getBody().get(JSONConstants.SCRIPT_ID)).longValue());
-						ScriptReferenceImpl script = vm.getScript(scriptId);
-						int lineNumber = ((Number) event.getBody().get(JSONConstants.LINE)).intValue();
-						Location location = script.lineLocation(lineNumber);
-						String message = (String) event.getBody().get(JSONConstants.MESSAGE);
-						List exceptionRequests = eventRequestManager.exceptionRequests();
-						for (Iterator iterator = exceptionRequests.iterator(); iterator.hasNext();) {
-							ExceptionRequest request = (ExceptionRequest) iterator.next();
-							if (request.isEnabled()) {
-								eventSet.add(new ExceptionEventImpl(vm, thread, location, message, request));
-							}
-						}
-						if (!eventSet.isEmpty()) {
-							thread.markSuspended(false);
-						}
-					}
-				} else if (eventName.equals(JSONConstants.THREAD)) {
-					Long threadId = new Long(((Number) event.getBody().get(JSONConstants.THREAD_ID)).longValue());
-					String type = (String) event.getBody().get(JSONConstants.TYPE);
-					if (JSONConstants.ENTER.equals(type)) {
-						ThreadReferenceImpl thread = vm.getThread(threadId);
-						if(thread != null) {
-							eventSet.setThread(thread);
-							List threadEnterRequests = eventRequestManager.threadEnterRequests();
-							for (Iterator iterator = threadEnterRequests.iterator(); iterator.hasNext();) {
-								ThreadEnterRequest request = (ThreadEnterRequest) iterator.next();
-								if (request.isEnabled()) {
-									eventSet.add(new ThreadEnterEventImpl(vm, thread, request));
-								}
-							}
-						}
-					} else if (JSONConstants.EXIT.equals(type)) {
-						ThreadReferenceImpl thread = vm.removeThread(threadId);
-						List threadExitRequests = eventRequestManager.threadExitRequests();
-						for (Iterator iterator = threadExitRequests.iterator(); iterator.hasNext();) {
-							ThreadExitRequest request = (ThreadExitRequest) iterator.next();
-							if (request.isEnabled()) {
-								eventSet.add(new ThreadExitEventImpl(vm, thread, request));
-							}
-						}
-					}
-					else if(JSONConstants.VMDEATH.equals(type)) {
-						List requests = eventRequestManager.vmDeathRequests();
-						for (Iterator iter = requests.iterator(); iter.hasNext();) {
-							VMDeathRequest request = (VMDeathRequest) iter.next();
-							if(request.isEnabled()) {
-								eventSet.add(new VMDeathEventImpl(vm, request));
-							}
-						}
-					}
-				}
-				if (eventSet.isEmpty()) {
-					eventSet.resume();
-					continue;
-				}
-				return eventSet;
-			}
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		} catch (DisconnectedException e) {
-			vm.disconnectVM();
-			handleException(e.getMessage(), e);
-		}
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/EventSetImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/EventSetImpl.java
deleted file mode 100644
index 5d57522..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/EventSetImpl.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import java.util.HashSet;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.ThreadReferenceImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link EventSet}
- * 
- * @since 1.0
- */
-public final class EventSetImpl extends HashSet implements EventSet {
-
-	private static final long serialVersionUID = 1L;
-	private VirtualMachineImpl vm;
-	private ThreadReferenceImpl thread;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public EventSetImpl(VirtualMachineImpl vm) {
-		this.vm = vm;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet#resume()
-	 */
-	public void resume() {
-		if (thread == null) {
-			vm.resume();
-		}
-		else {
-			thread.resume();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet#suspended()
-	 */
-	public boolean suspended() {
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Mirror#virtualMachine()
-	 */
-	public VirtualMachine virtualMachine() {
-		return this.vm;
-	}
-
-	/**
-	 * @param thread
-	 */
-	public void setThread(ThreadReferenceImpl thread) {
-		this.thread = thread;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ExceptionEventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ExceptionEventImpl.java
deleted file mode 100644
index 1abd72e..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ExceptionEventImpl.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ExceptionEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link ExceptionEvent}
- * 
- * @since 1.0
- */
-public final class ExceptionEventImpl extends LocatableEventImpl implements ExceptionEvent {
-
-	private final String message;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param location
-	 * @param message
-	 * @param request
-	 */
-	public ExceptionEventImpl(VirtualMachineImpl vm, ThreadReference thread, Location location, String message, ExceptionRequest request) {
-		super(vm, thread, location, request);
-		this.message = message;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.ExceptionEvent#message()
-	 */
-	public String message() {
-		return message;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/LocatableEventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/LocatableEventImpl.java
deleted file mode 100644
index 7da853c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/LocatableEventImpl.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.LocatableEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link LocatableEvent}
- * 
- * @since 1.0
- */
-public class LocatableEventImpl extends EventImpl implements LocatableEvent {
-
-	protected ThreadReference thread = null;
-	protected Location location = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param request
-	 */
-	public LocatableEventImpl(VirtualMachineImpl vm, ThreadReference thread, Location location, EventRequest request) {
-		super(vm, request);
-		this.thread = thread;
-		this.location = location;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Locatable#location()
-	 */
-	public Location location() {
-		return this.location;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.LocatableEvent#thread()
-	 */
-	public ThreadReference thread() {
-		return this.thread;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ResumeEventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ResumeEventImpl.java
deleted file mode 100644
index d87d0f3..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ResumeEventImpl.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ResumeEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link ResumeEvent}
- * @since 1.1
- */
-public class ResumeEventImpl extends LocatableEventImpl implements ResumeEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param location
-	 * @param request
-	 */
-	public ResumeEventImpl(VirtualMachineImpl vm, ThreadReference thread, Location location, EventRequest request) {
-		super(vm, thread, location, request);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ScriptLoadEventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ScriptLoadEventImpl.java
deleted file mode 100644
index 7c36b04..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ScriptLoadEventImpl.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ScriptLoadEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ScriptLoadRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.ScriptReferenceImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link ScriptLoadEvent}
- * 
- * @since 1.0
- */
-public final class ScriptLoadEventImpl extends LocatableEventImpl implements ScriptLoadEvent {
-
-	private final ScriptReferenceImpl script;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param script
-	 * @param request
-	 */
-	public ScriptLoadEventImpl(VirtualMachineImpl vm, ThreadReference thread, ScriptReferenceImpl script, ScriptLoadRequest request) {
-		super(vm, thread, null, request);
-		this.script = script;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.ScriptLoadEvent#script()
-	 */
-	public ScriptReference script() {
-		return script;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/StepEventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/StepEventImpl.java
deleted file mode 100644
index 7f0999c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/StepEventImpl.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.StepEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link StepEvent}
- * 
- * @since 1.0
- */
-public final class StepEventImpl extends LocatableEventImpl implements StepEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param location
-	 * @param request
-	 */
-	public StepEventImpl(VirtualMachineImpl vm, ThreadReference thread, Location location, StepRequest request) {
-		super(vm, thread, location, request);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/SuspendEventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/SuspendEventImpl.java
deleted file mode 100644
index 2524a70..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/SuspendEventImpl.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.SuspendEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.SuspendRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link SuspendEvent}
- * 
- * @since 1.0
- */
-public final class SuspendEventImpl extends LocatableEventImpl implements SuspendEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param location
-	 * @param request
-	 */
-	public SuspendEventImpl(VirtualMachineImpl vm, ThreadReference thread, Location location, SuspendRequest request) {
-		super(vm, thread, location, request);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ThreadEnterEventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ThreadEnterEventImpl.java
deleted file mode 100644
index 1f83fe2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ThreadEnterEventImpl.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ThreadEnterEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link ThreadEnterEvent}
- * 
- * @since 1.0
- */
-public final class ThreadEnterEventImpl extends LocatableEventImpl implements ThreadEnterEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param request
-	 */
-	public ThreadEnterEventImpl(VirtualMachineImpl vm, ThreadReference thread, ThreadEnterRequest request) {
-		super(vm, thread, null, request);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ThreadExitEventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ThreadExitEventImpl.java
deleted file mode 100644
index 4edbc4c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ThreadExitEventImpl.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ThreadExitEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link ThreadExitEvent}
- * 
- * @since 1.0
- */
-public final class ThreadExitEventImpl extends LocatableEventImpl implements ThreadExitEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param request
-	 */
-	public ThreadExitEventImpl(VirtualMachineImpl vm, ThreadReference thread, ThreadExitRequest request) {
-		super(vm, thread, null, request);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/VMDeathEventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/VMDeathEventImpl.java
deleted file mode 100644
index 2363f44..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/VMDeathEventImpl.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.VMDeathEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of a {@link VMDeathEvent}
- * 
- * @since 1.0
- */
-public class VMDeathEventImpl extends EventImpl implements VMDeathEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param request
-	 */
-	public VMDeathEventImpl(VirtualMachineImpl vm, EventRequest request) {
-		super(vm, request);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/messages.properties b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/messages.properties
deleted file mode 100644
index 0e4579a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/messages.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-###############################################################################
-# Copyright (c) 2010, 2011 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-ArrayReferenceImpl_array_count_=Array [{0}]
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/BreakpointRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/BreakpointRequestImpl.java
deleted file mode 100644
index 7f11c0e..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/BreakpointRequestImpl.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.RhinoDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.ScriptReferenceImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.RhinoResponse;
-import org.eclipse.wst.jsdt.debug.transport.exception.DisconnectedException;
-import org.eclipse.wst.jsdt.debug.transport.exception.TimeoutException;
-
-/**
- * Rhino implementation of {@link BreakpointRequest}
- * 
- * @since 1.0
- */
-public class BreakpointRequestImpl extends EventRequestImpl implements BreakpointRequest {
-
-	private final Location location;
-	private ThreadReference thread;
-	private String condition;
-	private Long breakpointId;
-	private int hitcount = 0;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param location
-	 */
-	public BreakpointRequestImpl(VirtualMachineImpl vm, Location location) {
-		super(vm);
-		this.location = location;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public synchronized void addThreadFilter(ThreadReference thread) {
-		checkDeleted();
-		this.thread = thread;
-	}
-
-	/**
-	 * Returns the underlying {@link ThreadReference} this request applies to
-	 * 
-	 * @return the underlying {@link ThreadReference}
-	 */
-	public synchronized ThreadReference thread() {
-		return this.thread;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest#addConditionFilter(java.lang.String)
-	 */
-	public synchronized void addConditionFilter(String condition) {
-		checkDeleted();
-		this.condition = condition;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest#addHitCountFilter(int)
-	 */
-	public void addHitCountFilter(int hitcount) {
-		checkDeleted();
-		this.hitcount = hitcount;
-	}
-
-	/**
-	 * Returns the condition for this breakpoint
-	 * 
-	 * @return the condition
-	 */
-	public synchronized String condition() {
-		return condition;
-	}
-
-	/**
-	 * Returns the hit count for the breakpoint
-	 * 
-	 * @return the hit count for the breakpoint
-	 */
-	public synchronized int hitcount() {
-		return this.hitcount;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Locatable#location()
-	 */
-	public Location location() {
-		return this.location;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request.EventRequestImpl#setEnabled(boolean)
-	 */
-	public synchronized void setEnabled(boolean enabled) {
-		checkDeleted();
-		if (this.enabled == enabled) {
-			return;
-		}
-		if (enabled) {
-			ScriptReferenceImpl scriptReferenceImpl = (ScriptReferenceImpl) this.location.scriptReference();
-			Long scriptId = scriptReferenceImpl.getScriptId();
-			RhinoRequest request = new RhinoRequest(JSONConstants.SETBREAKPOINT);
-			request.getArguments().put(JSONConstants.SCRIPT_ID, scriptId);
-			request.getArguments().put(JSONConstants.CONDITION, this.condition);
-			if (this.location.functionName() != null) {
-				request.getArguments().put(JSONConstants.FUNCTION, this.location.functionName());
-			}
-			else{
-				request.getArguments().put(JSONConstants.LINE, new Integer(this.location.lineNumber()));
-			}
-			try {
-				RhinoResponse response = this.vm.sendRequest(request);
-				if(response.isSuccess()) {
-					Map body = (Map) response.getBody().get(JSONConstants.BREAKPOINT);
-					Number id = (Number) body.get(JSONConstants.BREAKPOINT_ID);
-					this.breakpointId = new Long(id.longValue());
-				}
-			} catch (TimeoutException e) {
-				RhinoDebugPlugin.log(e);
-			} catch (DisconnectedException e) {
-				handleException(e.getMessage(), e);
-			}
-		} else {
-			RhinoRequest request = new RhinoRequest(JSONConstants.CLEARBREAKPOINT);
-			request.getArguments().put(JSONConstants.BREAKPOINT_ID, breakpointId);
-			try {
-				vm.sendRequest(request);
-			} catch (TimeoutException e) {
-				RhinoDebugPlugin.log(e);
-			} catch (DisconnectedException e) {
-				handleException(e.getMessage(), e);
-			}
-			breakpointId = null;
-		}
-		this.enabled = enabled;
-	}
-
-	/**
-	 * Returns the id reported back from the underlying {@link VirtualMachine} for this breakpoint
-	 * 
-	 * @return the id of the breakpoint
-	 */
-	public Long breakpointId() {
-		return this.breakpointId;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/DebuggerStatementRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/DebuggerStatementRequestImpl.java
deleted file mode 100644
index 55c13ec..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/DebuggerStatementRequestImpl.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.DebuggerStatementRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link DebuggerStatementRequest}
- * 
- * @since 1.0
- */
-public class DebuggerStatementRequestImpl extends EventRequestImpl implements DebuggerStatementRequest {
-
-	private ThreadReference thread;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public DebuggerStatementRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.DebuggerStatementRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public synchronized void addThreadFilter(ThreadReference thread) {
-		checkDeleted();
-		this.thread = thread;
-	}
-
-	/**
-	 * The underlying {@link ThreadReference}
-	 * @return the underlying {@link ThreadReference}
-	 */
-	public synchronized ThreadReference thread() {
-		return thread;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request.EventRequestImpl#setEnabled(boolean)
-	 */
-	public synchronized void setEnabled(boolean enabled) {
-		checkDeleted();
-		this.enabled = enabled;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/EventRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/EventRequestImpl.java
deleted file mode 100644
index c230638..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/EventRequestImpl.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.MirrorImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link EventRequest}
- * 
- * @since 1.0
- */
-public class EventRequestImpl extends MirrorImpl implements EventRequest {
-
-	private boolean deleted = false;
-	protected boolean enabled = false;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public EventRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest#isEnabled()
-	 */
-	public synchronized boolean isEnabled() {
-		return enabled;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest#setEnabled(boolean)
-	 */
-	public synchronized void setEnabled(boolean enabled) {
-		checkDeleted();
-		this.enabled = enabled;
-	}
-
-	/**
-	 * If the delete flag is set throw an {@link IllegalStateException}
-	 * @throws IllegalStateException
-	 */
-	protected void checkDeleted() throws IllegalStateException {
-		if (deleted) {
-			throw new IllegalStateException("deleted"); //$NON-NLS-1$
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Mirror#virtualMachine()
-	 */
-	public VirtualMachine virtualMachine() {
-		return vm;
-	}
-
-	/**
-	 * delete the request by setting it disabled and setting the delet flag 
-	 */
-	public synchronized void delete() {
-		setEnabled(false);
-		deleted = true;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/EventRequestManagerImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/EventRequestManagerImpl.java
deleted file mode 100644
index 83252f2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/EventRequestManagerImpl.java
+++ /dev/null
@@ -1,278 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.DebuggerStatementRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ResumeRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ScriptLoadRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.SuspendRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDeathRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDisconnectRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link EventRequestManager}
- * 
- * @since 1.0
- */
-public final class EventRequestManagerImpl implements EventRequestManager {
-
-	private final Map eventsMap = new HashMap();
-	private final List breakpointRequests = new ArrayList();
-	private final List exceptionRequests = new ArrayList();
-	private final List debuggerStatementRequests = new ArrayList();
-	private final List scriptLoadRequests = new ArrayList();
-	private final List stepRequests = new ArrayList();
-	private final List suspendRequests = new ArrayList();
-	private final List resumeRequests = new ArrayList();
-	private final List threadEnterRequests = new ArrayList();
-	private final List threadExitRequests = new ArrayList();
-	private final List vmDeathRequests = new ArrayList();
-	private final List vmDisconnectRequests = new ArrayList();
-	private final VirtualMachineImpl vm;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 */
-	public EventRequestManagerImpl(VirtualMachineImpl vm) {
-		this.vm = vm;
-		eventsMap.put(BreakpointRequestImpl.class, breakpointRequests);
-		eventsMap.put(DebuggerStatementRequestImpl.class, debuggerStatementRequests);
-		eventsMap.put(ExceptionRequestImpl.class, exceptionRequests);
-		eventsMap.put(ScriptLoadRequestImpl.class, scriptLoadRequests);
-		eventsMap.put(StepRequestImpl.class, stepRequests);
-		eventsMap.put(SuspendRequestImpl.class, suspendRequests);
-		eventsMap.put(ResumeRequestImpl.class, resumeRequests);
-		eventsMap.put(ThreadEnterRequestImpl.class, threadEnterRequests);
-		eventsMap.put(ThreadExitRequestImpl.class, threadExitRequests);
-		eventsMap.put(VMDeathRequestImpl.class, vmDeathRequests);
-		eventsMap.put(VMDisconnectRequestImpl.class, vmDisconnectRequests);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createBreakpointRequest(org.eclipse.wst.jsdt.debug.core.jsdi.Location)
-	 */
-	public synchronized BreakpointRequest createBreakpointRequest(Location location) {
-		BreakpointRequestImpl request = new BreakpointRequestImpl(vm, location);
-		breakpointRequests.add(request);
-		return request;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#debuggerStatementRequests()
-	 */
-	public synchronized List debuggerStatementRequests() {
-		return Collections.unmodifiableList(debuggerStatementRequests);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createDebuggerStatementRequest()
-	 */
-	public synchronized DebuggerStatementRequest createDebuggerStatementRequest() {
-		DebuggerStatementRequestImpl request = new DebuggerStatementRequestImpl(vm);
-		debuggerStatementRequests.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#breakpointRequests()
-	 */
-	public synchronized List breakpointRequests() {
-		return Collections.unmodifiableList(breakpointRequests);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createExceptionRequest()
-	 */
-	public synchronized ExceptionRequest createExceptionRequest() {
-		ExceptionRequest request = new ExceptionRequestImpl(vm);
-		exceptionRequests.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#exceptionRequests()
-	 */
-	public synchronized List exceptionRequests() {
-		return Collections.unmodifiableList(exceptionRequests);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createScriptLoadRequest()
-	 */
-	public synchronized ScriptLoadRequest createScriptLoadRequest() {
-		ScriptLoadRequest request = new ScriptLoadRequestImpl(vm);
-		scriptLoadRequests.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#scriptLoadRequests()
-	 */
-	public synchronized List scriptLoadRequests() {
-		return Collections.unmodifiableList(scriptLoadRequests);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createStepRequest(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference, int)
-	 */
-	public synchronized StepRequest createStepRequest(ThreadReference thread, int step) {
-		StepRequest request = new StepRequestImpl(vm, thread, step);
-		stepRequests.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#stepRequests()
-	 */
-	public synchronized List stepRequests() {
-		return Collections.unmodifiableList(stepRequests);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createSuspendRequest(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public synchronized SuspendRequest createSuspendRequest(ThreadReference thread) {
-		SuspendRequest request = new SuspendRequestImpl(vm, thread);
-		suspendRequests.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#suspendRequests()
-	 */
-	public synchronized List suspendRequests() {
-		return Collections.unmodifiableList(suspendRequests);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createResumeRequest(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public ResumeRequest createResumeRequest(ThreadReference thread) {
-		ResumeRequestImpl request = new ResumeRequestImpl(vm, thread);
-		resumeRequests.add(request);
-		return request;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#resumeRequests()
-	 */
-	public List resumeRequests() {
-		return Collections.unmodifiableList(resumeRequests);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createThreadEnterRequest()
-	 */
-	public synchronized ThreadEnterRequest createThreadEnterRequest() {
-		ThreadEnterRequest request = new ThreadEnterRequestImpl(vm);
-		threadEnterRequests.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#threadEnterRequests()
-	 */
-	public List threadEnterRequests() {
-		return Collections.unmodifiableList(threadEnterRequests);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createThreadExitRequest()
-	 */
-	public synchronized ThreadExitRequest createThreadExitRequest() {
-		ThreadExitRequest request = new ThreadExitRequestImpl(vm);
-		threadExitRequests.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#threadExitRequests()
-	 */
-	public List threadExitRequests() {
-		return Collections.unmodifiableList(threadExitRequests);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#deleteEventRequest(org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest)
-	 */
-	public synchronized void deleteEventRequest(EventRequest eventRequest) {
-		Class clazz = eventRequest.getClass();
-		List eventList = (List) eventsMap.get(clazz);
-		if (eventList == null) {
-			throw new IllegalArgumentException(
-					"bad event request class - " + clazz.getName()); //$NON-NLS-1$
-		}
-		eventList.remove(eventRequest);
-		EventRequestImpl eventRequestImpl = (EventRequestImpl) eventRequest;
-		eventRequestImpl.delete();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#deleteEventRequest(java.util.List)
-	 */
-	public synchronized void deleteEventRequest(List eventRequests) {
-		for (Iterator iterator = eventRequests.iterator(); iterator.hasNext();) {
-			EventRequest eventRequest = (EventRequest) iterator.next();
-			deleteEventRequest(eventRequest);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createVMDeathRequest()
-	 */
-	public VMDeathRequest createVMDeathRequest() {
-		VMDeathRequest request = new VMDeathRequestImpl(this.vm);
-		this.vmDeathRequests.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#vmDeathRequests()
-	 */
-	public List vmDeathRequests() {
-		return Collections.unmodifiableList(vmDeathRequests);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createVMDisconnectRequest()
-	 */
-	public VMDisconnectRequest createVMDisconnectRequest() {
-		VMDisconnectRequest request = new VMDisconnectRequestImpl(this.vm);
-		this.vmDisconnectRequests.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#vmDisconnectRequests()
-	 */
-	public List vmDisconnectRequests() {
-		return Collections.unmodifiableList(vmDisconnectRequests);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ExceptionRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ExceptionRequestImpl.java
deleted file mode 100644
index 11ab789..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ExceptionRequestImpl.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link ExceptionRequest}
- * 
- * @since 1.0
- */
-public class ExceptionRequestImpl extends EventRequestImpl implements ExceptionRequest {
-
-	private ThreadReference thread;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public ExceptionRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public synchronized void addThreadFilter(ThreadReference thread) {
-		checkDeleted();
-		this.thread = thread;
-	}
-
-	/**
-	 * The underlying {@link ThreadReference}
-	 * @return the underlying {@link ThreadReference}
-	 */
-	public synchronized ThreadReference thread() {
-		return thread;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ResumeRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ResumeRequestImpl.java
deleted file mode 100644
index a7fdee0..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ResumeRequestImpl.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ResumeRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link ResumeRequest}
- * 
- * @since 1.1
- */
-public class ResumeRequestImpl extends EventRequestImpl implements ResumeRequest {
-
-	private final ThreadReference thread;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 */
-	public ResumeRequestImpl(VirtualMachineImpl vm, ThreadReference thread) {
-		super(vm);
-		this.thread = thread;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.ResumeRequest#thread()
-	 */
-	public ThreadReference thread() {
-		return thread;
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ScriptLoadRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ScriptLoadRequestImpl.java
deleted file mode 100644
index 3b8857d..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ScriptLoadRequestImpl.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ScriptLoadRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link ScriptLoadRequest}
- * 
- * @since 1.0
- */
-public class ScriptLoadRequestImpl extends EventRequestImpl implements ScriptLoadRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public ScriptLoadRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/StepRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/StepRequestImpl.java
deleted file mode 100644
index f72490a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/StepRequestImpl.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.ThreadReferenceImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-
-/**
- * Rhino implementation of {@link StepRequest}
- * 
- * @since 1.0
- */
-public class StepRequestImpl extends EventRequestImpl implements StepRequest {
-
-	private final ThreadReferenceImpl thread;
-	private final int step;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param step
-	 */
-	public StepRequestImpl(VirtualMachineImpl vm, ThreadReference thread, int step) {
-		super(vm);
-		this.thread = (ThreadReferenceImpl) thread;
-		this.step = step;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest#step()
-	 */
-	public int step() {
-		return step;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest#thread()
-	 */
-	public ThreadReference thread() {
-		return thread;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request.EventRequestImpl#setEnabled(boolean)
-	 */
-	public synchronized void setEnabled(boolean enabled) {
-		checkDeleted();
-		if (this.enabled == enabled) {
-			return;
-		}
-		if (enabled) {
-			String stepType = null;
-			if (step == STEP_INTO) {
-				stepType = JSONConstants.STEP_IN;
-			}
-			else if (step == STEP_OVER) {
-				stepType = JSONConstants.STEP_NEXT;
-			}
-			else if (step == STEP_OUT) {
-				stepType = JSONConstants.STEP_OUT;
-			}
-			if (thread.getStep() != null) {
-				throw new IllegalStateException("duplicate step"); //$NON-NLS-1$
-			}
-			thread.setStep(stepType);
-		} else {
-			thread.setStep(null);
-		}
-		this.enabled = enabled;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/SuspendRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/SuspendRequestImpl.java
deleted file mode 100644
index 3a499d2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/SuspendRequestImpl.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.SuspendRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link SuspendRequest}
- * 
- * @since 1.0
- */
-public class SuspendRequestImpl extends EventRequestImpl implements SuspendRequest {
-
-	private final ThreadReference thread;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 */
-	public SuspendRequestImpl(VirtualMachineImpl vm, ThreadReference thread) {
-		super(vm);
-		this.thread = thread;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.SuspendRequest#thread()
-	 */
-	public ThreadReference thread() {
-		return thread;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ThreadEnterRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ThreadEnterRequestImpl.java
deleted file mode 100644
index 4240d4d..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ThreadEnterRequestImpl.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link ThreadEnterRequest}
- * 
- * @since 1.0
- */
-public class ThreadEnterRequestImpl extends EventRequestImpl implements ThreadEnterRequest {
-
-	private ThreadReference thread;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public ThreadEnterRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public synchronized void addThreadFilter(ThreadReference thread) {
-		checkDeleted();
-		this.thread = thread;
-	}
-
-	/**
-	 * Return the underlying {@link ThreadReference}
-	 * @return the underlying {@link ThreadReference}
-	 */
-	public synchronized ThreadReference thread() {
-		return thread;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ThreadExitRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ThreadExitRequestImpl.java
deleted file mode 100644
index 16f45ef..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ThreadExitRequestImpl.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link ThreadExitRequest}
- * 
- * @since 1.0
- */
-public class ThreadExitRequestImpl extends EventRequestImpl implements ThreadExitRequest {
-
-	private ThreadReference thread;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public ThreadExitRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public synchronized void addThreadFilter(ThreadReference thread) {
-		checkDeleted();
-		this.thread = thread;
-	}
-
-	/**
-	 * Returns the underlying {@link ThreadReference}
-	 * @return the underlying {@link ThreadReference}
-	 */
-	public synchronized ThreadReference thread() {
-		return thread;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/VMDeathRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/VMDeathRequestImpl.java
deleted file mode 100644
index 153cde2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/VMDeathRequestImpl.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDeathRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation for a {@link VMDeathRequest}
- * 
- * @since 1.0
- */
-public class VMDeathRequestImpl extends EventRequestImpl implements VMDeathRequest {
-
-	/**
-	 * Constructor 
-	 * @param vm
-	 */
-	public VMDeathRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/VMDisconnectRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/VMDisconnectRequestImpl.java
deleted file mode 100644
index 7beb14f..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/VMDisconnectRequestImpl.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDisconnectRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link VMDisconnectRequest}
- * 
- * @since 1.0
- */
-public class VMDisconnectRequestImpl extends EventRequestImpl implements VMDisconnectRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public VMDisconnectRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/.classpath b/bundles/org.eclipse.wst.jsdt.debug.transport/.classpath
deleted file mode 100644
index 2fbb7a2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/.project b/bundles/org.eclipse.wst.jsdt.debug.transport/.project
deleted file mode 100644
index e37a4fc..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.jsdt.debug.transport</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.wst.jsdt.debug.transport/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index de9eac3..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,90 +0,0 @@
-#Fri Apr 30 10:04:28 CDT 2010
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
-org.eclipse.jdt.core.compiler.problem.deadCode=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=error
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=error
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=error
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=error
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.jsdt.debug.transport/META-INF/MANIFEST.MF
deleted file mode 100644
index 38eb19e..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,11 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Bundle-Name
-Bundle-SymbolicName: org.eclipse.wst.jsdt.debug.transport
-Bundle-Version: 1.0.100.qualifier
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
-Bundle-Vendor: %providerName
-Export-Package: org.eclipse.wst.jsdt.debug.transport,
- org.eclipse.wst.jsdt.debug.transport.exception,
- org.eclipse.wst.jsdt.debug.transport.packet,
- org.eclipse.wst.jsdt.debug.transport.socket
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/OSGI-INF/l10n/bundle.properties b/bundles/org.eclipse.wst.jsdt.debug.transport/OSGI-INF/l10n/bundle.properties
deleted file mode 100644
index 6acca3c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/OSGI-INF/l10n/bundle.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2010 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-providerName = Eclipse Web Tools Platform
-Bundle-Name = Debug Transport
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/about.html b/bundles/org.eclipse.wst.jsdt.debug.transport/about.html
deleted file mode 100644
index b3906a9..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/about.html
+++ /dev/null
@@ -1,87 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>April 20, 2007</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
-indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-<h3>Third Party Content</h3>
-
-<p>The Content includes items that have been sourced from third parties as set out below. If you 
-did not receive this Content directly from the Eclipse Foundation, the following is provided 
-for informational purposes only, and you should look to the Redistributor&rsquo;s license for 
-terms and conditions of use.</p>
-
-<h4>Ispell 3.1.20</h4>
-
-<p>The plug-in is accompanied by software developed by Geoff Kuenning.  The following files:</p>
-<ul>
-	<li>dictionaries/en_US.dictionary</li>
-	<li>dictionaries/en_GB.dictionary</li>
-</ul>
-
-<p>are based on Ispell 3.1.20.  The home page for Ispell is located at <a href="http://lasr.cs.ucla.edu/geoff/ispell.html" target="_blank">http://lasr.cs.ucla.edu/geoff/ispell.html</a>.</p>
-
-<p>Your use of Ispell 3.1.20 in the plug-in is subject to the terms and conditions of the Ispell license.  A copy of the Ispell license is included in
-<a href="about_files/ispell-license.txt" target="_blank">about_files/ispell-license.txt</a> and is also reproduced below:</p>
-
-<blockquote>
-  Copyright 1993, Geoff Kuenning, Granada Hills, CA<br />
-  All rights reserved.<br />
-<br />
-  Redistribution and use in source and binary forms, with or without<br />
-  modification, are permitted provided that the following conditions<br />
-  are met:<br />
-<br />
-  1. Redistributions of source code must retain the above copyright<br />
-     notice, this list of conditions and the following disclaimer.<br />
-  2. Redistributions in binary form must reproduce the above copyright<br />
-     notice, this list of conditions and the following disclaimer in the<br />
-     documentation and/or other materials provided with the distribution.<br />
-  3. All modifications to the source code must be clearly marked as<br />
-     such.  Binary redistributions based on modified source code<br />
-     must be clearly marked as modified versions in the documentation<br />
-     and/or other materials provided with the distribution.<br />
-  4. All advertising materials mentioning features or use of this software<br />
-     must display the following acknowledgment:<br />
-     This product includes software developed by Geoff Kuenning and<br />
-     other unpaid contributors.<br />
-  5. The name of Geoff Kuenning may not be used to endorse or promote<br />
-     products derived from this software without specific prior<br />
-     written permission.<br />
-<br />
-  THIS SOFTWARE IS PROVIDED BY GEOFF KUENNING AND CONTRIBUTORS ``AS<br />
-  IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT<br />
-  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS<br />
-  FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL GEOFF<br />
-  KUENNING OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,<br />
-  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,<br />
-  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;<br />
-  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER<br />
-  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT<br />
-  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN<br />
-  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE<br />
-  POSSIBILITY OF SUCH DAMAGE.<br />
-</blockquote>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/build.properties b/bundles/org.eclipse.wst.jsdt.debug.transport/build.properties
deleted file mode 100644
index 2c4cfe7..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/build.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-###############################################################################
-# Copyright (c) 2010, 2011 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               OSGI-INF/l10n/bundle.properties,\
-               about.html,\
-               OSGI-INF/,\
-               OSGI-INF/l10n/
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/Connection.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/Connection.java
deleted file mode 100644
index cf94046..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/Connection.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.transport;
-
-import java.io.IOException;
-import java.net.Socket;
-
-import org.eclipse.wst.jsdt.debug.transport.packet.Packet;
-import org.eclipse.wst.jsdt.debug.transport.socket.SocketConnection;
-
-/**
- * Describes a connection to a debugger.
- * <br><br>
- * This interface is intended to be implemented by clients.
- * A default implementation for {@link Socket} communication is provided
- * in the class {@link SocketConnection}.
- * 
- * @since 1.0
- */
-public interface Connection {
-
-	/**
-	 * Returns if the connection is open.
-	 * 
-	 * @return <code>true</code> if the connection is open <code>false</code> otherwise
-	 */
-	public boolean isOpen();
-
-	/**
-	 * Closes the connection.
-	 * 
-	 * @throws IOException if the connection failed to close or is already closed
-	 */
-	public void close() throws IOException;
-
-	/**
-	 * Writes the given packet to the connection
-	 * 
-	 * @param packet the packet to write, <code>null</code> is not accepted
-	 * @throws IOException if the write failed
-	 */
-	public void writePacket(Packet packet) throws IOException;
-
-	/**
-	 * Reads the next packet from the connection. This is non-blocking.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>.
-	 * 
-	 * @return the next {@link Packet} from the connection
-	 * @throws IOException if the connection is prematurely closed or the read failed
-	 */
-	public Packet readPacket() throws IOException;
-
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/Constants.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/Constants.java
deleted file mode 100644
index 08810a7..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/Constants.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.transport;
-
-/**
- * Common constants
- * 
- * @since 1.0
- * 
- * @noextend This interface is not intended to be extended by clients.
- * @noimplement This interface is not intended to be implemented by clients.
- */
-public interface Constants {
-	/**
-	 * Constant representing a colon<br>
-	 * <br>
-	 * Value is: <code>:</code>
-	 */
-	public static final String COLON = ":"; //$NON-NLS-1$
-	/**
-	 * Constant for the text representation of localhost<br>
-	 * <br>
-	 * Value is: <code>localhost</code>
-	 */
-	public static final String LOCALHOST = "localhost"; //$NON-NLS-1$
-	/**
-	 * Constant for the IP address representation of localhost<br>
-	 * <br>
-	 * Value is: <code>127.0.0.1</code> 
-	 */
-	public static final String LOCALHOST_IP = "127.0.0.1"; //$NON-NLS-1$
-	/**
-	 * "port" constant<br>
-	 * <br>
-	 * Value is: <code>port</code>
-	 */
-	public static final String PORT = "port"; //$NON-NLS-1$
-	/**
-	 * UTF-8 encoding constant<br>
-	 * <br>
-	 * Value is: <code>UTF-8</code>
-	 */
-	public static final String UTF_8 = "UTF-8"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/DebugSession.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/DebugSession.java
deleted file mode 100644
index dab4f85..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/DebugSession.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.transport;
-
-import org.eclipse.wst.jsdt.debug.transport.exception.DisconnectedException;
-import org.eclipse.wst.jsdt.debug.transport.exception.TimeoutException;
-import org.eclipse.wst.jsdt.debug.transport.packet.Packet;
-import org.eclipse.wst.jsdt.debug.transport.packet.PacketReceiveManager;
-import org.eclipse.wst.jsdt.debug.transport.packet.PacketSendManager;
-import org.eclipse.wst.jsdt.debug.transport.packet.Response;
-
-/**
- * A {@link DebugSession} controls a {@link PacketSendManager} and {@link PacketReceiveManager}
- * that is used to communicate to a debug target using the underlying {@link Connection}
- * 
- * @since 1.0
- */
-public class DebugSession {
-	
-	/**
-	 * The default receive manager
-	 */
-	private final PacketReceiveManager packetReceiveManager;
-	/**
-	 * The default send manager
-	 */
-	private final PacketSendManager packetSendManager;
-
-	/**
-	 * Constructor
-	 * 
-	 * Starts the send / receive managers on the given {@link Connection}.
-	 * 
-	 * @param connection
-	 */
-	public DebugSession(Connection connection) {
-		packetReceiveManager = new PacketReceiveManager(connection);
-		Thread receiveThread = new Thread(packetReceiveManager, "Debug Session - Receive Manager"); //$NON-NLS-1$
-		receiveThread.setDaemon(true);
-
-		packetSendManager = new PacketSendManager(connection);
-		Thread sendThread = new Thread(packetSendManager, "Debug Session - Send Manager"); //$NON-NLS-1$
-		sendThread.setDaemon(true);
-
-		packetReceiveManager.setPartnerThread(sendThread);
-		packetSendManager.setPartnerThread(receiveThread);
-
-		receiveThread.start();
-		sendThread.start();
-	}
-
-	/**
-	 * Stops the debug sessions and disconnects the send / receive managers
-	 */
-	public void dispose() {
-		packetReceiveManager.disconnect();
-		packetSendManager.disconnect();
-	}
-
-	/**
-	 * Sends the given {@link Packet} using the underlying {@link PacketSendManager}.
-	 * 
-	 * @param packet the {@link Packet} to send, <code>null</code> is not accepted
-	 * @throws DisconnectedException if the {@link PacketSendManager} has been disconnected
-	 */
-	public void send(Packet packet) throws DisconnectedException {
-		if(packet == null) {
-			throw new IllegalArgumentException("You cannot send a null request"); //$NON-NLS-1$
-		}
-		packetSendManager.sendPacket(packet);
-	}
-	
-	/**
-	 * Waits for the given timeout for a {@link Response} response in the given sequence 
-	 * from the {@link PacketReceiveManager}.<br>
-	 * <br>
-	 * This method does not return <code>null</code> - one of the listed exceptions will be thrown 
-	 * if a {@link Response} cannot be returned.
-	 * 
-	 * @param timeout the amount of time in milliseconds to wait to a {@link Response}
-	 * @return a new {@link Response} from the {@link PacketReceiveManager} never <code>null</code>
-	 * @throws TimeoutException if the timeout lapses with no {@link Response} returned
-	 * @throws DisconnectedException if the {@link PacketReceiveManager} has been disconnected
-	 */
-	public Response receiveResponse(int requestSequence, int timeout) throws TimeoutException, DisconnectedException {
-		return packetReceiveManager.getResponse(requestSequence, timeout);
-	}
-
-	/**
-	 * Waits for the given timeout for a {@link Packet} from the {@link PacketReceiveManager}.
-	 * If a {@link Packet} is returned it is guaranteed it can be cast to the type asked for.
-	 * <br><br>
-	 * This method does not return <code>null</code> - one of the listed exceptions will be thrown 
-	 * if a {@link Packet} cannot be returned.
-	 * 
-	 * @param type the type of the packet to get
-	 * @param timeout the amount of time in milliseconds to wait for a {@link Packet}
-	 * 
-	 * @return a new {@link Packet} from the {@link PacketReceiveManager} never <code>null</code>
-	 * @throws TimeoutException if the timeout lapses with no {@link Packet} returned
-	 * @throws DisconnectedException if the {@link PacketReceiveManager} has been disconnected
-	 */
-	public Packet receive(String type, int timeout) throws TimeoutException, DisconnectedException {
-		return packetReceiveManager.getCommand(type, timeout);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/ListenerKey.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/ListenerKey.java
deleted file mode 100644
index 10c03d0..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/ListenerKey.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.transport;
-
-import java.net.Socket;
-
-import org.eclipse.wst.jsdt.debug.transport.socket.SocketListenerKey;
-
-/**
- * Describes a key for a {@link TransportService} that uniquely identifies an address to communicate with.
- * <br><br>
- * This interface is intended to be implemented by clients. A default
- * implementation for {@link Socket} communication is provided in the class
- * {@link SocketListenerKey}.
- * 
- * @since 1.0
- */
-public interface ListenerKey {
-	/**
-	 * Returns the address string for the listener.
-	 * <br><br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the address to try and communicate with, never <code>null</code>
-	 */
-	public String address();
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/TransportService.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/TransportService.java
deleted file mode 100644
index af0d79a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/TransportService.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.transport;
-
-import java.io.IOException;
-import java.net.Socket;
-
-import org.eclipse.wst.jsdt.debug.transport.socket.SocketTransportService;
-
-/**
- * A transport service is used to attach and / or listen to a 
- * {@link Connection}.
- * <br><br>
- * This interface is intended to be implemented by clients.
- * A default implementation for {@link Socket} communication is provided in
- * the class {@link SocketTransportService}.
- * 
- * @since 1.0
- */
-public interface TransportService {
-
-	/**
-	 * Registers that this service should begin listening to the given address
-	 * 
-	 * @param address the address to listen on - e.g. localhost:12000
-	 * @return the key that uniquely identifies this service
-	 * @throws IOException
-	 */
-	public ListenerKey startListening(String address) throws IOException;
-
-	/**
-	 * Stops listening for the given key
-	 * 
-	 * @param listenerKey
-	 * @throws IOException
-	 */
-	public void stopListening(ListenerKey listenerKey) throws IOException;
-
-	/**
-	 * Listens for a {@link Connection} to be made to and accepts it. The method can block until a {@link Connection} is made.
-	 * 
-	 * @param listenerKey
-	 * @param attachTimeout
-	 * @param handshakeTimeout
-	 * @return the resulting {@link Connection}
-	 * @throws IOException
-	 */
-	public Connection accept(ListenerKey listenerKey, long attachTimeout, long handshakeTimeout) throws IOException;
-
-	/**
-	 * Attaches to the given address and returns the resulting {@link Connection}. This method can block until a {@link Connection} is made
-	 * 
-	 * @param address
-	 * @param attachTimeout
-	 * @param handshakeTimeout
-	 * @return the resulting {@link Connection}
-	 * @throws IOException
-	 */
-	public Connection attach(String address, long attachTimeout, long handshakeTimeout) throws IOException;
-
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/exception/DisconnectedException.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/exception/DisconnectedException.java
deleted file mode 100644
index fc69a5c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/exception/DisconnectedException.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.transport.exception;
-
-import org.eclipse.wst.jsdt.debug.transport.packet.PacketReceiveManager;
-import org.eclipse.wst.jsdt.debug.transport.packet.PacketSendManager;
-
-/**
- * A {@link DisconnectedException} is thrown by either the {@link PacketSendManager}
- * or the {@link PacketReceiveManager} when a request is made and they have been disconnected
- * 
- * @since 1.0
- */
-public final class DisconnectedException extends Exception {
-
-	private static final long serialVersionUID = 3233213787459625769L;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param message
-	 * @param exception
-	 */
-	public DisconnectedException(String message, Exception exception) {
-		super(message, exception);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/exception/TimeoutException.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/exception/TimeoutException.java
deleted file mode 100644
index 052dde8..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/exception/TimeoutException.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.transport.exception;
-
-import org.eclipse.wst.jsdt.debug.transport.packet.Packet;
-import org.eclipse.wst.jsdt.debug.transport.packet.PacketReceiveManager;
-import org.eclipse.wst.jsdt.debug.transport.packet.PacketSendManager;
-
-/**
- * This exception is thrown if the {@link PacketSendManager} or {@link PacketReceiveManager}
- * times out while waiting for a {@link Packet}
- * 
- * @since 1.0
- */
-public final class TimeoutException extends Exception {
-	
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param message the message for the exception
-	 */
-	public TimeoutException(String message) {
-		super(message);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/Event.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/Event.java
deleted file mode 100644
index 61d9194..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/Event.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.transport.packet;
-
-import java.util.Map;
-
-/**
- * Describes the general form of an event {@link Packet}
- * 
- * @since 1.0
- */
-public interface Event extends Packet {
-	/**
-	 * Returns the name of the event.
-	 * <br><br>
-	 * This method cannot return <code>null</code>.
-	 * 
-	 * @return the name of the event
-	 */
-	public String getEvent();
-
-	/**
-	 * Returns the body of the {@link Event}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>, if there is no body
-	 * an empty {@link Map} is returned.
-	 *  
-	 * @return the body of the {@link Event} or an empty {@link Map} never <code>null</code>
-	 */
-	public Map getBody();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/Packet.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/Packet.java
deleted file mode 100644
index 87e7d3a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/Packet.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.transport.packet;
-
-import java.util.Map;
-
-/**
- * Describes the general form of a packet
- * 
- * @since 1.0
- */
-public interface Packet {
-
-	/**
-	 * Returns the type of this packet. Where a <code>type</code> can be any string describing the type of
-	 * packet this is. For example a type could be <code>request</code> or <code>response</code>.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the type, never <code>null</code>
-	 */
-	public String getType();
-	
-	/**
-	 * Returns the JSON representation of this packet. 
-	 * Implementors are free to compose the JSON however they wish.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * @return the composed JSON map
-	 */
-	public Map toJSON();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/PacketManager.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/PacketManager.java
deleted file mode 100644
index d93fe02..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/PacketManager.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.transport.packet;
-
-import java.io.IOException;
-
-import org.eclipse.wst.jsdt.debug.transport.Connection;
-
-/**
- * Default manager for sending / receiving packets to / from the connected {@link VirtualMachine}
- * 
- * @since 1.0
- */
-public abstract class PacketManager implements Runnable {
-
-	/**
-	 * Connector that performs IO to Virtual Machine.
-	 */
-	private final Connection connection;
-	/**
-	 * Thread that handles the communication the other way (e.g. if we are sending, the receiving thread).
-	 */
-	private volatile Thread partnerThread;
-	/**
-	 * The disconnected exception, if there is one
-	 */
-	private volatile IOException disconnectedException;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param connection the connection to communicate on, <code>null</code> is not accepted
-	 */
-	protected PacketManager(Connection connection) {
-		if(connection == null) {
-			throw new IllegalArgumentException("You cannot create a new PacketManager with a null Connection"); //$NON-NLS-1$
-		}
-		this.connection = connection;
-	}
-
-	/**
-	 * Returns the {@link Connection} this manager is communicating on.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the backing {@link Connection} to the {@link VirtualMachine}
-	 */
-	public Connection getConnection() {
-		return this.connection;
-	}
-
-	/**
-	 * Used to indicate that an IO exception occurred, closes the {@link Connection} 
-	 * to the {@link VirtualMachine}.
-	 * 
-	 * @param disconnectedException the IOException that occurred or <code>null</code>
-	 */
-	public void disconnect(IOException exception) {
-		this.disconnectedException = exception;
-		disconnect();
-	}
-
-	/**
-	 * Closes the {@link Connection} to the {@link VirtualMachine}.
-	 */
-	public void disconnect() {
-		try {
-			this.connection.close();
-		} catch (IOException e) {
-			this.disconnectedException = e;
-		}
-		if (this.partnerThread != null) {
-			this.partnerThread.interrupt();
-		}
-	}
-
-	/**
-	 * Returns if the manager is disconnected or not.
-	 * 
-	 * @return <code>true</code> if the manager is disconnected false otherwise
-	 */
-	public boolean isDisconnected() {
-		return this.connection == null || !this.connection.isOpen();
-	}
-
-	/**
-	 * Returns the underlying {@link IOException} from a disconnect.<br>
-	 * <br>
-	 * This method can return <code>null</code> if the manager has not been disconnected
-	 * 
-	 * @return the underlying {@link IOException} from a disconnect or <code>null</code> if none
-	 */
-	public IOException getDisconnectedException() {
-		return this.disconnectedException;
-	}
-
-	/**
-	 * Assigns thread of partner, to be notified if we have an {@link IOException}.
-	 * 
-	 * @param thread the new partner thread, <code>null</code> is not accepted
-	 */
-	public void setPartnerThread(Thread thread) {
-		if(thread == null) {
-			throw new IllegalArgumentException("You cannot send a null partner thread on the PacketManager"); //$NON-NLS-1$
-		}
-		this.partnerThread = thread;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/PacketReceiveManager.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/PacketReceiveManager.java
deleted file mode 100644
index 2b75a32..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/PacketReceiveManager.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.transport.packet;
-
-import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.ListIterator;
-
-import org.eclipse.wst.jsdt.debug.transport.Connection;
-import org.eclipse.wst.jsdt.debug.transport.exception.DisconnectedException;
-import org.eclipse.wst.jsdt.debug.transport.exception.TimeoutException;
-
-/**
- * Default implementation of {@link PacketManager} for receiving packets from the 
- * {@link VirtualMachine}
- * 
- * @since 1.0
- */
-public final class PacketReceiveManager extends PacketManager {
-
-	/**
-	 * Generic timeout value for not blocking. <br>
-	 * Value is: <code>0</code>
-	 */
-	public static final int TIMEOUT_NOT_BLOCKING = 0;
-	/**
-	 * Generic timeout value for infinite timeout. <br>
-	 * Value is: <code>-1</code>
-	 */
-	public static final int TIMEOUT_INFINITE = -1;
-	/**
-	 * List of Command packets received from Virtual Machine.
-	 */
-	private List commandPackets = new LinkedList();
-	/**
-	 * List of Reply packets received from Virtual Machine.
-	 */
-	private List responsePackets = new LinkedList();
-	/**
-	 * List of Packets that have timed out already. Maintained so that responses can be discarded if/when they are received.
-	 */
-	private List timedOutPackets = new ArrayList();
-
-	/**
-	 * Constructor
-	 * 
-	 * @param connection the underlying connection to communicate on, <code>null</code> is not accepted
-	 */
-	public PacketReceiveManager(Connection connection) {
-		super(connection);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.PacketManager#disconnect()
-	 */
-	public void disconnect() {
-		super.disconnect();
-		synchronized (this.commandPackets) {
-			this.commandPackets.notifyAll();
-		}
-		synchronized (this.responsePackets) {
-			this.responsePackets.notifyAll();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Runnable#run()
-	 */
-	public void run() {
-		try {
-			while (!isDisconnected()) {
-				// Read a packet from the input stream.
-				readAvailablePacket();
-			}
-		}
-		// if the remote runtime is interrupted, drop the connection and clean up, don't wait for it to happen on its own
-		catch (InterruptedIOException e) {
-			disconnect(e);
-		} catch (IOException e) {
-			disconnect(e);
-		}
-	}
-
-	/**
-	 * Returns a specified command {@link Packet} from the {@link VirtualMachine}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code> an exception is thrown if the desired packet cannot
-	 * be returned.
-	 * 
-	 * @param type the type of the packet to get
-	 * @param timeToWait the amount of time to wait for the {@link Packet} to arrive
-	 * 
-	 * @return the specified command packet never <code>null</code>
-	 * @throws TimeoutException if the request times out
-	 * @throws DisconnectedException if the manager is disconnected
-	 */
-	public Packet getCommand(String type, long timeToWait) throws TimeoutException, DisconnectedException {
-		synchronized (this.commandPackets) {
-			long remainingTime = timeToWait;
-			// Wait until command is available.
-			//even if disconnected try to send the remaining events
-			while (!isDisconnected() || !this.commandPackets.isEmpty()) {
-				Packet packet = removeCommandPacket(type);
-				if (packet != null)
-					return packet;
-
-				if (remainingTime < 0 && timeToWait != TIMEOUT_INFINITE)
-					break;
-
-				long timeBeforeWait = System.currentTimeMillis();
-				try {
-					waitForPacketAvailable(remainingTime, this.commandPackets);
-				} catch (InterruptedException e) {
-					break;
-				}
-				long waitedTime = System.currentTimeMillis() - timeBeforeWait;
-				remainingTime -= waitedTime;
-			}
-		}
-		// Check for an IO Exception.
-		if (isDisconnected()) {
-			throw new DisconnectedException("Runtime disconnected", getDisconnectedException()); //$NON-NLS-1$
-		}
-		// Check for a timeout.
-		throw new TimeoutException("Timed out waiting for command packet: " + type); //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns a specified response packet from the {@link VirtualMachine}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code> an exception is thrown if the desired response cannot
-	 * be returned.
-	 * 
-	 * @param requestSequence the sequence of the response to acquire
-	 * @param timeToWait the amount of time to wait for the {@link Response}
-	 * 
-	 * @return a specified response packet from the {@link VirtualMachine} never <code>null</code>
-	 * @throws TimeoutException if the request times out
-	 * @throws DisconnectedException if the manager is disconnected
-	 */
-	public Response getResponse(int requestSequence, long timeToWait) throws TimeoutException, DisconnectedException {
-		synchronized (this.responsePackets) {
-			long remainingTime = timeToWait;
-			// Wait until command is available.
-			while (!isDisconnected()) {
-				Response response = removeResponsePacket(requestSequence);
-				if (response != null)
-					return response;
-
-				if (remainingTime < 0 && timeToWait != TIMEOUT_INFINITE)
-					break;
-
-				long timeBeforeWait = System.currentTimeMillis();
-				try {
-					waitForPacketAvailable(remainingTime, this.responsePackets);
-				} catch (InterruptedException e) {
-					break;
-				}
-				long waitedTime = System.currentTimeMillis() - timeBeforeWait;
-				remainingTime -= waitedTime;
-			}
-		}
-		// Check for an IO Exception.
-		if (isDisconnected()) {
-			throw new DisconnectedException("Runtime disconnected", getDisconnectedException()); //$NON-NLS-1$
-		}
-
-		synchronized (this.responsePackets) {
-			this.timedOutPackets.add(new Integer(requestSequence));
-		}
-		throw new TimeoutException("Timed out waiting for packet: " + requestSequence); //$NON-NLS-1$
-	}
-
-	/**
-	 * Wait for an available packet from the Virtual Machine.
-	 */
-	private void waitForPacketAvailable(long timeToWait, Object lock) throws InterruptedException {
-		if (timeToWait == 0)
-			return;
-		else if (timeToWait < 0)
-			lock.wait();
-		else
-			lock.wait(timeToWait);
-	}
-
-	/**
-	 * Removes and returns the command packet for the given type or <code>null</code> if there is no command packet for the given type.
-	 * 
-	 * @param type
-	 * @return The command packet for the given type that has been removed
-	 */
-	private Packet removeCommandPacket(String type) {
-		ListIterator iter = this.commandPackets.listIterator();
-		while (iter.hasNext()) {
-			Packet packet = (Packet) iter.next();
-			if (type == null || packet.getType().equals(type)) {
-				iter.remove();
-				return packet;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Removes and returns the response packet with the given request sequence or <code>null</code> if there is no response packet with the given request sequence
-	 * 
-	 * @param requestSequence
-	 * @return the response packet with the given request sequence that has been removed
-	 */
-	private Response removeResponsePacket(int requestSequence) {
-		ListIterator iter = this.responsePackets.listIterator();
-		while (iter.hasNext()) {
-			Response response = (Response) iter.next();
-			if (requestSequence == response.getRequestSequence()) {
-				iter.remove();
-				return response;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Adds the given command packet to the listing of command packets. This method is a no-op if the given packet is <code>null</code>
-	 * 
-	 * @param packet
-	 */
-	private void addCommandPacket(Packet packet) {
-		if (packet == null) {
-			return;
-		}
-		synchronized (this.commandPackets) {
-			this.commandPackets.add(packet);
-			this.commandPackets.notifyAll();
-		}
-	}
-
-	/**
-	 * Adds the given response packet to the listing of response packets. This method is a no-op if the given packet is <code>null</code>
-	 * 
-	 * @param response
-	 */
-	private void addResponsePacket(Response response) {
-		if (response == null) {
-			return;
-		}
-		synchronized (this.responsePackets) {
-			if (!this.timedOutPackets.isEmpty()) {
-				Integer requestSeq = new Integer(response.getRequestSequence());
-				if (this.timedOutPackets.remove(requestSeq))
-					return; // already timed out. No need to keep this one
-			}
-			this.responsePackets.add(response);
-			this.responsePackets.notifyAll();
-		}
-	}
-
-	/**
-	 * Reads the next packet from the underlying connection and adds it to the correct packet listing.
-	 * 
-	 * @throws IOException
-	 */
-	private void readAvailablePacket() throws IOException {
-		// Read a packet from the Input Stream.
-		if(getConnection().isOpen()) {
-			Packet packet = getConnection().readPacket();
-			if (packet instanceof Response) {
-				addResponsePacket((Response) packet);
-			} else {
-				addCommandPacket(packet);
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/PacketSendManager.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/PacketSendManager.java
deleted file mode 100644
index b769639..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/PacketSendManager.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.transport.packet;
-
-import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.wst.jsdt.debug.transport.Connection;
-import org.eclipse.wst.jsdt.debug.transport.exception.DisconnectedException;
-
-
-
-/**
- * Default implementation of {@link PacketManager} for sending packets to the 
- * {@link VirtualMachine}
- * 
- * @since 1.0
- */
-public final class PacketSendManager extends PacketManager {
-	
-	/** 
-	 * List of packets to be sent to Virtual Machine 
-	 */
-	private final List outgoingPackets = new ArrayList();
-
-	/**
-	 * Create a new thread that send packets to the {@link VirtualMachine}.
-	 * 
-	 * @param connection the underlying connection to communicate on, <code>null</code> is not accepted
-	 */
-	public PacketSendManager(Connection connection) {
-		super(connection);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.PacketManager#disconnect()
-	 */
-	public void disconnect() {
-		super.disconnect();
-		synchronized (outgoingPackets) {
-			outgoingPackets.notifyAll();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see java.lang.Runnable#run()
-	 */
-	public void run() {
-		while (!isDisconnected()) {
-			try {
-				sendAvailablePackets();
-			}
-			// in each case if the remote runtime fails, or has been interrupted, disconnect and force a clean up, don't wait for it to happen
-			catch (InterruptedException e) {
-				disconnect();
-			} catch (InterruptedIOException e) {
-				disconnect(e);
-			} catch (IOException e) {
-				disconnect(e);
-			}
-		}
-	}
-
-	/**
-	 * Sends the given {@link Packet}.
-	 * 
-	 * @param packet the packet to send, <code>null</code> is not accepted
-	 * 
-	 * @throws DisconnectedException
-	 */
-	public void sendPacket(Packet packet) throws DisconnectedException {
-		if(packet == null) {
-			throw new IllegalArgumentException("You cannot send a null packet"); //$NON-NLS-1$
-		}
-		if (isDisconnected()) {
-			throw new DisconnectedException("Runtime disconnected", getDisconnectedException()); //$NON-NLS-1$
-		}
-		synchronized (outgoingPackets) {
-			// Add packet to list of packets to send.
-			outgoingPackets.add(packet);
-			// Notify PacketSendThread that data is available.
-			outgoingPackets.notifyAll();
-		}
-	}
-
-	/**
-	 * Send available packets to the Virtual Machine.
-	 */
-	private void sendAvailablePackets() throws InterruptedException, IOException {
-		Object[] packetsToSend;
-		synchronized (outgoingPackets) {
-			while (outgoingPackets.size() == 0) {
-				outgoingPackets.wait();
-			}
-			packetsToSend = outgoingPackets.toArray();
-			outgoingPackets.clear();
-		}
-
-		// Put available packets on Output Stream.
-		for (int i = 0; i < packetsToSend.length; i++) {
-			getConnection().writePacket((Packet) packetsToSend[i]);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/Request.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/Request.java
deleted file mode 100644
index 91a6e9a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/Request.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.transport.packet;
-
-import java.util.Map;
-
-/**
- * Describes the general form of a request {@link Packet}
- * 
- * @since 1.0
- */
-public interface Request extends Packet {
-
-	/**
-	 * Returns the command that this {@link Request} was created for.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the underlying command, never <code>null</code>
-	 */
-	public String getCommand();
-
-	/**
-	 * Returns the sequence for this request.
-	 * 
-	 * @return the request sequence
-	 */
-	public int getSequence();
-	
-	/**
-	 * Returns the complete collection of JSON arguments in the {@link Request}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>, an empty map will be returned
-	 * if there are no arguments.
-	 * 
-	 * @return the arguments or an empty map never <code>null</code>
-	 */
-	public Map getArguments();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/Response.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/Response.java
deleted file mode 100644
index d4340a2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/packet/Response.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.transport.packet;
-
-import java.util.Map;
-
-/**
- * Describes the general form of a response {@link Packet}
- * 
- * @since 1.0
- */
-public interface Response extends Packet {
-
-	/**
-	 * Returns the name of the original issued command.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the name of the original issued command, never <code>null</code>
-	 */
-	public String getCommand();
-	
-	/**
-	 * Returns the request sequence
-	 * 
-	 * @return the request sequence
-	 */
-	public int getRequestSequence();
-	
-	/**
-	 * Returns the body of the {@link Response}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>, if there is no body
-	 * an empty {@link Map} is returned.
-	 *  
-	 * @return the body of the {@link Response} or an empty {@link Map} never <code>null</code>
-	 */
-	public Map getBody();
-
-	/**
-	 * Returns <code>true</code> if the original {@link Request} was successful
-	 * 
-	 * @return <code>true</code> if the original {@link Request} was successful, <code>false</code> otherwise
-	 */
-	public boolean isSuccess();
-	
-	/**
-	 * Returns <code>true</code> if the issued command left the connected VM in a running state.
-	 * 
-	 * @return <code>true</code> if the underlying command is running, <code>false</code> otherwise
-	 */
-	public boolean isRunning();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/socket/SocketConnection.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/socket/SocketConnection.java
deleted file mode 100644
index c26c3b8..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/socket/SocketConnection.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.transport.socket;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.io.Reader;
-import java.io.Writer;
-import java.net.Socket;
-
-import org.eclipse.wst.jsdt.debug.transport.Connection;
-import org.eclipse.wst.jsdt.debug.transport.Constants;
-import org.eclipse.wst.jsdt.debug.transport.packet.Packet;
-
-/**
- * A specialized {@link Connection} that communicates using {@link Socket}s
- * 
- * @since 1.0
- */
-public abstract class SocketConnection implements Connection {
-
-	private Writer writer;
-	private Reader reader;
-	private Socket socket;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param socket the underlying {@link Socket}, <code>null</code> is not accepted
-	 * 
-	 * @throws IOException
-	 */
-	public SocketConnection(Socket socket) throws IOException {
-		if(socket == null) {
-			throw new IllegalArgumentException("You cannot create a new SocketConnection on a null Socket"); //$NON-NLS-1$
-		}
-		this.socket = socket;
-		writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), Constants.UTF_8));
-		reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), Constants.UTF_8));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.Connection#isOpen()
-	 */
-	public boolean isOpen() {
-		return !socket.isClosed();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.Connection#close()
-	 */
-	public void close() throws IOException {
-		socket.close();
-	}
-	
-	/**
-	 * Returns the {@link Writer} used to write to the underlying {@link Socket}.
-	 * <br><br>
-	 * This method will never return <code>null</code> 
-	 * 
-	 * @return the writer for the socket, never <code>null</code>
-	 */
-	public Writer getWriter() {
-		return writer;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.Connection#writePacket(org.eclipse.wst.jsdt.debug.transport.packet.Packet)
-	 */
-	public abstract void writePacket(Packet packet) throws IOException;
-
-	/**
-	 * Returns the {@link Reader} used to read from the underlying {@link Socket}.
-	 * <br><br>
-	 * This method will never return <code>null</code> 
-	 * 
-	 * @return the reader for the socket, never <code>null</code>
-	 */
-	public Reader getReader() {
-		return reader;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.Connection#readPacket()
-	 */
-	public abstract Packet readPacket() throws IOException;
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/socket/SocketListenerKey.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/socket/SocketListenerKey.java
deleted file mode 100644
index 81c242d..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/socket/SocketListenerKey.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.transport.socket;
-
-import org.eclipse.wst.jsdt.debug.transport.ListenerKey;
-
-/**
- * Key implementation for a {@link SocketTransportService}
- * 
- * @since 1.0
- */
-public final class SocketListenerKey implements ListenerKey {
-
-	private String address;
-
-	/**
-	 * Constructor
-	 * @param address
-	 */
-	public SocketListenerKey(String address) {
-		this.address = address;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.TransportService.ListenerKey#address()
-	 */
-	public String address() {
-		return address;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/socket/SocketTransportService.java b/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/socket/SocketTransportService.java
deleted file mode 100644
index 66c029e..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.transport/src/org/eclipse/wst/jsdt/debug/transport/socket/SocketTransportService.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.transport.socket;
-
-import java.io.IOException;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.transport.Connection;
-import org.eclipse.wst.jsdt.debug.transport.Constants;
-import org.eclipse.wst.jsdt.debug.transport.ListenerKey;
-import org.eclipse.wst.jsdt.debug.transport.TransportService;
-
-/**
- * Implementation of a {@link TransportService} that using a {@link Socket} for communication
- * 
- * @since 1.0
- */
-public abstract class SocketTransportService implements TransportService {
-
-	/**
-	 * Map of {@link ListenerKey} to {@link ServerSocket}s
-	 */
-	private Map listeners = new HashMap();
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.TransportService#startListening(java.lang.String)
-	 */
-	public synchronized ListenerKey startListening(String address) throws IOException {
-		String host = null;
-		int port = 0;
-		if (address != null) {
-			String[] strings = address.split(Constants.COLON);
-			if (strings.length == 2) {
-				host = strings[0];
-				port = Integer.parseInt(strings[1]);
-			} else {
-				port = Integer.parseInt(strings[0]);
-			}
-		}
-		if (host == null) {
-			host = Constants.LOCALHOST;
-		}
-		ListenerKey key = new SocketListenerKey(host + Constants.COLON + port);
-		ServerSocket serverSocket = new ServerSocket(port);
-		listeners.put(key, serverSocket);
-		return key;
-
-	};
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.TransportService#stopListening(org.eclipse.wst.jsdt.debug.transport.TransportService.ListenerKey)
-	 */
-	public void stopListening(ListenerKey key) throws IOException {
-		ServerSocket serverSocket = (ServerSocket) listeners.remove(key);
-		if (serverSocket != null) {
-			serverSocket.close();
-		}
-	}
-
-	/**
-	 * Returns the {@link ServerSocket} mapped to the given {@link ListenerKey} or 
-	 * <code>null</code> if the mapping does not exist
-	 * 
-	 * @param key the {@link ListenerKey} to get the {@link ServerSocket} for
-	 * @return the mapped {@link ServerSocket} or <code>null</code>
-	 */
-	public final ServerSocket getServerSocket(ListenerKey key) {
-		synchronized (listeners) {
-			return (ServerSocket) listeners.get(key);
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.TransportService#accept(org.eclipse.wst.jsdt.debug.transport.TransportService.ListenerKey, long, long)
-	 */
-	public Connection accept(ListenerKey key, long attachTimeout, long handshakeTimeout) throws IOException {
-		ServerSocket serverSocket = getServerSocket(key);
-		if (serverSocket == null) {
-			throw new IllegalStateException("Accept failed. Not listening for address: key.address()"); //$NON-NLS-1$
-		}
-		int timeout = (int) attachTimeout;
-		if (timeout > 0) {
-			if (timeout > Integer.MAX_VALUE) {
-				timeout = Integer.MAX_VALUE; // approximately 25 days!
-			}
-			serverSocket.setSoTimeout(timeout);
-		}
-		Connection connection = getConnection(serverSocket.accept());
-		handleAccept(connection);
-		return connection;
-	}
-
-	/**
-	 * This method allows implementors to perform specific actions immediately following
-	 * a successful accept for {@link Socket} communication (the socket has been successfully opened).
-	 * 
-	 * @param connection the connection that just opened
-	 * @throws IOException
-	 */
-	public abstract void handleAccept(Connection connection) throws IOException;
-	
-	/**
-	 * Returns the {@link SocketConnection} for the given {@link Socket}.
-	 * <br><br>
-	 * This method cannot return <code>null</code>, if a connection cannot be created
-	 * an {@link IOException} must be thrown.
-	 * 
-	 * @param socket the socket to get the connection for
-	 * @return the {@link SocketConnection} for the given {@link Socket}, never <code>null</code>
-	 * @throws IOException
-	 */
-	public abstract SocketConnection getConnection(Socket socket) throws IOException;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.TransportService#attach(java.lang.String, long, long)
-	 */
-	public Connection attach(String address, long attachTimeout, long handshakeTimeout) throws IOException {
-		String host = null;
-		int port = 0;
-		if (address != null) {
-			String[] strings = address.split(Constants.COLON);
-			if (strings.length == 2) {
-				host = strings[0];
-				port = Integer.parseInt(strings[1]);
-			} else {
-				port = Integer.parseInt(strings[0]);
-			}
-		}
-		if (host == null) {
-			host = Constants.LOCALHOST;
-		}
-		Connection connection = getConnection(new Socket(host, port));
-		handleAttach(connection);
-		return connection;
-	}
-	
-	/**
-	 * This method allows implementors to perform specific actions immediately following
-	 * a successful attach for {@link Socket} communication (the socket has been successfully opened).
-	 * 
-	 * @param connection the connection that just opened
-	 * @throws IOException
-	 */
-	public abstract void handleAttach(Connection connection) throws IOException;
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/.classpath b/bundles/org.eclipse.wst.jsdt.debug.ui/.classpath
deleted file mode 100644
index 2fbb7a2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/.project b/bundles/org.eclipse.wst.jsdt.debug.ui/.project
deleted file mode 100644
index e73355d..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.jsdt.debug.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.wst.jsdt.debug.ui/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index de9eac3..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,90 +0,0 @@
-#Fri Apr 30 10:04:28 CDT 2010
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
-org.eclipse.jdt.core.compiler.problem.deadCode=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=error
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=error
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=error
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=error
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.jsdt.debug.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index b7071ba..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,35 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %bundleName.name
-Bundle-SymbolicName: org.eclipse.wst.jsdt.debug.ui;singleton:=true
-Bundle-Version: 1.0.200.qualifier
-Bundle-Activator: org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptDebugUIPlugin
-Bundle-Vendor: %providerName
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.debug.ui,
- org.eclipse.wst.jsdt.debug.core,
- org.eclipse.wst.jsdt.core,
- org.eclipse.ui.ide,
- org.eclipse.core.filesystem,
- org.eclipse.jface.text,
- org.eclipse.ui.workbench.texteditor,
- org.eclipse.wst.jsdt.ui,
- org.eclipse.ui.editors,
- org.eclipse.core.expressions,
- org.eclipse.wst.sse.ui;bundle-version="1.3.100"
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
-Bundle-ActivationPolicy: lazy;exclude:="org.eclipse.wst.jsdt.debug.internal.ui.filters"
-Export-Package: org.eclipse.wst.jsdt.debug.internal.ui;x-friends:="org.eclipse.wst.jsdt.debug.rhino.ui",
- org.eclipse.wst.jsdt.debug.internal.ui.actions;x-internal:=true,
- org.eclipse.wst.jsdt.debug.internal.ui.adapters;x-internal:=true,
- org.eclipse.wst.jsdt.debug.internal.ui.breakpoints;x-internal:=true,
- org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.details;x-internal:=true,
- org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.editors;x-internal:=true,
- org.eclipse.wst.jsdt.debug.internal.ui.dialogs;x-friends:="org.eclipse.wst.jsdt.debug.rhino.ui",
- org.eclipse.wst.jsdt.debug.internal.ui.display;x-internal:=true,
- org.eclipse.wst.jsdt.debug.internal.ui.eval;x-internal:=true,
- org.eclipse.wst.jsdt.debug.internal.ui.launching;x-internal:=true,
- org.eclipse.wst.jsdt.debug.internal.ui.preferences;x-internal:=true,
- org.eclipse.wst.jsdt.debug.internal.ui.source;x-internal:=true,
- org.eclipse.wst.jsdt.debug.internal.ui.source.contentassist;x-internal:=true
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/OSGI-INF/l10n/bundle.properties b/bundles/org.eclipse.wst.jsdt.debug.ui/OSGI-INF/l10n/bundle.properties
deleted file mode 100644
index 5b06d59..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/OSGI-INF/l10n/bundle.properties
+++ /dev/null
@@ -1,61 +0,0 @@
-###############################################################################
-# Copyright (c) 2010, 2011 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-launchConfigurationTabGroup.description = Launch tab group for Javascript debugging
-togglebreakpointRulerAction.name = Toggle Breakpoint
-breakpointpropertiesRulerAction.name = Breakpoint &Properties
-breakpointpropertiesRulerAction.tooltip = Displays the properties dialog for the selected breakpoint
-togglebreakpointenablementRulerAction.name = To&ggle Breakpoint Enablement
-togglebreakpointenablementRulerAction.tooltip = Allows the enabled state of the breakpoint to be changed
-breakpointproperties.command.name = JavaScript Breakpoint Properties
-breakpointproperties.command.description = View and edit the properties for a given JavaScript breakpoint
-breakpointproperties.page.name = Breakpoint Properties
-addScriptloadBreakpointAction.name = Add Script Load Breakpoint
-breakpointMarkerCategory.name = JavaScript Breakpoints
-suspendPolicy.label=&Suspend Target
-suspendPolicy.tooltip=Changes the suspend policy of the selected breakpoint(s)
-hitCount.label=&Hit Count...
-exitAction.label=E&xit
-entryAction.label=Entr&y
-providerName = Eclipse Web Tools Platform
-bundleName.name = JavaScript Debug UI
-breakpointPropertiesAction.name = Breakpoint P&roperties
-toggleFunctionBreakpointAction.name = Toggle Function Breakpoint
-toggleFunctionBreakpointAction.tooltip = Toggle a breakpoint on the selected function
-showAllScripts.name = Show All Scripts
-showAllScripts.tooltip = Shows or hides all scripts loaded in the visible targets
-suspendOnExceptions.name = Suspend On JavaScript Exceptions
-suspendOnExceptions.tooltip = Suspend on all JavaScript exceptions
-suspendForAllScriptLoadsAction.name = Suspend For All Script Loads
-suspendForAllScriptLoadsAction.tooltip = Suspends when any script is loaded
-javascriptMenu.name = JavaScript
-javascriptLaunchShortcut.description = Allows fast connection and debugging of JavaScript
-javascriptLaunchShortcut.label = Debug JavaScript...
-openSourceObjectAction.name = Open Source
-openSourceObjectAction.tooltip = Shows the JavaScript source for the selected script element
-commandCategory.description = Tooling for debugging JavaScript
-commandCategory.name = JavaScript Debug
-
-showFunctionVarAction.label = Show function variables
-showFunctionVarAction.tooltip = Show or hide function variables
-showThisVarAction.label = Show 'this' variable
-showThisVarAction.tooltip = Show or hide the this variable
-showProtoVarAction.label = Show proto variables
-showProtoVarAction.tooltip = Show or hide proto variables
-
-evaluateAction.label = E&valuate
-evaluateCommand.label = Evaluate
-evaluateAction.description = Evaluates the selected text in the JavaScript editor
-hyperlinkDetector.description = Allows for quickly stepping into functions in JavaScript source using hyper-links
-hyperlinkDetector.name = Step Into Selection
-debugPrefPage.name = Debug
-debugPrefPageKeyword.label = debug,jsdt,javascript,wst,breakpoint,launch,suspend,scripts
-hover.description = Shows the value of the selected variable while debugging
-hover.label = JavaScript Variable Hover
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/about.html b/bundles/org.eclipse.wst.jsdt.debug.ui/about.html
deleted file mode 100755
index b4a1c56..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>March 10, 2010</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
-indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/build.properties b/bundles/org.eclipse.wst.jsdt.debug.ui/build.properties
deleted file mode 100644
index 1e63ff6..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/build.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-###############################################################################
-# Copyright (c) 2010, 2011 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               OSGI-INF/,\
-               OSGI-INF/l10n/,\
-               icons/,\
-               about.html,\
-               OSGI-INF/l10n/bundle.properties
-src.includes = about.html
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/dlcl16/brkpd_obj.gif b/bundles/org.eclipse.wst.jsdt.debug.ui/icons/dlcl16/brkpd_obj.gif
deleted file mode 100644
index 74b26c3..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/dlcl16/brkpd_obj.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/brkp_obj.gif b/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/brkp_obj.gif
deleted file mode 100644
index a831fe7..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/brkp_obj.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/connect.gif b/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/connect.gif
deleted file mode 100644
index d8fdd8a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/connect.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/jsbook_obj.gif b/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/jsbook_obj.gif
deleted file mode 100644
index bfb267e..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/jsbook_obj.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/localvariable.gif b/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/localvariable.gif
deleted file mode 100644
index 3244b26..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/localvariable.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/proto_var.gif b/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/proto_var.gif
deleted file mode 100644
index 2dfe11f..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/proto_var.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/script.gif b/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/script.gif
deleted file mode 100644
index 1753b96..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/script.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/script_grp.gif b/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/script_grp.gif
deleted file mode 100644
index f2847d5..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/script_grp.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/scriptbp.gif b/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/scriptbp.gif
deleted file mode 100644
index 4904c11..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/scriptbp.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/sethitcount_co.gif b/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/sethitcount_co.gif
deleted file mode 100755
index 1132786..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/sethitcount_co.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/source.gif b/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/source.gif
deleted file mode 100755
index 782d5a3..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/source.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/suspend_co.gif b/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/suspend_co.gif
deleted file mode 100755
index 161e3f5..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/suspend_co.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/this_var.gif b/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/this_var.gif
deleted file mode 100644
index 7d24707..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/elcl16/this_var.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/caught_ovr.gif b/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/caught_ovr.gif
deleted file mode 100755
index 02de6e8..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/caught_ovr.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/caught_ovr_disabled.gif b/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/caught_ovr_disabled.gif
deleted file mode 100755
index 73d6454..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/caught_ovr_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/conditional_ovr.gif b/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/conditional_ovr.gif
deleted file mode 100644
index de7a274..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/conditional_ovr.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/conditional_ovr_disabled.gif b/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/conditional_ovr_disabled.gif
deleted file mode 100644
index 81f44c8..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/conditional_ovr_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/entry_ovr.gif b/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/entry_ovr.gif
deleted file mode 100644
index f35215a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/entry_ovr.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/entry_ovr_disabled.gif b/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/entry_ovr_disabled.gif
deleted file mode 100644
index c3c0be9..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/entry_ovr_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/exit_ovr.gif b/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/exit_ovr.gif
deleted file mode 100644
index a1f28ad..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/exit_ovr.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/exit_ovr_disabled.gif b/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/exit_ovr_disabled.gif
deleted file mode 100644
index 98fc222..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/exit_ovr_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/installed_ovr.gif b/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/installed_ovr.gif
deleted file mode 100644
index 0e6b414..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/installed_ovr.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/installed_ovr_disabled.gif b/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/installed_ovr_disabled.gif
deleted file mode 100644
index c276ace..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/installed_ovr_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/scoped_ovr.gif b/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/scoped_ovr.gif
deleted file mode 100644
index 5b97523..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/scoped_ovr.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/scoped_ovr_disabled.gif b/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/scoped_ovr_disabled.gif
deleted file mode 100644
index 50d9082..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/scoped_ovr_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/uncaught_ovr.gif b/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/uncaught_ovr.gif
deleted file mode 100755
index 6c06996..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/uncaught_ovr.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/uncaught_ovr_disabled.gif b/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/uncaught_ovr_disabled.gif
deleted file mode 100755
index a631734..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/icons/ovr16/uncaught_ovr_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/plugin.xml b/bundles/org.eclipse.wst.jsdt.debug.ui/plugin.xml
deleted file mode 100644
index 4995034..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/plugin.xml
+++ /dev/null
@@ -1,615 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?><!--
-    Copyright (c) 2010, 2011 IBM Corporation and others.
-    All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0
-    which accompanies this distribution, and is available at
-    http://www.eclipse.org/legal/epl-v10.html
-   
-    Contributors:
-        IBM Corporation - initial API and implementation
- -->
-
-<plugin>
-   <extension
-         point="org.eclipse.debug.ui.launchConfigurationTypeImages">
-      <launchConfigurationTypeImage
-            configTypeID="org.eclipse.wst.jsdt.debug.core.launchConfigurationType"
-            icon="$nl$/icons/elcl16/script.gif"
-            id="org.eclipse.wst.jsdt.debug.ui.launchConfigurationTypeImage">
-      </launchConfigurationTypeImage>
-   </extension>
-   <extension
-         point="org.eclipse.debug.ui.launchConfigurationTabGroups">
-      <launchConfigurationTabGroup
-            class="org.eclipse.wst.jsdt.debug.internal.ui.launching.JavascriptTabGroup"
-            description="%launchConfigurationTabGroup.description"
-            helpContextId="javascript_tab_group"
-            id="org.eclipse.wst.jsdt.debug.ui.launchConfigurationTabGroup"
-            type="org.eclipse.wst.jsdt.debug.core.launchConfigurationType">
-      </launchConfigurationTabGroup>
-   </extension>
-   <extension
-         point="org.eclipse.core.runtime.adapters">
-      <factory
-            adaptableType="org.eclipse.wst.jsdt.internal.ui.javaeditor.CompilationUnitEditor"
-            class="org.eclipse.wst.jsdt.debug.internal.ui.adapters.JavaScriptAdapterFactory">
-         <adapter
-               type="org.eclipse.debug.ui.actions.IToggleBreakpointsTarget">
-         </adapter>
-         <adapter
-               type="org.eclipse.debug.ui.actions.IRunToLineTarget">
-         </adapter>
-      </factory>
-      <factory
-            adaptableType="org.eclipse.wst.jsdt.core.IFunction"
-            class="org.eclipse.wst.jsdt.debug.internal.ui.adapters.JavaScriptAdapterFactory">
-         <adapter
-               type="org.eclipse.debug.ui.actions.IToggleBreakpointsTarget">
-         </adapter>
-      </factory>
-      <factory
-            adaptableType="org.eclipse.wst.jsdt.core.IField"
-            class="org.eclipse.wst.jsdt.debug.internal.ui.adapters.JavaScriptAdapterFactory">
-         <adapter
-               type="org.eclipse.debug.ui.actions.IToggleBreakpointsTarget">
-         </adapter>
-      </factory>
-      <factory
-            adaptableType="org.eclipse.wst.jsdt.core.IJavaScriptElement"
-            class="org.eclipse.wst.jsdt.debug.internal.ui.adapters.JavaScriptAdapterFactory">
-         <adapter
-               type="org.eclipse.debug.ui.actions.ILaunchable">
-         </adapter>
-      </factory>
-      <factory
-            adaptableType="org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint"
-            class="org.eclipse.wst.jsdt.debug.internal.ui.adapters.JavaScriptAdapterFactory">
-         <adapter
-               type="org.eclipse.ui.model.IWorkbenchAdapter">
-         </adapter>
-      </factory>
-      <factory
-            adaptableType="org.eclipse.wst.jsdt.debug.core.model.IJavaScriptDebugTarget"
-            class="org.eclipse.wst.jsdt.debug.internal.ui.adapters.JavaScriptAdapterFactory">
-         <adapter
-               type="org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider">
-         </adapter>
-         <adapter
-               type="org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory2">
-         </adapter>
-         <adapter
-               type="org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxy">
-         </adapter>
-      </factory>
-      <factory
-            adaptableType="org.eclipse.wst.jsdt.debug.core.model.IScriptGroup"
-            class="org.eclipse.wst.jsdt.debug.internal.ui.adapters.JavaScriptAdapterFactory">
-         <adapter
-               type="org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider">
-         </adapter>
-      </factory>
-      <factory
-            adaptableType="org.eclipse.wst.sse.ui.StructuredTextEditor"
-            class="org.eclipse.wst.jsdt.debug.internal.ui.adapters.JavaScriptAdapterFactory">
-         <adapter
-               type="org.eclipse.debug.ui.actions.IToggleBreakpointsTarget">
-         </adapter>
-         <adapter
-               type="org.eclipse.debug.ui.actions.IRunToLineTarget">
-         </adapter>
-      </factory>
-   </extension>
-   <extension
-         point="org.eclipse.ui.editorActions">
-      <editorContribution
-            id="org.eclipse.wst.jsdt.debug.ui.togglebreakpoint"
-            targetID="org.eclipse.wst.jsdt.ui.CompilationUnitEditor">
-         <action
-               actionID="RulerDoubleClick"
-               class="org.eclipse.debug.ui.actions.RulerToggleBreakpointActionDelegate"
-               helpContextId="editor_toggle_breakpoint_action_context"
-               icon="$nl$/icons/elcl16/brkp_obj.gif"
-               id="org.eclipse.wst.jsdt.debug.ui.RulerToggleBreakpoint"
-               label="%togglebreakpointRulerAction.name">
-         </action>
-      </editorContribution>
-   </extension>
-   <extension
-         point="org.eclipse.ui.popupMenus">
-      <viewerContribution
-            id="org.eclipse.wst.jsdt.debug.ui.ruler.popup.actions"
-            targetID="org.eclipse.wst.jsdt.ui.CompilationUnitEditor.RulerContext">
-         <action
-               class="org.eclipse.debug.ui.actions.RulerToggleBreakpointActionDelegate"
-               helpContextId="editor_toggle_breakpoint_action_context"
-               icon="$nl$/icons/elcl16/brkp_obj.gif"
-               id="org.eclipse.wst.jsdt.debug.ui.toggle.breakpoint.ruler.delegate"
-               label="%togglebreakpointRulerAction.name"
-               menubarPath="debug">
-         </action>
-         <action
-               class="org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.BreakpointPropertiesEditorActionDelegate"
-               helpContextId="breakpoint_properties_editor_ruler_context"
-               id="org.eclipse.wst.jsdt.debug.ui.ruler.breakpoint.properties"
-               label="%breakpointpropertiesRulerAction.name"
-               menubarPath="group.properties"
-               tooltip="%breakpointpropertiesRulerAction.tooltip">
-         </action>
-         <action
-               class="org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.ToggleBreakpointEnablementEditorDelegate"
-               helpContextId="toggle_breakpoint_anablement_ruler_context"
-               id="org.eclipse.wst.jsdt.debug.ui.toggle.breakpoint.enablement"
-               label="%togglebreakpointenablementRulerAction.name"
-               menubarPath="debug"
-               tooltip="%togglebreakpointenablementRulerAction.tooltip">
-         </action>
-      </viewerContribution>
-      <objectContribution
-            adaptable="true"
-            id="org.eclipse.wst.jsdt.debug.ui.general.breakpoint.actions"
-            objectClass="org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint">
-         <action
-               class="org.eclipse.wst.jsdt.debug.internal.ui.actions.BreakpointPropertiesAction"
-               definitionId="org.eclipse.wst.jsdt.debug.ui.breakpoint.properties"
-               enablesFor="1"
-               helpContextId="breakpoint_properties_popup_menu_context"
-               id="org.eclipse.wst.jsdt.debug.ui.breakpoint.properties.action"
-               label="%breakpointPropertiesAction.name"
-               menubarPath="additions">
-         </action>
-         <action
-               class="org.eclipse.wst.jsdt.debug.internal.ui.actions.BreakpointHitCountAction"
-               enablesFor="1"
-               helpContextId="hit_count_action_context"
-               icon="$nl$/icons/elcl16/sethitcount_co.gif"
-               id="org.eclipse.wst.jsdt.debug.ui.breakpoint.hitcount.action"
-               label="%hitCount.label"
-               menubarPath="emptyBreakpointGroup">
-         </action>
-         <action
-               class="org.eclipse.wst.jsdt.debug.internal.ui.actions.BreakpointSuspendPolicyToggleAction"
-               enablesFor="1"
-               helpContextId="breakpoint_suspend_policy_toggle_action_context"
-               icon="$nl$/icons/elcl16/suspend_co.gif"
-               id="org.eclipse.wst.jsdt.debug.ui.breakpoint.suspend.policy.action"
-               label="%suspendPolicy.label"
-               menubarPath="emptyBreakpointGroup"
-               tooltip="%suspendpolicy.tooltip">
-         </action>
-      </objectContribution>
-      <objectContribution
-            adaptable="true"
-            id="org.eclipse.wst.jsdt.debug.ui.function.toggle.breakpoint"
-            objectClass="org.eclipse.wst.jsdt.core.IFunction">
-         <action
-               class="org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.ToggleFunctionBreakpointActionDelegate"
-               enablesFor="+"
-               helpContextId="toggle_function_bp_outline"
-               icon="$nl$/icons/elcl16/brkp_obj.gif"
-               id="org.eclipse.wst.jsdt.debug.ui.outline.function.toggle.breakpoint.action"
-               label="%toggleFunctionBreakpointAction.name"
-               menubarPath="additions"
-               tooltip="%toggleFunctionBreakpointAction.tooltip">
-         </action>
-      </objectContribution>
-      <objectContribution
-            adaptable="true"
-            id="org.eclipse.wst.jsdt.debug.ui.function.breakpoint.actions"
-            objectClass="org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptFunctionBreakpoint">
-         <action
-               class="org.eclipse.wst.jsdt.debug.internal.ui.actions.ExitToggleAction"
-               enablesFor="+"
-               helpContextId="exit_toggle_action_context"
-               id="org.eclipse.wst.jsdt.debug.ui.breakpoint.toggle.exit.action"
-               label="%exitAction.label"
-               menubarPath="emptyBreakpointGroup"
-               state="false">
-         </action>
-         <action
-               class="org.eclipse.wst.jsdt.debug.internal.ui.actions.EntryToggleAction"
-               enablesFor="+"
-               helpContextId="entry_toggle_action_context"
-               id="org.eclipse.wst.jsdt.debug.ui.breakpoint.toggle.entry.action"
-               label="%entryAction.label"
-               menubarPath="emptyBreakpointGroup"
-               state="false">
-         </action>
-      </objectContribution>
-      <objectContribution
-            adaptable="false"
-            id="org.eclipse.wst.jsdt.debug.ui.debugview.actions"
-            objectClass="org.eclipse.wst.jsdt.debug.core.model.IScript">
-         <action
-               class="org.eclipse.wst.jsdt.debug.internal.ui.actions.OpenSourceAction"
-               definitionId="org.eclipse.wst.jsdt.debug.ui.script.opensource"
-               enablesFor="1"
-               helpContextId="script_open_source_context"
-               icon="$nl$/icons/elcl16/source.gif"
-               id="org.eclipse.wst.jsdt.debug.ui.script.opensource.action"
-               label="%openSourceObjectAction.name"
-               menubarPath="launchGroup"
-               style="push"
-               tooltip="%openSourceObjectAction.tooltip">
-         </action>
-      </objectContribution>
-      <viewerContribution
-            id="org.eclipse.wst.jsdt.debug.ui.classfile.editor.actions"
-            targetID="#ClassFileEditorContext">
-         <visibility>
-            <and>
-               <objectClass
-                     name="org.eclipse.jface.text.ITextSelection">
-               </objectClass>
-               <systemProperty
-                     name="org.eclipse.wst.jsdt.debug.ui.jsdebuggerActive"
-                     value="true">
-               </systemProperty>
-            </and>
-         </visibility>
-         <action
-               class="org.eclipse.wst.jsdt.debug.internal.ui.actions.EvaluateEditorPopupAction"
-               definitionId="org.eclipse.wst.jsdt.debug.ui.evaluate.command"
-               helpContextId="evaluate_jsunit_snippet_action_context"
-               icon="$nl$/icons/elcl16/jsbook_obj.gif"
-               id="org.eclipse.wst.jsdt.debug.ui.jsunit.popup.evaluate"
-               label="%evaluateAction.label"
-               menubarPath="jsdebug"
-               tooltip="%evaluateAction.description">
-         </action>
-      </viewerContribution>
-      <viewerContribution
-            id="org.eclipse.wst.jsdt.debug.ui.jsunit.editor.actions"
-            targetID="#JavaScriptEditorContext">
-         <visibility>
-            <and>
-               <objectClass
-                     name="org.eclipse.jface.text.ITextSelection">
-               </objectClass>
-               <systemProperty
-                     name="org.eclipse.wst.jsdt.debug.ui.jsdebuggerActive"
-                     value="true">
-               </systemProperty>
-            </and>
-         </visibility>
-         <action
-               class="org.eclipse.wst.jsdt.debug.internal.ui.actions.EvaluateEditorPopupAction"
-               definitionId="org.eclipse.wst.jsdt.debug.ui.evaluate.command"
-               helpContextId="evaluate_jsunit_snippet_action_context"
-               icon="$nl$/icons/elcl16/jsbook_obj.gif"
-               id="org.eclipse.wst.jsdt.debug.ui.jsunit.popup.evaluate"
-               label="%evaluateAction.label"
-               menubarPath="jsdebug"
-               tooltip="%evaluateAction.description">
-         </action>
-         <menu
-               id="org.eclipse.wst.jsdt.debug.ui.jsdebug.cu.menu"
-               label="%javascriptMenu.name"
-               path="additions">
-            <groupMarker
-                  name="jsdebug">
-            </groupMarker>
-            <separator
-                  name="jsdebug">
-            </separator>
-         </menu>
-      </viewerContribution>
-      <viewerContribution
-            id="org.eclipse.wst.jsdt.debug.ui.html.ruler.popup.actions"
-            targetID="org.eclipse.wst.html.core.htmlsource.source">
-         <action
-               class="org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.ToggleBreakpointEnablementEditorDelegate"
-               helpContextId="toggle_breakpoint_anablement_ruler_context"
-               id="org.eclipse.wst.jsdt.debug.ui.html.toggle.breakpoint.enablement"
-               label="%togglebreakpointenablementRulerAction.name"
-               menubarPath="debug"
-               tooltip="%togglebreakpointenablementRulerAction.tooltip">
-         </action>
-         <action
-               class="org.eclipse.debug.ui.actions.RulerToggleBreakpointActionDelegate"
-               helpContextId="editor_toggle_breakpoint_action_context"
-               icon="$nl$/icons/elcl16/brkp_obj.gif"
-               id="org.eclipse.wst.jsdt.debug.ui.html.toggle.breakpoint.ruler.delegate"
-               label="%togglebreakpointRulerAction.name"
-               menubarPath="debug">
-         </action>
-      </viewerContribution>
-   </extension>
-   <extension
-         point="org.eclipse.debug.ui.debugModelPresentations">
-      <debugModelPresentation
-            class="org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptModelPresentation"
-            detailsViewerConfiguration="org.eclipse.wst.jsdt.debug.internal.ui.display.JavaScriptDebugViewerConfiguration"
-            id="org.eclipse.wst.jsdt.debug.model">
-      </debugModelPresentation>
-   </extension>
-   <extension
-         point="org.eclipse.ui.propertyPages">
-      <page
-            class="org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.JavaScriptBreakpointPropertyPage"
-            id="org.eclipse.wst.jsdt.debug.ui.breakpoints.propertypage"
-            name="%breakpointproperties.page.name">
-         <enabledWhen>
-            <or>
-               <adapt
-                     type="org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint">
-               </adapt>
-               <instanceof
-                     value="org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint">
-               </instanceof>
-            </or>
-         </enabledWhen>
-      </page>
-   </extension>
-   <extension
-         point="org.eclipse.ui.bindings">
-      <key
-            commandId="org.eclipse.wst.jsdt.debug.ui.breakpoint.properties"
-            contextId="org.eclipse.debug.ui.BreakpointView"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="M1+ENTER">
-      </key>
-      <key
-            commandId="org.eclipse.wst.jsdt.debug.ui.script.opensource"
-            contextId="org.eclipse.debug.ui.debugging"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="M1+M2+3">
-      </key>
-      <key
-            commandId="org.eclipse.wst.jsdt.debug.ui.evaluate.command"
-            contextId="org.eclipse.wst.jsdt.ui.javaEditorScope"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-            sequence="M3+M2+E">
-      </key>
-   </extension>
-   <extension
-         point="org.eclipse.ui.commands">
-      <command
-            categoryId="org.eclipse.wst.jsdt.debug.ui.category"
-            description="%breakpointproperties.command.description"
-            id="org.eclipse.wst.jsdt.debug.ui.breakpoint.properties"
-            name="%breakpointproperties.command.name">
-      </command>
-      <command
-            categoryId="org.eclipse.wst.jsdt.debug.ui.category"
-            defaultHandler="org.eclipse.wst.jsdt.debug.internal.ui.actions.OpenSourceAction"
-            description="%openSourceObjectAction.tooltip"
-            helpContextId="script_open_source_context"
-            id="org.eclipse.wst.jsdt.debug.ui.script.opensource"
-            name="%openSourceObjectAction.name">
-      </command>
-      <category
-            description="%commandCategory.description"
-            id="org.eclipse.wst.jsdt.debug.ui.category"
-            name="%commandCategory.name">
-      </category>
-      <command
-            categoryId="org.eclipse.wst.jsdt.debug.ui.category"
-            description="%evaluateAction.description"
-            helpContextId="evaluate_command_help_context"
-            id="org.eclipse.wst.jsdt.debug.ui.evaluate.command"
-            name="%evaluateCommand.label">
-      </command>
-   </extension>
-   <extension
-         point="org.eclipse.ui.viewActions">
-      <viewContribution
-            id="breakpointsViewActions"
-            targetID="org.eclipse.debug.ui.BreakpointView">
-         <action
-               class="org.eclipse.wst.jsdt.debug.internal.ui.actions.AddScriptLoadBreakpointAction"
-               disabledIcon="$nl$/icons/elcl16/scriptbp.gif"
-               helpContextId="add_script_load_breakpoint_action"
-               hoverIcon="$nl$/icons/elcl16/scriptbp.gif"
-               icon="$nl$/icons/elcl16/scriptbp.gif"
-               id="org.eclipse.wst.jsdt.debug.ui.add.scriptload.breakpoint"
-               label="%addScriptloadBreakpointAction.name"
-               style="push"
-               toolbarPath="javascriptActions"
-               tooltip="%addScriptloadBreakpointAction.name">
-         </action>
-         <action
-               class="org.eclipse.wst.jsdt.debug.internal.ui.actions.SuspendOnAllScriptLoadsAction"
-               helpContextId="suspend_for_all_loads_action_context"
-               icon="$nl$/icons/elcl16/script.gif"
-               id="org.eclipse.jdt.debug.ui.breakpointViewActions.ShowQualified"
-               label="%suspendForAllScriptLoadsAction.name"
-               menubarPath="javascriptActions"
-               style="toggle"
-               tooltip="%suspendForAllScriptLoadsAction.tooltip">
-         </action>
-         <action
-               class="org.eclipse.wst.jsdt.debug.internal.ui.actions.SuspendOnExceptionsAction"
-               helpContextId="suspend_on_javascript_exceptions"
-               id="org.eclipse.wst.jsdt.debug.ui.suspend.on.exceptions"
-               label="%suspendOnExceptions.name"
-               menubarPath="javascriptActions"
-               style="toggle"
-               tooltip="%suspendOnExceptions.tooltip">
-         </action>
-      </viewContribution>
-      <viewContribution
-            id="debugViewActions"
-            targetID="org.eclipse.debug.ui.DebugView">
-         <menu
-               id="org.eclipse.wst.jsdt.debug.ui.javascript.menu"
-               label="%javascriptMenu.name">
-            <groupMarker
-                  name="js">
-            </groupMarker>
-         </menu>
-         <action
-               class="org.eclipse.wst.jsdt.debug.internal.ui.actions.ShowLoadedScriptsAction"
-               helpContextId="show_all_scripts_debug_view_action"
-               icon="$nl$/icons/elcl16/script_grp.gif"
-               id="org.eclipse.wst.jsdt.debug.ui.show.all.scripts"
-               label="%showAllScripts.name"
-               menubarPath="org.eclipse.wst.jsdt.debug.ui.javascript.menu/js"
-               style="toggle"
-               tooltip="%showAllScripts.tooltip">
-         </action>
-      </viewContribution>
-      <viewContribution
-            id="variableViewActions"
-            targetID="org.eclipse.debug.ui.VariableView">
-         <menu
-               id="org.eclipse.wst.jsdt.debug.ui.variableview.menu"
-               label="%javascriptMenu.name">
-            <groupMarker
-                  name="js">
-            </groupMarker>
-         </menu>
-         <action
-               class="org.eclipse.wst.jsdt.debug.internal.ui.actions.FunctionFilterAction"
-               helpContextId="show_functions_variable_help_context"
-               id="org.eclipse.wst.jsdt.debug.ui.variableview.show.functions"
-               label="%showFunctionVarAction.label"
-               menubarPath="org.eclipse.wst.jsdt.debug.ui.variableview.menu/js"
-               style="toggle"
-               tooltip="%showFunctionVarAction.tooltip">
-         </action>
-         <action
-               class="org.eclipse.wst.jsdt.debug.internal.ui.actions.ThisFilterAction"
-               helpContextId="show_this_variable_help_context"
-               icon="$nl$/icons/elcl16/this_var.gif"
-               id="org.eclipse.wst.jsdt.debug.ui.variableview.show.this"
-               label="%showThisVarAction.label"
-               menubarPath="org.eclipse.wst.jsdt.debug.ui.variableview.menu/js"
-               style="toggle"
-               tooltip="%showThisVarAction.tooltip">
-         </action>
-         <action
-               class="org.eclipse.wst.jsdt.debug.internal.ui.actions.ProtoFilterAction"
-               helpContextId="show_proto_variables_help_context"
-               icon="$nl$/icons/elcl16/proto_var.gif"
-               id="org.eclipse.wst.jsdt.debug.ui.variableview.show.prototypes"
-               label="%showProtoVarAction.label"
-               menubarPath="org.eclipse.wst.jsdt.debug.ui.variableview.menu/js"
-               style="toggle"
-               tooltip="%showProtoVarAction.tooltip">
-         </action>
-      </viewContribution>
-   </extension>
-   <extension
-         point="org.eclipse.debug.ui.detailPaneFactories">
-      <detailFactories
-            class="org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.details.BreakpointDetailPaneFactory"
-            id="org.eclipse.wst.jsdt.debug.ui.breakpoints.details.factory">
-         <enablement>
-            <with
-                  variable="selection">
-               <iterate>
-                  <or>
-                     <instanceof
-                           value="org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint">
-                     </instanceof>
-                     <instanceof
-                           value="org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLoadBreakpoint">
-                     </instanceof>
-                     <instanceof
-                           value="org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptFunctionBreakpoint">
-                     </instanceof>
-                  </or></iterate>
-               <count
-                     value="1">
-               </count>
-            </with>
-         </enablement>
-      </detailFactories>
-   </extension>
-   <extension
-         point="org.eclipse.ui.ide.markerSupport">
-      <markerTypeCategory
-            name="%breakpointMarkerCategory.name">
-         <markerTypeReference
-               id="org.eclipse.wst.jsdt.debug.core.function.breakpoint.marker">
-         </markerTypeReference>
-         <markerTypeReference
-               id="org.eclipse.wst.jsdt.debug.core.line.breakpoint.marker">
-         </markerTypeReference>
-         <markerTypeReference
-               id="org.eclipse.wst.jsdt.debug.core.breakpoint.marker">
-         </markerTypeReference>
-         <markerTypeReference
-               id="org.eclipse.wst.jsdt.debug.core.exception.breakpoint.marker">
-         </markerTypeReference>
-         <markerTypeReference
-               id="org.eclipse.wst.jsdt.debug.core.scriptload.breakpoint.marker">
-         </markerTypeReference>
-      </markerTypeCategory>
-   </extension>
-   <extension
-         point="org.eclipse.core.runtime.preferences">
-      <initializer
-            class="org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptDebugUIPreferenceInitializer">
-      </initializer>
-   </extension>
-   <extension
-         point="org.eclipse.ui.handlers">
-      <handler
-            class="org.eclipse.wst.jsdt.debug.internal.ui.actions.EvaluateEditorPopupAction"
-            commandId="org.eclipse.wst.jsdt.debug.ui.evaluate.command"
-            helpContextId="evaluate_command_help_context">
-      </handler>
-   </extension>
-   <extension
-         point="org.eclipse.ui.workbench.texteditor.hyperlinkDetectors">
-      <hyperlinkDetector
-            activate="true"
-            class="org.eclipse.wst.jsdt.debug.internal.ui.eval.JavaScriptHyperlinkDetector"
-            description="%hyperlinkDetector.description"
-            id="org.eclipse.wst.jsdt.debug.ui.hyperlink.detector"
-            modifierKeys="M1+M3"
-            name="%hyperlinkDetector.name"
-            targetId="org.eclipse.wst.jsdt.ui.javaCode">
-      </hyperlinkDetector>
-   </extension>
-   <extension
-         point="org.eclipse.ui.preferencePages">
-      <page
-            category="org.eclipse.wst.jsdt.ui.preferences.JavaBasePreferencePage"
-            class="org.eclipse.wst.jsdt.debug.internal.ui.preferences.JavaScriptDebugPreferencePage"
-            id="org.eclipse.wst.jsdt.debug.ui.debug.page"
-            name="%debugPrefPage.name">
-         <keywordReference
-               id="org.eclipse.wst.jsdt.debug.ui.debug.pref.page.keyword">
-         </keywordReference>
-      </page>
-   </extension>
-   <extension
-         point="org.eclipse.ui.keywords">
-      <keyword
-            id="org.eclipse.wst.jsdt.debug.ui.debug.pref.page.keyword"
-            label="%debugPrefPageKeyword.label">
-      </keyword>
-   </extension>
-   <extension
-         point="org.eclipse.wst.jsdt.ui.javaEditorTextHovers">
-      <hover
-            class="org.eclipse.wst.jsdt.debug.internal.ui.eval.JavaScriptDebugHover"
-            description="%hover.description"
-            id="org.eclipse.wst.jsdt.debug.ui.variable.value.hover"
-            label="%hover.label">
-      </hover>
-   </extension>
-   <extension
-         point="org.eclipse.ui.editors.markerUpdaters">
-      <updater
-            class="org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.JavaScriptBreakpointUpdater"
-            id="org.eclipse.wst.jsdt.debug.ui.breakpoint.updater"
-            markerType="org.eclipse.wst.jsdt.debug.core.breakpoint.marker">
-      </updater>
-   </extension>
-   <extension
-         point="org.eclipse.wst.sse.ui.breakpoint">
-      <breakpointContribution
-            id="org.eclipse.wst.jsdt.html.breakpointContribution">
-         <provider
-               class="org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.JavaScriptHtmlBreakpointProvider"
-               contentTypes="org.eclipse.wst.html.core.htmlsource"
-               id="org.eclipse.wst.jsdt.html.breakpoint.provider">
-         </provider>
-      </breakpointContribution>
-   </extension>
-
-</plugin>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/Constants.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/Constants.java
deleted file mode 100644
index d493978..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/Constants.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008, 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui;
-
-/**
- * Constants for the {@link JavaScriptDebugUIPlugin}
- * 
- * @since 1.1
- */
-public interface Constants {
-
-	/**
-	 * Constant for the preference for showing / hiding functions from the variables view
-	 * <br><br>
-	 * Value is: <code>org.eclipse.wst.jsdt.debug.ui.show_functions</code>
-	 */
-	public static final String SHOW_FUNCTIONS = JavaScriptDebugUIPlugin.PLUGIN_ID + ".show_functions"; //$NON-NLS-1$
-	/**
-	 * Constant for the preference for showing / hiding prototypes from the variables view
-	 * <br><br>
-	 * Value is: <code>org.eclipse.wst.jsdt.debug.ui.show_protoypes</code>
-	 */
-	public static final String SHOW_PROTOTYPES = JavaScriptDebugUIPlugin.PLUGIN_ID + ".show_prototypes"; //$NON-NLS-1$
-	/**
-	 * Constant for the preference for showing / hiding the <code>this</code> variable from the variables view
-	 * <br><br>
-	 * Value is: <code>org.eclipse.wst.jsdt.debug.ui.show_this</code>
-	 */
-	public static final String SHOW_THIS = JavaScriptDebugUIPlugin.PLUGIN_ID + "show_this"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/DebugWCManager.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/DebugWCManager.java
deleted file mode 100644
index 370faa8..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/DebugWCManager.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui;
-
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.wst.jsdt.core.IJavaScriptUnit;
-import org.eclipse.wst.jsdt.internal.ui.javaeditor.WorkingCopyManager;
-import org.eclipse.wst.jsdt.ui.JavaScriptUI;
-
-/**
- * Delegate class to get working copies from the {@link JavaScriptUI} {@link WorkingCopyManager}.
- * 
- * @since 1.1
- */
-public class DebugWCManager {
-
-	/**
-	 * Returns the working copy for the given editor input
-	 * 
-	 * @param input
-	 * @param primaryOnly
-	 * @return the given {@link IJavaScriptUnit} for the editor input or <code>null</code> is none
-	 */
-	public static IJavaScriptUnit getCompilationUnit(IEditorInput input, boolean primaryOnly) {
-		return ((WorkingCopyManager)JavaScriptUI.getWorkingCopyManager()).getWorkingCopy(input, primaryOnly);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/IHelpContextIds.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/IHelpContextIds.java
deleted file mode 100644
index 060e291..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/IHelpContextIds.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui;
-
-/**
- * Constants defining help context ids
- * 
- * @since 1.0
- */
-public interface IHelpContextIds {
-
-	/**
-	 * Help constant for the line breakpoint editor
-	 */
-	public static final String STANDARD_BREAKPOINT_EDITOR = JavaScriptDebugUIPlugin.PLUGIN_ID + ".standard_breakpoint_editor"; //$NON-NLS-1$
-	/**
-	 * Help constant for the general breakpoint property page
-	 */
-	public static final String JAVASCRIPT_BREAKPOINT_PROPERTY_PAGE = JavaScriptDebugUIPlugin.PLUGIN_ID + ".breakpoint_property_page"; //$NON-NLS-1$
-	/**
-	 * Help constant for the connect tab
-	 */
-	public static final String CONNECT_TAB = JavaScriptDebugUIPlugin.PLUGIN_ID + ".connect_tab"; //$NON-NLS-1$
-	/**
-	 * Help constant for the Debug root preference page
-	 * @since 1.1
-	 */
-	public static final String DEBUG_PREFERENCE_PAGE = JavaScriptDebugUIPlugin.PLUGIN_ID + ".debug_pref_page"; //$NON-NLS-1$
-	/**
-	 * Help constant for the Source tab
-	 * @since 1.2
-	 */
-	public static final String SOURCE_LOOKUP_TAB = JavaScriptDebugUIPlugin.PLUGIN_ID + ".source_lookup_tab"; //$NON-NLS-1$
-	/**
-	 * Help constant for the Environment tab
-	 * @since 1.2
-	 */
-	public static final String ENVIRONMENT_TAB = JavaScriptDebugUIPlugin.PLUGIN_ID + ".environment_tab"; //$NON-NLS-1$
-	/**
-	 * Help constant for the Common tab
-	 * @since 1.2
-	 */
-	public static final String COMMON_TAB = JavaScriptDebugUIPlugin.PLUGIN_ID + ".common_tab"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/ISharedImages.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/ISharedImages.java
deleted file mode 100644
index f9e5e23..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/ISharedImages.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui;
-
-/**
- * Describes images that are in the image registry
- * 
- * @since 1.0
- */
-public interface ISharedImages {
-
-	//ELCL
-	/**
-	 * Default script image
-	 */
-	public static final String IMG_SCRIPT = "IMG_SCRIPT"; //$NON-NLS-1$
-	/**
-	 * Default script group image
-	 */
-	public static final String IMG_SCRIPT_GRP = "IMG_SCRIPT_GRP"; //$NON-NLS-1$
-
-	/**
-	 * Image for a local variable
-	 */
-	public static final String IMG_LOCAL_VAR = "IMG_LOCAL_VAR"; //$NON-NLS-1$
-	
-	/**
-	 * Image for a script load breakpoint
-	 */
-	public static final String IMG_THIS_VAR = "IMG_THIS_VAR"; //$NON-NLS-1$
-	
-	/**
-	 * Image for the 'proto' variable
-	 * @since 1.1
-	 */
-	public static final String IMG_PROTO_VAR = "IMG_PROTO_VAR"; //$NON-NLS-1$
-	
-	/**
-	 * Image for a normal breakpoint
-	 */
-	public static final String IMG_BRKP = "IMG_BRKP"; //$NON-NLS-1$
-
-	/**
-	 * Image for the connect icon
-	 */
-	public static final String IMG_CONNECT = "IMG_CONNECT"; //$NON-NLS-1$
-	/**
-	 * Image for source / source lookup
-	 * @since 1.1
-	 */
-	public static final String IMG_SOURCE = "IMG_SOURCE"; //$NON-NLS-1$
-	
-	//DLCL
-	/**
-	 * Image for a disabled breakpoint
-	 */
-	public static final String IMG_BRKP_DISABLED = "IMG_BRKP_DISABLED";  //$NON-NLS-1$
-	
-	//overlays
-	/**
-	 * Image for the conditional breakpoint overlay
-	 */
-	public static final String IMG_OVR_CONDITIONAL = "IMG_OVR_CONDITIONAL"; //$NON-NLS-1$
-	
-	/**
-	 * Image for the disabled conditional breakpoint overlay 
-	 */
-	public static final String IMG_OVR_CONDITIONAL_DISABLED = "IMG_OVR_CONDITIONAL_DISABLED"; //$NON-NLS-1$
-	
-	/**
-	 * Image for the function entry breakpoint overlay 
-	 */
-	public static final String IMG_OVR_ENTRY = "IMG_OVR_ENTRY"; //$NON-NLS-1$
-	
-	/**
-	 * Image for the disabled function entry breakpoint overlay 
-	 */
-	public static final String IMG_OVR_ENTRY_DISABLED = "IMG_OVR_ENTRY_DISABLED"; //$NON-NLS-1$
-	
-	/**
-	 * Image for the function exit breakpoint overlay
-	 */
-	public static final String IMG_OVR_EXIT = "IMG_OVR_EXIT"; //$NON-NLS-1$
-	
-	/**
-	 * Image for the disabled function exit breakpoint overlay
-	 */
-	public static final String IMG_OVR_EXIT_DISABLED = "IMG_OVR_EXIT_DISABLED"; //$NON-NLS-1$
-	
-	/**
-	 * Image for the installed breakpoint overlay
-	 */
-	public static final String IMG_OVR_INSTALLED = "IMG_OVR_INSTALLED"; //$NON-NLS-1$
-	
-	/**
-	 * Image for the disabled installed breakpoint overlay
-	 */
-	public static final String IMG_OVR_INSTALLED_DISABLED = "IMG_OVR_INSTALLED_DISABLED"; //$NON-NLS-1$
-	
-	/**
-	 * Image for the scoped breakpoint overlay
-	 */
-	public static final String IMG_OVR_SCOPED = "IMG_OVR_SCOPED"; //$NON-NLS-1$
-	
-	/**
-	 * Image for the disabled scoped breakpoint overlay
-	 */
-	public static final String IMG_OVR_SCOPED_DISABLED = "IMG_OVR_SCOPED_DISABLED"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/ImageDescriptorRegistry.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/ImageDescriptorRegistry.java
deleted file mode 100644
index 7c8d6a0..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/ImageDescriptorRegistry.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui;
-
- 
-import java.util.HashMap;
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * A registry that maps <code>ImageDescriptors</code> to <code>Image</code>.
- * 
- * @since 1.0
- */
-public class ImageDescriptorRegistry {
-
-	private HashMap fRegistry= new HashMap(10);
-	private Display fDisplay;
-	
-	/**
-	 * Creates a new image descriptor registry for the current or default display,
-	 * respectively.
-	 */
-	public ImageDescriptorRegistry() {
-		this(PlatformUI.getWorkbench().getDisplay());
-	}
-	
-	/**
-	 * Creates a new image descriptor registry for the given display. All images
-	 * managed by this registry will be disposed when the display gets disposed.
-	 * 
-	 * @param display the display the images managed by this registry are allocated for 
-	 */
-	public ImageDescriptorRegistry(Display display) {
-		fDisplay= display;
-		Assert.isNotNull(fDisplay);
-		hookDisplay();
-	}
-	
-	/**
-	 * Returns the image associated with the given image descriptor.
-	 * 
-	 * @param descriptor the image descriptor for which the registry manages an image
-	 * @return the image associated with the image descriptor or <code>null</code>
-	 *  if the image descriptor can't create the requested image.
-	 */
-	public Image get(ImageDescriptor descriptor) {
-		ImageDescriptor desc = descriptor;
-		if (desc == null) {
-			desc = ImageDescriptor.getMissingImageDescriptor();
-		}
-		Image result = (Image)fRegistry.get(desc);
-		if (result != null) {
-			return result; 
-		}
-		result = desc.createImage();
-		if (result != null) {
-			fRegistry.put(desc, result);
-		}
-		return result;
-	}
-
-	/**
-	 * Disposes all images managed by this registry.
-	 */	
-	public void dispose() {
-		for (Iterator iter= fRegistry.values().iterator(); iter.hasNext(); ) {
-			Image image= (Image)iter.next();
-			image.dispose();
-		}
-		fRegistry.clear();
-	}
-	
-	private void hookDisplay() {
-		fDisplay.asyncExec(new Runnable() {
-			public void run() {
-			fDisplay.disposeExec(new Runnable() {
-				public void run() {
-					dispose();
-				}	
-			});			
-			}
-		});
-
-	}
-}
-
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/JavaScriptDebugUIPlugin.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/JavaScriptDebugUIPlugin.java
deleted file mode 100644
index a7b43d6..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/JavaScriptDebugUIPlugin.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui;
-
-import java.util.ArrayList;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchListener;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.ResourceUtil;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.eclipse.ui.preferences.ScopedPreferenceStore;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.ui.eval.EvaluationManager;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- * 
- * @since 1.0
- */
-public class JavaScriptDebugUIPlugin extends AbstractUIPlugin implements IWorkbenchListener {
-
-	/**
-	 * Status code indicating an unexpected internal error.
-	 */
-	public static final int INTERNAL_ERROR = 120;
-	/**
-	 * The ID of the bundle<br>
-	 * <br>
-	 * value is: <code>org.eclipse.wst.jsdt.debug.ui</code>
-	 */
-	public static final String PLUGIN_ID = "org.eclipse.wst.jsdt.debug.ui"; //$NON-NLS-1$
-
-	// The shared instance
-	private static JavaScriptDebugUIPlugin plugin;
-	private static ScopedPreferenceStore corestore = new ScopedPreferenceStore(InstanceScope.INSTANCE, JavaScriptDebugPlugin.PLUGIN_ID);
-	
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		plugin = this;
-		PlatformUI.getWorkbench().addWorkbenchListener(this);
-		EvaluationManager.getManager().start();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		try {
-			plugin = null;
-			PlatformUI.getWorkbench().removeWorkbenchListener(this);
-			EvaluationManager.getManager().stop();
-			super.stop(context);
-		}
-		finally {
-			JavaScriptImageRegistry.dispose();
-		}
-	}
-
-	/**
-	 * Returns the singleton instance
-	 *
-	 * @return the singleton instance
-	 */
-	public static JavaScriptDebugUIPlugin getDefault() {
-		return plugin;
-	}
-	
-	/**
-	 * Logs the specified status with this plug-in's log.
-	 * 
-	 * @param status status to log
-	 */
-	public static void log(IStatus status) {
-		if (plugin != null) {
-			plugin.getLog().log(status);
-		}
-	}
-
-	/**
-	 * Logs the specified throwable with this plug-in's log.
-	 * 
-	 * @param t throwable to log 
-	 */
-	public static void log(Throwable t) {
-		log(newErrorStatus("Error logged from JavaScript Debug UI: ", t)); //$NON-NLS-1$
-	}
-	
-	/**
-	 * Logs an internal error with the specified message.
-	 * 
-	 * @param message the error message to log
-	 */
-	public static void logErrorMessage(String message) {
-		// this message is intentionally not internationalized, as an exception may
-		// be due to the resource bundle itself
-		log(newErrorStatus("Internal message logged from JavaScript Debug UI: " + message, null)); //$NON-NLS-1$	
-	}
-	
-	/**
-	 * Returns a new error status for this plug-in with the given message
-	 * @param message the message to be included in the status
-	 * @param exception the exception to be included in the status or <code>null</code> if none
-	 * @return a new error status
-	 */
-	public static IStatus newErrorStatus(String message, Throwable exception) {
-		return new Status(IStatus.ERROR, PLUGIN_ID, INTERNAL_ERROR, message, exception);
-	}
-
-	/**
-	 * Closes any editors open on sources in the external JavaScript source project
-	 * @throws PartInitException 
-	 * 
-	 * @since 1.1
-	 */
-	protected void closeEditors() throws PartInitException {
-		IProject project = JavaScriptDebugPlugin.getExternalSourceProject(false);
-		if(project != null) {
-			IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
-			ArrayList editors = new ArrayList(8);
-			for(int l = 0; l < windows.length; l++) {
-				IWorkbenchPage[] pages = windows[l].getPages();
-				for(int i = 0; i < pages.length; i++) {
-					IEditorReference[] erefs = pages[i].getEditorReferences();
-					for(int j = 0; j < erefs.length; j++) {
-						IFile file = ResourceUtil.getFile(erefs[j].getEditorInput());
-						if(file != null) {
-							if(project.equals(file.getProject())) {
-								editors.add(erefs[j]);
-							}
-						}
-					}
-					if(editors.size() > 0) {
-						pages[i].closeEditors((IEditorReference[]) editors.toArray(new IEditorReference[editors.size()]), false);
-						editors.clear();
-					}
-				}
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchListener#preShutdown(org.eclipse.ui.IWorkbench, boolean)
-	 */
-	public boolean preShutdown(IWorkbench workbench, boolean forced) {
-		try {
-			closeEditors();
-		} catch (PartInitException e) {
-			log(e);
-		}
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchListener#postShutdown(org.eclipse.ui.IWorkbench)
-	 */
-	public void postShutdown(IWorkbench workbench) {
-	}
-	
-	/**
-	 * Returns the standard display to be used. The method first checks, if
-	 * the thread calling this method has an associated display. If so, this
-	 * display is returned. Otherwise the method returns the default display.
-	 */
-	public static Display getStandardDisplay() {
-		Display display;
-		display = Display.getCurrent();
-		if (display == null) {
-			display = Display.getDefault();
-		}
-		return display;		
-	}
-	
-	/**
-	 * Returns an {@link IPreferenceStore} wrapper for the {@link JavaScriptDebugPlugin} core preferences
-	 * 
-	 * @return an {@link IPreferenceStore} for the core preferences
-	 */
-	public static IPreferenceStore getCorePreferenceStore() {
-		return corestore;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/JavaScriptDebugUIPreferenceInitializer.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/JavaScriptDebugUIPreferenceInitializer.java
deleted file mode 100644
index b3e2e45..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/JavaScriptDebugUIPreferenceInitializer.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui;
-
-import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
-import org.eclipse.jface.preference.IPreferenceStore;
-
-/**
- * Initialize common preferences for {@link JavaScriptDebugUIPlugin}
- * 
- * @since 1.1
- */
-public class JavaScriptDebugUIPreferenceInitializer extends AbstractPreferenceInitializer {
-
-	/**
-	 * Constructor
-	 */
-	public JavaScriptDebugUIPreferenceInitializer() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
-	 */
-	public void initializeDefaultPreferences() {
-		IPreferenceStore store = JavaScriptDebugUIPlugin.getDefault().getPreferenceStore();
-		store.setDefault(Constants.SHOW_FUNCTIONS, true);
-		store.setDefault(Constants.SHOW_PROTOTYPES, true);
-		store.setDefault(Constants.SHOW_THIS, true);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/JavaScriptImageDescriptor.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/JavaScriptImageDescriptor.java
deleted file mode 100644
index eef9272..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/JavaScriptImageDescriptor.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui;
-
-
-import org.eclipse.jface.resource.CompositeImageDescriptor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.Point;
-
-/**
- * A {@link JavaScriptImageDescriptor} consists of a main icon and several adornments. The adornments
- * are computed according to flags set on creation of the descriptor.
- * 
- * @since 1.0
- */
-public class JavaScriptImageDescriptor extends CompositeImageDescriptor {
-	
-	/** Flag to render the installed breakpoint adornment */
-	public final static int INSTALLED = 1 << 0;
-	/** Flag to render the entry method breakpoint adornment */
-	public final static int ENTRY =	1 << 1;
-	/** Flag to render the exit method breakpoint adornment */
-	public final static int EXIT = 1 << 2;
-	/** Flag to render the enabled breakpoint adornment */
-	public final static int ENABLED = 1 << 3;
-	/** Flag to render the conditional breakpoint adornment */
-	public final static int CONDITIONAL = 1 << 4;
-	/** Flag to render the scoped breakpoint adornment */
-	public final static int SCOPED = 1 << 5;
-
-	private Image fBaseImage;
-	private int fFlags;
-	private Point fSize;
-	
-	/**
-	 * Create a new JDIImageDescriptor.
-	 * 
-	 * @param baseImage an image used as the base image
-	 * @param flags flags indicating which adornments are to be rendered
-	 * 
-	 */
-	public JavaScriptImageDescriptor(Image baseImage, int flags) {
-		setBaseImage(baseImage);
-		setFlags(flags);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.resource.CompositeImageDescriptor#getSize()
-	 */
-	protected Point getSize() {
-		if (fSize == null) {
-			ImageData data= getBaseImage().getImageData();
-			setSize(new Point(data.width, data.height));
-		}
-		return fSize;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object object) {
-		if (!(object instanceof JavaScriptImageDescriptor)){
-			return false;
-		}
-			
-		JavaScriptImageDescriptor other= (JavaScriptImageDescriptor)object;
-		return (getBaseImage().equals(other.getBaseImage()) && getFlags() == other.getFlags());
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return getBaseImage().hashCode() | getFlags();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.resource.CompositeImageDescriptor#drawCompositeImage(int, int)
-	 */
-	protected void drawCompositeImage(int width, int height) {
-		ImageData bg= getBaseImage().getImageData();
-		if (bg == null) {
-			bg = DEFAULT_IMAGE_DATA;
-		}
-		drawImage(bg, 0, 0);
-		drawOverlays();
-	}
-
-	private ImageData getImageData(String imageDescriptorKey) {
-		return JavaScriptImageRegistry.getSharedImage(imageDescriptorKey).getImageData();
-	}
-	/**
-	 * Add any overlays to the image as specified in the flags.
-	 */
-	protected void drawOverlays() {
-		int flags = getFlags();
-		int x = 0;
-		int y = 0;
-		ImageData data = null;
-		if ((flags & INSTALLED) != 0) {
-			x = 0;
-			y = getSize().y;
-			if ((flags & ENABLED) != 0) {
-				data = getImageData(ISharedImages.IMG_OVR_INSTALLED);
-			} else {
-				data = getImageData(ISharedImages.IMG_OVR_INSTALLED_DISABLED);
-			}
-				
-			y -= data.height;
-			drawImage(data, x, y);
-		}
-		if ((flags & SCOPED) != 0) {
-			if ((flags & ENABLED) != 0) {
-				data = getImageData(ISharedImages.IMG_OVR_SCOPED);
-			} else {
-				data = getImageData(ISharedImages.IMG_OVR_SCOPED_DISABLED);
-			}
-			x = 0;
-			y = getSize().y;
-			y-= data.height;
-			drawImage(data, x, y);
-		}
-		if ((flags & CONDITIONAL) != 0) {
-			if ((flags & ENABLED) != 0) {
-				data = getImageData(ISharedImages.IMG_OVR_CONDITIONAL);
-			} else {
-				data = getImageData(ISharedImages.IMG_OVR_CONDITIONAL_DISABLED);
-			}
-			x = 0;
-			y = 0;
-			drawImage(data, x, y);
-		}
-		if ((flags & ENTRY) != 0) {
-			x = getSize().x;
-			y = 0;
-			if ((flags & ENABLED) != 0) {
-				data = getImageData(ISharedImages.IMG_OVR_ENTRY);
-			} else {
-				data = getImageData(ISharedImages.IMG_OVR_ENTRY_DISABLED);
-			}
-			x -= data.width;
-			x = x - 2;
-			drawImage(data, x, y);
-		}
-		if ((flags & EXIT)  != 0){
-			x = getSize().x;
-			y = getSize().y;
-			if ((flags & ENABLED) != 0) {
-				data = getImageData(ISharedImages.IMG_OVR_EXIT);
-			} else {
-				data = getImageData(ISharedImages.IMG_OVR_EXIT_DISABLED);
-			}
-			x -= data.width;
-			x = x - 2;
-			y -= data.height;
-			drawImage(data, x, y);
-		}
-	}
-	
-	protected Image getBaseImage() {
-		return fBaseImage;
-	}
-
-	protected void setBaseImage(Image baseImage) {
-		fBaseImage = baseImage;
-	}
-
-	protected int getFlags() {
-		return fFlags;
-	}
-
-	protected void setFlags(int flags) {
-		fFlags = flags;
-	}
-
-	protected void setSize(Point size) {
-		fSize = size;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/JavaScriptImageRegistry.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/JavaScriptImageRegistry.java
deleted file mode 100644
index f1da8bd..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/JavaScriptImageRegistry.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui;
-
-import java.net.URL;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.PlatformUI;
-import org.osgi.framework.Bundle;
-
-/**
- * Image registry for shared images used in JavaScript Debug UI
- * 
- * @since 1.0
- */
-public final class JavaScriptImageRegistry {
-
-	/** 
-	 * The image registry containing <code>Image</code>s and <code>ImageDescriptor</code>s.
-	 */
-	private static ImageRegistry imageRegistry;
-	private static ImageDescriptorRegistry descRegistry;
-	
-	private static String ICONS_PATH = "$nl$/icons/"; //$NON-NLS-1$
-	
-	/**
-	 * Icon paths
-	 */
-	private final static String ELCL = ICONS_PATH + "elcl16/"; //enabled - size 16x16 //$NON-NLS-1$
-	private final static String OVR = ICONS_PATH + "ovr16/"; //overlays //$NON-NLS-1$
-	private final static String DLCL = ICONS_PATH + "dlcl16/"; //disabled icons //$NON-NLS-1$
-	
-	/**
-	 * Declare all images
-	 */
-	private static void declareImages() {
-		//ELCL
-		declareRegistryImage(ISharedImages.IMG_SCRIPT, ELCL + "script.gif"); //$NON-NLS-1$
-		declareRegistryImage(ISharedImages.IMG_SCRIPT_GRP, ELCL + "script_grp.gif"); //$NON-NLS-1$
-		declareRegistryImage(ISharedImages.IMG_LOCAL_VAR, ELCL + "localvariable.gif"); //$NON-NLS-1$
-		declareRegistryImage(ISharedImages.IMG_CONNECT, ELCL + "connect.gif"); //$NON-NLS-1$
-		declareRegistryImage(ISharedImages.IMG_BRKP, ELCL + "brkp_obj.gif"); //$NON-NLS-1$
-		declareRegistryImage(ISharedImages.IMG_THIS_VAR, ELCL + "this_var.gif"); //$NON-NLS-1$
-		declareRegistryImage(ISharedImages.IMG_PROTO_VAR, ELCL + "proto_var.gif"); //$NON-NLS-1$
-		declareRegistryImage(ISharedImages.IMG_SOURCE, ELCL + "source.gif"); //$NON-NLS-1$
-		
-		//DLCL
-		declareRegistryImage(ISharedImages.IMG_BRKP_DISABLED, DLCL + "brkpd_obj.gif"); //$NON-NLS-1$
-		
-		//overlays
-		declareRegistryImage(ISharedImages.IMG_OVR_CONDITIONAL, OVR + "conditional_ovr.gif"); //$NON-NLS-1$
-		declareRegistryImage(ISharedImages.IMG_OVR_CONDITIONAL_DISABLED, OVR + "conditional_ovr_disabled.gif"); //$NON-NLS-1$
-		declareRegistryImage(ISharedImages.IMG_OVR_ENTRY, OVR + "entry_ovr.gif"); //$NON-NLS-1$
-		declareRegistryImage(ISharedImages.IMG_OVR_ENTRY_DISABLED, OVR + "entry_ovr_disabled.gif"); //$NON-NLS-1$
-		declareRegistryImage(ISharedImages.IMG_OVR_EXIT, OVR + "exit_ovr.gif"); //$NON-NLS-1$
-		declareRegistryImage(ISharedImages.IMG_OVR_EXIT_DISABLED, OVR + "exit_ovr_disabled.gif"); //$NON-NLS-1$
-		declareRegistryImage(ISharedImages.IMG_OVR_INSTALLED, OVR + "installed_ovr.gif"); //$NON-NLS-1$
-		declareRegistryImage(ISharedImages.IMG_OVR_INSTALLED_DISABLED, OVR + "installed_ovr_disabled.gif"); //$NON-NLS-1$
-		declareRegistryImage(ISharedImages.IMG_OVR_SCOPED, OVR + "scoped_ovr.gif"); //$NON-NLS-1$
-		declareRegistryImage(ISharedImages.IMG_OVR_SCOPED_DISABLED, OVR + "scoped_ovr_disabled.gif"); //$NON-NLS-1$
-	}
-	
-	/**
-	 * Declare an Image in the registry table.
-	 * @param key 	The key to use when registering the image
-	 * @param path	The path where the image can be found. This path is relative to where
-	 *				this plugin class is found (i.e. typically the packages directory)
-	 */
-	private final static void declareRegistryImage(String key, String path) {
-		ImageDescriptor desc = ImageDescriptor.getMissingImageDescriptor();
-		Bundle bundle = Platform.getBundle(JavaScriptDebugUIPlugin.PLUGIN_ID);
-		URL url = null;
-		if (bundle != null){
-			url = FileLocator.find(bundle, new Path(path), null);
-			if(url != null) {
-				desc = ImageDescriptor.createFromURL(url);
-			}
-		}
-		imageRegistry.put(key, desc);
-	}
-	
-	/**
-	 * Returns the shared image for the given key or <code>null</code>.
-	 * @param key
-	 * @return the requested image or <code>null</code> if the image does not exist
-	 */
-	public static Image getSharedImage(String key) {
-		if (imageRegistry == null) {
-			initializeImageRegistry();
-		}
-		return imageRegistry.get(key);
-	}
-	
-	/**
-	 * Initializes the registry if it has not been already
-	 * @return the initialized registry
-	 */
-	private synchronized static ImageRegistry initializeImageRegistry() {
-		if (imageRegistry == null) {
-			imageRegistry = new ImageRegistry(PlatformUI.getWorkbench().getDisplay());
-			declareImages();
-		}
-		return imageRegistry;
-	}
-	
-	/**
-	 * Creates the image from the descriptor and caches it for proper disposal
-	 * @param descriptor
-	 * @return
-	 */
-	public static Image getImage(ImageDescriptor descriptor) {
-		if(descRegistry == null) {
-			descRegistry = new ImageDescriptorRegistry();
-		}
-		return descRegistry.get(descriptor);
-	}
-	
-	/**
-	 * Disposes the image registry
-	 */
-	public static void dispose() {
-		if(imageRegistry != null) {
-			imageRegistry.dispose();
-		}
-		if(descRegistry != null) {
-			descRegistry.dispose();
-		}
-	}
-	
-	/**
-	 * Constructor
-	 */
-	private JavaScriptImageRegistry() {
-		// no direct instantiation
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/JavaScriptModelPresentation.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/JavaScriptModelPresentation.java
deleted file mode 100644
index 4f1f99e..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/JavaScriptModelPresentation.java
+++ /dev/null
@@ -1,553 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui;
-
-import java.io.File;
-import java.io.UnsupportedEncodingException;
-import java.net.URISyntaxException;
-import java.net.URLDecoder;
-import java.util.HashMap;
-
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.URIUtil;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IDisconnect;
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.debug.core.model.ITerminate;
-import org.eclipse.debug.core.model.IThread;
-import org.eclipse.debug.core.model.IValue;
-import org.eclipse.debug.core.model.IVariable;
-import org.eclipse.debug.core.sourcelookup.containers.LocalFileStorage;
-import org.eclipse.debug.ui.IDebugModelPresentationExtension;
-import org.eclipse.debug.ui.IValueDetailListener;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.IEditorDescriptor;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.ide.FileStoreEditorInput;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.wst.jsdt.core.Signature;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptFunctionBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLoadBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptStackFrame;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptValue;
-import org.eclipse.wst.jsdt.debug.core.model.IScript;
-import org.eclipse.wst.jsdt.debug.core.model.IScriptGroup;
-import org.eclipse.wst.jsdt.debug.internal.core.Constants;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.core.TextUtils;
-import org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptExceptionBreakpoint;
-import org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptValue;
-import org.eclipse.wst.jsdt.debug.internal.ui.eval.JavaScriptInspectExpression;
-
-/**
- * Default model presentation for JSDI model elements
- * 
- * @since 0.9
- */
-public class JavaScriptModelPresentation extends LabelProvider implements IDebugModelPresentationExtension {
-
-	/**
-	 * Qualified names presentation property (value <code>"DISPLAY_QUALIFIED_NAMES"</code>).
-	 * When <code>DISPLAY_QUALIFIED_NAMES</code> is set to <code>True</code>,
-	 * this label provider should use fully qualified type names when rendering elements.
-	 * When set to <code>False</code>, this label provider should use simple
-	 * names when rendering elements.
-	 * @see #setAttribute(String, Object)
-	 */
-	static final String DISPLAY_QUALIFIED_NAMES = "DISPLAY_QUALIFIED_NAMES"; //$NON-NLS-1$
-	
-	/**
-	 * Map of attributes set from the debug model - i.e. things like if qualified names are being shown or not
-	 */
-	HashMap attributes = null;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDebugModelPresentationExtension#requiresUIThread(java.lang.Object)
-	 */
-	public boolean requiresUIThread(Object element) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDebugModelPresentation#computeDetail(org.eclipse.debug.core.model.IValue, org.eclipse.debug.ui.IValueDetailListener)
-	 */
-	public void computeDetail(IValue value, IValueDetailListener listener) {
-		if(value instanceof IJavaScriptValue) {
-			listener.detailComputed(value, ((IJavaScriptValue)value).getDetailString());	
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDebugModelPresentation#setAttribute(java.lang.String, java.lang.Object)
-	 */
-	public void setAttribute(String attribute, Object value) {
-		if(this.attributes == null) {
-			this.attributes = new HashMap();
-		}
-		this.attributes.put(attribute, value);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.BaseLabelProvider#dispose()
-	 */
-	public void dispose() {
-		if(this.attributes != null) {
-			this.attributes.clear();
-			this.attributes = null;
-		}
-		super.dispose();
-	}
-	
-	/**
-	 * @return true is qualified names are being shown in the various debug views
-	 */
-	boolean showQualifiedNames() {
-		if(this.attributes != null) {
-			Boolean show = (Boolean) this.attributes.get(DISPLAY_QUALIFIED_NAMES);
-			if(show != null) {
-				return show.booleanValue();
-			}
-		}
-		//TODO hack to always return qualified names until the toggle action is platform available
-		return true;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
-	 */
-	public String getText(Object element) {
-		StringBuffer buffer = new StringBuffer();
-		try {
-			if(element instanceof IDebugElement) {
-				if(element instanceof IDebugTarget) {
-					buffer.append(((IDebugTarget)element).getName());
-				}
-				else if(element instanceof IStackFrame) {
-					buffer.append(getStackframeText((IJavaScriptStackFrame) element));
-				}
-				else if(element instanceof IThread) {
-					buffer.append(getThreadText((IJavaScriptThread) element));
-				}
-				else if(element instanceof IVariable) {
-					buffer.append(((IVariable)element).getName());
-				}
-				else if(element instanceof IValue) {
-					buffer.append(((IValue)element).getValueString());
-				}
-				else if(element instanceof IScriptGroup) {
-					buffer.append(Messages.scripts);
-				}
-				else if(element instanceof IScript) {
-					buffer.append(getScriptText((IScript) element));
-				}
-			}
-			if(element instanceof JavaScriptInspectExpression) {
-				JavaScriptInspectExpression exp = (JavaScriptInspectExpression) element;
-				return exp.getValue().getReferenceTypeName();
-			}
-			if(element instanceof ITerminate) {
-				if(((ITerminate)element).isTerminated()) {
-					buffer.insert(0, Messages.terminated);
-				}
-				else if(element instanceof IDisconnect) {
-					if(((IDisconnect)element).isDisconnected()) {
-						buffer.insert(0, Messages.disconnected);
-					}
-				}
-			}
-			else if(element instanceof IDisconnect) {
-				if(((IDisconnect)element).isDisconnected()) {
-					buffer.insert(0, Messages.disconnected);
-				}
-			}
-			else if(element instanceof IJavaScriptFunctionBreakpoint) {
-				buffer.append(getFunctionBreakpointText((IJavaScriptFunctionBreakpoint) element));
-			}
-			else if(element instanceof IJavaScriptLoadBreakpoint) {
-				buffer.append(getScriptLoadBreakpointText((IJavaScriptLoadBreakpoint) element));
-			}
-			else if(element instanceof IJavaScriptLineBreakpoint) {
-				buffer.append(getLineBreakpointText((IJavaScriptLineBreakpoint) element));
-			}
-		}
-		catch(CoreException ce) {
-			JavaScriptDebugUIPlugin.log(ce);
-			buffer.append(Messages.unknown);
-		}
-		if(buffer.length() < 1) {
-			return Messages.unknown;
-		}
-		return buffer.toString();
-	}
-	
-	/**
-	 * Computes the thread name + adornment
-	 * 
-	 * @param thread
-	 * @return
-	 * @throws DebugException
-	 */
-	String getThreadText(IJavaScriptThread thread) throws DebugException {
-		String adornment = Messages.unknown_state;
-		if(thread.isSuspended()) {
-			IBreakpoint[] bps = thread.getBreakpoints();
-			if(bps.length > 0) {
-				try {
-					IJavaScriptBreakpoint breakpoint = (IJavaScriptBreakpoint) bps[0];
-					if (breakpoint instanceof IJavaScriptLoadBreakpoint) {
-						String name = breakpoint.getScriptPath();
-						if (Constants.EMPTY_STRING.equals(name)) {
-							name = getSourceName(thread);
-						}
-						else {
-							//decode it
-							try {
-								name = URLDecoder.decode(name, Constants.UTF_8);
-							}
-							catch(UnsupportedEncodingException uee) {
-								//ignore
-							}
-						}
-						adornment = NLS.bind(Messages.suspend_loading_script, name);
-					}
-					else if(breakpoint instanceof JavaScriptExceptionBreakpoint) {
-						adornment = NLS.bind(Messages.suspended_on_exception, breakpoint.getMarker().getAttribute(JavaScriptExceptionBreakpoint.MESSAGE));
-					}
-					else if (breakpoint instanceof IJavaScriptLineBreakpoint) {
-						IJavaScriptLineBreakpoint bp = (IJavaScriptLineBreakpoint) breakpoint;
-						adornment = NLS.bind(Messages.suspended_on_line_breakpoint, new String[] { Integer.toString(bp.getLineNumber()), getSourceName(thread) });
-					}
-					else if(breakpoint instanceof IJavaScriptFunctionBreakpoint) {
-						IJavaScriptFunctionBreakpoint bp = (IJavaScriptFunctionBreakpoint) breakpoint;
-						adornment = NLS.bind(Messages.suspended_on_func_breakpoint, new String[] {bp.getFunctionName(), getSourceName(thread)});
-					}
-					// TODO also need to report stopped at debugger; statement
-				} catch (CoreException ce) {
-					JavaScriptDebugPlugin.log(ce);
-				}
-			}
-			else {
-				adornment = Messages.suspended_state;
-			}
-		}
-		else if(thread.isStepping()) {
-			adornment = Messages.stepping_state;
-		}
-		else if(thread.isTerminated()) {
-			adornment = Messages.terminated_state;
-		}
-		else {
-			adornment = Messages.running_state;
-		}
-		return NLS.bind(Messages.thread_name, new String[] {thread.getName(), adornment});
-	}
-	
-	/**
-	 * Returns the name of the source from the top stackframe or a default name
-	 * <code>&lt;evaluated_source&gt;</code>
-	 * 
-	 * @return the name for the source
-	 * @throws DebugException
-	 */
-	String getSourceName(IJavaScriptThread thread) throws DebugException {
-		IJavaScriptStackFrame frame = (IJavaScriptStackFrame) thread.getTopStackFrame();
-		if (frame != null) {
-			try {
-				String uri = URLDecoder.decode(frame.getSourceName(), Constants.UTF_8);
-				return TextUtils.shortenText(uri, 100);
-			}
-			catch (UnsupportedEncodingException uee) {
-				//ignore
-			}
-		}
-		// all else failed say "evaluated_script"
-		return Messages.evald_script;
-	}
-	
-	/**
-	 * Returns the display name of the given {@link IJavaScriptStackFrame}
-	 * 
-	 * @param frame
-	 * @return the display text or {@link Messages#unknown}
-	 * @throws DebugException
-	 */
-	String getStackframeText(IJavaScriptStackFrame frame) throws DebugException {
-		String fname = frame.getName();
-		if(fname == null || fname.trim().length() < 1) {
-			return NLS.bind(Messages.stackframe_name, new String[] {
-					frame.getSourceName(),
-					Integer.toString(frame.getLineNumber())});
-		}
-		return NLS.bind(Messages.JavaScriptModelPresentation_stackframe_name_with_fname, new String[] {
-				frame.getSourceName(),
-				fname,
-				Integer.toString(frame.getLineNumber())});
-	}
-	
-	/**
-	 * Returns the display text for the given script element
-	 * 
-	 * @param script
-	 * @return the display text for the given script or {@link Messages#unknown}
-	 */
-	String getScriptText(IScript script) {
-		String uri;
-		try {
-			uri = URLDecoder.decode(script.sourceURI().toString(), Constants.UTF_8);
-			return TextUtils.shortenText(uri, 100);
-		} catch (UnsupportedEncodingException e) {
-			//do nothing
-		}
-		return Messages.unknown;
-	}
-
-	/**
-	 * Returns the text for a line breakpoint
-	 * @param breakpoint
-	 * @return the breakpoint text
-	 * @throws CoreException
-	 */
-	String getLineBreakpointText(IJavaScriptLineBreakpoint breakpoint) throws CoreException {
-		String path = getElementPath(breakpoint.getScriptPath());
-		StringBuffer buffer = new StringBuffer(path);
-		buffer.append(NLS.bind(Messages.bp_line_number, new String[] {Integer.toString(breakpoint.getLineNumber())}));
-		int hitcount = breakpoint.getHitCount();
-		if(hitcount > 0) {
-			buffer.append(NLS.bind(Messages.bp_hit_count, new String[] {Integer.toString(hitcount)}));
-		}
-		if(breakpoint.isConditionEnabled()) {
-			buffer.append(Messages.bp_conditonal);
-		}
-		if(breakpoint.getSuspendPolicy() == IJavaScriptBreakpoint.SUSPEND_TARGET) {
-			buffer.append(Messages.bp_suspend_vm);
-		}
-		return buffer.toString();
-	}
-	
-	/**
-	 * Returns the text for a method breakpoint
-	 * @param breakpoint
-	 * @return the breakpoint text
-	 * @throws CoreException
-	 */
-	String getFunctionBreakpointText(IJavaScriptFunctionBreakpoint breakpoint) throws CoreException {
-		String path = getElementPath(breakpoint.getScriptPath());
-		StringBuffer buffer = new StringBuffer(path);
-		if(breakpoint.isEntry()) {
-			if(breakpoint.isExit()) {
-				buffer.append(Messages.bp_entry_and_exit);
-			}
-			else {
-				buffer.append(Messages.bp_entry_only);
-			}
-		}
-		else if(breakpoint.isExit()) {
-			buffer.append(Messages.bp_exit_only);
-		}
-		int hitcount = breakpoint.getHitCount();
-		if(hitcount > 0) {
-			buffer.append(NLS.bind(Messages.bp_hit_count, new String[] {Integer.toString(hitcount)}));
-		}
-		if(breakpoint.isConditionEnabled()) {
-			buffer.append(Messages.bp_conditional);
-		}
-		if(breakpoint.getSuspendPolicy() == IJavaScriptBreakpoint.SUSPEND_TARGET) {
-			buffer.append(Messages.bp_suspend_vm);
-		}
-		String method = Signature.toString(breakpoint.getSignature(), breakpoint.getFunctionName(), null, false, false);
-		buffer.append(" - ").append(method); //$NON-NLS-1$
-		return buffer.toString();
-	}
-	
-	/**
-	 * Returns the text for a script load breakpoint
-	 * @param breakpoint
-	 * @return the breakpoint text
-	 * @throws CoreException
-	 */
-	String getScriptLoadBreakpointText(IJavaScriptLoadBreakpoint breakpoint) throws CoreException {
-		String path = getElementPath(breakpoint.getScriptPath());
-		StringBuffer buffer = new StringBuffer(path);
-		int hitcount = breakpoint.getHitCount();
-		if(hitcount > 0) {
-			buffer.append(NLS.bind(Messages.bp_hit_count, new String[] {Integer.toString(hitcount)}));
-		}
-		if(breakpoint.getSuspendPolicy() == IJavaScriptBreakpoint.SUSPEND_TARGET) {
-			buffer.append(Messages.bp_suspend_vm);
-		}
-		return buffer.toString();
-	}
-	
-	/**
-	 * Returns the path of the element based on if qualified names are being shown
-	 * @param path
-	 * @return
-	 */
-	String getElementPath(String path) {
-		if(!showQualifiedNames()) {
-			try {
-				return URIUtil.lastSegment(URIUtil.fromString(path));
-			}
-			catch(URISyntaxException urise) {
-				JavaScriptDebugUIPlugin.log(urise);
-			}
-		}
-		return path;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object)
-	 */
-	public Image getImage(Object element) {
-		try {
-			if(element instanceof IVariable) {
-				IVariable var = (IVariable) element;
-				return getImageFromType(var);
-			}
-			if(element instanceof IJavaScriptLineBreakpoint || element instanceof IJavaScriptFunctionBreakpoint) {
-				IJavaScriptBreakpoint breakpoint = (IJavaScriptBreakpoint) element;
-				int flags = computeBreakpointAdornmentFlags(breakpoint);
-				if(breakpoint.isEnabled()) {
-					return JavaScriptImageRegistry.getImage(new JavaScriptImageDescriptor(JavaScriptImageRegistry.getSharedImage(ISharedImages.IMG_BRKP), flags));
-				}
-				return JavaScriptImageRegistry.getImage(new JavaScriptImageDescriptor(JavaScriptImageRegistry.getSharedImage(ISharedImages.IMG_BRKP_DISABLED), flags));
-			}
-			if(element instanceof IScript) {
-				return JavaScriptImageRegistry.getImage(new JavaScriptImageDescriptor(JavaScriptImageRegistry.getSharedImage(ISharedImages.IMG_SCRIPT), 0));
-			}
-			if(element instanceof IScriptGroup) {
-				return JavaScriptImageRegistry.getImage(new JavaScriptImageDescriptor(JavaScriptImageRegistry.getSharedImage(ISharedImages.IMG_SCRIPT_GRP), 0));
-			}
-		}
-		catch(DebugException de) {
-			JavaScriptDebugUIPlugin.log(de);
-		}
-		catch(CoreException ce) {
-			JavaScriptDebugUIPlugin.log(ce);
-		}
-		return null;
-	}
-	
-	/**
-	 * Computes the flags for overlay adornments for a breakpoint image for the given breakpoint
-	 * @param breakpoint
-	 * @return the or'd set of flags describing the required overlays for the given breakpoint
-	 * @see {@link JavaScriptImageDescriptor} for the complete list of accepted flags
-	 */
-	int computeBreakpointAdornmentFlags(IJavaScriptBreakpoint breakpoint)  {
-		int flags = 0;
-		try {
-			if (breakpoint.isEnabled()) {
-				flags |= JavaScriptImageDescriptor.ENABLED;
-			}
-			if (breakpoint.isInstalled()) {
-				flags |= JavaScriptImageDescriptor.INSTALLED;
-			}
-			if (breakpoint instanceof IJavaScriptLineBreakpoint) {
-				if (((IJavaScriptLineBreakpoint)breakpoint).isConditionEnabled()) {
-					flags |= JavaScriptImageDescriptor.CONDITIONAL;
-				}
-			}
-			if (breakpoint instanceof IJavaScriptFunctionBreakpoint) {
-				IJavaScriptFunctionBreakpoint mBreakpoint= (IJavaScriptFunctionBreakpoint)breakpoint;
-				if (mBreakpoint.isEntry()) {
-					flags |= JavaScriptImageDescriptor.ENTRY;
-				}
-				if (mBreakpoint.isExit()) {
-					flags |= JavaScriptImageDescriptor.EXIT;
-				}
-			}
-		} 
-		catch (CoreException e) {}
-		return flags;
-	}
-	
-	/**
-	 * Returns the specific image for the given type
-	 * @param variable the variable to get the image for
-	 * @return the image
-	 * @throws DebugException 
-	 */
-	Image getImageFromType(IVariable variable) throws DebugException {
-		String name = variable.getName();
-		if(JavaScriptValue.THIS.equals(name)) {
-			return JavaScriptImageRegistry.getImage(new JavaScriptImageDescriptor(JavaScriptImageRegistry.getSharedImage(ISharedImages.IMG_THIS_VAR), 0));
-		}
-		if(JavaScriptValue.PROTO.equals(name)) {
-			return JavaScriptImageRegistry.getImage(new JavaScriptImageDescriptor(JavaScriptImageRegistry.getSharedImage(ISharedImages.IMG_PROTO_VAR), 0));
-		}
-		return JavaScriptImageRegistry.getSharedImage(ISharedImages.IMG_LOCAL_VAR);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ISourcePresentation#getEditorId(org.eclipse.ui.IEditorInput, java.lang.Object)
-	 */
-	public String getEditorId(IEditorInput input, Object element) {
-		try {
-			IEditorDescriptor descriptor = IDE.getEditorDescriptor(input.getName());
-			return descriptor.getId();
-		} catch (PartInitException e) {
-			return null;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ISourcePresentation#getEditorInput(java.lang.Object)
-	 */
-	public IEditorInput getEditorInput(Object element) {
-		if(element instanceof LocalFileStorage) {
-			return getEditorInput(((LocalFileStorage)element).getFile());
-		}
-		if(element instanceof File) {
-			return new FileStoreEditorInput(EFS.getLocalFileSystem().fromLocalFile((File) element));
-		}
-		if(element instanceof IFile) {
-			return new FileEditorInput((IFile) element);
-		}
-		if(element instanceof IJavaScriptLoadBreakpoint) {
-			try {
-				IJavaScriptLoadBreakpoint bp = (IJavaScriptLoadBreakpoint) element;
-				IPath path = new Path(bp.getScriptPath());
-				IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(path);
-				if(resource != null && resource.getType() == IResource.FILE) {
-					return new FileEditorInput((IFile) resource);
-				}
-			}
-			catch(CoreException ce) {
-				JavaScriptDebugUIPlugin.log(ce);
-			}
-		}
-		if(element instanceof IJavaScriptBreakpoint) {
-			IResource resource = ((IJavaScriptBreakpoint)element).getMarker().getResource();
-			if(resource.getType() == IResource.FILE) {
-				return new FileEditorInput((IFile) resource);
-			}
-		}
-		return null;
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/Messages.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/Messages.java
deleted file mode 100644
index 15c299b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/Messages.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * 
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.internal.ui.messages"; //$NON-NLS-1$
-	public static String add_script_load_bp;
-	public static String bp_conditional;
-	public static String bp_conditonal;
-	public static String bp_entry_and_exit;
-	public static String bp_entry_only;
-	public static String bp_exit_only;
-	public static String bp_hit_count;
-	public static String bp_line_number;
-	public static String bp_suspend_vm;
-	public static String breakpoint_configuration;
-	public static String connect;
-	public static String connector;
-	public static String connector_properties;
-	public static String creating_script_load_bp;
-	public static String disconnected;
-	public static String enable_hit_count;
-	public static String enter_new_hit_count;
-	public static String evald_script;
-	public static String exception_occurred_setting_bp_properties;
-	public static String hit_count_must_be_positive;
-	public static String JavaScriptModelPresentation_stackframe_name_with_fname;
-	public static String no_description_provided;
-	public static String opening_source__0;
-	public static String running_state;
-	public static String scripts;
-	public static String select_javascript_file;
-	public static String set_bp_hit_count;
-	public static String stackframe_name;
-	public static String stepping_state;
-	public static String suspend_loading_script;
-	public static String suspend_target;
-	public static String suspend_thread;
-	public static String suspended_on_exception;
-	public static String suspended_on_func_breakpoint;
-	public static String suspended_on_line_breakpoint;
-	public static String suspended_state;
-	public static String terminated;
-	public static String terminated_state;
-	public static String the_argument_0_is_not_valid;
-	public static String thread_name;
-	public static String unknown;
-	public static String unknown_state;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/PreferencesManager.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/PreferencesManager.java
deleted file mode 100644
index 174fc47..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/PreferencesManager.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui;
-
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-
-/**
- * Manager to handle updating preferences and providing 
- * delegation for common preference calls.
- * 
- * @since 1.0
- */
-public class PreferencesManager implements IPropertyChangeListener {
-
-	/**
-	 * Preference controlling if loaded scripts should be shown in the Debug view
-	 */
-	public static final String PREF_SHOW_LOADED_SCRIPTS = JavaScriptDebugUIPlugin.PLUGIN_ID + ".show_loaded_scripts"; //$NON-NLS-1$
-
-	private static PreferencesManager fgManager = null;
-	
-	/**
-	 * Constructor
-	 */
-	private PreferencesManager() {
-		/*no instantiation*/
-	}
-	
-	/**
-	 * Returns the singleton instance of the manager
-	 * @return the manager
-	 */
-	public static synchronized PreferencesManager getManager() {
-		if(fgManager == null) {
-			fgManager = new PreferencesManager();
-		}
-		return fgManager;
-	}
-	
-	/**
-	 * If loaded scripts should be shown in the Debug view
-	 * @return <code>true</code> if loaded scripts should be shown in the Debug view
-	 */
-	public boolean showLoadedScripts() {
-		return JavaScriptDebugUIPlugin.getDefault().getPreferenceStore().getBoolean(PREF_SHOW_LOADED_SCRIPTS);
-	}
-	
-	/**
-	 * Sets if loaded scripts should be shown in the Debug or not
-	 * @param show <code>true</code> if loaded scripts should be shown <code>false</code> otherwise
-	 */
-	public void showLoadedScripts(boolean show) {
-		JavaScriptDebugUIPlugin.getDefault().getPreferenceStore().setValue(PREF_SHOW_LOADED_SCRIPTS, show);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-	 */
-	public void propertyChange(PropertyChangeEvent event) {
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/SWTFactory.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/SWTFactory.java
deleted file mode 100644
index 78ebd5e..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/SWTFactory.java
+++ /dev/null
@@ -1,507 +0,0 @@
-/*******************************************************************************
- *  Copyright (c) 2010 IBM Corporation and others.
- *  All rights reserved. This program and the accompanying materials
- *  are made available under the terms of the Eclipse Public License v1.0
- *  which accompanies this distribution, and is available at
- *  http://www.eclipse.org/legal/epl-v10.html
- * 
- *  Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui;
-
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.layout.PixelConverter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Factory class to create some SWT resources. 
- * 
- * @since 1.0
- */
-public class SWTFactory {
-		
-	/**
-	 * Returns a width hint for a button control.
-	 */
-	public static int getButtonWidthHint(Button button) {
-		PixelConverter converter= new PixelConverter(button);
-		int widthHint= converter.convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
-		return Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
-	}
-	
-	/**
-	 * Sets width and height hint for the button control.
-	 * <b>Note:</b> This is a NOP if the button's layout data is not
-	 * an instance of <code>GridData</code>.
-	 * 
-	 * @param	the button for which to set the dimension hint
-	 */		
-	public static void setButtonDimensionHint(Button button) {
-		Assert.isNotNull(button);
-		Object gd= button.getLayoutData();
-		if (gd instanceof GridData) {
-			((GridData)gd).widthHint= getButtonWidthHint(button);	
-			((GridData)gd).horizontalAlignment = GridData.FILL;	 
-		}
-	}		
-	
-	/**
-	 * Creates a check box button using the parents' font
-	 * @param parent the parent to add the button to
-	 * @param label the label for the button
-	 * @param image the image for the button 
-	 * @param checked the initial checked state of the button
-	 * @param hspan the horizontal span to take up in the parent composite
-	 * @return a new checked button set to the initial checked state
-	 */
-	public static Button createCheckButton(Composite parent, String label, Image image, boolean checked, int hspan) {
-		Button button = new Button(parent, SWT.CHECK);
-		button.setFont(parent.getFont());
-		button.setSelection(checked);
-		if(image != null) {
-			button.setImage(image);
-		}
-		if(label != null) {
-			button.setText(label);
-		}
-		GridData gd = new GridData();
-		gd.horizontalSpan = hspan;
-		button.setLayoutData(gd);
-		setButtonDimensionHint(button);
-		return button;
-	}
-	
-	/**
-	 * Creates and returns a new push button with the given
-	 * label and/or image.
-	 * 
-	 * @param parent parent control
-	 * @param label button label or <code>null</code>
-	 * @param image image of <code>null</code>
-	 * 
-	 * @return a new push button
-	 */
-	public static Button createPushButton(Composite parent, String label, Image image) {
-		Button button = new Button(parent, SWT.PUSH);
-		button.setFont(parent.getFont());
-		if (image != null) {
-			button.setImage(image);
-		}
-		if (label != null) {
-			button.setText(label);
-		}
-		GridData gd = new GridData();
-		button.setLayoutData(gd);	
-		setButtonDimensionHint(button);
-		return button;	
-	}	
-
-	/**
-	 * Creates and returns a new push button with the given
-	 * label and/or image.
-	 * 
-	 * @param parent parent control
-	 * @param label button label or <code>null</code>
-	 * @param image image of <code>null</code>
-	 * @param fill the alignment for the new button
-	 * 
-	 * @return a new push button
-	 */
-	public static Button createPushButton(Composite parent, String label, Image image, int fill) {
-		Button button = new Button(parent, SWT.PUSH);
-		button.setFont(parent.getFont());
-		if (image != null) {
-			button.setImage(image);
-		}
-		if (label != null) {
-			button.setText(label);
-		}
-		GridData gd = new GridData(fill);
-		button.setLayoutData(gd);	
-		setButtonDimensionHint(button);
-		return button;	
-	}	
-	
-	/**
-	 * Creates and returns a new radio button with the given
-	 * label.
-	 * 
-	 * @param parent parent control
-	 * @param label button label or <code>null</code>
-	 * 
-	 * @return a new radio button
-	 */
-	public static Button createRadioButton(Composite parent, String label) {
-		Button button = new Button(parent, SWT.RADIO);
-		button.setFont(parent.getFont());
-		if (label != null) {
-			button.setText(label);
-		}
-		GridData gd = new GridData();
-		button.setLayoutData(gd);	
-		setButtonDimensionHint(button);
-		return button;	
-	}	
-	
-	/**
-	 * Creates a new label widget
-	 * @param parent the parent composite to add this label widget to
-	 * @param text the text for the label
-	 * @param hspan the horizontal span to take up in the parent composite
-	 * @return the new label
-	 */
-	public static Label createLabel(Composite parent, String text, int hspan) {
-		Label l = new Label(parent, SWT.NONE);
-		l.setFont(parent.getFont());
-		l.setText(text);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = hspan;
-		gd.grabExcessHorizontalSpace = false;
-		l.setLayoutData(gd);
-		return l;
-	}
-	
-	/**
-	 * Creates a new label widget
-	 * @param parent the parent composite to add this label widget to
-	 * @param text the text for the label
-	 * @param font the font for the label
-	 * @param hspan the horizontal span to take up in the parent composite
-	 * @return the new label
-	 */
-	public static Label createLabel(Composite parent, String text, Font font, int hspan) {
-		Label l = new Label(parent, SWT.NONE);
-		l.setFont(font);
-		l.setText(text);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = hspan;
-		l.setLayoutData(gd);
-		return l;
-	}
-	
-	/**
-	 * Creates a wrapping label
-	 * @param parent the parent composite to add this label to
-	 * @param text the text to be displayed in the label
-	 * @param hspan the horizontal span that label should take up in the parent composite
-	 * @param wrapwidth the width hint that the label should wrap at
-	 * @return a new label that wraps at a specified width
-	 */
-	public static Label createWrapLabel(Composite parent, String text, int hspan, int wrapwidth) {
-		Label l = new Label(parent, SWT.NONE | SWT.WRAP);
-		l.setFont(parent.getFont());
-		l.setText(text);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = hspan;
-		gd.widthHint = wrapwidth;
-		l.setLayoutData(gd);
-		return l;
-	}
-	
-	/**
-	 * Creates a new <code>CLabel</code> that will wrap at the specified width and has the specified image
-	 * @param parent the parent to add this label to
-	 * @param text the text for the label
-	 * @param image the image for the label
-	 * @param hspan the h span to take up in the parent
-	 * @param wrapwidth the with to wrap at
-	 * @return a new <code>CLabel</code>
-	 */
-	public static CLabel createWrapCLabel(Composite parent, String text, Image image, int hspan, int wrapwidth) {
-		CLabel label = new CLabel(parent, SWT.NONE | SWT.WRAP);
-		label.setFont(parent.getFont());
-		if(text != null) {
-			label.setText(text);
-		}
-		if(image != null) {
-			label.setImage(image);
-		}
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = hspan;
-		gd.widthHint = wrapwidth;
-		label.setLayoutData(gd);
-		return label;
-	}
-	
-	/**
-	 * Creates a wrapping label
-	 * @param parent the parent composite to add this label to
-	 * @param text the text to be displayed in the label
-	 * @param hspan the horizontal span that label should take up in the parent composite
-	 * @return a new label that wraps at a specified width
-	 */
-	public static Label createWrapLabel(Composite parent, String text, int hspan) {
-		Label l = new Label(parent, SWT.NONE | SWT.WRAP);
-		l.setFont(parent.getFont());
-		l.setText(text);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = hspan;
-		l.setLayoutData(gd);
-		return l;
-	}
-	
-	/**
-	 * Creates a new text widget 
-	 * @param parent the parent composite to add this text widget to
-	 * @param hspan the horizontal span to take up on the parent composite
-	 * @return the new text widget
-	 */
-	public static Text createSingleText(Composite parent, int hspan) {
-    	Text t = new Text(parent, SWT.SINGLE | SWT.BORDER);
-    	t.setFont(parent.getFont());
-    	GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-    	gd.horizontalSpan = hspan;
-    	t.setLayoutData(gd);
-    	return t;
-    }
-	
-	/**
-	 * Creates a new text widget 
-	 * @param parent the parent composite to add this text widget to
-	 * @param the OR'd style bits for the control
-	 * @param hspan the horizontal span to take up on the parent composite
-	 * @param the initial text for the control
-	 * @return the new text widget
-	 */
-	public static Text createSingleText(Composite parent, int style, int hspan, String text) {
-    	Text t = new Text(parent, SWT.SINGLE | style);
-    	t.setFont(parent.getFont());
-    	GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-    	gd.horizontalSpan = hspan;
-    	t.setLayoutData(gd);
-    	if(text != null) {
-    		t.setText(text);
-    	}
-    	return t;
-    }
-	
-	/**
-	 * Creates a new text widget 
-	 * @param parent the parent composite to add this text widget to
-	 * @param style the style bits for the text widget
-	 * @param hspan the horizontal span to take up on the parent composite
-	 * @param fill the fill for the grid layout
-	 * @return the new text widget
-	 */
-	public static Text createText(Composite parent, int style, int hspan, int fill) {
-    	Text t = new Text(parent, style);
-    	t.setFont(parent.getFont());
-    	GridData gd = new GridData(fill);
-    	gd.horizontalSpan = hspan;
-    	t.setLayoutData(gd);
-    	return t;
-    }
-	
-	/**
-	 * Creates a new text widget 
-	 * @param parent the parent composite to add this text widget to
-	 * @param style the style bits for the text widget
-	 * @param hspan the horizontal span to take up on the parent composite
-	 * @return the new text widget
-	 */
-	public static Text createText(Composite parent, int style, int hspan) {
-    	Text t = new Text(parent, style);
-    	t.setFont(parent.getFont());
-    	GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-    	gd.horizontalSpan = hspan;
-    	t.setLayoutData(gd);
-    	return t;
-    }
-	
-	/**
-	 * Creates a new text widget 
-	 * @param parent the parent composite to add this text widget to
-	 * @param style the style bits for the text widget
-	 * @param hspan the horizontal span to take up on the parent composite
-	 * @param width the desired width of the text widget
-	 * @param height the desired height of the text widget
-	 * @param fill the fill style for the widget
-	 * @return the new text widget
-	 */
-	public static Text createText(Composite parent, int style, int hspan, int width, int height, int fill) {
-    	Text t = new Text(parent, style);
-    	t.setFont(parent.getFont());
-    	GridData gd = new GridData(fill);
-    	gd.horizontalSpan = hspan;
-    	gd.widthHint = width;
-    	gd.heightHint = height;
-    	t.setLayoutData(gd);
-    	return t;
-    }
-	
-	/**
-	 * Creates a Group widget
-	 * @param parent the parent composite to add this group to
-	 * @param text the text for the heading of the group
-	 * @param columns the number of columns within the group
-	 * @param hspan the horizontal span the group should take up on the parent
-	 * @param fill the style for how this composite should fill into its parent
-	 * @return the new group
-	 * 
-	 */
-	public static Group createGroup(Composite parent, String text, int columns, int hspan, int fill) {
-    	Group g = new Group(parent, SWT.NONE);
-    	g.setLayout(new GridLayout(columns, false));
-    	g.setText(text);
-    	g.setFont(parent.getFont());
-    	GridData gd = new GridData(fill);
-		gd.horizontalSpan = hspan;
-    	g.setLayoutData(gd);
-    	return g;
-    }
-	
-	/**
-	 * Creates a Composite widget
-	 * @param parent the parent composite to add this composite to
-	 * @param font the font to set on the control
-	 * @param columns the number of columns within the composite
-	 * @param hspan the horizontal span the composite should take up on the parent
-	 * @param fill the style for how this composite should fill into its parent
-	 * @return the new group
-	 */
-	public static Composite createComposite(Composite parent, Font font, int columns, int hspan, int fill) {
-    	Composite g = new Composite(parent, SWT.NONE);
-    	g.setLayout(new GridLayout(columns, false));
-    	g.setFont(font);
-    	GridData gd = new GridData(fill);
-		gd.horizontalSpan = hspan;
-    	g.setLayoutData(gd);
-    	return g;
-    }
-	
-	/**
-	 * Creates a composite that uses the parent's font and has a grid layout
-	 * @param parent the parent to add the composite to
-	 * @param columns the number of columns the composite should have
-	 * @param hspan the horizontal span the new composite should take up in the parent
-	 * @param fill the fill style of the composite {@link GridData}
-	 * @return a new composite with a grid layout
-	 */
-	public static Composite createComposite(Composite parent, int columns, int hspan, int fill) {
-		Composite g = new Composite(parent, SWT.NONE);
-    	g.setLayout(new GridLayout(columns, false));
-    	g.setFont(parent.getFont());
-    	GridData gd = new GridData(fill);
-		gd.horizontalSpan = hspan;
-    	g.setLayoutData(gd);
-    	return g;
-	}
-	
-	/**
-	 * Creates a vertical spacer for separating components. If applied to a 
-	 * <code>GridLayout</code>, this method will automatically span all of the columns of the parent
-	 * to make vertical space
-	 * 
-	 * @param parent the parent composite to add this spacer to
-	 * @param numlines the number of vertical lines to make as space
-	 */
-	public static void createVerticalSpacer(Composite parent, int numlines) {
-		Label lbl = new Label(parent, SWT.NONE);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		Layout layout = parent.getLayout();
-		if(layout instanceof GridLayout) {
-			gd.horizontalSpan = ((GridLayout)parent.getLayout()).numColumns;
-		}
-		gd.heightHint = numlines;
-		lbl.setLayoutData(gd);
-	}
-	
-	/**
-	 * creates a horizontal spacer for separating components
-	 * @param comp
-	 * @param numlines
-	 */
-	public static void createHorizontalSpacer(Composite comp, int numlines) {
-		Label lbl = new Label(comp, SWT.NONE);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = numlines;
-		lbl.setLayoutData(gd);
-	}
-	
-	/**
-	 * Creates a Composite widget
-	 * @param parent the parent composite to add this composite to
-	 * @param font the font to set on the control
-	 * @param columns the number of columns within the composite
-	 * @param hspan the horizontal span the composite should take up on the parent
-	 * @param fill the style for how this composite should fill into its parent
-	 * @param marginwidth the width of the margin to place on the sides of the composite (default is 5, specified by GridLayout)
-	 * @param marginheight the height of the margin to place o the top and bottom of the composite
-	 * @return the new composite
-	 */
-	public static Composite createComposite(Composite parent, Font font, int columns, int hspan, int fill, int marginwidth, int marginheight) {
-		Composite g = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout(columns, false);
-		layout.marginWidth = marginwidth;
-		layout.marginHeight = marginheight;
-    	g.setLayout(layout);
-    	g.setFont(font);
-    	GridData gd = new GridData(fill);
-		gd.horizontalSpan = hspan;
-    	g.setLayoutData(gd);
-    	return g;
-	}
-	
-	/**
-	 * This method is used to make a combo box
-	 * @param parent the parent composite to add the new combo to
-	 * @param style the style for the Combo
-	 * @param hspan the horizontal span to take up on the parent composite
-	 * @param fill how the combo will fill into the composite
-	 * Can be one of <code>GridData.FILL_HORIZONAL</code>, <code>GridData.FILL_BOTH</code> or <code>GridData.FILL_VERTICAL</code>
-	 * @param items the item to put into the combo
-	 * @return a new Combo instance
-	 */
-	public static Combo createCombo(Composite parent, int style, int hspan, int fill, String[] items) {
-		Combo c = new Combo(parent, style);
-		c.setFont(parent.getFont());
-		GridData gd = new GridData(fill);
-		gd.horizontalSpan = hspan;
-		c.setLayoutData(gd);
-		if (items != null){
-			c.setItems(items);
-		}
-		// Some platforms open up combos in bad sizes without this, see bug 245569
-		c.setVisibleItemCount(30);
-		c.select(0);
-		return c;
-	}
-	
-	/**
-	 * This method is used to make a combo box with a default fill style of GridData.FILL_HORIZONTAL
-	 * @param parent the parent composite to add the new combo to
-	 * @param style the style for the Combo
-	 * @param hspan the horizontal span to take up on the parent composite
-	 * @param items the item to put into the combo
-	 * @return a new Combo instance
-	 */
-	public static Combo createCombo(Composite parent, int style, int hspan, String[] items) {
-		Combo c = new Combo(parent, style);
-		c.setFont(parent.getFont());
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = hspan;
-		c.setLayoutData(gd);
-		if (items != null){
-			c.setItems(items);
-		}
-		// Some platforms open up combos in bad sizes without this, see bug 245569
-		c.setVisibleItemCount(30);
-		c.select(0);
-		return c;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/AddScriptLoadBreakpointAction.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/AddScriptLoadBreakpointAction.java
deleted file mode 100644
index 15aa38b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/AddScriptLoadBreakpointAction.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.actions;
-
-import java.util.HashMap;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLoadBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.model.JavaScriptDebugModel;
-import org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptDebugUIPlugin;
-import org.eclipse.wst.jsdt.debug.internal.ui.Messages;
-import org.eclipse.wst.jsdt.debug.internal.ui.dialogs.ScriptSelectionDialog;
-
-/**
- * Command in the breakpoints view to add script load breakpoints
- * @since 1.0
- */
-public class AddScriptLoadBreakpointAction implements IViewActionDelegate {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		try {
-			ScriptSelectionDialog dialog = new ScriptSelectionDialog(
-					PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), 
-					false, 
-					ResourcesPlugin.getWorkspace().getRoot());
-			dialog.setTitle(Messages.add_script_load_bp);
-			if(dialog.open() == IDialogConstants.OK_ID) {
-				final IFile file = (IFile) dialog.getFirstResult();
-				final String scriptname = file.getName();
-				final String scriptpath = file.getProjectRelativePath().makeAbsolute().toString();
-				
-				IJavaScriptLoadBreakpoint breakpoint = findBreakpoint(scriptpath, scriptname);
-				if(breakpoint != null) {
-					breakpoint.setEnabled(true);			
-					return;
-				}
-				//spawn a job to create a new one
-				Job job = new Job(Messages.creating_script_load_bp) {
-					protected IStatus run(IProgressMonitor monitor) {
-						HashMap attributes = new HashMap();
-						attributes.put(IJavaScriptBreakpoint.TYPE_NAME, scriptname);
-						attributes.put(IJavaScriptBreakpoint.SCRIPT_PATH, scriptpath);
-						try {
-							JavaScriptDebugModel.createScriptLoadBreakpoint(file, -1, -1, attributes, true);
-						}
-						catch(DebugException de) {
-							JavaScriptDebugUIPlugin.log(de);
-							return Status.CANCEL_STATUS;
-						}
-						return Status.OK_STATUS;
-					}
-				};
-				job.setPriority(Job.INTERACTIVE);
-				job.setSystem(true);
-				job.schedule();
-			}
-		}
-		catch(CoreException ce) {
-			JavaScriptDebugUIPlugin.log(ce);
-		}
-	}
-	
-	/**
-	 * Returns an existing script load breakpoint from the manager or <code>null</code> if one is not
-	 * found.
-	 * @param scriptpath
-	 * @param scriptname
-	 * @return the existing breakpoint or <code>null</code>
-	 * @throws CoreException
-	 */
-	IJavaScriptLoadBreakpoint findBreakpoint(String scriptpath, String scriptname) throws CoreException {
-		IBreakpoint[] breakpoints = DebugPlugin.getDefault().getBreakpointManager().getBreakpoints(JavaScriptDebugModel.MODEL_ID);
-		IJavaScriptLoadBreakpoint breakpoint = null;
-		for (int i = 0; i < breakpoints.length; i++) {
-			if (breakpoints[i] instanceof IJavaScriptLoadBreakpoint) {
-				breakpoint = (IJavaScriptLoadBreakpoint) breakpoints[i];
-				if (breakpoint.getTypeName().equals(scriptname) &&
-						breakpoint.getScriptPath().equals(scriptpath)) {
-					return breakpoint;
-				}
-			}
-		}
-		return null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
-	 */
-	public void init(IViewPart view) {}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/BreakpointHitCountAction.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/BreakpointHitCountAction.java
deleted file mode 100644
index 346f9c1..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/BreakpointHitCountAction.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.actions;
-
-
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IActionDelegate2;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint;
-import org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptDebugUIPlugin;
-import org.eclipse.wst.jsdt.debug.internal.ui.Messages;
-
-public class BreakpointHitCountAction implements IObjectActionDelegate, IActionDelegate2 {
-
-	private static final String INITIAL_VALUE= "1"; //$NON-NLS-1$
-
-	/**
-	 * A dialog that sets the focus to the text area.
-	 */
-	class HitCountDialog extends InputDialog {
-		
-		private boolean fHitCountEnabled;
-		
-		/**
-		 * Constructor
-		 * @param parentShell
-		 * @param initialValue
-		 */
-		protected  HitCountDialog(Shell parentShell, String initialValue) {
-			super(parentShell, Messages.set_bp_hit_count, Messages.enter_new_hit_count, initialValue, validator);
-		}
-	
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.dialogs.InputDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
-		 */
-		protected Control createDialogArea(Composite parent) {
-			Composite area= (Composite)super.createDialogArea(parent);
-			final Button checkbox = new Button(area, SWT.CHECK);
-			GridData data = new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL);
-			data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH);
-			checkbox.setLayoutData(data);
-			checkbox.setFont(parent.getFont());
-			checkbox.setText(Messages.enable_hit_count); 
-			checkbox.setSelection(true);
-			fHitCountEnabled = true;
-			checkbox.addSelectionListener(new SelectionListener() {
-				public void widgetSelected(SelectionEvent e) {
-					fHitCountEnabled = checkbox.getSelection();
-					getText().setEnabled(fHitCountEnabled);
-					if (fHitCountEnabled) {
-						validateInput();
-					} else {
-						setErrorMessage(null); 
-					}
-				}
-				
-				public void widgetDefaultSelected(SelectionEvent e) {
-				}
-			});
-			
-			return area;
-		}
-
-		protected boolean isHitCountEnabled() {
-			return fHitCountEnabled;
-		}
-	}
-
-	
-	/**
-	 * Default input validator
-	 */
-	static IInputValidator validator = new IInputValidator() {
-		int hitCount= -1;
-		public String isValid(String value) {
-			try {
-				hitCount= Integer.valueOf(value.trim()).intValue();
-			} catch (NumberFormatException nfe) {
-				hitCount= -1;
-			}
-			if (hitCount < 1) {
-				return Messages.hit_count_must_be_positive; 
-			}
-			//no error
-			return null;
-		}
-	};
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		IStructuredSelection selection = getCurrentSelection();
-		if (selection == null) {
-			return;
-		}
-		Iterator itr= selection.iterator();
-		if (!itr.hasNext()) {
-			return;
-		}
-
-		while (itr.hasNext()) {
-			IJavaScriptBreakpoint breakpoint= (IJavaScriptBreakpoint)itr.next();
-			try {
-				int oldHitCount= breakpoint.getHitCount();
-				int newHitCount= hitCountDialog(breakpoint);
-				if (newHitCount != -1) {					
-					if (oldHitCount == newHitCount && newHitCount == 0) {
-						return;
-					}
-					breakpoint.setHitCount(newHitCount);
-				}
-			} catch (CoreException ce) {
-				JavaScriptDebugUIPlugin.log(ce); 
-			}
-		}
-	}
-	
-	/**
-	 * Returns the currently selected item(s) from the current workbench page or <code>null</code>
-	 * if the current active page could not be resolved.
-	 * @return the currently selected item(s) or <code>null</code>
-	 */
-	protected IStructuredSelection getCurrentSelection() {
-		IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
-		if (page != null) {
-			ISelection selection= page.getSelection();
-			if (selection instanceof IStructuredSelection) {
-				return (IStructuredSelection)selection;
-			}	
-		}
-		return null;
-	}
-	
-	/**
-	 * Presents the hit count dialog to the user to change the current hit count, or to set a new one
-	 * @param breakpoint
-	 * @return the dialog status
-	 */
-	protected int hitCountDialog(IJavaScriptBreakpoint breakpoint) {
-		int currentHitCount = 0;
-		try {
-			currentHitCount = breakpoint.getHitCount();
-		} catch (CoreException e) {
-			JavaScriptDebugUIPlugin.log(e);
-		}
-		String initialValue = INITIAL_VALUE;
-		if (currentHitCount > 0) {
-			initialValue = Integer.toString(currentHitCount);
-		}
-		Shell activeShell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
-		HitCountDialog dialog = new HitCountDialog(activeShell, initialValue);
-		if (dialog.open() == Window.OK && dialog.isHitCountEnabled()) {
-			return Integer.parseInt(dialog.getValue().trim());
-		}
-		return -1;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#init(org.eclipse.jface.action.IAction)
-	 */
-	public void init(IAction action) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#dispose()
-	 */
-	public void dispose() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#runWithEvent(org.eclipse.jface.action.IAction, org.eclipse.swt.widgets.Event)
-	 */
-	public void runWithEvent(IAction action, Event event) {
-		run(action);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/BreakpointPropertiesAction.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/BreakpointPropertiesAction.java
deleted file mode 100644
index fd0fa28..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/BreakpointPropertiesAction.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.actions;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.PreferencesUtil;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint;
-
-/**
- * Action that opens the properties page for a {@link IJavaScriptBreakpoint}
- * 
- * @since 1.0
- */
-public class BreakpointPropertiesAction implements IObjectActionDelegate {
-
-	IJavaScriptBreakpoint breakpoint = null;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void setActivePart(IAction action, IWorkbenchPart targetPart) {}
-
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		if(this.breakpoint != null) {
-			PreferencesUtil.createPropertyDialogOn(
-					PlatformUI.getWorkbench().getDisplay().getActiveShell(), 
-					this.breakpoint, 
-					null, 
-					null, 
-					null).open();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection ss= (IStructuredSelection)selection;
-			if (ss.isEmpty() || ss.size() > 1) {
-				return;
-			}
-			Object element= ss.getFirstElement();
-			if (element instanceof IJavaScriptBreakpoint) {
-				this.breakpoint = (IJavaScriptBreakpoint) element;
-			}
-			else {
-				this.breakpoint = null;
-			}
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/BreakpointSuspendPolicyToggleAction.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/BreakpointSuspendPolicyToggleAction.java
deleted file mode 100644
index 82ed76b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/BreakpointSuspendPolicyToggleAction.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.actions;
-
-
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint;
-import org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptDebugUIPlugin;
-import org.eclipse.wst.jsdt.debug.internal.ui.Messages;
- 
-/**
- * Toggles whether a breakpoint suspends a VM or only
- * the event thread.
- * 
- * @since 1.0
- */
-public class BreakpointSuspendPolicyToggleAction extends BreakpointToggleAction {
-
-	/**
-	 * What the current policy of the action is
-	 */
-	private int fCurrentPolicy = IJavaScriptBreakpoint.SUSPEND_THREAD;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.actions.BreakpointToggleAction#doAction(org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint)
-	 */
-	public void doAction(IJavaScriptBreakpoint breakpoint) throws CoreException {
-		if(breakpoint.getSuspendPolicy() != fCurrentPolicy) {
-			breakpoint.setSuspendPolicy(fCurrentPolicy);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.actions.BreakpointToggleAction#getToggleState(org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint)
-	 */
-	protected boolean getToggleState(IJavaScriptBreakpoint breakpoint) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.actions.BreakpointToggleAction#isEnabledFor(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public boolean isEnabledFor(IStructuredSelection selection) {
-		Iterator iter= selection.iterator();
-		while (iter.hasNext()) {
-			Object element = iter.next();
-			if (!(element instanceof IJavaScriptBreakpoint)) {
-				return false;
-			}
-			
-		}
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.actions.BreakpointToggleAction#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		super.selectionChanged(action, selection);
-		if (action.isEnabled()) {
-			IJavaScriptBreakpoint bp = (IJavaScriptBreakpoint)((IStructuredSelection)selection).getFirstElement();
-			update(action, bp);
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.actions.BreakpointToggleAction#isToggleAction()
-	 */
-	protected boolean isToggleAction() {
-		return false;
-	}
-
-	/**
-	 * @param action
-	 * @param breakpoint
-	 */
-	public void update(IAction action, IJavaScriptBreakpoint breakpoint) {
-		try {
-			if (breakpoint.getSuspendPolicy() == IJavaScriptBreakpoint.SUSPEND_THREAD) {
-				action.setText(Messages.suspend_target); 
-				fCurrentPolicy = IJavaScriptBreakpoint.SUSPEND_TARGET;
-			} else {
-				action.setText(Messages.suspend_thread); 
-				fCurrentPolicy = IJavaScriptBreakpoint.SUSPEND_THREAD;
-			}
-		} catch (CoreException e) {
-			 JavaScriptDebugUIPlugin.log(e);
-		}
-	}	
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/BreakpointToggleAction.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/BreakpointToggleAction.java
deleted file mode 100644
index 0556af2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/BreakpointToggleAction.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.actions;
-
- 
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IMarkerDelta;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IBreakpointManager;
-import org.eclipse.debug.core.IBreakpointsListener;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IPartListener;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint;
-import org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptDebugUIPlugin;
-import org.eclipse.wst.jsdt.debug.internal.ui.Messages;
-import org.eclipse.wst.jsdt.internal.ui.util.ExceptionHandler;
-
-/**
- * Provides a general toggle action for breakpoints to reuse
- * 
- * @since 1.0
- */
-public abstract class BreakpointToggleAction implements IObjectActionDelegate, IBreakpointsListener, IPartListener {
-	
-	private IStructuredSelection fSelection;
-	private IAction fAction;
-	private IWorkbenchPart fPart;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		IStructuredSelection selection= getStructuredSelection();
-		Iterator itr= selection.iterator();
-		while (itr.hasNext()) {
-			try {
-				IJavaScriptBreakpoint breakpoint= (IJavaScriptBreakpoint) itr.next();
-				doAction(breakpoint);
-			} catch (CoreException e) {
-				String title = Messages.breakpoint_configuration; 
-				String message = Messages.exception_occurred_setting_bp_properties; 
-				ExceptionHandler.handle(e, title, message);
-			}			
-		}
-	}
-
-	/**
-	 * @see IActionDelegate#selectionChanged(IAction, ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		setAction(action);
-		if (selection.isEmpty()) {
-			setStructuredSelection(null);
-			return;
-		}
-		if (selection instanceof IStructuredSelection) {
-			setStructuredSelection((IStructuredSelection)selection);
-			boolean enabled = isEnabledFor(getStructuredSelection());
-			action.setEnabled(enabled);
-			if (enabled && isToggleAction()) {
-				IBreakpoint breakpoint = (IBreakpoint)getStructuredSelection().getFirstElement();
-				if (breakpoint instanceof IJavaScriptBreakpoint) {
-					try {
-						action.setChecked(getToggleState((IJavaScriptBreakpoint) breakpoint));
-					} catch (CoreException e) {
-						JavaScriptDebugUIPlugin.log(e);
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Returns if the action is a checkable action. i.e. if we should bother updating checked state
-	 * @return if the action is a checkable action
-	 */
-	protected boolean isToggleAction() {
-		return true;
-	}
-	
-	/**
-	 * Toggle the state of this action
-	 */
-	public abstract void doAction(IJavaScriptBreakpoint breakpoint) throws CoreException;
-	
-	/**
-	 * Returns whether this action is currently toggled on
-	 */
-	protected abstract boolean getToggleState(IJavaScriptBreakpoint breakpoint) throws CoreException;
-	
-	/**
-	 * Get the current selection
-	 */
-	protected IStructuredSelection getStructuredSelection() {
-		return fSelection;
-	}
-	
-	/**
-	 * Allows the current structured selection to be set
-	 * @param selection the new selection
-	 */
-	protected void setStructuredSelection(IStructuredSelection selection) {
-		fSelection= selection;
-	}
-	
-	/**
-	 * Returns if the underlying action should be enabled for the given selection
-	 * @param selection
-	 * @return if the underlying action should be enabled for the given selection
-	 */
-	public abstract boolean isEnabledFor(IStructuredSelection selection);
-
-	/**
-	 * Get the breakpoint manager for the debug plugin
-	 */
-	protected IBreakpointManager getBreakpointManager() {
-		return DebugPlugin.getDefault().getBreakpointManager();		
-	}
-	
-	/**
-	 * Get the breakpoint associated with the given marker
-	 */
-	protected IBreakpoint getBreakpoint(IMarker marker) {
-		return getBreakpointManager().getBreakpoint(marker);
-	}
-
-	/**
-	 * Returns the underlying <code>IAction</code> for this delegate
-	 * @return the underlying <code>IAction</code> for this delegate
-	 */
-	protected IAction getAction() {
-		return fAction;
-	}
-
-	/**
-	 * Allows the underlying <code>IAction</code> for this delegate to be set
-	 * @param action the new action to set for this delegate
-	 */
-	protected void setAction(IAction action) {
-		fAction = action;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IBreakpointsListener#breakpointsAdded(org.eclipse.debug.core.model.IBreakpoint[])
-	 */
-	public void breakpointsAdded(IBreakpoint[] breakpoints) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IBreakpointsListener#breakpointsChanged(org.eclipse.debug.core.model.IBreakpoint[], org.eclipse.core.resources.IMarkerDelta[])
-	 */
-	public void breakpointsChanged(IBreakpoint[] breakpoints, IMarkerDelta[] deltas) {
-		if (getAction() != null) {
-			IStructuredSelection selection= getStructuredSelection();
-			if (selection != null) {
-				IBreakpoint selectedBreakpoint= (IBreakpoint)selection.getFirstElement();
-				for (int i = 0; i < breakpoints.length; i++) {
-					IBreakpoint breakpoint = breakpoints[i];
-					if (selectedBreakpoint.equals(breakpoint)) {
-						selectionChanged(getAction(), selection);
-						return;
-					}
-				}
-			}			
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IBreakpointsListener#breakpointsRemoved(org.eclipse.debug.core.model.IBreakpoint[], org.eclipse.core.resources.IMarkerDelta[])
-	 */
-	public void breakpointsRemoved(IBreakpoint[] breakpoints, IMarkerDelta[] deltas) {
-	}
-	
-	/**
-	 * Returns the <code>IWorkbenchPart</code> this delegate is associated with
-	 * @return the <code>IWorkbenchPart</code> this delegate is associated with
-	 */
-	protected IWorkbenchPart getPart() {
-		return fPart;
-	}
-
-	/**
-	 * Allows the <code>IWorkbenchPart</code> to be set for this delegate
-	 * @param part the new part to set
-	 */
-	protected void setPart(IWorkbenchPart part) {
-		fPart = part;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener#partActivated(org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void partActivated(IWorkbenchPart part) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener#partBroughtToTop(org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void partBroughtToTop(IWorkbenchPart part) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener#partClosed(org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void partClosed(IWorkbenchPart part) {
-		if (part == getPart()) {
-			getBreakpointManager().removeBreakpointListener(this);
-			part.getSite().getPage().removePartListener(this);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener#partDeactivated(org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void partDeactivated(IWorkbenchPart part) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPartListener#partOpened(org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void partOpened(IWorkbenchPart part) {
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-		IWorkbenchPart oldPart= getPart();
-		if (oldPart != null) {
-			getPart().getSite().getPage().removePartListener(this);			
-		}	
-		getBreakpointManager().addBreakpointListener(this);
-		setPart(targetPart);
-		targetPart.getSite().getPage().addPartListener(this);	
-	}
-}
-
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/EntryToggleAction.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/EntryToggleAction.java
deleted file mode 100644
index 65c55de..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/EntryToggleAction.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.actions;
-
- 
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptFunctionBreakpoint;
-
-/**
- * Action to toggle the entry attribute of an {@link IJavaScriptFunctionBreakpoint}
- * 
- * @since 1.0
- */
-public class EntryToggleAction extends BreakpointToggleAction {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.actions.BreakpointToggleAction#getToggleState(org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint)
-	 */
-	protected boolean getToggleState(IJavaScriptBreakpoint breakpoint) throws CoreException {
-		return ((IJavaScriptFunctionBreakpoint)breakpoint).isEntry();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.actions.BreakpointToggleAction#doAction(org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint)
-	 */
-	public void doAction(IJavaScriptBreakpoint breakpoint) throws CoreException {
-		((IJavaScriptFunctionBreakpoint)breakpoint).setEntry(!((IJavaScriptFunctionBreakpoint)breakpoint).isEntry());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.actions.BreakpointToggleAction#isEnabledFor(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public boolean isEnabledFor(IStructuredSelection selection) {
-		Iterator iter= selection.iterator();
-		while (iter.hasNext()) {
-			Object element = iter.next();
-			if (!(element instanceof IJavaScriptFunctionBreakpoint)) {
-				return false;
-			}
-		}
-		return true;
-	}
-}
-
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/EvaluateAction.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/EvaluateAction.java
deleted file mode 100644
index cdda503..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/EvaluateAction.java
+++ /dev/null
@@ -1,367 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.actions;
-
-import org.eclipse.core.commands.IHandler;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jface.text.Region;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.ui.IActionDelegate2;
-import org.eclipse.ui.IEditorActionDelegate;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchSite;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.texteditor.ITextEditor;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptStackFrame;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptValue;
-import org.eclipse.wst.jsdt.debug.internal.ui.eval.EvaluationManager;
-import org.eclipse.wst.jsdt.internal.ui.text.JavaWordFinder;
-
-/**
- * Action for evaluating selected source
- * 
- * @since 1.1
- */
-public abstract class EvaluateAction implements IEditorActionDelegate, IObjectActionDelegate, IActionDelegate2, IViewActionDelegate, IWorkbenchWindowActionDelegate, IHandler {
-
-	private IRegion region = null;
-	private IWorkbenchPart targetpart = null;
-	private IWorkbenchWindow window = null;
-	private IAction action = null;
-	private Object selection = null;
-	private IJavaScriptValue value = null;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#dispose()
-	 */
-	public void dispose() {
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#runWithEvent(org.eclipse.jface.action.IAction, org.eclipse.swt.widgets.Event)
-	 */
-	public void runWithEvent(IAction action, Event event) {
-		run(action);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		IJavaScriptStackFrame frame = getStackFrameContext();
-		if(frame != null) {
-			resolveSelection();
-			//XXX hack, if we want to support evaluations from the variables view this will not work
-			setValue(frame.evaluate(getSelection().toString()));
-			showResult(getValue());
-		}
-	}
-	
-	/**
-	 * Shows the result of the evaluation to the user. Sub-classes must implement. 
-	 * 
-	 * @param value the {@link IJavaScriptValue} to show to the user
-	 */
-	protected abstract void showResult(IJavaScriptValue value);
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		setAction(action);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#init(org.eclipse.jface.action.IAction)
-	 */
-	public void init(IAction action) {
-		setAction(action);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
-	 */
-	public void init(IViewPart view) {
-		setTargetpart(view);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void init(IWorkbenchWindow window) {
-		IWorkbenchPage page = window.getActivePage();
-		if(page != null) {
-			setTargetpart(window.getActivePage().getActivePart());
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-		setTargetpart(targetPart);
-		setAction(action);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IEditorActionDelegate#setActiveEditor(org.eclipse.jface.action.IAction, org.eclipse.ui.IEditorPart)
-	 */
-	public void setActiveEditor(IAction action, IEditorPart targetEditor) {
-		setTargetpart(targetEditor);
-		setAction(action);
-	}
-	
-	/**
-	 * Resolves the selected object from the target part
-	 */
-	protected void resolveSelection() {
-		ISelection sel = getTargetSelection();
-		setRegion(null);
-		if(sel instanceof ITextSelection) {
-			ITextSelection ts = (ITextSelection)sel;
-			String text= ts.getText();
-			if (text.trim().length() > 0) {
-				setSelection(text);
-				setRegion(new Region(ts.getOffset(), ts.getLength()));
-			} else if (getTargetPart() instanceof IEditorPart) {
-				IEditorPart editor= (IEditorPart)getTargetPart();
-				if (editor instanceof ITextEditor) {
-					setSelection(resolveText(null, ts, editor));
-				}
-			}
-		}
-		else if(sel instanceof IStructuredSelection) {
-			
-		}
-	}
-	
-	/**
-	 * Resolve the word from the given text selection. If no new word infos can be resolved 
-	 * the original string is returned.
-	 * @param text the text
-	 * @param ts the current text selection
-	 * @param editor the current editor
-	 * @return the new resolved text for the whole word of the selection
-	 */
-	String resolveText(String text, ITextSelection ts, IEditorPart editor) {
-		ITextEditor textEditor= (ITextEditor) editor;
-		IDocument doc= textEditor.getDocumentProvider().getDocument(editor.getEditorInput());
-		region = JavaWordFinder.findWord(doc, ts.getOffset());
-		if (region != null) {
-			try {
-				return doc.get(region.getOffset(), region.getLength());
-			} 
-			catch (BadLocationException e) {
-				//ignore
-			}
-		}
-		return text;
-	}
-	
-	/**
-	 * Returns the select from the {@link IWorkbenchSite} of the {@link #getTargetPart()} {@link IWorkbenchPart}
-	 * @return the selection or <code>null</code>
-	 */
-	protected ISelection getTargetSelection() {
-		IWorkbenchPart part = getTargetPart();
-		if(part != null) {
-			ISelectionProvider provider = part.getSite().getSelectionProvider();
-			if (provider != null) {
-				return provider.getSelection();
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Finds the currently selected {@link IJavaScriptStackFrame} in the UI.
-	 */
-	protected IJavaScriptStackFrame getStackFrameContext() {
-		IWorkbenchPart part = getTargetPart();
-		IJavaScriptStackFrame frame = null;
-		if (part == null) {
-			frame = EvaluationManager.getManager().getEvaluationContext(getWindow());
-		} else {
-			frame = EvaluationManager.getManager().getEvaluationContext(part);
-		}		
-		return frame;
-	}
-	
-	/**
-	 * Allows the result of the evaluation to be set
-	 * 
-	 * @param value the {@link IJavaScriptValue} of the evaluation
-	 */
-	protected void setValue(IJavaScriptValue value) {
-		this.value = value;
-	}
-	
-	/**
-	 * Returns the {@link IJavaScriptValue} result of the evaluation
-	 * 
-	 * @return the {@link IJavaScriptValue} result or <code>null</code>
-	 */
-	protected IJavaScriptValue getValue() {
-		return value;
-	}
-	
-	/**
-	 * Allows the resolved selection to be set
-	 * 
-	 * @param obj
-	 */
-	protected void setSelection(Object obj) {
-		selection = obj;
-	}
-	
-	/**
-	 * Returns the resolved selection or <code>null</code>. If <code>null</code>
-	 * is returned attempts can be made to re-resolve the selection using {@link #resolveSelection()}
-	 * 
-	 * @return the resolved selection or <code>null</code>
-	 */
-	protected Object getSelection() {
-		return selection;
-	}
-	
-	/**
-	 * Returns the current target {@link IWorkbenchPart}
-	 * @return the {@link IWorkbenchPart} target or <code>null</code>
-	 */
-	protected IWorkbenchPart getTargetPart() {
-		return targetpart;
-	}
-	
-	/**
-	 * Allows the target {@link IWorkbenchPart} to be set
-	 * @param targetpart the targetpart to set
-	 */
-	protected void setTargetpart(IWorkbenchPart targetpart) {
-		this.targetpart = targetpart;
-	}
-	
-	/**
-	 * Returns the current active {@link IWorkbenchWindow}
-	 * 
-	 * @return the current active {@link IWorkbenchWindow}
-	 */
-	protected IWorkbenchWindow getWindow() {
-		return window;
-	}
-	
-	/**
-	 * Allows the current {@link IWorkbenchWindow} context to be set
-	 * 
-	 * @param window the {@link IWorkbenchWindow} context
-	 */
-	protected void setWindow(IWorkbenchWindow window) {
-		this.window = window;
-	}
-	
-	/**
-	 * Returns the selected text {@link IRegion}, or <code>null</code> if none.
-	 * 
-	 * @return the selected text {@link IRegion} or <code>null</code>
-	 */
-	protected IRegion getRegion() {
-		return region;
-	}
-	
-	/**
-	 * Allows the selected {@link IRegion} to be set
-	 * 
-	 * @param region the {@link IRegion} to set
-	 */
-	protected void setRegion(IRegion region) {
-		this.region = region;
-	}
-	
-	/**
-	 * Returns the {@link IAction} context or <code>null</code>
-	 * 
-	 * @return the backing {@link IAction} or <code>null</code>
-	 */
-	protected IAction getAction() {
-		return action;
-	}
-	
-	/**
-	 * Allows the backing {@link IAction} to be set
-	 * 
-	 * @param action the action to set
-	 */
-	protected void setAction(IAction action) {
-		this.action = action;
-	}
-	
-	/**
-	 * Returns the styled text widget associated with the given part
-	 * or <code>null</code> if none.
-	 * 
-	 * @param part workbench part
-	 * @return associated style text widget or <code>null</code>
-	 */
-	protected StyledText getStyledText(IWorkbenchPart part) {
-		ITextViewer viewer = (ITextViewer)part.getAdapter(ITextViewer.class);
-		StyledText textWidget = null;
-		if (viewer == null) {
-			Control control = (Control) part.getAdapter(Control.class);
-			if (control instanceof StyledText) {
-				textWidget = (StyledText) control;
-			}
-		} else {
-			textWidget = viewer.getTextWidget();
-		}
-		return textWidget;
-	}
-	
-	/**
-	 * Returns an anchor point for a popup dialog on top of a styled text
-	 * or <code>null</code> if none.
-	 * 
-	 * @param part or <code>null</code>
-	 * @return anchor point or <code>null</code>
-	 */
-	protected Point getPopupAnchor(StyledText textWidget) {
-		if (textWidget != null) {
-	        Point docRange = textWidget.getSelectionRange();
-	        int midOffset = docRange.x + (docRange.y / 2);
-	        Point point = textWidget.getLocationAtOffset(midOffset);
-	        point = textWidget.toDisplay(point);
-	
-	        GC gc = new GC(textWidget);
-	        gc.setFont(textWidget.getFont());
-	        int height = gc.getFontMetrics().getHeight();
-	        gc.dispose();
-	        point.y += height;
-	        return point;
-		}
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/EvaluateEditorPopupAction.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/EvaluateEditorPopupAction.java
deleted file mode 100644
index 3a2321a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/EvaluateEditorPopupAction.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.actions;
-
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.IHandlerListener;
-import org.eclipse.debug.ui.InspectPopupDialog;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptValue;
-import org.eclipse.wst.jsdt.debug.internal.ui.eval.JavaScriptInspectExpression;
-
-
-/**
- * Default handler for the {@link EvaluateAction}
- * 
- * @since 1.0
- */
-public class EvaluateEditorPopupAction extends EvaluateAction {
-
-	/**
-	 * Constructor
-	 */
-	public EvaluateEditorPopupAction() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-	 */
-	public Object execute(ExecutionEvent event) throws ExecutionException {
-		run(null);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.actions.EvaluateAction#showResult(org.eclipse.wst.jsdt.debug.core.model.IJavaScriptValue)
-	 */
-	protected void showResult(IJavaScriptValue value) {
-		InspectPopupDialog dialog = new InspectPopupDialog(
-				PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), 
-				getPopupAnchor(getStyledText(getTargetPart())), 
-				null, 
-				new JavaScriptInspectExpression(getValue()));
-		dialog.open();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.commands.IHandler#isEnabled()
-	 */
-	public boolean isEnabled() {
-		IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-		setWindow(window);
-		if(window != null) {
-			IWorkbenchPage page = window.getActivePage();
-			if(page != null) {
-				setTargetpart(page.getActivePart());
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.commands.IHandler#isHandled()
-	 */
-	public boolean isHandled() {
-		return true;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.commands.IHandler#removeHandlerListener(org.eclipse.core.commands.IHandlerListener)
-	 */
-	public void removeHandlerListener(IHandlerListener handlerListener) {}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.commands.IHandler#addHandlerListener(org.eclipse.core.commands.IHandlerListener)
-	 */
-	public void addHandlerListener(IHandlerListener handlerListener) {}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/ExitToggleAction.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/ExitToggleAction.java
deleted file mode 100644
index ec627cb..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/ExitToggleAction.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.actions;
-
- 
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptFunctionBreakpoint;
-
-/**
- * Provides a toggle action for changing the exit attribute on an {@link IJavaScriptFunctionBreakpoint}
- * 
- * @since 1.0
- */
-public class ExitToggleAction extends BreakpointToggleAction {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.actions.BreakpointToggleAction#getToggleState(org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint)
-	 */
-	protected boolean getToggleState(IJavaScriptBreakpoint breakpoint) throws CoreException {
-		return ((IJavaScriptFunctionBreakpoint)breakpoint).isExit();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.actions.BreakpointToggleAction#doAction(org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint)
-	 */
-	public void doAction(IJavaScriptBreakpoint breakpoint) throws CoreException {
-		((IJavaScriptFunctionBreakpoint)breakpoint).setExit(!((IJavaScriptFunctionBreakpoint)breakpoint).isExit());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.actions.BreakpointToggleAction#isEnabledFor(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public boolean isEnabledFor(IStructuredSelection selection) {
-		Iterator iter= selection.iterator();
-		while (iter.hasNext()) {
-			Object element = iter.next();
-			if (!(element instanceof IJavaScriptFunctionBreakpoint)) {
-				return false;
-			}
-		}
-		return true;
-	}
-}
-
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/FunctionFilterAction.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/FunctionFilterAction.java
deleted file mode 100644
index 761a7d2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/FunctionFilterAction.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.actions;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptValue;
-import org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptProperty;
-import org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptVariable;
-import org.eclipse.wst.jsdt.debug.internal.ui.Constants;
-
-
-/**
- * Viewer filter action for filtering functions
- * 
- * @since 1.1
- */
-public class FunctionFilterAction extends ViewFilterAction {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.actions.ViewFilterAction#getPreferenceKey()
-	 */
-	protected String getPreferenceKey() {
-		return Constants.SHOW_FUNCTIONS;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-	 */
-	public boolean select(Viewer viewer, Object parentElement, Object element) {
-		if(element instanceof JavaScriptVariable){
-			JavaScriptVariable var = (JavaScriptVariable) element;
-			try {
-				if(IJavaScriptValue.FUNCTION.equals(var.getReferenceTypeName())) {
-					return getValue();
-				}
-			} catch (DebugException e) {
-			}
-		}
-		if(element instanceof JavaScriptProperty){
-			JavaScriptProperty prop = (JavaScriptProperty) element;
-			try {
-				if(IJavaScriptValue.FUNCTION.equals(prop.getReferenceTypeName())) {
-					return getValue();
-				}
-			} catch (DebugException e) {
-			}
-		}
-		return true;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/OpenSourceAction.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/OpenSourceAction.java
deleted file mode 100644
index 49bd7ea..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/OpenSourceAction.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.actions;
-
-import java.util.List;
-
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.commands.IHandler2;
-import org.eclipse.core.commands.IHandlerListener;
-import org.eclipse.core.expressions.EvaluationContext;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.sourcelookup.ISourceLookupResult;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.ui.IActionDelegate2;
-import org.eclipse.ui.IObjectActionDelegate;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.progress.UIJob;
-import org.eclipse.wst.jsdt.debug.core.model.IScript;
-import org.eclipse.wst.jsdt.debug.internal.core.model.Script;
-import org.eclipse.wst.jsdt.debug.internal.ui.Messages;
-
-/**
- * Context menu action to show the source for a selected {@link IScript}
- * 
- * @since 1.1
- */
-public class OpenSourceAction implements IObjectActionDelegate, IActionDelegate2, IHandler2 {
-
-	private Script script = null;
-	
-	/**
-	 * Constructor
-	 */
-	public OpenSourceAction() {}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		if(script != null) {
-			UIJob job = new UIJob(PlatformUI.getWorkbench().getDisplay(), NLS.bind(Messages.opening_source__0, script.sourceURI())) {
-				public IStatus runInUIThread(IProgressMonitor monitor) {
-					IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
-					ISourceLookupResult result = DebugUITools.lookupSource(script, script.getDebugTarget().getLaunch().getSourceLocator());
-					DebugUITools.displaySource(result, page);
-					return Status.OK_STATUS;
-				}
-			};
-			job.setPriority(Job.INTERACTIVE);
-			job.setUser(true);
-			job.schedule();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		if(selection instanceof IStructuredSelection) {
-			IStructuredSelection ss = (IStructuredSelection) selection;
-			if(ss.isEmpty()) {
-				script = null;
-			}
-			else {
-				script = (Script) ss.getFirstElement();
-			}
-			return;
-		}
-		script = null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
-	 */
-	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#init(org.eclipse.jface.action.IAction)
-	 */
-	public void init(IAction action) {}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#dispose()
-	 */
-	public void dispose() {
-		script = null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#runWithEvent(org.eclipse.jface.action.IAction, org.eclipse.swt.widgets.Event)
-	 */
-	public void runWithEvent(IAction action, Event event) {
-		run(action);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.commands.IHandler#addHandlerListener(org.eclipse.core.commands.IHandlerListener)
-	 */
-	public void addHandlerListener(IHandlerListener handlerListener) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
-	 */
-	public Object execute(ExecutionEvent event) throws ExecutionException {
-		run(null);
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.commands.IHandler#isEnabled()
-	 */
-	public boolean isEnabled() {
-		return script != null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.commands.IHandler#isHandled()
-	 */
-	public boolean isHandled() {
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.commands.IHandler#removeHandlerListener(org.eclipse.core.commands.IHandlerListener)
-	 */
-	public void removeHandlerListener(IHandlerListener handlerListener) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.commands.IHandler2#setEnabled(java.lang.Object)
-	 */
-	public void setEnabled(Object evaluationContext) {		
-		if(evaluationContext instanceof EvaluationContext) {
-			Object o = ((EvaluationContext)evaluationContext).getDefaultVariable();
-			if(o instanceof IScript) {
-				script = (Script) o;
-			}
-			else if(o instanceof List) {
-				List vars = (List) o;
-				if(!vars.isEmpty() && vars.get(0) instanceof IScript) {
-					script = (Script) vars.get(0);
-				}
-			}
-			return;
-		}
-		script = null;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/ProtoFilterAction.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/ProtoFilterAction.java
deleted file mode 100644
index 02d5543..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/ProtoFilterAction.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.actions;
-
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptProperty;
-import org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptValue;
-import org.eclipse.wst.jsdt.debug.internal.ui.Constants;
-
-/**
- * Viewer filter action for <code>proto</code> variables
- * 
- * @since 1.1
- */
-public class ProtoFilterAction extends ViewFilterAction {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.actions.ViewFilterAction#getPreferenceKey()
-	 */
-	protected String getPreferenceKey() {
-		return Constants.SHOW_PROTOTYPES;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-	 */
-	public boolean select(Viewer viewer, Object parentElement, Object element) {
-		if(element instanceof JavaScriptProperty){
-			JavaScriptProperty var = (JavaScriptProperty) element;
-			if(JavaScriptValue.PROTO.equals(var.getName())) {
-				return getValue();
-			}
-		}
-		return true;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/ShowLoadedScriptsAction.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/ShowLoadedScriptsAction.java
deleted file mode 100644
index 7292da3..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/ShowLoadedScriptsAction.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.actions;
-
-import org.eclipse.debug.ui.IDebugView;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.wst.jsdt.debug.internal.ui.PreferencesManager;
-
-/**
- * Menu action to show loaded scripts in the debug view
- * 
- * @since 1.0
- */
-public class ShowLoadedScriptsAction implements IViewActionDelegate {
-	
-	IViewPart fView = null;
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
-	 */
-	public void init(IViewPart view) {
-		fView = view;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		PreferencesManager.getManager().showLoadedScripts(action.isChecked());
-		IDebugView dview = (IDebugView) fView.getAdapter(IDebugView.class);
-		dview.getViewer().refresh();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		action.setChecked(PreferencesManager.getManager().showLoadedScripts());
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/SuspendOnAllScriptLoadsAction.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/SuspendOnAllScriptLoadsAction.java
deleted file mode 100644
index 1361935..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/SuspendOnAllScriptLoadsAction.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.actions;
-
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.wst.jsdt.debug.internal.core.Constants;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptDebugUIPlugin;
-import org.osgi.service.prefs.BackingStoreException;
-
-/**
- * An action delegate that toggles the state of the "suspend on all script loads"
- * 
- * @since 1.0
- */
-public class SuspendOnAllScriptLoadsAction extends ViewFilterAction {
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.actions.ViewFilterAction#getPreferenceKey()
-	 */
-	protected String getPreferenceKey() {
-		return Constants.SUSPEND_ON_ALL_SCRIPT_LOADS;
-	}	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-	 */
-	public boolean select(Viewer viewer, Object parentElement, Object element) {
-		return true;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		IEclipsePreferences prefs = InstanceScope.INSTANCE.getNode(JavaScriptDebugPlugin.PLUGIN_ID);
-		if(prefs != null) {
-			prefs.putBoolean(Constants.SUSPEND_ON_ALL_SCRIPT_LOADS, getValue());
-			try {
-				prefs.flush();
-			} catch (BackingStoreException e) {
-				JavaScriptDebugUIPlugin.log(e);
-			}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.actions.ViewFilterAction#getPreferenceStore()
-	 */
-	protected IPreferenceStore getPreferenceStore() {
-		return JavaScriptDebugUIPlugin.getCorePreferenceStore();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.actions.ViewFilterAction#getPreferenceValue()
-	 */
-	protected boolean getPreferenceValue() {
-		return Platform.getPreferencesService().getBoolean(
-				JavaScriptDebugPlugin.PLUGIN_ID,
-				Constants.SUSPEND_ON_ALL_SCRIPT_LOADS, 
-				false, 
-				null);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/SuspendOnExceptionsAction.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/SuspendOnExceptionsAction.java
deleted file mode 100644
index 799bb8f..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/SuspendOnExceptionsAction.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.actions;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.wst.jsdt.debug.internal.core.Constants;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptDebugUIPlugin;
-import org.osgi.service.prefs.BackingStoreException;
-
-/**
- * Handles suspending the debugger when an exception is thrown
- * 
- * @since 1.1
- */
-public class SuspendOnExceptionsAction extends ViewFilterAction {
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		IEclipsePreferences prefs = InstanceScope.INSTANCE.getNode(JavaScriptDebugPlugin.PLUGIN_ID);
-		if(prefs != null) {
-			prefs.putBoolean(Constants.SUSPEND_ON_THROWN_EXCEPTION, action.isChecked());
-			try {
-				prefs.flush();
-			} catch (BackingStoreException e) {
-				JavaScriptDebugUIPlugin.log(e);
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.actions.ViewFilterAction#getPreferenceStore()
-	 */
-	protected IPreferenceStore getPreferenceStore() {
-		return JavaScriptDebugUIPlugin.getCorePreferenceStore();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.actions.ViewFilterAction#getPreferenceValue()
-	 */
-	protected boolean getPreferenceValue() {
-		return Platform.getPreferencesService().getBoolean(
-				JavaScriptDebugPlugin.PLUGIN_ID,
-				Constants.SUSPEND_ON_THROWN_EXCEPTION, 
-				false, 
-				null);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.actions.ViewFilterAction#getPreferenceKey()
-	 */
-	protected String getPreferenceKey() {
-		return Constants.SUSPEND_ON_THROWN_EXCEPTION;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-	 */
-	public boolean select(Viewer viewer, Object parentElement, Object element) {
-		return false;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/ThisFilterAction.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/ThisFilterAction.java
deleted file mode 100644
index 7f19799..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/ThisFilterAction.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.actions;
-
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptValue;
-import org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptVariable;
-import org.eclipse.wst.jsdt.debug.internal.ui.Constants;
-
-/**
- * Viewer filter action for the <code>this</code> variable
- * 
- * @since 1.1
- */
-public class ThisFilterAction extends ViewFilterAction {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.actions.ViewFilterAction#getPreferenceKey()
-	 */
-	protected String getPreferenceKey() {
-		return Constants.SHOW_THIS;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-	 */
-	public boolean select(Viewer viewer, Object parentElement, Object element) {
-		if(element instanceof JavaScriptVariable){
-			JavaScriptVariable var = (JavaScriptVariable) element;
-			if(JavaScriptValue.THIS.equals(var.getName())) {
-				return getValue();
-			}
-		}
-		return true;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/ViewFilterAction.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/ViewFilterAction.java
deleted file mode 100644
index c6906b2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/actions/ViewFilterAction.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.actions;
-
-
-import org.eclipse.debug.ui.IDebugView;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.ui.IActionDelegate2;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptDebugUIPlugin;
-
-/**
- * Abstract action that can be used to update an {@link IDebugView}
- * 
- * @since 1.0
- */
-public abstract class ViewFilterAction extends ViewerFilter implements IViewActionDelegate, IActionDelegate2 {
-		
-	private IViewPart fView;
-	private IAction fAction;
-	private IPropertyChangeListener fListener = new Updater();
-	
-	class Updater implements IPropertyChangeListener {
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-		 */
-		public void propertyChange(PropertyChangeEvent event) {
-			if (event.getProperty().equals(getPreferenceKey()) ||
-					event.getProperty().equals(getCompositeKey())) {
-				fAction.setChecked(getPreferenceValue());
-			}
-			
-		}
-		
-	}
-
-	public ViewFilterAction() {
-		super();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IViewActionDelegate#init(org.eclipse.ui.IViewPart)
-	 */
-	public void init(IViewPart view) {
-		fView = view;
-		fAction.setChecked(getPreferenceValue());
-		run(fAction);
-		getPreferenceStore().addPropertyChangeListener(fListener);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#init(org.eclipse.jface.action.IAction)
-	 */
-	public void init(IAction action) {
-		fAction = action;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#dispose()
-	 */
-	public void dispose() {
-		getPreferenceStore().removePropertyChangeListener(fListener);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate2#runWithEvent(org.eclipse.jface.action.IAction, org.eclipse.swt.widgets.Event)
-	 */
-	public void runWithEvent(IAction action, Event event) {
-		run(action);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		StructuredViewer viewer = getStructuredViewer();
-		ViewerFilter[] filters = viewer.getFilters();
-		ViewerFilter filter = null;
-		for (int i = 0; i < filters.length; i++) {
-			if (filters[i] == this) {
-				filter = filters[i];
-				break;
-			}
-		}
-		if (filter == null) {
-			viewer.addFilter(this);
-		} else {
-			// only refresh is removing - adding will refresh automatically
-			viewer.refresh();
-		}
-		IPreferenceStore store = getPreferenceStore();
-		store.setValue(getPreferenceKey(), action.isChecked());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-	}
-
-	/**
-	 * @return the {@link IPreferenceStore} to save the setting to
-	 */
-	protected IPreferenceStore getPreferenceStore() {
-		return JavaScriptDebugUIPlugin.getDefault().getPreferenceStore();
-	}
-	
-	/**
-	 * Returns the value of this filters preference (on/off) for the given
-	 * view.
-	 * 
-	 * @param part
-	 * @return boolean
-	 */
-	protected boolean getPreferenceValue() {
-		IPreferenceStore store = getPreferenceStore();
-		return store.getBoolean(getPreferenceKey());		
-	}
-	
-	/**
-	 * Returns the key for this action's preference
-	 * 
-	 * @return String
-	 */
-	protected abstract String getPreferenceKey(); 
-
-	/**
-	 * Returns the key used by this action to store its preference value/setting.
-	 * Based on a base key (suffix) and part id (prefix).
-	 *  
-	 * @return preference store key
-	 */
-	protected String getCompositeKey() {
-		String baseKey = getPreferenceKey();
-		String viewKey = getView().getSite().getId();
-		return viewKey + "." + baseKey; //$NON-NLS-1$
-	}
-	
-	/**
-	 * @return the {@link IViewPart} handle
-	 */
-	protected IViewPart getView() {
-		return fView;
-	}
-	
-	/**
-	 * @return the backing {@link StructuredViewer}
-	 */
-	protected StructuredViewer getStructuredViewer() {
-		IDebugView view = (IDebugView)getView().getAdapter(IDebugView.class);
-		if (view != null) {
-			Viewer viewer = view.getViewer();
-			if (viewer instanceof StructuredViewer) {
-				return (StructuredViewer)viewer;
-			}
-		}		
-		return null;
-	}
-	
-	/**
-	 * Returns whether this action is selected/checked.
-	 * 
-	 * @return whether this action is selected/checked
-	 */
-	protected boolean getValue() {
-		return fAction.isChecked();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/adapters/JavaScriptAdapterFactory.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/adapters/JavaScriptAdapterFactory.java
deleted file mode 100644
index b95c60f..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/adapters/JavaScriptAdapterFactory.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.adapters;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory2;
-import org.eclipse.debug.ui.actions.IRunToLineTarget;
-import org.eclipse.debug.ui.actions.IToggleBreakpointsTarget;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.model.IWorkbenchAdapter;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptDebugTarget;
-import org.eclipse.wst.jsdt.debug.core.model.IScriptGroup;
-import org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptDebugUIPlugin;
-import org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.ToggleBreakpointAdapter;
-import org.eclipse.wst.jsdt.debug.internal.ui.eval.RunToLineAdapter;
-
-/**
- * Adapter factory
- * 
- * @since 1.0
- */
-public class JavaScriptAdapterFactory implements IAdapterFactory {
-
-	class WorkbenchAdapter implements IWorkbenchAdapter {
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.model.IWorkbenchAdapter#getChildren(java.lang.Object)
-		 */
-		public Object[] getChildren(Object o) {
-			return null;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.model.IWorkbenchAdapter#getImageDescriptor(java.lang.Object)
-		 */
-		public ImageDescriptor getImageDescriptor(Object object) {
-			return null;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.model.IWorkbenchAdapter#getLabel(java.lang.Object)
-		 */
-		public String getLabel(Object o) {
-			if(o instanceof IJavaScriptBreakpoint) {
-				try {
-					return ((IJavaScriptBreakpoint)o).getScriptPath();
-				}
-				catch(CoreException ce) {
-					JavaScriptDebugUIPlugin.log(ce);
-				}
-			}
-			return null;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.model.IWorkbenchAdapter#getParent(java.lang.Object)
-		 */
-		public Object getParent(Object o) {
-			return null;
-		}
-	}
-	
-	static IWorkbenchAdapter wadapter = null;
-	static ToggleBreakpointAdapter tbadapter = null;
-	static JavaScriptAsyncContentProvider jscontent = null;
-	static JavaScriptModelProxyFactory jsproxyfactory = null;
-	static RunToLineAdapter runtoline = null;
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class)
-	 */
-	public Object getAdapter(Object adaptableObject, Class adapterType) {
-		if(adapterType.equals(IToggleBreakpointsTarget.class)) {
-			return getToggleBreakpointAdapter();
-		}
-		if(adapterType.equals(IWorkbenchAdapter.class) && adaptableObject instanceof IJavaScriptBreakpoint) {
-			return getWorkbenchAdapter();
-		}
-		if(adapterType.equals(IRunToLineTarget.class)) {
-			return getRunToLine();
-		}
-		if (adapterType.equals(IElementContentProvider.class)) {
-			if (adaptableObject instanceof IJavaScriptDebugTarget ||
-					adaptableObject instanceof IScriptGroup) {
-				return getJSContentProvider();
-			}
-		}
-		if(adapterType.equals(IModelProxyFactory2.class)) {
-			return getJSProxyFactory();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
-	 */
-	public Class[] getAdapterList() {
-		return new Class[] {IToggleBreakpointsTarget.class, 
-				IWorkbenchAdapter.class,
-				IRunToLineTarget.class,
-				IElementContentProvider.class,
-				IModelProxyFactory2.class};
-	}
-	
-	/**
-	 * @return the singleton {@link RunToLineAdapter}
-	 */
-	synchronized RunToLineAdapter getRunToLine() {
-		if(runtoline == null) {
-			runtoline = new RunToLineAdapter();
-		}
-		return runtoline;
-	}
-	
-	/**
-	 * @return the singleton {@link JavaScriptModelProxyFactory}
-	 */
-	synchronized JavaScriptModelProxyFactory getJSProxyFactory() {
-		if(jsproxyfactory == null) {
-			jsproxyfactory = new JavaScriptModelProxyFactory();
-		}
-		return jsproxyfactory;
-	}
-	
-	/**
-	 * @return the singleton {@link JavaScriptAsyncContentProvider}
-	 */
-	synchronized JavaScriptAsyncContentProvider getJSContentProvider() {
-		if(jscontent == null) {
-			jscontent = new JavaScriptAsyncContentProvider();
-		}
-		return jscontent;
-	}
-	
-	/**
-	 * @return the singleton {@link IWorkbenchAdapter}
-	 */
-	synchronized IWorkbenchAdapter getWorkbenchAdapter() {
-		if(wadapter == null) {
-			wadapter = new WorkbenchAdapter();
-		}
-		return wadapter;
-	}
-	
-	/**
-	 * @return the singleton {@link ToggleBreakpointAdapter}
-	 */
-	public static synchronized ToggleBreakpointAdapter getToggleBreakpointAdapter() {
-		if(tbadapter == null) {
-			tbadapter = new ToggleBreakpointAdapter();
-		}
-		return tbadapter;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/adapters/JavaScriptAsyncContentProvider.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/adapters/JavaScriptAsyncContentProvider.java
deleted file mode 100644
index 4ff6fb8..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/adapters/JavaScriptAsyncContentProvider.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.adapters;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.internal.ui.model.elements.ElementContentProvider;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptDebugTarget;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread;
-import org.eclipse.wst.jsdt.debug.core.model.IScriptGroup;
-import org.eclipse.wst.jsdt.debug.internal.ui.PreferencesManager;
-
-/**
- * Custom content provider for our {@link IJavaScriptDebugElement}s
- * 
- * @since 1.0
- */
-public class JavaScriptAsyncContentProvider extends ElementContentProvider {
-
-	static final Object[] NO_CHILDREN = {};
-	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.model.elements.DebugTargetContentProvider#getChildren(java.lang.Object, int, int, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate)
-	 */
-	protected Object[] getChildren(Object parent, int index, int length, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-		if(parent instanceof IJavaScriptDebugTarget) {
-			IJavaScriptDebugTarget target = (IJavaScriptDebugTarget) parent;
-			Object[] threads = target.getThreads();
-			if(PreferencesManager.getManager().showLoadedScripts()) {
-				Object[] children = new Object[threads.length + 1];
-				children[0] = target.getScriptGroup();
-				System.arraycopy(threads, 0, children, 1, threads.length);
-				return getElements(children, index, length);
-			}
-			return getElements(threads, index, length);
-		}
-		if(parent instanceof IScriptGroup) {
-			IScriptGroup group = (IScriptGroup) parent;
-			List scripts = group.allScripts();
-			return getElements(scripts.toArray(), index, length);
-		}
-		if(parent instanceof IJavaScriptThread) {
-			return ((IJavaScriptThread)parent).getStackFrames();
-		}
-		return NO_CHILDREN;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.model.elements.DebugTargetContentProvider#getChildCount(java.lang.Object, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext, org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate)
-	 */
-	protected int getChildCount(Object element, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-		if(element instanceof IJavaScriptDebugTarget) {
-			IJavaScriptDebugTarget target = (IJavaScriptDebugTarget) element;
-			int count = target.getThreads().length;
-			if(target.getScriptGroup() != null && PreferencesManager.getManager().showLoadedScripts()) {
-				count = count + 1;
-			}
-			return count;
-		}
-		if(element instanceof IScriptGroup) {
-			return ((IScriptGroup) element).allScripts().size();
-		}
-		if(element instanceof IJavaScriptThread) {
-			return ((IJavaScriptThread)element).getFrameCount();
-		}
-		return 0;
-	}
-		
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.model.elements.ElementContentProvider#supportsContext(org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext)
-	 */
-	protected boolean supportsContext(IPresentationContext context) {
-		return IDebugUIConstants.ID_DEBUG_VIEW.equals(context.getId());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.model.elements.ElementContentProvider#supportsContextId(java.lang.String)
-	 */
-	protected boolean supportsContextId(String id) {
-		return IDebugUIConstants.ID_DEBUG_VIEW.equals(id);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/adapters/JavaScriptDebugTargetEventHandler.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/adapters/JavaScriptDebugTargetEventHandler.java
deleted file mode 100644
index f4abec0..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/adapters/JavaScriptDebugTargetEventHandler.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.adapters;
-
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
-import org.eclipse.debug.internal.ui.viewers.provisional.AbstractModelProxy;
-import org.eclipse.debug.internal.ui.viewers.update.DebugTargetEventHandler;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptDebugTarget;
-import org.eclipse.wst.jsdt.debug.core.model.IScriptGroup;
-import org.eclipse.wst.jsdt.debug.internal.core.model.ScriptGroup;
-import org.eclipse.wst.jsdt.debug.internal.ui.PreferencesManager;
-
-/**
- * Custom handler for JavaScript debug target model proxy events
- * 
- * @since 1.0
- */
-public class JavaScriptDebugTargetEventHandler extends DebugTargetEventHandler {
-
-	/**
-	 * Constructor
-	 * @param proxy
-	 */
-	public JavaScriptDebugTargetEventHandler(AbstractModelProxy proxy) {
-		super(proxy);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.update.DebugTargetEventHandler#handlesEvent(org.eclipse.debug.core.DebugEvent)
-	 */
-	protected boolean handlesEvent(DebugEvent event) {
-		Object source = event.getSource();
-		return source instanceof IJavaScriptDebugTarget || source instanceof IScriptGroup;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.update.DebugTargetEventHandler#handleChange(org.eclipse.debug.core.DebugEvent)
-	 */
-	protected void handleChange(DebugEvent event) {
-		Object source = event.getSource();
-		if(source instanceof IDebugTarget) {
-			super.handleChange(event);
-		}
-		else if(source instanceof IScriptGroup) {
-			if(PreferencesManager.getManager().showLoadedScripts()) {
-				fireScriptGroupDelta((IScriptGroup) source);
-			}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.update.DebugTargetEventHandler#handleCreate(org.eclipse.debug.core.DebugEvent)
-	 */
-	protected void handleCreate(DebugEvent event) {
-		Object source = event.getSource();
-		if(source instanceof IDebugTarget) {
-			super.handleCreate(event);
-		}
-		else if(source instanceof IScriptGroup) {
-			if(PreferencesManager.getManager().showLoadedScripts()) {
-				fireScriptGroupDelta((IScriptGroup) source);
-			}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.update.DebugTargetEventHandler#handleResume(org.eclipse.debug.core.DebugEvent)
-	 */
-	protected void handleResume(DebugEvent event) {
-		Object source = event.getSource();
-		if(source instanceof IDebugTarget) {
-			super.handleResume(event);
-		}
-		else if(source instanceof IScriptGroup) {
-			if(PreferencesManager.getManager().showLoadedScripts()) {
-				fireScriptGroupDelta((IScriptGroup) source);
-			}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.update.DebugTargetEventHandler#handleSuspend(org.eclipse.debug.core.DebugEvent)
-	 */
-	protected void handleSuspend(DebugEvent event) {
-		Object source = event.getSource();
-		if(source instanceof IDebugTarget) {
-			super.handleSuspend(event);
-		}
-		else if(source instanceof IScriptGroup) {
-			if(PreferencesManager.getManager().showLoadedScripts()) {
-				fireScriptGroupDelta((IScriptGroup) source);
-			}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.update.DebugTargetEventHandler#handleTerminate(org.eclipse.debug.core.DebugEvent)
-	 */
-	protected void handleTerminate(DebugEvent event) {
-		Object source = event.getSource();
-		if(source instanceof IDebugTarget) {
-			super.handleTerminate(event);
-		}
-		else if(source instanceof IScriptGroup){
-			if(PreferencesManager.getManager().showLoadedScripts()) {
-				fireScriptGroupDelta((IScriptGroup) source);
-			}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.update.DebugEventHandler#handleOther(org.eclipse.debug.core.DebugEvent)
-	 */
-	protected void handleOther(DebugEvent event) {
-		Object source = event.getSource();
-		if(source instanceof IJavaScriptDebugTarget) {
-			super.handleOther(event);
-		}
-		else if(source instanceof IScriptGroup){
-			if(PreferencesManager.getManager().showLoadedScripts()) {
-				fireScriptGroupDelta((IScriptGroup) source);
-			}
-		}
-	}
-	
-	void fireScriptGroupDelta(IScriptGroup group) {
-		ModelDelta root = new ModelDelta(DebugPlugin.getDefault().getLaunchManager(), IModelDelta.NO_CHANGE);
-		IDebugTarget target = ((ScriptGroup)group).getDebugTarget();
-		ModelDelta targetnode = root.addNode(target.getLaunch(), IModelDelta.NO_CHANGE);
-		ModelDelta groupnode = targetnode.addNode(target, IModelDelta.NO_CHANGE);
-		groupnode.addNode(group, IModelDelta.CONTENT);
-		fireDelta(root);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/adapters/JavaScriptDebugTargetProxy.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/adapters/JavaScriptDebugTargetProxy.java
deleted file mode 100644
index 86c1a86..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/adapters/JavaScriptDebugTargetProxy.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.adapters;
-
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.internal.ui.viewers.update.DebugEventHandler;
-import org.eclipse.debug.internal.ui.viewers.update.DebugTargetProxy;
-
-/**
- * Model proxy for our {@link IJavaScriptDebugTarget}
- * 
- * @since 1.0
- */
-public class JavaScriptDebugTargetProxy extends DebugTargetProxy {
-
-	/**
-	 * Constructor
-	 * @param target
-	 */
-	public JavaScriptDebugTargetProxy(IDebugTarget target) {
-		super(target);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.update.DebugTargetProxy#createEventHandlers()
-	 */
-	protected DebugEventHandler[] createEventHandlers() {
-		return new DebugEventHandler[] {new JavaScriptDebugTargetEventHandler(this), new JavaScriptThreadHandler(this)};
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/adapters/JavaScriptModelProxyFactory.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/adapters/JavaScriptModelProxyFactory.java
deleted file mode 100644
index 4cb8d1c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/adapters/JavaScriptModelProxyFactory.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.adapters;
-
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxy;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory2;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptDebugTarget;
-
-/**
- * Model proxy factory for creating {@link IModelProxy}s for our custom debug
- * elements in the Debug view only
- * 
- * @since 1.0
- */
-public class JavaScriptModelProxyFactory implements IModelProxyFactory2 {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory2#createTreeModelProxy(java.lang.Object, org.eclipse.jface.viewers.TreePath, org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext)
-	 */
-	public IModelProxy createTreeModelProxy(Object input, TreePath path, IPresentationContext context) {
-		if(IDebugUIConstants.ID_DEBUG_VIEW.equals(context.getId())) {
-			Object last = path.getLastSegment();
-			if(last instanceof IJavaScriptDebugTarget) {
-				return new JavaScriptDebugTargetProxy((IDebugTarget) last);
-			}
-		}
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/adapters/JavaScriptThreadHandler.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/adapters/JavaScriptThreadHandler.java
deleted file mode 100644
index 2a0944f..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/adapters/JavaScriptThreadHandler.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.adapters;
-
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IThread;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
-import org.eclipse.debug.internal.ui.viewers.provisional.AbstractModelProxy;
-import org.eclipse.debug.internal.ui.viewers.update.ThreadEventHandler;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread;
-import org.eclipse.wst.jsdt.debug.internal.ui.PreferencesManager;
-
-/**
- * Handler for thread changes
- * 
- * @since 1.0
- */
-public class JavaScriptThreadHandler extends ThreadEventHandler {
-
-	/**
-	 * Constructor
-	 * @param proxy
-	 */
-	public JavaScriptThreadHandler(AbstractModelProxy proxy) {
-		super(proxy);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.update.ThreadEventHandler#handlesEvent(org.eclipse.debug.core.DebugEvent)
-	 */
-	protected boolean handlesEvent(DebugEvent event) {
-		return event.getSource() instanceof IJavaScriptThread;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.update.ThreadEventHandler#indexOf(org.eclipse.debug.core.model.IThread)
-	 */
-	protected int indexOf(IThread thread) {
-		if(thread.isTerminated()) {
-			return -1;
-		}
-		return super.indexOf(thread) + getOffset(thread);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.viewers.update.ThreadEventHandler#addPathToThread(org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta, org.eclipse.debug.core.model.IThread)
-	 */
-	protected ModelDelta addPathToThread(ModelDelta delta, IThread thread) {
-		ILaunch launch = thread.getLaunch();
-		Object[] children = launch.getChildren();
-		ModelDelta newdelta = delta.addNode(launch, indexOf(getLaunchManager().getLaunches(), launch), IModelDelta.NO_CHANGE, children.length);
-		IDebugTarget debugTarget = thread.getDebugTarget();
-		int numThreads = -1;
-		int offset = getOffset(thread);
-		try {
-			numThreads = debugTarget.getThreads().length + offset;
-		} catch (DebugException e) {
-		}
-		return newdelta.addNode(debugTarget, indexOf(children, debugTarget), IModelDelta.NO_CHANGE, numThreads);
-	}
-	
-	/**
-	 * @param thread
-	 * @return the thread offset
-	 */
-	int getOffset(IThread thread) {
-		return (PreferencesManager.getManager().showLoadedScripts() ? 1 : 0);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/BreakpointHelper.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/BreakpointHelper.java
deleted file mode 100644
index a7f6bfa..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/BreakpointHelper.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.breakpoints;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.wst.jsdt.core.IFunction;
-import org.eclipse.wst.jsdt.core.IJavaScriptElement;
-import org.eclipse.wst.jsdt.core.IMember;
-import org.eclipse.wst.jsdt.core.IType;
-import org.eclipse.wst.jsdt.core.ITypeRoot;
-import org.eclipse.wst.jsdt.core.JavaScriptCore;
-import org.eclipse.wst.jsdt.core.JavaScriptModelException;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptFunctionBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint;
-import org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptDebugUIPlugin;
-
-/**
- * Collection of utility methods to help get additional information
- * from breakpoints
- * 
- * @since 1.0
- */
-public class BreakpointHelper {
-
-	/**
-	 * Returns the member associated with the line number of
-	 * the given breakpoint.
-	 * 
-	 * @param breakpoint JavaScript line breakpoint
-	 * @return member at the given line number in the type 
-	 *  associated with the breakpoint
-	 * @exception CoreException if an exception occurs accessing
-	 *  the breakpoint
-	 */
-	public static IMember getMember(IJavaScriptLineBreakpoint breakpoint) throws CoreException {
-		if (breakpoint instanceof IJavaScriptFunctionBreakpoint) {
-			return getMethod((IJavaScriptFunctionBreakpoint)breakpoint);
-		}		
-		int start = breakpoint.getCharStart();
-		int end = breakpoint.getCharEnd();
-		
-		IType type = getType(breakpoint);
-		if (start == -1 && end == -1) {
-			start = breakpoint.getCharStart();
-			end = breakpoint.getCharEnd();
-		}
-		
-		IMember member = null;
-		if ((type != null && type.exists()) && (end >= start) && (start >= 0)) {
-			member = binSearch(type, start, end);
-		}
-		if (member == null) {
-			member= type;
-		}
-		return member;
-	}
-	
-	/**
-	 * Returns the function associated with the function
-	 * breakpoint.
-	 * 
-	 * @param breakpoint JavaScript function breakpoint
-	 * @return function
-	 */
-	public static IFunction getMethod(IJavaScriptFunctionBreakpoint breakpoint) {	
-		String handle = breakpoint.getModelIdentifier();
-		if (handle != null) {
-			IJavaScriptElement jse = JavaScriptCore.create(handle);
-			if (jse != null) {
-				if (jse instanceof IFunction) {
-					return (IFunction)jse;
-				}
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns the type that the given JavaScript breakpoint refers to
-	 * 
-	 * @param breakpoint JavaScript breakpoint
-	 * @return the type the breakpoint is associated with
-	 */
-	public static IType getType(IJavaScriptBreakpoint breakpoint) {
-		String handle = breakpoint.getModelIdentifier();
-		if (handle != null) {
-			IJavaScriptElement jse = JavaScriptCore.create(handle);
-			if (jse != null) {
-				if (jse instanceof IType) {
-					return (IType)jse;
-				}
-				if (jse instanceof IMember) {
-					return ((IMember)jse).getDeclaringType();
-				}
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns the type that the given JavaScript breakpoint refers to
-	 * 
-	 * @param breakpoint JavaScript breakpoint
-	 * @return the type the breakpoint is associated with
-	 */
-	public static ITypeRoot getTypeRoot(IJavaScriptBreakpoint breakpoint) {
-		try {
-			String handle = breakpoint.getJavaScriptElementHandle();
-			if (handle != null) {
-				IJavaScriptElement jse = JavaScriptCore.create(handle);
-				if (jse != null && jse.exists()) {
-					if (jse instanceof IType) {
-						return ((IType)jse).getTypeRoot();
-					}
-					if (jse instanceof IMember) {
-						return ((IMember)jse).getTypeRoot();
-					}
-				}
-			}
-		}
-		catch(CoreException ce) {
-			JavaScriptDebugUIPlugin.log(ce);
-		}
-		return null;
-	}
-	
-	/**
-	 * Searches the given source range of the container for a member that is
-	 * not the same as the given type.
-	 */
-	static IMember binSearch(IType type, int start, int end) throws JavaScriptModelException {
-		IJavaScriptElement je = getElementAt(type, start);
-		if (je != null && !je.equals(type)) {
-			return asMember(je);
-		}
-		if (end > start) {
-			je = getElementAt(type, end);
-			if (je != null && !je.equals(type)) {
-				return asMember(je);
-			}
-			int mid = ((end - start) / 2) + start;
-			if (mid > start) {
-				je = binSearch(type, start + 1, mid);
-				if (je == null) {
-					je = binSearch(type, mid + 1, end - 1);
-				}
-				return asMember(je);
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns the given JavaScript element if it is an
-	 * <code>IMember</code>, otherwise <code>null</code>.
-	 * 
-	 * @param element JavaScript element
-	 * @return the given element if it is a type member,
-	 * 	otherwise <code>null</code>
-	 */
-	static IMember asMember(IJavaScriptElement element) {
-		if (element instanceof IMember) {
-			return (IMember)element;
-		}
-		return null;		
-	}
-	
-	/**
-	 * Returns the element at the given position in the given type
-	 */
-	static IJavaScriptElement getElementAt(IType type, int pos) throws JavaScriptModelException {
-		if (type.isBinary()) {
-			return type.getClassFile().getElementAt(pos);
-		}
-		return type.getJavaScriptUnit().getElementAt(pos);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/BreakpointLocationFinder.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/BreakpointLocationFinder.java
deleted file mode 100644
index 64aeb7d..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/BreakpointLocationFinder.java
+++ /dev/null
@@ -1,906 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.breakpoints;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.wst.jsdt.core.dom.ASTNode;
-import org.eclipse.wst.jsdt.core.dom.ASTVisitor;
-import org.eclipse.wst.jsdt.core.dom.AnonymousClassDeclaration;
-import org.eclipse.wst.jsdt.core.dom.ArrayAccess;
-import org.eclipse.wst.jsdt.core.dom.ArrayCreation;
-import org.eclipse.wst.jsdt.core.dom.ArrayInitializer;
-import org.eclipse.wst.jsdt.core.dom.ArrayType;
-import org.eclipse.wst.jsdt.core.dom.Assignment;
-import org.eclipse.wst.jsdt.core.dom.Block;
-import org.eclipse.wst.jsdt.core.dom.BlockComment;
-import org.eclipse.wst.jsdt.core.dom.BodyDeclaration;
-import org.eclipse.wst.jsdt.core.dom.BooleanLiteral;
-import org.eclipse.wst.jsdt.core.dom.BreakStatement;
-import org.eclipse.wst.jsdt.core.dom.CatchClause;
-import org.eclipse.wst.jsdt.core.dom.CharacterLiteral;
-import org.eclipse.wst.jsdt.core.dom.ClassInstanceCreation;
-import org.eclipse.wst.jsdt.core.dom.ConditionalExpression;
-import org.eclipse.wst.jsdt.core.dom.ConstructorInvocation;
-import org.eclipse.wst.jsdt.core.dom.ContinueStatement;
-import org.eclipse.wst.jsdt.core.dom.DoStatement;
-import org.eclipse.wst.jsdt.core.dom.EmptyStatement;
-import org.eclipse.wst.jsdt.core.dom.EnhancedForStatement;
-import org.eclipse.wst.jsdt.core.dom.Expression;
-import org.eclipse.wst.jsdt.core.dom.ExpressionStatement;
-import org.eclipse.wst.jsdt.core.dom.FieldAccess;
-import org.eclipse.wst.jsdt.core.dom.FieldDeclaration;
-import org.eclipse.wst.jsdt.core.dom.ForInStatement;
-import org.eclipse.wst.jsdt.core.dom.ForStatement;
-import org.eclipse.wst.jsdt.core.dom.FunctionDeclaration;
-import org.eclipse.wst.jsdt.core.dom.FunctionExpression;
-import org.eclipse.wst.jsdt.core.dom.FunctionInvocation;
-import org.eclipse.wst.jsdt.core.dom.FunctionRef;
-import org.eclipse.wst.jsdt.core.dom.FunctionRefParameter;
-import org.eclipse.wst.jsdt.core.dom.IVariableBinding;
-import org.eclipse.wst.jsdt.core.dom.IfStatement;
-import org.eclipse.wst.jsdt.core.dom.ImportDeclaration;
-import org.eclipse.wst.jsdt.core.dom.InferredType;
-import org.eclipse.wst.jsdt.core.dom.InfixExpression;
-import org.eclipse.wst.jsdt.core.dom.Initializer;
-import org.eclipse.wst.jsdt.core.dom.InstanceofExpression;
-import org.eclipse.wst.jsdt.core.dom.JSdoc;
-import org.eclipse.wst.jsdt.core.dom.JavaScriptUnit;
-import org.eclipse.wst.jsdt.core.dom.LabeledStatement;
-import org.eclipse.wst.jsdt.core.dom.LineComment;
-import org.eclipse.wst.jsdt.core.dom.ListExpression;
-import org.eclipse.wst.jsdt.core.dom.MemberRef;
-import org.eclipse.wst.jsdt.core.dom.Modifier;
-import org.eclipse.wst.jsdt.core.dom.Name;
-import org.eclipse.wst.jsdt.core.dom.NullLiteral;
-import org.eclipse.wst.jsdt.core.dom.NumberLiteral;
-import org.eclipse.wst.jsdt.core.dom.ObjectLiteral;
-import org.eclipse.wst.jsdt.core.dom.ObjectLiteralField;
-import org.eclipse.wst.jsdt.core.dom.PackageDeclaration;
-import org.eclipse.wst.jsdt.core.dom.ParenthesizedExpression;
-import org.eclipse.wst.jsdt.core.dom.PostfixExpression;
-import org.eclipse.wst.jsdt.core.dom.PrefixExpression;
-import org.eclipse.wst.jsdt.core.dom.PrimitiveType;
-import org.eclipse.wst.jsdt.core.dom.QualifiedName;
-import org.eclipse.wst.jsdt.core.dom.QualifiedType;
-import org.eclipse.wst.jsdt.core.dom.RegularExpressionLiteral;
-import org.eclipse.wst.jsdt.core.dom.ReturnStatement;
-import org.eclipse.wst.jsdt.core.dom.SimpleName;
-import org.eclipse.wst.jsdt.core.dom.SimpleType;
-import org.eclipse.wst.jsdt.core.dom.SingleVariableDeclaration;
-import org.eclipse.wst.jsdt.core.dom.StringLiteral;
-import org.eclipse.wst.jsdt.core.dom.SuperConstructorInvocation;
-import org.eclipse.wst.jsdt.core.dom.SuperFieldAccess;
-import org.eclipse.wst.jsdt.core.dom.SuperMethodInvocation;
-import org.eclipse.wst.jsdt.core.dom.SwitchCase;
-import org.eclipse.wst.jsdt.core.dom.SwitchStatement;
-import org.eclipse.wst.jsdt.core.dom.TagElement;
-import org.eclipse.wst.jsdt.core.dom.TextElement;
-import org.eclipse.wst.jsdt.core.dom.ThisExpression;
-import org.eclipse.wst.jsdt.core.dom.ThrowStatement;
-import org.eclipse.wst.jsdt.core.dom.TryStatement;
-import org.eclipse.wst.jsdt.core.dom.TypeDeclaration;
-import org.eclipse.wst.jsdt.core.dom.TypeDeclarationStatement;
-import org.eclipse.wst.jsdt.core.dom.TypeLiteral;
-import org.eclipse.wst.jsdt.core.dom.UndefinedLiteral;
-import org.eclipse.wst.jsdt.core.dom.VariableDeclarationExpression;
-import org.eclipse.wst.jsdt.core.dom.VariableDeclarationFragment;
-import org.eclipse.wst.jsdt.core.dom.VariableDeclarationStatement;
-import org.eclipse.wst.jsdt.core.dom.WhileStatement;
-import org.eclipse.wst.jsdt.core.dom.WithStatement;
-
-/**
- * AST visitor to find the (proposed) location in source to put a breakpoint
- * 
- * @since 1.0
- */
-public class BreakpointLocationFinder extends ASTVisitor {
-
-	/**
-	 * <code>debugger</code> code statement
-	 */
-	public static final String DEBUGGER = "debugger"; //$NON-NLS-1$
-	public static final int UNKNOWN = -1;
-	public static final int LINE = 0;
-	public static final int FUNCTION = 1;
-	
-	/**
-	 * found location, initially {@link #UNKNOWN}
-	 */
-	private int location = UNKNOWN;
-	private JavaScriptUnit jsunit = null;
-	/**
-	 * The name of the function
-	 * @since 1.1
-	 */
-	private String functionName = null;
-	/**
-	 * The computed offset to the start of the element
-	 * @since 1.1
-	 */
-	private int offset = -1;
-	private boolean found = false;
-	private boolean resolvedbindings = false;
-	private ArrayList labels = new ArrayList();
-	private int linenumber = UNKNOWN;
-	
-	/**
-	 * Constructor
-	 * @param jsunit
-	 * @param linenumber
-	 * @param resolvedbindings
-	 */
-	public BreakpointLocationFinder(JavaScriptUnit jsunit, int linenumber, boolean resolvedbindings) {
-		this.jsunit = jsunit;
-		this.linenumber = linenumber;
-		this.resolvedbindings = resolvedbindings;
-	}
-	
-	/**
-	 * Gets the line number from the backing {@link JavaScriptUnit} from
-	 * the given offset
-	 * @param offset
-	 * @return the line number from the given offset
-	 */
-	int lineNumber(int offset) {
-        int lineNumber = jsunit.getLineNumber(offset);
-        return lineNumber < 1 ? 1 : lineNumber;
-    }
-	
-	String getLabel() {
-        if (labels == null || labels.isEmpty()) {
-            return null;
-        }
-        return (String) labels.get(labels.size() - 1);
-    }
-    
-    void nestLabel(String label) {
-        if (labels == null) {
-            labels = new ArrayList();
-        }
-        labels.add(label);
-    }
-    
-    void popLabel() {
-        if (labels == null || labels.isEmpty()) {
-            return;
-        }
-        labels.remove(labels.size() - 1);
-    }
-	
-	/**
-	 * Return <code>true</code> if this node children may contain a valid location
-	 * for the breakpoint.
-	 * @param node the node.
-	 * @param isCode true indicated that the first line of the given node always
-	 *	contains some executable code, even if split in multiple lines.
-	 */
-	boolean visit(ASTNode node, boolean isCode) {
-		if (this.found) {
-			return false;
-		}
-		int startPosition = node.getStartPosition();
-		int endLine = lineNumber(startPosition + node.getLength() - 1);
-		if (endLine < this.linenumber) {
-			return false;
-		}
-		int startLine = lineNumber(startPosition);
-		if (isCode && (this.linenumber <= startLine)) {
-			this.linenumber = startLine;
-			this.found= true;
-			this.offset = startPosition;
-			this.location = LINE;
-			//TODO compute a type name for the script?
-			return false;
-		}
-		return true;
-	}
-	
-	/**
-	 * Returns the proposed location for the breakpoint
-	 * @return the proposed location for the breakpoint
-	 */
-	public int getLocation() {
-		return this.location;
-	}
-
-	/**
-	 * Returns the computed offset into the AST at the start location of the location
-	 * element. The AST parser computes this value, we derive it from the source start location
-	 * of the ASTNode found as the valid location.
-	 * 
-	 * @return the source start position for the found location or -1 if no position was found
-	 * @since 1.1
-	 */
-	public int getOffset() {
-		return this.offset;
-	}
-	
-	/**
-	 * Returns the name of the function for the found location iff the 
-	 * found location is a function.
-	 * 
-	 *  @return the name of the function for the found location or <code>null</code>
-	 *  @since 1.1
-	 */
-	public String getFunctionName() {
-		return this.functionName;
-	}
-	
-	/**
-	 * Returns the proposed line number for this breakpoint
-	 * @return the proposed line number
-	 */
-	public int getLineNumber() {
-		return this.linenumber;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.AnonymousClassDeclaration)
-	 */
-	public boolean visit(AnonymousClassDeclaration node) {
-		return visit(node, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.ArrayAccess)
-	 */
-	public boolean visit(ArrayAccess node) {
-		return visit(node, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.ArrayCreation)
-	 */
-	public boolean visit(ArrayCreation node) {
-		return visit(node, node.getInitializer() == null);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.ArrayInitializer)
-	 */
-	public boolean visit(ArrayInitializer node) {
-		return visit(node, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.ArrayType)
-	 */
-	public boolean visit(ArrayType node) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.Assignment)
-	 */
-	public boolean visit(Assignment node) {
-		if (visit(node, false)) {
-			Expression leftHandSide = node.getLeftHandSide();
-			if (leftHandSide instanceof Name) {
-				int startLine = lineNumber(node.getStartPosition());
-				if (this.linenumber < startLine) {
-					if (this.resolvedbindings) {
-						IVariableBinding binding= (IVariableBinding)((org.eclipse.wst.jsdt.core.dom.Name)leftHandSide).resolveBinding();
-						if (binding != null && (!binding.isField() || Modifier.isStatic(binding.getModifiers())))  {
-							node.getRightHandSide().accept(this);
-						}
-					}
-				}
-			}
-			return true;
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.Block)
-	 */
-	public boolean visit(Block node) {
-		if(visit(node, false)) {
-			if(node.statements().isEmpty() && node.getParent().getNodeType() == ASTNode.FUNCTION_DECLARATION) {
-				int offset = node.getStartPosition() + node.getLength() - 1;
-				this.linenumber = lineNumber(offset);
-				this.found = true;
-				this.location = LINE;
-				this.offset = offset;
-				//TODO compute a type name for the script?
-				return false;
-			}
-			return true;
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.BlockComment)
-	 */
-	public boolean visit(BlockComment node) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.BooleanLiteral)
-	 */
-	public boolean visit(BooleanLiteral node) {
-		return visit(node, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.BreakStatement)
-	 */
-	public boolean visit(BreakStatement node) {
-		return visit(node, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.CatchClause)
-	 */
-	public boolean visit(CatchClause node) {
-		return visit(node, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.CharacterLiteral)
-	 */
-	public boolean visit(CharacterLiteral node) {
-		return visit(node, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.ClassInstanceCreation)
-	 */
-	public boolean visit(ClassInstanceCreation node) {
-		return visit(node, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.ConditionalExpression)
-	 */
-	public boolean visit(ConditionalExpression node) {
-		return visit(node, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.ConstructorInvocation)
-	 */
-	public boolean visit(ConstructorInvocation node) {
-		return visit(node, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.ContinueStatement)
-	 */
-	public boolean visit(ContinueStatement node) {
-		return visit(node, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.DoStatement)
-	 */
-	public boolean visit(DoStatement node) {
-		return visit(node, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.EmptyStatement)
-	 */
-	public boolean visit(EmptyStatement node) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.EnhancedForStatement)
-	 */
-	public boolean visit(EnhancedForStatement node) {
-		if (visit(node, false)) {
-			node.getExpression().accept(this);
-			node.getBody().accept(this);
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.ExpressionStatement)
-	 */
-	public boolean visit(ExpressionStatement node) {
-		if(this.found) {
-			return false;
-		}
-		ASTNode child = node.getExpression();
-		if(child.getNodeType() == ASTNode.SIMPLE_NAME) {
-			SimpleName name = (SimpleName) child;
-			if(name.getFullyQualifiedName().equals(DEBUGGER)) {
-				location = UNKNOWN;
-				return false;
-			}
-		}
-		return visit(node, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.FieldAccess)
-	 */
-	public boolean visit(FieldAccess node) {
-		return visit(node, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.FieldDeclaration)
-	 */
-	public boolean visit(FieldDeclaration node) {
-		if(visit(node, false)) {
-			List frags = node.fragments();
-			if(frags.size() == 1) {
-				int offset = ((VariableDeclarationFragment)frags.get(0)).getName().getStartPosition();
-				if (lineNumber(offset) == this.linenumber) {
-					this.location = LINE;
-					this.offset = offset;
-					this.found = true;
-					return false;
-				}
-			}
-			else {
-				for (Iterator iter = frags.iterator(); iter.hasNext();) {
-					((VariableDeclarationFragment)iter.next()).accept(this);
-				}
-			}
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.ForInStatement)
-	 */
-	public boolean visit(ForInStatement node) {
-		if(visit(node, true)) {
-			node.getBody().accept(this);
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.ForStatement)
-	 */
-	public boolean visit(ForStatement node) {
-		// in case on a "for(;;)", the breakpoint can be set on the first token of the node.
-		return visit(node, node.initializers().isEmpty() && node.getExpression() == null && node.updaters().isEmpty());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.FunctionDeclaration)
-	 */
-	public boolean visit(FunctionDeclaration node) {
-		int nameOffset = node.getStartPosition();
-		if (lineNumber(nameOffset) == this.linenumber) {
-			this.location = FUNCTION;
-			this.found = true;
-			this.functionName = node.getName() == null ? null : node.getName().getIdentifier();
-			this.offset = nameOffset;
-			return false;
-		}
-		Block body = node.getBody();
-		if(body != null) {
-			body.accept(this);
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.FunctionExpression)
-	 */
-	public boolean visit(FunctionExpression node) {
-		node.getMethod().accept(this);
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.FunctionInvocation)
-	 */
-	public boolean visit(FunctionInvocation node) {
-		return visit(node, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.FunctionRef)
-	 */
-	public boolean visit(FunctionRef node) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.FunctionRefParameter)
-	 */
-	public boolean visit(FunctionRefParameter node) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.IfStatement)
-	 */
-	public boolean visit(IfStatement node) {
-		return visit(node, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.ImportDeclaration)
-	 */
-	public boolean visit(ImportDeclaration node) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.InferredType)
-	 */
-	public boolean visit(InferredType node) {
-		return visit(node, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.InfixExpression)
-	 */
-	public boolean visit(InfixExpression node) {
-		// TODO visit all operands?
-		return visit(node, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.Initializer)
-	 */
-	public boolean visit(Initializer node) {
-		return visit(node, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.InstanceofExpression)
-	 */
-	public boolean visit(InstanceofExpression node) {
-		return visit(node, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.JavaScriptUnit)
-	 */
-	public boolean visit(JavaScriptUnit node) {
-		return visit(node, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.JSdoc)
-	 */
-	public boolean visit(JSdoc node) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.LabeledStatement)
-	 */
-	public boolean visit(LabeledStatement node) {
-		nestLabel(node.getLabel().getFullyQualifiedName());
-		return visit(node, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#endVisit(org.eclipse.wst.jsdt.core.dom.LabeledStatement)
-	 */
-	public void endVisit(LabeledStatement node) {
-		popLabel();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.LineComment)
-	 */
-	public boolean visit(LineComment node) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.ListExpression)
-	 */
-	public boolean visit(ListExpression node) {
-		//TODO inspect elements of the list explicitly?
-		return visit(node, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.MemberRef)
-	 */
-	public boolean visit(MemberRef node) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.Modifier)
-	 */
-	public boolean visit(Modifier node) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.NullLiteral)
-	 */
-	public boolean visit(NullLiteral node) {
-		return visit(node, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.NumberLiteral)
-	 */
-	public boolean visit(NumberLiteral node) {
-		return visit(node, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.ObjectLiteral)
-	 */
-	public boolean visit(ObjectLiteral node) {
-		return visit(node, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.ObjectLiteralField)
-	 */
-	public boolean visit(ObjectLiteralField node) {
-		return visit(node, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.PackageDeclaration)
-	 */
-	public boolean visit(PackageDeclaration node) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.ParenthesizedExpression)
-	 */
-	public boolean visit(ParenthesizedExpression node) {
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.PostfixExpression)
-	 */
-	public boolean visit(PostfixExpression node) {
-		return visit(node, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.PrefixExpression)
-	 */
-	public boolean visit(PrefixExpression node) {
-		return visit(node, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.PrimitiveType)
-	 */
-	public boolean visit(PrimitiveType node) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.QualifiedName)
-	 */
-	public boolean visit(QualifiedName node) {
-		visit(node, true);
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.QualifiedType)
-	 */
-	public boolean visit(QualifiedType node) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.RegularExpressionLiteral)
-	 */
-	public boolean visit(RegularExpressionLiteral node) {
-		//TODO is there more to visit here?
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.ReturnStatement)
-	 */
-	public boolean visit(ReturnStatement node) {
-		return visit(node, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.SimpleName)
-	 */
-	public boolean visit(SimpleName node) {
-		return visit(node, !node.getFullyQualifiedName().equals(getLabel()));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.SimpleType)
-	 */
-	public boolean visit(SimpleType node) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.SingleVariableDeclaration)
-	 */
-	public boolean visit(SingleVariableDeclaration node) {
-		return visit(node, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.StringLiteral)
-	 */
-	public boolean visit(StringLiteral node) {
-		return visit(node, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.SuperConstructorInvocation)
-	 */
-	public boolean visit(SuperConstructorInvocation node) {
-		return visit(node, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.SuperFieldAccess)
-	 */
-	public boolean visit(SuperFieldAccess node) {
-		return visit(node, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.SuperMethodInvocation)
-	 */
-	public boolean visit(SuperMethodInvocation node) {
-		return visit(node, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.SwitchCase)
-	 */
-	public boolean visit(SwitchCase node) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.SwitchStatement)
-	 */
-	public boolean visit(SwitchStatement node) {
-		return visit(node, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.TagElement)
-	 */
-	public boolean visit(TagElement node) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.TextElement)
-	 */
-	public boolean visit(TextElement node) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.ThisExpression)
-	 */
-	public boolean visit(ThisExpression node) {
-		return visit(node, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.ThrowStatement)
-	 */
-	public boolean visit(ThrowStatement node) {
-		return visit(node, true);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.TryStatement)
-	 */
-	public boolean visit(TryStatement node) {
-		return visit(node, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.TypeDeclaration)
-	 */
-	public boolean visit(TypeDeclaration node) {
-		if(visit(node, false)) {
-			List bdecls = node.bodyDeclarations();
-			for (Iterator iter = bdecls.iterator(); iter.hasNext();) {
-				((BodyDeclaration)iter.next()).accept(this);
-			}
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.TypeDeclarationStatement)
-	 */
-	public boolean visit(TypeDeclarationStatement node) {
-		return visit(node, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.TypeLiteral)
-	 */
-	public boolean visit(TypeLiteral node) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.UndefinedLiteral)
-	 */
-	public boolean visit(UndefinedLiteral node) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.VariableDeclarationExpression)
-	 */
-	public boolean visit(VariableDeclarationExpression node) {
-		return visit(node, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.VariableDeclarationFragment)
-	 */
-	public boolean visit(VariableDeclarationFragment node) {
-		Expression init = node.getInitializer();
-		//TODO should we visit the init first?
-		//the common pattern for function declarations is:
-		//var func = function() {..}
-		if(visit(node, false) && init != null) {
-			init.accept(this);
-			if(!this.found) {
-				int offset = node.getName().getStartPosition();
-				int startLine = lineNumber(offset);
-				if (this.linenumber == startLine) {
-					this.linenumber = startLine;
-					this.found = true;
-					this.location = LINE;
-					this.offset = offset;
-					//TODO resolve script name?
-					return false;
-				}
-			}
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.VariableDeclarationStatement)
-	 */
-	public boolean visit(VariableDeclarationStatement node) {
-		return visit(node, node.getParent().getNodeType() == ASTNode.BLOCK);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.WhileStatement)
-	 */
-	public boolean visit(WhileStatement node) {
-		return visit(node, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.core.dom.ASTVisitor#visit(org.eclipse.wst.jsdt.core.dom.WithStatement)
-	 */
-	public boolean visit(WithStatement node) {
-		return visit(node, false);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/BreakpointPropertiesEditorActionDelegate.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/BreakpointPropertiesEditorActionDelegate.java
deleted file mode 100644
index bee9afa..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/BreakpointPropertiesEditorActionDelegate.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.breakpoints;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.text.source.IVerticalRulerInfo;
-import org.eclipse.ui.texteditor.AbstractRulerActionDelegate;
-import org.eclipse.ui.texteditor.ITextEditor;
-
-/**
- * Action delegate for the Breakpoint Properties action
- * 
- * @since 1.0
- */
-public class BreakpointPropertiesEditorActionDelegate extends AbstractRulerActionDelegate {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.texteditor.AbstractRulerActionDelegate#createAction(org.eclipse.ui.texteditor.ITextEditor, org.eclipse.jface.text.source.IVerticalRulerInfo)
-	 */
-	protected IAction createAction(ITextEditor editor, IVerticalRulerInfo rulerInfo) {
-		return new BreakpointPropertiesRulerAction(editor, rulerInfo);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/BreakpointPropertiesRulerAction.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/BreakpointPropertiesRulerAction.java
deleted file mode 100644
index c75bd67..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/BreakpointPropertiesRulerAction.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.breakpoints;
-
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.ui.actions.RulerBreakpointAction;
-import org.eclipse.jface.text.source.IVerticalRulerInfo;
-import org.eclipse.ui.dialogs.PreferencesUtil;
-import org.eclipse.ui.texteditor.ITextEditor;
-import org.eclipse.ui.texteditor.IUpdate;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint;
-
-/**
- * Ruler action for the Breakpoint Properties action
- * 
- * @since 1.0
- */
-public class BreakpointPropertiesRulerAction extends RulerBreakpointAction implements IUpdate {
-
-	private IJavaScriptBreakpoint breakpoint = null;
-	
-	/**
-	 * Constructor
-	 * @param editor
-	 * @param info
-	 */
-	public BreakpointPropertiesRulerAction(ITextEditor editor, IVerticalRulerInfo info) {
-		super(editor, info);
-		setText(Messages.breakpoint_properties);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		if(this.breakpoint != null) {
-			PreferencesUtil.createPropertyDialogOn(
-					getEditor().getSite().getShell(), 
-					this.breakpoint, 
-					JavaScriptBreakpointPropertyPage.PAGE_ID, 
-					null, 
-					null, 
-					0).open();
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.texteditor.IUpdate#update()
-	 */
-	public void update() {
-		this.breakpoint = null;
-		IBreakpoint bp = getBreakpoint();
-		if (bp != null && (bp instanceof IJavaScriptBreakpoint)) {
-			this.breakpoint = (IJavaScriptBreakpoint) bp;
-		}
-		setEnabled(this.breakpoint != null);
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/JavaScriptBreakpointPropertyPage.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/JavaScriptBreakpointPropertyPage.java
deleted file mode 100644
index 342f690..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/JavaScriptBreakpointPropertyPage.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.breakpoints;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IPropertyListener;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.PropertyPage;
-import org.eclipse.wst.jsdt.core.IMember;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptFunctionBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLoadBreakpoint;
-import org.eclipse.wst.jsdt.debug.internal.ui.IHelpContextIds;
-import org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptDebugUIPlugin;
-import org.eclipse.wst.jsdt.debug.internal.ui.SWTFactory;
-import org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.editors.AbstractJavaScriptBreakpointEditor;
-import org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.editors.CompositeBreakpointEditor;
-import org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.editors.FunctionBreakpointEditor;
-import org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.editors.JavaScriptBreakpointConditionEditor;
-import org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.editors.StandardJavaScriptBreakpointEditor;
-import org.eclipse.wst.jsdt.ui.JavaScriptElementLabelProvider;
-
-/**
- * Abstract class for breakpoint property pages
- * 
- * @since 1.0
- */
-public class JavaScriptBreakpointPropertyPage extends PropertyPage {
-
-	public static String PAGE_ID = "org.eclipse.wst.jsdt.debug.ui.breakpoints.propertypage"; //$NON-NLS-1$
-	
-	protected Button enabledbutton;
-	protected Button hitcountbutton;
-	protected Text hitcounttext;
-	protected Combo suspendpolicycombo;
-	protected List errors = new ArrayList();
-	protected String fPrevMessage = null;
-	AbstractJavaScriptBreakpointEditor editor = null;
-	JavaScriptElementLabelProvider labelprovider = new JavaScriptElementLabelProvider(JavaScriptElementLabelProvider.SHOW_DEFAULT);
-	
-	/**
-	 * @return the underlying {@link IJavaScriptBreakpoint} element this page was opened on
-	 */
-	protected IJavaScriptBreakpoint getBreakpoint() {
-		return (IJavaScriptBreakpoint) getElement();
-	}
-	
-	/**
-	 * Allows subclasses to add type specific labels to the common Java
-	 * breakpoint page.
-	 * @param parent
-	 */
-	protected void createTypeSpecificLabels(Composite parent) {
-		IJavaScriptBreakpoint jb = getBreakpoint();
-		if (jb instanceof IJavaScriptLineBreakpoint) {
-			IJavaScriptLineBreakpoint breakpoint = (IJavaScriptLineBreakpoint) jb;
-			StringBuffer lineNumber = new StringBuffer(4);
-			try {
-				int lNumber = breakpoint.getLineNumber();
-				if (lNumber > 0) {
-					lineNumber.append(lNumber);
-				}
-			} catch (CoreException ce) {
-				JavaScriptDebugUIPlugin.log(ce);
-			}
-			if (lineNumber.length() > 0) {
-				SWTFactory.createLabel(parent, Messages.line_number, 1); 
-				Text text = SWTFactory.createSingleText(parent, SWT.READ_ONLY, 1, lineNumber.toString());
-				GridData gd = (GridData) text.getLayoutData();
-				gd.horizontalAlignment = GridData.HORIZONTAL_ALIGN_BEGINNING;
-				gd.grabExcessHorizontalSpace = false;
-				gd.widthHint = 50;
-				text.setBackground(parent.getBackground());
-			}
-			try {
-				IMember member = BreakpointHelper.getMember(breakpoint);
-				if (member == null) {
-					return;
-				}
-				String label = Messages.member; 
-				if (breakpoint instanceof IJavaScriptFunctionBreakpoint) {
-					label = Messages.fuction; 
-				}
-				SWTFactory.createLabel(parent, label, 1);
-				Text text = SWTFactory.createSingleText(parent, SWT.READ_ONLY, 1, labelprovider.getText(member));
-				text.setBackground(parent.getBackground());
-			} 
-			catch (CoreException exception) {
-				JavaScriptDebugUIPlugin.log(exception);
-			}
-		}
-	}
-	
-	/**
-	 * Allows subclasses to add type specific editors to the common Java
-	 * breakpoint page.
-	 * @param parent
-	 */
-	protected void createTypeSpecificEditors(Composite parent) {
-		try {
-			String type = getBreakpoint().getMarker().getType();
-			if (IJavaScriptLoadBreakpoint.MARKER_ID.equals(type)) {
-				setTitle(Messages.script_load_breakpoint);
-				this.editor = new StandardJavaScriptBreakpointEditor();
-			} else if (IJavaScriptLineBreakpoint.MARKER_ID.equals(type)) {
-				setTitle(Messages.line_breakpoint);
-				this.editor = new CompositeBreakpointEditor(new AbstractJavaScriptBreakpointEditor[]
-				    {new StandardJavaScriptBreakpointEditor(), new JavaScriptBreakpointConditionEditor()}); 
-			} else if (IJavaScriptFunctionBreakpoint.MARKER_ID.equals(type)) {
-				setTitle(Messages.function_breakpoint);
-				this.editor = new CompositeBreakpointEditor(new AbstractJavaScriptBreakpointEditor[] 
-				    {new FunctionBreakpointEditor(), new JavaScriptBreakpointConditionEditor()});
-			}
-			this.editor.createControl(parent);
-			this.editor.addPropertyListener(new IPropertyListener() {
-				public void propertyChanged(Object source, int propId) {
-					IStatus status = JavaScriptBreakpointPropertyPage.this.editor.getStatus();
-					if (status.isOK()) {
-						if (fPrevMessage != null) {
-							removeErrorMessage(fPrevMessage);
-							fPrevMessage = null;
-						}
-					} else {
-						fPrevMessage = status.getMessage();
-						addErrorMessage(fPrevMessage);
-					}
-				}
-			});
-			this.editor.setInput(getBreakpoint());
-		} catch (CoreException e) {
-			setErrorMessage(e.getMessage());
-		}
-	}
-	
-	/**
-	 * Stores the values configured in this page. This method
-	 * should be called from within a workspace runnable to
-	 * reduce the number of resource deltas.
-	 */
-	protected void doStore() throws CoreException {
-		IJavaScriptBreakpoint breakpoint = getBreakpoint();
-		breakpoint.setEnabled(enabledbutton.getSelection());
-		if(this.editor != null) {
-			this.editor.doSave();
-		}
-	}
-	
-	/**
-	 * Creates the button to toggle enablement of the breakpoint
-	 * @param parent
-	 */
-	protected void createEnabledButton(Composite parent)  {
-		enabledbutton = SWTFactory.createCheckButton(parent, Messages.enabled, null, false, 1); 
-		try {
-			enabledbutton.setSelection(getBreakpoint().isEnabled());
-		}
-		catch(CoreException ce) {
-			JavaScriptDebugUIPlugin.log(ce);
-		}
-	}
-	
-	/**
-	 * Creates the labels displayed for the breakpoint.
-	 * @param parent
-	 */
-	protected void createLabels(Composite parent) {
-		Composite labelComposite = SWTFactory.createComposite(parent, 2, 1, GridData.FILL_HORIZONTAL);
-		try {
-			IJavaScriptBreakpoint bp = getBreakpoint();
-			String name = bp.getTypeName();
-			if (name != null) {
-				SWTFactory.createLabel(labelComposite, Messages.type_name, 1); 
-				Text text = SWTFactory.createText(labelComposite, SWT.READ_ONLY | SWT.SINGLE, 1, GridData.FILL_HORIZONTAL);
-				text.setText(name);
-				text.setBackground(parent.getBackground());
-			}
-			name = bp.getScriptPath();
-			if(name != null) {
-				SWTFactory.createLabel(labelComposite, Messages.script_path, 1);
-				Text text = SWTFactory.createText(labelComposite, SWT.READ_ONLY, 1, GridData.FILL_HORIZONTAL);
-				text.setText(name);
-				text.setBackground(parent.getBackground());
-			}
-			createTypeSpecificLabels(labelComposite);
-		} catch (CoreException ce) {
-			JavaScriptDebugUIPlugin.log(ce);
-		}
-	}
-	
-	/**
-	 * Adds the given error message to the errors currently displayed on this page.
-	 * The page displays the most recently added error message.
-	 * Clients should retain messages that are passed into this method as the
-	 * message should later be passed into removeErrorMessage(String) to clear the error.
-	 * This method should be used instead of setErrorMessage(String).
-	 * @param message the error message to display on this page.
-	 */
-	protected void addErrorMessage(String message) {
-		errors.remove(message);
-		errors.add(message);
-		setErrorMessage(message);
-		setValid(message == null);
-	}
-	
-	/**
-	 * Removes the given error message from the errors currently displayed on this page.
-	 * When an error message is removed, the page displays the error that was added
-	 * before the given message. This is akin to popping the message from a stack.
-	 * Clients should call this method instead of setErrorMessage(null).
-	 * @param message the error message to clear
-	 */
-	protected void removeErrorMessage(String message) {
-		errors.remove(message);
-		if (errors.isEmpty()) {
-			addErrorMessage(null);
-		} else {
-			addErrorMessage((String) errors.get(errors.size() - 1));
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		setTitle(Messages.script_load_bp);
-		noDefaultAndApplyButton();
-		Composite comp = SWTFactory.createComposite(parent, 1, 1, GridData.FILL_BOTH);
-		createLabels(comp);
-		SWTFactory.createHorizontalSpacer(comp, 1);
-		createEnabledButton(comp);
-		createTypeSpecificEditors(comp);
-		setValid(true);
-		setControl(parent);
-		return comp;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#performOk()
-	 */
-	public boolean performOk() {
-		IWorkspaceRunnable wr = new IWorkspaceRunnable() {
-			public void run(IProgressMonitor monitor) throws CoreException {
-				doStore();
-			}
-		};
-		try {
-			ResourcesPlugin.getWorkspace().run(wr, null, IWorkspace.AVOID_UPDATE, null);
-		} 
-		catch (CoreException e) {
-			JavaScriptDebugUIPlugin.log(e);
-		}
-		return super.performOk();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		super.createControl(parent);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, IHelpContextIds.JAVASCRIPT_BREAKPOINT_PROPERTY_PAGE);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/JavaScriptBreakpointUpdater.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/JavaScriptBreakpointUpdater.java
deleted file mode 100644
index 275f7c3..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/JavaScriptBreakpointUpdater.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.breakpoints;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IBreakpointManager;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.Position;
-import org.eclipse.ui.texteditor.IMarkerUpdater;
-import org.eclipse.ui.texteditor.MarkerUtilities;
-import org.eclipse.wst.jsdt.core.IJavaScriptUnit;
-import org.eclipse.wst.jsdt.core.JavaScriptCore;
-import org.eclipse.wst.jsdt.core.dom.JavaScriptUnit;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.model.JavaScriptDebugModel;
-import org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptDebugUIPlugin;
-import org.eclipse.wst.jsdt.internal.ui.JavaScriptPlugin;
-import org.eclipse.wst.jsdt.internal.ui.javaeditor.ASTProvider;
-
-/**
- * A marker updater for {@link IJavaScriptBreakpoint}s
- * 
- * @since 1.1
- */
-public class JavaScriptBreakpointUpdater implements IMarkerUpdater {
-
-	/**
-	 * Constructor
-	 */
-	public JavaScriptBreakpointUpdater() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.texteditor.IMarkerUpdater#getMarkerType()
-	 */
-	public String getMarkerType() {
-		return IJavaScriptBreakpoint.MARKER_ID;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.texteditor.IMarkerUpdater#getAttribute()
-	 */
-	public String[] getAttribute() {
-		return new String[] {IMarker.LINE_NUMBER};
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.texteditor.IMarkerUpdater#updateMarker(org.eclipse.core.resources.IMarker, org.eclipse.jface.text.IDocument, org.eclipse.jface.text.Position)
-	 */
-	public boolean updateMarker(IMarker marker, IDocument document, Position position) {
-		if(position.isDeleted()) {
-			return false;
-		}
-		IBreakpointManager manager = DebugPlugin.getDefault().getBreakpointManager();
-		IBreakpoint breakpoint = manager.getBreakpoint(marker);
-		if(breakpoint == null) {
-			return false;
-		}
-		IJavaScriptUnit unit = JavaScriptCore.createCompilationUnitFrom((IFile) marker.getResource());
-		if(unit == null) {
-			return false;
-		}
-		JavaScriptUnit jsunit = JavaScriptPlugin.getDefault().getASTProvider().getAST(unit, ASTProvider.WAIT_YES, null);
-		try {
-			BreakpointLocationFinder finder = new BreakpointLocationFinder(jsunit, document.getLineOfOffset(position.getOffset())+1, true);
-			jsunit.accept(finder);
-			if(finder.getLocation() == BreakpointLocationFinder.UNKNOWN) {
-				return false;
-			}
-			int line = finder.getLineNumber();
-			if(MarkerUtilities.getLineNumber(marker) == line) {
-				//if there exists a breakpoint on the line remove this one
-				if(isLineBreakpoint(marker)) {
-					ensureRanges(document, marker, line);
-					return lineBreakpointExists(marker.getResource(), ((IJavaScriptLineBreakpoint)breakpoint).getScriptPath(), line, marker, true) == null;
-				}
-				return true;
-			}
-			if(isLineBreakpoint(marker) & line == -1) {
-				return false;
-			}
-			if(lineBreakpointExists(marker.getResource(), ((IJavaScriptLineBreakpoint)breakpoint).getScriptPath(), line, marker, false) != null) {
-				return false;
-			}
-			MarkerUtilities.setLineNumber(marker, line);
-			if(isLineBreakpoint(marker)) {
-				ensureRanges(document, marker, line);
-			}
-			return true;
-		}
-		catch(BadLocationException ble) {
-			JavaScriptDebugUIPlugin.log(ble);
-		} catch (CoreException e) {
-			JavaScriptDebugUIPlugin.log(e);
-		}
-		return false;
-	}
-	
-	/**
-	 * Returns if the given marker is of the type {@link IJavaScriptLineBreakpoint#MARKER_ID}
-	 * @param marker
-	 * @return true if the marker is a {@link IJavaScriptLineBreakpoint} marker
-	 */
-	boolean isLineBreakpoint(IMarker marker) {
-		return MarkerUtilities.isMarkerType(marker, IJavaScriptLineBreakpoint.MARKER_ID);
-	}
-	
-	/**
-	 * Corrects the {@link IMarker#CHAR_START} and {@link IMarker#CHAR_END} values as needed
-	 * 
-	 * @param document
-	 * @param marker
-	 * @param line
-	 * @throws BadLocationException
-	 */
-	void ensureRanges(IDocument document, IMarker marker, int line) throws BadLocationException {
-		if(line < 0 || line > document.getNumberOfLines()) {
-			return;
-		}
-		IRegion region = document.getLineInformation(line - 1);
-		int charstart = region.getOffset();
-		int charend = charstart + region.getLength();
-		MarkerUtilities.setCharStart(marker, charstart);
-		MarkerUtilities.setCharEnd(marker, charend);
-	}
-	
-	/**
-	 * Looks up the {@link IJavaScriptLineBreakpoint} that is associated with the given marker. Returns <code>null</code> if one 
-	 * does not exist
-	 * 
-	 * @param resource
-	 * @param typeName
-	 * @param lineNumber
-	 * @param currentmarker
-	 * @param useid if the id of the markers should be compared
-	 * @return the {@link IJavaScriptLineBreakpoint} for the given marker or <code>null</code> if one does not exist
-	 * @throws CoreException
-	 */
-	IJavaScriptLineBreakpoint lineBreakpointExists(IResource resource, String typeName, int lineNumber, IMarker currentmarker, boolean useid) throws CoreException {
-		String modelId = JavaScriptDebugModel.MODEL_ID;
-		IBreakpointManager manager = DebugPlugin.getDefault().getBreakpointManager();
-		IBreakpoint[] breakpoints = manager.getBreakpoints(modelId);
-		for (int i = 0; i < breakpoints.length; i++) {
-			if ((breakpoints[i] instanceof IJavaScriptLineBreakpoint)) {
-				IJavaScriptLineBreakpoint breakpoint = (IJavaScriptLineBreakpoint) breakpoints[i];
-				if(breakpoint.getLineNumber() == lineNumber) {
-					IMarker marker = breakpoint.getMarker();
-					if (marker != null && 
-							marker.exists() && 
-							marker.getType().equals(IJavaScriptLineBreakpoint.MARKER_ID) && 
-							pathsEqual(breakpoint.getScriptPath(), typeName) &&
-							resource.equals(marker.getResource())) {
-						if(useid) {
-							if(currentmarker.getId() != marker.getId()) {
-								return breakpoint;
-							}
-							return null;
-						}
-						return breakpoint;
-					}
-				}
-				
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns if n1 equals n2, where both being <code>null</code> is also considered equal
-	 * @param n1
-	 * @param n2
-	 * @return 
-	 */
-	boolean pathsEqual(String n1, String n2) {
-		if(n1 == null) {
-			return n2 == null;
-		}
-		return n1.equals(n2);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/JavaScriptHtmlBreakpointProvider.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/JavaScriptHtmlBreakpointProvider.java
deleted file mode 100644
index c9f8587..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/JavaScriptHtmlBreakpointProvider.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.breakpoints;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.ITypedRegion;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.wst.jsdt.debug.internal.ui.adapters.JavaScriptAdapterFactory;
-import org.eclipse.wst.sse.ui.internal.provisional.extensions.ISourceEditingTextTools;
-import org.eclipse.wst.sse.ui.internal.provisional.extensions.breakpoint.IBreakpointProvider;
-
-/**
- * Provide the JavaScript breakpoint for the HTML editor
- * 
- * @since 3.4
- */
-public class JavaScriptHtmlBreakpointProvider implements IBreakpointProvider {
-
-	static final String SCRIPT_REGION = "org.eclipse.wst.html.SCRIPT"; //$NON-NLS-1$
-	
-	/**
-	 * Constructor
-	 */
-	public JavaScriptHtmlBreakpointProvider() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.sse.ui.internal.provisional.extensions.breakpoint.IBreakpointProvider#addBreakpoint(org.eclipse.jface.text.IDocument, org.eclipse.ui.IEditorInput, int, int)
-	 */
-	public IStatus addBreakpoint(final IDocument document, IEditorInput input, final int lineNumber, final int offset) throws CoreException {
-		final IResource resource = getResource(input);
-		if(resource != null && offset > -1) {
-			try {
-				final ITypedRegion region = document.getPartition(document.getLineOffset(lineNumber));
-				if (region != null && SCRIPT_REGION.equals(region.getType())) {
-					Job j = new Job("Toggle JavaScript Line Breakpoint") { //$NON-NLS-1$
-						protected IStatus run(IProgressMonitor monitor) {
-							try {
-								JavaScriptAdapterFactory.getToggleBreakpointAdapter().addBreakpoint(resource, document, lineNumber);
-								return Status.OK_STATUS;
-							}
-							catch(CoreException ce) {
-								return Status.CANCEL_STATUS;
-							}
-						}
-					};
-					j.setPriority(Job.INTERACTIVE);
-					j.schedule();
-				}
-			}
-			catch(BadLocationException ble) {}
-		}
-		return Status.CANCEL_STATUS;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.sse.ui.internal.provisional.extensions.breakpoint.IBreakpointProvider#getResource(org.eclipse.ui.IEditorInput)
-	 */
-	public IResource getResource(IEditorInput input) {
-        IResource resource = (IResource) input.getAdapter(IFile.class);
-        if (resource == null) {
-            resource = ResourcesPlugin.getWorkspace().getRoot();
-        }
-        return resource;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.sse.ui.internal.provisional.extensions.breakpoint.IBreakpointProvider#setSourceEditingTextTools(org.eclipse.wst.sse.ui.internal.provisional.extensions.ISourceEditingTextTools)
-	 */
-	public void setSourceEditingTextTools(ISourceEditingTextTools tool) {
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/Messages.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/Messages.java
deleted file mode 100644
index e8598b5..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/Messages.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.breakpoints;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * 
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.messages"; //$NON-NLS-1$
-	public static String breakpoint_condition;
-	public static String breakpoint_properties;
-	public static String breakpoint_settings;
-	public static String conditional;
-	public static String disable_breakpoint;
-	public static String enable_breakpoint;
-	public static String enabled;
-	public static String enter_condition;
-	public static String entry;
-	public static String exit;
-	public static String failed_function_bp_no_element;
-	public static String failed_function_bp_no_resource;
-	public static String failed_line_bp_no_element;
-	public static String failed_line_bp_no_resource;
-	public static String failed_to_create_function_bp;
-	public static String failed_to_create_line_bp;
-	public static String fuction;
-	public static String function_breakpoint;
-	public static String function_breakpoint_settings;
-	public static String hit_count;
-	public static String hit_count_must_be_positive;
-	public static String line_breakpoint;
-	public static String line_breakpoint_settings;
-	public static String line_number;
-	public static String member;
-	public static String no_editor_could_be_found;
-	public static String no_valid_location;
-	public static String script_load_bp;
-	public static String script_load_breakpoint;
-	public static String script_path;
-	public static String suspend_thread;
-	public static String suspend_target;
-	public static String suspend_when_changed;
-	public static String suspend_when_true;
-	public static String type_name;
-	public static String type_root_could_not_be_computed;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/ToggleBreakpointAdapter.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/ToggleBreakpointAdapter.java
deleted file mode 100644
index e47f2c1..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/ToggleBreakpointAdapter.java
+++ /dev/null
@@ -1,540 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.breakpoints;
-
-import java.util.HashMap;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.ui.actions.IToggleBreakpointsTargetExtension;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.text.ITypedRegion;
-import org.eclipse.jface.text.TextSelection;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.texteditor.IDocumentProvider;
-import org.eclipse.ui.texteditor.IEditorStatusLine;
-import org.eclipse.ui.texteditor.ITextEditor;
-import org.eclipse.wst.jsdt.core.IClassFile;
-import org.eclipse.wst.jsdt.core.IFunction;
-import org.eclipse.wst.jsdt.core.IJavaScriptElement;
-import org.eclipse.wst.jsdt.core.IJavaScriptUnit;
-import org.eclipse.wst.jsdt.core.IMember;
-import org.eclipse.wst.jsdt.core.ISourceRange;
-import org.eclipse.wst.jsdt.core.IType;
-import org.eclipse.wst.jsdt.core.ITypeRoot;
-import org.eclipse.wst.jsdt.core.dom.AST;
-import org.eclipse.wst.jsdt.core.dom.ASTParser;
-import org.eclipse.wst.jsdt.core.dom.JavaScriptUnit;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptFunctionBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.model.JavaScriptDebugModel;
-import org.eclipse.wst.jsdt.debug.internal.ui.DebugWCManager;
-import org.eclipse.wst.jsdt.internal.ui.JavaScriptPlugin;
-import org.eclipse.wst.jsdt.internal.ui.javaeditor.ASTProvider;
-
-/**
- * JavaScript adapter for toggling breakpoints in the JSDT editor
- * 
- * @since 1.0
- */
-public class ToggleBreakpointAdapter implements IToggleBreakpointsTargetExtension {
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.actions.IToggleBreakpointsTargetExtension#canToggleBreakpoints(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
-	 */
-	public boolean canToggleBreakpoints(IWorkbenchPart part, ISelection selection) {
-		return selection instanceof ITextSelection;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.actions.IToggleBreakpointsTarget#canToggleLineBreakpoints(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
-	 */
-	public boolean canToggleLineBreakpoints(IWorkbenchPart part, ISelection selection) {
-		return selection instanceof ITextSelection;
-	}
-
-	/**
-	 * Toggles a line breakpoint 
-	 * @param part
-	 * @param selection
-	 * @param element
-	 */
-	void toggleLineBreakpoint(final IWorkbenchPart part, final ITextSelection selection, final IJavaScriptElement element, final int linenumber) {
-		Job job = new Job("Toggle Line Breakpoints") { //$NON-NLS-1$
-            protected IStatus run(IProgressMonitor monitor) {
-            	try {
-            		ITextEditor editor = getTextEditor(part);
-					if(editor != null && part instanceof IEditorPart) {
-						if(element == null) {
-							reportToStatusLine(part, Messages.failed_line_bp_no_element);
-							return Status.CANCEL_STATUS;
-						}
-						IResource resource = element.getResource();
-						if(resource == null) {
-							reportToStatusLine(part, NLS.bind(Messages.failed_line_bp_no_resource, element.getElementName()));
-							return Status.CANCEL_STATUS;
-						}
-						IBreakpoint bp = lineBreakpointExists(resource, linenumber);
-						if(bp != null) {
-							DebugPlugin.getDefault().getBreakpointManager().removeBreakpoint(bp, true);
-							return Status.OK_STATUS;
-						}
-						IDocumentProvider documentProvider = editor.getDocumentProvider();
-						IDocument document = documentProvider.getDocument(editor.getEditorInput());
-						int charstart = -1, charend = -1;
-						try {
-							IRegion line = document.getLineInformation(linenumber - 1);
-							charstart = line.getOffset();
-							charend = charstart + line.getLength();
-						}
-						catch (BadLocationException ble) {}
-						HashMap attributes = new HashMap();
-						attributes.put(IJavaScriptBreakpoint.TYPE_NAME, getTypeName(element));
-						attributes.put(IJavaScriptBreakpoint.SCRIPT_PATH, getScriptPath(element));
-						attributes.put(IJavaScriptBreakpoint.ELEMENT_HANDLE, element.getHandleIdentifier());
-						JavaScriptDebugModel.createLineBreakpoint(resource, linenumber, charstart, charend, attributes, true);
-						return Status.OK_STATUS;
-					}
-					reportToStatusLine(part, Messages.failed_to_create_line_bp);
-					return Status.CANCEL_STATUS;
-	            }
-	        	catch(CoreException ce) {
-	        		return ce.getStatus();
-        		}
-        	}
-		};
-		job.setPriority(Job.INTERACTIVE);
-        job.setSystem(true);
-        job.schedule();
-	}
-	
-	/**
-	 * Callback from {@link JavaScriptHtmlBreakpointProvider}
-	 * @param resource
-	 * @param document
-	 * @param linenumber
-	 * @throws CoreException
-	 */
-	void addBreakpoint(IResource resource, IDocument document, int linenumber) throws CoreException {
-		IBreakpoint bp = lineBreakpointExists(resource, linenumber);
-		if(bp != null) {
-			DebugPlugin.getDefault().getBreakpointManager().removeBreakpoint(bp, true);
-		}
-		int charstart = -1, charend = -1;
-		try {
-			IRegion line = document.getLineInformation(linenumber - 1);
-			charstart = line.getOffset();
-			charend = charstart + line.getLength();
-		}
-		catch (BadLocationException ble) {}
-		HashMap attributes = new HashMap();
-		attributes.put(IJavaScriptBreakpoint.TYPE_NAME, null);
-		attributes.put(IJavaScriptBreakpoint.SCRIPT_PATH, resource.getFullPath().makeAbsolute().toString());
-		attributes.put(IJavaScriptBreakpoint.ELEMENT_HANDLE, null);
-		JavaScriptDebugModel.createLineBreakpoint(resource, linenumber, charstart, charend, attributes, true);
-	}
-	
-	/**
-	 * Returns the path to the script in the workspace or the name of the script in the event it is
-	 * and external or virtual script
-	 * @param element
-	 * @return the path to the script 
-	 */
-	String getScriptPath(IJavaScriptElement element) {
-		IPath path = element.getPath();
-		return path.makeAbsolute().toString();
-	}
-	
-	/**
-	 * Resolves the type name from the given element
-	 * @param element
-	 * @return
-	 */
-	String getTypeName(IJavaScriptElement element) {
-		switch(element.getElementType()) {
-			case IJavaScriptElement.TYPE: {
-				return ((IType)element).getFullyQualifiedName();
-			}
-			case IJavaScriptElement.METHOD:
-			case IJavaScriptElement.FIELD: {
-				IMember member = (IMember) element;
-				IType type = member.getDeclaringType();
-				if(type != null) {
-					return type.getFullyQualifiedName();
-				}
-			}
-			//$FALL-THROUGH$
-			default: {
-				return null;
-			}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.actions.IToggleBreakpointsTarget#toggleLineBreakpoints(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void toggleLineBreakpoints(final IWorkbenchPart part, final ISelection selection) throws CoreException {
-		//do nothing
-	}
-	
-	/**
-	 * Resolves the declaring type for the member
-	 * @param member
-	 * @return the declaring type for the member
-	 */
-	IType resolveType(IJavaScriptElement element) {
-		switch(element.getElementType()) {
-			case IJavaScriptElement.TYPE: {
-				return (IType) element;
-			}
-			case IJavaScriptElement.METHOD:
-			case IJavaScriptElement.FIELD: {
-				IMember member = (IMember) element;
-				IType type = member.getDeclaringType();
-				if(type == null) {
-					ITypeRoot root = (ITypeRoot) member.getParent();
-					type = root.findPrimaryType();
-				}
-				return type;
-			}
-			default: {
-				//already a type root
-				if(element instanceof ITypeRoot) {
-					return ((ITypeRoot)element).findPrimaryType();
-				}
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Resolves the region from the given document and tries to parse the text of the region. Returns the {@link JavaScriptUnit}
-	 * representing the region or <code>null</code> if it could not be computed
-	 * 
-	 * @param doc
-	 * @param offset
-	 * @return the {@link JavaScriptUnit} for the region from the document or <code>null</code>
-	 */
-	JavaScriptUnit parse(IDocument doc, int offset) {
-		try {
-			ITypedRegion region = doc.getPartition(offset);
-			if(region != null) {
-				ASTParser parser = ASTParser.newParser(AST.JLS3);
-				//parser.setKind(ASTParser.K_STATEMENTS);
-				parser.setSource(doc.get(offset, region.getLength()).toCharArray());
-				return (JavaScriptUnit)parser.createAST(null);
-			}
-		}
-		catch(BadLocationException ble) {
-			//do nothing, return null
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns the resource on which a breakpoint marker should
-	 * be created for the given member. The resource returned is the 
-	 * associated file, or workspace root in the case of a binary in 
-	 * an external archive.
-	 * 
-	 * @param element member in which a breakpoint is being created
-	 * @return resource the resource on which a breakpoint marker
-	 *  should be created
-	 */
-	IResource getBreakpointResource(IJavaScriptElement element) {
-		IResource res = element.getResource();
-		if (res == null) {
-			res = ResourcesPlugin.getWorkspace().getRoot();
-		}
-		else if(!res.getProject().exists()) {
-			res = ResourcesPlugin.getWorkspace().getRoot();
-		}
-		return res;
-	}
-	
-	/**
-	 * Returns the {@link ITypeRoot} for the given editor input
-	 * @param input
-	 * @return the {@link ITypeRoot} for the editor input or <code>null</code>
-	 */
-	ITypeRoot getTypeRoot(IEditorInput input) {
-		ITypeRoot root = (ITypeRoot) input.getAdapter(IClassFile.class);
-		if(root == null) {
-			root = DebugWCManager.getCompilationUnit(input, false);
-		}
-		return root;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.actions.IToggleBreakpointsTarget#canToggleMethodBreakpoints(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
-	 */
-	public boolean canToggleMethodBreakpoints(IWorkbenchPart part, ISelection selection) {
-		return selection instanceof ITextSelection;
-	}
-	
-	/**
-	 * Delegate for toggling a method breakpoint
-	 * @param part
-	 * @param element
-	 * @param line
-	 */
-	void toggleMethodBreakpoint(final IWorkbenchPart part, final IJavaScriptElement element, final int line) {
-		Job job = new Job("Toggle Function Breakpoints") { //$NON-NLS-1$
-            protected IStatus run(IProgressMonitor monitor) {
-            	try {
-					if(element == null) {
-						reportToStatusLine(part, Messages.failed_function_bp_no_element);
-						return Status.CANCEL_STATUS;
-					}
-					if(element.getElementType() == IJavaScriptElement.METHOD) {
-						IFunction method = (IFunction) element;
-						IResource resource = element.getResource();
-						if(resource == null) {
-							reportToStatusLine(part, NLS.bind(Messages.failed_function_bp_no_resource, element.getElementName()));
-							return Status.CANCEL_STATUS;
-						}
-						IBreakpoint bp = methodBreakpointExists(resource, method.getElementName(), method.getSignature());
-						if(bp != null) {
-							DebugPlugin.getDefault().getBreakpointManager().removeBreakpoint(bp, true);
-							return Status.OK_STATUS;
-						}
-						ISourceRange range = method.getNameRange();
-						int start = -1, end = -1;
-						if(range != null) {
-							start = range.getOffset();
-							end = start + range.getLength();
-						}
-						HashMap attributes = new HashMap();
-						//hack if the type is null the member is declared in a top-level type
-						//nothing else we can do
-						attributes.put(IJavaScriptBreakpoint.TYPE_NAME, getTypeName(element));
-						attributes.put(IJavaScriptBreakpoint.SCRIPT_PATH, getScriptPath(element));
-						attributes.put(IMarker.LINE_NUMBER, new Integer(line));
-						IJavaScriptFunctionBreakpoint breakpoint = JavaScriptDebugModel.createFunctionBreakpoint(resource, method.getElementName(), method.getSignature(), start, end, attributes, true);
-						breakpoint.setJavaScriptElementHandle(element.getHandleIdentifier());
-						return Status.OK_STATUS;
-					}
-					reportToStatusLine(part, Messages.failed_to_create_function_bp);
-				}
-	        	catch(CoreException ce) {
-	        		return ce.getStatus();
-        		}
-	        	return Status.CANCEL_STATUS;
-        	}
-		};
-		job.setPriority(Job.INTERACTIVE);
-        job.setSystem(true);
-        job.schedule();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.actions.IToggleBreakpointsTarget#toggleMethodBreakpoints(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void toggleMethodBreakpoints(final IWorkbenchPart part, final ISelection selection) throws CoreException {
-		//do nothing
-	}
-
-	/**
-	 * Sends a friendly message to the status line about why we could not set a breakpoint
-	 * @param part
-	 * @param message
-	 */
-	void reportToStatusLine(final IWorkbenchPart part, final String message) {
-		getStandardDisplay().asyncExec(new Runnable() {
-            public void run() {
-				IEditorStatusLine statusLine = (IEditorStatusLine) part.getAdapter(IEditorStatusLine.class);
-		        if (statusLine != null) {
-		            if (message != null) {
-		                statusLine.setMessage(true, message, null);
-		            } else {
-		                statusLine.setMessage(true, null, null);
-		            }
-		        }
-            }
-		});
-	}
-	
-	/**
-	 * Returns the standard display to be used. 
-	 */
-	Display getStandardDisplay() {
-		Display display;
-		display = Display.getCurrent();
-		if (display == null) {
-			display = Display.getDefault();
-		}
-		return display;		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.actions.IToggleBreakpointsTargetExtension#toggleBreakpoints(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void toggleBreakpoints(IWorkbenchPart part, ISelection selection) throws CoreException {
-		if(selection instanceof ITextSelection) {
-			ITextEditor textEditor = getTextEditor(part);
-			if(textEditor == null) {
-				reportToStatusLine(part, Messages.no_editor_could_be_found);
-				return;
-			}
-			ITypeRoot root = getTypeRoot(textEditor.getEditorInput());
-            if(root instanceof IJavaScriptUnit) {
-            	IJavaScriptUnit unit = (IJavaScriptUnit) root;
-                synchronized (unit) {
-                    unit.reconcile(IJavaScriptUnit.NO_AST , false, null, null);
-                }
-            }
-            if(root == null) {
-            	reportToStatusLine(part, Messages.type_root_could_not_be_computed);
-            	return;
-            }
-			JavaScriptUnit jsunit = JavaScriptPlugin.getDefault().getASTProvider().getAST(root, ASTProvider.WAIT_YES, null);
-			BreakpointLocationFinder finder = new BreakpointLocationFinder(jsunit, ((TextSelection)selection).getStartLine()+1, false);
-			jsunit.accept(finder);
-			switch(finder.getLocation()) {
-				case BreakpointLocationFinder.UNKNOWN : {
-					reportToStatusLine(part, Messages.no_valid_location);
-					return;
-				}
-				case BreakpointLocationFinder.LINE: {
-					IJavaScriptElement element = root.getElementAt(finder.getOffset());
-					if(element == null) {
-						element = root;
-					}
-					toggleLineBreakpoint(part, (ITextSelection) selection, element, finder.getLineNumber());
-					return;
-				}
-				case BreakpointLocationFinder.FUNCTION: {
-					toggleMethodBreakpoint(part, root.getElementAt(finder.getOffset()), finder.getLineNumber());
-					return;
-				}
-			}
-		}
-		else {
-			IStructuredSelection ss = (IStructuredSelection) selection;
-        	Object o = ss.getFirstElement();
-        	if(o instanceof IMember) {
-        		IMember member = (IMember) o;
-        		if(member.getElementType() == IJavaScriptElement.METHOD) {
-    				toggleMethodBreakpoint(part, member, -1);
-    			}
-        	}
-		}
-	}
-	
-	/**
-	 * Returns if a line breakpoint exists on the given line in the given resource
-	 * @param resource
-	 * @param linenumber
-	 * @return true if a line breakpoint exists on the given line in the given resource, false otherwise
-	 */
-	IBreakpoint lineBreakpointExists(IResource resource, int linenumber) {
-		IBreakpoint[] breakpoints = DebugPlugin.getDefault().getBreakpointManager().getBreakpoints(JavaScriptDebugModel.MODEL_ID);
-		IJavaScriptLineBreakpoint breakpoint = null;
-		for (int i = 0; i < breakpoints.length; i++) {
-			if(breakpoints[i] instanceof IJavaScriptLineBreakpoint) {
-				breakpoint = (IJavaScriptLineBreakpoint) breakpoints[i];
-				try {
-					if(IJavaScriptLineBreakpoint.MARKER_ID.equals(breakpoint.getMarker().getType()) &&
-						resource.equals(breakpoint.getMarker().getResource()) &&
-						linenumber == breakpoint.getLineNumber()) {
-						return breakpoint;
-					}
-				} catch (CoreException e) {}
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns if a method breakpoint exists with the given name and signature in the given resource
-	 * @param resource
-	 * @param name
-	 * @param signature
-	 * @return true if a method breakpoint exists with the given name and signature in the given resource, false otherwise
-	 */
-	IBreakpoint methodBreakpointExists(IResource resource, String name, String signature) {
-		IBreakpoint[] breakpoints = DebugPlugin.getDefault().getBreakpointManager().getBreakpoints(JavaScriptDebugModel.MODEL_ID);
-		IJavaScriptBreakpoint breakpoint = null;
-		for (int i = 0; i < breakpoints.length; i++) {
-			breakpoint = (IJavaScriptBreakpoint) breakpoints[i];
-			try {
-				if(IJavaScriptFunctionBreakpoint.MARKER_ID.equals(breakpoint.getMarker().getType()) &&
-					resource.equals(breakpoint.getMarker().getResource()) &&
-					name.equals(breakpoint.getMarker().getAttribute(IJavaScriptFunctionBreakpoint.FUNCTION_NAME)) &&
-					signature.equals(breakpoint.getMarker().getAttribute(IJavaScriptFunctionBreakpoint.FUNCTION_SIGNAURE))) {
-					return breakpoint;
-				}
-			} catch (CoreException e) {}
-		}
-		return null;
-	}
-	
-	/**
-     * Returns the resource associated with the specified editor part
-     * @param editor the currently active editor part
-     * @return the corresponding <code>IResource</code> from the editor part
-     */
-    IResource getResource(IEditorPart editor) {
-        IEditorInput editorInput = editor.getEditorInput();
-        IResource resource = (IResource) editorInput.getAdapter(IFile.class);
-        if (resource == null) {
-            resource = ResourcesPlugin.getWorkspace().getRoot();
-        }
-        return resource;
-    }
-	
-    /**
-     * Returns the text editor associated with the given part or <code>null</code>
-     * if none. In case of a multi-page editor, this method should be used to retrieve
-     * the correct editor to perform the breakpoint operation on.
-     * 
-     * @param part workbench part
-     * @return text editor part or <code>null</code>
-     */
-    ITextEditor getTextEditor(IWorkbenchPart part) {
-    	if (part instanceof ITextEditor) {
-    		return (ITextEditor) part;
-    	}
-    	return (ITextEditor) part.getAdapter(ITextEditor.class);
-    }
-    
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.actions.IToggleBreakpointsTarget#canToggleWatchpoints(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
-	 */
-	public boolean canToggleWatchpoints(IWorkbenchPart part, ISelection selection) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.actions.IToggleBreakpointsTarget#toggleWatchpoints(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void toggleWatchpoints(IWorkbenchPart part, ISelection selection) throws CoreException {}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/ToggleBreakpointEnablementEditorDelegate.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/ToggleBreakpointEnablementEditorDelegate.java
deleted file mode 100644
index 5198ce4..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/ToggleBreakpointEnablementEditorDelegate.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.breakpoints;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.text.source.IVerticalRulerInfo;
-import org.eclipse.ui.texteditor.AbstractRulerActionDelegate;
-import org.eclipse.ui.texteditor.ITextEditor;
-
-/**
- * Ruler delegate to toggling the enabled state of the underlying
- * selected breakpoint
- * 
- * @since 1.0
- */
-public class ToggleBreakpointEnablementEditorDelegate extends AbstractRulerActionDelegate {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.texteditor.AbstractRulerActionDelegate#createAction(org.eclipse.ui.texteditor.ITextEditor, org.eclipse.jface.text.source.IVerticalRulerInfo)
-	 */
-	protected IAction createAction(ITextEditor editor, IVerticalRulerInfo rulerInfo) {
-		return new ToggleBreakpointEnablementRulerAction(editor, rulerInfo);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/ToggleBreakpointEnablementRulerAction.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/ToggleBreakpointEnablementRulerAction.java
deleted file mode 100644
index 2b311dd..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/ToggleBreakpointEnablementRulerAction.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.breakpoints;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.ui.actions.RulerBreakpointAction;
-import org.eclipse.jface.text.source.IVerticalRulerInfo;
-import org.eclipse.ui.texteditor.ITextEditor;
-import org.eclipse.ui.texteditor.IUpdate;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint;
-import org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptDebugUIPlugin;
-
-/**
- * Action that allows the enabled state of the breakpoint to be toggled from the compilation
- * unit editor
- * 
- * @since 1.0
- */
-public class ToggleBreakpointEnablementRulerAction extends RulerBreakpointAction implements IUpdate {
-
-	private IJavaScriptBreakpoint breakpoint = null;
-	
-	/**
-	 * Constructor
-	 * @param editor
-	 * @param info
-	 */
-	public ToggleBreakpointEnablementRulerAction(ITextEditor editor, IVerticalRulerInfo info) {
-		super(editor, info);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#getText()
-	 */
-	public String getText() {
-		if(this.breakpoint != null) {
-			try {
-				return (this.breakpoint.isEnabled() ? Messages.disable_breakpoint : Messages.enable_breakpoint);
-			} catch (CoreException e) {
-				JavaScriptDebugUIPlugin.log(e);
-			}
-		}
-		return super.getText();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		if(this.breakpoint != null) {
-			try {
-				this.breakpoint.setEnabled(!this.breakpoint.isEnabled());
-			} catch (CoreException e) {
-				JavaScriptDebugUIPlugin.log(e);
-			}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.texteditor.IUpdate#update()
-	 */
-	public void update() {
-		this.breakpoint = null;
-		IBreakpoint bp = getBreakpoint();
-		if (bp != null && (bp instanceof IJavaScriptBreakpoint)) {
-			this.breakpoint = (IJavaScriptBreakpoint) bp;
-			try {
-				if(this.breakpoint.isEnabled()) {
-					setText(Messages.disable_breakpoint);
-				}
-				else {
-					setText(Messages.enable_breakpoint);
-				}
-			} catch (CoreException e) {
-				JavaScriptDebugUIPlugin.log(e);
-				setText(Messages.disable_breakpoint);
-				setEnabled(false);
-			}
-		}
-		else {
-			setText(Messages.disable_breakpoint);
-		}
-		setEnabled(this.breakpoint != null);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/ToggleFunctionBreakpointActionDelegate.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/ToggleFunctionBreakpointActionDelegate.java
deleted file mode 100644
index db218e4..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/ToggleFunctionBreakpointActionDelegate.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.breakpoints;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.internal.ui.actions.breakpoints.ToggleBreakpointObjectActionDelegate;
-import org.eclipse.debug.ui.actions.IToggleBreakpointsTarget;
-import org.eclipse.debug.ui.actions.IToggleBreakpointsTargetExtension;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * Toggle action delegate for popup menus to set function breakpoints
- * 
- * @since 1.0
- */
-public class ToggleFunctionBreakpointActionDelegate extends ToggleBreakpointObjectActionDelegate {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.internal.ui.actions.breakpoints.ToggleBreakpointObjectActionDelegate#performAction(org.eclipse.debug.ui.actions.IToggleBreakpointsTarget, org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
-	 */
-	protected void performAction(IToggleBreakpointsTarget target, IWorkbenchPart part, ISelection selection) throws CoreException {
-		((IToggleBreakpointsTargetExtension)target).toggleBreakpoints(part, selection);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/details/AbstractDetailPane.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/details/AbstractDetailPane.java
deleted file mode 100644
index 50a4fe2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/details/AbstractDetailPane.java
+++ /dev/null
@@ -1,289 +0,0 @@
-/*******************************************************************************
- *  Copyright (c) 2010 IBM Corporation and others.
- *  All rights reserved. This program and the accompanying materials
- *  are made available under the terms of the Eclipse Public License v1.0
- *  which accompanies this distribution, and is available at
- *  http://www.eclipse.org/legal/epl-v10.html
- * 
- *  Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.details;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.debug.ui.IDetailPane3;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IEditorActionBarContributor;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IPropertyListener;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchPartConstants;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.part.EditorActionBarContributor;
-import org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptDebugUIPlugin;
-import org.eclipse.wst.jsdt.debug.internal.ui.SWTFactory;
-import org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.editors.AbstractJavaScriptBreakpointEditor;
-
-/**
- * Common detail pane function.
- * 
- * @since 1.0
- */
-public abstract class AbstractDetailPane implements IDetailPane3 {
-	
-	private String fName;
-	private String fDescription;
-	private String fId;
-	private AbstractJavaScriptBreakpointEditor fEditor;
-	private Set fAutoSaveProperties = new HashSet();
-	private IWorkbenchPartSite fSite; 
-	
-	// property listeners
-	private ListenerList fListeners = new ListenerList();
-	private Composite fEditorParent;
-	
-	/**
-	 * Constructs a detail pane.
-	 * 
-	 * @param name detail pane name
-	 * @param description detail pane description
-	 * @param id detail pane ID
-	 */
-	public AbstractDetailPane(String name, String description, String id) {
-		fName = name;
-		fDescription = description;
-		fId = id;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDetailPane3#addPropertyListener(org.eclipse.ui.IPropertyListener)
-	 */
-	public void addPropertyListener(IPropertyListener listener) {
-		fListeners.add(listener);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDetailPane3#removePropertyListener(org.eclipse.ui.IPropertyListener)
-	 */
-	public void removePropertyListener(IPropertyListener listener) {
-		fListeners.remove(listener);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDetailPane2#getSelectionProvider()
-	 */
-	public ISelectionProvider getSelectionProvider() {
-		return null;
-	}
-	
-	/**
-	 * Fires a property change to all listeners.
-	 * 
-	 * @param property the property
-	 */
-	protected void firePropertyChange(int property) {
-		Object[] listeners = fListeners.getListeners();
-		for (int i = 0; i < listeners.length; i++) {
-			((IPropertyListener)listeners[i]).propertyChanged(this, property);
-		}	
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDetailPane#init(org.eclipse.ui.IWorkbenchPartSite)
-	 */
-	public void init(IWorkbenchPartSite partSite) {
-		fSite = partSite;
-	}
-
-	public String getID() {
-		return fId;
-	}
-
-	public String getName() {
-		return fName;
-	}
-
-	public String getDescription() {
-		return fDescription;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDetailPane#dispose()
-	 */
-	public void dispose() {
-		fEditor = null;
-		fSite = null;
-		fListeners.clear();
-		fAutoSaveProperties.clear();
-		fEditorParent.dispose();
-	}	
-	
-	/**
-	 * Adds the given auto save properties to this detail pain. Whenever one of these
-	 * properties changes, the detail pane editor is immediately saved.
-	 * 
-	 * @param autosave
-	 */
-	protected void addAutosaveProperties(int[] autosave) {
-		for (int i = 0; i < autosave.length; i++) {
-			fAutoSaveProperties.add(new Integer(autosave[i]));
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDetailPane#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public Control createControl(Composite parent) {
-		fEditorParent = SWTFactory.createComposite(parent, 1, 1, GridData.FILL_BOTH);
-		fEditor = createEditor(fEditorParent);
-		fEditor.setMnemonics(false);
-		fEditor.addPropertyListener(new IPropertyListener() {
-			public void propertyChanged(Object source, int propId) {
-				if (fAutoSaveProperties.contains(new Integer(propId))) {
-					try {
-						fEditor.doSave();
-						return;
-					} catch (CoreException e) {
-					}
-				}
-				firePropertyChange(IWorkbenchPartConstants.PROP_DIRTY);
-			}
-		});
-		return fEditor.createControl(fEditorParent);
-	}
-	
-	/**
-	 * Creates the detail pane specific editor.
-	 * 
-	 * @param parent parent composite
-	 * @return editor
-	 */
-	protected abstract AbstractJavaScriptBreakpointEditor createEditor(Composite parent);
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISaveablePart#doSaveAs()
-	 */
-	public void doSaveAs() {
-		// do nothing
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISaveablePart#isSaveAsAllowed()
-	 */
-	public boolean isSaveAsAllowed() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISaveablePart#isSaveOnCloseNeeded()
-	 */
-	public boolean isSaveOnCloseNeeded() {
-		return isDirty() && fEditor.getStatus().isOK();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDetailPane#setFocus()
-	 */
-	public boolean setFocus() {
-		return false;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void doSave(IProgressMonitor monitor) {
-		IStatusLineManager statusLine = getStatusLine();
-		if (statusLine != null) {
-			statusLine.setErrorMessage(null);
-		}
-		try {
-			fEditor.doSave();
-		} catch (CoreException e) {
-			if (statusLine != null) {
-				statusLine.setErrorMessage(e.getMessage());
-				Display.getCurrent().beep();
-			} else {
-				JavaScriptDebugUIPlugin.log(e.getStatus());
-			}
-		}
-	}
-	
-	private IStatusLineManager getStatusLine() {
-		// we want to show messages globally hence we
-		// have to go through the active part
-		if (fSite instanceof IViewSite) {
-			IViewSite site= (IViewSite) fSite;
-			IWorkbenchPage page= site.getPage();
-			IWorkbenchPart activePart= page.getActivePart();
-
-			if (activePart instanceof IViewPart) {
-				IViewPart activeViewPart= (IViewPart)activePart;
-				IViewSite activeViewSite= activeViewPart.getViewSite();
-				return activeViewSite.getActionBars().getStatusLineManager();
-			}
-	
-			if (activePart instanceof IEditorPart) {
-				IEditorPart activeEditorPart= (IEditorPart)activePart;
-				IEditorActionBarContributor contributor= activeEditorPart.getEditorSite().getActionBarContributor();
-				if (contributor instanceof EditorActionBarContributor)
-					return ((EditorActionBarContributor) contributor).getActionBars().getStatusLineManager();
-			}
-			// no active part
-			return site.getActionBars().getStatusLineManager();
-		}
-		return null;
-	}	
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.ISaveablePart#isDirty()
-	 */
-	public boolean isDirty() {
-		return fEditor.isDirty();
-	}
-	
-	/**
-	 * Returns the editor associated with this detail pane.
-	 * 
-	 * @return editor
-	 */
-	protected AbstractJavaScriptBreakpointEditor getEditor() {
-		return fEditor;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDetailPane#display(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void display(IStructuredSelection selection) {
-		// clear status line
-		IStatusLineManager statusLine = getStatusLine();
-		if (statusLine != null) {
-			statusLine.setErrorMessage(null);
-		}
-		AbstractJavaScriptBreakpointEditor editor = getEditor();
-		Object input = null;
-		if (selection != null && selection.size() == 1) {
-			input = selection.getFirstElement();
-			// update even if the same in case attributes have changed
-		}
-		try {
-			editor.setInput(input);
-		} catch (CoreException e) {
-			JavaScriptDebugUIPlugin.log(e);
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/details/BreakpointDetailPaneFactory.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/details/BreakpointDetailPaneFactory.java
deleted file mode 100644
index 9d13b16..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/details/BreakpointDetailPaneFactory.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.details;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.ui.IDetailPane;
-import org.eclipse.debug.ui.IDetailPaneFactory;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptFunctionBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint;
-import org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.Messages;
-
-/**
- * Detail pane factory for Java breakpoints.
- * 
- * @since 1.0
- */
-public class BreakpointDetailPaneFactory implements IDetailPaneFactory {
-	
-	/**
-	 * Maps pane IDs to names
-	 */
-	private Map fNameMap;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDetailPaneFactory#getDetailPaneTypes(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public Set getDetailPaneTypes(IStructuredSelection selection) {
-		HashSet set = new HashSet();
-		if (selection.size() == 1) {
-			IBreakpoint b = (IBreakpoint) selection.getFirstElement();
-			try {
-				String type = b.getMarker().getType();
-				if (IJavaScriptLineBreakpoint.MARKER_ID.equals(type)) {
-					set.add(LineBreakpointDetailPane.PANE_ID);
-				} else if (IJavaScriptFunctionBreakpoint.MARKER_ID.equals(type)) {
-					set.add(FunctionBreakpointDetailPane.PANE_ID);
-				} else {
-					set.add(StandardBreakpointDetailPane.PANE_ID);
-				}
-			} catch (CoreException e) {}
-		}
-		return set;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDetailPaneFactory#getDefaultDetailPane(org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public String getDefaultDetailPane(IStructuredSelection selection) {
-		if (selection.size() == 1) {
-			IBreakpoint b = (IBreakpoint) selection.getFirstElement();
-			try {
-				String type = b.getMarker().getType();
-				if (IJavaScriptLineBreakpoint.MARKER_ID.equals(type)) {
-					return LineBreakpointDetailPane.PANE_ID;
-				} else if (IJavaScriptFunctionBreakpoint.MARKER_ID.equals(type)) {
-					return FunctionBreakpointDetailPane.PANE_ID;
-				} else {
-					return StandardBreakpointDetailPane.PANE_ID;
-				}
-			} catch (CoreException e) {}
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDetailPaneFactory#createDetailPane(java.lang.String)
-	 */
-	public IDetailPane createDetailPane(String paneID) {
-		if (LineBreakpointDetailPane.PANE_ID.equals(paneID)) {
-			return new LineBreakpointDetailPane();
-		}
-		if (StandardBreakpointDetailPane.PANE_ID.equals(paneID)) {
-			return new StandardBreakpointDetailPane();
-		}
-		if (FunctionBreakpointDetailPane.PANE_ID.equals(paneID)) {
-			return new FunctionBreakpointDetailPane();
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDetailPaneFactory#getDetailPaneName(java.lang.String)
-	 */
-	public String getDetailPaneName(String paneID) {
-		return (String) getNameMap().get(paneID);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.IDetailPaneFactory#getDetailPaneDescription(java.lang.String)
-	 */
-	public String getDetailPaneDescription(String paneID) {
-		return (String) getNameMap().get(paneID);
-	}
-	
-	private Map getNameMap() {
-		if (fNameMap == null) {
-			fNameMap = new HashMap();
-			fNameMap.put(LineBreakpointDetailPane.PANE_ID, Messages.line_breakpoint_settings);
-			fNameMap.put(FunctionBreakpointDetailPane.PANE_ID, Messages.function_breakpoint_settings);
-			fNameMap.put(StandardBreakpointDetailPane.PANE_ID, Messages.breakpoint_settings);
-		}
-		return fNameMap;
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/details/FunctionBreakpointDetailPane.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/details/FunctionBreakpointDetailPane.java
deleted file mode 100644
index 6de0fd3..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/details/FunctionBreakpointDetailPane.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- *  Copyright (c) 2010 IBM Corporation and others.
- *  All rights reserved. This program and the accompanying materials
- *  are made available under the terms of the Eclipse Public License v1.0
- *  which accompanies this distribution, and is available at
- *  http://www.eclipse.org/legal/epl-v10.html
- * 
- *  Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.details;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptDebugUIPlugin;
-import org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.Messages;
-import org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.editors.AbstractJavaScriptBreakpointEditor;
-import org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.editors.CompositeBreakpointEditor;
-import org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.editors.FunctionBreakpointEditor;
-import org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.editors.JavaScriptBreakpointConditionEditor;
-import org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.editors.StandardJavaScriptBreakpointEditor;
-
-/**
- * Watchpoint detail pane. Suspend on access or modification.
- * 
- * @since 1.0
- */
-public class FunctionBreakpointDetailPane extends AbstractDetailPane {
-	
-	/**
-	 * Identifier for this detail pane editor
-	 */
-	public static final String PANE_ID = JavaScriptDebugUIPlugin.PLUGIN_ID + ".function_breakpoint_detail_pane"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 */
-	public FunctionBreakpointDetailPane() {
-		super(Messages.breakpoint_settings, Messages.breakpoint_settings, PANE_ID);
-		addAutosaveProperties(new int[]{
-				StandardJavaScriptBreakpointEditor.PROP_HIT_COUNT_ENABLED,
-				StandardJavaScriptBreakpointEditor.PROP_SUSPEND_POLICY,
-				FunctionBreakpointEditor.PROP_ENTRY,
-				FunctionBreakpointEditor.PROP_EXIT,
-				JavaScriptBreakpointConditionEditor.PROP_CONDITION_ENABLED,
-				JavaScriptBreakpointConditionEditor.PROP_CONDITION_SUSPEND_POLICY
-		});
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.details.AbstractDetailPane#createEditor(org.eclipse.swt.widgets.Composite)
-	 */
-	protected AbstractJavaScriptBreakpointEditor createEditor(Composite parent) {
-		return new CompositeBreakpointEditor(new AbstractJavaScriptBreakpointEditor[] 
-			{new FunctionBreakpointEditor(), new JavaScriptBreakpointConditionEditor()});
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/details/LineBreakpointDetailPane.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/details/LineBreakpointDetailPane.java
deleted file mode 100644
index 2bcae6e..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/details/LineBreakpointDetailPane.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- *  Copyright (c) 2010 IBM Corporation and others.
- *  All rights reserved. This program and the accompanying materials
- *  are made available under the terms of the Eclipse Public License v1.0
- *  which accompanies this distribution, and is available at
- *  http://www.eclipse.org/legal/epl-v10.html
- * 
- *  Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.details;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptDebugUIPlugin;
-import org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.Messages;
-import org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.editors.AbstractJavaScriptBreakpointEditor;
-import org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.editors.CompositeBreakpointEditor;
-import org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.editors.JavaScriptBreakpointConditionEditor;
-import org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.editors.StandardJavaScriptBreakpointEditor;
-
-/**
- * Detail pane for editing a line breakpoint.
- *
- * @since 1.0
- */
-public class LineBreakpointDetailPane extends AbstractDetailPane {
-	
-	/**
-	 * Identifier for this detail pane editor
-	 */
-	public static final String PANE_ID = JavaScriptDebugUIPlugin.PLUGIN_ID + ".line_breakpoint_detail_pane"; //$NON-NLS-1$
-	
-	public LineBreakpointDetailPane() {
-		super(Messages.breakpoint_condition, Messages.breakpoint_condition, PANE_ID); 
-		addAutosaveProperties(new int[]{
-				JavaScriptBreakpointConditionEditor.PROP_CONDITION_ENABLED,
-				JavaScriptBreakpointConditionEditor.PROP_CONDITION_SUSPEND_POLICY,
-				StandardJavaScriptBreakpointEditor.PROP_HIT_COUNT_ENABLED,
-				StandardJavaScriptBreakpointEditor.PROP_SUSPEND_POLICY});
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.details.AbstractDetailPane#createEditor(org.eclipse.swt.widgets.Composite)
-	 */
-	protected AbstractJavaScriptBreakpointEditor createEditor(Composite parent) {
-		return new CompositeBreakpointEditor(
-			new AbstractJavaScriptBreakpointEditor[] {new StandardJavaScriptBreakpointEditor(), new JavaScriptBreakpointConditionEditor()}); 
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/details/StandardBreakpointDetailPane.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/details/StandardBreakpointDetailPane.java
deleted file mode 100644
index ab87128..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/details/StandardBreakpointDetailPane.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- *  Copyright (c) 2010 IBM Corporation and others.
- *  All rights reserved. This program and the accompanying materials
- *  are made available under the terms of the Eclipse Public License v1.0
- *  which accompanies this distribution, and is available at
- *  http://www.eclipse.org/legal/epl-v10.html
- * 
- *  Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.details;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptDebugUIPlugin;
-import org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.Messages;
-import org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.editors.AbstractJavaScriptBreakpointEditor;
-import org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.editors.StandardJavaScriptBreakpointEditor;
-
-/**
- * Suspend policy and hit count detail pane.
- * 
- * @since 1.0
- */
-public class StandardBreakpointDetailPane extends AbstractDetailPane {
-	
-	/**
-	 * Identifier for this detail pane editor
-	 */
-	public static final String PANE_ID = JavaScriptDebugUIPlugin.PLUGIN_ID + ".standard_detail_pane"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 */
-	public StandardBreakpointDetailPane() {
-		super(Messages.breakpoint_settings, Messages.breakpoint_settings, PANE_ID);
-		addAutosaveProperties(new int[]{
-				StandardJavaScriptBreakpointEditor.PROP_HIT_COUNT_ENABLED,
-				StandardJavaScriptBreakpointEditor.PROP_SUSPEND_POLICY});
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.details.AbstractDetailPane#createEditor(org.eclipse.swt.widgets.Composite)
-	 */
-	protected AbstractJavaScriptBreakpointEditor createEditor(Composite parent) {
-		return new StandardJavaScriptBreakpointEditor();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/editors/AbstractJavaScriptBreakpointEditor.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/editors/AbstractJavaScriptBreakpointEditor.java
deleted file mode 100644
index 5bbe991..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/editors/AbstractJavaScriptBreakpointEditor.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.editors;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.jface.action.LegacyActionTools;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.IPropertyListener;
-import org.eclipse.ui.IWorkbenchPartConstants;
-
-/**
- * Common function for Breakpoint editor controls.
- * 
- * @since 1.0
- */
-public abstract class AbstractJavaScriptBreakpointEditor {
-	
-    private ListenerList fListeners = new ListenerList();
-    private boolean fDirty = false;
-    private boolean fMnemonics = true;
-	
-	/**
-	 * Adds the given property listener to this editor. Property changes
-	 * are reported on the breakpoint being edited. Property identifiers
-	 * are breakpoint attribute keys.
-	 * 
-	 * @param listener listener
-	 */
-	public void addPropertyListener(IPropertyListener listener) {
-		fListeners.add(listener);
-	}
-	
-	/**
-	 * Sets whether mnemonics should be displayed in editor controls.
-	 * Only has an effect if set before {@link #createControl(Composite)}
-	 * is called. By default, mnemonics are displayed.
-	 * 
-	 * @param mnemonics whether to display mnemonics
-	 */
-	public void setMnemonics(boolean mnemonics) {
-		fMnemonics = mnemonics;
-	}
-	
-	/**
-	 * Returns whether mnemonics should be displayed in editor controls.
-	 * 
-	 * @return whether mnemonics should be displayed in editor controls
-	 */
-	protected boolean isMnemonics() {
-		return fMnemonics;
-	}
-	
-	/**
-	 * Returns text with mnemonics in tact or removed based on {@link #isMnemonics()}.
-	 * 
-	 * @param text string to process 
-	 * @return text with mnemonics in tact or removed based on {@link #isMnemonics()}
-	 */
-	protected String processMnemonics(String text) {
-		if (isMnemonics()) {
-			return text;
-		}
-		return LegacyActionTools.removeMnemonics(text);
-	}
-	
-	/**
-	 * Removes the property listener from this editor.
-	 * 
-	 * @param listener listener
-	 */
-	public void removePropertyListener(IPropertyListener listener) {
-		fListeners.remove(listener);
-	}
-	
-	/**
-	 * Creates the condition editor widgets and returns the top level
-	 * control.
-	 * 
-	 * @param parent composite to embed the editor controls in
-	 * @return top level control
-	 */
-	public abstract Control createControl(Composite parent);
-	
-	/**
-	 * Disposes this editor and its controls. Once disposed, the editor can no
-	 * longer be used.
-	 */
-	protected void dispose() {
-		fListeners.clear();
-	}
-	
-	/**
-	 * Gives focus to an appropriate control in the editor.
-	 */
-	public abstract void setFocus();
-	
-	/**
-	 * Saves current settings to the breakpoint being edited. Has no
-	 * effect if a breakpoint is not currently being edited or if this
-	 * editor is not dirty.
-	 * 
-	 * @exception CoreException if unable to update the breakpoint.
-	 */
-	public abstract void doSave() throws CoreException;
-	
-	/**
-	 * Returns a status describing whether the condition editor is in
-	 * a valid state. Returns an OK status when all is good. For example, an error
-	 * status is returned when the conditional expression is empty but enabled.
-	 * 
-	 * @return editor status.
-	 */
-	public abstract IStatus getStatus();
-		
-	/**
-	 * Returns whether the editor needs saving.
-	 *  
-	 * @return whether the editor needs saving
-	 */
-	public boolean isDirty() {
-		return fDirty;
-	}
-	
-	/**
-	 * Sets the dirty flag based on the given property change
-	 * 
-	 * @param propId the property that changed
-	 */
-	protected void setDirty(int propId) {
-		fDirty = true;
-		firePropertyChange(propId);
-	}
-	
-	/**
-	 * Sets the dirty flag and fires a dirty property change if required.
-	 * 
-	 * @param dirty whether dirty
-	 */
-	protected void setDirty(boolean dirty) {
-		if (fDirty != dirty) {
-			fDirty = dirty;
-			firePropertyChange(IWorkbenchPartConstants.PROP_DIRTY);
-		}
-	}
-	
-	/**
-	 * Fires a property change event to all listeners.
-	 * 
-	 * @param source
-	 * @param propId
-	 * @param value
-	 */
-	protected void firePropertyChange(int propId) {
-		Object[] listeners = fListeners.getListeners();
-		for (int i = 0; i < listeners.length; i++) {
-			IPropertyListener listener = (IPropertyListener) listeners[i];
-			listener.propertyChanged(this, propId);
-		}
-	}
-	
-	/**
-	 * Returns the breakpoint being displayed or <code>null</code> if none.
-	 * 
-	 * @return breakpoint or <code>null</code>
-	 */
-	public abstract Object getInput();
-	
-	/**
-	 * Sets the breakpoint to display and edit or <code>null</code> if none.
-	 * 
-	 * @param breakpoint breakpoint or <code>null</code>
-	 * @exception CoreException if unable to set the input
-	 */
-	public abstract void setInput(Object breakpoint) throws CoreException;
-	
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/editors/CompositeBreakpointEditor.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/editors/CompositeBreakpointEditor.java
deleted file mode 100644
index c828fc4..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/editors/CompositeBreakpointEditor.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.editors;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.IPropertyListener;
-import org.eclipse.wst.jsdt.debug.internal.ui.SWTFactory;
-
-/**
- * Combines fEditors.
- * 
- * @since 1.0
- */
-public class CompositeBreakpointEditor extends AbstractJavaScriptBreakpointEditor {
-	
-	private AbstractJavaScriptBreakpointEditor[] fEditors;
-	
-	/**
-	 * Constructor
-	 * @param fEditors
-	 */
-	public CompositeBreakpointEditor(AbstractJavaScriptBreakpointEditor[] editors) {
-		this.fEditors = editors;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.AbstractJavaScriptBreakpointEditor#addPropertyListener(org.eclipse.ui.IPropertyListener)
-	 */
-	public void addPropertyListener(IPropertyListener listener) {
-		for (int i = 0; i < fEditors.length; i++) {
-			fEditors[i].addPropertyListener(listener);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.AbstractJavaScriptBreakpointEditor#removePropertyListener(org.eclipse.ui.IPropertyListener)
-	 */
-	public void removePropertyListener(IPropertyListener listener) {
-		for (int i = 0; i < fEditors.length; i++) {
-			fEditors[i].removePropertyListener(listener);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.AbstractJavaScriptBreakpointEditor#dispose()
-	 */
-	protected void dispose() {
-		for (int i = 0; i < fEditors.length; i++) {
-			fEditors[i].dispose();
-		}
-		fEditors = null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.AbstractJavaScriptBreakpointEditor#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public Control createControl(Composite parent) {
-		Composite comp = SWTFactory.createComposite(parent, parent.getFont(), 1, 1, GridData.FILL_BOTH, 0, 0);
-		for (int i = 0; i < fEditors.length; i++) {
-			fEditors[i].createControl(comp);
-		}
-		return comp;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.AbstractJavaScriptBreakpointEditor#setFocus()
-	 */
-	public void setFocus() {
-		fEditors[0].setFocus();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.AbstractJavaScriptBreakpointEditor#doSave()
-	 */
-	public void doSave() throws CoreException {
-		for (int i = 0; i < fEditors.length; i++) {
-			fEditors[i].doSave();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.AbstractJavaScriptBreakpointEditor#isDirty()
-	 */
-	public boolean isDirty() {
-		for (int i = 0; i < fEditors.length; i++) {
-			if (fEditors[i].isDirty()) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.AbstractJavaScriptBreakpointEditor#getStatus()
-	 */
-	public IStatus getStatus() {
-		for (int i = 0; i < fEditors.length; i++) {
-			IStatus status = fEditors[i].getStatus();
-			if (!status.isOK()) {
-				return status;
-			}
-		}
-		return Status.OK_STATUS;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.AbstractJavaScriptBreakpointEditor#getInput()
-	 */
-	public Object getInput() {
-		return fEditors[0].getInput();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.AbstractJavaScriptBreakpointEditor#setInput(java.lang.Object)
-	 */
-	public void setInput(Object breakpoint) throws CoreException {
-		for (int i = 0; i < fEditors.length; i++) {
-			fEditors[i].setInput(breakpoint);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.AbstractJavaScriptBreakpointEditor#setMnemonics(boolean)
-	 */
-	public void setMnemonics(boolean mnemonics) {
-		super.setMnemonics(mnemonics);
-		for (int i = 0; i < fEditors.length; i++) {
-			fEditors[i].setMnemonics(mnemonics);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/editors/FunctionBreakpointEditor.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/editors/FunctionBreakpointEditor.java
deleted file mode 100644
index af8396a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/editors/FunctionBreakpointEditor.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.editors;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptFunctionBreakpoint;
-import org.eclipse.wst.jsdt.debug.internal.ui.SWTFactory;
-import org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.Messages;
-
-/**
- * Editor for method fEntry/fExit breakpoint.
- * 
- * @since 1.0
- */
-public class FunctionBreakpointEditor extends StandardJavaScriptBreakpointEditor {
-	
-	// Method fEntry/fExit editors
-	private Button fEntry;
-	private Button fExit;
-
-	public static final int PROP_ENTRY = 0x1012;
-	public static final int PROP_EXIT = 0x1013;
-	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.StandardJavaScriptBreakpointEditor#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public Control createControl(Composite parent) {
-		Composite composite = SWTFactory.createComposite(parent, parent.getFont(), 2, 1, 0, 0, 0);
-		// add standard controls
-		super.createStandardControls(composite);
-		Composite watchComp = SWTFactory.createComposite(composite, parent.getFont(), 3, 1, 0, 0, 0);
-		fEntry = createSusupendPropertyEditor(watchComp, processMnemonics(Messages.entry), PROP_ENTRY);
-		fExit = createSusupendPropertyEditor(watchComp, processMnemonics(Messages.exit), PROP_EXIT); 
-		return composite;
-	}
-	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.StandardJavaScriptBreakpointEditor#setBreakpoint(org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint)
-	 */
-	protected void setBreakpoint(IJavaScriptBreakpoint breakpoint) throws CoreException {
-		super.setBreakpoint(breakpoint);
-		if (breakpoint instanceof IJavaScriptFunctionBreakpoint) {
-			IJavaScriptFunctionBreakpoint fbp = (IJavaScriptFunctionBreakpoint) breakpoint;
-			fEntry.setEnabled(true);
-			fExit.setEnabled(true);
-			fEntry.setSelection(fbp.isEntry());
-			fExit.setSelection(fbp.isExit());
-		} else {
-			fEntry.setEnabled(false);
-			fExit.setEnabled(false);
-			fEntry.setSelection(false);
-			fExit.setSelection(false);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.StandardJavaScriptBreakpointEditor#doSave()
-	 */
-	public void doSave() throws CoreException {
-		super.doSave();
-		IJavaScriptBreakpoint breakpoint = getBreakpoint();
-		if (breakpoint instanceof IJavaScriptFunctionBreakpoint) {
-			IJavaScriptFunctionBreakpoint fpb = (IJavaScriptFunctionBreakpoint) breakpoint;
-			fpb.setEntry(fEntry.getSelection());
-			fpb.setExit(fExit.getSelection());
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/editors/JavaScriptBreakpointConditionEditor.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/editors/JavaScriptBreakpointConditionEditor.java
deleted file mode 100644
index 15fb3e4..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/editors/JavaScriptBreakpointConditionEditor.java
+++ /dev/null
@@ -1,356 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.editors;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.IHandler;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.fieldassist.ControlDecoration;
-import org.eclipse.jface.fieldassist.FieldDecoration;
-import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.DocumentEvent;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IDocumentListener;
-import org.eclipse.jface.text.TextViewerUndoManager;
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.handlers.IHandlerActivation;
-import org.eclipse.ui.handlers.IHandlerService;
-import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
-import org.eclipse.wst.jsdt.core.ITypeRoot;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint;
-import org.eclipse.wst.jsdt.debug.internal.core.Constants;
-import org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptDebugUIPlugin;
-import org.eclipse.wst.jsdt.debug.internal.ui.SWTFactory;
-import org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.BreakpointHelper;
-import org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.Messages;
-import org.eclipse.wst.jsdt.debug.internal.ui.display.JavaScriptDebugViewerConfiguration;
-import org.eclipse.wst.jsdt.debug.internal.ui.source.JavaScriptSourceViewer;
-import org.eclipse.wst.jsdt.debug.internal.ui.source.contentassist.JavaScriptContentAssistProcessor;
-import org.eclipse.wst.jsdt.debug.internal.ui.source.contentassist.ScriptContext;
-import org.eclipse.wst.jsdt.internal.ui.JavaScriptPlugin;
-import org.eclipse.wst.jsdt.ui.text.IJavaScriptPartitions;
-
-/**
- * Controls to edit a breakpoint's conditional expression, condition enabled state,
- * and suspend policy (suspend when condition is <code>true</code> or when the value of the
- * conditional expression changes).
- * 
- * @since 1.0
- */
-public final class JavaScriptBreakpointConditionEditor extends AbstractJavaScriptBreakpointEditor {
-	
-	private Button fConditional;
-	private Button fWhenTrue;
-	private Button fWhenChange;
-	private JavaScriptSourceViewer fViewer;
-	private IContentAssistProcessor fCompletionProcessor;
-	private IJavaScriptLineBreakpoint fBreakpoint;
-	private IHandlerService fHandlerService;
-	private IHandler fHandler;
-	private IHandlerActivation fActivation;
-    private IDocumentListener fDocumentListener;	
-    
-    /**
-     * Property id for breakpoint condition expression.
-     */
-    public static final int PROP_CONDITION = 0x1001;
-    
-    /**
-     * Property id for breakpoint condition enabled state.
-     */
-    public static final int PROP_CONDITION_ENABLED = 0x1002;
-    
-    /**
-     * Property id for breakpoint condition suspend policy.
-     */
-    public static final int PROP_CONDITION_SUSPEND_POLICY = 0x1003;
-	
-	/**
-	 * Sets the breakpoint to editor or <code>null</code> if none.
-	 * 
-	 * @param input breakpoint or <code>null</code>
-	 * @throws CoreException if unable to access breakpoint attributes
-	 */
-	public void setInput(Object input) throws CoreException {
-		if (input instanceof IJavaScriptLineBreakpoint) {
-			setBreakpoint((IJavaScriptLineBreakpoint)input);
-		} else {
-			setBreakpoint(null);
-		}
-	}
-	
-	/**
-	 * Sets the breakpoint to edit. Has no effect if the breakpoint responds
-	 * <code>false</code> to {@link IJavaScriptLineBreakpoint#supportsCondition()}.
-	 * The same editor can be used iteratively for different breakpoints.
-	 * 
-	 * @param breakpoint the breakpoint to edit or <code>null</code> if none
-	 * @exception CoreException if unable to access breakpoint attributes
-	 */
-	private void setBreakpoint(IJavaScriptLineBreakpoint breakpoint) throws CoreException {
-		fBreakpoint = breakpoint;
-		if (fDocumentListener != null) {
-			fViewer.getDocument().removeDocumentListener(fDocumentListener);
-			fDocumentListener = null;
-		}
-		fViewer.unconfigure();
-		IDocument document = new Document();
-		JavaScriptPlugin.getDefault().getJavaTextTools().setupJavaDocumentPartitioner(document, IJavaScriptPartitions.JAVA_PARTITIONING);
-		fViewer.setInput(document);
-		String condition = null;
-		boolean controlsEnabled = false;
-		boolean conditionEnabled = false;
-		boolean whenTrue = true;
-		ITypeRoot root = null;
-		if (breakpoint != null) {
-			controlsEnabled = true;
-			condition = breakpoint.getCondition();
-			conditionEnabled = breakpoint.isConditionEnabled();
-			whenTrue = breakpoint.isConditionSuspendOnTrue();
-			root = BreakpointHelper.getTypeRoot(breakpoint);
-		}
-		ScriptContext context = null;
-		int offset = -1;
-		if(root != null) {
-			String source = root.getSource();
-			if(source != null) {
-				int lineNumber = breakpoint.getMarker().getAttribute(IMarker.LINE_NUMBER, -1);
-				if (source != null && lineNumber != -1) {
-					try {
-						offset = new Document(source).getLineOffset(lineNumber - 1);
-					} 
-					catch (BadLocationException e) {
-						JavaScriptDebugUIPlugin.log(e);
-					}
-				}
-			}
-		}
-		context = new ScriptContext(root, offset);
-		fCompletionProcessor = new JavaScriptContentAssistProcessor(context);
-		fViewer.configure(new JavaScriptDebugViewerConfiguration() {
-			public IContentAssistProcessor getProcessor() {
-					return fCompletionProcessor;
-			}
-		});
-		document.set((condition == null ? Constants.EMPTY_STRING : condition));
-		fViewer.setUndoManager(new TextViewerUndoManager(10));
-		fViewer.getUndoManager().connect(fViewer);
-		fDocumentListener = new IDocumentListener() {
-            public void documentAboutToBeChanged(DocumentEvent event) {
-            }
-            public void documentChanged(DocumentEvent event) {
-            	setDirty(PROP_CONDITION);
-            }
-        };
-		fViewer.getDocument().addDocumentListener(fDocumentListener);
-		fConditional.setEnabled(controlsEnabled);
-		fConditional.setSelection(conditionEnabled);
-		fWhenTrue.setSelection(whenTrue);
-		fWhenChange.setSelection(!whenTrue);
-		setEnabled(conditionEnabled && breakpoint != null, false);
-		setDirty(false);
-	}
-	
-	/**
-	 * Creates the condition editor widgets and returns the top level
-	 * control.
-	 * 
-	 * @param parent composite to embed the editor controls in
-	 * @return top level control
-	 */
-	public Control createControl(Composite parent) {
-		Composite controls = SWTFactory.createComposite(parent, parent.getFont(), 2, 1, GridData.FILL_HORIZONTAL, 0, 0);
-		fConditional = SWTFactory.createCheckButton(controls, 
-				processMnemonics(Messages.conditional), 
-				null, 
-				false, 
-				1);
-		fConditional.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
-		fConditional.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				boolean checked = fConditional.getSelection();
-				setEnabled(checked, true);
-				setDirty(PROP_CONDITION_ENABLED);
-			}
-		});
-		Composite radios = SWTFactory.createComposite(controls, controls.getFont(), 2, 1, GridData.FILL_HORIZONTAL, 0, 0);
-		fWhenTrue = SWTFactory.createRadioButton(radios, processMnemonics(Messages.suspend_when_true));
-		fWhenTrue.setLayoutData(new GridData());
-		fWhenChange = SWTFactory.createRadioButton(radios, processMnemonics(Messages.suspend_when_changed));
-		fWhenChange.setLayoutData(new GridData());
-		fWhenTrue.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				setDirty(PROP_CONDITION_SUSPEND_POLICY);
-			}
-		});
-		fWhenChange.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				setDirty(PROP_CONDITION_SUSPEND_POLICY);
-			}
-		});
-				
-		fViewer = new JavaScriptSourceViewer(parent, null, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.LEFT_TO_RIGHT);
-		fViewer.setEditable(false);
-		ControlDecoration decoration = new ControlDecoration(fViewer.getControl(), SWT.TOP | SWT.LEFT);
-		decoration.setShowOnlyOnFocus(true);
-		FieldDecoration dec = FieldDecorationRegistry.getDefault().getFieldDecoration(FieldDecorationRegistry.DEC_CONTENT_PROPOSAL);
-		decoration.setImage(dec.getImage());
-		decoration.setDescriptionText(dec.getDescription());
-		GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
-		// set height/width hints based on font
-		GC gc = new GC(fViewer.getTextWidget());
-		gc.setFont(fViewer.getTextWidget().getFont());
-		FontMetrics fontMetrics = gc.getFontMetrics();
-		//gd.heightHint = Dialog.convertHeightInCharsToPixels(fontMetrics, 10);
-		gd.widthHint = Dialog.convertWidthInCharsToPixels(fontMetrics, 40);
-		gc.dispose();
-		fViewer.getControl().setLayoutData(gd);
-		fHandler = new AbstractHandler() {
-			public Object execute(ExecutionEvent event) throws org.eclipse.core.commands.ExecutionException {
-				fViewer.doOperation(ISourceViewer.CONTENTASSIST_PROPOSALS);
-				return null;
-			}
-		};
-		fHandlerService = (IHandlerService) PlatformUI.getWorkbench().getAdapter(IHandlerService.class);
-		fViewer.getControl().addFocusListener(new FocusAdapter() {
-			public void focusGained(FocusEvent e) {
-				activateContentAssist();
-			}
-			public void focusLost(FocusEvent e) {
-				deactivateContentAssist();
-			}				
-		});
-		parent.addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				dispose();
-			}
-		});
-		return parent;
-	}
-	
-	/**
-	 * Disposes this editor and its controls. Once disposed, the editor can no
-	 * longer be used.
-	 */
-	protected void dispose() {
-		super.dispose();
-		deactivateContentAssist();
-		if (fDocumentListener != null) {
-			fViewer.getDocument().removeDocumentListener(fDocumentListener);
-		}
-		fViewer.dispose();
-	}
-	
-	/**
-	 * Gives focus to an appropriate control in the editor.
-	 */
-	public void setFocus() {
-		fViewer.getControl().setFocus();
-	}
-	
-	/**
-	 * Saves current settings to the breakpoint being edited. Has no
-	 * effect if a breakpoint is not currently being edited or if this
-	 * editor is not dirty.
-	 * 
-	 * @exception CoreException if unable to update the breakpoint.
-	 */
-	public void doSave() throws CoreException {
-		if (fBreakpoint != null && isDirty()) {
-			fBreakpoint.setCondition(fViewer.getDocument().get().trim());
-			fBreakpoint.setConditionEnabled(fConditional.getSelection());
-			fBreakpoint.setConditionSuspendOnTrue(fWhenTrue.getSelection());
-			setDirty(false);
-		}
-	}
-	
-	/**
-	 * Returns a status describing whether the condition editor is in
-	 * a valid state. Returns an OK status when all is good. For example, an error
-	 * status is returned when the conditional expression is empty but enabled.
-	 * 
-	 * @return editor status.
-	 */
-	public IStatus getStatus() {
-		if (fBreakpoint != null) {
-			if (fConditional.getSelection()) {
-				if (fViewer.getDocument().get().trim().length() == 0) {
-					return new Status(IStatus.ERROR, JavaScriptDebugUIPlugin.PLUGIN_ID,  Messages.enter_condition);
-				}
-			}
-		}
-		return Status.OK_STATUS;
-	}
-	
-	private void activateContentAssist() {
-		fActivation = fHandlerService.activateHandler(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS, fHandler);
-	}
-
-	private void deactivateContentAssist() {
-		if(fActivation != null) {
-			fHandlerService.deactivateHandler(fActivation);
-			fActivation = null;
-		}
-	}	
-	
-	/**
-	 * Enables controls based on whether the breakpoint's condition is enabled.
-	 * 
-	 * @param enabled whether to enable
-	 */
-	private void setEnabled(boolean enabled, boolean focus) {
-	    fViewer.setEditable(enabled);
-	    fViewer.getTextWidget().setEnabled(enabled);
-	    fWhenChange.setEnabled(enabled);
-	    fWhenTrue.setEnabled(enabled);
-		if (enabled) {
-			fViewer.updateViewerColors();
-			if (focus) {
-				setFocus();
-			}
-		} else {
-			Color color = fViewer.getControl().getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);
-			fViewer.getTextWidget().setBackground(color);	
-		}
-	}
-
-	/**
-	 * Returns the breakpoint being edited or <code>null</code> if none.
-	 * 
-	 * @return breakpoint or <code>null</code>
-	 */
-	public Object getInput() {
-		return fBreakpoint;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/editors/StandardJavaScriptBreakpointEditor.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/editors/StandardJavaScriptBreakpointEditor.java
deleted file mode 100644
index a87307b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/editors/StandardJavaScriptBreakpointEditor.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.editors;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint;
-import org.eclipse.wst.jsdt.debug.internal.core.Constants;
-import org.eclipse.wst.jsdt.debug.internal.ui.IHelpContextIds;
-import org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptDebugUIPlugin;
-import org.eclipse.wst.jsdt.debug.internal.ui.SWTFactory;
-import org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.Messages;
-
-/**
- * Standard breakpoint editor that includes suspend policy and hit count options
- * 
- * @since 1.0
- */
-public class StandardJavaScriptBreakpointEditor extends AbstractJavaScriptBreakpointEditor {
-	
-	private IJavaScriptBreakpoint fBreakpoint;
-	private Button fHitCountButton;
-	private Text fHitCountText;
-	private Button fSuspendThread;
-	private Button fSuspendTarget;
-	
-	/**
-     * Property id for hit count enabled state.
-     */
-    public static final int PROP_HIT_COUNT_ENABLED = 0x1005;
-    
-	/**
-     * Property id for breakpoint hit count.
-     */
-    public static final int PROP_HIT_COUNT = 0x1006;  
-    
-	/**
-     * Property id for suspend policy.
-     */
-    public static final int PROP_SUSPEND_POLICY = 0x1007;
-    
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.AbstractJavaScriptBreakpointEditor#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public Control createControl(Composite parent) {
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, IHelpContextIds.STANDARD_BREAKPOINT_EDITOR);
-		return createStandardControls(parent);
-	}
-	
-	/**
-	 * @param parent
-	 * @return
-	 */
-	protected Control createStandardControls(Composite parent) {
-		Composite composite = SWTFactory.createComposite(parent, parent.getFont(), 4, 1, 0, 0, 0);
-		fHitCountButton = SWTFactory.createCheckButton(composite, processMnemonics(Messages.hit_count), null, false, 1);
-		fHitCountButton.setLayoutData(new GridData());
-		fHitCountButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				boolean enabled = fHitCountButton.getSelection();
-				fHitCountText.setEnabled(enabled);
-				if(enabled) {
-					fHitCountText.setFocus();
-				}
-				setDirty(PROP_HIT_COUNT_ENABLED);
-			}
-		});
-		fHitCountText = SWTFactory.createSingleText(composite, 1);
-		GridData gd = (GridData) fHitCountText.getLayoutData();
-		gd.minimumWidth = 50;
-		fHitCountText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				setDirty(PROP_HIT_COUNT);
-			}
-		});
-		SWTFactory.createLabel(composite, "", 1); // spacer //$NON-NLS-1$
-		Composite radios = SWTFactory.createComposite(composite, composite.getFont(), 2, 1, GridData.FILL_HORIZONTAL, 0, 0);
-		fSuspendThread = SWTFactory.createRadioButton(radios, processMnemonics(Messages.suspend_thread));
-		fSuspendThread.setLayoutData(new GridData());
-		fSuspendTarget = SWTFactory.createRadioButton(radios, processMnemonics(Messages.suspend_target));
-		fSuspendTarget.setLayoutData(new GridData());
-		fSuspendThread.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				setDirty(PROP_SUSPEND_POLICY);
-			}
-		});	
-		fSuspendTarget.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				setDirty(PROP_SUSPEND_POLICY);
-			}
-		});
-		composite.addDisposeListener(new DisposeListener() {
-			public void widgetDisposed(DisposeEvent e) {
-				dispose();
-			}
-		});
-		return composite;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.internal.debug.ui.breakpoints.AbstractJavaBreakpointEditor#setInput(java.lang.Object)
-	 */
-	public void setInput(Object breakpoint) throws CoreException {
-		if (breakpoint instanceof IJavaScriptBreakpoint) {
-			setBreakpoint((IJavaScriptBreakpoint) breakpoint);
-		} else {
-			setBreakpoint(null);
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.internal.debug.ui.breakpoints.AbstractJavaBreakpointEditor#getInput()
-	 */
-	public Object getInput() {
-		return fBreakpoint;
-	}
-	
-	/**
-	 * Sets the breakpoint to edit. The same editor can be used iteratively for different breakpoints.
-	 * 
-	 * @param breakpoint the breakpoint to edit or <code>null</code> if none
-	 * @exception CoreException if unable to access breakpoint attributes
-	 */
-	protected void setBreakpoint(IJavaScriptBreakpoint breakpoint) throws CoreException {
-		fBreakpoint = breakpoint;
-		boolean enabled = false;
-		boolean hasHitCount = false;
-		String text = Constants.EMPTY_STRING;
-		boolean suspendThread = true;
-		if (breakpoint != null) {
-			enabled = true;
-			int hitCount = breakpoint.getHitCount();
-			if (hitCount > 0) {
-				text = new Integer(hitCount).toString();
-				hasHitCount = true;
-			}
-			suspendThread= breakpoint.getSuspendPolicy() == IJavaScriptBreakpoint.SUSPEND_THREAD;
-		}
-		fHitCountButton.setEnabled(enabled);
-		fHitCountButton.setSelection(enabled & hasHitCount);
-		fHitCountText.setEnabled(hasHitCount);
-		fHitCountText.setText(text);
-		fSuspendThread.setEnabled(enabled);
-		fSuspendTarget.setEnabled(enabled);
-		fSuspendThread.setSelection(suspendThread);
-		fSuspendTarget.setSelection(!suspendThread);
-		setDirty(false);
-	}
-	
-	/**
-	 * Returns the current breakpoint being edited or <code>null</code> if none.
-	 * 
-	 * @return breakpoint or <code>null</code>
-	 */
-	protected IJavaScriptBreakpoint getBreakpoint() { 
-		return fBreakpoint;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.internal.debug.ui.breakpoints.AbstractJavaBreakpointEditor#setFocus()
-	 */
-	public void setFocus() {
-		// do nothing
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.internal.debug.ui.breakpoints.AbstractJavaBreakpointEditor#doSave()
-	 */
-	public void doSave() throws CoreException {
-		if (fBreakpoint != null) {
-			int suspendPolicy = IJavaScriptBreakpoint.SUSPEND_THREAD;
-			if(fSuspendTarget.getSelection()) {
-				suspendPolicy = IJavaScriptBreakpoint.SUSPEND_TARGET;
-			}
-			fBreakpoint.setSuspendPolicy(suspendPolicy);
-			int hitCount = -1;
-			if (fHitCountButton.getSelection()) {
-				try {
-					hitCount = Integer.parseInt(fHitCountText.getText());
-				} 
-				catch (NumberFormatException e) {
-					throw new CoreException(new Status(
-							IStatus.ERROR,
-							JavaScriptDebugUIPlugin.PLUGIN_ID,
-							IStatus.ERROR,
-							Messages.hit_count_must_be_positive,
-							e));
-				}
-			}
-			fBreakpoint.setHitCount(hitCount);
-		}
-		setDirty(false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.internal.debug.ui.breakpoints.AbstractJavaBreakpointEditor#getStatus()
-	 */
-	public IStatus getStatus() {
-		if (fHitCountButton.getSelection()) {
-			String hitCountText = fHitCountText.getText();
-			int hitCount = -1;
-			try {
-				hitCount = Integer.parseInt(hitCountText);
-			} catch (NumberFormatException e1) {
-				return new Status(IStatus.ERROR, JavaScriptDebugUIPlugin.PLUGIN_ID, IStatus.ERROR, Messages.hit_count_must_be_positive, null);
-			}
-			if (hitCount < 1) {
-				return new Status(IStatus.ERROR, JavaScriptDebugUIPlugin.PLUGIN_ID, IStatus.ERROR, Messages.hit_count_must_be_positive, null);
-			}
-		}
-		return Status.OK_STATUS;
-	}
-
-	/**
-	 * Creates and returns a check box button with the given text.
-	 * 
-	 * @param parent parent composite
-	 * @param text label
-	 * @param propId property id to fire on modification
-	 * @return check box
-	 */
-	protected Button createSusupendPropertyEditor(Composite parent, String text, final int propId) {
-		Button button = new Button(parent, SWT.CHECK);
-		button.setFont(parent.getFont());
-		button.setText(text);
-		GridData gd = new GridData(SWT.BEGINNING);
-		button.setLayoutData(gd);
-		button.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				setDirty(propId);
-			}
-		});
-		return button;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/messages.properties b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/messages.properties
deleted file mode 100644
index 405039e..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/messages.properties
+++ /dev/null
@@ -1,46 +0,0 @@
-###############################################################################
-# Copyright (c) 2010, 2011 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-breakpoint_condition=Breakpoint Condition
-breakpoint_properties=Breakpoint &Properties
-breakpoint_settings=Breakpoint Settings
-conditional=Co&nditional
-disable_breakpoint=Disable B&reakpoint
-enable_breakpoint=Enable B&reakpoint
-enabled=&Enabled
-enter_condition=Enter a condition
-entry=E&ntry
-exit=E&xit
-failed_function_bp_no_element=Failed to create Javascript function breakpoint - the JavaScript element could not be computed
-failed_function_bp_no_resource=Failed to create Javascript function breakpoint - the resource could no be computed for {0}
-failed_line_bp_no_element=Failed to create Javascript line breakpoint - the JavaScript element could not be computed
-failed_line_bp_no_resource=Failed to create Javascript line breakpoint - the resource could no be computed for {0}
-failed_to_create_function_bp=Failed to create Javascript function breakpoint
-failed_to_create_line_bp=Failed to create Javascript line breakpoint
-fuction=F&unction
-function_breakpoint=Function Breakpoint
-function_breakpoint_settings=Function Breakpoint Settings
-hit_count=&Hit Count:
-hit_count_must_be_positive=Hit count must be a positive integer
-line_breakpoint=Line Breakpoint
-line_breakpoint_settings=Line Breakpoint Settings
-line_number=&Line Number:
-member=&Member:
-no_editor_could_be_found=No editor could be found for the associated part
-no_valid_location=A valid location could not be found for the breakpoint
-script_load_bp=Script Load Breakpoint
-script_load_breakpoint=Script Load Breakpoint
-script_path=&Script Path:
-suspend_thread=Suspend &Thread
-suspend_target=Suspend Ta&rget
-suspend_when_changed=Suspend &when value changes
-suspend_when_true=Suspend when 'tr&ue'
-type_name=&Type Name:
-type_root_could_not_be_computed=The type root could not be computed for the editor
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/dialogs/ScriptSelectionDialog.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/dialogs/ScriptSelectionDialog.java
deleted file mode 100644
index 44cfaa2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/dialogs/ScriptSelectionDialog.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.dialogs;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.dialogs.FilteredResourcesSelectionDialog;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.wst.jsdt.core.JavaScriptCore;
-import org.eclipse.wst.jsdt.debug.internal.ui.Messages;
-
-/**
- * Customized {@link FilteredResourcesSelectionDialog} for selecting 
- * JavaScript script files
- * 
- * @since 1.0
- */
-public class ScriptSelectionDialog extends FilteredResourcesSelectionDialog {
-
-	/**
-	 * Default extension
-	 */
-	public static final String JS_EXTENSION_PATTERN = "*.js"; //$NON-NLS-1$
-
-	class ScriptFilter extends ResourceFilter {
-		/* (non-Javadoc)
-		 * @see org.eclipse.ui.dialogs.FilteredResourcesSelectionDialog.ResourceFilter#matchItem(java.lang.Object)
-		 */
-		public boolean matchItem(Object item) {
-			return super.matchItem(item) && isJavaScriptContent((IFile) item);
-		}
-		
-		boolean isJavaScriptContent(IFile file) {
-			IContentType filetype = IDE.getContentType(file);
-			if(filetype == null) {
-				return false;
-			}
-    		IContentType scripttype = Platform.getContentTypeManager().getContentType(JavaScriptCore.JAVA_SOURCE_CONTENT_TYPE);
-    		return filetype.equals(scripttype);
-		}
-	}
-	
-	/**
-	 * Constructor
-	 * @param shell
-	 * @param multi
-	 * @param container
-	 */
-	public ScriptSelectionDialog(Shell shell, boolean multi, IContainer container) {
-		super(shell, multi, container, IResource.FILE);
-		setInitialPattern(JS_EXTENSION_PATTERN);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.dialogs.SelectionDialog#getMessage()
-	 */
-	protected String getMessage() {
-		return Messages.select_javascript_file;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.dialogs.FilteredResourcesSelectionDialog#createFilter()
-	 */
-	protected ItemsFilter createFilter() {
-		return new ScriptFilter();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/display/JavaScriptDebugViewerConfiguration.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/display/JavaScriptDebugViewerConfiguration.java
deleted file mode 100644
index f04a81f..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/display/JavaScriptDebugViewerConfiguration.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.display;
-
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.ITextDoubleClickStrategy;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jface.text.contentassist.ContentAssistant;
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.jface.text.contentassist.IContentAssistant;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.ui.editors.text.EditorsUI;
-import org.eclipse.ui.texteditor.ChainedPreferenceStore;
-import org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptDebugUIPlugin;
-import org.eclipse.wst.jsdt.internal.ui.JavaScriptPlugin;
-import org.eclipse.wst.jsdt.ui.PreferenceConstants;
-import org.eclipse.wst.jsdt.ui.text.JavaScriptSourceViewerConfiguration;
-
-/**
- *  The source viewer configuration for snippets.
- *  
- *  @since 1.0
- */
-public class JavaScriptDebugViewerConfiguration extends JavaScriptSourceViewerConfiguration {
-		
-	public JavaScriptDebugViewerConfiguration() {
-		super(JavaScriptPlugin.getDefault().getJavaTextTools().getColorManager(), 
-				new ChainedPreferenceStore(new IPreferenceStore[] {
-						PreferenceConstants.getPreferenceStore(),
-						EditorsUI.getPreferenceStore()}),
-				null, null);
-	}
-	
-	/**
-	 * Returns the preference store this source viewer configuration is associated with.
-	 * 
-	 * @return the preference store
-	 */
-	public IPreferenceStore getTextPreferenceStore() {
-		return fPreferenceStore;
-	}
-	
-	/**
-	 * @return the {@link IContentAssistProcessor} to use
-	 */
-	public IContentAssistProcessor getProcessor() {
-		return null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.source.SourceViewerConfiguration#getContentAssistant(org.eclipse.jface.text.source.ISourceViewer)
-	 */
-	public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {
-		ContentAssistant assistant = new ContentAssistant();
-		assistant.setContentAssistProcessor(getProcessor(),	IDocument.DEFAULT_CONTENT_TYPE);
-		assistant.setContextInformationPopupOrientation(IContentAssistant.CONTEXT_INFO_ABOVE);
-		assistant.setInformationControlCreator(getInformationControlCreator(sourceViewer));
-		return assistant;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.source.SourceViewerConfiguration#getDoubleClickStrategy(org.eclipse.jface.text.source.ISourceViewer, java.lang.String)
-	 */
-	public ITextDoubleClickStrategy getDoubleClickStrategy(ISourceViewer sourceViewer, String contentType) {
-		ITextDoubleClickStrategy clickStrat = new ITextDoubleClickStrategy() {
-			// Highlight the whole line when double clicked. See Bug#45481 
-			public void doubleClicked(ITextViewer viewer) {
-				try {
-					IDocument doc = viewer.getDocument();
-					int caretOffset = viewer.getSelectedRange().x;
-					int lineNum = doc.getLineOfOffset(caretOffset);
-					int start = doc.getLineOffset(lineNum);
-					int length = doc.getLineLength(lineNum);
-					viewer.setSelectedRange(start, length);
-				} catch (BadLocationException e) {
-					JavaScriptDebugUIPlugin.log(e);
-				}
-			}
-		};
-		return clickStrat;
-	}	
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/EvaluationManager.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/EvaluationManager.java
deleted file mode 100644
index 48aad62..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/EvaluationManager.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.eval;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.debug.ui.contexts.DebugContextEvent;
-import org.eclipse.debug.ui.contexts.IDebugContextListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IWindowListener;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptStackFrame;
-import org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptDebugUIPlugin;
-
-/**
- * Manager to handle contexts for evaluations
- * 
- * @since 1.0
- */
-public class EvaluationManager implements IDebugContextListener, IWindowListener {
-
-	/**
-	 * System property used to know if the debugger is active or not
-	 */
-	public static final String DEBUGGER_ACTIVE = JavaScriptDebugUIPlugin.PLUGIN_ID + ".jsdebuggerActive"; //$NON-NLS-1$
-	
-	private static EvaluationManager instance = null;
-	
-	private IWorkbenchWindow activewindow = null;
-	private HashMap contextmap = null;
-	
-	/**
-	 * Constructor
-	 */
-	private EvaluationManager() {
-		//no instantiation
-		DebugUITools.getDebugContextManager().addDebugContextListener(this);
-	}
-	
-	/**
-	 * Returns the singleton instance
-	 * 
-	 * @return the instance
-	 */
-	public static synchronized EvaluationManager getManager() {
-		if(instance == null) {
-			instance = new EvaluationManager();
-		}
-		return instance;
-	}
-	
-	/**
-	 * Start the manager
-	 */
-	public void start() {
-		IWorkbench workbench = PlatformUI.getWorkbench();
-		IWorkbenchWindow[] windows = workbench.getWorkbenchWindows();
-		for (int i = 0; i < windows.length; i++) {
-			instance.windowOpened(windows[i]);	
-		}
-		workbench.addWindowListener(this);
-		instance.activewindow = workbench.getActiveWorkbenchWindow();
-	}
-	
-	/**
-	 * Stop the manager and un-hook it as listeners
-	 */
-	public void stop() {
-		DebugUITools.getDebugContextManager().removeDebugContextListener(this);
-		PlatformUI.getWorkbench().removeWindowListener(this);
-	}
-	
-	/**
-	 * Returns the evaluation context for the given window, or <code>null</code> if none.
-	 * The evaluation context corresponds to the selected stack frame in the following
-	 * priority order:<ol>
-	 * <li>stack frame in active page of the window</li>
-	 * <li>stack frame in another page of the window</li>
-	 * <li>stack frame in active page of another window</li>
-	 * <li>stack frame in a page of another window</li>
-	 * </ol>
-	 * 
-	 * @param window the window that the evaluation action was invoked from, or
-	 *  <code>null</code> if the current window should be consulted
-	 * @return the stack frame that supplies an evaluation context, or <code>null</code>
-	 *   if none
-	 * @return IJavaStackFrame
-	 */
-	public IJavaScriptStackFrame getEvaluationContext(IWorkbenchWindow window) {
-		List otherwindows = new ArrayList();
-		if (window == null) {
-			return getEvaluationContext(activewindow, otherwindows);
-		}
-		return getEvaluationContext(window, otherwindows);
-	}
-	
-	/**
-	 * Returns the evaluation context for the given part, or <code>null</code> if none.
-	 * The evaluation context corresponds to the selected stack frame in the following
-	 * priority order:<ol>
-	 * <li>stack frame in the same page</li>
-	 * <li>stack frame in the same window</li>
-	 * <li>stack frame in active page of other window</li>
-	 * <li>stack frame in page of other windows</li>
-	 * </ol>
-	 * 
-	 * @param part the part that the evaluation action was invoked from
-	 * @return the stack frame that supplies an evaluation context, or <code>null</code>
-	 *   if none
-	 */
-	public IJavaScriptStackFrame getEvaluationContext(IWorkbenchPart part) {
-		IWorkbenchPage page = part.getSite().getPage();
-		IJavaScriptStackFrame frame = getContext(page);
-		if (frame == null) {
-			return getEvaluationContext(page.getWorkbenchWindow());
-		}
-		return frame;
-	}
-	
-	/**
-	 * Looks up the current evaluation context for the given window. Tries all workbench windows
-	 * if the active window does not have a context
-	 * 
-	 * @param window the window to look in
-	 * @param otherwindows a listing of all other windows to try if the given window does not have a context
-	 * @return the evaluation context or <code>null</code>
-	 */
-	IJavaScriptStackFrame getEvaluationContext(IWorkbenchWindow window, List otherwindows) {
-		IWorkbenchPage activePage = window.getActivePage();
-		IJavaScriptStackFrame frame = null;
-		if (activePage != null) {
-			frame = getContext(activePage);
-		}
-		if (frame == null) {
-			IWorkbenchPage[] pages = window.getPages();
-			for (int i = 0; i < pages.length; i++) {
-				if (activePage != pages[i]) {
-					frame = getContext(pages[i]);
-					if (frame != null) {
-						return frame;
-					}
-				}
-			}
-			otherwindows.add(window);
-			IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
-			for (int i = 0; i < windows.length; i++) {
-				if (!otherwindows.contains(windows[i])) {
-					frame = getEvaluationContext(windows[i], otherwindows);
-					if (frame != null) {
-						return frame;
-					}
-				}
-			}
-			return null;
-		}
-		return frame;
-	}
-	
-	/**
-	 * Looks up a context for the given page. Returns <code>null</code> if no mapping is found
-	 * or if the context map has not been initialized
-	 * 
-	 * @param page the page to look up a context for
-	 * 
-	 * @return the {@link IJavaScriptStackFrame} context for the given page or <code>null</code>
-	 */
-	IJavaScriptStackFrame getContext(IWorkbenchPage page) {
-		if (contextmap != null) {
-			return (IJavaScriptStackFrame)contextmap.get(page);
-		}
-		return null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.contexts.IDebugContextListener#debugContextChanged(org.eclipse.debug.ui.contexts.DebugContextEvent)
-	 */
-	public void debugContextChanged(DebugContextEvent event) {
-		if ((event.getFlags() & DebugContextEvent.ACTIVATED) > 0) {
-			IWorkbenchPart part = event.getDebugContextProvider().getPart();
-			if (part != null) {
-				IWorkbenchPage page = part.getSite().getPage();
-				ISelection selection = event.getContext();
-				if (selection instanceof IStructuredSelection) {
-					IStructuredSelection ss = (IStructuredSelection)selection;
-					if (ss.size() == 1) {
-						Object element = ss.getFirstElement();
-						if (element instanceof IAdaptable) {
-							IJavaScriptStackFrame frame = (IJavaScriptStackFrame)((IAdaptable)element).getAdapter(IJavaScriptStackFrame.class);
-							if (frame != null) {
-								setContext(page, frame);
-								return;
-							}
-						}
-					}
-				}
-				// no context in the given view
-				removeContext(page);
-			}
-		}
-	}
-
-	/**
-	 * Sets the evaluation context for the given page, and notes that
-	 * a valid execution context exists.
-	 * 
-	 * @param page
-	 * @param frame
-	 */
-	private synchronized void setContext(IWorkbenchPage page, IJavaScriptStackFrame frame) {
-		if (contextmap == null) {
-			contextmap = new HashMap();
-		}
-		contextmap.put(page, frame);
-		System.setProperty(DEBUGGER_ACTIVE, "true"); //$NON-NLS-1$
-	}
-	
-	/**
-	 * Removes an evaluation context for the given page, and determines if
-	 * any valid execution context remain.
-	 * 
-	 * @param page
-	 */
-	private void removeContext(IWorkbenchPage page) {
-		if (contextmap != null) {
-			contextmap.remove(page);
-			if (contextmap.isEmpty()) {
-				System.setProperty(DEBUGGER_ACTIVE, "false"); //$NON-NLS-1$
-			}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWindowListener#windowActivated(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void windowActivated(IWorkbenchWindow window) {
-		activewindow = window;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWindowListener#windowDeactivated(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void windowDeactivated(IWorkbenchWindow window) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWindowListener#windowClosed(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void windowClosed(IWorkbenchWindow window) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWindowListener#windowOpened(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void windowOpened(IWorkbenchWindow window) {
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/ExpressionInformationControlCreator.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/ExpressionInformationControlCreator.java
deleted file mode 100644
index 20b4980..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/ExpressionInformationControlCreator.java
+++ /dev/null
@@ -1,441 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.eval;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.model.IVariable;
-import org.eclipse.debug.internal.ui.SWTFactory;
-import org.eclipse.debug.internal.ui.model.elements.ElementContentProvider;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdateListener;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.PresentationContext;
-import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer;
-import org.eclipse.debug.internal.ui.views.variables.details.DefaultDetailPane;
-import org.eclipse.debug.internal.ui.views.variables.details.DetailPaneProxy;
-import org.eclipse.debug.internal.ui.views.variables.details.IDetailPaneContainer;
-import org.eclipse.debug.ui.AbstractDebugView;
-import org.eclipse.debug.ui.IDebugUIConstants;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.text.AbstractInformationControl;
-import org.eclipse.jface.text.IInformationControl;
-import org.eclipse.jface.text.IInformationControlCreator;
-import org.eclipse.jface.text.IInformationControlExtension2;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.TreeSelection;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptDebugUIPlugin;
-
-/**
- * Creates an information control to display an expression in a hover control.
- * 
- * @since 1.1
- */
-public class ExpressionInformationControlCreator implements IInformationControlCreator {
-
-	class ExpressionInformationControl extends AbstractInformationControl implements IInformationControlExtension2 {
-
-		/**
-		 * Dialog setting key for height
-		 */
-		private static final String HEIGHT = "HEIGHT"; //$NON-NLS-1$
-
-		/**
-		 * Dialog setting key for width. 
-		 */
-		private static final String WIDTH = "WIDTH"; //$NON-NLS-1$
-
-		/**
-		 * Dialog setting key for tree sash weight
-		 */
-		private static final String SASH_WEIGHT_TREE = "SashWeightTree"; //$NON-NLS-1$
-		
-		/**
-		 * Dialog setting key for details sash weight
-		 */
-		private static final String SASH_WEIGHT_DETAILS = "SashWeightDetails"; //$NON-NLS-1$		
-		
-		/**
-		 * Variable to display.
-		 */
-		private IVariable fVariable;
-		
-		private IPresentationContext fContext;
-	    private TreeModelViewer fViewer;
-	    private SashForm fSashForm;
-	    private Composite fDetailPaneComposite;
-	    private DetailPaneProxy fDetailPane;
-	    private Tree fTree;
-		    
-		/**
-	     * Creates the content for the root element of the tree viewer in the hover
-	     */
-	    private class TreeRoot extends ElementContentProvider {
-			/* (non-Javadoc)
-			 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.elements.ElementContentProvider#getChildCount(java.lang.Object, org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext)
-			 */
-			protected int getChildCount(Object element, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-				return 1;
-			}
-			/* (non-Javadoc)
-			 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.elements.ElementContentProvider#getChildren(java.lang.Object, int, int, org.eclipse.debug.internal.ui.viewers.provisional.IPresentationContext)
-			 */
-			protected Object[] getChildren(Object parent, int index, int length, IPresentationContext context, IViewerUpdate monitor) throws CoreException {
-				return new Object[] { fVariable };
-			}
-			
-			/* (non-Javadoc)
-			 * @see org.eclipse.debug.internal.ui.viewers.model.provisional.elements.ElementContentProvider#supportsContextId(java.lang.String)
-			 */
-			protected boolean supportsContextId(String id) {
-				return true;
-			}
-	    }
-	    
-		/**
-		 * Inner class implementing IDetailPaneContainer methods.  Handles changes to detail
-		 * pane and provides limited access to the detail pane proxy.
-		 */
-		private class DetailPaneContainer implements IDetailPaneContainer{
-		
-			/* (non-Javadoc)
-			 * @see org.eclipse.debug.internal.ui.views.variables.details.IDetailPaneContainer#getCurrentPaneID()
-			 */
-			public String getCurrentPaneID() {
-				return fDetailPane.getCurrentPaneID();
-			}
-		
-			/* (non-Javadoc)
-			 * @see org.eclipse.debug.internal.ui.views.variables.details.IDetailPaneContainer#getCurrentSelection()
-			 */
-			public IStructuredSelection getCurrentSelection() {
-				return (IStructuredSelection)fViewer.getSelection();
-			}
-		
-			/* (non-Javadoc)
-			 * @see org.eclipse.debug.internal.ui.views.variables.details.IDetailPaneContainer#refreshDetailPaneContents()
-			 */
-			public void refreshDetailPaneContents() {		
-				fDetailPane.display(getCurrentSelection());
-			}
-		
-			/* (non-Javadoc)
-			 * @see org.eclipse.debug.internal.ui.views.variables.details.IDetailPaneContainer#getParentComposite()
-			 */
-			public Composite getParentComposite() {
-				return fDetailPaneComposite;
-			}
-		
-			/* (non-Javadoc)
-			 * @see org.eclipse.debug.internal.ui.views.variables.details.IDetailPaneContainer#getWorkbenchPartSite()
-			 */
-			public IWorkbenchPartSite getWorkbenchPartSite() {
-				return null;
-			}
-		
-			/* (non-Javadoc)
-			 * @see org.eclipse.debug.internal.ui.views.variables.details.IDetailPaneContainer#paneChanged(java.lang.String)
-			 */
-			public void paneChanged(String newPaneID) {
-				if (newPaneID.equals(DefaultDetailPane.ID)){
-					fDetailPane.getCurrentControl().setBackground(getShell().getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
-				}
-			}
-		
-		}	    
-
-		/**
-		 * Constructs a new control in the given shell.
-		 * 
-		 * @param parentShell shell
-		 * @param resize whether resize is supported
-		 */
-		ExpressionInformationControl(Shell parentShell, boolean resize) {
-			super(parentShell, resize);
-			create();
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.text.AbstractInformationControl#computeSizeHint()
-		 */
-		public Point computeSizeHint() {
-			IDialogSettings settings = getDialogSettings(false);
-			if (settings != null) {
-				int x = getIntSetting(settings, WIDTH);
-				if (x > 0) {
-					int y = getIntSetting(settings, HEIGHT);
-					if (y > 0) {
-						return new Point(x,y);
-					}
-				}
-			}
-			return super.computeSizeHint();
-		}
-
-		/**
-		 * Returns the dialog settings for this hover or <code>null</code> if none
-		 * 
-		 * @param create whether to create the settings
-		 */
-		private IDialogSettings getDialogSettings(boolean create) {
-			IDialogSettings settings = JavaScriptDebugUIPlugin.getDefault().getDialogSettings();
-			IDialogSettings section = settings.getSection(this.getClass().getName());
-			if (section == null & create) {
-				section = settings.addNewSection(this.getClass().getName());
-			}
-			return section;
-		}
-		
-		/**
-		 * Returns an integer value in the given dialog settings or -1 if none.
-		 * 
-		 * @param settings dialog settings
-		 * @param key key
-		 * @return value or -1 if not present
-		 */
-		private int getIntSetting(IDialogSettings settings, String key) {
-			try {
-				return settings.getInt(key);
-			} catch (NumberFormatException e) {
-				return -1;
-			}
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.text.AbstractInformationControl#dispose()
-		 */
-		public void dispose() {
-			persistSettings(getShell());
-            fContext.dispose();
-			super.dispose();
-		}
-
-		/**
-		 * Persists dialog settings.
-		 * 
-		 * @param shell
-		 */
-		private void persistSettings(Shell shell) {
-			if (shell != null && !shell.isDisposed()) {
-				if (isResizable()) {
-					IDialogSettings settings = getDialogSettings(true);
-					Point size = shell.getSize();
-					settings.put(WIDTH, size.x);
-					settings.put(HEIGHT, size.y);
-					int[] weights = fSashForm.getWeights();
-					settings.put(SASH_WEIGHT_TREE, weights[0]);
-					settings.put(SASH_WEIGHT_DETAILS, weights[1]);
-				}
-			}
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.text.AbstractInformationControl#setVisible(boolean)
-		 */
-		public void setVisible(boolean visible) {
-			if (!visible) {		
-				persistSettings(getShell());
-			}
-			super.setVisible(visible);
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.text.AbstractInformationControl#createContent(org.eclipse.swt.widgets.Composite)
-		 */
-		protected void createContent(Composite parent) {
-
-	        fSashForm = new SashForm(parent, parent.getStyle());
-	        fSashForm.setOrientation(SWT.VERTICAL);
-
-		    // update presentation context
-	        AbstractDebugView view = getViewToEmulate();
-	        fContext = new PresentationContext(IDebugUIConstants.ID_VARIABLE_VIEW);
-	        if (view != null) {
-	        	// copy over properties
-	        	IPresentationContext copy = ((TreeModelViewer)view.getViewer()).getPresentationContext();
-	        	String[] properties = copy.getProperties();
-	        	for (int i = 0; i < properties.length; i++) {
-					String key = properties[i];
-					fContext.setProperty(key, copy.getProperty(key));
-				}
-	        }
-	       
-	        fViewer = new TreeModelViewer(fSashForm, SWT.NO_TRIM | SWT.MULTI | SWT.VIRTUAL, fContext);
-	        fViewer.setAutoExpandLevel(1);
-	        
-	        if (view != null) {
-	        	// copy over filters
-	        	StructuredViewer structuredViewer = (StructuredViewer) view.getViewer();
-	            if (structuredViewer != null) {
-	                ViewerFilter[] filters = structuredViewer.getFilters();
-	                for (int i = 0; i < filters.length; i++) {
-	                    fViewer.addFilter(filters[i]);
-	                }
-	            }
-	        }
-
-	        fDetailPaneComposite = SWTFactory.createComposite(fSashForm, 1, 1, GridData.FILL_BOTH);
-	        Layout layout = fDetailPaneComposite.getLayout();
-	        if (layout instanceof GridLayout) {
-				GridLayout gl = (GridLayout) layout;
-				gl.marginHeight = 0;
-				gl.marginWidth = 0;
-			}
-	        
-	        fDetailPane = new DetailPaneProxy(new DetailPaneContainer());
-	        fDetailPane.display(null); // Bring up the default pane so the user doesn't see an empty composite
-	      
-	        fTree = fViewer.getTree();
-	        fTree.addSelectionListener(new SelectionListener() {
-	            public void widgetSelected(SelectionEvent e) {
-	            	fDetailPane.display((IStructuredSelection)fViewer.getSelection());
-	            }
-	            public void widgetDefaultSelected(SelectionEvent e) {}
-	        });
-
-	        initSashWeights();
-	              
-	        // add update listener to auto-select and display details of root expression
-	        fViewer.addViewerUpdateListener(new IViewerUpdateListener() {
-				public void viewerUpdatesComplete() {
-				}		
-				public void viewerUpdatesBegin() {
-				}
-				public void updateStarted(IViewerUpdate update) {
-				}
-				public void updateComplete(IViewerUpdate update) {
-					if (update instanceof IChildrenUpdate) {
-						TreeSelection selection = new TreeSelection(new TreePath(new Object[]{fVariable}));
-						fViewer.setSelection(selection);
-						fDetailPane.display(selection);
-						fViewer.removeViewerUpdateListener(this);
-					}
-				}
-			});        
-	        
-	        setBackgroundColor(getShell().getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
-		}
-		
-
-		/**
-	     * Attempts to find an appropriate view to emulate, this will either be the
-	     * variables view or the expressions view.
-	     * @return a view to emulate or <code>null</code>
-	     */
-	    private AbstractDebugView getViewToEmulate() {
-	        IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
-	        AbstractDebugView expressionsView = (AbstractDebugView) page.findView(IDebugUIConstants.ID_EXPRESSION_VIEW);
-	        if (expressionsView != null && expressionsView.isVisible()) {
-	            return expressionsView;
-	        }
-	        AbstractDebugView variablesView = (AbstractDebugView) page.findView(IDebugUIConstants.ID_VARIABLE_VIEW);
-	        if (variablesView != null && variablesView.isVisible()) {
-	            return variablesView;
-	        }
-	        if (expressionsView != null) {
-	            return expressionsView;
-	        }
-	        return variablesView;
-	    }	
-
-		/**
-	     * Initializes the sash form weights from the preference store (using default values if 
-	     * no sash weights were stored previously).
-	     */
-	    protected void initSashWeights(){
-	    	IDialogSettings settings = getDialogSettings(false);
-	    	if (settings != null) {
-		    	int tree = getIntSetting(settings, SASH_WEIGHT_TREE);
-		    	if (tree > 0) {
-		    		int details = getIntSetting(settings, SASH_WEIGHT_DETAILS);
-		    		if (details > 0) {
-		    			fSashForm.setWeights(new int[]{tree, details});
-		    		}
-		    	}
-	    	}
-	    }
-	    		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.text.AbstractInformationControl#setBackgroundColor(org.eclipse.swt.graphics.Color)
-		 */
-		public void setBackgroundColor(Color background) {
-			super.setBackgroundColor(background);
-			fDetailPaneComposite.setBackground(background);
-			fTree.setBackground(background);
-		}
-	
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.text.AbstractInformationControl#setFocus()
-		 */
-		public void setFocus() {
-			super.setFocus();
-			fTree.setFocus();
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.text.IInformationControlExtension#hasContents()
-		 */
-		public boolean hasContents() {
-			return fVariable != null;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.text.IInformationControlExtension2#setInput(java.lang.Object)
-		 */
-		public void setInput(Object input) {
-			if (input instanceof IVariable) {	        
-				fVariable = (IVariable) input;
-		        fViewer.setInput(new TreeRoot());
-			}
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.text.AbstractInformationControl#getInformationPresenterControlCreator()
-		 */
-		public IInformationControlCreator getInformationPresenterControlCreator() {
-			return new ExpressionInformationControlCreator() {
-				/* (non-Javadoc)
-				 * @see org.eclipse.jdt.internal.debug.ui.ExpressionInformationControlCreator#createInformationControl(org.eclipse.swt.widgets.Shell)
-				 */
-				public IInformationControl createInformationControl(Shell shell) {
-					return new ExpressionInformationControl(shell, true);
-				}
-			};
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.IInformationControlCreator#createInformationControl(org.eclipse.swt.widgets.Shell)
-	 */
-	public IInformationControl createInformationControl(Shell parent) {
-		return new ExpressionInformationControl(parent, false);
-	}
-
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/JavaScriptDebugHover.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/JavaScriptDebugHover.java
deleted file mode 100644
index 7904dd1..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/JavaScriptDebugHover.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.eval;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IValue;
-import org.eclipse.debug.core.model.IVariable;
-import org.eclipse.debug.ui.DebugUITools;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IInformationControlCreator;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.ITextHoverExtension;
-import org.eclipse.jface.text.ITextHoverExtension2;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptStackFrame;
-import org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptDebugUIPlugin;
-import org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptModelPresentation;
-import org.eclipse.wst.jsdt.internal.ui.text.JavaWordFinder;
-import org.eclipse.wst.jsdt.ui.text.java.hover.IJavaEditorTextHover;
-
-/**
- * JavaScript hover to show variables
- * 
- * @since 1.1
- */
-public class JavaScriptDebugHover implements IJavaEditorTextHover, ITextHoverExtension, ITextHoverExtension2 {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.ITextHover#getHoverInfo(org.eclipse.jface.text.ITextViewer, org.eclipse.jface.text.IRegion)
-	 */
-	public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) {
-		Object object = getHoverInfo2(textViewer, hoverRegion);
-		if (object instanceof IVariable) {	
-			IVariable var = (IVariable) object;
-			return getVariableText(var);
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.ITextHover#getHoverRegion(org.eclipse.jface.text.ITextViewer, int)
-	 */
-	public IRegion getHoverRegion(ITextViewer textViewer, int offset) {
-		return JavaWordFinder.findWord(textViewer.getDocument(), offset);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.ITextHoverExtension2#getHoverInfo2(org.eclipse.jface.text.ITextViewer, org.eclipse.jface.text.IRegion)
-	 */
-	public Object getHoverInfo2(ITextViewer textViewer, IRegion hoverRegion) {
-		IJavaScriptStackFrame frame = getFrame();
-	    if (frame != null) {
-	        IDocument document = textViewer.getDocument();
-			if (document != null) {
-			    try {
-                    String variableName = document.get(hoverRegion.getOffset(), hoverRegion.getLength());
-                    IVariable var = findLocalVariable(frame, variableName);
-                    if(var != null) {
-                    	return var;
-                    }
-                    //might be in 'this'
-                    var = frame.getThisObject();
-                    try {
-	                    IValue val = var.getValue();
-	                    if(val != null) {
-	                    	IVariable[] vars = val.getVariables();
-	                    	for (int i = 0; i < vars.length; i++) {
-	                    		if(vars[i].getName().equals(variableName)) {
-	                    			return vars[i];
-	                    		}
-							}
-	                    }
-                    }
-                    catch(DebugException de) {
-                    	return null;
-                    }
-                    	
-                } catch (BadLocationException e) {
-                    return null;
-                }
-			}
-	    }
-	    return null;
-	}
-
-	/**
-	 * Returns a local variable in the given frame based on the the given name
-	 * or <code>null</code> if none.
-	 * 
-	 * @return local variable or <code>null</code>
-	 */
-	private IVariable findLocalVariable(IJavaScriptStackFrame frame, String variableName) {
-		if (frame != null) {
-			try {
-				IVariable[] vars = frame.getVariables();
-            	for (int i = 0; i < vars.length; i++) {
-					if(vars[i].getName().equals(variableName)) {
-						return vars[i];
-					}
-				}
-			} catch (DebugException x) {
-				JavaScriptDebugUIPlugin.log(x);
-			}
-		}
-		return null;
-	}	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.ITextHoverExtension#getHoverControlCreator()
-	 */
-	public IInformationControlCreator getHoverControlCreator() {
-		return new ExpressionInformationControlCreator();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.ui.text.java.hover.IJavaEditorTextHover#setEditor(org.eclipse.ui.IEditorPart)
-	 */
-	public void setEditor(IEditorPart editor) {
-	}
-	
-	/**
-	 * Returns HTML text for the given variable
-	 */
-	private static String getVariableText(IVariable variable) {
-	    StringBuffer buffer= new StringBuffer();
-		JavaScriptModelPresentation modelPresentation = new JavaScriptModelPresentation();
-		buffer.append("<p><pre>"); //$NON-NLS-1$
-		String variableText= modelPresentation.getText(variable);
-		buffer.append(replaceHTMLChars(variableText));
-		buffer.append("</pre></p>"); //$NON-NLS-1$
-		modelPresentation.dispose();
-		if (buffer.length() > 0) {
-			return buffer.toString();
-		}
-		return null;
-	}
-	
-	/**
-	 * Replaces reserved HTML characters in the given string with
-	 * their escaped equivalents. This is to ensure that variable
-	 * values containing reserved characters are correctly displayed.
-     */
-    private static String replaceHTMLChars(String variableText) {
-        StringBuffer buffer = new StringBuffer(variableText.length());
-        char[] characters = variableText.toCharArray();
-        for (int i = 0; i < characters.length; i++) {
-            char character = characters[i];
-            switch (character) {
-            	case '<':
-            	    buffer.append("&lt;"); //$NON-NLS-1$
-            	    break;
-            	case '>':
-            	    buffer.append("&gt;"); //$NON-NLS-1$
-            	    break;
-            	case '&':
-            	    buffer.append("&amp;"); //$NON-NLS-1$
-            	    break;
-            	case '"':
-            	    buffer.append("&quot;"); //$NON-NLS-1$
-            	    break;
-            	default:
-            	    buffer.append(character);
-            }
-        }
-        return buffer.toString();
-    }
-	
-	/**
-	 * Returns the stack frame in which to search for variables, or <code>null</code>
-	 * if none.
-	 * 
-	 * @return the stack frame in which to search for variables, or <code>null</code>
-	 * if none
-	 */
-	protected IJavaScriptStackFrame getFrame() {
-	    IAdaptable adaptable = DebugUITools.getDebugContext();
-		if (adaptable != null) {
-			return (IJavaScriptStackFrame)adaptable.getAdapter(IJavaScriptStackFrame.class);
-		}
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/JavaScriptHyperlinkDetector.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/JavaScriptHyperlinkDetector.java
deleted file mode 100644
index 7478ffa..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/JavaScriptHyperlinkDetector.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.eval;
-
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jface.text.TextSelection;
-import org.eclipse.jface.text.hyperlink.AbstractHyperlinkDetector;
-import org.eclipse.jface.text.hyperlink.IHyperlink;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.texteditor.ITextEditor;
-import org.eclipse.wst.jsdt.core.IFunction;
-import org.eclipse.wst.jsdt.core.IJavaScriptElement;
-import org.eclipse.wst.jsdt.core.JavaScriptModelException;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptStackFrame;
-import org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptDebugUIPlugin;
-import org.eclipse.wst.jsdt.internal.ui.text.JavaWordFinder;
-
-/**
- * Hyper-link detector for stepping into selections in the JavaScript editor
- * 
- * @since 1.0
- */
-public class JavaScriptHyperlinkDetector extends AbstractHyperlinkDetector {
-
-	/**
-	 * Hyper-link for stepping into the selection
-	 */
-	class StepIntoSelectionHyperlink implements IHyperlink {
-		
-		private IRegion fRegion = null;
-		
-		/**
-		 * Constructor
-		 * @param region
-		 */
-		public StepIntoSelectionHyperlink(IRegion region) {
-			fRegion = region;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.text.hyperlink.IHyperlink#getHyperlinkRegion()
-		 */
-		public IRegion getHyperlinkRegion() {
-			return fRegion;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.text.hyperlink.IHyperlink#getHyperlinkText()
-		 */
-		public String getHyperlinkText() {
-			return Messages.hyperlink_step_into;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.text.hyperlink.IHyperlink#getTypeLabel()
-		 */
-		public String getTypeLabel() {
-			return null;
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.text.hyperlink.IHyperlink#open()
-		 */
-		public void open() {
-			StepIntoSelectionActionDelegate delegate = new StepIntoSelectionActionDelegate(fRegion);
-			delegate.init(PlatformUI.getWorkbench().getActiveWorkbenchWindow());
-			delegate.run(null);
-		}
-	}
-	
-	/**
-	 * Constructor
-	 */
-	public JavaScriptHyperlinkDetector() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.hyperlink.IHyperlinkDetector#detectHyperlinks(org.eclipse.jface.text.ITextViewer, org.eclipse.jface.text.IRegion, boolean)
-	 */
-	public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) {
-		ITextEditor editor = (ITextEditor) getAdapter(ITextEditor.class);
-		if(editor != null) {
-			IJavaScriptStackFrame frame = EvaluationManager.getManager().getEvaluationContext(PlatformUI.getWorkbench().getActiveWorkbenchWindow());
-			if (frame == null) {
-				return null;
-			}
-			IEditorInput input = editor.getEditorInput();
-			IJavaScriptElement element = StepIntoSelectionUtils.getJavaElement(input);
-			int offset = region.getOffset();
-			if(element != null) {
-				try {
-					IDocument document = editor.getDocumentProvider().getDocument(editor.getEditorInput());
-					if(document != null) {
-						IRegion wregion = JavaWordFinder.findWord(document, offset);
-						if(wregion != null) {
-							IFunction method = StepIntoSelectionUtils.getFunction(new TextSelection(document, wregion.getOffset(), wregion.getLength()), element);
-							if (method != null) {
-								return new IHyperlink[] {new StepIntoSelectionHyperlink(wregion)};
-							}
-						}
-					}
-				}
-				catch(JavaScriptModelException jme) {
-					JavaScriptDebugUIPlugin.log(jme);
-				}
-			}
-		}
-		return null;
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/JavaScriptInspectExpression.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/JavaScriptInspectExpression.java
deleted file mode 100644
index 42dcd66..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/JavaScriptInspectExpression.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.eval;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IExpression;
-import org.eclipse.debug.core.model.IValue;
-import org.eclipse.debug.core.model.IWatchExpression;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptDebugTarget;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptValue;
-import org.eclipse.wst.jsdt.debug.core.model.JavaScriptDebugModel;
-import org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptDebugUIPlugin;
-
-/**
- * Inspect expression for a JavaScript evaluation result
- * 
- * @since 1.0
- */
-public class JavaScriptInspectExpression implements IWatchExpression {
-
-	private IJavaScriptValue value = null;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param value the value to show
-	 */
-	public JavaScriptInspectExpression(IJavaScriptValue value) {
-		this.value = value;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IDebugElement#getModelIdentifier()
-	 */
-	public String getModelIdentifier() {
-		return JavaScriptDebugModel.MODEL_ID;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IDebugElement#getLaunch()
-	 */
-	public ILaunch getLaunch() {
-		return value.getLaunch();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		if(IJavaScriptValue.class.equals(adapter)) {
-			return value;
-		}
-		if(IExpression.class.equals(adapter)) {
-			return this;
-		}
-		if(IJavaScriptDebugTarget.class.equals(adapter)) {
-			return value.getDebugTarget();
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IExpression#getExpressionText()
-	 */
-	public String getExpressionText() {
-		try {
-			return value.getValueString();
-		}
-		catch(DebugException de) {
-			JavaScriptDebugUIPlugin.log(de);
-			return null;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IExpression#getValue()
-	 */
-	public IValue getValue() {
-		return value;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IExpression#getDebugTarget()
-	 */
-	public IDebugTarget getDebugTarget() {
-		return value.getDebugTarget();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IExpression#dispose()
-	 */
-	public void dispose() {
-		value = null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IErrorReportingExpression#hasErrors()
-	 */
-	public boolean hasErrors() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IErrorReportingExpression#getErrorMessages()
-	 */
-	public String[] getErrorMessages() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IWatchExpression#evaluate()
-	 */
-	public void evaluate() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IWatchExpression#setExpressionContext(org.eclipse.debug.core.model.IDebugElement)
-	 */
-	public void setExpressionContext(IDebugElement context) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IWatchExpression#setExpressionText(java.lang.String)
-	 */
-	public void setExpressionText(String expressionText) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IWatchExpression#isPending()
-	 */
-	public boolean isPending() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IWatchExpression#isEnabled()
-	 */
-	public boolean isEnabled() {
-		return value != null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IWatchExpression#setEnabled(boolean)
-	 */
-	public void setEnabled(boolean enabled) {
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/Messages.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/Messages.java
deleted file mode 100644
index 5651331..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/Messages.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.eval;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * 
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.internal.ui.eval.messages"; //$NON-NLS-1$
-	public static String cannot_find_debug_target;
-	public static String cursor_position_not_valid;
-	public static String empty_editor;
-	public static String exception_running_to_line;
-	public static String exe_did_not_enter__0__before_returning;
-	public static String hyperlink_step_into;
-	public static String missing_doc;
-	public static String only_in_the_js_editor;
-	public static String selected_line_not_valid;
-	public static String step_into_only_top_frame;
-	public static String step_into_selection;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/RunToLineAdapter.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/RunToLineAdapter.java
deleted file mode 100644
index d2af35c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/RunToLineAdapter.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*******************************************************************************
- *  Copyright (c) 2010 IBM Corporation and others.
- *  All rights reserved. This program and the accompanying materials
- *  are made available under the terms of the Eclipse Public License v1.0
- *  which accompanies this distribution, and is available at
- *  http://www.eclipse.org/legal/epl-v10.html
- * 
- *  Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.eval;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.ISuspendResume;
-import org.eclipse.debug.ui.actions.IRunToLineTarget;
-import org.eclipse.debug.ui.actions.RunToLineHandler;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.texteditor.ITextEditor;
-import org.eclipse.wst.jsdt.core.dom.AST;
-import org.eclipse.wst.jsdt.core.dom.ASTParser;
-import org.eclipse.wst.jsdt.core.dom.JavaScriptUnit;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptDebugTarget;
-import org.eclipse.wst.jsdt.debug.core.model.JavaScriptDebugModel;
-import org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptDebugUIPlugin;
-import org.eclipse.wst.jsdt.debug.internal.ui.breakpoints.BreakpointLocationFinder;
-
-/**
- * Run to line target for the JavaScript debugger
- * 
- * @since 1.0
- */
-public class RunToLineAdapter implements IRunToLineTarget {
-	
-	/**
-	 * Marker attribute used to denote a run to line breakpoint
-	 */
-	private static final String RUN_TO_LINE =  JavaScriptDebugUIPlugin.PLUGIN_ID + ".run_to_line"; //$NON-NLS-1$
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.actions.IRunToLineTarget#runToLine(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection, org.eclipse.debug.core.model.ISuspendResume)
-	 */
-	public void runToLine(IWorkbenchPart part, ISelection selection, ISuspendResume target) throws CoreException {
-		ITextEditor textEditor = StepIntoSelectionUtils.getTextEditor(part);
-		if (textEditor == null) {
-			throw new CoreException(new Status(IStatus.ERROR, JavaScriptDebugUIPlugin.PLUGIN_ID, Messages.missing_doc, null));
-		} 
-		IEditorInput input = textEditor.getEditorInput();
-		if (input == null) {
-			throw new CoreException(new Status(IStatus.ERROR, JavaScriptDebugUIPlugin.PLUGIN_ID, Messages.empty_editor, null));
-		} 
-		final IDocument document= textEditor.getDocumentProvider().getDocument(input);
-		if (document == null) {
-			throw new CoreException(new Status(IStatus.ERROR, JavaScriptDebugUIPlugin.PLUGIN_ID, Messages.missing_doc, null));
-		} 
-		final int[] validLine = new int[1];
-		final String[] typeName = new String[1];
-		final int[] lineNumber = new int[1];
-		final ITextSelection textSelection = (ITextSelection) selection;
-		Runnable r = new Runnable() {
-			public void run() {
-				lineNumber[0] = textSelection.getStartLine() + 1;
-				ASTParser parser = ASTParser.newParser(AST.JLS3);
-				parser.setSource(document.get().toCharArray());
-				JavaScriptUnit compilationUnit = (JavaScriptUnit)parser.createAST(null);
-				BreakpointLocationFinder locator = new BreakpointLocationFinder(compilationUnit, lineNumber[0], false);
-				compilationUnit.accept(locator);
-				validLine[0] = locator.getLineNumber();		
-				typeName[0] = locator.getFunctionName();
-			}
-		};
-		BusyIndicator.showWhile(JavaScriptDebugUIPlugin.getStandardDisplay(), r);
-		if (validLine[0] == lineNumber[0]) {
-			IBreakpoint breakpoint= null;
-			Map attributes = new HashMap(4);
-			attributes.put(IBreakpoint.PERSISTED, Boolean.FALSE);
-			attributes.put(RUN_TO_LINE, Boolean.TRUE);
-			breakpoint = JavaScriptDebugModel.createLineBreakpoint(ResourcesPlugin.getWorkspace().getRoot(), lineNumber[0], -1, -1, attributes, false);
-			if (target instanceof IAdaptable) {
-				IDebugTarget debugTarget = (IDebugTarget) ((IAdaptable)target).getAdapter(IDebugTarget.class);
-				if (debugTarget == null) {
-					throw new CoreException(new Status(IStatus.ERROR, JavaScriptDebugUIPlugin.PLUGIN_ID, Messages.cannot_find_debug_target, null));
-				}
-                RunToLineHandler handler = new RunToLineHandler(debugTarget, target, breakpoint);
-                handler.run(new NullProgressMonitor());
-				return;
-			}
-		} else {
-			// invalid line
-			if (textSelection.getLength() > 0) {
-				throw new CoreException(new Status(IStatus.ERROR, JavaScriptDebugUIPlugin.PLUGIN_ID, Messages.selected_line_not_valid, null));
-			} 
-			throw new CoreException(new Status(IStatus.ERROR, JavaScriptDebugUIPlugin.PLUGIN_ID, Messages.cursor_position_not_valid, null));
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.actions.IRunToLineTarget#canRunToLine(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection, org.eclipse.debug.core.model.ISuspendResume)
-	 */
-	public boolean canRunToLine(IWorkbenchPart part, ISelection selection, ISuspendResume target) {
-	    if (target instanceof IDebugElement) {
-            IDebugElement element = (IDebugElement) target;
-            IJavaScriptDebugTarget adapter = (IJavaScriptDebugTarget) element.getDebugTarget().getAdapter(IJavaScriptDebugTarget.class);
-            return adapter != null;
-        }
-		return false;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/StepIntoSelectionActionDelegate.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/StepIntoSelectionActionDelegate.java
deleted file mode 100644
index 52f1778..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/StepIntoSelectionActionDelegate.java
+++ /dev/null
@@ -1,325 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.eval;
-
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdapterManager;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IDebugEventSetListener;
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.debug.core.model.IThread;
-import org.eclipse.debug.ui.actions.IRunToLineTarget;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.text.TextSelection;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IEditorActionDelegate;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.texteditor.IEditorStatusLine;
-import org.eclipse.ui.texteditor.ITextEditor;
-import org.eclipse.wst.jsdt.core.IFunction;
-import org.eclipse.wst.jsdt.core.IJavaScriptElement;
-import org.eclipse.wst.jsdt.core.JavaScriptModelException;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptStackFrame;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread;
-import org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptDebugUIPlugin;
-
-/**
- * Steps into the selected function.
- * 
- * @since 1.0
- */
-public class StepIntoSelectionActionDelegate implements IEditorActionDelegate, IWorkbenchWindowActionDelegate {
-	
-	private IEditorPart editor = null;
-	private IWorkbenchWindow window = null;
-	private IRegion region = null;
-	
-	/**
-	 * Default constructor
-	 */
-	public StepIntoSelectionActionDelegate() {}
-	
-	/**
-	 * Constructor
-	 * @param region
-	 */
-	public StepIntoSelectionActionDelegate(IRegion region) {
-		this.region = region;
-	}
-
-	/**
-	 * The line number being "run to."
-	 */
-	private int line = -1;
-	
-	/**
-	 * The debug event list listener used to know when a run to line has finished.
-	 * @see StepIntoSelectionActionDelegate#runToLineBeforeStepIn(ITextSelection, IJavaScriptStackFrame, IFunction)
-	 */
-	private IDebugEventSetListener listener = null;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
-	 */
-	public void run(IAction action) {
-		IJavaScriptStackFrame frame = getStackFrame();
-		if (frame == null || !frame.isSuspended()) {
-			// no longer suspended - unexpected
-			return;
-		}
-		ITextSelection textSelection = getTextSelection();
-		try {
-			IEditorPart activeEditor = getActiveEditor();
-			IJavaScriptElement javaElement= StepIntoSelectionUtils.getJavaElement(activeEditor.getEditorInput());
-			IFunction function = StepIntoSelectionUtils.getFunction(textSelection, javaElement);
-			if (function == null) {
-				function = StepIntoSelectionUtils.getFirstFunctionOnLine(textSelection.getOffset(), activeEditor, javaElement);
-			}
-			int lineNumber = frame.getLineNumber();
-			if (textSelection.getStartLine() == (lineNumber - 1)) {
-                doStepIn(frame, function);
-			} else {
-				runToLineBeforeStepIn(textSelection, frame.getThread(), function);
-				return;
-			}
-		} 
-		catch (DebugException e) {
-			showErrorMessage(e.getStatus().getMessage());
-			return;
-		}
-		catch(JavaScriptModelException jme) {
-			showErrorMessage(jme.getStatus().getMessage());
-			return;
-		}
-	}
-	
-	/**
-	 * Steps into the given function in the given stack frame
-	 * @param frame the frame in which the step should begin
-	 * @param function the function to step into
-	 * @throws DebugException
-	 */
-	private void doStepIn(IJavaScriptStackFrame frame, IFunction function) throws DebugException {
-		// ensure top stack frame
-		IStackFrame tos = frame.getThread().getTopStackFrame();
-		if (tos == null) {
-			return; 
-		}		
-		if (!tos.equals(frame)) {
-			showErrorMessage(Messages.step_into_only_top_frame); 
-			return;
-		}
-		StepIntoSelectionHandler handler = new StepIntoSelectionHandler((IJavaScriptThread)frame.getThread(), frame, function);
-		handler.step();
-	}
-	
-	/**
-	 * When the user chooses to "step into selection" on a line other than
-	 * the currently executing one, first perform a "run to line" to get to
-	 * the desired location, then perform a "step into selection."
-	 */
-	private void runToLineBeforeStepIn(ITextSelection textSelection, final IThread thread, final IFunction function) {
-		line = textSelection.getStartLine() + 1;
-		if (line == -1) {
-			return;
-		}
-		// see bug 65489 - get the run-to-line adapter from the editor
-		IRunToLineTarget runToLineAction = null;
-		IEditorPart ed = getActiveEditor();
-		if (ed != null) {
-			runToLineAction  = (IRunToLineTarget) ed.getAdapter(IRunToLineTarget.class);
-			if (runToLineAction == null) {
-				IAdapterManager adapterManager = Platform.getAdapterManager();
-				if (adapterManager.hasAdapter(ed, IRunToLineTarget.class.getName())) { 
-					runToLineAction = (IRunToLineTarget) adapterManager.loadAdapter(ed,IRunToLineTarget.class.getName()); 
-				}
-			}
-		}	
-		// if no adapter exists, use the Java adapter
-		if (runToLineAction == null) {
-		  runToLineAction = new RunToLineAdapter();
-		}
-		listener = new IDebugEventSetListener() {
-
-			/* (non-Javadoc)
-			 * @see org.eclipse.debug.core.IDebugEventSetListener#handleDebugEvents(org.eclipse.debug.core.DebugEvent[])
-			 */
-			public void handleDebugEvents(DebugEvent[] events) {
-				for (int i = 0; i < events.length; i++) {
-					DebugEvent event = events[i];
-					switch (event.getKind()) {
-						case DebugEvent.SUSPEND :
-							handleSuspendEvent(event);
-							break;
-						case DebugEvent.TERMINATE :
-							handleTerminateEvent(event);
-							break;
-						default :
-							break;
-					}
-				}
-			}
-			/**
-			 * Listen for the completion of the "run to line." When the thread
-			 * suspends at the correct location, perform a "step into selection"
-			 * 
-			 * @param event the debug event
-			 */
-			private void handleSuspendEvent(DebugEvent event) {
-				Object source = event.getSource();
-				if (source instanceof IJavaScriptThread) {
-					try {
-						final IJavaScriptStackFrame frame= (IJavaScriptStackFrame) ((IJavaScriptThread) source).getTopStackFrame();
-						if (isExpectedFrame(frame)) {
-							DebugPlugin plugin = DebugPlugin.getDefault();
-							plugin.removeDebugEventListener(listener);
-							plugin.asyncExec(new Runnable() {
-								public void run() {
-									try {
-										doStepIn(frame, function);
-									} catch (DebugException e) {
-										showErrorMessage(e.getStatus().getMessage());
-									}
-								}
-							});
-						}
-					} catch (DebugException e) {
-						return;
-					}
-				}
-			}
-			/**
-			 * Returns whether the given frame is the frame that this action is expecting.
-			 * This frame is expecting a stack frame for the suspension of the "run to line".
-			 * @param frame the given stack frame or <code>null</code>
-			 * @return whether the given stack frame is the expected frame
-			 * @throws DebugException
-			 */
-			private boolean isExpectedFrame(IJavaScriptStackFrame frame) throws DebugException {
-				return frame != null && line == frame.getLineNumber();
-			}
-			/**
-			 * When the debug target we're listening for terminates, stop listening
-			 * to debug events.
-			 * @param event the debug event
-			 */
-			private void handleTerminateEvent(DebugEvent event) {
-				Object source = event.getSource();
-				if (thread.getDebugTarget() == source) {
-					DebugPlugin.getDefault().removeDebugEventListener(listener);
-				}
-			}
-		};
-		DebugPlugin.getDefault().addDebugEventListener(listener);
-		try {
-			runToLineAction.runToLine(getActiveEditor(), textSelection, thread);
-		} catch (CoreException e) {
-			DebugPlugin.getDefault().removeDebugEventListener(listener);
-			showErrorMessage(Messages.exception_running_to_line); 
-			JavaScriptDebugUIPlugin.log(e.getStatus());
-		}
-	}
-	
-	/**
-	 * Gets the current text selection from the currently active editor
-	 * @return the current text selection
-	 */
-	private ITextSelection getTextSelection() {
-		IEditorPart part = getActiveEditor();
-		if (part instanceof ITextEditor) { 
-			ITextEditor editor = (ITextEditor)part;
-			if(region != null) {
-				IDocument document = editor.getDocumentProvider().getDocument(editor.getEditorInput());
-				if(document != null) {
-					return new TextSelection(document, region.getOffset(), region.getLength());
-				}
-			}
-			else {
-				return (ITextSelection)editor.getSelectionProvider().getSelection();
-			}
-		}
-		showErrorMessage(Messages.only_in_the_js_editor); 
-		return null;
-	}
-	
-	/**
-	 * Displays an error message in the status area
-	 * 
-	 * @param message
-	 */
-	protected void showErrorMessage(String message) {	
-		if (getActiveEditor() != null) {
-			IEditorStatusLine statusLine= (IEditorStatusLine) getActiveEditor().getAdapter(IEditorStatusLine.class);
-			if (statusLine != null) {
-				statusLine.setMessage(true, message, null);
-			}
-		}		
-		JavaScriptDebugUIPlugin.getStandardDisplay().beep();		
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IEditorActionDelegate#setActiveEditor(org.eclipse.jface.action.IAction, org.eclipse.ui.IEditorPart)
-	 */
-	public void setActiveEditor(IAction action, IEditorPart targetEditor) {
-		editor = targetEditor;
-	}
-	
-	/**
-	 * Returns the active editor or <code>null</code>.
-	 * 
-	 * @return active editor or <code>null</code>
-	 */
-	protected IEditorPart getActiveEditor() {
-		if (window != null) {
-			// global action
-			return window.getActivePage().getActiveEditor();
-		}
-		// pop-up action
-		return editor;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-	}
-
-	/**
-	 * Returns the current stack frame context, or <code>null</code> if none.
-	 * 
-	 * @return the current stack frame context, or <code>null</code> if none
-	 */
-	protected IJavaScriptStackFrame getStackFrame() {
-		return EvaluationManager.getManager().getEvaluationContext(getActiveEditor());
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
-	 */
-	public void dispose() {}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void init(IWorkbenchWindow window) {
-		this.window = window;
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/StepIntoSelectionHandler.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/StepIntoSelectionHandler.java
deleted file mode 100644
index f40eda8..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/StepIntoSelectionHandler.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.eval;
-
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IDebugEventFilter;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.jsdt.core.IFunction;
-import org.eclipse.wst.jsdt.core.JavaScriptModelException;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptDebugTarget;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptStackFrame;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread;
-import org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptDebugUIPlugin;
-
-/**
- * Handles stepping into a selected function, for a specific thread.
- * 
- * @since 1.0
- */
-public class StepIntoSelectionHandler implements IDebugEventFilter {
-	
-	/**
-	 * The function to step into
-	 */
-	private IFunction function;
-	
-	/**
-	 * Resolved signature of the function to step into
-	 */
-	private String signature;
-	
-	/**
-	 * The thread in which to step
-	 */
-	private IJavaScriptThread thread;
-
-	/**
-	 * The initial stack frame
-	 */
-	private String origname;
-	private int origdepth;
-	
-	/**
-	 * Whether this is the first step into.
-	 */
-	private boolean firststep = true;
-	
-	/**
-	 * Expected event kind
-	 */
-	private int eventkind = -1;
-	
-	/**
-	 * Expected event detail
-	 */
-	private int eventdetail = -1;
-
-	/**
-	 * Constructs a step handler to step into the given function in the given thread
-	 * starting from the given stack frame.
-	 * 
-	 * @param thread
-	 * @param frame
-	 * @param func
-	 */
-	public StepIntoSelectionHandler(IJavaScriptThread thread, IJavaScriptStackFrame frame, IFunction func) {
-		function = func;
-		this.thread = thread;
-		try {
-			origname = frame.getName();
-			signature = func.getSignature();
-		} catch (CoreException e) {
-			JavaScriptDebugUIPlugin.log(e);
-		}
-	}
-	
-	/**
-	 * Returns the target thread for the step.
-	 * 
-	 * @return the target thread for the step
-	 */
-	protected IJavaScriptThread getThread() {
-		return thread;
-	}
-	
-	protected IJavaScriptDebugTarget getDebugTarget() {
-		return (IJavaScriptDebugTarget)getThread().getDebugTarget();
-	}
-	
-	/**
-	 * Returns the function to step into
-	 * 
-	 * @return the function to step into
-	 */
-	protected IFunction getMethod() {
-		return function;
-	}
-	
-	/**
-	 * Returns the resolved signature of the function to step into
-	 * 
-	 * @return the resolved signature of the function to step into
-	 */
-	protected String getSignature() {
-		return signature;
-	}	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.IDebugEventFilter#filterDebugEvents(org.eclipse.debug.core.DebugEvent[])
-	 */
-	public DebugEvent[] filterDebugEvents(DebugEvent[] events) {
-		// we only expect one event from our thread - find the event
-		DebugEvent event = null;
-		int index = -1;
-		int threadEvents = 0;
-		for (int i = 0; i < events.length; i++) {
-			DebugEvent e = events[i];
-			if (isExpectedEvent(e)) {
-				event = e;
-				index = i;
-				threadEvents++;
-			} else if (e.getSource() == getThread()) {
-				threadEvents++;
-			} 
-		}
-		if (event == null) {
-			// nothing to process in this event set
-			return events;
-		}
-		// create filtered event set
-		DebugEvent[] filtered = new DebugEvent[events.length - 1];
-		if (filtered.length > 0) {
-			int j = 0;
-			for (int i = 0; i < events.length; i++) {
-				if (i != index) {
-					filtered[j] = events[i];
-					j++;
-				}
-			}
-		}
-		// if more than one event in our thread, abort (filtering our event)
-		if (threadEvents > 1) {
-			cleanup();
-			return filtered;
-		}
-		// we have the one expected event - process it
-		switch (event.getKind()) {
-			case DebugEvent.RESUME:
-				// next, we expect a step end
-				setExpectedEvent(DebugEvent.SUSPEND, DebugEvent.STEP_END);
-				if (firststep) {
-					firststep = false;
-					return events; // include the first resume event
-				}
-				// secondary step - filter the event
-				return filtered;			
-			case DebugEvent.SUSPEND:
-				// compare location to desired location
-				try {
-					final IJavaScriptStackFrame frame = (IJavaScriptStackFrame)getThread().getTopStackFrame();
-					int stackDepth = frame.getThread().getStackFrames().length;
-					String name = frame.getName();
-					if (name.equals(getMethod().getElementName())) {
-						// hit
-						cleanup();
-						return events;
-					}
-					// step again
-					Runnable r = null;
-					if (stackDepth > origdepth) {
-						r = new Runnable() {
-							public void run() {
-								try {
-									setExpectedEvent(DebugEvent.RESUME, DebugEvent.STEP_RETURN);
-									frame.stepReturn();
-								} catch (DebugException e) {
-									JavaScriptDebugUIPlugin.log(e);
-									cleanup();
-									DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[]{new DebugEvent(getDebugTarget(), DebugEvent.CHANGE)});
-								}
-							}
-						};
-					} else if (stackDepth == origdepth){
-						// we should be back in the original stack frame - if not, abort
-						if (!frame.getName().equals(origname)) {
-							missed();
-							return events;
-						}
-						r = new Runnable() {
-							public void run() {
-								try {
-									setExpectedEvent(DebugEvent.RESUME, DebugEvent.STEP_INTO);
-									frame.stepInto();	
-								} catch (DebugException e) {
-									JavaScriptDebugUIPlugin.log(e);
-									cleanup();
-									DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[]{new DebugEvent(getDebugTarget(), DebugEvent.CHANGE)});
-								}
-							}
-						};																
-					} else {
-						// we returned from the original frame - never hit the desired method
-						missed();
-						return events;								
-					}
-					DebugPlugin.getDefault().asyncExec(r);
-					// filter the events
-						return filtered;
-				} catch (CoreException e) {
-					// abort
-					JavaScriptDebugUIPlugin.log(e);
-					cleanup();
-					return events;
-				}			
-		}
-		// execution should not reach here
-		return events;
-		 
-	}
-	
-	/** 
-	 * Called when stepping returned from the original frame without entering the desired method.
-	 */
-	protected void missed() {
-		cleanup();
-		Runnable r = new Runnable() {
-			public void run() {
-				String methodName = null;
-				try {
-					methodName = org.eclipse.wst.jsdt.core.Signature.toString(getMethod().getSignature(), getMethod().getElementName(), getMethod().getParameterNames(), false, false);
-				} catch (JavaScriptModelException e) {
-					methodName = getMethod().getElementName();
-				}
-				new MessageDialog(
-						PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),  
-						Messages.step_into_selection, 
-						null, 
-						NLS.bind(Messages.exe_did_not_enter__0__before_returning, new String[]{methodName}), 
-						MessageDialog.INFORMATION, new String[] {IDialogConstants.OK_LABEL}, 0).open();    
-			}
-		};
-		JavaScriptDebugUIPlugin.getStandardDisplay().asyncExec(r);		
-	}
-
-	/**
-	 * Performs the step.
-	 */
-	public void step() {
-		// add event filter and turn off step filters
-		DebugPlugin.getDefault().addDebugEventFilter(this);
-		try {
-			origdepth = getThread().getStackFrames().length;
-			setExpectedEvent(DebugEvent.RESUME, DebugEvent.STEP_INTO);
-			getThread().stepInto();
-		} catch (DebugException e) {
-			JavaScriptDebugUIPlugin.log(e);
-			cleanup();
-			DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[]{new DebugEvent(getDebugTarget(), DebugEvent.CHANGE)});			
-		}
-	}
-	
-	/**
-	 * Cleans up when the step is complete/aborted.
-	 */
-	protected void cleanup() {
-		DebugPlugin.getDefault().removeDebugEventFilter(this);
-	}
-	
-	/**
-	 * Sets the expected debug event kind and detail we are waiting for next.
-	 * 
-	 * @param kind event kind
-	 * @param detail event detail
-	 */
-	private void setExpectedEvent(int kind, int detail) {
-		eventkind = kind;
-		eventdetail = detail;
-	}
-	
-	/**
-	 * Returns whether the given event is what we expected.
-	 * 
-	 * @param event fire event
-	 * @return whether the event is what we expected
-	 */
-	protected boolean isExpectedEvent(DebugEvent event) {
-		return event.getSource().equals(getThread()) &&
-			event.getKind() == eventkind &&
-			event.getDetail() == eventdetail;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/StepIntoSelectionUtils.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/StepIntoSelectionUtils.java
deleted file mode 100644
index ee8ebb5..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/StepIntoSelectionUtils.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.eval;
-
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.texteditor.IDocumentProvider;
-import org.eclipse.ui.texteditor.ITextEditor;
-import org.eclipse.wst.jsdt.core.ICodeAssist;
-import org.eclipse.wst.jsdt.core.IFunction;
-import org.eclipse.wst.jsdt.core.IJavaScriptElement;
-import org.eclipse.wst.jsdt.core.JavaScriptCore;
-import org.eclipse.wst.jsdt.core.JavaScriptModelException;
-import org.eclipse.wst.jsdt.core.ToolFactory;
-import org.eclipse.wst.jsdt.core.compiler.IScanner;
-import org.eclipse.wst.jsdt.core.compiler.ITerminalSymbols;
-import org.eclipse.wst.jsdt.core.compiler.InvalidInputException;
-import org.eclipse.wst.jsdt.ui.JavaScriptUI;
-
-/**
- * Utility class for aiding step into selection actions and hyper-linking
- * 
- * @since 1.1
- */
-public class StepIntoSelectionUtils {
-
-	/**
-     * Returns the text editor associated with the given part or <code>null</code>
-     * if none. In case of a multi-page editor, this method should be used to retrieve
-     * the correct editor to perform the operation on.
-     * 
-     * @param part workbench part
-     * @return text editor part or <code>null</code>
-     */
-    public static ITextEditor getTextEditor(IWorkbenchPart part) {
-    	if (part instanceof ITextEditor) {
-    		return (ITextEditor) part;
-    	}
-    	return (ITextEditor) part.getAdapter(ITextEditor.class);
-    }	
-	
-	/**
-     * gets the <code>IJavaScriptElement</code> from the editor input
-     * @param input the current editor input
-     * @return the corresponding <code>IJavaScriptElement</code>
-     */
-    public static IJavaScriptElement getJavaElement(IEditorInput input) {
-    	IJavaScriptElement je = JavaScriptUI.getEditorInputJavaElement(input);
-    	if(je != null) {
-    		return je;
-    	}
-    	return JavaScriptUI.getWorkingCopyManager().getWorkingCopy(input);
-    }
-    
-    /**
-     * Returns the <code>IFuntion</code> from the given selection within the given <code>IJavaScriptElement</code>, 
-     * or <code>null</code> if the selection does not container or is not an <code>IFunction</code>
-     * @param selection
-     * @param element
-     * @return the corresponding <code>IFunction</code> from the selection within the provided <code>IJavaScriptElement</code>
-     * @throws JavaScriptModelException
-     */
-    public static IFunction getFunction(ITextSelection selection, IJavaScriptElement element) throws JavaScriptModelException {
-    	if(element != null && element instanceof ICodeAssist) {
-    		return resolveFunction(selection.getOffset(), selection.getLength(), (ICodeAssist)element);
-    	}
-    	return null;
-    }
-
-	/**
-	 * @param offset selection offset
-	 * @param length selection length
-	 * @param codeAssist context
-	 * @return the function at the given position, or <code>null</code> if no function could be resolved 
-	 * @throws JavaScriptModelException
-	 */
-	private static IFunction resolveFunction(int offset, int length, ICodeAssist codeAssist) throws JavaScriptModelException {
-		IJavaScriptElement[] elements = codeAssist.codeSelect(offset, length);
-		for (int i = 0; i < elements.length; i++) {
-			if (elements[i] instanceof IFunction) {
-				return (IFunction)elements[i];
-			}
-		}
-		return null;
-	}
-    
-	/**
-	 * @param offset
-	 * @param activeEditor
-	 * @param element
-	 * @return the first function found at or after <code>offset</code> on the same line
-	 * @throws JavaScriptModelException
-	 */
-	public static IFunction getFirstFunctionOnLine(int offset, IEditorPart activeEditor, IJavaScriptElement element) throws JavaScriptModelException {
-		if (! (activeEditor instanceof ITextEditor) || ! (element instanceof ICodeAssist)) {
-			return null;
-		}
-		ITextEditor editor = (ITextEditor)activeEditor;
-		IDocumentProvider documentProvider = editor.getDocumentProvider();
-		if (documentProvider == null) {
-			return null;
-		}
-		IDocument document = documentProvider.getDocument(editor.getEditorInput());
-		if (document == null) {
-			return null;
-		}
-		try {
-			IRegion lineInfo = document.getLineInformationOfOffset(offset);
-			String line = document.get(lineInfo.getOffset(), lineInfo.getLength());
-			IScanner scanner = ToolFactory.createScanner(false, false, false, null, JavaScriptCore.VERSION_1_5);
-			scanner.setSource(line.toCharArray());
-			scanner.resetTo(offset - lineInfo.getOffset(), lineInfo.getLength());
-			int token = scanner.getNextToken();
-			while (token != ITerminalSymbols.TokenNameEOF) {
-				if (token == ITerminalSymbols.TokenNameIdentifier) {
-					int methodStart = scanner.getCurrentTokenStartPosition();
-					token = scanner.getNextToken();
-					if (token == ITerminalSymbols.TokenNameLPAREN) {
-						return resolveFunction(lineInfo.getOffset() + methodStart, 0, (ICodeAssist)element);
-					}
-				} 
-				else {
-					token = scanner.getNextToken();
-				}
-			}
-		} 
-		catch (BadLocationException e) {
-			return null;
-		} 
-		catch (InvalidInputException e) {
-			return null;
-		}
-		return null;
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/messages.properties b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/messages.properties
deleted file mode 100644
index b1bf88f..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/eval/messages.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-###############################################################################
-# Copyright (c) 201o IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-cannot_find_debug_target=Unable to locate debug target
-cursor_position_not_valid=Cursor position is not a valid location to run to
-empty_editor=Empty editor
-exception_running_to_line=An exception occurred attempting to run to the selected line.
-exe_did_not_enter__0__before_returning=Execution did not enter "{0}" before the current function returned.
-hyperlink_step_into=Step Into
-missing_doc=Missing document
-only_in_the_js_editor=Step into selection only available in JavaScript editor.
-selected_line_not_valid=Selected line is not a valid location to run to
-step_into_only_top_frame=Step into selection only available in top stack frame.
-step_into_selection=Step into selection
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/launching/JavaScriptConnectTab.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/launching/JavaScriptConnectTab.java
deleted file mode 100644
index f916efd..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/launching/JavaScriptConnectTab.java
+++ /dev/null
@@ -1,435 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.launching;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
-import org.eclipse.jface.preference.BooleanFieldEditor;
-import org.eclipse.jface.preference.ComboFieldEditor;
-import org.eclipse.jface.preference.FieldEditor;
-import org.eclipse.jface.preference.IntegerFieldEditor;
-import org.eclipse.jface.preference.PreferenceStore;
-import org.eclipse.jface.preference.StringFieldEditor;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector;
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument;
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.BooleanArgument;
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument;
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.SelectedArgument;
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.StringArgument;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.core.launching.ILaunchConstants;
-import org.eclipse.wst.jsdt.debug.internal.ui.IHelpContextIds;
-import org.eclipse.wst.jsdt.debug.internal.ui.ISharedImages;
-import org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptImageRegistry;
-import org.eclipse.wst.jsdt.debug.internal.ui.Messages;
-import org.eclipse.wst.jsdt.debug.internal.ui.SWTFactory;
-
-/**
- * Tab to allow connection information to be specified
- * 
- * @since 1.0
- */
-public class JavaScriptConnectTab extends AbstractLaunchConfigurationTab implements IPropertyChangeListener {
-	
-	class ArgComparator implements Comparator {
-		/* (non-Javadoc)
-		 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
-		 */
-		public int compare(Object o1, Object o2) {
-			if(o1 instanceof Entry && o2 instanceof Entry) {
-				//String > Integer > List > Boolean 
-				//sort by kind and by label
-				Object val1 = ((Entry)o1).getValue();
-				Object val2 = ((Entry)o2).getValue();
-				if(val1 instanceof StringArgument) {
-					if(val2 instanceof StringArgument) {
-						return stripAccel(((Argument)val1).label()).compareTo(stripAccel(((Argument)val2).label()));
-					}
-					return -1;
-				}
-				else if(val1 instanceof IntegerArgument) {
-					if(val2 instanceof IntegerArgument) {
-						return stripAccel(((Argument)val1).label()).compareTo(stripAccel(((Argument)val2).label()));
-					}
-					else if(val2 instanceof StringArgument) {
-						return 1;
-					}
-					return -1;
-				}
-				else if(val1 instanceof SelectedArgument) {
-					if(val2 instanceof SelectedArgument) {
-						return stripAccel(((Argument)val1).label()).compareTo(stripAccel(((Argument)val2).label()));
-					}
-					else if(val2 instanceof StringArgument || val2 instanceof IntegerArgument) {
-						return 1;
-					}
-					return -1;
-				}
-				else if(val1 instanceof BooleanArgument) {
-					if(val2 instanceof BooleanArgument) {
-						return stripAccel(((Argument)val1).label()).compareTo(stripAccel(((Argument)val2).label()));
-					}
-					else if(val2 instanceof StringArgument || val2 instanceof IntegerArgument || val2 instanceof SelectedArgument) {
-						return 1;
-					}
-					return -1;
-				}
-			}
-			return o1.equals(o2) ? 0 : -1;
-		}
-		
-		String stripAccel(String text) {
-			return text.replaceAll("\\&", ""); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-	
-	Text description = null;
-	Combo connectorcombo = null;
-	Connector selectedconnector = null;
-	Group argumentsgroup = null;
-	HashMap editormap = new HashMap();
-	Comparator comparator = new ArgComparator();
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite comp = SWTFactory.createComposite(parent, 1, 1, GridData.FILL_HORIZONTAL);
-		//connectors combo
-		Group group = SWTFactory.createGroup(comp, Messages.connector, 1, 1, GridData.FILL_HORIZONTAL);
-		this.connectorcombo = SWTFactory.createCombo(group, SWT.FLAT | SWT.BORDER | SWT.READ_ONLY, 1, null);
-		GridData gd = (GridData) this.connectorcombo.getLayoutData();
-		gd.grabExcessHorizontalSpace = true;
-		this.connectorcombo.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				handleConnectorSelected();
-			}
-		});
-		this.description = SWTFactory.createText(group, SWT.WRAP | SWT.READ_ONLY, 1);
-		gd = (GridData) this.description.getLayoutData();
-		gd.heightHint = 30;
-		//hack to make sure the disabled colour is propagated on *Nix's 
-		this.description.setBackground(group.getBackground());
-		List connectors = JavaScriptDebugPlugin.getConnectionsManager().getConnectors();
-		Connector connector = null;
-		for (int i = 0; i < connectors.size(); i++) {
-			connector = (Connector)connectors.get(i);
-			this.connectorcombo.add(connector.name());
-			this.connectorcombo.setData(connector.name(), connector);
-		}
-		
-		this.argumentsgroup = SWTFactory.createGroup(comp, Messages.connector_properties, 2, 1, GridData.FILL_HORIZONTAL);
-		this.argumentsgroup.setVisible(false);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(comp, IHelpContextIds.CONNECT_TAB);
-		setControl(comp);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getHelpContextId()
-	 */
-	public String getHelpContextId() {
-		return IHelpContextIds.CONNECT_TAB;
-	};
-	
-	/**
-	 * Returns the {@link Connector} based on the selection of the combo
-	 * @return the selected combo
-	 */
-	Connector getSelectedConnector() {
-		if(this.connectorcombo.getItemCount() > 0) {
-			int idx = this.connectorcombo.getSelectionIndex();
-			idx = (idx < 0 ? 0 : idx);
-			String name = this.connectorcombo.getItem(idx);
-			return (Connector) this.connectorcombo.getData(name);
-		}
-		return null;
-	}
-	
-	/**
-	 * Handles creating the UI for the connector selected
-	 */
-	void handleConnectorSelected() {
-		Connector connect = getSelectedConnector();
-		if(connect == null || connect.equals(this.selectedconnector)) {
-			//nothing changed
-			return;
-		}
-		this.selectedconnector = connect;
-		String desc = this.selectedconnector.description();
-		if(desc != null) {
-			this.description.setText(desc);
-		}
-		else {
-			this.description.setText(Messages.no_description_provided);
-		}
-		this.editormap.clear();
-		//get rid of the old controls
-		Control[] children = this.argumentsgroup.getChildren();
-		for (int i = 0; i < children.length; i++) {
-			children[i].dispose();
-		}
-		PreferenceStore store = new PreferenceStore();
-		Entry entry = null;
-		Argument argument = null;
-		FieldEditor editor = null;
-		String key = null;
-		ArrayList entries = new ArrayList(this.selectedconnector.defaultArguments().entrySet());
-		Collections.sort(entries, comparator);
-		for (Iterator iter = entries.iterator(); iter.hasNext();) {
-			entry = (Entry) iter.next();
-			key = (String) entry.getKey();
-			argument = (Argument) entry.getValue();
-			if(argument instanceof IntegerArgument) {
-				//create an int editor
-				store.setDefault(argument.name(), ((IntegerArgument)argument).intValue());
-				editor = new IntegerFieldEditor(argument.name(), argument.label(), this.argumentsgroup);
-			}
-			else if(argument instanceof BooleanArgument) {
-				//create boolean editor
-				store.setDefault(argument.name(), ((BooleanArgument)argument).booleanValue());
-				editor = new BooleanFieldEditor(argument.name(), argument.label(), this.argumentsgroup);
-				editor.fillIntoGrid(argumentsgroup, 2);
-			}
-			else if(argument instanceof StringArgument) {
-				//create String editor
-				store.setDefault(argument.name(), argument.value());
-				editor = new StringFieldEditor(argument.name(), argument.label(), this.argumentsgroup);
-			}
-			else if(argument instanceof SelectedArgument) {
-				//create list selection editor
-				List choices = ((SelectedArgument)argument).choices();
-				String[][] namesAndValues = new String[choices.size()][2];
-				int count = 0;
-				for (Iterator iter2 = choices.iterator(); iter2.hasNext();) {
-					String choice = (String)iter2.next();
-					namesAndValues[count][0] = choice;
-					namesAndValues[count][1] = choice;
-					count++;
-				}
-				store.setDefault(argument.name(), argument.value());
-				editor = new ComboFieldEditor(argument.name(), argument.label(), namesAndValues, this.argumentsgroup);
-			}
-			if(editor != null) {
-				editor.setPreferenceStore(store);
-				editor.loadDefault();
-				editor.setPropertyChangeListener(this);
-				this.editormap.put(key, editor);
-				editor = null;
-			}
-		}
-		//reset margins to undo FieldEditor bogosity
-		GridLayout gd = (GridLayout) this.argumentsgroup.getLayout();
-		gd.marginHeight = 5;
-		gd.marginWidth = 5;
-		gd.numColumns = 2;
-		this.argumentsgroup.getParent().layout(true);
-		this.argumentsgroup.setVisible(true);
-		this.argumentsgroup.layout(true);
-		updateLaunchConfigurationDialog();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#isValid(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public boolean isValid(ILaunchConfiguration launchConfig) {
-		setErrorMessage(null);
-		Iterator keys = this.editormap.keySet().iterator();
-		Connector connector = getSelectedConnector();
-		if(connector == null) {
-			return false;
-		}
-		while (keys.hasNext()) {
-			String key = (String)keys.next();
-			Argument arg = (Argument)connector.defaultArguments().get(key);
-			FieldEditor editor = (FieldEditor)this.editormap.get(key);
-			if (editor instanceof StringFieldEditor) {
-				String value = ((StringFieldEditor)editor).getStringValue();
-				if (!arg.isValid(value)) {
-					setErrorMessage(NLS.bind(Messages.the_argument_0_is_not_valid, new String[] {arg.name()})); 
-					return false;
-				}		
-			}
-			else if (editor instanceof BooleanFieldEditor) {
-		        boolean value = ((BooleanFieldEditor)editor).getBooleanValue();
-		        if (!arg.isValid(String.valueOf(value))) {
-		          setErrorMessage(NLS.bind(Messages.the_argument_0_is_not_valid, new String[] {arg.name()})); 
-		          return false;
-		        }   
-		    }
-			else if (editor instanceof IntegerFieldEditor) {
-		        int value = ((IntegerFieldEditor)editor).getIntValue();
-		        if (!arg.isValid(String.valueOf(value))) {
-		          setErrorMessage(NLS.bind(Messages.the_argument_0_is_not_valid, new String[] {arg.name()})); 
-		          return false;
-		        }   
-		    }
-			else if(editor instanceof ComboFieldEditor) {
-				editor.store();
-				if (!arg.isValid(editor.getPreferenceStore().getString(key))) {
-		          setErrorMessage(NLS.bind(Messages.the_argument_0_is_not_valid, new String[] {arg.name()})); 
-		          return false;
-		        }  
-			}
-		}		
-		return true;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#getName()
-	 */
-	public String getName() {
-		return Messages.connect;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTab#getImage()
-	 */
-	public Image getImage() {
-		return JavaScriptImageRegistry.getSharedImage(ISharedImages.IMG_CONNECT);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public void initializeFrom(ILaunchConfiguration configuration) {
-		try {
-			String connectorid = configuration.getAttribute(ILaunchConstants.CONNECTOR_ID, (String)null);
-			if(connectorid != null) {
-				Connector connector = JavaScriptDebugPlugin.getConnectionsManager().getConnector(connectorid);
-				if(connector != null) {
-					int idx = this.connectorcombo.indexOf(connector.name());
-					if(idx > -1) {
-						this.connectorcombo.select(idx);
-						handleConnectorSelected();
-						Map argmap = configuration.getAttribute(ILaunchConstants.ARGUMENT_MAP, (Map)null);
-						if(argmap != null) {
-							Entry entry = null;
-							Argument argument = null;
-							String key = null;
-							FieldEditor editor = null;
-							for (Iterator iter = argmap.entrySet().iterator(); iter.hasNext();) {
-								entry = (Entry) iter.next();
-								key = (String) entry.getKey();
-								argument = (Argument) connector.defaultArguments().get(key);
-								editor = (FieldEditor)this.editormap.get(key);
-								if (argument != null && editor != null) {
-									String value = (String)argmap.get(key);
-									if (argument instanceof StringArgument || argument instanceof SelectedArgument) {
-										editor.getPreferenceStore().setValue(key, value);
-									} 
-									else if (argument instanceof BooleanArgument) {
-										editor.getPreferenceStore().setValue(key, Boolean.valueOf(value).booleanValue());
-									}
-									else if (argument instanceof IntegerArgument) {
-										editor.getPreferenceStore().setValue(key, new Integer(value).intValue());
-									}
-									editor.load();
-								}
-							}
-						}
-					}
-					else {
-						this.connectorcombo.select(0);
-						handleConnectorSelected();
-					}
-				}
-			}
-		}
-		catch(CoreException ce) {
-			//ignore
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#performApply(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-	 */
-	public void performApply(ILaunchConfigurationWorkingCopy configuration) {
-		Connector connector = getSelectedConnector();
-		if(connector != null) {
-			configuration.setAttribute(ILaunchConstants.CONNECTOR_ID, connector.id());
-			Entry entry = null;
-			FieldEditor editor = null;
-			String key = null;
-			HashMap argmap = new HashMap();
-			Argument argument = null;
-			for (Iterator iter = this.editormap.entrySet().iterator(); iter.hasNext();) {
-				entry = (Entry) iter.next();
-				editor = (FieldEditor) entry.getValue();
-				if(!editor.isValid()) {
-					return;
-				}
-				key = (String) entry.getKey();
-				argument = (Argument) connector.defaultArguments().get(key);
-				if(argument == null) {
-					continue;
-				}
-				editor.store();
-				if (argument instanceof StringArgument || argument instanceof SelectedArgument) {
-					argmap.put(key, editor.getPreferenceStore().getString(key));
-				}
-				else if (argument instanceof BooleanArgument) {
-					argmap.put(key, Boolean.valueOf(editor.getPreferenceStore().getBoolean(key)).toString());
-				} 
-				else if (argument instanceof IntegerArgument) {
-					argmap.put(key, new Integer(editor.getPreferenceStore().getInt(key)).toString());
-				}
-			}
-			configuration.setAttribute(ILaunchConstants.ARGUMENT_MAP, argmap);
-		}
-		else {
-			configuration.removeAttribute(ILaunchConstants.ARGUMENT_MAP);
-			configuration.removeAttribute(ILaunchConstants.CONNECTOR_ID);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTab#setDefaults(org.eclipse.debug.core.ILaunchConfigurationWorkingCopy)
-	 */
-	public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
-		List connectors = JavaScriptDebugPlugin.getConnectionsManager().getConnectors();
-		if(!connectors.isEmpty()) {
-			configuration.setAttribute(ILaunchConstants.CONNECTOR_ID, ((Connector)connectors.get(0)).id());
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-	 */
-	public void propertyChange(PropertyChangeEvent event) {
-		updateLaunchConfigurationDialog();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/launching/JavascriptTabGroup.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/launching/JavascriptTabGroup.java
deleted file mode 100644
index e2de0d1..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/launching/JavascriptTabGroup.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.launching;
-
-import org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup;
-import org.eclipse.debug.ui.CommonTab;
-import org.eclipse.debug.ui.EnvironmentTab;
-import org.eclipse.debug.ui.ILaunchConfigurationDialog;
-import org.eclipse.debug.ui.ILaunchConfigurationTab;
-import org.eclipse.debug.ui.sourcelookup.SourceLookupTab;
-import org.eclipse.wst.jsdt.debug.internal.ui.IHelpContextIds;
-
-/**
- * Default tab group for JavaScript debugging
- * 
- * @since 1.0
- */
-public class JavascriptTabGroup extends AbstractLaunchConfigurationTabGroup {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.ui.ILaunchConfigurationTabGroup#createTabs(org.eclipse.debug.ui.ILaunchConfigurationDialog, java.lang.String)
-	 */
-	public void createTabs(ILaunchConfigurationDialog dialog, String mode) {
-		SourceLookupTab slt = new SourceLookupTab();
-		slt.setHelpContextId(IHelpContextIds.SOURCE_LOOKUP_TAB);
-		EnvironmentTab et = new EnvironmentTab();
-		et.setHelpContextId(IHelpContextIds.ENVIRONMENT_TAB);
-		CommonTab ct = new CommonTab();
-		ct.setHelpContextId(IHelpContextIds.COMMON_TAB);
-		ILaunchConfigurationTab[] tabs = new ILaunchConfigurationTab[] {
-				new JavaScriptConnectTab(),
-				slt,
-				et,
-				ct
-		};
-		setTabs(tabs);
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/messages.properties b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/messages.properties
deleted file mode 100644
index d126e3d..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/messages.properties
+++ /dev/null
@@ -1,52 +0,0 @@
-###############################################################################
-# Copyright (c) 2010, 2011 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-add_script_load_bp=Add Script Load Breakpoint
-bp_conditional=\ [conditional]
-bp_conditonal=\ [conditional]
-bp_entry_and_exit=\ [entry and exit]
-bp_entry_only=\ [entry]
-bp_exit_only=\ [exit]
-bp_hit_count=\ [hit count: {0}]
-bp_line_number=\ [line: {0}]
-bp_suspend_vm=\ [Suspend Target]
-breakpoint_configuration=Breakpoint configuration
-connect=Connect
-connector=Connector
-connector_properties=Connector Properties
-creating_script_load_bp=Creating Script Load Breakpoint...
-disconnected=<disconnected>
-enable_hit_count=Enable &Hit Count
-enter_new_hit_count=&Enter the new hit count for the breakpoint:
-evald_script=<evaluated script>
-exception_occurred_setting_bp_properties=Exceptions occurred attempting to modify breakpoint.
-hit_count_must_be_positive=Hit count must be a positive integer
-JavaScriptModelPresentation_stackframe_name_with_fname={0} {1}() line: {2}
-no_description_provided=No description provided.
-opening_source__0=Opening Source: {0}
-running_state=running
-scripts=Scripts
-select_javascript_file=Select a JavaScript script file
-set_bp_hit_count=Set Breakpoint Hit Count
-stackframe_name={0} line: {1}
-stepping_state=stepping
-suspend_loading_script=suspended loading script: {0}
-suspend_target=&Suspend Target
-suspend_thread=&Suspend Thread
-suspended_on_exception=suspended on exception: {0}
-suspended_on_func_breakpoint=suspended at breakpoint on function {0} in {1}
-suspended_on_line_breakpoint=suspended at breakpoint on line {0} in {1}
-suspended_state=suspended
-terminated=<terminated>
-terminated_state=terminated
-the_argument_0_is_not_valid=The specified argument: {0} is not valid
-thread_name=Thread [{0}] ({1})
-unknown=<unknown>
-unknown_state=<unknown state>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/preferences/JavaScriptDebugPreferencePage.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/preferences/JavaScriptDebugPreferencePage.java
deleted file mode 100644
index 04e4a5e..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/preferences/JavaScriptDebugPreferencePage.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.preferences;
-
-import org.eclipse.jface.preference.BooleanFieldEditor;
-import org.eclipse.jface.preference.FieldEditor;
-import org.eclipse.jface.preference.FieldEditorPreferencePage;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.jsdt.debug.internal.core.Constants;
-import org.eclipse.wst.jsdt.debug.internal.ui.IHelpContextIds;
-import org.eclipse.wst.jsdt.debug.internal.ui.JavaScriptDebugUIPlugin;
-import org.eclipse.wst.jsdt.debug.internal.ui.SWTFactory;
-
-/**
- * Default preference page for JavaScript debugging
- * @since 1.1
- */
-public class JavaScriptDebugPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
-
-	public static final String PAGE_ID = "org.eclipse.wst.jsdt.debug.ui.debug.page"; //$NON-NLS-1$
-	
-	/**
-	 * Constructor
-	 */
-	public JavaScriptDebugPreferencePage() {
-		super(GRID);
-		setPreferenceStore(JavaScriptDebugUIPlugin.getCorePreferenceStore());
-		setDescription(Messages.js_debug_pref_page_desc);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
-	 */
-	public void init(IWorkbench workbench) {}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		super.createControl(parent);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, IHelpContextIds.DEBUG_PREFERENCE_PAGE);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		Composite comp = SWTFactory.createComposite(parent, parent.getFont(), 1, 1, GridData.FILL_HORIZONTAL, 0, 0);
-		//General
-		Group group = SWTFactory.createGroup(comp, Messages.general, 1, 1, GridData.FILL_HORIZONTAL);
-		BooleanFieldEditor editor = new BooleanFieldEditor(Constants.DELETE_EXT_PROJECT_ON_EXIT, Messages.delete_ext_project_on_exit, group);
-		initEditor(editor, JavaScriptDebugUIPlugin.getCorePreferenceStore());
-		initGroup(group);
-		//Suspend Execution
-		group = SWTFactory.createGroup(comp, Messages.suspend_execution, 1, 1, GridData.FILL_HORIZONTAL);
-		editor = new BooleanFieldEditor(Constants.SUSPEND_ON_ALL_SCRIPT_LOADS, Messages.suspend_for_all_script_loads, group);
-		initEditor(editor, JavaScriptDebugUIPlugin.getCorePreferenceStore());
-		editor = new BooleanFieldEditor(Constants.SUSPEND_ON_THROWN_EXCEPTION, Messages.suspend_on_exceptions, group);
-		initEditor(editor, JavaScriptDebugUIPlugin.getCorePreferenceStore());
-		initGroup(group);
-		return comp;
-	}
-
-	/**
-	 * Refreshes the specified group to re-set the default spacings that have been 
-	 * trashed by the field editors
-	 * 
-	 * @param group
-	 */
-	void initGroup(Group group) {
-		GridData gd = (GridData) group.getLayoutData();
-		gd.grabExcessHorizontalSpace = true;
-		GridLayout lo = (GridLayout) group.getLayout();
-		lo.marginWidth = 5;
-		lo.marginHeight = 5;
-	}
-	
-	/**
-	 * Initializes and sets up the given editor
-	 * 
-	 * @param editor
-	 * @param store
-	 */
-	void initEditor(FieldEditor editor, IPreferenceStore store) {
-		addField(editor);
-		editor.setPage(this);
-		editor.setPropertyChangeListener(this);
-		editor.setPreferenceStore(store);
-		editor.load();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.FieldEditorPreferencePage#createFieldEditors()
-	 */
-	protected void createFieldEditors() {}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/preferences/Messages.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/preferences/Messages.java
deleted file mode 100644
index fb9025c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/preferences/Messages.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.preferences;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.internal.ui.preferences.messages"; //$NON-NLS-1$
-	public static String delete_ext_project_on_exit;
-	public static String general;
-	public static String js_debug_pref_page_desc;
-	public static String suspend_execution;
-	public static String suspend_for_all_script_loads;
-	public static String suspend_on_exceptions;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/preferences/messages.properties b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/preferences/messages.properties
deleted file mode 100644
index ee00014..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/preferences/messages.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-general=General
-###############################################################################
-# Copyright (c) 2010 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-delete_ext_project_on_exit=Delete the 'E&xternal JavaScript Source' project on workbench shutdown
-js_debug_pref_page_desc=General settings for JavaScript debugging
-suspend_execution=Suspend Execution
-suspend_for_all_script_loads=Suspend for all script &loads
-suspend_on_exceptions=Suspend on JavaScript e&xceptions
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/source/JavaScriptSourceViewer.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/source/JavaScriptSourceViewer.java
deleted file mode 100644
index 5a83992..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/source/JavaScriptSourceViewer.java
+++ /dev/null
@@ -1,299 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.source;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferenceConverter;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.contentassist.IContentAssistant;
-import org.eclipse.jface.text.source.IOverviewRuler;
-import org.eclipse.jface.text.source.IVerticalRuler;
-import org.eclipse.jface.text.source.SourceViewer;
-import org.eclipse.jface.text.source.SourceViewerConfiguration;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.texteditor.AbstractTextEditor;
-import org.eclipse.wst.jsdt.debug.internal.ui.display.JavaScriptDebugViewerConfiguration;
-
-/**
- * A source viewer configured to display JavaScript source. This
- * viewer obeys the font and color preferences specified in
- * the JavaScript UI plugin.
- */
-public class JavaScriptSourceViewer extends SourceViewer implements IPropertyChangeListener {
-	
-	private Font fFont;
-	private Color fBackgroundColor;
-	private Color fForegroundColor;
-	private IPreferenceStore fStore;
-	private JavaScriptDebugViewerConfiguration fConfiguration;
-
-
-	/**
-	 * Constructor
-	 * @param parent
-	 * @param ruler
-	 * @param styles
-	 */
-	public JavaScriptSourceViewer(Composite parent, IVerticalRuler ruler, int styles) {
-		this(parent, ruler, null, false, styles | SWT.LEFT_TO_RIGHT);
-	}
-
-	/**
-	 * Constructor
-	 * @param parent
-	 * @param ruler
-	 * @param overviewRuler
-	 * @param isOverviewRulerVisible
-	 * @param styles
-	 */
-	public JavaScriptSourceViewer(Composite parent, IVerticalRuler ruler, IOverviewRuler overviewRuler, boolean isOverviewRulerVisible, int styles) {
-		super(parent, ruler, overviewRuler, isOverviewRulerVisible, styles | SWT.LEFT_TO_RIGHT);
-	}
-	
-	/**
-	 * Updates the viewer's font to match the preferences.
-	 */
-	private void updateViewerFont() {
-		IPreferenceStore store= getPreferenceStore();
-		if (store != null) {
-			FontData data= null;
-			if (store.contains(JFaceResources.TEXT_FONT) && !store.isDefault(JFaceResources.TEXT_FONT)) {
-				data= PreferenceConverter.getFontData(store, JFaceResources.TEXT_FONT);
-			} else {
-				data= PreferenceConverter.getDefaultFontData(store, JFaceResources.TEXT_FONT);
-			}
-			if (data != null) {
-				Font font= new Font(getTextWidget().getDisplay(), data);
-				applyFont(font);
-				if (getFont() != null) {
-					getFont().dispose();
-				}
-				setFont(font);
-				return;
-			}
-		}
-		// if all the preferences failed
-		applyFont(JFaceResources.getTextFont());
-	}
-	
-	/**
-	 * Sets the current font.
-	 * 
-	 * @param font the new font
-	 */
-	private void setFont(Font font) {
-		fFont = font;
-	}
-	
-	/**
-	 * Returns the current font.
-	 * 
-	 * @return the current font
-	 */
-	private Font getFont() {
-		return fFont;
-	}
-	
-	/**
-	 * Sets the font for the given viewer sustaining selection and scroll position.
-	 * 
-	 * @param font the font
-	 */
-	private void applyFont(Font font) {
-		IDocument doc= getDocument();
-		if (doc != null && doc.getLength() > 0) {
-			Point selection= getSelectedRange();
-			int topIndex= getTopIndex();
-			
-			StyledText styledText= getTextWidget();
-			styledText.setRedraw(false);
-			
-			styledText.setFont(font);
-			setSelectedRange(selection.x , selection.y);
-			setTopIndex(topIndex);
-			
-			styledText.setRedraw(true);
-		} else {
-			getTextWidget().setFont(font);
-		}
-	}
-	
-	/**
-	 * Updates the given viewer's colors to match the preferences.
-	 */
-	public void updateViewerColors() {
-		IPreferenceStore store= getPreferenceStore();
-		if (store != null) {
-			StyledText styledText= getTextWidget();
-			Color color= store.getBoolean(AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND_SYSTEM_DEFAULT)
-				? null
-				: createColor(store, AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND, styledText.getDisplay());
-			styledText.setForeground(color);
-			if (getForegroundColor() != null) {
-				getForegroundColor().dispose();
-			}
-			setForegroundColor(color);
-			
-			color= store.getBoolean(AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT)
-				? null
-				: createColor(store, AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND, styledText.getDisplay());
-			styledText.setBackground(color);
-			if (getBackgroundColor() != null) {
-				getBackgroundColor().dispose();
-			}
-			setBackgroundColor(color);
-		}
-	}
-	
-	/**
-	 * Creates a color from the information stored in the given preference store.
-	 * Returns <code>null</code> if there is no such information available.
-	 */
-	private Color createColor(IPreferenceStore store, String key, Display display) {
-		RGB rgb = null;
-		if (store.contains(key)) {
-			if (store.isDefault(key)) {
-				rgb= PreferenceConverter.getDefaultColor(store, key);
-			} else {
-				rgb= PreferenceConverter.getColor(store, key);
-			}
-			if (rgb != null) {
-				return new Color(display, rgb);
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns the current background color.
-	 * 
-	 * @return the current background color
-	 */
-	protected Color getBackgroundColor() {
-		return fBackgroundColor;
-	}
-
-	/**
-	 * Sets the current background color.
-	 * 
-	 * @param backgroundColor the new background color
-	 */
-	protected void setBackgroundColor(Color backgroundColor) {
-		fBackgroundColor = backgroundColor;
-	}
-
-	/**
-	 * Returns the current foreground color.
-	 * 
-	 * @return the current foreground color
-	 */
-	protected Color getForegroundColor() {
-		return fForegroundColor;
-	}
-
-	/**
-	 * Sets the current foreground color.
-	 * 
-	 * @param foregroundColor the new foreground color
-	 */
-	protected void setForegroundColor(Color foregroundColor) {
-		fForegroundColor = foregroundColor;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-	 */
-	public void propertyChange(PropertyChangeEvent event) {
-		String property= event.getProperty();
-		
-		if (JFaceResources.TEXT_FONT.equals(property)) {
-			updateViewerFont();
-		}
-		if (AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND.equals(property) || AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND_SYSTEM_DEFAULT.equals(property) ||
-			AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND.equals(property) ||	AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT.equals(property)) {
-			updateViewerColors();
-		}
-		if (fConfiguration != null) {
-			if (fConfiguration.affectsTextPresentation(event)) {
-				fConfiguration.handlePropertyChangeEvent(event);
-				invalidateTextPresentation();
-			}
-		}
-	}
-	
-	/**
-	 * Returns the current content assistant.
-	 * 
-	 * @return the current content assistant
-	 */
-	public IContentAssistant getContentAssistant() {
-		return fContentAssistant;
-	}
-
-	/**
-	 * Disposes the system resources currently in use by this viewer.
-	 */
-	public void dispose() {
-		if (getFont() != null) {
-			getFont().dispose();
-			setFont(null);
-		}
-		if (getBackgroundColor() != null) {
-			getBackgroundColor().dispose();
-			setBackgroundColor(null);
-		}
-		if (getForegroundColor() != null) {
-			getForegroundColor().dispose();
-			setForegroundColor(null);
-		}
-		if (fStore != null) {
-			fStore.removePropertyChangeListener(this);
-			fStore = null;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.source.SourceViewer#configure(org.eclipse.jface.text.source.SourceViewerConfiguration)
-	 */
-	public void configure(SourceViewerConfiguration configuration) {
-		super.configure(configuration);
-		if (fStore != null) {
-			fStore.removePropertyChangeListener(this);
-			fStore = null;
-		}
-		if (configuration instanceof JavaScriptDebugViewerConfiguration) {
-			fConfiguration = (JavaScriptDebugViewerConfiguration) configuration;
-			fStore = fConfiguration.getTextPreferenceStore();
-			fStore.addPropertyChangeListener(this);
-		}
-		updateViewerFont();
-		updateViewerColors();
-	}
-
-	/**
-	 * Returns the preference store used to configure this source viewer or
-	 * <code>null</code> if none;
-	 */
-	private IPreferenceStore getPreferenceStore() {
-		return fStore;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/source/contentassist/JavaScriptContentAssistProcessor.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/source/contentassist/JavaScriptContentAssistProcessor.java
deleted file mode 100644
index f42af12..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/source/contentassist/JavaScriptContentAssistProcessor.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.source.contentassist;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.jface.text.contentassist.IContextInformation;
-import org.eclipse.jface.text.contentassist.IContextInformationValidator;
-import org.eclipse.jface.text.templates.TemplateContextType;
-import org.eclipse.wst.jsdt.core.IJavaScriptProject;
-import org.eclipse.wst.jsdt.core.ITypeRoot;
-import org.eclipse.wst.jsdt.internal.corext.template.java.JavaContextType;
-import org.eclipse.wst.jsdt.internal.ui.JavaScriptPlugin;
-import org.eclipse.wst.jsdt.internal.ui.text.java.JavaParameterListValidator;
-import org.eclipse.wst.jsdt.internal.ui.text.template.contentassist.TemplateEngine;
-import org.eclipse.wst.jsdt.ui.text.java.CompletionProposalCollector;
-import org.eclipse.wst.jsdt.ui.text.java.CompletionProposalComparator;
-import org.eclipse.wst.jsdt.ui.text.java.IJavaCompletionProposal;
-
-/**
- * Completion processor for the JavaScript debugger. This completion processor
- * operates on a client provided context.
- * 
- * @since 1.0
- */
-public class JavaScriptContentAssistProcessor implements IContentAssistProcessor {
-		
-	private CompletionProposalCollector fCollector;
-	private IContextInformationValidator fValidator;
-	private TemplateEngine fJavaEngine;
-	private TemplateEngine fStatementEngine;
-    private String fErrorMessage = null;
-	
-	private char[] fProposalAutoActivationSet;
-	private CompletionProposalComparator fComparator;
-	private ScriptContext fContext;
-		
-	/**
-	 * Constructor
-	 * @param context
-	 */
-	public JavaScriptContentAssistProcessor(ScriptContext context) {
-		fContext = context;
-		TemplateContextType contextType = JavaScriptPlugin.getDefault().getTemplateContextRegistry().getContextType(JavaContextType.NAME);
-		if (contextType != null) {
-			fJavaEngine = new TemplateEngine(contextType);
-		}
-		contextType = JavaScriptPlugin.getDefault().getTemplateContextRegistry().getContextType(JavaContextType.NAME);
-		if (contextType != null) {
-			fStatementEngine = new TemplateEngine(contextType);
-		}
-		
-		fComparator = new CompletionProposalComparator();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getErrorMessage()
-	 */
-	public String getErrorMessage() {
-        if (fErrorMessage != null) {
-            return fErrorMessage;
-        }
-        if (fCollector != null) {
-            return fCollector.getErrorMessage();
-        }
-        return null;
-	}
-    
-    /**
-     * Sets the error message for why completions could not be resolved.
-     * Clients should clear this before computing completions.
-     * 
-     * @param string message
-     */
-    private void setErrorMessage(String string) {
-    	String error = string;
-    	if (error != null && error.length() == 0) {
-			error = null;
-		}
-        fErrorMessage = error;
-    }
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getContextInformationValidator()
-	 */
-	public IContextInformationValidator getContextInformationValidator() {
-		if (fValidator == null) {
-			fValidator= new JavaParameterListValidator();
-		}
-		return fValidator;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getContextInformationAutoActivationCharacters()
-	 */
-	public char[] getContextInformationAutoActivationCharacters() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#computeContextInformation(org.eclipse.jface.text.ITextViewer, int)
-	 */
-	public IContextInformation[] computeContextInformation(ITextViewer viewer, int offset) {
-		return null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#computeCompletionProposals(org.eclipse.jface.text.ITextViewer, int)
-	 */
-	public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int documentOffset) {
-        setErrorMessage(null);
-		try {
-			List total = new ArrayList();
-			ITypeRoot root = fContext.getJavaScriptRoot();
-			if(root != null) {
-				IJavaScriptProject project = root.getJavaScriptProject();
-				ITextSelection selection= (ITextSelection)viewer.getSelectionProvider().getSelection();
-				configureResultCollector(project, selection);	
-				root.codeComplete(documentOffset, fCollector);
-				total.addAll(Arrays.asList(fCollector.getJavaCompletionProposals()));
-			}
-			if (fJavaEngine != null) {
-				fJavaEngine.reset();
-				fJavaEngine.complete(viewer, documentOffset, null);
-				total.addAll(Arrays.asList(fJavaEngine.getResults()));
-			}
-			
-			if (fStatementEngine != null) {
-				fStatementEngine.reset();
-				fStatementEngine.complete(viewer, documentOffset, null);
-				total.addAll(Arrays.asList(fStatementEngine.getResults()));
-			}
-			return order((IJavaCompletionProposal[])total.toArray(new IJavaCompletionProposal[total.size()]));	
-		} catch (CoreException x) {
-			setErrorMessage(x.getStatus().getMessage());
-		} finally {
-			releaseCollector();
-		}
-		
-		return null;
-	}
-	
-	/**
-	 * Order the given proposals.
-	 */
-	private IJavaCompletionProposal[] order(IJavaCompletionProposal[] proposals) {
-		Arrays.sort(proposals, fComparator);
-		return proposals;	
-	}	
-	
-	/**
-	 * Configures the display result collection for the current code assist session
-	 */
-	private void configureResultCollector(IJavaScriptProject project, ITextSelection selection) {
-		fCollector = new CompletionProposalCollector(project);
-		if (selection.getLength() != 0) {
-			fCollector.setReplacementLength(selection.getLength());
-		} 
-	}
-	
-	/**
-	 * Tells this processor to order the proposals alphabetically.
-	 * 
-	 * @param order <code>true</code> if proposals should be ordered.
-	 */
-	public void orderProposalsAlphabetically(boolean order) {
-		fComparator.setOrderAlphabetically(order);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#getCompletionProposalAutoActivationCharacters()
-	 */
-	public char[] getCompletionProposalAutoActivationCharacters() {
-		return fProposalAutoActivationSet;
-	}
-	
-	/**
-	 * Sets this processor's set of characters triggering the activation of the
-	 * completion proposal computation.
-	 * 
-	 * @param activationSet the activation set
-	 */
-	public void setCompletionProposalAutoActivationCharacters(char[] activationSet) {
-		fProposalAutoActivationSet= activationSet;
-	}
-	
-	/**
-	 * Clears reference to result proposal collector.
-	 */
-	private void releaseCollector() {
-		if (fCollector != null && fCollector.getErrorMessage().length() > 0 && fErrorMessage != null) {
-			setErrorMessage(fCollector.getErrorMessage());
-		}		
-		fCollector = null;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/source/contentassist/ScriptContext.java b/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/source/contentassist/ScriptContext.java
deleted file mode 100644
index f18ddcf..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/source/contentassist/ScriptContext.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.ui.source.contentassist;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.wst.jsdt.core.ITypeRoot;
-
-/**
- * Code completion for a JavaScript {@link ITypeRoot} (script)
- * 
- * @since 1.0
- */
-public class ScriptContext {
-	
-	private ITypeRoot fUnit;
-	private int fOffset;
-	
-	/**
-	 * Constructs a completion context on the given type.
-	 * 
-	 * @param root the JavaScript root in which to perform completions
-	 * @param offset position in source to perform completions or -1
-	 */
-	public ScriptContext(ITypeRoot root, int offset) {
-		fUnit = root;
-		fOffset = offset;
-	}
-
-	/**
-	 * Returns the {@link ITypeRoot} for this context.
-	 * An {@link ITypeRoot} can be a class file (binary) or 
-	 * a compilation unit (source). This method can return
-	 * <code>null</code> if not 
-	 * 
-	 * @return the {@link ITypeRoot} backing this context or <code>null</code>
-	 * @throws CoreException
-	 */
-	public ITypeRoot getJavaScriptRoot() throws CoreException {
-		return fUnit;
-	}
-
-	/**
-	 * Returns the computed insertion position for this context.<br>
-	 * <br>
-	 * This is typically the offset into the backing root
-	 * @return the 
-	 */
-	public int getOffset() {
-		return fOffset;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/.classpath b/development/org.eclipse.wst.jsdt.debug.chrome/.classpath
deleted file mode 100644
index 2fbb7a2..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/.options b/development/org.eclipse.wst.jsdt.debug.chrome/.options
deleted file mode 100644
index d69be5d..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/.options
+++ /dev/null
@@ -1,25 +0,0 @@
-###############################################################################
-# Copyright (c) 2010 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-
-#option file for tracing options for Google Chrome debugger port
-org.eclipse.wst.jsdt.debug.chrome/debug=true
-
-#option to trace packets being sent / received
-org.eclipse.wst.jsdt.debug.chrome/packets=false
-
-#option to trace the event queue
-org.eclipse.wst.jsdt.debug.chrome/eventqueue=false
-
-#option to trace the jsdi impl* elements
-org.eclipse.wst.jsdt.debug.chrome/jsdi=false
-
-#option to trace the JSON parser
-org.eclipse.wst.jsdt.debug.chrome/json=false
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/.project b/development/org.eclipse.wst.jsdt.debug.chrome/.project
deleted file mode 100644
index 53bcdb0..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.jsdt.debug.internal.chrome</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/.settings/org.eclipse.jdt.core.prefs b/development/org.eclipse.wst.jsdt.debug.chrome/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index de9eac3..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,90 +0,0 @@
-#Fri Apr 30 10:04:28 CDT 2010
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
-org.eclipse.jdt.core.compiler.problem.deadCode=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=error
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=error
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=error
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=error
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/META-INF/MANIFEST.MF b/development/org.eclipse.wst.jsdt.debug.chrome/META-INF/MANIFEST.MF
deleted file mode 100644
index f703984..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,12 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Bundle-Name
-Bundle-SymbolicName: org.eclipse.wst.jsdt.debug.chrome;singleton:=true
-Bundle-Version: 1.0.100.qualifier
-Bundle-Activator: org.eclipse.wst.jsdt.debug.internal.chrome.ChromePlugin
-Bundle-Vendor: %Bundle-Vendor
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.wst.jsdt.debug.core;bundle-version="1.0.100",
- org.eclipse.wst.jsdt.debug.transport;bundle-version="1.0.0"
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
-Bundle-ActivationPolicy: lazy
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/OSGI-INF/l10n/bundle.properties b/development/org.eclipse.wst.jsdt.debug.chrome/OSGI-INF/l10n/bundle.properties
deleted file mode 100644
index 41f01af..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/OSGI-INF/l10n/bundle.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2010 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-Bundle-Vendor = Eclipse Web Tools Platform
-Bundle-Name = v8 JavaScript Debug
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/build.properties b/development/org.eclipse.wst.jsdt.debug.chrome/build.properties
deleted file mode 100644
index 4d46c90..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/build.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-###############################################################################
-# Copyright (c) 2011 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               OSGI-INF/l10n/bundle.properties,\
-               plugin.xml,\
-               OSGI-INF/
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/plugin.xml b/development/org.eclipse.wst.jsdt.debug.chrome/plugin.xml
deleted file mode 100644
index 8f3fd54..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/plugin.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-<plugin>
-   <extension
-         point="org.eclipse.wst.jsdt.debug.core.launchingConnectors">
-      <connector
-            class="org.eclipse.wst.jsdt.debug.internal.chrome.connect.ChromeAttachingConnector"
-            id="org.eclipse.wst.jsdt.debug.chrome.connector.attach">
-      </connector>
-   </extension>
-
-</plugin>
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/ChromePlugin.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/ChromePlugin.java
deleted file mode 100644
index b0b4d9b..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/ChromePlugin.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.wst.jsdt.debug.internal.chrome.event.EventQueueImpl;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.MirrorImpl;
-import org.eclipse.wst.jsdt.debug.internal.chrome.transport.PacketImpl;
-import org.eclipse.wst.jsdt.debug.internal.chrome.transport.JSON;
-import org.osgi.framework.BundleContext;
-
-public class ChromePlugin extends Plugin {
-
-	/**
-	 * Id of the bundle
-	 */
-	public static final String PLUGIN_ID = "org.eclipse.wst.jsdt.debug.chrome"; //$NON-NLS-1$
-	/**
-	 * PacketImpl tracing option name
-	 */
-	public static final String TRC_PACKETS = PLUGIN_ID + "/packets"; //$NON-NLS-1$
-	/**
-	 * ChromeEvent queue tracing option name
-	 */
-	public static final String TRC_EVENTQUEUE = PLUGIN_ID + "/eventqueue"; //$NON-NLS-1$
-	/**
-	 * JSDI implementation tracing option name
-	 */
-	public static final String TRC_JSDI = PLUGIN_ID + "/jsdi"; //$NON-NLS-1$
-	/**
-	 * JSON parser tracing option
-	 */
-	public static final String TRC_JSON = PLUGIN_ID + "/json"; //$NON-NLS-1$
-	/**
-	 * Status code indicating an unexpected internal error.
-	 */
-	public static final int INTERNAL_ERROR = 120;
-	
-	/**
-	 * Singleton instance
-	 */
-	private static ChromePlugin plugin = null;
-	
-	/**
-	 * @return the singleton plugin instance
-	 */
-	public static ChromePlugin getDefault() {
-		return plugin;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext bundleContext) throws Exception {
-		super.start(bundleContext);
-		plugin = this;
-		configureTracing();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext bundleContext) throws Exception {
-		try {
-			plugin = null;
-		}
-		finally {
-			super.stop(bundleContext);
-		}
-	}
-
-	/**
-	 * Logs the specified status with this plug-in's log.
-	 * 
-	 * @param status status to log
-	 */
-	public static void log(IStatus status) {
-		if (plugin != null) {
-			plugin.getLog().log(status);
-		}
-	}
-
-	/**
-	 * Logs the specified throwable with this plug-in's log.
-	 * 
-	 * @param t throwable to log 
-	 */
-	public static void log(Throwable t) {
-		log(newErrorStatus("Error logged from Google Chrome Debug: ", t)); //$NON-NLS-1$
-	}
-	
-	/**
-	 * Logs an internal error with the specified message.
-	 * 
-	 * @param message the error message to log
-	 */
-	public static void logErrorMessage(String message) {
-		log(newErrorStatus("Internal message logged from Google Chrome Debug: " + message, null)); //$NON-NLS-1$	
-	}
-	
-	/**
-	 * Returns a new error status for this plug-in with the given message
-	 * @param message the message to be included in the status
-	 * @param exception the exception to be included in the status or <code>null</code> if none
-	 * @return a new error status
-	 */
-	public static IStatus newErrorStatus(String message, Throwable exception) {
-		return new Status(IStatus.ERROR, PLUGIN_ID, INTERNAL_ERROR, message, exception);
-	}
-
-	/**
-	 * Turns on / off any tracing options
-	 */
-	public void configureTracing() {
-		if(ChromePlugin.getDefault().isDebugging()) {
-			String option = Platform.getDebugOption(TRC_PACKETS);
-			if(option != null) {
-				PacketImpl.setTracing(Boolean.valueOf(option).booleanValue());
-			}
-			option = Platform.getDebugOption(TRC_EVENTQUEUE);
-			if(option != null) {
-				EventQueueImpl.setTracing(Boolean.valueOf(option).booleanValue());
-			}
-			option = Platform.getDebugOption(TRC_JSDI);
-			if(option != null) {
-				MirrorImpl.setTracing(Boolean.valueOf(option).booleanValue());
-			}
-			option = Platform.getDebugOption(TRC_JSON);
-			if(option != null) {
-				JSON.setTracing(Boolean.valueOf(option).booleanValue());
-			}
-		}
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/Tracing.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/Tracing.java
deleted file mode 100644
index efe751a..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/Tracing.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome;
-
-import org.eclipse.wst.jsdt.debug.internal.chrome.transport.JSON;
-
-/**
- * Helper class for common tracing functions
- * 
- * @since 1.0
- */
-public class Tracing {
-
-	public static final String PRINTABLE_LINE_FEED = "\\\\r\\\\n"; //$NON-NLS-1$
-	
-	/**
-	 * Writes the string to system out cleaning it of control chars before printing it
-	 * 
-	 * @param string
-	 */
-	public static void writeString(String string) {
-		System.out.println("[CHROME] " +string.replaceAll(JSON.LINE_FEED, PRINTABLE_LINE_FEED)); //$NON-NLS-1$
-	}
-	
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/BrowserArgument.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/BrowserArgument.java
deleted file mode 100644
index 00924a4..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/BrowserArgument.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.connect;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.BooleanArgument;
-
-/**
- * Option to automatically launch the browser and connect to it
- * 
- * @since 1.0
- */
-public class BrowserArgument implements BooleanArgument {
-
-	/**
-	 * name of the argument
-	 */
-	public static final String BROWSER = "browser"; //$NON-NLS-1$
-	
-	private boolean doit = false; 
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#description()
-	 */
-	public String description() {
-		return Messages.browser_arg_desc;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#label()
-	 */
-	public String label() {
-		return Messages.browser_arg_label;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#mustSpecify()
-	 */
-	public boolean mustSpecify() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#name()
-	 */
-	public String name() {
-		return BROWSER;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#setValue(java.lang.String)
-	 */
-	public void setValue(String value) {
-		doit = Boolean.valueOf(value).booleanValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#value()
-	 */
-	public String value() {
-		return Boolean.toString(doit);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.BooleanArgument#booleanValue()
-	 */
-	public boolean booleanValue() {
-		return doit;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.BooleanArgument#isValid(java.lang.String)
-	 */
-	public boolean isValid(String value) {
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.BooleanArgument#setValue(boolean)
-	 */
-	public void setValue(boolean booleanValue) {
-		doit = booleanValue;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/ChromeAttachingConnector.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/ChromeAttachingConnector.java
deleted file mode 100644
index 3d355a2..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/ChromeAttachingConnector.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.connect;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.AttachingConnector;
-import org.eclipse.wst.jsdt.debug.internal.chrome.ChromePlugin;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.VMImpl;
-import org.eclipse.wst.jsdt.debug.internal.chrome.transport.ChromeTransportService;
-import org.eclipse.wst.jsdt.debug.transport.Connection;
-import org.eclipse.wst.jsdt.debug.transport.DebugSession;
-import org.eclipse.wst.jsdt.debug.transport.TransportService;
-
-
-/**
- * Default attaching connector
- * 
- * @since 1.0
- */
-public class ChromeAttachingConnector implements AttachingConnector {
-
-	public static final String ID = "org.eclipse.wst.jsdt.debug.chrome.connector.attach"; //$NON-NLS-1$
-	
-	/**
-	 * Constructor
-	 */
-	public ChromeAttachingConnector() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#defaultArguments()
-	 */
-	public Map defaultArguments() {
-		Map args = new HashMap();
-		args.put(HostArgument.HOST, new HostArgument(null));
-		args.put(PortArgument.PORT, new PortArgument(9222));
-		args.put(TimeoutArgument.TIMEOUT, new TimeoutArgument());
-		args.put(BrowserArgument.BROWSER, new BrowserArgument());
-		return args;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#description()
-	 */
-	public String description() {
-		return Messages.attach_to_google_chrome;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#name()
-	 */
-	public String name() {
-		return Messages.google_chrome_attach;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#id()
-	 */
-	public String id() {
-		return ID;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.AttachingConnector#attach(java.util.Map)
-	 */
-	public VirtualMachine attach(Map arguments) throws IOException {
-		String str = (String)arguments.get(BrowserArgument.BROWSER);
-		Connection c = null;
-		if(Boolean.valueOf(str).booleanValue()) {
-			c = launchForBrowser(arguments);
-		}
-		else {
-			c = launch(arguments);
-		}
-		DebugSession session = new DebugSession(c);
-		return new VMImpl(session);
-	}
-	
-	/**
-	 * Launches the browser and connects to it. This method will poll for the browser to be launched
-	 * but only for a fixed timeout. 
-	 * @param arguments
-	 * @return the created connection or <code>null</code> if the attempt to connect times out, the browser process
-	 * terminates before we can connect  
-	 * @throws IOException 
-	 */
-	Connection launchForBrowser(Map arguments) throws IOException {
-		TransportService service = new ChromeTransportService();
-		String host = (String) arguments.get(HostArgument.HOST);
-		String port = (String) arguments.get(PortArgument.PORT);
-		StringBuffer buffer = new StringBuffer("/opt/google/chrome/chrome --remote-shell-port="); //$NON-NLS-1$
-		buffer.append(port);
-		Process proc = null;
-		try {
-			proc = Runtime.getRuntime().exec(buffer.toString());
-		} catch (IOException e) {
-			ChromePlugin.log(e);
-		}
-		String timeoutstr = (String) arguments.get(TimeoutArgument.TIMEOUT);
-		int timeout = Integer.parseInt(timeoutstr);
-		buffer = new StringBuffer();
-		buffer.append(host).append(':').append(Integer.parseInt(port));
-		Connection c = null;
-		long timer = System.currentTimeMillis() + 60000;
-		while(proc != null && System.currentTimeMillis() < timer && c == null) {
-			try {
-				c = service.attach(buffer.toString(), timeout, timeout);
-			}
-			catch(IOException ioe) {
-				//ignore while pinging to connect
-				try {
-					Thread.sleep(200);
-				} catch (InterruptedException e) {
-					e.printStackTrace();
-				}
-			}
-		}
-		if(c == null) {
-			throw new IOException(NLS.bind("Failed to attach to debugger at {0} on port {1}", new String[] {host, port})); //$NON-NLS-1$
-		}
-		return c;
-	}
-	
-	/**
-	 * Tries to connect to the given 
-	 * @param arguments
-	 * @return the {@link Connection} or throws an exception
-	 * @throws IOException
-	 */
-	Connection launch(Map arguments) throws IOException {
-		TransportService service = new ChromeTransportService();
-		String host = (String) arguments.get(HostArgument.HOST);
-		String port = (String) arguments.get(PortArgument.PORT);
-		String timeoutstr = (String) arguments.get(TimeoutArgument.TIMEOUT);
-		int timeout = Integer.parseInt(timeoutstr);
-		StringBuffer buffer = new StringBuffer();
-		buffer.append(host).append(':').append(Integer.parseInt(port));
-		return service.attach(buffer.toString(), timeout, timeout);
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/HostArgument.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/HostArgument.java
deleted file mode 100644
index 607ba3d..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/HostArgument.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.connect;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.StringArgument;
-import org.eclipse.wst.jsdt.debug.transport.Constants;
-
-/**
- * Implementation of a string argument that describes the host argument
- * 
- * @since 1.0
- */
-public class HostArgument implements StringArgument {
-
-	private static final long serialVersionUID = 3057403815318177030L;
-	private String host;
-
-	/**
-	 * Host attribute name
-	 */
-	public static final String HOST = "host"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 * 
-	 * @param host
-	 */
-	public HostArgument(String host) {
-		setValue(host);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#description()
-	 */
-	public String description() {
-		return Messages.host_arg_desc;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.StringArgument#isValid(java.lang.String)
-	 */
-	public boolean isValid(String value) {
-		return value != null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#label()
-	 */
-	public String label() {
-		return Messages.host_arg_label;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#mustSpecify()
-	 */
-	public boolean mustSpecify() {
-		return true;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#name()
-	 */
-	public String name() {
-		return HOST;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#setValue(java.lang.String)
-	 */
-	public void setValue(String host) {
-		if(host == null) {
-			this.host = Constants.LOCALHOST;
-		}
-		else {
-			if (!isValid(host)) {
-				throw new IllegalArgumentException();
-			}
-			this.host = host;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#value()
-	 */
-	public String value() {
-		return host;
-	}
-
-	/**
-	 * Returns if the given host is <code>localhost</code> or <code>127.0.0.1</code>
-	 * @param host
-	 * @return true if the given host it localhost (127.0.0.1) false otherwise
-	 */
-	public static boolean isLocalhost(String host) {
-		return host.equals(Constants.LOCALHOST) || host.equals(Constants.LOCALHOST_IP);
-	}
-}
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/Messages.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/Messages.java
deleted file mode 100644
index e68037e..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/Messages.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.connect;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.internal.chrome.connect.messages"; //$NON-NLS-1$
-	public static String attach_to_google_chrome;
-	public static String browser_arg_desc;
-	public static String browser_arg_label;
-	public static String google_chrome_attach;
-	public static String host_arg_desc;
-	public static String host_arg_label;
-	public static String port_arg_desc;
-	public static String port_arg_label;
-	public static String timeout_arg_desc;
-	public static String timeout_arg_label;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/PortArgument.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/PortArgument.java
deleted file mode 100644
index 7e6fe05..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/PortArgument.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.connect;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument;
-
-/**
- * Implementation of an {@link IntegerArgument} that describes the port to try connecting to
- * 
- * @since 1.0
- */
-public class PortArgument implements IntegerArgument {
-
-	private static final long serialVersionUID = -1954469572907116388L;
-	private int port;
-
-	/**
-	 * The port attribute name
-	 */
-	public static final String PORT = "port"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 * 
-	 * @param port
-	 */
-	public PortArgument(int port) {
-		setValue(port);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#intValue()
-	 */
-	public int intValue() {
-		return port;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#isValid(int)
-	 */
-	public boolean isValid(int intValue) {
-		return intValue > 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#max()
-	 */
-	public int max() {
-		return Integer.MAX_VALUE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#min()
-	 */
-	public int min() {
-		return 1;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#setValue(int)
-	 */
-	public void setValue(int port) {
-		this.port = port;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#description()
-	 */
-	public String description() {
-		return Messages.port_arg_desc;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#isValid(java.lang.String)
-	 */
-	public boolean isValid(String value) {
-		try {
-			int intValue = Integer.parseInt(value);
-			return isValid(intValue);
-		} catch (NumberFormatException e) {
-			return false;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#label()
-	 */
-	public String label() {
-		return Messages.port_arg_label;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#mustSpecify()
-	 */
-	public boolean mustSpecify() {
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#name()
-	 */
-	public String name() {
-		return PORT;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#setValue(java.lang.String)
-	 */
-	public void setValue(String value) {
-		try {
-			int intValue = Integer.parseInt(value);
-			setValue(intValue);
-		} catch (NumberFormatException nfe) {
-			// re-throw IllegalArgumentException
-			throw new IllegalArgumentException(nfe.getMessage());
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#value()
-	 */
-	public String value() {
-		return Integer.toString(port);
-	}
-}
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/TimeoutArgument.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/TimeoutArgument.java
deleted file mode 100644
index 2d84a7a..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/TimeoutArgument.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.connect;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument;
-
-/**
- * Argument used to specify a timeout (in ms)
- * 
- * @since 1.1
- */
-public class TimeoutArgument implements IntegerArgument {
-	
-	/**
-	 * Argument to specify a timeout
-	 */
-	public static final String TIMEOUT = "timeout"; //$NON-NLS-1$
-	/**
-	 * default connecting timeout
-	 */
-	public static final Integer CONNECT_TIMEOUT = new Integer(30000);
-	
-	/**
-	 * The timeout
-	 */
-	private int timeout = 0;
-	
-	/**
-	 * Constructor
-	 */
-	public TimeoutArgument() {
-		setValue(CONNECT_TIMEOUT.intValue());
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#description()
-	 */
-	public String description() {
-		return Messages.timeout_arg_desc;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#label()
-	 */
-	public String label() {
-		return Messages.timeout_arg_label;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#mustSpecify()
-	 */
-	public boolean mustSpecify() {
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#name()
-	 */
-	public String name() {
-		return TIMEOUT;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#setValue(java.lang.String)
-	 */
-	public void setValue(String value) {
-		try {
-			timeout = Integer.parseInt(value);
-		}
-		catch(NumberFormatException nfe) {
-			//do nothing the new value will not be set
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#value()
-	 */
-	public String value() {
-		return Integer.toString(timeout);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#intValue()
-	 */
-	public int intValue() {
-		return timeout;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#isValid(int)
-	 */
-	public boolean isValid(int intValue) {
-		return intValue > 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#isValid(java.lang.String)
-	 */
-	public boolean isValid(String value) {
-		try {
-			return Integer.parseInt(value) > 0;
-		}
-		catch(NumberFormatException bfe) {
-			//do nothing, just not valid
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#max()
-	 */
-	public int max() {
-		return Integer.MAX_VALUE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#min()
-	 */
-	public int min() {
-		return 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#setValue(int)
-	 */
-	public void setValue(int intValue) {
-		timeout = intValue;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/messages.properties b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/messages.properties
deleted file mode 100644
index 385f3b4..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/connect/messages.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-###############################################################################
-# Copyright (c) 2011 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-attach_to_google_chrome=Allows you to connect to the Google Chrome browser
-browser_arg_desc=Automatically launch Chrome and attach to it
-browser_arg_label=Auto&matically launch Chrome and attach to it (extremely experimental)
-google_chrome_attach=Google Chrome - Attach
-host_arg_desc=The name of the host address to try and attach to
-host_arg_label=&Host:
-port_arg_desc=The port on the host machine to try connecting on
-port_arg_label=&Port:
-timeout_arg_desc=A timeout value in milliseconds to wait for the debugger to connect
-timeout_arg_label=&Timeout:
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/BreakpointEventImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/BreakpointEventImpl.java
deleted file mode 100644
index 51fb72a..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/BreakpointEventImpl.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.BreakpointEvent;
-
-/**
- *
- */
-public class BreakpointEventImpl extends LocatableEventImpl implements BreakpointEvent {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.LocatableEvent#thread()
-	 */
-	public ThreadReference thread() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Locatable#location()
-	 */
-	public Location location() {
-		return null;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/DebuggerStatementEventImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/DebuggerStatementEventImpl.java
deleted file mode 100644
index 6cec32b..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/DebuggerStatementEventImpl.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.DebuggerStatementEvent;
-
-/**
- *
- */
-public class DebuggerStatementEventImpl extends LocatableEventImpl implements
-		DebuggerStatementEvent {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.LocatableEvent#thread()
-	 */
-	public ThreadReference thread() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Locatable#location()
-	 */
-	public Location location() {
-		return null;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/EventImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/EventImpl.java
deleted file mode 100644
index 1381fbb..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/EventImpl.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.Event;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-
-/**
- *
- */
-public class EventImpl implements Event {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Mirror#virtualMachine()
-	 */
-	public VirtualMachine virtualMachine() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.Event#request()
-	 */
-	public EventRequest request() {
-		return null;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/EventQueueImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/EventQueueImpl.java
deleted file mode 100644
index 71911ef..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/EventQueueImpl.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.event;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager;
-import org.eclipse.wst.jsdt.debug.internal.chrome.Tracing;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.MirrorImpl;
-import org.eclipse.wst.jsdt.debug.internal.chrome.transport.Commands;
-import org.eclipse.wst.jsdt.debug.transport.exception.DisconnectedException;
-import org.eclipse.wst.jsdt.debug.transport.exception.TimeoutException;
-import org.eclipse.wst.jsdt.debug.transport.packet.Event;
-
-/**
- * EVent queue for Chrome
- * 
- * @since 1.0
- */
-public class EventQueueImpl extends MirrorImpl implements EventQueue {
-
-	private EventRequestManager ermanager = null;
-	
-	static boolean TRACE = false;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param vm the underlying {@link VirtualMachine}
-	 * @param manager the {@link EventRequestManager} to ask about pending requests
-	 */
-	public EventQueueImpl(VirtualMachine vm, EventRequestManager manager) {
-		super(vm);
-		this.ermanager = manager;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue#remove()
-	 */
-	public EventSet remove() {
-		return remove(-1);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue#remove(int)
-	 */
-	public EventSet remove(int timeout) {
-		try {
-			//loop until disconnected - exception breaks loop
-			while(true) {
-				Event event = chromeVM().receiveEvent();
-				if(event != null) {
-					//TODO
-					if(event.getEvent().equals(Commands.NAVIGATED)) {
-						if(TRACE) {
-							Tracing.writeString("got navigated event"); //$NON-NLS-1$
-						}
-					}
-					else if(event.getEvent().equals(Commands.CLOSED)) {
-						List requests = ermanager.threadExitRequests();
-						for(Iterator i = requests.iterator(); i.hasNext();) {
-							//TODO
-						}
-						if(TRACE) {
-							Tracing.writeString("got closed event"); //$NON-NLS-1$
-						}
-					}
-				}
-			}
-		}
-		catch(DisconnectedException de) {
-			
-		}
-		catch(TimeoutException te) {
-			
-		}
-		return null;
-	}
-	
-	/**
-	 * Enables / Disables tracing in the all of the JSDI implementations
-	 * 
-	 * @param trace
-	 */
-	public static void setTracing(boolean trace) {
-		TRACE = trace;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/EventSetImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/EventSetImpl.java
deleted file mode 100644
index fe6bb54..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/EventSetImpl.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.event;
-
-import java.util.HashSet;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet;
-
-/**
- *
- */
-public class EventSetImpl extends HashSet implements EventSet {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Mirror#virtualMachine()
-	 */
-	public VirtualMachine virtualMachine() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet#suspended()
-	 */
-	public boolean suspended() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet#resume()
-	 */
-	public void resume() {
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/ExceptionEventImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/ExceptionEventImpl.java
deleted file mode 100644
index 9e5122e..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/ExceptionEventImpl.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ExceptionEvent;
-
-/**
- *
- */
-public class ExceptionEventImpl extends LocatableEventImpl implements ExceptionEvent {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.LocatableEvent#thread()
-	 */
-	public ThreadReference thread() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Locatable#location()
-	 */
-	public Location location() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.ExceptionEvent#message()
-	 */
-	public String message() {
-		return null;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/LocatableEventImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/LocatableEventImpl.java
deleted file mode 100644
index 03aa31e..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/LocatableEventImpl.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.LocatableEvent;
-
-/**
- *
- */
-public class LocatableEventImpl extends EventImpl implements LocatableEvent {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Locatable#location()
-	 */
-	public Location location() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.LocatableEvent#thread()
-	 */
-	public ThreadReference thread() {
-		return null;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/ResumeEventImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/ResumeEventImpl.java
deleted file mode 100644
index 03df2d7..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/ResumeEventImpl.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ResumeEvent;
-
-/**
- *
- */
-public class ResumeEventImpl extends LocatableEventImpl implements ResumeEvent {
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/ScriptEventImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/ScriptEventImpl.java
deleted file mode 100644
index f024602..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/ScriptEventImpl.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ScriptLoadEvent;
-
-/**
- *
- */
-public class ScriptEventImpl extends LocatableEventImpl implements
-		ScriptLoadEvent {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.ScriptLoadEvent#script()
-	 */
-	public ScriptReference script() {
-		return null;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/StepEventImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/StepEventImpl.java
deleted file mode 100644
index aa6e37e..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/StepEventImpl.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.StepEvent;
-
-/**
- *
- */
-public class StepEventImpl extends LocatableEventImpl implements StepEvent {
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/SuspendEventImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/SuspendEventImpl.java
deleted file mode 100644
index bfffd29..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/SuspendEventImpl.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.SuspendEvent;
-
-/**
- *
- */
-public class SuspendEventImpl extends LocatableEventImpl implements SuspendEvent {
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/ThreadEnterEventImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/ThreadEnterEventImpl.java
deleted file mode 100644
index 018db56..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/ThreadEnterEventImpl.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ThreadEnterEvent;
-
-/**
- *
- */
-public class ThreadEnterEventImpl extends LocatableEventImpl implements ThreadEnterEvent {
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/ThreadExitEventImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/ThreadExitEventImpl.java
deleted file mode 100644
index 4719d44..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/ThreadExitEventImpl.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ThreadExitEvent;
-
-/**
- *
- */
-public class ThreadExitEventImpl extends LocatableEventImpl implements
-		ThreadExitEvent {
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/VMDeathEventImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/VMDeathEventImpl.java
deleted file mode 100644
index 034bef6..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/VMDeathEventImpl.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.VMDeathEvent;
-
-/**
- *
- */
-public class VMDeathEventImpl extends LocatableEventImpl implements
-		VMDeathEvent {
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/VMDisconnectEventImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/VMDisconnectEventImpl.java
deleted file mode 100644
index c433cac..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/event/VMDisconnectEventImpl.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.VMDisconnectEvent;
-
-/**
- *
- */
-public class VMDisconnectEventImpl extends LocatableEventImpl implements
-		VMDisconnectEvent {
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/ArrayImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/ArrayImpl.java
deleted file mode 100644
index af907e9..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/ArrayImpl.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import java.util.List;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ArrayReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-
-/**
- *
- */
-public class ArrayImpl extends ObjectImpl implements ArrayReference {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ArrayReference#length()
-	 */
-	public int length() {
-		return 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ArrayReference#getValue(int)
-	 */
-	public Value getValue(int index) throws IndexOutOfBoundsException {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ArrayReference#getValues()
-	 */
-	public List getValues() {
-		return null;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/BooleanImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/BooleanImpl.java
deleted file mode 100644
index 4294644..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/BooleanImpl.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.BooleanValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Default implementation of {@link BooleanValue} for Chrome
- * 
- * @since 1.0
- */
-public class BooleanImpl extends MirrorImpl implements BooleanValue {
-
-	private boolean value = false;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param vm the underlying {@link VirtualMachine}
-	 * @param bool the boolean value
-	 */
-	public BooleanImpl(VirtualMachine vm, boolean bool) {
-		super(vm);
-		value = bool;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#intValue()
-	 */
-	public int intValue() {
-		if(value) {
-			return 1;
-		}
-		return 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#doubleValue()
-	 */
-	public double doubleValue() {
-		return intValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#booleanValue()
-	 */
-	public boolean booleanValue() {
-		return value;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#stringValue()
-	 */
-	public String stringValue() {
-		return Boolean.toString(value);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return stringValue();
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/FunctionImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/FunctionImpl.java
deleted file mode 100644
index 076e97a..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/FunctionImpl.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.FunctionReference;
-
-/**
- *
- */
-public class FunctionImpl extends ObjectImpl implements FunctionReference {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.FunctionReference#functionName()
-	 */
-	public String functionName() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.FunctionReference#functionBody()
-	 */
-	public String functionBody() {
-		return null;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/Messages.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/Messages.java
deleted file mode 100644
index 6795014..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/Messages.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.messages"; //$NON-NLS-1$
-	public static String cannot_mirror_null_number;
-	public static String chrome_vm;
-	public static String vm_description;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/MirrorImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/MirrorImpl.java
deleted file mode 100644
index 4ebc132..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/MirrorImpl.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Mirror;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Default impl for Chrome v8.
- * 
- * @since 1.0
- */
-public class MirrorImpl implements Mirror {
-
-	/**
-	 * Flag for tracing
-	 */
-	static boolean TRACE = false;
-	
-	private VirtualMachine vm = null;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param vm the underlying {@link VirtualMachine}
-	 */
-	public MirrorImpl(VirtualMachine vm) {
-		this.vm = vm;
-	}
-	
-	/**
-	 * Constructor
-	 * 
-	 * Used for the {@link VMImpl} instantiation case
-	 */
-	protected MirrorImpl() {
-		this.vm = (VirtualMachine) this;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Mirror#virtualMachine()
-	 */
-	public VirtualMachine virtualMachine() {
-		return vm;
-	}
-
-	/**
-	 * Returns the {@link VMImpl} backing this {@link Mirror} object
-	 * 
-	 * @return the backing {@link VMImpl}
-	 */
-	protected VMImpl chromeVM() {
-		return (VMImpl)vm;
-	}
-	
-	/**
-	 * Re-throws the given exception as a {@link RuntimeException} with the given message
-	 * @param message
-	 * @param t
-	 */
-	protected void handleException(String message, Throwable t) {
-		throw new RuntimeException(message, t);
-	}
-	
-	/**
-	 * Enables / Disables tracing in the all of the JSDI implementations
-	 * 
-	 * @param trace
-	 */
-	public static void setTracing(boolean trace) {
-		TRACE = trace;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/NullImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/NullImpl.java
deleted file mode 100644
index 8bfc9d7..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/NullImpl.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.NullValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Chrome impl of {@link NullValue}
- * 
- * @since 1.0
- */
-public class NullImpl extends MirrorImpl implements NullValue {
-
-	/**
-	 * String representation of the value<br><br>
-	 * Value is: <code>null</code>
-	 */
-	public static final String NULL = "null"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm the underlying {@link VirtualMachine}
-	 */
-	public NullImpl(VirtualMachine vm) {
-		super(vm);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return NULL;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return valueString();
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/NumberImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/NumberImpl.java
deleted file mode 100644
index 13f9794..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/NumberImpl.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Default implementation of {@link NumberValue} for Chrome
- * 
- * @since 1.0
- */
-public class NumberImpl extends MirrorImpl implements NumberValue {
-
-	private Number number = null;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param vm the underlying {@link VirtualMachine}
-	 * @param number the number
-	 */
-	public NumberImpl(VirtualMachine vm, Number number) {
-		super(vm);
-		if(number == null) {
-			throw new IllegalArgumentException(Messages.cannot_mirror_null_number);
-		}
-		this.number = number;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#intValue()
-	 */
-	public int intValue() {
-		return number.intValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#doubleValue()
-	 */
-	public double doubleValue() {
-		return number.doubleValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#booleanValue()
-	 */
-	public boolean booleanValue() {
-		if(number.intValue() < 1) {
-			return false;
-		}
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#stringValue()
-	 */
-	public String stringValue() {
-		return number.toString();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return stringValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue#value()
-	 */
-	public Number value() {
-		return number;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue#isNaN()
-	 */
-	public boolean isNaN() {
-		return false;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return valueString();
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/ObjectImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/ObjectImpl.java
deleted file mode 100644
index 393a6e3..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/ObjectImpl.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import java.util.List;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-
-/**
- *
- */
-public class ObjectImpl extends MirrorImpl implements ObjectReference {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#className()
-	 */
-	public String className() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#constructor()
-	 */
-	public Value constructor() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#prototype()
-	 */
-	public Value prototype() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#properties()
-	 */
-	public List properties() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#id()
-	 */
-	public Number id() {
-		return null;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/PropertyImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/PropertyImpl.java
deleted file mode 100644
index 05625a8..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/PropertyImpl.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Property;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-
-/**
- *
- */
-public class PropertyImpl extends MirrorImpl implements Property {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Property#name()
-	 */
-	public String name() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Property#value()
-	 */
-	public Value value() {
-		return null;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/ScriptImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/ScriptImpl.java
deleted file mode 100644
index ca48acf..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/ScriptImpl.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import java.net.URI;
-import java.util.List;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-
-/**
- *
- */
-public class ScriptImpl extends MirrorImpl implements ScriptReference {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#allLineLocations()
-	 */
-	public List allLineLocations() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#lineLocation(int)
-	 */
-	public Location lineLocation(int lineNumber) {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#allFunctionLocations()
-	 */
-	public List allFunctionLocations() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#functionLocation(java.lang.String)
-	 */
-	public Location functionLocation(String functionName) {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#source()
-	 */
-	public String source() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#sourceURI()
-	 */
-	public URI sourceURI() {
-		return null;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/StackFrameImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/StackFrameImpl.java
deleted file mode 100644
index c9dbcb9..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/StackFrameImpl.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import java.util.List;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Variable;
-
-/**
- *
- */
-public class StackFrameImpl extends MirrorImpl implements StackFrame {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame#thisObject()
-	 */
-	public Variable thisObject() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame#variables()
-	 */
-	public List variables() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame#location()
-	 */
-	public Location location() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame#evaluate(java.lang.String)
-	 */
-	public Value evaluate(String expression) {
-		return null;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/StringImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/StringImpl.java
deleted file mode 100644
index dfbe67e..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/StringImpl.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.StringValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- *
- */
-public class StringImpl extends MirrorImpl implements StringValue {
-
-	private String string = null;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param string
-	 */
-	StringImpl(VirtualMachine vm, String string) {
-		super(vm);
-		this.string = string;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return string;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StringValue#value()
-	 */
-	public String value() {
-		return string;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/ThreadImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/ThreadImpl.java
deleted file mode 100644
index 989caa9..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/ThreadImpl.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import java.util.List;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-
-/**
- *
- */
-public class ThreadImpl extends MirrorImpl implements ThreadReference {
-
-	Number id = null;
-	String url = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param id
-	 * @param url
-	 */
-	public ThreadImpl(VMImpl vm, Number id, String url) {
-		super(vm);
-		this.id = id;
-		this.url = url;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#frameCount()
-	 */
-	public int frameCount() {
-		return 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#frame(int)
-	 */
-	public StackFrame frame(int index) {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#frames()
-	 */
-	public List frames() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#interrupt()
-	 */
-	public void interrupt() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#resume()
-	 */
-	public void resume() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#suspend()
-	 */
-	public void suspend() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#status()
-	 */
-	public int status() {
-		return 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#isAtBreakpoint()
-	 */
-	public boolean isAtBreakpoint() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#isSuspended()
-	 */
-	public boolean isSuspended() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#name()
-	 */
-	public String name() {
-		return url;
-	}
-	
-	public Number id() {
-		return id;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/UndefinedImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/UndefinedImpl.java
deleted file mode 100644
index 99d5044..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/UndefinedImpl.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.UndefinedValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Default implementation of {@link UndefinedValue} for Chrome.
- * 
- * @since 1.0
- */
-public class UndefinedImpl extends MirrorImpl implements UndefinedValue {
-
-	/**
-	 * Textual representation of undefined<br><br>
-	 * value is: <code>undefined</code>
-	 */
-	public static final String UNDEFINED = "undefined"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm the underlying {@link VirtualMachine}
-	 */
-	public UndefinedImpl(VirtualMachine vm) {
-		super(vm);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return UNDEFINED;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return valueString();
-	}	
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/VMImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/VMImpl.java
deleted file mode 100644
index a0bef24..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/VMImpl.java
+++ /dev/null
@@ -1,357 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.jsdt.debug.core.jsdi.BooleanValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.NullValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.StringValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.UndefinedValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager;
-import org.eclipse.wst.jsdt.debug.internal.chrome.ChromePlugin;
-import org.eclipse.wst.jsdt.debug.internal.chrome.Tracing;
-import org.eclipse.wst.jsdt.debug.internal.chrome.event.EventQueueImpl;
-import org.eclipse.wst.jsdt.debug.internal.chrome.request.EventReqManager;
-import org.eclipse.wst.jsdt.debug.internal.chrome.transport.Attributes;
-import org.eclipse.wst.jsdt.debug.internal.chrome.transport.EventPacketImpl;
-import org.eclipse.wst.jsdt.debug.internal.chrome.transport.RequestPacketImpl;
-import org.eclipse.wst.jsdt.debug.internal.chrome.transport.Commands;
-import org.eclipse.wst.jsdt.debug.internal.chrome.transport.JSON;
-import org.eclipse.wst.jsdt.debug.transport.DebugSession;
-import org.eclipse.wst.jsdt.debug.transport.exception.DisconnectedException;
-import org.eclipse.wst.jsdt.debug.transport.exception.TimeoutException;
-import org.eclipse.wst.jsdt.debug.transport.packet.Event;
-import org.eclipse.wst.jsdt.debug.transport.packet.Request;
-import org.eclipse.wst.jsdt.debug.transport.packet.Response;
-
-/**
- * Default implementation of a {@link VirtualMachine} for Chrome
- * 
- * @since 1.0
- */
-public class VMImpl extends MirrorImpl implements VirtualMachine {
-
-	public static int RUNNING = 1;
-	public static int SUSPENDED = 2;
-	public static int TERMINATED = 3;
-	public static int DISPOSED = 4;
-	public static int DISCONNECTED = 5;
-	
-	/**
-	 * The current state
-	 */
-	private int state = 0;
-	/**
-	 * The singleton {@link NullValue}
-	 */
-	private static NullValue nullValue = null;
-	/**
-	 * The singleton {@link UndefinedValue}
-	 */
-	private static UndefinedValue undefinedValue = null;
-	
-	private EventRequestManager ermanager = new EventReqManager(this);
-	private EventQueue queue = new EventQueueImpl(this, ermanager);
-	private final DebugSession session;
-	
-	private Map threads = null;
-	private Map scripts = null;
-	private String version = null;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param session the backing {@link DebugSession}
-	 */
-	public VMImpl(DebugSession session) {
-		super();
-		this.session = session;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#resume()
-	 */
-	public synchronized void resume() {
-		if(state == SUSPENDED) {
-			//TODO
-			state = RUNNING;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#suspend()
-	 */
-	public synchronized void suspend() {
-		if(state == RUNNING) {
-			//TODO
-			state = SUSPENDED;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#terminate()
-	 */
-	public synchronized void terminate() {
-		if(state != TERMINATED) {
-			//TODO
-			state = TERMINATED;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#name()
-	 */
-	public String name() {
-		return NLS.bind(Messages.chrome_vm, version());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#description()
-	 */
-	public String description() {
-		return Messages.vm_description;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#version()
-	 */
-	public synchronized String version() {
-		if(version == null) {
-			RequestPacketImpl request = new RequestPacketImpl(Commands.VERSION, Attributes.TOOL_DEVTOOLSRVC, null);
-			Response response = sendRequest(request);
-			if(response.isSuccess()) {
-				version = (String) response.getBody().get(Attributes.DATA);
-			}
-			else if(TRACE) {
-				Tracing.writeString("VM [failed version request]" + JSON.serialize(request)); //$NON-NLS-1$
-			}
-		}
-		return version;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#allThreads()
-	 */
-	public synchronized List allThreads() {
-		if(threads == null) {
-			threads = Collections.synchronizedMap(new HashMap(4));
-			RequestPacketImpl request = new RequestPacketImpl(Commands.LIST_TABS, Attributes.TOOL_DEVTOOLSRVC, null);
-			Response response = sendRequest(request);
-			if(response.isSuccess()) {
-				List tabs = (List) response.getBody().get(Attributes.DATA);
-				if(tabs != null) {
-					ArrayList values = null;
-					for(Iterator i = tabs.iterator(); i.hasNext();) {
-						values = (ArrayList) i.next();
-						String url = (String)values.get(1);
-						Number id = (Number)values.get(0);
-						ThreadImpl thread = new ThreadImpl(this, id, url);
-						threads.put(id, thread);
-						attach(thread);
-					}
-				}
-			}
-			else if(TRACE) {
-				Tracing.writeString("VM [failed all_tabs request]" + JSON.serialize(request)); //$NON-NLS-1$
-			}
-		}
-		return new ArrayList(threads.values());
-	}
-
-	/**
-	 * Try to attach the debugger to the v8 debugger service for the given thread (tab)
-	 * 
-	 * @param thread
-	 */
-	void attach(ThreadImpl thread) {
-		RequestPacketImpl request = new RequestPacketImpl(Commands.ATTACH, Attributes.TOOL_DEVTOOLSRVC, thread.id());
-		Response response = sendRequest(request);
-		if(response.isSuccess()) {
-			
-		}
-		else if(TRACE) {
-			Tracing.writeString("VM [failed attach request] " + JSON.serialize(request)); //$NON-NLS-1$
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#allScripts()
-	 */
-	public synchronized List allScripts() {
-		if(this.scripts == null) {
-			this.scripts = Collections.synchronizedMap(new HashMap(4));
-		}
-		return new ArrayList(scripts.values());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#dispose()
-	 */
-	public synchronized void dispose() {
-		if(state != DISPOSED) {
-			//TODO
-			try {
-				if(threads != null) {
-					threads.clear();
-					threads = null;
-				}
-				if(scripts != null) {
-					scripts.clear();
-					scripts = null;
-				}
-			}
-			finally {
-				state = DISPOSED;
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOfUndefined()
-	 */
-	public UndefinedValue mirrorOfUndefined() {
-		synchronized (this) {
-			if(undefinedValue == null) {
-				undefinedValue = new UndefinedImpl(this);
-			}
-		}
-		return undefinedValue;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOfNull()
-	 */
-	public NullValue mirrorOfNull() {
-		synchronized (this) {
-			if(nullValue == null) {
-				nullValue = new NullImpl(this);
-			}
-		}
-		return nullValue;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOf(boolean)
-	 */
-	public BooleanValue mirrorOf(boolean bool) {
-		return new BooleanImpl(this, bool);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOf(java.lang.Number)
-	 */
-	public NumberValue mirrorOf(Number number) {
-		return new NumberImpl(this, number);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOf(java.lang.String)
-	 */
-	public StringValue mirrorOf(String string) {
-		return new StringImpl(this, string);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#eventRequestManager()
-	 */
-	public EventRequestManager eventRequestManager() {
-		return ermanager;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#eventQueue()
-	 */
-	public EventQueue eventQueue() {
-		return queue;
-	}
-	
-	/**
-	 * Sends a request to the underlying {@link DebugSession}, waiting
-	 * for the {@link VirtualMachine#DEFAULT_TIMEOUT}.
-	 * 
-	 * @param request
-	 * @return the {@link CFResponse} for the request
-	 */
-	public Response sendRequest(Request request) {
-		try {
-			session.send(request);
-			return session.receiveResponse(request.getSequence(), 3000);
-		}
-		catch(DisconnectedException de) {
-			disconnectVM();
-			handleException(de.getMessage(), de.getCause());
-		}
-		catch(TimeoutException te) {
-			ChromePlugin.log(te);
-		}
-		return null;
-	}
-	
-	/**
-	 * Receives an {@link EventPacket} from the underlying {@link DebugSession}, 
-	 * waiting for the {@link VirtualMachine#DEFAULT_TIMEOUT}.
-	 * 
-	 * @return the next {@link EventPacket} never <code>null</code>
-	 * @throws TimeoutException
-	 * @throws DisconnectedException
-	 */
-	public Event receiveEvent() throws TimeoutException, DisconnectedException {
-		return (Event) session.receive(EventPacketImpl.EVENT, DEFAULT_TIMEOUT);
-	}
-
-	/**
-	 * Receives an {@link EventPacket} from the underlying {@link DebugSession}, 
-	 * waiting for the {@link VirtualMachine#DEFAULT_TIMEOUT}.
-	 * @param timeout
-	 * @return the next {@link EventPacket} never <code>null</code>
-	 * @throws TimeoutException
-	 * @throws DisconnectedException
-	 */
-	public Event receiveEvent(int timeout) throws TimeoutException, DisconnectedException {
-		return (Event) session.receive(EventPacketImpl.EVENT, timeout);
-	}
-	
-	/**
-	 * disconnects the VM
-	 */
-	public synchronized void disconnectVM() {
-		if (state == DISCONNECTED) {
-			if(TRACE) {
-				Tracing.writeString("VM [already disconnected]"); //$NON-NLS-1$
-			}
-			return;
-		}
-		if(TRACE) {
-			Tracing.writeString("VM [disconnecting]"); //$NON-NLS-1$
-		}
-		try {
-			if(threads != null) {
-				threads.clear();
-			}
-			if(scripts != null) {
-				scripts.clear();
-			}
-			this.session.dispose();
-		} finally {
-			state = DISCONNECTED;
-		}
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/ValueImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/ValueImpl.java
deleted file mode 100644
index 37350fc..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/ValueImpl.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-
-/**
- *
- */
-public class ValueImpl extends MirrorImpl implements Value {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return null;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/VarImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/VarImpl.java
deleted file mode 100644
index 958297e..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/VarImpl.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Variable;
-
-/**
- *
- */
-public class VarImpl extends MirrorImpl implements Variable {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Property#name()
-	 */
-	public String name() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Property#value()
-	 */
-	public Value value() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Variable#isArgument()
-	 */
-	public boolean isArgument() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Variable#isVisible(org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame)
-	 */
-	public boolean isVisible(StackFrame frame) {
-		return false;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/messages.properties b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/messages.properties
deleted file mode 100644
index 5f55961..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/messages.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2011 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-cannot_mirror_null_number=You cannot mirror a null Number
-chrome_vm=Chrome VM
-vm_description=The virtual machine for communication with Google Chrome for debugging JavaScript in v8
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/BreakpointReqImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/BreakpointReqImpl.java
deleted file mode 100644
index 39636b3..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/BreakpointReqImpl.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.VMImpl;
-
-/**
- * {@link BreakpointRequest} impl
- * 
- * @since 1.0
- */
-public class BreakpointReqImpl extends EventReqImpl implements BreakpointRequest {
-
-	private Location location = null;
-	private ThreadReference thread = null;
-	private int hitcount = 0;
-	private String condition = null;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param location 
-	 * @param enabled
-	 */
-	public BreakpointReqImpl(VMImpl vm, Location location, boolean enabled) {
-		super(vm, enabled);
-		this.location = location;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Locatable#location()
-	 */
-	public Location location() {
-		return location;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public void addThreadFilter(ThreadReference thread) {
-		this.thread = thread;
-	}
-
-	/**
-	 * Returns the underlying {@link ThreadReference} this request applies to
-	 * 
-	 * @return the underlying {@link ThreadReference}
-	 */
-	public synchronized ThreadReference thread() {
-		return this.thread;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest#addConditionFilter(java.lang.String)
-	 */
-	public void addConditionFilter(String condition) {
-		this.condition = condition;
-	}
-
-	/**
-	 * Returns the condition for this breakpoint
-	 * 
-	 * @return the condition
-	 */
-	public synchronized String condition() {
-		return condition;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest#addHitCountFilter(int)
-	 */
-	public void addHitCountFilter(int hitcount) {
-		this.hitcount = hitcount;
-	}
-	
-	/**
-	 * Returns the hit count for the breakpoint
-	 * 
-	 * @return the hit count for the breakpoint
-	 */
-	public synchronized int hitcount() {
-		return this.hitcount;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/DebuggerStatementReqImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/DebuggerStatementReqImpl.java
deleted file mode 100644
index 430ad69..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/DebuggerStatementReqImpl.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.DebuggerStatementRequest;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.VMImpl;
-
-/**
- * {@link DebuggerStatementRequest} impl
- * 
- * @since 1.0
- */
-public class DebuggerStatementReqImpl extends EventReqImpl implements DebuggerStatementRequest {
-
-	private ThreadReference thread = null;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param enabled
-	 */
-	public DebuggerStatementReqImpl(VMImpl vm, boolean enabled) {
-		super(vm, enabled);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.DebuggerStatementRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public void addThreadFilter(ThreadReference thread) {
-		this.thread = thread;
-	}
-	
-	/**
-	 * Returns the underlying {@link ThreadReference} this request applies to
-	 * 
-	 * @return the underlying {@link ThreadReference}
-	 */
-	public synchronized ThreadReference thread() {
-		return this.thread;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/EventReqImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/EventReqImpl.java
deleted file mode 100644
index a753210..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/EventReqImpl.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.MirrorImpl;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.VMImpl;
-
-/**
- * Impl of {@link EventRequest}
- * 
- * @since 1.0
- */
-public class EventReqImpl extends MirrorImpl implements EventRequest {
-
-	private boolean enabled = false;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param enabled
-	 */
-	public EventReqImpl(VMImpl vm, boolean enabled) {
-		super(vm);
-		this.enabled = enabled;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest#isEnabled()
-	 */
-	public boolean isEnabled() {
-		return enabled;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest#setEnabled(boolean)
-	 */
-	public void setEnabled(boolean enabled) {
-		this.enabled = enabled;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/EventReqManager.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/EventReqManager.java
deleted file mode 100644
index a35a371..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/EventReqManager.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.request;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.DebuggerStatementRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ResumeRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ScriptLoadRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.SuspendRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDeathRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDisconnectRequest;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.MirrorImpl;
-
-/**
- * {@link EventRequestManager} for Chrome
- * 
- * @since 1.0
- */
-public class EventReqManager extends MirrorImpl implements EventRequestManager {
-
-	private List threadexits = Collections.synchronizedList(new ArrayList(4));
-	private List threadenters = Collections.synchronizedList(new ArrayList(4));
-	private List breakpoints = Collections.synchronizedList(new ArrayList(4));
-	private List debuggers = Collections.synchronizedList(new ArrayList(4));
-	private List exceptions = Collections.synchronizedList(new ArrayList(4));
-	private List loads = Collections.synchronizedList(new ArrayList(4));
-	private List steps = Collections.synchronizedList(new ArrayList(4));
-	private List suspends = Collections.synchronizedList(new ArrayList(4));
-	private List resumes = Collections.synchronizedList(new ArrayList(4));
-	private List disconnects = Collections.synchronizedList(new ArrayList(4));
-	private List deaths = Collections.synchronizedList(new ArrayList(4));
-	
-	private HashMap kind = new HashMap(10);
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param vm the underlying virtual machine
-	 */
-	public EventReqManager(VirtualMachine vm) {
-		super(vm);
-		kind.put(BreakpointReqImpl.class, breakpoints);
-		kind.put(DebuggerStatementReqImpl.class, debuggers);
-		kind.put(ExceptionReqImpl.class, exceptions);
-		kind.put(ScriptLoadReqImpl.class, loads);
-		kind.put(StepReqImpl.class, steps);
-		kind.put(SuspendReqImpl.class, suspends);
-		kind.put(ResumeReqImpl.class, resumes);
-		kind.put(ThreadEnterReqImpl.class, threadenters);
-		kind.put(ThreadExitReqImpl.class, threadexits);
-		kind.put(VMDisconnectReqImpl.class, disconnects);
-		kind.put(VMDeathReqImpl.class, deaths);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createBreakpointRequest(org.eclipse.wst.jsdt.debug.core.jsdi.Location)
-	 */
-	public BreakpointRequest createBreakpointRequest(Location location) {
-		BreakpointReqImpl req = new BreakpointReqImpl(chromeVM(), location, true);
-		breakpoints.add(req);
-		return req;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#breakpointRequests()
-	 */
-	public List breakpointRequests() {
-		return Collections.unmodifiableList(breakpoints);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createDebuggerStatementRequest()
-	 */
-	public DebuggerStatementRequest createDebuggerStatementRequest() {
-		DebuggerStatementReqImpl req = new DebuggerStatementReqImpl(chromeVM(), true);
-		debuggers.add(req);
-		return req;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#debuggerStatementRequests()
-	 */
-	public List debuggerStatementRequests() {
-		return Collections.unmodifiableList(debuggers);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createExceptionRequest()
-	 */
-	public ExceptionRequest createExceptionRequest() {
-		ExceptionReqImpl req = new ExceptionReqImpl(chromeVM(), true);
-		exceptions.add(req);
-		return req;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#exceptionRequests()
-	 */
-	public List exceptionRequests() {
-		return Collections.unmodifiableList(exceptions);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createScriptLoadRequest()
-	 */
-	public ScriptLoadRequest createScriptLoadRequest() {
-		ScriptLoadReqImpl req = new ScriptLoadReqImpl(chromeVM(), true);
-		loads.add(req);
-		return req;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#scriptLoadRequests()
-	 */
-	public List scriptLoadRequests() {
-		return Collections.unmodifiableList(loads);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createStepRequest(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference, int)
-	 */
-	public StepRequest createStepRequest(ThreadReference thread, int step) {
-		StepReqImpl req = new StepReqImpl(chromeVM(), thread, step, true);
-		steps.add(req);
-		return req;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#stepRequests()
-	 */
-	public List stepRequests() {
-		return Collections.unmodifiableList(steps);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createSuspendRequest(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public SuspendRequest createSuspendRequest(ThreadReference thread) {
-		SuspendReqImpl req = new SuspendReqImpl(chromeVM(), thread, true);
-		suspends.add(req);
-		return req;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#suspendRequests()
-	 */
-	public List suspendRequests() {
-		return Collections.unmodifiableList(suspends);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createResumeRequest(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public ResumeRequest createResumeRequest(ThreadReference thread) {
-		ResumeReqImpl req = new ResumeReqImpl(chromeVM(), thread, true);
-		resumes.add(req);
-		return req;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#resumeRequests()
-	 */
-	public List resumeRequests() {
-		return Collections.unmodifiableList(resumes);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createThreadEnterRequest()
-	 */
-	public ThreadEnterRequest createThreadEnterRequest() {
-		ThreadEnterReqImpl req = new ThreadEnterReqImpl(chromeVM(), true);
-		threadenters.add(req);
-		return req;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#threadEnterRequests()
-	 */
-	public List threadEnterRequests() {
-		return Collections.unmodifiableList(threadenters);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createThreadExitRequest()
-	 */
-	public ThreadExitRequest createThreadExitRequest() {
-		ThreadExitReqImpl req = new ThreadExitReqImpl(chromeVM(), true);
-		threadexits.add(req);
-		return req;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#threadExitRequests()
-	 */
-	public List threadExitRequests() {
-		return Collections.unmodifiableList(threadexits);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#deleteEventRequest(org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest)
-	 */
-	public void deleteEventRequest(EventRequest eventRequest) {
-		List requests = (List) kind.get(eventRequest.getClass());
-		if(requests != null) {
-			requests.remove(eventRequest);
-			eventRequest.setEnabled(false);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#deleteEventRequest(java.util.List)
-	 */
-	public void deleteEventRequest(List eventRequests) {
-		for (Iterator iter = eventRequests.iterator(); iter.hasNext();) {
-			deleteEventRequest((EventRequest) iter.next());
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createVMDeathRequest()
-	 */
-	public VMDeathRequest createVMDeathRequest() {
-		VMDeathReqImpl req = new VMDeathReqImpl(chromeVM(), true);
-		deaths.add(req);
-		return req;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#vmDeathRequests()
-	 */
-	public List vmDeathRequests() {
-		return Collections.unmodifiableList(deaths);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createVMDisconnectRequest()
-	 */
-	public VMDisconnectRequest createVMDisconnectRequest() {
-		VMDisconnectReqImpl req = new VMDisconnectReqImpl(chromeVM(), true);
-		disconnects.add(req);
-		return req;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#vmDisconnectRequests()
-	 */
-	public List vmDisconnectRequests() {
-		return Collections.unmodifiableList(disconnects);
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/ExceptionReqImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/ExceptionReqImpl.java
deleted file mode 100644
index d80f388..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/ExceptionReqImpl.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.VMImpl;
-
-/**
- * {@link ExceptionRequest} impl
- * 
- * @since 1.0
- */
-public class ExceptionReqImpl extends EventReqImpl implements ExceptionRequest {
-
-	private ThreadReference thread = null;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param enabled
-	 */
-	public ExceptionReqImpl(VMImpl vm, boolean enabled) {
-		super(vm, enabled);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public void addThreadFilter(ThreadReference thread) {
-		this.thread = thread;
-	}
-
-	/**
-	 * Returns the underlying {@link ThreadReference} this request applies to
-	 * 
-	 * @return the underlying {@link ThreadReference}
-	 */
-	public synchronized ThreadReference thread() {
-		return this.thread;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/ResumeReqImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/ResumeReqImpl.java
deleted file mode 100644
index 3c01b73..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/ResumeReqImpl.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ResumeRequest;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.VMImpl;
-
-/**
- * {@link ResumeRequest} impl
- * 
- * @since 1.0
- */
-public class ResumeReqImpl extends EventReqImpl implements ResumeRequest {
-
-	private ThreadReference thread = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param enabled
-	 */
-	public ResumeReqImpl(VMImpl vm,ThreadReference thread, boolean enabled) {
-		super(vm, enabled);
-		this.thread = thread;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.SuspendRequest#thread()
-	 */
-	public ThreadReference thread() {
-		return thread;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/ScriptLoadReqImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/ScriptLoadReqImpl.java
deleted file mode 100644
index 72871dd..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/ScriptLoadReqImpl.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ScriptLoadRequest;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.VMImpl;
-
-/**
- * {@link ScriptLoadRequest} impl
- * 
- * @since 1.0
- */
-public class ScriptLoadReqImpl extends EventReqImpl implements ScriptLoadRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param enabled
-	 */
-	public ScriptLoadReqImpl(VMImpl vm, boolean enabled) {
-		super(vm, enabled);
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/StepReqImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/StepReqImpl.java
deleted file mode 100644
index 119f69b..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/StepReqImpl.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.VMImpl;
-
-/**
- * {@link StepRequest} impl
- * 
- * @since 1.0
- */
-public class StepReqImpl extends EventReqImpl implements StepRequest {
-
-	private int stepkind = 0;
-	private ThreadReference thread = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param step
-	 * @param enabled
-	 */
-	public StepReqImpl(VMImpl vm, ThreadReference thread, int step, boolean enabled) {
-		super(vm, enabled);
-		this.thread = thread;
-		this.stepkind = step;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest#step()
-	 */
-	public int step() {
-		return stepkind;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest#thread()
-	 */
-	public ThreadReference thread() {
-		return thread;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/SuspendReqImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/SuspendReqImpl.java
deleted file mode 100644
index 5886faa..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/SuspendReqImpl.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.SuspendRequest;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.VMImpl;
-
-/**
- * {@link SuspendRequest} impl
- * 
- * @since 1.0
- */
-public class SuspendReqImpl extends EventReqImpl implements SuspendRequest {
-
-	private ThreadReference thread = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param enabled
-	 */
-	public SuspendReqImpl(VMImpl vm, ThreadReference thread, boolean enabled) {
-		super(vm, enabled);
-		this.thread = thread;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.SuspendRequest#thread()
-	 */
-	public ThreadReference thread() {
-		return thread;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/ThreadEnterReqImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/ThreadEnterReqImpl.java
deleted file mode 100644
index 2a2fba4..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/ThreadEnterReqImpl.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.VMImpl;
-
-/**
- * {@link ThreadEnterRequest} impl
- * 
- * @since 1.0
- */
-public class ThreadEnterReqImpl extends EventReqImpl implements ThreadEnterRequest {
-
-	private ThreadReference thread = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param enabled
-	 */
-	public ThreadEnterReqImpl(VMImpl vm, boolean enabled) {
-		super(vm, enabled);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public void addThreadFilter(ThreadReference thread) {
-		this.thread = thread;
-	}
-
-	/**
-	 * Returns the underlying {@link ThreadReference} this request applies to
-	 * 
-	 * @return the underlying {@link ThreadReference}
-	 */
-	public synchronized ThreadReference thread() {
-		return this.thread;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/ThreadExitReqImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/ThreadExitReqImpl.java
deleted file mode 100644
index 77617bf..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/ThreadExitReqImpl.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.VMImpl;
-
-/**
- * {@link ThreadExitRequest} impl
- * 
- * @since 1.0
- */
-public class ThreadExitReqImpl extends EventReqImpl implements ThreadExitRequest {
-
-	private ThreadReference thread = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param enabled
-	 */
-	public ThreadExitReqImpl(VMImpl vm, boolean enabled) {
-		super(vm, enabled);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public void addThreadFilter(ThreadReference thread) {
-		this.thread = thread;
-	}
-
-	/**
-	 * Returns the underlying {@link ThreadReference} this request applies to
-	 * 
-	 * @return the underlying {@link ThreadReference}
-	 */
-	public synchronized ThreadReference thread() {
-		return this.thread;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/VMDeathReqImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/VMDeathReqImpl.java
deleted file mode 100644
index b39d3b2..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/VMDeathReqImpl.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDeathRequest;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.VMImpl;
-
-/**
- * {@link VMDeathRequest} impl
- * 
- * @since 1.0
- */
-public class VMDeathReqImpl extends EventReqImpl implements VMDeathRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param enabled
-	 */
-	public VMDeathReqImpl(VMImpl vm, boolean enabled) {
-		super(vm, enabled);
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/VMDisconnectReqImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/VMDisconnectReqImpl.java
deleted file mode 100644
index 1bba98d..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/request/VMDisconnectReqImpl.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDisconnectRequest;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.VMImpl;
-
-/**
- * {@link VMDisconnectRequest} impl
- * 
- * @since 1.0
- */
-public class VMDisconnectReqImpl extends EventReqImpl implements VMDisconnectRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param enabled
-	 */
-	public VMDisconnectReqImpl(VMImpl vm, boolean enabled) {
-		super(vm, enabled);
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/Attributes.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/Attributes.java
deleted file mode 100644
index 5cf9557..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/Attributes.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.transport;
-
-/**
- * Interface for all the attribute constants
- * 
- * @since 1.0
- */
-public interface Attributes {
-
-	/**
-	 * Result meaning everything is OK
-	 */
-	public static final int OK = 0;
-	/**
-	 * Result meaning that tab is in a state that cannot accept the sent request
-	 */
-	public static final int ILLEGAL_TAB_STATE = 1;
-	/**
-	 * Result meaning the given tab id does not exist
-	 */
-	public static final int UNKNOWN_TAB = 2;
-	/**
-	 * Result meaning the debugger encountered an error
-	 */
-	public static final int DEBUGGER_ERROR = 3;
-	/**
-	 * Result meaning the request is unknown
-	 */
-	public static final int UNKNOWN_COMMAND = 4;
-	
-	/**
-	 * The name for the development tools service
-	 * <br><br>
-	 * Value is: <code>DevToolsService</code>
-	 */
-	public static final String TOOL_DEVTOOLSRVC = "DevToolsService"; //$NON-NLS-1$
-	/**
-	 * The name for the V8 debugger service
-	 * <br><br>
-	 * Value is: <code>V8Debugger</code>
-	 */
-	public static final String TOOL_V8DEBUGGER = "V8Debugger"; //$NON-NLS-1$
-	/**
-	 * The "command" attribute
-	 */
-	public static final String COMMAND = "command"; //$NON-NLS-1$
-	/**
-	 * The "data" attribute
-	 */
-	public static final String DATA = "data"; //$NON-NLS-1$
-	/**
-	 * The "dest" attribute
-	 */
-	public static final String DESTINATION = "dest"; //$NON-NLS-1$
-	/**
-	 * The "handshake" attribute
-	 */
-	public static final String HANDSHAKE = "handshake"; //$NON-NLS-1$
-	/**
-	 * The "result" attribute
-	 */
-	public static final String RESULT = "result"; //$NON-NLS-1$
-	/**
-	 * The "type" attribute
-	 */
-	public static final String TYPE = "type"; //$NON-NLS-1$
-	/**
-	 * the "tool" attribute
-	 */
-	public static final String TOOL = "tool"; //$NON-NLS-1$
-	/**
-	 * The "value" attribute
-	 */
-	public static final String VALUE = "value"; //$NON-NLS-1$
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/ChromeSocketConnection.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/ChromeSocketConnection.java
deleted file mode 100644
index efbb8cf..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/ChromeSocketConnection.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.transport;
-
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.Reader;
-import java.io.Writer;
-import java.net.Socket;
-import java.util.HashSet;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.internal.chrome.ChromePlugin;
-import org.eclipse.wst.jsdt.debug.internal.chrome.Tracing;
-import org.eclipse.wst.jsdt.debug.transport.Connection;
-import org.eclipse.wst.jsdt.debug.transport.packet.Packet;
-import org.eclipse.wst.jsdt.debug.transport.socket.SocketConnection;
-
-/**
- * A specialized {@link Connection} that communicates using {@link Socket}s
- * 
- * @since 1.0
- */
-public class ChromeSocketConnection extends SocketConnection {
-
-	public static final String HANDSHAKE = "ChromeDevToolsHandshake\r\n"; //$NON-NLS-1$
-	
-	private static final HashSet EVENTS;
-	
-	static {
-		EVENTS = new HashSet();
-		EVENTS.add(Commands.CLOSED);
-		EVENTS.add(Commands.NAVIGATED);
-	}
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param socket the underlying {@link Socket}, <code>null</code> is not accepted
-	 * 
-	 * @throws IOException
-	 */
-	public ChromeSocketConnection(Socket socket) throws IOException {
-		super(socket);
-		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.socket.SocketConnection#writePacket(org.eclipse.wst.jsdt.debug.transport.packet.Packet)
-	 */
-	public void writePacket(Packet packet) throws IOException {
-		String serialized = JSON.serialize((PacketImpl) packet);
-		if(PacketImpl.TRACE) {
-			Tracing.writeString("WRITE PACKET: "+serialized); //$NON-NLS-1$
-		}
-		Writer writer = getWriter();
-		writer.write(serialized);
-		writer.flush();
-	}
-
-	/**
-	 * Writes the standard handshake packet to connect
-	 * 
-	 * @param packet
-	 * @throws IOException
-	 */
-	public void writeHandShake() throws IOException {
-		if(PacketImpl.TRACE) {
-			Tracing.writeString("WRITE HANDSHAKE: "+HANDSHAKE); //$NON-NLS-1$
-		}
-		Writer writer = getWriter();
-		writer.write(HANDSHAKE);
-		writer.flush();
-	}
-	
-	/**
-	 * Method to wait for the socket reader to become ready after the handshake
-	 * 
-	 * @throws IOException
-	 */
-	void waitForReadyRead() throws IOException {
-		long timeout = System.currentTimeMillis() + 1000;
-		boolean timedout = System.currentTimeMillis() > timeout;
-		Reader reader = getReader();
-		while(!reader.ready() && !timedout) {
-			try {
-				Thread.sleep(100);
-				timedout = System.currentTimeMillis() > timeout;
-			} catch (InterruptedException e) {
-				ChromePlugin.log(e);
-			}
-		}
-		if(timedout) {
-			if(PacketImpl.TRACE) {
-				Tracing.writeString("HANDSHAKE: Timed out waiting for ready read from handshake"); //$NON-NLS-1$
-			}
-			//throw new IOException("Waiting for the socket to become available after receiving handshake timed out."); //$NON-NLS-1$
-		}
-	}
-	
-	/**
-	 * Reads the {@link HandShakePacket} packet from the the stream
-	 * 
-	 * @return the {@link HandShakePacket}, never <code>null</code>
-	 * @throws IOException
-	 */
-	public boolean readHandShake() throws IOException {
-		StringBuffer buffer = new StringBuffer();
-		//read the header first
-		int c = 0;
-		boolean r = false;
-		Reader reader = getReader();
-		while((c = reader.read()) > -1) {
-			buffer.append((char)c);
-			if(r) {
-				if(c == '\n') {
-					break;
-				}
-			}
-			r = c == '\r';
-		}
-		r = false;
-		while(reader.ready() && (c = reader.read()) > -1) {
-			if(r) {
-				if(c == '\n') {
-					break;
-				}
-			}
-			r = c == '\r';
-		}
-		if(PacketImpl.TRACE) {
-			Tracing.writeString("READ HANDSHAKE: "+buffer.toString()); //$NON-NLS-1$
-		}
-		return buffer.toString().equals(HANDSHAKE);	
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.socket.SocketConnection#readPacket()
-	 */
-	public Packet readPacket() throws IOException {
-		StringBuffer buffer = new StringBuffer();
-		int c = -1;
-		Reader reader = getReader();
-		String dest = null;
-		String tool = null;
-		String len = null;
-		boolean r = false;
-		while((c = reader.read()) > -1) {
-			if(r) {
-				if(c == '\n') {
-					String str = buffer.toString();
-					if(str.startsWith(JSON.DESTINATION_HEADER)) {
-						dest = grabAttrib(str);
-					}
-					else if(str.startsWith(JSON.TOOL_HEADER)) {
-						tool = grabAttrib(str);
-					}
-					else if(str.startsWith(JSON.CONTENT_LENGTH)) {
-						len = grabAttrib(str);
-					}
-					else if(str.equals("\r")) { //$NON-NLS-1$
-						break;
-					}
-					buffer = new StringBuffer();
-					r = false;
-				}
-				continue;
-			}
-			buffer.append((char)c);
-			r = c == '\r';
-		}
-		int length = 0;
-		try {
-			length = Integer.parseInt(len);
-		} catch (NumberFormatException e) {
-			throw new IOException("Failed to parse content length: " + len); //$NON-NLS-1$
-		}
-		char[] message = new char[length];
-		int n = 0;
-		int off = 0;
-		while (n < length) {
-			int count = reader.read(message, off + n, length - n);
-			if (count < 0) {
-				throw new EOFException();
-			}
-			n += count;
-		}
-		if(PacketImpl.TRACE) {
-			Tracing.writeString("READ PACKET: [destination - "+dest+"] [tool - "+tool+"] [length - "+length+"]"+new String(message)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-		}
-		Map json = (Map) JSON.read(new String(message));
-		json.put(Attributes.TOOL, tool);
-		json.put(Attributes.DESTINATION, dest);
-		if(json.containsKey(Attributes.RESULT)) {
-			if(EVENTS.contains(json.get(Attributes.COMMAND))) {
-				json.put(Attributes.TYPE, EventPacketImpl.EVENT);
-				return new EventPacketImpl(json);
-			}
-			json.put(Attributes.TYPE, ResponsePacketImpl.RESPONSE);
-			return new ResponsePacketImpl(json);
-		}
-		json.put(Attributes.TYPE, RequestPacketImpl.REQUEST);
-		return new RequestPacketImpl(json);
-	}
-	
-	/**
-	 * Grabs the attribute from the RHS of the header. Where all headers
-	 * have the form <code>[name]:[value]</code>.
-	 * 
-	 * @param str the string to parse
-	 * @return the <code>[value]</code> from the header
-	 */
-	String grabAttrib(String str) {
-		if(str != null) {
-			int idx = str.indexOf(':');
-			if(idx > -1) {
-				return str.substring(idx+1, str.length()-1);
-			}
-		}
-		return null;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/ChromeTransportService.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/ChromeTransportService.java
deleted file mode 100644
index 2b45905..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/ChromeTransportService.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others All rights reserved. This
- * program and the accompanying materials are made available under the terms of
- * the Eclipse Public License v1.0 which accompanies this distribution, and is
- * available at http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors: IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.transport;
-
-import java.io.IOException;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.transport.Connection;
-import org.eclipse.wst.jsdt.debug.transport.ListenerKey;
-import org.eclipse.wst.jsdt.debug.transport.socket.SocketConnection;
-import org.eclipse.wst.jsdt.debug.transport.socket.SocketTransportService;
-
-
-/**
- * Implementation of a transport service that using a {@link Socket} for communication
- * 
- * @since 1.0
- */
-public class ChromeTransportService extends SocketTransportService {
-
-	static final Class serverSocketClass = ServerSocket.class; // temporary used to pre-load the ServerSocket.class
-
-	/**
-	 * Map of {@link ListenerKey} to {@link ServerSocket}s
-	 */
-	Map listeners = new HashMap();
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.socket.SocketTransportService#getConnection(java.net.Socket)
-	 */
-	public SocketConnection getConnection(Socket socket) throws IOException {
-		return new ChromeSocketConnection(socket);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.socket.SocketTransportService#handleAccept(org.eclipse.wst.jsdt.debug.transport.Connection)
-	 */
-	public void handleAccept(Connection connection) throws IOException {
-		if(connection instanceof ChromeSocketConnection) {
-			ChromeSocketConnection cfconn = (ChromeSocketConnection) connection;
-			if (cfconn.readHandShake()) {
-				cfconn.writeHandShake();
-			}
-			return;
-		}
-		throw new IOException("failure establishing connection"); //$NON-NLS-1$
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.socket.SocketTransportService#handleAttach(org.eclipse.wst.jsdt.debug.transport.Connection)
-	 */
-	public void handleAttach(Connection connection) throws IOException {
-		if(connection instanceof ChromeSocketConnection) {
-			ChromeSocketConnection cfconn = (ChromeSocketConnection) connection;
-			cfconn.writeHandShake();
-			if (!cfconn.readHandShake()) {
-				throw new IOException("failure establishing connection"); //$NON-NLS-1$
-			}
-			return;
-		}
-		throw new IOException("failure establishing connection"); //$NON-NLS-1$
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/Commands.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/Commands.java
deleted file mode 100644
index c975a37..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/Commands.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.transport;
-
-/**
- * Interface for all the command constants
- * 
- * @since 1.0
- */
-public interface Commands {
-
-	/**
-	 * The "attach" command
-	 */
-	public static final String ATTACH = "attach"; //$NON-NLS-1$
-	/**
-	 * The "closed" command
-	 */
-	public static final String CLOSED = "closed"; //$NON-NLS-1$
-	/**
-	 * The "debugger_command" command
-	 */
-	public static final String DEBUGGER_COMMAND = "debugger_command"; //$NON-NLS-1$
-	/**
-	 * The "detach" command
-	 */
-	public static final String DETACH = "detach"; //$NON-NLS-1$
-	/**
-	 * The "evaluate_javascript" command
-	 */
-	public static final String EVALUATE_JAVASCRIPT = "evaluate_javascript"; //$NON-NLS-1$
-	/**
-	 * The "list_tabs" command
-	 */
-	public static final String LIST_TABS = "list_tabs"; //$NON-NLS-1$
-	/**
-	 * The "navigated" command
-	 */
-	public static final String NAVIGATED = "navigated"; //$NON-NLS-1$
-	/**
-	 * The "ping" command
-	 */
-	public static final String PING = "ping"; //$NON-NLS-1$
-	/**
-	 * The "version" command
-	 */
-	public static final String VERSION = "version"; //$NON-NLS-1$
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/EventPacketImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/EventPacketImpl.java
deleted file mode 100644
index c2f5b02..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/EventPacketImpl.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.transport;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.transport.packet.Event;
-
-/**
- * Event packet
- * 
- * @since 1.0
- */
-public class EventPacketImpl extends PacketImpl implements Event {
-
-	/**
-	 * The type of this packet
-	 */
-	public static final String EVENT = "event"; //$NON-NLS-1$
-	
-	private String event = null;
-	protected Number result = null;
-	protected Map body = null;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param event
-	 * @param tool the name of the tools service that issued this event
-	 */
-	public EventPacketImpl(String event, String tool) {
-		super(EVENT, tool);
-		if(event == null) {
-			throw new IllegalArgumentException(Messages.cannot_create_packet_with_no_event);
-		}
-		this.event = event;
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param json
-	 */
-	public EventPacketImpl(Map json) {
-		super(json);
-		this.event = (String) json.get(EVENT);
-		if(event == null) {
-			throw new IllegalArgumentException(Messages.no_event_found_in_json);
-		}
-		this.result = (Number) json.get(Attributes.RESULT);
-		Object data = json.get(Attributes.DATA);
-		if(data != null) {
-			this.body = new HashMap();
-			this.body.put(Attributes.DATA, data);
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Event#getEvent()
-	 */
-	public String getEvent() {
-		return event;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Event#getBody()
-	 */
-	public Map getBody() {
-		if(this.body == null) {
-			return Collections.EMPTY_MAP;
-		}
-		return this.body;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.chrome.transport.PacketImpl#toJSON()
-	 */
-	public Map toJSON() {
-		Map json = super.toJSON();
-		json.put(Attributes.COMMAND, event);
-		json.put(Attributes.RESULT, this.result);
-		if(this.body != null) {
-			json.put(Attributes.DATA, this.body.get(Attributes.DATA));
-		}
-		return json;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		Object json = toJSON();
-		buffer.append("EventPacketImpl: "); //$NON-NLS-1$
-		JSON.writeValue(json, buffer);
-		return buffer.toString();
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/JSON.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/JSON.java
deleted file mode 100644
index 82acc1a..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/JSON.java
+++ /dev/null
@@ -1,569 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.transport;
-
-import java.math.BigDecimal;
-import java.text.CharacterIterator;
-import java.text.StringCharacterIterator;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.internal.chrome.Tracing;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.NullImpl;
-import org.eclipse.wst.jsdt.debug.internal.chrome.jsdi.UndefinedImpl;
-
-/**
- * Class for reading / writing JSON objects
- * <br><br>
- * Chrome has the following types:
- * <ul>
- * 	<li>object</li>
- * 	<li>function</li>
- * 	<li>boolean</li>
- * 	<li>number</li>
- * 	<li>string</li>
- * 	<li>undefined</li>
- * 	<li>ref</li>
- * </ul> 
- * @since 1.0
- */
-public final class JSON {
-
-	static boolean TRACE = false;
-	
-	/**
-	 * Standard line feed / control feed terminus for Crossfire packets
-	 */
-	public static final String LINE_FEED = "\r\n"; //$NON-NLS-1$
-	/**
-	 * The default <code>Content-Length:</code> pre-amble
-	 */
-	public static final String CONTENT_LENGTH = "Content-Length:"; //$NON-NLS-1$
-	
-	/**
-	 * The default <code>Tool:</code> pre-amble
-	 */
-	public static final String TOOL_HEADER = "Tool:"; //$NON-NLS-1$
-	
-	/**
-	 * The default <code>Destination:</code> pre-amble
-	 */
-	public static final String DESTINATION_HEADER = "Destination:"; //$NON-NLS-1$
-	
-	/**
-	 * Enables / Disables tracing in the all of the JSDI implementations
-	 * 
-	 * @param trace
-	 */
-	public static void setTracing(boolean trace) {
-		TRACE = trace;
-	}
-	
-	/**
-	 * Constructor
-	 * 
-	 * No instantiation
-	 */
-	private JSON() {}
-	
-	/**
-	 * Writes the given key / value pair to the buffer in the form: <code>"key":["]value["]</code>
-	 * 
-	 * @param key
-	 * @param value
-	 * @param buffer
-	 */
-	public static void writeKeyValue(String key, Object value, StringBuffer buffer) {
-		writeString(key, buffer);
-		buffer.append(':');
-		writeValue(value, buffer);
-	}
-	
-	/**
-	 * Writes out the given value to the buffer. <br><br>
-	 * Values are written out as:
-	 * <ul>
-	 * 	<li>Boolean / Number: <code>value.toString()</code></li>
-	 * 	<li>String: <code>"value"</code></li>
-	 * 	<li>null: <code>null</code>
-	 * 	<li>Collection: <code>[{@link #writeValue(Object, StringBuffer)},...]</code></li>
-	 * 	<li>Map: <code>{"key":{@link #writeValue(Object, StringBuffer)},...}</code></li>
-	 * </ul>
-	 * 
-	 * @param value
-	 * @param buffer
-	 */
-	public static void writeValue(Object value, StringBuffer buffer) {
-		if (value == null) {
-			buffer.append(NullImpl.NULL);
-		}
-		else if (value instanceof Boolean || value instanceof Number) {
-			buffer.append(value.toString());
-		}
-		else if (value instanceof String) {
-			writeString((String) value, buffer);
-		}
-		else if(value instanceof Collection) {
-			writeArray((Collection) value, buffer);
-		}
-		else if(value instanceof Map) {
-			writeObject((Map) value, buffer);
-		}
-	}
-	
-	/**
-	 * Writes the given {@link String} into the given {@link StringBuffer} properly escaping
-	 * all control characters
-	 * 
-	 * @param string
-	 * @param buffer
-	 */
-	public static void writeString(String string, StringBuffer buffer) {
-		buffer.append('"');
-		int length = string.length();
-		for (int i = 0; i < length; i++) {
-			char c = string.charAt(i);
-			switch (c) {
-				case '"' :
-				case '\\' :
-				case '/' : {
-					buffer.append('\\');
-					buffer.append(c);
-					break;
-				}
-				case '\b' : {
-					buffer.append("\\b"); //$NON-NLS-1$
-					break;
-				}
-				case '\f' : {
-					buffer.append("\\f"); //$NON-NLS-1$
-					break;
-				}
-				case '\n' : {
-					buffer.append("\\n"); //$NON-NLS-1$
-					break;
-				}
-				case '\r' : {
-					buffer.append("\\r"); //$NON-NLS-1$
-					break;
-				}
-				case '\t' : {
-					buffer.append("\\t"); //$NON-NLS-1$
-					break;
-				}
-				default :
-					if (Character.isISOControl(c)) {
-						buffer.append("\\u"); //$NON-NLS-1$
-						String hexString = Integer.toHexString(c);
-						for (int j = hexString.length(); j < 4; j++) {
-							buffer.append('0');
-						}
-						buffer.append(hexString);
-					} else {
-						buffer.append(c);
-					}
-			}
-		}
-		buffer.append('"');
-	}
-
-	/**
-	 * Writes the given collection into an array string of the form: <code>[{@link #writeValue(Object, StringBuffer)},...]</code>
-	 * 
-	 * @param collection
-	 * @param buffer
-	 */
-	static void writeArray(Collection collection, StringBuffer buffer) {
-		buffer.append('[');
-		for (Iterator iterator = collection.iterator(); iterator.hasNext();) {
-			writeValue(iterator.next(), buffer);
-			if(iterator.hasNext()) {
-				buffer.append(',');
-			}
-		}
-		buffer.append(']');
-	}
-	
-	/**
-	 * Writes an object mapping to the given buffer in the form: <code>{"key":{@link #writeValue(Object, StringBuffer)},...}</code>
-	 * 
-	 * @param map
-	 * @param buffer
-	 */
-	public static void writeObject(Map map, StringBuffer buffer) {
-		buffer.append('{');
-		for (Iterator iterator = map.keySet().iterator(); iterator.hasNext();) {
-			String key = (String) iterator.next();
-			writeString(key, buffer);
-			buffer.append(':');
-			writeValue(map.get(key), buffer);
-			if(iterator.hasNext()) {
-				buffer.append(',');
-			}
-		}
-		buffer.append('}');
-	}
-	
-	/**
-	 * Writes the <code>Content-Length:N</code> pre-amble to the head of the given buffer
-	 * 
-	 * @param buffer
-	 * @param length
-	 */
-	public static void writeContentLength(StringBuffer buffer, int length) {
-		StringBuffer buff = new StringBuffer(18);
-		buff.append(CONTENT_LENGTH).append(length).append(LINE_FEED);
-		buffer.insert(0, buff.toString());
-	}
-	
-	/**
-	 * Writes the <code>Tool:name</code> pre-amble to the head of the given buffer
-	 * 
-	 * @param buffer
-	 * @param tool
-	 */
-	public static void writeToolHeader(StringBuffer buffer, String tool) {
-		StringBuffer buff = new StringBuffer(18);
-		buff.append(TOOL_HEADER).append(tool).append(LINE_FEED).append(LINE_FEED);
-		buffer.insert(0, buff.toString());
-	}
-	
-	public static void writeDestinationHeader(StringBuffer buffer, Number destination) {
-		StringBuffer buff = new StringBuffer();
-		buff.append(DESTINATION_HEADER).append(destination).append(LINE_FEED);
-		buffer.insert(0, buff.toString());
-	}
-	
-	/**
-	 * Serializes the given {@link PacketImpl} to a {@link String}
-	 * 
-	 * @param packet the packet to serialize
-	 * 
-	 * @return the serialized {@link String}, never <code>null</code>
-	 */
-	public static String serialize(PacketImpl packet) {
-		Object json = packet.toJSON();
-		StringBuffer buffer = new StringBuffer();
-		writeValue(json, buffer);
-		int length = buffer.toString().getBytes().length;
-		writeToolHeader(buffer, packet.tool());
-		writeContentLength(buffer, length);
-		if(packet.destination() != null) {
-			writeDestinationHeader(buffer, packet.destination());
-		}
-		if(TRACE) {
-			Tracing.writeString("SERIALIZE: " + packet.getType() +" packet as "+buffer.toString()); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		return buffer.toString();
-	}
-	
-	/**
-	 * Reads and returns a new object from the given json {@link String}. This method
-	 * will throw an {@link IllegalStateException} if parsing fails.
-	 * 
-	 * @param jsonString
-	 * @return the object, never <code>null</code>
-	 */
-	public static Object read(String jsonString) {
-		return parse(new StringCharacterIterator(jsonString));
-	}
-	
-	/**
-	 * Reads and returns a new object form the given {@link CharacterIterator} that corresponds to
-	 * a properly formatted json string. This method will throw an {@link IllegalStateException} if
-	 * parsing fails.
-	 * 
-	 * @param it the {@link CharacterIterator} to parse
-	 * @return the object, never <code>null</code>
-	 */
-	public static Object parse(CharacterIterator it) {
-		parseWhitespace(it);
-		Object result = parseValue(it);
-		parseWhitespace(it);
-		if (it.current() != CharacterIterator.DONE) {
-			throw error("should be done", it); //$NON-NLS-1$
-		}
-		return result;
-	}
-	
-	/**
-	 * Creates an {@link IllegalStateException} for the given message and iterator
-	 * 
-	 * @param message the message for the exception
-	 * @param it the {@link CharacterIterator} to parse
-	 * 
-	 * @return a new {@link IllegalStateException} 
-	 */
-	private static RuntimeException error(String message, CharacterIterator it) {
-		return new IllegalStateException("[" + it.getIndex() + "] " + message); //$NON-NLS-1$//$NON-NLS-2$
-	}
-	
-	/**
-	 * Chews up whitespace from the iterator
-	 * 
-	 * @param it the {@link CharacterIterator} to parse
-	 */
-	private static void parseWhitespace(CharacterIterator it) {
-		char c = it.current();
-		while (Character.isWhitespace(c)) {
-			c = it.next();
-		}
-	}
-	
-	/**
-	 * Parses the {@link Object} from the {@link CharacterIterator}. This method 
-	 * delegates to the proper parsing method depending on the current iterator context.
-	 * This method will throw an {@link IllegalStateException} if parsing fails.
-	 * 
-	 * @param it the {@link CharacterIterator} to parse
-	 * 
-	 * @return the new object, never <code>null</code>
-	 * @see #parseString(CharacterIterator)
-	 * @see #parseNumber(CharacterIterator)
-	 * @see #parseArray(CharacterIterator)
-	 * @see #parseObject(CharacterIterator)
-	 */
-	private static Object parseValue(CharacterIterator it) {
-		switch (it.current()) {
-			case '{' : {
-				return parseObject(it);
-			}
-			case '[' : {
-				return parseArray(it);
-			}
-			case '"' : {
-				return parseString(it);
-			}
-			case '-' :
-			case '0' :
-			case '1' :
-			case '2' :
-			case '3' :
-			case '4' :
-			case '5' :
-			case '6' :
-			case '7' :
-			case '8' :
-			case '9' : {
-				return parseNumber(it);
-			}
-			case 't' : {
-				parseText(Boolean.TRUE.toString(), it);
-				return Boolean.TRUE;
-			}
-			case 'f' : {
-				parseText(Boolean.FALSE.toString(), it);
-				return Boolean.FALSE;
-			}
-			case 'n' : {
-				parseText(NullImpl.NULL, it);
-				return null;
-			}
-			case 'u': {
-				parseText(UndefinedImpl.UNDEFINED, it);
-				return null;
-			}
-		}
-		throw error("Bad JSON starting character '" + it.current() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$;
-	}
-	
-	/**
-	 * Parses the JSON string from the {@link CharacterIterator}
-	 * 
-	 * @param it the {@link CharacterIterator} to parse
-	 * @return the JSON {@link String}, never <code>null</code>
-	 */
-	private static String parseString(CharacterIterator it) {
-		char c = it.next();
-		if (c == '"') {
-			it.next();
-			return ""; //$NON-NLS-1$
-		}
-		StringBuffer buffer = new StringBuffer();
-		while (c != '"') {
-			if (Character.isISOControl(c)) {
-				throw error("illegal iso control character: '" + Integer.toHexString(c) + "'", it); //$NON-NLS-1$ //$NON-NLS-2$);
-			}
-			if (c == '\\') {
-				c = it.next();
-				switch (c) {
-					case '"' :
-					case '\\' :
-					case '/' : {
-						buffer.append(c);
-						break;
-					}
-					case 'b' : {
-						buffer.append('\b');
-						break;
-					}
-					case 'f' : {
-						buffer.append('\f');
-						break;
-					}
-					case 'n' : {
-						buffer.append('\n');
-						break;
-					}
-					case 'r' : {
-						buffer.append('\r');
-						break;
-					}
-					case 't' : {
-						buffer.append('\t');
-						break;
-					}
-					case 'u' : {
-						StringBuffer unicode = new StringBuffer(4);
-						for (int i = 0; i < 4; i++) {
-							unicode.append(it.next());
-						}
-						try {
-							buffer.append((char) Integer.parseInt(unicode.toString(), 16));
-						} catch (NumberFormatException e) {
-							throw error("expected a unicode hex number but was '" + unicode.toString() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$););
-						}
-						break;
-					}
-					default : {
-						throw error("illegal escape character '" + c + "'", it); //$NON-NLS-1$ //$NON-NLS-2$););
-					}
-				}
-			} else {
-				buffer.append(c);
-			}
-			c = it.next();
-		}
-		c = it.next();
-		return buffer.toString();
-	}
-	
-	/**
-	 * Parses an {@link Map} object from the iterator or throws an
-	 * {@link IllegalStateException} if parsing fails.
-	 * 
-	 * @param it the {@link CharacterIterator} to parse
-	 * @return a new {@link Map} object, never <code>null</code>
-	 */
-	private static Map parseObject(CharacterIterator it) {
-		it.next();
-		parseWhitespace(it);
-		if (it.current() == '}') {
-			it.next();
-			return Collections.EMPTY_MAP;
-		}
-
-		Map map = new HashMap();
-		while (true) {
-			if (it.current() != '"') {
-				throw error("expected a string start '\"' but was '" + it.current() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			String key = parseString(it);
-			if (map.containsKey(key)) {
-				throw error("' already defined" + "key '" + key, it); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			parseWhitespace(it);
-			if (it.current() != ':') {
-				throw error("expected a pair separator ':' but was '" + it.current() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			it.next();
-			parseWhitespace(it);
-			Object value = parseValue(it);
-			map.put(key, value);
-			parseWhitespace(it);
-			if (it.current() == ',') {
-				it.next();
-				parseWhitespace(it);
-				continue;
-			}
-			if (it.current() != '}') {
-				throw error("expected an object close '}' but was '" + it.current() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			break;
-		}
-		it.next();
-		return map;
-	}
-	
-	/**
-	 * Parses an {@link ArrayList} from the given iterator or throws an
-	 * {@link IllegalStateException} if parsing fails
-	 * 
-	 * @param it the {@link CharacterIterator} to parse
-	 * @return a new {@link ArrayList} object never <code>null</code>
-	 */
-	private static List parseArray(CharacterIterator it) {
-		it.next();
-		parseWhitespace(it);
-		if (it.current() == ']') {
-			it.next();
-			return Collections.EMPTY_LIST;
-		}
-
-		List list = new ArrayList();
-		while (true) {
-			Object value = parseValue(it);
-			list.add(value);
-			parseWhitespace(it);
-			if (it.current() == ',') {
-				it.next();
-				parseWhitespace(it);
-				continue;
-			}
-			if (it.current() != ']') {
-				throw error("expected an array close ']' but was '" + it.current() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			break;
-		}
-		it.next();
-		return list;
-	}
-
-	/**
-	 * @param string
-	 * @param it
-	 */
-	private static void parseText(String string, CharacterIterator it) {
-		int length = string.length();
-		char c = it.current();
-		for (int i = 0; i < length; i++) {
-			if (c != string.charAt(i)) {
-				throw error("expected to parse '" + string + "' but character " + (i + 1) + " was '" + c + "'", it); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$;
-			}
-			c = it.next();
-		}
-	}
-
-	/**
-	 * Parses a {@link Number} object from the given {@link CharacterIterator}
-	 * 
-	 * @param it
-	 * @return a new {@link Number}, never <code>null</code>
-	 */
-	private static Object parseNumber(CharacterIterator it) {
-		StringBuffer buffer = new StringBuffer();
-		char c = it.current();
-		while (Character.isDigit(c) || c == '-' || c == '+' || c == '.' || c == 'e' || c == 'E') {
-			buffer.append(c);
-			c = it.next();
-		}
-		try {
-			return new BigDecimal(buffer.toString());
-		} catch (NumberFormatException e) {
-			throw error("expected a number but was '" + buffer.toString() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$;
-		}
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/Messages.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/Messages.java
deleted file mode 100644
index 93ee74b..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/Messages.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.transport;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.internal.chrome.transport.messages"; //$NON-NLS-1$
-	public static String cannot_create_packet_with_no_event;
-	public static String cannot_create_pakcet_null_json;
-	public static String cannot_create_request_null_command;
-	public static String cannot_create_response_null_command;
-	public static String no_command_in_json_response;
-	public static String no_command_in_request_json;
-	public static String no_event_found_in_json;
-	public static String no_packet_type_in_json;
-	public static String no_tool_found_in_packet_json;
-	public static String packet_tools_service_name_cannot_be_null;
-	public static String packet_type_cannot_be_null;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/PacketImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/PacketImpl.java
deleted file mode 100644
index 3ffef9a..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/PacketImpl.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.transport;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.transport.packet.Packet;
-
-/**
- * Basic packet
- * 
- * @since 1.0
- */
-public class PacketImpl implements Packet {
-
-	/**
-	 * Debugging flag
-	 */
-	public static boolean TRACE = false;
-	
-	private final String type;
-	private final String tool;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param type the type of the packet
-	 * @param tool the tools service expected to handle the packet
-	 */
-	public PacketImpl(String type, String tool) {
-		if(type == null) {
-			throw new IllegalArgumentException(Messages.packet_type_cannot_be_null);
-		}
-		if(tool == null) {
-			throw new IllegalArgumentException(Messages.packet_tools_service_name_cannot_be_null);
-		}
-		this.type = type;
-		this.tool = tool;
-	}
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param existing JSON map to create a packet from
-	 */
-	public PacketImpl(Map json) {
-		if(json == null) {
-			throw new IllegalArgumentException(Messages.cannot_create_pakcet_null_json);
-		}
-		type = (String) json.get(Attributes.TYPE);
-		if(type == null) {
-			throw new IllegalArgumentException(Messages.no_packet_type_in_json);
-		}
-		tool = (String) json.get(Attributes.TOOL);
-		if(tool == null) {
-			throw new IllegalArgumentException(Messages.no_tool_found_in_packet_json);
-		}
-	}
-	
-	/**
-	 * Sets if packet transfer should be traced
-	 * @param tracing
-	 */
-	public static void setTracing(boolean tracing) {
-		TRACE = tracing;
-	}
-	
-	/**
-	 * Returns the name of the tools service expected to handle this packet
-	 * 
-	 * @return the tools service name
-	 */
-	public String tool() {
-		return tool;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Packet#getType()
-	 */
-	public String getType() {
-		return type;
-	}
-
-	/**
-	 * Returns the intended tab destination for the packet, default returns <code>null</code>
-	 * 
-	 * @return the tab id or <code>null</code>
-	 */
-	public Number destination() {
-		return null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Packet#toJSON()
-	 */
-	public Map toJSON() {
-		Map json = new HashMap();
-		return json;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		Object json = toJSON();
-		buffer.append("PacketImpl: "); //$NON-NLS-1$
-		JSON.writeValue(json, buffer);
-		return buffer.toString();
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/RequestPacketImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/RequestPacketImpl.java
deleted file mode 100644
index e9e52bb..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/RequestPacketImpl.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.transport;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.transport.packet.Request;
-
-/**
- * Request packet
- * 
- * @since 1.0
- */
-public class RequestPacketImpl extends PacketImpl implements Request {
-
-	/**
-	 * The type of this packet
-	 */
-	public static final String REQUEST = "request"; //$NON-NLS-1$
-	private final String command;
-	private final Number destination;
-	private Map args = Collections.synchronizedMap(new HashMap(4));
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param command
-	 * @param tool the name of the tools service expected to handle the request
-	 * @param dest the tab id destination
-	 */
-	public RequestPacketImpl(String command, String tool, Number dest) {
-		super(REQUEST, tool);
-		if(command == null) {
-			throw new IllegalArgumentException(Messages.cannot_create_request_null_command);
-		}
-		this.command = command;
-		this.destination = dest;
-	}
-	
-	/**
-	 * Constructor
-	 * @param json
-	 */
-	public RequestPacketImpl(Map json) {
-		super(json);
-		this.command = (String) json.get(Attributes.COMMAND);
-		if(command == null) {
-			throw new IllegalArgumentException(Messages.no_command_in_request_json);
-		}
-		this.destination = (Number) json.get(Attributes.DESTINATION);
-	}
-
-	/**
-	 * Sets the given argument in the JSON map.
-	 * 
-	 * @param key the key for the attribute, <code>null</code> is not accepted
-	 * @param argument the value for the argument, <code>null</code> is not accepted
-	 */
-	public void setArgument(String key, Object argument) {
-		if(key == null) {
-			throw new IllegalArgumentException("The argument key cannot be null"); //$NON-NLS-1$
-		}
-		if(argument == null) {
-			throw new IllegalArgumentException("A null argument is not allowed"); //$NON-NLS-1$
-		}
-		args.put(key, argument);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Request#getCommand()
-	 */
-	public String getCommand() {
-		return command;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Request#getSequence()
-	 */
-	public int getSequence() {
-		return -1;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.chrome.transport.PacketImpl#destination()
-	 */
-	public Number destination() {
-		return this.destination;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Request#getArguments()
-	 */
-	public Map getArguments() {
-		return args;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.crossfire.transport.CFPacket#toJSON()
-	 */
-	public Map toJSON() {
-		Map json = super.toJSON();
-		json.put(Attributes.COMMAND, command);
-		return json;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		Object json = toJSON();
-		buffer.append("RequestPacketImpl: "); //$NON-NLS-1$
-		JSON.writeValue(json, buffer);
-		return buffer.toString();
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/ResponsePacketImpl.java b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/ResponsePacketImpl.java
deleted file mode 100644
index 28e25a3..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/ResponsePacketImpl.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.internal.chrome.transport;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.transport.packet.Response;
-
-/**
- * Response packet
- * 
- * @since 1.0
- */
-public class ResponsePacketImpl extends PacketImpl implements Response {
-
-	/**
-	 * The type of this packet
-	 */
-	public static final String RESPONSE = "response"; //$NON-NLS-1$
-	
-	private String command = null;
-	protected Number result = null;
-	protected Map body = null;
-	
-	/**
-	 * Constructor
-	 * @param command
-	 * @param tool the name of the tools service that issued this response
-	 */
-	public ResponsePacketImpl(String command, String tool) {
-		super(RESPONSE, tool);
-		if(command == null) {
-			throw new IllegalArgumentException(Messages.cannot_create_response_null_command);
-		}
-		this.command = command;
-	}
-	
-	/**
-	 * Constructor
-	 * @param json
-	 */
-	public ResponsePacketImpl(Map json) {
-		super(json);
-		this.command = (String) json.get(Attributes.COMMAND);
-		if(command == null) {
-			throw new IllegalArgumentException(Messages.no_command_in_json_response);
-		}
-		this.result = (Number) json.get(Attributes.RESULT);
-		Object data = json.get(Attributes.DATA);
-		if(data != null) {
-			this.body = new HashMap();
-			this.body.put(Attributes.DATA, data);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Response#getCommand()
-	 */
-	public String getCommand() {
-		return command;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Response#getRequestSequence()
-	 */
-	public int getRequestSequence() {
-		return -1;
-	}
-
-	/**
-	 * Returns the result of the request that caused this response
-	 * @see Attributes#OK
-	 * @see Attributes#ILLEGAL_TAB_STATE
-	 * @see Attributes#UNKNOWN_TAB
-	 * @see Attributes#DEBUGGER_ERROR
-	 * @see Attributes#UNKNOWN_COMMAND
-	 * @return the value of the result
-	 */
-	public int getResult() {
-		return this.result.intValue();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Response#getBody()
-	 */
-	public Map getBody() {
-		if(this.body == null) {
-			return Collections.EMPTY_MAP;
-		}
-		return this.body;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Response#isSuccess()
-	 */
-	public boolean isSuccess() {
-		return this.result.intValue() == Attributes.OK;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.transport.packet.Response#isRunning()
-	 */
-	public boolean isRunning() {
-		return true;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.chrome.transport.PacketImpl#toJSON()
-	 */
-	public Map toJSON() {
-		Map json = super.toJSON();
-		json.put(Attributes.COMMAND, command);
-		json.put(Attributes.RESULT, this.result);
-		if(this.body != null) {
-			json.put(Attributes.DATA, this.body.get(Attributes.DATA));
-		}
-		return json;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		Object json = toJSON();
-		buffer.append("ResponsePacketImpl: "); //$NON-NLS-1$
-		JSON.writeValue(json, buffer);
-		return buffer.toString();
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/messages.properties b/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/messages.properties
deleted file mode 100644
index 1935bee..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/transport/messages.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-###############################################################################
-# Copyright (c) 2011 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-cannot_create_packet_with_no_event=You cannot create an event packet with no event
-cannot_create_pakcet_null_json=You cannot create a packet from a null JSON mapping
-cannot_create_request_null_command=You cannot create a request packet with a null command
-cannot_create_response_null_command=A response packet cannot be created for a null command
-no_command_in_json_response=There was no command found in the initializing JSON map to create a response packet from
-no_command_in_request_json=There was no command found in the initializing JSON map to create a request packet from
-no_event_found_in_json=There was no event found in the initializing JSON map to create an event packet from
-no_packet_type_in_json=There was no type found in the initializing JSON map to create a packet from
-no_tool_found_in_packet_json=There was no tool found in the initializing JSON map to create a packet from
-packet_tools_service_name_cannot_be_null=Packet tool service name cannot be null
-packet_type_cannot_be_null=The type of a packet cannot be null
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/.project b/development/org.eclipse.wst.jsdt.debug.ie/.project
deleted file mode 100644
index 695dce1..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/.project
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.jsdt.debug.ie.debugger</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-	</buildSpec>
-	<natures>
-	</natures>
-</projectDescription>
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/Crossfire Server for Internet Explorer.sln b/development/org.eclipse.wst.jsdt.debug.ie/Crossfire Server for Internet Explorer.sln
deleted file mode 100644
index 8b56587..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/Crossfire Server for Internet Explorer.sln
+++ /dev/null
@@ -1,50 +0,0 @@
-﻿
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IECrossfireExtension", "IECrossfireExtension\IECrossfireExtension.vcxproj", "{EFAC86C6-2F6E-4657-A971-632DE21EFF9F}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IECrossfireServer", "IECrossfireServer\IECrossfireServer.vcxproj", "{2B73B89A-A1B4-479B-8751-A25B9036A9AF}"
-EndProject
-Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "IECrossfireInstaller", "IECrossfireInstaller\IECrossfireInstaller.vdproj", "{CDECB8BE-5076-4AF2-9E70-D990325F9E77}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IECrossfireServerPS", "IECrossfireServer\IECrossfireServerPS.vcxproj", "{668D1F72-89E4-47B7-AB3C-6851CDD0073D}"
-	ProjectSection(ProjectDependencies) = postProject
-		{2B73B89A-A1B4-479B-8751-A25B9036A9AF} = {2B73B89A-A1B4-479B-8751-A25B9036A9AF}
-	EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IECrossfireExtensionPS", "IECrossfireExtension\IECrossfireExtensionPS.vcxproj", "{0B6A6526-C6C0-4619-A938-E3D90A16A9B7}"
-	ProjectSection(ProjectDependencies) = postProject
-		{EFAC86C6-2F6E-4657-A971-632DE21EFF9F} = {EFAC86C6-2F6E-4657-A971-632DE21EFF9F}
-	EndProjectSection
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|Win32 = Debug|Win32
-		Release|Win32 = Release|Win32
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{EFAC86C6-2F6E-4657-A971-632DE21EFF9F}.Debug|Win32.ActiveCfg = Debug|Win32
-		{EFAC86C6-2F6E-4657-A971-632DE21EFF9F}.Debug|Win32.Build.0 = Debug|Win32
-		{EFAC86C6-2F6E-4657-A971-632DE21EFF9F}.Release|Win32.ActiveCfg = Release|Win32
-		{EFAC86C6-2F6E-4657-A971-632DE21EFF9F}.Release|Win32.Build.0 = Release|Win32
-		{2B73B89A-A1B4-479B-8751-A25B9036A9AF}.Debug|Win32.ActiveCfg = Debug|Win32
-		{2B73B89A-A1B4-479B-8751-A25B9036A9AF}.Debug|Win32.Build.0 = Debug|Win32
-		{2B73B89A-A1B4-479B-8751-A25B9036A9AF}.Release|Win32.ActiveCfg = Release|Win32
-		{2B73B89A-A1B4-479B-8751-A25B9036A9AF}.Release|Win32.Build.0 = Release|Win32
-		{CDECB8BE-5076-4AF2-9E70-D990325F9E77}.Debug|Win32.ActiveCfg = Debug
-		{CDECB8BE-5076-4AF2-9E70-D990325F9E77}.Debug|Win32.Build.0 = Debug
-		{CDECB8BE-5076-4AF2-9E70-D990325F9E77}.Release|Win32.ActiveCfg = Release
-		{CDECB8BE-5076-4AF2-9E70-D990325F9E77}.Release|Win32.Build.0 = Release
-		{668D1F72-89E4-47B7-AB3C-6851CDD0073D}.Debug|Win32.ActiveCfg = Debug|Win32
-		{668D1F72-89E4-47B7-AB3C-6851CDD0073D}.Debug|Win32.Build.0 = Debug|Win32
-		{668D1F72-89E4-47B7-AB3C-6851CDD0073D}.Release|Win32.ActiveCfg = Release|Win32
-		{668D1F72-89E4-47B7-AB3C-6851CDD0073D}.Release|Win32.Build.0 = Release|Win32
-		{0B6A6526-C6C0-4619-A938-E3D90A16A9B7}.Debug|Win32.ActiveCfg = Debug|Win32
-		{0B6A6526-C6C0-4619-A938-E3D90A16A9B7}.Debug|Win32.Build.0 = Debug|Win32
-		{0B6A6526-C6C0-4619-A938-E3D90A16A9B7}.Release|Win32.ActiveCfg = Release|Win32
-		{0B6A6526-C6C0-4619-A938-E3D90A16A9B7}.Release|Win32.Build.0 = Release|Win32
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-EndGlobal
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/ExplorerBar.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/ExplorerBar.cpp
deleted file mode 100644
index a31cbfc..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/ExplorerBar.cpp
+++ /dev/null
@@ -1,746 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "stdafx.h"
-#include "ExplorerBar.h"
-
-/* initialize constants */
-const UINT ExplorerBar::ServerStateChangeMsg = RegisterWindowMessage(L"IECrossfireServerStateChanged");
-const wchar_t* ExplorerBar::ServerWindowClass = L"_IECrossfireServer";
-const wchar_t* ExplorerBar::WindowClass = L"_ExplorerBarMessageWindow";
-
-
-ExplorerBar::ExplorerBar() {
-	m_hWnd = m_hWndParent = 0;
-	m_pSite = NULL;
-	m_server = NULL;
-	m_serverPort = 0;
-	m_serverState = STATE_DISCONNECTED;
-
-	HKEY key;
-	LONG result = RegOpenKeyEx(HKEY_CURRENT_USER, L"Software\\IBM\\IECrossfireServer", 0, KEY_QUERY_VALUE, &key);
-	if (result != ERROR_SUCCESS && result != ERROR_FILE_NOT_FOUND) {
-		Logger::error("ExplorerBar ctor: RegOpenKeyEx() failed", result);
-	} else {
-		DWORD size = sizeof(unsigned int);
-		result = RegQueryValueEx(key, L"LastPort", NULL, NULL, (LPBYTE)&m_serverPort, &size);
-		if (result != ERROR_SUCCESS) {
-			Logger::error("ExplorerBar ctor: RegQueryValueEx() failed", result);
-		}
-		RegCloseKey(key);
-	}
-	if (!m_serverPort) {
-		m_serverPort = 5000;
-	}
-
-	/* create a message-only window to receive server state change notifications */
-	HINSTANCE module = GetModuleHandle(NULL);
-	WNDCLASS ex;
-	ex.style = 0;
-	ex.lpfnWndProc = WndProc;
-	ex.cbClsExtra = 0;
-	ex.cbWndExtra = 0;
-	ex.hInstance = module;
-	ex.hIcon = NULL;
-	ex.hCursor = NULL;
-	ex.hbrBackground = NULL;
-	ex.lpszMenuName = NULL;
-	ex.lpszClassName = WindowClass;
-	RegisterClass(&ex);
-	m_messageWindow = CreateWindow(WindowClass, NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, module, NULL);
-	if (!m_messageWindow) {
-		Logger::error("ExplorerBar ctor(): failed to create message-only window", GetLastError());
-	} else {
-		SetWindowLongPtr(m_messageWindow, GWL_USERDATA, (__int3264)(LONG_PTR)this);
-	}
-}
-
-ExplorerBar::~ExplorerBar() {
-	if (m_server) {
-		m_server->Release();
-	}
-	if (m_messageWindow) {
-		DestroyWindow(m_messageWindow);
-		UnregisterClass(WindowClass, GetModuleHandle(NULL));
-	}
-}
-
-
-/* IClassFactory */
-
-STDMETHODIMP ExplorerBar::CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppvObject) {
-	CComObject<ExplorerBar>* explorerBar = NULL;
-	HRESULT hr = CComObject<ExplorerBar>::CreateInstance(&explorerBar);
-	if (FAILED(hr)) {
-		Logger::error("ExplorerBar.CreateInstance(): CreateInstance() failed", hr);
-		return S_FALSE;
-	}
-	explorerBar->AddRef();
-	hr = explorerBar->QueryInterface(riid, ppvObject);
-	explorerBar->Release();
-	return hr;
-}
-
-STDMETHODIMP ExplorerBar::LockServer(BOOL fLock) {
-	return S_OK;
-}
-
-/* IObjectWithSite */
-
-STDMETHODIMP ExplorerBar::SetSite(IUnknown *punkSite) {
-	if (m_pSite) {
-		m_pSite->Release();
-		m_pSite = NULL;
-	}
-	if (punkSite) {
-		initServer(false);
-		IOleWindow *pOleWindow;
-		m_hWndParent = NULL;
-		if (SUCCEEDED(punkSite->QueryInterface(IID_IOleWindow, (LPVOID*)&pOleWindow))) {
-			pOleWindow->GetWindow(&m_hWndParent);
-			pOleWindow->Release();
-		}
-		if (!m_hWndParent) {
-			return E_FAIL;
-		}
-		if (!createWindow()) {
-			return E_FAIL;
-		}
-		if (FAILED(punkSite->QueryInterface(IID_IInputObjectSite, (LPVOID*)&m_pSite))) {
-			return E_FAIL;
-		}
-	}
-	return S_OK;
-}
-
-STDMETHODIMP ExplorerBar::GetSite(REFIID riid, LPVOID *ppvReturn) {
-	*ppvReturn = NULL;
-	if (m_pSite) {
-		return m_pSite->QueryInterface(riid, ppvReturn);
-	}
-	return E_FAIL;
-}
-
-/* IPersistStream */
-
-STDMETHODIMP ExplorerBar::GetClassID(CLSID *pClassID) {
-	*pClassID = CLSID_ExplorerBar;
-	return S_OK;
-}
-
-STDMETHODIMP ExplorerBar::IsDirty() {
-	return S_FALSE;
-}
-
-STDMETHODIMP ExplorerBar::Load(IStream *pStm) {
-	return S_OK;
-}
-
-STDMETHODIMP ExplorerBar::Save(IStream *pStm, BOOL fClearDirty) {
-	return S_OK;
-}
-
-STDMETHODIMP ExplorerBar::GetSizeMax(ULARGE_INTEGER *pcbSize) {
-	return E_NOTIMPL;
-}
-
-/* IDeskBand */
-
-STDMETHODIMP ExplorerBar::GetWindow(HWND *phwnd) {
-	*phwnd = m_hWnd;
-	return S_OK;
-}
-
-STDMETHODIMP ExplorerBar::ContextSensitiveHelp(BOOL fEnterMode) {
-	return E_NOTIMPL;
-}
-
-STDMETHODIMP ExplorerBar::ShowDW(BOOL fShow) {
-	if (m_hWnd) {
-		ShowWindow(m_hWnd, fShow ? SW_SHOW : SW_HIDE);
-	}
-    return S_OK;
-}
-
-STDMETHODIMP ExplorerBar::CloseDW(DWORD dwReserved) {
-	ShowWindow(m_hWnd, SW_HIDE);
-	if (IsWindow(m_hWnd)) {
-		DestroyWindow(m_hWnd);
-	}
-	m_hWnd = NULL;
-	return S_OK;
-}
-
-STDMETHODIMP ExplorerBar::ResizeBorderDW(LPCRECT prcBorder, IUnknown *punkToolbarSite, BOOL fReserved) {
-	return E_NOTIMPL;
-}
-
-STDMETHODIMP ExplorerBar::GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO *pdbi) {
-	if (pdbi) {
-		if (pdbi->dwMask & DBIM_MINSIZE) {
-			pdbi->ptMinSize.x = 0;
-			pdbi->ptMinSize.y = 50;
-		}
-
-		if (pdbi->dwMask & DBIM_MAXSIZE) {
-			pdbi->ptMaxSize.x = -1;
-			pdbi->ptMaxSize.y = -1;
-		}
-
-		if (pdbi->dwMask & DBIM_INTEGRAL) {
-			pdbi->ptIntegral.x = 1;
-			pdbi->ptIntegral.y = 1;
-		}
-
-		if (pdbi->dwMask & DBIM_ACTUAL) {
-			pdbi->ptMinSize.x = 0;
-			pdbi->ptMinSize.y = 50;
-		}
-
-		if (pdbi->dwMask & DBIM_TITLE) {
-			wchar_t* title = L"Crossfire";
-			wcsncpy_s(pdbi->wszTitle, 256, title, wcslen(title));
-        }
-
-		if (pdbi->dwMask & DBIM_MODEFLAGS) {
-			pdbi->dwModeFlags = DBIMF_NORMAL | DBIMF_VARIABLEHEIGHT;
-		}
-
-		if (pdbi->dwMask & DBIM_BKCOLOR) {
-			pdbi->dwMask &= ~DBIM_BKCOLOR;
-		}
-		return S_OK;
-	}
-
-	return E_INVALIDARG;
-}
-
-/* IInputObject */
-
-STDMETHODIMP ExplorerBar::UIActivateIO(BOOL fActivate, LPMSG pMsg) {
-	if (fActivate) {
-		SetFocus(m_hWnd);
-	}
-	return S_OK;
-}
-
-STDMETHODIMP ExplorerBar::HasFocusIO() {
-	return m_bFocus ? S_OK : S_FALSE;
-}
-
-STDMETHODIMP ExplorerBar::TranslateAcceleratorIO(LPMSG pMsg) {
-	return E_NOTIMPL;
-}
-
-/* ExplorerBar */
-
-void ExplorerBar::createControls() {
-	m_statusLabel = CreateWindowEx(
-		0,
-		WC_STATIC,
-		NULL,
-		WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | SS_NOTIFY | SS_LEFTNOWORDWRAP,
-		0, 0, 0, 0,
-		m_hWnd,
-		0,
-		g_hInst,
-		(LPVOID)this);
-
-	m_separator = CreateWindowEx(
-		0,
-		WC_STATIC,
-		NULL,
-		WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | SS_NOTIFY | SS_OWNERDRAW,
-		0, 0, 0, 0,
-		m_hWnd,
-		0,
-		g_hInst,
-		(LPVOID)this);
-
-	m_portLabel = CreateWindowEx(
-		0,
-		WC_STATIC,
-		NULL,
-		WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | SS_NOTIFY | SS_LEFTNOWORDWRAP,
-		0, 0, 0, 0,
-		m_hWnd,
-		0,
-		g_hInst,
-		(LPVOID)this);
-	SetWindowText(m_portLabel, L"Port:");
-
-	m_portText = CreateWindowEx(
-        WS_EX_CLIENTEDGE,
-        WC_EDIT,
-        NULL,
-        WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | WS_CLIPSIBLINGS | WS_TABSTOP | ES_NUMBER,
-        0, 0, 0, 0,
-        m_hWnd,
-        0,
-		g_hInst,
-		(LPVOID)this);
-	SendMessage(m_portText, EM_SETLIMITTEXT, 5, 0);
-
-	m_portUpDown = CreateWindowEx(
-        0,
-		UPDOWN_CLASS,
-        NULL,
-        WS_CHILD | WS_VISIBLE | UDS_AUTOBUDDY | UDS_WRAP | UDS_ALIGNRIGHT | UDS_SETBUDDYINT | UDS_NOTHOUSANDS,
-        0, 0, 0, 0,
-        m_hWnd,
-        0,
-		g_hInst,
-		(LPVOID)this);
-	SendMessage(m_portUpDown, UDM_SETRANGE32, 1000, 65534);
-
-	m_button = CreateWindowEx(
-        0,
-		WC_BUTTON,
-        NULL,
-		WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | BS_PUSHBUTTON | WS_TABSTOP,
-        0, 0, 0, 0,
-        m_hWnd,
-        0,
-		g_hInst,
-		(LPVOID)this);
-
-	m_errorLabel = CreateWindowEx(
-		0,
-		WC_STATIC,
-		NULL,
-		WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | SS_NOTIFY | SS_LEFTNOWORDWRAP,
-		0, 0, 0, 0,
-		m_hWnd,
-		0,
-		g_hInst,
-		(LPVOID)this);
-
-	/*
-	 * Calculate the size of the port text and cache it.  This is done
-	 * because its preferred size does not change, and to provide a
-	 * baseline for vertical centering of the other controls.
-	 */
-	HDC hDC = GetDC(m_portText);
-	LRESULT newFont = SendMessage(m_portText, WM_GETFONT, 0, 0);
-	HGDIOBJ oldFont = SelectObject(hDC, (HGDIOBJ)newFont);
-	TEXTMETRICW tm;
-	GetTextMetrics(hDC, &tm);
-	LONG height = tm.tmHeight;
-	RECT rect;
-	DrawText(hDC, L"000000", 6, &rect, DT_CALCRECT | DT_EDITCONTROL | DT_NOPREFIX);
-	LONG width = rect.right - rect.left;
-	if (newFont != 0) {
-		SelectObject(hDC, oldFont);
-	}
-	ReleaseDC(m_portText, hDC);
-
-	/* Factor in the size of the text control's trim */
-	SetRect(&rect, 0, 0, width, height);
-	LONG style = GetWindowLong(m_portText, GWL_STYLE);
-	LONG exStyle = GetWindowLong(m_portText, GWL_EXSTYLE);
-	AdjustWindowRectEx(&rect, style, false, exStyle);
-	width = rect.right - rect.left;
-	height = rect.bottom - rect.top;
-	width += 2; height += 2;
-	m_portTextSize.x = width;
-	m_portTextSize.y = height;
-
-	/* subclass the separator in order to owner-draw it */
-//	SetWindowLongPtr(m_separator, GWL_USERDATA, (__int3264)(LONG_PTR)this);
-//	staticProc = (WNDPROC)SetWindowLongPtr(m_separator, GWLP_WNDPROC, (__int3264)(LONG_PTR)WndProc);
-
-//	Logger::error("handle: m_button", (int)m_button);
-//	Logger::error("handle: m_errorLabel", (int)m_errorLabel);
-//	Logger::error("handle: m_portLabel", (int)m_portLabel);
-//	Logger::error("handle: m_portText", (int)m_portText);
-//	Logger::error("handle: m_portUpDown", (int)m_portUpDown);
-//	Logger::error("handle: m_separator", (int)m_separator);
-//	Logger::error("handle: m_statusLabel", (int)m_statusLabel);
-//	Logger::error("handle: m_hWnd", (int)m_hWnd);
-//	Logger::error("handle: m_hWndParent", (int)m_hWndParent);
-}
-
-bool ExplorerBar::createWindow() {
-	if (!m_hWnd) {
-		if (!m_hWndParent) {
-			return false;
-		}
-
-		LPCTSTR CLASSNAME = L"CrossfireExplorerBar";
-		if (!GetClassInfo(g_hInst, CLASSNAME, &wc)) {
-			ZeroMemory(&wc, sizeof(wc));
-			wc.style = /*CS_HREDRAW | CS_VREDRAW |*/ CS_GLOBALCLASS;
-			wc.lpfnWndProc = (WNDPROC)WndProc;
-			wc.cbClsExtra = 0;
-			wc.cbWndExtra = 0;
-			wc.hInstance = g_hInst;
-			wc.hIcon = NULL;
-			wc.hCursor = LoadCursor(NULL, IDC_ARROW);
-			wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
-			wc.lpszMenuName = NULL;
-			wc.lpszClassName = CLASSNAME;
-
-			if (!RegisterClass(&wc)) {
-				// If RegisterClass fails, CreateWindow below will fail.
-			}
-		}
-
-		RECT rc;
-		GetClientRect(m_hWndParent, &rc);
-
-		CreateWindowEx(
-			0,
-			CLASSNAME,
-			NULL,
-			WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE,
-			rc.left,
-			rc.top,
-			rc.right - rc.left,
-			rc.bottom - rc.top,
-			m_hWndParent,
-			NULL,
-			g_hInst,
-			(LPVOID)this);
-
-		if (NULL != m_hWnd) {
-			createControls();
-			initServer(false);
-			layoutControls();
-		}
-	}
-
-	return NULL != m_hWnd;
-}
-
-bool ExplorerBar::initServer(bool startIfNeeded) {
-	if (m_server) {
-		return true;
-	}
-	if (!startIfNeeded && !FindWindow(ServerWindowClass, NULL)) {
-		return false;
-	}
-
-	if (!Util::VerifyActiveScriptDebugger() || !Util::VerifyDebugPreference()) {
-		return false;
-	}
-
-	CComPtr<ICrossfireServerClass> serverClass = NULL;
-	HRESULT hr = CoGetClassObject(CLSID_CrossfireServer, CLSCTX_ALL, 0, IID_ICrossfireServerClass, (LPVOID*)&serverClass);
-	if (FAILED(hr)) {
-		Logger::error("ExplorerBar.initServer(): CoGetClassObject() failed", hr);
-		return false;
-	}
-
-//	HWND rootWindow = GetAncestor(m_hWndParent, GA_ROOT);
-	hr = serverClass->GetServer(/*(unsigned long)rootWindow,*/ &m_server);
-	if (FAILED(hr)) {
-		Logger::error("ExplorerBar.initServer(): GetController() failed", hr);
-		return false;
-	}
-
-	hr = m_server->getState(&m_serverState);
-	if (FAILED(hr)) {
-		Logger::error("ExplorerBar.initServer(): getState() failed", hr);
-	}
-
-	if (m_serverState != STATE_DISCONNECTED) {
-		hr = m_server->getPort(&m_serverPort);
-		if (FAILED(hr)) {
-			Logger::error("ExplorerBar.initServer(): getPort() failed", hr);
-		}
-	}
-
-	return true;
-}
-
-void ExplorerBar::layoutControls() {
-	int x = SPACING_WIDTH;
-	int y = SPACING_WIDTH;
-	const int BUFFER_SIZE = 64;
-
-	/* status label is always shown */
-	switch (m_serverState) {
-		case STATE_DISCONNECTED: {
-			SetWindowText(m_statusLabel, L"Crossfire Debugger State: Disconnected");
-			break;
-		}
-		case STATE_LISTENING: {
-			std::wstring result;
-			std::wstringstream stringStream;
-			stringStream << L"Crossfire Debugger State: Listening on port ";
-			stringStream << m_serverPort;
-			result.assign(stringStream.str());
-			SetWindowText(m_statusLabel, result.c_str());
-			break;
-		}
-		case STATE_CONNECTED: {
-			std::wstring result;
-			std::wstringstream stringStream;
-			stringStream << L"Crossfire Debugger State: Connected on port ";
-			stringStream << m_serverPort;
-			result.assign(stringStream.str());
-			SetWindowText(m_statusLabel, result.c_str());
-			break;
-		}
-	}
-
-	HDC hDC = GetDC(m_statusLabel);
-	LRESULT newFont = SendMessage(m_statusLabel, WM_GETFONT, 0, 0);
-	HGDIOBJ oldFont = SelectObject(hDC, (HGDIOBJ)newFont);
-	int length = GetWindowTextLength(m_statusLabel);
-	RECT rect;
-	TCHAR buffer[BUFFER_SIZE];
-	GetWindowText(m_statusLabel, buffer, BUFFER_SIZE);
-	DrawText(hDC, buffer, length, &rect, DT_CALCRECT);
-	LONG width = rect.right - rect.left;
-	LONG height = rect.bottom - rect.top;
-	if (newFont) {
-		SelectObject(hDC, oldFont);
-	}
-	ReleaseDC(m_statusLabel, hDC);
-	SetWindowPos(m_statusLabel, 0, x, y + (m_portTextSize.y - height) / 2, width, height, SWP_NOZORDER | SWP_NOACTIVATE);
-	x += width + SPACING_WIDTH;
-
-	/* vertical separator is always shown */
-	EnableWindow(m_separator, m_server != NULL);
-	SetWindowPos(m_separator, 0, x, y, SEPARATOR_WIDTH, m_portTextSize.y, SWP_NOZORDER | SWP_NOACTIVATE);
-	x += SEPARATOR_WIDTH + SPACING_WIDTH;
-
-	/* "port:" label */
-	if (m_serverState != STATE_DISCONNECTED) {
-		ShowWindow(m_portLabel, SW_HIDE);
-	} else {
-		ShowWindow(m_portLabel, SW_SHOW);
-		hDC = GetDC(m_portLabel);
-		newFont = SendMessage(m_portLabel, WM_GETFONT, 0, 0);
-		oldFont = SelectObject(hDC, (HGDIOBJ)newFont);
-		length = GetWindowTextLength(m_portLabel);
-		GetWindowText(m_portLabel, buffer, BUFFER_SIZE);
-		DrawText(hDC, buffer, length, &rect, DT_CALCRECT);
-		width = rect.right - rect.left;
-		height = rect.bottom - rect.top;
-		if (newFont) {
-			SelectObject(hDC, oldFont);
-		}
-		ReleaseDC(m_portLabel, hDC);
-		SetWindowPos(m_portLabel, 0, x, y + (m_portTextSize.y - height) / 2, width, height, SWP_NOZORDER | SWP_NOACTIVATE);
-		x += width + SPACING_WIDTH;
-	}
-
-	/* port text */
-	if (m_serverState != STATE_DISCONNECTED) {
-		ShowWindow(m_portText, SW_HIDE);
-		ShowWindow(m_portUpDown, SW_HIDE);
-	} else {
-		SendMessage(m_portUpDown, UDM_SETPOS32, 0, m_serverPort);
-		ShowWindow(m_portText, SW_SHOW);
-		ShowWindow(m_portUpDown, SW_SHOW);
-
-		SetWindowPos(m_portText, 0, x, y, m_portTextSize.x, m_portTextSize.y, SWP_NOZORDER | SWP_NOACTIVATE);
-		x += m_portTextSize.x;
-
-		width = GetSystemMetrics(SM_CXVSCROLL);
-		SetWindowPos(m_portUpDown, 0, x, y, width, m_portTextSize.y, SWP_NOZORDER | SWP_NOACTIVATE);
-		x += width + SEPARATOR_WIDTH;
-	}
-
-	/* button is always shown */
-	switch (m_serverState) {
-		case STATE_DISCONNECTED: {
-			SetWindowText(m_button, L"Listen");
-			break;
-		}
-		case STATE_LISTENING: {
-			SetWindowText(m_button, L"Stop");
-			break;
-		}
-		case STATE_CONNECTED: {
-			SetWindowText(m_button, L"Disconnect");
-			break;
-		}
-	}
-	hDC = GetDC(m_button);
-	newFont = SendMessage(m_button, WM_GETFONT, 0, 0);
-	if (newFont != 0) {
-		oldFont = SelectObject(hDC, (HGDIOBJ)newFont);
-	}
-	GetWindowText(m_button, buffer, BUFFER_SIZE);
-	DrawText(hDC, buffer, -1, &rect, DT_CALCRECT | DT_SINGLELINE);
-	width = rect.right - rect.left;
-	height = rect.bottom - rect.top;
-	if (newFont != 0) {
-		SelectObject(hDC, oldFont);
-	}
-	ReleaseDC(m_button, hDC);
-	width += 10;
-	SetWindowPos(m_button, 0, x, y, width, m_portTextSize.y, SWP_NOZORDER | SWP_NOACTIVATE);
-	x += width + SEPARATOR_WIDTH;
-
-	/* clear the error text */
-	SetWindowPos(m_errorLabel, 0, x, y + (m_portTextSize.y - height) / 2, 0, 0, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOSIZE);
-	setErrorText(L"");
-}
-
-bool ExplorerBar::onCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) {
-	if ((HWND)lParam != m_button) {
-		return true;
-	}
-
-	if (HIWORD(wParam) != BN_CLICKED) {
-		return true;
-	}
-
-	switch (m_serverState) {
-		case STATE_LISTENING:
-		case STATE_CONNECTED: {
-			if (FAILED(m_server->stop())) {
-				setErrorText(L"Failed to stop the Crossfire server");
-			}
-			break;
-		}
-		case STATE_DISCONNECTED: {
-			TCHAR buffer[9];
-			if (GetWindowText(m_portText, buffer, 9)) {
-				int port = _wtoi(buffer);
-				if (!(1000 <= port && port <= 65534)) {
-					setErrorText(L"Valid port range: 1000-65534");
-				} else {
-					if (!initServer(true)) {
-						setErrorText(L"Failed to initialize Crossfire server");
-					} else {
-						if (FAILED(m_server->start(port, 54124 /* debug port */))) {
-							setErrorText(L"Failed to start the Crossfire server");
-						}
-					}
-				}
-			}
-		}
-	}
-
-	return true;
-}
-
-bool ExplorerBar::onNCCreate(HWND hWnd, WPARAM wParam, LPARAM lParam) {
-	if (!m_hWnd) {
-		m_hWnd = hWnd;
-	}
-	return true;
-}
-
-//bool ExplorerBar::onPaint(HWND hWnd, WPARAM wParam, LPARAM lParam) {
-//	if (hWnd != m_separator) {
-//		return true;
-//	}
-//
-//	RECT clientRect;
-//	GetClientRect(m_separator, &clientRect);
-//	int lineWidth = GetSystemMetrics (SM_CXBORDER);
-//	clientRect.right = clientRect.left + lineWidth * 2;
-//	HDC hDC = GetDC(m_separator);
-//	DrawEdge(hDC, &clientRect, EDGE_ETCHED, BF_RIGHT);
-//	ReleaseDC(m_separator, hDC);
-//    return false;
-//}
-
-void ExplorerBar::onServerStateChanged(WPARAM wParam, LPARAM lParam) {
-	m_serverState = wParam;
-	if (m_serverState != STATE_DISCONNECTED) {
-		m_serverPort = lParam;
-	}
-	initServer(false);
-	layoutControls();
-
-	if (m_serverState == STATE_CONNECTED) {
-		HKEY key;
-		LONG result = RegCreateKeyEx(HKEY_CURRENT_USER, L"Software\\IBM\\IECrossfireServer", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &key, NULL);
-		if (result != ERROR_SUCCESS) {
-			Logger::error("ExplorerBar.serverStateChanged(): RegCreateKeyEx() failed", result);
-		} else {
-			result = RegSetValueEx(key, L"LastPort", 0, REG_DWORD, (BYTE*)&m_serverPort, sizeof(unsigned int));
-			if (result != ERROR_SUCCESS) {
-				Logger::error("ExplorerBar.serverStateChanged(): RegSetValueEx() failed", result);
-			}
-			RegCloseKey(key);
-		}
-	}
-}
-
-LRESULT ExplorerBar::onWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
-	bool result = true;
-	if (msg == ServerStateChangeMsg) {
-		onServerStateChanged(wParam, lParam);
-		return 0;
-	}
-
-	switch (msg) {
-		case WM_COMMAND: {
-			result = onCommand(hWnd, wParam, lParam);
-			break;
-		}
-		case WM_NCCREATE: {
-			result = onNCCreate(hWnd, wParam, lParam);
-			break;
-		}
-		case WM_CTLCOLORSTATIC: {
-			return (LRESULT)GetStockObject(NULL_BRUSH);
-		}
-//		case WM_PAINT: {
-//			result = onPaint(hWnd, wParam, lParam);
-//			break;
-//		}
-	}
-	if (!result) {
-		return 1;
-	}
-//	if (hWnd == m_separator) {
-//		return CallWindowProc(staticProc, hWnd, msg, wParam, lParam);
-//	}
-	return DefWindowProc(hWnd, msg, wParam, lParam);
-}
-
-void ExplorerBar::setErrorText(wchar_t* text) {
-	SetWindowText(m_errorLabel, text);
-	int length = (int)wcslen(text);
-	if (length) {
-		HDC hDC = GetDC(m_errorLabel);
-		LRESULT newFont = SendMessage(m_errorLabel, WM_GETFONT, 0, 0);
-		HGDIOBJ oldFont = SelectObject(hDC, (HGDIOBJ)newFont);
-		RECT rect;
-		DrawText(hDC, text, length, &rect, DT_CALCRECT);
-		LONG width = rect.right - rect.left;
-		LONG height = rect.bottom - rect.top;
-		if (newFont) {
-			SelectObject(hDC, oldFont);
-		}
-		ReleaseDC(m_errorLabel, hDC);
-		SetWindowPos(m_errorLabel, 0, 0, 0, width, height, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE);
-		ShowWindow(m_errorLabel, SW_SHOW);
-	} else {
-		ShowWindow(m_errorLabel, SW_HIDE);
-		SetWindowPos(m_errorLabel, 0, 0, 0, 1, 1, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE);
-	}
-}
-
-LRESULT CALLBACK ExplorerBar::WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
-	ExplorerBar *pThis = (ExplorerBar*)GetWindowLongPtr(hWnd, GWL_USERDATA);
-	if (!pThis && msg == WM_NCCREATE) {
-		LPCREATESTRUCT lpcs = (LPCREATESTRUCT)lParam;
-		pThis = (ExplorerBar*)(lpcs->lpCreateParams);
-		SetWindowLongPtr(hWnd, GWL_USERDATA, (__int3264)(LONG_PTR)pThis);
-	}
-
-	if (pThis) {
-		return pThis->onWndProc(hWnd, msg, wParam, lParam);
-	}
-
-	return DefWindowProc(hWnd, msg, wParam, lParam);
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/ExplorerBar.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/ExplorerBar.h
deleted file mode 100644
index 7ef4366..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/ExplorerBar.h
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include "resource.h"
-#include <Shlobj.h>
-#include <ShlGuid.h>
-
-#include "IECrossfireExtension.h"
-#include "Util.h"
-#include "Logger.h"
-
-enum {
-	STATE_DISCONNECTED,
-	STATE_LISTENING,
-	STATE_CONNECTED,
-};
-
-class ATL_NO_VTABLE ExplorerBar :
-	public CComObjectRootEx<CComSingleThreadModel>,
-	public CComCoClass<ExplorerBar, &CLSID_ExplorerBar>,
-	public IClassFactory,
-	public IObjectWithSite,
-	public IPersistStream,
-	public IDeskBand,
-	public IInputObject {
-
-public:
-	DECLARE_REGISTRY_RESOURCEID(IDR_EXPLORERBAR)
-	DECLARE_NOT_AGGREGATABLE(ExplorerBar)
-	BEGIN_COM_MAP(ExplorerBar)
-		COM_INTERFACE_ENTRY_IID(IID_IInputObject, IInputObject)
-//		COM_INTERFACE_ENTRY(IExplorerBar)
-		COM_INTERFACE_ENTRY(IClassFactory)
-		COM_INTERFACE_ENTRY(IObjectWithSite)
-		COM_INTERFACE_ENTRY(IPersistStream)
-		COM_INTERFACE_ENTRY(IDeskBand)
-	//	COM_INTERFACE_ENTRY(IInputObject)
-	END_COM_MAP()
-	DECLARE_PROTECT_FINAL_CONSTRUCT()
-
-	HRESULT FinalConstruct() {
-		return S_OK;
-	}
-
-	void FinalRelease() {
-	}
-
-public:
-	ExplorerBar();
-	virtual ~ExplorerBar();
-
-	/* IClassFactory */
-	HRESULT STDMETHODCALLTYPE CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppvObject);
-    HRESULT STDMETHODCALLTYPE LockServer(BOOL fLock);
-
-	/* IObjectWithSite */
-	HRESULT STDMETHODCALLTYPE GetSite(REFIID riid, LPVOID *ppvReturn);
-	HRESULT STDMETHODCALLTYPE SetSite(IUnknown *pUnkSite);
-
-	/* IPersistStream */
-	HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID);
-	HRESULT STDMETHODCALLTYPE IsDirty();
-	HRESULT STDMETHODCALLTYPE Load(IStream *pStm);
-	HRESULT STDMETHODCALLTYPE Save(IStream *pStm, BOOL fClearDirty);
-	HRESULT STDMETHODCALLTYPE GetSizeMax(ULARGE_INTEGER *pcbSize);
-
-	/* IDeskBand */
-	HRESULT STDMETHODCALLTYPE GetWindow(HWND *phwnd);
-	HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode);
-	HRESULT STDMETHODCALLTYPE ShowDW(BOOL fShow);
-	HRESULT STDMETHODCALLTYPE CloseDW(DWORD dwReserved);        
-	HRESULT STDMETHODCALLTYPE ResizeBorderDW(LPCRECT prcBorder, IUnknown *punkToolbarSite, BOOL fReserved);    
-	HRESULT STDMETHODCALLTYPE GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO *pdbi);
-
-	/* IInputObject */
-    HRESULT STDMETHODCALLTYPE UIActivateIO(BOOL fActivate, LPMSG lpMsg);
-    HRESULT STDMETHODCALLTYPE HasFocusIO();
-    HRESULT STDMETHODCALLTYPE TranslateAcceleratorIO(LPMSG lpMsg);
-
-private:
-	bool createWindow();
-	void createControls();
-	bool initServer(bool startIfNeeded);
-	void layoutControls();
-	bool onCommand(HWND hWnd, WPARAM wParam, LPARAM lParam);
-	bool onNCCreate(HWND hWnd, WPARAM wParam, LPARAM lParam);
-//	bool onPaint(HWND hWnd, WPARAM wParam, LPARAM lParam);
-	LRESULT onWndProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam);
-	void onServerStateChanged(WPARAM wParam, LPARAM lParam);
-	void setErrorText(wchar_t* text);
-
-	bool m_bFocus;
-	HINSTANCE g_hInst;
-	HWND m_hWnd;
-	HWND m_hWndParent;
-	HWND m_messageWindow;
-	POINT m_portTextSize;
-	IInputObjectSite* m_pSite;
-	ICrossfireServer* m_server;
-	unsigned int m_serverPort;
-	int m_serverState;
-	WNDCLASS wc;
-
-	/* controls */
-	HWND m_button;
-	HWND m_errorLabel;
-	HWND m_portLabel;
-	HWND m_portText;
-	HWND m_portUpDown;
-	HWND m_separator;
-	HWND m_statusLabel;
-
-	static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam);
-
-	/* constants */
-	static const UINT ServerStateChangeMsg;
-	static const wchar_t* ServerWindowClass;
-	static const wchar_t* WindowClass;
-
-	static const int SEPARATOR_WIDTH = 5;
-	static const int SPACING_WIDTH = 10;
-};
-
-OBJECT_ENTRY_AUTO(__uuidof(ExplorerBar), ExplorerBar)
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/ExplorerBar.rgs b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/ExplorerBar.rgs
deleted file mode 100644
index 52a8ac9..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/ExplorerBar.rgs
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-HKCR {
-	IECrossfireExtension.ExplorerBar.1 = s 'ExplorerBar Class' {
-		CLSID = s '{34EF57F8-9295-483E-B656-4EE154B0B3A5}'
-	}
-	IECrossfireExtension.ExplorerBar = s 'ExplorerBar Class' {
-		CLSID = s '{34EF57F8-9295-483E-B656-4EE154B0B3A5}'
-		CurVer = s 'IECrossfireExtension.ExplorerBar.1'
-	}
-	NoRemove CLSID {
-		ForceRemove {34EF57F8-9295-483E-B656-4EE154B0B3A5} = s 'Crossfire Server Panel' {
-			ProgID = s 'IECrossfireExtension.ExplorerBar.1'
-			VersionIndependentProgID = s 'IECrossfireExtension.ExplorerBar'
-			ForceRemove 'Programmable'
-			InprocServer32 = s '%MODULE%' {
-				val ThreadingModel = s 'Apartment'
-			}
-			val AppID = s '%APPID%'
-			'TypeLib' = s '{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}'
-		}
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireBHO.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireBHO.cpp
deleted file mode 100644
index 9f76b81..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireBHO.cpp
+++ /dev/null
@@ -1,499 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "stdafx.h"
-#include "IECrossfireBHO.h"
-
-/* initialize constants */
-const UINT IECrossfireBHO::ServerStateChangeMsg = RegisterWindowMessage(L"IECrossfireServerStateChanged");
-const wchar_t* IECrossfireBHO::ServerWindowClass = L"_IECrossfireServer";
-const wchar_t* IECrossfireBHO::WindowClass = L"_IECrossfireBHOMessageWindow";
-
-const wchar_t* IECrossfireBHO::ABOUT_BLANK = L"about:blank";
-const wchar_t* IECrossfireBHO::DEBUG_START = L"-crossfire-server-port";
-
-
-IECrossfireBHO::IECrossfireBHO() {
-	m_contextCreated = false;
-	m_eventsHooked = false;
-	m_firstNavigate = true;
-	m_htmlToDisplay = NULL;
-	m_isCurrentContext = false;
-	m_lastUrl = NULL;
-	m_server = NULL;
-	m_serverState = STATE_DISCONNECTED;
-	m_webBrowser = NULL;
-
-	/* create a message-only window to receive server state change notifications */
-	HINSTANCE module = GetModuleHandle(NULL);
-	WNDCLASS ex;
-	ex.style = 0;
-	ex.lpfnWndProc = WndProc;
-	ex.cbClsExtra = 0;
-	ex.cbWndExtra = 0;
-	ex.hInstance = module;
-	ex.hIcon = NULL;
-	ex.hCursor = NULL;
-	ex.hbrBackground = NULL;
-	ex.lpszMenuName = NULL;
-	ex.lpszClassName = WindowClass;
-	RegisterClass(&ex);
-	m_messageWindow = CreateWindow(WindowClass, NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, module, NULL);
-	if (!m_messageWindow) {
-		Logger::error("IECrossfireBHO ctor(): failed to create message-only window", GetLastError());
-	} else {
-		SetWindowLongPtr(m_messageWindow, GWL_USERDATA, (__int3264)(LONG_PTR)this);
-	}
-}
-
-IECrossfireBHO::~IECrossfireBHO() {
-	DWORD processId = GetCurrentProcessId();
-	if (m_server) {
-		m_server->contextDestroyed(processId);
-		m_server->removeBrowser(processId);
-		m_server->Release();
-	}
-	if (m_htmlToDisplay) {
-		free(m_htmlToDisplay);
-	}
-	if (m_lastUrl) {
-		free(m_lastUrl);
-	}
-	if (m_messageWindow) {
-		DestroyWindow(m_messageWindow);
-		UnregisterClass(WindowClass, GetModuleHandle(NULL));
-	}
-}
-
-/* DWebBrowserEvents2 */
-
-void STDMETHODCALLTYPE IECrossfireBHO::OnBeforeNavigate2(IDispatch* pDisp, VARIANT* URL, VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers, VARIANT_BOOL* Cancel) {
-	m_contextCreated = false;
-	if (!m_firstNavigate) {
-		return;
-	}
-
-	m_firstNavigate = false;
-	std::wstring string(URL->bstrVal);
-	size_t index = string.find(DEBUG_START);
-	if (index == std::string::npos) {
-		return;
-	}
-
-	*Cancel = VARIANT_TRUE;
-
-	size_t equalsIndex;
-	if ((equalsIndex = string.find('=', index)) != index + wcslen(DEBUG_START)) {
-		if ((equalsIndex = string.find(L"%3D", index)) != index + wcslen(DEBUG_START)) {
-			displayHTML(L"<html><body>Did not start Crossfire Server<p>Command-line syntax: <tt>iexplore.exe -crossfire-server-port=&lt;port&gt;</tt></body></html>");
-			return;
-		}
-		equalsIndex += 2; /* because found "%3D" instead of "=" */
-	}
-
-	index = equalsIndex + 1;
-	int port = _wtoi(string.substr(index, 5).c_str());
-
-	if (1000 <= port && port <= 65534) {
-		if (startDebugging(port)) {
-			std::wstringstream stream;
-			stream << "<html><body>Crossfire Server started on port ";
-			stream << port;
-			stream << "</body></html>";
-			displayHTML((wchar_t*)stream.str().c_str());
-		} else {
-			std::wstringstream stream;
-			stream << "<html><body>Failed to start Crossfire Server on port ";
-			stream << port;
-			stream << "</body></html>";
-			displayHTML((wchar_t*)stream.str().c_str());
-		}
-	} else {
-		displayHTML(L"<html><body>Did not start Crossfire Server<p>Valid port range is 1000-65534</body></html>");
-	}
-}
-
-void STDMETHODCALLTYPE IECrossfireBHO::OnDocumentComplete(IDispatch *pDisp, VARIANT *pvarURL) {
-	BSTR bstr = pvarURL->bstrVal;
-	if (bstr && m_htmlToDisplay && wcscmp(bstr, ABOUT_BLANK) == 0) {
-		CComPtr<IUnknown> webBrowserIUnknown = NULL;
-		HRESULT hr = m_webBrowser->QueryInterface(IID_IUnknown, (void**)&webBrowserIUnknown);
-		if (SUCCEEDED(hr)) {
-			CComPtr<IUnknown> pDispIUnknown = NULL;
-			hr = pDisp->QueryInterface(IID_IUnknown, (void**)&pDispIUnknown);
-			if (SUCCEEDED(hr)) {
-				if (webBrowserIUnknown == pDispIUnknown) {
-					/* this is the top-level page frame */
-					size_t length = (wcslen(m_htmlToDisplay) + 1) * 2;
-					HGLOBAL buffer = GlobalAlloc(GPTR, length);
-					if (buffer) {
-						wcscpy_s((wchar_t*)buffer, length, m_htmlToDisplay);
-						CComPtr<IStream> stream = NULL;
-						HRESULT hr = CreateStreamOnHGlobal(buffer, false, &stream);
-						if (SUCCEEDED(hr)) {
-							CComPtr<IDispatch> document = NULL;
-							HRESULT hr = m_webBrowser->get_Document(&document);
-							if (SUCCEEDED(hr)) {
-								CComPtr<IPersistStreamInit> persistStreamInit = NULL;
-								hr = document->QueryInterface(IID_IPersistStreamInit, (void**)&persistStreamInit);
-								if (SUCCEEDED(hr)) {
-									hr = persistStreamInit->InitNew();
-									if (SUCCEEDED(hr)) {
-										hr = persistStreamInit->Load(stream);
-									}
-								}
-							}
-							if (FAILED(hr)) {
-								Logger::error("IECrossfireBHO.OnDocumentComplete(): failed setting page content", hr);
-							}
-						} else {
-							Logger::error("IECrossfireBHO.OnDocumentComplete(): CreateStreamOnHGlobal() failed", hr);
-						}
-						GlobalFree(buffer);
-					}
-					free(m_htmlToDisplay);
-					m_htmlToDisplay = NULL;
-				}
-			}
-		}
-		if (FAILED(hr)) {
-			Logger::error("IECrossfireBHO.OnDocumentComplete() failed", hr);
-		}
-		return;
-	}
-
-	if (m_serverState != STATE_CONNECTED) {
-		return;
-	}
-
-	CComPtr<IUnknown> webBrowserIUnknown = NULL;
-	HRESULT hr = m_webBrowser->QueryInterface(IID_IUnknown, (void**)&webBrowserIUnknown);
-	if (FAILED(hr)) {
-		Logger::error("IECrossfireBHO.OnDocumentComplete(): QI(IUnknown)[1] failed", hr);
-	} else {
-		CComPtr<IUnknown> pDispIUnknown = NULL;
-		hr = pDisp->QueryInterface(IID_IUnknown, (void**)&pDispIUnknown);
-		if (FAILED(hr)) {
-			Logger::error("IECrossfireBHO.OnDocumentComplete(): QI(IUnknown)[2] failed", hr);
-		} else {
-			if (webBrowserIUnknown == pDispIUnknown) {
-				/* this is the top-level page frame */
-				HRESULT hr = m_server->contextLoaded(GetCurrentProcessId());
-				if (FAILED(hr)) {
-					Logger::error("IECrossfireBHO.OnDocumentComplete(): contextLoaded() failed", hr);
-				}
-			}
-		}
-	}
-}
-
-void STDMETHODCALLTYPE IECrossfireBHO::OnNavigateComplete2(IDispatch *pDisp, VARIANT *pvarURL) {
-	if (m_contextCreated || m_serverState != STATE_CONNECTED) {
-		return;
-	}
-
-	CComPtr<IUnknown> webBrowserIUnknown = NULL;
-	HRESULT hr = m_webBrowser->QueryInterface(IID_IUnknown, (void**)&webBrowserIUnknown);
-	if (FAILED(hr)) {
-		Logger::error("IECrossfireBHO.OnNavigateComplete2(): QI(IUnknown)[1] failed", hr);
-	} else {
-		CComPtr<IUnknown> pDispIUnknown = NULL;
-		hr = pDisp->QueryInterface(IID_IUnknown, (void**)&pDispIUnknown);
-		if (FAILED(hr)) {
-			Logger::error("IECrossfireBHO.OnNavigateComplete2(): QI(IUnknown)[2] failed", hr);
-		} else {
-			if (webBrowserIUnknown == pDispIUnknown) {
-				/* this is the top-level page frame */
-				wchar_t* url = pvarURL->bstrVal;
-				wchar_t* hash = wcschr(url, wchar_t('#'));
-				if (!hash || !m_lastUrl || wcsncmp(url, m_lastUrl, hash - url) != 0) {
-					DWORD processId = GetCurrentProcessId();
-					DWORD threadId = GetCurrentThreadId();
-					HRESULT hr = m_server->contextCreated(processId, threadId, url);
-					if (FAILED(hr)) {
-						Logger::error("IECrossfireBHO.OnNavigateComplete2(): contextCreated() failed", hr);
-					} else {
-						m_contextCreated = true;
-					}
-				}
-				if (m_lastUrl) {
-					free(m_lastUrl);
-				}
-				m_lastUrl = _wcsdup(url);
-			}
-		}
-	}
-}
-
-void STDMETHODCALLTYPE IECrossfireBHO::OnWindowStateChanged(LONG dwFlags, LONG dwValidFlagMask) {
-	m_isCurrentContext = (dwFlags == (OLECMDIDF_WINDOWSTATE_USERVISIBLE | OLECMDIDF_WINDOWSTATE_ENABLED));
-	if (!m_isCurrentContext || m_serverState != STATE_CONNECTED) {
-		return;
-	}
-
-	DWORD processId = GetCurrentProcessId();
-	HRESULT hr = m_server->setCurrentContext(processId);
-	if (FAILED(hr)) {
-		Logger::error("IECrossfireBHO.OnWindowStateChanged(): setCurrentContext() failed");
-		return;
-	}
-}
-
-/* IBrowserContext */
-
-STDMETHODIMP IECrossfireBHO::displayMessage(OLECHAR* message) {
-	MessageBox(NULL, message, L"Crossfire Server Error", 0);
-	return S_OK;
-}
-
-STDMETHODIMP IECrossfireBHO::navigate(OLECHAR* url, boolean openNewTab) {
-	VARIANT variant_null;
-	variant_null.vt = VT_NULL;
-
-	VARIANT variant_url;
-	variant_url.vt = VT_BSTR;
-	variant_url.bstrVal = url;
-
-	VARIANT variant_flags;
-	if (openNewTab) {
-		variant_flags.vt = VT_I4;
-		variant_flags.intVal = navOpenInNewTab;
-	} else {
-		variant_flags = variant_null;
-	}
-
-	HRESULT hr = m_webBrowser->Navigate2(&variant_url, &variant_flags, &variant_null, &variant_null, &variant_null);
-	if (FAILED(hr)) {
-		Logger::error("IECrossfireBHO.navigate(): Navigate2() failed", hr);
-	}
-	return hr;
-}
-
-/* IObjectWithSite */
-
-STDMETHODIMP IECrossfireBHO::GetSite(REFIID riid, LPVOID *ppvReturn) {
-    *ppvReturn = NULL;
-	if (m_webBrowser) {
-        return m_webBrowser->QueryInterface(riid, ppvReturn);
-	}
-    return E_FAIL;
-}
-
-STDMETHODIMP IECrossfireBHO::SetSite(IUnknown* pUnkSite) {
-	HRESULT hr = S_OK;
-	if (pUnkSite) {
-		if (m_webBrowser) {
-			m_webBrowser->Release();
-			m_webBrowser = NULL;
-		}
-		hr = pUnkSite->QueryInterface(IID_IWebBrowser2, (void**)&m_webBrowser);
-		if (FAILED(hr)) {
-			Logger::error("IECrossfireBHO.SetSite(): QI(IWebBrowser2) failed", hr);
-		} else {
-			hr = DispEventAdvise(m_webBrowser);
-			if (FAILED(hr)) {
-				Logger::error("IECrossfireBHO.SetSite(): DispEventAdvise() failed", hr);
-			}
-		}
-		initServer(false);
-	} else {
-		if (m_eventsHooked) {
-			HRESULT hr = DispEventUnadvise(m_webBrowser);
-			if (SUCCEEDED(hr)) {
-				m_eventsHooked = false;
-			} else {
-				Logger::error("IECrossfireBHO.SetSite(): DispEventUnadvise() failed", hr);
-			}
-		}
-		m_webBrowser->Release();
-		m_webBrowser = NULL;
-	}
-
-	//return IObjectWithSiteImpl<IECrossfireBHO>::SetSite(pUnkSite);
-	return hr;
-}
-
-/* IECrossfireBHO */
-
-bool IECrossfireBHO::displayHTML(wchar_t* htmlText) {
-	VARIANT variant;
-	variant.vt = VT_NULL;
-	CComBSTR bstr(ABOUT_BLANK);
-	HRESULT hr = m_webBrowser->Navigate(bstr, &variant, &variant, &variant, &variant);
-	if (FAILED(hr)) {
-		Logger::error("IECrossfireBHO.displayHTML(): Navigate failed", hr);
-		return false;
-	}
-	m_htmlToDisplay = _wcsdup(htmlText);
-	return true;
-}
-
-//int IECrossfireBHO::getServerState() {
-//	initServer(false);
-//	if (!m_server) {
-//		return STATE_DISCONNECTED;
-//	}
-//
-//	int state;
-//	HRESULT hr = m_server->getState(&state);
-//	if (FAILED(hr)) {
-//		return STATE_DISCONNECTED;
-//	}
-//
-//	return state;
-//}
-
-bool IECrossfireBHO::initServer(bool startIfNeeded) {
-	if (m_server) {
-		return true;
-	}
-	if (!startIfNeeded && !FindWindow(ServerWindowClass, NULL)) {
-		return false;
-	}
-
-	/* the following is intentionally commented */
-
-//	CComPtr<IDispatch> dispatch = NULL;
-//	long applicationHwnd = 0;
-//	HRESULT hr = m_webBrowser->get_Application(&dispatch);
-//	if (SUCCEEDED(hr)) {
-//		DISPID dispId;
-//		CComBSTR name("HWND");
-//		hr = dispatch->GetIDsOfNames(IID_NULL, &name, 1, LOCALE_SYSTEM_DEFAULT, &dispId);
-//		if (SUCCEEDED(hr)) {
-//			DISPPARAMS params;
-//			memset(&params, 0, sizeof(DISPPARAMS));
-//			VARIANT variant;
-//			hr = dispatch->Invoke(dispId, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &params, &variant, NULL, NULL);
-//			if (SUCCEEDED(hr)) {
-//				applicationHwnd = variant.lVal;
-//			}
-//		}
-//	}
-//	if (!applicationHwnd) {
-//		Logger::error("IECrossfireBHO.initServer(): failed to get the application HWND", hr);
-//		return false;
-//	}
-
-	CComPtr<ICrossfireServerClass> serverClass = NULL;
-	HRESULT hr = CoGetClassObject(CLSID_CrossfireServer, CLSCTX_ALL, 0, IID_ICrossfireServerClass, (LPVOID*)&serverClass);
-	if (FAILED(hr)) {
-		Logger::error("IECrossfireBHO.initServer(): CoGetClassObject() failed", hr);
-		return false;
-	}
-
-	hr = serverClass->GetServer(/*applicationHwnd,*/ &m_server);
-	if (FAILED(hr)) {
-		Logger::error("IECrossfireBHO.initServer(): GetController() failed", hr);
-		return false;
-	}
-
-	hr = m_server->getState(&m_serverState);
-	if (FAILED(hr)) {
-		Logger::error("IECrossfireBHO.initServer(): getState() failed", hr);
-	}
-
-	if (m_serverState == STATE_CONNECTED) {
-		hr = m_server->registerBrowser(GetCurrentProcessId(), this);
-		if (FAILED(hr)) {
-			Logger::error("IECrossfireBHO.initServer(): registerBrowser() failed", hr);
-			/* continue */
-		}
-	}
-
-	return true;
-}
-
-void IECrossfireBHO::onServerStateChanged(WPARAM wParam, LPARAM lParam) {
-	m_serverState = wParam;
-	initServer(false);
-
-	/* If a connection was just established then create a context on the server for the current page */
-
-	if (m_serverState != STATE_CONNECTED) {
-		return;
-	}
-	
-	HRESULT hr = m_server->registerBrowser(GetCurrentProcessId(), this);
-	if (FAILED(hr)) {
-		Logger::error("IECrossfireBHO.onServerStateChanged(): registerBrowser() failed", hr);
-		/* continue */
-	}
-
-	CComBSTR url = NULL;
-	hr = m_webBrowser->get_LocationURL(&url);
-	if (FAILED(hr)) {
-		Logger::error("IECrossfireBHO.onServerStateChanged(): get_LocationURL() failed", hr);
-		return;
-	}
-
-	DWORD processId = GetCurrentProcessId();
-	DWORD threadId = GetCurrentThreadId();
-	hr = m_server->contextCreated(processId, threadId, url);
-	if (FAILED(hr)) {
-		Logger::error("IECrossfireBHO.onServerStateChanged(): contextCreated() failed", hr);
-		return;
-	}
-
-	if (m_isCurrentContext) {
-		hr = m_server->setCurrentContext(processId);
-		if (FAILED(hr)) {
-			Logger::error("IECrossfireBHO.onServerStateChanged(): setCurrentContext() failed", hr);
-		}
-	}
-
-	/*
-	 * If the current page is fully-loaded then inform the server.  If the current
-	 * page is still loading then the server will be notified of its completion
-	 * from the usual OnDocumentComplete listener.
-	 */
-	VARIANT_BOOL busy;
-	hr = m_webBrowser->get_Busy(&busy);
-	if (SUCCEEDED(hr) && !busy) {
-		hr = m_server->contextLoaded(processId);
-		if (FAILED(hr)) {
-			Logger::error("IECrossfireBHO.onServerStateChanged(): contextLoaded() failed", hr);
-			return;
-		}
-	}
-}
-
-bool IECrossfireBHO::startDebugging(unsigned int port) {
-	if (!Util::VerifyActiveScriptDebugger() || !Util::VerifyDebugPreference()) {
-		return false;
-	}
-
-	if (!initServer(true) || m_serverState != STATE_DISCONNECTED) {
-		return false;
-	}
-
-	HRESULT hr = m_server->start(port, 54124 /* debug port */);
-	if (FAILED(hr)) {
-		Logger::error("IECrossfireBHO.startDebugging(): start() failed");
-		return false;
-	}
-
-	return true;
-}
-
-LRESULT CALLBACK IECrossfireBHO::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
-	if (message == ServerStateChangeMsg) {
-		IECrossfireBHO *pThis = (IECrossfireBHO*)GetWindowLongPtr(hWnd, GWL_USERDATA);
-		if (!pThis) {
-			Logger::error("IECrossfireBHO.WndProc(): GetWindowLongPtr() failed");
-		} else {
-			pThis->onServerStateChanged(wParam, lParam);
-		}
-		return 0;
-	}
-	return DefWindowProc(hWnd, message, wParam, lParam);
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireBHO.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireBHO.h
deleted file mode 100644
index b1e3deb..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireBHO.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include "resource.h"
-#include "activdbg.h"
-#include <exdispid.h>
-#include <shlguid.h>
-#include <string>
-
-#include "IECrossfireExtension.h"
-#include "Util.h"
-#include "Logger.h"
-
-enum {
-	STATE_DISCONNECTED,
-	STATE_LISTENING,
-	STATE_CONNECTED,
-};
-
-class ATL_NO_VTABLE IECrossfireBHO :
-	public CComObjectRootEx<CComSingleThreadModel>,
-	public CComCoClass<IECrossfireBHO, &CLSID_IECrossfireBHO>,
-	public IObjectWithSiteImpl<IECrossfireBHO>,
-	public IIECrossfireBHO,
-	public IBrowserContext,
-	public IDispEventImpl<1, IECrossfireBHO, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1> {
-
-public:
-	DECLARE_REGISTRY_RESOURCEID(IDR_IECrossfireBHO)
-	DECLARE_NOT_AGGREGATABLE(IECrossfireBHO)
-	BEGIN_COM_MAP(IECrossfireBHO)
-		COM_INTERFACE_ENTRY(IIECrossfireBHO)
-		COM_INTERFACE_ENTRY(IBrowserContext)
-		COM_INTERFACE_ENTRY(IObjectWithSite)
-	END_COM_MAP()
-	DECLARE_PROTECT_FINAL_CONSTRUCT()
-
-	HRESULT FinalConstruct() {
-		return S_OK;
-	}
-
-	void FinalRelease() {
-	}
-
-public:
-	IECrossfireBHO();
-	virtual ~IECrossfireBHO();
-
-	/* DWebBrowserEvents2 */
-	BEGIN_SINK_MAP(IECrossfireBHO)
-		SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_BEFORENAVIGATE2, OnBeforeNavigate2)
-		SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
-		SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_NAVIGATECOMPLETE2, OnNavigateComplete2)
-		SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_WINDOWSTATECHANGED, OnWindowStateChanged)
-	END_SINK_MAP()
-    void STDMETHODCALLTYPE OnBeforeNavigate2(IDispatch* pDisp, VARIANT* URL, VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers, VARIANT_BOOL* Cancel);
-	void STDMETHODCALLTYPE OnDocumentComplete(IDispatch* pDisp, VARIANT* URL);
-	void STDMETHODCALLTYPE OnNavigateComplete2(IDispatch* pDisp, VARIANT* URL);
-	void STDMETHODCALLTYPE OnWindowStateChanged(LONG dwFlags, LONG dwValidFlagMask);
-
-	/* IBrowserContext */
-	HRESULT STDMETHODCALLTYPE displayMessage(OLECHAR* url);
-	HRESULT STDMETHODCALLTYPE navigate(OLECHAR* url, boolean openNewTab);
-
-	/* IObjectWithSite */
-	HRESULT STDMETHODCALLTYPE GetSite(REFIID riid, LPVOID *ppvReturn);
-	HRESULT STDMETHODCALLTYPE SetSite(IUnknown *pUnkSite);
-
-private:
-	bool displayHTML(wchar_t* htmlText);
-//	int getServerState();
-	bool initServer(bool startIfNeeded);
-	void onServerStateChanged(WPARAM wParam, LPARAM lParam);
-	bool startDebugging(unsigned int port);
-
-	bool m_contextCreated;
-	bool m_eventsHooked;
-	bool m_firstNavigate;
-	wchar_t* m_htmlToDisplay;
-	bool m_isCurrentContext;
-	wchar_t* m_lastUrl;
-	HWND m_messageWindow;
-	ICrossfireServer* m_server;
-	int m_serverState;
-	IWebBrowser2* m_webBrowser;
-
-	static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
-
-	/* constants */
-	static const UINT ServerStateChangeMsg;
-	static const wchar_t* ServerWindowClass;
-	static const wchar_t* WindowClass;
-
-	static const wchar_t* ABOUT_BLANK;
-	static const wchar_t* DEBUG_START;
-};
-
-OBJECT_ENTRY_AUTO(__uuidof(IECrossfireBHO), IECrossfireBHO)
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireBHO.rgs b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireBHO.rgs
deleted file mode 100644
index 2a35f51..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireBHO.rgs
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-HKCR {
-	IECrossfireExtension.IECrossfireBHO.1 = s 'IECrossfireBHO Class' {
-		CLSID = s '{E8779887-5AF1-4071-B4D4-6135157F142C}'
-	}
-	IECrossfireExtension.IECrossfireBHO = s 'IECrossfireBHO Class' {
-		CLSID = s '{E8779887-5AF1-4071-B4D4-6135157F142C}'
-		CurVer = s 'IECrossfireExtension.IECrossfireBHO.1'
-	}
-	NoRemove CLSID {
-		ForceRemove {E8779887-5AF1-4071-B4D4-6135157F142C} = s 'IECrossfireBHO Class' {
-			ProgID = s 'IECrossfireExtension.IECrossfireBHO.1'
-			VersionIndependentProgID = s 'IECrossfireExtension.IECrossfireBHO'
-			ForceRemove 'Programmable'
-			InprocServer32 = s '%MODULE%' {
-				val ThreadingModel = s 'Apartment'
-			}
-			val AppID = s '%APPID%'
-			'TypeLib' = s '{3FE86E35-0025-45C7-A841-E10AFE660A7F}'
-		}
-	}
-}
-
-HKLM {
-  NoRemove SOFTWARE {
-    NoRemove Microsoft {   
-      NoRemove Windows {
-        NoRemove CurrentVersion {
-          NoRemove Explorer {
-            NoRemove 'Browser Helper Objects' {
-              ForceRemove '{E8779887-5AF1-4071-B4D4-6135157F142C}' = s 'IECrossfireBHO Class' {
-                val 'NoExplorer' = d '1'
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.cpp
deleted file mode 100644
index fd4cd02..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "stdafx.h"
-#include "resource.h"
-
-#include "IECrossfireExtension.h"
-#include "Logger.h"
-
-class CIECrossfireExtensionModule : public CAtlDllModuleT<CIECrossfireExtensionModule> {
-public :
-	DECLARE_LIBID(LIBID_IECrossfireExtensionLib)
-	DECLARE_REGISTRY_APPID_RESOURCEID(IDR_IECrossfireExtension, "{95F1ADFB-5440-462c-BAA3-9C068F1B1450}")
-};
-
-CIECrossfireExtensionModule _AtlModule;
-
-#ifdef _MANAGED
-#pragma managed(push, off)
-#endif
-
-extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) {
-	if (dwReason == DLL_PROCESS_ATTACH) {
-        DisableThreadLibraryCalls(hInstance);
-    }
-    return _AtlModule.DllMain(dwReason, lpReserved);
-}
-
-#ifdef _MANAGED
-#pragma managed(pop)
-#endif
-
-STDAPI DllCanUnloadNow() {
-    return _AtlModule.DllCanUnloadNow();
-}
-
-STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) {
-    return _AtlModule.DllGetClassObject(rclsid, riid, ppv);
-}
-
-STDAPI DllRegisterServer(void) {
-    return _AtlModule.DllRegisterServer();
-}
-
-STDAPI DllUnregisterServer(void) {
-	return _AtlModule.DllUnregisterServer();
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.def b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.def
deleted file mode 100644
index 8223fd8..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.def
+++ /dev/null
@@ -1,21 +0,0 @@
-; *******************************************************************************
-; * Copyright (c) 2011 IBM Corporation and others.
-; * All rights reserved. This program and the accompanying materials
-; * are made available under the terms of the Eclipse Public License v1.0
-; * which accompanies this distribution, and is available at
-; * http://www.eclipse.org/legal/epl-v10.html
-; *
-; * Contributors:
-; *     IBM Corporation - initial API and implementation
-; *******************************************************************************
-
-
-; IECrossfireExtension.def : Declares the module parameters.
-
-LIBRARY      "IECrossfireExtension.DLL"
-
-EXPORTS
-	DllCanUnloadNow		PRIVATE
-	DllGetClassObject	PRIVATE
-	DllRegisterServer	PRIVATE
-	DllUnregisterServer	PRIVATE
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.idl b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.idl
deleted file mode 100644
index 7f14a80..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.idl
+++ /dev/null
@@ -1,133 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-import "oaidl.idl";
-import "ocidl.idl";
-
-[
-	object,
-	uuid(201244D7-94C6-4fb0-9948-2634523A475B),
-	oleautomation,
-	nonextensible,
-	helpstring("IIECrossfireBHO Interface"),
-	pointer_default(unique)
-]
-interface IIECrossfireBHO : IUnknown {
-};
-[
-	object,
-	uuid(E4121804-5350-4DDD-BE57-9C5B2A13EA29),
-	oleautomation,
-	dual,
-	nonextensible,
-	helpstring("IBrowserContext Interface"),
-	pointer_default(unique)
-]
-interface IBrowserContext : IUnknown {
-	HRESULT displayMessage([in, string] OLECHAR* message);
-	HRESULT navigate([in, string] OLECHAR* url, [in] boolean openNewTab);
-};
-[
-	object,
-	uuid(031DB015-B1BE-4D39-84D2-D7F96D2ACBFE),
-	oleautomation,
-	dual,
-	nonextensible,
-	helpstring("ICrossfireServer Interface"),
-	pointer_default(unique)
-]
-interface ICrossfireServer : IDispatch {
-	HRESULT contextCreated([in] DWORD processId, [in] DWORD threadId, [in, string] OLECHAR* url);
-	HRESULT contextDestroyed([in] DWORD processId);
-	HRESULT contextLoaded([in] DWORD processId);
-	HRESULT getPort([out] unsigned int* value);
-	HRESULT getState([out] int* value);
-	HRESULT registerBrowser([in] DWORD processId, [in] IBrowserContext* browser);
-	HRESULT removeBrowser([in] DWORD processId);
-	HRESULT setCurrentContext([in] DWORD processId);
-	HRESULT start([in] unsigned int port, [in] unsigned int debugPort);
-	HRESULT stop();
-};
-[
-	object,
-	uuid(F48260BB-C061-4410-9CE1-4C5C7602690E),
-	oleautomation,
-	dual,
-	nonextensible,
-	helpstring("ICrossfireServerClass Interface"),
-	pointer_default(unique)
-]
-interface ICrossfireServerClass : IDispatch {
-//	HRESULT GetServer([in] unsigned long windowHandle, [out, retval] ICrossfireServer** _value);
-	HRESULT GetServer([out, retval] ICrossfireServer** _value);
-	HRESULT RemoveServer([in] unsigned long windowHandle);
-};
-[
-	object,
-	uuid(72BA7A37-6D18-439D-8A42-5F6A4F2CD3C3),
-	dual,
-	nonextensible,
-	helpstring("IExplorerBar Interface"),
-	pointer_default(unique)
-]
-interface IExplorerBar : IDispatch {
-};
-[
-	uuid(A8FFC284-CE2C-40B5-98D1-D3112811E9D9),
-	version(1.0),
-	helpstring("IECrossfireExtension 1.0 Type Library")
-]
-library IECrossfireExtensionLib
-{
-	importlib("stdole2.tlb");
-	[
-		uuid(E8779887-5AF1-4071-B4D4-6135157F142C),
-		helpstring("IECrossfireBHO Class")
-	]
-	coclass IECrossfireBHO
-	{
-		[default] interface IIECrossfireBHO;
-	};
-	[
-		uuid(34EF57F8-9295-483E-B656-4EE154B0B3A5),
-		helpstring("ExplorerBar Class")
-	]
-	coclass ExplorerBar
-	{
-		[default] interface IExplorerBar;
-		interface IBrowserContext;
-	};
-	[
-		uuid(47836AF4-3E0C-4995-8029-FF931C5A43FC),
-		helpstring("CrossfireServer Class")
-	]
-	coclass CrossfireServer
-	{
-		[default] interface ICrossfireServer;
-	};
-	[
-		uuid(7C3C5D7A-AF4D-4F32-A3C9-462BFBAFDC25),
-		helpstring("CrossfireServerClass Class")
-	]
-	coclass CrossfireServerClass
-	{
-		[default] interface ICrossfireServerClass;
-	};
-	[
-		uuid(2FA65B09-5063-45FA-91F9-50EB7F4AF2C6),
-		helpstring("BrowserContext Class")
-	]
-	coclass BrowserContext
-	{
-		[default] interface IBrowserContext;
-	};
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.rc b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.rc
deleted file mode 100644
index 7cc74e7..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.rc
+++ /dev/null
@@ -1,82 +0,0 @@
-#include "resource.h"
-
-#define APSTUDIO_READONLY_SYMBOLS
-#include "winres.h"
-#undef APSTUDIO_READONLY_SYMBOLS
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENC)
-#ifdef _WIN32
-LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_CAN
-#pragma code_page(1252)
-#endif //_WIN32
-
-#ifdef APSTUDIO_INVOKED
-
-1 TEXTINCLUDE 
-BEGIN
-    "resource.h\0"
-END
-
-2 TEXTINCLUDE 
-BEGIN
-    "#include ""winres.h""\r\n"
-    "\0"
-END
-
-3 TEXTINCLUDE 
-BEGIN
-    "1 TYPELIB ""IECrossfireExtension.tlb""\r\n"
-    "\0"
-END
-
-#endif    // APSTUDIO_INVOKED
-
-VS_VERSION_INFO VERSIONINFO
- FILEVERSION 1,0,0,1
- PRODUCTVERSION 1,0,0,1
- FILEFLAGSMASK 0x3fL
-#ifdef _DEBUG
- FILEFLAGS 0x1L
-#else
- FILEFLAGS 0x0L
-#endif
- FILEOS 0x4L
- FILETYPE 0x2L
- FILESUBTYPE 0x0L
-BEGIN
-    BLOCK "StringFileInfo"
-    BEGIN
-        BLOCK "040904e4"
-        BEGIN
-            VALUE "CompanyName", "Eclipse Foundation"
-            VALUE "FileDescription", "Crossfire Server for Internet Explorer BHO"
-            VALUE "FileVersion", "1.0.0.0"
-            VALUE "LegalCopyright", "(c) Copyright Eclipse contributors and others, 2011.  All rights reserved.  Eclipse is a trademark of the Eclipse Foundation, Inc.  Internet Explorer is a registered trademark of Microsoft Corporation."
-            VALUE "InternalName", "IECrossfireExtension"
-            VALUE "OriginalFilename", "IECrossfireExtension.dll"
-            VALUE "ProductName", "Crossfire Server for Internet Explorer"
-            VALUE "ProductVersion", "0,0,0,0"
-        END
-    END
-    BLOCK "VarFileInfo"
-    BEGIN
-        VALUE "Translation", 0x409, 1252
-    END
-END
-
-IDR_IECrossfireExtension REGISTRY                "IECrossfireExtension.rgs"
-IDR_IECrossfireBHO      REGISTRY                "IECrossfireBHO.rgs"
-IDR_EXPLORERBAR         REGISTRY                "ExplorerBar.rgs"
-
-STRINGTABLE 
-BEGIN
-    IDS_PROJNAME            "IECrossfireExtension"
-END
-
-#endif    // English resources
-
-#ifndef APSTUDIO_INVOKED
-1 TYPELIB "IECrossfireExtension.tlb"
-
-#endif    // not APSTUDIO_INVOKED
-
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.rgs b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.rgs
deleted file mode 100644
index 15f8a8d..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.rgs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-HKCR {
-	NoRemove AppID {
-		'%APPID%' = s 'IECrossfireExtension'
-		'IECrossfireExtension.DLL' {
-			val AppID = s '%APPID%'
-		}
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.vcxproj b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.vcxproj
deleted file mode 100644
index 63f2213..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.vcxproj
+++ /dev/null
@@ -1,181 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{EFAC86C6-2F6E-4657-A971-632DE21EFF9F}</ProjectGuid>
-    <RootNamespace>IECrossfireExtension</RootNamespace>
-    <Keyword>AtlProj</Keyword>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfAtl>Dynamic</UseOfAtl>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <UseOfAtl>Dynamic</UseOfAtl>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup>
-    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
-    <IgnoreImportLibrary Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</IgnoreImportLibrary>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
-    <IgnoreImportLibrary Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</IgnoreImportLibrary>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <Midl>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>false</MkTypLibCompatible>
-      <TargetEnvironment>Win32</TargetEnvironment>
-      <GenerateStublessProxies>true</GenerateStublessProxies>
-      <TypeLibraryName>$(IntDir)IECrossfireExtension.tlb</TypeLibraryName>
-      <HeaderFileName>IECrossfireExtension.h</HeaderFileName>
-      <DllDataFileName>
-      </DllDataFileName>
-      <InterfaceIdentifierFileName>IECrossfireExtension_i.c</InterfaceIdentifierFileName>
-      <ProxyFileName>IECrossfireExtension_p.c</ProxyFileName>
-      <ValidateAllParameters>false</ValidateAllParameters>
-    </Midl>
-    <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <PreprocessToFile>false</PreprocessToFile>
-      <PreprocessSuppressLineNumbers>false</PreprocessSuppressLineNumbers>
-      <MinimalRebuild>true</MinimalRebuild>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
-      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <PrecompiledHeader>Use</PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
-      <AdditionalIncludeDirectories>C:\activescripting;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <ResourceOutputFileName>$(IntDir)%(Filename).res</ResourceOutputFileName>
-    </ResourceCompile>
-    <Link>
-      <RegisterOutput>false</RegisterOutput>
-      <AdditionalDependencies>WS2_32.lib;C:\activescripting\ad1.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <ModuleDefinitionFile>.\IECrossfireExtension.def</ModuleDefinitionFile>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Windows</SubSystem>
-      <TargetMachine>MachineX86</TargetMachine>
-      <PerUserRedirection>false</PerUserRedirection>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <Midl>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>../IECrossfireServer;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <MkTypLibCompatible>false</MkTypLibCompatible>
-      <TargetEnvironment>Win32</TargetEnvironment>
-      <GenerateStublessProxies>true</GenerateStublessProxies>
-      <TypeLibraryName>$(IntDir)IECrossfireExtension.tlb</TypeLibraryName>
-      <HeaderFileName>IECrossfireExtension.h</HeaderFileName>
-      <DllDataFileName>
-      </DllDataFileName>
-      <InterfaceIdentifierFileName>IECrossfireExtension_i.c</InterfaceIdentifierFileName>
-      <ProxyFileName>IECrossfireExtension_p.c</ProxyFileName>
-      <ValidateAllParameters>false</ValidateAllParameters>
-    </Midl>
-    <ClCompile>
-      <Optimization>MaxSpeed</Optimization>
-      <AdditionalIncludeDirectories>C:\activescripting;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <PrecompiledHeader>Use</PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-    </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ResourceCompile>
-    <Link>
-      <RegisterOutput>false</RegisterOutput>
-      <AdditionalDependencies>WS2_32.lib;C:\activescripting\ad1.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <ModuleDefinitionFile>.\IECrossfireExtension.def</ModuleDefinitionFile>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Windows</SubSystem>
-      <OptimizeReferences>true</OptimizeReferences>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <TargetMachine>MachineX86</TargetMachine>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClCompile Include="ExplorerBar.cpp" />
-    <ClCompile Include="IECrossfireBHO.cpp" />
-    <ClCompile Include="IECrossfireExtension.cpp" />
-    <ClCompile Include="Logger.cpp" />
-    <ClCompile Include="stdafx.cpp">
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
-    </ClCompile>
-    <ClCompile Include="IECrossfireExtension_i.c">
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-      </PrecompiledHeader>
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-      </PrecompiledHeader>
-    </ClCompile>
-    <ClCompile Include="Util.cpp" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="IECrossfireExtension.def" />
-    <None Include="ExplorerBar.rgs" />
-    <None Include="IECrossfireBHO.rgs" />
-    <None Include="IECrossfireExtension.rgs" />
-  </ItemGroup>
-  <ItemGroup>
-    <Midl Include="IECrossfireExtension.idl" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="ExplorerBar.h" />
-    <ClInclude Include="IECrossfireBHO.h" />
-    <ClInclude Include="Logger.h" />
-    <ClInclude Include="Resource.h" />
-    <ClInclude Include="stdafx.h" />
-    <ClInclude Include="IECrossfireExtension.h" />
-    <ClInclude Include="Util.h" />
-  </ItemGroup>
-  <ItemGroup>
-    <ResourceCompile Include="IECrossfireExtension.rc" />
-  </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\IECrossfireServer\IECrossfireServer.vcxproj">
-      <Project>{2b73b89a-a1b4-479b-8751-a25b9036a9af}</Project>
-      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
-    </ProjectReference>
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.vcxproj.filters b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.vcxproj.filters
deleted file mode 100644
index a9b0ca7..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.vcxproj.filters
+++ /dev/null
@@ -1,91 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <Filter Include="Source Files">
-      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
-      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
-    </Filter>
-    <Filter Include="Header Files">
-      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
-      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
-    </Filter>
-    <Filter Include="Resource Files">
-      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
-      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
-    </Filter>
-    <Filter Include="Generated Files">
-      <UniqueIdentifier>{f94dfd73-783e-4c8a-aa63-523c439797c8}</UniqueIdentifier>
-      <SourceControlFiles>False</SourceControlFiles>
-    </Filter>
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="ExplorerBar.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="IECrossfireBHO.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="IECrossfireExtension.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="Logger.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="stdafx.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="IECrossfireExtension_i.c">
-      <Filter>Generated Files</Filter>
-    </ClCompile>
-    <ClCompile Include="Util.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="IECrossfireExtension.def">
-      <Filter>Source Files</Filter>
-    </None>
-    <None Include="ExplorerBar.rgs">
-      <Filter>Resource Files</Filter>
-    </None>
-    <None Include="IECrossfireBHO.rgs">
-      <Filter>Resource Files</Filter>
-    </None>
-    <None Include="IECrossfireExtension.rgs">
-      <Filter>Resource Files</Filter>
-    </None>
-  </ItemGroup>
-  <ItemGroup>
-    <Midl Include="IECrossfireExtension.idl">
-      <Filter>Source Files</Filter>
-    </Midl>
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="ExplorerBar.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="IECrossfireBHO.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="Logger.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="Resource.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="stdafx.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="IECrossfireExtension.h">
-      <Filter>Generated Files</Filter>
-    </ClInclude>
-    <ClInclude Include="Util.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-  </ItemGroup>
-  <ItemGroup>
-    <ResourceCompile Include="IECrossfireExtension.rc">
-      <Filter>Resource Files</Filter>
-    </ResourceCompile>
-  </ItemGroup>
-</Project>
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtensionPS.vcxproj b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtensionPS.vcxproj
deleted file mode 100644
index 0dd0ffc..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtensionPS.vcxproj
+++ /dev/null
@@ -1,97 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{0B6A6526-C6C0-4619-A938-E3D90A16A9B7}</ProjectGuid>
-    <RootNamespace>IECrossfireExtensionPS</RootNamespace>
-    <Keyword>AtlPSProj</Keyword>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup>
-    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)PS\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)PS\</IntDir>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)PS\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)PS\</IntDir>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <PreBuildEvent>
-      <Message>Checking for required files</Message>
-      <Command>if exist dlldata.c goto :END
-echo Error: MIDL will not generate DLLDATA.C unless you have at least 1 interface in the main project.
-Exit 1
-:END
-</Command>
-    </PreBuildEvent>
-    <ClCompile>
-      <PreprocessorDefinitions>WIN32;_WIN32_WINNT=0x0500;REGISTER_PROXY_DLL;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-    </ClCompile>
-    <Link>
-      <RegisterOutput>false</RegisterOutput>
-      <AdditionalDependencies>kernel32.lib;rpcns4.lib;rpcrt4.lib;oleaut32.lib;uuid.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <ModuleDefinitionFile>IECrossfireExtensionPS.def</ModuleDefinitionFile>
-      <PerUserRedirection>false</PerUserRedirection>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <PreBuildEvent>
-      <Message>Checking for required files</Message>
-      <Command>if exist dlldata.c goto :END
-echo Error: MIDL will not generate DLLDATA.C unless you have at least 1 interface in the main project.
-Exit 1
-:END
-</Command>
-    </PreBuildEvent>
-    <ClCompile>
-      <Optimization>MaxSpeed</Optimization>
-      <PreprocessorDefinitions>WIN32;_WIN32_WINNT=0x0500;REGISTER_PROXY_DLL;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-    </ClCompile>
-    <Link>
-      <RegisterOutput>true</RegisterOutput>
-      <AdditionalDependencies>kernel32.lib;rpcns4.lib;rpcrt4.lib;oleaut32.lib;uuid.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <ModuleDefinitionFile>IECrossfireExtensionPS.def</ModuleDefinitionFile>
-      <OptimizeReferences>true</OptimizeReferences>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClCompile Include="dlldata.c" />
-    <ClCompile Include="IECrossfireExtension_i.c" />
-    <ClCompile Include="IECrossfireExtension_p.c" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="IECrossfireExtensionps.def" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtensionPS.vcxproj.filters b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtensionPS.vcxproj.filters
deleted file mode 100644
index c290ab1..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtensionPS.vcxproj.filters
+++ /dev/null
@@ -1,26 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <Filter Include="Source Files">
-      <UniqueIdentifier>{8c662bde-04de-4e36-85cf-0eeea9dc6815}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Generated Files">
-      <UniqueIdentifier>{88203c36-b0b0-4b57-a438-b90a8cd30c04}</UniqueIdentifier>
-      <SourceControlFiles>False</SourceControlFiles>
-    </Filter>
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="dlldata.c">
-      <Filter>Generated Files</Filter>
-    </ClCompile>
-    <ClCompile Include="IECrossfireExtension_i.c">
-      <Filter>Generated Files</Filter>
-    </ClCompile>
-    <ClCompile Include="IECrossfireExtension_p.c">
-      <Filter>Generated Files</Filter>
-    </ClCompile>
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="IECrossfireExtensionps.def" />
-  </ItemGroup>
-</Project>
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtensionps.def b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtensionps.def
deleted file mode 100644
index 93084e3..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtensionps.def
+++ /dev/null
@@ -1,20 +0,0 @@
-; *******************************************************************************
-; * Copyright (c) 2011 IBM Corporation and others.
-; * All rights reserved. This program and the accompanying materials
-; * are made available under the terms of the Eclipse Public License v1.0
-; * which accompanies this distribution, and is available at
-; * http://www.eclipse.org/legal/epl-v10.html
-; *
-; * Contributors:
-; *     IBM Corporation - initial API and implementation
-; *******************************************************************************
-
-
-LIBRARY      "IECrossfireExtensionPS"
-
-EXPORTS
-	DllGetClassObject       PRIVATE
-	DllCanUnloadNow         PRIVATE
-	GetProxyDllInfo         PRIVATE
-	DllRegisterServer		PRIVATE
-	DllUnregisterServer		PRIVATE
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/Logger.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/Logger.cpp
deleted file mode 100644
index 7dc8c44..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/Logger.cpp
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "StdAfx.h"
-#include "Logger.h"
-
-/* initialize constants */
-const char* Logger::PREAMBLE_LOG = "LOG::";
-const char* Logger::PREAMBLE_ERROR = "ERROR::";
-
-Logger::Logger() {
-}
-
-Logger::~Logger() {
-}
-
-void Logger::error(char* message) {
-	int length = strlen(PREAMBLE_ERROR) + strlen(message) + 1;
-	char* sendString = new char[length];
-	strcpy_s(sendString, length, PREAMBLE_ERROR);
-	strcat_s(sendString, length, message);
-	send(sendString);
-	delete[] sendString;
-}
-
-void Logger::error(char* message, int errorCode) {
-	std::string result;
-	std::stringstream stringStream;
-	stringStream << message;
-	stringStream << ": ";
-	stringStream << errorCode;
-	result.assign(stringStream.str());
-	error((char *)result.c_str());
-}
-
-void Logger::log(char* message) {
-	int length = strlen(PREAMBLE_LOG) + strlen(message) + 1;
-	char* sendString = new char[length];
-	strcpy_s(sendString, length, PREAMBLE_LOG);
-	strcat_s(sendString, length, message);
-	send(sendString);
-	delete[] sendString;
-}
-
-void Logger::log(char* message, int code) {
-	std::string result;
-	std::stringstream stringStream;
-	stringStream << message;
-	stringStream << ": ";
-	stringStream << code;
-	result.assign(stringStream.str());
-	log((char *)result.c_str());
-}
-
-void Logger::log(wchar_t* message) {
-	size_t newSize = 0;
-	wcstombs_s(&newSize, NULL, 0, message, 0);
-    char* chars = new char[newSize];
-    wcstombs_s(&newSize, chars, newSize, message, newSize);
-	log(chars);
-	delete[] chars;
-}
-
-void Logger::log(std::wstring* message) {
-	log((wchar_t*)message->c_str());
-}
-
-void Logger::send(char* message) {
-	SOCKET sock;
-	struct sockaddr_in server_addr;
-	struct hostent *host;
-	host = (struct hostent *)gethostbyname((char *)"127.0.0.1");
-	if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
-		return;
-	}
-	server_addr.sin_family = AF_INET;
-	server_addr.sin_port = htons(54124 /* debug port */); // TODO
-	server_addr.sin_addr = *((struct in_addr *)host->h_addr);
-    sendto(sock, message, (int)strlen(message), 0, (struct sockaddr *)&server_addr, sizeof(sockaddr_in));
-	closesocket(sock);
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/Logger.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/Logger.h
deleted file mode 100644
index 3f593c3..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/Logger.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include <sstream>
-#include <winsock2.h>
-
-class Logger {
-public:
-	static void error(char* message);
-	static void error(char* message, int errorCode);
-	static void log(char* message);
-	static void log(char* message, int code);
-	static void log(wchar_t* message);
-	static void log(std::wstring* message);
-
-protected:
-	Logger();
-	~Logger();
-
-private:
-	static void send(char* message);
-
-	/* constants */
-	static const char* PREAMBLE_ERROR;
-	static const char* PREAMBLE_LOG;
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/Util.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/Util.cpp
deleted file mode 100644
index bdf2b8e..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/Util.cpp
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "stdafx.h"
-#include "Util.h"
-
-/* initialize constants */
-const wchar_t* Util::PREFERENCE_DISABLEIEDEBUG = L"DisableScriptDebuggerIE";
-
-bool Util::VerifyDebugPreference() {
-	/* verify that the IE debugging preference is not disabled */
-
-	HKEY key;
-	HRESULT hr = RegOpenKeyEx(HKEY_CURRENT_USER, L"Software\\Microsoft\\Internet Explorer\\Main", 0, KEY_READ, &key);
-	if (SUCCEEDED(hr)) {
-		wchar_t value[9];
-		DWORD size = sizeof(value);
-		hr = RegQueryValueEx(key, PREFERENCE_DISABLEIEDEBUG, NULL, NULL, (LPBYTE)value, &size);
-		RegCloseKey(key);
-		if (SUCCEEDED(hr) && wcscmp(value, L"no") != 0) {
-			MessageBox(NULL, L"Internet Explorer Option \"Disable Script Debugging (Internet Explorer)\" must be unchecked to enable remote debugging via Crossfire.  Crossfire server has not been started.", L"Crossfire Server Startup Error", 0);
-			return false;
-		}
-	}
-	if (FAILED(hr)) {
-		Logger::error("Util.VerifyDebugPreference(): Failed to access the DisableScriptDebuggerIE registry setting", hr);
-		/* allow this case to proceed, the preference could be set properly */
-	}
-	return true;
-}
-
-bool Util::VerifyActiveScriptDebugger() {
-	/* verify that the MS Active Script Debugger is installed */
-
-	static bool s_verified = false;
-	if (s_verified) {
-		return true;
-	}
-
-	CComPtr<IMachineDebugManager> mdm;
-	HRESULT hr = mdm.CoCreateInstance(CLSID_MachineDebugManager, NULL, CLSCTX_ALL);
-	if (FAILED(hr)) {
-		MessageBox(NULL, L"Crossfire Server for Internet Explorer requires the Microsoft Script Debugger to be installed.  It can be downloaded from http://www.microsoft.com/download/en/confirmation.aspx?id=22185.", L"Crossfire Server Startup Error", 0);
-		return false;
-	}
-
-	return true;
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/Util.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/Util.h
deleted file mode 100644
index b05c615..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/Util.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include "activdbg.h"
-#include "Logger.h"
-
-class Util {
-public:
-	/* statics */
-	static bool VerifyActiveScriptDebugger();
-	static bool VerifyDebugPreference();
-
-private:
-	/* constants */
-	static const wchar_t* PREFERENCE_DISABLEIEDEBUG;
-};
-
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/dlldata.c b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/dlldata.c
deleted file mode 100644
index 4762f3a..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/dlldata.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/*********************************************************
-   DllData file -- generated by MIDL compiler 
-
-        DO NOT ALTER THIS FILE
-
-   This file is regenerated by MIDL on every IDL file compile.
-
-   To completely reconstruct this file, delete it and rerun MIDL
-   on all the IDL files in this DLL, specifying this file for the
-   /dlldata command line option
-
-*********************************************************/
-
-#define PROXY_DELEGATION
-
-#include <rpcproxy.h>
-
-#ifdef __cplusplus
-extern "C"   {
-#endif
-
-EXTERN_PROXY_FILE( IECrossfireExtension )
-
-
-PROXYFILE_LIST_START
-/* Start of list */
-  REFERENCE_PROXY_FILE( IECrossfireExtension ),
-/* End of list */
-PROXYFILE_LIST_END
-
-
-DLLDATA_ROUTINES( aProxyFileList, GET_DLL_CLSID )
-
-#ifdef __cplusplus
-}  /*extern "C" */
-#endif
-
-/* end of generated dlldata file */
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/resource.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/resource.h
deleted file mode 100644
index 20430e3..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/resource.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-//{{NO_DEPENDENCIES}}
-// Microsoft Visual C++ generated include file.
-// Used by IECrossfireExtension.rc
-//
-#define IDS_PROJNAME                    100
-#define IDR_IECrossfireExtension        101
-#define IDR_IECrossfireBHO              102
-#define IDR_EXPLORERBAR                 112
-
-// Next default values for new objects
-// 
-#ifdef APSTUDIO_INVOKED
-#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE        218
-#define _APS_NEXT_COMMAND_VALUE         32768
-#define _APS_NEXT_CONTROL_VALUE         201
-#define _APS_NEXT_SYMED_VALUE           114
-#endif
-#endif
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/stdafx.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/stdafx.cpp
deleted file mode 100644
index 48c2ce4..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/stdafx.cpp
+++ /dev/null
@@ -1,17 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-// stdafx.cpp : source file that includes just the standard includes
-// IECrossfireExtension.pch will be the pre-compiled header
-// stdafx.obj will contain the pre-compiled type information
-
-#include "stdafx.h"
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/stdafx.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/stdafx.h
deleted file mode 100644
index bfd1557..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/stdafx.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-// stdafx.h : include file for standard system include files,
-// or project specific include files that are used frequently,
-// but are changed infrequently
-
-#pragma once
-
-#ifndef STRICT
-#define STRICT
-#endif
-
-// Modify the following defines if you have to target a platform prior to the ones specified below.
-// Refer to MSDN for the latest info on corresponding values for different platforms.
-#ifndef WINVER				// Allow use of features specific to Windows XP or later.
-#define WINVER 0x0501		// Change this to the appropriate value to target other versions of Windows.
-#endif
-
-#ifndef _WIN32_WINNT		// Allow use of features specific to Windows XP or later.                   
-#define _WIN32_WINNT 0x0501	// Change this to the appropriate value to target other versions of Windows.
-#endif						
-
-#ifndef _WIN32_WINDOWS		// Allow use of features specific to Windows 98 or later.
-#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
-#endif
-
-#ifndef _WIN32_IE			// Allow use of features specific to IE 6.0 or later.
-#define _WIN32_IE 0x0600	// Change this to the appropriate value to target other versions of IE.
-#endif
-
-#define _ATL_APARTMENT_THREADED
-#define _ATL_NO_AUTOMATIC_NAMESPACE
-
-#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS	// some CString constructors will be explicit
-
-
-#include "resource.h"
-#include <atlbase.h>
-#include <atlcom.h>
-
-using namespace ATL;
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/stdafx.i b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/stdafx.i
deleted file mode 100644
index 72ee680..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/stdafx.i
+++ /dev/null
@@ -1,260876 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-#pragma warning(disable: 4505) 
-#pragma warning(disable: 4710) 
-#pragma warning(disable: 4514) 
-
-
-
-#pragma warning(disable: 4511) 
-#pragma warning(disable: 4512) 
-
-
-#pragma warning(disable: 4355) 
-
-
-
-
-#pragma warning(disable: 4702) 
-
-
-
-
-
-#pragma warning(disable : 4668)	
-#pragma warning(disable : 4820)	
-#pragma warning(disable : 4917)	
-
-#pragma warning(disable : 4217)	
-
-#pragma warning(disable: 4127) 
-#pragma warning(disable: 4097) 
-#pragma warning(disable: 4786) 
-#pragma warning(disable: 4291) 
-#pragma warning(disable: 4201) 
-#pragma warning(disable: 4103) 
-#pragma warning(disable: 4268) 
-
-#pragma warning (push)
-#pragma warning(disable: 4571) 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-#pragma warning(disable : 4619)	
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    
-    
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma comment(linker,"/manifestdependency:\"type='win32' "            \
-        "name='" "Microsoft.VC80" ".DebugCRT' "         \
-        "version='" "8.0.50727.4053" "' "                          \
-        "processorArchitecture='x86' "                                  \
-        "publicKeyToken='" "1fc8b3b9a1e18e3b" "'\"")
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma pack(push,8)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma pack(push,8)
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef __w64 unsigned int   uintptr_t;
-
-
-
-
-
-
-
-
-typedef char *  va_list;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-#pragma pack(pop)
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-  
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-  
- 
-
-
-
-
-
-
-
- 
-  
-  
- 
-
-
-
-
-
-
-
- 
-  
-   
-  
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef __w64 unsigned int   size_t;
-
-
-
-
-
-
-typedef size_t rsize_t;
-
-
-
-
-
-
-
-
-typedef __w64 int            intptr_t;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef __w64 int            ptrdiff_t;
-
-
-
-
-
-
-
-
-
-
-typedef unsigned short wint_t;
-typedef unsigned short wctype_t;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(deprecated("This name was supported during some Whidbey pre-releases. Instead, use the standard name errno_t.")) typedef int errcode;
-
-
-
-
-typedef int errno_t;
-
-
-
-typedef __w64 long __time32_t;   
-
-
-
-
-
-typedef __int64 __time64_t;     
-
-
-
-
-
-
-
-
-typedef __time64_t time_t;      
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct threadlocaleinfostruct;
-struct threadmbcinfostruct;
-typedef struct threadlocaleinfostruct * pthreadlocinfo;
-typedef struct threadmbcinfostruct * pthreadmbcinfo;
-struct __lc_time_data;
-
-typedef struct localeinfo_struct
-{
-    pthreadlocinfo locinfo;
-    pthreadmbcinfo mbcinfo;
-} _locale_tstruct, *_locale_t;
-
-
-typedef struct tagLC_ID {
-        unsigned short wLanguage;
-        unsigned short wCountry;
-        unsigned short wCodePage;
-} LC_ID, *LPLC_ID;
-
-
-
-
-typedef struct threadlocaleinfostruct {
-        int refcount;
-        unsigned int lc_codepage;
-        unsigned int lc_collate_cp;
-        unsigned long lc_handle[6]; 
-        LC_ID lc_id[6];
-        struct {
-            char *locale;
-            wchar_t *wlocale;
-            int *refcount;
-            int *wrefcount;
-        } lc_category[6];
-        int lc_clike;
-        int mb_cur_max;
-        int * lconv_intl_refcount;
-        int * lconv_num_refcount;
-        int * lconv_mon_refcount;
-        struct lconv * lconv;
-        int * ctype1_refcount;
-        unsigned short * ctype1;
-        const unsigned short * pctype;
-        const unsigned char * pclmap;
-        const unsigned char * pcumap;
-        struct __lc_time_data * lc_time_curr;
-} threadlocinfo;
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-__declspec(dllimport) extern int * __cdecl _errno(void);
-
-
-errno_t __cdecl _set_errno(     int _Value);
-errno_t __cdecl _get_errno(     int * _Value);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-namespace Inconsistent_definition_of_symbol__ATL_MIXED
-{
-	struct _Please_define_it_the_same_throughout_your_project { };
-}
-
-
-
-
-
-
-
-
-
-
-
-namespace Inconsistent_definition_of_symbol__ATL_MIXED
-{
-	__declspec(selectany) _Please_define_it_the_same_throughout_your_project clash = _Please_define_it_the_same_throughout_your_project ();
-}
-
-
-namespace Define_the_symbol__ATL_MIXED
-{
-
-
-
-
-#pragma comment(linker, "/include:??3@YAXPAX@Z")
-
-
-
-	struct Thank_you { virtual void one(){} };
-
-	__declspec(selectany) Thank_you clash = Thank_you();
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C++"
-{
-template <typename _CountofType, size_t _SizeOfArray>
-char (*__countof_helper( _CountofType (&_Array)[_SizeOfArray]))[_SizeOfArray];
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-	
-	
-	
-	
-	
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-	
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma pack(push,8)
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _heapinfo {
-        int * _pentry;
-        size_t _size;
-        int _useflag;
-        } _HEAPINFO;
-
-
-
-
-
-
-extern __declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_amblksiz" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) unsigned int _amblksiz;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)   __declspec(noalias) __declspec(restrict)         void * __cdecl calloc(     size_t _NumOfElements,      size_t _SizeOfElements);
-__declspec(dllimport)                     __declspec(noalias)                                                                             void   __cdecl free(       void * _Memory);
-__declspec(dllimport)   __declspec(noalias) __declspec(restrict)                                   void * __cdecl malloc(     size_t _Size);
-__declspec(dllimport)                     __declspec(noalias) __declspec(restrict)                                void * __cdecl realloc(       void * _Memory,      size_t _NewSize);
-__declspec(dllimport)                     __declspec(noalias) __declspec(restrict)                            void * __cdecl _recalloc(       void * _Memory,      size_t _Count,      size_t _Size);
-__declspec(dllimport)                     __declspec(noalias)                                                                             void   __cdecl _aligned_free(       void * _Memory);
-__declspec(dllimport)                     __declspec(noalias) __declspec(restrict)                                   void * __cdecl _aligned_malloc(     size_t _Size,      size_t _Alignment);
-__declspec(dllimport)                     __declspec(noalias) __declspec(restrict)                                   void * __cdecl _aligned_offset_malloc(     size_t _Size,      size_t _Alignment,      size_t _Offset);
-__declspec(dllimport)                     __declspec(noalias) __declspec(restrict)                                   void * __cdecl _aligned_realloc(       void * _Memory,      size_t _Size,      size_t _Alignment);
-__declspec(dllimport)                     __declspec(noalias) __declspec(restrict)                            void * __cdecl _aligned_recalloc(       void * _Memory,      size_t _Count,      size_t _Size,      size_t _Alignment);
-__declspec(dllimport)                     __declspec(noalias) __declspec(restrict)                                   void * __cdecl _aligned_offset_realloc(       void * _Memory,      size_t _Size,      size_t _Alignment,      size_t _Offset);
-__declspec(dllimport)                     __declspec(noalias) __declspec(restrict)                            void * __cdecl _aligned_offset_recalloc(       void * _Memory,      size_t _Count,      size_t _Size,      size_t _Alignment,      size_t _Offset);
-__declspec(dllimport)                                                                                                size_t __cdecl _aligned_msize(     void * _Memory,      size_t _Alignment,      size_t _Offset);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) int     __cdecl _resetstkoflw (void);
-
-
-
-__declspec(dllimport) unsigned long __cdecl _set_malloc_crt_max_wait(     unsigned long _NewValue);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)      void *  __cdecl _expand(     void * _Memory,      size_t _NewSize);
-__declspec(dllimport)  size_t  __cdecl _msize(     void * _Memory);
-
-
-
-
-
-
-   void *          __cdecl _alloca(     size_t _Size);
-__declspec(dllimport)  size_t  __cdecl _get_sbh_threshold(void);
-__declspec(dllimport) int     __cdecl _set_sbh_threshold(     size_t _NewValue);
-__declspec(dllimport) errno_t __cdecl _set_amblksiz(     size_t _Value);
-__declspec(dllimport) errno_t __cdecl _get_amblksiz(     size_t * _Value);
-__declspec(dllimport)  int     __cdecl _heapadd(     void * _Memory,      size_t _Size);
-__declspec(dllimport)  int     __cdecl _heapchk(void);
-__declspec(dllimport)  int     __cdecl _heapmin(void);
-__declspec(dllimport) int     __cdecl _heapset(     unsigned int _Fill);
-__declspec(dllimport)  int     __cdecl _heapwalk(     _HEAPINFO * _EntryInfo);
-__declspec(dllimport) size_t  __cdecl _heapused(size_t * _Used, size_t * _Commit);
-
-__declspec(dllimport) intptr_t __cdecl _get_heap_handle(void);
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef char __static_assert_t[ (sizeof(unsigned int) <= 8) ];
-
-
-__inline void *_MarkAllocaS(        void *_Ptr, unsigned int _Marker)
-{
-    if (_Ptr)
-    {
-        *((unsigned int*)_Ptr) = _Marker;
-        _Ptr = (char*)_Ptr + 8;
-    }
-    return _Ptr;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(noalias) __inline void __cdecl _freea(       void * _Memory)
-{
-    unsigned int _Marker;
-    if (_Memory)
-    {
-        _Memory = (char*)_Memory - 8;
-        _Marker = *(unsigned int *)_Memory;
-        if (_Marker == 0xDDDD)
-        {
-            free(_Memory);
-        }
-
-
-
-
-
-
-    }
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma pack(push,8)
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef int (__cdecl * _onexit_t)(void);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _div_t {
-        int quot;
-        int rem;
-} div_t;
-
-typedef struct _ldiv_t {
-        long quot;
-        long rem;
-} ldiv_t;
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma pack(4)
-typedef struct {
-    unsigned char ld[10];
-} _LDOUBLE;
-#pragma pack()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-        double x;
-} _CRT_DOUBLE;
-
-typedef struct {
-    float f;
-} _CRT_FLOAT;
-
-
-
-
-
-typedef struct {
-        
-
-
-        long double x;
-} _LONGDOUBLE;
-
-
-
-#pragma pack(4)
-typedef struct {
-    unsigned char ld12[12];
-} _LDBL12;
-#pragma pack()
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) extern int __mb_cur_max;
-
-
-
-
-__declspec(dllimport) int __cdecl ___mb_cur_max_func(void);
-__declspec(dllimport) int __cdecl ___mb_cur_max_l_func(_locale_t);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef void (__cdecl *_purecall_handler)(void); 
-
-
-__declspec(dllimport) _purecall_handler __cdecl _set_purecall_handler(       _purecall_handler _Handler);
-__declspec(dllimport) _purecall_handler __cdecl _get_purecall_handler();
-
-
-
-extern "C++"
-{
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-typedef void (__cdecl *_invalid_parameter_handler)(const wchar_t *, const wchar_t *, const wchar_t *, unsigned int, uintptr_t); 
-
-
-__declspec(dllimport) _invalid_parameter_handler __cdecl _set_invalid_parameter_handler(       _invalid_parameter_handler _Handler);
-__declspec(dllimport) _invalid_parameter_handler __cdecl _get_invalid_parameter_handler(void);
-
-
-
-extern "C++"
-{
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) unsigned long * __cdecl __doserrno(void);
-
-
-errno_t __cdecl _set_doserrno(     unsigned long _Value);
-errno_t __cdecl _get_doserrno(     unsigned long * _Value);
-
-
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "strerror" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char ** __cdecl __sys_errlist(void);
-
-
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "strerror" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int * __cdecl __sys_nerr(void);
-
-
-
-
-__declspec(dllimport) int *          __cdecl __p___argc(void);
-__declspec(dllimport) char ***       __cdecl __p___argv(void);
-__declspec(dllimport) wchar_t ***    __cdecl __p___wargv(void);
-__declspec(dllimport) char ***       __cdecl __p__environ(void);
-__declspec(dllimport) wchar_t ***    __cdecl __p__wenviron(void);
-__declspec(dllimport) char **        __cdecl __p__pgmptr(void);
-__declspec(dllimport) wchar_t **     __cdecl __p__wpgmptr(void);
-
-
-
-
-
-__declspec(dllimport) extern int __argc;          
-__declspec(dllimport) extern char ** __argv;      
-__declspec(dllimport) extern wchar_t ** __wargv;  
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) extern char ** _environ;    
-__declspec(dllimport) extern wchar_t ** _wenviron;    
-
-
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_pgmptr" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) extern char * _pgmptr;      
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_wpgmptr" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) extern wchar_t * _wpgmptr;  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-errno_t __cdecl _get_pgmptr(       char ** _Value);
-errno_t __cdecl _get_wpgmptr(       wchar_t ** _Value);
-
-
-
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_fmode" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) extern int _fmode;          
-
-
-
-
-
-__declspec(dllimport) errno_t __cdecl _set_fmode(     int _Mode);
-__declspec(dllimport) errno_t __cdecl _get_fmode(     int * _PMode);
-
-
-
-#pragma warning(push)
-#pragma warning(disable:4141)
-
-
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_osplatform" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details."))	__declspec(dllimport) extern unsigned int _osplatform;
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_osver" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details."))			__declspec(dllimport) extern unsigned int _osver;
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_winver" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details."))		__declspec(dllimport) extern unsigned int _winver;
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_winmajor" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details."))		__declspec(dllimport) extern unsigned int _winmajor;
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_winminor" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details."))		__declspec(dllimport) extern unsigned int _winminor;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(pop)
-
-__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details.")) errno_t __cdecl _get_osplatform(     unsigned int * _Value);
-__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details.")) errno_t __cdecl _get_osver(     unsigned int * _Value);
-__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details.")) errno_t __cdecl _get_winver(     unsigned int * _Value);
-__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details.")) errno_t __cdecl _get_winmajor(     unsigned int * _Value);
-__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details.")) errno_t __cdecl _get_winminor(     unsigned int * _Value);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) __declspec(noreturn) void __cdecl exit(     int _Code);
-__declspec(dllimport) __declspec(noreturn) void __cdecl _exit(     int _Code);
-__declspec(dllimport) void __cdecl abort(void);
-
-
-__declspec(dllimport) unsigned int __cdecl _set_abort_behavior(     unsigned int _Flags,      unsigned int _Mask);
-
-
-
-        int     __cdecl abs(     int _X);
-        long    __cdecl labs(     long _X);
-
-
-
-        __int64    __cdecl _abs64(__int64);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-        int    __cdecl atexit(void (__cdecl *)(void));
-
-
-
-__declspec(dllimport)  double  __cdecl atof(       const char *_String);
-__declspec(dllimport)  double  __cdecl _atof_l(       const char *_String,        _locale_t _Locale);
-
-__declspec(dllimport)   int    __cdecl atoi(       const char *_Str);
-__declspec(dllimport)  int    __cdecl _atoi_l(       const char *_Str,        _locale_t _Locale);
-__declspec(dllimport)  long   __cdecl atol(       const char *_Str);
-__declspec(dllimport)  long   __cdecl _atol_l(       const char *_Str,        _locale_t _Locale);
-
-
-
-__declspec(dllimport)  void * __cdecl bsearch_s(     const void * _Key,        const void * _Base, 
-             rsize_t _NumOfElements,      rsize_t _SizeOfElements,
-             int (__cdecl * _PtFuncCompare)(void *, const void *, const void *), void * _Context);
-
-__declspec(dllimport)  void * __cdecl bsearch(     const void * _Key,        const void * _Base, 
-             size_t _NumOfElements,      size_t _SizeOfElements,
-             int (__cdecl * _PtFuncCompare)(const void *, const void *));
-
-
-__declspec(dllimport) void __cdecl qsort_s(       void * _Base, 
-             rsize_t _NumOfElements,      rsize_t _SizeOfElements,
-             int (__cdecl * _PtFuncCompare)(void *, const void *, const void *), void *_Context);
-
-__declspec(dllimport) void __cdecl qsort(       void * _Base, 
-	     size_t _NumOfElements,      size_t _SizeOfElements, 
-             int (__cdecl * _PtFuncCompare)(const void *, const void *));
-
-         unsigned short __cdecl _byteswap_ushort(     unsigned short _Short);
-         unsigned long  __cdecl _byteswap_ulong (     unsigned long _Long);
-
-         unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64 _Int64);
-
-__declspec(dllimport)  div_t  __cdecl div(     int _Numerator,      int _Denominator);
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_dupenv_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))  char * __cdecl getenv(       const char * _VarName);
-
-__declspec(dllimport)  errno_t __cdecl getenv_s(     size_t * _ReturnSize,        char * _DstBuf,      rsize_t _DstSize,        const char * _VarName);
-
-extern "C++" { template <size_t _Size> inline errno_t __cdecl getenv_s(     size_t * _ReturnSize,      char (&_Dest)[_Size],        const char * _VarName) { return getenv_s(_ReturnSize, _Dest, _Size, _VarName); } }
-
-
-
-
-
-__declspec(dllimport)  errno_t __cdecl _dupenv_s(                     char **_PBuffer,        size_t * _PBufferSizeInBytes,        const char * _VarName);
-
-
-
-
-
-__declspec(dllimport)  errno_t __cdecl _itoa_s(     int _Value,        char * _DstBuf,      size_t _Size,      int _Radix);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _itoa_s(     int _Value,      char (&_Dest)[_Size],      int _Radix) { return _itoa_s(_Value, _Dest, _Size, _Radix); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_itoa_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl _itoa( int _Value,  char *_Dest,  int _Radix);
-
-__declspec(dllimport)  errno_t __cdecl _i64toa_s(     __int64 _Val,        char * _DstBuf,      size_t _Size,      int _Radix);
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_i64toa_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl _i64toa(     __int64 _Val,      char * _DstBuf,      int _Radix);
-__declspec(dllimport)  errno_t __cdecl _ui64toa_s(     unsigned __int64 _Val,        char * _DstBuf,      size_t _Size,      int _Radix);
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_ui64toa_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl _ui64toa(     unsigned __int64 _Val,      char * _DstBuf,      int _Radix);
-__declspec(dllimport)  __int64 __cdecl _atoi64(       const char * _String);
-__declspec(dllimport)  __int64 __cdecl _atoi64_l(       const char * _String,        _locale_t _Locale);
-__declspec(dllimport)  __int64 __cdecl _strtoi64(       const char * _String,                    char ** _EndPtr,      int _Radix);
-__declspec(dllimport)  __int64 __cdecl _strtoi64_l(       const char * _String,                    char ** _EndPtr,      int _Radix,        _locale_t _Locale);
-__declspec(dllimport)  unsigned __int64 __cdecl _strtoui64(       const char * _String,                    char ** _EndPtr,      int _Radix);
-__declspec(dllimport)  unsigned __int64 __cdecl _strtoui64_l(       const char * _String,                    char ** _EndPtr,      int  _Radix,        _locale_t _Locale);
-
-__declspec(dllimport)  ldiv_t __cdecl ldiv(     long _Numerator,      long _Denominator);
-
-extern "C++"
-{
-    inline ldiv_t  div(     long _A1,      long _A2)
-    {
-        return ldiv(_A1, _A2);
-    }
-}
-
-__declspec(dllimport)  errno_t __cdecl _ltoa_s(     long _Val,        char * _DstBuf,      size_t _Size,      int _Radix);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _ltoa_s(     long _Value,      char (&_Dest)[_Size],      int _Radix) { return _ltoa_s(_Value, _Dest, _Size, _Radix); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_ltoa_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl _ltoa( long _Value,  char *_Dest,  int _Radix);
-__declspec(dllimport)  int    __cdecl mblen(           const char * _Ch,      size_t _MaxCount);
-__declspec(dllimport)  int    __cdecl _mblen_l(           const char * _Ch,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport)  size_t __cdecl _mbstrlen(       const char * _Str);
-__declspec(dllimport)  size_t __cdecl _mbstrlen_l(       const char *_Str,        _locale_t _Locale);
-__declspec(dllimport)  size_t __cdecl _mbstrnlen(       const char *_Str,      size_t _MaxCount);
-__declspec(dllimport)  size_t __cdecl _mbstrnlen_l(       const char *_Str,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport) int    __cdecl mbtowc(     wchar_t * _DstCh,            const char * _SrcCh,      size_t _SrcSizeInBytes);
-__declspec(dllimport) int    __cdecl _mbtowc_l(     wchar_t * _DstCh,            const char * _SrcCh,      size_t _SrcSizeInBytes,        _locale_t _Locale);
-__declspec(dllimport)  errno_t __cdecl mbstowcs_s(       size_t * _PtNumOfCharConverted,          wchar_t * _DstBuf,      size_t _SizeInWords,          const char * _SrcBuf,      size_t _MaxCount );
-extern "C++" { template <size_t _Size> inline errno_t __cdecl mbstowcs_s(       size_t * _PtNumOfCharConverted,        wchar_t (&_Dest)[_Size],        const char * _Source,      size_t _MaxCount) { return mbstowcs_s(_PtNumOfCharConverted, _Dest, _Size, _Source, _MaxCount); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "mbstowcs_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) size_t __cdecl mbstowcs( wchar_t *_Dest,  const char * _Source,  size_t _MaxCount);
-
-__declspec(dllimport)  errno_t __cdecl _mbstowcs_s_l(       size_t * _PtNumOfCharConverted,          wchar_t * _DstBuf,      size_t _SizeInWords,          const char * _SrcBuf,      size_t _MaxCount,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbstowcs_s_l(       size_t * _PtNumOfCharConverted,      wchar_t (&_Dest)[_Size],        const char * _Source,      size_t _MaxCount,        _locale_t _Locale) { return _mbstowcs_s_l(_PtNumOfCharConverted, _Dest, _Size, _Source, _MaxCount, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbstowcs_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) size_t __cdecl _mbstowcs_l(       wchar_t *_Dest,        const char * _Source,      size_t _MaxCount,        _locale_t _Locale);
-
-__declspec(dllimport)  int    __cdecl rand(void);
-
-
-
-
-__declspec(dllimport)  int    __cdecl _set_error_mode(     int _Mode);
-
-__declspec(dllimport) void   __cdecl srand(     unsigned int _Seed);
-__declspec(dllimport)  double __cdecl strtod(       const char * _Str,                    char ** _EndPtr);
-__declspec(dllimport)  double __cdecl _strtod_l(       const char * _Str,                    char ** _EndPtr,        _locale_t _Locale);
-__declspec(dllimport)  long   __cdecl strtol(       const char * _Str,                    char ** _EndPtr,      int _Radix );
-__declspec(dllimport)  long   __cdecl _strtol_l(       const char *_Str,                    char **_EndPtr,      int _Radix,        _locale_t _Locale);
-__declspec(dllimport)  unsigned long __cdecl strtoul(       const char * _Str,                    char ** _EndPtr,      int _Radix);
-__declspec(dllimport)  unsigned long __cdecl _strtoul_l(const char * _Str,                    char **_EndPtr,      int _Radix,        _locale_t _Locale);
-
-
-__declspec(dllimport) int __cdecl system(         const char * _Command);
-
-__declspec(dllimport)  errno_t __cdecl _ultoa_s(     unsigned long _Val,        char * _DstBuf,      size_t _Size,      int _Radix);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _ultoa_s(     unsigned long _Value,      char (&_Dest)[_Size],      int _Radix) { return _ultoa_s(_Value, _Dest, _Size, _Radix); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_ultoa_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl _ultoa( unsigned long _Value,  char *_Dest,  int _Radix);
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "wctomb_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int    __cdecl wctomb(         char * _MbCh,        wchar_t _WCh);
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_wctomb_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int    __cdecl _wctomb_l(       char * _MbCh,      wchar_t _WCh,        _locale_t _Locale);
-
-__declspec(dllimport)  errno_t __cdecl wctomb_s(       int * _SizeConverted,          char * _MbCh,      rsize_t _SizeInBytes,      wchar_t _WCh);
-
-__declspec(dllimport)  errno_t __cdecl _wctomb_s_l(       int * _SizeConverted,          char * _MbCh,      size_t _SizeInBytes,      wchar_t _WCh,        _locale_t _Locale);
-__declspec(dllimport)  errno_t __cdecl wcstombs_s(       size_t * _PtNumOfCharConverted,          char * _Dst,      size_t _DstSizeInBytes,        const wchar_t * _Src,      size_t _MaxCountInBytes);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl wcstombs_s(       size_t * _PtNumOfCharConverted,        char (&_Dest)[_Size],        const wchar_t * _Source,      size_t _MaxCount) { return wcstombs_s(_PtNumOfCharConverted, _Dest, _Size, _Source, _MaxCount); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "wcstombs_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) size_t __cdecl wcstombs( char *_Dest,  const wchar_t * _Source,  size_t _MaxCount);
-__declspec(dllimport)  errno_t __cdecl _wcstombs_s_l(       size_t * _PtNumOfCharConverted,          char * _Dst,      size_t _DstSizeInBytes,        const wchar_t * _Src,      size_t _MaxCountInBytes,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcstombs_s_l(       size_t * _PtNumOfCharConverted,        char (&_Dest)[_Size],        const wchar_t * _Source,      size_t _MaxCount,        _locale_t _Locale) { return _wcstombs_s_l(_PtNumOfCharConverted, _Dest, _Size, _Source, _MaxCount, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcstombs_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) size_t __cdecl _wcstombs_l(       char *_Dest,        const wchar_t * _Source,      size_t _MaxCount,        _locale_t _Locale);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)  errno_t __cdecl _itow_s (     int _Val,        wchar_t * _DstBuf,      size_t _SizeInWords,      int _Radix);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _itow_s(     int _Value,      wchar_t (&_Dest)[_Size],      int _Radix) { return _itow_s(_Value, _Dest, _Size, _Radix); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_itow_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _itow( int _Value,  wchar_t *_Dest,  int _Radix);
-__declspec(dllimport)  errno_t __cdecl _ltow_s (     long _Val,        wchar_t * _DstBuf,      size_t _SizeInWords,      int _Radix);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _ltow_s(     long _Value,      wchar_t (&_Dest)[_Size],      int _Radix) { return _ltow_s(_Value, _Dest, _Size, _Radix); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_ltow_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _ltow( long _Value,  wchar_t *_Dest,  int _Radix);
-__declspec(dllimport)  errno_t __cdecl _ultow_s (     unsigned long _Val,        wchar_t * _DstBuf,      size_t _SizeInWords,      int _Radix);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _ultow_s(     unsigned long _Value,      wchar_t (&_Dest)[_Size],      int _Radix) { return _ultow_s(_Value, _Dest, _Size, _Radix); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_ultow_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _ultow( unsigned long _Value,  wchar_t *_Dest,  int _Radix);
-__declspec(dllimport)  double __cdecl wcstod(       const wchar_t * _Str,                    wchar_t ** _EndPtr);
-__declspec(dllimport)  double __cdecl _wcstod_l(       const wchar_t *_Str,                    wchar_t ** _EndPtr,        _locale_t _Locale);
-__declspec(dllimport)  long   __cdecl wcstol(       const wchar_t *_Str,                    wchar_t ** _EndPtr, int _Radix);
-__declspec(dllimport)  long   __cdecl _wcstol_l(       const wchar_t *_Str,                    wchar_t **_EndPtr, int _Radix,        _locale_t _Locale);
-__declspec(dllimport)  unsigned long __cdecl wcstoul(       const wchar_t *_Str,                    wchar_t ** _EndPtr, int _Radix);
-__declspec(dllimport)  unsigned long __cdecl _wcstoul_l(       const wchar_t *_Str,                    wchar_t **_EndPtr, int _Radix,        _locale_t _Locale);
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_wdupenv_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))  wchar_t * __cdecl _wgetenv(       const wchar_t * _VarName);
-__declspec(dllimport)  errno_t __cdecl _wgetenv_s(     size_t * _ReturnSize,        wchar_t * _DstBuf,      size_t _DstSizeInWords,        const wchar_t * _VarName);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wgetenv_s(     size_t * _ReturnSize,      wchar_t (&_Dest)[_Size],        const wchar_t * _VarName) { return _wgetenv_s(_ReturnSize, _Dest, _Size, _VarName); } }
-
-
-
-
-
-
-__declspec(dllimport)  errno_t __cdecl _wdupenv_s(                     wchar_t **_Buffer,        size_t *_BufferSizeInWords,        const wchar_t *_VarName);
-
-
-
-
-
-
-
-__declspec(dllimport) int __cdecl _wsystem(         const wchar_t * _Command);
-
-__declspec(dllimport)  double __cdecl _wtof(       const wchar_t *_Str);
-__declspec(dllimport)  double __cdecl _wtof_l(       const wchar_t *_Str,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _wtoi(       const wchar_t *_Str);
-__declspec(dllimport)  int __cdecl _wtoi_l(       const wchar_t *_Str,        _locale_t _Locale);
-__declspec(dllimport)  long __cdecl _wtol(       const wchar_t *_Str);
-__declspec(dllimport)  long __cdecl _wtol_l(       const wchar_t *_Str,        _locale_t _Locale);
-
-
-__declspec(dllimport)  errno_t __cdecl _i64tow_s(     __int64 _Val,        wchar_t * _DstBuf,      size_t _SizeInWords,      int _Radix);
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_i65tow_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl _i64tow(     __int64 _Val,      wchar_t * _DstBuf,      int _Radix);
-__declspec(dllimport)  errno_t __cdecl _ui64tow_s(     unsigned __int64 _Val,        wchar_t * _DstBuf,      size_t _SizeInWords,      int _Radix);
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_ui64tow_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl _ui64tow(     unsigned __int64 _Val,      wchar_t * _DstBuf,      int _Radix);
-__declspec(dllimport)  __int64   __cdecl _wtoi64(       const wchar_t *_Str);
-__declspec(dllimport)  __int64   __cdecl _wtoi64_l(       const wchar_t *_Str,        _locale_t _Locale);
-__declspec(dllimport)  __int64   __cdecl _wcstoi64(       const wchar_t * _Str,                    wchar_t ** _EndPtr,      int _Radix);
-__declspec(dllimport)  __int64   __cdecl _wcstoi64_l(       const wchar_t * _Str,                    wchar_t ** _EndPtr,      int _Radix,        _locale_t _Locale);
-__declspec(dllimport)  unsigned __int64  __cdecl _wcstoui64(       const wchar_t * _Str,                    wchar_t ** _EndPtr,      int _Radix);
-__declspec(dllimport)  unsigned __int64  __cdecl _wcstoui64_l(       const wchar_t *_Str ,                    wchar_t ** _EndPtr,      int _Radix,        _locale_t _Locale);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)  char * __cdecl _fullpath(         char * _FullPath,        const char * _Path,      size_t _SizeInBytes);
-
-
-
-
-
-
-
-__declspec(dllimport)  errno_t __cdecl _ecvt_s(       char * _DstBuf,      size_t _Size,      double _Val,      int _NumOfDights,      int * _PtDec,      int * _PtSign);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _ecvt_s(     char (&_Dest)[_Size],      double _Value,      int _NumOfDigits,      int * _PtDec,      int * _PtSign) { return _ecvt_s(_Dest, _Size, _Value, _NumOfDigits, _PtDec, _PtSign); } }
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_ecvt_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))  char * __cdecl _ecvt(     double _Val,      int _NumOfDigits,      int * _PtDec,      int * _PtSign);
-__declspec(dllimport)  errno_t __cdecl _fcvt_s(       char * _DstBuf,      size_t _Size,      double _Val,      int _NumOfDec,      int * _PtDec,      int * _PtSign);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _fcvt_s(     char (&_Dest)[_Size],      double _Value,      int _NumOfDigits,      int * _PtDec,      int * _PtSign) { return _fcvt_s(_Dest, _Size, _Value, _NumOfDigits, _PtDec, _PtSign); } }
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_fcvt_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))  char * __cdecl _fcvt(     double _Val,      int _NumOfDec,      int * _PtDec,      int * _PtSign);
-__declspec(dllimport) errno_t __cdecl _gcvt_s(       char * _DstBuf,      size_t _Size,      double _Val,      int _NumOfDigits);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _gcvt_s(     char (&_Dest)[_Size],      double _Value,      int _NumOfDigits) { return _gcvt_s(_Dest, _Size, _Value, _NumOfDigits); } }
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_gcvt_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl _gcvt(     double _Val,      int _NumOfDigits,      char * _DstBuf);
-
-__declspec(dllimport)  int __cdecl _atodbl(     _CRT_DOUBLE * _Result,        char * _Str);
-__declspec(dllimport)  int __cdecl _atoldbl(     _LDOUBLE * _Result,        char * _Str);
-__declspec(dllimport)  int __cdecl _atoflt(     _CRT_FLOAT * _Result,        char * _Str);
-__declspec(dllimport)  int __cdecl _atodbl_l(     _CRT_DOUBLE * _Result,        char * _Str,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _atoldbl_l(     _LDOUBLE * _Result,        char * _Str,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _atoflt_l(     _CRT_FLOAT * _Result,        char * _Str,        _locale_t _Locale);
-         unsigned long __cdecl _lrotl(     unsigned long _Val,      int _Shift);
-         unsigned long __cdecl _lrotr(     unsigned long _Val,      int _Shift);
-__declspec(dllimport)  errno_t   __cdecl _makepath_s(       char * _PathResult,        size_t _Size,          const char * _Drive,          const char * _Dir,          const char * _Filename,
-                 const char * _Ext);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _makepath_s(     char (&_Path)[_Size],          const char * _Drive,          const char * _Dir,          const char * _Filename,          const char * _Ext) { return _makepath_s(_Path, _Size, _Drive, _Dir, _Filename, _Ext); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_makepath_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) void __cdecl _makepath( char *_Path,  const char * _Drive,  const char * _Dir,  const char * _Filename,  const char * _Ext);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-        _onexit_t __cdecl _onexit(       _onexit_t _Func);
-
-        
-
-
-__declspec(dllimport) void __cdecl perror(         const char * _ErrMsg);
-
-__declspec(dllimport)  int    __cdecl _putenv(       const char * _EnvString);
-__declspec(dllimport)  errno_t __cdecl _putenv_s(       const char * _Name,        const char * _Value);
-         unsigned int __cdecl _rotl(     unsigned int _Val,      int _Shift);
-
-         unsigned __int64 __cdecl _rotl64(     unsigned __int64 _Val,      int _Shift);
-
-         unsigned int __cdecl _rotr(     unsigned int _Val,      int _Shift);
-
-         unsigned __int64 __cdecl _rotr64(     unsigned __int64 _Val,      int _Shift);
-
-__declspec(dllimport) errno_t __cdecl _searchenv_s(       const char * _Filename,        const char * _EnvVar,        char * _ResultPath,      size_t _SizeInBytes);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _searchenv_s(       const char * _Filename,        const char * _EnvVar,      char (&_ResultPath)[_Size]) { return _searchenv_s(_Filename, _EnvVar, _ResultPath, _Size); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_searchenv_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) void __cdecl _searchenv( const char * _Filename,  const char * _EnvVar,  char *_ResultPath);
-
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_splitpath_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) void   __cdecl _splitpath(       const char * _FullPath,        char * _Drive,        char * _Dir,        char * _Filename,        char * _Ext);
-__declspec(dllimport)  errno_t  __cdecl _splitpath_s(       const char * _FullPath, 
-		         char * _Drive,      size_t _DriveSize, 
-		         char * _Dir,      size_t _DirSize, 
-		         char * _Filename,      size_t _FilenameSize, 
-		         char * _Ext,      size_t _ExtSize);
-extern "C++" { template <size_t _DriveSize, size_t _DirSize, size_t _NameSize, size_t _ExtSize> inline errno_t __cdecl _splitpath_s(     const char *_Dest,        char (&_Drive)[_DriveSize],        char (&_Dir)[_DirSize],        char (&_Name)[_NameSize],        char (&_Ext)[_ExtSize]) { return _splitpath_s(_Dest, _Drive, _DriveSize, _Dir, _DirSize, _Name, _NameSize, _Ext, _ExtSize); } }
-
-__declspec(dllimport) void   __cdecl _swab(           char * _Buf1,            char * _Buf2, int _SizeInBytes);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)  wchar_t * __cdecl _wfullpath(         wchar_t * _FullPath,        const wchar_t * _Path,      size_t _SizeInWords);
-
-
-
-
-
-__declspec(dllimport)  errno_t __cdecl _wmakepath_s(       wchar_t * _PathResult,        size_t _SizeInWords,          const wchar_t * _Drive,          const wchar_t * _Dir,          const wchar_t * _Filename,
-                 const wchar_t * _Ext);        
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wmakepath_s(     wchar_t (&_ResultPath)[_Size],          const wchar_t * _Drive,          const wchar_t * _Dir,          const wchar_t * _Filename,          const wchar_t * _Ext) { return _wmakepath_s(_ResultPath, _Size, _Drive, _Dir, _Filename, _Ext); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wmakepath_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) void __cdecl _wmakepath( wchar_t *_ResultPath,  const wchar_t * _Drive,  const wchar_t * _Dir,  const wchar_t * _Filename,  const wchar_t * _Ext);
-
-
-__declspec(dllimport) void __cdecl _wperror(         const wchar_t * _ErrMsg);
-
-__declspec(dllimport)  int    __cdecl _wputenv(       const wchar_t * _EnvString);
-__declspec(dllimport)  errno_t __cdecl _wputenv_s(       const wchar_t * _Name,        const wchar_t * _Value);
-__declspec(dllimport) errno_t __cdecl _wsearchenv_s(       const wchar_t * _Filename,        const wchar_t * _EnvVar,        wchar_t * _ResultPath,      size_t _SizeInWords);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wsearchenv_s(       const wchar_t * _Filename,        const wchar_t * _EnvVar,      wchar_t (&_ResultPath)[_Size]) { return _wsearchenv_s(_Filename, _EnvVar, _ResultPath, _Size); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wsearchenv_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) void __cdecl _wsearchenv( const wchar_t * _Filename,  const wchar_t * _EnvVar,  wchar_t *_ResultPath);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wsplitpath_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) void   __cdecl _wsplitpath(       const wchar_t * _FullPath,        wchar_t * _Drive,        wchar_t * _Dir,        wchar_t * _Filename,        wchar_t * _Ext);
-__declspec(dllimport) errno_t __cdecl _wsplitpath_s(       const wchar_t * _FullPath, 
-		         wchar_t * _Drive,      size_t _DriveSizeInWords, 
-		         wchar_t * _Dir,      size_t _DirSizeInWords, 
-		         wchar_t * _Filename,      size_t _FilenameSizeInWords, 
-		         wchar_t * _Ext,      size_t _ExtSizeInWords);
-extern "C++" { template <size_t _DriveSize, size_t _DirSize, size_t _NameSize, size_t _ExtSize> inline errno_t __cdecl _wsplitpath_s(     const wchar_t *_Path,        wchar_t (&_Drive)[_DriveSize],        wchar_t (&_Dir)[_DirSize],        wchar_t (&_Name)[_NameSize],        wchar_t (&_Ext)[_ExtSize]) { return _wsplitpath_s(_Path, _Drive, _DriveSize, _Dir, _DirSize, _Name, _NameSize, _Ext, _ExtSize); } }
-
-
-
-
-
-__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "SetErrorMode" " instead. See online help for details.")) __declspec(dllimport) void __cdecl _seterrormode(     int _Mode);
-__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "Beep" " instead. See online help for details.")) __declspec(dllimport) void __cdecl _beep(     unsigned _Frequency,      unsigned _Duration);
-__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "Sleep" " instead. See online help for details.")) __declspec(dllimport) void __cdecl _sleep(     unsigned long _Duration);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(push)
-#pragma warning(disable: 4141)  
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_ecvt" ". See online help for details.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_ecvt_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))		__declspec(dllimport)  char * __cdecl ecvt(     double _Val,      int _NumOfDigits,      int * _PtDec,      int * _PtSign);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_fcvt" ". See online help for details.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_fcvt_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))		__declspec(dllimport)  char * __cdecl fcvt(     double _Val,      int _NumOfDec,      int * _PtDec,      int * _PtSign);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_gcvt" ". See online help for details.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_fcvt_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))		__declspec(dllimport) char * __cdecl gcvt(     double _Val,      int _NumOfDigits,      char * _DstBuf);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_itoa" ". See online help for details.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_itoa_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))		__declspec(dllimport) char * __cdecl itoa(     int _Val,      char * _DstBuf,      int _Radix);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_ltoa" ". See online help for details.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_ltoa_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))		__declspec(dllimport) char * __cdecl ltoa(     long _Val,      char * _DstBuf,      int _Radix);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_putenv" ". See online help for details.")) 									__declspec(dllimport)  int    __cdecl putenv(       const char * _EnvString);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_swab" ". See online help for details."))										__declspec(dllimport) void   __cdecl swab(           char * _Buf1,           char * _Buf2,      int _SizeInBytes);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_ultoa" ". See online help for details.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_ultoa_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))	__declspec(dllimport) char * __cdecl ultoa(     unsigned long _Val,      char * _Dstbuf,      int _Radix);
-#pragma warning(pop)
-_onexit_t __cdecl onexit(       _onexit_t _Func);
-
-
-
-
-
-
-}
-
-
-
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-	
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma pack(push,8)
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
- 
-
-
-
-
-
-typedef void *_HFILE; 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef int (__cdecl * _CRT_REPORT_HOOK)(int, char *, int *);
-typedef int (__cdecl * _CRT_REPORT_HOOKW)(int, wchar_t *, int *);
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-typedef int (__cdecl * _CRT_ALLOC_HOOK)(int, void *, size_t, int, long, const unsigned char *, int);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef void (__cdecl * _CRT_DUMP_CLIENT)(void *, size_t);
-
-
-
-
-
-
-
-struct _CrtMemBlockHeader;
-typedef struct _CrtMemState
-{
-        struct _CrtMemBlockHeader * pBlockHeader;
-        size_t lCounts[5];
-        size_t lSizes[5];
-        size_t lHighWaterCount;
-        size_t lTotalCount;
-} _CrtMemState;
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-__declspec(dllimport) extern long _crtAssertBusy;
-
-
-
-__declspec(dllimport) _CRT_REPORT_HOOK __cdecl _CrtGetReportHook(
-    void
-    );
-
-
-
-
-
-
-
-__declspec(dllimport) _CRT_REPORT_HOOK __cdecl _CrtSetReportHook(
-           _CRT_REPORT_HOOK _PFnNewHook
-        );
-
-__declspec(dllimport) int __cdecl _CrtSetReportHook2(
-             int _Mode,
-               _CRT_REPORT_HOOK _PFnNewHook
-        );
-
-__declspec(dllimport) int __cdecl _CrtSetReportHookW2(
-             int _Mode,
-               _CRT_REPORT_HOOKW _PFnNewHook
-        );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) int __cdecl _CrtSetReportMode(
-             int _ReportType,
-               int _ReportMode 
-        );
-
-__declspec(dllimport) _HFILE __cdecl _CrtSetReportFile(
-             int _ReportType,
-               _HFILE _ReportFile 
-        );
-
-__declspec(dllimport) int __cdecl _CrtDbgReport(
-             int _ReportType,
-                 const char * _Filename,
-             int _Linenumber,
-                 const char * _ModuleName,
-                 const char * _Format,
-        ...);
-
-__declspec(dllimport) size_t __cdecl _CrtSetDebugFillThreshold(
-             size_t _NewDebugFillThreshold
-        );
-
-
-
-
-__declspec(dllimport) int __cdecl _CrtDbgReportW(
-             int _ReportType,
-                 const wchar_t * _Filename,
-             int _LineNumber,
-                 const wchar_t * _ModuleName,
-                 const wchar_t * _Format,
-        ...);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) extern long _crtBreakAlloc;      
-
-
-__declspec(dllimport) long __cdecl _CrtSetBreakAlloc(
-             long _BreakAlloc 
-        );
-
-
-
-
-
-__declspec(dllimport)      void * __cdecl _malloc_dbg(
-             size_t _Size,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)      void * __cdecl _calloc_dbg(
-             size_t _NumOfElements,
-             size_t _SizeOfElements,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)      void * __cdecl _realloc_dbg(
-               void * _Memory,
-             size_t _NewSize,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)      void * __cdecl _recalloc_dbg
-(
-               void * _Memory,
-             size_t _NumOfElements,
-             size_t _SizeOfElements,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-);
-
-__declspec(dllimport)      void * __cdecl _expand_dbg(
-               void * _Memory,
-             size_t _NewSize,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport) void __cdecl _free_dbg(
-               void * _Memory,
-             int _BlockType
-        );
-
-__declspec(dllimport) size_t __cdecl _msize_dbg (
-             void * _Memory,
-             int _BlockType
-        );
-
-__declspec(dllimport) size_t __cdecl _aligned_msize_dbg (
-             void * _Memory,
-             size_t _Alignment,
-             size_t _Offset
-        );
-
-__declspec(dllimport)      void * __cdecl _aligned_malloc_dbg(
-             size_t _Size,
-             size_t _Alignment,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)      void * __cdecl _aligned_realloc_dbg(
-               void * _Memory,
-             size_t _Size,
-             size_t _Alignment,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)      void * __cdecl _aligned_recalloc_dbg
-(
-               void * _Memory,
-             size_t _NumOfElements,
-             size_t _SizeOfElements,
-             size_t _Alignment,
-                 const char * _Filename,
-             int _LineNumber
-);
-
-__declspec(dllimport)      void * __cdecl _aligned_offset_malloc_dbg(
-             size_t _Size,
-             size_t _Alignment,
-             size_t _Offset,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)      void * __cdecl _aligned_offset_realloc_dbg(
-               void * _Memory,
-             size_t _Size,
-             size_t _Alignment,
-             size_t _Offset,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)      void * __cdecl _aligned_offset_recalloc_dbg
-(
-               void * _Memory,
-             size_t _NumOfElements,
-             size_t _SizeOfElements,
-             size_t _Alignment,
-             size_t _Offset,
-                 const char * _Filename,
-             int _LineNumber
-);
-
-__declspec(dllimport) void __cdecl _aligned_free_dbg(
-               void * _Memory
-        );
-
-__declspec(dllimport)         char * __cdecl _strdup_dbg(
-                 const char * _Str,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)         wchar_t * __cdecl _wcsdup_dbg(
-                 const wchar_t * _Str,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)         char * __cdecl _tempnam_dbg(
-                 const char * _DirName,
-                 const char * _FilePrefix,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)         wchar_t * __cdecl _wtempnam_dbg(
-                 const wchar_t * _DirName,
-                 const wchar_t * _FilePrefix,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)         char * __cdecl _fullpath_dbg(
-                 char * _FullPath, 
-               const char * _Path, 
-             size_t _SizeInBytes,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)         wchar_t * __cdecl _wfullpath_dbg(
-                 wchar_t * _FullPath, 
-               const wchar_t * _Path, 
-             size_t _SizeInWords,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)         char * __cdecl _getcwd_dbg(
-                 char * _DstBuf,
-             int _SizeInBytes,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)         wchar_t * __cdecl _wgetcwd_dbg(
-                 wchar_t * _DstBuf,
-             int _SizeInWords,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)         char * __cdecl _getdcwd_dbg(
-             int _Drive,
-                 char * _DstBuf,
-             int _SizeInBytes,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)         wchar_t * __cdecl _wgetdcwd_dbg(
-             int _Drive,
-                 wchar_t * _DstBuf,
-             int _SizeInWords,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-        char * __cdecl _getdcwd_lk_dbg(
-             int _Drive,
-                 char * _DstBuf,
-             int _SizeInBytes,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-        wchar_t * __cdecl _wgetdcwd_lk_dbg(
-             int _Drive,
-                 wchar_t * _DstBuf,
-             int _SizeInWords,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)  errno_t __cdecl _dupenv_s_dbg(
-                             char ** _PBuffer,
-               size_t * _PBufferSizeInBytes,
-               const char * _VarName,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-__declspec(dllimport)  errno_t __cdecl _wdupenv_s_dbg(
-                             wchar_t ** _PBuffer,
-               size_t * _PBufferSizeInWords,
-               const wchar_t * _VarName,
-             int _BlockType,
-                 const char * _Filename,
-             int _LineNumber
-        );
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-__declspec(dllimport) _CRT_ALLOC_HOOK __cdecl _CrtGetAllocHook
-(
-    void
-);
-
-
-
-
-
-
-
-__declspec(dllimport) _CRT_ALLOC_HOOK __cdecl _CrtSetAllocHook
-(
-           _CRT_ALLOC_HOOK _PfnNewHook
-);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) extern int _crtDbgFlag;
-
-
-__declspec(dllimport) int __cdecl _CrtCheckMemory(
-        void
-        );
-
-__declspec(dllimport) int __cdecl _CrtSetDbgFlag(
-             int _NewFlag
-        );
-
-__declspec(dllimport) void __cdecl _CrtDoForAllClientObjects(
-             void (__cdecl *_PFn)(void *, void *),
-        void * _Context
-        );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)  int __cdecl _CrtIsValidPointer(
-               const void * _Ptr,
-             unsigned int _Bytes,
-             int _ReadWrite
-        );
-
-__declspec(dllimport)  int __cdecl _CrtIsValidHeapPointer(
-               const void * _HeapPtr
-        );
-
-__declspec(dllimport) int __cdecl _CrtIsMemoryBlock(
-               const void * _Memory,
-             unsigned int _Bytes,
-               long * _RequestNumber,
-               char ** _Filename,
-               int * _LineNumber
-        );
-
-__declspec(dllimport)  int __cdecl _CrtReportBlockType(
-               const void * _Memory
-        );
-
-
- 
-
-
-
-
-
-
-__declspec(dllimport) _CRT_DUMP_CLIENT __cdecl _CrtGetDumpClient
-(
-    void
-);
-
-
-
-
-
-
-
-__declspec(dllimport) _CRT_DUMP_CLIENT __cdecl _CrtSetDumpClient
-(
-           _CRT_DUMP_CLIENT _PFnNewDump
-);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)  void __cdecl _CrtMemCheckpoint(
-             _CrtMemState * _State
-        );
-
-__declspec(dllimport)  int __cdecl _CrtMemDifference(
-             _CrtMemState * _State,
-             const _CrtMemState * _OldState,
-             const _CrtMemState * _NewState
-        );
-
-__declspec(dllimport) void __cdecl _CrtMemDumpAllObjectsSince(
-               const _CrtMemState * _State
-        );
-
-__declspec(dllimport) void __cdecl _CrtMemDumpStatistics(
-             const _CrtMemState * _State
-        );
-
-__declspec(dllimport) int __cdecl _CrtDumpMemoryLeaks(
-        void
-        );
-
-__declspec(dllimport) int __cdecl _CrtSetCheckCount(
-             int _CheckCount
-        );
-
-__declspec(dllimport) int __cdecl _CrtGetCheckCount(
-        void
-        );
-
-
-
-
-}
-
-
-
-extern "C++" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
- 
-  void * __cdecl operator new[](size_t _Size);
-
-  void * __cdecl operator new(
-        size_t _Size,
-        int,
-        const char *,
-        int
-        );
-
-  void * __cdecl operator new[](
-        size_t _Size,
-        int,
-        const char *,
-        int
-        );
-
-
-void __cdecl operator delete[](void *);
-
-inline void __cdecl operator delete(void * _P, int, const char *, int)
-        { ::operator delete(_P); }
-
-inline void __cdecl operator delete[](void * _P, int, const char *, int)
-        { ::operator delete[](_P); }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4514)
-
-#pragma warning(disable:4103)
-
-
-#pragma warning(push)
-
-#pragma warning(disable:4001)
-#pragma warning(disable:4201)
-#pragma warning(disable:4214)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma pack(push,8)
-
-
-
-extern "C" {
-
-
-
-
-
-typedef enum _EXCEPTION_DISPOSITION {
-    ExceptionContinueExecution,
-    ExceptionContinueSearch,
-    ExceptionNestedException,
-    ExceptionCollidedUnwind
-} EXCEPTION_DISPOSITION;
-
-
-
-
-
-
-
-
-
-
-
-struct _EXCEPTION_RECORD;
-struct _CONTEXT;
-
-EXCEPTION_DISPOSITION __cdecl _except_handler (
-         struct _EXCEPTION_RECORD *_ExceptionRecord,
-         void * _EstablisherFrame,
-         struct _CONTEXT *_ContextRecord,
-         void * _DispatcherContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-unsigned long __cdecl _exception_code(void);
-void *        __cdecl _exception_info(void);
-int           __cdecl _abnormal_termination(void);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-typedef unsigned long ULONG;
-typedef ULONG *PULONG;
-typedef unsigned short USHORT;
-typedef USHORT *PUSHORT;
-typedef unsigned char UCHAR;
-typedef UCHAR *PUCHAR;
-typedef char *PSZ;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef unsigned long       DWORD;
-typedef int                 BOOL;
-typedef unsigned char       BYTE;
-typedef unsigned short      WORD;
-typedef float               FLOAT;
-typedef FLOAT               *PFLOAT;
-typedef BOOL            *PBOOL;
-typedef BOOL             *LPBOOL;
-typedef BYTE            *PBYTE;
-typedef BYTE             *LPBYTE;
-typedef int             *PINT;
-typedef int              *LPINT;
-typedef WORD            *PWORD;
-typedef WORD             *LPWORD;
-typedef long             *LPLONG;
-typedef DWORD           *PDWORD;
-typedef DWORD            *LPDWORD;
-typedef void             *LPVOID;
-typedef const void       *LPCVOID;
-
-typedef int                 INT;
-typedef unsigned int        UINT;
-typedef unsigned int        *PUINT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) const unsigned short * __cdecl __pctype_func(void);
-
-__declspec(dllimport) extern const unsigned short *_pctype;
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) extern const unsigned short _wctype[];
-
-
-__declspec(dllimport) const wctype_t * __cdecl __pwctype_func(void);
-
-__declspec(dllimport) extern const wctype_t *_pwctype;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)  int __cdecl _isctype(     int _C,      int _Type);
-__declspec(dllimport)  int __cdecl _isctype_l(     int _C,      int _Type,        _locale_t _Locale);
- __declspec(dllimport)  int __cdecl isalpha(     int _C);
-__declspec(dllimport)  int __cdecl _isalpha_l(     int _C,        _locale_t _Locale);
- __declspec(dllimport)  int __cdecl isupper(     int _C);
-__declspec(dllimport)  int __cdecl _isupper_l(     int _C,        _locale_t _Locale);
- __declspec(dllimport)  int __cdecl islower(     int _C);
-__declspec(dllimport)  int __cdecl _islower_l(     int _C,        _locale_t _Locale);
- __declspec(dllimport)  int __cdecl isdigit(     int _C);
-__declspec(dllimport)  int __cdecl _isdigit_l(     int _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl isxdigit(     int _C);
-__declspec(dllimport)  int __cdecl _isxdigit_l(     int _C,        _locale_t _Locale);
- __declspec(dllimport)  int __cdecl isspace(     int _C);
-__declspec(dllimport)  int __cdecl _isspace_l(     int _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl ispunct(     int _C);
-__declspec(dllimport)  int __cdecl _ispunct_l(     int _C,        _locale_t _Locale);
- __declspec(dllimport)  int __cdecl isalnum(     int _C);
-__declspec(dllimport)  int __cdecl _isalnum_l(     int _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl isprint(     int _C);
-__declspec(dllimport)  int __cdecl _isprint_l(     int _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl isgraph(     int _C);
-__declspec(dllimport)  int __cdecl _isgraph_l(     int _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl iscntrl(     int _C);
-__declspec(dllimport)  int __cdecl _iscntrl_l(     int _C,        _locale_t _Locale);
- __declspec(dllimport)  int __cdecl toupper(     int _C);
- __declspec(dllimport)  int __cdecl tolower(     int _C);
- __declspec(dllimport)  int __cdecl _tolower(     int _C);
-__declspec(dllimport)  int __cdecl _tolower_l(     int _C,        _locale_t _Locale);
- __declspec(dllimport)  int __cdecl _toupper(     int _C);
-__declspec(dllimport)  int __cdecl _toupper_l(     int _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl __isascii(     int _C);
-__declspec(dllimport)  int __cdecl __toascii(     int _C);
-__declspec(dllimport)  int __cdecl __iscsymf(     int _C);
-__declspec(dllimport)  int __cdecl __iscsym(     int _C);
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)  int __cdecl iswalpha(     wint_t _C);
-__declspec(dllimport)  int __cdecl _iswalpha_l(     wint_t _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl iswupper(     wint_t _C);
-__declspec(dllimport)  int __cdecl _iswupper_l(     wint_t _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl iswlower(     wint_t _C);
-__declspec(dllimport)  int __cdecl _iswlower_l(     wint_t _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl iswdigit(     wint_t _C);
-__declspec(dllimport)  int __cdecl _iswdigit_l(     wint_t _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl iswxdigit(     wint_t _C);
-__declspec(dllimport)  int __cdecl _iswxdigit_l(     wint_t _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl iswspace(     wint_t _C);
-__declspec(dllimport)  int __cdecl _iswspace_l(     wint_t _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl iswpunct(     wint_t _C);
-__declspec(dllimport)  int __cdecl _iswpunct_l(     wint_t _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl iswalnum(     wint_t _C);
-__declspec(dllimport)  int __cdecl _iswalnum_l(     wint_t _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl iswprint(     wint_t _C);
-__declspec(dllimport)  int __cdecl _iswprint_l(     wint_t _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl iswgraph(     wint_t _C);
-__declspec(dllimport)  int __cdecl _iswgraph_l(     wint_t _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl iswcntrl(     wint_t _C);
-__declspec(dllimport)  int __cdecl _iswcntrl_l(     wint_t _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl iswascii(     wint_t _C);
-__declspec(dllimport)  int __cdecl isleadbyte(     int _C);
-__declspec(dllimport)  int __cdecl _isleadbyte_l(     int _C,        _locale_t _Locale);
-
-__declspec(dllimport)  wint_t __cdecl towupper(     wint_t _C);
-__declspec(dllimport)  wint_t __cdecl _towupper_l(     wint_t _C,        _locale_t _Locale);
-__declspec(dllimport)  wint_t __cdecl towlower(     wint_t _C);
-__declspec(dllimport)  wint_t __cdecl _towlower_l(     wint_t _C,        _locale_t _Locale); 
-__declspec(dllimport)  int __cdecl iswctype(     wint_t _C,      wctype_t _Type);
-__declspec(dllimport)  int __cdecl _iswctype_l(     wint_t _C,      wctype_t _Type,        _locale_t _Locale);
-
-__declspec(dllimport)  int __cdecl __iswcsymf(     wint_t _C);
-__declspec(dllimport)  int __cdecl _iswcsymf_l(     wint_t _C,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl __iswcsym(     wint_t _C);
-__declspec(dllimport)  int __cdecl _iswcsym_l(     wint_t _C,        _locale_t _Locale);
-
-__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "iswctype" " instead. See online help for details.")) __declspec(dllimport) int __cdecl is_wctype(     wint_t _C,      wctype_t _Type);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) int __cdecl _chvalidator(     int _Ch,      int _Mask);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-int __cdecl _chvalidator_l(       _locale_t,      int _Ch,      int _Mask);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef unsigned long POINTER_64_INT;
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-extern "C" {
-
-
-typedef signed char         INT8, *PINT8;
-typedef signed short        INT16, *PINT16;
-typedef signed int          INT32, *PINT32;
-typedef signed __int64      INT64, *PINT64;
-typedef unsigned char       UINT8, *PUINT8;
-typedef unsigned short      UINT16, *PUINT16;
-typedef unsigned int        UINT32, *PUINT32;
-typedef unsigned __int64    UINT64, *PUINT64;
-
-
-
-
-
-typedef signed int LONG32, *PLONG32;
-
-
-
-
-
-typedef unsigned int ULONG32, *PULONG32;
-typedef unsigned int DWORD32, *PDWORD32;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    typedef __w64 int INT_PTR, *PINT_PTR;
-    typedef __w64 unsigned int UINT_PTR, *PUINT_PTR;
-
-    typedef __w64 long LONG_PTR, *PLONG_PTR;
-    typedef __w64 unsigned long ULONG_PTR, *PULONG_PTR;
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef unsigned short UHALF_PTR, *PUHALF_PTR;
-typedef short HALF_PTR, *PHALF_PTR;
-typedef __w64 long SHANDLE_PTR;
-typedef __w64 unsigned long HANDLE_PTR;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__inline
-void * __ptr64
-PtrToPtr64(
-    const void *p
-    )
-{
-    return((void * __ptr64) (unsigned __int64) (ULONG_PTR)p );
-}
-
-__inline
-void *
-Ptr64ToPtr(
-    const void * __ptr64 p
-    )
-{
-    return((void *) (ULONG_PTR) (unsigned __int64) p);
-}
-
-__inline
-void * __ptr64
-HandleToHandle64(
-    const void *h
-    )
-{
-    return((void * __ptr64) h );
-}
-
-__inline
-void *
-Handle64ToHandle(
-    const void * __ptr64 h
-    )
-{
-    return((void *) (ULONG_PTR) (unsigned __int64) h );
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef ULONG_PTR SIZE_T, *PSIZE_T;
-typedef LONG_PTR SSIZE_T, *PSSIZE_T;
-
-
-
-
-
-typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR;
-
-
-
-
-
-typedef __int64 LONG64, *PLONG64;
-
-
-
-
-
-
-typedef unsigned __int64 ULONG64, *PULONG64;
-typedef unsigned __int64 DWORD64, *PDWORD64;
-
-
-
-
-
-typedef ULONG_PTR KAFFINITY;
-typedef KAFFINITY *PKAFFINITY;
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef void *PVOID;
-typedef void * __ptr64 PVOID64;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef char CHAR;
-typedef short SHORT;
-typedef long LONG;
-
-
-
-
-
-
-
-typedef wchar_t WCHAR;    
-
-
-
-
-
-typedef WCHAR *PWCHAR, *LPWCH, *PWCH;
-typedef const WCHAR *LPCWCH, *PCWCH;
-typedef  WCHAR *NWPSTR, *LPWSTR, *PWSTR;
-typedef  PWSTR *PZPWSTR;
-typedef  const PWSTR *PCZPWSTR;
-typedef  WCHAR  *LPUWSTR, *PUWSTR;
-typedef  const WCHAR *LPCWSTR, *PCWSTR;
-typedef  PCWSTR *PZPCWSTR;
-typedef  const WCHAR  *LPCUWSTR, *PCUWSTR;
-
-
-
-
-typedef CHAR *PCHAR, *LPCH, *PCH;
-typedef const CHAR *LPCCH, *PCCH;
-
-typedef  CHAR *NPSTR, *LPSTR, *PSTR;
-typedef  PSTR *PZPSTR;
-typedef  const PSTR *PCZPSTR;
-typedef  const CHAR *LPCSTR, *PCSTR;
-typedef  PCSTR *PZPCSTR;
-
-
-
-
-
-
-
-typedef WCHAR TCHAR, *PTCHAR;
-typedef WCHAR TBYTE , *PTBYTE ;
-
-
-
-typedef LPWSTR LPTCH, PTCH;
-typedef LPWSTR PTSTR, LPTSTR;
-typedef LPCWSTR PCTSTR, LPCTSTR;
-typedef LPUWSTR PUTSTR, LPUTSTR;
-typedef LPCUWSTR PCUTSTR, LPCUTSTR;
-typedef LPWSTR LP;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef SHORT *PSHORT;  
-typedef LONG *PLONG;    
-
-
-typedef void *HANDLE;
-
-
-
-
-
-typedef HANDLE *PHANDLE;
-
-
-
-
-
-typedef BYTE   FCHAR;
-typedef WORD   FSHORT;
-typedef DWORD  FLONG;
-
-
-
-
-
-typedef LONG HRESULT;
-
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef char CCHAR;          
-typedef DWORD LCID;         
-typedef PDWORD PLCID;       
-typedef WORD   LANGID;      
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _FLOAT128 {
-    __int64 LowPart;
-    __int64 HighPart;
-} FLOAT128;
-
-typedef FLOAT128 *PFLOAT128;
-
-
-
-
-
-
-
-
-
-typedef __int64 LONGLONG;
-typedef unsigned __int64 ULONGLONG;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef LONGLONG *PLONGLONG;
-typedef ULONGLONG *PULONGLONG;
-
-
-
-typedef LONGLONG USN;
-
-
-
-
-typedef union _LARGE_INTEGER {
-    struct {
-        DWORD LowPart;
-        LONG HighPart;
-    };
-    struct {
-        DWORD LowPart;
-        LONG HighPart;
-    } u;
-
-    LONGLONG QuadPart;
-} LARGE_INTEGER;
-
-typedef LARGE_INTEGER *PLARGE_INTEGER;
-
-
-
-
-typedef union _ULARGE_INTEGER {
-    struct {
-        DWORD LowPart;
-        DWORD HighPart;
-    };
-    struct {
-        DWORD LowPart;
-        DWORD HighPart;
-    } u;
-
-    ULONGLONG QuadPart;
-} ULARGE_INTEGER;
-
-typedef ULARGE_INTEGER *PULARGE_INTEGER;
-
-
-
-
-
-
-
-
-typedef struct _LUID {
-    DWORD LowPart;
-    LONG HighPart;
-} LUID, *PLUID;
-
-
-typedef ULONGLONG  DWORDLONG;
-typedef DWORDLONG *PDWORDLONG;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-ULONGLONG
-__stdcall
-Int64ShllMod32 (
-    ULONGLONG Value,
-    DWORD ShiftCount
-    );
-
-LONGLONG
-__stdcall
-Int64ShraMod32 (
-    LONGLONG Value,
-    DWORD ShiftCount
-    );
-
-ULONGLONG
-__stdcall
-Int64ShrlMod32 (
-    ULONGLONG Value,
-    DWORD ShiftCount
-    );
-
-
-#pragma warning(push)
-
-#pragma warning(disable:4035 4793)               
-
-__inline ULONGLONG
-__stdcall
-Int64ShllMod32 (
-    ULONGLONG Value,
-    DWORD ShiftCount
-    )
-{
-    __asm    {
-        mov     ecx, ShiftCount
-        mov     eax, dword ptr [Value]
-        mov     edx, dword ptr [Value+4]
-        shld    edx, eax, cl
-        shl     eax, cl
-    }
-}
-
-__inline LONGLONG
-__stdcall
-Int64ShraMod32 (
-    LONGLONG Value,
-    DWORD ShiftCount
-    )
-{
-    __asm {
-        mov     ecx, ShiftCount
-        mov     eax, dword ptr [Value]
-        mov     edx, dword ptr [Value+4]
-        shrd    eax, edx, cl
-        sar     edx, cl
-    }
-}
-
-__inline ULONGLONG
-__stdcall
-Int64ShrlMod32 (
-    ULONGLONG Value,
-    DWORD ShiftCount
-    )
-{
-    __asm    {
-        mov     ecx, ShiftCount
-        mov     eax, dword ptr [Value]
-        mov     edx, dword ptr [Value+4]
-        shrd    eax, edx, cl
-        shr     edx, cl
-    }
-}
-
-
-#pragma warning(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-unsigned int
-__cdecl
-_rotl (
-     unsigned int Value,
-     int Shift
-    );
-
-unsigned __int64
-__cdecl
-_rotl64 (
-     unsigned __int64 Value,
-     int Shift
-    );
-
-unsigned int
-__cdecl
-_rotr (
-     unsigned int Value,
-     int Shift
-    );
-
-unsigned __int64
-__cdecl
-_rotr64 (
-     unsigned __int64 Value,
-     int Shift
-    );
-
-#pragma intrinsic(_rotl)
-#pragma intrinsic(_rotl64)
-#pragma intrinsic(_rotr)
-#pragma intrinsic(_rotr64)
-
-
-
-
-}
-
-
-
-
-
-
-typedef BYTE  BOOLEAN;           
-typedef BOOLEAN *PBOOLEAN;       
-
-
-
-
-
-typedef struct _LIST_ENTRY {
-   struct _LIST_ENTRY *Flink;
-   struct _LIST_ENTRY *Blink;
-} LIST_ENTRY, *PLIST_ENTRY, * PRLIST_ENTRY;
-
-
-
-
-
-
-typedef struct _SINGLE_LIST_ENTRY {
-    struct _SINGLE_LIST_ENTRY *Next;
-} SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY;
-
-
-
-
-
-typedef struct LIST_ENTRY32 {
-    DWORD Flink;
-    DWORD Blink;
-} LIST_ENTRY32;
-typedef LIST_ENTRY32 *PLIST_ENTRY32;
-
-typedef struct LIST_ENTRY64 {
-    ULONGLONG Flink;
-    ULONGLONG Blink;
-} LIST_ENTRY64;
-typedef LIST_ENTRY64 *PLIST_ENTRY64;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _GUID {
-    unsigned long  Data1;
-    unsigned short Data2;
-    unsigned short Data3;
-    unsigned char  Data4[ 8 ];
-} GUID;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef GUID *LPGUID;
-
-
-
-
-typedef const GUID *LPCGUID;
-
-
-
-
-
-typedef GUID IID;
-typedef IID *LPIID;
-
-
-typedef GUID CLSID;
-typedef CLSID *LPCLSID;
-
-
-typedef GUID FMTID;
-typedef FMTID *LPFMTID;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) void *  __cdecl _memccpy(        void * _Dst,      const void * _Src,      int _Val,      size_t _MaxCount);
-__declspec(dllimport)  const void *  __cdecl memchr(          const void * _Buf ,      int _Val,      size_t _MaxCount);
-__declspec(dllimport)  int     __cdecl _memicmp(         const void * _Buf1,          const void * _Buf2,      size_t _Size);
-__declspec(dllimport)  int     __cdecl _memicmp_l(         const void * _Buf1,          const void * _Buf2,      size_t _Size,        _locale_t _Locale);
-         int     __cdecl memcmp(         const void * _Buf1,          const void * _Buf2,      size_t _Size);
-         void *  __cdecl memcpy(         void * _Dst,          const void * _Src,      size_t _Size);
-
-__declspec(dllimport) errno_t  __cdecl memcpy_s(         void * _Dst,      rsize_t _DstSize,          const void * _Src,      rsize_t _MaxCount);
-
-        void *  __cdecl memset(         void * _Dst,      int _Val,      size_t _Size);
-
-
-
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_memccpy" ". See online help for details.")) __declspec(dllimport) void * __cdecl memccpy(       void * _Dst,          const void * _Src,      int _Val,      size_t _Size);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_memicmp" ". See online help for details.")) __declspec(dllimport)  int __cdecl memicmp(         const void * _Buf1,          const void * _Buf2,      size_t _Size);
-
-
-
-
-__declspec(dllimport)  errno_t __cdecl _strset_s(           char * _Dst,      size_t _DstSize,      int _Value);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _strset_s(           char (&_Dest)[_Size],      int _Value) { return _strset_s(_Dest, _Size, _Value); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_strset_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))  char * __cdecl _strset( char *_Dest,  int _Value);
-
-__declspec(dllimport)  errno_t __cdecl strcpy_s(       char * _Dst,      rsize_t _DstSize,        const char * _Src);
-
-extern "C++" { template <size_t _Size> inline errno_t __cdecl strcpy_s(       char (&_Dest)[_Size],        const char * _Source) { return strcpy_s(_Dest, _Size, _Source); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "strcpy_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))  char * __cdecl strcpy( char *_Dest,  const char * _Source);
-
-__declspec(dllimport)  errno_t __cdecl strcat_s(           char * _Dst,      rsize_t _DstSize,        const char * _Src);
-
-extern "C++" { template <size_t _Size> inline errno_t __cdecl strcat_s(           char (&_Dest)[_Size],        const char * _Source) { return strcat_s(_Dest, _Size, _Source); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "strcat_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))  char * __cdecl strcat( char *_Dest,  const char * _Source);
-         int     __cdecl strcmp(       const char * _Str1,        const char * _Str2);
-         size_t  __cdecl strlen(       const char * _Str);
-__declspec(dllimport)  size_t  __cdecl strnlen(       const char * _Str,      size_t _MaxCount);
-
-static __inline  size_t  __cdecl strnlen_s(        const char * _Str,      size_t _MaxCount)
-{
-    return strnlen(_Str, _MaxCount);
-}
-
-
-__declspec(dllimport)  errno_t __cdecl memmove_s(         void * _Dst,      rsize_t _DstSize,          const void * _Src,      rsize_t _MaxCount);
-
-
-
-
-
-__declspec(dllimport)  void *  __cdecl memmove(         void * _Dst,          const void * _Src,      size_t _Size);
-
-
-
-
-
-
-
-__declspec(dllimport)  char *  __cdecl _strdup(         const char * _Src);
-
-
-
-
-
-__declspec(dllimport)  const char *  __cdecl strchr(       const char * _Str,      int _Val);
-__declspec(dllimport)  int     __cdecl _stricmp(        const char * _Str1,         const char * _Str2);
-__declspec(dllimport)  int     __cdecl _strcmpi(        const char * _Str1,         const char * _Str2);
-__declspec(dllimport)  int     __cdecl _stricmp_l(        const char * _Str1,         const char * _Str2,        _locale_t _Locale);
-__declspec(dllimport)  int     __cdecl strcoll(        const char * _Str1,         const  char * _Str2);
-__declspec(dllimport)  int     __cdecl _strcoll_l(        const char * _Str1,         const char * _Str2,        _locale_t _Locale);
-__declspec(dllimport)  int     __cdecl _stricoll(        const char * _Str1,         const char * _Str2);
-__declspec(dllimport)  int     __cdecl _stricoll_l(        const char * _Str1,         const char * _Str2,        _locale_t _Locale);
-__declspec(dllimport)  int     __cdecl _strncoll  (       const char * _Str1,        const char * _Str2,      size_t _MaxCount);
-__declspec(dllimport)  int     __cdecl _strncoll_l(       const char * _Str1,        const char * _Str2,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport)  int     __cdecl _strnicoll (       const char * _Str1,        const char * _Str2,      size_t _MaxCount);
-__declspec(dllimport)  int     __cdecl _strnicoll_l(       const char * _Str1,        const char * _Str2,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport)  size_t  __cdecl strcspn(        const char * _Str,         const char * _Control);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_strerror_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  char *  __cdecl _strerror(         const char * _ErrMsg);
-__declspec(dllimport)  errno_t __cdecl _strerror_s(       char * _Buf,      size_t _SizeInBytes,          const char * _ErrMsg);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _strerror_s(     char (&_Buffer)[_Size],          const char * _ErrorMessage) { return _strerror_s(_Buffer, _Size, _ErrorMessage); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "strerror_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  char *  __cdecl strerror(     int);
-
-__declspec(dllimport)  errno_t __cdecl strerror_s(       char * _Buf,      size_t _SizeInBytes,      int _ErrNum);
-
-extern "C++" { template <size_t _Size> inline errno_t __cdecl strerror_s(     char (&_Buffer)[_Size],      int _ErrorMessage) { return strerror_s(_Buffer, _Size, _ErrorMessage); } }
-__declspec(dllimport)  errno_t __cdecl _strlwr_s(           char * _Str,      size_t _Size);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _strlwr_s(           char (&_String)[_Size]) { return _strlwr_s(_String, _Size); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_strlwr_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl _strlwr( char *_String);
-__declspec(dllimport)  errno_t __cdecl _strlwr_s_l(           char * _Str,      size_t _Size,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _strlwr_s_l(           char (&_String)[_Size],        _locale_t _Locale) { return _strlwr_s_l(_String, _Size, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_strlwr_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl _strlwr_l(         char *_String,        _locale_t _Locale);
-
-__declspec(dllimport)  errno_t __cdecl strncat_s(           char * _Dst,      rsize_t _DstSize,        const char * _Src,      rsize_t _MaxCount);
-
-extern "C++" { template <size_t _Size> inline errno_t __cdecl strncat_s(           char (&_Dest)[_Size],        const char * _Source,      size_t _Count) { return strncat_s(_Dest, _Size, _Source, _Count); } }
-#pragma warning(push)
-#pragma warning(disable:6059)
-
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "strncat_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl strncat(           char *_Dest,        const char * _Source,      size_t _Count);
-#pragma warning(pop)
-
-
-
-__declspec(dllimport)  int     __cdecl strncmp(       const char * _Str1,        const char * _Str2,      size_t _MaxCount);
-
-__declspec(dllimport)  int     __cdecl _strnicmp(       const char * _Str1,        const char * _Str2,      size_t _MaxCount);
-__declspec(dllimport)  int     __cdecl _strnicmp_l(       const char * _Str1,        const char * _Str2,      size_t _MaxCount,        _locale_t _Locale);
-
-__declspec(dllimport)  errno_t __cdecl strncpy_s(       char * _Dst,      rsize_t _DstSize,          const char * _Src,      rsize_t _MaxCount);
-
-extern "C++" { template <size_t _Size> inline errno_t __cdecl strncpy_s(     char (&_Dest)[_Size],        const char * _Source,      size_t _Count) { return strncpy_s(_Dest, _Size, _Source, _Count); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "strncpy_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl strncpy(     char *_Dest,        const char * _Source,      size_t _Count);
-__declspec(dllimport)  errno_t __cdecl _strnset_s(           char * _Str,      size_t _Size,      int _Val,      size_t _MaxCount);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _strnset_s(           char (&_Dest)[_Size],      int _Val,      size_t _Count) { return _strnset_s(_Dest, _Size, _Val, _Count); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_strnset_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl _strnset(           char *_Dest,      int _Val,      size_t _Count);
-__declspec(dllimport)  const char *  __cdecl strpbrk(       const char * _Str,        const char * _Control);
-__declspec(dllimport)  const char *  __cdecl strrchr(       const char * _Str,      int _Ch);
-__declspec(dllimport) char *  __cdecl _strrev(         char * _Str);
-__declspec(dllimport)  size_t  __cdecl strspn(       const char * _Str,        const char * _Control);
-__declspec(dllimport)  const char *  __cdecl strstr(       const char * _Str,        const char * _SubStr);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "strtok_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  char *  __cdecl strtok(           char * _Str,        const char * _Delim);
-
-__declspec(dllimport)  char *  __cdecl strtok_s(           char * _Str,        const char * _Delim,                        char ** _Context);
-
-__declspec(dllimport)  errno_t __cdecl _strupr_s(           char * _Str,      size_t _Size);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _strupr_s(           char (&_String)[_Size]) { return _strupr_s(_String, _Size); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_strupr_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl _strupr( char *_String);
-__declspec(dllimport)  errno_t __cdecl _strupr_s_l(           char * _Str,      size_t _Size, _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _strupr_s_l(           char (&_String)[_Size], _locale_t _Locale) { return _strupr_s_l(_String, _Size, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_strupr_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl _strupr_l(         char *_String,        _locale_t _Locale);
-__declspec(dllimport)  size_t  __cdecl strxfrm (         char * _Dst,        const char * _Src,      size_t _MaxCount);
-__declspec(dllimport)  size_t  __cdecl _strxfrm_l(         char * _Dst,        const char * _Src,      size_t _MaxCount,        _locale_t _Locale);
-
-
-extern "C++" {
-
-
-inline  char * __cdecl strchr(       char * _Str,      int _Ch)
-	{ return (char*)strchr((const char*)_Str, _Ch); }
-inline  char * __cdecl strpbrk(       char * _Str,        const char * _Control)
-	{ return (char*)strpbrk((const char*)_Str, _Control); }
-inline  char * __cdecl strrchr(       char * _Str,      int _Ch)
-	{ return (char*)strrchr((const char*)_Str, _Ch); }
-inline  char * __cdecl strstr(       char * _Str,        const char * _SubStr)
-	{ return (char*)strstr((const char*)_Str, _SubStr); }
-
-
-
-inline  void * __cdecl memchr(         void * _Pv,      int _C,      size_t _N)
-	{ return (void*)memchr((const void*)_Pv, _C, _N); }
-
-}
-
-
-
-
-
-
-
-
-
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_strdup" ". See online help for details.")) __declspec(dllimport)  char * __cdecl strdup(         const char * _Src);
-
-
-
-
-
-
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_strcmpi" ". See online help for details.")) __declspec(dllimport)  int __cdecl strcmpi(       const char * _Str1,        const char * _Str2);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_stricmp" ". See online help for details.")) __declspec(dllimport)  int __cdecl stricmp(       const char * _Str1,        const char * _Str2);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_strlwr" ". See online help for details.")) __declspec(dllimport) char * __cdecl strlwr(         char * _Str);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_strnicmp" ". See online help for details.")) __declspec(dllimport)  int __cdecl strnicmp(       const char * _Str1,        const char * _Str,      size_t _MaxCount);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_strnset" ". See online help for details.")) __declspec(dllimport) char * __cdecl strnset(           char * _Str,      int _Val,      size_t _MaxCount);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_strrev" ". See online help for details.")) __declspec(dllimport) char * __cdecl strrev(         char * _Str);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_strset" ". See online help for details."))         char * __cdecl strset(         char * _Str,      int _Val);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_strupr" ". See online help for details.")) __declspec(dllimport) char * __cdecl strupr(         char * _Str);
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)  wchar_t * __cdecl _wcsdup(       const wchar_t * _Str);
-
-
-
-
-
-
-__declspec(dllimport)  errno_t __cdecl wcscat_s(           wchar_t * _Dst,      rsize_t _DstSize, const wchar_t * _Src);
-
-extern "C++" { template <size_t _Size> inline errno_t __cdecl wcscat_s(           wchar_t (&_Dest)[_Size],        const wchar_t * _Source) { return wcscat_s(_Dest, _Size, _Source); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "wcscat_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl wcscat( wchar_t *_Dest,  const wchar_t * _Source);
-__declspec(dllimport)  const wchar_t * __cdecl wcschr(       const wchar_t * _Str, wchar_t _Ch);
-__declspec(dllimport)  int __cdecl wcscmp(       const wchar_t * _Str1,        const wchar_t * _Str2);
-
-__declspec(dllimport)  errno_t __cdecl wcscpy_s(       wchar_t * _Dst,      rsize_t _DstSize,        const wchar_t * _Src);
-
-extern "C++" { template <size_t _Size> inline errno_t __cdecl wcscpy_s(     wchar_t (&_Dest)[_Size],        const wchar_t * _Source) { return wcscpy_s(_Dest, _Size, _Source); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "wcscpy_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl wcscpy( wchar_t *_Dest,  const wchar_t * _Source);
-__declspec(dllimport)  size_t __cdecl wcscspn(       const wchar_t * _Str,        const wchar_t * _Control);
-__declspec(dllimport)  size_t __cdecl wcslen(       const wchar_t * _Str);
-__declspec(dllimport)  size_t __cdecl wcsnlen(       const wchar_t * _Src,      size_t _MaxCount);
-
-static __inline  size_t __cdecl wcsnlen_s(       const wchar_t * _Src,      size_t _MaxCount)
-{
-    return wcsnlen(_Src, _MaxCount);
-}
-
-
-__declspec(dllimport)  errno_t __cdecl wcsncat_s(           wchar_t * _Dst,      rsize_t _DstSize,        const wchar_t * _Src,      rsize_t _MaxCount);
-
-extern "C++" { template <size_t _Size> inline errno_t __cdecl wcsncat_s(           wchar_t (&_Dest)[_Size],        const wchar_t * _Source,      size_t _Count) { return wcsncat_s(_Dest, _Size, _Source, _Count); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "wcsncat_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl wcsncat(     wchar_t *_Dest,        const wchar_t * _Source,      size_t _Count);
-__declspec(dllimport)  int __cdecl wcsncmp(       const wchar_t * _Str1,        const wchar_t * _Str2,      size_t _MaxCount);
-
-__declspec(dllimport)  errno_t __cdecl wcsncpy_s(       wchar_t * _Dst,      rsize_t _DstSize,        const wchar_t * _Src,      rsize_t _MaxCount);
-
-extern "C++" { template <size_t _Size> inline errno_t __cdecl wcsncpy_s(     wchar_t (&_Dest)[_Size],        const wchar_t * _Source,      size_t _Count) { return wcsncpy_s(_Dest, _Size, _Source, _Count); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "wcsncpy_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl wcsncpy(     wchar_t *_Dest,        const wchar_t * _Source,      size_t _Count);
-__declspec(dllimport)  const wchar_t * __cdecl wcspbrk(       const wchar_t * _Str,        const wchar_t * _Control);
-__declspec(dllimport)  const wchar_t * __cdecl wcsrchr(       const wchar_t * _Str,      wchar_t _Ch);
-__declspec(dllimport)  size_t __cdecl wcsspn(       const wchar_t * _Str,        const wchar_t * _Control);
-__declspec(dllimport)  const wchar_t * __cdecl wcsstr(       const wchar_t * _Str,        const wchar_t * _SubStr);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "wcstok_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  wchar_t * __cdecl wcstok(           wchar_t * _Str,        const wchar_t * _Delim);
-__declspec(dllimport)  wchar_t * __cdecl wcstok_s(           wchar_t * _Str,        const wchar_t * _Delim,                        wchar_t ** _Context);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcserror_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  wchar_t * __cdecl _wcserror(     int _ErrNum);
-__declspec(dllimport)  errno_t __cdecl _wcserror_s(         wchar_t * _Buf,      size_t _SizeInWords,      int _ErrNum);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcserror_s(     wchar_t (&_Buffer)[_Size],      int _Error) { return _wcserror_s(_Buffer, _Size, _Error); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "__wcserror_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  wchar_t * __cdecl __wcserror(         const wchar_t * _Str);
-__declspec(dllimport)  errno_t __cdecl __wcserror_s(         wchar_t * _Buffer,      size_t _SizeInWords,        const wchar_t * _ErrMsg);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl __wcserror_s(     wchar_t (&_Buffer)[_Size],        const wchar_t * _ErrorMessage) { return __wcserror_s(_Buffer, _Size, _ErrorMessage); } }
-
-__declspec(dllimport)  int __cdecl _wcsicmp(       const wchar_t * _Str1,        const wchar_t * _Str2);
-__declspec(dllimport)  int __cdecl _wcsicmp_l(       const wchar_t * _Str1,        const wchar_t * _Str2,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _wcsnicmp(       const wchar_t * _Str1,        const wchar_t * _Str2,      size_t _MaxCount);
-__declspec(dllimport)  int __cdecl _wcsnicmp_l(       const wchar_t * _Str1,        const wchar_t * _Str2,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport)  errno_t __cdecl _wcsnset_s(           wchar_t * _Dst,      size_t _DstSizeInWords, wchar_t _Val,      size_t _MaxCount);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcsnset_s(           wchar_t (&_Dst)[_Size], wchar_t _Val,      size_t _MaxCount) { return _wcsnset_s(_Dst, _Size, _Val, _MaxCount); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcsnset_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wcsnset(           wchar_t *_Str, wchar_t _Val,      size_t _MaxCount);
-__declspec(dllimport) wchar_t * __cdecl _wcsrev(         wchar_t * _Str);
-__declspec(dllimport)  errno_t __cdecl _wcsset_s(           wchar_t * _Str,      size_t _SizeInWords, wchar_t _Val);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcsset_s(           wchar_t (&_Str)[_Size], wchar_t _Val) { return _wcsset_s(_Str, _Size, _Val); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcsset_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wcsset(         wchar_t *_Str, wchar_t _Val);
-
-__declspec(dllimport)  errno_t __cdecl _wcslwr_s(           wchar_t * _Str,      size_t _SizeInWords);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcslwr_s(           wchar_t (&_String)[_Size]) { return _wcslwr_s(_String, _Size); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcslwr_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wcslwr( wchar_t *_String);
-__declspec(dllimport)  errno_t __cdecl _wcslwr_s_l(           wchar_t * _Str,      size_t _SizeInWords,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcslwr_s_l(           wchar_t (&_String)[_Size],        _locale_t _Locale) { return _wcslwr_s_l(_String, _Size, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcslwr_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wcslwr_l(         wchar_t *_String,        _locale_t _Locale);
-__declspec(dllimport)  errno_t __cdecl _wcsupr_s(           wchar_t * _Str,      size_t _Size);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcsupr_s(           wchar_t (&_String)[_Size]) { return _wcsupr_s(_String, _Size); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcsupr_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wcsupr( wchar_t *_String);
-__declspec(dllimport)  errno_t __cdecl _wcsupr_s_l(           wchar_t * _Str,      size_t _Size,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcsupr_s_l(           wchar_t (&_String)[_Size],        _locale_t _Locale) { return _wcsupr_s_l(_String, _Size, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcsupr_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wcsupr_l(         wchar_t *_String,        _locale_t _Locale);
-__declspec(dllimport)  size_t __cdecl wcsxfrm(         wchar_t * _Dst,        const wchar_t * _Src,      size_t _MaxCount);
-__declspec(dllimport)  size_t __cdecl _wcsxfrm_l(         wchar_t * _Dst,        const wchar_t *_Src,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl wcscoll(       const wchar_t * _Str1,        const wchar_t * _Str2);
-__declspec(dllimport)  int __cdecl _wcscoll_l(       const wchar_t * _Str1,        const wchar_t * _Str2,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _wcsicoll(       const wchar_t * _Str1,        const wchar_t * _Str2);
-__declspec(dllimport)  int __cdecl _wcsicoll_l(       const wchar_t * _Str1,        const wchar_t *_Str2,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _wcsncoll(       const wchar_t * _Str1,        const wchar_t * _Str2,      size_t _MaxCount);
-__declspec(dllimport)  int __cdecl _wcsncoll_l(       const wchar_t * _Str1,        const wchar_t * _Str2,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _wcsnicoll(       const wchar_t * _Str1,        const wchar_t * _Str2,      size_t _MaxCount);
-__declspec(dllimport)  int __cdecl _wcsnicoll_l(       const wchar_t * _Str1,        const wchar_t * _Str2,      size_t _MaxCount,        _locale_t _Locale);
-
-
-
-
-extern "C++" {
-inline  wchar_t * __cdecl wcschr(       wchar_t *_Str, wchar_t _Ch)
-        {return ((wchar_t *)wcschr((const wchar_t *)_Str, _Ch)); }
-inline  wchar_t * __cdecl wcspbrk(       wchar_t *_Str,        const wchar_t *_Control)
-        {return ((wchar_t *)wcspbrk((const wchar_t *)_Str, _Control)); }
-inline  wchar_t * __cdecl wcsrchr(       wchar_t *_Str,      wchar_t _Ch)
-        {return ((wchar_t *)wcsrchr((const wchar_t *)_Str, _Ch)); }
-inline  wchar_t * __cdecl wcsstr(       wchar_t *_Str,        const wchar_t *_SubStr)
-        {return ((wchar_t *)wcsstr((const wchar_t *)_Str, _SubStr)); }
-}
-
-
-
-
-
-
-
-
-
-
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcsdup" ". See online help for details.")) __declspec(dllimport)  wchar_t * __cdecl wcsdup(       const wchar_t * _Str);
-
-
-
-
-
-
-
-
-
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcsicmp" ". See online help for details.")) __declspec(dllimport)  int __cdecl wcsicmp(       const wchar_t * _Str1,        const wchar_t * _Str2);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcsnicmp" ". See online help for details.")) __declspec(dllimport)  int __cdecl wcsnicmp(       const wchar_t * _Str1,        const wchar_t * _Str2,      size_t _MaxCount);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcsnset" ". See online help for details.")) __declspec(dllimport) wchar_t * __cdecl wcsnset(           wchar_t * _Str,        wchar_t _Val,      size_t _MaxCount);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcsrev" ". See online help for details.")) __declspec(dllimport) wchar_t * __cdecl wcsrev(         wchar_t * _Str);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcsset" ". See online help for details.")) __declspec(dllimport) wchar_t * __cdecl wcsset(         wchar_t * _Str, wchar_t _Val);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcslwr" ". See online help for details.")) __declspec(dllimport) wchar_t * __cdecl wcslwr(         wchar_t * _Str);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcsupr" ". See online help for details.")) __declspec(dllimport) wchar_t * __cdecl wcsupr(         wchar_t * _Str);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcsicoll" ". See online help for details.")) __declspec(dllimport)  int __cdecl wcsicoll(       const wchar_t * _Str1,        const wchar_t * _Str2);
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-__inline int InlineIsEqualGUID(const GUID & rguid1, const GUID & rguid2)
-{
-   return (
-      ((unsigned long *) &rguid1)[0] == ((unsigned long *) &rguid2)[0] &&
-      ((unsigned long *) &rguid1)[1] == ((unsigned long *) &rguid2)[1] &&
-      ((unsigned long *) &rguid1)[2] == ((unsigned long *) &rguid2)[2] &&
-      ((unsigned long *) &rguid1)[3] == ((unsigned long *) &rguid2)[3]);
-}
-
-__inline int IsEqualGUID(const GUID & rguid1, const GUID & rguid2)
-{
-    return !memcmp(&rguid1, &rguid2, sizeof(GUID));
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__inline int operator==(const GUID & guidOne, const GUID & guidOther)
-{
-    return IsEqualGUID(guidOne,guidOther);
-}
-
-__inline int operator!=(const GUID & guidOne, const GUID & guidOther)
-{
-    return !(guidOne == guidOther);
-}
-
-
-
-
-
-
-
-
-
-
-typedef struct  _OBJECTID {     
-    GUID Lineage;
-    DWORD Uniquifier;
-} OBJECTID;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C++" 
-template <typename T, size_t N>
-char (*RtlpNumberOf(  T (&)[N] ))[N];
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  
-
-
-
-
-
-typedef ULONG_PTR KSPIN_LOCK;
-typedef KSPIN_LOCK *PKSPIN_LOCK;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(push)
-
-#pragma warning(disable:4164)   
-                                
-
-#pragma function(_enable)
-#pragma function(_disable)
-
-
-
-#pragma warning(pop)
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-BOOLEAN
-_bittest (
-     LONG const *Base,
-     LONG Offset
-    );
-
-BOOLEAN
-_bittestandcomplement (
-     LONG *Base,
-     LONG Offset
-    );
-
-BOOLEAN
-_bittestandset (
-     LONG *Base,
-     LONG Offset
-    );
-
-BOOLEAN
-_bittestandreset (
-     LONG *Base,
-     LONG Offset
-    );
-
-BOOLEAN
-_interlockedbittestandset (
-     LONG *Base,
-     LONG Offset
-    );
-
-BOOLEAN
-_interlockedbittestandreset (
-     LONG *Base,
-     LONG Offset
-    );
-
-#pragma intrinsic(_bittest)
-#pragma intrinsic(_bittestandcomplement)
-#pragma intrinsic(_bittestandset)
-#pragma intrinsic(_bittestandreset)
-#pragma intrinsic(_interlockedbittestandset)
-#pragma intrinsic(_interlockedbittestandreset)
-
-
-
-
-
-
-
-
-BOOLEAN
-_BitScanForward (
-     DWORD *Index,
-     DWORD Mask
-    );
-
-BOOLEAN
-_BitScanReverse (
-     DWORD *Index,
-     DWORD Mask
-    );
-
-#pragma intrinsic(_BitScanForward)
-#pragma intrinsic(_BitScanReverse)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(push)
-#pragma warning(disable:4035 4793)
-
-BOOLEAN
-__forceinline
-InterlockedBitTestAndComplement (
-     LONG *Base,
-     LONG Bit
-    )
-{
-    __asm {
-           mov eax, Bit
-           mov ecx, Base
-           lock btc [ecx], eax
-           setc al
-    };
-}
-#pragma warning(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-BYTE 
-__readfsbyte (
-     DWORD Offset
-    );
- 
-WORD  
-__readfsword (
-     DWORD Offset
-    );
- 
-DWORD
-__readfsdword (
-     DWORD Offset
-    );
- 
-void
-__writefsbyte (
-     DWORD Offset,
-     BYTE  Data
-    );
- 
-void
-__writefsword (
-     DWORD Offset,
-     WORD   Data
-    );
- 
-void
-__writefsdword (
-     DWORD Offset,
-     DWORD Data
-    );
-
-#pragma intrinsic(__readfsbyte)
-#pragma intrinsic(__readfsword)
-#pragma intrinsic(__readfsdword)
-#pragma intrinsic(__writefsbyte)
-#pragma intrinsic(__writefsword)
-#pragma intrinsic(__writefsdword)
-
-
-
-
-}
-
-
-
-
-
-
-
-#pragma warning( push )
-#pragma warning( disable : 4793 )
-__forceinline
-void
-MemoryBarrier (
-    void
-    )
-{
-    LONG Barrier;
-    __asm {
-        xchg Barrier, eax
-    }
-}
-#pragma warning( pop )
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-void
-__int2c (
-    void
-    );
-
-#pragma intrinsic(__int2c)
-
-
-
-
-
-
-
-
-
-
-
-
-__inline PVOID GetFiberData( void )    { return *(PVOID *) (ULONG_PTR) __readfsdword (0x10);}
-__inline PVOID GetCurrentFiber( void ) { return (PVOID) (ULONG_PTR) __readfsdword (0x10);}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _FLOATING_SAVE_AREA {
-    DWORD   ControlWord;
-    DWORD   StatusWord;
-    DWORD   TagWord;
-    DWORD   ErrorOffset;
-    DWORD   ErrorSelector;
-    DWORD   DataOffset;
-    DWORD   DataSelector;
-    BYTE    RegisterArea[80];
-    DWORD   Cr0NpxState;
-} FLOATING_SAVE_AREA;
-
-typedef FLOATING_SAVE_AREA *PFLOATING_SAVE_AREA;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CONTEXT {
-
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-
-    DWORD ContextFlags;
-
-    
-    
-    
-    
-    
-
-    DWORD   Dr0;
-    DWORD   Dr1;
-    DWORD   Dr2;
-    DWORD   Dr3;
-    DWORD   Dr6;
-    DWORD   Dr7;
-
-    
-    
-    
-    
-
-    FLOATING_SAVE_AREA FloatSave;
-
-    
-    
-    
-    
-
-    DWORD   SegGs;
-    DWORD   SegFs;
-    DWORD   SegEs;
-    DWORD   SegDs;
-
-    
-    
-    
-    
-
-    DWORD   Edi;
-    DWORD   Esi;
-    DWORD   Ebx;
-    DWORD   Edx;
-    DWORD   Ecx;
-    DWORD   Eax;
-
-    
-    
-    
-    
-
-    DWORD   Ebp;
-    DWORD   Eip;
-    DWORD   SegCs;              
-    DWORD   EFlags;             
-    DWORD   Esp;
-    DWORD   SegSs;
-
-    
-    
-    
-    
-    
-
-    BYTE    ExtendedRegisters[512];
-
-} CONTEXT;
-
-
-
-typedef CONTEXT *PCONTEXT;
-
-
-
-
-
-
-
-
-
-typedef struct _LDT_ENTRY {
-    WORD    LimitLow;
-    WORD    BaseLow;
-    union {
-        struct {
-            BYTE    BaseMid;
-            BYTE    Flags1;     
-            BYTE    Flags2;     
-            BYTE    BaseHi;
-        } Bytes;
-        struct {
-            DWORD   BaseMid : 8;
-            DWORD   Type : 5;
-            DWORD   Dpl : 2;
-            DWORD   Pres : 1;
-            DWORD   LimitHi : 4;
-            DWORD   Sys : 1;
-            DWORD   Reserved_0 : 1;
-            DWORD   Default_Big : 1;
-            DWORD   Granularity : 1;
-            DWORD   BaseHi : 8;
-        } Bits;
-    } HighWord;
-} LDT_ENTRY, *PLDT_ENTRY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _EXCEPTION_RECORD {
-    DWORD    ExceptionCode;
-    DWORD ExceptionFlags;
-    struct _EXCEPTION_RECORD *ExceptionRecord;
-    PVOID ExceptionAddress;
-    DWORD NumberParameters;
-    ULONG_PTR ExceptionInformation[15];
-    } EXCEPTION_RECORD;
-
-typedef EXCEPTION_RECORD *PEXCEPTION_RECORD;
-
-typedef struct _EXCEPTION_RECORD32 {
-    DWORD    ExceptionCode;
-    DWORD ExceptionFlags;
-    DWORD ExceptionRecord;
-    DWORD ExceptionAddress;
-    DWORD NumberParameters;
-    DWORD ExceptionInformation[15];
-} EXCEPTION_RECORD32, *PEXCEPTION_RECORD32;
-
-typedef struct _EXCEPTION_RECORD64 {
-    DWORD    ExceptionCode;
-    DWORD ExceptionFlags;
-    DWORD64 ExceptionRecord;
-    DWORD64 ExceptionAddress;
-    DWORD NumberParameters;
-    DWORD __unusedAlignment;
-    DWORD64 ExceptionInformation[15];
-} EXCEPTION_RECORD64, *PEXCEPTION_RECORD64;
-
-
-
-
-
-typedef struct _EXCEPTION_POINTERS {
-    PEXCEPTION_RECORD ExceptionRecord;
-    PCONTEXT ContextRecord;
-} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
-typedef PVOID PACCESS_TOKEN;            
-typedef PVOID PSECURITY_DESCRIPTOR;     
-typedef PVOID PSID;     
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef DWORD ACCESS_MASK;
-typedef ACCESS_MASK *PACCESS_MASK;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _GENERIC_MAPPING {
-    ACCESS_MASK GenericRead;
-    ACCESS_MASK GenericWrite;
-    ACCESS_MASK GenericExecute;
-    ACCESS_MASK GenericAll;
-} GENERIC_MAPPING;
-typedef GENERIC_MAPPING *PGENERIC_MAPPING;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,4)
-
-
-
-
-
-
-
-
-
-typedef struct _LUID_AND_ATTRIBUTES {
-    LUID Luid;
-    DWORD Attributes;
-    } LUID_AND_ATTRIBUTES, * PLUID_AND_ATTRIBUTES;
-typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[1];
-typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _SID_IDENTIFIER_AUTHORITY {
-    BYTE  Value[6];
-} SID_IDENTIFIER_AUTHORITY, *PSID_IDENTIFIER_AUTHORITY;
-
-
-
-
-
-typedef struct _SID {
-   BYTE  Revision;
-   BYTE  SubAuthorityCount;
-   SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
-
-
-
-   DWORD SubAuthority[1];
-
-} SID, *PISID;
-
-
-
-
-
-
-                                                
-
-
-
-
-
-
-typedef enum _SID_NAME_USE {
-    SidTypeUser = 1,
-    SidTypeGroup,
-    SidTypeDomain,
-    SidTypeAlias,
-    SidTypeWellKnownGroup,
-    SidTypeDeletedAccount,
-    SidTypeInvalid,
-    SidTypeUnknown,
-    SidTypeComputer
-} SID_NAME_USE, *PSID_NAME_USE;
-
-typedef struct _SID_AND_ATTRIBUTES {
-    PSID Sid;
-    DWORD Attributes;
-    } SID_AND_ATTRIBUTES, * PSID_AND_ATTRIBUTES;
-
-typedef SID_AND_ATTRIBUTES SID_AND_ATTRIBUTES_ARRAY[1];
-typedef SID_AND_ATTRIBUTES_ARRAY *PSID_AND_ATTRIBUTES_ARRAY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum {
-
-    WinNullSid                                  = 0,
-    WinWorldSid                                 = 1,
-    WinLocalSid                                 = 2,
-    WinCreatorOwnerSid                          = 3,
-    WinCreatorGroupSid                          = 4,
-    WinCreatorOwnerServerSid                    = 5,
-    WinCreatorGroupServerSid                    = 6,
-    WinNtAuthoritySid                           = 7,
-    WinDialupSid                                = 8,
-    WinNetworkSid                               = 9,
-    WinBatchSid                                 = 10,
-    WinInteractiveSid                           = 11,
-    WinServiceSid                               = 12,
-    WinAnonymousSid                             = 13,
-    WinProxySid                                 = 14,
-    WinEnterpriseControllersSid                 = 15,
-    WinSelfSid                                  = 16,
-    WinAuthenticatedUserSid                     = 17,
-    WinRestrictedCodeSid                        = 18,
-    WinTerminalServerSid                        = 19,
-    WinRemoteLogonIdSid                         = 20,
-    WinLogonIdsSid                              = 21,
-    WinLocalSystemSid                           = 22,
-    WinLocalServiceSid                          = 23,
-    WinNetworkServiceSid                        = 24,
-    WinBuiltinDomainSid                         = 25,
-    WinBuiltinAdministratorsSid                 = 26,
-    WinBuiltinUsersSid                          = 27,
-    WinBuiltinGuestsSid                         = 28,
-    WinBuiltinPowerUsersSid                     = 29,
-    WinBuiltinAccountOperatorsSid               = 30,
-    WinBuiltinSystemOperatorsSid                = 31,
-    WinBuiltinPrintOperatorsSid                 = 32,
-    WinBuiltinBackupOperatorsSid                = 33,
-    WinBuiltinReplicatorSid                     = 34,
-    WinBuiltinPreWindows2000CompatibleAccessSid = 35,
-    WinBuiltinRemoteDesktopUsersSid             = 36,
-    WinBuiltinNetworkConfigurationOperatorsSid  = 37,
-    WinAccountAdministratorSid                  = 38,
-    WinAccountGuestSid                          = 39,
-    WinAccountKrbtgtSid                         = 40,
-    WinAccountDomainAdminsSid                   = 41,
-    WinAccountDomainUsersSid                    = 42,
-    WinAccountDomainGuestsSid                   = 43,
-    WinAccountComputersSid                      = 44,
-    WinAccountControllersSid                    = 45,
-    WinAccountCertAdminsSid                     = 46,
-    WinAccountSchemaAdminsSid                   = 47,
-    WinAccountEnterpriseAdminsSid               = 48,
-    WinAccountPolicyAdminsSid                   = 49,
-    WinAccountRasAndIasServersSid               = 50,
-    WinNTLMAuthenticationSid                    = 51,
-    WinDigestAuthenticationSid                  = 52,
-    WinSChannelAuthenticationSid                = 53,
-    WinThisOrganizationSid                      = 54,
-    WinOtherOrganizationSid                     = 55,
-    WinBuiltinIncomingForestTrustBuildersSid    = 56,
-    WinBuiltinPerfMonitoringUsersSid            = 57,
-    WinBuiltinPerfLoggingUsersSid               = 58,
-    WinBuiltinAuthorizationAccessSid            = 59,
-    WinBuiltinTerminalServerLicenseServersSid   = 60,
-    WinBuiltinDCOMUsersSid                      = 61,
-
-} WELL_KNOWN_SID_TYPE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _ACL {
-    BYTE  AclRevision;
-    BYTE  Sbz1;
-    WORD   AclSize;
-    WORD   AceCount;
-    WORD   Sbz2;
-} ACL;
-typedef ACL *PACL;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _ACE_HEADER {
-    BYTE  AceType;
-    BYTE  AceFlags;
-    WORD   AceSize;
-} ACE_HEADER;
-typedef ACE_HEADER *PACE_HEADER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _ACCESS_ALLOWED_ACE {
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    DWORD SidStart;
-} ACCESS_ALLOWED_ACE;
-
-typedef ACCESS_ALLOWED_ACE *PACCESS_ALLOWED_ACE;
-
-typedef struct _ACCESS_DENIED_ACE {
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    DWORD SidStart;
-} ACCESS_DENIED_ACE;
-typedef ACCESS_DENIED_ACE *PACCESS_DENIED_ACE;
-
-typedef struct _SYSTEM_AUDIT_ACE {
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    DWORD SidStart;
-} SYSTEM_AUDIT_ACE;
-typedef SYSTEM_AUDIT_ACE *PSYSTEM_AUDIT_ACE;
-
-typedef struct _SYSTEM_ALARM_ACE {
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    DWORD SidStart;
-} SYSTEM_ALARM_ACE;
-typedef SYSTEM_ALARM_ACE *PSYSTEM_ALARM_ACE;
-
-
-
-
-typedef struct _ACCESS_ALLOWED_OBJECT_ACE {
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    DWORD Flags;
-    GUID ObjectType;
-    GUID InheritedObjectType;
-    DWORD SidStart;
-} ACCESS_ALLOWED_OBJECT_ACE, *PACCESS_ALLOWED_OBJECT_ACE;
-
-typedef struct _ACCESS_DENIED_OBJECT_ACE {
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    DWORD Flags;
-    GUID ObjectType;
-    GUID InheritedObjectType;
-    DWORD SidStart;
-} ACCESS_DENIED_OBJECT_ACE, *PACCESS_DENIED_OBJECT_ACE;
-
-typedef struct _SYSTEM_AUDIT_OBJECT_ACE {
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    DWORD Flags;
-    GUID ObjectType;
-    GUID InheritedObjectType;
-    DWORD SidStart;
-} SYSTEM_AUDIT_OBJECT_ACE, *PSYSTEM_AUDIT_OBJECT_ACE;
-
-typedef struct _SYSTEM_ALARM_OBJECT_ACE {
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    DWORD Flags;
-    GUID ObjectType;
-    GUID InheritedObjectType;
-    DWORD SidStart;
-} SYSTEM_ALARM_OBJECT_ACE, *PSYSTEM_ALARM_OBJECT_ACE;
-
-
-
-
-
-
-typedef struct _ACCESS_ALLOWED_CALLBACK_ACE {
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    DWORD SidStart;
-    
-} ACCESS_ALLOWED_CALLBACK_ACE, *PACCESS_ALLOWED_CALLBACK_ACE;
-
-typedef struct _ACCESS_DENIED_CALLBACK_ACE {
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    DWORD SidStart;
-    
-} ACCESS_DENIED_CALLBACK_ACE, *PACCESS_DENIED_CALLBACK_ACE;
-
-typedef struct _SYSTEM_AUDIT_CALLBACK_ACE {
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    DWORD SidStart;
-    
-} SYSTEM_AUDIT_CALLBACK_ACE, *PSYSTEM_AUDIT_CALLBACK_ACE;
-
-typedef struct _SYSTEM_ALARM_CALLBACK_ACE {
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    DWORD SidStart;
-    
-} SYSTEM_ALARM_CALLBACK_ACE, *PSYSTEM_ALARM_CALLBACK_ACE;
-
-typedef struct _ACCESS_ALLOWED_CALLBACK_OBJECT_ACE {
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    DWORD Flags;
-    GUID ObjectType;
-    GUID InheritedObjectType;
-    DWORD SidStart;
-    
-} ACCESS_ALLOWED_CALLBACK_OBJECT_ACE, *PACCESS_ALLOWED_CALLBACK_OBJECT_ACE;
-
-typedef struct _ACCESS_DENIED_CALLBACK_OBJECT_ACE {
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    DWORD Flags;
-    GUID ObjectType;
-    GUID InheritedObjectType;
-    DWORD SidStart;
-    
-} ACCESS_DENIED_CALLBACK_OBJECT_ACE, *PACCESS_DENIED_CALLBACK_OBJECT_ACE;
-
-typedef struct _SYSTEM_AUDIT_CALLBACK_OBJECT_ACE {
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    DWORD Flags;
-    GUID ObjectType;
-    GUID InheritedObjectType;
-    DWORD SidStart;
-    
-} SYSTEM_AUDIT_CALLBACK_OBJECT_ACE, *PSYSTEM_AUDIT_CALLBACK_OBJECT_ACE;
-
-typedef struct _SYSTEM_ALARM_CALLBACK_OBJECT_ACE {
-    ACE_HEADER Header;
-    ACCESS_MASK Mask;
-    DWORD Flags;
-    GUID ObjectType;
-    GUID InheritedObjectType;
-    DWORD SidStart;
-    
-} SYSTEM_ALARM_CALLBACK_OBJECT_ACE, *PSYSTEM_ALARM_CALLBACK_OBJECT_ACE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _ACL_INFORMATION_CLASS {
-    AclRevisionInformation = 1,
-    AclSizeInformation
-} ACL_INFORMATION_CLASS;
-
-
-
-
-
-
-typedef struct _ACL_REVISION_INFORMATION {
-    DWORD AclRevision;
-} ACL_REVISION_INFORMATION;
-typedef ACL_REVISION_INFORMATION *PACL_REVISION_INFORMATION;
-
-
-
-
-
-typedef struct _ACL_SIZE_INFORMATION {
-    DWORD AceCount;
-    DWORD AclBytesInUse;
-    DWORD AclBytesFree;
-} ACL_SIZE_INFORMATION;
-typedef ACL_SIZE_INFORMATION *PACL_SIZE_INFORMATION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef WORD   SECURITY_DESCRIPTOR_CONTROL, *PSECURITY_DESCRIPTOR_CONTROL;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _SECURITY_DESCRIPTOR_RELATIVE {
-    BYTE  Revision;
-    BYTE  Sbz1;
-    SECURITY_DESCRIPTOR_CONTROL Control;
-    DWORD Owner;
-    DWORD Group;
-    DWORD Sacl;
-    DWORD Dacl;
-    } SECURITY_DESCRIPTOR_RELATIVE, *PISECURITY_DESCRIPTOR_RELATIVE;
-
-typedef struct _SECURITY_DESCRIPTOR {
-   BYTE  Revision;
-   BYTE  Sbz1;
-   SECURITY_DESCRIPTOR_CONTROL Control;
-   PSID Owner;
-   PSID Group;
-   PACL Sacl;
-   PACL Dacl;
-
-   } SECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _OBJECT_TYPE_LIST {
-    WORD   Level;
-    WORD   Sbz;
-    GUID *ObjectType;
-} OBJECT_TYPE_LIST, *POBJECT_TYPE_LIST;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _AUDIT_EVENT_TYPE {
-    AuditEventObjectAccess,
-    AuditEventDirectoryServiceAccess
-} AUDIT_EVENT_TYPE, *PAUDIT_EVENT_TYPE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _PRIVILEGE_SET {
-    DWORD PrivilegeCount;
-    DWORD Control;
-    LUID_AND_ATTRIBUTES Privilege[1];
-    } PRIVILEGE_SET, * PPRIVILEGE_SET;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _SECURITY_IMPERSONATION_LEVEL {
-    SecurityAnonymous,
-    SecurityIdentification,
-    SecurityImpersonation,
-    SecurityDelegation
-    } SECURITY_IMPERSONATION_LEVEL, * PSECURITY_IMPERSONATION_LEVEL;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _TOKEN_TYPE {
-    TokenPrimary = 1,
-    TokenImpersonation
-    } TOKEN_TYPE;
-typedef TOKEN_TYPE *PTOKEN_TYPE;
-
-
-
-
-
-
-
-typedef enum _TOKEN_INFORMATION_CLASS {
-    TokenUser = 1,
-    TokenGroups,
-    TokenPrivileges,
-    TokenOwner,
-    TokenPrimaryGroup,
-    TokenDefaultDacl,
-    TokenSource,
-    TokenType,
-    TokenImpersonationLevel,
-    TokenStatistics,
-    TokenRestrictedSids,
-    TokenSessionId,
-    TokenGroupsAndPrivileges,
-    TokenSessionReference,
-    TokenSandBoxInert,
-    TokenAuditPolicy,
-    TokenOrigin,
-    MaxTokenInfoClass  
-} TOKEN_INFORMATION_CLASS, *PTOKEN_INFORMATION_CLASS;
-
-
-
-
-
-
-typedef struct _TOKEN_USER {
-    SID_AND_ATTRIBUTES User;
-} TOKEN_USER, *PTOKEN_USER;
-
-typedef struct _TOKEN_GROUPS {
-    DWORD GroupCount;
-    SID_AND_ATTRIBUTES Groups[1];
-} TOKEN_GROUPS, *PTOKEN_GROUPS;
-
-
-typedef struct _TOKEN_PRIVILEGES {
-    DWORD PrivilegeCount;
-    LUID_AND_ATTRIBUTES Privileges[1];
-} TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;
-
-
-typedef struct _TOKEN_OWNER {
-    PSID Owner;
-} TOKEN_OWNER, *PTOKEN_OWNER;
-
-
-typedef struct _TOKEN_PRIMARY_GROUP {
-    PSID PrimaryGroup;
-} TOKEN_PRIMARY_GROUP, *PTOKEN_PRIMARY_GROUP;
-
-
-typedef struct _TOKEN_DEFAULT_DACL {
-    PACL DefaultDacl;
-} TOKEN_DEFAULT_DACL, *PTOKEN_DEFAULT_DACL;
-
-typedef struct _TOKEN_GROUPS_AND_PRIVILEGES {
-    DWORD SidCount;
-    DWORD SidLength;
-    PSID_AND_ATTRIBUTES Sids;
-    DWORD RestrictedSidCount;
-    DWORD RestrictedSidLength;
-    PSID_AND_ATTRIBUTES RestrictedSids;
-    DWORD PrivilegeCount;
-    DWORD PrivilegeLength;
-    PLUID_AND_ATTRIBUTES Privileges;
-    LUID AuthenticationId;
-} TOKEN_GROUPS_AND_PRIVILEGES, *PTOKEN_GROUPS_AND_PRIVILEGES;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _TOKEN_AUDIT_POLICY_ELEMENT {
-    DWORD Category;
-    DWORD PolicyMask;
-} TOKEN_AUDIT_POLICY_ELEMENT, *PTOKEN_AUDIT_POLICY_ELEMENT;
-
-typedef struct _TOKEN_AUDIT_POLICY {
-    DWORD PolicyCount;
-    TOKEN_AUDIT_POLICY_ELEMENT Policy[1];
-} TOKEN_AUDIT_POLICY, *PTOKEN_AUDIT_POLICY;
-
-
-
-
-
-
-
-
-
-typedef struct _TOKEN_SOURCE {
-    CHAR SourceName[8];
-    LUID SourceIdentifier;
-} TOKEN_SOURCE, *PTOKEN_SOURCE;
-
-
-typedef struct _TOKEN_STATISTICS {
-    LUID TokenId;
-    LUID AuthenticationId;
-    LARGE_INTEGER ExpirationTime;
-    TOKEN_TYPE TokenType;
-    SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
-    DWORD DynamicCharged;
-    DWORD DynamicAvailable;
-    DWORD GroupCount;
-    DWORD PrivilegeCount;
-    LUID ModifiedId;
-} TOKEN_STATISTICS, *PTOKEN_STATISTICS;
-
-
-
-typedef struct _TOKEN_CONTROL {
-    LUID TokenId;
-    LUID AuthenticationId;
-    LUID ModifiedId;
-    TOKEN_SOURCE TokenSource;
-} TOKEN_CONTROL, *PTOKEN_CONTROL;
-
-typedef struct _TOKEN_ORIGIN {
-    LUID OriginatingLogonSession ;
-} TOKEN_ORIGIN, * PTOKEN_ORIGIN ;
-
-
-
-
-
-
-
-
-typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE,
-                    * PSECURITY_CONTEXT_TRACKING_MODE;
-
-
-
-
-
-
-
-typedef struct _SECURITY_QUALITY_OF_SERVICE {
-    DWORD Length;
-    SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
-    SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
-    BOOLEAN EffectiveOnly;
-    } SECURITY_QUALITY_OF_SERVICE, * PSECURITY_QUALITY_OF_SERVICE;
-
-
-
-
-
-
-typedef struct _SE_IMPERSONATION_STATE {
-    PACCESS_TOKEN Token;
-    BOOLEAN CopyOnOpen;
-    BOOLEAN EffectiveOnly;
-    SECURITY_IMPERSONATION_LEVEL Level;
-} SE_IMPERSONATION_STATE, *PSE_IMPERSONATION_STATE;
-
-
-
-
-typedef DWORD SECURITY_INFORMATION, *PSECURITY_INFORMATION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _JOB_SET_ARRAY {
-    HANDLE JobHandle;   
-    DWORD MemberLevel;  
-    DWORD Flags;        
-} JOB_SET_ARRAY, *PJOB_SET_ARRAY;
-
-
-
-
-typedef struct _NT_TIB {
-    struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
-    PVOID StackBase;
-    PVOID StackLimit;
-    PVOID SubSystemTib;
-    union {
-        PVOID FiberData;
-        DWORD Version;
-    };
-    PVOID ArbitraryUserPointer;
-    struct _NT_TIB *Self;
-} NT_TIB;
-typedef NT_TIB *PNT_TIB;
-
-
-
-
-typedef struct _NT_TIB32 {
-    DWORD ExceptionList;
-    DWORD StackBase;
-    DWORD StackLimit;
-    DWORD SubSystemTib;
-    union {
-        DWORD FiberData;
-        DWORD Version;
-    };
-    DWORD ArbitraryUserPointer;
-    DWORD Self;
-} NT_TIB32, *PNT_TIB32;
-
-typedef struct _NT_TIB64 {
-    DWORD64 ExceptionList;
-    DWORD64 StackBase;
-    DWORD64 StackLimit;
-    DWORD64 SubSystemTib;
-    union {
-        DWORD64 FiberData;
-        DWORD Version;
-    };
-    DWORD64 ArbitraryUserPointer;
-    DWORD64 Self;
-} NT_TIB64, *PNT_TIB64;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _QUOTA_LIMITS {
-    SIZE_T PagedPoolLimit;
-    SIZE_T NonPagedPoolLimit;
-    SIZE_T MinimumWorkingSetSize;
-    SIZE_T MaximumWorkingSetSize;
-    SIZE_T PagefileLimit;
-    LARGE_INTEGER TimeLimit;
-} QUOTA_LIMITS, *PQUOTA_LIMITS;
-
-
-
-
-
-
-typedef struct _QUOTA_LIMITS_EX {
-    SIZE_T PagedPoolLimit;
-    SIZE_T NonPagedPoolLimit;
-    SIZE_T MinimumWorkingSetSize;
-    SIZE_T MaximumWorkingSetSize;
-    SIZE_T PagefileLimit;
-    LARGE_INTEGER TimeLimit;
-    SIZE_T Reserved1;
-    SIZE_T Reserved2;
-    SIZE_T Reserved3;
-    SIZE_T Reserved4;
-    DWORD  Flags;
-    DWORD  Reserved5;
-} QUOTA_LIMITS_EX, *PQUOTA_LIMITS_EX;
-
-typedef struct _IO_COUNTERS {
-    ULONGLONG  ReadOperationCount;
-    ULONGLONG  WriteOperationCount;
-    ULONGLONG  OtherOperationCount;
-    ULONGLONG ReadTransferCount;
-    ULONGLONG WriteTransferCount;
-    ULONGLONG OtherTransferCount;
-} IO_COUNTERS;
-typedef IO_COUNTERS *PIO_COUNTERS;
-
-
-typedef struct _JOBOBJECT_BASIC_ACCOUNTING_INFORMATION {
-    LARGE_INTEGER TotalUserTime;
-    LARGE_INTEGER TotalKernelTime;
-    LARGE_INTEGER ThisPeriodTotalUserTime;
-    LARGE_INTEGER ThisPeriodTotalKernelTime;
-    DWORD TotalPageFaultCount;
-    DWORD TotalProcesses;
-    DWORD ActiveProcesses;
-    DWORD TotalTerminatedProcesses;
-} JOBOBJECT_BASIC_ACCOUNTING_INFORMATION, *PJOBOBJECT_BASIC_ACCOUNTING_INFORMATION;
-
-typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION {
-    LARGE_INTEGER PerProcessUserTimeLimit;
-    LARGE_INTEGER PerJobUserTimeLimit;
-    DWORD LimitFlags;
-    SIZE_T MinimumWorkingSetSize;
-    SIZE_T MaximumWorkingSetSize;
-    DWORD ActiveProcessLimit;
-    ULONG_PTR Affinity;
-    DWORD PriorityClass;
-    DWORD SchedulingClass;
-} JOBOBJECT_BASIC_LIMIT_INFORMATION, *PJOBOBJECT_BASIC_LIMIT_INFORMATION;
-
-typedef struct _JOBOBJECT_EXTENDED_LIMIT_INFORMATION {
-    JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation;
-    IO_COUNTERS IoInfo;
-    SIZE_T ProcessMemoryLimit;
-    SIZE_T JobMemoryLimit;
-    SIZE_T PeakProcessMemoryUsed;
-    SIZE_T PeakJobMemoryUsed;
-} JOBOBJECT_EXTENDED_LIMIT_INFORMATION, *PJOBOBJECT_EXTENDED_LIMIT_INFORMATION;
-
-typedef struct _JOBOBJECT_BASIC_PROCESS_ID_LIST {
-    DWORD NumberOfAssignedProcesses;
-    DWORD NumberOfProcessIdsInList;
-    ULONG_PTR ProcessIdList[1];
-} JOBOBJECT_BASIC_PROCESS_ID_LIST, *PJOBOBJECT_BASIC_PROCESS_ID_LIST;
-
-typedef struct _JOBOBJECT_BASIC_UI_RESTRICTIONS {
-    DWORD UIRestrictionsClass;
-} JOBOBJECT_BASIC_UI_RESTRICTIONS, *PJOBOBJECT_BASIC_UI_RESTRICTIONS;
-
-typedef struct _JOBOBJECT_SECURITY_LIMIT_INFORMATION {
-    DWORD SecurityLimitFlags ;
-    HANDLE JobToken ;
-    PTOKEN_GROUPS SidsToDisable ;
-    PTOKEN_PRIVILEGES PrivilegesToDelete ;
-    PTOKEN_GROUPS RestrictedSids ;
-} JOBOBJECT_SECURITY_LIMIT_INFORMATION, *PJOBOBJECT_SECURITY_LIMIT_INFORMATION ;
-
-typedef struct _JOBOBJECT_END_OF_JOB_TIME_INFORMATION {
-    DWORD EndOfJobTimeAction;
-} JOBOBJECT_END_OF_JOB_TIME_INFORMATION, *PJOBOBJECT_END_OF_JOB_TIME_INFORMATION;
-
-typedef struct _JOBOBJECT_ASSOCIATE_COMPLETION_PORT {
-    PVOID CompletionKey;
-    HANDLE CompletionPort;
-} JOBOBJECT_ASSOCIATE_COMPLETION_PORT, *PJOBOBJECT_ASSOCIATE_COMPLETION_PORT;
-
-typedef struct _JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION {
-    JOBOBJECT_BASIC_ACCOUNTING_INFORMATION BasicInfo;
-    IO_COUNTERS IoInfo;
-} JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION, *PJOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION;
-
-typedef struct _JOBOBJECT_JOBSET_INFORMATION {
-    DWORD MemberLevel;
-} JOBOBJECT_JOBSET_INFORMATION, *PJOBOBJECT_JOBSET_INFORMATION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _JOBOBJECTINFOCLASS {
-    JobObjectBasicAccountingInformation = 1,
-    JobObjectBasicLimitInformation,
-    JobObjectBasicProcessIdList,
-    JobObjectBasicUIRestrictions,
-    JobObjectSecurityLimitInformation,
-    JobObjectEndOfJobTimeInformation,
-    JobObjectAssociateCompletionPortInformation,
-    JobObjectBasicAndIoAccountingInformation,
-    JobObjectExtendedLimitInformation,
-    JobObjectJobSetInformation,
-    MaxJobObjectInfoClass
-    } JOBOBJECTINFOCLASS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP {
-    RelationProcessorCore,
-    RelationNumaNode,
-    RelationCache
-} LOGICAL_PROCESSOR_RELATIONSHIP;
-
-
-
-typedef enum _PROCESSOR_CACHE_TYPE {
-    CacheUnified,
-    CacheInstruction,
-    CacheData,
-    CacheTrace
-} PROCESSOR_CACHE_TYPE;
-
-
-
-typedef struct _CACHE_DESCRIPTOR {
-    BYTE   Level;
-    BYTE   Associativity;
-    WORD   LineSize;
-    DWORD  Size;
-    PROCESSOR_CACHE_TYPE Type;
-} CACHE_DESCRIPTOR, *PCACHE_DESCRIPTOR;
-
-typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION {
-    ULONG_PTR   ProcessorMask;
-    LOGICAL_PROCESSOR_RELATIONSHIP Relationship;
-    union {
-        struct {
-            BYTE  Flags;
-        } ProcessorCore;
-        struct {
-            DWORD NodeNumber;
-        } NumaNode;
-        CACHE_DESCRIPTOR Cache;
-        ULONGLONG  Reserved[2];
-    };
-} SYSTEM_LOGICAL_PROCESSOR_INFORMATION, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _MEMORY_BASIC_INFORMATION {
-    PVOID BaseAddress;
-    PVOID AllocationBase;
-    DWORD AllocationProtect;
-    SIZE_T RegionSize;
-    DWORD State;
-    DWORD Protect;
-    DWORD Type;
-} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;
-
-typedef struct _MEMORY_BASIC_INFORMATION32 {
-    DWORD BaseAddress;
-    DWORD AllocationBase;
-    DWORD AllocationProtect;
-    DWORD RegionSize;
-    DWORD State;
-    DWORD Protect;
-    DWORD Type;
-} MEMORY_BASIC_INFORMATION32, *PMEMORY_BASIC_INFORMATION32;
-
-typedef struct __declspec(align(16)) _MEMORY_BASIC_INFORMATION64 {
-    ULONGLONG BaseAddress;
-    ULONGLONG AllocationBase;
-    DWORD     AllocationProtect;
-    DWORD     __alignment1;
-    ULONGLONG RegionSize;
-    DWORD     State;
-    DWORD     Protect;
-    DWORD     Type;
-    DWORD     __alignment2;
-} MEMORY_BASIC_INFORMATION64, *PMEMORY_BASIC_INFORMATION64;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _FILE_NOTIFY_INFORMATION {
-    DWORD NextEntryOffset;
-    DWORD Action;
-    DWORD FileNameLength;
-    WCHAR FileName[1];
-} FILE_NOTIFY_INFORMATION, *PFILE_NOTIFY_INFORMATION;
-
-
-
-
-
-
-typedef union _FILE_SEGMENT_ELEMENT {
-    PVOID64 Buffer;
-    ULONGLONG Alignment;
-}FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT;
-
-
-
-
-
-
-
-
-
-typedef struct _REPARSE_GUID_DATA_BUFFER {
-    DWORD  ReparseTag;
-    WORD   ReparseDataLength;
-    WORD   Reserved;
-    GUID   ReparseGuid;
-    struct {
-        BYTE   DataBuffer[1];
-    } GenericReparseBuffer;
-} REPARSE_GUID_DATA_BUFFER, *PREPARSE_GUID_DATA_BUFFER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _SYSTEM_POWER_STATE {
-    PowerSystemUnspecified = 0,
-    PowerSystemWorking     = 1,
-    PowerSystemSleeping1   = 2,
-    PowerSystemSleeping2   = 3,
-    PowerSystemSleeping3   = 4,
-    PowerSystemHibernate   = 5,
-    PowerSystemShutdown    = 6,
-    PowerSystemMaximum     = 7
-} SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;
-
-
-
-typedef enum {
-    PowerActionNone = 0,
-    PowerActionReserved,
-    PowerActionSleep,
-    PowerActionHibernate,
-    PowerActionShutdown,
-    PowerActionShutdownReset,
-    PowerActionShutdownOff,
-    PowerActionWarmEject
-} POWER_ACTION, *PPOWER_ACTION;
-
-typedef enum _DEVICE_POWER_STATE {
-    PowerDeviceUnspecified = 0,
-    PowerDeviceD0,
-    PowerDeviceD1,
-    PowerDeviceD2,
-    PowerDeviceD3,
-    PowerDeviceMaximum
-} DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;
-
-
-
-
-
-
-
-typedef DWORD EXECUTION_STATE;
-
-typedef enum {
-    LT_DONT_CARE,
-    LT_LOWEST_LATENCY
-} LATENCY_TIME;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct CM_Power_Data_s {
-    DWORD               PD_Size;
-    DEVICE_POWER_STATE  PD_MostRecentPowerState;
-    DWORD               PD_Capabilities;
-    DWORD               PD_D1Latency;
-    DWORD               PD_D2Latency;
-    DWORD               PD_D3Latency;
-    DEVICE_POWER_STATE  PD_PowerStateMapping[7];
-    SYSTEM_POWER_STATE  PD_DeepestSystemWake;
-} CM_POWER_DATA, *PCM_POWER_DATA;
-
-
-
-typedef enum {
-    SystemPowerPolicyAc,
-    SystemPowerPolicyDc,
-    VerifySystemPolicyAc,
-    VerifySystemPolicyDc,
-    SystemPowerCapabilities,
-    SystemBatteryState,
-    SystemPowerStateHandler,
-    ProcessorStateHandler,
-    SystemPowerPolicyCurrent,
-    AdministratorPowerPolicy,
-    SystemReserveHiberFile,
-    ProcessorInformation,
-    SystemPowerInformation,
-    ProcessorStateHandler2,
-    LastWakeTime,                                   
-    LastSleepTime,                                  
-    SystemExecutionState,
-    SystemPowerStateNotifyHandler,
-    ProcessorPowerPolicyAc,
-    ProcessorPowerPolicyDc,
-    VerifyProcessorPowerPolicyAc,
-    VerifyProcessorPowerPolicyDc,
-    ProcessorPowerPolicyCurrent,
-    SystemPowerStateLogging,
-    SystemPowerLoggingEntry
-} POWER_INFORMATION_LEVEL;
-
-
-
-
-
-
-
-typedef struct {
-    DWORD       Granularity;
-    DWORD       Capacity;
-} BATTERY_REPORTING_SCALE, *PBATTERY_REPORTING_SCALE;
-
-
-
-
-
-
-typedef struct {
-    POWER_ACTION    Action;
-    DWORD           Flags;
-    DWORD           EventCode;
-} POWER_ACTION_POLICY, *PPOWER_ACTION_POLICY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-    BOOLEAN                 Enable;
-    BYTE                    Spare[3];
-    DWORD                   BatteryLevel;
-    POWER_ACTION_POLICY     PowerPolicy;
-    SYSTEM_POWER_STATE      MinSystemState;
-} SYSTEM_POWER_LEVEL, *PSYSTEM_POWER_LEVEL;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _SYSTEM_POWER_POLICY {
-    DWORD                   Revision;       
-
-    
-    POWER_ACTION_POLICY     PowerButton;
-    POWER_ACTION_POLICY     SleepButton;
-    POWER_ACTION_POLICY     LidClose;
-    SYSTEM_POWER_STATE      LidOpenWake;
-    DWORD                   Reserved;
-
-    
-    POWER_ACTION_POLICY     Idle;
-    DWORD                   IdleTimeout;
-    BYTE                    IdleSensitivity;
-
-    
-    
-    BYTE                    DynamicThrottle;
-
-    BYTE                    Spare2[2];
-
-    
-    SYSTEM_POWER_STATE      MinSleep;
-    SYSTEM_POWER_STATE      MaxSleep;
-    SYSTEM_POWER_STATE      ReducedLatencySleep;
-    DWORD                   WinLogonFlags;
-
-    
-    DWORD                   Spare3;
-    DWORD                   DozeS4Timeout;
-
-    
-    DWORD                   BroadcastCapacityResolution;
-    SYSTEM_POWER_LEVEL      DischargePolicy[4];
-
-    
-    DWORD                   VideoTimeout;
-    BOOLEAN                 VideoDimDisplay;
-    DWORD                   VideoReserved[3];
-
-    
-    DWORD                   SpindownTimeout;
-
-    
-    BOOLEAN                 OptimizeForPower;
-    BYTE                    FanThrottleTolerance;
-    BYTE                    ForcedThrottle;
-    BYTE                    MinThrottle;
-    POWER_ACTION_POLICY     OverThrottled;
-
-} SYSTEM_POWER_POLICY, *PSYSTEM_POWER_POLICY;
-
-
-typedef struct _PROCESSOR_POWER_POLICY_INFO {
-
-    
-    DWORD                   TimeCheck;                      
-    DWORD                   DemoteLimit;                    
-    DWORD                   PromoteLimit;                   
-
-    
-    BYTE                    DemotePercent;
-    BYTE                    PromotePercent;
-    BYTE                    Spare[2];
-
-    
-    DWORD                   AllowDemotion:1;
-    DWORD                   AllowPromotion:1;
-    DWORD                   Reserved:30;
-
-} PROCESSOR_POWER_POLICY_INFO, *PPROCESSOR_POWER_POLICY_INFO;
-
-
-typedef struct _PROCESSOR_POWER_POLICY {
-    DWORD                       Revision;       
-
-    
-    BYTE                        DynamicThrottle;
-    BYTE                        Spare[3];
-
-    
-    DWORD                       DisableCStates:1;
-    DWORD                       Reserved:31;
-
-    
-    
-    
-    DWORD                       PolicyCount;
-    PROCESSOR_POWER_POLICY_INFO Policy[3];
-
-} PROCESSOR_POWER_POLICY, *PPROCESSOR_POWER_POLICY;
-
-
-typedef struct _ADMINISTRATOR_POWER_POLICY {
-
-    
-    SYSTEM_POWER_STATE      MinSleep;
-    SYSTEM_POWER_STATE      MaxSleep;
-
-    
-    DWORD                   MinVideoTimeout;
-    DWORD                   MaxVideoTimeout;
-
-    
-    DWORD                   MinSpindownTimeout;
-    DWORD                   MaxSpindownTimeout;
-} ADMINISTRATOR_POWER_POLICY, *PADMINISTRATOR_POWER_POLICY;
-
-
-typedef struct {
-    
-    BOOLEAN             PowerButtonPresent;
-    BOOLEAN             SleepButtonPresent;
-    BOOLEAN             LidPresent;
-    BOOLEAN             SystemS1;
-    BOOLEAN             SystemS2;
-    BOOLEAN             SystemS3;
-    BOOLEAN             SystemS4;           
-    BOOLEAN             SystemS5;           
-    BOOLEAN             HiberFilePresent;
-    BOOLEAN             FullWake;
-    BOOLEAN             VideoDimPresent;
-    BOOLEAN             ApmPresent;
-    BOOLEAN             UpsPresent;
-
-    
-    BOOLEAN             ThermalControl;
-    BOOLEAN             ProcessorThrottle;
-    BYTE                ProcessorMinThrottle;
-    BYTE                ProcessorMaxThrottle;
-    BYTE                spare2[4];
-
-    
-    BOOLEAN             DiskSpinDown;
-    BYTE                spare3[8];
-
-    
-    BOOLEAN             SystemBatteriesPresent;
-    BOOLEAN             BatteriesAreShortTerm;
-    BATTERY_REPORTING_SCALE BatteryScale[3];
-
-    
-    SYSTEM_POWER_STATE  AcOnLineWake;
-    SYSTEM_POWER_STATE  SoftLidWake;
-    SYSTEM_POWER_STATE  RtcWake;
-    SYSTEM_POWER_STATE  MinDeviceWakeState; 
-    SYSTEM_POWER_STATE  DefaultLowLatencyWake;
-} SYSTEM_POWER_CAPABILITIES, *PSYSTEM_POWER_CAPABILITIES;
-
-typedef struct {
-    BOOLEAN             AcOnLine;
-    BOOLEAN             BatteryPresent;
-    BOOLEAN             Charging;
-    BOOLEAN             Discharging;
-    BOOLEAN             Spare1[4];
-
-    DWORD               MaxCapacity;
-    DWORD               RemainingCapacity;
-    DWORD               Rate;
-    DWORD               EstimatedTime;
-
-    DWORD               DefaultAlert1;
-    DWORD               DefaultAlert2;
-} SYSTEM_BATTERY_STATE, *PSYSTEM_BATTERY_STATE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,4)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,2)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_DOS_HEADER {      
-    WORD   e_magic;                     
-    WORD   e_cblp;                      
-    WORD   e_cp;                        
-    WORD   e_crlc;                      
-    WORD   e_cparhdr;                   
-    WORD   e_minalloc;                  
-    WORD   e_maxalloc;                  
-    WORD   e_ss;                        
-    WORD   e_sp;                        
-    WORD   e_csum;                      
-    WORD   e_ip;                        
-    WORD   e_cs;                        
-    WORD   e_lfarlc;                    
-    WORD   e_ovno;                      
-    WORD   e_res[4];                    
-    WORD   e_oemid;                     
-    WORD   e_oeminfo;                   
-    WORD   e_res2[10];                  
-    LONG   e_lfanew;                    
-  } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
-
-typedef struct _IMAGE_OS2_HEADER {      
-    WORD   ne_magic;                    
-    CHAR   ne_ver;                      
-    CHAR   ne_rev;                      
-    WORD   ne_enttab;                   
-    WORD   ne_cbenttab;                 
-    LONG   ne_crc;                      
-    WORD   ne_flags;                    
-    WORD   ne_autodata;                 
-    WORD   ne_heap;                     
-    WORD   ne_stack;                    
-    LONG   ne_csip;                     
-    LONG   ne_sssp;                     
-    WORD   ne_cseg;                     
-    WORD   ne_cmod;                     
-    WORD   ne_cbnrestab;                
-    WORD   ne_segtab;                   
-    WORD   ne_rsrctab;                  
-    WORD   ne_restab;                   
-    WORD   ne_modtab;                   
-    WORD   ne_imptab;                   
-    LONG   ne_nrestab;                  
-    WORD   ne_cmovent;                  
-    WORD   ne_align;                    
-    WORD   ne_cres;                     
-    BYTE   ne_exetyp;                   
-    BYTE   ne_flagsothers;              
-    WORD   ne_pretthunks;               
-    WORD   ne_psegrefbytes;             
-    WORD   ne_swaparea;                 
-    WORD   ne_expver;                   
-  } IMAGE_OS2_HEADER, *PIMAGE_OS2_HEADER;
-
-typedef struct _IMAGE_VXD_HEADER {      
-    WORD   e32_magic;                   
-    BYTE   e32_border;                  
-    BYTE   e32_worder;                  
-    DWORD  e32_level;                   
-    WORD   e32_cpu;                     
-    WORD   e32_os;                      
-    DWORD  e32_ver;                     
-    DWORD  e32_mflags;                  
-    DWORD  e32_mpages;                  
-    DWORD  e32_startobj;                
-    DWORD  e32_eip;                     
-    DWORD  e32_stackobj;                
-    DWORD  e32_esp;                     
-    DWORD  e32_pagesize;                
-    DWORD  e32_lastpagesize;            
-    DWORD  e32_fixupsize;               
-    DWORD  e32_fixupsum;                
-    DWORD  e32_ldrsize;                 
-    DWORD  e32_ldrsum;                  
-    DWORD  e32_objtab;                  
-    DWORD  e32_objcnt;                  
-    DWORD  e32_objmap;                  
-    DWORD  e32_itermap;                 
-    DWORD  e32_rsrctab;                 
-    DWORD  e32_rsrccnt;                 
-    DWORD  e32_restab;                  
-    DWORD  e32_enttab;                  
-    DWORD  e32_dirtab;                  
-    DWORD  e32_dircnt;                  
-    DWORD  e32_fpagetab;                
-    DWORD  e32_frectab;                 
-    DWORD  e32_impmod;                  
-    DWORD  e32_impmodcnt;               
-    DWORD  e32_impproc;                 
-    DWORD  e32_pagesum;                 
-    DWORD  e32_datapage;                
-    DWORD  e32_preload;                 
-    DWORD  e32_nrestab;                 
-    DWORD  e32_cbnrestab;               
-    DWORD  e32_nressum;                 
-    DWORD  e32_autodata;                
-    DWORD  e32_debuginfo;               
-    DWORD  e32_debuglen;                
-    DWORD  e32_instpreload;             
-    DWORD  e32_instdemand;              
-    DWORD  e32_heapsize;                
-    BYTE   e32_res3[12];                
-    DWORD  e32_winresoff;
-    DWORD  e32_winreslen;
-    WORD   e32_devid;                   
-    WORD   e32_ddkver;                  
-  } IMAGE_VXD_HEADER, *PIMAGE_VXD_HEADER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_FILE_HEADER {
-    WORD    Machine;
-    WORD    NumberOfSections;
-    DWORD   TimeDateStamp;
-    DWORD   PointerToSymbolTable;
-    DWORD   NumberOfSymbols;
-    WORD    SizeOfOptionalHeader;
-    WORD    Characteristics;
-} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_DATA_DIRECTORY {
-    DWORD   VirtualAddress;
-    DWORD   Size;
-} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
-
-
-
-
-
-
-
-typedef struct _IMAGE_OPTIONAL_HEADER {
-    
-    
-    
-
-    WORD    Magic;
-    BYTE    MajorLinkerVersion;
-    BYTE    MinorLinkerVersion;
-    DWORD   SizeOfCode;
-    DWORD   SizeOfInitializedData;
-    DWORD   SizeOfUninitializedData;
-    DWORD   AddressOfEntryPoint;
-    DWORD   BaseOfCode;
-    DWORD   BaseOfData;
-
-    
-    
-    
-
-    DWORD   ImageBase;
-    DWORD   SectionAlignment;
-    DWORD   FileAlignment;
-    WORD    MajorOperatingSystemVersion;
-    WORD    MinorOperatingSystemVersion;
-    WORD    MajorImageVersion;
-    WORD    MinorImageVersion;
-    WORD    MajorSubsystemVersion;
-    WORD    MinorSubsystemVersion;
-    DWORD   Win32VersionValue;
-    DWORD   SizeOfImage;
-    DWORD   SizeOfHeaders;
-    DWORD   CheckSum;
-    WORD    Subsystem;
-    WORD    DllCharacteristics;
-    DWORD   SizeOfStackReserve;
-    DWORD   SizeOfStackCommit;
-    DWORD   SizeOfHeapReserve;
-    DWORD   SizeOfHeapCommit;
-    DWORD   LoaderFlags;
-    DWORD   NumberOfRvaAndSizes;
-    IMAGE_DATA_DIRECTORY DataDirectory[16];
-} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
-
-typedef struct _IMAGE_ROM_OPTIONAL_HEADER {
-    WORD   Magic;
-    BYTE   MajorLinkerVersion;
-    BYTE   MinorLinkerVersion;
-    DWORD  SizeOfCode;
-    DWORD  SizeOfInitializedData;
-    DWORD  SizeOfUninitializedData;
-    DWORD  AddressOfEntryPoint;
-    DWORD  BaseOfCode;
-    DWORD  BaseOfData;
-    DWORD  BaseOfBss;
-    DWORD  GprMask;
-    DWORD  CprMask[4];
-    DWORD  GpValue;
-} IMAGE_ROM_OPTIONAL_HEADER, *PIMAGE_ROM_OPTIONAL_HEADER;
-
-typedef struct _IMAGE_OPTIONAL_HEADER64 {
-    WORD        Magic;
-    BYTE        MajorLinkerVersion;
-    BYTE        MinorLinkerVersion;
-    DWORD       SizeOfCode;
-    DWORD       SizeOfInitializedData;
-    DWORD       SizeOfUninitializedData;
-    DWORD       AddressOfEntryPoint;
-    DWORD       BaseOfCode;
-    ULONGLONG   ImageBase;
-    DWORD       SectionAlignment;
-    DWORD       FileAlignment;
-    WORD        MajorOperatingSystemVersion;
-    WORD        MinorOperatingSystemVersion;
-    WORD        MajorImageVersion;
-    WORD        MinorImageVersion;
-    WORD        MajorSubsystemVersion;
-    WORD        MinorSubsystemVersion;
-    DWORD       Win32VersionValue;
-    DWORD       SizeOfImage;
-    DWORD       SizeOfHeaders;
-    DWORD       CheckSum;
-    WORD        Subsystem;
-    WORD        DllCharacteristics;
-    ULONGLONG   SizeOfStackReserve;
-    ULONGLONG   SizeOfStackCommit;
-    ULONGLONG   SizeOfHeapReserve;
-    ULONGLONG   SizeOfHeapCommit;
-    DWORD       LoaderFlags;
-    DWORD       NumberOfRvaAndSizes;
-    IMAGE_DATA_DIRECTORY DataDirectory[16];
-} IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef IMAGE_OPTIONAL_HEADER32             IMAGE_OPTIONAL_HEADER;
-typedef PIMAGE_OPTIONAL_HEADER32            PIMAGE_OPTIONAL_HEADER;
-
-
-
-
-typedef struct _IMAGE_NT_HEADERS64 {
-    DWORD Signature;
-    IMAGE_FILE_HEADER FileHeader;
-    IMAGE_OPTIONAL_HEADER64 OptionalHeader;
-} IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64;
-
-typedef struct _IMAGE_NT_HEADERS {
-    DWORD Signature;
-    IMAGE_FILE_HEADER FileHeader;
-    IMAGE_OPTIONAL_HEADER32 OptionalHeader;
-} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
-
-typedef struct _IMAGE_ROM_HEADERS {
-    IMAGE_FILE_HEADER FileHeader;
-    IMAGE_ROM_OPTIONAL_HEADER OptionalHeader;
-} IMAGE_ROM_HEADERS, *PIMAGE_ROM_HEADERS;
-
-
-
-
-
-typedef IMAGE_NT_HEADERS32                  IMAGE_NT_HEADERS;
-typedef PIMAGE_NT_HEADERS32                 PIMAGE_NT_HEADERS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct ANON_OBJECT_HEADER {
-    WORD    Sig1;            
-    WORD    Sig2;            
-    WORD    Version;         
-    WORD    Machine;
-    DWORD   TimeDateStamp;
-    CLSID   ClassID;         
-    DWORD   SizeOfData;      
-} ANON_OBJECT_HEADER;
-
-
-
-
-
-
-
-typedef struct _IMAGE_SECTION_HEADER {
-    BYTE    Name[8];
-    union {
-            DWORD   PhysicalAddress;
-            DWORD   VirtualSize;
-    } Misc;
-    DWORD   VirtualAddress;
-    DWORD   SizeOfRawData;
-    DWORD   PointerToRawData;
-    DWORD   PointerToRelocations;
-    DWORD   PointerToLinenumbers;
-    WORD    NumberOfRelocations;
-    WORD    NumberOfLinenumbers;
-    DWORD   Characteristics;
-} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,2)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_SYMBOL {
-    union {
-        BYTE    ShortName[8];
-        struct {
-            DWORD   Short;     
-            DWORD   Long;      
-        } Name;
-        DWORD   LongName[2];    
-    } N;
-    DWORD   Value;
-    SHORT   SectionNumber;
-    WORD    Type;
-    BYTE    StorageClass;
-    BYTE    NumberOfAuxSymbols;
-} IMAGE_SYMBOL;
-typedef IMAGE_SYMBOL  *PIMAGE_SYMBOL;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef union _IMAGE_AUX_SYMBOL {
-    struct {
-        DWORD    TagIndex;                      
-        union {
-            struct {
-                WORD    Linenumber;             
-                WORD    Size;                   
-            } LnSz;
-           DWORD    TotalSize;
-        } Misc;
-        union {
-            struct {                            
-                DWORD    PointerToLinenumber;
-                DWORD    PointerToNextFunction;
-            } Function;
-            struct {                            
-                WORD     Dimension[4];
-            } Array;
-        } FcnAry;
-        WORD    TvIndex;                        
-    } Sym;
-    struct {
-        BYTE    Name[18];
-    } File;
-    struct {
-        DWORD   Length;                         
-        WORD    NumberOfRelocations;            
-        WORD    NumberOfLinenumbers;            
-        DWORD   CheckSum;                       
-        SHORT   Number;                         
-        BYTE    Selection;                      
-    } Section;
-} IMAGE_AUX_SYMBOL;
-typedef IMAGE_AUX_SYMBOL  *PIMAGE_AUX_SYMBOL;
-
-
-
-typedef enum IMAGE_AUX_SYMBOL_TYPE {
-    IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF = 1,
-} IMAGE_AUX_SYMBOL_TYPE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,2)
-
-
-
-
-
-
-
-
-
-typedef struct IMAGE_AUX_SYMBOL_TOKEN_DEF {
-    BYTE  bAuxType;                  
-    BYTE  bReserved;                 
-    DWORD SymbolTableIndex;
-    BYTE  rgbReserved[12];           
-} IMAGE_AUX_SYMBOL_TOKEN_DEF;
-
-typedef IMAGE_AUX_SYMBOL_TOKEN_DEF  *PIMAGE_AUX_SYMBOL_TOKEN_DEF;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_RELOCATION {
-    union {
-        DWORD   VirtualAddress;
-        DWORD   RelocCount;             
-    };
-    DWORD   SymbolTableIndex;
-    WORD    Type;
-} IMAGE_RELOCATION;
-typedef IMAGE_RELOCATION  *PIMAGE_RELOCATION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_LINENUMBER {
-    union {
-        DWORD   SymbolTableIndex;               
-        DWORD   VirtualAddress;                 
-    } Type;
-    WORD    Linenumber;                         
-} IMAGE_LINENUMBER;
-typedef IMAGE_LINENUMBER  *PIMAGE_LINENUMBER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_BASE_RELOCATION {
-    DWORD   VirtualAddress;
-    DWORD   SizeOfBlock;
-
-} IMAGE_BASE_RELOCATION;
-typedef IMAGE_BASE_RELOCATION  * PIMAGE_BASE_RELOCATION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER {
-    BYTE     Name[16];                          
-    BYTE     Date[12];                          
-    BYTE     UserID[6];                         
-    BYTE     GroupID[6];                        
-    BYTE     Mode[8];                           
-    BYTE     Size[10];                          
-    BYTE     EndHeader[2];                      
-} IMAGE_ARCHIVE_MEMBER_HEADER, *PIMAGE_ARCHIVE_MEMBER_HEADER;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_EXPORT_DIRECTORY {
-    DWORD   Characteristics;
-    DWORD   TimeDateStamp;
-    WORD    MajorVersion;
-    WORD    MinorVersion;
-    DWORD   Name;
-    DWORD   Base;
-    DWORD   NumberOfFunctions;
-    DWORD   NumberOfNames;
-    DWORD   AddressOfFunctions;     
-    DWORD   AddressOfNames;         
-    DWORD   AddressOfNameOrdinals;  
-} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
-
-
-
-
-
-typedef struct _IMAGE_IMPORT_BY_NAME {
-    WORD    Hint;
-    BYTE    Name[1];
-} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,8)
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_THUNK_DATA64 {
-    union {
-        ULONGLONG ForwarderString;  
-        ULONGLONG Function;         
-        ULONGLONG Ordinal;
-        ULONGLONG AddressOfData;    
-    } u1;
-} IMAGE_THUNK_DATA64;
-typedef IMAGE_THUNK_DATA64 * PIMAGE_THUNK_DATA64;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_THUNK_DATA32 {
-    union {
-        DWORD ForwarderString;      
-        DWORD Function;             
-        DWORD Ordinal;
-        DWORD AddressOfData;        
-    } u1;
-} IMAGE_THUNK_DATA32;
-typedef IMAGE_THUNK_DATA32 * PIMAGE_THUNK_DATA32;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef void
-(__stdcall *PIMAGE_TLS_CALLBACK) (
-    PVOID DllHandle,
-    DWORD Reason,
-    PVOID Reserved
-    );
-
-typedef struct _IMAGE_TLS_DIRECTORY64 {
-    ULONGLONG   StartAddressOfRawData;
-    ULONGLONG   EndAddressOfRawData;
-    ULONGLONG   AddressOfIndex;         
-    ULONGLONG   AddressOfCallBacks;     
-    DWORD   SizeOfZeroFill;
-    DWORD   Characteristics;
-} IMAGE_TLS_DIRECTORY64;
-typedef IMAGE_TLS_DIRECTORY64 * PIMAGE_TLS_DIRECTORY64;
-
-typedef struct _IMAGE_TLS_DIRECTORY32 {
-    DWORD   StartAddressOfRawData;
-    DWORD   EndAddressOfRawData;
-    DWORD   AddressOfIndex;             
-    DWORD   AddressOfCallBacks;         
-    DWORD   SizeOfZeroFill;
-    DWORD   Characteristics;
-} IMAGE_TLS_DIRECTORY32;
-typedef IMAGE_TLS_DIRECTORY32 * PIMAGE_TLS_DIRECTORY32;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef IMAGE_THUNK_DATA32              IMAGE_THUNK_DATA;
-typedef PIMAGE_THUNK_DATA32             PIMAGE_THUNK_DATA;
-
-typedef IMAGE_TLS_DIRECTORY32           IMAGE_TLS_DIRECTORY;
-typedef PIMAGE_TLS_DIRECTORY32          PIMAGE_TLS_DIRECTORY;
-
-
-typedef struct _IMAGE_IMPORT_DESCRIPTOR {
-    union {
-        DWORD   Characteristics;            
-        DWORD   OriginalFirstThunk;         
-    };
-    DWORD   TimeDateStamp;                  
-                                            
-                                            
-                                            
-
-    DWORD   ForwarderChain;                 
-    DWORD   Name;
-    DWORD   FirstThunk;                     
-} IMAGE_IMPORT_DESCRIPTOR;
-typedef IMAGE_IMPORT_DESCRIPTOR  *PIMAGE_IMPORT_DESCRIPTOR;
-
-
-
-
-
-typedef struct _IMAGE_BOUND_IMPORT_DESCRIPTOR {
-    DWORD   TimeDateStamp;
-    WORD    OffsetModuleName;
-    WORD    NumberOfModuleForwarderRefs;
-
-} IMAGE_BOUND_IMPORT_DESCRIPTOR,  *PIMAGE_BOUND_IMPORT_DESCRIPTOR;
-
-typedef struct _IMAGE_BOUND_FORWARDER_REF {
-    DWORD   TimeDateStamp;
-    WORD    OffsetModuleName;
-    WORD    Reserved;
-} IMAGE_BOUND_FORWARDER_REF, *PIMAGE_BOUND_FORWARDER_REF;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_RESOURCE_DIRECTORY {
-    DWORD   Characteristics;
-    DWORD   TimeDateStamp;
-    WORD    MajorVersion;
-    WORD    MinorVersion;
-    WORD    NumberOfNamedEntries;
-    WORD    NumberOfIdEntries;
-
-} IMAGE_RESOURCE_DIRECTORY, *PIMAGE_RESOURCE_DIRECTORY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
-    union {
-        struct {
-            DWORD NameOffset:31;
-            DWORD NameIsString:1;
-        };
-        DWORD   Name;
-        WORD    Id;
-    };
-    union {
-        DWORD   OffsetToData;
-        struct {
-            DWORD   OffsetToDirectory:31;
-            DWORD   DataIsDirectory:1;
-        };
-    };
-} IMAGE_RESOURCE_DIRECTORY_ENTRY, *PIMAGE_RESOURCE_DIRECTORY_ENTRY;
-
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING {
-    WORD    Length;
-    CHAR    NameString[ 1 ];
-} IMAGE_RESOURCE_DIRECTORY_STRING, *PIMAGE_RESOURCE_DIRECTORY_STRING;
-
-
-typedef struct _IMAGE_RESOURCE_DIR_STRING_U {
-    WORD    Length;
-    WCHAR   NameString[ 1 ];
-} IMAGE_RESOURCE_DIR_STRING_U, *PIMAGE_RESOURCE_DIR_STRING_U;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
-    DWORD   OffsetToData;
-    DWORD   Size;
-    DWORD   CodePage;
-    DWORD   Reserved;
-} IMAGE_RESOURCE_DATA_ENTRY, *PIMAGE_RESOURCE_DATA_ENTRY;
-
-
-
-
-
-typedef struct {
-    DWORD   Size;
-    DWORD   TimeDateStamp;
-    WORD    MajorVersion;
-    WORD    MinorVersion;
-    DWORD   GlobalFlagsClear;
-    DWORD   GlobalFlagsSet;
-    DWORD   CriticalSectionDefaultTimeout;
-    DWORD   DeCommitFreeBlockThreshold;
-    DWORD   DeCommitTotalFreeThreshold;
-    DWORD   LockPrefixTable;            
-    DWORD   MaximumAllocationSize;
-    DWORD   VirtualMemoryThreshold;
-    DWORD   ProcessHeapFlags;
-    DWORD   ProcessAffinityMask;
-    WORD    CSDVersion;
-    WORD    Reserved1;
-    DWORD   EditList;                   
-    DWORD   SecurityCookie;             
-    DWORD   SEHandlerTable;             
-    DWORD   SEHandlerCount;
-} IMAGE_LOAD_CONFIG_DIRECTORY32, *PIMAGE_LOAD_CONFIG_DIRECTORY32;
-
-typedef struct {
-    DWORD      Size;
-    DWORD      TimeDateStamp;
-    WORD       MajorVersion;
-    WORD       MinorVersion;
-    DWORD      GlobalFlagsClear;
-    DWORD      GlobalFlagsSet;
-    DWORD      CriticalSectionDefaultTimeout;
-    ULONGLONG  DeCommitFreeBlockThreshold;
-    ULONGLONG  DeCommitTotalFreeThreshold;
-    ULONGLONG  LockPrefixTable;         
-    ULONGLONG  MaximumAllocationSize;
-    ULONGLONG  VirtualMemoryThreshold;
-    ULONGLONG  ProcessAffinityMask;
-    DWORD      ProcessHeapFlags;
-    WORD       CSDVersion;
-    WORD       Reserved1;
-    ULONGLONG  EditList;                
-    ULONGLONG  SecurityCookie;          
-    ULONGLONG  SEHandlerTable;          
-    ULONGLONG  SEHandlerCount;
-} IMAGE_LOAD_CONFIG_DIRECTORY64, *PIMAGE_LOAD_CONFIG_DIRECTORY64;
-
-
-
-
-
-typedef IMAGE_LOAD_CONFIG_DIRECTORY32     IMAGE_LOAD_CONFIG_DIRECTORY;
-typedef PIMAGE_LOAD_CONFIG_DIRECTORY32    PIMAGE_LOAD_CONFIG_DIRECTORY;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_CE_RUNTIME_FUNCTION_ENTRY {
-    DWORD FuncStart;
-    DWORD PrologLen : 8;
-    DWORD FuncLen : 22;
-    DWORD ThirtyTwoBit : 1;
-    DWORD ExceptionFlag : 1;
-} IMAGE_CE_RUNTIME_FUNCTION_ENTRY, * PIMAGE_CE_RUNTIME_FUNCTION_ENTRY;
-
-typedef struct _IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY {
-    ULONGLONG BeginAddress;
-    ULONGLONG EndAddress;
-    ULONGLONG ExceptionHandler;
-    ULONGLONG HandlerData;
-    ULONGLONG PrologEndAddress;
-} IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY, *PIMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY;
-
-typedef struct _IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY {
-    DWORD BeginAddress;
-    DWORD EndAddress;
-    DWORD ExceptionHandler;
-    DWORD HandlerData;
-    DWORD PrologEndAddress;
-} IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY, *PIMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY;
-
-typedef struct _IMAGE_RUNTIME_FUNCTION_ENTRY {
-    DWORD BeginAddress;
-    DWORD EndAddress;
-    DWORD UnwindInfoAddress;
-} _IMAGE_RUNTIME_FUNCTION_ENTRY, *_PIMAGE_RUNTIME_FUNCTION_ENTRY;
-
-typedef  _IMAGE_RUNTIME_FUNCTION_ENTRY  IMAGE_IA64_RUNTIME_FUNCTION_ENTRY;
-typedef _PIMAGE_RUNTIME_FUNCTION_ENTRY PIMAGE_IA64_RUNTIME_FUNCTION_ENTRY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef  _IMAGE_RUNTIME_FUNCTION_ENTRY  IMAGE_RUNTIME_FUNCTION_ENTRY;
-typedef _PIMAGE_RUNTIME_FUNCTION_ENTRY PIMAGE_RUNTIME_FUNCTION_ENTRY;
-
-
-
-
-
-
-
-typedef struct _IMAGE_DEBUG_DIRECTORY {
-    DWORD   Characteristics;
-    DWORD   TimeDateStamp;
-    WORD    MajorVersion;
-    WORD    MinorVersion;
-    DWORD   Type;
-    DWORD   SizeOfData;
-    DWORD   AddressOfRawData;
-    DWORD   PointerToRawData;
-} IMAGE_DEBUG_DIRECTORY, *PIMAGE_DEBUG_DIRECTORY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_COFF_SYMBOLS_HEADER {
-    DWORD   NumberOfSymbols;
-    DWORD   LvaToFirstSymbol;
-    DWORD   NumberOfLinenumbers;
-    DWORD   LvaToFirstLinenumber;
-    DWORD   RvaToFirstByteOfCode;
-    DWORD   RvaToLastByteOfCode;
-    DWORD   RvaToFirstByteOfData;
-    DWORD   RvaToLastByteOfData;
-} IMAGE_COFF_SYMBOLS_HEADER, *PIMAGE_COFF_SYMBOLS_HEADER;
-
-
-
-
-
-
-typedef struct _FPO_DATA {
-    DWORD       ulOffStart;             
-    DWORD       cbProcSize;             
-    DWORD       cdwLocals;              
-    WORD        cdwParams;              
-    WORD        cbProlog : 8;           
-    WORD        cbRegs   : 3;           
-    WORD        fHasSEH  : 1;           
-    WORD        fUseBP   : 1;           
-    WORD        reserved : 1;           
-    WORD        cbFrame  : 2;           
-} FPO_DATA, *PFPO_DATA;
-
-
-
-
-
-typedef struct _IMAGE_DEBUG_MISC {
-    DWORD       DataType;               
-    DWORD       Length;                 
-                                        
-    BOOLEAN     Unicode;                
-    BYTE        Reserved[ 3 ];
-    BYTE        Data[ 1 ];              
-} IMAGE_DEBUG_MISC, *PIMAGE_DEBUG_MISC;
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_FUNCTION_ENTRY {
-    DWORD   StartingAddress;
-    DWORD   EndingAddress;
-    DWORD   EndOfPrologue;
-} IMAGE_FUNCTION_ENTRY, *PIMAGE_FUNCTION_ENTRY;
-
-typedef struct _IMAGE_FUNCTION_ENTRY64 {
-    ULONGLONG   StartingAddress;
-    ULONGLONG   EndingAddress;
-    union {
-        ULONGLONG   EndOfPrologue;
-        ULONGLONG   UnwindInfoAddress;
-    };
-} IMAGE_FUNCTION_ENTRY64, *PIMAGE_FUNCTION_ENTRY64;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _IMAGE_SEPARATE_DEBUG_HEADER {
-    WORD        Signature;
-    WORD        Flags;
-    WORD        Machine;
-    WORD        Characteristics;
-    DWORD       TimeDateStamp;
-    DWORD       CheckSum;
-    DWORD       ImageBase;
-    DWORD       SizeOfImage;
-    DWORD       NumberOfSections;
-    DWORD       ExportedNamesSize;
-    DWORD       DebugDirectorySize;
-    DWORD       SectionAlignment;
-    DWORD       Reserved[2];
-} IMAGE_SEPARATE_DEBUG_HEADER, *PIMAGE_SEPARATE_DEBUG_HEADER;
-
-typedef struct _NON_PAGED_DEBUG_INFO {
-    WORD        Signature;
-    WORD        Flags;
-    DWORD       Size;
-    WORD        Machine;
-    WORD        Characteristics;
-    DWORD       TimeDateStamp;
-    DWORD       CheckSum;
-    DWORD       SizeOfImage;
-    ULONGLONG   ImageBase;
-    
-    
-} NON_PAGED_DEBUG_INFO, *PNON_PAGED_DEBUG_INFO;
-
-
-
-
-
-
-
-
-
-
-
-                                                
-
-
-
-
-
-
-
-
-
-typedef struct _ImageArchitectureHeader {
-    unsigned int AmaskValue: 1;                 
-                                                
-    int :7;                                     
-    unsigned int AmaskShift: 8;                 
-    int :16;                                    
-    DWORD FirstEntryRVA;                        
-} IMAGE_ARCHITECTURE_HEADER, *PIMAGE_ARCHITECTURE_HEADER;
-
-typedef struct _ImageArchitectureEntry {
-    DWORD FixupInstRVA;                         
-    DWORD NewInst;                              
-} IMAGE_ARCHITECTURE_ENTRY, *PIMAGE_ARCHITECTURE_ENTRY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct IMPORT_OBJECT_HEADER {
-    WORD    Sig1;                       
-    WORD    Sig2;                       
-    WORD    Version;
-    WORD    Machine;
-    DWORD   TimeDateStamp;              
-    DWORD   SizeOfData;                 
-
-    union {
-        WORD    Ordinal;                
-        WORD    Hint;
-    };
-
-    WORD    Type : 2;                   
-    WORD    NameType : 3;               
-    WORD    Reserved : 11;              
-} IMPORT_OBJECT_HEADER;
-
-typedef enum IMPORT_OBJECT_TYPE
-{
-    IMPORT_OBJECT_CODE = 0,
-    IMPORT_OBJECT_DATA = 1,
-    IMPORT_OBJECT_CONST = 2,
-} IMPORT_OBJECT_TYPE;
-
-typedef enum IMPORT_OBJECT_NAME_TYPE
-{
-    IMPORT_OBJECT_ORDINAL = 0,          
-    IMPORT_OBJECT_NAME = 1,             
-    IMPORT_OBJECT_NAME_NO_PREFIX = 2,   
-    IMPORT_OBJECT_NAME_UNDECORATE = 3,  
-                                        
-} IMPORT_OBJECT_NAME_TYPE;
-
-
-
-
-
-typedef enum ReplacesCorHdrNumericDefines
-{
-
-    COMIMAGE_FLAGS_ILONLY               =0x00000001,
-    COMIMAGE_FLAGS_32BITREQUIRED        =0x00000002,
-    COMIMAGE_FLAGS_IL_LIBRARY           =0x00000004,
-    COMIMAGE_FLAGS_STRONGNAMESIGNED     =0x00000008,
-    COMIMAGE_FLAGS_TRACKDEBUGDATA       =0x00010000,
-
-
-    COR_VERSION_MAJOR_V2                =2,
-    COR_VERSION_MAJOR                   =COR_VERSION_MAJOR_V2,
-    COR_VERSION_MINOR                   =0,
-    COR_DELETED_NAME_LENGTH             =8,
-    COR_VTABLEGAP_NAME_LENGTH           =8,
-
-
-    NATIVE_TYPE_MAX_CB                  =1,   
-    COR_ILMETHOD_SECT_SMALL_MAX_DATASIZE=0xFF,
-
-
-    IMAGE_COR_MIH_METHODRVA             =0x01,
-    IMAGE_COR_MIH_EHRVA                 =0x02,    
-    IMAGE_COR_MIH_BASICBLOCK            =0x08,
-
-
-    COR_VTABLE_32BIT                    =0x01,          
-    COR_VTABLE_64BIT                    =0x02,          
-    COR_VTABLE_FROM_UNMANAGED           =0x04,          
-    COR_VTABLE_CALL_MOST_DERIVED        =0x10,          
-
-
-    IMAGE_COR_EATJ_THUNK_SIZE           =32,            
-
-
-    
-    MAX_CLASS_NAME                      =1024,
-    MAX_PACKAGE_NAME                    =1024,
-} ReplacesCorHdrNumericDefines;
-
-
-typedef struct IMAGE_COR20_HEADER
-{
-    
-    DWORD                   cb;              
-    WORD                    MajorRuntimeVersion;
-    WORD                    MinorRuntimeVersion;
-    
-    
-    IMAGE_DATA_DIRECTORY    MetaData;        
-    DWORD                   Flags;           
-    DWORD                   EntryPointToken;
-    
-    
-    IMAGE_DATA_DIRECTORY    Resources;
-    IMAGE_DATA_DIRECTORY    StrongNameSignature;
-
-    
-    IMAGE_DATA_DIRECTORY    CodeManagerTable;
-    IMAGE_DATA_DIRECTORY    VTableFixups;
-    IMAGE_DATA_DIRECTORY    ExportAddressTableJumps;
-
-    
-    IMAGE_DATA_DIRECTORY    ManagedNativeHeader;
-    
-} IMAGE_COR20_HEADER, *PIMAGE_COR20_HEADER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef union _SLIST_HEADER {
-    ULONGLONG Alignment;
-    struct {
-        SINGLE_LIST_ENTRY Next;
-        WORD   Depth;
-        WORD   Sequence;
-    };
-} SLIST_HEADER, *PSLIST_HEADER;
-
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-RtlInitializeSListHead (
-     PSLIST_HEADER ListHead
-    );
-
-__declspec(dllimport)
-PSINGLE_LIST_ENTRY
-__stdcall
-RtlFirstEntrySList (
-     const SLIST_HEADER *ListHead
-    );
-
-__declspec(dllimport)
-PSINGLE_LIST_ENTRY
-__stdcall
-RtlInterlockedPopEntrySList (
-     PSLIST_HEADER ListHead
-    );
-
-__declspec(dllimport)
-PSINGLE_LIST_ENTRY
-__stdcall
-RtlInterlockedPushEntrySList (
-     PSLIST_HEADER ListHead,
-     PSINGLE_LIST_ENTRY ListEntry
-    );
-
-__declspec(dllimport)
-PSINGLE_LIST_ENTRY
-__stdcall
-RtlInterlockedFlushSList (
-     PSLIST_HEADER ListHead
-    );
-
-__declspec(dllimport)
-WORD  
-__stdcall
-RtlQueryDepthSList (
-     PSLIST_HEADER ListHead
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-RtlCaptureContext (
-     PCONTEXT ContextRecord
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-SIZE_T
-__stdcall
-RtlCompareMemory (
-    const void *Source1,
-    const void *Source2,
-    SIZE_T Length
-    );
-
-
-
-
-
-
-
-
-
-
-
-__forceinline
-PVOID
-RtlSecureZeroMemory(
-     PVOID ptr,
-     SIZE_T cnt
-    )
-{
-    volatile char *vptr = (volatile char *)ptr;
-
-
-
-
-
-
-
-    while (cnt) {
-        *vptr = 0;
-        vptr++;
-        cnt--;
-    }
-
-
-
-    return ptr;
-}
-
-
-
-
-typedef struct _MESSAGE_RESOURCE_ENTRY {
-    WORD   Length;
-    WORD   Flags;
-    BYTE  Text[ 1 ];
-} MESSAGE_RESOURCE_ENTRY, *PMESSAGE_RESOURCE_ENTRY;
-
-
-
-typedef struct _MESSAGE_RESOURCE_BLOCK {
-    DWORD LowId;
-    DWORD HighId;
-    DWORD OffsetToEntries;
-} MESSAGE_RESOURCE_BLOCK, *PMESSAGE_RESOURCE_BLOCK;
-
-typedef struct _MESSAGE_RESOURCE_DATA {
-    DWORD NumberOfBlocks;
-    MESSAGE_RESOURCE_BLOCK Blocks[ 1 ];
-} MESSAGE_RESOURCE_DATA, *PMESSAGE_RESOURCE_DATA;
-
-typedef struct _OSVERSIONINFOA {
-    DWORD dwOSVersionInfoSize;
-    DWORD dwMajorVersion;
-    DWORD dwMinorVersion;
-    DWORD dwBuildNumber;
-    DWORD dwPlatformId;
-    CHAR   szCSDVersion[ 128 ];     
-} OSVERSIONINFOA, *POSVERSIONINFOA, *LPOSVERSIONINFOA;
-
-typedef struct _OSVERSIONINFOW {
-    DWORD dwOSVersionInfoSize;
-    DWORD dwMajorVersion;
-    DWORD dwMinorVersion;
-    DWORD dwBuildNumber;
-    DWORD dwPlatformId;
-    WCHAR  szCSDVersion[ 128 ];     
-} OSVERSIONINFOW, *POSVERSIONINFOW, *LPOSVERSIONINFOW, RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;
-
-typedef OSVERSIONINFOW OSVERSIONINFO;
-typedef POSVERSIONINFOW POSVERSIONINFO;
-typedef LPOSVERSIONINFOW LPOSVERSIONINFO;
-
-
-
-
-
-
-typedef struct _OSVERSIONINFOEXA {
-    DWORD dwOSVersionInfoSize;
-    DWORD dwMajorVersion;
-    DWORD dwMinorVersion;
-    DWORD dwBuildNumber;
-    DWORD dwPlatformId;
-    CHAR   szCSDVersion[ 128 ];     
-    WORD   wServicePackMajor;
-    WORD   wServicePackMinor;
-    WORD   wSuiteMask;
-    BYTE  wProductType;
-    BYTE  wReserved;
-} OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA;
-typedef struct _OSVERSIONINFOEXW {
-    DWORD dwOSVersionInfoSize;
-    DWORD dwMajorVersion;
-    DWORD dwMinorVersion;
-    DWORD dwBuildNumber;
-    DWORD dwPlatformId;
-    WCHAR  szCSDVersion[ 128 ];     
-    WORD   wServicePackMajor;
-    WORD   wServicePackMinor;
-    WORD   wSuiteMask;
-    BYTE  wProductType;
-    BYTE  wReserved;
-} OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW, RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;
-
-typedef OSVERSIONINFOEXW OSVERSIONINFOEX;
-typedef POSVERSIONINFOEXW POSVERSIONINFOEX;
-typedef LPOSVERSIONINFOEXW LPOSVERSIONINFOEX;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-ULONGLONG
-__stdcall
-VerSetConditionMask(
-          ULONGLONG   ConditionMask,
-          DWORD   TypeMask,
-          BYTE    Condition
-        );
-
-
-typedef struct _RTL_CRITICAL_SECTION_DEBUG {
-    WORD   Type;
-    WORD   CreatorBackTraceIndex;
-    struct _RTL_CRITICAL_SECTION *CriticalSection;
-    LIST_ENTRY ProcessLocksList;
-    DWORD EntryCount;
-    DWORD ContentionCount;
-    DWORD Spare[ 2 ];
-} RTL_CRITICAL_SECTION_DEBUG, *PRTL_CRITICAL_SECTION_DEBUG, RTL_RESOURCE_DEBUG, *PRTL_RESOURCE_DEBUG;
-
-
-
-
-typedef struct _RTL_CRITICAL_SECTION {
-    PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
-
-    
-    
-    
-    
-
-    LONG LockCount;
-    LONG RecursionCount;
-    HANDLE OwningThread;        
-    HANDLE LockSemaphore;
-    ULONG_PTR SpinCount;        
-} RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;
-
-typedef void (__stdcall * RTL_VERIFIER_DLL_LOAD_CALLBACK) (
-    PWSTR DllName,
-    PVOID DllBase,
-    SIZE_T DllSize,
-    PVOID Reserved
-    );
-
-typedef void (__stdcall * RTL_VERIFIER_DLL_UNLOAD_CALLBACK) (
-    PWSTR DllName,
-    PVOID DllBase,
-    SIZE_T DllSize,
-    PVOID Reserved
-    );
-
-typedef void (__stdcall * RTL_VERIFIER_NTDLLHEAPFREE_CALLBACK) (
-    PVOID AllocationBase,
-    SIZE_T AllocationSize
-    );
-
-typedef struct _RTL_VERIFIER_THUNK_DESCRIPTOR {
-
-    PCHAR ThunkName;
-    PVOID ThunkOldAddress;
-    PVOID ThunkNewAddress;
-
-} RTL_VERIFIER_THUNK_DESCRIPTOR, *PRTL_VERIFIER_THUNK_DESCRIPTOR;
-
-typedef struct _RTL_VERIFIER_DLL_DESCRIPTOR {
-
-    PWCHAR DllName;
-    DWORD DllFlags;
-    PVOID DllAddress;
-    PRTL_VERIFIER_THUNK_DESCRIPTOR DllThunks;
-
-} RTL_VERIFIER_DLL_DESCRIPTOR, *PRTL_VERIFIER_DLL_DESCRIPTOR;
-
-typedef struct _RTL_VERIFIER_PROVIDER_DESCRIPTOR {
-
-    
-    
-    
-
-    DWORD Length;        
-    PRTL_VERIFIER_DLL_DESCRIPTOR ProviderDlls;
-    RTL_VERIFIER_DLL_LOAD_CALLBACK ProviderDllLoadCallback;
-    RTL_VERIFIER_DLL_UNLOAD_CALLBACK ProviderDllUnloadCallback;
-    
-    
-    
-    
-        
-    PWSTR VerifierImage;
-    DWORD VerifierFlags;
-    DWORD VerifierDebug;
-    
-    PVOID RtlpGetStackTraceAddress;
-    PVOID RtlpDebugPageHeapCreate;
-    PVOID RtlpDebugPageHeapDestroy;
-
-    
-    
-    
-    
-    RTL_VERIFIER_NTDLLHEAPFREE_CALLBACK ProviderNtdllHeapFreeCallback;
-
-} RTL_VERIFIER_PROVIDER_DESCRIPTOR, *PRTL_VERIFIER_PROVIDER_DESCRIPTOR;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-void
-__stdcall
-RtlApplicationVerifierStop (
-         ULONG_PTR Code,
-         PSTR Message,
-         ULONG_PTR Param1,
-         PSTR Description1,
-         ULONG_PTR Param2,
-         PSTR Description2,
-         ULONG_PTR Param3,
-         PSTR Description3,
-         ULONG_PTR Param4,
-         PSTR Description4
-    );
-
-typedef LONG (__stdcall *PVECTORED_EXCEPTION_HANDLER)(
-    struct _EXCEPTION_POINTERS *ExceptionInfo
-    );
-
-
-
-
-
-
-
-
-typedef enum _HEAP_INFORMATION_CLASS {
-
-    HeapCompatibilityInformation
-
-} HEAP_INFORMATION_CLASS;
-
-__declspec(dllimport)
-DWORD   
-__stdcall
-RtlSetHeapInformation (
-     PVOID HeapHandle,
-     HEAP_INFORMATION_CLASS HeapInformationClass,
-     PVOID HeapInformation ,
-     SIZE_T HeapInformationLength 
-    );
-
-__declspec(dllimport)
-DWORD   
-__stdcall
-RtlQueryHeapInformation (
-     PVOID HeapHandle,
-     HEAP_INFORMATION_CLASS HeapInformationClass,
-     PVOID HeapInformation ,
-     SIZE_T HeapInformationLength ,
-     PSIZE_T ReturnLength 
-    );
-
-
-
-
-
-DWORD
-__stdcall
-RtlMultipleAllocateHeap (
-     PVOID HeapHandle,
-     DWORD Flags,
-     SIZE_T Size,
-     DWORD Count,
-     PVOID * Array
-    );
-
-DWORD
-__stdcall
-RtlMultipleFreeHeap (
-     PVOID HeapHandle,
-     DWORD Flags,
-     DWORD Count,
-     PVOID * Array
-    );
-    
-
-
-
-
-
-
-
-
-
-
-
-typedef void (__stdcall * WAITORTIMERCALLBACKFUNC) (PVOID, BOOLEAN );   
-typedef void (__stdcall * WORKERCALLBACKFUNC) (PVOID );                 
-typedef void (__stdcall * APC_CALLBACK_FUNCTION) (DWORD   , PVOID, PVOID); 
-typedef
-void
-(__stdcall *PFLS_CALLBACK_FUNCTION) (
-     PVOID lpFlsData
-    );
-
-
-
-typedef enum _ACTIVATION_CONTEXT_INFO_CLASS {
-    ActivationContextBasicInformation                       = 1,
-    ActivationContextDetailedInformation                    = 2,
-    AssemblyDetailedInformationInActivationContext          = 3,
-    FileInformationInAssemblyOfAssemblyInActivationContext  = 4,
-    MaxActivationContextInfoClass,
-
-    
-    
-    
-    AssemblyDetailedInformationInActivationContxt           = 3,
-    FileInformationInAssemblyOfAssemblyInActivationContxt   = 4
-} ACTIVATION_CONTEXT_INFO_CLASS;
-
-
-
-
-typedef struct _ACTIVATION_CONTEXT_QUERY_INDEX {
-    DWORD ulAssemblyIndex; 
-    DWORD ulFileIndexInAssembly; 
-} ACTIVATION_CONTEXT_QUERY_INDEX, * PACTIVATION_CONTEXT_QUERY_INDEX;
-
-typedef const struct _ACTIVATION_CONTEXT_QUERY_INDEX * PCACTIVATION_CONTEXT_QUERY_INDEX;
-
-
-
-
-
-
-
-typedef struct _ASSEMBLY_FILE_DETAILED_INFORMATION {
-    DWORD ulFlags;
-    DWORD ulFilenameLength;
-    DWORD ulPathLength; 
-
-    PCWSTR lpFileName;
-    PCWSTR lpFilePath;   
-} ASSEMBLY_FILE_DETAILED_INFORMATION, *PASSEMBLY_FILE_DETAILED_INFORMATION;
-typedef const ASSEMBLY_FILE_DETAILED_INFORMATION *PCASSEMBLY_FILE_DETAILED_INFORMATION;
-
-
-
-
-
-
-
-
-
-
-typedef struct _ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION {
-    DWORD ulFlags;
-    DWORD ulEncodedAssemblyIdentityLength;      
-    DWORD ulManifestPathType;                   
-    DWORD ulManifestPathLength;                 
-    LARGE_INTEGER liManifestLastWriteTime;      
-    DWORD ulPolicyPathType;                     
-    DWORD ulPolicyPathLength;                   
-    LARGE_INTEGER liPolicyLastWriteTime;        
-    DWORD ulMetadataSatelliteRosterIndex;
-    
-    DWORD ulManifestVersionMajor;               
-    DWORD ulManifestVersionMinor;               
-    DWORD ulPolicyVersionMajor;                 
-    DWORD ulPolicyVersionMinor;                 
-    DWORD ulAssemblyDirectoryNameLength;        
-
-    PCWSTR lpAssemblyEncodedAssemblyIdentity;
-    PCWSTR lpAssemblyManifestPath;
-    PCWSTR lpAssemblyPolicyPath;
-    PCWSTR lpAssemblyDirectoryName;
-
-    DWORD  ulFileCount;
-} ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION, * PACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION;
-
-typedef const struct _ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION * PCACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION ;
-
-typedef struct _ACTIVATION_CONTEXT_DETAILED_INFORMATION {
-    DWORD dwFlags;
-    DWORD ulFormatVersion;
-    DWORD ulAssemblyCount;
-    DWORD ulRootManifestPathType;
-    DWORD ulRootManifestPathChars;
-    DWORD ulRootConfigurationPathType;
-    DWORD ulRootConfigurationPathChars;
-    DWORD ulAppDirPathType;
-    DWORD ulAppDirPathChars;
-    PCWSTR lpRootManifestPath;
-    PCWSTR lpRootConfigurationPath;
-    PCWSTR lpAppDirPath;
-} ACTIVATION_CONTEXT_DETAILED_INFORMATION, *PACTIVATION_CONTEXT_DETAILED_INFORMATION;
-
-typedef const struct _ACTIVATION_CONTEXT_DETAILED_INFORMATION *PCACTIVATION_CONTEXT_DETAILED_INFORMATION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _EVENTLOGRECORD {
-    DWORD  Length;        
-    DWORD  Reserved;      
-    DWORD  RecordNumber;  
-    DWORD  TimeGenerated; 
-    DWORD  TimeWritten;   
-    DWORD  EventID;
-    WORD   EventType;
-    WORD   NumStrings;
-    WORD   EventCategory;
-    WORD   ReservedFlags; 
-    DWORD  ClosingRecordNumber; 
-    DWORD  StringOffset;  
-    DWORD  UserSidLength;
-    DWORD  UserSidOffset;
-    DWORD  DataLength;
-    DWORD  DataOffset;    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-} EVENTLOGRECORD, *PEVENTLOGRECORD;
-
-
-
-
-
-
-#pragma warning(push)
-
-#pragma warning(disable : 4200)
-typedef struct _EVENTSFORLOGFILE{
-	DWORD			ulSize;
-    WCHAR   		szLogicalLogFile[256];        
-    DWORD			ulNumRecords;
-	EVENTLOGRECORD 	pEventLogRecords[];
-}EVENTSFORLOGFILE, *PEVENTSFORLOGFILE;
-
-typedef struct _PACKEDEVENTINFO{
-    DWORD               ulSize;  
-    DWORD               ulNumEventsForLogFile; 
-    DWORD 				ulOffsets[];           
-}PACKEDEVENTINFO, *PPACKEDEVENTINFO;
-
-
-#pragma warning(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                                    
-
-
-                                                    
-
-
-                                                    
-
-
-                                                    
-                                                    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                            
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _CM_SERVICE_NODE_TYPE {
-    DriverType               = 0x00000001,
-    FileSystemType           = 0x00000002,
-    Win32ServiceOwnProcess   = 0x00000010,
-    Win32ServiceShareProcess = 0x00000020,
-    AdapterType              = 0x00000004,
-    RecognizerType           = 0x00000008
-} SERVICE_NODE_TYPE;
-
-typedef enum _CM_SERVICE_LOAD_TYPE {
-    BootLoad    = 0x00000000,
-    SystemLoad  = 0x00000001,
-    AutoLoad    = 0x00000002,
-    DemandLoad  = 0x00000003,
-    DisableLoad = 0x00000004
-} SERVICE_LOAD_TYPE;
-
-typedef enum _CM_ERROR_CONTROL_TYPE {
-    IgnoreError   = 0x00000000,
-    NormalError   = 0x00000001,
-    SevereError   = 0x00000002,
-    CriticalError = 0x00000003
-} SERVICE_ERROR_TYPE;
-
-
-
-
-
-
-
-
-
-
-typedef struct _TAPE_ERASE {
-    DWORD Type;
-    BOOLEAN Immediate;
-} TAPE_ERASE, *PTAPE_ERASE;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _TAPE_PREPARE {
-    DWORD Operation;
-    BOOLEAN Immediate;
-} TAPE_PREPARE, *PTAPE_PREPARE;
-
-
-
-
-
-
-
-
-
-
-typedef struct _TAPE_WRITE_MARKS {
-    DWORD Type;
-    DWORD Count;
-    BOOLEAN Immediate;
-} TAPE_WRITE_MARKS, *PTAPE_WRITE_MARKS;
-
-
-
-
-
-
-
-
-
-typedef struct _TAPE_GET_POSITION {
-    DWORD Type;
-    DWORD Partition;
-    LARGE_INTEGER Offset;
-} TAPE_GET_POSITION, *PTAPE_GET_POSITION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _TAPE_SET_POSITION {
-    DWORD Method;
-    DWORD Partition;
-    LARGE_INTEGER Offset;
-    BOOLEAN Immediate;
-} TAPE_SET_POSITION, *PTAPE_SET_POSITION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _TAPE_GET_DRIVE_PARAMETERS {
-    BOOLEAN ECC;
-    BOOLEAN Compression;
-    BOOLEAN DataPadding;
-    BOOLEAN ReportSetmarks;
-    DWORD DefaultBlockSize;
-    DWORD MaximumBlockSize;
-    DWORD MinimumBlockSize;
-    DWORD MaximumPartitionCount;
-    DWORD FeaturesLow;
-    DWORD FeaturesHigh;
-    DWORD EOTWarningZoneSize;
-} TAPE_GET_DRIVE_PARAMETERS, *PTAPE_GET_DRIVE_PARAMETERS;
-
-
-
-
-
-typedef struct _TAPE_SET_DRIVE_PARAMETERS {
-    BOOLEAN ECC;
-    BOOLEAN Compression;
-    BOOLEAN DataPadding;
-    BOOLEAN ReportSetmarks;
-    DWORD EOTWarningZoneSize;
-} TAPE_SET_DRIVE_PARAMETERS, *PTAPE_SET_DRIVE_PARAMETERS;
-
-
-
-
-
-typedef struct _TAPE_GET_MEDIA_PARAMETERS {
-    LARGE_INTEGER Capacity;
-    LARGE_INTEGER Remaining;
-    DWORD BlockSize;
-    DWORD PartitionCount;
-    BOOLEAN WriteProtected;
-} TAPE_GET_MEDIA_PARAMETERS, *PTAPE_GET_MEDIA_PARAMETERS;
-
-
-
-
-
-typedef struct _TAPE_SET_MEDIA_PARAMETERS {
-    DWORD BlockSize;
-} TAPE_SET_MEDIA_PARAMETERS, *PTAPE_SET_MEDIA_PARAMETERS;
-
-
-
-
-
-
-
-
-
-typedef struct _TAPE_CREATE_PARTITION {
-    DWORD Method;
-    DWORD Count;
-    DWORD Size;
-} TAPE_CREATE_PARTITION, *PTAPE_CREATE_PARTITION;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _TAPE_WMI_OPERATIONS {
-   DWORD Method;
-   DWORD DataBufferSize;
-   PVOID DataBuffer;
-} TAPE_WMI_OPERATIONS, *PTAPE_WMI_OPERATIONS;
-
-
-
-
-typedef enum _TAPE_DRIVE_PROBLEM_TYPE {
-   TapeDriveProblemNone, TapeDriveReadWriteWarning,
-   TapeDriveReadWriteError, TapeDriveReadWarning,
-   TapeDriveWriteWarning, TapeDriveReadError,
-   TapeDriveWriteError, TapeDriveHardwareError,
-   TapeDriveUnsupportedMedia, TapeDriveScsiConnectionError,
-   TapeDriveTimetoClean, TapeDriveCleanDriveNow,
-   TapeDriveMediaLifeExpired, TapeDriveSnappedTape
-} TAPE_DRIVE_PROBLEM_TYPE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__inline struct _TEB * NtCurrentTeb( void ) { return (struct _TEB *) (ULONG_PTR) __readfsdword (0x18); }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-typedef UINT_PTR            WPARAM;
-typedef LONG_PTR            LPARAM;
-typedef LONG_PTR            LRESULT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct HWND__ { int unused; }; typedef struct HWND__ *HWND;
-struct HHOOK__ { int unused; }; typedef struct HHOOK__ *HHOOK;
-
-
-
-
-
-typedef WORD                ATOM;
-
-typedef HANDLE          *SPHANDLE;
-typedef HANDLE           *LPHANDLE;
-typedef HANDLE              HGLOBAL;
-typedef HANDLE              HLOCAL;
-typedef HANDLE              GLOBALHANDLE;
-typedef HANDLE              LOCALHANDLE;
-
-
-
-
-
-
-typedef int ( __stdcall *FARPROC)();
-typedef int ( __stdcall *NEARPROC)();
-typedef int (__stdcall *PROC)();
-
-
-
-
-
-
-
-
-
-typedef void * HGDIOBJ;
-
-
-
-
-
-struct HKEY__ { int unused; }; typedef struct HKEY__ *HKEY;
-typedef HKEY *PHKEY;
-
-
-struct HACCEL__ { int unused; }; typedef struct HACCEL__ *HACCEL;
-
-
-struct HBITMAP__ { int unused; }; typedef struct HBITMAP__ *HBITMAP;
-struct HBRUSH__ { int unused; }; typedef struct HBRUSH__ *HBRUSH;
-
-
-struct HCOLORSPACE__ { int unused; }; typedef struct HCOLORSPACE__ *HCOLORSPACE;
-
-
-struct HDC__ { int unused; }; typedef struct HDC__ *HDC;
-
-struct HGLRC__ { int unused; }; typedef struct HGLRC__ *HGLRC;          
-struct HDESK__ { int unused; }; typedef struct HDESK__ *HDESK;
-struct HENHMETAFILE__ { int unused; }; typedef struct HENHMETAFILE__ *HENHMETAFILE;
-
-struct HFONT__ { int unused; }; typedef struct HFONT__ *HFONT;
-
-struct HICON__ { int unused; }; typedef struct HICON__ *HICON;
-
-struct HMENU__ { int unused; }; typedef struct HMENU__ *HMENU;
-
-struct HMETAFILE__ { int unused; }; typedef struct HMETAFILE__ *HMETAFILE;
-struct HINSTANCE__ { int unused; }; typedef struct HINSTANCE__ *HINSTANCE;
-typedef HINSTANCE HMODULE;      
-
-struct HPALETTE__ { int unused; }; typedef struct HPALETTE__ *HPALETTE;
-struct HPEN__ { int unused; }; typedef struct HPEN__ *HPEN;
-
-struct HRGN__ { int unused; }; typedef struct HRGN__ *HRGN;
-struct HRSRC__ { int unused; }; typedef struct HRSRC__ *HRSRC;
-struct HSTR__ { int unused; }; typedef struct HSTR__ *HSTR;
-struct HTASK__ { int unused; }; typedef struct HTASK__ *HTASK;
-struct HWINSTA__ { int unused; }; typedef struct HWINSTA__ *HWINSTA;
-struct HKL__ { int unused; }; typedef struct HKL__ *HKL;
-
-
-
-struct HMONITOR__ { int unused; }; typedef struct HMONITOR__ *HMONITOR;
-struct HWINEVENTHOOK__ { int unused; }; typedef struct HWINEVENTHOOK__ *HWINEVENTHOOK;
-
-struct HUMPD__ { int unused; }; typedef struct HUMPD__ *HUMPD;
-
-
-
-typedef int HFILE;
-typedef HICON HCURSOR;      
-
-
-
-
-
-typedef DWORD   COLORREF;
-typedef DWORD   *LPCOLORREF;
-
-
-
-typedef struct tagRECT
-{
-    LONG    left;
-    LONG    top;
-    LONG    right;
-    LONG    bottom;
-} RECT, *PRECT,  *NPRECT,  *LPRECT;
-
-typedef const RECT * LPCRECT;
-
-typedef struct _RECTL       
-{
-    LONG    left;
-    LONG    top;
-    LONG    right;
-    LONG    bottom;
-} RECTL, *PRECTL, *LPRECTL;
-
-typedef const RECTL * LPCRECTL;
-
-typedef struct tagPOINT
-{
-    LONG  x;
-    LONG  y;
-} POINT, *PPOINT,  *NPPOINT,  *LPPOINT;
-
-typedef struct _POINTL      
-{
-    LONG  x;
-    LONG  y;
-} POINTL, *PPOINTL;
-
-typedef struct tagSIZE
-{
-    LONG        cx;
-    LONG        cy;
-} SIZE, *PSIZE, *LPSIZE;
-
-typedef SIZE               SIZEL;
-typedef SIZE               *PSIZEL, *LPSIZEL;
-
-typedef struct tagPOINTS
-{
-
-    SHORT   x;
-    SHORT   y;
-
-
-
-
-} POINTS, *PPOINTS, *LPPOINTS;
-
-
-
-
-
-typedef struct _FILETIME {
-    DWORD dwLowDateTime;
-    DWORD dwHighDateTime;
-} FILETIME, *PFILETIME, *LPFILETIME;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _OVERLAPPED {
-    ULONG_PTR Internal;
-    ULONG_PTR InternalHigh;
-    union {
-        struct {
-            DWORD Offset;
-            DWORD OffsetHigh;
-        };
-
-        PVOID Pointer;
-    };
-
-    HANDLE  hEvent;
-} OVERLAPPED, *LPOVERLAPPED;
-
-typedef struct _SECURITY_ATTRIBUTES {
-    DWORD nLength;
-    LPVOID lpSecurityDescriptor;
-    BOOL bInheritHandle;
-} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
-
-typedef struct _PROCESS_INFORMATION {
-    HANDLE hProcess;
-    HANDLE hThread;
-    DWORD dwProcessId;
-    DWORD dwThreadId;
-} PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _SYSTEMTIME {
-    WORD wYear;
-    WORD wMonth;
-    WORD wDayOfWeek;
-    WORD wDay;
-    WORD wHour;
-    WORD wMinute;
-    WORD wSecond;
-    WORD wMilliseconds;
-} SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME;
-
-
-typedef DWORD (__stdcall *PTHREAD_START_ROUTINE)(
-    LPVOID lpThreadParameter
-    );
-typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE;
-
-
-typedef void (__stdcall *PFIBER_START_ROUTINE)(
-    LPVOID lpFiberParameter
-    );
-typedef PFIBER_START_ROUTINE LPFIBER_START_ROUTINE;
-
-
-typedef RTL_CRITICAL_SECTION CRITICAL_SECTION;
-typedef PRTL_CRITICAL_SECTION PCRITICAL_SECTION;
-typedef PRTL_CRITICAL_SECTION LPCRITICAL_SECTION;
-
-typedef RTL_CRITICAL_SECTION_DEBUG CRITICAL_SECTION_DEBUG;
-typedef PRTL_CRITICAL_SECTION_DEBUG PCRITICAL_SECTION_DEBUG;
-typedef PRTL_CRITICAL_SECTION_DEBUG LPCRITICAL_SECTION_DEBUG;
-
-__declspec(dllimport)
-      
-PVOID
-__stdcall
-EncodePointer (
-           PVOID Ptr
-    );
-
-__declspec(dllimport)
-      
-PVOID
-__stdcall
-DecodePointer (
-           PVOID Ptr
-    );
-
-__declspec(dllimport)
-      
-PVOID
-__stdcall
-EncodeSystemPointer (
-           PVOID Ptr
-    );
-
-__declspec(dllimport)
-      
-PVOID
-__stdcall
-DecodeSystemPointer (
-           PVOID Ptr
-    );
-
-
-typedef PLDT_ENTRY LPLDT_ENTRY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _COMMPROP {
-    WORD wPacketLength;
-    WORD wPacketVersion;
-    DWORD dwServiceMask;
-    DWORD dwReserved1;
-    DWORD dwMaxTxQueue;
-    DWORD dwMaxRxQueue;
-    DWORD dwMaxBaud;
-    DWORD dwProvSubType;
-    DWORD dwProvCapabilities;
-    DWORD dwSettableParams;
-    DWORD dwSettableBaud;
-    WORD wSettableData;
-    WORD wSettableStopParity;
-    DWORD dwCurrentTxQueue;
-    DWORD dwCurrentRxQueue;
-    DWORD dwProvSpec1;
-    DWORD dwProvSpec2;
-    WCHAR wcProvChar[1];
-} COMMPROP,*LPCOMMPROP;
-
-
-
-
-
-
-
-typedef struct _COMSTAT {
-    DWORD fCtsHold : 1;
-    DWORD fDsrHold : 1;
-    DWORD fRlsdHold : 1;
-    DWORD fXoffHold : 1;
-    DWORD fXoffSent : 1;
-    DWORD fEof : 1;
-    DWORD fTxim : 1;
-    DWORD fReserved : 25;
-    DWORD cbInQue;
-    DWORD cbOutQue;
-} COMSTAT, *LPCOMSTAT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _DCB {
-    DWORD DCBlength;      
-    DWORD BaudRate;       
-    DWORD fBinary: 1;     
-    DWORD fParity: 1;     
-    DWORD fOutxCtsFlow:1; 
-    DWORD fOutxDsrFlow:1; 
-    DWORD fDtrControl:2;  
-    DWORD fDsrSensitivity:1; 
-    DWORD fTXContinueOnXoff: 1; 
-    DWORD fOutX: 1;       
-    DWORD fInX: 1;        
-    DWORD fErrorChar: 1;  
-    DWORD fNull: 1;       
-    DWORD fRtsControl:2;  
-    DWORD fAbortOnError:1; 
-    DWORD fDummy2:17;     
-    WORD wReserved;       
-    WORD XonLim;          
-    WORD XoffLim;         
-    BYTE ByteSize;        
-    BYTE Parity;          
-    BYTE StopBits;        
-    char XonChar;         
-    char XoffChar;        
-    char ErrorChar;       
-    char EofChar;         
-    char EvtChar;         
-    WORD wReserved1;      
-} DCB, *LPDCB;
-
-typedef struct _COMMTIMEOUTS {
-    DWORD ReadIntervalTimeout;          
-    DWORD ReadTotalTimeoutMultiplier;   
-    DWORD ReadTotalTimeoutConstant;     
-    DWORD WriteTotalTimeoutMultiplier;  
-    DWORD WriteTotalTimeoutConstant;    
-} COMMTIMEOUTS,*LPCOMMTIMEOUTS;
-
-typedef struct _COMMCONFIG {
-    DWORD dwSize;               
-    WORD wVersion;              
-    WORD wReserved;             
-    DCB dcb;                    
-    DWORD dwProviderSubType;    
-
-    DWORD dwProviderOffset;     
-
-    DWORD dwProviderSize;       
-    WCHAR wcProviderData[1];    
-} COMMCONFIG,*LPCOMMCONFIG;
-
-typedef struct _SYSTEM_INFO {
-    union {
-        DWORD dwOemId;          
-        struct {
-            WORD wProcessorArchitecture;
-            WORD wReserved;
-        };
-    };
-    DWORD dwPageSize;
-    LPVOID lpMinimumApplicationAddress;
-    LPVOID lpMaximumApplicationAddress;
-    DWORD_PTR dwActiveProcessorMask;
-    DWORD dwNumberOfProcessors;
-    DWORD dwProcessorType;
-    DWORD dwAllocationGranularity;
-    WORD wProcessorLevel;
-    WORD wProcessorRevision;
-} SYSTEM_INFO, *LPSYSTEM_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _MEMORYSTATUS {
-    DWORD dwLength;
-    DWORD dwMemoryLoad;
-    SIZE_T dwTotalPhys;
-    SIZE_T dwAvailPhys;
-    SIZE_T dwTotalPageFile;
-    SIZE_T dwAvailPageFile;
-    SIZE_T dwTotalVirtual;
-    SIZE_T dwAvailVirtual;
-} MEMORYSTATUS, *LPMEMORYSTATUS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _EXCEPTION_DEBUG_INFO {
-    EXCEPTION_RECORD ExceptionRecord;
-    DWORD dwFirstChance;
-} EXCEPTION_DEBUG_INFO, *LPEXCEPTION_DEBUG_INFO;
-
-typedef struct _CREATE_THREAD_DEBUG_INFO {
-    HANDLE hThread;
-    LPVOID lpThreadLocalBase;
-    LPTHREAD_START_ROUTINE lpStartAddress;
-} CREATE_THREAD_DEBUG_INFO, *LPCREATE_THREAD_DEBUG_INFO;
-
-typedef struct _CREATE_PROCESS_DEBUG_INFO {
-    HANDLE hFile;
-    HANDLE hProcess;
-    HANDLE hThread;
-    LPVOID lpBaseOfImage;
-    DWORD dwDebugInfoFileOffset;
-    DWORD nDebugInfoSize;
-    LPVOID lpThreadLocalBase;
-    LPTHREAD_START_ROUTINE lpStartAddress;
-    LPVOID lpImageName;
-    WORD fUnicode;
-} CREATE_PROCESS_DEBUG_INFO, *LPCREATE_PROCESS_DEBUG_INFO;
-
-typedef struct _EXIT_THREAD_DEBUG_INFO {
-    DWORD dwExitCode;
-} EXIT_THREAD_DEBUG_INFO, *LPEXIT_THREAD_DEBUG_INFO;
-
-typedef struct _EXIT_PROCESS_DEBUG_INFO {
-    DWORD dwExitCode;
-} EXIT_PROCESS_DEBUG_INFO, *LPEXIT_PROCESS_DEBUG_INFO;
-
-typedef struct _LOAD_DLL_DEBUG_INFO {
-    HANDLE hFile;
-    LPVOID lpBaseOfDll;
-    DWORD dwDebugInfoFileOffset;
-    DWORD nDebugInfoSize;
-    LPVOID lpImageName;
-    WORD fUnicode;
-} LOAD_DLL_DEBUG_INFO, *LPLOAD_DLL_DEBUG_INFO;
-
-typedef struct _UNLOAD_DLL_DEBUG_INFO {
-    LPVOID lpBaseOfDll;
-} UNLOAD_DLL_DEBUG_INFO, *LPUNLOAD_DLL_DEBUG_INFO;
-
-typedef struct _OUTPUT_DEBUG_STRING_INFO {
-    LPSTR lpDebugStringData;
-    WORD fUnicode;
-    WORD nDebugStringLength;
-} OUTPUT_DEBUG_STRING_INFO, *LPOUTPUT_DEBUG_STRING_INFO;
-
-typedef struct _RIP_INFO {
-    DWORD dwError;
-    DWORD dwType;
-} RIP_INFO, *LPRIP_INFO;
-
-
-typedef struct _DEBUG_EVENT {
-    DWORD dwDebugEventCode;
-    DWORD dwProcessId;
-    DWORD dwThreadId;
-    union {
-        EXCEPTION_DEBUG_INFO Exception;
-        CREATE_THREAD_DEBUG_INFO CreateThread;
-        CREATE_PROCESS_DEBUG_INFO CreateProcessInfo;
-        EXIT_THREAD_DEBUG_INFO ExitThread;
-        EXIT_PROCESS_DEBUG_INFO ExitProcess;
-        LOAD_DLL_DEBUG_INFO LoadDll;
-        UNLOAD_DLL_DEBUG_INFO UnloadDll;
-        OUTPUT_DEBUG_STRING_INFO DebugString;
-        RIP_INFO RipInfo;
-    } u;
-} DEBUG_EVENT, *LPDEBUG_EVENT;
-
-
-typedef PCONTEXT LPCONTEXT;
-typedef PEXCEPTION_RECORD LPEXCEPTION_RECORD;
-typedef PEXCEPTION_POINTERS LPEXCEPTION_POINTERS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _OFSTRUCT {
-    BYTE cBytes;
-    BYTE fFixedDisk;
-    WORD nErrCode;
-    WORD Reserved1;
-    WORD Reserved2;
-    CHAR szPathName[128];
-} OFSTRUCT, *LPOFSTRUCT, *POFSTRUCT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-InterlockedIncrement (
-         LONG volatile *lpAddend
-    );
-
-__declspec(dllimport)
-LONG
-__stdcall
-InterlockedDecrement (
-         LONG volatile *lpAddend
-    );
-
-__declspec(dllimport)
-LONG
-__stdcall
-InterlockedExchange (
-         LONG volatile *Target,
-            LONG Value
-    );
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-InterlockedExchangeAdd (
-         LONG volatile *Addend,
-            LONG Value
-    );
-
-__declspec(dllimport)
-LONG
-__stdcall
-InterlockedCompareExchange (
-         LONG volatile *Destination,
-            LONG Exchange,
-            LONG Comperand
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__forceinline
-PVOID
-
-__cdecl
-
-__InlineInterlockedCompareExchangePointer (
-          PVOID volatile *Destination,
-           PVOID ExChange,
-           PVOID Comperand
-    )
-{
-    return((PVOID)(LONG_PTR)InterlockedCompareExchange((LONG volatile *)Destination, (LONG)(LONG_PTR)ExChange, (LONG)(LONG_PTR)Comperand));
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-InitializeSListHead (
-         PSLIST_HEADER ListHead
-    );
-
-__declspec(dllimport)
-PSINGLE_LIST_ENTRY
-__stdcall
-InterlockedPopEntrySList (
-         PSLIST_HEADER ListHead
-    );
-
-__declspec(dllimport)
-PSINGLE_LIST_ENTRY
-__stdcall
-InterlockedPushEntrySList (
-         PSLIST_HEADER ListHead,
-         PSINGLE_LIST_ENTRY ListEntry
-    );
-
-__declspec(dllimport)
-PSINGLE_LIST_ENTRY
-__stdcall
-InterlockedFlushSList (
-         PSLIST_HEADER ListHead
-    );
-
-__declspec(dllimport)
-USHORT
-__stdcall
-QueryDepthSList (
-         PSLIST_HEADER ListHead
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FreeResource(
-         HGLOBAL hResData
-    );
-
-__declspec(dllimport)
-LPVOID
-__stdcall
-LockResource(
-         HGLOBAL hResData
-    );
-
-
-
-
-
-
-int
-
-
-
-
-__stdcall
-
-
-
-
-WinMain (
-         HINSTANCE hInstance,
-           HINSTANCE hPrevInstance,
-           LPSTR lpCmdLine,
-         int nShowCmd
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FreeLibrary (
-         HMODULE hLibModule
-    );
-
-
-__declspec(dllimport)
-__declspec(noreturn)
-void
-__stdcall
-FreeLibraryAndExitThread (
-         HMODULE hLibModule,
-         DWORD dwExitCode
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DisableThreadLibraryCalls (
-         HMODULE hLibModule
-    );
-
-__declspec(dllimport)
-FARPROC
-__stdcall
-GetProcAddress (
-         HMODULE hModule,
-         LPCSTR lpProcName
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetVersion (
-    void
-    );
-
-__declspec(dllimport)
-    
-HGLOBAL
-__stdcall
-GlobalAlloc (
-         UINT uFlags,
-         SIZE_T dwBytes
-    );
-
-__declspec(dllimport)
-    
-HGLOBAL
-__stdcall
-GlobalReAlloc (
-         HGLOBAL hMem,
-         SIZE_T dwBytes,
-         UINT uFlags
-    );
-
-__declspec(dllimport)
-SIZE_T
-__stdcall
-GlobalSize (
-         HGLOBAL hMem
-    );
-
-__declspec(dllimport)
-UINT
-__stdcall
-GlobalFlags (
-         HGLOBAL hMem
-    );
-
-__declspec(dllimport)
-    
-LPVOID
-__stdcall
-GlobalLock ( 
-         HGLOBAL hMem
-    );
-
-__declspec(dllimport)
-    
-HGLOBAL
-__stdcall
-GlobalHandle (
-         LPCVOID pMem
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GlobalUnlock(
-         HGLOBAL hMem
-    );
-
-__declspec(dllimport)
-    
-HGLOBAL
-__stdcall
-GlobalFree(
-     HGLOBAL hMem
-    );
-
-__declspec(dllimport)
-SIZE_T
-__stdcall
-GlobalCompact(
-         DWORD dwMinFree
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-GlobalFix(
-         HGLOBAL hMem
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-GlobalUnfix(
-         HGLOBAL hMem
-    );
-
-__declspec(dllimport)
-    
-LPVOID
-__stdcall
-GlobalWire(
-         HGLOBAL hMem
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GlobalUnWire(
-         HGLOBAL hMem
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-GlobalMemoryStatus(
-         LPMEMORYSTATUS lpBuffer
-    );
-
-typedef struct _MEMORYSTATUSEX {
-    DWORD dwLength;
-    DWORD dwMemoryLoad;
-    DWORDLONG ullTotalPhys;
-    DWORDLONG ullAvailPhys;
-    DWORDLONG ullTotalPageFile;
-    DWORDLONG ullAvailPageFile;
-    DWORDLONG ullTotalVirtual;
-    DWORDLONG ullAvailVirtual;
-    DWORDLONG ullAvailExtendedVirtual;
-} MEMORYSTATUSEX, *LPMEMORYSTATUSEX;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GlobalMemoryStatusEx(
-         LPMEMORYSTATUSEX lpBuffer
-    );
-
-__declspec(dllimport)
-    
-HLOCAL
-__stdcall
-LocalAlloc(
-         UINT uFlags,
-         SIZE_T uBytes
-    );
-
-__declspec(dllimport)
-    
-HLOCAL
-__stdcall
-LocalReAlloc(
-         HLOCAL hMem,
-         SIZE_T uBytes,
-         UINT uFlags
-    );
-
-__declspec(dllimport)
-    
-LPVOID
-__stdcall
-LocalLock(
-         HLOCAL hMem
-    );
-
-__declspec(dllimport)
-    
-HLOCAL
-__stdcall
-LocalHandle(
-         LPCVOID pMem
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-LocalUnlock(
-         HLOCAL hMem
-    );
-
-__declspec(dllimport)
-SIZE_T
-__stdcall
-LocalSize(
-         HLOCAL hMem
-    );
-
-__declspec(dllimport)
-UINT
-__stdcall
-LocalFlags(
-         HLOCAL hMem
-    );
-
-__declspec(dllimport)
-HLOCAL
-__stdcall
-LocalFree(
-     HLOCAL hMem
-    );
-
-__declspec(dllimport)
-SIZE_T
-__stdcall
-LocalShrink(
-         HLOCAL hMem,
-         UINT cbNewSize
-    );
-
-__declspec(dllimport)
-SIZE_T
-__stdcall
-LocalCompact(
-         UINT uMinFree
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FlushInstructionCache(
-         HANDLE hProcess,
-             LPCVOID lpBaseAddress,
-         SIZE_T dwSize
-    );
-
-__declspec(dllimport)
- 
-LPVOID
-__stdcall
-VirtualAlloc(
-           LPVOID lpAddress,
-             SIZE_T dwSize,
-             DWORD flAllocationType,
-             DWORD flProtect
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-VirtualFree(
-         LPVOID lpAddress,
-         SIZE_T dwSize,
-         DWORD dwFreeType
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-VirtualProtect(
-          LPVOID lpAddress,
-          SIZE_T dwSize,
-          DWORD flNewProtect,
-         PDWORD lpflOldProtect
-    );
-
-__declspec(dllimport)
-SIZE_T
-__stdcall
-VirtualQuery(
-           LPCVOID lpAddress,
-           PMEMORY_BASIC_INFORMATION lpBuffer,
-             SIZE_T dwLength
-    );
-
-__declspec(dllimport)
- 
-LPVOID
-__stdcall
-VirtualAllocEx(
-             HANDLE hProcess,
-           LPVOID lpAddress,
-             SIZE_T dwSize,
-             DWORD flAllocationType,
-             DWORD flProtect
-    );
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetWriteWatch(
-         DWORD dwFlags,
-         PVOID lpBaseAddress,
-         SIZE_T dwRegionSize,
-           PVOID *lpAddresses,
-         ULONG_PTR *lpdwCount,
-         PULONG lpdwGranularity
-    );
-
-__declspec(dllimport)
-UINT
-__stdcall
-ResetWriteWatch(
-         LPVOID lpBaseAddress,
-         SIZE_T dwRegionSize
-    );
-
-__declspec(dllimport)
-SIZE_T
-__stdcall
-GetLargePageMinimum(
-    void
-    );
-
-__declspec(dllimport)
-UINT
-__stdcall
-EnumSystemFirmwareTables(
-         DWORD FirmwareTableProviderSignature,
-             PVOID pFirmwareTableEnumBuffer,
-         DWORD BufferSize
-    );
-    
-__declspec(dllimport)
-UINT
-__stdcall
-GetSystemFirmwareTable(
-         DWORD FirmwareTableProviderSignature,
-         DWORD FirmwareTableID,
-             PVOID pFirmwareTableBuffer,
-         DWORD BufferSize
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-VirtualFreeEx(
-         HANDLE hProcess,
-         LPVOID lpAddress,
-         SIZE_T dwSize,
-         DWORD  dwFreeType
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-VirtualProtectEx(
-          HANDLE hProcess,
-          LPVOID lpAddress,
-          SIZE_T dwSize,
-          DWORD flNewProtect,
-         PDWORD lpflOldProtect
-    );
-
-__declspec(dllimport)
-SIZE_T
-__stdcall
-VirtualQueryEx(
-             HANDLE hProcess,
-           LPCVOID lpAddress,
-           PMEMORY_BASIC_INFORMATION lpBuffer,
-             SIZE_T dwLength
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-HeapCreate(
-         DWORD flOptions,
-         SIZE_T dwInitialSize,
-         SIZE_T dwMaximumSize
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-HeapDestroy(
-         HANDLE hHeap
-    );
-
-
-__declspec(dllimport)
- 
-LPVOID
-__stdcall
-HeapAlloc(
-         HANDLE hHeap,
-         DWORD dwFlags,
-         SIZE_T dwBytes
-    );
-
-__declspec(dllimport)
- 
-LPVOID
-__stdcall
-HeapReAlloc(
-         HANDLE hHeap,
-            DWORD dwFlags,
-     LPVOID lpMem,
-            SIZE_T dwBytes
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-HeapFree(
-         HANDLE hHeap,
-            DWORD dwFlags,
-     LPVOID lpMem
-    );
-
-__declspec(dllimport)
-SIZE_T
-__stdcall
-HeapSize(
-         HANDLE hHeap,
-         DWORD dwFlags,
-         LPCVOID lpMem
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-HeapValidate(
-             HANDLE hHeap,
-             DWORD dwFlags,
-           LPCVOID lpMem
-    );
-
-__declspec(dllimport)
-SIZE_T
-__stdcall
-HeapCompact(
-         HANDLE hHeap,
-         DWORD dwFlags
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-GetProcessHeap( void );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetProcessHeaps(
-         DWORD NumberOfHeaps,
-           PHANDLE ProcessHeaps
-    );
-
-typedef struct _PROCESS_HEAP_ENTRY {
-    PVOID lpData;
-    DWORD cbData;
-    BYTE cbOverhead;
-    BYTE iRegionIndex;
-    WORD wFlags;
-    union {
-        struct {
-            HANDLE hMem;
-            DWORD dwReserved[ 3 ];
-        } Block;
-        struct {
-            DWORD dwCommittedSize;
-            DWORD dwUnCommittedSize;
-            LPVOID lpFirstBlock;
-            LPVOID lpLastBlock;
-        } Region;
-    };
-} PROCESS_HEAP_ENTRY, *LPPROCESS_HEAP_ENTRY, *PPROCESS_HEAP_ENTRY;
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-HeapLock(
-         HANDLE hHeap
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-HeapUnlock(
-         HANDLE hHeap
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-HeapWalk(
-            HANDLE hHeap,
-         LPPROCESS_HEAP_ENTRY lpEntry
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-HeapSetInformation (
-         HANDLE HeapHandle, 
-         HEAP_INFORMATION_CLASS HeapInformationClass,
-             PVOID HeapInformation,
-         SIZE_T HeapInformationLength
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-HeapQueryInformation (
-              HANDLE HeapHandle, 
-              HEAP_INFORMATION_CLASS HeapInformationClass,
-             PVOID HeapInformation,
-              SIZE_T HeapInformationLength,
-           PSIZE_T ReturnLength
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetBinaryTypeA(
-          LPCSTR lpApplicationName,
-         LPDWORD  lpBinaryType
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetBinaryTypeW(
-          LPCWSTR lpApplicationName,
-         LPDWORD  lpBinaryType
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetShortPathNameA(
-         LPCSTR lpszLongPath,
-           LPSTR  lpszShortPath,
-         DWORD cchBuffer
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetShortPathNameW(
-         LPCWSTR lpszLongPath,
-           LPWSTR  lpszShortPath,
-         DWORD cchBuffer
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetLongPathNameA(
-         LPCSTR lpszShortPath,
-           LPSTR  lpszLongPath,
-         DWORD cchBuffer
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetLongPathNameW(
-         LPCWSTR lpszShortPath,
-           LPWSTR  lpszLongPath,
-         DWORD cchBuffer
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetProcessAffinityMask(
-          HANDLE hProcess,
-         PDWORD_PTR lpProcessAffinityMask,
-         PDWORD_PTR lpSystemAffinityMask
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetProcessAffinityMask(
-         HANDLE hProcess,
-         DWORD_PTR dwProcessAffinityMask
-    );
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetProcessHandleCount(
-          HANDLE hProcess,
-         PDWORD pdwHandleCount
-    );
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetProcessTimes(
-          HANDLE hProcess,
-         LPFILETIME lpCreationTime,
-         LPFILETIME lpExitTime,
-         LPFILETIME lpKernelTime,
-         LPFILETIME lpUserTime
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetProcessIoCounters(
-          HANDLE hProcess,
-         PIO_COUNTERS lpIoCounters
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetProcessWorkingSetSize(
-          HANDLE hProcess,
-         PSIZE_T lpMinimumWorkingSetSize,
-         PSIZE_T lpMaximumWorkingSetSize
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetProcessWorkingSetSizeEx(
-          HANDLE hProcess,
-         PSIZE_T lpMinimumWorkingSetSize,
-         PSIZE_T lpMaximumWorkingSetSize,
-         PDWORD Flags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetProcessWorkingSetSize(
-         HANDLE hProcess,
-         SIZE_T dwMinimumWorkingSetSize,
-         SIZE_T dwMaximumWorkingSetSize
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetProcessWorkingSetSizeEx(
-         HANDLE hProcess,
-         SIZE_T dwMinimumWorkingSetSize,
-         SIZE_T dwMaximumWorkingSetSize,
-         DWORD Flags
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenProcess(
-         DWORD dwDesiredAccess,
-         BOOL bInheritHandle,
-         DWORD dwProcessId
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-GetCurrentProcess(
-    void
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetCurrentProcessId(
-    void
-    );
-
-__declspec(dllimport)
-__declspec(noreturn)
-void
-__stdcall
-ExitProcess(
-         UINT uExitCode
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-TerminateProcess(
-         HANDLE hProcess,
-         UINT uExitCode
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetExitCodeProcess(
-          HANDLE hProcess,
-         LPDWORD lpExitCode
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-FatalExit(
-         int ExitCode
-    );
-
-__declspec(dllimport)
-    
-
-LPCH
-__stdcall
-GetEnvironmentStrings(
-    void
-    );
-
-__declspec(dllimport)
-    
-
-LPWCH
-__stdcall
-GetEnvironmentStringsW(
-    void
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetEnvironmentStringsA(
-          LPCH NewEnvironment
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-SetEnvironmentStringsW(
-          LPWCH NewEnvironment
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FreeEnvironmentStringsA(
-          LPCH
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-FreeEnvironmentStringsW(
-          LPWCH
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-RaiseException(
-         DWORD dwExceptionCode,
-         DWORD dwExceptionFlags,
-         DWORD nNumberOfArguments,
-             const ULONG_PTR *lpArguments
-    );
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-UnhandledExceptionFilter(
-         struct _EXCEPTION_POINTERS *ExceptionInfo
-    );
-
-typedef LONG (__stdcall *PTOP_LEVEL_EXCEPTION_FILTER)(
-         struct _EXCEPTION_POINTERS *ExceptionInfo
-    );
-typedef PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER;
-
-__declspec(dllimport)
-LPTOP_LEVEL_EXCEPTION_FILTER
-__stdcall
-SetUnhandledExceptionFilter(
-         LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-    
-LPVOID
-__stdcall
-CreateFiber(
-             SIZE_T dwStackSize,
-             LPFIBER_START_ROUTINE lpStartAddress,
-           LPVOID lpParameter
-    );
-
-__declspec(dllimport)
-    
-LPVOID
-__stdcall
-CreateFiberEx(
-             SIZE_T dwStackCommitSize,
-             SIZE_T dwStackReserveSize,
-             DWORD dwFlags,
-             LPFIBER_START_ROUTINE lpStartAddress,
-           LPVOID lpParameter
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-DeleteFiber(
-         LPVOID lpFiber
-    );
-
-__declspec(dllimport)
-    
-LPVOID
-__stdcall
-ConvertThreadToFiber(
-           LPVOID lpParameter
-    );
-
-__declspec(dllimport)
-    
-LPVOID
-__stdcall
-ConvertThreadToFiberEx(
-           LPVOID lpParameter,
-             DWORD dwFlags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ConvertFiberToThread(
-    void
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-SwitchToFiber(
-         LPVOID lpFiber
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SwitchToThread(
-    void
-    );
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateThread(
-            LPSECURITY_ATTRIBUTES lpThreadAttributes,
-              SIZE_T dwStackSize,
-              LPTHREAD_START_ROUTINE lpStartAddress,
-            LPVOID lpParameter,
-              DWORD dwCreationFlags,
-           LPDWORD lpThreadId
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateRemoteThread(
-              HANDLE hProcess,
-            LPSECURITY_ATTRIBUTES lpThreadAttributes,
-              SIZE_T dwStackSize,
-              LPTHREAD_START_ROUTINE lpStartAddress,
-            LPVOID lpParameter,
-              DWORD dwCreationFlags,
-           LPDWORD lpThreadId
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-GetCurrentThread(
-    void
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetCurrentThreadId(
-    void
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetThreadStackGuarantee (
-         PULONG StackSizeInBytes
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetProcessIdOfThread(
-         HANDLE Thread
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetThreadId(
-         HANDLE Thread
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetProcessId(
-         HANDLE Process
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetCurrentProcessorNumber(
-    void
-    );
-
-__declspec(dllimport)
-DWORD_PTR
-__stdcall
-SetThreadAffinityMask(
-         HANDLE hThread,
-         DWORD_PTR dwThreadAffinityMask
-    );
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-SetThreadIdealProcessor(
-         HANDLE hThread,
-         DWORD dwIdealProcessor
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetProcessPriorityBoost(
-         HANDLE hProcess,
-         BOOL bDisablePriorityBoost
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetProcessPriorityBoost(
-          HANDLE hProcess,
-         PBOOL  pDisablePriorityBoost
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-RequestWakeupLatency(
-         LATENCY_TIME latency
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsSystemResumeAutomatic(
-    void
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenThread(
-         DWORD dwDesiredAccess,
-         BOOL bInheritHandle,
-         DWORD dwThreadId
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetThreadPriority(
-         HANDLE hThread,
-         int nPriority
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetThreadPriorityBoost(
-         HANDLE hThread,
-         BOOL bDisablePriorityBoost
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetThreadPriorityBoost(
-          HANDLE hThread,
-         PBOOL pDisablePriorityBoost
-    );
-
-__declspec(dllimport)
-int
-__stdcall
-GetThreadPriority(
-         HANDLE hThread
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetThreadTimes(
-          HANDLE hThread,
-         LPFILETIME lpCreationTime,
-         LPFILETIME lpExitTime,
-         LPFILETIME lpKernelTime,
-         LPFILETIME lpUserTime
-    );
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetThreadIOPendingFlag(
-          HANDLE hThread,
-         PBOOL  lpIOIsPending
-    );
-
-
-
-__declspec(dllimport)
-__declspec(noreturn)
-void
-__stdcall
-ExitThread(
-         DWORD dwExitCode
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-TerminateThread(
-         HANDLE hThread,
-         DWORD dwExitCode
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetExitCodeThread(
-          HANDLE hThread,
-         LPDWORD lpExitCode
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetThreadSelectorEntry(
-          HANDLE hThread,
-          DWORD dwSelector,
-         LPLDT_ENTRY lpSelectorEntry
-    );
-
-__declspec(dllimport)
-EXECUTION_STATE
-__stdcall
-SetThreadExecutionState(
-         EXECUTION_STATE esFlags
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetLastError(
-    void
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-SetLastError(
-         DWORD dwErrCode
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetOverlappedResult(
-          HANDLE hFile,
-          LPOVERLAPPED lpOverlapped,
-         LPDWORD lpNumberOfBytesTransferred,
-          BOOL bWait
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateIoCompletionPort(
-             HANDLE FileHandle,
-           HANDLE ExistingCompletionPort,
-             ULONG_PTR CompletionKey,
-             DWORD NumberOfConcurrentThreads
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetQueuedCompletionStatus(
-          HANDLE CompletionPort,
-         LPDWORD lpNumberOfBytesTransferred,
-         PULONG_PTR lpCompletionKey,
-         LPOVERLAPPED *lpOverlapped,
-          DWORD dwMilliseconds
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-PostQueuedCompletionStatus(
-             HANDLE CompletionPort,
-             DWORD dwNumberOfBytesTransferred,
-             ULONG_PTR dwCompletionKey,
-           LPOVERLAPPED lpOverlapped
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-SetErrorMode(
-         UINT uMode
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReadProcessMemory(
-              HANDLE hProcess,
-              LPCVOID lpBaseAddress,
-           LPVOID lpBuffer,
-              SIZE_T nSize,
-           SIZE_T * lpNumberOfBytesRead
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteProcessMemory(
-              HANDLE hProcess,
-              LPVOID lpBaseAddress,
-           LPCVOID lpBuffer,
-              SIZE_T nSize,
-           SIZE_T * lpNumberOfBytesWritten
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetThreadContext(
-            HANDLE hThread,
-         LPCONTEXT lpContext
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetThreadContext(
-         HANDLE hThread,
-         const CONTEXT *lpContext
-    );
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-SuspendThread(
-         HANDLE hThread
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-ResumeThread(
-         HANDLE hThread
-    );
-
-
-
-
-typedef
-void
-(__stdcall *PAPCFUNC)(
-         ULONG_PTR dwParam
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-QueueUserAPC(
-         PAPCFUNC pfnAPC,
-         HANDLE hThread,
-         ULONG_PTR dwData
-    );
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsDebuggerPresent(
-    void
-    );
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CheckRemoteDebuggerPresent(
-          HANDLE hProcess,
-         PBOOL pbDebuggerPresent
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-DebugBreak(
-    void
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WaitForDebugEvent(
-         LPDEBUG_EVENT lpDebugEvent,
-         DWORD dwMilliseconds
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ContinueDebugEvent(
-         DWORD dwProcessId,
-         DWORD dwThreadId,
-         DWORD dwContinueStatus
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DebugActiveProcess(
-         DWORD dwProcessId
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DebugActiveProcessStop(
-         DWORD dwProcessId
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DebugSetProcessKillOnExit(
-         BOOL KillOnExit
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DebugBreakProcess (
-         HANDLE Process
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-InitializeCriticalSection(
-         LPCRITICAL_SECTION lpCriticalSection
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-EnterCriticalSection(
-         LPCRITICAL_SECTION lpCriticalSection
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-LeaveCriticalSection(
-         LPCRITICAL_SECTION lpCriticalSection
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-InitializeCriticalSectionAndSpinCount(
-         LPCRITICAL_SECTION lpCriticalSection,
-          DWORD dwSpinCount
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-SetCriticalSectionSpinCount(
-         LPCRITICAL_SECTION lpCriticalSection,
-            DWORD dwSpinCount
-    );
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-TryEnterCriticalSection(
-         LPCRITICAL_SECTION lpCriticalSection
-    );
-
-
-__declspec(dllimport)
-void
-__stdcall
-DeleteCriticalSection(
-         LPCRITICAL_SECTION lpCriticalSection
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetEvent(
-         HANDLE hEvent
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ResetEvent(
-         HANDLE hEvent
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-PulseEvent(
-         HANDLE hEvent
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReleaseSemaphore(
-              HANDLE hSemaphore,
-              LONG lReleaseCount,
-           LPLONG lpPreviousCount
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReleaseMutex(
-         HANDLE hMutex
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-WaitForSingleObject(
-         HANDLE hHandle,
-         DWORD dwMilliseconds
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-WaitForMultipleObjects(
-         DWORD nCount,
-           const HANDLE *lpHandles,
-         BOOL bWaitAll,
-         DWORD dwMilliseconds
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-Sleep(
-         DWORD dwMilliseconds
-    );
-
-__declspec(dllimport)
-    
-HGLOBAL
-__stdcall
-LoadResource(
-           HMODULE hModule,
-         HRSRC hResInfo
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-SizeofResource(
-           HMODULE hModule,
-         HRSRC hResInfo
-    );
-
-
-__declspec(dllimport)
-    
-ATOM
-__stdcall
-GlobalDeleteAtom(
-         ATOM nAtom
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-InitAtomTable(
-         DWORD nSize
-    );
-
-__declspec(dllimport)
-    
-ATOM
-__stdcall
-DeleteAtom(
-         ATOM nAtom
-    );
-
-__declspec(dllimport)
-UINT
-__stdcall
-SetHandleCount(
-         UINT uNumber
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetLogicalDrives(
-    void
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-LockFile(
-         HANDLE hFile,
-         DWORD dwFileOffsetLow,
-         DWORD dwFileOffsetHigh,
-         DWORD nNumberOfBytesToLockLow,
-         DWORD nNumberOfBytesToLockHigh
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UnlockFile(
-         HANDLE hFile,
-         DWORD dwFileOffsetLow,
-         DWORD dwFileOffsetHigh,
-         DWORD nNumberOfBytesToUnlockLow,
-         DWORD nNumberOfBytesToUnlockHigh
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-LockFileEx(
-               HANDLE hFile,
-               DWORD dwFlags,
-      DWORD dwReserved,
-               DWORD nNumberOfBytesToLockLow,
-               DWORD nNumberOfBytesToLockHigh,
-            LPOVERLAPPED lpOverlapped
-    );
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UnlockFileEx(
-               HANDLE hFile,
-      DWORD dwReserved,
-               DWORD nNumberOfBytesToUnlockLow,
-               DWORD nNumberOfBytesToUnlockHigh,
-            LPOVERLAPPED lpOverlapped
-    );
-
-typedef struct _BY_HANDLE_FILE_INFORMATION {
-    DWORD dwFileAttributes;
-    FILETIME ftCreationTime;
-    FILETIME ftLastAccessTime;
-    FILETIME ftLastWriteTime;
-    DWORD dwVolumeSerialNumber;
-    DWORD nFileSizeHigh;
-    DWORD nFileSizeLow;
-    DWORD nNumberOfLinks;
-    DWORD nFileIndexHigh;
-    DWORD nFileIndexLow;
-} BY_HANDLE_FILE_INFORMATION, *PBY_HANDLE_FILE_INFORMATION, *LPBY_HANDLE_FILE_INFORMATION;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetFileInformationByHandle(
-          HANDLE hFile,
-         LPBY_HANDLE_FILE_INFORMATION lpFileInformation
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetFileType(
-         HANDLE hFile
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetFileSize(
-              HANDLE hFile,
-           LPDWORD lpFileSizeHigh
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetFileSizeEx(
-          HANDLE hFile,
-         PLARGE_INTEGER lpFileSize
-    );
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-GetStdHandle(
-         DWORD nStdHandle
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetStdHandle(
-         DWORD nStdHandle,
-         HANDLE hHandle
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteFile(
-                HANDLE hFile,
-           LPCVOID lpBuffer,
-                DWORD nNumberOfBytesToWrite,
-             LPDWORD lpNumberOfBytesWritten,
-           LPOVERLAPPED lpOverlapped
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReadFile(
-                HANDLE hFile,
-           LPVOID lpBuffer,
-                DWORD nNumberOfBytesToRead,
-             LPDWORD lpNumberOfBytesRead,
-           LPOVERLAPPED lpOverlapped
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FlushFileBuffers(
-         HANDLE hFile
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DeviceIoControl(
-                HANDLE hDevice,
-                DWORD dwIoControlCode,
-             LPVOID lpInBuffer,
-                DWORD nInBufferSize,
-             LPVOID lpOutBuffer,
-                DWORD nOutBufferSize,
-             LPDWORD lpBytesReturned,
-           LPOVERLAPPED lpOverlapped
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-RequestDeviceWakeup(
-         HANDLE hDevice
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CancelDeviceWakeupRequest(
-         HANDLE hDevice
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetDevicePowerState(
-          HANDLE hDevice,
-         BOOL *pfOn
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetMessageWaitingIndicator(
-         HANDLE hMsgIndicator,
-         ULONG ulMsgCount
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetEndOfFile(
-         HANDLE hFile
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-SetFilePointer(
-             HANDLE hFile,
-             LONG lDistanceToMove,
-           PLONG lpDistanceToMoveHigh,
-             DWORD dwMoveMethod
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetFilePointerEx(
-              HANDLE hFile,
-              LARGE_INTEGER liDistanceToMove,
-           PLARGE_INTEGER lpNewFilePointer,
-              DWORD dwMoveMethod
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FindClose(
-         HANDLE hFindFile
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetFileTime(
-              HANDLE hFile,
-           LPFILETIME lpCreationTime,
-           LPFILETIME lpLastAccessTime,
-           LPFILETIME lpLastWriteTime
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetFileTime(
-             HANDLE hFile,
-           const FILETIME *lpCreationTime,
-           const FILETIME *lpLastAccessTime,
-           const FILETIME *lpLastWriteTime
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetFileValidData(
-         HANDLE hFile,
-         LONGLONG ValidDataLength
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetFileShortNameA(
-         HANDLE hFile,
-         LPCSTR lpShortName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-SetFileShortNameW(
-         HANDLE hFile,
-         LPCWSTR lpShortName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CloseHandle(
-         HANDLE hObject
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DuplicateHandle(
-                HANDLE hSourceProcessHandle,
-                HANDLE hSourceHandle,
-                HANDLE hTargetProcessHandle,
-                  LPHANDLE lpTargetHandle,
-                DWORD dwDesiredAccess,
-                BOOL bInheritHandle,
-                DWORD dwOptions
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetHandleInformation(
-          HANDLE hObject,
-         LPDWORD lpdwFlags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetHandleInformation(
-         HANDLE hObject,
-         DWORD dwMask,
-         DWORD dwFlags
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-LoadModule(
-         LPCSTR lpModuleName,
-         LPVOID lpParameterBlock
-    );
-
-__declspec(dllimport)
-UINT
-__stdcall
-WinExec(
-         LPCSTR lpCmdLine,
-         UINT uCmdShow
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ClearCommBreak(
-         HANDLE hFile
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ClearCommError(
-              HANDLE hFile,
-           LPDWORD lpErrors,
-           LPCOMSTAT lpStat
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetupComm(
-         HANDLE hFile,
-         DWORD dwInQueue,
-         DWORD dwOutQueue
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EscapeCommFunction(
-         HANDLE hFile,
-         DWORD dwFunc
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetCommConfig(
-              HANDLE hCommDev,
-           LPCOMMCONFIG lpCC,
-           LPDWORD lpdwSize
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetCommMask(
-          HANDLE hFile,
-         LPDWORD lpEvtMask
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetCommProperties(
-          HANDLE hFile,
-         LPCOMMPROP lpCommProp
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetCommModemStatus(
-          HANDLE hFile,
-         LPDWORD lpModemStat
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetCommState(
-          HANDLE hFile,
-         LPDCB lpDCB
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetCommTimeouts(
-          HANDLE hFile,
-         LPCOMMTIMEOUTS lpCommTimeouts
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-PurgeComm(
-         HANDLE hFile,
-         DWORD dwFlags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetCommBreak(
-         HANDLE hFile
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetCommConfig(
-         HANDLE hCommDev,
-           LPCOMMCONFIG lpCC,
-         DWORD dwSize
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetCommMask(
-         HANDLE hFile,
-         DWORD dwEvtMask
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetCommState(
-         HANDLE hFile,
-         LPDCB lpDCB
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetCommTimeouts(
-         HANDLE hFile,
-         LPCOMMTIMEOUTS lpCommTimeouts
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-TransmitCommChar(
-         HANDLE hFile,
-         char cChar
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WaitCommEvent(
-                HANDLE hFile,
-             LPDWORD lpEvtMask,
-           LPOVERLAPPED lpOverlapped
-    );
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-SetTapePosition(
-         HANDLE hDevice,
-         DWORD dwPositionMethod,
-         DWORD dwPartition,
-         DWORD dwOffsetLow,
-         DWORD dwOffsetHigh,
-         BOOL bImmediate
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetTapePosition(
-          HANDLE hDevice,
-          DWORD dwPositionType,
-         LPDWORD lpdwPartition,
-         LPDWORD lpdwOffsetLow,
-         LPDWORD lpdwOffsetHigh
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-PrepareTape(
-         HANDLE hDevice,
-         DWORD dwOperation,
-         BOOL bImmediate
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-EraseTape(
-         HANDLE hDevice,
-         DWORD dwEraseType,
-         BOOL bImmediate
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-CreateTapePartition(
-         HANDLE hDevice,
-         DWORD dwPartitionMethod,
-         DWORD dwCount,
-         DWORD dwSize
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-WriteTapemark(
-         HANDLE hDevice,
-         DWORD dwTapemarkType,
-         DWORD dwTapemarkCount,
-         BOOL bImmediate
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetTapeStatus(
-         HANDLE hDevice
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetTapeParameters(
-            HANDLE hDevice,
-            DWORD dwOperation,
-         LPDWORD lpdwSize,
-         LPVOID lpTapeInformation
-    );
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-SetTapeParameters(
-         HANDLE hDevice,
-         DWORD dwOperation,
-         LPVOID lpTapeInformation
-    );
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-Beep(
-         DWORD dwFreq,
-         DWORD dwDuration
-    );
-
-__declspec(dllimport)
-int
-__stdcall
-MulDiv(
-         int nNumber,
-         int nNumerator,
-         int nDenominator
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-GetSystemTime(
-         LPSYSTEMTIME lpSystemTime
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-GetSystemTimeAsFileTime(
-         LPFILETIME lpSystemTimeAsFileTime
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetSystemTime(
-         const SYSTEMTIME *lpSystemTime
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-GetLocalTime(
-         LPSYSTEMTIME lpSystemTime
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetLocalTime(
-         const SYSTEMTIME *lpSystemTime
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-GetSystemInfo(
-         LPSYSTEM_INFO lpSystemInfo
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetSystemRegistryQuota(
-           PDWORD pdwQuotaAllowed,
-           PDWORD pdwQuotaUsed
-    );
-
-BOOL
-__stdcall
-GetSystemTimes(
-           LPFILETIME lpIdleTime,
-           LPFILETIME lpKernelTime,
-           LPFILETIME lpUserTime
-    );
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-GetNativeSystemInfo(
-         LPSYSTEM_INFO lpSystemInfo
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsProcessorFeaturePresent(
-         DWORD ProcessorFeature
-    );
-
-typedef struct _TIME_ZONE_INFORMATION {
-    LONG Bias;
-    WCHAR StandardName[ 32 ];
-    SYSTEMTIME StandardDate;
-    LONG StandardBias;
-    WCHAR DaylightName[ 32 ];
-    SYSTEMTIME DaylightDate;
-    LONG DaylightBias;
-} TIME_ZONE_INFORMATION, *PTIME_ZONE_INFORMATION, *LPTIME_ZONE_INFORMATION;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SystemTimeToTzSpecificLocalTime(
-           LPTIME_ZONE_INFORMATION lpTimeZoneInformation,
-             LPSYSTEMTIME lpUniversalTime,
-            LPSYSTEMTIME lpLocalTime
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-TzSpecificLocalTimeToSystemTime(
-           LPTIME_ZONE_INFORMATION lpTimeZoneInformation,
-             LPSYSTEMTIME lpLocalTime,
-            LPSYSTEMTIME lpUniversalTime
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetTimeZoneInformation(
-         LPTIME_ZONE_INFORMATION lpTimeZoneInformation
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetTimeZoneInformation(
-         const TIME_ZONE_INFORMATION *lpTimeZoneInformation
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SystemTimeToFileTime(
-          const SYSTEMTIME *lpSystemTime,
-         LPFILETIME lpFileTime
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FileTimeToLocalFileTime(
-          const FILETIME *lpFileTime,
-         LPFILETIME lpLocalFileTime
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-LocalFileTimeToFileTime(
-          const FILETIME *lpLocalFileTime,
-         LPFILETIME lpFileTime
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FileTimeToSystemTime(
-          const FILETIME *lpFileTime,
-         LPSYSTEMTIME lpSystemTime
-    );
-
-__declspec(dllimport)
-LONG
-__stdcall
-CompareFileTime(
-         const FILETIME *lpFileTime1,
-         const FILETIME *lpFileTime2
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FileTimeToDosDateTime(
-          const FILETIME *lpFileTime,
-         LPWORD lpFatDate,
-         LPWORD lpFatTime
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DosDateTimeToFileTime(
-          WORD wFatDate,
-          WORD wFatTime,
-         LPFILETIME lpFileTime
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetTickCount(
-    void
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetSystemTimeAdjustment(
-         DWORD dwTimeAdjustment,
-         BOOL  bTimeAdjustmentDisabled
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetSystemTimeAdjustment(
-         PDWORD lpTimeAdjustment,
-         PDWORD lpTimeIncrement,
-         PBOOL  lpTimeAdjustmentDisabled
-    );
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-FormatMessageA(
-    DWORD dwFlags,
-    LPCVOID lpSource,
-    DWORD dwMessageId,
-    DWORD dwLanguageId,
-    LPSTR lpBuffer,
-    DWORD nSize,
-    va_list *Arguments
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-FormatMessageW(
-    DWORD dwFlags,
-    LPCVOID lpSource,
-    DWORD dwMessageId,
-    DWORD dwLanguageId,
-    LPWSTR lpBuffer,
-    DWORD nSize,
-    va_list *Arguments
-    );
-
-
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CreatePipe(
-           PHANDLE hReadPipe,
-           PHANDLE hWritePipe,
-           LPSECURITY_ATTRIBUTES lpPipeAttributes,
-             DWORD nSize
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ConnectNamedPipe(
-                HANDLE hNamedPipe,
-           LPOVERLAPPED lpOverlapped
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DisconnectNamedPipe(
-         HANDLE hNamedPipe
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetNamedPipeHandleState(
-             HANDLE hNamedPipe,
-           LPDWORD lpMode,
-           LPDWORD lpMaxCollectionCount,
-           LPDWORD lpCollectDataTimeout
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetNamedPipeInfo(
-              HANDLE hNamedPipe,
-           LPDWORD lpFlags,
-           LPDWORD lpOutBufferSize,
-           LPDWORD lpInBufferSize,
-           LPDWORD lpMaxInstances
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-PeekNamedPipe(
-              HANDLE hNamedPipe,
-             LPVOID lpBuffer,
-              DWORD nBufferSize,
-           LPDWORD lpBytesRead,
-           LPDWORD lpTotalBytesAvail,
-           LPDWORD lpBytesLeftThisMessage
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-TransactNamedPipe(
-                HANDLE hNamedPipe,
-             LPVOID lpInBuffer,
-                DWORD nInBufferSize,
-             LPVOID lpOutBuffer,
-                DWORD nOutBufferSize,
-               LPDWORD lpBytesRead,
-           LPOVERLAPPED lpOverlapped
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateMailslotA(
-             LPCSTR lpName,
-             DWORD nMaxMessageSize,
-             DWORD lReadTimeout,
-           LPSECURITY_ATTRIBUTES lpSecurityAttributes
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateMailslotW(
-             LPCWSTR lpName,
-             DWORD nMaxMessageSize,
-             DWORD lReadTimeout,
-           LPSECURITY_ATTRIBUTES lpSecurityAttributes
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetMailslotInfo(
-              HANDLE hMailslot,
-           LPDWORD lpMaxMessageSize,
-           LPDWORD lpNextSize,
-           LPDWORD lpMessageCount,
-           LPDWORD lpReadTimeout
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetMailslotInfo(
-         HANDLE hMailslot,
-         DWORD lReadTimeout
-    );
-
-__declspec(dllimport)
-    
-LPVOID
-__stdcall
-MapViewOfFile(
-         HANDLE hFileMappingObject,
-         DWORD dwDesiredAccess,
-         DWORD dwFileOffsetHigh,
-         DWORD dwFileOffsetLow,
-         SIZE_T dwNumberOfBytesToMap
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FlushViewOfFile(
-         LPCVOID lpBaseAddress,
-         SIZE_T dwNumberOfBytesToFlush
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UnmapViewOfFile(
-         LPCVOID lpBaseAddress
-    );
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EncryptFileA(
-         LPCSTR lpFileName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-EncryptFileW(
-         LPCWSTR lpFileName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DecryptFileA(
-               LPCSTR lpFileName,
-      DWORD dwReserved
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-DecryptFileW(
-               LPCWSTR lpFileName,
-      DWORD dwReserved
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FileEncryptionStatusA(
-          LPCSTR lpFileName,
-         LPDWORD  lpStatus
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-FileEncryptionStatusW(
-          LPCWSTR lpFileName,
-         LPDWORD  lpStatus
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-typedef
-DWORD
-(__stdcall *PFE_EXPORT_FUNC)(
-           PBYTE pbData,
-           PVOID pvCallbackContext,
-             ULONG ulLength
-    );
-
-typedef
-DWORD
-(__stdcall *PFE_IMPORT_FUNC)(
-           PBYTE pbData,
-           PVOID pvCallbackContext,
-          PULONG ulLength
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-OpenEncryptedFileRawA(
-                LPCSTR lpFileName,
-                ULONG    ulFlags,
-                  PVOID   *pvContext
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-OpenEncryptedFileRawW(
-                LPCWSTR lpFileName,
-                ULONG    ulFlags,
-                  PVOID   *pvContext
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-ReadEncryptedFileRaw(
-             PFE_EXPORT_FUNC pfExportCallback,
-           PVOID           pvCallbackContext,
-             PVOID           pvContext
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-WriteEncryptedFileRaw(
-             PFE_IMPORT_FUNC pfImportCallback,
-           PVOID           pvCallbackContext,
-             PVOID           pvContext
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-CloseEncryptedFileRaw(
-         PVOID           pvContext
-    );
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-lstrcmpA(
-         LPCSTR lpString1,
-         LPCSTR lpString2
-    );
-__declspec(dllimport)
-int
-__stdcall
-lstrcmpW(
-         LPCWSTR lpString1,
-         LPCWSTR lpString2
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-lstrcmpiA(
-         LPCSTR lpString1,
-         LPCSTR lpString2
-    );
-__declspec(dllimport)
-int
-__stdcall
-lstrcmpiW(
-         LPCWSTR lpString1,
-         LPCWSTR lpString2
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-LPSTR
-__stdcall
-lstrcpynA(
-         LPSTR lpString1,
-         LPCSTR lpString2,
-         int iMaxLength
-    );
-__declspec(dllimport)
-    
-LPWSTR
-__stdcall
-lstrcpynW(
-         LPWSTR lpString1,
-         LPCWSTR lpString2,
-         int iMaxLength
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-LPSTR
-__stdcall
-lstrcpyA(
-         LPSTR lpString1,
-          LPCSTR lpString2
-    );
-__declspec(dllimport)
-    
-LPWSTR
-__stdcall
-lstrcpyW(
-         LPWSTR lpString1,
-          LPCWSTR lpString2
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-LPSTR
-__stdcall
-lstrcatA(
-         LPSTR lpString1,
-            LPCSTR lpString2
-    );
-__declspec(dllimport)
-    
-LPWSTR
-__stdcall
-lstrcatW(
-         LPWSTR lpString1,
-            LPCWSTR lpString2
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-lstrlenA(
-         LPCSTR lpString
-    );
-__declspec(dllimport)
-int
-__stdcall
-lstrlenW(
-         LPCWSTR lpString
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HFILE
-__stdcall
-OpenFile(
-            LPCSTR lpFileName,
-         LPOFSTRUCT lpReOpenBuff,
-            UINT uStyle
-    );
-
-__declspec(dllimport)
-    
-HFILE
-__stdcall
-_lopen(
-         LPCSTR lpPathName,
-         int iReadWrite
-    );
-
-__declspec(dllimport)
-    
-HFILE
-__stdcall
-_lcreat(
-         LPCSTR lpPathName,
-         int  iAttribute
-    );
-
-__declspec(dllimport)
-UINT
-__stdcall
-_lread(
-         HFILE hFile,
-           LPVOID lpBuffer,
-         UINT uBytes
-    );
-
-__declspec(dllimport)
-UINT
-__stdcall
-_lwrite(
-         HFILE hFile,
-           LPCCH lpBuffer,
-         UINT uBytes
-    );
-
-__declspec(dllimport)
-long
-__stdcall
-_hread(
-         HFILE hFile,
-           LPVOID lpBuffer,
-         long lBytes
-    );
-
-__declspec(dllimport)
-long
-__stdcall
-_hwrite(
-         HFILE hFile,
-           LPCCH lpBuffer,
-         long lBytes
-    );
-
-__declspec(dllimport)
-HFILE
-__stdcall
-_lclose(
-         HFILE hFile
-    );
-
-__declspec(dllimport)
-LONG
-__stdcall
-_llseek(
-         HFILE hFile,
-         LONG lOffset,
-         int iOrigin
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsTextUnicode(
-           const void* lpv,
-                int iSize,
-           LPINT lpiResult
-    );
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-FlsAlloc(
-           PFLS_CALLBACK_FUNCTION lpCallback
-    );
-
-__declspec(dllimport)
-PVOID
-__stdcall
-FlsGetValue(
-         DWORD dwFlsIndex
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FlsSetValue(
-             DWORD dwFlsIndex,
-           PVOID lpFlsData
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FlsFree(
-         DWORD dwFlsIndex
-    );
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-TlsAlloc(
-    void
-    );
-
-__declspec(dllimport)
-LPVOID
-__stdcall
-TlsGetValue(
-         DWORD dwTlsIndex
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-TlsSetValue(
-             DWORD dwTlsIndex,
-           LPVOID lpTlsValue
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-TlsFree(
-         DWORD dwTlsIndex
-    );
-
-typedef
-void
-(__stdcall *LPOVERLAPPED_COMPLETION_ROUTINE)(
-            DWORD dwErrorCode,
-            DWORD dwNumberOfBytesTransfered,
-         LPOVERLAPPED lpOverlapped
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-SleepEx(
-         DWORD dwMilliseconds,
-         BOOL bAlertable
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-WaitForSingleObjectEx(
-         HANDLE hHandle,
-         DWORD dwMilliseconds,
-         BOOL bAlertable
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-WaitForMultipleObjectsEx(
-         DWORD nCount,
-           const HANDLE *lpHandles,
-         BOOL bWaitAll,
-         DWORD dwMilliseconds,
-         BOOL bAlertable
-    );
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-SignalObjectAndWait(
-         HANDLE hObjectToSignal,
-         HANDLE hObjectToWaitOn,
-         DWORD dwMilliseconds,
-         BOOL bAlertable
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReadFileEx(
-             HANDLE hFile,
-         LPVOID lpBuffer,
-             DWORD nNumberOfBytesToRead,
-          LPOVERLAPPED lpOverlapped,
-           LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteFileEx(
-             HANDLE hFile,
-           LPCVOID lpBuffer,
-             DWORD nNumberOfBytesToWrite,
-          LPOVERLAPPED lpOverlapped,
-           LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-BackupRead(
-            HANDLE hFile,
-           LPBYTE lpBuffer,
-            DWORD nNumberOfBytesToRead,
-           LPDWORD lpNumberOfBytesRead,
-            BOOL bAbort,
-            BOOL bProcessSecurity,
-         LPVOID *lpContext
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-BackupSeek(
-            HANDLE hFile,
-            DWORD  dwLowBytesToSeek,
-            DWORD  dwHighBytesToSeek,
-           LPDWORD lpdwLowByteSeeked,
-           LPDWORD lpdwHighByteSeeked,
-         LPVOID *lpContext
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-BackupWrite(
-            HANDLE hFile,
-           LPBYTE lpBuffer,
-            DWORD nNumberOfBytesToWrite,
-           LPDWORD lpNumberOfBytesWritten,
-            BOOL bAbort,
-            BOOL bProcessSecurity,
-         LPVOID *lpContext
-    );
-
-
-
-
-typedef struct _WIN32_STREAM_ID {
-        DWORD          dwStreamId ;
-        DWORD          dwStreamAttributes ;
-        LARGE_INTEGER  Size ;
-        DWORD          dwStreamNameSize ;
-        WCHAR          cStreamName[ 1 ] ;
-} WIN32_STREAM_ID, *LPWIN32_STREAM_ID ;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReadFileScatter(
-               HANDLE hFile,
-               FILE_SEGMENT_ELEMENT aSegmentArray[],
-               DWORD nNumberOfBytesToRead,
-      LPDWORD lpReserved,
-            LPOVERLAPPED lpOverlapped
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteFileGather(
-               HANDLE hFile,
-               FILE_SEGMENT_ELEMENT aSegmentArray[],
-               DWORD nNumberOfBytesToWrite,
-      LPDWORD lpReserved,
-            LPOVERLAPPED lpOverlapped
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _STARTUPINFOA {
-    DWORD   cb;
-    LPSTR   lpReserved;
-    LPSTR   lpDesktop;
-    LPSTR   lpTitle;
-    DWORD   dwX;
-    DWORD   dwY;
-    DWORD   dwXSize;
-    DWORD   dwYSize;
-    DWORD   dwXCountChars;
-    DWORD   dwYCountChars;
-    DWORD   dwFillAttribute;
-    DWORD   dwFlags;
-    WORD    wShowWindow;
-    WORD    cbReserved2;
-    LPBYTE  lpReserved2;
-    HANDLE  hStdInput;
-    HANDLE  hStdOutput;
-    HANDLE  hStdError;
-} STARTUPINFOA, *LPSTARTUPINFOA;
-typedef struct _STARTUPINFOW {
-    DWORD   cb;
-    LPWSTR  lpReserved;
-    LPWSTR  lpDesktop;
-    LPWSTR  lpTitle;
-    DWORD   dwX;
-    DWORD   dwY;
-    DWORD   dwXSize;
-    DWORD   dwYSize;
-    DWORD   dwXCountChars;
-    DWORD   dwYCountChars;
-    DWORD   dwFillAttribute;
-    DWORD   dwFlags;
-    WORD    wShowWindow;
-    WORD    cbReserved2;
-    LPBYTE  lpReserved2;
-    HANDLE  hStdInput;
-    HANDLE  hStdOutput;
-    HANDLE  hStdError;
-} STARTUPINFOW, *LPSTARTUPINFOW;
-
-typedef STARTUPINFOW STARTUPINFO;
-typedef LPSTARTUPINFOW LPSTARTUPINFO;
-
-
-
-
-
-
-
-typedef struct _WIN32_FIND_DATAA {
-    DWORD dwFileAttributes;
-    FILETIME ftCreationTime;
-    FILETIME ftLastAccessTime;
-    FILETIME ftLastWriteTime;
-    DWORD nFileSizeHigh;
-    DWORD nFileSizeLow;
-    DWORD dwReserved0;
-    DWORD dwReserved1;
-    CHAR   cFileName[ 260 ];
-    CHAR   cAlternateFileName[ 14 ];
-
-
-
-
-
-} WIN32_FIND_DATAA, *PWIN32_FIND_DATAA, *LPWIN32_FIND_DATAA;
-typedef struct _WIN32_FIND_DATAW {
-    DWORD dwFileAttributes;
-    FILETIME ftCreationTime;
-    FILETIME ftLastAccessTime;
-    FILETIME ftLastWriteTime;
-    DWORD nFileSizeHigh;
-    DWORD nFileSizeLow;
-    DWORD dwReserved0;
-    DWORD dwReserved1;
-    WCHAR  cFileName[ 260 ];
-    WCHAR  cAlternateFileName[ 14 ];
-
-
-
-
-
-} WIN32_FIND_DATAW, *PWIN32_FIND_DATAW, *LPWIN32_FIND_DATAW;
-
-typedef WIN32_FIND_DATAW WIN32_FIND_DATA;
-typedef PWIN32_FIND_DATAW PWIN32_FIND_DATA;
-typedef LPWIN32_FIND_DATAW LPWIN32_FIND_DATA;
-
-
-
-
-
-
-typedef struct _WIN32_FILE_ATTRIBUTE_DATA {
-    DWORD dwFileAttributes;
-    FILETIME ftCreationTime;
-    FILETIME ftLastAccessTime;
-    FILETIME ftLastWriteTime;
-    DWORD nFileSizeHigh;
-    DWORD nFileSizeLow;
-} WIN32_FILE_ATTRIBUTE_DATA, *LPWIN32_FILE_ATTRIBUTE_DATA;
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateMutexA(
-           LPSECURITY_ATTRIBUTES lpMutexAttributes,
-             BOOL bInitialOwner,
-           LPCSTR lpName
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateMutexW(
-           LPSECURITY_ATTRIBUTES lpMutexAttributes,
-             BOOL bInitialOwner,
-           LPCWSTR lpName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenMutexA(
-         DWORD dwDesiredAccess,
-         BOOL bInheritHandle,
-         LPCSTR lpName
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenMutexW(
-         DWORD dwDesiredAccess,
-         BOOL bInheritHandle,
-         LPCWSTR lpName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateEventA(
-           LPSECURITY_ATTRIBUTES lpEventAttributes,
-             BOOL bManualReset,
-             BOOL bInitialState,
-           LPCSTR lpName
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateEventW(
-           LPSECURITY_ATTRIBUTES lpEventAttributes,
-             BOOL bManualReset,
-             BOOL bInitialState,
-           LPCWSTR lpName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenEventA(
-         DWORD dwDesiredAccess,
-         BOOL bInheritHandle,
-         LPCSTR lpName
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenEventW(
-         DWORD dwDesiredAccess,
-         BOOL bInheritHandle,
-         LPCWSTR lpName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateSemaphoreA(
-           LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
-             LONG lInitialCount,
-             LONG lMaximumCount,
-           LPCSTR lpName
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateSemaphoreW(
-           LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
-             LONG lInitialCount,
-             LONG lMaximumCount,
-           LPCWSTR lpName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenSemaphoreA(
-         DWORD dwDesiredAccess,
-         BOOL bInheritHandle,
-         LPCSTR lpName
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenSemaphoreW(
-         DWORD dwDesiredAccess,
-         BOOL bInheritHandle,
-         LPCWSTR lpName
-    );
-
-
-
-
-
-
-
-typedef
-void
-(__stdcall *PTIMERAPCROUTINE)(
-           LPVOID lpArgToCompletionRoutine,
-             DWORD dwTimerLowValue,
-             DWORD dwTimerHighValue
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateWaitableTimerA(
-           LPSECURITY_ATTRIBUTES lpTimerAttributes,
-             BOOL bManualReset,
-           LPCSTR lpTimerName
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateWaitableTimerW(
-           LPSECURITY_ATTRIBUTES lpTimerAttributes,
-             BOOL bManualReset,
-           LPCWSTR lpTimerName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenWaitableTimerA(
-         DWORD dwDesiredAccess,
-         BOOL bInheritHandle,
-         LPCSTR lpTimerName
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenWaitableTimerW(
-         DWORD dwDesiredAccess,
-         BOOL bInheritHandle,
-         LPCWSTR lpTimerName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetWaitableTimer(
-             HANDLE hTimer,
-             const LARGE_INTEGER *lpDueTime,
-             LONG lPeriod,
-           PTIMERAPCROUTINE pfnCompletionRoutine,
-           LPVOID lpArgToCompletionRoutine,
-             BOOL fResume
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CancelWaitableTimer(
-         HANDLE hTimer
-    );
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateFileMappingA(
-             HANDLE hFile,
-           LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
-             DWORD flProtect,
-             DWORD dwMaximumSizeHigh,
-             DWORD dwMaximumSizeLow,
-           LPCSTR lpName
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateFileMappingW(
-             HANDLE hFile,
-           LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
-             DWORD flProtect,
-             DWORD dwMaximumSizeHigh,
-             DWORD dwMaximumSizeLow,
-           LPCWSTR lpName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenFileMappingA(
-         DWORD dwDesiredAccess,
-         BOOL bInheritHandle,
-         LPCSTR lpName
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenFileMappingW(
-         DWORD dwDesiredAccess,
-         BOOL bInheritHandle,
-         LPCWSTR lpName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetLogicalDriveStringsA(
-         DWORD nBufferLength,
-             LPSTR lpBuffer
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetLogicalDriveStringsW(
-         DWORD nBufferLength,
-             LPWSTR lpBuffer
-    );
-
-
-
-
-
-
-
-
-typedef enum _MEMORY_RESOURCE_NOTIFICATION_TYPE {
-    LowMemoryResourceNotification,
-    HighMemoryResourceNotification
-} MEMORY_RESOURCE_NOTIFICATION_TYPE;
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateMemoryResourceNotification(
-         MEMORY_RESOURCE_NOTIFICATION_TYPE NotificationType
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-QueryMemoryResourceNotification(
-          HANDLE ResourceNotificationHandle,
-         PBOOL  ResourceState
-    );
-
-
-
-
-__declspec(dllimport)
-    
-HMODULE
-__stdcall
-LoadLibraryA(
-         LPCSTR lpLibFileName
-    );
-__declspec(dllimport)
-    
-HMODULE
-__stdcall
-LoadLibraryW(
-         LPCWSTR lpLibFileName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HMODULE
-__stdcall
-LoadLibraryExA(
-               LPCSTR lpLibFileName,
-      HANDLE hFile,
-               DWORD dwFlags
-    );
-__declspec(dllimport)
-    
-HMODULE
-__stdcall
-LoadLibraryExW(
-               LPCWSTR lpLibFileName,
-      HANDLE hFile,
-               DWORD dwFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetModuleFileNameA(
-           HMODULE hModule,
-           LPCH lpFilename,
-             DWORD nSize
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetModuleFileNameW(
-           HMODULE hModule,
-           LPWCH lpFilename,
-             DWORD nSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HMODULE
-__stdcall
-GetModuleHandleA(
-           LPCSTR lpModuleName
-    );
-__declspec(dllimport)
-    
-HMODULE
-__stdcall
-GetModuleHandleW(
-           LPCWSTR lpModuleName
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef
-BOOL
-(__stdcall*
-PGET_MODULE_HANDLE_EXA)(
-                DWORD        dwFlags,
-              LPCSTR     lpModuleName,
-                  HMODULE*    phModule
-    );
-typedef
-BOOL
-(__stdcall*
-PGET_MODULE_HANDLE_EXW)(
-                DWORD        dwFlags,
-              LPCWSTR     lpModuleName,
-                  HMODULE*    phModule
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetModuleHandleExA(
-                DWORD    dwFlags,
-              LPCSTR lpModuleName,
-         HMODULE* phModule
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetModuleHandleExW(
-                DWORD    dwFlags,
-              LPCWSTR lpModuleName,
-         HMODULE* phModule
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateProcessA(
-              LPCSTR lpApplicationName,
-           LPSTR lpCommandLine,
-              LPSECURITY_ATTRIBUTES lpProcessAttributes,
-              LPSECURITY_ATTRIBUTES lpThreadAttributes,
-                BOOL bInheritHandles,
-                DWORD dwCreationFlags,
-              LPVOID lpEnvironment,
-              LPCSTR lpCurrentDirectory,
-                LPSTARTUPINFOA lpStartupInfo,
-               LPPROCESS_INFORMATION lpProcessInformation
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateProcessW(
-              LPCWSTR lpApplicationName,
-           LPWSTR lpCommandLine,
-              LPSECURITY_ATTRIBUTES lpProcessAttributes,
-              LPSECURITY_ATTRIBUTES lpThreadAttributes,
-                BOOL bInheritHandles,
-                DWORD dwCreationFlags,
-              LPVOID lpEnvironment,
-              LPCWSTR lpCurrentDirectory,
-                LPSTARTUPINFOW lpStartupInfo,
-               LPPROCESS_INFORMATION lpProcessInformation
-    );
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetProcessShutdownParameters(
-         DWORD dwLevel,
-         DWORD dwFlags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetProcessShutdownParameters(
-         LPDWORD lpdwLevel,
-         LPDWORD lpdwFlags
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetProcessVersion(
-         DWORD ProcessId
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-FatalAppExitA(
-         UINT uAction,
-         LPCSTR lpMessageText
-    );
-__declspec(dllimport)
-void
-__stdcall
-FatalAppExitW(
-         UINT uAction,
-         LPCWSTR lpMessageText
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-GetStartupInfoA(
-         LPSTARTUPINFOA lpStartupInfo
-    );
-__declspec(dllimport)
-void
-__stdcall
-GetStartupInfoW(
-         LPSTARTUPINFOW lpStartupInfo
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-LPSTR
-__stdcall
-GetCommandLineA(
-    void
-    );
-__declspec(dllimport)
-    
-LPWSTR
-__stdcall
-GetCommandLineW(
-    void
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetEnvironmentVariableA(
-         LPCSTR lpName,
-             LPSTR lpBuffer,
-         DWORD nSize
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetEnvironmentVariableW(
-         LPCWSTR lpName,
-             LPWSTR lpBuffer,
-         DWORD nSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetEnvironmentVariableA(
-             LPCSTR lpName,
-           LPCSTR lpValue
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-SetEnvironmentVariableW(
-             LPCWSTR lpName,
-           LPCWSTR lpValue
-    );
-
-
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-ExpandEnvironmentStringsA(
-         LPCSTR lpSrc,
-             LPSTR lpDst,
-         DWORD nSize
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-ExpandEnvironmentStringsW(
-         LPCWSTR lpSrc,
-             LPWSTR lpDst,
-         DWORD nSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetFirmwareEnvironmentVariableA(
-         LPCSTR lpName,
-         LPCSTR lpGuid,
-             PVOID pBuffer,
-         DWORD    nSize
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetFirmwareEnvironmentVariableW(
-         LPCWSTR lpName,
-         LPCWSTR lpGuid,
-             PVOID pBuffer,
-         DWORD    nSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetFirmwareEnvironmentVariableA(
-         LPCSTR lpName,
-         LPCSTR lpGuid,
-             PVOID pValue,
-         DWORD    nSize
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-SetFirmwareEnvironmentVariableW(
-         LPCWSTR lpName,
-         LPCWSTR lpGuid,
-             PVOID pValue,
-         DWORD    nSize
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-OutputDebugStringA(
-         LPCSTR lpOutputString
-    );
-__declspec(dllimport)
-void
-__stdcall
-OutputDebugStringW(
-         LPCWSTR lpOutputString
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HRSRC
-__stdcall
-FindResourceA(
-           HMODULE hModule,
-             LPCSTR lpName,
-             LPCSTR lpType
-    );
-__declspec(dllimport)
-    
-HRSRC
-__stdcall
-FindResourceW(
-           HMODULE hModule,
-             LPCWSTR lpName,
-             LPCWSTR lpType
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HRSRC
-__stdcall
-FindResourceExA(
-           HMODULE hModule,
-             LPCSTR lpType,
-             LPCSTR lpName,
-             WORD    wLanguage
-    );
-__declspec(dllimport)
-    
-HRSRC
-__stdcall
-FindResourceExW(
-           HMODULE hModule,
-             LPCWSTR lpType,
-             LPCWSTR lpName,
-             WORD    wLanguage
-    );
-
-
-
-
-
-
-
-typedef BOOL (__stdcall* ENUMRESTYPEPROCA)(       HMODULE hModule,      LPSTR lpType,
-     LONG_PTR lParam);
-typedef BOOL (__stdcall* ENUMRESTYPEPROCW)(       HMODULE hModule,      LPWSTR lpType,
-     LONG_PTR lParam);
-
-
-
-
-
-typedef BOOL (__stdcall* ENUMRESNAMEPROCA)(       HMODULE hModule,      LPCSTR lpType,
-     LPSTR lpName,      LONG_PTR lParam);
-typedef BOOL (__stdcall* ENUMRESNAMEPROCW)(       HMODULE hModule,      LPCWSTR lpType,
-     LPWSTR lpName,      LONG_PTR lParam);
-
-
-
-
-
-typedef BOOL (__stdcall* ENUMRESLANGPROCA)(       HMODULE hModule,      LPCSTR lpType,
-     LPCSTR lpName,      WORD  wLanguage,      LONG_PTR lParam);
-typedef BOOL (__stdcall* ENUMRESLANGPROCW)(       HMODULE hModule,      LPCWSTR lpType,
-     LPCWSTR lpName,      WORD  wLanguage,      LONG_PTR lParam);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumResourceTypesA(
-           HMODULE hModule,
-             ENUMRESTYPEPROCA lpEnumFunc,
-             LONG_PTR lParam
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumResourceTypesW(
-           HMODULE hModule,
-             ENUMRESTYPEPROCW lpEnumFunc,
-             LONG_PTR lParam
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumResourceNamesA(
-           HMODULE hModule,
-             LPCSTR lpType,
-             ENUMRESNAMEPROCA lpEnumFunc,
-             LONG_PTR lParam
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumResourceNamesW(
-           HMODULE hModule,
-             LPCWSTR lpType,
-             ENUMRESNAMEPROCW lpEnumFunc,
-             LONG_PTR lParam
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumResourceLanguagesA(
-           HMODULE hModule,
-             LPCSTR lpType,
-             LPCSTR lpName,
-             ENUMRESLANGPROCA lpEnumFunc,
-             LONG_PTR lParam
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumResourceLanguagesW(
-           HMODULE hModule,
-             LPCWSTR lpType,
-             LPCWSTR lpName,
-             ENUMRESLANGPROCW lpEnumFunc,
-             LONG_PTR lParam
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-BeginUpdateResourceA(
-         LPCSTR pFileName,
-         BOOL bDeleteExistingResources
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-BeginUpdateResourceW(
-         LPCWSTR pFileName,
-         BOOL bDeleteExistingResources
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UpdateResourceA(
-         HANDLE hUpdate,
-         LPCSTR lpType,
-         LPCSTR lpName,
-         WORD wLanguage,
-             LPVOID lpData,
-         DWORD cb
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-UpdateResourceW(
-         HANDLE hUpdate,
-         LPCWSTR lpType,
-         LPCWSTR lpName,
-         WORD wLanguage,
-             LPVOID lpData,
-         DWORD cb
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EndUpdateResourceA(
-         HANDLE hUpdate,
-         BOOL   fDiscard
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-EndUpdateResourceW(
-         HANDLE hUpdate,
-         BOOL   fDiscard
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-ATOM
-__stdcall
-GlobalAddAtomA(
-           LPCSTR lpString
-    );
-__declspec(dllimport)
-    
-ATOM
-__stdcall
-GlobalAddAtomW(
-           LPCWSTR lpString
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-ATOM
-__stdcall
-GlobalFindAtomA(
-           LPCSTR lpString
-    );
-__declspec(dllimport)
-    
-ATOM
-__stdcall
-GlobalFindAtomW(
-           LPCWSTR lpString
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GlobalGetAtomNameA(
-         ATOM nAtom,
-           LPSTR lpBuffer,
-         int nSize
-    );
-__declspec(dllimport)
-UINT
-__stdcall
-GlobalGetAtomNameW(
-         ATOM nAtom,
-           LPWSTR lpBuffer,
-         int nSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-ATOM
-__stdcall
-AddAtomA(
-           LPCSTR lpString
-    );
-__declspec(dllimport)
-    
-ATOM
-__stdcall
-AddAtomW(
-           LPCWSTR lpString
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-ATOM
-__stdcall
-FindAtomA(
-           LPCSTR lpString
-    );
-__declspec(dllimport)
-    
-ATOM
-__stdcall
-FindAtomW(
-           LPCWSTR lpString
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetAtomNameA(
-         ATOM nAtom,
-           LPSTR lpBuffer,
-         int nSize
-    );
-__declspec(dllimport)
-UINT
-__stdcall
-GetAtomNameW(
-         ATOM nAtom,
-           LPWSTR lpBuffer,
-         int nSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetProfileIntA(
-         LPCSTR lpAppName,
-         LPCSTR lpKeyName,
-         INT nDefault
-    );
-__declspec(dllimport)
-UINT
-__stdcall
-GetProfileIntW(
-         LPCWSTR lpAppName,
-         LPCWSTR lpKeyName,
-         INT nDefault
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetProfileStringA(
-           LPCSTR lpAppName,
-           LPCSTR lpKeyName,
-           LPCSTR lpDefault,
-             LPSTR lpReturnedString,
-             DWORD nSize
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetProfileStringW(
-           LPCWSTR lpAppName,
-           LPCWSTR lpKeyName,
-           LPCWSTR lpDefault,
-             LPWSTR lpReturnedString,
-             DWORD nSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteProfileStringA(
-           LPCSTR lpAppName,
-           LPCSTR lpKeyName,
-           LPCSTR lpString
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteProfileStringW(
-           LPCWSTR lpAppName,
-           LPCWSTR lpKeyName,
-           LPCWSTR lpString
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetProfileSectionA(
-         LPCSTR lpAppName,
-             LPSTR lpReturnedString,
-         DWORD nSize
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetProfileSectionW(
-         LPCWSTR lpAppName,
-             LPWSTR lpReturnedString,
-         DWORD nSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteProfileSectionA(
-         LPCSTR lpAppName,
-         LPCSTR lpString
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteProfileSectionW(
-         LPCWSTR lpAppName,
-         LPCWSTR lpString
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetPrivateProfileIntA(
-             LPCSTR lpAppName,
-             LPCSTR lpKeyName,
-             INT nDefault,
-           LPCSTR lpFileName
-    );
-__declspec(dllimport)
-UINT
-__stdcall
-GetPrivateProfileIntW(
-             LPCWSTR lpAppName,
-             LPCWSTR lpKeyName,
-             INT nDefault,
-           LPCWSTR lpFileName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetPrivateProfileStringA(
-           LPCSTR lpAppName,
-           LPCSTR lpKeyName,
-           LPCSTR lpDefault,
-             LPSTR lpReturnedString,
-             DWORD nSize,
-           LPCSTR lpFileName
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetPrivateProfileStringW(
-           LPCWSTR lpAppName,
-           LPCWSTR lpKeyName,
-           LPCWSTR lpDefault,
-             LPWSTR lpReturnedString,
-             DWORD nSize,
-           LPCWSTR lpFileName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WritePrivateProfileStringA(
-           LPCSTR lpAppName,
-           LPCSTR lpKeyName,
-           LPCSTR lpString,
-           LPCSTR lpFileName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-WritePrivateProfileStringW(
-           LPCWSTR lpAppName,
-           LPCWSTR lpKeyName,
-           LPCWSTR lpString,
-           LPCWSTR lpFileName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetPrivateProfileSectionA(
-             LPCSTR lpAppName,
-             LPSTR lpReturnedString,
-             DWORD nSize,
-           LPCSTR lpFileName
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetPrivateProfileSectionW(
-             LPCWSTR lpAppName,
-             LPWSTR lpReturnedString,
-             DWORD nSize,
-           LPCWSTR lpFileName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WritePrivateProfileSectionA(
-             LPCSTR lpAppName,
-             LPCSTR lpString,
-           LPCSTR lpFileName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-WritePrivateProfileSectionW(
-             LPCWSTR lpAppName,
-             LPCWSTR lpString,
-           LPCWSTR lpFileName
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetPrivateProfileSectionNamesA(
-             LPSTR lpszReturnBuffer,
-             DWORD nSize,
-           LPCSTR lpFileName
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetPrivateProfileSectionNamesW(
-             LPWSTR lpszReturnBuffer,
-             DWORD nSize,
-           LPCWSTR lpFileName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetPrivateProfileStructA(
-             LPCSTR lpszSection,
-             LPCSTR lpszKey,
-           LPVOID   lpStruct,
-             UINT     uSizeStruct,
-           LPCSTR szFile
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetPrivateProfileStructW(
-             LPCWSTR lpszSection,
-             LPCWSTR lpszKey,
-           LPVOID   lpStruct,
-             UINT     uSizeStruct,
-           LPCWSTR szFile
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WritePrivateProfileStructA(
-             LPCSTR lpszSection,
-             LPCSTR lpszKey,
-             LPVOID lpStruct,
-             UINT     uSizeStruct,
-           LPCSTR szFile
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-WritePrivateProfileStructW(
-             LPCWSTR lpszSection,
-             LPCWSTR lpszKey,
-             LPVOID lpStruct,
-             UINT     uSizeStruct,
-           LPCWSTR szFile
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetDriveTypeA(
-           LPCSTR lpRootPathName
-    );
-__declspec(dllimport)
-UINT
-__stdcall
-GetDriveTypeW(
-           LPCWSTR lpRootPathName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetSystemDirectoryA(
-             LPSTR lpBuffer,
-         UINT uSize
-    );
-__declspec(dllimport)
-UINT
-__stdcall
-GetSystemDirectoryW(
-             LPWSTR lpBuffer,
-         UINT uSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetTempPathA(
-         DWORD nBufferLength,
-           LPSTR lpBuffer
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetTempPathW(
-         DWORD nBufferLength,
-           LPWSTR lpBuffer
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetTempFileNameA(
-         LPCSTR lpPathName,
-         LPCSTR lpPrefixString,
-         UINT uUnique,
-         LPSTR lpTempFileName
-    );
-__declspec(dllimport)
-UINT
-__stdcall
-GetTempFileNameW(
-         LPCWSTR lpPathName,
-         LPCWSTR lpPrefixString,
-         UINT uUnique,
-         LPWSTR lpTempFileName
-    );
-
-
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetWindowsDirectoryA(
-             LPSTR lpBuffer,
-         UINT uSize
-    );
-__declspec(dllimport)
-UINT
-__stdcall
-GetWindowsDirectoryW(
-             LPWSTR lpBuffer,
-         UINT uSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetSystemWindowsDirectoryA(
-             LPSTR lpBuffer,
-         UINT uSize
-    );
-__declspec(dllimport)
-UINT
-__stdcall
-GetSystemWindowsDirectoryW(
-             LPWSTR lpBuffer,
-         UINT uSize
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetSystemWow64DirectoryA(
-             LPSTR lpBuffer,
-         UINT uSize
-    );
-__declspec(dllimport)
-UINT
-__stdcall
-GetSystemWow64DirectoryW(
-             LPWSTR lpBuffer,
-         UINT uSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOLEAN
-__stdcall
-Wow64EnableWow64FsRedirection (
-         BOOLEAN Wow64FsEnableRedirection
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-Wow64DisableWow64FsRedirection (
-         PVOID *OldValue
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-Wow64RevertWow64FsRedirection (
-         PVOID OlValue
-    );
-    
-
-
-
-
-typedef UINT (__stdcall* PGET_SYSTEM_WOW64_DIRECTORY_A)(         LPSTR lpBuffer,      UINT uSize);
-typedef UINT (__stdcall* PGET_SYSTEM_WOW64_DIRECTORY_W)(         LPWSTR lpBuffer,      UINT uSize);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetCurrentDirectoryA(
-         LPCSTR lpPathName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-SetCurrentDirectoryW(
-         LPCWSTR lpPathName
-    );
-
-
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetCurrentDirectoryA(
-         DWORD nBufferLength,
-             LPSTR lpBuffer
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetCurrentDirectoryW(
-         DWORD nBufferLength,
-             LPWSTR lpBuffer
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetDiskFreeSpaceA(
-            LPCSTR lpRootPathName,
-           LPDWORD lpSectorsPerCluster,
-           LPDWORD lpBytesPerSector,
-           LPDWORD lpNumberOfFreeClusters,
-           LPDWORD lpTotalNumberOfClusters
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetDiskFreeSpaceW(
-            LPCWSTR lpRootPathName,
-           LPDWORD lpSectorsPerCluster,
-           LPDWORD lpBytesPerSector,
-           LPDWORD lpNumberOfFreeClusters,
-           LPDWORD lpTotalNumberOfClusters
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetDiskFreeSpaceExA(
-            LPCSTR lpDirectoryName,
-           PULARGE_INTEGER lpFreeBytesAvailableToCaller,
-           PULARGE_INTEGER lpTotalNumberOfBytes,
-           PULARGE_INTEGER lpTotalNumberOfFreeBytes
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetDiskFreeSpaceExW(
-            LPCWSTR lpDirectoryName,
-           PULARGE_INTEGER lpFreeBytesAvailableToCaller,
-           PULARGE_INTEGER lpTotalNumberOfBytes,
-           PULARGE_INTEGER lpTotalNumberOfFreeBytes
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateDirectoryA(
-             LPCSTR lpPathName,
-           LPSECURITY_ATTRIBUTES lpSecurityAttributes
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateDirectoryW(
-             LPCWSTR lpPathName,
-           LPSECURITY_ATTRIBUTES lpSecurityAttributes
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateDirectoryExA(
-             LPCSTR lpTemplateDirectory,
-             LPCSTR lpNewDirectory,
-           LPSECURITY_ATTRIBUTES lpSecurityAttributes
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateDirectoryExW(
-             LPCWSTR lpTemplateDirectory,
-             LPCWSTR lpNewDirectory,
-           LPSECURITY_ATTRIBUTES lpSecurityAttributes
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-RemoveDirectoryA(
-         LPCSTR lpPathName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-RemoveDirectoryW(
-         LPCWSTR lpPathName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetFullPathNameA(
-                    LPCSTR lpFileName,
-                    DWORD nBufferLength,
-             LPSTR lpBuffer,
-                    LPSTR *lpFilePart
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetFullPathNameW(
-                    LPCWSTR lpFileName,
-                    DWORD nBufferLength,
-             LPWSTR lpBuffer,
-                    LPWSTR *lpFilePart
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DefineDosDeviceA(
-             DWORD dwFlags,
-             LPCSTR lpDeviceName,
-           LPCSTR lpTargetPath
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-DefineDosDeviceW(
-             DWORD dwFlags,
-             LPCWSTR lpDeviceName,
-           LPCWSTR lpTargetPath
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-QueryDosDeviceA(
-           LPCSTR lpDeviceName,
-             LPSTR lpTargetPath,
-             DWORD ucchMax
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-QueryDosDeviceW(
-           LPCWSTR lpDeviceName,
-             LPWSTR lpTargetPath,
-             DWORD ucchMax
-    );
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateFileA(
-             LPCSTR lpFileName,
-             DWORD dwDesiredAccess,
-             DWORD dwShareMode,
-           LPSECURITY_ATTRIBUTES lpSecurityAttributes,
-             DWORD dwCreationDisposition,
-             DWORD dwFlagsAndAttributes,
-           HANDLE hTemplateFile
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateFileW(
-             LPCWSTR lpFileName,
-             DWORD dwDesiredAccess,
-             DWORD dwShareMode,
-           LPSECURITY_ATTRIBUTES lpSecurityAttributes,
-             DWORD dwCreationDisposition,
-             DWORD dwFlagsAndAttributes,
-           HANDLE hTemplateFile
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetFileAttributesA(
-         LPCSTR lpFileName,
-         DWORD dwFileAttributes
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-SetFileAttributesW(
-         LPCWSTR lpFileName,
-         DWORD dwFileAttributes
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetFileAttributesA(
-         LPCSTR lpFileName
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetFileAttributesW(
-         LPCWSTR lpFileName
-    );
-
-
-
-
-
-
-typedef enum _GET_FILEEX_INFO_LEVELS {
-    GetFileExInfoStandard,
-    GetFileExMaxInfoLevel
-} GET_FILEEX_INFO_LEVELS;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetFileAttributesExA(
-          LPCSTR lpFileName,
-          GET_FILEEX_INFO_LEVELS fInfoLevelId,
-         LPVOID lpFileInformation
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetFileAttributesExW(
-          LPCWSTR lpFileName,
-          GET_FILEEX_INFO_LEVELS fInfoLevelId,
-         LPVOID lpFileInformation
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetCompressedFileSizeA(
-          LPCSTR lpFileName,
-         LPDWORD  lpFileSizeHigh
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetCompressedFileSizeW(
-          LPCWSTR lpFileName,
-         LPDWORD  lpFileSizeHigh
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DeleteFileA(
-         LPCSTR lpFileName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-DeleteFileW(
-         LPCWSTR lpFileName
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CheckNameLegalDOS8Dot3A(
-              LPCSTR lpName,
-           LPSTR lpOemName,
-              DWORD OemNameSize,
-           PBOOL pbNameContainsSpaces ,
-             PBOOL pbNameLegal
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CheckNameLegalDOS8Dot3W(
-              LPCWSTR lpName,
-           LPSTR lpOemName,
-              DWORD OemNameSize,
-           PBOOL pbNameContainsSpaces ,
-             PBOOL pbNameLegal
-    );
-
-
-
-
-
-
-
-
-
-typedef enum _FINDEX_INFO_LEVELS {
-    FindExInfoStandard,
-    FindExInfoMaxInfoLevel
-} FINDEX_INFO_LEVELS;
-
-typedef enum _FINDEX_SEARCH_OPS {
-    FindExSearchNameMatch,
-    FindExSearchLimitToDirectories,
-    FindExSearchLimitToDevices,
-    FindExSearchMaxSearchOp
-} FINDEX_SEARCH_OPS;
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-FindFirstFileExA(
-               LPCSTR lpFileName,
-               FINDEX_INFO_LEVELS fInfoLevelId,
-              LPVOID lpFindFileData,
-               FINDEX_SEARCH_OPS fSearchOp,
-      LPVOID lpSearchFilter,
-               DWORD dwAdditionalFlags
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-FindFirstFileExW(
-               LPCWSTR lpFileName,
-               FINDEX_INFO_LEVELS fInfoLevelId,
-              LPVOID lpFindFileData,
-               FINDEX_SEARCH_OPS fSearchOp,
-      LPVOID lpSearchFilter,
-               DWORD dwAdditionalFlags
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-FindFirstFileA(
-          LPCSTR lpFileName,
-         LPWIN32_FIND_DATAA lpFindFileData
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-FindFirstFileW(
-          LPCWSTR lpFileName,
-         LPWIN32_FIND_DATAW lpFindFileData
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FindNextFileA(
-          HANDLE hFindFile,
-         LPWIN32_FIND_DATAA lpFindFileData
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-FindNextFileW(
-          HANDLE hFindFile,
-         LPWIN32_FIND_DATAW lpFindFileData
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-SearchPathA(
-            LPCSTR lpPath,
-              LPCSTR lpFileName,
-            LPCSTR lpExtension,
-              DWORD nBufferLength,
-             LPSTR lpBuffer,
-           LPSTR *lpFilePart
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-SearchPathW(
-            LPCWSTR lpPath,
-              LPCWSTR lpFileName,
-            LPCWSTR lpExtension,
-              DWORD nBufferLength,
-             LPWSTR lpBuffer,
-           LPWSTR *lpFilePart
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CopyFileA(
-         LPCSTR lpExistingFileName,
-         LPCSTR lpNewFileName,
-         BOOL bFailIfExists
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CopyFileW(
-         LPCWSTR lpExistingFileName,
-         LPCWSTR lpNewFileName,
-         BOOL bFailIfExists
-    );
-
-
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef
-DWORD
-(__stdcall *LPPROGRESS_ROUTINE)(
-             LARGE_INTEGER TotalFileSize,
-             LARGE_INTEGER TotalBytesTransferred,
-             LARGE_INTEGER StreamSize,
-             LARGE_INTEGER StreamBytesTransferred,
-             DWORD dwStreamNumber,
-             DWORD dwCallbackReason,
-             HANDLE hSourceFile,
-             HANDLE hDestinationFile,
-           LPVOID lpData
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CopyFileExA(
-             LPCSTR lpExistingFileName,
-             LPCSTR lpNewFileName,
-           LPPROGRESS_ROUTINE lpProgressRoutine,
-           LPVOID lpData,
-           LPBOOL pbCancel,
-             DWORD dwCopyFlags
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CopyFileExW(
-             LPCWSTR lpExistingFileName,
-             LPCWSTR lpNewFileName,
-           LPPROGRESS_ROUTINE lpProgressRoutine,
-           LPVOID lpData,
-           LPBOOL pbCancel,
-             DWORD dwCopyFlags
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-MoveFileA(
-         LPCSTR lpExistingFileName,
-         LPCSTR lpNewFileName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-MoveFileW(
-         LPCWSTR lpExistingFileName,
-         LPCWSTR lpNewFileName
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-MoveFileExA(
-         LPCSTR lpExistingFileName,
-         LPCSTR lpNewFileName,
-         DWORD dwFlags
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-MoveFileExW(
-         LPCWSTR lpExistingFileName,
-         LPCWSTR lpNewFileName,
-         DWORD dwFlags
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-MoveFileWithProgressA(
-             LPCSTR lpExistingFileName,
-             LPCSTR lpNewFileName,
-           LPPROGRESS_ROUTINE lpProgressRoutine,
-           LPVOID lpData,
-             DWORD dwFlags
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-MoveFileWithProgressW(
-             LPCWSTR lpExistingFileName,
-             LPCWSTR lpNewFileName,
-           LPPROGRESS_ROUTINE lpProgressRoutine,
-           LPVOID lpData,
-             DWORD dwFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReplaceFileA(
-               LPCSTR  lpReplacedFileName,
-               LPCSTR  lpReplacementFileName,
-             LPCSTR  lpBackupFileName,
-               DWORD   dwReplaceFlags,
-      LPVOID  lpExclude,
-      LPVOID  lpReserved
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-ReplaceFileW(
-               LPCWSTR lpReplacedFileName,
-               LPCWSTR lpReplacementFileName,
-             LPCWSTR lpBackupFileName,
-               DWORD   dwReplaceFlags,
-      LPVOID  lpExclude,
-      LPVOID  lpReserved
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateHardLinkA(
-               LPCSTR lpFileName,
-               LPCSTR lpExistingFileName,
-      LPSECURITY_ATTRIBUTES lpSecurityAttributes
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateHardLinkW(
-               LPCWSTR lpFileName,
-               LPCWSTR lpExistingFileName,
-      LPSECURITY_ATTRIBUTES lpSecurityAttributes
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _STREAM_INFO_LEVELS {
-    
-    FindStreamInfoStandard,
-    FindStreamInfoMaxInfoLevel
-
-} STREAM_INFO_LEVELS;
-
-typedef struct _WIN32_FIND_STREAM_DATA {
-    
-    LARGE_INTEGER StreamSize;
-    WCHAR cStreamName[ 260 + 36 ]; 
-
-} WIN32_FIND_STREAM_DATA, *PWIN32_FIND_STREAM_DATA; 
-
-    
-HANDLE
-__stdcall
-FindFirstStreamW(
-               LPCWSTR lpFileName,
-               STREAM_INFO_LEVELS InfoLevel,
-              LPVOID lpFindStreamData,
-      DWORD dwFlags
-    );
-
-BOOL
-__stdcall
-FindNextStreamW(
-          HANDLE hFindStream,
-         LPVOID lpFindStreamData
-    );
-
-
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateNamedPipeA(
-             LPCSTR lpName,
-             DWORD dwOpenMode,
-             DWORD dwPipeMode,
-             DWORD nMaxInstances,
-             DWORD nOutBufferSize,
-             DWORD nInBufferSize,
-             DWORD nDefaultTimeOut,
-           LPSECURITY_ATTRIBUTES lpSecurityAttributes
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateNamedPipeW(
-             LPCWSTR lpName,
-             DWORD dwOpenMode,
-             DWORD dwPipeMode,
-             DWORD nMaxInstances,
-             DWORD nOutBufferSize,
-             DWORD nInBufferSize,
-             DWORD nDefaultTimeOut,
-           LPSECURITY_ATTRIBUTES lpSecurityAttributes
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetNamedPipeHandleStateA(
-              HANDLE hNamedPipe,
-           LPDWORD lpState,
-           LPDWORD lpCurInstances,
-           LPDWORD lpMaxCollectionCount,
-           LPDWORD lpCollectDataTimeout,
-           LPSTR lpUserName,
-              DWORD nMaxUserNameSize
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetNamedPipeHandleStateW(
-              HANDLE hNamedPipe,
-           LPDWORD lpState,
-           LPDWORD lpCurInstances,
-           LPDWORD lpMaxCollectionCount,
-           LPDWORD lpCollectDataTimeout,
-           LPWSTR lpUserName,
-              DWORD nMaxUserNameSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CallNamedPipeA(
-          LPCSTR lpNamedPipeName,
-             LPVOID lpInBuffer,
-          DWORD nInBufferSize,
-             LPVOID lpOutBuffer,
-          DWORD nOutBufferSize,
-         LPDWORD lpBytesRead,
-          DWORD nTimeOut
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CallNamedPipeW(
-          LPCWSTR lpNamedPipeName,
-             LPVOID lpInBuffer,
-          DWORD nInBufferSize,
-             LPVOID lpOutBuffer,
-          DWORD nOutBufferSize,
-         LPDWORD lpBytesRead,
-          DWORD nTimeOut
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WaitNamedPipeA(
-         LPCSTR lpNamedPipeName,
-         DWORD nTimeOut
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-WaitNamedPipeW(
-         LPCWSTR lpNamedPipeName,
-         DWORD nTimeOut
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetVolumeLabelA(
-           LPCSTR lpRootPathName,
-           LPCSTR lpVolumeName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-SetVolumeLabelW(
-           LPCWSTR lpRootPathName,
-           LPCWSTR lpVolumeName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-SetFileApisToOEM( void );
-
-__declspec(dllimport)
-void
-__stdcall
-SetFileApisToANSI( void );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AreFileApisANSI( void );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetVolumeInformationA(
-            LPCSTR lpRootPathName,
-           LPSTR lpVolumeNameBuffer,
-              DWORD nVolumeNameSize,
-           LPDWORD lpVolumeSerialNumber,
-           LPDWORD lpMaximumComponentLength,
-           LPDWORD lpFileSystemFlags,
-           LPSTR lpFileSystemNameBuffer,
-              DWORD nFileSystemNameSize
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetVolumeInformationW(
-            LPCWSTR lpRootPathName,
-           LPWSTR lpVolumeNameBuffer,
-              DWORD nVolumeNameSize,
-           LPDWORD lpVolumeSerialNumber,
-           LPDWORD lpMaximumComponentLength,
-           LPDWORD lpFileSystemFlags,
-           LPWSTR lpFileSystemNameBuffer,
-              DWORD nFileSystemNameSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CancelIo(
-         HANDLE hFile
-    );
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ClearEventLogA (
-             HANDLE hEventLog,
-           LPCSTR lpBackupFileName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-ClearEventLogW (
-             HANDLE hEventLog,
-           LPCWSTR lpBackupFileName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-BackupEventLogA (
-         HANDLE hEventLog,
-         LPCSTR lpBackupFileName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-BackupEventLogW (
-         HANDLE hEventLog,
-         LPCWSTR lpBackupFileName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CloseEventLog (
-         HANDLE hEventLog
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DeregisterEventSource (
-         HANDLE hEventLog
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-NotifyChangeEventLog(
-         HANDLE  hEventLog,
-         HANDLE  hEvent
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetNumberOfEventLogRecords (
-          HANDLE hEventLog,
-         PDWORD NumberOfRecords
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetOldestEventLogRecord (
-          HANDLE hEventLog,
-         PDWORD OldestRecord
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenEventLogA (
-           LPCSTR lpUNCServerName,
-             LPCSTR lpSourceName
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenEventLogW (
-           LPCWSTR lpUNCServerName,
-             LPCWSTR lpSourceName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-RegisterEventSourceA (
-           LPCSTR lpUNCServerName,
-             LPCSTR lpSourceName
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-RegisterEventSourceW (
-           LPCWSTR lpUNCServerName,
-             LPCWSTR lpSourceName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenBackupEventLogA (
-           LPCSTR lpUNCServerName,
-             LPCSTR lpFileName
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenBackupEventLogW (
-           LPCWSTR lpUNCServerName,
-             LPCWSTR lpFileName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReadEventLogA (
-          HANDLE     hEventLog,
-          DWORD      dwReadFlags,
-          DWORD      dwRecordOffset,
-           LPVOID     lpBuffer,
-          DWORD      nNumberOfBytesToRead,
-         DWORD      *pnBytesRead,
-         DWORD      *pnMinNumberOfBytesNeeded
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-ReadEventLogW (
-          HANDLE     hEventLog,
-          DWORD      dwReadFlags,
-          DWORD      dwRecordOffset,
-           LPVOID     lpBuffer,
-          DWORD      nNumberOfBytesToRead,
-         DWORD      *pnBytesRead,
-         DWORD      *pnMinNumberOfBytesNeeded
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReportEventA (
-             HANDLE     hEventLog,
-             WORD       wType,
-             WORD       wCategory,
-             DWORD      dwEventID,
-           PSID       lpUserSid,
-             WORD       wNumStrings,
-             DWORD      dwDataSize,
-           LPCSTR   *lpStrings,
-             LPVOID lpRawData
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-ReportEventW (
-             HANDLE     hEventLog,
-             WORD       wType,
-             WORD       wCategory,
-             DWORD      dwEventID,
-           PSID       lpUserSid,
-             WORD       wNumStrings,
-             DWORD      dwDataSize,
-           LPCWSTR   *lpStrings,
-             LPVOID lpRawData
-    );
-
-
-
-
-
-
-
-
-
-typedef struct _EVENTLOG_FULL_INFORMATION
-{
-    DWORD    dwFull;
-}
-EVENTLOG_FULL_INFORMATION, *LPEVENTLOG_FULL_INFORMATION;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetEventLogInformation (
-          HANDLE     hEventLog,
-          DWORD      dwInfoLevel,
-           LPVOID lpBuffer,
-          DWORD      cbBufSize,
-         LPDWORD    pcbBytesNeeded
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DuplicateToken(
-                HANDLE ExistingTokenHandle,
-                SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
-                  PHANDLE DuplicateTokenHandle
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetKernelObjectSecurity (
-          HANDLE Handle,
-          SECURITY_INFORMATION RequestedInformation,
-         PSECURITY_DESCRIPTOR pSecurityDescriptor,
-          DWORD nLength,
-         LPDWORD lpnLengthNeeded
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ImpersonateNamedPipeClient(
-         HANDLE hNamedPipe
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ImpersonateSelf(
-         SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-RevertToSelf (
-    void
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetThreadToken (
-           PHANDLE Thread,
-           HANDLE Token
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AccessCheck (
-            PSECURITY_DESCRIPTOR pSecurityDescriptor,
-            HANDLE ClientToken,
-            DWORD DesiredAccess,
-            PGENERIC_MAPPING GenericMapping,
-           PPRIVILEGE_SET PrivilegeSet,
-         LPDWORD PrivilegeSetLength,
-           LPDWORD GrantedAccess,
-           LPBOOL AccessStatus
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AccessCheckByType (
-             PSECURITY_DESCRIPTOR pSecurityDescriptor,
-           PSID PrincipalSelfSid,
-             HANDLE ClientToken,
-             DWORD DesiredAccess,
-             POBJECT_TYPE_LIST ObjectTypeList,
-             DWORD ObjectTypeListLength,
-             PGENERIC_MAPPING GenericMapping,
-           PPRIVILEGE_SET PrivilegeSet,
-          LPDWORD PrivilegeSetLength,
-            LPDWORD GrantedAccess,
-            LPBOOL AccessStatus
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AccessCheckByTypeResultList (
-             PSECURITY_DESCRIPTOR pSecurityDescriptor,
-           PSID PrincipalSelfSid,
-             HANDLE ClientToken,
-             DWORD DesiredAccess,
-             POBJECT_TYPE_LIST ObjectTypeList,
-             DWORD ObjectTypeListLength,
-             PGENERIC_MAPPING GenericMapping,
-           PPRIVILEGE_SET PrivilegeSet,
-          LPDWORD PrivilegeSetLength,
-            LPDWORD GrantedAccessList,
-            LPDWORD AccessStatusList
-    );
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-OpenProcessToken (
-                HANDLE ProcessHandle,
-                DWORD DesiredAccess,
-                  PHANDLE TokenHandle
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-OpenThreadToken (
-                HANDLE ThreadHandle,
-                DWORD DesiredAccess,
-                BOOL OpenAsSelf,
-                  PHANDLE TokenHandle
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetTokenInformation (
-              HANDLE TokenHandle,
-              TOKEN_INFORMATION_CLASS TokenInformationClass,
-             LPVOID TokenInformation,
-              DWORD TokenInformationLength,
-           PDWORD ReturnLength
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetTokenInformation (
-         HANDLE TokenHandle,
-         TOKEN_INFORMATION_CLASS TokenInformationClass,
-           LPVOID TokenInformation,
-         DWORD TokenInformationLength
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AdjustTokenPrivileges (
-              HANDLE TokenHandle,
-              BOOL DisableAllPrivileges,
-            PTOKEN_PRIVILEGES NewState,
-              DWORD BufferLength,
-             PTOKEN_PRIVILEGES PreviousState,
-           PDWORD ReturnLength
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AdjustTokenGroups (
-              HANDLE TokenHandle,
-              BOOL ResetToDefault,
-            PTOKEN_GROUPS NewState,
-              DWORD BufferLength,
-             PTOKEN_GROUPS PreviousState,
-           PDWORD ReturnLength
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-PrivilegeCheck (
-            HANDLE ClientToken,
-         PPRIVILEGE_SET RequiredPrivileges,
-           LPBOOL pfResult
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AccessCheckAndAuditAlarmA (
-             LPCSTR SubsystemName,
-             LPVOID HandleId,
-             LPSTR ObjectTypeName,
-           LPSTR ObjectName,
-             PSECURITY_DESCRIPTOR SecurityDescriptor,
-             DWORD DesiredAccess,
-             PGENERIC_MAPPING GenericMapping,
-             BOOL ObjectCreation,
-            LPDWORD GrantedAccess,
-            LPBOOL AccessStatus,
-            LPBOOL pfGenerateOnClose
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-AccessCheckAndAuditAlarmW (
-             LPCWSTR SubsystemName,
-             LPVOID HandleId,
-             LPWSTR ObjectTypeName,
-           LPWSTR ObjectName,
-             PSECURITY_DESCRIPTOR SecurityDescriptor,
-             DWORD DesiredAccess,
-             PGENERIC_MAPPING GenericMapping,
-             BOOL ObjectCreation,
-            LPDWORD GrantedAccess,
-            LPBOOL AccessStatus,
-            LPBOOL pfGenerateOnClose
-    );
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AccessCheckByTypeAndAuditAlarmA (
-             LPCSTR SubsystemName,
-             LPVOID HandleId,
-             LPCSTR ObjectTypeName,
-           LPCSTR ObjectName,
-             PSECURITY_DESCRIPTOR SecurityDescriptor,
-           PSID PrincipalSelfSid,
-             DWORD DesiredAccess,
-             AUDIT_EVENT_TYPE AuditType,
-             DWORD Flags,
-             POBJECT_TYPE_LIST ObjectTypeList,
-             DWORD ObjectTypeListLength,
-             PGENERIC_MAPPING GenericMapping,
-             BOOL ObjectCreation,
-            LPDWORD GrantedAccess,
-            LPBOOL AccessStatus,
-            LPBOOL pfGenerateOnClose
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-AccessCheckByTypeAndAuditAlarmW (
-             LPCWSTR SubsystemName,
-             LPVOID HandleId,
-             LPCWSTR ObjectTypeName,
-           LPCWSTR ObjectName,
-             PSECURITY_DESCRIPTOR SecurityDescriptor,
-           PSID PrincipalSelfSid,
-             DWORD DesiredAccess,
-             AUDIT_EVENT_TYPE AuditType,
-             DWORD Flags,
-             POBJECT_TYPE_LIST ObjectTypeList,
-             DWORD ObjectTypeListLength,
-             PGENERIC_MAPPING GenericMapping,
-             BOOL ObjectCreation,
-            LPDWORD GrantedAccess,
-            LPBOOL AccessStatus,
-            LPBOOL pfGenerateOnClose
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AccessCheckByTypeResultListAndAuditAlarmA (
-             LPCSTR SubsystemName,
-             LPVOID HandleId,
-             LPCSTR ObjectTypeName,
-           LPCSTR ObjectName,
-             PSECURITY_DESCRIPTOR SecurityDescriptor,
-           PSID PrincipalSelfSid,
-             DWORD DesiredAccess,
-             AUDIT_EVENT_TYPE AuditType,
-             DWORD Flags,
-             POBJECT_TYPE_LIST ObjectTypeList,
-             DWORD ObjectTypeListLength,
-             PGENERIC_MAPPING GenericMapping,
-             BOOL ObjectCreation,
-            LPDWORD GrantedAccess,
-            LPDWORD AccessStatusList,
-            LPBOOL pfGenerateOnClose
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-AccessCheckByTypeResultListAndAuditAlarmW (
-             LPCWSTR SubsystemName,
-             LPVOID HandleId,
-             LPCWSTR ObjectTypeName,
-           LPCWSTR ObjectName,
-             PSECURITY_DESCRIPTOR SecurityDescriptor,
-           PSID PrincipalSelfSid,
-             DWORD DesiredAccess,
-             AUDIT_EVENT_TYPE AuditType,
-             DWORD Flags,
-             POBJECT_TYPE_LIST ObjectTypeList,
-             DWORD ObjectTypeListLength,
-             PGENERIC_MAPPING GenericMapping,
-             BOOL ObjectCreation,
-            LPDWORD GrantedAccess,
-            LPDWORD AccessStatusList,
-            LPBOOL pfGenerateOnClose
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AccessCheckByTypeResultListAndAuditAlarmByHandleA (
-             LPCSTR SubsystemName,
-             LPVOID HandleId,
-             HANDLE ClientToken,
-             LPCSTR ObjectTypeName,
-           LPCSTR ObjectName,
-             PSECURITY_DESCRIPTOR SecurityDescriptor,
-           PSID PrincipalSelfSid,
-             DWORD DesiredAccess,
-             AUDIT_EVENT_TYPE AuditType,
-             DWORD Flags,
-             POBJECT_TYPE_LIST ObjectTypeList,
-             DWORD ObjectTypeListLength,
-             PGENERIC_MAPPING GenericMapping,
-             BOOL ObjectCreation,
-            LPDWORD GrantedAccess,
-            LPDWORD AccessStatusList,
-            LPBOOL pfGenerateOnClose
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-AccessCheckByTypeResultListAndAuditAlarmByHandleW (
-             LPCWSTR SubsystemName,
-             LPVOID HandleId,
-             HANDLE ClientToken,
-             LPCWSTR ObjectTypeName,
-           LPCWSTR ObjectName,
-             PSECURITY_DESCRIPTOR SecurityDescriptor,
-           PSID PrincipalSelfSid,
-             DWORD DesiredAccess,
-             AUDIT_EVENT_TYPE AuditType,
-             DWORD Flags,
-             POBJECT_TYPE_LIST ObjectTypeList,
-             DWORD ObjectTypeListLength,
-             PGENERIC_MAPPING GenericMapping,
-             BOOL ObjectCreation,
-            LPDWORD GrantedAccess,
-            LPDWORD AccessStatusList,
-            LPBOOL pfGenerateOnClose
-    );
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ObjectOpenAuditAlarmA (
-             LPCSTR SubsystemName,
-             LPVOID HandleId,
-             LPSTR ObjectTypeName,
-           LPSTR ObjectName,
-             PSECURITY_DESCRIPTOR pSecurityDescriptor,
-             HANDLE ClientToken,
-             DWORD DesiredAccess,
-             DWORD GrantedAccess,
-           PPRIVILEGE_SET Privileges,
-             BOOL ObjectCreation,
-             BOOL AccessGranted,
-            LPBOOL GenerateOnClose
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-ObjectOpenAuditAlarmW (
-             LPCWSTR SubsystemName,
-             LPVOID HandleId,
-             LPWSTR ObjectTypeName,
-           LPWSTR ObjectName,
-             PSECURITY_DESCRIPTOR pSecurityDescriptor,
-             HANDLE ClientToken,
-             DWORD DesiredAccess,
-             DWORD GrantedAccess,
-           PPRIVILEGE_SET Privileges,
-             BOOL ObjectCreation,
-             BOOL AccessGranted,
-            LPBOOL GenerateOnClose
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ObjectPrivilegeAuditAlarmA (
-         LPCSTR SubsystemName,
-         LPVOID HandleId,
-         HANDLE ClientToken,
-         DWORD DesiredAccess,
-         PPRIVILEGE_SET Privileges,
-         BOOL AccessGranted
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-ObjectPrivilegeAuditAlarmW (
-         LPCWSTR SubsystemName,
-         LPVOID HandleId,
-         HANDLE ClientToken,
-         DWORD DesiredAccess,
-         PPRIVILEGE_SET Privileges,
-         BOOL AccessGranted
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ObjectCloseAuditAlarmA (
-         LPCSTR SubsystemName,
-         LPVOID HandleId,
-         BOOL GenerateOnClose
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-ObjectCloseAuditAlarmW (
-         LPCWSTR SubsystemName,
-         LPVOID HandleId,
-         BOOL GenerateOnClose
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ObjectDeleteAuditAlarmA (
-         LPCSTR SubsystemName,
-         LPVOID HandleId,
-         BOOL GenerateOnClose
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-ObjectDeleteAuditAlarmW (
-         LPCWSTR SubsystemName,
-         LPVOID HandleId,
-         BOOL GenerateOnClose
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-PrivilegedServiceAuditAlarmA (
-         LPCSTR SubsystemName,
-         LPCSTR ServiceName,
-         HANDLE ClientToken,
-         PPRIVILEGE_SET Privileges,
-         BOOL AccessGranted
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-PrivilegedServiceAuditAlarmW (
-         LPCWSTR SubsystemName,
-         LPCWSTR ServiceName,
-         HANDLE ClientToken,
-         PPRIVILEGE_SET Privileges,
-         BOOL AccessGranted
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsWellKnownSid (
-         PSID pSid,
-         WELL_KNOWN_SID_TYPE WellKnownSidType
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateWellKnownSid(
-             WELL_KNOWN_SID_TYPE WellKnownSidType,
-           PSID DomainSid,
-           PSID pSid,
-          DWORD *cbSid
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EqualDomainSid(
-          PSID pSid1,
-          PSID pSid2,
-         BOOL *pfEqual
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetWindowsAccountDomainSid(
-            PSID pSid,
-             PSID pDomainSid,
-         DWORD* cbDomainSid
-    );
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsValidSid (
-         PSID pSid
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EqualSid (
-         PSID pSid1,
-         PSID pSid2
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EqualPrefixSid (
-         PSID pSid1,
-         PSID pSid2
-    );
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetSidLengthRequired (
-         UCHAR nSubAuthorityCount
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AllocateAndInitializeSid (
-                PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority,
-                BYTE nSubAuthorityCount,
-                DWORD nSubAuthority0,
-                DWORD nSubAuthority1,
-                DWORD nSubAuthority2,
-                DWORD nSubAuthority3,
-                DWORD nSubAuthority4,
-                DWORD nSubAuthority5,
-                DWORD nSubAuthority6,
-                DWORD nSubAuthority7,
-                  PSID *pSid
-    );
-
-__declspec(dllimport)
-PVOID
-__stdcall
-FreeSid(
-         PSID pSid
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-InitializeSid (
-         PSID Sid,
-          PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority,
-          BYTE nSubAuthorityCount
-    );
-
-
-__declspec(dllimport)
-    
-PSID_IDENTIFIER_AUTHORITY
-__stdcall
-GetSidIdentifierAuthority (
-         PSID pSid
-    );
-
-
-__declspec(dllimport)
-    
-PDWORD
-__stdcall
-GetSidSubAuthority (
-         PSID pSid,
-         DWORD nSubAuthority
-    );
-
-
-__declspec(dllimport)
-    
-PUCHAR
-__stdcall
-GetSidSubAuthorityCount (
-         PSID pSid
-    );
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetLengthSid (
-         PSID pSid
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CopySid (
-         DWORD nDestinationSidLength,
-         PSID pDestinationSid,
-         PSID pSourceSid
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AreAllAccessesGranted (
-         DWORD GrantedAccess,
-         DWORD DesiredAccess
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AreAnyAccessesGranted (
-         DWORD GrantedAccess,
-         DWORD DesiredAccess
-    );
-
-
-__declspec(dllimport)
-void
-__stdcall
-MapGenericMask (
-         PDWORD AccessMask,
-            PGENERIC_MAPPING GenericMapping
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsValidAcl (
-         PACL pAcl
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-InitializeAcl (
-         PACL pAcl,
-         DWORD nAclLength,
-         DWORD dwAclRevision
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetAclInformation (
-         PACL pAcl,
-         LPVOID pAclInformation,
-         DWORD nAclInformationLength,
-         ACL_INFORMATION_CLASS dwAclInformationClass
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetAclInformation (
-         PACL pAcl,
-           LPVOID pAclInformation,
-            DWORD nAclInformationLength,
-            ACL_INFORMATION_CLASS dwAclInformationClass
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AddAce (
-         PACL pAcl,
-            DWORD dwAceRevision,
-            DWORD dwStartingAceIndex,
-           LPVOID pAceList,
-            DWORD nAceListLength
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DeleteAce (
-         PACL pAcl,
-            DWORD dwAceIndex
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetAce (
-                PACL pAcl,
-                DWORD dwAceIndex,
-                  LPVOID *pAce
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AddAccessAllowedAce (
-         PACL pAcl,
-            DWORD dwAceRevision,
-            DWORD AccessMask,
-            PSID pSid
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AddAccessAllowedAceEx (
-         PACL pAcl,
-            DWORD dwAceRevision,
-            DWORD AceFlags,
-            DWORD AccessMask,
-            PSID pSid
-    );
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AddAccessDeniedAce (
-         PACL pAcl,
-            DWORD dwAceRevision,
-            DWORD AccessMask,
-            PSID pSid
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AddAccessDeniedAceEx (
-         PACL pAcl,
-            DWORD dwAceRevision,
-            DWORD AceFlags,
-            DWORD AccessMask,
-            PSID pSid
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AddAuditAccessAce(
-         PACL pAcl,
-            DWORD dwAceRevision,
-            DWORD dwAccessMask,
-            PSID pSid,
-            BOOL bAuditSuccess,
-            BOOL bAuditFailure
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AddAuditAccessAceEx(
-         PACL pAcl,
-            DWORD dwAceRevision,
-            DWORD AceFlags,
-            DWORD dwAccessMask,
-            PSID pSid,
-            BOOL bAuditSuccess,
-            BOOL bAuditFailure
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AddAccessAllowedObjectAce (
-          PACL pAcl,
-             DWORD dwAceRevision,
-             DWORD AceFlags,
-             DWORD AccessMask,
-           GUID *ObjectTypeGuid,
-           GUID *InheritedObjectTypeGuid,
-             PSID pSid
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AddAccessDeniedObjectAce (
-          PACL pAcl,
-             DWORD dwAceRevision,
-             DWORD AceFlags,
-             DWORD AccessMask,
-           GUID *ObjectTypeGuid,
-           GUID *InheritedObjectTypeGuid,
-             PSID pSid
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AddAuditAccessObjectAce (
-          PACL pAcl,
-             DWORD dwAceRevision,
-             DWORD AceFlags,
-             DWORD AccessMask,
-           GUID *ObjectTypeGuid,
-           GUID *InheritedObjectTypeGuid,
-             PSID pSid,
-             BOOL bAuditSuccess,
-             BOOL bAuditFailure
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FindFirstFreeAce (
-                PACL pAcl,
-                  LPVOID *pAce
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-InitializeSecurityDescriptor (
-         PSECURITY_DESCRIPTOR pSecurityDescriptor,
-          DWORD dwRevision
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsValidSecurityDescriptor (
-         PSECURITY_DESCRIPTOR pSecurityDescriptor
-    );
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetSecurityDescriptorLength (
-         PSECURITY_DESCRIPTOR pSecurityDescriptor
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetSecurityDescriptorControl (
-          PSECURITY_DESCRIPTOR pSecurityDescriptor,
-         PSECURITY_DESCRIPTOR_CONTROL pControl,
-         LPDWORD lpdwRevision
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetSecurityDescriptorControl (
-         PSECURITY_DESCRIPTOR pSecurityDescriptor,
-         SECURITY_DESCRIPTOR_CONTROL ControlBitsOfInterest,
-         SECURITY_DESCRIPTOR_CONTROL ControlBitsToSet
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetSecurityDescriptorDacl (
-          PSECURITY_DESCRIPTOR pSecurityDescriptor,
-             BOOL bDaclPresent,
-           PACL pDacl,
-             BOOL bDaclDefaulted
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetSecurityDescriptorDacl (
-                PSECURITY_DESCRIPTOR pSecurityDescriptor,
-               LPBOOL lpbDaclPresent,
-                  PACL *pDacl,
-               LPBOOL lpbDaclDefaulted
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetSecurityDescriptorSacl (
-          PSECURITY_DESCRIPTOR pSecurityDescriptor,
-             BOOL bSaclPresent,
-           PACL pSacl,
-             BOOL bSaclDefaulted
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetSecurityDescriptorSacl (
-                PSECURITY_DESCRIPTOR pSecurityDescriptor,
-               LPBOOL lpbSaclPresent,
-                  PACL *pSacl,
-               LPBOOL lpbSaclDefaulted
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetSecurityDescriptorOwner (
-          PSECURITY_DESCRIPTOR pSecurityDescriptor,
-           PSID pOwner,
-             BOOL bOwnerDefaulted
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetSecurityDescriptorOwner (
-                PSECURITY_DESCRIPTOR pSecurityDescriptor,
-                  PSID *pOwner,
-               LPBOOL lpbOwnerDefaulted
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetSecurityDescriptorGroup (
-          PSECURITY_DESCRIPTOR pSecurityDescriptor,
-           PSID pGroup,
-             BOOL bGroupDefaulted
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetSecurityDescriptorGroup (
-                PSECURITY_DESCRIPTOR pSecurityDescriptor,
-                  PSID *pGroup,
-               LPBOOL lpbGroupDefaulted
-    );
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-SetSecurityDescriptorRMControl(
-          PSECURITY_DESCRIPTOR SecurityDescriptor,
-           PUCHAR RMControl
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetSecurityDescriptorRMControl(
-          PSECURITY_DESCRIPTOR SecurityDescriptor,
-         PUCHAR RMControl
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CreatePrivateObjectSecurity (
-              PSECURITY_DESCRIPTOR ParentDescriptor,
-              PSECURITY_DESCRIPTOR CreatorDescriptor,
-                  PSECURITY_DESCRIPTOR * NewDescriptor,
-                BOOL IsDirectoryObject,
-              HANDLE Token,
-                PGENERIC_MAPPING GenericMapping
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ConvertToAutoInheritPrivateObjectSecurity(
-              PSECURITY_DESCRIPTOR ParentDescriptor,
-                PSECURITY_DESCRIPTOR CurrentSecurityDescriptor,
-                  PSECURITY_DESCRIPTOR *NewSecurityDescriptor,
-              GUID *ObjectType,
-                BOOLEAN IsDirectoryObject,
-                PGENERIC_MAPPING GenericMapping
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CreatePrivateObjectSecurityEx (
-              PSECURITY_DESCRIPTOR ParentDescriptor,
-              PSECURITY_DESCRIPTOR CreatorDescriptor,
-                  PSECURITY_DESCRIPTOR * NewDescriptor,
-              GUID *ObjectType,
-                BOOL IsContainerObject,
-                ULONG AutoInheritFlags,
-              HANDLE Token,
-                PGENERIC_MAPPING GenericMapping
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CreatePrivateObjectSecurityWithMultipleInheritance (
-              PSECURITY_DESCRIPTOR ParentDescriptor,
-              PSECURITY_DESCRIPTOR CreatorDescriptor,
-                  PSECURITY_DESCRIPTOR * NewDescriptor,
-             GUID **ObjectTypes,
-                ULONG GuidCount,
-                BOOL IsContainerObject,
-                ULONG AutoInheritFlags,
-              HANDLE Token,
-                PGENERIC_MAPPING GenericMapping
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetPrivateObjectSecurity (
-                  SECURITY_INFORMATION SecurityInformation,
-                  PSECURITY_DESCRIPTOR ModificationDescriptor,
-             PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
-                  PGENERIC_MAPPING GenericMapping,
-                HANDLE Token
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetPrivateObjectSecurityEx (
-                  SECURITY_INFORMATION SecurityInformation,
-                  PSECURITY_DESCRIPTOR ModificationDescriptor,
-             PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
-                  ULONG AutoInheritFlags,
-                  PGENERIC_MAPPING GenericMapping,
-                HANDLE Token
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetPrivateObjectSecurity (
-          PSECURITY_DESCRIPTOR ObjectDescriptor,
-          SECURITY_INFORMATION SecurityInformation,
-             PSECURITY_DESCRIPTOR ResultantDescriptor,
-          DWORD DescriptorLength,
-         PDWORD ReturnLength
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DestroyPrivateObjectSecurity (
-     PSECURITY_DESCRIPTOR * ObjectDescriptor
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-MakeSelfRelativeSD (
-            PSECURITY_DESCRIPTOR pAbsoluteSecurityDescriptor,
-             PSECURITY_DESCRIPTOR pSelfRelativeSecurityDescriptor,
-         LPDWORD lpdwBufferLength
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-MakeAbsoluteSD (
-            PSECURITY_DESCRIPTOR pSelfRelativeSecurityDescriptor,
-             PSECURITY_DESCRIPTOR pAbsoluteSecurityDescriptor,
-         LPDWORD lpdwAbsoluteSecurityDescriptorSize,
-             PACL pDacl,
-         LPDWORD lpdwDaclSize,
-             PACL pSacl,
-         LPDWORD lpdwSaclSize,
-             PSID pOwner,
-         LPDWORD lpdwOwnerSize,
-             PSID pPrimaryGroup,
-         LPDWORD lpdwPrimaryGroupSize
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-MakeAbsoluteSD2 (
-               PSECURITY_DESCRIPTOR pSelfRelativeSecurityDescriptor,
-         LPDWORD lpdwBufferSize
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetFileSecurityA (
-         LPCSTR lpFileName,
-         SECURITY_INFORMATION SecurityInformation,
-         PSECURITY_DESCRIPTOR pSecurityDescriptor
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-SetFileSecurityW (
-         LPCWSTR lpFileName,
-         SECURITY_INFORMATION SecurityInformation,
-         PSECURITY_DESCRIPTOR pSecurityDescriptor
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetFileSecurityA (
-          LPCSTR lpFileName,
-          SECURITY_INFORMATION RequestedInformation,
-             PSECURITY_DESCRIPTOR pSecurityDescriptor,
-          DWORD nLength,
-         LPDWORD lpnLengthNeeded
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetFileSecurityW (
-          LPCWSTR lpFileName,
-          SECURITY_INFORMATION RequestedInformation,
-             PSECURITY_DESCRIPTOR pSecurityDescriptor,
-          DWORD nLength,
-         LPDWORD lpnLengthNeeded
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetKernelObjectSecurity (
-         HANDLE Handle,
-         SECURITY_INFORMATION SecurityInformation,
-         PSECURITY_DESCRIPTOR SecurityDescriptor
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-FindFirstChangeNotificationA(
-         LPCSTR lpPathName,
-         BOOL bWatchSubtree,
-         DWORD dwNotifyFilter
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-FindFirstChangeNotificationW(
-         LPCWSTR lpPathName,
-         BOOL bWatchSubtree,
-         DWORD dwNotifyFilter
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FindNextChangeNotification(
-         HANDLE hChangeHandle
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FindCloseChangeNotification(
-         HANDLE hChangeHandle
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReadDirectoryChangesW(
-             HANDLE hDirectory,
-           LPVOID lpBuffer,
-             DWORD nBufferLength,
-             BOOL bWatchSubtree,
-             DWORD dwNotifyFilter,
-            LPDWORD lpBytesReturned,
-          LPOVERLAPPED lpOverlapped,
-           LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-VirtualLock(
-         LPVOID lpAddress,
-         SIZE_T dwSize
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-VirtualUnlock(
-         LPVOID lpAddress,
-         SIZE_T dwSize
-    );
-
-__declspec(dllimport)
-    
-LPVOID
-__stdcall
-MapViewOfFileEx(
-             HANDLE hFileMappingObject,
-             DWORD dwDesiredAccess,
-             DWORD dwFileOffsetHigh,
-             DWORD dwFileOffsetLow,
-             SIZE_T dwNumberOfBytesToMap,
-           LPVOID lpBaseAddress
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetPriorityClass(
-         HANDLE hProcess,
-         DWORD dwPriorityClass
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetPriorityClass(
-         HANDLE hProcess
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsBadReadPtr(
-           const void *lp,
-             UINT_PTR ucb
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsBadWritePtr(
-           LPVOID lp,
-             UINT_PTR ucb
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsBadHugeReadPtr(
-           const void *lp,
-             UINT_PTR ucb
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsBadHugeWritePtr(
-           LPVOID lp,
-             UINT_PTR ucb
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsBadCodePtr(
-           FARPROC lpfn
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsBadStringPtrA(
-           LPCSTR lpsz,
-             UINT_PTR ucchMax
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-IsBadStringPtrW(
-           LPCWSTR lpsz,
-             UINT_PTR ucchMax
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-LookupAccountSidA(
-           LPCSTR lpSystemName,
-         PSID Sid,
-             LPSTR Name,
-          LPDWORD cchName,
-             LPSTR ReferencedDomainName,
-         LPDWORD cchReferencedDomainName,
-         PSID_NAME_USE peUse
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-LookupAccountSidW(
-           LPCWSTR lpSystemName,
-         PSID Sid,
-             LPWSTR Name,
-          LPDWORD cchName,
-             LPWSTR ReferencedDomainName,
-         LPDWORD cchReferencedDomainName,
-         PSID_NAME_USE peUse
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-LookupAccountNameA(
-           LPCSTR lpSystemName,
-             LPCSTR lpAccountName,
-             PSID Sid,
-          LPDWORD cbSid,
-             LPSTR ReferencedDomainName,
-          LPDWORD cchReferencedDomainName,
-            PSID_NAME_USE peUse
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-LookupAccountNameW(
-           LPCWSTR lpSystemName,
-             LPCWSTR lpAccountName,
-             PSID Sid,
-          LPDWORD cbSid,
-             LPWSTR ReferencedDomainName,
-          LPDWORD cchReferencedDomainName,
-            PSID_NAME_USE peUse
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-LookupPrivilegeValueA(
-           LPCSTR lpSystemName,
-             LPCSTR lpName,
-            PLUID   lpLuid
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-LookupPrivilegeValueW(
-           LPCWSTR lpSystemName,
-             LPCWSTR lpName,
-            PLUID   lpLuid
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-LookupPrivilegeNameA(
-           LPCSTR lpSystemName,
-             PLUID   lpLuid,
-             LPSTR lpName,
-          LPDWORD cchName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-LookupPrivilegeNameW(
-           LPCWSTR lpSystemName,
-             PLUID   lpLuid,
-             LPWSTR lpName,
-          LPDWORD cchName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-LookupPrivilegeDisplayNameA(
-           LPCSTR lpSystemName,
-             LPCSTR lpName,
-             LPSTR lpDisplayName,
-          LPDWORD cchDisplayName,
-            LPDWORD lpLanguageId
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-LookupPrivilegeDisplayNameW(
-           LPCWSTR lpSystemName,
-             LPCWSTR lpName,
-             LPWSTR lpDisplayName,
-          LPDWORD cchDisplayName,
-            LPDWORD lpLanguageId
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AllocateLocallyUniqueId(
-         PLUID Luid
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-BuildCommDCBA(
-          LPCSTR lpDef,
-         LPDCB lpDCB
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-BuildCommDCBW(
-          LPCWSTR lpDef,
-         LPDCB lpDCB
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-BuildCommDCBAndTimeoutsA(
-          LPCSTR lpDef,
-         LPDCB lpDCB,
-         LPCOMMTIMEOUTS lpCommTimeouts
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-BuildCommDCBAndTimeoutsW(
-          LPCWSTR lpDef,
-         LPDCB lpDCB,
-         LPCOMMTIMEOUTS lpCommTimeouts
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CommConfigDialogA(
-             LPCSTR lpszName,
-           HWND hWnd,
-          LPCOMMCONFIG lpCC
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CommConfigDialogW(
-             LPCWSTR lpszName,
-           HWND hWnd,
-          LPCOMMCONFIG lpCC
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetDefaultCommConfigA(
-            LPCSTR lpszName,
-           LPCOMMCONFIG lpCC,
-         LPDWORD lpdwSize
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetDefaultCommConfigW(
-            LPCWSTR lpszName,
-           LPCOMMCONFIG lpCC,
-         LPDWORD lpdwSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetDefaultCommConfigA(
-         LPCSTR lpszName,
-           LPCOMMCONFIG lpCC,
-         DWORD dwSize
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-SetDefaultCommConfigW(
-         LPCWSTR lpszName,
-           LPCOMMCONFIG lpCC,
-         DWORD dwSize
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetComputerNameA (
-           LPSTR lpBuffer,
-         LPDWORD nSize
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetComputerNameW (
-           LPWSTR lpBuffer,
-         LPDWORD nSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetComputerNameA (
-         LPCSTR lpComputerName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-SetComputerNameW (
-         LPCWSTR lpComputerName
-    );
-
-
-
-
-
-
-
-
-
-typedef enum _COMPUTER_NAME_FORMAT {
-    ComputerNameNetBIOS,
-    ComputerNameDnsHostname,
-    ComputerNameDnsDomain,
-    ComputerNameDnsFullyQualified,
-    ComputerNamePhysicalNetBIOS,
-    ComputerNamePhysicalDnsHostname,
-    ComputerNamePhysicalDnsDomain,
-    ComputerNamePhysicalDnsFullyQualified,
-    ComputerNameMax
-} COMPUTER_NAME_FORMAT ;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetComputerNameExA (
-            COMPUTER_NAME_FORMAT NameType,
-             LPSTR lpBuffer,
-         LPDWORD nSize
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetComputerNameExW (
-            COMPUTER_NAME_FORMAT NameType,
-             LPWSTR lpBuffer,
-         LPDWORD nSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetComputerNameExA (
-         COMPUTER_NAME_FORMAT NameType,
-         LPCSTR lpBuffer
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-SetComputerNameExW (
-         COMPUTER_NAME_FORMAT NameType,
-         LPCWSTR lpBuffer
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DnsHostnameToComputerNameA (
-            LPCSTR Hostname,
-             LPSTR ComputerName,
-         LPDWORD nSize
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-DnsHostnameToComputerNameW (
-            LPCWSTR Hostname,
-             LPWSTR ComputerName,
-         LPDWORD nSize
-    );
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetUserNameA (
-           LPSTR lpBuffer,
-         LPDWORD pcbBuffer
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetUserNameW (
-           LPWSTR lpBuffer,
-         LPDWORD pcbBuffer
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-LogonUserA (
-                LPCSTR lpszUsername,
-              LPCSTR lpszDomain,
-                LPCSTR lpszPassword,
-                DWORD dwLogonType,
-                DWORD dwLogonProvider,
-                  PHANDLE phToken
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-LogonUserW (
-                LPCWSTR lpszUsername,
-              LPCWSTR lpszDomain,
-                LPCWSTR lpszPassword,
-                DWORD dwLogonType,
-                DWORD dwLogonProvider,
-                  PHANDLE phToken
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-LogonUserExA (
-                    LPCSTR lpszUsername,
-                  LPCSTR lpszDomain,
-                    LPCSTR lpszPassword,
-                    DWORD dwLogonType,
-                    DWORD dwLogonProvider,
-                    PHANDLE phToken,
-                    PSID  *ppLogonSid,
-                       PVOID *ppProfileBuffer,
-                 LPDWORD pdwProfileLength,
-                 PQUOTA_LIMITS pQuotaLimits
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-LogonUserExW (
-                    LPCWSTR lpszUsername,
-                  LPCWSTR lpszDomain,
-                    LPCWSTR lpszPassword,
-                    DWORD dwLogonType,
-                    DWORD dwLogonProvider,
-                    PHANDLE phToken,
-                    PSID  *ppLogonSid,
-                       PVOID *ppProfileBuffer,
-                 LPDWORD pdwProfileLength,
-                 PQUOTA_LIMITS pQuotaLimits
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ImpersonateLoggedOnUser(
-         HANDLE  hToken
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateProcessAsUserA (
-              HANDLE hToken,
-              LPCSTR lpApplicationName,
-           LPSTR lpCommandLine,
-              LPSECURITY_ATTRIBUTES lpProcessAttributes,
-              LPSECURITY_ATTRIBUTES lpThreadAttributes,
-                BOOL bInheritHandles,
-                DWORD dwCreationFlags,
-              LPVOID lpEnvironment,
-              LPCSTR lpCurrentDirectory,
-                LPSTARTUPINFOA lpStartupInfo,
-               LPPROCESS_INFORMATION lpProcessInformation
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateProcessAsUserW (
-              HANDLE hToken,
-              LPCWSTR lpApplicationName,
-           LPWSTR lpCommandLine,
-              LPSECURITY_ATTRIBUTES lpProcessAttributes,
-              LPSECURITY_ATTRIBUTES lpThreadAttributes,
-                BOOL bInheritHandles,
-                DWORD dwCreationFlags,
-              LPVOID lpEnvironment,
-              LPCWSTR lpCurrentDirectory,
-                LPSTARTUPINFOW lpStartupInfo,
-               LPPROCESS_INFORMATION lpProcessInformation
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateProcessWithLogonW(
-                LPCWSTR lpUsername,
-              LPCWSTR lpDomain,
-                LPCWSTR lpPassword,
-                DWORD dwLogonFlags,
-              LPCWSTR lpApplicationName,
-           LPWSTR lpCommandLine,
-                DWORD dwCreationFlags,
-              LPVOID lpEnvironment,
-              LPCWSTR lpCurrentDirectory,
-                LPSTARTUPINFOW lpStartupInfo,
-               LPPROCESS_INFORMATION lpProcessInformation
-      );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateProcessWithTokenW(
-                HANDLE hToken,
-                DWORD dwLogonFlags,
-              LPCWSTR lpApplicationName,
-           LPWSTR lpCommandLine,
-                DWORD dwCreationFlags,
-              LPVOID lpEnvironment,
-              LPCWSTR lpCurrentDirectory,
-                LPSTARTUPINFOW lpStartupInfo,
-               LPPROCESS_INFORMATION lpProcessInformation
-      );
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ImpersonateAnonymousToken(
-         HANDLE ThreadHandle
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DuplicateTokenEx(
-                HANDLE hExistingToken,
-                DWORD dwDesiredAccess,
-              LPSECURITY_ATTRIBUTES lpTokenAttributes,
-                SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
-                TOKEN_TYPE TokenType,
-                  PHANDLE phNewToken);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateRestrictedToken(
-                HANDLE ExistingTokenHandle,
-                DWORD Flags,
-                DWORD DisableSidCount,
-             PSID_AND_ATTRIBUTES SidsToDisable,
-                DWORD DeletePrivilegeCount,
-             PLUID_AND_ATTRIBUTES PrivilegesToDelete,
-                DWORD RestrictedSidCount,
-             PSID_AND_ATTRIBUTES SidsToRestrict,
-                  PHANDLE NewTokenHandle
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsTokenRestricted(
-         HANDLE TokenHandle
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsTokenUntrusted(
-         HANDLE TokenHandle
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CheckTokenMembership(
-           HANDLE TokenHandle,
-             PSID SidToCheck,
-            PBOOL IsMember
-    );
-
-
-
-
-
-
-
-typedef WAITORTIMERCALLBACKFUNC WAITORTIMERCALLBACK ;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-RegisterWaitForSingleObject(
-                  PHANDLE phNewWaitObject,
-                HANDLE hObject,
-                WAITORTIMERCALLBACK Callback,
-              PVOID Context,
-                ULONG dwMilliseconds,
-                ULONG dwFlags
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-RegisterWaitForSingleObjectEx(
-             HANDLE hObject,
-             WAITORTIMERCALLBACK Callback,
-           PVOID Context,
-             ULONG dwMilliseconds,
-             ULONG dwFlags
-    );
-
-__declspec(dllimport)
-
-BOOL
-__stdcall
-UnregisterWait(
-         HANDLE WaitHandle
-    );
-
-__declspec(dllimport)
-
-BOOL
-__stdcall
-UnregisterWaitEx(
-             HANDLE WaitHandle,
-           HANDLE CompletionEvent
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-QueueUserWorkItem(
-             LPTHREAD_START_ROUTINE Function,
-           PVOID Context,
-             ULONG Flags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-BindIoCompletionCallback (
-         HANDLE FileHandle,
-         LPOVERLAPPED_COMPLETION_ROUTINE Function,
-         ULONG Flags
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateTimerQueue(
-    void
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateTimerQueueTimer(
-                  PHANDLE phNewTimer,
-              HANDLE TimerQueue,
-                WAITORTIMERCALLBACK Callback,
-              PVOID Parameter,
-                DWORD DueTime,
-                DWORD Period,
-                ULONG Flags
-    ) ;
-
-__declspec(dllimport)
-
-BOOL
-__stdcall
-ChangeTimerQueueTimer(
-           HANDLE TimerQueue,
-          HANDLE Timer,
-             ULONG DueTime,
-             ULONG Period
-    );
-
-__declspec(dllimport)
-
-BOOL
-__stdcall
-DeleteTimerQueueTimer(
-           HANDLE TimerQueue,
-             HANDLE Timer,
-           HANDLE CompletionEvent
-    );
-
-__declspec(dllimport)
-
-BOOL
-__stdcall
-DeleteTimerQueueEx(
-             HANDLE TimerQueue,
-           HANDLE CompletionEvent
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-SetTimerQueueTimer(
-           HANDLE TimerQueue,
-             WAITORTIMERCALLBACK Callback,
-           PVOID Parameter,
-             DWORD DueTime,
-             DWORD Period,
-             BOOL PreferIo
-    );
-
-__declspec(dllimport)
-
-BOOL
-__stdcall
-CancelTimerQueueTimer(
-           HANDLE TimerQueue,
-             HANDLE Timer
-    );
-
-__declspec(dllimport)
-
-BOOL
-__stdcall
-DeleteTimerQueue(
-         HANDLE TimerQueue
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagHW_PROFILE_INFOA {
-    DWORD  dwDockInfo;
-    CHAR   szHwProfileGuid[39];
-    CHAR   szHwProfileName[80];
-} HW_PROFILE_INFOA, *LPHW_PROFILE_INFOA;
-typedef struct tagHW_PROFILE_INFOW {
-    DWORD  dwDockInfo;
-    WCHAR  szHwProfileGuid[39];
-    WCHAR  szHwProfileName[80];
-} HW_PROFILE_INFOW, *LPHW_PROFILE_INFOW;
-
-typedef HW_PROFILE_INFOW HW_PROFILE_INFO;
-typedef LPHW_PROFILE_INFOW LPHW_PROFILE_INFO;
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetCurrentHwProfileA (
-         LPHW_PROFILE_INFOA  lpHwProfileInfo
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetCurrentHwProfileW (
-         LPHW_PROFILE_INFOW  lpHwProfileInfo
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-QueryPerformanceCounter(
-         LARGE_INTEGER *lpPerformanceCount
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-QueryPerformanceFrequency(
-         LARGE_INTEGER *lpFrequency
-    );
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetVersionExA(
-         LPOSVERSIONINFOA lpVersionInformation
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetVersionExW(
-         LPOSVERSIONINFOW lpVersionInformation
-    );
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-VerifyVersionInfoA(
-         LPOSVERSIONINFOEXA lpVersionInformation,
-            DWORD dwTypeMask,
-            DWORDLONG dwlConditionMask
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-VerifyVersionInfoW(
-         LPOSVERSIONINFOEXW lpVersionInformation,
-            DWORD dwTypeMask,
-            DWORDLONG dwlConditionMask
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
- 
- 
- 
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _SYSTEM_POWER_STATUS {
-    BYTE ACLineStatus;
-    BYTE BatteryFlag;
-    BYTE BatteryLifePercent;
-    BYTE Reserved1;
-    DWORD BatteryLifeTime;
-    DWORD BatteryFullLifeTime;
-}   SYSTEM_POWER_STATUS, *LPSYSTEM_POWER_STATUS;
-
-BOOL
-__stdcall
-GetSystemPowerStatus(
-         LPSYSTEM_POWER_STATUS lpSystemPowerStatus
-    );
-
-BOOL
-__stdcall
-SetSystemPowerState(
-         BOOL fSuspend,
-         BOOL fForce
-    );
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AllocateUserPhysicalPages(
-            HANDLE hProcess,
-         PULONG_PTR NumberOfPages,
-           PULONG_PTR PageArray
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FreeUserPhysicalPages(
-            HANDLE hProcess,
-         PULONG_PTR NumberOfPages,
-           PULONG_PTR PageArray
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-MapUserPhysicalPages(
-         PVOID VirtualAddress,
-         ULONG_PTR NumberOfPages,
-             PULONG_PTR PageArray
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-MapUserPhysicalPagesScatter(
-           PVOID *VirtualAddresses,
-         ULONG_PTR NumberOfPages,
-             PULONG_PTR PageArray
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateJobObjectA(
-           LPSECURITY_ATTRIBUTES lpJobAttributes,
-           LPCSTR lpName
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateJobObjectW(
-           LPSECURITY_ATTRIBUTES lpJobAttributes,
-           LPCWSTR lpName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenJobObjectA(
-         DWORD dwDesiredAccess,
-         BOOL bInheritHandle,
-         LPCSTR lpName
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-OpenJobObjectW(
-         DWORD dwDesiredAccess,
-         BOOL bInheritHandle,
-         LPCWSTR lpName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AssignProcessToJobObject(
-         HANDLE hJob,
-         HANDLE hProcess
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-TerminateJobObject(
-         HANDLE hJob,
-         UINT uExitCode
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-QueryInformationJobObject(
-            HANDLE hJob,
-              JOBOBJECTINFOCLASS JobObjectInformationClass,
-           LPVOID lpJobObjectInformation,
-              DWORD cbJobObjectInformationLength,
-           LPDWORD lpReturnLength
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetInformationJobObject(
-         HANDLE hJob,
-         JOBOBJECTINFOCLASS JobObjectInformationClass,
-           LPVOID lpJobObjectInformation,
-         DWORD cbJobObjectInformationLength
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsProcessInJob (
-             HANDLE ProcessHandle,
-           HANDLE JobHandle,
-            PBOOL Result
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateJobSet (
-         ULONG NumJob,
-           PJOB_SET_ARRAY UserJobSet,
-         ULONG Flags);
-
-__declspec(dllimport)
-    
-PVOID
-__stdcall
-AddVectoredExceptionHandler (
-         ULONG First,
-         PVECTORED_EXCEPTION_HANDLER Handler
-    );
-
-__declspec(dllimport)
-ULONG
-__stdcall
-RemoveVectoredExceptionHandler (
-         PVOID Handle
-    );
-
-__declspec(dllimport)
-    
-PVOID
-__stdcall
-AddVectoredContinueHandler (
-         ULONG First,
-         PVECTORED_EXCEPTION_HANDLER Handler
-    );
-
-__declspec(dllimport)
-ULONG
-__stdcall
-RemoveVectoredContinueHandler (
-         PVOID Handle
-    );
-
-
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-FindFirstVolumeA(
-         LPSTR lpszVolumeName,
-         DWORD cchBufferLength
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-FindFirstVolumeW(
-         LPWSTR lpszVolumeName,
-         DWORD cchBufferLength
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FindNextVolumeA(
-         HANDLE hFindVolume,
-         LPSTR lpszVolumeName,
-            DWORD cchBufferLength
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-FindNextVolumeW(
-         HANDLE hFindVolume,
-         LPWSTR lpszVolumeName,
-            DWORD cchBufferLength
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FindVolumeClose(
-         HANDLE hFindVolume
-    );
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-FindFirstVolumeMountPointA(
-         LPCSTR lpszRootPathName,
-         LPSTR lpszVolumeMountPoint,
-         DWORD cchBufferLength
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-FindFirstVolumeMountPointW(
-         LPCWSTR lpszRootPathName,
-         LPWSTR lpszVolumeMountPoint,
-         DWORD cchBufferLength
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FindNextVolumeMountPointA(
-         HANDLE hFindVolumeMountPoint,
-         LPSTR lpszVolumeMountPoint,
-         DWORD cchBufferLength
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-FindNextVolumeMountPointW(
-         HANDLE hFindVolumeMountPoint,
-         LPWSTR lpszVolumeMountPoint,
-         DWORD cchBufferLength
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FindVolumeMountPointClose(
-         HANDLE hFindVolumeMountPoint
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetVolumeMountPointA(
-         LPCSTR lpszVolumeMountPoint,
-         LPCSTR lpszVolumeName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-SetVolumeMountPointW(
-         LPCWSTR lpszVolumeMountPoint,
-         LPCWSTR lpszVolumeName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DeleteVolumeMountPointA(
-         LPCSTR lpszVolumeMountPoint
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-DeleteVolumeMountPointW(
-         LPCWSTR lpszVolumeMountPoint
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetVolumeNameForVolumeMountPointA(
-         LPCSTR lpszVolumeMountPoint,
-         LPSTR lpszVolumeName,
-         DWORD cchBufferLength
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetVolumeNameForVolumeMountPointW(
-         LPCWSTR lpszVolumeMountPoint,
-         LPWSTR lpszVolumeName,
-         DWORD cchBufferLength
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetVolumePathNameA(
-         LPCSTR lpszFileName,
-         LPSTR lpszVolumePathName,
-         DWORD cchBufferLength
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetVolumePathNameW(
-         LPCWSTR lpszFileName,
-         LPWSTR lpszVolumePathName,
-         DWORD cchBufferLength
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetVolumePathNamesForVolumeNameA(
-          LPCSTR lpszVolumeName,
-              LPCH lpszVolumePathNames,
-          DWORD cchBufferLength,
-         PDWORD lpcchReturnLength
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetVolumePathNamesForVolumeNameW(
-          LPCWSTR lpszVolumeName,
-              LPWCH lpszVolumePathNames,
-          DWORD cchBufferLength,
-         PDWORD lpcchReturnLength
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagACTCTXA {
-    ULONG       cbSize;
-    DWORD       dwFlags;
-    LPCSTR      lpSource;
-    USHORT      wProcessorArchitecture;
-    LANGID      wLangId;
-    LPCSTR      lpAssemblyDirectory;
-    LPCSTR      lpResourceName;
-    LPCSTR      lpApplicationName;
-    HMODULE     hModule;
-} ACTCTXA, *PACTCTXA;
-typedef struct tagACTCTXW {
-    ULONG       cbSize;
-    DWORD       dwFlags;
-    LPCWSTR     lpSource;
-    USHORT      wProcessorArchitecture;
-    LANGID      wLangId;
-    LPCWSTR     lpAssemblyDirectory;
-    LPCWSTR     lpResourceName;
-    LPCWSTR     lpApplicationName;
-    HMODULE     hModule;
-} ACTCTXW, *PACTCTXW;
-
-typedef ACTCTXW ACTCTX;
-typedef PACTCTXW PACTCTX;
-
-
-
-
-
-typedef const ACTCTXA *PCACTCTXA;
-typedef const ACTCTXW *PCACTCTXW;
-
-typedef ACTCTXW ACTCTX;
-typedef PCACTCTXW PCACTCTX;
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateActCtxA(
-         PCACTCTXA pActCtx
-    );
-__declspec(dllimport)
-    
-HANDLE
-__stdcall
-CreateActCtxW(
-         PCACTCTXW pActCtx
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-AddRefActCtx(
-         HANDLE hActCtx
-    );
-
-
-__declspec(dllimport)
-void
-__stdcall
-ReleaseActCtx(
-         HANDLE hActCtx
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ZombifyActCtx(
-         HANDLE hActCtx
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ActivateActCtx(
-         HANDLE hActCtx,
-           ULONG_PTR *lpCookie
-    );
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DeactivateActCtx(
-         DWORD dwFlags,
-         ULONG_PTR ulCookie
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetCurrentActCtx(
-                  HANDLE *lphActCtx);
-
-
-
-
-
-typedef struct tagACTCTX_SECTION_KEYED_DATA_2600 {
-    ULONG cbSize;
-    ULONG ulDataFormatVersion;
-    PVOID lpData;
-    ULONG ulLength;
-    PVOID lpSectionGlobalData;
-    ULONG ulSectionGlobalDataLength;
-    PVOID lpSectionBase;
-    ULONG ulSectionTotalLength;
-    HANDLE hActCtx;
-    ULONG ulAssemblyRosterIndex;
-} ACTCTX_SECTION_KEYED_DATA_2600, *PACTCTX_SECTION_KEYED_DATA_2600;
-typedef const ACTCTX_SECTION_KEYED_DATA_2600 * PCACTCTX_SECTION_KEYED_DATA_2600;
-
-typedef struct tagACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA {
-    PVOID lpInformation;
-    PVOID lpSectionBase;
-    ULONG ulSectionLength;
-    PVOID lpSectionGlobalDataBase;
-    ULONG ulSectionGlobalDataLength;
-} ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, *PACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA;
-typedef const ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA *PCACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA;
-
-typedef struct tagACTCTX_SECTION_KEYED_DATA {
-    ULONG cbSize;
-    ULONG ulDataFormatVersion;
-    PVOID lpData;
-    ULONG ulLength;
-    PVOID lpSectionGlobalData;
-    ULONG ulSectionGlobalDataLength;
-    PVOID lpSectionBase;
-    ULONG ulSectionTotalLength;
-    HANDLE hActCtx;
-    ULONG ulAssemblyRosterIndex;
-
-    ULONG ulFlags;
-    ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA AssemblyMetadata;
-} ACTCTX_SECTION_KEYED_DATA, *PACTCTX_SECTION_KEYED_DATA;
-typedef const ACTCTX_SECTION_KEYED_DATA * PCACTCTX_SECTION_KEYED_DATA;
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FindActCtxSectionStringA(
-               DWORD dwFlags,
-      const GUID *lpExtensionGuid,
-               ULONG ulSectionId,
-               LPCSTR lpStringToFind,
-              PACTCTX_SECTION_KEYED_DATA ReturnedData
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-FindActCtxSectionStringW(
-               DWORD dwFlags,
-      const GUID *lpExtensionGuid,
-               ULONG ulSectionId,
-               LPCWSTR lpStringToFind,
-              PACTCTX_SECTION_KEYED_DATA ReturnedData
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FindActCtxSectionGuid(
-               DWORD dwFlags,
-      const GUID *lpExtensionGuid,
-               ULONG ulSectionId,
-             const GUID *lpGuidToFind,
-              PACTCTX_SECTION_KEYED_DATA ReturnedData
-    );
-
-
-
-
-
-
-
-
-typedef struct _ACTIVATION_CONTEXT_BASIC_INFORMATION {
-    HANDLE  hActCtx;
-    DWORD   dwFlags;
-} ACTIVATION_CONTEXT_BASIC_INFORMATION, *PACTIVATION_CONTEXT_BASIC_INFORMATION;
-
-typedef const struct _ACTIVATION_CONTEXT_BASIC_INFORMATION *PCACTIVATION_CONTEXT_BASIC_INFORMATION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-QueryActCtxW(
-              DWORD dwFlags,
-              HANDLE hActCtx,
-            PVOID pvSubInstance,
-              ULONG ulInfoClass,
-             PVOID pvBuffer,
-              SIZE_T cbBuffer,
-           SIZE_T *pcbWrittenOrRequired
-    );
-
-typedef BOOL (__stdcall * PQUERYACTCTXW_FUNC)(
-              DWORD dwFlags,
-              HANDLE hActCtx,
-            PVOID pvSubInstance,
-              ULONG ulInfoClass,
-             PVOID pvBuffer,
-              SIZE_T cbBuffer,
-           SIZE_T *pcbWrittenOrRequired
-    );
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ProcessIdToSessionId(
-          DWORD dwProcessId,
-         DWORD *pSessionId
-    );
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-WTSGetActiveConsoleSessionId();
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsWow64Process(
-          HANDLE hProcess,
-         PBOOL Wow64Process
-    );
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetLogicalProcessorInformation(
-           PSYSTEM_LOGICAL_PROCESSOR_INFORMATION Buffer,
-         PDWORD ReturnedLength
-    );
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetNumaHighestNodeNumber(
-         PULONG HighestNodeNumber
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetNumaProcessorNode(
-          UCHAR Processor,
-         PUCHAR NodeNumber
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetNumaNodeProcessorMask(
-          UCHAR Node,
-         PULONGLONG ProcessorMask
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetNumaAvailableMemoryNode(
-          UCHAR Node,
-         PULONGLONG AvailableBytes
-    );
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _DRAWPATRECT {
-        POINT ptPosition;
-        POINT ptSize;
-        WORD wStyle;
-        WORD wPattern;
-} DRAWPATRECT, *PDRAWPATRECT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _PSINJECTDATA {
-
-    DWORD   DataBytes;      
-    WORD    InjectionPoint; 
-    WORD    PageNumber;     
-
-    
-
-} PSINJECTDATA, *PPSINJECTDATA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _PSFEATURE_OUTPUT {
-
-    BOOL bPageIndependent;
-    BOOL bSetPageDevice;
-
-} PSFEATURE_OUTPUT, *PPSFEATURE_OUTPUT;
-
-
-
-
-
-typedef struct _PSFEATURE_CUSTPAPER {
-
-    LONG lOrientation;
-    LONG lWidth;
-    LONG lHeight;
-    LONG lWidthOffset;
-    LONG lHeightOffset;
-
-} PSFEATURE_CUSTPAPER, *PPSFEATURE_CUSTPAPER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct  tagXFORM
-  {
-    FLOAT   eM11;
-    FLOAT   eM12;
-    FLOAT   eM21;
-    FLOAT   eM22;
-    FLOAT   eDx;
-    FLOAT   eDy;
-  } XFORM, *PXFORM,  *LPXFORM;
-
-
-typedef struct tagBITMAP
-  {
-    LONG        bmType;
-    LONG        bmWidth;
-    LONG        bmHeight;
-    LONG        bmWidthBytes;
-    WORD        bmPlanes;
-    WORD        bmBitsPixel;
-    LPVOID      bmBits;
-  } BITMAP, *PBITMAP,  *NPBITMAP,  *LPBITMAP;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,1)
-
-
-
-
-
-
-
-
-typedef struct tagRGBTRIPLE {
-        BYTE    rgbtBlue;
-        BYTE    rgbtGreen;
-        BYTE    rgbtRed;
-} RGBTRIPLE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-typedef struct tagRGBQUAD {
-        BYTE    rgbBlue;
-        BYTE    rgbGreen;
-        BYTE    rgbRed;
-        BYTE    rgbReserved;
-} RGBQUAD;
-typedef RGBQUAD * LPRGBQUAD;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef LONG   LCSCSTYPE;
-
-
-typedef LONG    LCSGAMUTMATCH;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef long            FXPT16DOT16,  *LPFXPT16DOT16;
-typedef long            FXPT2DOT30,  *LPFXPT2DOT30;
-
-
-
-
-typedef struct tagCIEXYZ
-{
-        FXPT2DOT30 ciexyzX;
-        FXPT2DOT30 ciexyzY;
-        FXPT2DOT30 ciexyzZ;
-} CIEXYZ;
-typedef CIEXYZ   *LPCIEXYZ;
-
-typedef struct tagICEXYZTRIPLE
-{
-        CIEXYZ  ciexyzRed;
-        CIEXYZ  ciexyzGreen;
-        CIEXYZ  ciexyzBlue;
-} CIEXYZTRIPLE;
-typedef CIEXYZTRIPLE     *LPCIEXYZTRIPLE;
-
-
-
-
-
-
-typedef struct tagLOGCOLORSPACEA {
-    DWORD lcsSignature;
-    DWORD lcsVersion;
-    DWORD lcsSize;
-    LCSCSTYPE lcsCSType;
-    LCSGAMUTMATCH lcsIntent;
-    CIEXYZTRIPLE lcsEndpoints;
-    DWORD lcsGammaRed;
-    DWORD lcsGammaGreen;
-    DWORD lcsGammaBlue;
-    CHAR   lcsFilename[260];
-} LOGCOLORSPACEA, *LPLOGCOLORSPACEA;
-typedef struct tagLOGCOLORSPACEW {
-    DWORD lcsSignature;
-    DWORD lcsVersion;
-    DWORD lcsSize;
-    LCSCSTYPE lcsCSType;
-    LCSGAMUTMATCH lcsIntent;
-    CIEXYZTRIPLE lcsEndpoints;
-    DWORD lcsGammaRed;
-    DWORD lcsGammaGreen;
-    DWORD lcsGammaBlue;
-    WCHAR  lcsFilename[260];
-} LOGCOLORSPACEW, *LPLOGCOLORSPACEW;
-
-typedef LOGCOLORSPACEW LOGCOLORSPACE;
-typedef LPLOGCOLORSPACEW LPLOGCOLORSPACE;
-
-
-
-
-
-
-
-
-typedef struct tagBITMAPCOREHEADER {
-        DWORD   bcSize;                 
-        WORD    bcWidth;
-        WORD    bcHeight;
-        WORD    bcPlanes;
-        WORD    bcBitCount;
-} BITMAPCOREHEADER,  *LPBITMAPCOREHEADER, *PBITMAPCOREHEADER;
-
-typedef struct tagBITMAPINFOHEADER{
-        DWORD      biSize;
-        LONG       biWidth;
-        LONG       biHeight;
-        WORD       biPlanes;
-        WORD       biBitCount;
-        DWORD      biCompression;
-        DWORD      biSizeImage;
-        LONG       biXPelsPerMeter;
-        LONG       biYPelsPerMeter;
-        DWORD      biClrUsed;
-        DWORD      biClrImportant;
-} BITMAPINFOHEADER,  *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;
-
-
-typedef struct {
-        DWORD        bV4Size;
-        LONG         bV4Width;
-        LONG         bV4Height;
-        WORD         bV4Planes;
-        WORD         bV4BitCount;
-        DWORD        bV4V4Compression;
-        DWORD        bV4SizeImage;
-        LONG         bV4XPelsPerMeter;
-        LONG         bV4YPelsPerMeter;
-        DWORD        bV4ClrUsed;
-        DWORD        bV4ClrImportant;
-        DWORD        bV4RedMask;
-        DWORD        bV4GreenMask;
-        DWORD        bV4BlueMask;
-        DWORD        bV4AlphaMask;
-        DWORD        bV4CSType;
-        CIEXYZTRIPLE bV4Endpoints;
-        DWORD        bV4GammaRed;
-        DWORD        bV4GammaGreen;
-        DWORD        bV4GammaBlue;
-} BITMAPV4HEADER,  *LPBITMAPV4HEADER, *PBITMAPV4HEADER;
-
-
-
-typedef struct {
-        DWORD        bV5Size;
-        LONG         bV5Width;
-        LONG         bV5Height;
-        WORD         bV5Planes;
-        WORD         bV5BitCount;
-        DWORD        bV5Compression;
-        DWORD        bV5SizeImage;
-        LONG         bV5XPelsPerMeter;
-        LONG         bV5YPelsPerMeter;
-        DWORD        bV5ClrUsed;
-        DWORD        bV5ClrImportant;
-        DWORD        bV5RedMask;
-        DWORD        bV5GreenMask;
-        DWORD        bV5BlueMask;
-        DWORD        bV5AlphaMask;
-        DWORD        bV5CSType;
-        CIEXYZTRIPLE bV5Endpoints;
-        DWORD        bV5GammaRed;
-        DWORD        bV5GammaGreen;
-        DWORD        bV5GammaBlue;
-        DWORD        bV5Intent;
-        DWORD        bV5ProfileData;
-        DWORD        bV5ProfileSize;
-        DWORD        bV5Reserved;
-} BITMAPV5HEADER,  *LPBITMAPV5HEADER, *PBITMAPV5HEADER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagBITMAPINFO {
-    BITMAPINFOHEADER    bmiHeader;
-    RGBQUAD             bmiColors[1];
-} BITMAPINFO,  *LPBITMAPINFO, *PBITMAPINFO;
-
-typedef struct tagBITMAPCOREINFO {
-    BITMAPCOREHEADER    bmciHeader;
-    RGBTRIPLE           bmciColors[1];
-} BITMAPCOREINFO,  *LPBITMAPCOREINFO, *PBITMAPCOREINFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,2)
-
-
-
-
-
-
-
-
-typedef struct tagBITMAPFILEHEADER {
-        WORD    bfType;
-        DWORD   bfSize;
-        WORD    bfReserved1;
-        WORD    bfReserved2;
-        DWORD   bfOffBits;
-} BITMAPFILEHEADER,  *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagFONTSIGNATURE
-{
-    DWORD fsUsb[4];
-    DWORD fsCsb[2];
-} FONTSIGNATURE, *PFONTSIGNATURE, *LPFONTSIGNATURE;
-
-typedef struct tagCHARSETINFO
-{
-    UINT ciCharset;
-    UINT ciACP;
-    FONTSIGNATURE fs;
-} CHARSETINFO, *PCHARSETINFO,  *NPCHARSETINFO,  *LPCHARSETINFO;
-
-
-
-
-
-
-typedef struct tagLOCALESIGNATURE
-{
-    DWORD lsUsb[4];
-    DWORD lsCsbDefault[2];
-    DWORD lsCsbSupported[2];
-} LOCALESIGNATURE, *PLOCALESIGNATURE, *LPLOCALESIGNATURE;
-
-
-
-
-
-
-
-
-typedef struct tagHANDLETABLE
-  {
-    HGDIOBJ     objectHandle[1];
-  } HANDLETABLE, *PHANDLETABLE,  *LPHANDLETABLE;
-
-typedef struct tagMETARECORD
-  {
-    DWORD       rdSize;
-    WORD        rdFunction;
-    WORD        rdParm[1];
-  } METARECORD;
-typedef struct tagMETARECORD  *PMETARECORD;
-typedef struct tagMETARECORD   *LPMETARECORD;
-
-typedef struct tagMETAFILEPICT
-  {
-    LONG        mm;
-    LONG        xExt;
-    LONG        yExt;
-    HMETAFILE   hMF;
-  } METAFILEPICT,  *LPMETAFILEPICT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,2)
-
-
-
-
-
-
-
-
-typedef struct tagMETAHEADER
-{
-    WORD        mtType;
-    WORD        mtHeaderSize;
-    WORD        mtVersion;
-    DWORD       mtSize;
-    WORD        mtNoObjects;
-    DWORD       mtMaxRecord;
-    WORD        mtNoParameters;
-} METAHEADER;
-typedef struct tagMETAHEADER  *PMETAHEADER;
-typedef struct tagMETAHEADER   *LPMETAHEADER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-typedef struct tagENHMETARECORD
-{
-    DWORD   iType;              
-    DWORD   nSize;              
-    DWORD   dParm[1];           
-} ENHMETARECORD, *PENHMETARECORD, *LPENHMETARECORD;
-
-typedef struct tagENHMETAHEADER
-{
-    DWORD   iType;              
-    DWORD   nSize;              
-                                
-    RECTL   rclBounds;          
-    RECTL   rclFrame;           
-    DWORD   dSignature;         
-    DWORD   nVersion;           
-    DWORD   nBytes;             
-    DWORD   nRecords;           
-    WORD    nHandles;           
-                                
-    WORD    sReserved;          
-    DWORD   nDescription;       
-                                
-    DWORD   offDescription;     
-                                
-    DWORD   nPalEntries;        
-    SIZEL   szlDevice;          
-    SIZEL   szlMillimeters;     
-
-    DWORD   cbPixelFormat;      
-                                
-    DWORD   offPixelFormat;     
-                                
-    DWORD   bOpenGL;            
-                                
-
-
-    SIZEL   szlMicrometers;     
-
-
-} ENHMETAHEADER, *PENHMETAHEADER, *LPENHMETAHEADER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    typedef WCHAR BCHAR;
-
-
-
-
-
-
-typedef struct tagTEXTMETRICA
-{
-    LONG        tmHeight;
-    LONG        tmAscent;
-    LONG        tmDescent;
-    LONG        tmInternalLeading;
-    LONG        tmExternalLeading;
-    LONG        tmAveCharWidth;
-    LONG        tmMaxCharWidth;
-    LONG        tmWeight;
-    LONG        tmOverhang;
-    LONG        tmDigitizedAspectX;
-    LONG        tmDigitizedAspectY;
-    BYTE        tmFirstChar;
-    BYTE        tmLastChar;
-    BYTE        tmDefaultChar;
-    BYTE        tmBreakChar;
-    BYTE        tmItalic;
-    BYTE        tmUnderlined;
-    BYTE        tmStruckOut;
-    BYTE        tmPitchAndFamily;
-    BYTE        tmCharSet;
-} TEXTMETRICA, *PTEXTMETRICA,  *NPTEXTMETRICA,  *LPTEXTMETRICA;
-typedef struct tagTEXTMETRICW
-{
-    LONG        tmHeight;
-    LONG        tmAscent;
-    LONG        tmDescent;
-    LONG        tmInternalLeading;
-    LONG        tmExternalLeading;
-    LONG        tmAveCharWidth;
-    LONG        tmMaxCharWidth;
-    LONG        tmWeight;
-    LONG        tmOverhang;
-    LONG        tmDigitizedAspectX;
-    LONG        tmDigitizedAspectY;
-    WCHAR       tmFirstChar;
-    WCHAR       tmLastChar;
-    WCHAR       tmDefaultChar;
-    WCHAR       tmBreakChar;
-    BYTE        tmItalic;
-    BYTE        tmUnderlined;
-    BYTE        tmStruckOut;
-    BYTE        tmPitchAndFamily;
-    BYTE        tmCharSet;
-} TEXTMETRICW, *PTEXTMETRICW,  *NPTEXTMETRICW,  *LPTEXTMETRICW;
-
-typedef TEXTMETRICW TEXTMETRIC;
-typedef PTEXTMETRICW PTEXTMETRIC;
-typedef NPTEXTMETRICW NPTEXTMETRIC;
-typedef LPTEXTMETRICW LPTEXTMETRIC;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,4)
-
-
-
-
-
-
-
-
-typedef struct tagNEWTEXTMETRICA
-{
-    LONG        tmHeight;
-    LONG        tmAscent;
-    LONG        tmDescent;
-    LONG        tmInternalLeading;
-    LONG        tmExternalLeading;
-    LONG        tmAveCharWidth;
-    LONG        tmMaxCharWidth;
-    LONG        tmWeight;
-    LONG        tmOverhang;
-    LONG        tmDigitizedAspectX;
-    LONG        tmDigitizedAspectY;
-    BYTE        tmFirstChar;
-    BYTE        tmLastChar;
-    BYTE        tmDefaultChar;
-    BYTE        tmBreakChar;
-    BYTE        tmItalic;
-    BYTE        tmUnderlined;
-    BYTE        tmStruckOut;
-    BYTE        tmPitchAndFamily;
-    BYTE        tmCharSet;
-    DWORD   ntmFlags;
-    UINT    ntmSizeEM;
-    UINT    ntmCellHeight;
-    UINT    ntmAvgWidth;
-} NEWTEXTMETRICA, *PNEWTEXTMETRICA,  *NPNEWTEXTMETRICA,  *LPNEWTEXTMETRICA;
-typedef struct tagNEWTEXTMETRICW
-{
-    LONG        tmHeight;
-    LONG        tmAscent;
-    LONG        tmDescent;
-    LONG        tmInternalLeading;
-    LONG        tmExternalLeading;
-    LONG        tmAveCharWidth;
-    LONG        tmMaxCharWidth;
-    LONG        tmWeight;
-    LONG        tmOverhang;
-    LONG        tmDigitizedAspectX;
-    LONG        tmDigitizedAspectY;
-    WCHAR       tmFirstChar;
-    WCHAR       tmLastChar;
-    WCHAR       tmDefaultChar;
-    WCHAR       tmBreakChar;
-    BYTE        tmItalic;
-    BYTE        tmUnderlined;
-    BYTE        tmStruckOut;
-    BYTE        tmPitchAndFamily;
-    BYTE        tmCharSet;
-    DWORD   ntmFlags;
-    UINT    ntmSizeEM;
-    UINT    ntmCellHeight;
-    UINT    ntmAvgWidth;
-} NEWTEXTMETRICW, *PNEWTEXTMETRICW,  *NPNEWTEXTMETRICW,  *LPNEWTEXTMETRICW;
-
-typedef NEWTEXTMETRICW NEWTEXTMETRIC;
-typedef PNEWTEXTMETRICW PNEWTEXTMETRIC;
-typedef NPNEWTEXTMETRICW NPNEWTEXTMETRIC;
-typedef LPNEWTEXTMETRICW LPNEWTEXTMETRIC;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-typedef struct tagNEWTEXTMETRICEXA
-{
-    NEWTEXTMETRICA  ntmTm;
-    FONTSIGNATURE   ntmFontSig;
-}NEWTEXTMETRICEXA;
-typedef struct tagNEWTEXTMETRICEXW
-{
-    NEWTEXTMETRICW  ntmTm;
-    FONTSIGNATURE   ntmFontSig;
-}NEWTEXTMETRICEXW;
-
-typedef NEWTEXTMETRICEXW NEWTEXTMETRICEX;
-
-
-
-
-
-
-
-
-
-typedef struct tagPELARRAY
-  {
-    LONG        paXCount;
-    LONG        paYCount;
-    LONG        paXExt;
-    LONG        paYExt;
-    BYTE        paRGBs;
-  } PELARRAY, *PPELARRAY,  *NPPELARRAY,  *LPPELARRAY;
-
-
-typedef struct tagLOGBRUSH
-  {
-    UINT        lbStyle;
-    COLORREF    lbColor;
-    ULONG_PTR    lbHatch;    
-  } LOGBRUSH, *PLOGBRUSH,  *NPLOGBRUSH,  *LPLOGBRUSH;
-
-typedef struct tagLOGBRUSH32
-  {
-    UINT        lbStyle;
-    COLORREF    lbColor;
-    ULONG       lbHatch;
-  } LOGBRUSH32, *PLOGBRUSH32,  *NPLOGBRUSH32,  *LPLOGBRUSH32;
-
-typedef LOGBRUSH            PATTERN;
-typedef PATTERN             *PPATTERN;
-typedef PATTERN         *NPPATTERN;
-typedef PATTERN          *LPPATTERN;
-
-
-typedef struct tagLOGPEN
-  {
-    UINT        lopnStyle;
-    POINT       lopnWidth;
-    COLORREF    lopnColor;
-  } LOGPEN, *PLOGPEN,  *NPLOGPEN,  *LPLOGPEN;
-
-typedef struct tagEXTLOGPEN {
-    DWORD       elpPenStyle;
-    DWORD       elpWidth;
-    UINT        elpBrushStyle;
-    COLORREF    elpColor;
-    ULONG_PTR    elpHatch;     
-    DWORD       elpNumEntries;
-    DWORD       elpStyleEntry[1];
-} EXTLOGPEN, *PEXTLOGPEN,  *NPEXTLOGPEN,  *LPEXTLOGPEN;
-
-
-
-typedef struct tagPALETTEENTRY {
-    BYTE        peRed;
-    BYTE        peGreen;
-    BYTE        peBlue;
-    BYTE        peFlags;
-} PALETTEENTRY, *PPALETTEENTRY,  *LPPALETTEENTRY;
-
-
-
-
-
-typedef struct tagLOGPALETTE {
-    WORD        palVersion;
-    WORD        palNumEntries;
-    PALETTEENTRY        palPalEntry[1];
-} LOGPALETTE, *PLOGPALETTE,  *NPLOGPALETTE,  *LPLOGPALETTE;
-
-
-
-
-
-
-typedef struct tagLOGFONTA
-{
-    LONG      lfHeight;
-    LONG      lfWidth;
-    LONG      lfEscapement;
-    LONG      lfOrientation;
-    LONG      lfWeight;
-    BYTE      lfItalic;
-    BYTE      lfUnderline;
-    BYTE      lfStrikeOut;
-    BYTE      lfCharSet;
-    BYTE      lfOutPrecision;
-    BYTE      lfClipPrecision;
-    BYTE      lfQuality;
-    BYTE      lfPitchAndFamily;
-    CHAR      lfFaceName[32];
-} LOGFONTA, *PLOGFONTA,  *NPLOGFONTA,  *LPLOGFONTA;
-typedef struct tagLOGFONTW
-{
-    LONG      lfHeight;
-    LONG      lfWidth;
-    LONG      lfEscapement;
-    LONG      lfOrientation;
-    LONG      lfWeight;
-    BYTE      lfItalic;
-    BYTE      lfUnderline;
-    BYTE      lfStrikeOut;
-    BYTE      lfCharSet;
-    BYTE      lfOutPrecision;
-    BYTE      lfClipPrecision;
-    BYTE      lfQuality;
-    BYTE      lfPitchAndFamily;
-    WCHAR     lfFaceName[32];
-} LOGFONTW, *PLOGFONTW,  *NPLOGFONTW,  *LPLOGFONTW;
-
-typedef LOGFONTW LOGFONT;
-typedef PLOGFONTW PLOGFONT;
-typedef NPLOGFONTW NPLOGFONT;
-typedef LPLOGFONTW LPLOGFONT;
-
-
-
-
-
-
-
-
-
-
-typedef struct tagENUMLOGFONTA
-{
-    LOGFONTA elfLogFont;
-    BYTE     elfFullName[64];
-    BYTE     elfStyle[32];
-} ENUMLOGFONTA, * LPENUMLOGFONTA;
-
-typedef struct tagENUMLOGFONTW
-{
-    LOGFONTW elfLogFont;
-    WCHAR    elfFullName[64];
-    WCHAR    elfStyle[32];
-} ENUMLOGFONTW, * LPENUMLOGFONTW;
-
-typedef ENUMLOGFONTW ENUMLOGFONT;
-typedef LPENUMLOGFONTW LPENUMLOGFONT;
-
-
-
-
-
-
-typedef struct tagENUMLOGFONTEXA
-{
-    LOGFONTA    elfLogFont;
-    BYTE        elfFullName[64];
-    BYTE        elfStyle[32];
-    BYTE        elfScript[32];
-} ENUMLOGFONTEXA,  *LPENUMLOGFONTEXA;
-typedef struct tagENUMLOGFONTEXW
-{
-    LOGFONTW    elfLogFont;
-    WCHAR       elfFullName[64];
-    WCHAR       elfStyle[32];
-    WCHAR       elfScript[32];
-} ENUMLOGFONTEXW,  *LPENUMLOGFONTEXW;
-
-typedef ENUMLOGFONTEXW ENUMLOGFONTEX;
-typedef LPENUMLOGFONTEXW LPENUMLOGFONTEX;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                    
-
-                                    
-
-                                    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagPANOSE
-{
-    BYTE    bFamilyType;
-    BYTE    bSerifStyle;
-    BYTE    bWeight;
-    BYTE    bProportion;
-    BYTE    bContrast;
-    BYTE    bStrokeVariation;
-    BYTE    bArmStyle;
-    BYTE    bLetterform;
-    BYTE    bMidline;
-    BYTE    bXHeight;
-} PANOSE, * LPPANOSE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagEXTLOGFONTA {
-    LOGFONTA    elfLogFont;
-    BYTE        elfFullName[64];
-    BYTE        elfStyle[32];
-    DWORD       elfVersion;     
-    DWORD       elfStyleSize;
-    DWORD       elfMatch;
-    DWORD       elfReserved;
-    BYTE        elfVendorId[4];
-    DWORD       elfCulture;     
-    PANOSE      elfPanose;
-} EXTLOGFONTA, *PEXTLOGFONTA,  *NPEXTLOGFONTA,  *LPEXTLOGFONTA;
-typedef struct tagEXTLOGFONTW {
-    LOGFONTW    elfLogFont;
-    WCHAR       elfFullName[64];
-    WCHAR       elfStyle[32];
-    DWORD       elfVersion;     
-    DWORD       elfStyleSize;
-    DWORD       elfMatch;
-    DWORD       elfReserved;
-    BYTE        elfVendorId[4];
-    DWORD       elfCulture;     
-    PANOSE      elfPanose;
-} EXTLOGFONTW, *PEXTLOGFONTW,  *NPEXTLOGFONTW,  *LPEXTLOGFONTW;
-
-typedef EXTLOGFONTW EXTLOGFONT;
-typedef PEXTLOGFONTW PEXTLOGFONT;
-typedef NPEXTLOGFONTW NPEXTLOGFONT;
-typedef LPEXTLOGFONTW LPEXTLOGFONT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                             
-
-                             
-
-                             
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _devicemodeA {
-    BYTE   dmDeviceName[32];
-    WORD dmSpecVersion;
-    WORD dmDriverVersion;
-    WORD dmSize;
-    WORD dmDriverExtra;
-    DWORD dmFields;
-    union {
-      
-      struct {
-        short dmOrientation;
-        short dmPaperSize;
-        short dmPaperLength;
-        short dmPaperWidth;
-        short dmScale;
-        short dmCopies;
-        short dmDefaultSource;
-        short dmPrintQuality;
-      };
-      
-      struct {
-        POINTL dmPosition;
-        DWORD  dmDisplayOrientation;
-        DWORD  dmDisplayFixedOutput; 
-      };
-    };
-    short dmColor;
-    short dmDuplex;
-    short dmYResolution;
-    short dmTTOption;
-    short dmCollate;
-    BYTE   dmFormName[32];
-    WORD   dmLogPixels;
-    DWORD  dmBitsPerPel;
-    DWORD  dmPelsWidth;
-    DWORD  dmPelsHeight;
-    union {
-        DWORD  dmDisplayFlags;
-        DWORD  dmNup;
-    };
-    DWORD  dmDisplayFrequency;
-
-    DWORD  dmICMMethod;
-    DWORD  dmICMIntent;
-    DWORD  dmMediaType;
-    DWORD  dmDitherType;
-    DWORD  dmReserved1;
-    DWORD  dmReserved2;
-
-    DWORD  dmPanningWidth;
-    DWORD  dmPanningHeight;
-
-
-} DEVMODEA, *PDEVMODEA, *NPDEVMODEA, *LPDEVMODEA;
-typedef struct _devicemodeW {
-    WCHAR  dmDeviceName[32];
-    WORD dmSpecVersion;
-    WORD dmDriverVersion;
-    WORD dmSize;
-    WORD dmDriverExtra;
-    DWORD dmFields;
-    union {
-      
-      struct {
-        short dmOrientation;
-        short dmPaperSize;
-        short dmPaperLength;
-        short dmPaperWidth;
-        short dmScale;
-        short dmCopies;
-        short dmDefaultSource;
-        short dmPrintQuality;
-      };
-      
-      struct {
-        POINTL dmPosition;
-        DWORD  dmDisplayOrientation;
-        DWORD  dmDisplayFixedOutput; 
-      };
-    };
-    short dmColor;
-    short dmDuplex;
-    short dmYResolution;
-    short dmTTOption;
-    short dmCollate;
-    WCHAR  dmFormName[32];
-    WORD   dmLogPixels;
-    DWORD  dmBitsPerPel;
-    DWORD  dmPelsWidth;
-    DWORD  dmPelsHeight;
-    union {
-        DWORD  dmDisplayFlags;
-        DWORD  dmNup;
-    };
-    DWORD  dmDisplayFrequency;
-
-    DWORD  dmICMMethod;
-    DWORD  dmICMIntent;
-    DWORD  dmMediaType;
-    DWORD  dmDitherType;
-    DWORD  dmReserved1;
-    DWORD  dmReserved2;
-
-    DWORD  dmPanningWidth;
-    DWORD  dmPanningHeight;
-
-
-} DEVMODEW, *PDEVMODEW, *NPDEVMODEW, *LPDEVMODEW;
-
-typedef DEVMODEW DEVMODE;
-typedef PDEVMODEW PDEVMODE;
-typedef NPDEVMODEW NPDEVMODE;
-typedef LPDEVMODEW LPDEVMODE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _DISPLAY_DEVICEA {
-    DWORD  cb;
-    CHAR   DeviceName[32];
-    CHAR   DeviceString[128];
-    DWORD  StateFlags;
-    CHAR   DeviceID[128];
-    CHAR   DeviceKey[128];
-} DISPLAY_DEVICEA, *PDISPLAY_DEVICEA, *LPDISPLAY_DEVICEA;
-typedef struct _DISPLAY_DEVICEW {
-    DWORD  cb;
-    WCHAR  DeviceName[32];
-    WCHAR  DeviceString[128];
-    DWORD  StateFlags;
-    WCHAR  DeviceID[128];
-    WCHAR  DeviceKey[128];
-} DISPLAY_DEVICEW, *PDISPLAY_DEVICEW, *LPDISPLAY_DEVICEW;
-
-typedef DISPLAY_DEVICEW DISPLAY_DEVICE;
-typedef PDISPLAY_DEVICEW PDISPLAY_DEVICE;
-typedef LPDISPLAY_DEVICEW LPDISPLAY_DEVICE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _RGNDATAHEADER {
-    DWORD   dwSize;
-    DWORD   iType;
-    DWORD   nCount;
-    DWORD   nRgnSize;
-    RECT    rcBound;
-} RGNDATAHEADER, *PRGNDATAHEADER;
-
-typedef struct _RGNDATA {
-    RGNDATAHEADER   rdh;
-    char            Buffer[1];
-} RGNDATA, *PRGNDATA,  *NPRGNDATA,  *LPRGNDATA;
-
-
-
-
-
-typedef struct _ABC {
-    int     abcA;
-    UINT    abcB;
-    int     abcC;
-} ABC, *PABC,  *NPABC,  *LPABC;
-
-typedef struct _ABCFLOAT {
-    FLOAT   abcfA;
-    FLOAT   abcfB;
-    FLOAT   abcfC;
-} ABCFLOAT, *PABCFLOAT,  *NPABCFLOAT,  *LPABCFLOAT;
-
-
-
-
-
-
-typedef struct _OUTLINETEXTMETRICA {
-    UINT    otmSize;
-    TEXTMETRICA otmTextMetrics;
-    BYTE    otmFiller;
-    PANOSE  otmPanoseNumber;
-    UINT    otmfsSelection;
-    UINT    otmfsType;
-     int    otmsCharSlopeRise;
-     int    otmsCharSlopeRun;
-     int    otmItalicAngle;
-    UINT    otmEMSquare;
-     int    otmAscent;
-     int    otmDescent;
-    UINT    otmLineGap;
-    UINT    otmsCapEmHeight;
-    UINT    otmsXHeight;
-    RECT    otmrcFontBox;
-     int    otmMacAscent;
-     int    otmMacDescent;
-    UINT    otmMacLineGap;
-    UINT    otmusMinimumPPEM;
-    POINT   otmptSubscriptSize;
-    POINT   otmptSubscriptOffset;
-    POINT   otmptSuperscriptSize;
-    POINT   otmptSuperscriptOffset;
-    UINT    otmsStrikeoutSize;
-     int    otmsStrikeoutPosition;
-     int    otmsUnderscoreSize;
-     int    otmsUnderscorePosition;
-    PSTR    otmpFamilyName;
-    PSTR    otmpFaceName;
-    PSTR    otmpStyleName;
-    PSTR    otmpFullName;
-} OUTLINETEXTMETRICA, *POUTLINETEXTMETRICA,  *NPOUTLINETEXTMETRICA,  *LPOUTLINETEXTMETRICA;
-typedef struct _OUTLINETEXTMETRICW {
-    UINT    otmSize;
-    TEXTMETRICW otmTextMetrics;
-    BYTE    otmFiller;
-    PANOSE  otmPanoseNumber;
-    UINT    otmfsSelection;
-    UINT    otmfsType;
-     int    otmsCharSlopeRise;
-     int    otmsCharSlopeRun;
-     int    otmItalicAngle;
-    UINT    otmEMSquare;
-     int    otmAscent;
-     int    otmDescent;
-    UINT    otmLineGap;
-    UINT    otmsCapEmHeight;
-    UINT    otmsXHeight;
-    RECT    otmrcFontBox;
-     int    otmMacAscent;
-     int    otmMacDescent;
-    UINT    otmMacLineGap;
-    UINT    otmusMinimumPPEM;
-    POINT   otmptSubscriptSize;
-    POINT   otmptSubscriptOffset;
-    POINT   otmptSuperscriptSize;
-    POINT   otmptSuperscriptOffset;
-    UINT    otmsStrikeoutSize;
-     int    otmsStrikeoutPosition;
-     int    otmsUnderscoreSize;
-     int    otmsUnderscorePosition;
-    PSTR    otmpFamilyName;
-    PSTR    otmpFaceName;
-    PSTR    otmpStyleName;
-    PSTR    otmpFullName;
-} OUTLINETEXTMETRICW, *POUTLINETEXTMETRICW,  *NPOUTLINETEXTMETRICW,  *LPOUTLINETEXTMETRICW;
-
-typedef OUTLINETEXTMETRICW OUTLINETEXTMETRIC;
-typedef POUTLINETEXTMETRICW POUTLINETEXTMETRIC;
-typedef NPOUTLINETEXTMETRICW NPOUTLINETEXTMETRIC;
-typedef LPOUTLINETEXTMETRICW LPOUTLINETEXTMETRIC;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagPOLYTEXTA
-{
-    int       x;
-    int       y;
-    UINT      n;
-    LPCSTR    lpstr;
-    UINT      uiFlags;
-    RECT      rcl;
-    int      *pdx;
-} POLYTEXTA, *PPOLYTEXTA,  *NPPOLYTEXTA,  *LPPOLYTEXTA;
-typedef struct tagPOLYTEXTW
-{
-    int       x;
-    int       y;
-    UINT      n;
-    LPCWSTR   lpstr;
-    UINT      uiFlags;
-    RECT      rcl;
-    int      *pdx;
-} POLYTEXTW, *PPOLYTEXTW,  *NPPOLYTEXTW,  *LPPOLYTEXTW;
-
-typedef POLYTEXTW POLYTEXT;
-typedef PPOLYTEXTW PPOLYTEXT;
-typedef NPPOLYTEXTW NPPOLYTEXT;
-typedef LPPOLYTEXTW LPPOLYTEXT;
-
-
-
-
-
-
-
-typedef struct _FIXED {
-
-    WORD    fract;
-    short   value;
-
-
-
-
-} FIXED;
-
-
-typedef struct _MAT2 {
-     FIXED  eM11;
-     FIXED  eM12;
-     FIXED  eM21;
-     FIXED  eM22;
-} MAT2,  *LPMAT2;
-
-
-
-typedef struct _GLYPHMETRICS {
-    UINT    gmBlackBoxX;
-    UINT    gmBlackBoxY;
-    POINT   gmptGlyphOrigin;
-    short   gmCellIncX;
-    short   gmCellIncY;
-} GLYPHMETRICS,  *LPGLYPHMETRICS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagPOINTFX
-{
-    FIXED x;
-    FIXED y;
-} POINTFX, * LPPOINTFX;
-
-typedef struct tagTTPOLYCURVE
-{
-    WORD    wType;
-    WORD    cpfx;
-    POINTFX apfx[1];
-} TTPOLYCURVE, * LPTTPOLYCURVE;
-
-typedef struct tagTTPOLYGONHEADER
-{
-    DWORD   cb;
-    DWORD   dwType;
-    POINTFX pfxStart;
-} TTPOLYGONHEADER, * LPTTPOLYGONHEADER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagGCP_RESULTSA
-    {
-    DWORD   lStructSize;
-    LPSTR     lpOutString;
-    UINT  *lpOrder;
-    int   *lpDx;
-    int   *lpCaretPos;
-    LPSTR   lpClass;
-    LPWSTR  lpGlyphs;
-    UINT    nGlyphs;
-    int     nMaxFit;
-    } GCP_RESULTSA, * LPGCP_RESULTSA;
-typedef struct tagGCP_RESULTSW
-    {
-    DWORD   lStructSize;
-    LPWSTR    lpOutString;
-    UINT  *lpOrder;
-    int   *lpDx;
-    int   *lpCaretPos;
-    LPSTR   lpClass;
-    LPWSTR  lpGlyphs;
-    UINT    nGlyphs;
-    int     nMaxFit;
-    } GCP_RESULTSW, * LPGCP_RESULTSW;
-
-typedef GCP_RESULTSW GCP_RESULTS;
-typedef LPGCP_RESULTSW LPGCP_RESULTS;
-
-
-
-
-
-
-typedef struct _RASTERIZER_STATUS {
-    short   nSize;
-    short   wFlags;
-    short   nLanguageID;
-} RASTERIZER_STATUS,  *LPRASTERIZER_STATUS;
-
-
-
-
-
-
-typedef struct tagPIXELFORMATDESCRIPTOR
-{
-    WORD  nSize;
-    WORD  nVersion;
-    DWORD dwFlags;
-    BYTE  iPixelType;
-    BYTE  cColorBits;
-    BYTE  cRedBits;
-    BYTE  cRedShift;
-    BYTE  cGreenBits;
-    BYTE  cGreenShift;
-    BYTE  cBlueBits;
-    BYTE  cBlueShift;
-    BYTE  cAlphaBits;
-    BYTE  cAlphaShift;
-    BYTE  cAccumBits;
-    BYTE  cAccumRedBits;
-    BYTE  cAccumGreenBits;
-    BYTE  cAccumBlueBits;
-    BYTE  cAccumAlphaBits;
-    BYTE  cDepthBits;
-    BYTE  cStencilBits;
-    BYTE  cAuxBuffers;
-    BYTE  iLayerType;
-    BYTE  bReserved;
-    DWORD dwLayerMask;
-    DWORD dwVisibleMask;
-    DWORD dwDamageMask;
-} PIXELFORMATDESCRIPTOR, *PPIXELFORMATDESCRIPTOR,  *LPPIXELFORMATDESCRIPTOR;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef int (__stdcall* OLDFONTENUMPROCA)(const LOGFONTA *, const TEXTMETRICA *, DWORD, LPARAM);
-typedef int (__stdcall* OLDFONTENUMPROCW)(const LOGFONTW *, const TEXTMETRICW *, DWORD, LPARAM);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef OLDFONTENUMPROCA    FONTENUMPROCA;
-typedef OLDFONTENUMPROCW    FONTENUMPROCW;
-
-typedef FONTENUMPROCW FONTENUMPROC;
-
-
-
-
-typedef int (__stdcall* GOBJENUMPROC)(LPVOID, LPARAM);
-typedef void (__stdcall* LINEDDAPROC)(int, int, LPARAM);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) int __stdcall AddFontResourceA(     LPCSTR);
-__declspec(dllimport) int __stdcall AddFontResourceW(     LPCWSTR);
-
-
-
-
-
-
-__declspec(dllimport) BOOL	__stdcall AnimatePalette(      HPALETTE hPal,      UINT iStartIndex,     	UINT cEntries,        const PALETTEENTRY * ppe);
-__declspec(dllimport) BOOL	__stdcall Arc(      HDC hdc,      int x1,      int y1,      int x2,      int y2,      int x3,      int y3,      int x4,      int y4);
-__declspec(dllimport) BOOL	__stdcall BitBlt(      HDC hdc,      int x,      int y,      int cx,      int cy,        HDC hdcSrc,      int x1,      int y1,      DWORD rop);
-__declspec(dllimport) BOOL  __stdcall CancelDC(      HDC hdc);
-__declspec(dllimport) BOOL  __stdcall Chord(      HDC hdc,      int x1,      int y1,      int x2,      int y2,      int x3,      int y3,      int x4,      int y4);
-__declspec(dllimport) int   __stdcall ChoosePixelFormat(      HDC hdc,      const PIXELFORMATDESCRIPTOR *ppfd);
-__declspec(dllimport) HMETAFILE  __stdcall CloseMetaFile(      HDC hdc);
-__declspec(dllimport) int     __stdcall CombineRgn(        HRGN hrgnDst,        HRGN hrgnSrc1,        HRGN hrgnSrc2,      int iMode);
-__declspec(dllimport) HMETAFILE __stdcall CopyMetaFileA(      HMETAFILE,        LPCSTR);
-__declspec(dllimport) HMETAFILE __stdcall CopyMetaFileW(      HMETAFILE,        LPCWSTR);
-
-
-
-
-
-__declspec(dllimport) HBITMAP __stdcall CreateBitmap(      int nWidth,      int nHeight,      UINT nPlanes,      UINT nBitCount,        const void *lpBits);
-__declspec(dllimport) HBITMAP __stdcall CreateBitmapIndirect(      const BITMAP *pbm);
-__declspec(dllimport) HBRUSH  __stdcall CreateBrushIndirect(      const LOGBRUSH *plbrush);
-__declspec(dllimport) HBITMAP __stdcall CreateCompatibleBitmap(      HDC hdc,      int cx,      int cy);
-__declspec(dllimport) HBITMAP __stdcall CreateDiscardableBitmap(      HDC hdc,      int cx,      int cy);
-__declspec(dllimport) HDC     __stdcall CreateCompatibleDC(        HDC hdc);
-__declspec(dllimport) HDC     __stdcall CreateDCA(        LPCSTR pwszDriver,        LPCSTR pwszDevice,        LPCSTR pszPort,        const DEVMODEA * pdm);
-__declspec(dllimport) HDC     __stdcall CreateDCW(        LPCWSTR pwszDriver,        LPCWSTR pwszDevice,        LPCWSTR pszPort,        const DEVMODEW * pdm);
-
-
-
-
-
-__declspec(dllimport) HBITMAP __stdcall CreateDIBitmap(      HDC hdc,        const BITMAPINFOHEADER *pbmih,      DWORD flInit,        const void *pjBits,        const BITMAPINFO *pbmi,      UINT iUsage);
-__declspec(dllimport) HBRUSH  __stdcall CreateDIBPatternBrush(      HGLOBAL h,      UINT iUsage);
-__declspec(dllimport) HBRUSH  __stdcall CreateDIBPatternBrushPt(      const void *lpPackedDIB,      UINT iUsage);
-__declspec(dllimport) HRGN    __stdcall CreateEllipticRgn(      int x1,      int y1,      int x2,      int y2);
-__declspec(dllimport) HRGN    __stdcall CreateEllipticRgnIndirect(      const RECT *lprect);
-__declspec(dllimport) HFONT   __stdcall CreateFontIndirectA(      const LOGFONTA *lplf);
-__declspec(dllimport) HFONT   __stdcall CreateFontIndirectW(      const LOGFONTW *lplf);
-
-
-
-
-
-__declspec(dllimport) HFONT   __stdcall CreateFontA(      int cHeight,      int cWidth,      int cEscapement,      int cOrientation,      int cWeight,      DWORD bItalic,
-                                  DWORD bUnderline,      DWORD bStrikeOut,      DWORD iCharSet,      DWORD iOutPrecision,      DWORD iClipPrecision,
-                                  DWORD iQuality,      DWORD iPitchAndFamily,        LPCSTR pszFaceName);
-__declspec(dllimport) HFONT   __stdcall CreateFontW(      int cHeight,      int cWidth,      int cEscapement,      int cOrientation,      int cWeight,      DWORD bItalic,
-                                  DWORD bUnderline,      DWORD bStrikeOut,      DWORD iCharSet,      DWORD iOutPrecision,      DWORD iClipPrecision,
-                                  DWORD iQuality,      DWORD iPitchAndFamily,        LPCWSTR pszFaceName);
-
-
-
-
-
-
-__declspec(dllimport) HBRUSH  __stdcall CreateHatchBrush(      int iHatch,      COLORREF color);
-__declspec(dllimport) HDC     __stdcall CreateICA(        LPCSTR pszDriver,        LPCSTR pszDevice,        LPCSTR pszPort,        const DEVMODEA * pdm);
-__declspec(dllimport) HDC     __stdcall CreateICW(        LPCWSTR pszDriver,        LPCWSTR pszDevice,        LPCWSTR pszPort,        const DEVMODEW * pdm);
-
-
-
-
-
-__declspec(dllimport) HDC     __stdcall CreateMetaFileA(        LPCSTR pszFile);
-__declspec(dllimport) HDC     __stdcall CreateMetaFileW(        LPCWSTR pszFile);
-
-
-
-
-
-__declspec(dllimport) HPALETTE __stdcall CreatePalette(      const LOGPALETTE * plpal);
-__declspec(dllimport) HPEN    __stdcall CreatePen(      int iStyle,      int cWidth,      COLORREF color);
-__declspec(dllimport) HPEN    __stdcall CreatePenIndirect(      const LOGPEN *plpen);
-__declspec(dllimport) HRGN    __stdcall CreatePolyPolygonRgn(       const POINT *pptl,
-                                                     const INT  *pc,
-                                                     int cPoly,
-                                                     int iMode);
-__declspec(dllimport) HBRUSH  __stdcall CreatePatternBrush(      HBITMAP hbm);
-__declspec(dllimport) HRGN    __stdcall CreateRectRgn(      int x1,      int y1,      int x2,      int y2);
-__declspec(dllimport) HRGN    __stdcall CreateRectRgnIndirect(      const RECT *lprect);
-__declspec(dllimport) HRGN    __stdcall CreateRoundRectRgn(      int x1,      int y1,      int x2,      int y2,      int w,      int h);
-__declspec(dllimport) BOOL    __stdcall CreateScalableFontResourceA(      DWORD fdwHidden,      LPCSTR lpszFont,      LPCSTR lpszFile,        LPCSTR lpszPath);
-__declspec(dllimport) BOOL    __stdcall CreateScalableFontResourceW(      DWORD fdwHidden,      LPCWSTR lpszFont,      LPCWSTR lpszFile,        LPCWSTR lpszPath);
-
-
-
-
-
-__declspec(dllimport) HBRUSH  __stdcall CreateSolidBrush(      COLORREF color);
-
-__declspec(dllimport) BOOL __stdcall DeleteDC(      HDC hdc);
-__declspec(dllimport) BOOL __stdcall DeleteMetaFile(      HMETAFILE hmf);
-__declspec(dllimport) BOOL __stdcall DeleteObject(      HGDIOBJ ho);
-__declspec(dllimport) int  __stdcall DescribePixelFormat(       HDC hdc, 
-                                                 int iPixelFormat, 
-                                                 UINT nBytes,
-                                                   LPPIXELFORMATDESCRIPTOR ppfd);
-
-
-
-
-
-typedef UINT   (__stdcall* LPFNDEVMODE)(HWND, HMODULE, LPDEVMODE, LPSTR, LPSTR, LPDEVMODE, LPSTR, UINT);
-
-typedef DWORD  (__stdcall* LPFNDEVCAPS)(LPSTR, LPSTR, UINT, LPSTR, LPDEVMODE);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-DeviceCapabilitiesA(
-         LPCSTR pDevice,
-           LPCSTR pPort,
-         WORD fwCapability,
-           LPSTR pOutput,
-           const DEVMODEA * pDevMode
-    );
-__declspec(dllimport)
-int
-__stdcall
-DeviceCapabilitiesW(
-         LPCWSTR pDevice,
-           LPCWSTR pPort,
-         WORD fwCapability,
-           LPWSTR pOutput,
-           const DEVMODEW * pDevMode
-    );
-
-
-
-
-
-
-__declspec(dllimport) int  __stdcall DrawEscape(        HDC    hdc,         
-                                         int    iEscape,     
-                                         int    cjIn,        
-                                             LPCSTR lpIn);
-__declspec(dllimport) BOOL __stdcall Ellipse(      HDC hdc,      int left,      int top,       int right,      int bottom);
-
-
-__declspec(dllimport) int  __stdcall EnumFontFamiliesExA(      HDC hdc,      LPLOGFONTA lpLogfont,      FONTENUMPROCA lpProc,      LPARAM lParam,      DWORD dwFlags);
-__declspec(dllimport) int  __stdcall EnumFontFamiliesExW(      HDC hdc,      LPLOGFONTW lpLogfont,      FONTENUMPROCW lpProc,      LPARAM lParam,      DWORD dwFlags);
-
-
-
-
-
-
-
-__declspec(dllimport) int  __stdcall EnumFontFamiliesA(      HDC hdc,        LPCSTR lpLogfont,      FONTENUMPROCA lpProc,      LPARAM lParam);
-__declspec(dllimport) int  __stdcall EnumFontFamiliesW(      HDC hdc,        LPCWSTR lpLogfont,      FONTENUMPROCW lpProc,      LPARAM lParam);
-
-
-
-
-
-__declspec(dllimport) int  __stdcall EnumFontsA(      HDC hdc,        LPCSTR lpLogfont,       FONTENUMPROCA lpProc,      LPARAM lParam);
-__declspec(dllimport) int  __stdcall EnumFontsW(      HDC hdc,        LPCWSTR lpLogfont,       FONTENUMPROCW lpProc,      LPARAM lParam);
-
-
-
-
-
-
-
-__declspec(dllimport) int  __stdcall EnumObjects(      HDC hdc,      int nType,      GOBJENUMPROC lpFunc,      LPARAM lParam);
-
-
-
-
-
-__declspec(dllimport) BOOL __stdcall EqualRgn(      HRGN hrgn1,      HRGN hrgn2);
-__declspec(dllimport) int  __stdcall Escape(        HDC hdc,           
-                                     int iEscape,       
-                                     int cjIn,          
-                                         LPCSTR pvIn,
-                                       LPVOID pvOut);
-__declspec(dllimport) int  __stdcall ExtEscape(         HDC hdc,         
-                                         int iEscape,     
-                                         int cjInput,     
-                                             LPCSTR lpInData,  
-                                         int cjOutput,   
-                                           LPSTR lpOutData);
-__declspec(dllimport) int  __stdcall ExcludeClipRect(      HDC hdc,      int left,      int top,      int right,      int bottom);
-__declspec(dllimport) HRGN __stdcall ExtCreateRegion(        const XFORM * lpx,      DWORD nCount,        const RGNDATA * lpData);
-__declspec(dllimport) BOOL __stdcall ExtFloodFill(      HDC hdc,      int x,      int y,      COLORREF color,      UINT type);
-__declspec(dllimport) BOOL __stdcall FillRgn(      HDC hdc,      HRGN hrgn,      HBRUSH hbr);
-__declspec(dllimport) BOOL __stdcall FloodFill(      HDC hdc,      int x,      int y,      COLORREF color);
-__declspec(dllimport) BOOL __stdcall FrameRgn(      HDC hdc,      HRGN hrgn,      HBRUSH hbr,      int w,      int h);
-__declspec(dllimport) int  __stdcall GetROP2(      HDC hdc);
-__declspec(dllimport) BOOL __stdcall GetAspectRatioFilterEx(      HDC hdc,      LPSIZE lpsize);
-__declspec(dllimport) COLORREF __stdcall GetBkColor(      HDC hdc);
-
-
-__declspec(dllimport) COLORREF __stdcall GetDCBrushColor(      HDC hdc);
-__declspec(dllimport) COLORREF __stdcall GetDCPenColor(      HDC hdc);
-
-
-__declspec(dllimport)
-int
-__stdcall
-GetBkMode(
-         HDC hdc
-    );
-
-__declspec(dllimport)
-LONG
-__stdcall
-GetBitmapBits(
-         HBITMAP hbit,
-         LONG cb,
-         LPVOID lpvBits
-    );
-
-__declspec(dllimport) BOOL  __stdcall GetBitmapDimensionEx(      HBITMAP hbit,      LPSIZE lpsize);
-__declspec(dllimport) UINT  __stdcall GetBoundsRect(      HDC hdc,      LPRECT lprect,      UINT flags);
-
-__declspec(dllimport) BOOL  __stdcall GetBrushOrgEx(      HDC hdc,      LPPOINT lppt);
-
-__declspec(dllimport) BOOL  __stdcall GetCharWidthA(      HDC hdc,      UINT iFirst,      UINT iLast,      LPINT lpBuffer);
-__declspec(dllimport) BOOL  __stdcall GetCharWidthW(      HDC hdc,      UINT iFirst,      UINT iLast,      LPINT lpBuffer);
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall GetCharWidth32A(      HDC hdc,      UINT iFirst,      UINT iLast,       LPINT lpBuffer);
-__declspec(dllimport) BOOL  __stdcall GetCharWidth32W(      HDC hdc,      UINT iFirst,      UINT iLast,       LPINT lpBuffer);
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall GetCharWidthFloatA(      HDC hdc,      UINT iFirst,      UINT iLast,      PFLOAT lpBuffer);
-__declspec(dllimport) BOOL  __stdcall GetCharWidthFloatW(      HDC hdc,      UINT iFirst,      UINT iLast,      PFLOAT lpBuffer);
-
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall GetCharABCWidthsA(      HDC hdc, 
-                                                 UINT wFirst, 
-                                                 UINT wLast, 
-                                                 LPABC lpABC);
-__declspec(dllimport) BOOL  __stdcall GetCharABCWidthsW(      HDC hdc, 
-                                                 UINT wFirst, 
-                                                 UINT wLast, 
-                                                 LPABC lpABC);
-
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall GetCharABCWidthsFloatA(      HDC hdc,      UINT iFirst,      UINT iLast,      LPABCFLOAT lpABC);
-__declspec(dllimport) BOOL  __stdcall GetCharABCWidthsFloatW(      HDC hdc,      UINT iFirst,      UINT iLast,      LPABCFLOAT lpABC);
-
-
-
-
-
-__declspec(dllimport) int   __stdcall GetClipBox(      HDC hdc,       LPRECT lprect);
-__declspec(dllimport) int	__stdcall GetClipRgn(      HDC hdc,      HRGN hrgn);
-__declspec(dllimport) int	__stdcall GetMetaRgn(      HDC hdc,      HRGN hrgn);
-__declspec(dllimport) HGDIOBJ __stdcall GetCurrentObject(      HDC hdc,      UINT type);
-__declspec(dllimport) BOOL  __stdcall GetCurrentPositionEx(      HDC hdc,       LPPOINT lppt);
-__declspec(dllimport) int   __stdcall GetDeviceCaps(        HDC hdc,      int index);
-__declspec(dllimport) int   __stdcall GetDIBits(      HDC hdc,      HBITMAP hbm,      UINT start,      UINT cLines,         LPVOID lpvBits,      LPBITMAPINFO lpbmi,      UINT usage);
-
-__declspec(dllimport) DWORD __stdcall GetFontData (         HDC     hdc,
-                                             DWORD   dwTable,
-                                             DWORD   dwOffset,
-                                                 PVOID pvBuffer,
-                                             DWORD   cjBuffer
-                                        );
-
-__declspec(dllimport) DWORD __stdcall GetGlyphOutlineA(         HDC hdc,
-                                                 UINT uChar,
-                                                 UINT fuFormat,
-                                                 LPGLYPHMETRICS lpgm,
-                                                 DWORD cjBuffer,
-                                                   LPVOID pvBuffer,
-                                                 const MAT2 *lpmat2
-                                        );
-__declspec(dllimport) DWORD __stdcall GetGlyphOutlineW(         HDC hdc,
-                                                 UINT uChar,
-                                                 UINT fuFormat,
-                                                 LPGLYPHMETRICS lpgm,
-                                                 DWORD cjBuffer,
-                                                   LPVOID pvBuffer,
-                                                 const MAT2 *lpmat2
-                                        );
-
-
-
-
-
-
-__declspec(dllimport) int   __stdcall GetGraphicsMode(      HDC hdc);
-__declspec(dllimport) int   __stdcall GetMapMode(      HDC hdc);
-__declspec(dllimport) UINT  __stdcall GetMetaFileBitsEx(     HMETAFILE hMF,      UINT cbBuffer,        LPVOID lpData);
-__declspec(dllimport) HMETAFILE   __stdcall GetMetaFileA(      LPCSTR lpName);
-__declspec(dllimport) HMETAFILE   __stdcall GetMetaFileW(      LPCWSTR lpName);
-
-
-
-
-
-__declspec(dllimport) COLORREF __stdcall GetNearestColor(      HDC hdc,      COLORREF color);
-__declspec(dllimport) UINT  __stdcall GetNearestPaletteIndex(      HPALETTE h,      COLORREF color);
-__declspec(dllimport) DWORD __stdcall GetObjectType(      HGDIOBJ h);
-
-
-
-__declspec(dllimport) UINT __stdcall GetOutlineTextMetricsA(      HDC hdc, 
-                                                     UINT cjCopy, 
-                                                       LPOUTLINETEXTMETRICA potm);
-__declspec(dllimport) UINT __stdcall GetOutlineTextMetricsW(      HDC hdc, 
-                                                     UINT cjCopy, 
-                                                       LPOUTLINETEXTMETRICW potm);
-
-
-
-
-
-
-
-
-__declspec(dllimport) UINT	__stdcall GetPaletteEntries(        HPALETTE hpal,
-                                                 UINT iStart,
-                                                 UINT cEntries,
-                                                 LPPALETTEENTRY pPalEntries);
-__declspec(dllimport) COLORREF __stdcall GetPixel(      HDC hdc,      int x,      int y);
-__declspec(dllimport) int   __stdcall GetPixelFormat(      HDC hdc);
-__declspec(dllimport) int   __stdcall GetPolyFillMode(      HDC hdc);
-__declspec(dllimport) BOOL  __stdcall GetRasterizerCaps(        LPRASTERIZER_STATUS lpraststat, 
-                                                 UINT cjBytes);
-
-__declspec(dllimport) int   __stdcall GetRandomRgn (     HDC hdc,      HRGN hrgn,      INT i);
-__declspec(dllimport) DWORD __stdcall GetRegionData(        HRGN hrgn,
-                                             DWORD nCount,
-                                                 LPRGNDATA lpRgnData);
-__declspec(dllimport) int   __stdcall GetRgnBox(      HRGN hrgn,       LPRECT lprc);
-__declspec(dllimport) HGDIOBJ __stdcall GetStockObject(      int i);
-__declspec(dllimport) int   __stdcall GetStretchBltMode(     HDC hdc);
-__declspec(dllimport)
-UINT
-__stdcall
-GetSystemPaletteEntries(
-         HDC  hdc,
-         UINT iStart,
-         UINT cEntries,
-           LPPALETTEENTRY pPalEntries
-    );
-
-__declspec(dllimport) UINT  __stdcall GetSystemPaletteUse(     HDC hdc);
-__declspec(dllimport) int   __stdcall GetTextCharacterExtra(     HDC hdc);
-__declspec(dllimport) UINT  __stdcall GetTextAlign(     HDC hdc);
-__declspec(dllimport) COLORREF __stdcall GetTextColor(     HDC hdc);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetTextExtentPointA(
-         HDC hdc,
-           LPCSTR lpString,
-         int c,
-         LPSIZE lpsz
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetTextExtentPointW(
-         HDC hdc,
-           LPCWSTR lpString,
-         int c,
-         LPSIZE lpsz
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetTextExtentPoint32A(
-         HDC hdc,
-           LPCSTR lpString,
-         int c,
-         LPSIZE psizl
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetTextExtentPoint32W(
-         HDC hdc,
-           LPCWSTR lpString,
-         int c,
-         LPSIZE psizl
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetTextExtentExPointA(
-         HDC hdc,
-           LPCSTR lpszString,
-         int cchString,
-         int nMaxExtent,
-           LPINT lpnFit,
-             LPINT lpnDx,
-         LPSIZE lpSize
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-GetTextExtentExPointW(
-         HDC hdc,
-           LPCWSTR lpszString,
-         int cchString,
-         int nMaxExtent,
-           LPINT lpnFit,
-             LPINT lpnDx,
-         LPSIZE lpSize
-    );
-
-
-
-
-
-
-
-__declspec(dllimport) int __stdcall GetTextCharset(      HDC hdc);
-__declspec(dllimport) int __stdcall GetTextCharsetInfo(      HDC hdc,        LPFONTSIGNATURE lpSig,      DWORD dwFlags);
-__declspec(dllimport) BOOL __stdcall TranslateCharsetInfo(      DWORD  *lpSrc,       LPCHARSETINFO lpCs,      DWORD dwFlags);
-__declspec(dllimport) DWORD __stdcall GetFontLanguageInfo(      HDC hdc);
-__declspec(dllimport) DWORD __stdcall GetCharacterPlacementA(       HDC hdc,        LPCSTR lpString,      int nCount,      int nMexExtent,      LPGCP_RESULTSA lpResults,      DWORD dwFlags);
-__declspec(dllimport) DWORD __stdcall GetCharacterPlacementW(       HDC hdc,        LPCWSTR lpString,      int nCount,      int nMexExtent,      LPGCP_RESULTSW lpResults,      DWORD dwFlags);
-
-
-
-
-
-
-
-
-
-typedef struct tagWCRANGE
-{
-    WCHAR  wcLow;
-    USHORT cGlyphs;
-} WCRANGE, *PWCRANGE, *LPWCRANGE;
-
-
-typedef struct tagGLYPHSET
-{
-    DWORD    cbThis;
-    DWORD    flAccel;
-    DWORD    cGlyphsSupported;
-    DWORD    cRanges;
-    WCRANGE  ranges[1];
-} GLYPHSET, *PGLYPHSET,  *LPGLYPHSET;
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) DWORD __stdcall GetFontUnicodeRanges(      HDC hdc,        LPGLYPHSET lpgs);
-__declspec(dllimport) DWORD __stdcall GetGlyphIndicesA(      HDC hdc,        LPCSTR lpstr,      int c,      LPWORD pgi,      DWORD fl);
-__declspec(dllimport) DWORD __stdcall GetGlyphIndicesW(      HDC hdc,        LPCWSTR lpstr,      int c,      LPWORD pgi,      DWORD fl);
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall GetTextExtentPointI(     HDC hdc,        LPWORD pgiIn,      int cgi,      LPSIZE psize);
-__declspec(dllimport) BOOL	__stdcall GetTextExtentExPointI (       HDC hdc,
-                                                       LPWORD lpwszString,
-                                                     int cwchString,
-                                                     int nMaxExtent,
-                                                       LPINT lpnFit,
-                                                         LPINT lpnDx,
-                                                     LPSIZE lpSize
-                                                );
-
-__declspec(dllimport) BOOL  __stdcall GetCharWidthI(        HDC hdc,
-                                             UINT giFirst,
-                                             UINT cgi,
-                                                 LPWORD pgi,
-                                             LPINT piWidths
-                                        );
-
-__declspec(dllimport) BOOL  __stdcall GetCharABCWidthsI(        HDC    hdc,
-                                                 UINT   giFirst,
-                                                 UINT   cgi,
-                                                     LPWORD pgi,
-                                                 LPABC  pabc
-                                        );
-
-
-
-
-
-
-
-
-typedef struct tagDESIGNVECTOR
-{
-    DWORD  dvReserved;
-    DWORD  dvNumAxes;
-    LONG   dvValues[16];
-} DESIGNVECTOR, *PDESIGNVECTOR,  *LPDESIGNVECTOR;
-
-__declspec(dllimport) int  __stdcall AddFontResourceExA(      LPCSTR name,      DWORD fl,   PVOID res);
-__declspec(dllimport) int  __stdcall AddFontResourceExW(      LPCWSTR name,      DWORD fl,   PVOID res);
-
-
-
-
-
-__declspec(dllimport) BOOL __stdcall RemoveFontResourceExA(      LPCSTR name,      DWORD fl,   PVOID pdv);
-__declspec(dllimport) BOOL __stdcall RemoveFontResourceExW(      LPCWSTR name,      DWORD fl,   PVOID pdv);
-
-
-
-
-
-__declspec(dllimport) HANDLE __stdcall AddFontMemResourceEx(          PVOID pFileView,
-                                                     DWORD cjSize,
-                                                  PVOID pvResrved,
-                                                     DWORD* pNumFonts);
-
-__declspec(dllimport) BOOL __stdcall RemoveFontMemResourceEx(      HANDLE h);
-
-
-
-
-
-
-
-
-
-typedef struct tagAXISINFOA
-{
-    LONG   axMinValue;
-    LONG   axMaxValue;
-    BYTE   axAxisName[16];
-} AXISINFOA, *PAXISINFOA,  *LPAXISINFOA;
-typedef struct tagAXISINFOW
-{
-    LONG   axMinValue;
-    LONG   axMaxValue;
-    WCHAR  axAxisName[16];
-} AXISINFOW, *PAXISINFOW,  *LPAXISINFOW;
-
-typedef AXISINFOW AXISINFO;
-typedef PAXISINFOW PAXISINFO;
-typedef LPAXISINFOW LPAXISINFO;
-
-
-
-
-
-
-typedef struct tagAXESLISTA
-{
-    DWORD     axlReserved;
-    DWORD     axlNumAxes;
-    AXISINFOA axlAxisInfo[16];
-} AXESLISTA, *PAXESLISTA,  *LPAXESLISTA;
-typedef struct tagAXESLISTW
-{
-    DWORD     axlReserved;
-    DWORD     axlNumAxes;
-    AXISINFOW axlAxisInfo[16];
-} AXESLISTW, *PAXESLISTW,  *LPAXESLISTW;
-
-typedef AXESLISTW AXESLIST;
-typedef PAXESLISTW PAXESLIST;
-typedef LPAXESLISTW LPAXESLIST;
-
-
-
-
-
-
-
-
-
-
-typedef struct tagENUMLOGFONTEXDVA
-{
-    ENUMLOGFONTEXA elfEnumLogfontEx;
-    DESIGNVECTOR   elfDesignVector;
-} ENUMLOGFONTEXDVA, *PENUMLOGFONTEXDVA,  *LPENUMLOGFONTEXDVA;
-typedef struct tagENUMLOGFONTEXDVW
-{
-    ENUMLOGFONTEXW elfEnumLogfontEx;
-    DESIGNVECTOR   elfDesignVector;
-} ENUMLOGFONTEXDVW, *PENUMLOGFONTEXDVW,  *LPENUMLOGFONTEXDVW;
-
-typedef ENUMLOGFONTEXDVW ENUMLOGFONTEXDV;
-typedef PENUMLOGFONTEXDVW PENUMLOGFONTEXDV;
-typedef LPENUMLOGFONTEXDVW LPENUMLOGFONTEXDV;
-
-
-
-
-
-
-__declspec(dllimport) HFONT  __stdcall CreateFontIndirectExA(      const ENUMLOGFONTEXDVA *);
-__declspec(dllimport) HFONT  __stdcall CreateFontIndirectExW(      const ENUMLOGFONTEXDVW *);
-
-
-
-
-
-
-
-typedef struct tagENUMTEXTMETRICA
-{
-    NEWTEXTMETRICEXA etmNewTextMetricEx;
-    AXESLISTA        etmAxesList;
-} ENUMTEXTMETRICA, *PENUMTEXTMETRICA,  *LPENUMTEXTMETRICA;
-typedef struct tagENUMTEXTMETRICW
-{
-    NEWTEXTMETRICEXW etmNewTextMetricEx;
-    AXESLISTW        etmAxesList;
-} ENUMTEXTMETRICW, *PENUMTEXTMETRICW,  *LPENUMTEXTMETRICW;
-
-typedef ENUMTEXTMETRICW ENUMTEXTMETRIC;
-typedef PENUMTEXTMETRICW PENUMTEXTMETRIC;
-typedef LPENUMTEXTMETRICW LPENUMTEXTMETRIC;
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall GetViewportExtEx(      HDC hdc,      LPSIZE lpsize);
-__declspec(dllimport) BOOL  __stdcall GetViewportOrgEx(      HDC hdc,      LPPOINT lppoint);
-__declspec(dllimport) BOOL  __stdcall GetWindowExtEx(      HDC hdc,      LPSIZE lpsize);
-__declspec(dllimport) BOOL  __stdcall GetWindowOrgEx(      HDC hdc,      LPPOINT lppoint);
-
-__declspec(dllimport) int  __stdcall IntersectClipRect(      HDC hdc,      int left,      int top,      int right,      int bottom);
-__declspec(dllimport) BOOL __stdcall InvertRgn(      HDC hdc,      HRGN hrgn);
-__declspec(dllimport) BOOL __stdcall LineDDA(      int xStart,      int yStart,      int xEnd,      int yEnd,      LINEDDAPROC lpProc,        LPARAM data);
-__declspec(dllimport) BOOL __stdcall LineTo(      HDC hdc,      int x,      int y);
-__declspec(dllimport) BOOL __stdcall MaskBlt(      HDC hdcDest,      int xDest,      int yDest,      int width,      int height,
-                   HDC hdcSrc,      int xSrc,      int ySrc,      HBITMAP hbmMask,      int xMask,      int yMask,      DWORD rop);
-__declspec(dllimport) BOOL __stdcall PlgBlt(      HDC hdcDest,        const POINT * lpPoint,      HDC hdcSrc,      int xSrc,      int ySrc,      int width,
-                          int height,        HBITMAP hbmMask,      int xMask,      int yMask);
-
-__declspec(dllimport) int  __stdcall OffsetClipRgn(     HDC hdc,      int x,      int y);
-__declspec(dllimport) int  __stdcall OffsetRgn(     HRGN hrgn,      int x,      int y);
-__declspec(dllimport) BOOL __stdcall PatBlt(     HDC hdc,      int x,      int y,      int w,      int h,      DWORD rop);
-__declspec(dllimport) BOOL __stdcall Pie(     HDC hdc,      int left,      int top,      int right,      int bottom,      int xr1,      int yr1,      int xr2,      int yr2);
-__declspec(dllimport) BOOL __stdcall PlayMetaFile(     HDC hdc,      HMETAFILE hmf);
-__declspec(dllimport) BOOL __stdcall PaintRgn(     HDC hdc,      HRGN hrgn);
-__declspec(dllimport) BOOL __stdcall PolyPolygon(     HDC hdc,       const POINT *apt,         const INT *asz,       int csz);
-__declspec(dllimport) BOOL __stdcall PtInRegion(     HRGN hrgn,      int x,      int y);
-__declspec(dllimport) BOOL __stdcall PtVisible(     HDC hdc,      int x,      int y);
-__declspec(dllimport) BOOL __stdcall RectInRegion(     HRGN hrgn,      const RECT * lprect);
-__declspec(dllimport) BOOL __stdcall RectVisible(     HDC hdc,      const RECT * lprect);
-__declspec(dllimport) BOOL __stdcall Rectangle(     HDC hdc,      int left,      int top,      int right,      int bottom);
-__declspec(dllimport) BOOL __stdcall RestoreDC(     HDC hdc,      int nSavedDC);
-__declspec(dllimport) HDC  __stdcall ResetDCA(     HDC hdc,      const DEVMODEA * lpdm);
-__declspec(dllimport) HDC  __stdcall ResetDCW(     HDC hdc,      const DEVMODEW * lpdm);
-
-
-
-
-
-__declspec(dllimport) UINT __stdcall RealizePalette(     HDC hdc);
-__declspec(dllimport) BOOL __stdcall RemoveFontResourceA(     LPCSTR lpFileName);
-__declspec(dllimport) BOOL __stdcall RemoveFontResourceW(     LPCWSTR lpFileName);
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall RoundRect(     HDC hdc,      int left,      int top,      int right,      int bottom,      int width,      int height);
-__declspec(dllimport) BOOL __stdcall ResizePalette(     HPALETTE hpal,      UINT n);
-
-__declspec(dllimport) int  __stdcall SaveDC(     HDC hdc);
-__declspec(dllimport) int  __stdcall SelectClipRgn(     HDC hdc,        HRGN hrgn);
-__declspec(dllimport) int  __stdcall ExtSelectClipRgn(     HDC hdc,        HRGN hrgn,      int mode);
-__declspec(dllimport) int  __stdcall SetMetaRgn(     HDC hdc);
-__declspec(dllimport) HGDIOBJ __stdcall SelectObject(     HDC hdc,      HGDIOBJ h);
-__declspec(dllimport) HPALETTE __stdcall SelectPalette(     HDC hdc,      HPALETTE hPal,      BOOL bForceBkgd);
-__declspec(dllimport) COLORREF __stdcall SetBkColor(     HDC hdc,      COLORREF color);
-
-
-__declspec(dllimport) COLORREF __stdcall SetDCBrushColor(     HDC hdc,      COLORREF color);
-__declspec(dllimport) COLORREF __stdcall SetDCPenColor(     HDC hdc,      COLORREF color);
-
-
-__declspec(dllimport) int   __stdcall SetBkMode(     HDC hdc,      int mode);
-
-__declspec(dllimport)
-LONG __stdcall
-SetBitmapBits(
-         HBITMAP hbm,
-         DWORD cb,
-           const void *pvBits);
-
-__declspec(dllimport) UINT  __stdcall SetBoundsRect(     HDC hdc,        const RECT * lprect,      UINT flags);
-__declspec(dllimport) int	__stdcall SetDIBits(     HDC hdc,      HBITMAP hbm,      UINT start,      UINT cLines,      const void *lpBits,      const BITMAPINFO * lpbmi,      UINT ColorUse);
-__declspec(dllimport) int   __stdcall SetDIBitsToDevice(     HDC hdc,      int xDest,      int yDest,      DWORD w,      DWORD h,      int xSrc,
-             int ySrc,      UINT StartScan,      UINT cLines,      const void * lpvBits,      const BITMAPINFO * lpbmi,      UINT ColorUse);
-__declspec(dllimport) DWORD __stdcall SetMapperFlags(     HDC hdc,      DWORD flags);
-__declspec(dllimport) int   __stdcall SetGraphicsMode(     HDC hdc,      int iMode);
-__declspec(dllimport) int   __stdcall SetMapMode(     HDC hdc,      int iMode);
-
-
-__declspec(dllimport) DWORD __stdcall SetLayout(     HDC hdc,      DWORD l);
-__declspec(dllimport) DWORD __stdcall GetLayout(     HDC hdc);
-
-
-__declspec(dllimport) HMETAFILE   __stdcall SetMetaFileBitsEx(     UINT cbBuffer,        const BYTE *lpData);
-__declspec(dllimport) UINT  __stdcall SetPaletteEntries(        HPALETTE hpal,
-                                                 UINT iStart,
-                                                 UINT cEntries,
-                                                   const PALETTEENTRY *pPalEntries);
-__declspec(dllimport) COLORREF __stdcall SetPixel(     HDC hdc,      int x,      int y,      COLORREF color);
-__declspec(dllimport) BOOL   __stdcall SetPixelV(     HDC hdc,      int x,      int y,      COLORREF color);
-__declspec(dllimport) BOOL  __stdcall SetPixelFormat(     HDC hdc,      int format,      const PIXELFORMATDESCRIPTOR * ppfd);
-__declspec(dllimport) int   __stdcall SetPolyFillMode(     HDC hdc,      int mode);
-__declspec(dllimport) BOOL	 __stdcall StretchBlt(     HDC hdcDest,      int xDest,      int yDest,      int wDest,      int hDest,      HDC hdcSrc,      int xSrc,      int ySrc,      int wSrc,      int hSrc,      DWORD rop);
-__declspec(dllimport) BOOL   __stdcall SetRectRgn(     HRGN hrgn,      int left,      int top,      int right,      int bottom);
-__declspec(dllimport) int   __stdcall StretchDIBits(     HDC hdc,      int xDest,      int yDest,      int DestWidth,      int DestHeight,      int xSrc,      int ySrc,      int SrcWidth,      int SrcHeight,
-             const void * lpBits,      const BITMAPINFO * lpbmi,      UINT iUsage,      DWORD rop);
-__declspec(dllimport) int   __stdcall SetROP2(     HDC hdc,      int rop2);
-__declspec(dllimport) int   __stdcall SetStretchBltMode(     HDC hdc,      int mode);
-__declspec(dllimport) UINT  __stdcall SetSystemPaletteUse(     HDC hdc,      UINT use);
-__declspec(dllimport) int   __stdcall SetTextCharacterExtra(     HDC hdc,      int extra);
-__declspec(dllimport) COLORREF __stdcall SetTextColor(     HDC hdc,      COLORREF color);
-__declspec(dllimport) UINT  __stdcall SetTextAlign(     HDC hdc,      UINT align);
-__declspec(dllimport) BOOL  __stdcall SetTextJustification(     HDC hdc,      int extra,      int count);
-__declspec(dllimport) BOOL  __stdcall UpdateColors(     HDC hdc);
-
-
-
-
-
-
-
-typedef USHORT COLOR16;
-
-typedef struct _TRIVERTEX
-{
-    LONG    x;
-    LONG    y;
-    COLOR16 Red;
-    COLOR16 Green;
-    COLOR16 Blue;
-    COLOR16 Alpha;
-}TRIVERTEX,*PTRIVERTEX,*LPTRIVERTEX;
-
-typedef struct _GRADIENT_TRIANGLE
-{
-    ULONG Vertex1;
-    ULONG Vertex2;
-    ULONG Vertex3;
-} GRADIENT_TRIANGLE,*PGRADIENT_TRIANGLE,*LPGRADIENT_TRIANGLE;
-
-typedef struct _GRADIENT_RECT
-{
-    ULONG UpperLeft;
-    ULONG LowerRight;
-}GRADIENT_RECT,*PGRADIENT_RECT,*LPGRADIENT_RECT;
-
-typedef struct _BLENDFUNCTION
-{
-    BYTE   BlendOp;
-    BYTE   BlendFlags;
-    BYTE   SourceConstantAlpha;
-    BYTE   AlphaFormat;
-}BLENDFUNCTION,*PBLENDFUNCTION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) BOOL __stdcall AlphaBlend(      HDC hdcDest,      int xoriginDest,      int yoriginDest,      int wDest,      int hDest,      HDC hdcSrc,      int xoriginSrc,      int yoriginSrc,      int wSrc,      int hSrc,      BLENDFUNCTION ftn);
-
-__declspec(dllimport) BOOL __stdcall TransparentBlt(     HDC hdcDest,     int xoriginDest,      int yoriginDest,      int wDest,      int hDest,      HDC hdcSrc,
-                                                int xoriginSrc,      int yoriginSrc,      int wSrc,      int hSrc,      UINT crTransparent);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GradientFill(
-         HDC hdc,
-           PTRIVERTEX pVertex,
-         ULONG nVertex,
-         PVOID pMesh,
-         ULONG nMesh,
-         ULONG ulMode
-    );
-
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall PlayMetaFileRecord(       HDC hdc,
-                                                   LPHANDLETABLE lpHandleTable,
-                                                 LPMETARECORD lpMR,
-                                                 UINT noObjs);
-
-typedef int (__stdcall* MFENUMPROC)(      HDC hdc,        HANDLETABLE * lpht,      METARECORD * lpMR,      int nObj,        LPARAM param);
-__declspec(dllimport) BOOL	__stdcall EnumMetaFile(      HDC hdc,      HMETAFILE hmf,      MFENUMPROC proc,        LPARAM param);
-
-typedef int (__stdcall* ENHMFENUMPROC)(     HDC hdc,        HANDLETABLE * lpht,      const ENHMETARECORD * lpmr,      int hHandles,        LPARAM data);
-
-
-
-__declspec(dllimport) HENHMETAFILE __stdcall CloseEnhMetaFile(      HDC hdc);
-__declspec(dllimport) HENHMETAFILE __stdcall CopyEnhMetaFileA(      HENHMETAFILE hEnh,        LPCSTR lpFileName);
-__declspec(dllimport) HENHMETAFILE __stdcall CopyEnhMetaFileW(      HENHMETAFILE hEnh,        LPCWSTR lpFileName);
-
-
-
-
-
-__declspec(dllimport) HDC   __stdcall CreateEnhMetaFileA(        HDC hdc,        LPCSTR lpFilename,        const RECT *lprc,        LPCSTR lpDesc);
-__declspec(dllimport) HDC   __stdcall CreateEnhMetaFileW(        HDC hdc,        LPCWSTR lpFilename,        const RECT *lprc,        LPCWSTR lpDesc);
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall DeleteEnhMetaFile(      HENHMETAFILE hmf);
-__declspec(dllimport) BOOL  __stdcall EnumEnhMetaFile(        HDC hdc,      HENHMETAFILE hmf,      ENHMFENUMPROC proc,
-                                               LPVOID param,        const RECT * lpRect);
-__declspec(dllimport) HENHMETAFILE  __stdcall GetEnhMetaFileA(      LPCSTR lpName);
-__declspec(dllimport) HENHMETAFILE  __stdcall GetEnhMetaFileW(      LPCWSTR lpName);
-
-
-
-
-
-__declspec(dllimport) UINT	__stdcall GetEnhMetaFileBits(       HENHMETAFILE hEMF,
-                                                 UINT nSize,
-                                                   LPBYTE lpData);
-__declspec(dllimport) UINT	__stdcall GetEnhMetaFileDescriptionA(       HENHMETAFILE hemf,
-                                                         UINT cchBuffer,
-                                                           LPSTR lpDescription);
-__declspec(dllimport) UINT	__stdcall GetEnhMetaFileDescriptionW(       HENHMETAFILE hemf,
-                                                         UINT cchBuffer,
-                                                           LPWSTR lpDescription);
-
-
-
-
-
-__declspec(dllimport) UINT	__stdcall GetEnhMetaFileHeader(         HENHMETAFILE hemf,
-                                                     UINT nSize,
-                                                       LPENHMETAHEADER lpEnhMetaHeader);
-__declspec(dllimport) UINT	__stdcall GetEnhMetaFilePaletteEntries(     HENHMETAFILE hemf,
-                                                         UINT nNumEntries,
-                                                           LPPALETTEENTRY lpPaletteEntries);
-
-__declspec(dllimport) UINT  __stdcall GetEnhMetaFilePixelFormat(        HENHMETAFILE hemf,
-                                                         UINT cbBuffer,
-                                                           PIXELFORMATDESCRIPTOR *ppfd);
-__declspec(dllimport) UINT	__stdcall GetWinMetaFileBits(       HENHMETAFILE hemf,
-                                                 UINT cbData16,
-                                                   LPBYTE pData16,
-                                                 INT iMapMode,
-                                                 HDC hdcRef);
-__declspec(dllimport) BOOL  __stdcall PlayEnhMetaFile(      HDC hdc,      HENHMETAFILE hmf,      const RECT * lprect);
-__declspec(dllimport) BOOL  __stdcall PlayEnhMetaFileRecord(        HDC hdc,
-                                                       LPHANDLETABLE pht,
-                                                     const ENHMETARECORD *pmr,
-                                                     UINT cht);
-
-__declspec(dllimport) HENHMETAFILE  __stdcall SetEnhMetaFileBits(       UINT nSize,
-                                                           const BYTE * pb);
-
-__declspec(dllimport) HENHMETAFILE  __stdcall SetWinMetaFileBits(       UINT nSize,
-                                                           const BYTE *lpMeta16Data,
-                                                           HDC hdcRef,
-                                                           const METAFILEPICT *lpMFP);
-__declspec(dllimport) BOOL  __stdcall GdiComment(     HDC hdc,      UINT nSize,        const BYTE *lpData);
-
-
-
-
-
-__declspec(dllimport) BOOL __stdcall GetTextMetricsA(      HDC hdc,      LPTEXTMETRICA lptm);
-__declspec(dllimport) BOOL __stdcall GetTextMetricsW(      HDC hdc,      LPTEXTMETRICW lptm);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagDIBSECTION {
-    BITMAP		 dsBm;
-    BITMAPINFOHEADER    dsBmih;
-    DWORD               dsBitfields[3];
-    HANDLE              dshSection;
-    DWORD               dsOffset;
-} DIBSECTION,  *LPDIBSECTION, *PDIBSECTION;
-
-
-__declspec(dllimport) BOOL __stdcall AngleArc(      HDC hdc,      int x,      int y,      DWORD r,      FLOAT StartAngle,      FLOAT SweepAngle);
-__declspec(dllimport) BOOL __stdcall PolyPolyline(     HDC hdc,      const POINT *apt,        const DWORD *asz,      DWORD csz);
-__declspec(dllimport) BOOL __stdcall GetWorldTransform(      HDC hdc,      LPXFORM lpxf);
-__declspec(dllimport) BOOL __stdcall SetWorldTransform(      HDC hdc,      const XFORM * lpxf);
-__declspec(dllimport) BOOL __stdcall ModifyWorldTransform(      HDC hdc,        const XFORM * lpxf,      DWORD mode);
-__declspec(dllimport) BOOL __stdcall CombineTransform(      LPXFORM lpxfOut,      const XFORM *lpxf1,      const XFORM *lpxf2);
-__declspec(dllimport) HBITMAP __stdcall CreateDIBSection(       HDC hdc,      const BITMAPINFO *lpbmi,      UINT usage,                 void **ppvBits,        HANDLE hSection,      DWORD offset);
-__declspec(dllimport) UINT __stdcall GetDIBColorTable(      HDC  hdc,
-                                             UINT iStart,
-                                             UINT cEntries,
-                                             RGBQUAD *prgbq);
-__declspec(dllimport) UINT __stdcall SetDIBColorTable(      HDC  hdc,
-                                             UINT iStart,
-                                             UINT cEntries,
-                                               const RGBQUAD *prgbq);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct  tagCOLORADJUSTMENT {
-    WORD   caSize;
-    WORD   caFlags;
-    WORD   caIlluminantIndex;
-    WORD   caRedGamma;
-    WORD   caGreenGamma;
-    WORD   caBlueGamma;
-    WORD   caReferenceBlack;
-    WORD   caReferenceWhite;
-    SHORT  caContrast;
-    SHORT  caBrightness;
-    SHORT  caColorfulness;
-    SHORT  caRedGreenTint;
-} COLORADJUSTMENT, *PCOLORADJUSTMENT,  *LPCOLORADJUSTMENT;
-
-__declspec(dllimport) BOOL __stdcall SetColorAdjustment(      HDC hdc,      const COLORADJUSTMENT *lpca);
-__declspec(dllimport) BOOL __stdcall GetColorAdjustment(      HDC hdc,      LPCOLORADJUSTMENT lpca);
-__declspec(dllimport) HPALETTE __stdcall CreateHalftonePalette(        HDC hdc);
-
-
-typedef BOOL (__stdcall* ABORTPROC)(      HDC,      int);
-
-
-
-
-typedef struct _DOCINFOA {
-    int     cbSize;
-    LPCSTR   lpszDocName;
-    LPCSTR   lpszOutput;
-
-    LPCSTR   lpszDatatype;
-    DWORD    fwType;
-
-} DOCINFOA, *LPDOCINFOA;
-typedef struct _DOCINFOW {
-    int     cbSize;
-    LPCWSTR  lpszDocName;
-    LPCWSTR  lpszOutput;
-
-    LPCWSTR  lpszDatatype;
-    DWORD    fwType;
-
-} DOCINFOW, *LPDOCINFOW;
-
-typedef DOCINFOW DOCINFO;
-typedef LPDOCINFOW LPDOCINFO;
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) int __stdcall StartDocA(     HDC hdc,      const DOCINFOA *lpdi);
-__declspec(dllimport) int __stdcall StartDocW(     HDC hdc,      const DOCINFOW *lpdi);
-
-
-
-
-
-__declspec(dllimport) int __stdcall EndDoc(     HDC hdc);
-__declspec(dllimport) int __stdcall StartPage(     HDC hdc);
-__declspec(dllimport) int __stdcall EndPage(     HDC hdc);
-__declspec(dllimport) int __stdcall AbortDoc(     HDC hdc);
-__declspec(dllimport) int __stdcall SetAbortProc(     HDC hdc,      ABORTPROC proc);
-
-__declspec(dllimport) BOOL __stdcall AbortPath(     HDC hdc);
-__declspec(dllimport) BOOL __stdcall ArcTo(     HDC hdc,      int left,      int top,      int right,      int bottom,      int xr1,      int yr1,      int xr2,      int yr2);
-__declspec(dllimport) BOOL __stdcall BeginPath(     HDC hdc);
-__declspec(dllimport) BOOL __stdcall CloseFigure(     HDC hdc);
-__declspec(dllimport) BOOL __stdcall EndPath(     HDC hdc);
-__declspec(dllimport) BOOL __stdcall FillPath(     HDC hdc);
-__declspec(dllimport) BOOL __stdcall FlattenPath(     HDC hdc);
-__declspec(dllimport) int  __stdcall GetPath(     HDC hdc,      LPPOINT apt,      LPBYTE aj, int cpt);
-__declspec(dllimport) HRGN __stdcall PathToRegion(     HDC hdc);
-__declspec(dllimport) BOOL __stdcall PolyDraw(     HDC hdc,        const POINT * apt,        const BYTE * aj,      int cpt);
-__declspec(dllimport) BOOL __stdcall SelectClipPath(     HDC hdc,      int mode);
-__declspec(dllimport) int  __stdcall SetArcDirection(     HDC hdc,      int dir);
-__declspec(dllimport) BOOL __stdcall SetMiterLimit(     HDC hdc,      FLOAT limit,        PFLOAT old);
-__declspec(dllimport) BOOL __stdcall StrokeAndFillPath(     HDC hdc);
-__declspec(dllimport) BOOL __stdcall StrokePath(     HDC hdc);
-__declspec(dllimport) BOOL __stdcall WidenPath(     HDC hdc);
-__declspec(dllimport) HPEN __stdcall ExtCreatePen(      DWORD iPenStyle,
-                                         DWORD cWidth,
-                                         const LOGBRUSH *plbrush,
-                                         DWORD cStyle,
-                                             const DWORD *pstyle);
-__declspec(dllimport) BOOL __stdcall GetMiterLimit(     HDC hdc,      PFLOAT plimit);
-__declspec(dllimport) int  __stdcall GetArcDirection(     HDC hdc);
-
-__declspec(dllimport) int   __stdcall GetObjectA(     HANDLE h,      int c,        LPVOID pv);
-__declspec(dllimport) int   __stdcall GetObjectW(     HANDLE h,      int c,        LPVOID pv);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall MoveToEx(      HDC hdc,      int x,      int y,        LPPOINT lppt);
-__declspec(dllimport) BOOL  __stdcall TextOutA(      HDC hdc,      int x,      int y,        LPCSTR lpString,      int c);
-__declspec(dllimport) BOOL  __stdcall TextOutW(      HDC hdc,      int x,      int y,        LPCWSTR lpString,      int c);
-
-
-
-
-
-__declspec(dllimport) BOOL	__stdcall ExtTextOutA(      HDC hdc,      int x,      int y,      UINT options,        const RECT * lprect,        LPCSTR lpString,      UINT c,          const INT * lpDx);
-__declspec(dllimport) BOOL	__stdcall ExtTextOutW(      HDC hdc,      int x,      int y,      UINT options,        const RECT * lprect,        LPCWSTR lpString,      UINT c,          const INT * lpDx);
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall PolyTextOutA(     HDC hdc,        const POLYTEXTA * ppt,      int nstrings);
-__declspec(dllimport) BOOL  __stdcall PolyTextOutW(     HDC hdc,        const POLYTEXTW * ppt,      int nstrings);
-
-
-
-
-
-
-__declspec(dllimport) HRGN  __stdcall CreatePolygonRgn(           const POINT *pptl,
-                                                 int cPoint,
-                                                 int iMode);
-__declspec(dllimport) BOOL  __stdcall DPtoLP(      HDC hdc,        LPPOINT lppt,      int c);
-__declspec(dllimport) BOOL  __stdcall LPtoDP(      HDC hdc,        LPPOINT lppt,      int c);
-__declspec(dllimport) BOOL  __stdcall Polygon(     HDC hdc,        const POINT *apt,      int cpt);
-__declspec(dllimport) BOOL  __stdcall Polyline(     HDC hdc,        const POINT *apt,      int cpt);
-
-__declspec(dllimport) BOOL  __stdcall PolyBezier(     HDC hdc,        const POINT * apt,      DWORD cpt);
-__declspec(dllimport) BOOL  __stdcall PolyBezierTo(     HDC hdc,        const POINT * apt,      DWORD cpt);
-__declspec(dllimport) BOOL  __stdcall PolylineTo(     HDC hdc,        const POINT * apt,      DWORD cpt);
-
-__declspec(dllimport) BOOL  __stdcall SetViewportExtEx(      HDC hdc,      int x,      int y,        LPSIZE lpsz);
-__declspec(dllimport) BOOL  __stdcall SetViewportOrgEx(      HDC hdc,      int x,      int y,        LPPOINT lppt);
-__declspec(dllimport) BOOL  __stdcall SetWindowExtEx(      HDC hdc,      int x,      int y,        LPSIZE lpsz);
-__declspec(dllimport) BOOL  __stdcall SetWindowOrgEx(      HDC hdc,      int x,      int y,        LPPOINT lppt);
-
-__declspec(dllimport) BOOL  __stdcall OffsetViewportOrgEx(      HDC hdc,      int x,      int y,        LPPOINT lppt);
-__declspec(dllimport) BOOL  __stdcall OffsetWindowOrgEx(      HDC hdc,      int x,      int y,        LPPOINT lppt);
-__declspec(dllimport) BOOL  __stdcall ScaleViewportExtEx(      HDC hdc,      int xn,      int dx,      int yn,      int yd,        LPSIZE lpsz);
-__declspec(dllimport) BOOL  __stdcall ScaleWindowExtEx(      HDC hdc,      int xn,      int xd,      int yn,      int yd,        LPSIZE lpsz);
-__declspec(dllimport) BOOL  __stdcall SetBitmapDimensionEx(      HBITMAP hbm,      int w,      int h,        LPSIZE lpsz);
-__declspec(dllimport) BOOL  __stdcall SetBrushOrgEx(      HDC hdc,      int x,      int y,        LPPOINT lppt);
-
-__declspec(dllimport) int   __stdcall GetTextFaceA(      HDC hdc,      int c,           LPSTR lpName);
-__declspec(dllimport) int   __stdcall GetTextFaceW(      HDC hdc,      int c,           LPWSTR lpName);
-
-
-
-
-
-
-
-
-typedef struct tagKERNINGPAIR {
-   WORD wFirst;
-   WORD wSecond;
-   int  iKernAmount;
-} KERNINGPAIR, *LPKERNINGPAIR;
-
-__declspec(dllimport) DWORD __stdcall GetKerningPairsA(         HDC hdc, 
-                                                 DWORD nPairs, 
-                                                     LPKERNINGPAIR   lpKernPair);
-__declspec(dllimport) DWORD __stdcall GetKerningPairsW(         HDC hdc, 
-                                                 DWORD nPairs, 
-                                                     LPKERNINGPAIR   lpKernPair);
-
-
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall GetDCOrgEx(      HDC hdc,      LPPOINT lppt);
-__declspec(dllimport) BOOL  __stdcall FixBrushOrgEx(      HDC hdc,      int x,      int y,         LPPOINT ptl);
-__declspec(dllimport) BOOL  __stdcall UnrealizeObject(      HGDIOBJ h);
-
-__declspec(dllimport) BOOL  __stdcall GdiFlush();
-__declspec(dllimport) DWORD __stdcall GdiSetBatchLimit(      DWORD dw);
-__declspec(dllimport) DWORD __stdcall GdiGetBatchLimit();
-
-
-
-
-
-
-
-
-typedef int (__stdcall* ICMENUMPROCA)(LPSTR, LPARAM);
-typedef int (__stdcall* ICMENUMPROCW)(LPWSTR, LPARAM);
-
-
-
-
-
-
-__declspec(dllimport) int         __stdcall SetICMMode(      HDC hdc,      int mode);
-__declspec(dllimport) BOOL        __stdcall CheckColorsInGamut(         HDC hdc,
-                                                            LPVOID lpRGBTriple,
-                                                         LPVOID dlpBuffer,
-                                                         DWORD nCount);
-
-__declspec(dllimport) HCOLORSPACE __stdcall GetColorSpace(      HDC hdc);
-__declspec(dllimport) BOOL        __stdcall GetLogColorSpaceA(      HCOLORSPACE hColorSpace, 
-                                                     LPLOGCOLORSPACEA lpBuffer, 
-                                                     DWORD nSize);
-__declspec(dllimport) BOOL        __stdcall GetLogColorSpaceW(      HCOLORSPACE hColorSpace, 
-                                                     LPLOGCOLORSPACEW lpBuffer, 
-                                                     DWORD nSize);
-
-
-
-
-
-
-__declspec(dllimport) HCOLORSPACE __stdcall CreateColorSpaceA(      LPLOGCOLORSPACEA lplcs);
-__declspec(dllimport) HCOLORSPACE __stdcall CreateColorSpaceW(      LPLOGCOLORSPACEW lplcs);
-
-
-
-
-
-__declspec(dllimport) HCOLORSPACE __stdcall SetColorSpace(      HDC hdc,      HCOLORSPACE hcs);
-__declspec(dllimport) BOOL        __stdcall DeleteColorSpace(      HCOLORSPACE hcs);
-__declspec(dllimport) BOOL	      __stdcall GetICMProfileA(         HDC hdc, 
-                                                     LPDWORD pBufSize,
-                                                       LPSTR pszFilename);
-__declspec(dllimport) BOOL	      __stdcall GetICMProfileW(         HDC hdc, 
-                                                     LPDWORD pBufSize,
-                                                       LPWSTR pszFilename);
-
-
-
-
-
-
-__declspec(dllimport) BOOL        __stdcall SetICMProfileA(      HDC hdc,      LPSTR lpFileName);
-__declspec(dllimport) BOOL        __stdcall SetICMProfileW(      HDC hdc,      LPWSTR lpFileName);
-
-
-
-
-
-__declspec(dllimport) BOOL        __stdcall GetDeviceGammaRamp(      HDC hdc,      LPVOID lpRamp);
-__declspec(dllimport) BOOL        __stdcall SetDeviceGammaRamp(      HDC hdc,         LPVOID lpRamp);
-__declspec(dllimport) BOOL        __stdcall ColorMatchToTarget(      HDC hdc,      HDC hdcTarget,      DWORD action);
-__declspec(dllimport) int         __stdcall EnumICMProfilesA(      HDC hdc,      ICMENUMPROCA proc,        LPARAM param);
-__declspec(dllimport) int         __stdcall EnumICMProfilesW(      HDC hdc,      ICMENUMPROCW proc,        LPARAM param);
-
-
-
-
-
-__declspec(dllimport) BOOL	      __stdcall UpdateICMRegKeyA(   DWORD reserved,      LPSTR lpszCMID,      LPSTR lpszFileName,      UINT command);
-__declspec(dllimport) BOOL	      __stdcall UpdateICMRegKeyW(   DWORD reserved,      LPWSTR lpszCMID,      LPWSTR lpszFileName,      UINT command);
-
-
-
-
-
-
-
-
-__declspec(dllimport) BOOL        __stdcall ColorCorrectPalette(      HDC hdc,      HPALETTE hPal,      DWORD deFirst,      DWORD num);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagEMR
-{
-    DWORD   iType;              
-    DWORD   nSize;              
-                                
-} EMR, *PEMR;
-
-
-
-typedef struct tagEMRTEXT
-{
-    POINTL  ptlReference;
-    DWORD   nChars;
-    DWORD   offString;          
-    DWORD   fOptions;
-    RECTL   rcl;
-    DWORD   offDx;              
-                                
-} EMRTEXT, *PEMRTEXT;
-
-
-
-typedef struct tagABORTPATH
-{
-    EMR     emr;
-} EMRABORTPATH,      *PEMRABORTPATH,
-  EMRBEGINPATH,      *PEMRBEGINPATH,
-  EMRENDPATH,        *PEMRENDPATH,
-  EMRCLOSEFIGURE,    *PEMRCLOSEFIGURE,
-  EMRFLATTENPATH,    *PEMRFLATTENPATH,
-  EMRWIDENPATH,      *PEMRWIDENPATH,
-  EMRSETMETARGN,     *PEMRSETMETARGN,
-  EMRSAVEDC,         *PEMRSAVEDC,
-  EMRREALIZEPALETTE, *PEMRREALIZEPALETTE;
-
-typedef struct tagEMRSELECTCLIPPATH
-{
-    EMR     emr;
-    DWORD   iMode;
-} EMRSELECTCLIPPATH,    *PEMRSELECTCLIPPATH,
-  EMRSETBKMODE,         *PEMRSETBKMODE,
-  EMRSETMAPMODE,        *PEMRSETMAPMODE,
-
-  EMRSETLAYOUT,         *PEMRSETLAYOUT,
-
-  EMRSETPOLYFILLMODE,   *PEMRSETPOLYFILLMODE,
-  EMRSETROP2,           *PEMRSETROP2,
-  EMRSETSTRETCHBLTMODE, *PEMRSETSTRETCHBLTMODE,
-  EMRSETICMMODE,        *PEMRSETICMMODE,
-  EMRSETTEXTALIGN,      *PEMRSETTEXTALIGN;
-
-typedef struct tagEMRSETMITERLIMIT
-{
-    EMR     emr;
-    FLOAT   eMiterLimit;
-} EMRSETMITERLIMIT, *PEMRSETMITERLIMIT;
-
-typedef struct tagEMRRESTOREDC
-{
-    EMR     emr;
-    LONG    iRelative;          
-} EMRRESTOREDC, *PEMRRESTOREDC;
-
-typedef struct tagEMRSETARCDIRECTION
-{
-    EMR     emr;
-    DWORD   iArcDirection;      
-                                
-} EMRSETARCDIRECTION, *PEMRSETARCDIRECTION;
-
-typedef struct tagEMRSETMAPPERFLAGS
-{
-    EMR     emr;
-    DWORD   dwFlags;
-} EMRSETMAPPERFLAGS, *PEMRSETMAPPERFLAGS;
-
-typedef struct tagEMRSETTEXTCOLOR
-{
-    EMR     emr;
-    COLORREF crColor;
-} EMRSETBKCOLOR,   *PEMRSETBKCOLOR,
-  EMRSETTEXTCOLOR, *PEMRSETTEXTCOLOR;
-
-typedef struct tagEMRSELECTOBJECT
-{
-    EMR     emr;
-    DWORD   ihObject;           
-} EMRSELECTOBJECT, *PEMRSELECTOBJECT,
-  EMRDELETEOBJECT, *PEMRDELETEOBJECT;
-
-typedef struct tagEMRSELECTPALETTE
-{
-    EMR     emr;
-    DWORD   ihPal;              
-} EMRSELECTPALETTE, *PEMRSELECTPALETTE;
-
-typedef struct tagEMRRESIZEPALETTE
-{
-    EMR     emr;
-    DWORD   ihPal;              
-    DWORD   cEntries;
-} EMRRESIZEPALETTE, *PEMRRESIZEPALETTE;
-
-typedef struct tagEMRSETPALETTEENTRIES
-{
-    EMR     emr;
-    DWORD   ihPal;              
-    DWORD   iStart;
-    DWORD   cEntries;
-    PALETTEENTRY aPalEntries[1];
-} EMRSETPALETTEENTRIES, *PEMRSETPALETTEENTRIES;
-
-typedef struct tagEMRSETCOLORADJUSTMENT
-{
-    EMR     emr;
-    COLORADJUSTMENT ColorAdjustment;
-} EMRSETCOLORADJUSTMENT, *PEMRSETCOLORADJUSTMENT;
-
-typedef struct tagEMRGDICOMMENT
-{
-    EMR     emr;
-    DWORD   cbData;             
-    BYTE    Data[1];
-} EMRGDICOMMENT, *PEMRGDICOMMENT;
-
-typedef struct tagEMREOF
-{
-    EMR     emr;
-    DWORD   nPalEntries;        
-    DWORD   offPalEntries;      
-    DWORD   nSizeLast;          
-                                
-                                
-} EMREOF, *PEMREOF;
-
-typedef struct tagEMRLINETO
-{
-    EMR     emr;
-    POINTL  ptl;
-} EMRLINETO,   *PEMRLINETO,
-  EMRMOVETOEX, *PEMRMOVETOEX;
-
-typedef struct tagEMROFFSETCLIPRGN
-{
-    EMR     emr;
-    POINTL  ptlOffset;
-} EMROFFSETCLIPRGN, *PEMROFFSETCLIPRGN;
-
-typedef struct tagEMRFILLPATH
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-} EMRFILLPATH,          *PEMRFILLPATH,
-  EMRSTROKEANDFILLPATH, *PEMRSTROKEANDFILLPATH,
-  EMRSTROKEPATH,        *PEMRSTROKEPATH;
-
-typedef struct tagEMREXCLUDECLIPRECT
-{
-    EMR     emr;
-    RECTL   rclClip;
-} EMREXCLUDECLIPRECT,   *PEMREXCLUDECLIPRECT,
-  EMRINTERSECTCLIPRECT, *PEMRINTERSECTCLIPRECT;
-
-typedef struct tagEMRSETVIEWPORTORGEX
-{
-    EMR     emr;
-    POINTL  ptlOrigin;
-} EMRSETVIEWPORTORGEX, *PEMRSETVIEWPORTORGEX,
-  EMRSETWINDOWORGEX,   *PEMRSETWINDOWORGEX,
-  EMRSETBRUSHORGEX,    *PEMRSETBRUSHORGEX;
-
-typedef struct tagEMRSETVIEWPORTEXTEX
-{
-    EMR     emr;
-    SIZEL   szlExtent;
-} EMRSETVIEWPORTEXTEX, *PEMRSETVIEWPORTEXTEX,
-  EMRSETWINDOWEXTEX,   *PEMRSETWINDOWEXTEX;
-
-typedef struct tagEMRSCALEVIEWPORTEXTEX
-{
-    EMR     emr;
-    LONG    xNum;
-    LONG    xDenom;
-    LONG    yNum;
-    LONG    yDenom;
-} EMRSCALEVIEWPORTEXTEX, *PEMRSCALEVIEWPORTEXTEX,
-  EMRSCALEWINDOWEXTEX,   *PEMRSCALEWINDOWEXTEX;
-
-typedef struct tagEMRSETWORLDTRANSFORM
-{
-    EMR     emr;
-    XFORM   xform;
-} EMRSETWORLDTRANSFORM, *PEMRSETWORLDTRANSFORM;
-
-typedef struct tagEMRMODIFYWORLDTRANSFORM
-{
-    EMR     emr;
-    XFORM   xform;
-    DWORD   iMode;
-} EMRMODIFYWORLDTRANSFORM, *PEMRMODIFYWORLDTRANSFORM;
-
-typedef struct tagEMRSETPIXELV
-{
-    EMR     emr;
-    POINTL  ptlPixel;
-    COLORREF crColor;
-} EMRSETPIXELV, *PEMRSETPIXELV;
-
-typedef struct tagEMREXTFLOODFILL
-{
-    EMR     emr;
-    POINTL  ptlStart;
-    COLORREF crColor;
-    DWORD   iMode;
-} EMREXTFLOODFILL, *PEMREXTFLOODFILL;
-
-typedef struct tagEMRELLIPSE
-{
-    EMR     emr;
-    RECTL   rclBox;             
-} EMRELLIPSE,  *PEMRELLIPSE,
-  EMRRECTANGLE, *PEMRRECTANGLE;
-
-
-typedef struct tagEMRROUNDRECT
-{
-    EMR     emr;
-    RECTL   rclBox;             
-    SIZEL   szlCorner;
-} EMRROUNDRECT, *PEMRROUNDRECT;
-
-typedef struct tagEMRARC
-{
-    EMR     emr;
-    RECTL   rclBox;             
-    POINTL  ptlStart;
-    POINTL  ptlEnd;
-} EMRARC,   *PEMRARC,
-  EMRARCTO, *PEMRARCTO,
-  EMRCHORD, *PEMRCHORD,
-  EMRPIE,   *PEMRPIE;
-
-typedef struct tagEMRANGLEARC
-{
-    EMR     emr;
-    POINTL  ptlCenter;
-    DWORD   nRadius;
-    FLOAT   eStartAngle;
-    FLOAT   eSweepAngle;
-} EMRANGLEARC, *PEMRANGLEARC;
-
-typedef struct tagEMRPOLYLINE
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    DWORD   cptl;
-    POINTL  aptl[1];
-} EMRPOLYLINE,     *PEMRPOLYLINE,
-  EMRPOLYBEZIER,   *PEMRPOLYBEZIER,
-  EMRPOLYGON,      *PEMRPOLYGON,
-  EMRPOLYBEZIERTO, *PEMRPOLYBEZIERTO,
-  EMRPOLYLINETO,   *PEMRPOLYLINETO;
-
-typedef struct tagEMRPOLYLINE16
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    DWORD   cpts;
-    POINTS  apts[1];
-} EMRPOLYLINE16,     *PEMRPOLYLINE16,
-  EMRPOLYBEZIER16,   *PEMRPOLYBEZIER16,
-  EMRPOLYGON16,      *PEMRPOLYGON16,
-  EMRPOLYBEZIERTO16, *PEMRPOLYBEZIERTO16,
-  EMRPOLYLINETO16,   *PEMRPOLYLINETO16;
-
-typedef struct tagEMRPOLYDRAW
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    DWORD   cptl;               
-    POINTL  aptl[1];            
-    BYTE    abTypes[1];         
-} EMRPOLYDRAW, *PEMRPOLYDRAW;
-
-typedef struct tagEMRPOLYDRAW16
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    DWORD   cpts;               
-    POINTS  apts[1];            
-    BYTE    abTypes[1];         
-} EMRPOLYDRAW16, *PEMRPOLYDRAW16;
-
-typedef struct tagEMRPOLYPOLYLINE
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    DWORD   nPolys;             
-    DWORD   cptl;               
-    DWORD   aPolyCounts[1];     
-    POINTL  aptl[1];            
-} EMRPOLYPOLYLINE, *PEMRPOLYPOLYLINE,
-  EMRPOLYPOLYGON,  *PEMRPOLYPOLYGON;
-
-typedef struct tagEMRPOLYPOLYLINE16
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    DWORD   nPolys;             
-    DWORD   cpts;               
-    DWORD   aPolyCounts[1];     
-    POINTS  apts[1];            
-} EMRPOLYPOLYLINE16, *PEMRPOLYPOLYLINE16,
-  EMRPOLYPOLYGON16,  *PEMRPOLYPOLYGON16;
-
-typedef struct tagEMRINVERTRGN
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    DWORD   cbRgnData;          
-    BYTE    RgnData[1];
-} EMRINVERTRGN, *PEMRINVERTRGN,
-  EMRPAINTRGN,  *PEMRPAINTRGN;
-
-typedef struct tagEMRFILLRGN
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    DWORD   cbRgnData;          
-    DWORD   ihBrush;            
-    BYTE    RgnData[1];
-} EMRFILLRGN, *PEMRFILLRGN;
-
-typedef struct tagEMRFRAMERGN
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    DWORD   cbRgnData;          
-    DWORD   ihBrush;            
-    SIZEL   szlStroke;
-    BYTE    RgnData[1];
-} EMRFRAMERGN, *PEMRFRAMERGN;
-
-typedef struct tagEMREXTSELECTCLIPRGN
-{
-    EMR     emr;
-    DWORD   cbRgnData;          
-    DWORD   iMode;
-    BYTE    RgnData[1];
-} EMREXTSELECTCLIPRGN, *PEMREXTSELECTCLIPRGN;
-
-typedef struct tagEMREXTTEXTOUTA
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    DWORD   iGraphicsMode;      
-    FLOAT   exScale;            
-    FLOAT   eyScale;            
-    EMRTEXT emrtext;            
-                                
-} EMREXTTEXTOUTA, *PEMREXTTEXTOUTA,
-  EMREXTTEXTOUTW, *PEMREXTTEXTOUTW;
-
-typedef struct tagEMRPOLYTEXTOUTA
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    DWORD   iGraphicsMode;      
-    FLOAT   exScale;            
-    FLOAT   eyScale;            
-    LONG    cStrings;
-    EMRTEXT aemrtext[1];        
-                                
-} EMRPOLYTEXTOUTA, *PEMRPOLYTEXTOUTA,
-  EMRPOLYTEXTOUTW, *PEMRPOLYTEXTOUTW;
-
-typedef struct tagEMRBITBLT
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    LONG    xDest;
-    LONG    yDest;
-    LONG    cxDest;
-    LONG    cyDest;
-    DWORD   dwRop;
-    LONG    xSrc;
-    LONG    ySrc;
-    XFORM   xformSrc;           
-    COLORREF crBkColorSrc;      
-    DWORD   iUsageSrc;          
-                                
-    DWORD   offBmiSrc;          
-    DWORD   cbBmiSrc;           
-    DWORD   offBitsSrc;         
-    DWORD   cbBitsSrc;          
-} EMRBITBLT, *PEMRBITBLT;
-
-typedef struct tagEMRSTRETCHBLT
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    LONG    xDest;
-    LONG    yDest;
-    LONG    cxDest;
-    LONG    cyDest;
-    DWORD   dwRop;
-    LONG    xSrc;
-    LONG    ySrc;
-    XFORM   xformSrc;           
-    COLORREF crBkColorSrc;      
-    DWORD   iUsageSrc;          
-                                
-    DWORD   offBmiSrc;          
-    DWORD   cbBmiSrc;           
-    DWORD   offBitsSrc;         
-    DWORD   cbBitsSrc;          
-    LONG    cxSrc;
-    LONG    cySrc;
-} EMRSTRETCHBLT, *PEMRSTRETCHBLT;
-
-typedef struct tagEMRMASKBLT
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    LONG    xDest;
-    LONG    yDest;
-    LONG    cxDest;
-    LONG    cyDest;
-    DWORD   dwRop;
-    LONG    xSrc;
-    LONG    ySrc;
-    XFORM   xformSrc;           
-    COLORREF crBkColorSrc;      
-    DWORD   iUsageSrc;          
-                                
-    DWORD   offBmiSrc;          
-    DWORD   cbBmiSrc;           
-    DWORD   offBitsSrc;         
-    DWORD   cbBitsSrc;          
-    LONG    xMask;
-    LONG    yMask;
-    DWORD   iUsageMask;         
-    DWORD   offBmiMask;         
-    DWORD   cbBmiMask;          
-    DWORD   offBitsMask;        
-    DWORD   cbBitsMask;         
-} EMRMASKBLT, *PEMRMASKBLT;
-
-typedef struct tagEMRPLGBLT
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    POINTL  aptlDest[3];
-    LONG    xSrc;
-    LONG    ySrc;
-    LONG    cxSrc;
-    LONG    cySrc;
-    XFORM   xformSrc;           
-    COLORREF crBkColorSrc;      
-    DWORD   iUsageSrc;          
-                                
-    DWORD   offBmiSrc;          
-    DWORD   cbBmiSrc;           
-    DWORD   offBitsSrc;         
-    DWORD   cbBitsSrc;          
-    LONG    xMask;
-    LONG    yMask;
-    DWORD   iUsageMask;         
-    DWORD   offBmiMask;         
-    DWORD   cbBmiMask;          
-    DWORD   offBitsMask;        
-    DWORD   cbBitsMask;         
-} EMRPLGBLT, *PEMRPLGBLT;
-
-typedef struct tagEMRSETDIBITSTODEVICE
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    LONG    xDest;
-    LONG    yDest;
-    LONG    xSrc;
-    LONG    ySrc;
-    LONG    cxSrc;
-    LONG    cySrc;
-    DWORD   offBmiSrc;          
-    DWORD   cbBmiSrc;           
-    DWORD   offBitsSrc;         
-    DWORD   cbBitsSrc;          
-    DWORD   iUsageSrc;          
-    DWORD   iStartScan;
-    DWORD   cScans;
-} EMRSETDIBITSTODEVICE, *PEMRSETDIBITSTODEVICE;
-
-typedef struct tagEMRSTRETCHDIBITS
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    LONG    xDest;
-    LONG    yDest;
-    LONG    xSrc;
-    LONG    ySrc;
-    LONG    cxSrc;
-    LONG    cySrc;
-    DWORD   offBmiSrc;          
-    DWORD   cbBmiSrc;           
-    DWORD   offBitsSrc;         
-    DWORD   cbBitsSrc;          
-    DWORD   iUsageSrc;          
-    DWORD   dwRop;
-    LONG    cxDest;
-    LONG    cyDest;
-} EMRSTRETCHDIBITS, *PEMRSTRETCHDIBITS;
-
-typedef struct tagEMREXTCREATEFONTINDIRECTW
-{
-    EMR     emr;
-    DWORD   ihFont;             
-    EXTLOGFONTW elfw;
-} EMREXTCREATEFONTINDIRECTW, *PEMREXTCREATEFONTINDIRECTW;
-
-typedef struct tagEMRCREATEPALETTE
-{
-    EMR     emr;
-    DWORD   ihPal;              
-    LOGPALETTE lgpl;            
-                                
-} EMRCREATEPALETTE, *PEMRCREATEPALETTE;
-
-typedef struct tagEMRCREATEPEN
-{
-    EMR     emr;
-    DWORD   ihPen;              
-    LOGPEN  lopn;
-} EMRCREATEPEN, *PEMRCREATEPEN;
-
-typedef struct tagEMREXTCREATEPEN
-{
-    EMR     emr;
-    DWORD   ihPen;              
-    DWORD   offBmi;             
-    DWORD   cbBmi;              
-                                
-                                
-    DWORD   offBits;            
-    DWORD   cbBits;             
-    EXTLOGPEN elp;              
-} EMREXTCREATEPEN, *PEMREXTCREATEPEN;
-
-typedef struct tagEMRCREATEBRUSHINDIRECT
-{
-    EMR        emr;
-    DWORD      ihBrush;          
-    LOGBRUSH32 lb;               
-                                 
-} EMRCREATEBRUSHINDIRECT, *PEMRCREATEBRUSHINDIRECT;
-
-typedef struct tagEMRCREATEMONOBRUSH
-{
-    EMR     emr;
-    DWORD   ihBrush;            
-    DWORD   iUsage;             
-    DWORD   offBmi;             
-    DWORD   cbBmi;              
-    DWORD   offBits;            
-    DWORD   cbBits;             
-} EMRCREATEMONOBRUSH, *PEMRCREATEMONOBRUSH;
-
-typedef struct tagEMRCREATEDIBPATTERNBRUSHPT
-{
-    EMR     emr;
-    DWORD   ihBrush;            
-    DWORD   iUsage;             
-    DWORD   offBmi;             
-    DWORD   cbBmi;              
-                                
-                                
-    DWORD   offBits;            
-    DWORD   cbBits;             
-} EMRCREATEDIBPATTERNBRUSHPT, *PEMRCREATEDIBPATTERNBRUSHPT;
-
-typedef struct tagEMRFORMAT
-{
-    DWORD   dSignature;         
-    DWORD   nVersion;           
-    DWORD   cbData;             
-    DWORD   offData;            
-                                
-} EMRFORMAT, *PEMRFORMAT;
-
-
-
-typedef struct tagEMRGLSRECORD
-{
-    EMR     emr;
-    DWORD   cbData;             
-    BYTE    Data[1];
-} EMRGLSRECORD, *PEMRGLSRECORD;
-
-typedef struct tagEMRGLSBOUNDEDRECORD
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    DWORD   cbData;             
-    BYTE    Data[1];
-} EMRGLSBOUNDEDRECORD, *PEMRGLSBOUNDEDRECORD;
-
-typedef struct tagEMRPIXELFORMAT
-{
-    EMR     emr;
-    PIXELFORMATDESCRIPTOR pfd;
-} EMRPIXELFORMAT, *PEMRPIXELFORMAT;
-
-typedef struct tagEMRCREATECOLORSPACE
-{
-    EMR             emr;
-    DWORD           ihCS;       
-    LOGCOLORSPACEA  lcs;        
-} EMRCREATECOLORSPACE, *PEMRCREATECOLORSPACE;
-
-typedef struct tagEMRSETCOLORSPACE
-{
-    EMR     emr;
-    DWORD   ihCS;               
-} EMRSETCOLORSPACE,    *PEMRSETCOLORSPACE,
-  EMRSELECTCOLORSPACE, *PEMRSELECTCOLORSPACE,
-  EMRDELETECOLORSPACE, *PEMRDELETECOLORSPACE;
-
-
-
-
-
-typedef struct tagEMREXTESCAPE
-{
-    EMR     emr;
-    INT     iEscape;            
-    INT     cbEscData;          
-    BYTE    EscData[1];         
-} EMREXTESCAPE,  *PEMREXTESCAPE,
-  EMRDRAWESCAPE, *PEMRDRAWESCAPE;
-
-typedef struct tagEMRNAMEDESCAPE
-{
-    EMR     emr;
-    INT     iEscape;            
-    INT     cbDriver;           
-    INT     cbEscData;          
-    BYTE    EscData[1];         
-} EMRNAMEDESCAPE, *PEMRNAMEDESCAPE;
-
-
-
-typedef struct tagEMRSETICMPROFILE
-{
-    EMR     emr;
-    DWORD   dwFlags;            
-    DWORD   cbName;             
-    DWORD   cbData;             
-    BYTE    Data[1];            
-} EMRSETICMPROFILE,  *PEMRSETICMPROFILE,
-  EMRSETICMPROFILEA, *PEMRSETICMPROFILEA,
-  EMRSETICMPROFILEW, *PEMRSETICMPROFILEW;
-
-
-
-typedef struct tagEMRCREATECOLORSPACEW
-{
-    EMR             emr;
-    DWORD           ihCS;       
-    LOGCOLORSPACEW  lcs;        
-    DWORD           dwFlags;    
-    DWORD           cbData;     
-    BYTE            Data[1];    
-} EMRCREATECOLORSPACEW, *PEMRCREATECOLORSPACEW;
-
-
-
-typedef struct tagCOLORMATCHTOTARGET
-{
-    EMR     emr;
-    DWORD   dwAction;           
-    DWORD   dwFlags;            
-    DWORD   cbName;             
-    DWORD   cbData;             
-    BYTE    Data[1];            
-} EMRCOLORMATCHTOTARGET, *PEMRCOLORMATCHTOTARGET;
-
-typedef struct tagCOLORCORRECTPALETTE
-{
-    EMR     emr;
-    DWORD   ihPalette;          
-    DWORD   nFirstEntry;        
-    DWORD   nPalEntries;        
-    DWORD   nReserved;          
-} EMRCOLORCORRECTPALETTE, *PEMRCOLORCORRECTPALETTE;
-
-typedef struct tagEMRALPHABLEND
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    LONG    xDest;
-    LONG    yDest;
-    LONG    cxDest;
-    LONG    cyDest;
-    DWORD   dwRop;
-    LONG    xSrc;
-    LONG    ySrc;
-    XFORM   xformSrc;           
-    COLORREF crBkColorSrc;      
-    DWORD   iUsageSrc;          
-                                
-    DWORD   offBmiSrc;          
-    DWORD   cbBmiSrc;           
-    DWORD   offBitsSrc;         
-    DWORD   cbBitsSrc;          
-    LONG    cxSrc;
-    LONG    cySrc;
-} EMRALPHABLEND, *PEMRALPHABLEND;
-
-typedef struct tagEMRGRADIENTFILL
-{
-    EMR       emr;
-    RECTL     rclBounds;          
-    DWORD     nVer;
-    DWORD     nTri;
-    ULONG     ulMode;
-    TRIVERTEX Ver[1];
-}EMRGRADIENTFILL,*PEMRGRADIENTFILL;
-
-typedef struct tagEMRTRANSPARENTBLT
-{
-    EMR     emr;
-    RECTL   rclBounds;          
-    LONG    xDest;
-    LONG    yDest;
-    LONG    cxDest;
-    LONG    cyDest;
-    DWORD   dwRop;
-    LONG    xSrc;
-    LONG    ySrc;
-    XFORM   xformSrc;           
-    COLORREF crBkColorSrc;      
-    DWORD   iUsageSrc;          
-                                
-    DWORD   offBmiSrc;          
-    DWORD   cbBmiSrc;           
-    DWORD   offBitsSrc;         
-    DWORD   cbBitsSrc;          
-    LONG    cxSrc;
-    LONG    cySrc;
-} EMRTRANSPARENTBLT, *PEMRTRANSPARENTBLT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall wglCopyContext(HGLRC, HGLRC, UINT);
-__declspec(dllimport) HGLRC __stdcall wglCreateContext(HDC);
-__declspec(dllimport) HGLRC __stdcall wglCreateLayerContext(HDC, int);
-__declspec(dllimport) BOOL  __stdcall wglDeleteContext(HGLRC);
-__declspec(dllimport) HGLRC __stdcall wglGetCurrentContext(void);
-__declspec(dllimport) HDC   __stdcall wglGetCurrentDC(void);
-__declspec(dllimport) PROC  __stdcall wglGetProcAddress(LPCSTR);
-__declspec(dllimport) BOOL  __stdcall wglMakeCurrent(HDC, HGLRC);
-__declspec(dllimport) BOOL  __stdcall wglShareLists(HGLRC, HGLRC);
-__declspec(dllimport) BOOL  __stdcall wglUseFontBitmapsA(HDC, DWORD, DWORD, DWORD);
-__declspec(dllimport) BOOL  __stdcall wglUseFontBitmapsW(HDC, DWORD, DWORD, DWORD);
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall SwapBuffers(HDC);
-
-typedef struct _POINTFLOAT {
-    FLOAT   x;
-    FLOAT   y;
-} POINTFLOAT, *PPOINTFLOAT;
-
-typedef struct _GLYPHMETRICSFLOAT {
-    FLOAT       gmfBlackBoxX;
-    FLOAT       gmfBlackBoxY;
-    POINTFLOAT  gmfptGlyphOrigin;
-    FLOAT       gmfCellIncX;
-    FLOAT       gmfCellIncY;
-} GLYPHMETRICSFLOAT, *PGLYPHMETRICSFLOAT,  *LPGLYPHMETRICSFLOAT;
-
-
-
-__declspec(dllimport) BOOL  __stdcall wglUseFontOutlinesA(HDC, DWORD, DWORD, DWORD, FLOAT,
-                                           FLOAT, int, LPGLYPHMETRICSFLOAT);
-__declspec(dllimport) BOOL  __stdcall wglUseFontOutlinesW(HDC, DWORD, DWORD, DWORD, FLOAT,
-                                           FLOAT, int, LPGLYPHMETRICSFLOAT);
-
-
-
-
-
-
-
-typedef struct tagLAYERPLANEDESCRIPTOR { 
-    WORD  nSize;
-    WORD  nVersion;
-    DWORD dwFlags;
-    BYTE  iPixelType;
-    BYTE  cColorBits;
-    BYTE  cRedBits;
-    BYTE  cRedShift;
-    BYTE  cGreenBits;
-    BYTE  cGreenShift;
-    BYTE  cBlueBits;
-    BYTE  cBlueShift;
-    BYTE  cAlphaBits;
-    BYTE  cAlphaShift;
-    BYTE  cAccumBits;
-    BYTE  cAccumRedBits;
-    BYTE  cAccumGreenBits;
-    BYTE  cAccumBlueBits;
-    BYTE  cAccumAlphaBits;
-    BYTE  cDepthBits;
-    BYTE  cStencilBits;
-    BYTE  cAuxBuffers;
-    BYTE  iLayerPlane;
-    BYTE  bReserved;
-    COLORREF crTransparent;
-} LAYERPLANEDESCRIPTOR, *PLAYERPLANEDESCRIPTOR,  *LPLAYERPLANEDESCRIPTOR;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall wglDescribeLayerPlane(HDC, int, int, UINT,
-                                             LPLAYERPLANEDESCRIPTOR);
-__declspec(dllimport) int   __stdcall wglSetLayerPaletteEntries(HDC, int, int, int,
-                                                 const COLORREF *);
-__declspec(dllimport) int   __stdcall wglGetLayerPaletteEntries(HDC, int, int, int,
-                                                 COLORREF *);
-__declspec(dllimport) BOOL  __stdcall wglRealizeLayerPalette(HDC, int, BOOL);
-__declspec(dllimport) BOOL  __stdcall wglSwapLayerBuffers(HDC, UINT);
-
-
-
-typedef struct _WGLSWAP
-{
-    HDC hdc;
-    UINT uiFlags;
-} WGLSWAP, *PWGLSWAP,  *LPWGLSWAP;
-
-
-
-__declspec(dllimport) DWORD __stdcall wglSwapMultipleBuffers(UINT, const WGLSWAP *);
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-typedef HANDLE HDWP;
-typedef void MENUTEMPLATEA;
-typedef void MENUTEMPLATEW;
-
-typedef MENUTEMPLATEW MENUTEMPLATE;
-
-
-
-typedef PVOID LPMENUTEMPLATEA;
-typedef PVOID LPMENUTEMPLATEW;
-
-typedef LPMENUTEMPLATEW LPMENUTEMPLATE;
-
-
-
-
-typedef LRESULT (__stdcall* WNDPROC)(HWND, UINT, WPARAM, LPARAM);
-
-
-
-typedef INT_PTR (__stdcall* DLGPROC)(HWND, UINT, WPARAM, LPARAM);
-typedef void (__stdcall* TIMERPROC)(HWND, UINT, UINT_PTR, DWORD);
-typedef BOOL (__stdcall* GRAYSTRINGPROC)(HDC, LPARAM, int);
-typedef BOOL (__stdcall* WNDENUMPROC)(HWND, LPARAM);
-typedef LRESULT (__stdcall* HOOKPROC)(int code, WPARAM wParam, LPARAM lParam);
-typedef void (__stdcall* SENDASYNCPROC)(HWND, UINT, ULONG_PTR, LRESULT);
-
-typedef BOOL (__stdcall* PROPENUMPROCA)(HWND, LPCSTR, HANDLE);
-typedef BOOL (__stdcall* PROPENUMPROCW)(HWND, LPCWSTR, HANDLE);
-
-typedef BOOL (__stdcall* PROPENUMPROCEXA)(HWND, LPSTR, HANDLE, ULONG_PTR);
-typedef BOOL (__stdcall* PROPENUMPROCEXW)(HWND, LPWSTR, HANDLE, ULONG_PTR);
-
-typedef int (__stdcall* EDITWORDBREAKPROCA)(LPSTR lpch, int ichCurrent, int cch, int code);
-typedef int (__stdcall* EDITWORDBREAKPROCW)(LPWSTR lpch, int ichCurrent, int cch, int code);
-
-
-typedef BOOL (__stdcall* DRAWSTATEPROC)(HDC hdc, LPARAM lData, WPARAM wData, int cx, int cy);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef PROPENUMPROCW        PROPENUMPROC;
-typedef PROPENUMPROCEXW      PROPENUMPROCEX;
-typedef EDITWORDBREAKPROCW   EDITWORDBREAKPROC;
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall* NAMEENUMPROCA)(LPSTR, LPARAM);
-typedef BOOL (__stdcall* NAMEENUMPROCW)(LPWSTR, LPARAM);
-
-typedef NAMEENUMPROCA   WINSTAENUMPROCA;
-typedef NAMEENUMPROCA   DESKTOPENUMPROCA;
-typedef NAMEENUMPROCW   WINSTAENUMPROCW;
-typedef NAMEENUMPROCW   DESKTOPENUMPROCW;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef WINSTAENUMPROCW     WINSTAENUMPROC;
-typedef DESKTOPENUMPROCW    DESKTOPENUMPROC;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-wvsprintfA(
-         LPSTR,
-          LPCSTR,
-         va_list arglist);
-__declspec(dllimport)
-int
-__stdcall
-wvsprintfW(
-         LPWSTR,
-          LPCWSTR,
-         va_list arglist);
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__cdecl
-wsprintfA(
-         LPSTR,
-          LPCSTR,
-    ...);
-__declspec(dllimport)
-int
-__cdecl
-wsprintfW(
-         LPWSTR,
-          LPCWSTR,
-    ...);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagCBT_CREATEWNDA
-{
-    struct tagCREATESTRUCTA *lpcs;
-    HWND           hwndInsertAfter;
-} CBT_CREATEWNDA, *LPCBT_CREATEWNDA;
-
-
-
-typedef struct tagCBT_CREATEWNDW
-{
-    struct tagCREATESTRUCTW *lpcs;
-    HWND           hwndInsertAfter;
-} CBT_CREATEWNDW, *LPCBT_CREATEWNDW;
-
-typedef CBT_CREATEWNDW CBT_CREATEWND;
-typedef LPCBT_CREATEWNDW LPCBT_CREATEWND;
-
-
-
-
-
-
-
-
-typedef struct tagCBTACTIVATESTRUCT
-{
-    BOOL    fMouse;
-    HWND    hWndActive;
-} CBTACTIVATESTRUCT, *LPCBTACTIVATESTRUCT;
-
-
-
-
-
-typedef struct tagWTSSESSION_NOTIFICATION
-{
-    DWORD cbSize;
-    DWORD dwSessionId;
-
-} WTSSESSION_NOTIFICATION, *PWTSSESSION_NOTIFICATION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct
-{
-    HWND    hwnd;
-    RECT    rc;
-} SHELLHOOKINFO, *LPSHELLHOOKINFO;
-
-
-
-
-typedef struct tagEVENTMSG {
-    UINT    message;
-    UINT    paramL;
-    UINT    paramH;
-    DWORD    time;
-    HWND     hwnd;
-} EVENTMSG, *PEVENTMSGMSG,  *NPEVENTMSGMSG,  *LPEVENTMSGMSG;
-
-typedef struct tagEVENTMSG *PEVENTMSG,  *NPEVENTMSG,  *LPEVENTMSG;
-
-
-
-
-typedef struct tagCWPSTRUCT {
-    LPARAM  lParam;
-    WPARAM  wParam;
-    UINT    message;
-    HWND    hwnd;
-} CWPSTRUCT, *PCWPSTRUCT,  *NPCWPSTRUCT,  *LPCWPSTRUCT;
-
-
-
-
-
-typedef struct tagCWPRETSTRUCT {
-    LRESULT lResult;
-    LPARAM  lParam;
-    WPARAM  wParam;
-    UINT    message;
-    HWND    hwnd;
-} CWPRETSTRUCT, *PCWPRETSTRUCT,  *NPCWPRETSTRUCT,  *LPCWPRETSTRUCT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagKBDLLHOOKSTRUCT {
-    DWORD   vkCode;
-    DWORD   scanCode;
-    DWORD   flags;
-    DWORD   time;
-    ULONG_PTR dwExtraInfo;
-} KBDLLHOOKSTRUCT,  *LPKBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
-
-
-
-
-typedef struct tagMSLLHOOKSTRUCT {
-    POINT   pt;
-    DWORD   mouseData;
-    DWORD   flags;
-    DWORD   time;
-    ULONG_PTR dwExtraInfo;
-} MSLLHOOKSTRUCT,  *LPMSLLHOOKSTRUCT, *PMSLLHOOKSTRUCT;
-
-
-
-
-
-
-typedef struct tagDEBUGHOOKINFO
-{
-    DWORD   idThread;
-    DWORD   idThreadInstaller;
-    LPARAM  lParam;
-    WPARAM  wParam;
-    int     code;
-} DEBUGHOOKINFO, *PDEBUGHOOKINFO,  *NPDEBUGHOOKINFO, * LPDEBUGHOOKINFO;
-
-
-
-
-typedef struct tagMOUSEHOOKSTRUCT {
-    POINT   pt;
-    HWND    hwnd;
-    UINT    wHitTestCode;
-    ULONG_PTR dwExtraInfo;
-} MOUSEHOOKSTRUCT,  *LPMOUSEHOOKSTRUCT, *PMOUSEHOOKSTRUCT;
-
-
-
-typedef struct tagMOUSEHOOKSTRUCTEX : public tagMOUSEHOOKSTRUCT
-{
-    DWORD   mouseData;
-} MOUSEHOOKSTRUCTEX, *LPMOUSEHOOKSTRUCTEX, *PMOUSEHOOKSTRUCTEX;
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagHARDWAREHOOKSTRUCT {
-    HWND    hwnd;
-    UINT    message;
-    WPARAM  wParam;
-    LPARAM  lParam;
-} HARDWAREHOOKSTRUCT,  *LPHARDWAREHOOKSTRUCT, *PHARDWAREHOOKSTRUCT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HKL
-__stdcall
-LoadKeyboardLayoutA(
-         LPCSTR pwszKLID,
-         UINT Flags);
-__declspec(dllimport)
-HKL
-__stdcall
-LoadKeyboardLayoutW(
-         LPCWSTR pwszKLID,
-         UINT Flags);
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HKL
-__stdcall
-ActivateKeyboardLayout(
-         HKL hkl,
-         UINT Flags);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-ToUnicodeEx(
-         UINT wVirtKey,
-         UINT wScanCode,
-           const BYTE *lpKeyState,
-         LPWSTR pwszBuff,
-         int cchBuff,
-         UINT wFlags,
-           HKL dwhkl);
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UnloadKeyboardLayout(
-         HKL hkl);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetKeyboardLayoutNameA(
-         LPSTR pwszKLID);
-__declspec(dllimport)
-BOOL
-__stdcall
-GetKeyboardLayoutNameW(
-         LPWSTR pwszKLID);
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-GetKeyboardLayoutList(
-         int nBuff,
-             HKL  *lpList);
-
-__declspec(dllimport)
-HKL
-__stdcall
-GetKeyboardLayout(
-         DWORD idThread);
-
-
-
-
-
-typedef struct tagMOUSEMOVEPOINT {
-    int   x;
-    int   y;
-    DWORD time;
-    ULONG_PTR dwExtraInfo;
-} MOUSEMOVEPOINT, *PMOUSEMOVEPOINT, * LPMOUSEMOVEPOINT;
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-GetMouseMovePointsEx(
-         UINT cbSize,
-         LPMOUSEMOVEPOINT lppt,
-         LPMOUSEMOVEPOINT lpptBuf,
-         int nBufPoints,
-         DWORD resolution);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HDESK
-__stdcall
-CreateDesktopA(
-         LPCSTR lpszDesktop,
-      LPCSTR lpszDevice,
-      LPDEVMODEA pDevmode,
-         DWORD dwFlags,
-         ACCESS_MASK dwDesiredAccess,
-           LPSECURITY_ATTRIBUTES lpsa);
-__declspec(dllimport)
-HDESK
-__stdcall
-CreateDesktopW(
-         LPCWSTR lpszDesktop,
-      LPCWSTR lpszDevice,
-      LPDEVMODEW pDevmode,
-         DWORD dwFlags,
-         ACCESS_MASK dwDesiredAccess,
-           LPSECURITY_ATTRIBUTES lpsa);
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HDESK
-__stdcall
-OpenDesktopA(
-         LPCSTR lpszDesktop,
-         DWORD dwFlags,
-         BOOL fInherit,
-         ACCESS_MASK dwDesiredAccess);
-__declspec(dllimport)
-HDESK
-__stdcall
-OpenDesktopW(
-         LPCWSTR lpszDesktop,
-         DWORD dwFlags,
-         BOOL fInherit,
-         ACCESS_MASK dwDesiredAccess);
-
-
-
-
-
-
-__declspec(dllimport)
-HDESK
-__stdcall
-OpenInputDesktop(
-         DWORD dwFlags,
-         BOOL fInherit,
-         ACCESS_MASK dwDesiredAccess);
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumDesktopsA(
-           HWINSTA hwinsta,
-         DESKTOPENUMPROCA lpEnumFunc,
-         LPARAM lParam);
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumDesktopsW(
-           HWINSTA hwinsta,
-         DESKTOPENUMPROCW lpEnumFunc,
-         LPARAM lParam);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumDesktopWindows(
-           HDESK hDesktop,
-         WNDENUMPROC lpfn,
-         LPARAM lParam);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SwitchDesktop(
-         HDESK hDesktop);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetThreadDesktop(
-          HDESK hDesktop);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CloseDesktop(
-         HDESK hDesktop);
-
-__declspec(dllimport)
-HDESK
-__stdcall
-GetThreadDesktop(
-         DWORD dwThreadId);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HWINSTA
-__stdcall
-CreateWindowStationA(
-           LPCSTR lpwinsta,
-         DWORD dwFlags,
-         ACCESS_MASK dwDesiredAccess,
-           LPSECURITY_ATTRIBUTES lpsa);
-__declspec(dllimport)
-HWINSTA
-__stdcall
-CreateWindowStationW(
-           LPCWSTR lpwinsta,
-         DWORD dwFlags,
-         ACCESS_MASK dwDesiredAccess,
-           LPSECURITY_ATTRIBUTES lpsa);
-
-
-
-
-
-
-__declspec(dllimport)
-HWINSTA
-__stdcall
-OpenWindowStationA(
-         LPCSTR lpszWinSta,
-         BOOL fInherit,
-         ACCESS_MASK dwDesiredAccess);
-__declspec(dllimport)
-HWINSTA
-__stdcall
-OpenWindowStationW(
-         LPCWSTR lpszWinSta,
-         BOOL fInherit,
-         ACCESS_MASK dwDesiredAccess);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumWindowStationsA(
-         WINSTAENUMPROCA lpEnumFunc,
-         LPARAM lParam);
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumWindowStationsW(
-         WINSTAENUMPROCW lpEnumFunc,
-         LPARAM lParam);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CloseWindowStation(
-         HWINSTA hWinSta);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetProcessWindowStation(
-         HWINSTA hWinSta);
-
-__declspec(dllimport)
-HWINSTA
-__stdcall
-GetProcessWindowStation(
-    void);
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetUserObjectSecurity(
-         HANDLE hObj,
-         PSECURITY_INFORMATION pSIRequested,
-         PSECURITY_DESCRIPTOR pSID);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetUserObjectSecurity(
-         HANDLE hObj,
-         PSECURITY_INFORMATION pSIRequested,
-           PSECURITY_DESCRIPTOR pSID,
-         DWORD nLength,
-         LPDWORD lpnLengthNeeded);
-
-
-
-
-
-
-typedef struct tagUSEROBJECTFLAGS {
-    BOOL fInherit;
-    BOOL fReserved;
-    DWORD dwFlags;
-} USEROBJECTFLAGS, *PUSEROBJECTFLAGS;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetUserObjectInformationA(
-         HANDLE hObj,
-         int nIndex,
-           PVOID pvInfo,
-         DWORD nLength,
-           LPDWORD lpnLengthNeeded);
-__declspec(dllimport)
-BOOL
-__stdcall
-GetUserObjectInformationW(
-         HANDLE hObj,
-         int nIndex,
-           PVOID pvInfo,
-         DWORD nLength,
-           LPDWORD lpnLengthNeeded);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetUserObjectInformationA(
-         HANDLE hObj,
-         int nIndex,
-           PVOID pvInfo,
-         DWORD nLength);
-__declspec(dllimport)
-BOOL
-__stdcall
-SetUserObjectInformationW(
-         HANDLE hObj,
-         int nIndex,
-           PVOID pvInfo,
-         DWORD nLength);
-
-
-
-
-
-
-
-
-
-typedef struct tagWNDCLASSEXA {
-    UINT        cbSize;
-    
-    UINT        style;
-    WNDPROC     lpfnWndProc;
-    int         cbClsExtra;
-    int         cbWndExtra;
-    HINSTANCE   hInstance;
-    HICON       hIcon;
-    HCURSOR     hCursor;
-    HBRUSH      hbrBackground;
-    LPCSTR      lpszMenuName;
-    LPCSTR      lpszClassName;
-    
-    HICON       hIconSm;
-} WNDCLASSEXA, *PWNDCLASSEXA,  *NPWNDCLASSEXA,  *LPWNDCLASSEXA;
-typedef struct tagWNDCLASSEXW {
-    UINT        cbSize;
-    
-    UINT        style;
-    WNDPROC     lpfnWndProc;
-    int         cbClsExtra;
-    int         cbWndExtra;
-    HINSTANCE   hInstance;
-    HICON       hIcon;
-    HCURSOR     hCursor;
-    HBRUSH      hbrBackground;
-    LPCWSTR     lpszMenuName;
-    LPCWSTR     lpszClassName;
-    
-    HICON       hIconSm;
-} WNDCLASSEXW, *PWNDCLASSEXW,  *NPWNDCLASSEXW,  *LPWNDCLASSEXW;
-
-typedef WNDCLASSEXW WNDCLASSEX;
-typedef PWNDCLASSEXW PWNDCLASSEX;
-typedef NPWNDCLASSEXW NPWNDCLASSEX;
-typedef LPWNDCLASSEXW LPWNDCLASSEX;
-
-
-
-
-
-
-
-
-typedef struct tagWNDCLASSA {
-    UINT        style;
-    WNDPROC     lpfnWndProc;
-    int         cbClsExtra;
-    int         cbWndExtra;
-    HINSTANCE   hInstance;
-    HICON       hIcon;
-    HCURSOR     hCursor;
-    HBRUSH      hbrBackground;
-    LPCSTR      lpszMenuName;
-    LPCSTR      lpszClassName;
-} WNDCLASSA, *PWNDCLASSA,  *NPWNDCLASSA,  *LPWNDCLASSA;
-typedef struct tagWNDCLASSW {
-    UINT        style;
-    WNDPROC     lpfnWndProc;
-    int         cbClsExtra;
-    int         cbWndExtra;
-    HINSTANCE   hInstance;
-    HICON       hIcon;
-    HCURSOR     hCursor;
-    HBRUSH      hbrBackground;
-    LPCWSTR     lpszMenuName;
-    LPCWSTR     lpszClassName;
-} WNDCLASSW, *PWNDCLASSW,  *NPWNDCLASSW,  *LPWNDCLASSW;
-
-typedef WNDCLASSW WNDCLASS;
-typedef PWNDCLASSW PWNDCLASS;
-typedef NPWNDCLASSW NPWNDCLASS;
-typedef LPWNDCLASSW LPWNDCLASS;
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsHungAppWindow(
-         HWND hwnd);
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-DisableProcessWindowsGhosting(
-    void);
-
-
-
-
-
-
-
-
-typedef struct tagMSG {
-    HWND        hwnd;
-    UINT        message;
-    WPARAM      wParam;
-    LPARAM      lParam;
-    DWORD       time;
-    POINT       pt;
-
-
-
-} MSG, *PMSG,  *NPMSG,  *LPMSG;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMINMAXINFO {
-    POINT ptReserved;
-    POINT ptMaxSize;
-    POINT ptMaxPosition;
-    POINT ptMinTrackSize;
-    POINT ptMaxTrackSize;
-} MINMAXINFO, *PMINMAXINFO, *LPMINMAXINFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagCOPYDATASTRUCT {
-    ULONG_PTR dwData;
-    DWORD cbData;
-    PVOID lpData;
-} COPYDATASTRUCT, *PCOPYDATASTRUCT;
-
-
-typedef struct tagMDINEXTMENU
-{
-    HMENU   hmenuIn;
-    HMENU   hmenuNext;
-    HWND    hwndNext;
-} MDINEXTMENU, * PMDINEXTMENU,  * LPMDINEXTMENU;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-RegisterWindowMessageA(
-         LPCSTR lpString);
-__declspec(dllimport)
-UINT
-__stdcall
-RegisterWindowMessageW(
-         LPCWSTR lpString);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagWINDOWPOS {
-    HWND    hwnd;
-    HWND    hwndInsertAfter;
-    int     x;
-    int     y;
-    int     cx;
-    int     cy;
-    UINT    flags;
-} WINDOWPOS, *LPWINDOWPOS, *PWINDOWPOS;
-
-
-
-
-typedef struct tagNCCALCSIZE_PARAMS {
-    RECT       rgrc[3];
-    PWINDOWPOS lppos;
-} NCCALCSIZE_PARAMS, *LPNCCALCSIZE_PARAMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagTRACKMOUSEEVENT {
-    DWORD cbSize;
-    DWORD dwFlags;
-    HWND  hwndTrack;
-    DWORD dwHoverTime;
-} TRACKMOUSEEVENT, *LPTRACKMOUSEEVENT;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-TrackMouseEvent(
-         LPTRACKMOUSEEVENT lpEventTrack);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DrawEdge(
-         HDC hdc,
-         LPRECT qrc,
-         UINT edge,
-         UINT grfFlags);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DrawFrameControl(
-         HDC,
-         LPRECT,
-         UINT,
-         UINT);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DrawCaption(
-         HWND hwnd,
-         HDC hdc,
-         const RECT * lprect,
-         UINT flags);
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DrawAnimatedRects(
-           HWND hwnd,
-         int idAni,
-         const RECT *lprcFrom,
-         const RECT *lprcTo);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagACCEL {
-
-    BYTE   fVirt;               
-    WORD   key;
-    WORD   cmd;
-
-
-
-
-
-} ACCEL, *LPACCEL;
-
-typedef struct tagPAINTSTRUCT {
-    HDC         hdc;
-    BOOL        fErase;
-    RECT        rcPaint;
-    BOOL        fRestore;
-    BOOL        fIncUpdate;
-    BYTE        rgbReserved[32];
-} PAINTSTRUCT, *PPAINTSTRUCT, *NPPAINTSTRUCT, *LPPAINTSTRUCT;
-
-typedef struct tagCREATESTRUCTA {
-    LPVOID      lpCreateParams;
-    HINSTANCE   hInstance;
-    HMENU       hMenu;
-    HWND        hwndParent;
-    int         cy;
-    int         cx;
-    int         y;
-    int         x;
-    LONG        style;
-    LPCSTR      lpszName;
-    LPCSTR      lpszClass;
-    DWORD       dwExStyle;
-} CREATESTRUCTA, *LPCREATESTRUCTA;
-typedef struct tagCREATESTRUCTW {
-    LPVOID      lpCreateParams;
-    HINSTANCE   hInstance;
-    HMENU       hMenu;
-    HWND        hwndParent;
-    int         cy;
-    int         cx;
-    int         y;
-    int         x;
-    LONG        style;
-    LPCWSTR     lpszName;
-    LPCWSTR     lpszClass;
-    DWORD       dwExStyle;
-} CREATESTRUCTW, *LPCREATESTRUCTW;
-
-typedef CREATESTRUCTW CREATESTRUCT;
-typedef LPCREATESTRUCTW LPCREATESTRUCT;
-
-
-
-
-
-typedef struct tagWINDOWPLACEMENT {
-    UINT  length;
-    UINT  flags;
-    UINT  showCmd;
-    POINT ptMinPosition;
-    POINT ptMaxPosition;
-    RECT  rcNormalPosition;
-
-
-
-} WINDOWPLACEMENT;
-typedef WINDOWPLACEMENT *PWINDOWPLACEMENT, *LPWINDOWPLACEMENT;
-
-
-
-
-
-
-
-
-typedef struct tagNMHDR
-{
-    HWND      hwndFrom;
-    UINT_PTR  idFrom;
-    UINT      code;         
-}   NMHDR;
-typedef NMHDR  * LPNMHDR;
-
-typedef struct tagSTYLESTRUCT
-{
-    DWORD   styleOld;
-    DWORD   styleNew;
-} STYLESTRUCT, * LPSTYLESTRUCT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMEASUREITEMSTRUCT {
-    UINT       CtlType;
-    UINT       CtlID;
-    UINT       itemID;
-    UINT       itemWidth;
-    UINT       itemHeight;
-    ULONG_PTR  itemData;
-} MEASUREITEMSTRUCT,  *PMEASUREITEMSTRUCT,  *LPMEASUREITEMSTRUCT;
-
-
-
-
-
-typedef struct tagDRAWITEMSTRUCT {
-    UINT        CtlType;
-    UINT        CtlID;
-    UINT        itemID;
-    UINT        itemAction;
-    UINT        itemState;
-    HWND        hwndItem;
-    HDC         hDC;
-    RECT        rcItem;
-    ULONG_PTR   itemData;
-} DRAWITEMSTRUCT,  *PDRAWITEMSTRUCT,  *LPDRAWITEMSTRUCT;
-
-
-
-
-typedef struct tagDELETEITEMSTRUCT {
-    UINT       CtlType;
-    UINT       CtlID;
-    UINT       itemID;
-    HWND       hwndItem;
-    ULONG_PTR  itemData;
-} DELETEITEMSTRUCT,  *PDELETEITEMSTRUCT,  *LPDELETEITEMSTRUCT;
-
-
-
-
-typedef struct tagCOMPAREITEMSTRUCT {
-    UINT        CtlType;
-    UINT        CtlID;
-    HWND        hwndItem;
-    UINT        itemID1;
-    ULONG_PTR   itemData1;
-    UINT        itemID2;
-    ULONG_PTR   itemData2;
-    DWORD       dwLocaleId;
-} COMPAREITEMSTRUCT,  *PCOMPAREITEMSTRUCT,  *LPCOMPAREITEMSTRUCT;
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetMessageA(
-         LPMSG lpMsg,
-           HWND hWnd,
-         UINT wMsgFilterMin,
-         UINT wMsgFilterMax);
-__declspec(dllimport)
-BOOL
-__stdcall
-GetMessageW(
-         LPMSG lpMsg,
-           HWND hWnd,
-         UINT wMsgFilterMin,
-         UINT wMsgFilterMax);
-
-
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-TranslateMessage(
-         const MSG *lpMsg);
-
-__declspec(dllimport)
-LRESULT
-__stdcall
-DispatchMessageA(
-         const MSG *lpMsg);
-__declspec(dllimport)
-LRESULT
-__stdcall
-DispatchMessageW(
-         const MSG *lpMsg);
-
-
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetMessageQueue(
-         int cMessagesMax);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-PeekMessageA(
-         LPMSG lpMsg,
-           HWND hWnd,
-         UINT wMsgFilterMin,
-         UINT wMsgFilterMax,
-         UINT wRemoveMsg);
-__declspec(dllimport)
-BOOL
-__stdcall
-PeekMessageW(
-         LPMSG lpMsg,
-           HWND hWnd,
-         UINT wMsgFilterMin,
-         UINT wMsgFilterMax,
-         UINT wRemoveMsg);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-RegisterHotKey(
-           HWND hWnd,
-         int id,
-         UINT fsModifiers,
-         UINT vk);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UnregisterHotKey(
-           HWND hWnd,
-         int id);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ExitWindowsEx(
-         UINT uFlags,
-         DWORD dwReason);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SwapMouseButton(
-         BOOL fSwap);
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetMessagePos(
-    void);
-
-__declspec(dllimport)
-LONG
-__stdcall
-GetMessageTime(
-    void);
-
-__declspec(dllimport)
-LPARAM
-__stdcall
-GetMessageExtraInfo(
-    void);
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsWow64Message(
-    void);
-
-
-
-__declspec(dllimport)
-LPARAM
-__stdcall
-SetMessageExtraInfo(
-         LPARAM lParam);
-
-
-__declspec(dllimport)
-LRESULT
-__stdcall
-SendMessageA(
-         HWND hWnd,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-__declspec(dllimport)
-LRESULT
-__stdcall
-SendMessageW(
-         HWND hWnd,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-
-
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-LRESULT
-__stdcall
-SendMessageTimeoutA(
-         HWND hWnd,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam,
-         UINT fuFlags,
-         UINT uTimeout,
-           PDWORD_PTR lpdwResult);
-__declspec(dllimport)
-LRESULT
-__stdcall
-SendMessageTimeoutW(
-         HWND hWnd,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam,
-         UINT fuFlags,
-         UINT uTimeout,
-           PDWORD_PTR lpdwResult);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SendNotifyMessageA(
-         HWND hWnd,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-__declspec(dllimport)
-BOOL
-__stdcall
-SendNotifyMessageW(
-         HWND hWnd,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SendMessageCallbackA(
-         HWND hWnd,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam,
-         SENDASYNCPROC lpResultCallBack,
-         ULONG_PTR dwData);
-__declspec(dllimport)
-BOOL
-__stdcall
-SendMessageCallbackW(
-         HWND hWnd,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam,
-         SENDASYNCPROC lpResultCallBack,
-         ULONG_PTR dwData);
-
-
-
-
-
-
-
-typedef struct {
-    UINT  cbSize;
-    HDESK hdesk;
-    HWND  hwnd;
-    LUID  luid;
-} BSMINFO, *PBSMINFO;
-
-__declspec(dllimport)
-long
-__stdcall
-BroadcastSystemMessageExA(
-         DWORD flags,
-           LPDWORD lpInfo,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam,
-           PBSMINFO pbsmInfo);
-__declspec(dllimport)
-long
-__stdcall
-BroadcastSystemMessageExW(
-         DWORD flags,
-           LPDWORD lpInfo,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam,
-           PBSMINFO pbsmInfo);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-long
-__stdcall
-BroadcastSystemMessageA(
-         DWORD flags,
-           LPDWORD lpInfo,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-__declspec(dllimport)
-long
-__stdcall
-BroadcastSystemMessageW(
-         DWORD flags,
-           LPDWORD lpInfo,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef  PVOID           HDEVNOTIFY;
-typedef  HDEVNOTIFY     *PHDEVNOTIFY;
-
-
-
-
-
-
-
-__declspec(dllimport)
-HDEVNOTIFY
-__stdcall
-RegisterDeviceNotificationA(
-         HANDLE hRecipient,
-         LPVOID NotificationFilter,
-         DWORD Flags);
-__declspec(dllimport)
-HDEVNOTIFY
-__stdcall
-RegisterDeviceNotificationW(
-         HANDLE hRecipient,
-         LPVOID NotificationFilter,
-         DWORD Flags);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UnregisterDeviceNotification(
-         HDEVNOTIFY Handle);
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-PostMessageA(
-           HWND hWnd,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-__declspec(dllimport)
-BOOL
-__stdcall
-PostMessageW(
-           HWND hWnd,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-PostThreadMessageA(
-         DWORD idThread,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-__declspec(dllimport)
-BOOL
-__stdcall
-PostThreadMessageW(
-         DWORD idThread,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AttachThreadInput(
-         DWORD idAttach,
-         DWORD idAttachTo,
-         BOOL fAttach);
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReplyMessage(
-         LRESULT lResult);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WaitMessage(
-    void);
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-WaitForInputIdle(
-         HANDLE hProcess,
-         DWORD dwMilliseconds);
-
-__declspec(dllimport)
-
-LRESULT
-__stdcall
-
-
-
-
-DefWindowProcA(
-         HWND hWnd,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-__declspec(dllimport)
-
-LRESULT
-__stdcall
-
-
-
-
-DefWindowProcW(
-         HWND hWnd,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-PostQuitMessage(
-         int nExitCode);
-
-
-
-__declspec(dllimport)
-LRESULT
-__stdcall
-CallWindowProcA(
-         WNDPROC lpPrevWndFunc,
-         HWND hWnd,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-__declspec(dllimport)
-LRESULT
-__stdcall
-CallWindowProcW(
-         WNDPROC lpPrevWndFunc,
-         HWND hWnd,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-InSendMessage(
-    void);
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-InSendMessageEx(
-      LPVOID lpReserved);
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetDoubleClickTime(
-    void);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetDoubleClickTime(
-         UINT);
-
-__declspec(dllimport)
-ATOM
-__stdcall
-RegisterClassA(
-         const WNDCLASSA *lpWndClass);
-__declspec(dllimport)
-ATOM
-__stdcall
-RegisterClassW(
-         const WNDCLASSW *lpWndClass);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UnregisterClassA(
-         LPCSTR lpClassName,
-         HINSTANCE hInstance);
-__declspec(dllimport)
-BOOL
-__stdcall
-UnregisterClassW(
-         LPCWSTR lpClassName,
-         HINSTANCE hInstance);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetClassInfoA(
-           HINSTANCE hInstance,
-         LPCSTR lpClassName,
-         LPWNDCLASSA lpWndClass);
-__declspec(dllimport)
-BOOL
-__stdcall
-GetClassInfoW(
-           HINSTANCE hInstance,
-         LPCWSTR lpClassName,
-         LPWNDCLASSW lpWndClass);
-
-
-
-
-
-
-
-__declspec(dllimport)
-ATOM
-__stdcall
-RegisterClassExA(
-         const WNDCLASSEXA *);
-__declspec(dllimport)
-ATOM
-__stdcall
-RegisterClassExW(
-         const WNDCLASSEXW *);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetClassInfoExA(
-           HINSTANCE hInstance,
-         LPCSTR lpszClass,
-         LPWNDCLASSEXA lpwcx);
-__declspec(dllimport)
-BOOL
-__stdcall
-GetClassInfoExW(
-           HINSTANCE hInstance,
-         LPCWSTR lpszClass,
-         LPWNDCLASSEXW lpwcx);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOLEAN (__stdcall * PREGISTERCLASSNAMEW)(LPCWSTR);
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-CreateWindowExA(
-         DWORD dwExStyle,
-           LPCSTR lpClassName,
-           LPCSTR lpWindowName,
-         DWORD dwStyle,
-         int X,
-         int Y,
-         int nWidth,
-         int nHeight,
-           HWND hWndParent,
-           HMENU hMenu,
-           HINSTANCE hInstance,
-           LPVOID lpParam);
-__declspec(dllimport)
-HWND
-__stdcall
-CreateWindowExW(
-         DWORD dwExStyle,
-           LPCWSTR lpClassName,
-           LPCWSTR lpWindowName,
-         DWORD dwStyle,
-         int X,
-         int Y,
-         int nWidth,
-         int nHeight,
-           HWND hWndParent,
-           HMENU hMenu,
-           HINSTANCE hInstance,
-           LPVOID lpParam);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsWindow(
-           HWND hWnd);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsMenu(
-         HMENU hMenu);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsChild(
-         HWND hWndParent,
-         HWND hWnd);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DestroyWindow(
-         HWND hWnd);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ShowWindow(
-         HWND hWnd,
-         int nCmdShow);
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AnimateWindow(
-         HWND hWnd,
-         DWORD dwTime,
-         DWORD dwFlags);
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UpdateLayeredWindow(
-         HWND hWnd,
-           HDC hdcDst,
-           POINT *pptDst,
-           SIZE *psize,
-           HDC hdcSrc,
-           POINT *pptSrc,
-         COLORREF crKey,
-           BLENDFUNCTION *pblend,
-         DWORD dwFlags);
-
-
-
-
-
-
-typedef struct tagUPDATELAYEREDWINDOWINFO
-{
-                        DWORD               cbSize;
-                      HDC                 hdcDst;
-              POINT const         *pptDst;
-              SIZE const          *psize;
-                      HDC                 hdcSrc;
-              POINT const         *pptSrc;
-                      COLORREF            crKey;
-              BLENDFUNCTION const *pblend;
-                        DWORD               dwFlags;
-              RECT const          *prcDirty;
-} UPDATELAYEREDWINDOWINFO, *PUPDATELAYEREDWINDOWINFO;
-
-
-
-typedef
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UpdateLayeredWindowIndirect(
-         HWND hWnd,
-           UPDATELAYEREDWINDOWINFO const *pULWInfo);
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetLayeredWindowAttributes(
-         HWND hwnd,
-           COLORREF *pcrKey,
-           BYTE *pbAlpha,
-           DWORD *pdwFlags);
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-PrintWindow(
-          HWND hwnd,
-          HDC hdcBlt,
-          UINT nFlags);
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetLayeredWindowAttributes(
-         HWND hwnd,
-         COLORREF crKey,
-         BYTE bAlpha,
-         DWORD dwFlags);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ShowWindowAsync(
-          HWND hWnd,
-          int nCmdShow);
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FlashWindow(
-          HWND hWnd,
-          BOOL bInvert);
-
-
-typedef struct {
-    UINT  cbSize;
-    HWND  hwnd;
-    DWORD dwFlags;
-    UINT  uCount;
-    DWORD dwTimeout;
-} FLASHWINFO, *PFLASHWINFO;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FlashWindowEx(
-         PFLASHWINFO pfwi);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ShowOwnedPopups(
-          HWND hWnd,
-          BOOL fShow);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-OpenIcon(
-          HWND hWnd);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CloseWindow(
-          HWND hWnd);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-MoveWindow(
-         HWND hWnd,
-         int X,
-         int Y,
-         int nWidth,
-         int nHeight,
-         BOOL bRepaint);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetWindowPos(
-         HWND hWnd,
-           HWND hWndInsertAfter,
-         int X,
-         int Y,
-         int cx,
-         int cy,
-         UINT uFlags);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetWindowPlacement(
-         HWND hWnd,
-         WINDOWPLACEMENT *lpwndpl);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetWindowPlacement(
-         HWND hWnd,
-         const WINDOWPLACEMENT *lpwndpl);
-
-
-
-
-__declspec(dllimport)
-HDWP
-__stdcall
-BeginDeferWindowPos(
-         int nNumWindows);
-
-__declspec(dllimport)
-HDWP
-__stdcall
-DeferWindowPos(
-         HDWP hWinPosInfo,
-         HWND hWnd,
-           HWND hWndInsertAfter,
-         int x,
-         int y,
-         int cx,
-         int cy,
-         UINT uFlags);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EndDeferWindowPos(
-         HDWP hWinPosInfo);
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsWindowVisible(
-         HWND hWnd);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsIconic(
-         HWND hWnd);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AnyPopup(
-    void);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-BringWindowToTop(
-         HWND hWnd);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsZoomed(
-         HWND hWnd);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,2)
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-    DWORD style;
-    DWORD dwExtendedStyle;
-    WORD cdit;
-    short x;
-    short y;
-    short cx;
-    short cy;
-} DLGTEMPLATE;
-typedef DLGTEMPLATE *LPDLGTEMPLATEA;
-typedef DLGTEMPLATE *LPDLGTEMPLATEW;
-
-typedef LPDLGTEMPLATEW LPDLGTEMPLATE;
-
-
-
-typedef const DLGTEMPLATE *LPCDLGTEMPLATEA;
-typedef const DLGTEMPLATE *LPCDLGTEMPLATEW;
-
-typedef LPCDLGTEMPLATEW LPCDLGTEMPLATE;
-
-
-
-
-
-
-
-typedef struct {
-    DWORD style;
-    DWORD dwExtendedStyle;
-    short x;
-    short y;
-    short cx;
-    short cy;
-    WORD id;
-} DLGITEMTEMPLATE;
-typedef DLGITEMTEMPLATE *PDLGITEMTEMPLATEA;
-typedef DLGITEMTEMPLATE *PDLGITEMTEMPLATEW;
-
-typedef PDLGITEMTEMPLATEW PDLGITEMTEMPLATE;
-
-
-
-typedef DLGITEMTEMPLATE *LPDLGITEMTEMPLATEA;
-typedef DLGITEMTEMPLATE *LPDLGITEMTEMPLATEW;
-
-typedef LPDLGITEMTEMPLATEW LPDLGITEMTEMPLATE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-CreateDialogParamA(
-           HINSTANCE hInstance,
-         LPCSTR lpTemplateName,
-           HWND hWndParent,
-           DLGPROC lpDialogFunc,
-         LPARAM dwInitParam);
-__declspec(dllimport)
-HWND
-__stdcall
-CreateDialogParamW(
-           HINSTANCE hInstance,
-         LPCWSTR lpTemplateName,
-           HWND hWndParent,
-           DLGPROC lpDialogFunc,
-         LPARAM dwInitParam);
-
-
-
-
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-CreateDialogIndirectParamA(
-           HINSTANCE hInstance,
-         LPCDLGTEMPLATEA lpTemplate,
-           HWND hWndParent,
-           DLGPROC lpDialogFunc,
-         LPARAM dwInitParam);
-__declspec(dllimport)
-HWND
-__stdcall
-CreateDialogIndirectParamW(
-           HINSTANCE hInstance,
-         LPCDLGTEMPLATEW lpTemplate,
-           HWND hWndParent,
-           DLGPROC lpDialogFunc,
-         LPARAM dwInitParam);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-INT_PTR
-__stdcall
-DialogBoxParamA(
-           HINSTANCE hInstance,
-         LPCSTR lpTemplateName,
-           HWND hWndParent,
-           DLGPROC lpDialogFunc,
-         LPARAM dwInitParam);
-__declspec(dllimport)
-INT_PTR
-__stdcall
-DialogBoxParamW(
-           HINSTANCE hInstance,
-         LPCWSTR lpTemplateName,
-           HWND hWndParent,
-           DLGPROC lpDialogFunc,
-         LPARAM dwInitParam);
-
-
-
-
-
-
-__declspec(dllimport)
-INT_PTR
-__stdcall
-DialogBoxIndirectParamA(
-           HINSTANCE hInstance,
-         LPCDLGTEMPLATEA hDialogTemplate,
-           HWND hWndParent,
-           DLGPROC lpDialogFunc,
-         LPARAM dwInitParam);
-__declspec(dllimport)
-INT_PTR
-__stdcall
-DialogBoxIndirectParamW(
-           HINSTANCE hInstance,
-         LPCDLGTEMPLATEW hDialogTemplate,
-           HWND hWndParent,
-           DLGPROC lpDialogFunc,
-         LPARAM dwInitParam);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EndDialog(
-         HWND hDlg,
-         INT_PTR nResult);
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetDlgItem(
-           HWND hDlg,
-         int nIDDlgItem);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetDlgItemInt(
-         HWND hDlg,
-         int nIDDlgItem,
-         UINT uValue,
-         BOOL bSigned);
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetDlgItemInt(
-         HWND hDlg,
-         int nIDDlgItem,
-           BOOL *lpTranslated,
-         BOOL bSigned);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetDlgItemTextA(
-         HWND hDlg,
-         int nIDDlgItem,
-         LPCSTR lpString);
-__declspec(dllimport)
-BOOL
-__stdcall
-SetDlgItemTextW(
-         HWND hDlg,
-         int nIDDlgItem,
-         LPCWSTR lpString);
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetDlgItemTextA(
-         HWND hDlg,
-         int nIDDlgItem,
-         LPSTR lpString,
-         int cchMax);
-__declspec(dllimport)
-UINT
-__stdcall
-GetDlgItemTextW(
-         HWND hDlg,
-         int nIDDlgItem,
-         LPWSTR lpString,
-         int cchMax);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CheckDlgButton(
-         HWND hDlg,
-         int nIDButton,
-         UINT uCheck);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CheckRadioButton(
-         HWND hDlg,
-         int nIDFirstButton,
-         int nIDLastButton,
-         int nIDCheckButton);
-
-__declspec(dllimport)
-UINT
-__stdcall
-IsDlgButtonChecked(
-         HWND hDlg,
-         int nIDButton);
-
-__declspec(dllimport)
-LRESULT
-__stdcall
-SendDlgItemMessageA(
-         HWND hDlg,
-         int nIDDlgItem,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-__declspec(dllimport)
-LRESULT
-__stdcall
-SendDlgItemMessageW(
-         HWND hDlg,
-         int nIDDlgItem,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-
-
-
-
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetNextDlgGroupItem(
-         HWND hDlg,
-           HWND hCtl,
-         BOOL bPrevious);
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetNextDlgTabItem(
-         HWND hDlg,
-           HWND hCtl,
-         BOOL bPrevious);
-
-__declspec(dllimport)
-int
-__stdcall
-GetDlgCtrlID(
-         HWND hWnd);
-
-__declspec(dllimport)
-long
-__stdcall
-GetDialogBaseUnits(void);
-
-__declspec(dllimport)
-
-LRESULT
-__stdcall
-
-
-
-
-DefDlgProcA(
-         HWND hDlg,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-__declspec(dllimport)
-
-LRESULT
-__stdcall
-
-
-
-
-DefDlgProcW(
-         HWND hDlg,
-         UINT Msg,
-         WPARAM wParam,
-         LPARAM lParam);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CallMsgFilterA(
-         LPMSG lpMsg,
-         int nCode);
-__declspec(dllimport)
-BOOL
-__stdcall
-CallMsgFilterW(
-         LPMSG lpMsg,
-         int nCode);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-OpenClipboard(
-           HWND hWndNewOwner);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CloseClipboard(
-    void);
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetClipboardSequenceNumber(
-    void);
-
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetClipboardOwner(
-    void);
-
-__declspec(dllimport)
-HWND
-__stdcall
-SetClipboardViewer(
-         HWND hWndNewViewer);
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetClipboardViewer(
-    void);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ChangeClipboardChain(
-         HWND hWndRemove,
-         HWND hWndNewNext);
-
-__declspec(dllimport)
-HANDLE
-__stdcall
-SetClipboardData(
-         UINT uFormat,
-           HANDLE hMem);
-
-__declspec(dllimport)
-HANDLE
-__stdcall
-GetClipboardData(
-         UINT uFormat);
-
-__declspec(dllimport)
-UINT
-__stdcall
-RegisterClipboardFormatA(
-         LPCSTR lpszFormat);
-__declspec(dllimport)
-UINT
-__stdcall
-RegisterClipboardFormatW(
-         LPCWSTR lpszFormat);
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-CountClipboardFormats(
-    void);
-
-__declspec(dllimport)
-UINT
-__stdcall
-EnumClipboardFormats(
-         UINT format);
-
-__declspec(dllimport)
-int
-__stdcall
-GetClipboardFormatNameA(
-         UINT format,
-         LPSTR lpszFormatName,
-         int cchMaxCount);
-__declspec(dllimport)
-int
-__stdcall
-GetClipboardFormatNameW(
-         UINT format,
-         LPWSTR lpszFormatName,
-         int cchMaxCount);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EmptyClipboard(
-    void);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsClipboardFormatAvailable(
-         UINT format);
-
-__declspec(dllimport)
-int
-__stdcall
-GetPriorityClipboardFormat(
-           UINT *paFormatPriorityList,
-         int cFormats);
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetOpenClipboardWindow(
-    void);
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CharToOemA(
-         LPCSTR lpszSrc,
-         LPSTR lpszDst);
-__declspec(dllimport)
-BOOL
-__stdcall
-CharToOemW(
-         LPCWSTR lpszSrc,
-         LPSTR lpszDst);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-OemToCharA(
-         LPCSTR lpszSrc,
-         LPSTR lpszDst);
-__declspec(dllimport)
-BOOL
-__stdcall
-OemToCharW(
-         LPCSTR lpszSrc,
-         LPWSTR lpszDst);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CharToOemBuffA(
-         LPCSTR lpszSrc,
-         LPSTR lpszDst,
-         DWORD cchDstLength);
-__declspec(dllimport)
-BOOL
-__stdcall
-CharToOemBuffW(
-         LPCWSTR lpszSrc,
-         LPSTR lpszDst,
-         DWORD cchDstLength);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-OemToCharBuffA(
-         LPCSTR lpszSrc,
-         LPSTR lpszDst,
-         DWORD cchDstLength);
-__declspec(dllimport)
-BOOL
-__stdcall
-OemToCharBuffW(
-         LPCSTR lpszSrc,
-         LPWSTR lpszDst,
-         DWORD cchDstLength);
-
-
-
-
-
-
-__declspec(dllimport)
-LPSTR
-__stdcall
-CharUpperA(
-         LPSTR lpsz);
-__declspec(dllimport)
-LPWSTR
-__stdcall
-CharUpperW(
-         LPWSTR lpsz);
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-CharUpperBuffA(
-           LPSTR lpsz,
-         DWORD cchLength);
-__declspec(dllimport)
-DWORD
-__stdcall
-CharUpperBuffW(
-           LPWSTR lpsz,
-         DWORD cchLength);
-
-
-
-
-
-
-__declspec(dllimport)
-LPSTR
-__stdcall
-CharLowerA(
-         LPSTR lpsz);
-__declspec(dllimport)
-LPWSTR
-__stdcall
-CharLowerW(
-         LPWSTR lpsz);
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-CharLowerBuffA(
-           LPSTR lpsz,
-         DWORD cchLength);
-__declspec(dllimport)
-DWORD
-__stdcall
-CharLowerBuffW(
-           LPWSTR lpsz,
-         DWORD cchLength);
-
-
-
-
-
-
-__declspec(dllimport)
-LPSTR
-__stdcall
-CharNextA(
-         LPCSTR lpsz);
-__declspec(dllimport)
-LPWSTR
-__stdcall
-CharNextW(
-         LPCWSTR lpsz);
-
-
-
-
-
-
-__declspec(dllimport)
-LPSTR
-__stdcall
-CharPrevA(
-         LPCSTR lpszStart,
-         LPCSTR lpszCurrent);
-__declspec(dllimport)
-LPWSTR
-__stdcall
-CharPrevW(
-         LPCWSTR lpszStart,
-         LPCWSTR lpszCurrent);
-
-
-
-
-
-
-
-__declspec(dllimport)
-LPSTR
-__stdcall
-CharNextExA(
-          WORD CodePage,
-          LPCSTR lpCurrentChar,
-          DWORD dwFlags);
-
-__declspec(dllimport)
-LPSTR
-__stdcall
-CharPrevExA(
-          WORD CodePage,
-          LPCSTR lpStart,
-          LPCSTR lpCurrentChar,
-          DWORD dwFlags);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsCharAlphaA(
-         CHAR ch);
-__declspec(dllimport)
-BOOL
-__stdcall
-IsCharAlphaW(
-         WCHAR ch);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsCharAlphaNumericA(
-         CHAR ch);
-__declspec(dllimport)
-BOOL
-__stdcall
-IsCharAlphaNumericW(
-         WCHAR ch);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsCharUpperA(
-         CHAR ch);
-__declspec(dllimport)
-BOOL
-__stdcall
-IsCharUpperW(
-         WCHAR ch);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsCharLowerA(
-         CHAR ch);
-__declspec(dllimport)
-BOOL
-__stdcall
-IsCharLowerW(
-         WCHAR ch);
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-SetFocus(
-           HWND hWnd);
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetActiveWindow(
-    void);
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetFocus(
-    void);
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetKBCodePage(
-    void);
-
-__declspec(dllimport)
-SHORT
-__stdcall
-GetKeyState(
-         int nVirtKey);
-
-__declspec(dllimport)
-SHORT
-__stdcall
-GetAsyncKeyState(
-         int vKey);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetKeyboardState(
-         PBYTE lpKeyState);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetKeyboardState(
-           LPBYTE lpKeyState);
-
-__declspec(dllimport)
-int
-__stdcall
-GetKeyNameTextA(
-         LONG lParam,
-         LPSTR lpString,
-         int cchSize);
-__declspec(dllimport)
-int
-__stdcall
-GetKeyNameTextW(
-         LONG lParam,
-         LPWSTR lpString,
-         int cchSize);
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-GetKeyboardType(
-         int nTypeFlag);
-
-__declspec(dllimport)
-int
-__stdcall
-ToAscii(
-         UINT uVirtKey,
-         UINT uScanCode,
-             const BYTE *lpKeyState,
-         LPWORD lpChar,
-         UINT uFlags);
-
-
-__declspec(dllimport)
-int
-__stdcall
-ToAsciiEx(
-         UINT uVirtKey,
-         UINT uScanCode,
-             const BYTE *lpKeyState,
-         LPWORD lpChar,
-         UINT uFlags,
-           HKL dwhkl);
-
-
-__declspec(dllimport)
-int
-__stdcall
-ToUnicode(
-         UINT wVirtKey,
-         UINT wScanCode,
-             const BYTE *lpKeyState,
-         LPWSTR pwszBuff,
-         int cchBuff,
-         UINT wFlags);
-
-__declspec(dllimport)
-DWORD
-__stdcall
-OemKeyScan(
-         WORD wOemChar);
-
-__declspec(dllimport)
-SHORT
-__stdcall
-VkKeyScanA(
-         CHAR ch);
-__declspec(dllimport)
-SHORT
-__stdcall
-VkKeyScanW(
-         WCHAR ch);
-
-
-
-
-
-
-
-__declspec(dllimport)
-SHORT
-__stdcall
-VkKeyScanExA(
-         CHAR ch,
-         HKL dwhkl);
-__declspec(dllimport)
-SHORT
-__stdcall
-VkKeyScanExW(
-         WCHAR ch,
-         HKL dwhkl);
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-keybd_event(
-         BYTE bVk,
-         BYTE bScan,
-         DWORD dwFlags,
-         ULONG_PTR dwExtraInfo);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-mouse_event(
-         DWORD dwFlags,
-         DWORD dx,
-         DWORD dy,
-         DWORD dwData,
-         ULONG_PTR dwExtraInfo);
-
-
-
-typedef struct tagMOUSEINPUT {
-    LONG    dx;
-    LONG    dy;
-    DWORD   mouseData;
-    DWORD   dwFlags;
-    DWORD   time;
-    ULONG_PTR dwExtraInfo;
-} MOUSEINPUT, *PMOUSEINPUT, * LPMOUSEINPUT;
-
-typedef struct tagKEYBDINPUT {
-    WORD    wVk;
-    WORD    wScan;
-    DWORD   dwFlags;
-    DWORD   time;
-    ULONG_PTR dwExtraInfo;
-} KEYBDINPUT, *PKEYBDINPUT, * LPKEYBDINPUT;
-
-typedef struct tagHARDWAREINPUT {
-    DWORD   uMsg;
-    WORD    wParamL;
-    WORD    wParamH;
-} HARDWAREINPUT, *PHARDWAREINPUT, * LPHARDWAREINPUT;
-
-
-
-
-
-typedef struct tagINPUT {
-    DWORD   type;
-
-    union
-    {
-        MOUSEINPUT      mi;
-        KEYBDINPUT      ki;
-        HARDWAREINPUT   hi;
-    };
-} INPUT, *PINPUT, * LPINPUT;
-
-__declspec(dllimport)
-UINT
-__stdcall
-SendInput(
-         UINT cInputs,                     
-           LPINPUT pInputs,  
-         int cbSize);                      
-
-
-
-
-typedef struct tagLASTINPUTINFO {
-    UINT cbSize;
-    DWORD dwTime;
-} LASTINPUTINFO, * PLASTINPUTINFO;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetLastInputInfo(
-         PLASTINPUTINFO plii);
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-MapVirtualKeyA(
-         UINT uCode,
-         UINT uMapType);
-__declspec(dllimport)
-UINT
-__stdcall
-MapVirtualKeyW(
-         UINT uCode,
-         UINT uMapType);
-
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-MapVirtualKeyExA(
-         UINT uCode,
-         UINT uMapType,
-           HKL dwhkl);
-__declspec(dllimport)
-UINT
-__stdcall
-MapVirtualKeyExW(
-         UINT uCode,
-         UINT uMapType,
-           HKL dwhkl);
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetInputState(
-    void);
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetQueueStatus(
-         UINT flags);
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetCapture(
-    void);
-
-__declspec(dllimport)
-HWND
-__stdcall
-SetCapture(
-         HWND hWnd);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReleaseCapture(
-    void);
-
-__declspec(dllimport)
-DWORD
-__stdcall
-MsgWaitForMultipleObjects(
-         DWORD nCount,
-             const HANDLE *pHandles,
-         BOOL fWaitAll,
-         DWORD dwMilliseconds,
-         DWORD dwWakeMask);
-
-__declspec(dllimport)
-DWORD
-__stdcall
-MsgWaitForMultipleObjectsEx(
-         DWORD nCount,
-             const HANDLE *pHandles,
-         DWORD dwMilliseconds,
-         DWORD dwWakeMask,
-         DWORD dwFlags);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-UINT_PTR
-__stdcall
-SetTimer(
-           HWND hWnd,
-         UINT_PTR nIDEvent,
-         UINT uElapse,
-           TIMERPROC lpTimerFunc);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-KillTimer(
-           HWND hWnd,
-         UINT_PTR uIDEvent);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsWindowUnicode(
-         HWND hWnd);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnableWindow(
-         HWND hWnd,
-         BOOL bEnable);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsWindowEnabled(
-         HWND hWnd);
-
-__declspec(dllimport)
-HACCEL
-__stdcall
-LoadAcceleratorsA(
-           HINSTANCE hInstance,
-         LPCSTR lpTableName);
-__declspec(dllimport)
-HACCEL
-__stdcall
-LoadAcceleratorsW(
-           HINSTANCE hInstance,
-         LPCWSTR lpTableName);
-
-
-
-
-
-
-__declspec(dllimport)
-HACCEL
-__stdcall
-CreateAcceleratorTableA(
-           LPACCEL paccel, 
-         int cAccel);
-__declspec(dllimport)
-HACCEL
-__stdcall
-CreateAcceleratorTableW(
-           LPACCEL paccel, 
-         int cAccel);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DestroyAcceleratorTable(
-         HACCEL hAccel);
-
-__declspec(dllimport)
-int
-__stdcall
-CopyAcceleratorTableA(
-         HACCEL hAccelSrc,
-             LPACCEL lpAccelDst,
-         int cAccelEntries);
-__declspec(dllimport)
-int
-__stdcall
-CopyAcceleratorTableW(
-         HACCEL hAccelSrc,
-             LPACCEL lpAccelDst,
-         int cAccelEntries);
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-TranslateAcceleratorA(
-         HWND hWnd,
-         HACCEL hAccTable,
-         LPMSG lpMsg);
-__declspec(dllimport)
-int
-__stdcall
-TranslateAcceleratorW(
-         HWND hWnd,
-         HACCEL hAccTable,
-         LPMSG lpMsg);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-GetSystemMetrics(
-         int nIndex);
-
-
-
-
-
-
-__declspec(dllimport)
-HMENU
-__stdcall
-LoadMenuA(
-           HINSTANCE hInstance,
-         LPCSTR lpMenuName);
-__declspec(dllimport)
-HMENU
-__stdcall
-LoadMenuW(
-           HINSTANCE hInstance,
-         LPCWSTR lpMenuName);
-
-
-
-
-
-
-__declspec(dllimport)
-HMENU
-__stdcall
-LoadMenuIndirectA(
-         const MENUTEMPLATEA *lpMenuTemplate);
-__declspec(dllimport)
-HMENU
-__stdcall
-LoadMenuIndirectW(
-         const MENUTEMPLATEW *lpMenuTemplate);
-
-
-
-
-
-
-__declspec(dllimport)
-HMENU
-__stdcall
-GetMenu(
-         HWND hWnd);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetMenu(
-         HWND hWnd,
-           HMENU hMenu);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ChangeMenuA(
-         HMENU hMenu,
-         UINT cmd,
-           LPCSTR lpszNewItem,
-         UINT cmdInsert,
-         UINT flags);
-__declspec(dllimport)
-BOOL
-__stdcall
-ChangeMenuW(
-         HMENU hMenu,
-         UINT cmd,
-           LPCWSTR lpszNewItem,
-         UINT cmdInsert,
-         UINT flags);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-HiliteMenuItem(
-         HWND hWnd,
-         HMENU hMenu,
-         UINT uIDHiliteItem,
-         UINT uHilite);
-
-__declspec(dllimport)
-int
-__stdcall
-GetMenuStringA(
-         HMENU hMenu,
-         UINT uIDItem,
-           LPSTR lpString,
-         int cchMax,
-         UINT flags);
-__declspec(dllimport)
-int
-__stdcall
-GetMenuStringW(
-         HMENU hMenu,
-         UINT uIDItem,
-           LPWSTR lpString,
-         int cchMax,
-         UINT flags);
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetMenuState(
-         HMENU hMenu,
-         UINT uId,
-         UINT uFlags);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DrawMenuBar(
-         HWND hWnd);
-
-
-
-
-
-
-
-__declspec(dllimport)
-HMENU
-__stdcall
-GetSystemMenu(
-         HWND hWnd,
-         BOOL bRevert);
-
-
-__declspec(dllimport)
-HMENU
-__stdcall
-CreateMenu(
-    void);
-
-__declspec(dllimport)
-HMENU
-__stdcall
-CreatePopupMenu(
-    void);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DestroyMenu(
-         HMENU hMenu);
-
-__declspec(dllimport)
-DWORD
-__stdcall
-CheckMenuItem(
-         HMENU hMenu,
-         UINT uIDCheckItem,
-         UINT uCheck);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnableMenuItem(
-         HMENU hMenu,
-         UINT uIDEnableItem,
-         UINT uEnable);
-
-__declspec(dllimport)
-HMENU
-__stdcall
-GetSubMenu(
-         HMENU hMenu,
-         int nPos);
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetMenuItemID(
-         HMENU hMenu,
-         int nPos);
-
-__declspec(dllimport)
-int
-__stdcall
-GetMenuItemCount(
-           HMENU hMenu);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-InsertMenuA(
-         HMENU hMenu,
-         UINT uPosition,
-         UINT uFlags,
-         UINT_PTR uIDNewItem,
-           LPCSTR lpNewItem);
-__declspec(dllimport)
-BOOL
-__stdcall
-InsertMenuW(
-         HMENU hMenu,
-         UINT uPosition,
-         UINT uFlags,
-         UINT_PTR uIDNewItem,
-           LPCWSTR lpNewItem);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AppendMenuA(
-         HMENU hMenu,
-         UINT uFlags,
-         UINT_PTR uIDNewItem,
-           LPCSTR lpNewItem);
-__declspec(dllimport)
-BOOL
-__stdcall
-AppendMenuW(
-         HMENU hMenu,
-         UINT uFlags,
-         UINT_PTR uIDNewItem,
-           LPCWSTR lpNewItem);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ModifyMenuA(
-         HMENU hMnu,
-         UINT uPosition,
-         UINT uFlags,
-         UINT_PTR uIDNewItem,
-           LPCSTR lpNewItem);
-__declspec(dllimport)
-BOOL
-__stdcall
-ModifyMenuW(
-         HMENU hMnu,
-         UINT uPosition,
-         UINT uFlags,
-         UINT_PTR uIDNewItem,
-           LPCWSTR lpNewItem);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall RemoveMenu(
-         HMENU hMenu,
-         UINT uPosition,
-         UINT uFlags);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DeleteMenu(
-         HMENU hMenu,
-         UINT uPosition,
-         UINT uFlags);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetMenuItemBitmaps(
-         HMENU hMenu,
-         UINT uPosition,
-         UINT uFlags,
-           HBITMAP hBitmapUnchecked,
-           HBITMAP hBitmapChecked);
-
-__declspec(dllimport)
-LONG
-__stdcall
-GetMenuCheckMarkDimensions(
-    void);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-TrackPopupMenu(
-         HMENU hMenu,
-         UINT uFlags,
-         int x,
-         int y,
-         int nReserved,
-         HWND hWnd,
-           const RECT *prcRect);
-
-
-
-
-
-
-
-
-typedef struct tagTPMPARAMS
-{
-    UINT    cbSize;     
-    RECT    rcExclude;  
-}   TPMPARAMS;
-typedef TPMPARAMS  *LPTPMPARAMS;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-TrackPopupMenuEx(
-         HMENU,
-         UINT,
-         int,
-         int,
-         HWND,
-           LPTPMPARAMS);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMENUINFO
-{
-    DWORD   cbSize;
-    DWORD   fMask;
-    DWORD   dwStyle;
-    UINT    cyMax;
-    HBRUSH  hbrBack;
-    DWORD   dwContextHelpID;
-    ULONG_PTR dwMenuData;
-}   MENUINFO,  *LPMENUINFO;
-typedef MENUINFO const  *LPCMENUINFO;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetMenuInfo(
-         HMENU,
-         LPMENUINFO);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetMenuInfo(
-         HMENU,
-         LPCMENUINFO);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EndMenu(
-        void);
-
-
-
-
-
-
-
-typedef struct tagMENUGETOBJECTINFO
-{
-    DWORD dwFlags;
-    UINT uPos;
-    HMENU hmenu;
-    PVOID riid;
-    PVOID pvObj;
-} MENUGETOBJECTINFO, * PMENUGETOBJECTINFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMENUITEMINFOA
-{
-    UINT     cbSize;
-    UINT     fMask;
-    UINT     fType;         
-    UINT     fState;        
-    UINT     wID;           
-    HMENU    hSubMenu;      
-    HBITMAP  hbmpChecked;   
-    HBITMAP  hbmpUnchecked; 
-    ULONG_PTR dwItemData;   
-    LPSTR    dwTypeData;    
-    UINT     cch;           
-
-    HBITMAP  hbmpItem;      
-
-}   MENUITEMINFOA,  *LPMENUITEMINFOA;
-typedef struct tagMENUITEMINFOW
-{
-    UINT     cbSize;
-    UINT     fMask;
-    UINT     fType;         
-    UINT     fState;        
-    UINT     wID;           
-    HMENU    hSubMenu;      
-    HBITMAP  hbmpChecked;   
-    HBITMAP  hbmpUnchecked; 
-    ULONG_PTR dwItemData;   
-    LPWSTR   dwTypeData;    
-    UINT     cch;           
-
-    HBITMAP  hbmpItem;      
-
-}   MENUITEMINFOW,  *LPMENUITEMINFOW;
-
-typedef MENUITEMINFOW MENUITEMINFO;
-typedef LPMENUITEMINFOW LPMENUITEMINFO;
-
-
-
-
-typedef MENUITEMINFOA const  *LPCMENUITEMINFOA;
-typedef MENUITEMINFOW const  *LPCMENUITEMINFOW;
-
-typedef LPCMENUITEMINFOW LPCMENUITEMINFO;
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-InsertMenuItemA(
-         HMENU hmenu,
-         UINT item,
-         BOOL fByPosition,
-         LPCMENUITEMINFOA lpmi);
-__declspec(dllimport)
-BOOL
-__stdcall
-InsertMenuItemW(
-         HMENU hmenu,
-         UINT item,
-         BOOL fByPosition,
-         LPCMENUITEMINFOW lpmi);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetMenuItemInfoA(
-         HMENU hmenu,
-         UINT item,
-         BOOL fByPosition,
-         LPMENUITEMINFOA lpmii);
-__declspec(dllimport)
-BOOL
-__stdcall
-GetMenuItemInfoW(
-         HMENU hmenu,
-         UINT item,
-         BOOL fByPosition,
-         LPMENUITEMINFOW lpmii);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetMenuItemInfoA(
-         HMENU hmenu,
-         UINT item,
-         BOOL fByPositon,
-         LPCMENUITEMINFOA lpmii);
-__declspec(dllimport)
-BOOL
-__stdcall
-SetMenuItemInfoW(
-         HMENU hmenu,
-         UINT item,
-         BOOL fByPositon,
-         LPCMENUITEMINFOW lpmii);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetMenuDefaultItem(
-         HMENU hMenu,
-         UINT fByPos,
-         UINT gmdiFlags);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetMenuDefaultItem(
-         HMENU hMenu,
-         UINT uItem,
-         UINT fByPos);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetMenuItemRect(
-           HWND hWnd,
-         HMENU hMenu,
-         UINT uItem,
-         LPRECT lprcItem);
-
-__declspec(dllimport)
-int
-__stdcall
-MenuItemFromPoint(
-           HWND hWnd,
-         HMENU hMenu,
-         POINT ptScreen);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagDROPSTRUCT
-{
-    HWND    hwndSource;
-    HWND    hwndSink;
-    DWORD   wFmt;
-    ULONG_PTR dwData;
-    POINT   ptDrop;
-    DWORD   dwControlData;
-} DROPSTRUCT, *PDROPSTRUCT, *LPDROPSTRUCT;
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-DragObject(
-         HWND hwndParent,
-         HWND hwndFrom,
-         UINT fmt,
-         ULONG_PTR data,
-           HCURSOR hcur);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DragDetect(
-         HWND hwnd,
-         POINT pt);
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DrawIcon(
-         HDC hDC,
-         int X,
-         int Y,
-         HICON hIcon);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagDRAWTEXTPARAMS
-{
-    UINT    cbSize;
-    int     iTabLength;
-    int     iLeftMargin;
-    int     iRightMargin;
-    UINT    uiLengthDrawn;
-} DRAWTEXTPARAMS,  *LPDRAWTEXTPARAMS;
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-DrawTextA(
-         HDC hdc,
-           LPCSTR lpchText,
-         int cchText,
-         LPRECT lprc,
-         UINT format);
-__declspec(dllimport)
-int
-__stdcall
-DrawTextW(
-         HDC hdc,
-           LPCWSTR lpchText,
-         int cchText,
-         LPRECT lprc,
-         UINT format);
-
-
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-DrawTextExA(
-         HDC hdc,
-           LPSTR lpchText,
-         int cchText,
-         LPRECT lprc,
-         UINT format,
-           LPDRAWTEXTPARAMS lpdtp);
-__declspec(dllimport)
-int
-__stdcall
-DrawTextExW(
-         HDC hdc,
-           LPWSTR lpchText,
-         int cchText,
-         LPRECT lprc,
-         UINT format,
-           LPDRAWTEXTPARAMS lpdtp);
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GrayStringA(
-         HDC hDC,
-           HBRUSH hBrush,
-           GRAYSTRINGPROC lpOutputFunc,
-         LPARAM lpData,
-         int nCount,
-         int X,
-         int Y,
-         int nWidth,
-         int nHeight);
-__declspec(dllimport)
-BOOL
-__stdcall
-GrayStringW(
-         HDC hDC,
-           HBRUSH hBrush,
-           GRAYSTRINGPROC lpOutputFunc,
-         LPARAM lpData,
-         int nCount,
-         int X,
-         int Y,
-         int nWidth,
-         int nHeight);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DrawStateA(
-         HDC hdc,
-           HBRUSH hbrFore,
-           DRAWSTATEPROC qfnCallBack,
-         LPARAM lData,
-         WPARAM wData,
-         int x,
-         int y,
-         int cx,
-         int cy,
-         UINT uFlags);
-__declspec(dllimport)
-BOOL
-__stdcall
-DrawStateW(
-         HDC hdc,
-           HBRUSH hbrFore,
-           DRAWSTATEPROC qfnCallBack,
-         LPARAM lData,
-         WPARAM wData,
-         int x,
-         int y,
-         int cx,
-         int cy,
-         UINT uFlags);
-
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-TabbedTextOutA(
-         HDC hdc,
-         int x,
-         int y,
-           LPCSTR lpString,
-         int chCount,
-         int nTabPositions,
-             const INT *lpnTabStopPositions,
-         int nTabOrigin);
-__declspec(dllimport)
-LONG
-__stdcall
-TabbedTextOutW(
-         HDC hdc,
-         int x,
-         int y,
-           LPCWSTR lpString,
-         int chCount,
-         int nTabPositions,
-             const INT *lpnTabStopPositions,
-         int nTabOrigin);
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetTabbedTextExtentA(
-         HDC hdc,
-           LPCSTR lpString,
-         int chCount,
-         int nTabPositions,
-             const INT *lpnTabStopPositions);
-__declspec(dllimport)
-DWORD
-__stdcall
-GetTabbedTextExtentW(
-         HDC hdc,
-           LPCWSTR lpString,
-         int chCount,
-         int nTabPositions,
-             const INT *lpnTabStopPositions);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UpdateWindow(
-         HWND hWnd);
-
-__declspec(dllimport)
-HWND
-__stdcall
-SetActiveWindow(
-         HWND hWnd);
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetForegroundWindow(
-    void);
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-PaintDesktop(
-         HDC hdc);
-
-__declspec(dllimport)
-void
-__stdcall
-SwitchToThisWindow(
-         HWND hwnd,
-         BOOL fUnknown);
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetForegroundWindow(
-         HWND hWnd);
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AllowSetForegroundWindow(
-         DWORD dwProcessId);
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-LockSetForegroundWindow(
-         UINT uLockCode);
-
-
-
-
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-WindowFromDC(
-         HDC hDC);
-
-__declspec(dllimport)
-HDC
-__stdcall
-GetDC(
-           HWND hWnd);
-
-__declspec(dllimport)
-HDC
-__stdcall
-GetDCEx(
-           HWND hWnd,
-           HRGN hrgnClip,
-         DWORD flags);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HDC
-__stdcall
-GetWindowDC(
-           HWND hWnd);
-
-__declspec(dllimport)
-int
-__stdcall
-ReleaseDC(
-           HWND hWnd,
-         HDC hDC);
-
-__declspec(dllimport)
-HDC
-__stdcall
-BeginPaint(
-         HWND hWnd,
-         LPPAINTSTRUCT lpPaint);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EndPaint(
-         HWND hWnd,
-         const PAINTSTRUCT *lpPaint);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetUpdateRect(
-         HWND hWnd,
-           LPRECT lpRect,
-         BOOL bErase);
-
-__declspec(dllimport)
-int
-__stdcall
-GetUpdateRgn(
-         HWND hWnd,
-         HRGN hRgn,
-         BOOL bErase);
-
-__declspec(dllimport)
-int
-__stdcall
-SetWindowRgn(
-         HWND hWnd,
-           HRGN hRgn,
-         BOOL bRedraw);
-
-
-__declspec(dllimport)
-int
-__stdcall
-GetWindowRgn(
-         HWND hWnd,
-         HRGN hRgn);
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-GetWindowRgnBox(
-         HWND hWnd,
-         LPRECT lprc);
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-ExcludeUpdateRgn(
-         HDC hDC,
-         HWND hWnd);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-InvalidateRect(
-           HWND hWnd,
-           const RECT *lpRect,
-         BOOL bErase);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ValidateRect(
-           HWND hWnd,
-           const RECT *lpRect);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-InvalidateRgn(
-         HWND hWnd,
-           HRGN hRgn,
-         BOOL bErase);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ValidateRgn(
-         HWND hWnd,
-           HRGN hRgn);
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-RedrawWindow(
-           HWND hWnd,
-           const RECT *lprcUpdate,
-           HRGN hrgnUpdate,
-         UINT flags);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-LockWindowUpdate(
-           HWND hWndLock);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ScrollWindow(
-         HWND hWnd,
-         int XAmount,
-         int YAmount,
-           const RECT *lpRect,
-           const RECT *lpClipRect);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ScrollDC(
-         HDC hDC,
-         int dx,
-         int dy,
-           const RECT *lprcScroll,
-           const RECT *lprcClip,
-           HRGN hrgnUpdate,
-           LPRECT lprcUpdate);
-
-__declspec(dllimport)
-int
-__stdcall
-ScrollWindowEx(
-         HWND hWnd,
-         int dx,
-         int dy,
-           const RECT *prcScroll,
-           const RECT *prcClip,
-           HRGN hrgnUpdate,
-           LPRECT prcUpdate,
-         UINT flags);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-SetScrollPos(
-         HWND hWnd,
-         int nBar,
-         int nPos,
-         BOOL bRedraw);
-
-__declspec(dllimport)
-int
-__stdcall
-GetScrollPos(
-         HWND hWnd,
-         int nBar);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetScrollRange(
-         HWND hWnd,
-         int nBar,
-         int nMinPos,
-         int nMaxPos,
-         BOOL bRedraw);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetScrollRange(
-         HWND hWnd,
-         int nBar,
-         LPINT lpMinPos,
-         LPINT lpMaxPos);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ShowScrollBar(
-         HWND hWnd,
-         int wBar,
-         BOOL bShow);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnableScrollBar(
-         HWND hWnd,
-         UINT wSBflags,
-         UINT wArrows);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetPropA(
-         HWND hWnd,
-         LPCSTR lpString,
-           HANDLE hData);
-__declspec(dllimport)
-BOOL
-__stdcall
-SetPropW(
-         HWND hWnd,
-         LPCWSTR lpString,
-           HANDLE hData);
-
-
-
-
-
-
-__declspec(dllimport)
-HANDLE
-__stdcall
-GetPropA(
-         HWND hWnd,
-         LPCSTR lpString);
-__declspec(dllimport)
-HANDLE
-__stdcall
-GetPropW(
-         HWND hWnd,
-         LPCWSTR lpString);
-
-
-
-
-
-
-__declspec(dllimport)
-HANDLE
-__stdcall
-RemovePropA(
-         HWND hWnd,
-         LPCSTR lpString);
-__declspec(dllimport)
-HANDLE
-__stdcall
-RemovePropW(
-         HWND hWnd,
-         LPCWSTR lpString);
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-EnumPropsExA(
-         HWND hWnd,
-         PROPENUMPROCEXA lpEnumFunc,
-         LPARAM lParam);
-__declspec(dllimport)
-int
-__stdcall
-EnumPropsExW(
-         HWND hWnd,
-         PROPENUMPROCEXW lpEnumFunc,
-         LPARAM lParam);
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-EnumPropsA(
-         HWND hWnd,
-         PROPENUMPROCA lpEnumFunc);
-__declspec(dllimport)
-int
-__stdcall
-EnumPropsW(
-         HWND hWnd,
-         PROPENUMPROCW lpEnumFunc);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetWindowTextA(
-         HWND hWnd,
-           LPCSTR lpString);
-__declspec(dllimport)
-BOOL
-__stdcall
-SetWindowTextW(
-         HWND hWnd,
-           LPCWSTR lpString);
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-GetWindowTextA(
-         HWND hWnd,
-         LPSTR lpString,
-         int nMaxCount);
-__declspec(dllimport)
-int
-__stdcall
-GetWindowTextW(
-         HWND hWnd,
-         LPWSTR lpString,
-         int nMaxCount);
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-GetWindowTextLengthA(
-         HWND hWnd);
-__declspec(dllimport)
-int
-__stdcall
-GetWindowTextLengthW(
-         HWND hWnd);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetClientRect(
-         HWND hWnd,
-         LPRECT lpRect);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetWindowRect(
-         HWND hWnd,
-         LPRECT lpRect);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AdjustWindowRect(
-         LPRECT lpRect,
-         DWORD dwStyle,
-         BOOL bMenu);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AdjustWindowRectEx(
-         LPRECT lpRect,
-         DWORD dwStyle,
-         BOOL bMenu,
-         DWORD dwExStyle);
-
-
-
-
-
-typedef struct tagHELPINFO      
-{
-    UINT    cbSize;             
-    int     iContextType;       
-    int     iCtrlId;            
-    HANDLE  hItemHandle;        
-    DWORD_PTR dwContextId;      
-    POINT   MousePos;           
-}  HELPINFO,  *LPHELPINFO;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetWindowContextHelpId(
-         HWND,
-         DWORD);
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetWindowContextHelpId(
-         HWND);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetMenuContextHelpId(
-         HMENU,
-         DWORD);
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetMenuContextHelpId(
-         HMENU);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-MessageBoxA(
-           HWND hWnd,
-           LPCSTR lpText,
-           LPCSTR lpCaption,
-         UINT uType);
-__declspec(dllimport)
-int
-__stdcall
-MessageBoxW(
-           HWND hWnd,
-           LPCWSTR lpText,
-           LPCWSTR lpCaption,
-         UINT uType);
-
-
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-MessageBoxExA(
-           HWND hWnd,
-           LPCSTR lpText,
-           LPCSTR lpCaption,
-         UINT uType,
-         WORD wLanguageId);
-__declspec(dllimport)
-int
-__stdcall
-MessageBoxExW(
-           HWND hWnd,
-           LPCWSTR lpText,
-           LPCWSTR lpCaption,
-         UINT uType,
-         WORD wLanguageId);
-
-
-
-
-
-
-
-
-typedef void (__stdcall *MSGBOXCALLBACK)(LPHELPINFO lpHelpInfo);
-
-typedef struct tagMSGBOXPARAMSA
-{
-    UINT        cbSize;
-    HWND        hwndOwner;
-    HINSTANCE   hInstance;
-    LPCSTR      lpszText;
-    LPCSTR      lpszCaption;
-    DWORD       dwStyle;
-    LPCSTR      lpszIcon;
-    DWORD_PTR   dwContextHelpId;
-    MSGBOXCALLBACK      lpfnMsgBoxCallback;
-    DWORD       dwLanguageId;
-} MSGBOXPARAMSA, *PMSGBOXPARAMSA, *LPMSGBOXPARAMSA;
-typedef struct tagMSGBOXPARAMSW
-{
-    UINT        cbSize;
-    HWND        hwndOwner;
-    HINSTANCE   hInstance;
-    LPCWSTR     lpszText;
-    LPCWSTR     lpszCaption;
-    DWORD       dwStyle;
-    LPCWSTR     lpszIcon;
-    DWORD_PTR   dwContextHelpId;
-    MSGBOXCALLBACK      lpfnMsgBoxCallback;
-    DWORD       dwLanguageId;
-} MSGBOXPARAMSW, *PMSGBOXPARAMSW, *LPMSGBOXPARAMSW;
-
-typedef MSGBOXPARAMSW MSGBOXPARAMS;
-typedef PMSGBOXPARAMSW PMSGBOXPARAMS;
-typedef LPMSGBOXPARAMSW LPMSGBOXPARAMS;
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-MessageBoxIndirectA(
-         const MSGBOXPARAMSA * lpmbp);
-__declspec(dllimport)
-int
-__stdcall
-MessageBoxIndirectW(
-         const MSGBOXPARAMSW * lpmbp);
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-MessageBeep(
-         UINT uType);
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-ShowCursor(
-         BOOL bShow);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetCursorPos(
-         int X,
-         int Y);
-
-__declspec(dllimport)
-HCURSOR
-__stdcall
-SetCursor(
-           HCURSOR hCursor);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetCursorPos(
-         LPPOINT lpPoint);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ClipCursor(
-           const RECT *lpRect);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetClipCursor(
-         LPRECT lpRect);
-
-__declspec(dllimport)
-HCURSOR
-__stdcall
-GetCursor(
-    void);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CreateCaret(
-         HWND hWnd,
-           HBITMAP hBitmap,
-         int nWidth,
-         int nHeight);
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetCaretBlinkTime(
-    void);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetCaretBlinkTime(
-         UINT uMSeconds);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DestroyCaret(
-    void);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-HideCaret(
-           HWND hWnd);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ShowCaret(
-           HWND hWnd);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetCaretPos(
-         int X,
-         int Y);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetCaretPos(
-         LPPOINT lpPoint);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ClientToScreen(
-         HWND hWnd,
-         LPPOINT lpPoint);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ScreenToClient(
-         HWND hWnd,
-         LPPOINT lpPoint);
-
-__declspec(dllimport)
-int
-__stdcall
-MapWindowPoints(
-           HWND hWndFrom,
-           HWND hWndTo,
-           LPPOINT lpPoints,
-         UINT cPoints);
-
-__declspec(dllimport)
-HWND
-__stdcall
-WindowFromPoint(
-         POINT Point);
-
-__declspec(dllimport)
-HWND
-__stdcall
-ChildWindowFromPoint(
-         HWND hWndParent,
-         POINT Point);
-
-
-
-
-
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-ChildWindowFromPointEx(
-         HWND hwnd,
-         POINT pt,
-         UINT flags);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetSysColor(
-         int nIndex);
-
-
-__declspec(dllimport)
-HBRUSH
-__stdcall
-GetSysColorBrush(
-         int nIndex);
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetSysColors(
-         int cElements,
-           const INT * lpaElements,
-           const COLORREF * lpaRgbValues);
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DrawFocusRect(
-         HDC hDC,
-         const RECT * lprc);
-
-__declspec(dllimport)
-int
-__stdcall
-FillRect(
-         HDC hDC,
-         const RECT *lprc,
-         HBRUSH hbr);
-
-__declspec(dllimport)
-int
-__stdcall
-FrameRect(
-         HDC hDC,
-         const RECT *lprc,
-         HBRUSH hbr);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-InvertRect(
-         HDC hDC,
-         const RECT *lprc);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetRect(
-         LPRECT lprc,
-         int xLeft,
-         int yTop,
-         int xRight,
-         int yBottom);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetRectEmpty(
-         LPRECT lprc);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CopyRect(
-         LPRECT lprcDst,
-         const RECT *lprcSrc);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-InflateRect(
-         LPRECT lprc,
-         int dx,
-         int dy);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IntersectRect(
-         LPRECT lprcDst,
-         const RECT *lprcSrc1,
-         const RECT *lprcSrc2);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UnionRect(
-         LPRECT lprcDst,
-         const RECT *lprcSrc1,
-         const RECT *lprcSrc2);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SubtractRect(
-         LPRECT lprcDst,
-         const RECT *lprcSrc1,
-         const RECT *lprcSrc2);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-OffsetRect(
-         LPRECT lprc,
-         int dx,
-         int dy);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsRectEmpty(
-         const RECT *lprc);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EqualRect(
-         const RECT *lprc1,
-         const RECT *lprc2);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-PtInRect(
-         const RECT *lprc,
-         POINT pt);
-
-
-
-__declspec(dllimport)
-WORD
-__stdcall
-GetWindowWord(
-         HWND hWnd,
-         int nIndex);
-
-__declspec(dllimport)
-WORD
-__stdcall
-SetWindowWord(
-         HWND hWnd,
-         int nIndex,
-         WORD wNewWord);
-
-__declspec(dllimport)
-LONG
-__stdcall
-GetWindowLongA(
-         HWND hWnd,
-         int nIndex);
-__declspec(dllimport)
-LONG
-__stdcall
-GetWindowLongW(
-         HWND hWnd,
-         int nIndex);
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-SetWindowLongA(
-         HWND hWnd,
-         int nIndex,
-         LONG dwNewLong);
-__declspec(dllimport)
-LONG
-__stdcall
-SetWindowLongW(
-         HWND hWnd,
-         int nIndex,
-         LONG dwNewLong);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-WORD
-__stdcall
-GetClassWord(
-         HWND hWnd,
-         int nIndex);
-
-__declspec(dllimport)
-WORD
-__stdcall
-SetClassWord(
-         HWND hWnd,
-         int nIndex,
-         WORD wNewWord);
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetClassLongA(
-         HWND hWnd,
-         int nIndex);
-__declspec(dllimport)
-DWORD
-__stdcall
-GetClassLongW(
-         HWND hWnd,
-         int nIndex);
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-SetClassLongA(
-         HWND hWnd,
-         int nIndex,
-         LONG dwNewLong);
-__declspec(dllimport)
-DWORD
-__stdcall
-SetClassLongW(
-         HWND hWnd,
-         int nIndex,
-         LONG dwNewLong);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetProcessDefaultLayout(
-         DWORD *pdwDefaultLayout);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetProcessDefaultLayout(
-         DWORD dwDefaultLayout);
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetDesktopWindow(
-    void);
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetParent(
-         HWND hWnd);
-
-__declspec(dllimport)
-HWND
-__stdcall
-SetParent(
-         HWND hWndChild,
-           HWND hWndNewParent);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumChildWindows(
-           HWND hWndParent,
-         WNDENUMPROC lpEnumFunc,
-         LPARAM lParam);
-
-__declspec(dllimport)
-HWND
-__stdcall
-FindWindowA(
-           LPCSTR lpClassName,
-           LPCSTR lpWindowName);
-__declspec(dllimport)
-HWND
-__stdcall
-FindWindowW(
-           LPCWSTR lpClassName,
-           LPCWSTR lpWindowName);
-
-
-
-
-
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-FindWindowExA(
-           HWND hWndParent,
-           HWND hWndChildAfter,
-           LPCSTR lpszClass,
-           LPCSTR lpszWindow);
-__declspec(dllimport)
-HWND
-__stdcall
-FindWindowExW(
-           HWND hWndParent,
-           HWND hWndChildAfter,
-           LPCWSTR lpszClass,
-           LPCWSTR lpszWindow);
-
-
-
-
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetShellWindow(
-    void);
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-RegisterShellHookWindow(
-         HWND hwnd);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DeregisterShellHookWindow(
-         HWND hwnd);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumWindows(
-         WNDENUMPROC lpEnumFunc,
-         LPARAM lParam);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumThreadWindows(
-         DWORD dwThreadId,
-         WNDENUMPROC lpfn,
-         LPARAM lParam);
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-GetClassNameA(
-         HWND hWnd,
-           LPSTR lpClassName,
-         int nMaxCount
-    );
-__declspec(dllimport)
-int
-__stdcall
-GetClassNameW(
-         HWND hWnd,
-           LPWSTR lpClassName,
-         int nMaxCount
-    );
-
-
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetTopWindow(
-           HWND hWnd);
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetWindowThreadProcessId(
-         HWND hWnd,
-           LPDWORD lpdwProcessId);
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsGUIThread(
-         BOOL bConvert);
-
-
-
-
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetLastActivePopup(
-         HWND hWnd);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetWindow(
-         HWND hWnd,
-         UINT uCmd);
-
-
-
-
-
-
-__declspec(dllimport)
-HHOOK
-__stdcall
-SetWindowsHookA(
-         int nFilterType,
-         HOOKPROC pfnFilterProc);
-__declspec(dllimport)
-HHOOK
-__stdcall
-SetWindowsHookW(
-         int nFilterType,
-         HOOKPROC pfnFilterProc);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UnhookWindowsHook(
-         int nCode,
-         HOOKPROC pfnFilterProc);
-
-__declspec(dllimport)
-HHOOK
-__stdcall
-SetWindowsHookExA(
-         int idHook,
-         HOOKPROC lpfn,
-           HINSTANCE hmod,
-         DWORD dwThreadId);
-__declspec(dllimport)
-HHOOK
-__stdcall
-SetWindowsHookExW(
-         int idHook,
-         HOOKPROC lpfn,
-           HINSTANCE hmod,
-         DWORD dwThreadId);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UnhookWindowsHookEx(
-         HHOOK hhk);
-
-__declspec(dllimport)
-LRESULT
-__stdcall
-CallNextHookEx(
-           HHOOK hhk,
-         int nCode,
-         WPARAM wParam,
-         LPARAM lParam);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CheckMenuRadioItem(
-         HMENU hmenu,
-         UINT first,
-         UINT last,
-         UINT check,
-         UINT flags);
-
-
-
-
-
-typedef struct {
-    WORD versionNumber;
-    WORD offset;
-} MENUITEMTEMPLATEHEADER, *PMENUITEMTEMPLATEHEADER;
-
-typedef struct {        
-    WORD mtOption;
-    WORD mtID;
-    WCHAR mtString[1];
-} MENUITEMTEMPLATE, *PMENUITEMTEMPLATE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HBITMAP
-__stdcall
-LoadBitmapA(
-           HINSTANCE hInstance,
-         LPCSTR lpBitmapName);
-__declspec(dllimport)
-HBITMAP
-__stdcall
-LoadBitmapW(
-           HINSTANCE hInstance,
-         LPCWSTR lpBitmapName);
-
-
-
-
-
-
-__declspec(dllimport)
-HCURSOR
-__stdcall
-LoadCursorA(
-           HINSTANCE hInstance,
-         LPCSTR lpCursorName);
-__declspec(dllimport)
-HCURSOR
-__stdcall
-LoadCursorW(
-           HINSTANCE hInstance,
-         LPCWSTR lpCursorName);
-
-
-
-
-
-
-__declspec(dllimport)
-HCURSOR
-__stdcall
-LoadCursorFromFileA(
-         LPCSTR lpFileName);
-__declspec(dllimport)
-HCURSOR
-__stdcall
-LoadCursorFromFileW(
-         LPCWSTR lpFileName);
-
-
-
-
-
-
-__declspec(dllimport)
-HCURSOR
-__stdcall
-CreateCursor(
-           HINSTANCE hInst,
-         int xHotSpot,
-         int yHotSpot,
-         int nWidth,
-         int nHeight,
-         const void *pvANDPlane,
-         const void *pvXORPlane);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DestroyCursor(
-         HCURSOR hCursor);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetSystemCursor(
-         HCURSOR hcur,
-         DWORD id);
-
-typedef struct _ICONINFO {
-    BOOL    fIcon;
-    DWORD   xHotspot;
-    DWORD   yHotspot;
-    HBITMAP hbmMask;
-    HBITMAP hbmColor;
-} ICONINFO;
-typedef ICONINFO *PICONINFO;
-
-__declspec(dllimport)
-HICON
-__stdcall
-LoadIconA(
-           HINSTANCE hInstance,
-         LPCSTR lpIconName);
-__declspec(dllimport)
-HICON
-__stdcall
-LoadIconW(
-           HINSTANCE hInstance,
-         LPCWSTR lpIconName);
-
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-PrivateExtractIconsA(
-         LPCSTR szFileName,
-         int nIconIndex,
-         int cxIcon,
-         int cyIcon,
-             HICON *phicon,
-             UINT *piconid,
-         UINT nIcons,
-         UINT flags);
-__declspec(dllimport)
-UINT
-__stdcall
-PrivateExtractIconsW(
-         LPCWSTR szFileName,
-         int nIconIndex,
-         int cxIcon,
-         int cyIcon,
-             HICON *phicon,
-             UINT *piconid,
-         UINT nIcons,
-         UINT flags);
-
-
-
-
-
-
-__declspec(dllimport)
-HICON
-__stdcall
-CreateIcon(
-           HINSTANCE hInstance,
-         int nWidth,
-         int nHeight,
-         BYTE cPlanes,
-         BYTE cBitsPixel,
-         const BYTE *lpbANDbits,
-         const BYTE *lpbXORbits);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DestroyIcon(
-         HICON hIcon);
-
-__declspec(dllimport)
-int
-__stdcall
-LookupIconIdFromDirectory(
-         PBYTE presbits,
-         BOOL fIcon);
-
-
-__declspec(dllimport)
-int
-__stdcall
-LookupIconIdFromDirectoryEx(
-         PBYTE presbits,
-         BOOL fIcon,
-         int cxDesired,
-         int cyDesired,
-         UINT Flags);
-
-
-__declspec(dllimport)
-HICON
-__stdcall
-CreateIconFromResource(
-         PBYTE presbits,
-         DWORD dwResSize,
-         BOOL fIcon,
-         DWORD dwVer);
-
-
-__declspec(dllimport)
-HICON
-__stdcall
-CreateIconFromResourceEx(
-         PBYTE presbits,
-         DWORD dwResSize,
-         BOOL fIcon,
-         DWORD dwVer,
-         int cxDesired,
-         int cyDesired,
-         UINT Flags);
-
-
-typedef struct tagCURSORSHAPE
-{
-    int     xHotSpot;
-    int     yHotSpot;
-    int     cx;
-    int     cy;
-    int     cbWidth;
-    BYTE    Planes;
-    BYTE    BitsPixel;
-} CURSORSHAPE,  *LPCURSORSHAPE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HANDLE
-__stdcall
-LoadImageA(
-           HINSTANCE hInst,
-         LPCSTR name,
-         UINT type,
-         int cx,
-         int cy,
-         UINT fuLoad);
-__declspec(dllimport)
-HANDLE
-__stdcall
-LoadImageW(
-           HINSTANCE hInst,
-         LPCWSTR name,
-         UINT type,
-         int cx,
-         int cy,
-         UINT fuLoad);
-
-
-
-
-
-
-__declspec(dllimport)
-HANDLE
-__stdcall
-CopyImage(
-         HANDLE h,
-         UINT type,
-         int cx,
-         int cy,
-         UINT flags);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) BOOL __stdcall DrawIconEx(
-         HDC hdc,
-         int xLeft,
-         int yTop,
-         HICON hIcon,
-         int cxWidth,
-         int cyWidth,
-         UINT istepIfAniCur,
-           HBRUSH hbrFlickerFreeDraw,
-         UINT diFlags);
-
-
-
-__declspec(dllimport)
-HICON
-__stdcall
-CreateIconIndirect(
-         PICONINFO piconinfo);
-
-__declspec(dllimport)
-HICON
-__stdcall
-CopyIcon(
-         HICON hIcon);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetIconInfo(
-         HICON hIcon,
-         PICONINFO piconinfo);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-LoadStringA(
-           HINSTANCE hInstance,
-         UINT uID,
-         LPSTR lpBuffer,
-         int cchBufferMax);
-__declspec(dllimport)
-int
-__stdcall
-LoadStringW(
-           HINSTANCE hInstance,
-         UINT uID,
-         LPWSTR lpBuffer,
-         int cchBufferMax);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsDialogMessageA(
-         HWND hDlg,
-         LPMSG lpMsg);
-__declspec(dllimport)
-BOOL
-__stdcall
-IsDialogMessageW(
-         HWND hDlg,
-         LPMSG lpMsg);
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-MapDialogRect(
-         HWND hDlg,
-         LPRECT lpRect);
-
-__declspec(dllimport)
-int
-__stdcall
-DlgDirListA(
-         HWND hDlg,
-         LPSTR lpPathSpec,
-         int nIDListBox,
-         int nIDStaticPath,
-         UINT uFileType);
-__declspec(dllimport)
-int
-__stdcall
-DlgDirListW(
-         HWND hDlg,
-         LPWSTR lpPathSpec,
-         int nIDListBox,
-         int nIDStaticPath,
-         UINT uFileType);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DlgDirSelectExA(
-         HWND hwndDlg,
-         LPSTR lpString,
-         int chCount,
-         int idListBox);
-__declspec(dllimport)
-BOOL
-__stdcall
-DlgDirSelectExW(
-         HWND hwndDlg,
-         LPWSTR lpString,
-         int chCount,
-         int idListBox);
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-DlgDirListComboBoxA(
-         HWND hDlg,
-         LPSTR lpPathSpec,
-         int nIDComboBox,
-         int nIDStaticPath,
-         UINT uFiletype);
-__declspec(dllimport)
-int
-__stdcall
-DlgDirListComboBoxW(
-         HWND hDlg,
-         LPWSTR lpPathSpec,
-         int nIDComboBox,
-         int nIDStaticPath,
-         UINT uFiletype);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DlgDirSelectComboBoxExA(
-         HWND hwndDlg,
-         LPSTR lpString,
-         int cchOut,
-         int idComboBox);
-__declspec(dllimport)
-BOOL
-__stdcall
-DlgDirSelectComboBoxExW(
-         HWND hwndDlg,
-         LPWSTR lpString,
-         int cchOut,
-         int idComboBox);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagSCROLLINFO
-{
-    UINT    cbSize;
-    UINT    fMask;
-    int     nMin;
-    int     nMax;
-    UINT    nPage;
-    int     nPos;
-    int     nTrackPos;
-}   SCROLLINFO,  *LPSCROLLINFO;
-typedef SCROLLINFO const  *LPCSCROLLINFO;
-
-__declspec(dllimport)
-int
-__stdcall
-SetScrollInfo(
-         HWND hwnd,
-         int nBar,
-         LPCSCROLLINFO lpsi,
-         BOOL redraw);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetScrollInfo(
-         HWND hwnd,
-         int nBar,
-         LPSCROLLINFO lpsi);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMDICREATESTRUCTA {
-    LPCSTR   szClass;
-    LPCSTR   szTitle;
-    HANDLE hOwner;
-    int x;
-    int y;
-    int cx;
-    int cy;
-    DWORD style;
-    LPARAM lParam;        
-} MDICREATESTRUCTA, *LPMDICREATESTRUCTA;
-typedef struct tagMDICREATESTRUCTW {
-    LPCWSTR  szClass;
-    LPCWSTR  szTitle;
-    HANDLE hOwner;
-    int x;
-    int y;
-    int cx;
-    int cy;
-    DWORD style;
-    LPARAM lParam;        
-} MDICREATESTRUCTW, *LPMDICREATESTRUCTW;
-
-typedef MDICREATESTRUCTW MDICREATESTRUCT;
-typedef LPMDICREATESTRUCTW LPMDICREATESTRUCT;
-
-
-
-
-
-typedef struct tagCLIENTCREATESTRUCT {
-    HANDLE hWindowMenu;
-    UINT idFirstChild;
-} CLIENTCREATESTRUCT, *LPCLIENTCREATESTRUCT;
-
-__declspec(dllimport)
-LRESULT
-__stdcall
-DefFrameProcA(
-         HWND hWnd,
-           HWND hWndMDIClient,
-         UINT uMsg,
-         WPARAM wParam,
-         LPARAM lParam);
-__declspec(dllimport)
-LRESULT
-__stdcall
-DefFrameProcW(
-         HWND hWnd,
-           HWND hWndMDIClient,
-         UINT uMsg,
-         WPARAM wParam,
-         LPARAM lParam);
-
-
-
-
-
-
-__declspec(dllimport)
-
-LRESULT
-__stdcall
-
-
-
-
-DefMDIChildProcA(
-         HWND hWnd,
-         UINT uMsg,
-         WPARAM wParam,
-         LPARAM lParam);
-__declspec(dllimport)
-
-LRESULT
-__stdcall
-
-
-
-
-DefMDIChildProcW(
-         HWND hWnd,
-         UINT uMsg,
-         WPARAM wParam,
-         LPARAM lParam);
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-TranslateMDISysAccel(
-         HWND hWndClient,
-         LPMSG lpMsg);
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-ArrangeIconicWindows(
-         HWND hWnd);
-
-__declspec(dllimport)
-HWND
-__stdcall
-CreateMDIWindowA(
-         LPCSTR lpClassName,
-         LPCSTR lpWindowName,
-         DWORD dwStyle,
-         int X,
-         int Y,
-         int nWidth,
-         int nHeight,
-           HWND hWndParent,
-           HINSTANCE hInstance,
-         LPARAM lParam);
-__declspec(dllimport)
-HWND
-__stdcall
-CreateMDIWindowW(
-         LPCWSTR lpClassName,
-         LPCWSTR lpWindowName,
-         DWORD dwStyle,
-         int X,
-         int Y,
-         int nWidth,
-         int nHeight,
-           HWND hWndParent,
-           HINSTANCE hInstance,
-         LPARAM lParam);
-
-
-
-
-
-
-
-__declspec(dllimport) 
-WORD 
-__stdcall 
-TileWindows(
-           HWND hwndParent,
-         UINT wHow,
-           const RECT * lpRect,
-         UINT cKids,
-             const HWND  * lpKids);
-
-__declspec(dllimport)
-WORD
-__stdcall CascadeWindows(
-           HWND hwndParent,
-         UINT wHow,
-           const RECT * lpRect,
-         UINT cKids,
-             const HWND  * lpKids);
-
-
-
-
-
-
-
-
-
-
-typedef DWORD HELPPOLY;
-typedef struct tagMULTIKEYHELPA {
-
-    DWORD  mkSize;
-
-
-
-    CHAR   mkKeylist;
-    CHAR   szKeyphrase[1];
-} MULTIKEYHELPA, *PMULTIKEYHELPA, *LPMULTIKEYHELPA;
-typedef struct tagMULTIKEYHELPW {
-
-    DWORD  mkSize;
-
-
-
-    WCHAR  mkKeylist;
-    WCHAR  szKeyphrase[1];
-} MULTIKEYHELPW, *PMULTIKEYHELPW, *LPMULTIKEYHELPW;
-
-typedef MULTIKEYHELPW MULTIKEYHELP;
-typedef PMULTIKEYHELPW PMULTIKEYHELP;
-typedef LPMULTIKEYHELPW LPMULTIKEYHELP;
-
-
-
-
-
-
-typedef struct tagHELPWININFOA {
-    int  wStructSize;
-    int  x;
-    int  y;
-    int  dx;
-    int  dy;
-    int  wMax;
-    CHAR   rgchMember[2];
-} HELPWININFOA, *PHELPWININFOA, *LPHELPWININFOA;
-typedef struct tagHELPWININFOW {
-    int  wStructSize;
-    int  x;
-    int  y;
-    int  dx;
-    int  dy;
-    int  wMax;
-    WCHAR  rgchMember[2];
-} HELPWININFOW, *PHELPWININFOW, *LPHELPWININFOW;
-
-typedef HELPWININFOW HELPWININFO;
-typedef PHELPWININFOW PHELPWININFO;
-typedef LPHELPWININFOW LPHELPWININFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WinHelpA(
-           HWND hWndMain,
-           LPCSTR lpszHelp,
-         UINT uCommand,
-         ULONG_PTR dwData);
-__declspec(dllimport)
-BOOL
-__stdcall
-WinHelpW(
-           HWND hWndMain,
-           LPCWSTR lpszHelp,
-         UINT uCommand,
-         ULONG_PTR dwData);
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetGuiResources(
-         HANDLE hProcess,
-         DWORD uiFlags);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagNONCLIENTMETRICSA
-{
-    UINT    cbSize;
-    int     iBorderWidth;
-    int     iScrollWidth;
-    int     iScrollHeight;
-    int     iCaptionWidth;
-    int     iCaptionHeight;
-    LOGFONTA lfCaptionFont;
-    int     iSmCaptionWidth;
-    int     iSmCaptionHeight;
-    LOGFONTA lfSmCaptionFont;
-    int     iMenuWidth;
-    int     iMenuHeight;
-    LOGFONTA lfMenuFont;
-    LOGFONTA lfStatusFont;
-    LOGFONTA lfMessageFont;
-}   NONCLIENTMETRICSA, *PNONCLIENTMETRICSA, * LPNONCLIENTMETRICSA;
-typedef struct tagNONCLIENTMETRICSW
-{
-    UINT    cbSize;
-    int     iBorderWidth;
-    int     iScrollWidth;
-    int     iScrollHeight;
-    int     iCaptionWidth;
-    int     iCaptionHeight;
-    LOGFONTW lfCaptionFont;
-    int     iSmCaptionWidth;
-    int     iSmCaptionHeight;
-    LOGFONTW lfSmCaptionFont;
-    int     iMenuWidth;
-    int     iMenuHeight;
-    LOGFONTW lfMenuFont;
-    LOGFONTW lfStatusFont;
-    LOGFONTW lfMessageFont;
-}   NONCLIENTMETRICSW, *PNONCLIENTMETRICSW, * LPNONCLIENTMETRICSW;
-
-typedef NONCLIENTMETRICSW NONCLIENTMETRICS;
-typedef PNONCLIENTMETRICSW PNONCLIENTMETRICS;
-typedef LPNONCLIENTMETRICSW LPNONCLIENTMETRICS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMINIMIZEDMETRICS
-{
-    UINT    cbSize;
-    int     iWidth;
-    int     iHorzGap;
-    int     iVertGap;
-    int     iArrange;
-}   MINIMIZEDMETRICS, *PMINIMIZEDMETRICS, *LPMINIMIZEDMETRICS;
-
-
-
-typedef struct tagICONMETRICSA
-{
-    UINT    cbSize;
-    int     iHorzSpacing;
-    int     iVertSpacing;
-    int     iTitleWrap;
-    LOGFONTA lfFont;
-}   ICONMETRICSA, *PICONMETRICSA, *LPICONMETRICSA;
-typedef struct tagICONMETRICSW
-{
-    UINT    cbSize;
-    int     iHorzSpacing;
-    int     iVertSpacing;
-    int     iTitleWrap;
-    LOGFONTW lfFont;
-}   ICONMETRICSW, *PICONMETRICSW, *LPICONMETRICSW;
-
-typedef ICONMETRICSW ICONMETRICS;
-typedef PICONMETRICSW PICONMETRICS;
-typedef LPICONMETRICSW LPICONMETRICS;
-
-
-
-
-
-
-
-
-typedef struct tagANIMATIONINFO
-{
-    UINT    cbSize;
-    int     iMinAnimate;
-}   ANIMATIONINFO, *LPANIMATIONINFO;
-
-typedef struct tagSERIALKEYSA
-{
-    UINT    cbSize;
-    DWORD   dwFlags;
-    LPSTR     lpszActivePort;
-    LPSTR     lpszPort;
-    UINT    iBaudRate;
-    UINT    iPortState;
-    UINT    iActive;
-}   SERIALKEYSA, *LPSERIALKEYSA;
-typedef struct tagSERIALKEYSW
-{
-    UINT    cbSize;
-    DWORD   dwFlags;
-    LPWSTR    lpszActivePort;
-    LPWSTR    lpszPort;
-    UINT    iBaudRate;
-    UINT    iPortState;
-    UINT    iActive;
-}   SERIALKEYSW, *LPSERIALKEYSW;
-
-typedef SERIALKEYSW SERIALKEYS;
-typedef LPSERIALKEYSW LPSERIALKEYS;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagHIGHCONTRASTA
-{
-    UINT    cbSize;
-    DWORD   dwFlags;
-    LPSTR   lpszDefaultScheme;
-}   HIGHCONTRASTA, *LPHIGHCONTRASTA;
-typedef struct tagHIGHCONTRASTW
-{
-    UINT    cbSize;
-    DWORD   dwFlags;
-    LPWSTR  lpszDefaultScheme;
-}   HIGHCONTRASTW, *LPHIGHCONTRASTW;
-
-typedef HIGHCONTRASTW HIGHCONTRAST;
-typedef LPHIGHCONTRASTW LPHIGHCONTRAST;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-typedef struct _VIDEOPARAMETERS {
-    GUID  Guid;                         
-    ULONG dwOffset;                     
-    ULONG dwCommand;                    
-    ULONG dwFlags;                      
-    ULONG dwMode;                       
-    ULONG dwTVStandard;                 
-    ULONG dwAvailableModes;             
-    ULONG dwAvailableTVStandard;        
-    ULONG dwFlickerFilter;              
-    ULONG dwOverScanX;                  
-    ULONG dwOverScanY;                  
-    ULONG dwMaxUnscaledX;               
-    ULONG dwMaxUnscaledY;               
-    ULONG dwPositionX;                  
-    ULONG dwPositionY;                  
-    ULONG dwBrightness;                 
-    ULONG dwContrast;                   
-    ULONG dwCPType;                     
-    ULONG dwCPCommand;                  
-    ULONG dwCPStandard;                 
-    ULONG dwCPKey;
-    ULONG bCP_APSTriggerBits;           
-    UCHAR bOEMCopyProtection[256];      
-} VIDEOPARAMETERS, *PVIDEOPARAMETERS, *LPVIDEOPARAMETERS;
-
-
-                                        
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-ChangeDisplaySettingsA(
-           LPDEVMODEA lpDevMode,
-         DWORD dwFlags);
-__declspec(dllimport)
-LONG
-__stdcall
-ChangeDisplaySettingsW(
-           LPDEVMODEW lpDevMode,
-         DWORD dwFlags);
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-ChangeDisplaySettingsExA(
-           LPCSTR lpszDeviceName,
-           LPDEVMODEA lpDevMode,
-      HWND hwnd,
-         DWORD dwflags,
-           LPVOID lParam);
-__declspec(dllimport)
-LONG
-__stdcall
-ChangeDisplaySettingsExW(
-           LPCWSTR lpszDeviceName,
-           LPDEVMODEW lpDevMode,
-      HWND hwnd,
-         DWORD dwflags,
-           LPVOID lParam);
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumDisplaySettingsA(
-           LPCSTR lpszDeviceName,
-         DWORD iModeNum,
-         LPDEVMODEA lpDevMode);
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumDisplaySettingsW(
-           LPCWSTR lpszDeviceName,
-         DWORD iModeNum,
-         LPDEVMODEW lpDevMode);
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumDisplaySettingsExA(
-           LPCSTR lpszDeviceName,
-         DWORD iModeNum,
-         LPDEVMODEA lpDevMode,
-         DWORD dwFlags);
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumDisplaySettingsExW(
-           LPCWSTR lpszDeviceName,
-         DWORD iModeNum,
-         LPDEVMODEW lpDevMode,
-         DWORD dwFlags);
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumDisplayDevicesA(
-           LPCSTR lpDevice,
-         DWORD iDevNum,
-         PDISPLAY_DEVICEA lpDisplayDevice,
-         DWORD dwFlags);
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumDisplayDevicesW(
-           LPCWSTR lpDevice,
-         DWORD iDevNum,
-         PDISPLAY_DEVICEW lpDisplayDevice,
-         DWORD dwFlags);
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SystemParametersInfoA(
-         UINT uiAction,
-         UINT uiParam,
-           PVOID pvParam,
-         UINT fWinIni);
-__declspec(dllimport)
-BOOL
-__stdcall
-SystemParametersInfoW(
-         UINT uiAction,
-         UINT uiParam,
-           PVOID pvParam,
-         UINT fWinIni);
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagFILTERKEYS
-{
-    UINT  cbSize;
-    DWORD dwFlags;
-    DWORD iWaitMSec;            
-    DWORD iDelayMSec;           
-    DWORD iRepeatMSec;          
-    DWORD iBounceMSec;          
-} FILTERKEYS, *LPFILTERKEYS;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagSTICKYKEYS
-{
-    UINT  cbSize;
-    DWORD dwFlags;
-} STICKYKEYS, *LPSTICKYKEYS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMOUSEKEYS
-{
-    UINT cbSize;
-    DWORD dwFlags;
-    DWORD iMaxSpeed;
-    DWORD iTimeToMaxSpeed;
-    DWORD iCtrlSpeed;
-    DWORD dwReserved1;
-    DWORD dwReserved2;
-} MOUSEKEYS, *LPMOUSEKEYS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagACCESSTIMEOUT
-{
-    UINT  cbSize;
-    DWORD dwFlags;
-    DWORD iTimeOutMSec;
-} ACCESSTIMEOUT, *LPACCESSTIMEOUT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagSOUNDSENTRYA
-{
-    UINT cbSize;
-    DWORD dwFlags;
-    DWORD iFSTextEffect;
-    DWORD iFSTextEffectMSec;
-    DWORD iFSTextEffectColorBits;
-    DWORD iFSGrafEffect;
-    DWORD iFSGrafEffectMSec;
-    DWORD iFSGrafEffectColor;
-    DWORD iWindowsEffect;
-    DWORD iWindowsEffectMSec;
-    LPSTR   lpszWindowsEffectDLL;
-    DWORD iWindowsEffectOrdinal;
-} SOUNDSENTRYA, *LPSOUNDSENTRYA;
-typedef struct tagSOUNDSENTRYW
-{
-    UINT cbSize;
-    DWORD dwFlags;
-    DWORD iFSTextEffect;
-    DWORD iFSTextEffectMSec;
-    DWORD iFSTextEffectColorBits;
-    DWORD iFSGrafEffect;
-    DWORD iFSGrafEffectMSec;
-    DWORD iFSGrafEffectColor;
-    DWORD iWindowsEffect;
-    DWORD iWindowsEffectMSec;
-    LPWSTR  lpszWindowsEffectDLL;
-    DWORD iWindowsEffectOrdinal;
-} SOUNDSENTRYW, *LPSOUNDSENTRYW;
-
-typedef SOUNDSENTRYW SOUNDSENTRY;
-typedef LPSOUNDSENTRYW LPSOUNDSENTRY;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagTOGGLEKEYS
-{
-    UINT cbSize;
-    DWORD dwFlags;
-} TOGGLEKEYS, *LPTOGGLEKEYS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-SetDebugErrorLevel(
-         DWORD dwLevel);
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-SetLastErrorEx(
-         DWORD dwErrCode,
-         DWORD dwType);
-
-__declspec(dllimport)
-int
-__stdcall
-InternalGetWindowText(
-         HWND hWnd,
-           LPWSTR pString,
-         int cchMaxCount);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HMONITOR
-__stdcall
-MonitorFromPoint(
-         POINT pt,
-         DWORD dwFlags);
-
-__declspec(dllimport)
-HMONITOR
-__stdcall
-MonitorFromRect(
-         LPCRECT lprc,
-         DWORD dwFlags);
-
-__declspec(dllimport)
-HMONITOR
-__stdcall
-MonitorFromWindow(
-         HWND hwnd,
-         DWORD dwFlags);
-
-
-
-
-
-
-
-typedef struct tagMONITORINFO
-{
-    DWORD   cbSize;
-    RECT    rcMonitor;
-    RECT    rcWork;
-    DWORD   dwFlags;
-} MONITORINFO, *LPMONITORINFO;
-
-
-typedef struct tagMONITORINFOEXA : public tagMONITORINFO
-{
-    CHAR        szDevice[32];
-} MONITORINFOEXA, *LPMONITORINFOEXA;
-typedef struct tagMONITORINFOEXW : public tagMONITORINFO
-{
-    WCHAR       szDevice[32];
-} MONITORINFOEXW, *LPMONITORINFOEXW;
-
-typedef MONITORINFOEXW MONITORINFOEX;
-typedef LPMONITORINFOEXW LPMONITORINFOEX;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetMonitorInfoA(
-         HMONITOR hMonitor,
-         LPMONITORINFO lpmi);
-__declspec(dllimport)
-BOOL
-__stdcall
-GetMonitorInfoW(
-         HMONITOR hMonitor,
-         LPMONITORINFO lpmi);
-
-
-
-
-
-
-typedef BOOL (__stdcall* MONITORENUMPROC)(HMONITOR, HDC, LPRECT, LPARAM);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumDisplayMonitors(
-           HDC hdc,
-           LPCRECT lprcClip,
-         MONITORENUMPROC lpfnEnum,
-         LPARAM dwData);
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NotifyWinEvent(
-         DWORD event,
-         HWND  hwnd,
-         LONG  idObject,
-         LONG  idChild);
-
-typedef void (__stdcall* WINEVENTPROC)(
-    HWINEVENTHOOK hWinEventHook,
-    DWORD         event,
-    HWND          hwnd,
-    LONG          idObject,
-    LONG          idChild,
-    DWORD         idEventThread,
-    DWORD         dwmsEventTime);
-
-__declspec(dllimport)
-HWINEVENTHOOK
-__stdcall
-SetWinEventHook(
-         DWORD eventMin,
-         DWORD eventMax,
-           HMODULE hmodWinEventProc,
-         WINEVENTPROC pfnWinEventProc,
-         DWORD idProcess,
-         DWORD idThread,
-         DWORD dwFlags);
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsWinEventHookInstalled(
-         DWORD event);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UnhookWinEvent(
-         HWINEVENTHOOK hWinEventHook);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagGUITHREADINFO
-{
-    DWORD   cbSize;
-    DWORD   flags;
-    HWND    hwndActive;
-    HWND    hwndFocus;
-    HWND    hwndCapture;
-    HWND    hwndMenuOwner;
-    HWND    hwndMoveSize;
-    HWND    hwndCaret;
-    RECT    rcCaret;
-} GUITHREADINFO, *PGUITHREADINFO,  * LPGUITHREADINFO;
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetGUIThreadInfo(
-         DWORD idThread,
-         PGUITHREADINFO pgui);
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetWindowModuleFileNameA(
-         HWND hwnd,
-           LPSTR pszFileName,
-         UINT cchFileNameMax);
-__declspec(dllimport)
-UINT
-__stdcall
-GetWindowModuleFileNameW(
-         HWND hwnd,
-           LPWSTR pszFileName,
-         UINT cchFileNameMax);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagCURSORINFO
-{
-    DWORD   cbSize;
-    DWORD   flags;
-    HCURSOR hCursor;
-    POINT   ptScreenPos;
-} CURSORINFO, *PCURSORINFO, *LPCURSORINFO;
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetCursorInfo(
-         PCURSORINFO pci);
-
-
-
-
-typedef struct tagWINDOWINFO
-{
-    DWORD cbSize;
-    RECT rcWindow;
-    RECT rcClient;
-    DWORD dwStyle;
-    DWORD dwExStyle;
-    DWORD dwWindowStatus;
-    UINT cxWindowBorders;
-    UINT cyWindowBorders;
-    ATOM atomWindowType;
-    WORD wCreatorVersion;
-} WINDOWINFO, *PWINDOWINFO, *LPWINDOWINFO;
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetWindowInfo(
-         HWND hwnd,
-         PWINDOWINFO pwi);
-
-
-
-
-typedef struct tagTITLEBARINFO
-{
-    DWORD cbSize;
-    RECT rcTitleBar;
-    DWORD rgstate[5 + 1];
-} TITLEBARINFO, *PTITLEBARINFO, *LPTITLEBARINFO;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetTitleBarInfo(
-         HWND hwnd,
-         PTITLEBARINFO pti);
-
-
-
-
-typedef struct tagMENUBARINFO
-{
-    DWORD cbSize;
-    RECT rcBar;          
-    HMENU hMenu;         
-    HWND hwndMenu;       
-    BOOL fBarFocused:1;  
-    BOOL fFocused:1;     
-} MENUBARINFO, *PMENUBARINFO, *LPMENUBARINFO;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetMenuBarInfo(
-         HWND hwnd,
-         LONG idObject,
-         LONG idItem,
-         PMENUBARINFO pmbi);
-
-
-
-
-typedef struct tagSCROLLBARINFO
-{
-    DWORD cbSize;
-    RECT rcScrollBar;
-    int dxyLineButton;
-    int xyThumbTop;
-    int xyThumbBottom;
-    int reserved;
-    DWORD rgstate[5 + 1];
-} SCROLLBARINFO, *PSCROLLBARINFO, *LPSCROLLBARINFO;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetScrollBarInfo(
-         HWND hwnd,
-         LONG idObject,
-         PSCROLLBARINFO psbi);
-
-
-
-
-typedef struct tagCOMBOBOXINFO
-{
-    DWORD cbSize;
-    RECT rcItem;
-    RECT rcButton;
-    DWORD stateButton;
-    HWND hwndCombo;
-    HWND hwndItem;
-    HWND hwndList;
-} COMBOBOXINFO, *PCOMBOBOXINFO, *LPCOMBOBOXINFO;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetComboBoxInfo(
-         HWND hwndCombo,
-         PCOMBOBOXINFO pcbi);
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetAncestor(
-         HWND hwnd,
-         UINT gaFlags);
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HWND
-__stdcall
-RealChildWindowFromPoint(
-         HWND hwndParent,
-         POINT ptParentClientCoords);
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-RealGetWindowClassA(
-         HWND hwnd,
-           LPSTR ptszClassName,
-         UINT cchClassNameMax);
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-RealGetWindowClassW(
-         HWND hwnd,
-           LPWSTR ptszClassName,
-         UINT cchClassNameMax);
-
-
-
-
-
-
-
-
-
-typedef struct tagALTTABINFO
-{
-    DWORD cbSize;
-    int cItems;
-    int cColumns;
-    int cRows;
-    int iColFocus;
-    int iRowFocus;
-    int cxItem;
-    int cyItem;
-    POINT ptStart;
-} ALTTABINFO, *PALTTABINFO, *LPALTTABINFO;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetAltTabInfoA(
-           HWND hwnd,
-         int iItem,
-         PALTTABINFO pati,
-           LPSTR pszItemText,
-         UINT cchItemText);
-__declspec(dllimport)
-BOOL
-__stdcall
-GetAltTabInfoW(
-           HWND hwnd,
-         int iItem,
-         PALTTABINFO pati,
-           LPWSTR pszItemText,
-         UINT cchItemText);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetListBoxInfo(
-         HWND hwnd);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-LockWorkStation(
-    void);
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UserHandleGrantAccess(
-         HANDLE hUserHandle,
-         HANDLE hJob,
-         BOOL   bGrant);
-
-
-
-
-
-
-
-
-
-struct HRAWINPUT__ { int unused; }; typedef struct HRAWINPUT__ *HRAWINPUT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagRAWINPUTHEADER {
-    DWORD dwType;
-    DWORD dwSize;
-    HANDLE hDevice;
-    WPARAM wParam;
-} RAWINPUTHEADER, *PRAWINPUTHEADER, *LPRAWINPUTHEADER;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagRAWMOUSE {
-    
-
-
-    USHORT usFlags;
-
-    
-
-
-    union {
-        ULONG ulButtons;
-        struct  {
-            USHORT  usButtonFlags;
-            USHORT  usButtonData;
-        };
-    };
-
-
-    
-
-
-    ULONG ulRawButtons;
-
-    
-
-
-    LONG lLastX;
-
-    
-
-
-    LONG lLastY;
-
-    
-
-
-    ULONG ulExtraInformation;
-
-} RAWMOUSE, *PRAWMOUSE, *LPRAWMOUSE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagRAWKEYBOARD {
-    
-
-
-    USHORT MakeCode;
-
-    
-
-
-
-    USHORT Flags;
-
-    USHORT Reserved;
-
-    
-
-
-    USHORT VKey;
-    UINT   Message;
-
-    
-
-
-    ULONG ExtraInformation;
-
-
-} RAWKEYBOARD, *PRAWKEYBOARD, *LPRAWKEYBOARD;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagRAWHID {
-    DWORD dwSizeHid;    
-    DWORD dwCount;      
-    BYTE bRawData[1];
-} RAWHID, *PRAWHID, *LPRAWHID;
-
-
-
-
-typedef struct tagRAWINPUT {
-    RAWINPUTHEADER header;
-    union {
-        RAWMOUSE    mouse;
-        RAWKEYBOARD keyboard;
-        RAWHID      hid;
-    } data;
-} RAWINPUT, *PRAWINPUT, *LPRAWINPUT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetRawInputData(
-         HRAWINPUT hRawInput,
-         UINT uiCommand,
-             LPVOID pData,
-         PUINT pcbSize,
-         UINT cbSizeHeader);
-
-
-
-
-
-
-
-
-typedef struct tagRID_DEVICE_INFO_MOUSE {
-    DWORD dwId;
-    DWORD dwNumberOfButtons;
-    DWORD dwSampleRate;
-} RID_DEVICE_INFO_MOUSE, *PRID_DEVICE_INFO_MOUSE;
-
-typedef struct tagRID_DEVICE_INFO_KEYBOARD {
-    DWORD dwType;
-    DWORD dwSubType;
-    DWORD dwKeyboardMode;
-    DWORD dwNumberOfFunctionKeys;
-    DWORD dwNumberOfIndicators;
-    DWORD dwNumberOfKeysTotal;
-} RID_DEVICE_INFO_KEYBOARD, *PRID_DEVICE_INFO_KEYBOARD;
-
-typedef struct tagRID_DEVICE_INFO_HID {
-    DWORD dwVendorId;
-    DWORD dwProductId;
-    DWORD dwVersionNumber;
-
-    
-
-
-    USHORT usUsagePage;
-    USHORT usUsage;
-} RID_DEVICE_INFO_HID, *PRID_DEVICE_INFO_HID;
-
-typedef struct tagRID_DEVICE_INFO {
-    DWORD cbSize;
-    DWORD dwType;
-    union {
-        RID_DEVICE_INFO_MOUSE mouse;
-        RID_DEVICE_INFO_KEYBOARD keyboard;
-        RID_DEVICE_INFO_HID hid;
-    };
-} RID_DEVICE_INFO, *PRID_DEVICE_INFO, *LPRID_DEVICE_INFO;
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetRawInputDeviceInfoA(
-           HANDLE hDevice,
-         UINT uiCommand,
-                 LPVOID pData,
-         PUINT pcbSize);
-__declspec(dllimport)
-UINT
-__stdcall
-GetRawInputDeviceInfoW(
-           HANDLE hDevice,
-         UINT uiCommand,
-                 LPVOID pData,
-         PUINT pcbSize);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetRawInputBuffer(
-           PRAWINPUT pData,
-         PUINT pcbSize,
-         UINT cbSizeHeader);
-
-
-
-
-typedef struct tagRAWINPUTDEVICE {
-    USHORT usUsagePage; 
-    USHORT usUsage;     
-    DWORD dwFlags;
-    HWND hwndTarget;    
-} RAWINPUTDEVICE, *PRAWINPUTDEVICE, *LPRAWINPUTDEVICE;
-
-typedef const RAWINPUTDEVICE* PCRAWINPUTDEVICE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-RegisterRawInputDevices(
-           PCRAWINPUTDEVICE pRawInputDevices,
-         UINT uiNumDevices,
-         UINT cbSize);
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetRegisteredRawInputDevices(
-           PRAWINPUTDEVICE pRawInputDevices,
-         PUINT puiNumDevices,
-         UINT cbSize);
-
-
-typedef struct tagRAWINPUTDEVICELIST {
-    HANDLE hDevice;
-    DWORD dwType;
-} RAWINPUTDEVICELIST, *PRAWINPUTDEVICELIST;
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetRawInputDeviceList(
-           PRAWINPUTDEVICELIST pRawInputDeviceList,
-         PUINT puiNumDevices,
-         UINT cbSize);
-
-__declspec(dllimport)
-LRESULT
-__stdcall
-DefRawInputProc(
-           PRAWINPUT* paRawInput,
-         INT nInput,
-         UINT cbSizeHeader);
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef DWORD LGRPID;
-
-
-
-
-
-typedef DWORD LCTYPE;
-
-
-
-
-
-typedef DWORD CALTYPE;
-
-
-
-
-
-typedef DWORD CALID;
-
-
-
-
-
-
-typedef struct _cpinfo {
-    UINT    MaxCharSize;                    
-    BYTE    DefaultChar[2];   
-    BYTE    LeadByte[12];        
-} CPINFO, *LPCPINFO;
-
-typedef struct _cpinfoexA {
-    UINT    MaxCharSize;                    
-    BYTE    DefaultChar[2];   
-    BYTE    LeadByte[12];        
-    WCHAR   UnicodeDefaultChar;             
-    UINT    CodePage;                       
-    CHAR    CodePageName[260];         
-} CPINFOEXA, *LPCPINFOEXA;
-typedef struct _cpinfoexW {
-    UINT    MaxCharSize;                    
-    BYTE    DefaultChar[2];   
-    BYTE    LeadByte[12];        
-    WCHAR   UnicodeDefaultChar;             
-    UINT    CodePage;                       
-    WCHAR   CodePageName[260];         
-} CPINFOEXW, *LPCPINFOEXW;
-
-typedef CPINFOEXW CPINFOEX;
-typedef LPCPINFOEXW LPCPINFOEX;
-
-
-
-
-
-
-
-
-
-
-typedef struct _numberfmtA {
-    UINT    NumDigits;                 
-    UINT    LeadingZero;               
-    UINT    Grouping;                  
-    LPSTR   lpDecimalSep;              
-    LPSTR   lpThousandSep;             
-    UINT    NegativeOrder;             
-} NUMBERFMTA, *LPNUMBERFMTA;
-typedef struct _numberfmtW {
-    UINT    NumDigits;                 
-    UINT    LeadingZero;               
-    UINT    Grouping;                  
-    LPWSTR  lpDecimalSep;              
-    LPWSTR  lpThousandSep;             
-    UINT    NegativeOrder;             
-} NUMBERFMTW, *LPNUMBERFMTW;
-
-typedef NUMBERFMTW NUMBERFMT;
-typedef LPNUMBERFMTW LPNUMBERFMT;
-
-
-
-
-
-
-
-
-
-
-typedef struct _currencyfmtA {
-    UINT    NumDigits;                 
-    UINT    LeadingZero;               
-    UINT    Grouping;                  
-    LPSTR   lpDecimalSep;              
-    LPSTR   lpThousandSep;             
-    UINT    NegativeOrder;             
-    UINT    PositiveOrder;             
-    LPSTR   lpCurrencySymbol;          
-} CURRENCYFMTA, *LPCURRENCYFMTA;
-typedef struct _currencyfmtW {
-    UINT    NumDigits;                 
-    UINT    LeadingZero;               
-    UINT    Grouping;                  
-    LPWSTR  lpDecimalSep;              
-    LPWSTR  lpThousandSep;             
-    UINT    NegativeOrder;             
-    UINT    PositiveOrder;             
-    LPWSTR  lpCurrencySymbol;          
-} CURRENCYFMTW, *LPCURRENCYFMTW;
-
-typedef CURRENCYFMTW CURRENCYFMT;
-typedef LPCURRENCYFMTW LPCURRENCYFMT;
-
-
-
-
-
-
-
-
-
-enum SYSNLS_FUNCTION{
-    COMPARE_STRING    =  0x0001,
-};
-typedef DWORD NLS_FUNCTION;
-
-
-
-
-
-
-typedef struct _nlsversioninfo{ 
-    DWORD dwNLSVersionInfoSize; 
-    DWORD dwNLSVersion; 
-    DWORD dwDefinedVersion; 
-} NLSVERSIONINFO, *LPNLSVERSIONINFO; 
-
-
-
-
-
-
-typedef LONG    GEOID;
-typedef DWORD   GEOTYPE;
-typedef DWORD   GEOCLASS;
-
-
-
-
-
-
-
-enum SYSGEOTYPE {
-    GEO_NATION      =       0x0001,
-    GEO_LATITUDE    =       0x0002,
-    GEO_LONGITUDE   =       0x0003,
-    GEO_ISO2        =       0x0004,
-    GEO_ISO3        =       0x0005,
-    GEO_RFC1766     =       0x0006,
-    GEO_LCID        =       0x0007,
-    GEO_FRIENDLYNAME=       0x0008,
-    GEO_OFFICIALNAME=       0x0009,
-    GEO_TIMEZONES   =       0x000A,
-    GEO_OFFICIALLANGUAGES = 0x000B,
-};
-
-
-
-
-
-enum SYSGEOCLASS {
-    GEOCLASS_NATION  = 16,
-    GEOCLASS_REGION  = 14,
-};
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall* LANGUAGEGROUP_ENUMPROCA)(LGRPID, LPSTR, LPSTR, DWORD, LONG_PTR);
-typedef BOOL (__stdcall* LANGGROUPLOCALE_ENUMPROCA)(LGRPID, LCID, LPSTR, LONG_PTR);
-typedef BOOL (__stdcall* UILANGUAGE_ENUMPROCA)(LPSTR, LONG_PTR);
-typedef BOOL (__stdcall* LOCALE_ENUMPROCA)(LPSTR);
-typedef BOOL (__stdcall* CODEPAGE_ENUMPROCA)(LPSTR);
-typedef BOOL (__stdcall* DATEFMT_ENUMPROCA)(LPSTR);
-typedef BOOL (__stdcall* DATEFMT_ENUMPROCEXA)(LPSTR, CALID);
-typedef BOOL (__stdcall* TIMEFMT_ENUMPROCA)(LPSTR);
-typedef BOOL (__stdcall* CALINFO_ENUMPROCA)(LPSTR);
-typedef BOOL (__stdcall* CALINFO_ENUMPROCEXA)(LPSTR, CALID);
-
-typedef BOOL (__stdcall* LANGUAGEGROUP_ENUMPROCW)(LGRPID, LPWSTR, LPWSTR, DWORD, LONG_PTR);
-typedef BOOL (__stdcall* LANGGROUPLOCALE_ENUMPROCW)(LGRPID, LCID, LPWSTR, LONG_PTR);
-typedef BOOL (__stdcall* UILANGUAGE_ENUMPROCW)(LPWSTR, LONG_PTR);
-typedef BOOL (__stdcall* LOCALE_ENUMPROCW)(LPWSTR);
-typedef BOOL (__stdcall* CODEPAGE_ENUMPROCW)(LPWSTR);
-typedef BOOL (__stdcall* DATEFMT_ENUMPROCW)(LPWSTR);
-typedef BOOL (__stdcall* DATEFMT_ENUMPROCEXW)(LPWSTR, CALID);
-typedef BOOL (__stdcall* TIMEFMT_ENUMPROCW)(LPWSTR);
-typedef BOOL (__stdcall* CALINFO_ENUMPROCW)(LPWSTR);
-typedef BOOL (__stdcall* CALINFO_ENUMPROCEXW)(LPWSTR, CALID);
-typedef BOOL (__stdcall* GEO_ENUMPROC)(GEOID);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsValidCodePage(
-         UINT  CodePage);
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetACP(void);
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetOEMCP(void);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetCPInfo(
-         UINT       CodePage,
-         LPCPINFO  lpCPInfo);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetCPInfoExA(
-         UINT          CodePage,
-         DWORD         dwFlags,
-         LPCPINFOEXA  lpCPInfoEx);
-__declspec(dllimport)
-BOOL
-__stdcall
-GetCPInfoExW(
-         UINT          CodePage,
-         DWORD         dwFlags,
-         LPCPINFOEXW  lpCPInfoEx);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsDBCSLeadByte(
-         BYTE  TestChar);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsDBCSLeadByteEx(
-         UINT  CodePage,
-         BYTE  TestChar);
-
-__declspec(dllimport)
-int
-__stdcall
-MultiByteToWideChar(
-         UINT     CodePage,
-         DWORD    dwFlags,
-         LPCSTR   lpMultiByteStr,
-         int      cbMultiByte,
-           LPWSTR  lpWideCharStr,
-         int      cchWideChar);
-
-__declspec(dllimport)
-int
-__stdcall
-WideCharToMultiByte(
-         UINT     CodePage,
-         DWORD    dwFlags,
-           LPCWSTR  lpWideCharStr,
-         int      cchWideChar,
-           LPSTR   lpMultiByteStr,
-         int      cbMultiByte,
-           LPCSTR   lpDefaultChar,
-           LPBOOL  lpUsedDefaultChar);
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-CompareStringA(
-         LCID     Locale,
-         DWORD    dwCmpFlags,
-         LPCSTR  lpString1,
-         int      cchCount1,
-         LPCSTR  lpString2,
-         int      cchCount2);
-__declspec(dllimport)
-int
-__stdcall
-CompareStringW(
-         LCID     Locale,
-         DWORD    dwCmpFlags,
-         LPCWSTR  lpString1,
-         int      cchCount1,
-         LPCWSTR  lpString2,
-         int      cchCount2);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-LCMapStringA(
-         LCID     Locale,
-         DWORD    dwMapFlags,
-         LPCSTR  lpSrcStr,
-         int      cchSrc,
-           LPSTR  lpDestStr,
-         int      cchDest);
-__declspec(dllimport)
-int
-__stdcall
-LCMapStringW(
-         LCID     Locale,
-         DWORD    dwMapFlags,
-         LPCWSTR  lpSrcStr,
-         int      cchSrc,
-           LPWSTR  lpDestStr,
-         int      cchDest);
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-GetLocaleInfoA(
-         LCID     Locale,
-         LCTYPE   LCType,
-           LPSTR  lpLCData,
-         int      cchData);
-__declspec(dllimport)
-int
-__stdcall
-GetLocaleInfoW(
-         LCID     Locale,
-         LCTYPE   LCType,
-           LPWSTR  lpLCData,
-         int      cchData);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetLocaleInfoA(
-         LCID     Locale,
-         LCTYPE   LCType,
-         LPCSTR  lpLCData);
-__declspec(dllimport)
-BOOL
-__stdcall
-SetLocaleInfoW(
-         LCID     Locale,
-         LCTYPE   LCType,
-         LPCWSTR  lpLCData);
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-GetCalendarInfoA(
-         LCID     Locale,
-         CALID    Calendar,
-         CALTYPE  CalType,
-           LPSTR   lpCalData,
-         int      cchData,
-           LPDWORD  lpValue);
-__declspec(dllimport)
-int
-__stdcall
-GetCalendarInfoW(
-         LCID     Locale,
-         CALID    Calendar,
-         CALTYPE  CalType,
-           LPWSTR   lpCalData,
-         int      cchData,
-           LPDWORD  lpValue);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetCalendarInfoA(
-         LCID     Locale,
-         CALID    Calendar,
-         CALTYPE  CalType,
-         LPCSTR  lpCalData);
-__declspec(dllimport)
-BOOL
-__stdcall
-SetCalendarInfoW(
-         LCID     Locale,
-         CALID    Calendar,
-         CALTYPE  CalType,
-         LPCWSTR  lpCalData);
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-GetTimeFormatA(
-         LCID             Locale,
-         DWORD            dwFlags,
-           const SYSTEMTIME *lpTime,
-           LPCSTR          lpFormat,
-           LPSTR          lpTimeStr,
-         int              cchTime);
-__declspec(dllimport)
-int
-__stdcall
-GetTimeFormatW(
-         LCID             Locale,
-         DWORD            dwFlags,
-           const SYSTEMTIME *lpTime,
-           LPCWSTR          lpFormat,
-           LPWSTR          lpTimeStr,
-         int              cchTime);
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-GetDateFormatA(
-         LCID             Locale,
-         DWORD            dwFlags,
-           const SYSTEMTIME *lpDate,
-           LPCSTR          lpFormat,
-           LPSTR          lpDateStr,
-         int              cchDate);
-__declspec(dllimport)
-int
-__stdcall
-GetDateFormatW(
-         LCID             Locale,
-         DWORD            dwFlags,
-           const SYSTEMTIME *lpDate,
-           LPCWSTR          lpFormat,
-           LPWSTR          lpDateStr,
-         int              cchDate);
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-GetNumberFormatA(
-         LCID             Locale,
-         DWORD            dwFlags,
-         LPCSTR          lpValue,
-           const NUMBERFMTA *lpFormat,
-           LPSTR          lpNumberStr,
-         int              cchNumber);
-__declspec(dllimport)
-int
-__stdcall
-GetNumberFormatW(
-         LCID             Locale,
-         DWORD            dwFlags,
-         LPCWSTR          lpValue,
-           const NUMBERFMTW *lpFormat,
-           LPWSTR          lpNumberStr,
-         int              cchNumber);
-
-
-
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-GetCurrencyFormatA(
-         LCID               Locale,
-         DWORD              dwFlags,
-         LPCSTR            lpValue,
-           const CURRENCYFMTA *lpFormat,
-           LPSTR            lpCurrencyStr,
-         int                cchCurrency);
-__declspec(dllimport)
-int
-__stdcall
-GetCurrencyFormatW(
-         LCID               Locale,
-         DWORD              dwFlags,
-         LPCWSTR            lpValue,
-           const CURRENCYFMTW *lpFormat,
-           LPWSTR            lpCurrencyStr,
-         int                cchCurrency);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumCalendarInfoA(
-         CALINFO_ENUMPROCA lpCalInfoEnumProc,
-         LCID              Locale,
-         CALID             Calendar,
-         CALTYPE           CalType);
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumCalendarInfoW(
-         CALINFO_ENUMPROCW lpCalInfoEnumProc,
-         LCID              Locale,
-         CALID             Calendar,
-         CALTYPE           CalType);
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumCalendarInfoExA(
-         CALINFO_ENUMPROCEXA lpCalInfoEnumProcEx,
-         LCID                Locale,
-         CALID               Calendar,
-         CALTYPE             CalType);
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumCalendarInfoExW(
-         CALINFO_ENUMPROCEXW lpCalInfoEnumProcEx,
-         LCID                Locale,
-         CALID               Calendar,
-         CALTYPE             CalType);
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumTimeFormatsA(
-         TIMEFMT_ENUMPROCA lpTimeFmtEnumProc,
-         LCID              Locale,
-         DWORD             dwFlags);
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumTimeFormatsW(
-         TIMEFMT_ENUMPROCW lpTimeFmtEnumProc,
-         LCID              Locale,
-         DWORD             dwFlags);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumDateFormatsA(
-         DATEFMT_ENUMPROCA lpDateFmtEnumProc,
-         LCID              Locale,
-         DWORD             dwFlags);
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumDateFormatsW(
-         DATEFMT_ENUMPROCW lpDateFmtEnumProc,
-         LCID              Locale,
-         DWORD             dwFlags);
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumDateFormatsExA(
-         DATEFMT_ENUMPROCEXA lpDateFmtEnumProcEx,
-         LCID                Locale,
-         DWORD               dwFlags);
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumDateFormatsExW(
-         DATEFMT_ENUMPROCEXW lpDateFmtEnumProcEx,
-         LCID                Locale,
-         DWORD               dwFlags);
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsValidLanguageGroup(
-         LGRPID  LanguageGroup,
-         DWORD   dwFlags);
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetNLSVersion(
-         NLS_FUNCTION     Function,
-         LCID             Locale,
-         LPNLSVERSIONINFO lpVersionInformation);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsNLSDefinedString(
-         NLS_FUNCTION     Function,
-         DWORD            dwFlags,
-         LPNLSVERSIONINFO lpVersionInformation,
-         LPCWSTR          lpString,
-         INT              cchStr);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-IsValidLocale(
-         LCID   Locale,
-         DWORD  dwFlags);
-
-__declspec(dllimport)
-int
-__stdcall
-GetGeoInfoA(
-         GEOID       Location,
-         GEOTYPE     GeoType,
-           LPSTR     lpGeoData,
-         int         cchData,
-         LANGID      LangId);
-__declspec(dllimport)
-int
-__stdcall
-GetGeoInfoW(
-         GEOID       Location,
-         GEOTYPE     GeoType,
-           LPWSTR     lpGeoData,
-         int         cchData,
-         LANGID      LangId);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumSystemGeoID(
-         GEOCLASS        GeoClass,
-         GEOID           ParentGeoId,
-         GEO_ENUMPROC    lpGeoEnumProc);
-
-__declspec(dllimport)
-GEOID
-__stdcall
-GetUserGeoID(
-         GEOCLASS    GeoClass);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetUserGeoID(
-         GEOID       GeoId);
-
-__declspec(dllimport)
-LCID
-__stdcall
-ConvertDefaultLocale(
-         LCID   Locale);
-
-__declspec(dllimport)
-LCID
-__stdcall
-GetThreadLocale(void);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetThreadLocale(
-         LCID  Locale
-    );
-
-
-__declspec(dllimport)
-LANGID
-__stdcall
-GetSystemDefaultUILanguage(void);
-
-__declspec(dllimport)
-LANGID
-__stdcall
-GetUserDefaultUILanguage(void);
-
-
-__declspec(dllimport)
-LANGID
-__stdcall
-GetSystemDefaultLangID(void);
-
-__declspec(dllimport)
-LANGID
-__stdcall
-GetUserDefaultLangID(void);
-
-__declspec(dllimport)
-LCID
-__stdcall
-GetSystemDefaultLCID(void);
-
-__declspec(dllimport)
-LCID
-__stdcall
-GetUserDefaultLCID(void);
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetStringTypeExA(
-         LCID     Locale,
-         DWORD    dwInfoType,
-         LPCSTR  lpSrcStr,
-         int      cchSrc,
-         LPWORD  lpCharType);
-__declspec(dllimport)
-BOOL
-__stdcall
-GetStringTypeExW(
-         LCID     Locale,
-         DWORD    dwInfoType,
-         LPCWSTR  lpSrcStr,
-         int      cchSrc,
-         LPWORD  lpCharType);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetStringTypeA(
-         LCID     Locale,
-         DWORD    dwInfoType,
-         LPCSTR   lpSrcStr,
-         int      cchSrc,
-         LPWORD  lpCharType);
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetStringTypeW(
-         DWORD    dwInfoType,
-         LPCWSTR  lpSrcStr,
-         int      cchSrc,
-         LPWORD  lpCharType);
-
-
-__declspec(dllimport)
-int
-__stdcall
-FoldStringA(
-         DWORD    dwMapFlags,
-         LPCSTR  lpSrcStr,
-         int      cchSrc,
-           LPSTR  lpDestStr,
-         int      cchDest);
-__declspec(dllimport)
-int
-__stdcall
-FoldStringW(
-         DWORD    dwMapFlags,
-         LPCWSTR  lpSrcStr,
-         int      cchSrc,
-           LPWSTR  lpDestStr,
-         int      cchDest);
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumSystemLanguageGroupsA(
-         LANGUAGEGROUP_ENUMPROCA lpLanguageGroupEnumProc,
-         DWORD                   dwFlags,
-         LONG_PTR                lParam);
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumSystemLanguageGroupsW(
-         LANGUAGEGROUP_ENUMPROCW lpLanguageGroupEnumProc,
-         DWORD                   dwFlags,
-         LONG_PTR                lParam);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumLanguageGroupLocalesA(
-         LANGGROUPLOCALE_ENUMPROCA lpLangGroupLocaleEnumProc,
-         LGRPID                    LanguageGroup,
-         DWORD                     dwFlags,
-         LONG_PTR                  lParam);
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumLanguageGroupLocalesW(
-         LANGGROUPLOCALE_ENUMPROCW lpLangGroupLocaleEnumProc,
-         LGRPID                    LanguageGroup,
-         DWORD                     dwFlags,
-         LONG_PTR                  lParam);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumUILanguagesA(
-         UILANGUAGE_ENUMPROCA lpUILanguageEnumProc,
-         DWORD                dwFlags,
-         LONG_PTR             lParam);
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumUILanguagesW(
-         UILANGUAGE_ENUMPROCW lpUILanguageEnumProc,
-         DWORD                dwFlags,
-         LONG_PTR             lParam);
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumSystemLocalesA(
-         LOCALE_ENUMPROCA lpLocaleEnumProc,
-         DWORD            dwFlags);
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumSystemLocalesW(
-         LOCALE_ENUMPROCW lpLocaleEnumProc,
-         DWORD            dwFlags);
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumSystemCodePagesA(
-         CODEPAGE_ENUMPROCA lpCodePageEnumProc,
-         DWORD              dwFlags);
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumSystemCodePagesW(
-         CODEPAGE_ENUMPROCW lpCodePageEnumProc,
-         DWORD              dwFlags);
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-typedef struct _COORD {
-    SHORT X;
-    SHORT Y;
-} COORD, *PCOORD;
-
-typedef struct _SMALL_RECT {
-    SHORT Left;
-    SHORT Top;
-    SHORT Right;
-    SHORT Bottom;
-} SMALL_RECT, *PSMALL_RECT;
-
-typedef struct _KEY_EVENT_RECORD {
-    BOOL bKeyDown;
-    WORD wRepeatCount;
-    WORD wVirtualKeyCode;
-    WORD wVirtualScanCode;
-    union {
-        WCHAR UnicodeChar;
-        CHAR   AsciiChar;
-    } uChar;
-    DWORD dwControlKeyState;
-} KEY_EVENT_RECORD, *PKEY_EVENT_RECORD;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _MOUSE_EVENT_RECORD {
-    COORD dwMousePosition;
-    DWORD dwButtonState;
-    DWORD dwControlKeyState;
-    DWORD dwEventFlags;
-} MOUSE_EVENT_RECORD, *PMOUSE_EVENT_RECORD;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _WINDOW_BUFFER_SIZE_RECORD {
-    COORD dwSize;
-} WINDOW_BUFFER_SIZE_RECORD, *PWINDOW_BUFFER_SIZE_RECORD;
-
-typedef struct _MENU_EVENT_RECORD {
-    UINT dwCommandId;
-} MENU_EVENT_RECORD, *PMENU_EVENT_RECORD;
-
-typedef struct _FOCUS_EVENT_RECORD {
-    BOOL bSetFocus;
-} FOCUS_EVENT_RECORD, *PFOCUS_EVENT_RECORD;
-
-typedef struct _INPUT_RECORD {
-    WORD EventType;
-    union {
-        KEY_EVENT_RECORD KeyEvent;
-        MOUSE_EVENT_RECORD MouseEvent;
-        WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;
-        MENU_EVENT_RECORD MenuEvent;
-        FOCUS_EVENT_RECORD FocusEvent;
-    } Event;
-} INPUT_RECORD, *PINPUT_RECORD;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CHAR_INFO {
-    union {
-        WCHAR UnicodeChar;
-        CHAR   AsciiChar;
-    } Char;
-    WORD Attributes;
-} CHAR_INFO, *PCHAR_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CONSOLE_SCREEN_BUFFER_INFO {
-    COORD dwSize;
-    COORD dwCursorPosition;
-    WORD  wAttributes;
-    SMALL_RECT srWindow;
-    COORD dwMaximumWindowSize;
-} CONSOLE_SCREEN_BUFFER_INFO, *PCONSOLE_SCREEN_BUFFER_INFO;
-
-typedef struct _CONSOLE_CURSOR_INFO {
-    DWORD  dwSize;
-    BOOL   bVisible;
-} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
-
-typedef struct _CONSOLE_FONT_INFO {
-    DWORD  nFont;
-    COORD  dwFontSize;
-} CONSOLE_FONT_INFO, *PCONSOLE_FONT_INFO;
-
-
-typedef struct _CONSOLE_SELECTION_INFO {
-    DWORD dwFlags;
-    COORD dwSelectionAnchor;
-    SMALL_RECT srSelection;
-} CONSOLE_SELECTION_INFO, *PCONSOLE_SELECTION_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef
-BOOL
-(__stdcall *PHANDLER_ROUTINE)(
-    DWORD CtrlType
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-PeekConsoleInputA(
-     HANDLE hConsoleInput,
-     PINPUT_RECORD lpBuffer,
-     DWORD nLength,
-     LPDWORD lpNumberOfEventsRead
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-PeekConsoleInputW(
-     HANDLE hConsoleInput,
-     PINPUT_RECORD lpBuffer,
-     DWORD nLength,
-     LPDWORD lpNumberOfEventsRead
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReadConsoleInputA(
-     HANDLE hConsoleInput,
-     PINPUT_RECORD lpBuffer,
-     DWORD nLength,
-     LPDWORD lpNumberOfEventsRead
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-ReadConsoleInputW(
-     HANDLE hConsoleInput,
-     PINPUT_RECORD lpBuffer,
-     DWORD nLength,
-     LPDWORD lpNumberOfEventsRead
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteConsoleInputA(
-     HANDLE hConsoleInput,
-     const INPUT_RECORD *lpBuffer,
-     DWORD nLength,
-     LPDWORD lpNumberOfEventsWritten
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteConsoleInputW(
-     HANDLE hConsoleInput,
-     const INPUT_RECORD *lpBuffer,
-     DWORD nLength,
-     LPDWORD lpNumberOfEventsWritten
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReadConsoleOutputA(
-     HANDLE hConsoleOutput,
-     PCHAR_INFO lpBuffer,
-     COORD dwBufferSize,
-     COORD dwBufferCoord,
-      PSMALL_RECT lpReadRegion
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-ReadConsoleOutputW(
-     HANDLE hConsoleOutput,
-     PCHAR_INFO lpBuffer,
-     COORD dwBufferSize,
-     COORD dwBufferCoord,
-      PSMALL_RECT lpReadRegion
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteConsoleOutputA(
-     HANDLE hConsoleOutput,
-     const CHAR_INFO *lpBuffer,
-     COORD dwBufferSize,
-     COORD dwBufferCoord,
-      PSMALL_RECT lpWriteRegion
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteConsoleOutputW(
-     HANDLE hConsoleOutput,
-     const CHAR_INFO *lpBuffer,
-     COORD dwBufferSize,
-     COORD dwBufferCoord,
-      PSMALL_RECT lpWriteRegion
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReadConsoleOutputCharacterA(
-     HANDLE hConsoleOutput,
-     LPSTR lpCharacter,
-      DWORD nLength,
-     COORD dwReadCoord,
-     LPDWORD lpNumberOfCharsRead
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-ReadConsoleOutputCharacterW(
-     HANDLE hConsoleOutput,
-     LPWSTR lpCharacter,
-      DWORD nLength,
-     COORD dwReadCoord,
-     LPDWORD lpNumberOfCharsRead
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReadConsoleOutputAttribute(
-     HANDLE hConsoleOutput,
-     LPWORD lpAttribute,
-     DWORD nLength,
-     COORD dwReadCoord,
-     LPDWORD lpNumberOfAttrsRead
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteConsoleOutputCharacterA(
-     HANDLE hConsoleOutput,
-     LPCSTR lpCharacter,
-     DWORD nLength,
-     COORD dwWriteCoord,
-     LPDWORD lpNumberOfCharsWritten
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteConsoleOutputCharacterW(
-     HANDLE hConsoleOutput,
-     LPCWSTR lpCharacter,
-     DWORD nLength,
-     COORD dwWriteCoord,
-     LPDWORD lpNumberOfCharsWritten
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteConsoleOutputAttribute(
-     HANDLE hConsoleOutput,
-     const WORD *lpAttribute,
-     DWORD nLength,
-     COORD dwWriteCoord,
-     LPDWORD lpNumberOfAttrsWritten
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FillConsoleOutputCharacterA(
-     HANDLE hConsoleOutput,
-     CHAR  cCharacter,
-     DWORD  nLength,
-     COORD  dwWriteCoord,
-     LPDWORD lpNumberOfCharsWritten
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-FillConsoleOutputCharacterW(
-     HANDLE hConsoleOutput,
-     WCHAR  cCharacter,
-     DWORD  nLength,
-     COORD  dwWriteCoord,
-     LPDWORD lpNumberOfCharsWritten
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FillConsoleOutputAttribute(
-     HANDLE hConsoleOutput,
-     WORD   wAttribute,
-     DWORD  nLength,
-     COORD  dwWriteCoord,
-     LPDWORD lpNumberOfAttrsWritten
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetConsoleMode(
-     HANDLE hConsoleHandle,
-     LPDWORD lpMode
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetNumberOfConsoleInputEvents(
-     HANDLE hConsoleInput,
-     LPDWORD lpNumberOfEvents
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetConsoleScreenBufferInfo(
-     HANDLE hConsoleOutput,
-     PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
-    );
-
-__declspec(dllimport)
-COORD
-__stdcall
-GetLargestConsoleWindowSize(
-     HANDLE hConsoleOutput
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetConsoleCursorInfo(
-     HANDLE hConsoleOutput,
-     PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
-    );
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetCurrentConsoleFont(
-     HANDLE hConsoleOutput,
-     BOOL bMaximumWindow,
-     PCONSOLE_FONT_INFO lpConsoleCurrentFont
-    );
-
-__declspec(dllimport)
-COORD
-__stdcall
-GetConsoleFontSize(
-     HANDLE hConsoleOutput,
-     DWORD nFont
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetConsoleSelectionInfo(
-     PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo
-    );
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetNumberOfConsoleMouseButtons(
-     LPDWORD lpNumberOfMouseButtons
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetConsoleMode(
-     HANDLE hConsoleHandle,
-     DWORD dwMode
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetConsoleActiveScreenBuffer(
-     HANDLE hConsoleOutput
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FlushConsoleInputBuffer(
-     HANDLE hConsoleInput
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetConsoleScreenBufferSize(
-     HANDLE hConsoleOutput,
-     COORD dwSize
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetConsoleCursorPosition(
-     HANDLE hConsoleOutput,
-     COORD dwCursorPosition
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetConsoleCursorInfo(
-     HANDLE hConsoleOutput,
-     const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ScrollConsoleScreenBufferA(
-     HANDLE hConsoleOutput,
-     const SMALL_RECT *lpScrollRectangle,
-     const SMALL_RECT *lpClipRectangle,
-     COORD dwDestinationOrigin,
-     const CHAR_INFO *lpFill
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-ScrollConsoleScreenBufferW(
-     HANDLE hConsoleOutput,
-     const SMALL_RECT *lpScrollRectangle,
-     const SMALL_RECT *lpClipRectangle,
-     COORD dwDestinationOrigin,
-     const CHAR_INFO *lpFill
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetConsoleWindowInfo(
-     HANDLE hConsoleOutput,
-     BOOL bAbsolute,
-     const SMALL_RECT *lpConsoleWindow
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetConsoleTextAttribute(
-     HANDLE hConsoleOutput,
-     WORD wAttributes
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetConsoleCtrlHandler(
-     PHANDLER_ROUTINE HandlerRoutine,
-     BOOL Add
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GenerateConsoleCtrlEvent(
-     DWORD dwCtrlEvent,
-     DWORD dwProcessGroupId
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AllocConsole( void );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-FreeConsole( void );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AttachConsole(
-     DWORD dwProcessId
-    );
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetConsoleTitleA(
-     LPSTR lpConsoleTitle,
-     DWORD nSize
-    );
-__declspec(dllimport)
-DWORD
-__stdcall
-GetConsoleTitleW(
-     LPWSTR lpConsoleTitle,
-     DWORD nSize
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetConsoleTitleA(
-     LPCSTR lpConsoleTitle
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-SetConsoleTitleW(
-     LPCWSTR lpConsoleTitle
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ReadConsoleA(
-     HANDLE hConsoleInput,
-     LPVOID lpBuffer,
-     DWORD nNumberOfCharsToRead,
-     LPDWORD lpNumberOfCharsRead,
-     LPVOID lpReserved
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-ReadConsoleW(
-     HANDLE hConsoleInput,
-     LPVOID lpBuffer,
-     DWORD nNumberOfCharsToRead,
-     LPDWORD lpNumberOfCharsRead,
-     LPVOID lpReserved
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteConsoleA(
-     HANDLE hConsoleOutput,
-     const void *lpBuffer,
-     DWORD nNumberOfCharsToWrite,
-     LPDWORD lpNumberOfCharsWritten,
-     LPVOID lpReserved
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-WriteConsoleW(
-     HANDLE hConsoleOutput,
-     const void *lpBuffer,
-     DWORD nNumberOfCharsToWrite,
-     LPDWORD lpNumberOfCharsWritten,
-     LPVOID lpReserved
-    );
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HANDLE
-__stdcall
-CreateConsoleScreenBuffer(
-     DWORD dwDesiredAccess,
-     DWORD dwShareMode,
-     const SECURITY_ATTRIBUTES *lpSecurityAttributes,
-     DWORD dwFlags,
-     LPVOID lpScreenBufferData
-    );
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetConsoleCP( void );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetConsoleCP(
-     UINT wCodePageID
-    );
-
-__declspec(dllimport)
-UINT
-__stdcall
-GetConsoleOutputCP( void );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetConsoleOutputCP(
-     UINT wCodePageID
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetConsoleDisplayMode(
-     LPDWORD lpModeFlags
-    );
-
-__declspec(dllimport)
-HWND
-__stdcall
-GetConsoleWindow(
-    void
-    );
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetConsoleProcessList(
-     LPDWORD lpdwProcessList,
-     DWORD dwProcessCount);
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AddConsoleAliasA(
-     LPSTR Source,
-     LPSTR Target,
-     LPSTR ExeName);
-__declspec(dllimport)
-BOOL
-__stdcall
-AddConsoleAliasW(
-     LPWSTR Source,
-     LPWSTR Target,
-     LPWSTR ExeName);
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetConsoleAliasA(
-     LPSTR Source,
-     LPSTR TargetBuffer,
-     DWORD TargetBufferLength,
-     LPSTR ExeName);
-__declspec(dllimport)
-DWORD
-__stdcall
-GetConsoleAliasW(
-     LPWSTR Source,
-     LPWSTR TargetBuffer,
-     DWORD TargetBufferLength,
-     LPWSTR ExeName);
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetConsoleAliasesLengthA(
-     LPSTR ExeName);
-__declspec(dllimport)
-DWORD
-__stdcall
-GetConsoleAliasesLengthW(
-     LPWSTR ExeName);
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetConsoleAliasExesLengthA(
-    void);
-__declspec(dllimport)
-DWORD
-__stdcall
-GetConsoleAliasExesLengthW(
-    void);
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetConsoleAliasesA(
-     LPSTR AliasBuffer,
-     DWORD AliasBufferLength,
-     LPSTR ExeName);
-__declspec(dllimport)
-DWORD
-__stdcall
-GetConsoleAliasesW(
-     LPWSTR AliasBuffer,
-     DWORD AliasBufferLength,
-     LPWSTR ExeName);
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-GetConsoleAliasExesA(
-     LPSTR ExeNameBuffer,
-     DWORD ExeNameBufferLength);
-__declspec(dllimport)
-DWORD
-__stdcall
-GetConsoleAliasExesW(
-     LPWSTR ExeNameBuffer,
-     DWORD ExeNameBufferLength);
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagVS_FIXEDFILEINFO
-{
-    DWORD   dwSignature;            
-    DWORD   dwStrucVersion;         
-    DWORD   dwFileVersionMS;        
-    DWORD   dwFileVersionLS;        
-    DWORD   dwProductVersionMS;     
-    DWORD   dwProductVersionLS;     
-    DWORD   dwFileFlagsMask;        
-    DWORD   dwFileFlags;            
-    DWORD   dwFileOS;               
-    DWORD   dwFileType;             
-    DWORD   dwFileSubtype;          
-    DWORD   dwFileDateMS;           
-    DWORD   dwFileDateLS;           
-} VS_FIXEDFILEINFO;
-
-
-
-DWORD
-__stdcall
-VerFindFileA(
-        DWORD uFlags,
-        LPSTR szFileName,
-        LPSTR szWinDir,
-        LPSTR szAppDir,
-        LPSTR szCurDir,
-        PUINT lpuCurDirLen,
-        LPSTR szDestDir,
-        PUINT lpuDestDirLen
-        );
-DWORD
-__stdcall
-VerFindFileW(
-        DWORD uFlags,
-        LPWSTR szFileName,
-        LPWSTR szWinDir,
-        LPWSTR szAppDir,
-        LPWSTR szCurDir,
-        PUINT lpuCurDirLen,
-        LPWSTR szDestDir,
-        PUINT lpuDestDirLen
-        );
-
-
-
-
-
-
-DWORD
-__stdcall
-VerInstallFileA(
-        DWORD uFlags,
-        LPSTR szSrcFileName,
-        LPSTR szDestFileName,
-        LPSTR szSrcDir,
-        LPSTR szDestDir,
-        LPSTR szCurDir,
-        LPSTR szTmpFile,
-        PUINT lpuTmpFileLen
-        );
-DWORD
-__stdcall
-VerInstallFileW(
-        DWORD uFlags,
-        LPWSTR szSrcFileName,
-        LPWSTR szDestFileName,
-        LPWSTR szSrcDir,
-        LPWSTR szDestDir,
-        LPWSTR szCurDir,
-        LPWSTR szTmpFile,
-        PUINT lpuTmpFileLen
-        );
-
-
-
-
-
-
-
-DWORD
-__stdcall
-GetFileVersionInfoSizeA(
-         LPCSTR lptstrFilename, 
-           LPDWORD lpdwHandle
-    );                      
-
-DWORD
-__stdcall
-GetFileVersionInfoSizeW(
-         LPCWSTR lptstrFilename, 
-           LPDWORD lpdwHandle
-    );                      
-
-
-
-
-
-
-
-BOOL
-__stdcall
-GetFileVersionInfoA(
-         LPCSTR lptstrFilename, 
-         DWORD dwHandle,         
-         DWORD dwLen,            
-         LPVOID lpData
-    );                      
-
-BOOL
-__stdcall
-GetFileVersionInfoW(
-         LPCWSTR lptstrFilename, 
-         DWORD dwHandle,         
-         DWORD dwLen,            
-         LPVOID lpData
-    );                      
-
-
-
-
-
-
-DWORD
-__stdcall
-VerLanguageNameA(
-        DWORD wLang,
-        LPSTR szLang,
-        DWORD nSize
-        );
-DWORD
-__stdcall
-VerLanguageNameW(
-        DWORD wLang,
-        LPWSTR szLang,
-        DWORD nSize
-        );
-
-
-
-
-
-
-BOOL
-__stdcall
-VerQueryValueA(
-        const LPVOID pBlock,
-        LPSTR lpSubBlock,
-        LPVOID * lplpBuffer,
-        PUINT puLen
-        );
-BOOL
-__stdcall
-VerQueryValueW(
-        const LPVOID pBlock,
-        LPWSTR lpSubBlock,
-        LPVOID * lplpBuffer,
-        PUINT puLen
-        );
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef ACCESS_MASK REGSAM;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct val_context {
-    int valuelen;       
-    LPVOID value_context;   
-    LPVOID val_buff_ptr;    
-};
-
-typedef struct val_context  *PVALCONTEXT;
-
-typedef struct pvalueA {           
-    LPSTR   pv_valuename;          
-    int pv_valuelen;
-    LPVOID pv_value_context;
-    DWORD pv_type;
-}PVALUEA,  *PPVALUEA;
-typedef struct pvalueW {           
-    LPWSTR  pv_valuename;          
-    int pv_valuelen;
-    LPVOID pv_value_context;
-    DWORD pv_type;
-}PVALUEW,  *PPVALUEW;
-
-typedef PVALUEW PVALUE;
-typedef PPVALUEW PPVALUE;
-
-
-
-
-
-typedef
-DWORD _cdecl
-QUERYHANDLER (LPVOID keycontext, PVALCONTEXT val_list, DWORD num_vals,
-          LPVOID outputbuffer, DWORD  *total_outlen, DWORD input_blen);
-
-typedef QUERYHANDLER  *PQUERYHANDLER;
-
-typedef struct provider_info {
-    PQUERYHANDLER pi_R0_1val;
-    PQUERYHANDLER pi_R0_allvals;
-    PQUERYHANDLER pi_R3_1val;
-    PQUERYHANDLER pi_R3_allvals;
-    DWORD pi_flags;    
-    LPVOID pi_key_context;
-}REG_PROVIDER;
-
-typedef struct provider_info  *PPROVIDER;
-
-typedef struct value_entA {
-    LPSTR   ve_valuename;
-    DWORD ve_valuelen;
-    DWORD_PTR ve_valueptr;
-    DWORD ve_type;
-}VALENTA,  *PVALENTA;
-typedef struct value_entW {
-    LPWSTR  ve_valuename;
-    DWORD ve_valuelen;
-    DWORD_PTR ve_valueptr;
-    DWORD ve_type;
-}VALENTW,  *PVALENTW;
-
-typedef VALENTW VALENT;
-typedef PVALENTW PVALENT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegCloseKey (
-         HKEY hKey
-    );
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegOverridePredefKey (
-         HKEY hKey,
-           HKEY hNewHKey
-    );
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegOpenUserClassesRoot(
-         HANDLE hToken,
-      DWORD dwOptions,
-         REGSAM samDesired,
-         PHKEY  phkResult
-    );
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegOpenCurrentUser(
-         REGSAM samDesired,
-         PHKEY phkResult
-    );
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegDisablePredefinedCache(
-    );
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegConnectRegistryA (
-           LPCSTR lpMachineName,
-         HKEY hKey,
-         PHKEY phkResult
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegConnectRegistryW (
-           LPCWSTR lpMachineName,
-         HKEY hKey,
-         PHKEY phkResult
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegConnectRegistryExA (
-           LPCSTR lpMachineName,
-         HKEY hKey,
-         ULONG Flags,
-         PHKEY phkResult
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegConnectRegistryExW (
-           LPCWSTR lpMachineName,
-         HKEY hKey,
-         ULONG Flags,
-         PHKEY phkResult
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegCreateKeyA (
-         HKEY hKey,
-           LPCSTR lpSubKey,
-         PHKEY phkResult
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegCreateKeyW (
-         HKEY hKey,
-           LPCWSTR lpSubKey,
-         PHKEY phkResult
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegCreateKeyExA (
-         HKEY hKey,
-         LPCSTR lpSubKey,
-      DWORD Reserved,
-           LPSTR lpClass,
-         DWORD dwOptions,
-         REGSAM samDesired,
-           LPSECURITY_ATTRIBUTES lpSecurityAttributes,
-         PHKEY phkResult,
-           LPDWORD lpdwDisposition
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegCreateKeyExW (
-         HKEY hKey,
-         LPCWSTR lpSubKey,
-      DWORD Reserved,
-           LPWSTR lpClass,
-         DWORD dwOptions,
-         REGSAM samDesired,
-           LPSECURITY_ATTRIBUTES lpSecurityAttributes,
-         PHKEY phkResult,
-           LPDWORD lpdwDisposition
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegDeleteKeyA (
-         HKEY hKey,
-         LPCSTR lpSubKey
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegDeleteKeyW (
-         HKEY hKey,
-         LPCWSTR lpSubKey
-    );
-
-
-
-
-
-    
-__declspec(dllimport)
-LONG
-__stdcall
-RegDeleteKeyExA (
-         HKEY hKey,
-         LPCSTR lpSubKey,
-         REGSAM samDesired,
-      DWORD Reserved
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegDeleteKeyExW (
-         HKEY hKey,
-         LPCWSTR lpSubKey,
-         REGSAM samDesired,
-      DWORD Reserved
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegDisableReflectionKey (
-         HKEY hBase
-    );    
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegEnableReflectionKey (
-         HKEY hBase
-    );    
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegQueryReflectionKey (
-         HKEY hBase,
-         BOOL *bIsReflectionDisabled
-    );    
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegDeleteValueA (
-         HKEY hKey,
-           LPCSTR lpValueName
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegDeleteValueW (
-         HKEY hKey,
-           LPCWSTR lpValueName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegEnumKeyA (
-         HKEY hKey,
-         DWORD dwIndex,
-           LPSTR lpName,
-         DWORD cchName
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegEnumKeyW (
-         HKEY hKey,
-         DWORD dwIndex,
-           LPWSTR lpName,
-         DWORD cchName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegEnumKeyExA (
-         HKEY hKey,
-         DWORD dwIndex,
-           LPSTR lpName,
-         LPDWORD lpcchName,
-      LPDWORD lpReserved,
-             LPSTR lpClass,
-           LPDWORD lpcchClass,
-           PFILETIME lpftLastWriteTime
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegEnumKeyExW (
-         HKEY hKey,
-         DWORD dwIndex,
-           LPWSTR lpName,
-         LPDWORD lpcchName,
-      LPDWORD lpReserved,
-             LPWSTR lpClass,
-           LPDWORD lpcchClass,
-           PFILETIME lpftLastWriteTime
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegEnumValueA (
-         HKEY hKey,
-         DWORD dwIndex,
-           LPSTR lpValueName,
-         LPDWORD lpcchValueName,
-      LPDWORD lpReserved,
-           LPDWORD lpType,
-           LPBYTE lpData,
-           LPDWORD lpcbData
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegEnumValueW (
-         HKEY hKey,
-         DWORD dwIndex,
-           LPWSTR lpValueName,
-         LPDWORD lpcchValueName,
-      LPDWORD lpReserved,
-           LPDWORD lpType,
-           LPBYTE lpData,
-           LPDWORD lpcbData
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegFlushKey (
-         HKEY hKey
-    );
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegGetKeySecurity (
-         HKEY hKey,
-         SECURITY_INFORMATION SecurityInformation,
-           PSECURITY_DESCRIPTOR pSecurityDescriptor,
-         LPDWORD lpcbSecurityDescriptor
-    );
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegLoadKeyA (
-         HKEY    hKey,
-           LPCSTR  lpSubKey,
-         LPCSTR  lpFile
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegLoadKeyW (
-         HKEY    hKey,
-           LPCWSTR  lpSubKey,
-         LPCWSTR  lpFile
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegNotifyChangeKeyValue (
-         HKEY hKey,
-         BOOL bWatchSubtree,
-         DWORD dwNotifyFilter,
-           HANDLE hEvent,
-         BOOL fAsynchronous
-    );
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegOpenKeyA (
-         HKEY hKey,
-           LPCSTR lpSubKey,
-         PHKEY phkResult
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegOpenKeyW (
-         HKEY hKey,
-           LPCWSTR lpSubKey,
-         PHKEY phkResult
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegOpenKeyExA (
-         HKEY hKey,
-           LPCSTR lpSubKey,
-      DWORD ulOptions,
-         REGSAM samDesired,
-         PHKEY phkResult
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegOpenKeyExW (
-         HKEY hKey,
-           LPCWSTR lpSubKey,
-      DWORD ulOptions,
-         REGSAM samDesired,
-         PHKEY phkResult
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegQueryInfoKeyA (
-         HKEY hKey,
-           LPSTR lpClass,
-           LPDWORD lpcchClass,
-      LPDWORD lpReserved,
-           LPDWORD lpcSubKeys,
-           LPDWORD lpcbMaxSubKeyLen,
-           LPDWORD lpcbMaxClassLen,
-           LPDWORD lpcValues,
-           LPDWORD lpcbMaxValueNameLen,
-           LPDWORD lpcbMaxValueLen,
-           LPDWORD lpcbSecurityDescriptor,
-           PFILETIME lpftLastWriteTime
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegQueryInfoKeyW (
-         HKEY hKey,
-           LPWSTR lpClass,
-           LPDWORD lpcchClass,
-      LPDWORD lpReserved,
-           LPDWORD lpcSubKeys,
-           LPDWORD lpcbMaxSubKeyLen,
-           LPDWORD lpcbMaxClassLen,
-           LPDWORD lpcValues,
-           LPDWORD lpcbMaxValueNameLen,
-           LPDWORD lpcbMaxValueLen,
-           LPDWORD lpcbSecurityDescriptor,
-           PFILETIME lpftLastWriteTime
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegQueryValueA (
-         HKEY hKey,
-           LPCSTR lpSubKey,
-           LPSTR lpData,
-           PLONG lpcbData
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegQueryValueW (
-         HKEY hKey,
-           LPCWSTR lpSubKey,
-           LPWSTR lpData,
-           PLONG lpcbData
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegQueryMultipleValuesA (
-         HKEY hKey,
-         PVALENTA val_list,
-         DWORD num_vals,
-           LPSTR lpValueBuf,
-           LPDWORD ldwTotsize
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegQueryMultipleValuesW (
-         HKEY hKey,
-         PVALENTW val_list,
-         DWORD num_vals,
-           LPWSTR lpValueBuf,
-           LPDWORD ldwTotsize
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegQueryValueExA (
-         HKEY hKey,
-           LPCSTR lpValueName,
-      LPDWORD lpReserved,
-           LPDWORD lpType,
-           LPBYTE lpData,
-           LPDWORD lpcbData
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegQueryValueExW (
-         HKEY hKey,
-           LPCWSTR lpValueName,
-      LPDWORD lpReserved,
-           LPDWORD lpType,
-           LPBYTE lpData,
-           LPDWORD lpcbData
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegReplaceKeyA (
-         HKEY hKey,
-           LPCSTR lpSubKey,
-         LPCSTR lpNewFile,
-         LPCSTR lpOldFile
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegReplaceKeyW (
-         HKEY hKey,
-           LPCWSTR lpSubKey,
-         LPCWSTR lpNewFile,
-         LPCWSTR lpOldFile
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegRestoreKeyA (
-         HKEY hKey,
-         LPCSTR lpFile,
-         DWORD dwFlags
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegRestoreKeyW (
-         HKEY hKey,
-         LPCWSTR lpFile,
-         DWORD dwFlags
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegSaveKeyA (
-         HKEY hKey,
-         LPCSTR lpFile,
-           LPSECURITY_ATTRIBUTES lpSecurityAttributes
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegSaveKeyW (
-         HKEY hKey,
-         LPCWSTR lpFile,
-           LPSECURITY_ATTRIBUTES lpSecurityAttributes
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegSetKeySecurity (
-         HKEY hKey,
-         SECURITY_INFORMATION SecurityInformation,
-         PSECURITY_DESCRIPTOR pSecurityDescriptor
-    );
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegSetValueA (
-         HKEY hKey,
-           LPCSTR lpSubKey,
-         DWORD dwType,
-             LPCSTR lpData,
-         DWORD cbData
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegSetValueW (
-         HKEY hKey,
-           LPCWSTR lpSubKey,
-         DWORD dwType,
-             LPCWSTR lpData,
-         DWORD cbData
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegSetValueExA (
-         HKEY hKey,
-           LPCSTR lpValueName,
-      DWORD Reserved,
-         DWORD dwType,
-             const BYTE* lpData,
-         DWORD cbData
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegSetValueExW (
-         HKEY hKey,
-           LPCWSTR lpValueName,
-      DWORD Reserved,
-         DWORD dwType,
-             const BYTE* lpData,
-         DWORD cbData
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegUnLoadKeyA (
-         HKEY    hKey,
-           LPCSTR lpSubKey
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegUnLoadKeyW (
-         HKEY    hKey,
-           LPCWSTR lpSubKey
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegGetValueA (
-         HKEY    hkey,
-           LPCSTR  lpSubKey,
-           LPCSTR  lpValue,
-           DWORD    dwFlags,
-           LPDWORD pdwType,
-           PVOID   pvData,
-           LPDWORD pcbData 
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegGetValueW (
-         HKEY    hkey,
-           LPCWSTR  lpSubKey,
-           LPCWSTR  lpValue,
-           DWORD    dwFlags,
-           LPDWORD pdwType,
-           PVOID   pvData,
-           LPDWORD pcbData 
-    );
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-InitiateSystemShutdownA(
-           LPSTR lpMachineName,
-           LPSTR lpMessage,
-         DWORD dwTimeout,
-         BOOL bForceAppsClosed,
-         BOOL bRebootAfterShutdown
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-InitiateSystemShutdownW(
-           LPWSTR lpMachineName,
-           LPWSTR lpMessage,
-         DWORD dwTimeout,
-         BOOL bForceAppsClosed,
-         BOOL bRebootAfterShutdown
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-AbortSystemShutdownA(
-           LPSTR lpMachineName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-AbortSystemShutdownW(
-           LPWSTR lpMachineName
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-InitiateSystemShutdownExA(
-           LPSTR lpMachineName,
-           LPSTR lpMessage,
-         DWORD dwTimeout,
-         BOOL bForceAppsClosed,
-         BOOL bRebootAfterShutdown,
-         DWORD dwReason
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-InitiateSystemShutdownExW(
-           LPWSTR lpMachineName,
-           LPWSTR lpMessage,
-         DWORD dwTimeout,
-         BOOL bForceAppsClosed,
-         BOOL bRebootAfterShutdown,
-         DWORD dwReason
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-RegSaveKeyExA (
-         HKEY hKey,
-         LPCSTR lpFile,
-           LPSECURITY_ATTRIBUTES lpSecurityAttributes,
-         DWORD Flags
-    );
-__declspec(dllimport)
-LONG
-__stdcall
-RegSaveKeyExW (
-         HKEY hKey,
-         LPCWSTR lpFile,
-           LPSECURITY_ATTRIBUTES lpSecurityAttributes,
-         DWORD Flags
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-Wow64Win32ApiEntry (
-         DWORD dwFuncNumber,
-         DWORD dwFlag,
-         DWORD dwRes
-    );
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct  _NETRESOURCEA {
-    DWORD    dwScope;
-    DWORD    dwType;
-    DWORD    dwDisplayType;
-    DWORD    dwUsage;
-    LPSTR    lpLocalName;
-    LPSTR    lpRemoteName;
-    LPSTR    lpComment ;
-    LPSTR    lpProvider;
-}NETRESOURCEA, *LPNETRESOURCEA;
-typedef struct  _NETRESOURCEW {
-    DWORD    dwScope;
-    DWORD    dwType;
-    DWORD    dwDisplayType;
-    DWORD    dwUsage;
-    LPWSTR   lpLocalName;
-    LPWSTR   lpRemoteName;
-    LPWSTR   lpComment ;
-    LPWSTR   lpProvider;
-}NETRESOURCEW, *LPNETRESOURCEW;
-
-typedef NETRESOURCEW NETRESOURCE;
-typedef LPNETRESOURCEW LPNETRESOURCE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-DWORD __stdcall
-WNetAddConnectionA(
-      LPCSTR   lpRemoteName,
-      LPCSTR   lpPassword,
-      LPCSTR   lpLocalName
-    );
-DWORD __stdcall
-WNetAddConnectionW(
-      LPCWSTR   lpRemoteName,
-      LPCWSTR   lpPassword,
-      LPCWSTR   lpLocalName
-    );
-
-
-
-
-
-
-DWORD __stdcall
-WNetAddConnection2A(
-      LPNETRESOURCEA lpNetResource,
-      LPCSTR       lpPassword,
-      LPCSTR       lpUserName,
-      DWORD          dwFlags
-    );
-DWORD __stdcall
-WNetAddConnection2W(
-      LPNETRESOURCEW lpNetResource,
-      LPCWSTR       lpPassword,
-      LPCWSTR       lpUserName,
-      DWORD          dwFlags
-    );
-
-
-
-
-
-
-DWORD __stdcall
-WNetAddConnection3A(
-      HWND           hwndOwner,
-      LPNETRESOURCEA lpNetResource,
-      LPCSTR       lpPassword,
-      LPCSTR       lpUserName,
-      DWORD          dwFlags
-    );
-DWORD __stdcall
-WNetAddConnection3W(
-      HWND           hwndOwner,
-      LPNETRESOURCEW lpNetResource,
-      LPCWSTR       lpPassword,
-      LPCWSTR       lpUserName,
-      DWORD          dwFlags
-    );
-
-
-
-
-
-
-DWORD __stdcall
-WNetCancelConnectionA(
-      LPCSTR lpName,
-      BOOL     fForce
-    );
-DWORD __stdcall
-WNetCancelConnectionW(
-      LPCWSTR lpName,
-      BOOL     fForce
-    );
-
-
-
-
-
-
-DWORD __stdcall
-WNetCancelConnection2A(
-      LPCSTR lpName,
-      DWORD    dwFlags,
-      BOOL     fForce
-    );
-DWORD __stdcall
-WNetCancelConnection2W(
-      LPCWSTR lpName,
-      DWORD    dwFlags,
-      BOOL     fForce
-    );
-
-
-
-
-
-
-DWORD __stdcall
-WNetGetConnectionA(
-      LPCSTR lpLocalName,
-      LPSTR  lpRemoteName,
-       LPDWORD  lpnLength
-    );
-DWORD __stdcall
-WNetGetConnectionW(
-      LPCWSTR lpLocalName,
-      LPWSTR  lpRemoteName,
-       LPDWORD  lpnLength
-    );
-
-
-
-
-
-
-
-DWORD __stdcall
-WNetRestoreConnectionA(
-     HWND     hwndParent,
-     LPCSTR lpDevice
-    );
-DWORD __stdcall
-WNetRestoreConnectionW(
-     HWND     hwndParent,
-     LPCWSTR lpDevice
-    );
-
-
-
-
-
-
-
-
-DWORD __stdcall
-WNetUseConnectionA(
-     HWND            hwndOwner,
-     LPNETRESOURCEA  lpNetResource,
-     LPCSTR        lpPassword,
-     LPCSTR        lpUserID,
-     DWORD           dwFlags,
-     LPSTR        lpAccessName,
-      LPDWORD     lpBufferSize,
-     LPDWORD        lpResult
-    );
-DWORD __stdcall
-WNetUseConnectionW(
-     HWND            hwndOwner,
-     LPNETRESOURCEW  lpNetResource,
-     LPCWSTR        lpPassword,
-     LPCWSTR        lpUserID,
-     DWORD           dwFlags,
-     LPWSTR        lpAccessName,
-      LPDWORD     lpBufferSize,
-     LPDWORD        lpResult
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-DWORD __stdcall
-WNetConnectionDialog(
-     HWND  hwnd,
-     DWORD dwType
-    );
-
-DWORD __stdcall
-WNetDisconnectDialog(
-     HWND  hwnd,
-     DWORD dwType
-    );
-
-
-typedef struct _CONNECTDLGSTRUCTA{
-    DWORD cbStructure;       
-    HWND hwndOwner;          
-    LPNETRESOURCEA lpConnRes;
-    DWORD dwFlags;           
-    DWORD dwDevNum;          
-} CONNECTDLGSTRUCTA,  *LPCONNECTDLGSTRUCTA;
-typedef struct _CONNECTDLGSTRUCTW{
-    DWORD cbStructure;       
-    HWND hwndOwner;          
-    LPNETRESOURCEW lpConnRes;
-    DWORD dwFlags;           
-    DWORD dwDevNum;          
-} CONNECTDLGSTRUCTW,  *LPCONNECTDLGSTRUCTW;
-
-typedef CONNECTDLGSTRUCTW CONNECTDLGSTRUCT;
-typedef LPCONNECTDLGSTRUCTW LPCONNECTDLGSTRUCT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-DWORD __stdcall
-WNetConnectionDialog1A(
-      LPCONNECTDLGSTRUCTA lpConnDlgStruct
-    );
-DWORD __stdcall
-WNetConnectionDialog1W(
-      LPCONNECTDLGSTRUCTW lpConnDlgStruct
-    );
-
-
-
-
-
-
-typedef struct _DISCDLGSTRUCTA{
-    DWORD           cbStructure;      
-    HWND            hwndOwner;        
-    LPSTR           lpLocalName;      
-    LPSTR           lpRemoteName;     
-    DWORD           dwFlags;          
-} DISCDLGSTRUCTA,  *LPDISCDLGSTRUCTA;
-typedef struct _DISCDLGSTRUCTW{
-    DWORD           cbStructure;      
-    HWND            hwndOwner;        
-    LPWSTR          lpLocalName;      
-    LPWSTR          lpRemoteName;     
-    DWORD           dwFlags;          
-} DISCDLGSTRUCTW,  *LPDISCDLGSTRUCTW;
-
-typedef DISCDLGSTRUCTW DISCDLGSTRUCT;
-typedef LPDISCDLGSTRUCTW LPDISCDLGSTRUCT;
-
-
-
-
-
-
-
-
-DWORD __stdcall
-WNetDisconnectDialog1A(
-     LPDISCDLGSTRUCTA lpConnDlgStruct
-    );
-DWORD __stdcall
-WNetDisconnectDialog1W(
-     LPDISCDLGSTRUCTW lpConnDlgStruct
-    );
-
-
-
-
-
-
-
-
-
-
-
-DWORD __stdcall
-WNetOpenEnumA(
-      DWORD          dwScope,
-      DWORD          dwType,
-      DWORD          dwUsage,
-      LPNETRESOURCEA lpNetResource,
-      LPHANDLE       lphEnum
-    );
-DWORD __stdcall
-WNetOpenEnumW(
-      DWORD          dwScope,
-      DWORD          dwType,
-      DWORD          dwUsage,
-      LPNETRESOURCEW lpNetResource,
-      LPHANDLE       lphEnum
-    );
-
-
-
-
-
-
-DWORD __stdcall
-WNetEnumResourceA(
-      HANDLE  hEnum,
-       LPDWORD lpcCount,
-      LPVOID  lpBuffer,
-       LPDWORD lpBufferSize
-    );
-DWORD __stdcall
-WNetEnumResourceW(
-      HANDLE  hEnum,
-       LPDWORD lpcCount,
-      LPVOID  lpBuffer,
-       LPDWORD lpBufferSize
-    );
-
-
-
-
-
-
-DWORD __stdcall
-WNetCloseEnum(
-     HANDLE   hEnum
-    );
-
-
-DWORD __stdcall
-WNetGetResourceParentA(
-     LPNETRESOURCEA lpNetResource,
-     LPVOID lpBuffer,
-      LPDWORD lpcbBuffer
-    );
-DWORD __stdcall
-WNetGetResourceParentW(
-     LPNETRESOURCEW lpNetResource,
-     LPVOID lpBuffer,
-      LPDWORD lpcbBuffer
-    );
-
-
-
-
-
-
-DWORD __stdcall
-WNetGetResourceInformationA(
-     LPNETRESOURCEA  lpNetResource,
-     LPVOID          lpBuffer,
-      LPDWORD         lpcbBuffer,
-     LPSTR         *lplpSystem
-    );
-DWORD __stdcall
-WNetGetResourceInformationW(
-     LPNETRESOURCEW  lpNetResource,
-     LPVOID          lpBuffer,
-      LPDWORD         lpcbBuffer,
-     LPWSTR         *lplpSystem
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct  _UNIVERSAL_NAME_INFOA {
-    LPSTR    lpUniversalName;
-}UNIVERSAL_NAME_INFOA, *LPUNIVERSAL_NAME_INFOA;
-typedef struct  _UNIVERSAL_NAME_INFOW {
-    LPWSTR   lpUniversalName;
-}UNIVERSAL_NAME_INFOW, *LPUNIVERSAL_NAME_INFOW;
-
-typedef UNIVERSAL_NAME_INFOW UNIVERSAL_NAME_INFO;
-typedef LPUNIVERSAL_NAME_INFOW LPUNIVERSAL_NAME_INFO;
-
-
-
-
-
-typedef struct  _REMOTE_NAME_INFOA {
-    LPSTR    lpUniversalName;
-    LPSTR    lpConnectionName;
-    LPSTR    lpRemainingPath;
-}REMOTE_NAME_INFOA, *LPREMOTE_NAME_INFOA;
-typedef struct  _REMOTE_NAME_INFOW {
-    LPWSTR   lpUniversalName;
-    LPWSTR   lpConnectionName;
-    LPWSTR   lpRemainingPath;
-}REMOTE_NAME_INFOW, *LPREMOTE_NAME_INFOW;
-
-typedef REMOTE_NAME_INFOW REMOTE_NAME_INFO;
-typedef LPREMOTE_NAME_INFOW LPREMOTE_NAME_INFO;
-
-
-
-
-
-DWORD __stdcall
-WNetGetUniversalNameA(
-      LPCSTR lpLocalPath,
-      DWORD    dwInfoLevel,
-      LPVOID   lpBuffer,
-       LPDWORD  lpBufferSize
-     );
-DWORD __stdcall
-WNetGetUniversalNameW(
-      LPCWSTR lpLocalPath,
-      DWORD    dwInfoLevel,
-      LPVOID   lpBuffer,
-       LPDWORD  lpBufferSize
-     );
-
-
-
-
-
-
-
-
-
-
-DWORD __stdcall
-WNetGetUserA(
-      LPCSTR  lpName,
-      LPSTR   lpUserName,
-       LPDWORD   lpnLength
-    );
-DWORD __stdcall
-WNetGetUserW(
-      LPCWSTR  lpName,
-      LPWSTR   lpUserName,
-       LPDWORD   lpnLength
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-DWORD __stdcall
-WNetGetProviderNameA(
-     DWORD   dwNetType,
-     LPSTR lpProviderName,
-      LPDWORD lpBufferSize
-    );
-DWORD __stdcall
-WNetGetProviderNameW(
-     DWORD   dwNetType,
-     LPWSTR lpProviderName,
-      LPDWORD lpBufferSize
-    );
-
-
-
-
-
-
-typedef struct _NETINFOSTRUCT{
-    DWORD cbStructure;
-    DWORD dwProviderVersion;
-    DWORD dwStatus;
-    DWORD dwCharacteristics;
-    ULONG_PTR dwHandle;
-    WORD  wNetType;
-    DWORD dwPrinters;
-    DWORD dwDrives;
-} NETINFOSTRUCT,  *LPNETINFOSTRUCT;
-
-
-
-
-
-DWORD __stdcall
-WNetGetNetworkInformationA(
-     LPCSTR          lpProvider,
-     LPNETINFOSTRUCT   lpNetInfoStruct
-    );
-DWORD __stdcall
-WNetGetNetworkInformationW(
-     LPCWSTR          lpProvider,
-     LPNETINFOSTRUCT   lpNetInfoStruct
-    );
-
-
-
-
-
-
-
-
-
-
-typedef UINT ( __stdcall *PFNGETPROFILEPATHA) (
-    LPCSTR    pszUsername,
-    LPSTR     pszBuffer,
-    UINT        cbBuffer
-    );
-typedef UINT ( __stdcall *PFNGETPROFILEPATHW) (
-    LPCWSTR    pszUsername,
-    LPWSTR     pszBuffer,
-    UINT        cbBuffer
-    );
-
-
-
-
-
-
-typedef UINT ( __stdcall *PFNRECONCILEPROFILEA) (
-    LPCSTR    pszCentralFile,
-    LPCSTR    pszLocalFile,
-    DWORD       dwFlags
-    );
-typedef UINT ( __stdcall *PFNRECONCILEPROFILEW) (
-    LPCWSTR    pszCentralFile,
-    LPCWSTR    pszLocalFile,
-    DWORD       dwFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL ( __stdcall *PFNPROCESSPOLICIESA) (
-    HWND        hwnd,
-    LPCSTR    pszPath,
-    LPCSTR    pszUsername,
-    LPCSTR    pszComputerName,
-    DWORD       dwFlags
-    );
-typedef BOOL ( __stdcall *PFNPROCESSPOLICIESW) (
-    HWND        hwnd,
-    LPCWSTR    pszPath,
-    LPCWSTR    pszUsername,
-    LPCWSTR    pszComputerName,
-    DWORD       dwFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-DWORD __stdcall
-WNetGetLastErrorA(
-      LPDWORD    lpError,
-      LPSTR    lpErrorBuf,
-      DWORD      nErrorBufSize,
-      LPSTR    lpNameBuf,
-      DWORD      nNameBufSize
-    );
-DWORD __stdcall
-WNetGetLastErrorW(
-      LPDWORD    lpError,
-      LPWSTR    lpErrorBuf,
-      DWORD      nErrorBufSize,
-      LPWSTR    lpNameBuf,
-      DWORD      nNameBufSize
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _NETCONNECTINFOSTRUCT{
-    DWORD cbStructure;
-    DWORD dwFlags;
-    DWORD dwSpeed;
-    DWORD dwDelay;
-    DWORD dwOptDataSize;
-} NETCONNECTINFOSTRUCT,  *LPNETCONNECTINFOSTRUCT;
-
-
-
-
-
-
-DWORD __stdcall
-MultinetGetConnectionPerformanceA(
-         LPNETRESOURCEA lpNetResource,
-         LPNETCONNECTINFOSTRUCT lpNetConnectInfoStruct
-        );
-DWORD __stdcall
-MultinetGetConnectionPerformanceW(
-         LPNETRESOURCEW lpNetResource,
-         LPNETCONNECTINFOSTRUCT lpNetConnectInfoStruct
-        );
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-
-        unsigned short bAppReturnCode:8,
-                 reserved:6,
-                 fBusy:1,
-		 fAck:1;
-
-
-
-} DDEACK;
-
-
-
-
-
-
-
-
-
-typedef struct {
-
-        unsigned short reserved:14,
-                 fDeferUpd:1,
-		 fAckReq:1;
-
-
-
-	short     cfFormat;
-} DDEADVISE;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-
-	unsigned short unused:12,
-                 fResponse:1,
-                 fRelease:1,
-                 reserved:1,
-                 fAckReq:1;
-
-
-
-	short	 cfFormat;
-	BYTE	 Value[1];
-} DDEDATA;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-
-	unsigned short unused:13,  
-                             
-		 fRelease:1,
-		 fReserved:2;
-
-
-
-	short    cfFormat;
-	BYTE	 Value[1];  
-                            
-
-} DDEPOKE;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-
-        unsigned short unused:13,
-                 fRelease:1,
-                 fDeferUpd:1,
-		 fAckReq:1;
-
-
-
-	short	 cfFormat;
-} DDELN;
-
-typedef struct {
-
-	unsigned short unused:12,
-                 fAck:1,
-                 fRelease:1,
-                 fReserved:1,
-                 fAckReq:1;
-
-
-
-	short	 cfFormat;
-	BYTE	 rgb[1];
-} DDEUP;
-
-
-
-
-
-
-BOOL
-__stdcall
-DdeSetQualityOfService(
-    HWND hwndClient,
-    const SECURITY_QUALITY_OF_SERVICE *pqosNew,
-    PSECURITY_QUALITY_OF_SERVICE pqosPrev);
-
-BOOL
-__stdcall
-ImpersonateDdeClientWindow(
-    HWND hWndClient,
-    HWND hWndServer);
-
-
-
-
-LPARAM __stdcall PackDDElParam(UINT msg, UINT_PTR uiLo, UINT_PTR uiHi);
-BOOL   __stdcall UnpackDDElParam(UINT msg, LPARAM lParam, PUINT_PTR puiLo, PUINT_PTR puiHi);
-BOOL   __stdcall FreeDDElParam(UINT msg, LPARAM lParam);
-LPARAM __stdcall ReuseDDElParam(LPARAM lParam, UINT msgIn, UINT msgOut, UINT_PTR uiLo, UINT_PTR uiHi);
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-struct HCONVLIST__ { int unused; }; typedef struct HCONVLIST__ *HCONVLIST;
-struct HCONV__ { int unused; }; typedef struct HCONV__ *HCONV;
-struct HSZ__ { int unused; }; typedef struct HSZ__ *HSZ;
-struct HDDEDATA__ { int unused; }; typedef struct HDDEDATA__ *HDDEDATA;
-
-
-
-
-typedef struct tagHSZPAIR {
-    HSZ hszSvc;
-    HSZ hszTopic;
-} HSZPAIR;
-typedef HSZPAIR  *PHSZPAIR;
-
-
-
-
-typedef struct tagCONVCONTEXT {
-    UINT        cb;             
-    UINT        wFlags;         
-    UINT        wCountryID;     
-    int         iCodePage;      
-    DWORD       dwLangID;       
-    DWORD       dwSecurity;     
-    SECURITY_QUALITY_OF_SERVICE qos;  
-} CONVCONTEXT;
-typedef CONVCONTEXT  *PCONVCONTEXT;
-
-
-
-
-typedef struct tagCONVINFO {
-    DWORD   cb;            
-    DWORD_PTR hUser;       
-    HCONV   hConvPartner;  
-    HSZ     hszSvcPartner; 
-    HSZ     hszServiceReq; 
-    HSZ     hszTopic;      
-    HSZ     hszItem;       
-    UINT    wFmt;          
-    UINT    wType;         
-    UINT    wStatus;       
-    UINT    wConvst;       
-    UINT    wLastError;    
-    HCONVLIST hConvList;   
-    CONVCONTEXT ConvCtxt;  
-    HWND    hwnd;          
-    HWND    hwndPartner;   
-} CONVINFO;
-typedef CONVINFO  *PCONVINFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef HDDEDATA __stdcall FNCALLBACK(UINT wType, UINT wFmt, HCONV hConv,
-        HSZ hsz1, HSZ hsz2, HDDEDATA hData, ULONG_PTR dwData1, ULONG_PTR dwData2);
-typedef HDDEDATA (__stdcall *PFNCALLBACK)(UINT wType, UINT wFmt, HCONV hConv,
-        HSZ hsz1, HSZ hsz2, HDDEDATA hData, ULONG_PTR dwData1, ULONG_PTR dwData2);
-
-
-
-
-
-UINT __stdcall DdeInitializeA(   LPDWORD pidInst,  PFNCALLBACK pfnCallback,
-         DWORD afCmd,  DWORD ulRes);
-UINT __stdcall DdeInitializeW(   LPDWORD pidInst,  PFNCALLBACK pfnCallback,
-         DWORD afCmd,  DWORD ulRes);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-BOOL __stdcall DdeUninitialize(  DWORD idInst);
-
-
-
-
-
-HCONVLIST __stdcall DdeConnectList(  DWORD idInst,  HSZ hszService,  HSZ hszTopic,
-         HCONVLIST hConvList,  PCONVCONTEXT pCC);
-HCONV __stdcall DdeQueryNextServer(  HCONVLIST hConvList,  HCONV hConvPrev);
-BOOL __stdcall DdeDisconnectList(  HCONVLIST hConvList);
-
-
-
-
-
-HCONV __stdcall DdeConnect(  DWORD idInst,  HSZ hszService,  HSZ hszTopic,
-         PCONVCONTEXT pCC);
-BOOL __stdcall DdeDisconnect(   HCONV hConv);
-HCONV __stdcall DdeReconnect(  HCONV hConv);
-UINT __stdcall DdeQueryConvInfo(  HCONV hConv,  DWORD idTransaction,   PCONVINFO pConvInfo);
-BOOL __stdcall DdeSetUserHandle(  HCONV hConv,  DWORD id,  DWORD_PTR hUser);
-BOOL __stdcall DdeAbandonTransaction(  DWORD idInst,  HCONV hConv,  DWORD idTransaction);
-
-
-
-
-
-
-BOOL __stdcall DdePostAdvise(  DWORD idInst,  HSZ hszTopic,  HSZ hszItem);
-BOOL __stdcall DdeEnableCallback(  DWORD idInst,  HCONV hConv,  UINT wCmd);
-BOOL __stdcall DdeImpersonateClient(  HCONV hConv);
-
-
-
-
-
-
-HDDEDATA __stdcall DdeNameService(  DWORD idInst,  HSZ hsz1,  HSZ hsz2,  UINT afCmd);
-
-
-
-
-
-
-
-
-
-
-HDDEDATA __stdcall DdeClientTransaction(  LPBYTE pData,  DWORD cbData,
-         HCONV hConv,  HSZ hszItem,  UINT wFmt,  UINT wType,
-         DWORD dwTimeout,  LPDWORD pdwResult);
-
-
-
-
-
-HDDEDATA __stdcall DdeCreateDataHandle(  DWORD idInst,  LPBYTE pSrc,  DWORD cb,
-         DWORD cbOff,  HSZ hszItem,  UINT wFmt,  UINT afCmd);
-HDDEDATA __stdcall DdeAddData(  HDDEDATA hData,  LPBYTE pSrc,  DWORD cb,  DWORD cbOff);
-DWORD __stdcall DdeGetData(  HDDEDATA hData,  LPBYTE pDst,  DWORD cbMax,  DWORD cbOff);
-LPBYTE __stdcall DdeAccessData(  HDDEDATA hData,  LPDWORD pcbDataSize);
-BOOL __stdcall DdeUnaccessData(  HDDEDATA hData);
-BOOL __stdcall DdeFreeDataHandle(   HDDEDATA hData);
-
-
-
-
-UINT __stdcall DdeGetLastError(  DWORD idInst);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HSZ  __stdcall DdeCreateStringHandleA(  DWORD idInst,  LPCSTR psz,  int iCodePage);
-HSZ  __stdcall DdeCreateStringHandleW(  DWORD idInst,  LPCWSTR psz,  int iCodePage);
-
-
-
-
-
-DWORD __stdcall DdeQueryStringA(  DWORD idInst,  HSZ hsz,   LPSTR psz,  DWORD cchMax,  int iCodePage);
-DWORD __stdcall DdeQueryStringW(  DWORD idInst,  HSZ hsz,   LPWSTR psz,  DWORD cchMax,  int iCodePage);
-
-
-
-
-
-BOOL __stdcall DdeFreeStringHandle(  DWORD idInst,   HSZ hsz);
-BOOL __stdcall DdeKeepStringHandle(  DWORD idInst,   HSZ hsz);
-int __stdcall DdeCmpStringHandles(  HSZ hsz1,  HSZ hsz2);
-
-
-
-
-
-
-
-typedef struct tagDDEML_MSG_HOOK_DATA {    
-    UINT_PTR uiLo;  
-    UINT_PTR uiHi;
-    DWORD cbData;   
-    DWORD Data[8];  
-} DDEML_MSG_HOOK_DATA, *PDDEML_MSG_HOOK_DATA;
-
-
-typedef struct tagMONMSGSTRUCT {
-    UINT    cb;
-    HWND    hwndTo;
-    DWORD   dwTime;
-    HANDLE  hTask;
-    UINT    wMsg;
-    WPARAM  wParam;
-    LPARAM  lParam;
-    DDEML_MSG_HOOK_DATA dmhd;       
-} MONMSGSTRUCT, *PMONMSGSTRUCT;
-
-typedef struct tagMONCBSTRUCT {
-    UINT   cb;
-    DWORD  dwTime;
-    HANDLE hTask;
-    DWORD  dwRet;
-    UINT   wType;
-    UINT   wFmt;
-    HCONV  hConv;
-    HSZ    hsz1;
-    HSZ    hsz2;
-    HDDEDATA hData;
-    ULONG_PTR dwData1;
-    ULONG_PTR dwData2;
-    CONVCONTEXT cc;                 
-    DWORD  cbData;                  
-    DWORD  Data[8];                 
-} MONCBSTRUCT, *PMONCBSTRUCT;
-
-typedef struct tagMONHSZSTRUCTA {
-    UINT   cb;
-    BOOL   fsAction;    
-    DWORD  dwTime;
-    HSZ    hsz;
-    HANDLE hTask;
-    CHAR    str[1];
-} MONHSZSTRUCTA, *PMONHSZSTRUCTA;
-typedef struct tagMONHSZSTRUCTW {
-    UINT   cb;
-    BOOL   fsAction;    
-    DWORD  dwTime;
-    HSZ    hsz;
-    HANDLE hTask;
-    WCHAR   str[1];
-} MONHSZSTRUCTW, *PMONHSZSTRUCTW;
-
-typedef MONHSZSTRUCTW MONHSZSTRUCT;
-typedef PMONHSZSTRUCTW PMONHSZSTRUCT;
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMONERRSTRUCT {
-    UINT    cb;
-    UINT    wLastError;
-    DWORD   dwTime;
-    HANDLE  hTask;
-} MONERRSTRUCT, *PMONERRSTRUCT;
-
-typedef struct tagMONLINKSTRUCT {
-    UINT    cb;
-    DWORD   dwTime;
-    HANDLE  hTask;
-    BOOL    fEstablished;
-    BOOL    fNoData;
-    HSZ     hszSvc;
-    HSZ     hszTopic;
-    HSZ     hszItem;
-    UINT    wFmt;
-    BOOL    fServer;
-    HCONV   hConvServer;
-    HCONV   hConvClient;
-} MONLINKSTRUCT, *PMONLINKSTRUCT;
-
-typedef struct tagMONCONVSTRUCT {
-    UINT    cb;
-    BOOL    fConnect;
-    DWORD   dwTime;
-    HANDLE  hTask;
-    HSZ     hszSvc;
-    HSZ     hszTopic;
-    HCONV   hConvClient;        
-    HCONV   hConvServer;        
-} MONCONVSTRUCT, *PMONCONVSTRUCT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagCRGB
-{
-    BYTE    bRed;
-    BYTE    bGreen;
-    BYTE    bBlue;
-    BYTE    bExtra;
-} CRGB;           
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-INT
-__stdcall
-LZStart(
-	void
-	);
-
-void
-__stdcall
-LZDone(
-	void
-	);
-
-LONG
-__stdcall
-CopyLZFile(
-	INT,
-	INT
-	);
-
-LONG
-__stdcall
-LZCopy(
-	INT,
-	INT
-	);
-
-INT
-__stdcall
-LZInit(
-	INT
-	);
-
-INT
-__stdcall
-GetExpandedNameA(
-	LPSTR,
-	LPSTR
-	);
-INT
-__stdcall
-GetExpandedNameW(
-	LPWSTR,
-	LPWSTR
-	);
-
-
-
-
-
-
-INT
-__stdcall
-LZOpenFileA(
-	LPSTR,
-	LPOFSTRUCT,
-	WORD
-	);
-INT
-__stdcall
-LZOpenFileW(
-	LPWSTR,
-	LPOFSTRUCT,
-	WORD
-	);
-
-
-
-
-
-
-LONG
-__stdcall
-LZSeek(
-	INT,
-	LONG,
-	INT
-	);
-
-INT
-__stdcall
-LZRead(
-	INT,
-	LPSTR,
-	INT
-	);
-
-void
-__stdcall
-LZClose(
-	INT
-	);
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,1)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {            
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef UINT        MMVERSION;  
-
-
-
-typedef UINT        MMRESULT;   
-                                
-
-
-typedef UINT    *LPUINT;
-
-
-
-
-typedef struct mmtime_tag
-{
-    UINT            wType;      
-    union
-    {
-        DWORD       ms;         
-        DWORD       sample;     
-        DWORD       cb;         
-        DWORD       ticks;      
-
-        
-        struct
-        {
-            BYTE    hour;       
-            BYTE    min;        
-            BYTE    sec;        
-            BYTE    frame;      
-            BYTE    fps;        
-            BYTE    dummy;      
-
-            BYTE    pad[2];
-
-        } smpte;
-
-        
-        struct
-        {
-            DWORD songptrpos;   
-        } midi;
-    } u;
-} MMTIME, *PMMTIME,  *NPMMTIME,  *LPMMTIME;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
- 
- 
- 
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                                   
-                                                   
-
-
-
-
-
-
-
-
-
-
-
-
-struct HDRVR__ { int unused; }; typedef struct HDRVR__ *HDRVR;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct DRVCONFIGINFOEX {
-    DWORD   dwDCISize;
-    LPCWSTR  lpszDCISectionName;
-    LPCWSTR  lpszDCIAliasName;
-    DWORD    dnDevNode;
-} DRVCONFIGINFOEX, *PDRVCONFIGINFOEX,  *NPDRVCONFIGINFOEX,  *LPDRVCONFIGINFOEX;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagDRVCONFIGINFO {
-    DWORD   dwDCISize;
-    LPCWSTR  lpszDCISectionName;
-    LPCWSTR  lpszDCIAliasName;
-} DRVCONFIGINFO, *PDRVCONFIGINFO,  *NPDRVCONFIGINFO,  *LPDRVCONFIGINFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef LRESULT (__stdcall* DRIVERPROC)(DWORD_PTR, HDRVR, UINT, LPARAM, LPARAM);
-
-__declspec(dllimport) LRESULT   __stdcall CloseDriver(  HDRVR hDriver,  LPARAM lParam1,  LPARAM lParam2);
-__declspec(dllimport) HDRVR     __stdcall OpenDriver(  LPCWSTR szDriverName,  LPCWSTR szSectionName,  LPARAM lParam2);
-__declspec(dllimport) LRESULT   __stdcall SendDriverMessage(  HDRVR hDriver,  UINT message,  LPARAM lParam1,  LPARAM lParam2);
-__declspec(dllimport) HMODULE   __stdcall DrvGetModuleHandle(  HDRVR hDriver);
-__declspec(dllimport) HMODULE   __stdcall GetDriverModuleHandle(  HDRVR hDriver);
-__declspec(dllimport) LRESULT   __stdcall DefDriverProc(  DWORD_PTR dwDriverIdentifier,  HDRVR hdrvr,  UINT uMsg,  LPARAM lParam1,  LPARAM lParam2);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef void (__stdcall DRVCALLBACK)(HDRVR hdrvr, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2);
-
-typedef DRVCALLBACK  *LPDRVCALLBACK;
-
-typedef DRVCALLBACK     *PDRVCALLBACK;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) BOOL __stdcall sndPlaySoundA(  LPCSTR pszSound,  UINT fuSound);
-__declspec(dllimport) BOOL __stdcall sndPlaySoundW(  LPCWSTR pszSound,  UINT fuSound);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) BOOL __stdcall PlaySoundA(  LPCSTR pszSound,  HMODULE hmod,  DWORD fdwSound);
-__declspec(dllimport) BOOL __stdcall PlaySoundW(  LPCWSTR pszSound,  HMODULE hmod,  DWORD fdwSound);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct HWAVE__ { int unused; }; typedef struct HWAVE__ *HWAVE;
-struct HWAVEIN__ { int unused; }; typedef struct HWAVEIN__ *HWAVEIN;
-struct HWAVEOUT__ { int unused; }; typedef struct HWAVEOUT__ *HWAVEOUT;
-typedef HWAVEIN  *LPHWAVEIN;
-typedef HWAVEOUT  *LPHWAVEOUT;
-typedef DRVCALLBACK WAVECALLBACK;
-typedef WAVECALLBACK  *LPWAVECALLBACK;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct wavehdr_tag {
-    LPSTR       lpData;                 
-    DWORD       dwBufferLength;         
-    DWORD       dwBytesRecorded;        
-    DWORD_PTR   dwUser;                 
-    DWORD       dwFlags;                
-    DWORD       dwLoops;                
-    struct wavehdr_tag  *lpNext;     
-    DWORD_PTR   reserved;               
-} WAVEHDR, *PWAVEHDR,  *NPWAVEHDR,  *LPWAVEHDR;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagWAVEOUTCAPSA {
-    WORD    wMid;                  
-    WORD    wPid;                  
-    MMVERSION vDriverVersion;      
-    CHAR    szPname[32];  
-    DWORD   dwFormats;             
-    WORD    wChannels;             
-    WORD    wReserved1;            
-    DWORD   dwSupport;             
-} WAVEOUTCAPSA, *PWAVEOUTCAPSA, *NPWAVEOUTCAPSA, *LPWAVEOUTCAPSA;
-typedef struct tagWAVEOUTCAPSW {
-    WORD    wMid;                  
-    WORD    wPid;                  
-    MMVERSION vDriverVersion;      
-    WCHAR   szPname[32];  
-    DWORD   dwFormats;             
-    WORD    wChannels;             
-    WORD    wReserved1;            
-    DWORD   dwSupport;             
-} WAVEOUTCAPSW, *PWAVEOUTCAPSW, *NPWAVEOUTCAPSW, *LPWAVEOUTCAPSW;
-
-typedef WAVEOUTCAPSW WAVEOUTCAPS;
-typedef PWAVEOUTCAPSW PWAVEOUTCAPS;
-typedef NPWAVEOUTCAPSW NPWAVEOUTCAPS;
-typedef LPWAVEOUTCAPSW LPWAVEOUTCAPS;
-
-
-
-
-
-
-typedef struct tagWAVEOUTCAPS2A {
-    WORD    wMid;                  
-    WORD    wPid;                  
-    MMVERSION vDriverVersion;      
-    CHAR    szPname[32];  
-    DWORD   dwFormats;             
-    WORD    wChannels;             
-    WORD    wReserved1;            
-    DWORD   dwSupport;             
-    GUID    ManufacturerGuid;      
-    GUID    ProductGuid;           
-    GUID    NameGuid;              
-} WAVEOUTCAPS2A, *PWAVEOUTCAPS2A, *NPWAVEOUTCAPS2A, *LPWAVEOUTCAPS2A;
-typedef struct tagWAVEOUTCAPS2W {
-    WORD    wMid;                  
-    WORD    wPid;                  
-    MMVERSION vDriverVersion;      
-    WCHAR   szPname[32];  
-    DWORD   dwFormats;             
-    WORD    wChannels;             
-    WORD    wReserved1;            
-    DWORD   dwSupport;             
-    GUID    ManufacturerGuid;      
-    GUID    ProductGuid;           
-    GUID    NameGuid;              
-} WAVEOUTCAPS2W, *PWAVEOUTCAPS2W, *NPWAVEOUTCAPS2W, *LPWAVEOUTCAPS2W;
-
-typedef WAVEOUTCAPS2W WAVEOUTCAPS2;
-typedef PWAVEOUTCAPS2W PWAVEOUTCAPS2;
-typedef NPWAVEOUTCAPS2W NPWAVEOUTCAPS2;
-typedef LPWAVEOUTCAPS2W LPWAVEOUTCAPS2;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagWAVEINCAPSA {
-    WORD    wMid;                    
-    WORD    wPid;                    
-    MMVERSION vDriverVersion;        
-    CHAR    szPname[32];    
-    DWORD   dwFormats;               
-    WORD    wChannels;               
-    WORD    wReserved1;              
-} WAVEINCAPSA, *PWAVEINCAPSA, *NPWAVEINCAPSA, *LPWAVEINCAPSA;
-typedef struct tagWAVEINCAPSW {
-    WORD    wMid;                    
-    WORD    wPid;                    
-    MMVERSION vDriverVersion;        
-    WCHAR   szPname[32];    
-    DWORD   dwFormats;               
-    WORD    wChannels;               
-    WORD    wReserved1;              
-} WAVEINCAPSW, *PWAVEINCAPSW, *NPWAVEINCAPSW, *LPWAVEINCAPSW;
-
-typedef WAVEINCAPSW WAVEINCAPS;
-typedef PWAVEINCAPSW PWAVEINCAPS;
-typedef NPWAVEINCAPSW NPWAVEINCAPS;
-typedef LPWAVEINCAPSW LPWAVEINCAPS;
-
-
-
-
-
-
-typedef struct tagWAVEINCAPS2A {
-    WORD    wMid;                    
-    WORD    wPid;                    
-    MMVERSION vDriverVersion;        
-    CHAR    szPname[32];    
-    DWORD   dwFormats;               
-    WORD    wChannels;               
-    WORD    wReserved1;              
-    GUID    ManufacturerGuid;        
-    GUID    ProductGuid;             
-    GUID    NameGuid;                
-} WAVEINCAPS2A, *PWAVEINCAPS2A, *NPWAVEINCAPS2A, *LPWAVEINCAPS2A;
-typedef struct tagWAVEINCAPS2W {
-    WORD    wMid;                    
-    WORD    wPid;                    
-    MMVERSION vDriverVersion;        
-    WCHAR   szPname[32];    
-    DWORD   dwFormats;               
-    WORD    wChannels;               
-    WORD    wReserved1;              
-    GUID    ManufacturerGuid;        
-    GUID    ProductGuid;             
-    GUID    NameGuid;                
-} WAVEINCAPS2W, *PWAVEINCAPS2W, *NPWAVEINCAPS2W, *LPWAVEINCAPS2W;
-
-typedef WAVEINCAPS2W WAVEINCAPS2;
-typedef PWAVEINCAPS2W PWAVEINCAPS2;
-typedef NPWAVEINCAPS2W NPWAVEINCAPS2;
-typedef LPWAVEINCAPS2W LPWAVEINCAPS2;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct waveformat_tag {
-    WORD    wFormatTag;        
-    WORD    nChannels;         
-    DWORD   nSamplesPerSec;    
-    DWORD   nAvgBytesPerSec;   
-    WORD    nBlockAlign;       
-} WAVEFORMAT, *PWAVEFORMAT,  *NPWAVEFORMAT,  *LPWAVEFORMAT;
-
-
-
-
-
-
-typedef struct pcmwaveformat_tag {
-    WAVEFORMAT  wf;
-    WORD        wBitsPerSample;
-} PCMWAVEFORMAT, *PPCMWAVEFORMAT,  *NPPCMWAVEFORMAT,  *LPPCMWAVEFORMAT;
-
-
-
-
-
-
-
-
-
-typedef struct tWAVEFORMATEX
-{
-    WORD        wFormatTag;         
-    WORD        nChannels;          
-    DWORD       nSamplesPerSec;     
-    DWORD       nAvgBytesPerSec;    
-    WORD        nBlockAlign;        
-    WORD        wBitsPerSample;     
-    WORD        cbSize;             
-                                    
-} WAVEFORMATEX, *PWAVEFORMATEX,  *NPWAVEFORMATEX,  *LPWAVEFORMATEX;
-
-
-typedef const WAVEFORMATEX  *LPCWAVEFORMATEX;
-
-
-__declspec(dllimport) UINT __stdcall waveOutGetNumDevs(void);
-
-
-
-__declspec(dllimport) MMRESULT __stdcall waveOutGetDevCapsA(  UINT_PTR uDeviceID,  LPWAVEOUTCAPSA pwoc,  UINT cbwoc);
-__declspec(dllimport) MMRESULT __stdcall waveOutGetDevCapsW(  UINT_PTR uDeviceID,  LPWAVEOUTCAPSW pwoc,  UINT cbwoc);
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall waveOutGetVolume(  HWAVEOUT hwo,  LPDWORD pdwVolume);
-__declspec(dllimport) MMRESULT __stdcall waveOutSetVolume(  HWAVEOUT hwo,  DWORD dwVolume);
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall waveOutGetErrorTextA(  MMRESULT mmrError,  LPSTR pszText,  UINT cchText);
-__declspec(dllimport) MMRESULT __stdcall waveOutGetErrorTextW(  MMRESULT mmrError,  LPWSTR pszText,  UINT cchText);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall waveOutOpen(  LPHWAVEOUT phwo,  UINT uDeviceID,
-     LPCWAVEFORMATEX pwfx,  DWORD_PTR dwCallback,  DWORD_PTR dwInstance,  DWORD fdwOpen);
-
-__declspec(dllimport) MMRESULT __stdcall waveOutClose(   HWAVEOUT hwo);
-__declspec(dllimport) MMRESULT __stdcall waveOutPrepareHeader(  HWAVEOUT hwo,   LPWAVEHDR pwh,  UINT cbwh);
-__declspec(dllimport) MMRESULT __stdcall waveOutUnprepareHeader(  HWAVEOUT hwo,   LPWAVEHDR pwh,  UINT cbwh);
-__declspec(dllimport) MMRESULT __stdcall waveOutWrite(  HWAVEOUT hwo,   LPWAVEHDR pwh,  UINT cbwh);
-__declspec(dllimport) MMRESULT __stdcall waveOutPause(  HWAVEOUT hwo);
-__declspec(dllimport) MMRESULT __stdcall waveOutRestart(  HWAVEOUT hwo);
-__declspec(dllimport) MMRESULT __stdcall waveOutReset(  HWAVEOUT hwo);
-__declspec(dllimport) MMRESULT __stdcall waveOutBreakLoop(  HWAVEOUT hwo);
-__declspec(dllimport) MMRESULT __stdcall waveOutGetPosition(  HWAVEOUT hwo,   LPMMTIME pmmt,  UINT cbmmt);
-__declspec(dllimport) MMRESULT __stdcall waveOutGetPitch(  HWAVEOUT hwo,  LPDWORD pdwPitch);
-__declspec(dllimport) MMRESULT __stdcall waveOutSetPitch(  HWAVEOUT hwo,  DWORD dwPitch);
-__declspec(dllimport) MMRESULT __stdcall waveOutGetPlaybackRate(  HWAVEOUT hwo,  LPDWORD pdwRate);
-__declspec(dllimport) MMRESULT __stdcall waveOutSetPlaybackRate(  HWAVEOUT hwo,  DWORD dwRate);
-__declspec(dllimport) MMRESULT __stdcall waveOutGetID(  HWAVEOUT hwo,  LPUINT puDeviceID);
-
-
-
-__declspec(dllimport) MMRESULT __stdcall waveOutMessage(  HWAVEOUT hwo,  UINT uMsg,  DWORD_PTR dw1,  DWORD_PTR dw2);
-
-
-
-
-
-__declspec(dllimport) UINT __stdcall waveInGetNumDevs(void);
-
-
-
-__declspec(dllimport) MMRESULT __stdcall waveInGetDevCapsA(  UINT_PTR uDeviceID,  LPWAVEINCAPSA pwic,  UINT cbwic);
-__declspec(dllimport) MMRESULT __stdcall waveInGetDevCapsW(  UINT_PTR uDeviceID,  LPWAVEINCAPSW pwic,  UINT cbwic);
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall waveInGetErrorTextA( MMRESULT mmrError,  LPSTR pszText,  UINT cchText);
-__declspec(dllimport) MMRESULT __stdcall waveInGetErrorTextW( MMRESULT mmrError,  LPWSTR pszText,  UINT cchText);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall waveInOpen(  LPHWAVEIN phwi,  UINT uDeviceID,
-     LPCWAVEFORMATEX pwfx,  DWORD_PTR dwCallback,  DWORD_PTR dwInstance,  DWORD fdwOpen);
-
-__declspec(dllimport) MMRESULT __stdcall waveInClose(   HWAVEIN hwi);
-__declspec(dllimport) MMRESULT __stdcall waveInPrepareHeader(  HWAVEIN hwi,   LPWAVEHDR pwh,  UINT cbwh);
-__declspec(dllimport) MMRESULT __stdcall waveInUnprepareHeader(  HWAVEIN hwi,   LPWAVEHDR pwh, UINT cbwh);
-__declspec(dllimport) MMRESULT __stdcall waveInAddBuffer(  HWAVEIN hwi,   LPWAVEHDR pwh,  UINT cbwh);
-__declspec(dllimport) MMRESULT __stdcall waveInStart(  HWAVEIN hwi);
-__declspec(dllimport) MMRESULT __stdcall waveInStop(  HWAVEIN hwi);
-__declspec(dllimport) MMRESULT __stdcall waveInReset(  HWAVEIN hwi);
-__declspec(dllimport) MMRESULT __stdcall waveInGetPosition(  HWAVEIN hwi,   LPMMTIME pmmt,  UINT cbmmt);
-__declspec(dllimport) MMRESULT __stdcall waveInGetID(  HWAVEIN hwi,  LPUINT puDeviceID);
-
-
-
-__declspec(dllimport) MMRESULT __stdcall waveInMessage(  HWAVEIN hwi,  UINT uMsg,  DWORD_PTR dw1,  DWORD_PTR dw2);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct HMIDI__ { int unused; }; typedef struct HMIDI__ *HMIDI;
-struct HMIDIIN__ { int unused; }; typedef struct HMIDIIN__ *HMIDIIN;
-struct HMIDIOUT__ { int unused; }; typedef struct HMIDIOUT__ *HMIDIOUT;
-struct HMIDISTRM__ { int unused; }; typedef struct HMIDISTRM__ *HMIDISTRM;
-typedef HMIDI  *LPHMIDI;
-typedef HMIDIIN  *LPHMIDIIN;
-typedef HMIDIOUT  *LPHMIDIOUT;
-typedef HMIDISTRM  *LPHMIDISTRM;
-typedef DRVCALLBACK MIDICALLBACK;
-typedef MIDICALLBACK  *LPMIDICALLBACK;
-
-typedef WORD PATCHARRAY[128];
-typedef WORD  *LPPATCHARRAY;
-typedef WORD KEYARRAY[128];
-typedef WORD  *LPKEYARRAY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMIDIOUTCAPSA {
-    WORD    wMid;                  
-    WORD    wPid;                  
-    MMVERSION vDriverVersion;      
-    CHAR    szPname[32];  
-    WORD    wTechnology;           
-    WORD    wVoices;               
-    WORD    wNotes;                
-    WORD    wChannelMask;          
-    DWORD   dwSupport;             
-} MIDIOUTCAPSA, *PMIDIOUTCAPSA, *NPMIDIOUTCAPSA, *LPMIDIOUTCAPSA;
-typedef struct tagMIDIOUTCAPSW {
-    WORD    wMid;                  
-    WORD    wPid;                  
-    MMVERSION vDriverVersion;      
-    WCHAR   szPname[32];  
-    WORD    wTechnology;           
-    WORD    wVoices;               
-    WORD    wNotes;                
-    WORD    wChannelMask;          
-    DWORD   dwSupport;             
-} MIDIOUTCAPSW, *PMIDIOUTCAPSW, *NPMIDIOUTCAPSW, *LPMIDIOUTCAPSW;
-
-typedef MIDIOUTCAPSW MIDIOUTCAPS;
-typedef PMIDIOUTCAPSW PMIDIOUTCAPS;
-typedef NPMIDIOUTCAPSW NPMIDIOUTCAPS;
-typedef LPMIDIOUTCAPSW LPMIDIOUTCAPS;
-
-
-
-
-
-
-typedef struct tagMIDIOUTCAPS2A {
-    WORD    wMid;                  
-    WORD    wPid;                  
-    MMVERSION vDriverVersion;      
-    CHAR    szPname[32];  
-    WORD    wTechnology;           
-    WORD    wVoices;               
-    WORD    wNotes;                
-    WORD    wChannelMask;          
-    DWORD   dwSupport;             
-    GUID    ManufacturerGuid;      
-    GUID    ProductGuid;           
-    GUID    NameGuid;              
-} MIDIOUTCAPS2A, *PMIDIOUTCAPS2A, *NPMIDIOUTCAPS2A, *LPMIDIOUTCAPS2A;
-typedef struct tagMIDIOUTCAPS2W {
-    WORD    wMid;                  
-    WORD    wPid;                  
-    MMVERSION vDriverVersion;      
-    WCHAR   szPname[32];  
-    WORD    wTechnology;           
-    WORD    wVoices;               
-    WORD    wNotes;                
-    WORD    wChannelMask;          
-    DWORD   dwSupport;             
-    GUID    ManufacturerGuid;      
-    GUID    ProductGuid;           
-    GUID    NameGuid;              
-} MIDIOUTCAPS2W, *PMIDIOUTCAPS2W, *NPMIDIOUTCAPS2W, *LPMIDIOUTCAPS2W;
-
-typedef MIDIOUTCAPS2W MIDIOUTCAPS2;
-typedef PMIDIOUTCAPS2W PMIDIOUTCAPS2;
-typedef NPMIDIOUTCAPS2W NPMIDIOUTCAPS2;
-typedef LPMIDIOUTCAPS2W LPMIDIOUTCAPS2;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMIDIINCAPSA {
-    WORD        wMid;                   
-    WORD        wPid;                   
-    MMVERSION   vDriverVersion;         
-    CHAR        szPname[32];   
-
-    DWORD   dwSupport;             
-
-} MIDIINCAPSA, *PMIDIINCAPSA, *NPMIDIINCAPSA, *LPMIDIINCAPSA;
-typedef struct tagMIDIINCAPSW {
-    WORD        wMid;                   
-    WORD        wPid;                   
-    MMVERSION   vDriverVersion;         
-    WCHAR       szPname[32];   
-
-    DWORD   dwSupport;             
-
-} MIDIINCAPSW, *PMIDIINCAPSW, *NPMIDIINCAPSW, *LPMIDIINCAPSW;
-
-typedef MIDIINCAPSW MIDIINCAPS;
-typedef PMIDIINCAPSW PMIDIINCAPS;
-typedef NPMIDIINCAPSW NPMIDIINCAPS;
-typedef LPMIDIINCAPSW LPMIDIINCAPS;
-
-
-
-
-
-
-typedef struct tagMIDIINCAPS2A {
-    WORD        wMid;                   
-    WORD        wPid;                   
-    MMVERSION   vDriverVersion;         
-    CHAR        szPname[32];   
-
-    DWORD       dwSupport;              
-
-    GUID        ManufacturerGuid;       
-    GUID        ProductGuid;            
-    GUID        NameGuid;               
-} MIDIINCAPS2A, *PMIDIINCAPS2A, *NPMIDIINCAPS2A, *LPMIDIINCAPS2A;
-typedef struct tagMIDIINCAPS2W {
-    WORD        wMid;                   
-    WORD        wPid;                   
-    MMVERSION   vDriverVersion;         
-    WCHAR       szPname[32];   
-
-    DWORD       dwSupport;              
-
-    GUID        ManufacturerGuid;       
-    GUID        ProductGuid;            
-    GUID        NameGuid;               
-} MIDIINCAPS2W, *PMIDIINCAPS2W, *NPMIDIINCAPS2W, *LPMIDIINCAPS2W;
-
-typedef MIDIINCAPS2W MIDIINCAPS2;
-typedef PMIDIINCAPS2W PMIDIINCAPS2;
-typedef NPMIDIINCAPS2W NPMIDIINCAPS2;
-typedef LPMIDIINCAPS2W LPMIDIINCAPS2;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct midihdr_tag {
-    LPSTR       lpData;               
-    DWORD       dwBufferLength;       
-    DWORD       dwBytesRecorded;      
-    DWORD_PTR   dwUser;               
-    DWORD       dwFlags;              
-    struct midihdr_tag  *lpNext;   
-    DWORD_PTR   reserved;             
-
-    DWORD       dwOffset;             
-    DWORD_PTR   dwReserved[8];        
-
-} MIDIHDR, *PMIDIHDR,  *NPMIDIHDR,  *LPMIDIHDR;
-
-
-
-typedef struct midievent_tag
-{
-    DWORD       dwDeltaTime;          
-    DWORD       dwStreamID;           
-    DWORD       dwEvent;              
-    DWORD       dwParms[1];           
-} MIDIEVENT;
-
-typedef struct midistrmbuffver_tag
-{
-    DWORD       dwVersion;                  
-    DWORD       dwMid;                      
-    DWORD       dwOEMVersion;               
-} MIDISTRMBUFFVER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct midiproptimediv_tag
-{
-    DWORD       cbStruct;
-    DWORD       dwTimeDiv;
-} MIDIPROPTIMEDIV,  *LPMIDIPROPTIMEDIV;
-
-typedef struct midiproptempo_tag
-{
-    DWORD       cbStruct;
-    DWORD       dwTempo;
-} MIDIPROPTEMPO,  *LPMIDIPROPTEMPO;
-
-
-
-
-__declspec(dllimport) UINT __stdcall midiOutGetNumDevs(void);
-
-__declspec(dllimport) MMRESULT __stdcall midiStreamOpen(  LPHMIDISTRM phms,  LPUINT puDeviceID,  DWORD cMidi,  DWORD_PTR dwCallback,  DWORD_PTR dwInstance,  DWORD fdwOpen);
-__declspec(dllimport) MMRESULT __stdcall midiStreamClose(  HMIDISTRM hms);
-
-__declspec(dllimport) MMRESULT __stdcall midiStreamProperty(  HMIDISTRM hms,  LPBYTE lppropdata,  DWORD dwProperty);
-__declspec(dllimport) MMRESULT __stdcall midiStreamPosition(  HMIDISTRM hms,  LPMMTIME lpmmt,  UINT cbmmt);
-
-__declspec(dllimport) MMRESULT __stdcall midiStreamOut(  HMIDISTRM hms,  LPMIDIHDR pmh,  UINT cbmh);
-__declspec(dllimport) MMRESULT __stdcall midiStreamPause(  HMIDISTRM hms);
-__declspec(dllimport) MMRESULT __stdcall midiStreamRestart(  HMIDISTRM hms);
-__declspec(dllimport) MMRESULT __stdcall midiStreamStop(  HMIDISTRM hms);
-
-
-__declspec(dllimport) MMRESULT __stdcall midiConnect(  HMIDI hmi,  HMIDIOUT hmo,  LPVOID pReserved);
-__declspec(dllimport) MMRESULT __stdcall midiDisconnect(  HMIDI hmi,  HMIDIOUT hmo,  LPVOID pReserved);
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall midiOutGetDevCapsA(  UINT_PTR uDeviceID,  LPMIDIOUTCAPSA pmoc,  UINT cbmoc);
-__declspec(dllimport) MMRESULT __stdcall midiOutGetDevCapsW(  UINT_PTR uDeviceID,  LPMIDIOUTCAPSW pmoc,  UINT cbmoc);
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall midiOutGetVolume(  HMIDIOUT hmo,  LPDWORD pdwVolume);
-__declspec(dllimport) MMRESULT __stdcall midiOutSetVolume(  HMIDIOUT hmo,  DWORD dwVolume);
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall midiOutGetErrorTextA(  MMRESULT mmrError,  LPSTR pszText,  UINT cchText);
-__declspec(dllimport) MMRESULT __stdcall midiOutGetErrorTextW(  MMRESULT mmrError,  LPWSTR pszText,  UINT cchText);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall midiOutOpen(  LPHMIDIOUT phmo,  UINT uDeviceID,
-     DWORD_PTR dwCallback,  DWORD_PTR dwInstance,  DWORD fdwOpen);
-__declspec(dllimport) MMRESULT __stdcall midiOutClose(   HMIDIOUT hmo);
-__declspec(dllimport) MMRESULT __stdcall midiOutPrepareHeader(  HMIDIOUT hmo,   LPMIDIHDR pmh,  UINT cbmh);
-__declspec(dllimport) MMRESULT __stdcall midiOutUnprepareHeader( HMIDIOUT hmo,   LPMIDIHDR pmh,  UINT cbmh);
-__declspec(dllimport) MMRESULT __stdcall midiOutShortMsg(  HMIDIOUT hmo,  DWORD dwMsg);
-__declspec(dllimport) MMRESULT __stdcall midiOutLongMsg( HMIDIOUT hmo,  LPMIDIHDR pmh,  UINT cbmh);
-__declspec(dllimport) MMRESULT __stdcall midiOutReset(  HMIDIOUT hmo);
-__declspec(dllimport) MMRESULT __stdcall midiOutCachePatches(  HMIDIOUT hmo,  UINT uBank,  LPWORD pwpa,  UINT fuCache);
-__declspec(dllimport) MMRESULT __stdcall midiOutCacheDrumPatches(  HMIDIOUT hmo,  UINT uPatch,  LPWORD pwkya,  UINT fuCache);
-__declspec(dllimport) MMRESULT __stdcall midiOutGetID(  HMIDIOUT hmo,  LPUINT puDeviceID);
-
-
-
-__declspec(dllimport) MMRESULT __stdcall midiOutMessage(  HMIDIOUT hmo,  UINT uMsg,  DWORD_PTR dw1,  DWORD_PTR dw2);
-
-
-
-
-
-__declspec(dllimport) UINT __stdcall midiInGetNumDevs(void);
-
-
-
-__declspec(dllimport) MMRESULT __stdcall midiInGetDevCapsA(  UINT_PTR uDeviceID,  LPMIDIINCAPSA pmic,  UINT cbmic);
-__declspec(dllimport) MMRESULT __stdcall midiInGetDevCapsW(  UINT_PTR uDeviceID,  LPMIDIINCAPSW pmic,  UINT cbmic);
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall midiInGetErrorTextA(  MMRESULT mmrError,  LPSTR pszText,  UINT cchText);
-__declspec(dllimport) MMRESULT __stdcall midiInGetErrorTextW(  MMRESULT mmrError,  LPWSTR pszText,  UINT cchText);
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall midiInOpen(  LPHMIDIIN phmi,  UINT uDeviceID,
-         DWORD_PTR dwCallback,  DWORD_PTR dwInstance,  DWORD fdwOpen);
-__declspec(dllimport) MMRESULT __stdcall midiInClose(   HMIDIIN hmi);
-__declspec(dllimport) MMRESULT __stdcall midiInPrepareHeader(  HMIDIIN hmi,   LPMIDIHDR pmh,  UINT cbmh);
-__declspec(dllimport) MMRESULT __stdcall midiInUnprepareHeader(  HMIDIIN hmi,   LPMIDIHDR pmh,  UINT cbmh);
-__declspec(dllimport) MMRESULT __stdcall midiInAddBuffer(  HMIDIIN hmi,  LPMIDIHDR pmh,  UINT cbmh);
-__declspec(dllimport) MMRESULT __stdcall midiInStart(  HMIDIIN hmi);
-__declspec(dllimport) MMRESULT __stdcall midiInStop(  HMIDIIN hmi);
-__declspec(dllimport) MMRESULT __stdcall midiInReset(  HMIDIIN hmi);
-__declspec(dllimport) MMRESULT __stdcall midiInGetID(  HMIDIIN hmi,  LPUINT puDeviceID);
-
-
-
-__declspec(dllimport) MMRESULT __stdcall midiInMessage(  HMIDIIN hmi,  UINT uMsg,  DWORD_PTR dw1,  DWORD_PTR dw2);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagAUXCAPSA {
-    WORD        wMid;                
-    WORD        wPid;                
-    MMVERSION   vDriverVersion;      
-    CHAR        szPname[32];
-    WORD        wTechnology;         
-    WORD        wReserved1;          
-    DWORD       dwSupport;           
-} AUXCAPSA, *PAUXCAPSA, *NPAUXCAPSA, *LPAUXCAPSA;
-typedef struct tagAUXCAPSW {
-    WORD        wMid;                
-    WORD        wPid;                
-    MMVERSION   vDriverVersion;      
-    WCHAR       szPname[32];
-    WORD        wTechnology;         
-    WORD        wReserved1;          
-    DWORD       dwSupport;           
-} AUXCAPSW, *PAUXCAPSW, *NPAUXCAPSW, *LPAUXCAPSW;
-
-typedef AUXCAPSW AUXCAPS;
-typedef PAUXCAPSW PAUXCAPS;
-typedef NPAUXCAPSW NPAUXCAPS;
-typedef LPAUXCAPSW LPAUXCAPS;
-
-
-
-
-
-
-typedef struct tagAUXCAPS2A {
-    WORD        wMid;                
-    WORD        wPid;                
-    MMVERSION   vDriverVersion;      
-    CHAR        szPname[32];
-    WORD        wTechnology;         
-    WORD        wReserved1;          
-    DWORD       dwSupport;           
-    GUID        ManufacturerGuid;    
-    GUID        ProductGuid;         
-    GUID        NameGuid;            
-} AUXCAPS2A, *PAUXCAPS2A, *NPAUXCAPS2A, *LPAUXCAPS2A;
-typedef struct tagAUXCAPS2W {
-    WORD        wMid;                
-    WORD        wPid;                
-    MMVERSION   vDriverVersion;      
-    WCHAR       szPname[32];
-    WORD        wTechnology;         
-    WORD        wReserved1;          
-    DWORD       dwSupport;           
-    GUID        ManufacturerGuid;    
-    GUID        ProductGuid;         
-    GUID        NameGuid;            
-} AUXCAPS2W, *PAUXCAPS2W, *NPAUXCAPS2W, *LPAUXCAPS2W;
-
-typedef AUXCAPS2W AUXCAPS2;
-typedef PAUXCAPS2W PAUXCAPS2;
-typedef NPAUXCAPS2W NPAUXCAPS2;
-typedef LPAUXCAPS2W LPAUXCAPS2;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) UINT __stdcall auxGetNumDevs(void);
-
-
-__declspec(dllimport) MMRESULT __stdcall auxGetDevCapsA(  UINT_PTR uDeviceID,  LPAUXCAPSA pac,  UINT cbac);
-__declspec(dllimport) MMRESULT __stdcall auxGetDevCapsW(  UINT_PTR uDeviceID,  LPAUXCAPSW pac,  UINT cbac);
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall auxSetVolume(  UINT uDeviceID,  DWORD dwVolume);
-__declspec(dllimport) MMRESULT __stdcall auxGetVolume(  UINT uDeviceID,  LPDWORD pdwVolume);
-
-
-
-__declspec(dllimport) MMRESULT __stdcall auxOutMessage(  UINT uDeviceID,  UINT uMsg,  DWORD_PTR dw1,  DWORD_PTR dw2);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct HMIXEROBJ__ { int unused; }; typedef struct HMIXEROBJ__ *HMIXEROBJ;
-typedef HMIXEROBJ  *LPHMIXEROBJ;
-
-struct HMIXER__ { int unused; }; typedef struct HMIXER__ *HMIXER;
-typedef HMIXER      *LPHMIXER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) UINT __stdcall mixerGetNumDevs(void);
-
-
-
-typedef struct tagMIXERCAPSA {
-    WORD            wMid;                   
-    WORD            wPid;                   
-    MMVERSION       vDriverVersion;         
-    CHAR            szPname[32];   
-    DWORD           fdwSupport;             
-    DWORD           cDestinations;          
-} MIXERCAPSA, *PMIXERCAPSA, *LPMIXERCAPSA;
-typedef struct tagMIXERCAPSW {
-    WORD            wMid;                   
-    WORD            wPid;                   
-    MMVERSION       vDriverVersion;         
-    WCHAR           szPname[32];   
-    DWORD           fdwSupport;             
-    DWORD           cDestinations;          
-} MIXERCAPSW, *PMIXERCAPSW, *LPMIXERCAPSW;
-
-typedef MIXERCAPSW MIXERCAPS;
-typedef PMIXERCAPSW PMIXERCAPS;
-typedef LPMIXERCAPSW LPMIXERCAPS;
-
-
-
-
-
-typedef struct tagMIXERCAPS2A {
-    WORD            wMid;                   
-    WORD            wPid;                   
-    MMVERSION       vDriverVersion;         
-    CHAR            szPname[32];   
-    DWORD           fdwSupport;             
-    DWORD           cDestinations;          
-    GUID            ManufacturerGuid;       
-    GUID            ProductGuid;            
-    GUID            NameGuid;               
-} MIXERCAPS2A, *PMIXERCAPS2A, *LPMIXERCAPS2A;
-typedef struct tagMIXERCAPS2W {
-    WORD            wMid;                   
-    WORD            wPid;                   
-    MMVERSION       vDriverVersion;         
-    WCHAR           szPname[32];   
-    DWORD           fdwSupport;             
-    DWORD           cDestinations;          
-    GUID            ManufacturerGuid;       
-    GUID            ProductGuid;            
-    GUID            NameGuid;               
-} MIXERCAPS2W, *PMIXERCAPS2W, *LPMIXERCAPS2W;
-
-typedef MIXERCAPS2W MIXERCAPS2;
-typedef PMIXERCAPS2W PMIXERCAPS2;
-typedef LPMIXERCAPS2W LPMIXERCAPS2;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall mixerGetDevCapsA(  UINT_PTR uMxId,  LPMIXERCAPSA pmxcaps,  UINT cbmxcaps);
-__declspec(dllimport) MMRESULT __stdcall mixerGetDevCapsW(  UINT_PTR uMxId,  LPMIXERCAPSW pmxcaps,  UINT cbmxcaps);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall mixerOpen(  LPHMIXER phmx,  UINT uMxId,  DWORD_PTR dwCallback,  DWORD_PTR dwInstance,  DWORD fdwOpen);
-
-
-__declspec(dllimport) MMRESULT __stdcall mixerClose(   HMIXER hmx);
-
-__declspec(dllimport) DWORD __stdcall mixerMessage(  HMIXER hmx,  UINT uMsg,  DWORD_PTR dwParam1,  DWORD_PTR dwParam2);
-
-
-
-typedef struct tagMIXERLINEA {
-    DWORD       cbStruct;               
-    DWORD       dwDestination;          
-    DWORD       dwSource;               
-    DWORD       dwLineID;               
-    DWORD       fdwLine;                
-    DWORD_PTR   dwUser;                 
-    DWORD       dwComponentType;        
-    DWORD       cChannels;              
-    DWORD       cConnections;           
-    DWORD       cControls;              
-    CHAR        szShortName[16];
-    CHAR        szName[64];
-    struct {
-        DWORD       dwType;                 
-        DWORD       dwDeviceID;             
-        WORD        wMid;                   
-        WORD        wPid;                   
-        MMVERSION   vDriverVersion;         
-        CHAR        szPname[32];   
-    } Target;
-} MIXERLINEA, *PMIXERLINEA, *LPMIXERLINEA;
-typedef struct tagMIXERLINEW {
-    DWORD       cbStruct;               
-    DWORD       dwDestination;          
-    DWORD       dwSource;               
-    DWORD       dwLineID;               
-    DWORD       fdwLine;                
-    DWORD_PTR   dwUser;                 
-    DWORD       dwComponentType;        
-    DWORD       cChannels;              
-    DWORD       cConnections;           
-    DWORD       cControls;              
-    WCHAR       szShortName[16];
-    WCHAR       szName[64];
-    struct {
-        DWORD       dwType;                 
-        DWORD       dwDeviceID;             
-        WORD        wMid;                   
-        WORD        wPid;                   
-        MMVERSION   vDriverVersion;         
-        WCHAR       szPname[32];   
-    } Target;
-} MIXERLINEW, *PMIXERLINEW, *LPMIXERLINEW;
-
-typedef MIXERLINEW MIXERLINE;
-typedef PMIXERLINEW PMIXERLINE;
-typedef LPMIXERLINEW LPMIXERLINE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall mixerGetLineInfoA(  HMIXEROBJ hmxobj,  LPMIXERLINEA pmxl,  DWORD fdwInfo);
-__declspec(dllimport) MMRESULT __stdcall mixerGetLineInfoW(  HMIXEROBJ hmxobj,  LPMIXERLINEW pmxl,  DWORD fdwInfo);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall mixerGetID(  HMIXEROBJ hmxobj,  UINT  *puMxId,  DWORD fdwId);
-
-
-
-
-
-
-
-
-typedef struct tagMIXERCONTROLA {
-    DWORD           cbStruct;           
-    DWORD           dwControlID;        
-    DWORD           dwControlType;      
-    DWORD           fdwControl;         
-    DWORD           cMultipleItems;     
-    CHAR            szShortName[16];
-    CHAR            szName[64];
-    union {
-        struct {
-            LONG    lMinimum;           
-            LONG    lMaximum;           
-        };
-        struct {
-            DWORD   dwMinimum;          
-            DWORD   dwMaximum;          
-        };
-        DWORD       dwReserved[6];
-    } Bounds;
-    union {
-        DWORD       cSteps;             
-        DWORD       cbCustomData;       
-        DWORD       dwReserved[6];      
-    } Metrics;
-} MIXERCONTROLA, *PMIXERCONTROLA, *LPMIXERCONTROLA;
-typedef struct tagMIXERCONTROLW {
-    DWORD           cbStruct;           
-    DWORD           dwControlID;        
-    DWORD           dwControlType;      
-    DWORD           fdwControl;         
-    DWORD           cMultipleItems;     
-    WCHAR           szShortName[16];
-    WCHAR           szName[64];
-    union {
-        struct {
-            LONG    lMinimum;           
-            LONG    lMaximum;           
-        };
-        struct {
-            DWORD   dwMinimum;          
-            DWORD   dwMaximum;          
-        };
-        DWORD       dwReserved[6];
-    } Bounds;
-    union {
-        DWORD       cSteps;             
-        DWORD       cbCustomData;       
-        DWORD       dwReserved[6];      
-    } Metrics;
-} MIXERCONTROLW, *PMIXERCONTROLW, *LPMIXERCONTROLW;
-
-typedef MIXERCONTROLW MIXERCONTROL;
-typedef PMIXERCONTROLW PMIXERCONTROL;
-typedef LPMIXERCONTROLW LPMIXERCONTROL;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMIXERLINECONTROLSA {
-    DWORD           cbStruct;       
-    DWORD           dwLineID;       
-    union {
-        DWORD       dwControlID;    
-        DWORD       dwControlType;  
-    };
-    DWORD           cControls;      
-    DWORD           cbmxctrl;       
-    LPMIXERCONTROLA pamxctrl;       
-} MIXERLINECONTROLSA, *PMIXERLINECONTROLSA, *LPMIXERLINECONTROLSA;
-typedef struct tagMIXERLINECONTROLSW {
-    DWORD           cbStruct;       
-    DWORD           dwLineID;       
-    union {
-        DWORD       dwControlID;    
-        DWORD       dwControlType;  
-    };
-    DWORD           cControls;      
-    DWORD           cbmxctrl;       
-    LPMIXERCONTROLW pamxctrl;       
-} MIXERLINECONTROLSW, *PMIXERLINECONTROLSW, *LPMIXERLINECONTROLSW;
-
-typedef MIXERLINECONTROLSW MIXERLINECONTROLS;
-typedef PMIXERLINECONTROLSW PMIXERLINECONTROLS;
-typedef LPMIXERLINECONTROLSW LPMIXERLINECONTROLS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall mixerGetLineControlsA(  HMIXEROBJ hmxobj,   LPMIXERLINECONTROLSA pmxlc,  DWORD fdwControls);
-__declspec(dllimport) MMRESULT __stdcall mixerGetLineControlsW(  HMIXEROBJ hmxobj,   LPMIXERLINECONTROLSW pmxlc,  DWORD fdwControls);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tMIXERCONTROLDETAILS {
-    DWORD           cbStruct;       
-    DWORD           dwControlID;    
-    DWORD           cChannels;      
-    union {
-        HWND        hwndOwner;      
-        DWORD       cMultipleItems; 
-    };
-    DWORD           cbDetails;      
-    LPVOID          paDetails;      
-} MIXERCONTROLDETAILS, *PMIXERCONTROLDETAILS,  *LPMIXERCONTROLDETAILS;
-
-
-
-
-
-
-
-
-typedef struct tagMIXERCONTROLDETAILS_LISTTEXTA {
-    DWORD           dwParam1;
-    DWORD           dwParam2;
-    CHAR            szName[64];
-} MIXERCONTROLDETAILS_LISTTEXTA, *PMIXERCONTROLDETAILS_LISTTEXTA, *LPMIXERCONTROLDETAILS_LISTTEXTA;
-typedef struct tagMIXERCONTROLDETAILS_LISTTEXTW {
-    DWORD           dwParam1;
-    DWORD           dwParam2;
-    WCHAR           szName[64];
-} MIXERCONTROLDETAILS_LISTTEXTW, *PMIXERCONTROLDETAILS_LISTTEXTW, *LPMIXERCONTROLDETAILS_LISTTEXTW;
-
-typedef MIXERCONTROLDETAILS_LISTTEXTW MIXERCONTROLDETAILS_LISTTEXT;
-typedef PMIXERCONTROLDETAILS_LISTTEXTW PMIXERCONTROLDETAILS_LISTTEXT;
-typedef LPMIXERCONTROLDETAILS_LISTTEXTW LPMIXERCONTROLDETAILS_LISTTEXT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tMIXERCONTROLDETAILS_BOOLEAN {
-    LONG            fValue;
-}       MIXERCONTROLDETAILS_BOOLEAN,
-      *PMIXERCONTROLDETAILS_BOOLEAN,
-  *LPMIXERCONTROLDETAILS_BOOLEAN;
-
-typedef struct tMIXERCONTROLDETAILS_SIGNED {
-    LONG            lValue;
-}       MIXERCONTROLDETAILS_SIGNED,
-      *PMIXERCONTROLDETAILS_SIGNED,
-  *LPMIXERCONTROLDETAILS_SIGNED;
-
-
-typedef struct tMIXERCONTROLDETAILS_UNSIGNED {
-    DWORD           dwValue;
-}       MIXERCONTROLDETAILS_UNSIGNED,
-      *PMIXERCONTROLDETAILS_UNSIGNED,
-  *LPMIXERCONTROLDETAILS_UNSIGNED;
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall mixerGetControlDetailsA(  HMIXEROBJ hmxobj,   LPMIXERCONTROLDETAILS pmxcd,  DWORD fdwDetails);
-__declspec(dllimport) MMRESULT __stdcall mixerGetControlDetailsW(  HMIXEROBJ hmxobj,   LPMIXERCONTROLDETAILS pmxcd,  DWORD fdwDetails);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall mixerSetControlDetails(  HMIXEROBJ hmxobj,  LPMIXERCONTROLDETAILS pmxcd,  DWORD fdwDetails);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef void (__stdcall TIMECALLBACK)(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2);
-
-typedef TIMECALLBACK  *LPTIMECALLBACK;
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                        
-                                        
-
-
-
-
-
-typedef struct timecaps_tag {
-    UINT    wPeriodMin;     
-    UINT    wPeriodMax;     
-} TIMECAPS, *PTIMECAPS,  *NPTIMECAPS,  *LPTIMECAPS;
-
-
-__declspec(dllimport) MMRESULT __stdcall timeGetSystemTime(  LPMMTIME pmmt,  UINT cbmmt);
-__declspec(dllimport) DWORD __stdcall timeGetTime(void);
-__declspec(dllimport) MMRESULT __stdcall timeSetEvent(  UINT uDelay,  UINT uResolution,
-     LPTIMECALLBACK fptc,  DWORD_PTR dwUser,  UINT fuEvent);
-__declspec(dllimport) MMRESULT __stdcall timeKillEvent(  UINT uTimerID);
-__declspec(dllimport) MMRESULT __stdcall timeGetDevCaps(  LPTIMECAPS ptc,  UINT cbtc);
-__declspec(dllimport) MMRESULT __stdcall timeBeginPeriod(  UINT uPeriod);
-__declspec(dllimport) MMRESULT __stdcall timeEndPeriod(  UINT uPeriod);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagJOYCAPSA {
-    WORD    wMid;                
-    WORD    wPid;                
-    CHAR    szPname[32];
-    UINT    wXmin;               
-    UINT    wXmax;               
-    UINT    wYmin;               
-    UINT    wYmax;               
-    UINT    wZmin;               
-    UINT    wZmax;               
-    UINT    wNumButtons;         
-    UINT    wPeriodMin;          
-    UINT    wPeriodMax;          
-
-    UINT    wRmin;               
-    UINT    wRmax;               
-    UINT    wUmin;               
-    UINT    wUmax;               
-    UINT    wVmin;               
-    UINT    wVmax;               
-    UINT    wCaps;               
-    UINT    wMaxAxes;            
-    UINT    wNumAxes;            
-    UINT    wMaxButtons;         
-    CHAR    szRegKey[32];
-    CHAR    szOEMVxD[260]; 
-
-} JOYCAPSA, *PJOYCAPSA, *NPJOYCAPSA, *LPJOYCAPSA;
-typedef struct tagJOYCAPSW {
-    WORD    wMid;                
-    WORD    wPid;                
-    WCHAR   szPname[32];
-    UINT    wXmin;               
-    UINT    wXmax;               
-    UINT    wYmin;               
-    UINT    wYmax;               
-    UINT    wZmin;               
-    UINT    wZmax;               
-    UINT    wNumButtons;         
-    UINT    wPeriodMin;          
-    UINT    wPeriodMax;          
-
-    UINT    wRmin;               
-    UINT    wRmax;               
-    UINT    wUmin;               
-    UINT    wUmax;               
-    UINT    wVmin;               
-    UINT    wVmax;               
-    UINT    wCaps;               
-    UINT    wMaxAxes;            
-    UINT    wNumAxes;            
-    UINT    wMaxButtons;         
-    WCHAR   szRegKey[32];
-    WCHAR   szOEMVxD[260]; 
-
-} JOYCAPSW, *PJOYCAPSW, *NPJOYCAPSW, *LPJOYCAPSW;
-
-typedef JOYCAPSW JOYCAPS;
-typedef PJOYCAPSW PJOYCAPS;
-typedef NPJOYCAPSW NPJOYCAPS;
-typedef LPJOYCAPSW LPJOYCAPS;
-
-
-
-
-
-
-typedef struct tagJOYCAPS2A {
-    WORD    wMid;                
-    WORD    wPid;                
-    CHAR    szPname[32];
-    UINT    wXmin;               
-    UINT    wXmax;               
-    UINT    wYmin;               
-    UINT    wYmax;               
-    UINT    wZmin;               
-    UINT    wZmax;               
-    UINT    wNumButtons;         
-    UINT    wPeriodMin;          
-    UINT    wPeriodMax;          
-    UINT    wRmin;               
-    UINT    wRmax;               
-    UINT    wUmin;               
-    UINT    wUmax;               
-    UINT    wVmin;               
-    UINT    wVmax;               
-    UINT    wCaps;               
-    UINT    wMaxAxes;            
-    UINT    wNumAxes;            
-    UINT    wMaxButtons;         
-    CHAR    szRegKey[32];
-    CHAR    szOEMVxD[260]; 
-    GUID    ManufacturerGuid;    
-    GUID    ProductGuid;         
-    GUID    NameGuid;            
-} JOYCAPS2A, *PJOYCAPS2A, *NPJOYCAPS2A, *LPJOYCAPS2A;
-typedef struct tagJOYCAPS2W {
-    WORD    wMid;                
-    WORD    wPid;                
-    WCHAR   szPname[32];
-    UINT    wXmin;               
-    UINT    wXmax;               
-    UINT    wYmin;               
-    UINT    wYmax;               
-    UINT    wZmin;               
-    UINT    wZmax;               
-    UINT    wNumButtons;         
-    UINT    wPeriodMin;          
-    UINT    wPeriodMax;          
-    UINT    wRmin;               
-    UINT    wRmax;               
-    UINT    wUmin;               
-    UINT    wUmax;               
-    UINT    wVmin;               
-    UINT    wVmax;               
-    UINT    wCaps;               
-    UINT    wMaxAxes;            
-    UINT    wNumAxes;            
-    UINT    wMaxButtons;         
-    WCHAR   szRegKey[32];
-    WCHAR   szOEMVxD[260]; 
-    GUID    ManufacturerGuid;    
-    GUID    ProductGuid;         
-    GUID    NameGuid;            
-} JOYCAPS2W, *PJOYCAPS2W, *NPJOYCAPS2W, *LPJOYCAPS2W;
-
-typedef JOYCAPS2W JOYCAPS2;
-typedef PJOYCAPS2W PJOYCAPS2;
-typedef NPJOYCAPS2W NPJOYCAPS2;
-typedef LPJOYCAPS2W LPJOYCAPS2;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct joyinfo_tag {
-    UINT wXpos;                 
-    UINT wYpos;                 
-    UINT wZpos;                 
-    UINT wButtons;              
-} JOYINFO, *PJOYINFO,  *NPJOYINFO,  *LPJOYINFO;
-
-
-typedef struct joyinfoex_tag {
-    DWORD dwSize;                
-    DWORD dwFlags;               
-    DWORD dwXpos;                
-    DWORD dwYpos;                
-    DWORD dwZpos;                
-    DWORD dwRpos;                
-    DWORD dwUpos;                
-    DWORD dwVpos;                
-    DWORD dwButtons;             
-    DWORD dwButtonNumber;        
-    DWORD dwPOV;                 
-    DWORD dwReserved1;           
-    DWORD dwReserved2;           
-} JOYINFOEX, *PJOYINFOEX,  *NPJOYINFOEX,  *LPJOYINFOEX;
-
-
-
-__declspec(dllimport) UINT __stdcall joyGetNumDevs(void);
-
-
-__declspec(dllimport) MMRESULT __stdcall joyGetDevCapsA(  UINT_PTR uJoyID,  LPJOYCAPSA pjc,  UINT cbjc);
-__declspec(dllimport) MMRESULT __stdcall joyGetDevCapsW(  UINT_PTR uJoyID,  LPJOYCAPSW pjc,  UINT cbjc);
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall joyGetPos(  UINT uJoyID,  LPJOYINFO pji);
-
-
-__declspec(dllimport) MMRESULT __stdcall joyGetPosEx(  UINT uJoyID,  LPJOYINFOEX pji);
-
-
-__declspec(dllimport) MMRESULT __stdcall joyGetThreshold(  UINT uJoyID,  LPUINT puThreshold);
-__declspec(dllimport) MMRESULT __stdcall joyReleaseCapture(  UINT uJoyID);
-__declspec(dllimport) MMRESULT __stdcall joySetCapture(  HWND hwnd,  UINT uJoyID,  UINT uPeriod,
-     BOOL fChanged);
-__declspec(dllimport) MMRESULT __stdcall joySetThreshold(  UINT uJoyID,  UINT uThreshold);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef DWORD           FOURCC;         
-typedef char  *    HPSTR;          
-struct HMMIO__ { int unused; }; typedef struct HMMIO__ *HMMIO;                  
-typedef LRESULT (__stdcall MMIOPROC)(LPSTR lpmmioinfo, UINT uMsg,
-            LPARAM lParam1, LPARAM lParam2);
-typedef MMIOPROC  *LPMMIOPROC;
-
-
-
-typedef struct _MMIOINFO
-{
-        
-        DWORD           dwFlags;        
-        FOURCC          fccIOProc;      
-        LPMMIOPROC      pIOProc;        
-        UINT            wErrorRet;      
-        HTASK           htask;          
-
-        
-        LONG            cchBuffer;      
-        HPSTR           pchBuffer;      
-        HPSTR           pchNext;        
-        HPSTR           pchEndRead;     
-        HPSTR           pchEndWrite;    
-        LONG            lBufOffset;     
-
-        
-        LONG            lDiskOffset;    
-        DWORD           adwInfo[3];     
-
-        
-        DWORD           dwReserved1;    
-        DWORD           dwReserved2;    
-        HMMIO           hmmio;          
-} MMIOINFO, *PMMIOINFO,  *NPMMIOINFO,  *LPMMIOINFO;
-typedef const MMIOINFO  *LPCMMIOINFO;
-
-
-typedef struct _MMCKINFO
-{
-        FOURCC          ckid;           
-        DWORD           cksize;         
-        FOURCC          fccType;        
-        DWORD           dwDataOffset;   
-        DWORD           dwFlags;        
-} MMCKINFO, *PMMCKINFO,  *NPMMCKINFO,  *LPMMCKINFO;
-typedef const MMCKINFO *LPCMMCKINFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) FOURCC __stdcall mmioStringToFOURCCA(  LPCSTR sz,  UINT uFlags);
-__declspec(dllimport) FOURCC __stdcall mmioStringToFOURCCW(  LPCWSTR sz,  UINT uFlags);
-
-
-
-
-
-__declspec(dllimport) LPMMIOPROC __stdcall mmioInstallIOProcA(  FOURCC fccIOProc,  LPMMIOPROC pIOProc,  DWORD dwFlags);
-__declspec(dllimport) LPMMIOPROC __stdcall mmioInstallIOProcW(  FOURCC fccIOProc,  LPMMIOPROC pIOProc,  DWORD dwFlags);
-
-
-
-
-
-__declspec(dllimport) HMMIO __stdcall mmioOpenA(   LPSTR pszFileName,   LPMMIOINFO pmmioinfo,  DWORD fdwOpen);
-__declspec(dllimport) HMMIO __stdcall mmioOpenW(   LPWSTR pszFileName,   LPMMIOINFO pmmioinfo,  DWORD fdwOpen);
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall mmioRenameA(  LPCSTR pszFileName,  LPCSTR pszNewFileName,  LPCMMIOINFO pmmioinfo,  DWORD fdwRename);
-__declspec(dllimport) MMRESULT __stdcall mmioRenameW(  LPCWSTR pszFileName,  LPCWSTR pszNewFileName,  LPCMMIOINFO pmmioinfo,  DWORD fdwRename);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) MMRESULT __stdcall mmioClose(  HMMIO hmmio,  UINT fuClose);
-__declspec(dllimport) LONG __stdcall mmioRead(  HMMIO hmmio,  HPSTR pch,  LONG cch);
-__declspec(dllimport) LONG __stdcall mmioWrite(  HMMIO hmmio,  const char * pch,  LONG cch);
-__declspec(dllimport) LONG __stdcall mmioSeek(  HMMIO hmmio,  LONG lOffset,  int iOrigin);
-__declspec(dllimport) MMRESULT __stdcall mmioGetInfo(  HMMIO hmmio,  LPMMIOINFO pmmioinfo,  UINT fuInfo);
-__declspec(dllimport) MMRESULT __stdcall mmioSetInfo(  HMMIO hmmio,  LPCMMIOINFO pmmioinfo,  UINT fuInfo);
-__declspec(dllimport) MMRESULT __stdcall mmioSetBuffer(  HMMIO hmmio,  LPSTR pchBuffer,  LONG cchBuffer,
-     UINT fuBuffer);
-__declspec(dllimport) MMRESULT __stdcall mmioFlush(  HMMIO hmmio,  UINT fuFlush);
-__declspec(dllimport) MMRESULT __stdcall mmioAdvance(  HMMIO hmmio,   LPMMIOINFO pmmioinfo,  UINT fuAdvance);
-__declspec(dllimport) LRESULT __stdcall mmioSendMessage(  HMMIO hmmio,  UINT uMsg,
-     LPARAM lParam1,  LPARAM lParam2);
-__declspec(dllimport) MMRESULT __stdcall mmioDescend(  HMMIO hmmio,   LPMMCKINFO pmmcki,
-     const MMCKINFO * pmmckiParent,  UINT fuDescend);
-__declspec(dllimport) MMRESULT __stdcall mmioAscend(  HMMIO hmmio,  LPMMCKINFO pmmcki,  UINT fuAscend);
-__declspec(dllimport) MMRESULT __stdcall mmioCreateChunk( HMMIO hmmio,  LPMMCKINFO pmmcki,  UINT fuCreate);
-
-
-
-
-
-
-
-
-
-
-
-
-typedef DWORD   MCIERROR;       
-
-
-
-
-typedef UINT    MCIDEVICEID;    
-
-
-
-typedef UINT (__stdcall *YIELDPROC)(MCIDEVICEID mciId, DWORD dwYieldData);
-
-
-
-
-__declspec(dllimport) MCIERROR __stdcall mciSendCommandA(  MCIDEVICEID mciId,  UINT uMsg,  DWORD_PTR dwParam1,  DWORD_PTR dwParam2);
-__declspec(dllimport) MCIERROR __stdcall mciSendCommandW(  MCIDEVICEID mciId,  UINT uMsg,  DWORD_PTR dwParam1,  DWORD_PTR dwParam2);
-
-
-
-
-
-__declspec(dllimport) MCIERROR  __stdcall mciSendStringA(  LPCSTR lpstrCommand,  LPSTR lpstrReturnString,  UINT uReturnLength,  HWND hwndCallback);
-__declspec(dllimport) MCIERROR  __stdcall mciSendStringW(  LPCWSTR lpstrCommand,  LPWSTR lpstrReturnString,  UINT uReturnLength,  HWND hwndCallback);
-
-
-
-
-
-__declspec(dllimport) MCIDEVICEID __stdcall mciGetDeviceIDA(  LPCSTR pszDevice);
-__declspec(dllimport) MCIDEVICEID __stdcall mciGetDeviceIDW(  LPCWSTR pszDevice);
-
-
-
-
-
-__declspec(dllimport) MCIDEVICEID __stdcall mciGetDeviceIDFromElementIDA(  DWORD dwElementID,  LPCSTR lpstrType );
-__declspec(dllimport) MCIDEVICEID __stdcall mciGetDeviceIDFromElementIDW(  DWORD dwElementID,  LPCWSTR lpstrType );
-
-
-
-
-
-__declspec(dllimport) BOOL __stdcall mciGetErrorStringA(  MCIERROR mcierr,  LPSTR pszText,  UINT cchText);
-__declspec(dllimport) BOOL __stdcall mciGetErrorStringW(  MCIERROR mcierr,  LPWSTR pszText,  UINT cchText);
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) BOOL __stdcall mciSetYieldProc(  MCIDEVICEID mciId,  YIELDPROC fpYieldProc,
-     DWORD dwYieldData);
-
-
-__declspec(dllimport) HTASK __stdcall mciGetCreatorTask(  MCIDEVICEID mciId);
-__declspec(dllimport) YIELDPROC __stdcall mciGetYieldProc(  MCIDEVICEID mciId,  LPDWORD pdwYieldData);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_GENERIC_PARMS {
-    DWORD_PTR   dwCallback;
-} MCI_GENERIC_PARMS, *PMCI_GENERIC_PARMS,  *LPMCI_GENERIC_PARMS;
-
-
-
-
-
-typedef struct tagMCI_OPEN_PARMSA {
-    DWORD_PTR   dwCallback;
-    MCIDEVICEID wDeviceID;
-    LPCSTR     lpstrDeviceType;
-    LPCSTR     lpstrElementName;
-    LPCSTR     lpstrAlias;
-} MCI_OPEN_PARMSA, *PMCI_OPEN_PARMSA, *LPMCI_OPEN_PARMSA;
-typedef struct tagMCI_OPEN_PARMSW {
-    DWORD_PTR   dwCallback;
-    MCIDEVICEID wDeviceID;
-    LPCWSTR    lpstrDeviceType;
-    LPCWSTR    lpstrElementName;
-    LPCWSTR    lpstrAlias;
-} MCI_OPEN_PARMSW, *PMCI_OPEN_PARMSW, *LPMCI_OPEN_PARMSW;
-
-typedef MCI_OPEN_PARMSW MCI_OPEN_PARMS;
-typedef PMCI_OPEN_PARMSW PMCI_OPEN_PARMS;
-typedef LPMCI_OPEN_PARMSW LPMCI_OPEN_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_PLAY_PARMS {
-    DWORD_PTR   dwCallback;
-    DWORD       dwFrom;
-    DWORD       dwTo;
-} MCI_PLAY_PARMS, *PMCI_PLAY_PARMS,  *LPMCI_PLAY_PARMS;
-
-
-
-typedef struct tagMCI_SEEK_PARMS {
-    DWORD_PTR   dwCallback;
-    DWORD       dwTo;
-} MCI_SEEK_PARMS, *PMCI_SEEK_PARMS,  *LPMCI_SEEK_PARMS;
-
-
-
-typedef struct tagMCI_STATUS_PARMS {
-    DWORD_PTR   dwCallback;
-    DWORD_PTR   dwReturn;
-    DWORD       dwItem;
-    DWORD       dwTrack;
-} MCI_STATUS_PARMS, *PMCI_STATUS_PARMS,  * LPMCI_STATUS_PARMS;
-
-
-
-
-
-typedef struct tagMCI_INFO_PARMSA {
-    DWORD_PTR dwCallback;
-    LPSTR     lpstrReturn;
-    DWORD     dwRetSize;
-} MCI_INFO_PARMSA, * LPMCI_INFO_PARMSA;
-typedef struct tagMCI_INFO_PARMSW {
-    DWORD_PTR dwCallback;
-    LPWSTR    lpstrReturn;
-    DWORD     dwRetSize;
-} MCI_INFO_PARMSW, * LPMCI_INFO_PARMSW;
-
-typedef MCI_INFO_PARMSW MCI_INFO_PARMS;
-typedef LPMCI_INFO_PARMSW LPMCI_INFO_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_GETDEVCAPS_PARMS {
-    DWORD_PTR   dwCallback;
-    DWORD       dwReturn;
-    DWORD       dwItem;
-} MCI_GETDEVCAPS_PARMS, *PMCI_GETDEVCAPS_PARMS,  * LPMCI_GETDEVCAPS_PARMS;
-
-
-
-
-
-typedef struct tagMCI_SYSINFO_PARMSA {
-    DWORD_PTR   dwCallback;
-    LPSTR       lpstrReturn;
-    DWORD       dwRetSize;
-    DWORD       dwNumber;
-    UINT        wDeviceType;
-} MCI_SYSINFO_PARMSA, *PMCI_SYSINFO_PARMSA, * LPMCI_SYSINFO_PARMSA;
-typedef struct tagMCI_SYSINFO_PARMSW {
-    DWORD_PTR   dwCallback;
-    LPWSTR      lpstrReturn;
-    DWORD       dwRetSize;
-    DWORD       dwNumber;
-    UINT        wDeviceType;
-} MCI_SYSINFO_PARMSW, *PMCI_SYSINFO_PARMSW, * LPMCI_SYSINFO_PARMSW;
-
-typedef MCI_SYSINFO_PARMSW MCI_SYSINFO_PARMS;
-typedef PMCI_SYSINFO_PARMSW PMCI_SYSINFO_PARMS;
-typedef LPMCI_SYSINFO_PARMSW LPMCI_SYSINFO_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_SET_PARMS {
-    DWORD_PTR   dwCallback;
-    DWORD       dwTimeFormat;
-    DWORD       dwAudio;
-} MCI_SET_PARMS, *PMCI_SET_PARMS,  *LPMCI_SET_PARMS;
-
-
-
-typedef struct tagMCI_BREAK_PARMS {
-    DWORD_PTR   dwCallback;
-
-    int         nVirtKey;
-    HWND        hwndBreak;
-
-
-
-
-
-
-} MCI_BREAK_PARMS, *PMCI_BREAK_PARMS,  * LPMCI_BREAK_PARMS;
-
-
-
-
-
-typedef struct tagMCI_SAVE_PARMSA {
-    DWORD_PTR    dwCallback;
-    LPCSTR       lpfilename;
-} MCI_SAVE_PARMSA, *PMCI_SAVE_PARMSA, * LPMCI_SAVE_PARMSA;
-typedef struct tagMCI_SAVE_PARMSW {
-    DWORD_PTR    dwCallback;
-    LPCWSTR      lpfilename;
-} MCI_SAVE_PARMSW, *PMCI_SAVE_PARMSW, * LPMCI_SAVE_PARMSW;
-
-typedef MCI_SAVE_PARMSW MCI_SAVE_PARMS;
-typedef PMCI_SAVE_PARMSW PMCI_SAVE_PARMS;
-typedef LPMCI_SAVE_PARMSW LPMCI_SAVE_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_LOAD_PARMSA {
-    DWORD_PTR    dwCallback;
-    LPCSTR       lpfilename;
-} MCI_LOAD_PARMSA, *PMCI_LOAD_PARMSA, * LPMCI_LOAD_PARMSA;
-typedef struct tagMCI_LOAD_PARMSW {
-    DWORD_PTR    dwCallback;
-    LPCWSTR      lpfilename;
-} MCI_LOAD_PARMSW, *PMCI_LOAD_PARMSW, * LPMCI_LOAD_PARMSW;
-
-typedef MCI_LOAD_PARMSW MCI_LOAD_PARMS;
-typedef PMCI_LOAD_PARMSW PMCI_LOAD_PARMS;
-typedef LPMCI_LOAD_PARMSW LPMCI_LOAD_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_RECORD_PARMS {
-    DWORD_PTR   dwCallback;
-    DWORD       dwFrom;
-    DWORD       dwTo;
-} MCI_RECORD_PARMS,  *LPMCI_RECORD_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_VD_PLAY_PARMS {
-    DWORD_PTR   dwCallback;
-    DWORD       dwFrom;
-    DWORD       dwTo;
-    DWORD       dwSpeed;
-} MCI_VD_PLAY_PARMS, *PMCI_VD_PLAY_PARMS,  *LPMCI_VD_PLAY_PARMS;
-
-
-
-typedef struct tagMCI_VD_STEP_PARMS {
-    DWORD_PTR   dwCallback;
-    DWORD       dwFrames;
-} MCI_VD_STEP_PARMS, *PMCI_VD_STEP_PARMS,  *LPMCI_VD_STEP_PARMS;
-
-
-
-
-
-typedef struct tagMCI_VD_ESCAPE_PARMSA {
-    DWORD_PTR   dwCallback;
-    LPCSTR      lpstrCommand;
-} MCI_VD_ESCAPE_PARMSA, *PMCI_VD_ESCAPE_PARMSA, *LPMCI_VD_ESCAPE_PARMSA;
-typedef struct tagMCI_VD_ESCAPE_PARMSW {
-    DWORD_PTR   dwCallback;
-    LPCWSTR     lpstrCommand;
-} MCI_VD_ESCAPE_PARMSW, *PMCI_VD_ESCAPE_PARMSW, *LPMCI_VD_ESCAPE_PARMSW;
-
-typedef MCI_VD_ESCAPE_PARMSW MCI_VD_ESCAPE_PARMS;
-typedef PMCI_VD_ESCAPE_PARMSW PMCI_VD_ESCAPE_PARMS;
-typedef LPMCI_VD_ESCAPE_PARMSW LPMCI_VD_ESCAPE_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_WAVE_OPEN_PARMSA {
-    DWORD_PTR   dwCallback;
-    MCIDEVICEID wDeviceID;
-    LPCSTR      lpstrDeviceType;
-    LPCSTR      lpstrElementName;
-    LPCSTR      lpstrAlias;
-    DWORD   dwBufferSeconds;
-} MCI_WAVE_OPEN_PARMSA, *PMCI_WAVE_OPEN_PARMSA, *LPMCI_WAVE_OPEN_PARMSA;
-typedef struct tagMCI_WAVE_OPEN_PARMSW {
-    DWORD_PTR   dwCallback;
-    MCIDEVICEID wDeviceID;
-    LPCWSTR     lpstrDeviceType;
-    LPCWSTR     lpstrElementName;
-    LPCWSTR     lpstrAlias;
-    DWORD   dwBufferSeconds;
-} MCI_WAVE_OPEN_PARMSW, *PMCI_WAVE_OPEN_PARMSW, *LPMCI_WAVE_OPEN_PARMSW;
-
-typedef MCI_WAVE_OPEN_PARMSW MCI_WAVE_OPEN_PARMS;
-typedef PMCI_WAVE_OPEN_PARMSW PMCI_WAVE_OPEN_PARMS;
-typedef LPMCI_WAVE_OPEN_PARMSW LPMCI_WAVE_OPEN_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_WAVE_DELETE_PARMS {
-    DWORD_PTR   dwCallback;
-    DWORD       dwFrom;
-    DWORD       dwTo;
-} MCI_WAVE_DELETE_PARMS, *PMCI_WAVE_DELETE_PARMS,  *LPMCI_WAVE_DELETE_PARMS;
-
-
-
-typedef struct tagMCI_WAVE_SET_PARMS {
-    DWORD_PTR   dwCallback;
-    DWORD       dwTimeFormat;
-    DWORD       dwAudio;
-
-    UINT    wInput;
-    UINT    wOutput;
-
-
-
-
-
-
-    WORD    wFormatTag;
-    WORD    wReserved2;
-    WORD    nChannels;
-    WORD    wReserved3;
-    DWORD   nSamplesPerSec;
-    DWORD   nAvgBytesPerSec;
-    WORD    nBlockAlign;
-    WORD    wReserved4;
-    WORD    wBitsPerSample;
-    WORD    wReserved5;
-} MCI_WAVE_SET_PARMS, *PMCI_WAVE_SET_PARMS,  * LPMCI_WAVE_SET_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_SEQ_SET_PARMS {
-    DWORD_PTR   dwCallback;
-    DWORD       dwTimeFormat;
-    DWORD       dwAudio;
-    DWORD       dwTempo;
-    DWORD       dwPort;
-    DWORD       dwSlave;
-    DWORD       dwMaster;
-    DWORD       dwOffset;
-} MCI_SEQ_SET_PARMS, *PMCI_SEQ_SET_PARMS,  * LPMCI_SEQ_SET_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_ANIM_OPEN_PARMSA {
-    DWORD_PTR   dwCallback;
-    MCIDEVICEID wDeviceID;
-    LPCSTR      lpstrDeviceType;
-    LPCSTR      lpstrElementName;
-    LPCSTR      lpstrAlias;
-    DWORD   dwStyle;
-    HWND    hWndParent;
-} MCI_ANIM_OPEN_PARMSA, *PMCI_ANIM_OPEN_PARMSA, *LPMCI_ANIM_OPEN_PARMSA;
-typedef struct tagMCI_ANIM_OPEN_PARMSW {
-    DWORD_PTR   dwCallback;
-    MCIDEVICEID wDeviceID;
-    LPCWSTR     lpstrDeviceType;
-    LPCWSTR     lpstrElementName;
-    LPCWSTR     lpstrAlias;
-    DWORD   dwStyle;
-    HWND    hWndParent;
-} MCI_ANIM_OPEN_PARMSW, *PMCI_ANIM_OPEN_PARMSW, *LPMCI_ANIM_OPEN_PARMSW;
-
-typedef MCI_ANIM_OPEN_PARMSW MCI_ANIM_OPEN_PARMS;
-typedef PMCI_ANIM_OPEN_PARMSW PMCI_ANIM_OPEN_PARMS;
-typedef LPMCI_ANIM_OPEN_PARMSW LPMCI_ANIM_OPEN_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_ANIM_PLAY_PARMS {
-    DWORD_PTR   dwCallback;
-    DWORD       dwFrom;
-    DWORD       dwTo;
-    DWORD       dwSpeed;
-} MCI_ANIM_PLAY_PARMS, *PMCI_ANIM_PLAY_PARMS,  *LPMCI_ANIM_PLAY_PARMS;
-
-
-
-typedef struct tagMCI_ANIM_STEP_PARMS {
-    DWORD_PTR   dwCallback;
-    DWORD       dwFrames;
-} MCI_ANIM_STEP_PARMS, *PMCI_ANIM_STEP_PARMS,  *LPMCI_ANIM_STEP_PARMS;
-
-
-
-
-
-typedef struct tagMCI_ANIM_WINDOW_PARMSA {
-    DWORD_PTR   dwCallback;
-    HWND        hWnd;
-    UINT        nCmdShow;
-    LPCSTR     lpstrText;
-} MCI_ANIM_WINDOW_PARMSA, *PMCI_ANIM_WINDOW_PARMSA, * LPMCI_ANIM_WINDOW_PARMSA;
-typedef struct tagMCI_ANIM_WINDOW_PARMSW {
-    DWORD_PTR   dwCallback;
-    HWND        hWnd;
-    UINT        nCmdShow;
-    LPCWSTR    lpstrText;
-} MCI_ANIM_WINDOW_PARMSW, *PMCI_ANIM_WINDOW_PARMSW, * LPMCI_ANIM_WINDOW_PARMSW;
-
-typedef MCI_ANIM_WINDOW_PARMSW MCI_ANIM_WINDOW_PARMS;
-typedef PMCI_ANIM_WINDOW_PARMSW PMCI_ANIM_WINDOW_PARMS;
-typedef LPMCI_ANIM_WINDOW_PARMSW LPMCI_ANIM_WINDOW_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_ANIM_RECT_PARMS {
-    DWORD_PTR   dwCallback;
-
-
-
-
-    RECT    rc;
-
-} MCI_ANIM_RECT_PARMS;
-typedef MCI_ANIM_RECT_PARMS * PMCI_ANIM_RECT_PARMS;
-typedef MCI_ANIM_RECT_PARMS  * LPMCI_ANIM_RECT_PARMS;
-
-
-
-typedef struct tagMCI_ANIM_UPDATE_PARMS {
-    DWORD_PTR   dwCallback;
-    RECT        rc;
-    HDC         hDC;
-} MCI_ANIM_UPDATE_PARMS, *PMCI_ANIM_UPDATE_PARMS,  * LPMCI_ANIM_UPDATE_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_OVLY_OPEN_PARMSA {
-    DWORD_PTR   dwCallback;
-    MCIDEVICEID wDeviceID;
-    LPCSTR      lpstrDeviceType;
-    LPCSTR      lpstrElementName;
-    LPCSTR      lpstrAlias;
-    DWORD   dwStyle;
-    HWND    hWndParent;
-} MCI_OVLY_OPEN_PARMSA, *PMCI_OVLY_OPEN_PARMSA, *LPMCI_OVLY_OPEN_PARMSA;
-typedef struct tagMCI_OVLY_OPEN_PARMSW {
-    DWORD_PTR   dwCallback;
-    MCIDEVICEID wDeviceID;
-    LPCWSTR     lpstrDeviceType;
-    LPCWSTR     lpstrElementName;
-    LPCWSTR     lpstrAlias;
-    DWORD   dwStyle;
-    HWND    hWndParent;
-} MCI_OVLY_OPEN_PARMSW, *PMCI_OVLY_OPEN_PARMSW, *LPMCI_OVLY_OPEN_PARMSW;
-
-typedef MCI_OVLY_OPEN_PARMSW MCI_OVLY_OPEN_PARMS;
-typedef PMCI_OVLY_OPEN_PARMSW PMCI_OVLY_OPEN_PARMS;
-typedef LPMCI_OVLY_OPEN_PARMSW LPMCI_OVLY_OPEN_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_OVLY_WINDOW_PARMSA {
-    DWORD_PTR   dwCallback;
-    HWND        hWnd;
-    UINT        nCmdShow;
-    LPCSTR      lpstrText;
-} MCI_OVLY_WINDOW_PARMSA, *PMCI_OVLY_WINDOW_PARMSA, * LPMCI_OVLY_WINDOW_PARMSA;
-typedef struct tagMCI_OVLY_WINDOW_PARMSW {
-    DWORD_PTR   dwCallback;
-    HWND        hWnd;
-    UINT        nCmdShow;
-    LPCWSTR     lpstrText;
-} MCI_OVLY_WINDOW_PARMSW, *PMCI_OVLY_WINDOW_PARMSW, * LPMCI_OVLY_WINDOW_PARMSW;
-
-typedef MCI_OVLY_WINDOW_PARMSW MCI_OVLY_WINDOW_PARMS;
-typedef PMCI_OVLY_WINDOW_PARMSW PMCI_OVLY_WINDOW_PARMS;
-typedef LPMCI_OVLY_WINDOW_PARMSW LPMCI_OVLY_WINDOW_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_OVLY_RECT_PARMS {
-    DWORD_PTR   dwCallback;
-
-
-
-
-    RECT    rc;
-
-} MCI_OVLY_RECT_PARMS, *PMCI_OVLY_RECT_PARMS,  * LPMCI_OVLY_RECT_PARMS;
-
-
-
-
-
-typedef struct tagMCI_OVLY_SAVE_PARMSA {
-    DWORD_PTR   dwCallback;
-    LPCSTR      lpfilename;
-    RECT        rc;
-} MCI_OVLY_SAVE_PARMSA, *PMCI_OVLY_SAVE_PARMSA, * LPMCI_OVLY_SAVE_PARMSA;
-typedef struct tagMCI_OVLY_SAVE_PARMSW {
-    DWORD_PTR   dwCallback;
-    LPCWSTR     lpfilename;
-    RECT        rc;
-} MCI_OVLY_SAVE_PARMSW, *PMCI_OVLY_SAVE_PARMSW, * LPMCI_OVLY_SAVE_PARMSW;
-
-typedef MCI_OVLY_SAVE_PARMSW MCI_OVLY_SAVE_PARMS;
-typedef PMCI_OVLY_SAVE_PARMSW PMCI_OVLY_SAVE_PARMS;
-typedef LPMCI_OVLY_SAVE_PARMSW LPMCI_OVLY_SAVE_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMCI_OVLY_LOAD_PARMSA {
-    DWORD_PTR   dwCallback;
-    LPCSTR      lpfilename;
-    RECT    rc;
-} MCI_OVLY_LOAD_PARMSA, *PMCI_OVLY_LOAD_PARMSA, * LPMCI_OVLY_LOAD_PARMSA;
-typedef struct tagMCI_OVLY_LOAD_PARMSW {
-    DWORD_PTR   dwCallback;
-    LPCWSTR     lpfilename;
-    RECT    rc;
-} MCI_OVLY_LOAD_PARMSW, *PMCI_OVLY_LOAD_PARMSW, * LPMCI_OVLY_LOAD_PARMSW;
-
-typedef MCI_OVLY_LOAD_PARMSW MCI_OVLY_LOAD_PARMS;
-typedef PMCI_OVLY_LOAD_PARMSW PMCI_OVLY_LOAD_PARMS;
-typedef LPMCI_OVLY_LOAD_PARMSW LPMCI_OVLY_LOAD_PARMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}                       
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _NCB {
-    UCHAR   ncb_command;            
-    UCHAR   ncb_retcode;            
-    UCHAR   ncb_lsn;                
-    UCHAR   ncb_num;                
-    PUCHAR  ncb_buffer;             
-    WORD    ncb_length;             
-    UCHAR   ncb_callname[16]; 
-    UCHAR   ncb_name[16];     
-    UCHAR   ncb_rto;                
-    UCHAR   ncb_sto;                
-    void (__stdcall *ncb_post)( struct _NCB * ); 
-    UCHAR   ncb_lana_num;           
-    UCHAR   ncb_cmd_cplt;           
-
-
-
-    UCHAR   ncb_reserve[10];        
-
-    HANDLE  ncb_event;              
-                                    
-                                    
-                                    
-} NCB, *PNCB;
-
-
-
-
-
-
-typedef struct _ADAPTER_STATUS {
-    UCHAR   adapter_address[6];
-    UCHAR   rev_major;
-    UCHAR   reserved0;
-    UCHAR   adapter_type;
-    UCHAR   rev_minor;
-    WORD    duration;
-    WORD    frmr_recv;
-    WORD    frmr_xmit;
-
-    WORD    iframe_recv_err;
-
-    WORD    xmit_aborts;
-    DWORD   xmit_success;
-    DWORD   recv_success;
-
-    WORD    iframe_xmit_err;
-
-    WORD    recv_buff_unavail;
-    WORD    t1_timeouts;
-    WORD    ti_timeouts;
-    DWORD   reserved1;
-    WORD    free_ncbs;
-    WORD    max_cfg_ncbs;
-    WORD    max_ncbs;
-    WORD    xmit_buf_unavail;
-    WORD    max_dgram_size;
-    WORD    pending_sess;
-    WORD    max_cfg_sess;
-    WORD    max_sess;
-    WORD    max_sess_pkt_size;
-    WORD    name_count;
-} ADAPTER_STATUS, *PADAPTER_STATUS;
-
-typedef struct _NAME_BUFFER {
-    UCHAR   name[16];
-    UCHAR   name_num;
-    UCHAR   name_flags;
-} NAME_BUFFER, *PNAME_BUFFER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _SESSION_HEADER {
-    UCHAR   sess_name;
-    UCHAR   num_sess;
-    UCHAR   rcv_dg_outstanding;
-    UCHAR   rcv_any_outstanding;
-} SESSION_HEADER, *PSESSION_HEADER;
-
-typedef struct _SESSION_BUFFER {
-    UCHAR   lsn;
-    UCHAR   state;
-    UCHAR   local_name[16];
-    UCHAR   remote_name[16];
-    UCHAR   rcvs_outstanding;
-    UCHAR   sends_outstanding;
-} SESSION_BUFFER, *PSESSION_BUFFER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _LANA_ENUM {
-    UCHAR   length;         
-    UCHAR   lana[254+1];
-} LANA_ENUM, *PLANA_ENUM;
-
-
-
-
-
-
-typedef struct _FIND_NAME_HEADER {
-    WORD    node_count;
-    UCHAR   reserved;
-    UCHAR   unique_group;
-} FIND_NAME_HEADER, *PFIND_NAME_HEADER;
-
-typedef struct _FIND_NAME_BUFFER {
-    UCHAR   length;
-    UCHAR   access_control;
-    UCHAR   frame_control;
-    UCHAR   destination_addr[6];
-    UCHAR   source_addr[6];
-    UCHAR   routing_info[18];
-} FIND_NAME_BUFFER, *PFIND_NAME_BUFFER;
-
-
-
-
-
-
-typedef struct _ACTION_HEADER {
-    ULONG   transport_id;
-    USHORT  action_code;
-    USHORT  reserved;
-} ACTION_HEADER, *PACTION_HEADER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-UCHAR
-__stdcall
-Netbios(
-    PNCB pncb
-    );
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef void * I_RPC_HANDLE;
-typedef long RPC_STATUS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef  unsigned char  *RPC_CSTR;
-typedef  unsigned short  *RPC_WSTR;
-
-typedef I_RPC_HANDLE RPC_BINDING_HANDLE;
-typedef RPC_BINDING_HANDLE handle_t;
-
-
-
-
-
-
-
-
-typedef GUID UUID;
-
-
-
-
-
-typedef struct _RPC_BINDING_VECTOR
-{
-    unsigned long Count;
-    RPC_BINDING_HANDLE BindingH[1];
-} RPC_BINDING_VECTOR;
-
-
-
-
-typedef struct _UUID_VECTOR
-{
-  unsigned long Count;
-  UUID *Uuid[1];
-} UUID_VECTOR;
-
-
-
-
-typedef void  * RPC_IF_HANDLE;
-
-
-
-typedef struct _RPC_IF_ID
-{
-    UUID Uuid;
-    unsigned short VersMajor;
-    unsigned short VersMinor;
-} RPC_IF_ID;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _RPC_PROTSEQ_VECTORA
-{
-    unsigned int Count;
-    unsigned char  * Protseq[1];
-} RPC_PROTSEQ_VECTORA;
-
-typedef struct _RPC_PROTSEQ_VECTORW
-{
-    unsigned int Count;
-    unsigned short  * Protseq[1];
-} RPC_PROTSEQ_VECTORW;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _RPC_POLICY {
-    unsigned int Length ;
-    unsigned long EndpointFlags ;
-    unsigned long NICFlags ;
-    } RPC_POLICY,   *PRPC_POLICY ;
-
-typedef void __stdcall
-RPC_OBJECT_INQ_FN (
-     UUID  * ObjectUuid,
-     UUID  * TypeUuid,
-     RPC_STATUS  * Status
-    );
-
-typedef RPC_STATUS __stdcall
-RPC_IF_CALLBACK_FN (
-     RPC_IF_HANDLE  InterfaceUuid,
-     void *Context
-    ) ;
-
-typedef void __stdcall
-RPC_SECURITY_CALLBACK_FN (
-     void *Context
-    ) ;
-
-
-
-typedef struct
-{
-    unsigned int Count;
-    unsigned long Stats[1];
-} RPC_STATS_VECTOR;
-
-
-
-
-
-
-typedef struct
-{
-  unsigned long Count;
-  RPC_IF_ID  * IfId[1];
-} RPC_IF_ID_VECTOR;
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingCopy (
-     RPC_BINDING_HANDLE SourceBinding,
-     RPC_BINDING_HANDLE  * DestinationBinding
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingFree (
-      RPC_BINDING_HANDLE  * Binding
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingSetOption(  RPC_BINDING_HANDLE hBinding,
-                      unsigned long      option,
-                      ULONG_PTR          optionValue );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingInqOption(   RPC_BINDING_HANDLE hBinding,
-                       unsigned long      option,
-                      ULONG_PTR         *pOptionValue );
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingFromStringBindingA (
-         RPC_CSTR StringBinding,
-         RPC_BINDING_HANDLE  *Binding
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingFromStringBindingW (
-         RPC_WSTR StringBinding,
-         RPC_BINDING_HANDLE  *Binding
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcSsGetContextBinding (
-     void *ContextHandle,
-     RPC_BINDING_HANDLE  * Binding
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingInqObject (
-     RPC_BINDING_HANDLE Binding,
-     UUID  * ObjectUuid
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingReset (
-     RPC_BINDING_HANDLE Binding
-    );
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingSetObject (
-     RPC_BINDING_HANDLE Binding,
-     UUID  * ObjectUuid
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtInqDefaultProtectLevel(
-      unsigned long AuthnSvc,
-     unsigned long  *AuthnLevel
-    );
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingToStringBindingA (
-         RPC_BINDING_HANDLE Binding,
-                  RPC_CSTR  *StringBinding
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingToStringBindingW (
-         RPC_BINDING_HANDLE Binding,
-                  RPC_WSTR  *StringBinding
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingVectorFree (
-      RPC_BINDING_VECTOR  *  * BindingVector
-    );
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcStringBindingComposeA (
-           RPC_CSTR ObjUuid,
-           RPC_CSTR Protseq,
-           RPC_CSTR NetworkAddr,
-           RPC_CSTR Endpoint,
-           RPC_CSTR Options,
-                    RPC_CSTR  *StringBinding
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcStringBindingComposeW (
-           RPC_WSTR ObjUuid,
-           RPC_WSTR Protseq,
-           RPC_WSTR NetworkAddr,
-           RPC_WSTR Endpoint,
-           RPC_WSTR Options,
-                    RPC_WSTR  *StringBinding
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcStringBindingParseA (
-         RPC_CSTR StringBinding,
-                    RPC_CSTR  *ObjUuid,
-                    RPC_CSTR  *Protseq,
-                    RPC_CSTR  *NetworkAddr,
-                    RPC_CSTR  *Endpoint,
-                    RPC_CSTR  *NetworkOptions
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcStringBindingParseW (
-         RPC_WSTR StringBinding,
-                    RPC_WSTR  *ObjUuid,
-                    RPC_WSTR  *Protseq,
-                    RPC_WSTR  *NetworkAddr,
-                    RPC_WSTR  *Endpoint,
-                    RPC_WSTR  *NetworkOptions
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcStringFreeA (
-     RPC_CSTR  *String
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcStringFreeW (
-     RPC_WSTR  *String
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcIfInqId (
-     RPC_IF_HANDLE RpcIfHandle,
-     RPC_IF_ID  * RpcIfId
-    );
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcNetworkIsProtseqValidA (
-         RPC_CSTR Protseq
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcNetworkIsProtseqValidW (
-         RPC_WSTR Protseq
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtInqComTimeout (
-     RPC_BINDING_HANDLE Binding,
-     unsigned int  * Timeout
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtSetComTimeout (
-     RPC_BINDING_HANDLE Binding,
-     unsigned int Timeout
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtSetCancelTimeout(
-    long Timeout
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcNetworkInqProtseqsA (
-     RPC_PROTSEQ_VECTORA  *  * ProtseqVector
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcNetworkInqProtseqsW (
-     RPC_PROTSEQ_VECTORW  *  * ProtseqVector
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcObjectInqType (
-     UUID  * ObjUuid,
-     UUID  * TypeUuid 
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcObjectSetInqFn (
-     RPC_OBJECT_INQ_FN  * InquiryFn
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcObjectSetType (
-     UUID  * ObjUuid,
-     UUID  * TypeUuid 
-    );
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcProtseqVectorFreeA (
-      RPC_PROTSEQ_VECTORA  *  * ProtseqVector
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcProtseqVectorFreeW (
-      RPC_PROTSEQ_VECTORW  *  * ProtseqVector
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerInqBindings (
-     RPC_BINDING_VECTOR  *  * BindingVector
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerInqIf (
-     RPC_IF_HANDLE IfSpec,
-     UUID  * MgrTypeUuid, 
-     void  *  * MgrEpv
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerListen (
-     unsigned int MinimumCallThreads,
-     unsigned int MaxCalls,
-     unsigned int DontWait
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerRegisterIf (
-     RPC_IF_HANDLE IfSpec,
-     UUID  * MgrTypeUuid ,
-     void  * MgrEpv 
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerRegisterIfEx (
-     RPC_IF_HANDLE IfSpec,
-     UUID  * MgrTypeUuid,
-     void  * MgrEpv,
-     unsigned int Flags,
-     unsigned int MaxCalls,
-     RPC_IF_CALLBACK_FN  *IfCallback
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerRegisterIf2 (
-     RPC_IF_HANDLE IfSpec,
-     UUID * MgrTypeUuid,
-     void * MgrEpv,
-     unsigned int Flags,
-     unsigned int MaxCalls,
-     unsigned int MaxRpcSize,
-     RPC_IF_CALLBACK_FN *IfCallbackFn
-    );
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUnregisterIf (
-     RPC_IF_HANDLE IfSpec,
-     UUID  * MgrTypeUuid, 
-     unsigned int WaitForCallsToComplete
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUnregisterIfEx (
-     RPC_IF_HANDLE IfSpec,
-     UUID  * MgrTypeUuid, 
-     int RundownContextHandles
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUseAllProtseqs (
-     unsigned int MaxCalls,
-     void  * SecurityDescriptor 
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUseAllProtseqsEx (
-     unsigned int MaxCalls,
-     void  * SecurityDescriptor,
-     PRPC_POLICY Policy
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUseAllProtseqsIf (
-     unsigned int MaxCalls,
-     RPC_IF_HANDLE IfSpec,
-     void  * SecurityDescriptor 
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUseAllProtseqsIfEx (
-     unsigned int MaxCalls,
-     RPC_IF_HANDLE IfSpec,
-     void  * SecurityDescriptor,
-     PRPC_POLICY Policy
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUseProtseqA (
-         RPC_CSTR Protseq,
-         unsigned int MaxCalls,
-           void  *SecurityDescriptor
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUseProtseqExA (
-         RPC_CSTR Protseq,
-         unsigned int MaxCalls,
-           void  *SecurityDescriptor,
-         PRPC_POLICY Policy
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUseProtseqW (
-         RPC_WSTR Protseq,
-         unsigned int MaxCalls,
-           void  *SecurityDescriptor
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUseProtseqExW (
-         RPC_WSTR Protseq,
-         unsigned int MaxCalls,
-           void  *SecurityDescriptor,
-         PRPC_POLICY Policy
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUseProtseqEpA (
-         RPC_CSTR Protseq,
-         unsigned int MaxCalls,
-         RPC_CSTR Endpoint,
-           void  *SecurityDescriptor
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUseProtseqEpExA (
-         RPC_CSTR Protseq,
-         unsigned int MaxCalls,
-         RPC_CSTR Endpoint,
-           void  *SecurityDescriptor,
-         PRPC_POLICY Policy
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUseProtseqEpW (
-         RPC_WSTR Protseq,
-         unsigned int MaxCalls,
-         RPC_WSTR Endpoint,
-           void  *SecurityDescriptor
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUseProtseqEpExW (
-         RPC_WSTR Protseq,
-         unsigned int MaxCalls,
-         RPC_WSTR Endpoint,
-           void  *SecurityDescriptor,
-         PRPC_POLICY Policy
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUseProtseqIfA (
-         RPC_CSTR Protseq,
-         unsigned int MaxCalls,
-         RPC_IF_HANDLE IfSpec,
-           void  *SecurityDescriptor
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUseProtseqIfExA (
-         RPC_CSTR Protseq,
-         unsigned int MaxCalls,
-         RPC_IF_HANDLE IfSpec,
-           void  *SecurityDescriptor,
-         PRPC_POLICY Policy
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUseProtseqIfW (
-         RPC_WSTR Protseq,
-         unsigned int MaxCalls,
-         RPC_IF_HANDLE IfSpec,
-           void  *SecurityDescriptor
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerUseProtseqIfExW (
-         RPC_WSTR Protseq,
-         unsigned int MaxCalls,
-         RPC_IF_HANDLE IfSpec,
-           void  *SecurityDescriptor,
-         PRPC_POLICY Policy
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-RpcServerYield (
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtStatsVectorFree (
-     RPC_STATS_VECTOR ** StatsVector
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtInqStats (
-     RPC_BINDING_HANDLE Binding,
-     RPC_STATS_VECTOR ** Statistics
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtIsServerListening (
-     RPC_BINDING_HANDLE Binding
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtStopServerListening (
-     RPC_BINDING_HANDLE Binding
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtWaitServerListen (
-    void
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtSetServerStackSize (
-     unsigned long ThreadStackSize
-    );
-
-
-__declspec(dllimport)
-void
-__stdcall
-RpcSsDontSerializeContext (
-    void
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtEnableIdleCleanup (
-    void
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtInqIfIds (
-     RPC_BINDING_HANDLE Binding,
-     RPC_IF_ID_VECTOR  *  * IfIdVector
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcIfIdVectorFree (
-      RPC_IF_ID_VECTOR  *  * IfIdVector
-    );
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtInqServerPrincNameA (
-         RPC_BINDING_HANDLE Binding,
-         unsigned long AuthnSvc,
-                  RPC_CSTR  *ServerPrincName
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtInqServerPrincNameW (
-         RPC_BINDING_HANDLE Binding,
-         unsigned long AuthnSvc,
-                  RPC_WSTR  *ServerPrincName
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerInqDefaultPrincNameA (
-         unsigned long AuthnSvc,
-                  RPC_CSTR  *PrincName
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerInqDefaultPrincNameW (
-         unsigned long AuthnSvc,
-                  RPC_WSTR  *PrincName
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcEpResolveBinding (
-     RPC_BINDING_HANDLE Binding,
-     RPC_IF_HANDLE IfSpec
-    );
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcNsBindingInqEntryNameA (
-         RPC_BINDING_HANDLE Binding,
-         unsigned long EntryNameSyntax,
-                  RPC_CSTR  *EntryName
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcNsBindingInqEntryNameW (
-         RPC_BINDING_HANDLE Binding,
-         unsigned long EntryNameSyntax,
-                  RPC_WSTR  *EntryName
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef void  * RPC_AUTH_IDENTITY_HANDLE;
-typedef void  * RPC_AUTHZ_HANDLE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _RPC_SECURITY_QOS {
-  unsigned long Version;
-  unsigned long Capabilities;
-  unsigned long IdentityTracking;
-  unsigned long ImpersonationType;
-} RPC_SECURITY_QOS, *PRPC_SECURITY_QOS;
-
-
-
-
-
-
-
-typedef struct _SEC_WINNT_AUTH_IDENTITY_W {
-  unsigned short  *User;
-  unsigned long UserLength;
-  unsigned short  *Domain;
-  unsigned long DomainLength;
-  unsigned short  *Password;
-  unsigned long PasswordLength;
-  unsigned long Flags;
-} SEC_WINNT_AUTH_IDENTITY_W, *PSEC_WINNT_AUTH_IDENTITY_W;
-
-typedef struct _SEC_WINNT_AUTH_IDENTITY_A {
-  unsigned char  *User;
-  unsigned long UserLength;
-  unsigned char  *Domain;
-  unsigned long DomainLength;
-  unsigned char  *Password;
-  unsigned long PasswordLength;
-  unsigned long Flags;
-} SEC_WINNT_AUTH_IDENTITY_A, *PSEC_WINNT_AUTH_IDENTITY_A;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _RPC_HTTP_TRANSPORT_CREDENTIALS_W
-{
-    SEC_WINNT_AUTH_IDENTITY_W *TransportCredentials;
-    unsigned long Flags;
-    unsigned long AuthenticationTarget;
-    unsigned long NumberOfAuthnSchemes;
-    unsigned long *AuthnSchemes;
-    unsigned short  *ServerCertificateSubject;
-} RPC_HTTP_TRANSPORT_CREDENTIALS_W, *PRPC_HTTP_TRANSPORT_CREDENTIALS_W;
-
-typedef struct _RPC_HTTP_TRANSPORT_CREDENTIALS_A
-{
-    SEC_WINNT_AUTH_IDENTITY_A *TransportCredentials;
-    unsigned long Flags;
-    unsigned long AuthenticationTarget;
-    unsigned long NumberOfAuthnSchemes;
-    unsigned long *AuthnSchemes;
-    unsigned char  *ServerCertificateSubject;
-} RPC_HTTP_TRANSPORT_CREDENTIALS_A, *PRPC_HTTP_TRANSPORT_CREDENTIALS_A;
-
-typedef struct _RPC_SECURITY_QOS_V2_W {
-  unsigned long Version;
-  unsigned long Capabilities;
-  unsigned long IdentityTracking;
-  unsigned long ImpersonationType;
-  unsigned long AdditionalSecurityInfoType;
-  union 
-      {
-      RPC_HTTP_TRANSPORT_CREDENTIALS_W *HttpCredentials;
-      } u;
-} RPC_SECURITY_QOS_V2_W, *PRPC_SECURITY_QOS_V2_W;
-
-typedef struct _RPC_SECURITY_QOS_V2_A {
-  unsigned long Version;
-  unsigned long Capabilities;
-  unsigned long IdentityTracking;
-  unsigned long ImpersonationType;
-  unsigned long AdditionalSecurityInfoType;
-  union 
-      {
-      RPC_HTTP_TRANSPORT_CREDENTIALS_A *HttpCredentials;
-      } u;
-} RPC_SECURITY_QOS_V2_A, *PRPC_SECURITY_QOS_V2_A;
-
-
-
-typedef struct _RPC_SECURITY_QOS_V3_W {
-  unsigned long Version;
-  unsigned long Capabilities;
-  unsigned long IdentityTracking;
-  unsigned long ImpersonationType;
-  unsigned long AdditionalSecurityInfoType;
-  union 
-      {
-      RPC_HTTP_TRANSPORT_CREDENTIALS_W *HttpCredentials;
-      } u;
-  void *Sid;
-} RPC_SECURITY_QOS_V3_W, *PRPC_SECURITY_QOS_V3_W;
-
-typedef struct _RPC_SECURITY_QOS_V3_A {
-  unsigned long Version;
-  unsigned long Capabilities;
-  unsigned long IdentityTracking;
-  unsigned long ImpersonationType;
-  unsigned long AdditionalSecurityInfoType;
-  union 
-      {
-      RPC_HTTP_TRANSPORT_CREDENTIALS_A *HttpCredentials;
-      } u;
-  void *Sid;
-} RPC_SECURITY_QOS_V3_A, *PRPC_SECURITY_QOS_V3_A;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _RPC_HTTP_REDIRECTOR_STAGE
-{
-    RPCHTTP_RS_REDIRECT = 1,
-    RPCHTTP_RS_ACCESS_1,
-    RPCHTTP_RS_SESSION,
-    RPCHTTP_RS_ACCESS_2,
-    RPCHTTP_RS_INTERFACE
-} RPC_HTTP_REDIRECTOR_STAGE;
-
-typedef RPC_STATUS
-(__stdcall * RPC_NEW_HTTP_PROXY_CHANNEL) (
-     RPC_HTTP_REDIRECTOR_STAGE RedirectorStage,
-     unsigned short  *ServerName,
-     unsigned short  *ServerPort,
-      unsigned short  *RemoteUser,
-      unsigned short  *AuthType,
-      void  *ResourceUuid,
-      void  *Metadata,
-      void  *SessionId,
-      void  *Interface,
-      void  *Reserved,
-     unsigned long Flags,
-      unsigned short  **NewServerName,
-      unsigned short  **NewServerPort
-    );
-
-typedef void
-(__stdcall * RPC_HTTP_PROXY_FREE_STRING) (
-     unsigned short  *String
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcImpersonateClient (
-     RPC_BINDING_HANDLE BindingHandle 
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcRevertToSelfEx (
-     RPC_BINDING_HANDLE BindingHandle 
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcRevertToSelf (
-    );
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingInqAuthClientA (
-           RPC_BINDING_HANDLE ClientBinding,
-         RPC_AUTHZ_HANDLE  *Privs,
-                    RPC_CSTR  *ServerPrincName,
-           unsigned long  *AuthnLevel, 
-           unsigned long  *AuthnSvc,
-           unsigned long  *AuthzSvc
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingInqAuthClientW (
-           RPC_BINDING_HANDLE ClientBinding,
-         RPC_AUTHZ_HANDLE  *Privs,
-                    RPC_WSTR  *ServerPrincName,
-           unsigned long  *AuthnLevel,
-           unsigned long  *AuthnSvc,
-           unsigned long  *AuthzSvc
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingInqAuthClientExA (
-           RPC_BINDING_HANDLE ClientBinding,
-         RPC_AUTHZ_HANDLE  *Privs,
-                    RPC_CSTR  *ServerPrincName,
-           unsigned long  *AuthnLevel,
-           unsigned long  *AuthnSvc,
-           unsigned long  *AuthzSvc,
-      unsigned long             Flags
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingInqAuthClientExW (
-           RPC_BINDING_HANDLE ClientBinding,
-         RPC_AUTHZ_HANDLE  *Privs,
-                    RPC_WSTR  *ServerPrincName,
-           unsigned long  *AuthnLevel,
-           unsigned long  *AuthnSvc,
-           unsigned long  *AuthzSvc,
-      unsigned long             Flags
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingInqAuthInfoA (
-         RPC_BINDING_HANDLE Binding,
-                    RPC_CSTR  *ServerPrincName,
-           unsigned long  *AuthnLevel,
-           unsigned long  *AuthnSvc,
-           RPC_AUTH_IDENTITY_HANDLE  *AuthIdentity,
-           unsigned long  *AuthzSvc
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingInqAuthInfoW (
-         RPC_BINDING_HANDLE Binding,
-                    RPC_WSTR  *ServerPrincName,
-           unsigned long  *AuthnLevel,
-           unsigned long  *AuthnSvc,
-           RPC_AUTH_IDENTITY_HANDLE  *AuthIdentity,
-           unsigned long  *AuthzSvc
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingSetAuthInfoA (
-         RPC_BINDING_HANDLE Binding,
-         RPC_CSTR ServerPrincName,
-         unsigned long AuthnLevel,
-         unsigned long AuthnSvc,
-           RPC_AUTH_IDENTITY_HANDLE AuthIdentity,
-         unsigned long AuthzSvc
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingSetAuthInfoExA (
-         RPC_BINDING_HANDLE Binding,
-         RPC_CSTR ServerPrincName,
-         unsigned long AuthnLevel,
-         unsigned long AuthnSvc,
-           RPC_AUTH_IDENTITY_HANDLE AuthIdentity,
-         unsigned long AuthzSvc,
-           RPC_SECURITY_QOS *SecurityQos
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingSetAuthInfoW (
-         RPC_BINDING_HANDLE Binding,
-         RPC_WSTR ServerPrincName,
-         unsigned long AuthnLevel,
-         unsigned long AuthnSvc,
-           RPC_AUTH_IDENTITY_HANDLE AuthIdentity,
-         unsigned long AuthzSvc
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingSetAuthInfoExW (
-         RPC_BINDING_HANDLE Binding,
-         RPC_WSTR ServerPrincName,
-         unsigned long AuthnLevel,
-         unsigned long AuthnSvc,
-           RPC_AUTH_IDENTITY_HANDLE AuthIdentity,
-         unsigned long AuthzSvc,
-           RPC_SECURITY_QOS *SecurityQOS
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingInqAuthInfoExA (
-         RPC_BINDING_HANDLE Binding,
-                    RPC_CSTR  *ServerPrincName,
-           unsigned long  *AuthnLevel,
-           unsigned long  *AuthnSvc,
-           RPC_AUTH_IDENTITY_HANDLE  *AuthIdentity,
-           unsigned long  *AuthzSvc,
-         unsigned long RpcQosVersion,
-           RPC_SECURITY_QOS *SecurityQOS
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingInqAuthInfoExW (
-         RPC_BINDING_HANDLE Binding,
-                    RPC_WSTR  *ServerPrincName, 
-           unsigned long  *AuthnLevel,
-           unsigned long  *AuthnSvc,
-           RPC_AUTH_IDENTITY_HANDLE  *AuthIdentity,
-           unsigned long  *AuthzSvc,
-         unsigned long RpcQosVersion,
-           RPC_SECURITY_QOS *SecurityQOS
-    );
-
-typedef void
-(__stdcall * RPC_AUTH_KEY_RETRIEVAL_FN) (
-     void  * Arg,
-     unsigned short  * ServerPrincName,
-     unsigned long KeyVer,
-     void  *  * Key,
-     RPC_STATUS  * Status
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerRegisterAuthInfoA (
-         RPC_CSTR ServerPrincName,
-         unsigned long AuthnSvc,
-           RPC_AUTH_KEY_RETRIEVAL_FN GetKeyFn,
-           void  *Arg
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerRegisterAuthInfoW (
-         RPC_WSTR ServerPrincName,
-         unsigned long AuthnSvc,
-           RPC_AUTH_KEY_RETRIEVAL_FN GetKeyFn,
-           void  *Arg
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-    unsigned char  * UserName;
-    unsigned char  * ComputerName;
-    unsigned short Privilege;
-    unsigned long AuthFlags;
-} RPC_CLIENT_INFORMATION1,  * PRPC_CLIENT_INFORMATION1;
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcBindingServerFromClient (
-     RPC_BINDING_HANDLE ClientBinding,
-     RPC_BINDING_HANDLE  * ServerBinding
-    );
-
-__declspec(dllimport)
-__declspec(noreturn)
-void
-__stdcall
-RpcRaiseException (
-     RPC_STATUS exception
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcTestCancel(
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerTestCancel (
-     RPC_BINDING_HANDLE BindingHandle 
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcCancelThread(
-     void * Thread
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcCancelThreadEx(
-     void * Thread,
-     long Timeout
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-UuidCreate (
-     UUID  * Uuid
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-UuidCreateSequential (
-     UUID  * Uuid
-    );
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-UuidToStringA (
-         UUID  *Uuid,
-                  RPC_CSTR  *StringUuid
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-UuidFromStringA (
-         RPC_CSTR StringUuid,
-         UUID  *Uuid
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-UuidToStringW (
-         UUID  *Uuid,
-                  RPC_WSTR  *StringUuid
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-UuidFromStringW (
-           RPC_WSTR StringUuid,
-         UUID  *Uuid
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-signed int
-__stdcall
-UuidCompare (
-     UUID  * Uuid1,
-     UUID  * Uuid2,
-     RPC_STATUS  * Status
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-UuidCreateNil (
-     UUID  * NilUuid
-    );
-
-__declspec(dllimport)
-int
-__stdcall
-UuidEqual (
-     UUID  * Uuid1,
-     UUID  * Uuid2,
-     RPC_STATUS  * Status
-    );
-
-__declspec(dllimport)
-unsigned short
-__stdcall
-UuidHash (
-     UUID  * Uuid,
-     RPC_STATUS  * Status
-    );
-
-__declspec(dllimport)
-int
-__stdcall
-UuidIsNil (
-     UUID  * Uuid,
-     RPC_STATUS  * Status
-    );
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcEpRegisterNoReplaceA (
-         RPC_IF_HANDLE IfSpec,
-         RPC_BINDING_VECTOR *BindingVector,
-           UUID_VECTOR *UuidVector,
-           RPC_CSTR Annotation
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcEpRegisterNoReplaceW (
-         RPC_IF_HANDLE IfSpec,
-         RPC_BINDING_VECTOR *BindingVector,
-           UUID_VECTOR *UuidVector,
-           RPC_WSTR Annotation
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcEpRegisterA (
-         RPC_IF_HANDLE IfSpec,
-         RPC_BINDING_VECTOR *BindingVector,
-           UUID_VECTOR *UuidVector,
-           RPC_CSTR Annotation
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcEpRegisterW (
-         RPC_IF_HANDLE IfSpec,
-         RPC_BINDING_VECTOR *BindingVector,
-           UUID_VECTOR *UuidVector,
-           RPC_WSTR Annotation
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcEpUnregister(
-     RPC_IF_HANDLE IfSpec,
-     RPC_BINDING_VECTOR *BindingVector,
-     UUID_VECTOR *UuidVector
-    );
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-DceErrorInqTextA (
-         RPC_STATUS RpcStatus,
-         RPC_CSTR ErrorText
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-DceErrorInqTextW (
-         RPC_STATUS RpcStatus,
-         RPC_WSTR ErrorText
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef I_RPC_HANDLE * RPC_EP_INQ_HANDLE;
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtEpEltInqBegin (
-     RPC_BINDING_HANDLE EpBinding ,
-     unsigned long InquiryType,
-     RPC_IF_ID  * IfId ,
-     unsigned long VersOption ,
-     UUID  * ObjectUuid ,
-     RPC_EP_INQ_HANDLE  * InquiryContext
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtEpEltInqDone (
-      RPC_EP_INQ_HANDLE  * InquiryContext
-    );
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtEpEltInqNextA (
-         RPC_EP_INQ_HANDLE InquiryContext,
-         RPC_IF_ID  *IfId,
-           RPC_BINDING_HANDLE  *Binding,
-           UUID  *ObjectUuid,
-                    RPC_CSTR  *Annotation
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtEpEltInqNextW (
-         RPC_EP_INQ_HANDLE InquiryContext,
-         RPC_IF_ID  *IfId,
-           RPC_BINDING_HANDLE  *Binding,
-           UUID  *ObjectUuid,
-                    RPC_WSTR  *Annotation
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtEpUnregister (
-     RPC_BINDING_HANDLE EpBinding ,
-     RPC_IF_ID  * IfId,
-     RPC_BINDING_HANDLE Binding,
-     UUID  * ObjectUuid 
-    );
-
-typedef int
-(__stdcall * RPC_MGMT_AUTHORIZATION_FN) (
-     RPC_BINDING_HANDLE ClientBinding,
-     unsigned long RequestedMgmtOperation,
-     RPC_STATUS  * Status
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcMgmtSetAuthorizationFn (
-     RPC_MGMT_AUTHORIZATION_FN AuthorizationFn
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-extern "C" {
-
-
-typedef struct _RPC_VERSION {
-    unsigned short MajorVersion;
-    unsigned short MinorVersion;
-} RPC_VERSION;
-
-typedef struct _RPC_SYNTAX_IDENTIFIER {
-    GUID SyntaxGUID;
-    RPC_VERSION SyntaxVersion;
-} RPC_SYNTAX_IDENTIFIER,  * PRPC_SYNTAX_IDENTIFIER;
-
-typedef struct _RPC_MESSAGE
-{
-    RPC_BINDING_HANDLE Handle;
-    unsigned long DataRepresentation;
-    void  * Buffer;
-    unsigned int BufferLength;
-    unsigned int ProcNum;
-    PRPC_SYNTAX_IDENTIFIER TransferSyntax;
-    void  * RpcInterfaceInformation;
-    void  * ReservedForRuntime;
-    void  * ManagerEpv;
-    void  * ImportContext;
-    unsigned long RpcFlags;
-} RPC_MESSAGE,  * PRPC_MESSAGE;
-
-
-typedef RPC_STATUS
-__stdcall RPC_FORWARD_FUNCTION(
-                        UUID              * InterfaceId,
-                        RPC_VERSION       * InterfaceVersion,
-                        UUID              * ObjectId,
-                        unsigned char          * Rpcpro,
-                        void  *  * ppDestEndpoint);
-
-enum RPC_ADDRESS_CHANGE_TYPE
-{
-    PROTOCOL_NOT_LOADED = 1,
-    PROTOCOL_LOADED,
-    PROTOCOL_ADDRESS_CHANGE
-};
-
-typedef void
-__stdcall RPC_ADDRESS_CHANGE_FN(
-                         void * arg
-                        );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef
-void
-(__stdcall  * RPC_DISPATCH_FUNCTION) (
-      PRPC_MESSAGE Message
-    );
-
-typedef struct {
-    unsigned int DispatchTableCount;
-    RPC_DISPATCH_FUNCTION  * DispatchTable;
-    LONG_PTR                          Reserved;
-} RPC_DISPATCH_TABLE,  * PRPC_DISPATCH_TABLE;
-
-typedef struct _RPC_PROTSEQ_ENDPOINT
-{
-    unsigned char  * RpcProtocolSequence;
-    unsigned char  * Endpoint;
-} RPC_PROTSEQ_ENDPOINT,  * PRPC_PROTSEQ_ENDPOINT;
-
-
-
-
-
-
-
-
-typedef struct _RPC_SERVER_INTERFACE
-{
-    unsigned int Length;
-    RPC_SYNTAX_IDENTIFIER InterfaceId;
-    RPC_SYNTAX_IDENTIFIER TransferSyntax;
-    PRPC_DISPATCH_TABLE DispatchTable;
-    unsigned int RpcProtseqEndpointCount;
-    PRPC_PROTSEQ_ENDPOINT RpcProtseqEndpoint;
-    void  *DefaultManagerEpv;
-    void const  *InterpreterInfo;
-    unsigned int Flags ;
-} RPC_SERVER_INTERFACE,  * PRPC_SERVER_INTERFACE;
-
-typedef struct _RPC_CLIENT_INTERFACE
-{
-    unsigned int Length;
-    RPC_SYNTAX_IDENTIFIER   InterfaceId;
-    RPC_SYNTAX_IDENTIFIER   TransferSyntax;
-    PRPC_DISPATCH_TABLE     DispatchTable;
-    unsigned int            RpcProtseqEndpointCount;
-    PRPC_PROTSEQ_ENDPOINT   RpcProtseqEndpoint;
-    ULONG_PTR               Reserved;
-    void const  *  InterpreterInfo;
-    unsigned int Flags ;
-} RPC_CLIENT_INTERFACE,  * PRPC_CLIENT_INTERFACE;
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcNegotiateTransferSyntax (
-      RPC_MESSAGE  * Message
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcGetBuffer (
-      RPC_MESSAGE  * Message
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcGetBufferWithObject (
-      RPC_MESSAGE  * Message,
-     UUID * ObjectUuid
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcSendReceive (
-      RPC_MESSAGE  * Message
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcFreeBuffer (
-      RPC_MESSAGE  * Message
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcSend (
-      PRPC_MESSAGE Message
-    ) ;
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcReceive (
-      PRPC_MESSAGE Message,
-     unsigned int Size
-    ) ;
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcFreePipeBuffer (
-      RPC_MESSAGE  * Message
-    ) ;
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcReallocPipeBuffer (
-     PRPC_MESSAGE Message,
-     unsigned int NewSize
-    ) ;
-
-typedef void * I_RPC_MUTEX;
-
-__declspec(dllimport)
-void
-__stdcall
-I_RpcRequestMutex (
-      I_RPC_MUTEX * Mutex
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-I_RpcClearMutex (
-     I_RPC_MUTEX Mutex
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-I_RpcDeleteMutex (
-     I_RPC_MUTEX Mutex
-    );
-
-__declspec(dllimport)
-void  *
-__stdcall
-I_RpcAllocate (
-     unsigned int Size
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-I_RpcFree (
-     void  * Object
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-I_RpcPauseExecution (
-     unsigned long Milliseconds
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcGetExtendedError (
-    );
-
-typedef
-void
-(__stdcall  * PRPC_RUNDOWN) (
-    void  * AssociationContext
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcMonitorAssociation (
-     RPC_BINDING_HANDLE Handle,
-     PRPC_RUNDOWN RundownRoutine,
-     void * Context
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcStopMonitorAssociation (
-     RPC_BINDING_HANDLE Handle
-    );
-
-__declspec(dllimport)
-RPC_BINDING_HANDLE
-__stdcall
-I_RpcGetCurrentCallHandle(
-    void
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcGetAssociationContext (
-     RPC_BINDING_HANDLE BindingHandle,
-     void  *  * AssociationContext
-    );
-
-__declspec(dllimport)
-void *
-__stdcall
-I_RpcGetServerContextList (
-     RPC_BINDING_HANDLE BindingHandle
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-I_RpcSetServerContextList (
-     RPC_BINDING_HANDLE BindingHandle,
-     void * ServerContextList
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcNsInterfaceExported (
-     unsigned long EntryNameSyntax,
-     unsigned short *EntryName,
-     RPC_SERVER_INTERFACE * RpcInterfaceInformation
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcNsInterfaceUnexported (
-     unsigned long EntryNameSyntax,
-     unsigned short *EntryName,
-     RPC_SERVER_INTERFACE * RpcInterfaceInformation
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcBindingToStaticStringBindingW (
-     RPC_BINDING_HANDLE Binding,
-     unsigned short **StringBinding
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcBindingInqSecurityContext (
-     RPC_BINDING_HANDLE Binding,
-     void **SecurityContextHandle
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcBindingInqWireIdForSnego (
-         RPC_BINDING_HANDLE Binding,
-         RPC_CSTR WireId
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcBindingInqMarshalledTargetInfo (
-         RPC_BINDING_HANDLE Binding,
-         unsigned long *MarshalledTargetInfoLength,
-                  RPC_CSTR *MarshalledTargetInfo
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcBindingInqLocalClientPID (
-     RPC_BINDING_HANDLE Binding,
-     unsigned long *Pid
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcBindingHandleToAsyncHandle (
-     RPC_BINDING_HANDLE Binding,
-     void **AsyncHandle
-    );
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcNsBindingSetEntryNameW (
-         RPC_BINDING_HANDLE Binding,
-         unsigned long EntryNameSyntax,
-         RPC_WSTR EntryName
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcNsBindingSetEntryNameA (
-         RPC_BINDING_HANDLE Binding,
-         unsigned long EntryNameSyntax,
-         RPC_CSTR EntryName
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcServerUseProtseqEp2A (
-         RPC_CSTR NetworkAddress,
-         RPC_CSTR Protseq,
-         unsigned int MaxCalls,
-         RPC_CSTR Endpoint,
-         void  * SecurityDescriptor,
-         void *Policy
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcServerUseProtseqEp2W (
-         RPC_WSTR NetworkAddress,
-         RPC_WSTR Protseq,
-         unsigned int MaxCalls,
-         RPC_WSTR Endpoint,
-         void  *SecurityDescriptor,
-         void *Policy
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcServerUseProtseq2W (
-         RPC_WSTR NetworkAddress,
-         RPC_WSTR Protseq,
-         unsigned int MaxCalls,
-         void  *SecurityDescriptor,
-         void *Policy
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcServerUseProtseq2A (
-         RPC_CSTR NetworkAddress,
-         RPC_CSTR Protseq,
-         unsigned int MaxCalls,
-         void  *SecurityDescriptor,
-         void *Policy
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcBindingInqDynamicEndpointW (
-         RPC_BINDING_HANDLE Binding,
-                      RPC_WSTR  *DynamicEndpoint
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcBindingInqDynamicEndpointA (
-         RPC_BINDING_HANDLE Binding,
-                      RPC_CSTR  *DynamicEndpoint
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcServerCheckClientRestriction (
-     RPC_BINDING_HANDLE Context
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcBindingInqTransportType (
-     RPC_BINDING_HANDLE Binding,
-     unsigned int  * Type
-    );
-
-typedef struct _RPC_TRANSFER_SYNTAX
-{
-    UUID Uuid;
-    unsigned short VersMajor;
-    unsigned short VersMinor;
-} RPC_TRANSFER_SYNTAX;
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcIfInqTransferSyntaxes (
-     RPC_IF_HANDLE RpcIfHandle,
-     RPC_TRANSFER_SYNTAX  * TransferSyntaxes,
-     unsigned int TransferSyntaxSize,
-     unsigned int  * TransferSyntaxCount
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_UuidCreate (
-     UUID  * Uuid
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcBindingCopy (
-     RPC_BINDING_HANDLE SourceBinding,
-     RPC_BINDING_HANDLE  * DestinationBinding
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcBindingIsClientLocal (
-     RPC_BINDING_HANDLE BindingHandle ,
-     unsigned int  * ClientLocalFlag
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcBindingInqConnId (
-     RPC_BINDING_HANDLE Binding,
-     void **ConnId,
-     int *pfFirstCall
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-I_RpcSsDontSerializeContext (
-    void
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcLaunchDatagramReceiveThread(
-    void  * pAddress
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcServerRegisterForwardFunction (
-     RPC_FORWARD_FUNCTION  * pForwardFunction
-    );
-
-RPC_ADDRESS_CHANGE_FN * __stdcall
-I_RpcServerInqAddressChangeFn();
-
-RPC_STATUS __stdcall
-I_RpcServerSetAddressChangeFn(
-     RPC_ADDRESS_CHANGE_FN * pAddressChangeFn
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcServerInqLocalConnAddress (
-     RPC_BINDING_HANDLE Binding,
-      void *Buffer,
-      unsigned long *BufferSize,
-     unsigned long *AddressFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-I_RpcSessionStrictContextHandle (
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcTurnOnEEInfoPropagation (
-    void
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcConnectionInqSockBuffSize(
-   unsigned long  * RecvBuffSize,
-   unsigned long  * SendBuffSize
-  );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcConnectionSetSockBuffSize(
-    unsigned long RecvBuffSize,
-    unsigned long SendBuffSize
-   );
-
-typedef
-void
-(*RPCLT_PDU_FILTER_FUNC) (
-     void *Buffer,
-     unsigned int BufferLength,
-     int fDatagram
-    );
-
-typedef
-void
-(__cdecl *RPC_SETFILTER_FUNC) (
-     RPCLT_PDU_FILTER_FUNC pfnFilter
-    );
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcServerStartListening(
-    void * hWnd
-    ) ;
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcServerStopListening(
-    ) ;
-
-typedef RPC_STATUS (*RPC_BLOCKING_FN) (
-     void * hWnd,
-     void * Context,
-      void * hSyncEvent
-    ) ;
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcBindingSetAsync(
-     RPC_BINDING_HANDLE Binding,
-     RPC_BLOCKING_FN BlockingFn,
-     unsigned long ServerTid
-    ) ;
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcSetThreadParams(
-     int fClientFree,
-      void *Context,
-      void * hWndClient
-    );
-
-__declspec(dllimport)
-unsigned int
-__stdcall
-I_RpcWindowProc(
-     void * hWnd,
-     unsigned int Message,
-     unsigned int wParam,
-     unsigned long lParam
-    ) ;
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcServerUnregisterEndpointA (
-         RPC_CSTR Protseq,
-         RPC_CSTR Endpoint
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcServerUnregisterEndpointW (
-         RPC_WSTR Protseq,
-         RPC_WSTR Endpoint
-    );
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcServerInqTransportType(
-     unsigned int  * Type
-    ) ;
-
-__declspec(dllimport)
-long
-__stdcall
-I_RpcMapWin32Status (
-     RPC_STATUS Status
-    );
-
-typedef struct _RPC_C_OPT_METADATA_DESCRIPTOR
-{
-    unsigned long BufferSize;   
-    char *Buffer;               
-} RPC_C_OPT_METADATA_DESCRIPTOR;
-
-typedef struct _RDR_CALLOUT_STATE
-{
-    
-    RPC_STATUS LastError;
-    void *LastEEInfo;
-
-    RPC_HTTP_REDIRECTOR_STAGE LastCalledStage;
-
-    
-    unsigned short *ServerName;   
-    unsigned short *ServerPort;   
-    unsigned short *RemoteUser;   
-    unsigned short *AuthType;     
-    unsigned char ResourceTypePresent;
-    unsigned char MetadataPresent;
-    unsigned char SessionIdPresent;
-    unsigned char InterfacePresent;
-    UUID ResourceType;
-    RPC_C_OPT_METADATA_DESCRIPTOR Metadata;     
-    UUID SessionId;
-    RPC_SYNTAX_IDENTIFIER Interface;
-    void *CertContext;            
-                                  
-                                  
-} RDR_CALLOUT_STATE;
-
-typedef RPC_STATUS
-(__stdcall *I_RpcProxyIsValidMachineFn)
-        (
-         char *pszMachine,
-         char *pszDotMachine,
-         unsigned long dwPortNumber        
-        );
-
-typedef RPC_STATUS
-(__stdcall *I_RpcProxyGetClientAddressFn)
-        (
-         void *Context,
-         char *Buffer,
-         unsigned long *BufferLength
-        );
-
-typedef RPC_STATUS
-(__stdcall *I_RpcProxyGetConnectionTimeoutFn)
-        (
-         unsigned long *ConnectionTimeout
-        );
-
-typedef RPC_STATUS
-(__stdcall *I_RpcPerformCalloutFn) 
-    (
-     void *Context,
-     RDR_CALLOUT_STATE *CallOutState,
-     RPC_HTTP_REDIRECTOR_STAGE Stage
-    );
-
-typedef void
-(__stdcall *I_RpcFreeCalloutStateFn)
-    (
-     RDR_CALLOUT_STATE *CallOutState
-    );
-
-typedef struct tagI_RpcProxyCallbackInterface
-{
-    I_RpcProxyIsValidMachineFn IsValidMachineFn;
-    I_RpcProxyGetClientAddressFn GetClientAddressFn;
-    I_RpcProxyGetConnectionTimeoutFn GetConnectionTimeoutFn;
-    I_RpcPerformCalloutFn PerformCalloutFn;
-    I_RpcFreeCalloutStateFn FreeCalloutStateFn;
-} I_RpcProxyCallbackInterface;
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcProxyNewConnection (
-     unsigned long ConnectionType,
-     unsigned short *ServerAddress,
-     unsigned short *ServerPort,
-     unsigned short *MinConnTimeout,
-     void *ConnectionParameter,
-      RDR_CALLOUT_STATE *CallOutState, 
-     I_RpcProxyCallbackInterface *ProxyCallbackInterface
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcReplyToClientWithStatus (
-     void *ConnectionParameter,
-     RPC_STATUS RpcStatus
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-I_RpcRecordCalloutFailure (
-     RPC_STATUS RpcStatus,
-     RDR_CALLOUT_STATE *CallOutState,
-     unsigned short *DllName
-    );
-
-
-}
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-typedef void  * RPC_NS_HANDLE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsBindingExportA(
-         unsigned long EntryNameSyntax,
-           RPC_CSTR EntryName,
-           RPC_IF_HANDLE IfSpec,
-           RPC_BINDING_VECTOR  *BindingVec,
-           UUID_VECTOR  *ObjectUuidVec
-    );
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsBindingUnexportA(
-         unsigned long EntryNameSyntax,
-           RPC_CSTR EntryName,
-           RPC_IF_HANDLE IfSpec,
-           UUID_VECTOR  *ObjectUuidVec
-    );
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsBindingExportW(
-         unsigned long EntryNameSyntax,
-           RPC_WSTR EntryName,
-           RPC_IF_HANDLE IfSpec,
-           RPC_BINDING_VECTOR  *BindingVec,
-           UUID_VECTOR  *ObjectUuidVec
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsBindingUnexportW(
-         unsigned long EntryNameSyntax,
-           RPC_WSTR EntryName,
-           RPC_IF_HANDLE IfSpec,
-           UUID_VECTOR  *ObjectUuidVec
-    );
-
-
-
-
-
-RPC_STATUS __stdcall
-RpcNsBindingExportPnPA(
-         unsigned long EntryNameSyntax,
-           RPC_CSTR EntryName,
-           RPC_IF_HANDLE IfSpec,
-           UUID_VECTOR *ObjectVector
-    );
-
-RPC_STATUS __stdcall
-RpcNsBindingUnexportPnPA(
-         unsigned long EntryNameSyntax,
-           RPC_CSTR EntryName,
-           RPC_IF_HANDLE IfSpec,
-           UUID_VECTOR *ObjectVector
-    );
-
-
-
-RPC_STATUS __stdcall
-RpcNsBindingExportPnPW(
-         unsigned long EntryNameSyntax,
-           RPC_WSTR EntryName,
-           RPC_IF_HANDLE IfSpec,
-           UUID_VECTOR *ObjectVector
-    );
-
-RPC_STATUS __stdcall
-RpcNsBindingUnexportPnPW(
-         unsigned long EntryNameSyntax,
-           RPC_WSTR EntryName,
-           RPC_IF_HANDLE IfSpec,
-           UUID_VECTOR *ObjectVector
-    );
-
-
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsBindingLookupBeginA(
-         unsigned long EntryNameSyntax,
-           RPC_CSTR EntryName,
-           RPC_IF_HANDLE IfSpec,
-           UUID  *ObjUuid,
-         unsigned long BindingMaxCount,
-         RPC_NS_HANDLE  *LookupContext
-    );
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsBindingLookupBeginW(
-         unsigned long EntryNameSyntax,
-           RPC_WSTR EntryName,
-           RPC_IF_HANDLE IfSpec,
-           UUID  *ObjUuid,
-         unsigned long BindingMaxCount,
-         RPC_NS_HANDLE  *LookupContext
-    );
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsBindingLookupNext(
-      RPC_NS_HANDLE LookupContext,
-     RPC_BINDING_VECTOR  *  * BindingVec
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsBindingLookupDone(
-      RPC_NS_HANDLE  * LookupContext
-    );
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsGroupDeleteA(
-         unsigned long GroupNameSyntax,
-           RPC_CSTR GroupName
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsGroupMbrAddA(
-         unsigned long GroupNameSyntax,
-         RPC_CSTR GroupName,
-         unsigned long MemberNameSyntax,
-         RPC_CSTR MemberName
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsGroupMbrRemoveA(
-         unsigned long GroupNameSyntax,
-         RPC_CSTR GroupName,
-         unsigned long MemberNameSyntax,
-         RPC_CSTR MemberName
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsGroupMbrInqBeginA(
-         unsigned long GroupNameSyntax,
-         RPC_CSTR GroupName,
-         unsigned long MemberNameSyntax,
-         RPC_NS_HANDLE  *InquiryContext
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsGroupMbrInqNextA(
-         RPC_NS_HANDLE InquiryContext,
-                  RPC_CSTR  *MemberName
-    );
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsGroupDeleteW(
-         unsigned long GroupNameSyntax,
-           RPC_WSTR GroupName
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsGroupMbrAddW(
-         unsigned long GroupNameSyntax,
-         RPC_WSTR GroupName,
-         unsigned long MemberNameSyntax,
-         RPC_WSTR MemberName
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsGroupMbrRemoveW(
-         unsigned long GroupNameSyntax,
-         RPC_WSTR GroupName,
-         unsigned long MemberNameSyntax,
-         RPC_WSTR MemberName
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsGroupMbrInqBeginW(
-         unsigned long GroupNameSyntax,
-         RPC_WSTR GroupName,
-         unsigned long MemberNameSyntax,
-         RPC_NS_HANDLE  *InquiryContext
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsGroupMbrInqNextW(
-         RPC_NS_HANDLE InquiryContext,
-                  RPC_WSTR  *MemberName
-    );
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsGroupMbrInqDone(
-      RPC_NS_HANDLE  * InquiryContext
-    );
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsProfileDeleteA(
-         unsigned long ProfileNameSyntax,
-         RPC_CSTR ProfileName
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsProfileEltAddA(
-         unsigned long ProfileNameSyntax,
-         RPC_CSTR ProfileName,
-           RPC_IF_ID  *IfId,
-         unsigned long MemberNameSyntax,
-         RPC_CSTR MemberName,
-         unsigned long Priority,
-           RPC_CSTR Annotation
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsProfileEltRemoveA(
-         unsigned long ProfileNameSyntax,
-         RPC_CSTR ProfileName,
-           RPC_IF_ID  *IfId,
-         unsigned long MemberNameSyntax,
-         RPC_CSTR MemberName
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsProfileEltInqBeginA(
-         unsigned long ProfileNameSyntax,
-         RPC_CSTR ProfileName,
-         unsigned long InquiryType,
-           RPC_IF_ID  *IfId,
-         unsigned long VersOption,
-         unsigned long MemberNameSyntax,
-           RPC_CSTR MemberName,
-         RPC_NS_HANDLE  *InquiryContext
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsProfileEltInqNextA(
-         RPC_NS_HANDLE InquiryContext,
-           RPC_IF_ID  *IfId,
-         RPC_CSTR  *MemberName,
-         unsigned long  *Priority,
-         RPC_CSTR  *Annotation
-    );
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsProfileDeleteW(
-         unsigned long ProfileNameSyntax,
-         RPC_WSTR ProfileName
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsProfileEltAddW(
-         unsigned long ProfileNameSyntax,
-         RPC_WSTR ProfileName,
-           RPC_IF_ID  *IfId,
-         unsigned long MemberNameSyntax,
-         RPC_WSTR MemberName,
-         unsigned long Priority,
-           RPC_WSTR Annotation
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsProfileEltRemoveW(
-         unsigned long ProfileNameSyntax,
-         RPC_WSTR ProfileName,
-           RPC_IF_ID  *IfId,
-         unsigned long MemberNameSyntax,
-         RPC_WSTR MemberName
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsProfileEltInqBeginW(
-         unsigned long ProfileNameSyntax,
-         RPC_WSTR ProfileName,
-         unsigned long InquiryType,
-           RPC_IF_ID  *IfId,
-         unsigned long VersOption,
-         unsigned long MemberNameSyntax,
-           RPC_WSTR MemberName,
-         RPC_NS_HANDLE  *InquiryContext
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsProfileEltInqNextW(
-         RPC_NS_HANDLE InquiryContext,
-           RPC_IF_ID  *IfId,
-         RPC_WSTR  *MemberName,
-         unsigned long  *Priority,
-         RPC_WSTR  *Annotation
-    );
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsProfileEltInqDone(
-      RPC_NS_HANDLE  * InquiryContext
-    );
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsEntryObjectInqBeginA(
-         unsigned long EntryNameSyntax,
-         RPC_CSTR EntryName,
-         RPC_NS_HANDLE  *InquiryContext
-    );
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsEntryObjectInqBeginW(
-         unsigned long EntryNameSyntax,
-         RPC_WSTR EntryName,
-         RPC_NS_HANDLE  *InquiryContext
-    );
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsEntryObjectInqNext(
-      RPC_NS_HANDLE InquiryContext,
-     UUID  * ObjUuid
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsEntryObjectInqDone(
-      RPC_NS_HANDLE  * InquiryContext
-    );
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsEntryExpandNameA(
-         unsigned long EntryNameSyntax,
-         RPC_CSTR EntryName,
-         RPC_CSTR  *ExpandedName
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsMgmtBindingUnexportA(
-         unsigned long EntryNameSyntax,
-         RPC_CSTR EntryName,
-           RPC_IF_ID  *IfId,
-         unsigned long VersOption,
-           UUID_VECTOR  *ObjectUuidVec
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsMgmtEntryCreateA(
-         unsigned long EntryNameSyntax,
-         RPC_CSTR EntryName
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsMgmtEntryDeleteA(
-         unsigned long EntryNameSyntax,
-         RPC_CSTR EntryName
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsMgmtEntryInqIfIdsA(
-         unsigned long EntryNameSyntax,
-         RPC_CSTR EntryName,
-         RPC_IF_ID_VECTOR  *  *IfIdVec
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsMgmtHandleSetExpAge(
-     RPC_NS_HANDLE NsHandle,
-     unsigned long ExpirationAge
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsMgmtInqExpAge(
-     unsigned long  * ExpirationAge
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsMgmtSetExpAge(
-     unsigned long ExpirationAge
-    );
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsEntryExpandNameW(
-         unsigned long EntryNameSyntax,
-         RPC_WSTR EntryName,
-         RPC_WSTR  *ExpandedName
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsMgmtBindingUnexportW(
-         unsigned long EntryNameSyntax,
-         RPC_WSTR EntryName,
-           RPC_IF_ID  *IfId,
-         unsigned long VersOption,
-           UUID_VECTOR  *ObjectUuidVec
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsMgmtEntryCreateW(
-         unsigned long EntryNameSyntax,
-         RPC_WSTR EntryName
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsMgmtEntryDeleteW(
-         unsigned long EntryNameSyntax,
-         RPC_WSTR EntryName
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsMgmtEntryInqIfIdsW(
-         unsigned long EntryNameSyntax,
-         RPC_WSTR EntryName,
-         RPC_IF_ID_VECTOR  *  *IfIdVec
-    );
-
-
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsBindingImportBeginA(
-         unsigned long EntryNameSyntax,
-           RPC_CSTR EntryName,
-           RPC_IF_HANDLE IfSpec,
-           UUID  *ObjUuid,
-         RPC_NS_HANDLE  *ImportContext
-    );
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsBindingImportBeginW(
-         unsigned long EntryNameSyntax,
-           RPC_WSTR EntryName,
-           RPC_IF_HANDLE IfSpec,
-           UUID  *ObjUuid,
-         RPC_NS_HANDLE  *ImportContext
-    );
-
-
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsBindingImportNext(
-     RPC_NS_HANDLE ImportContext,
-     RPC_BINDING_HANDLE   * Binding
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsBindingImportDone(
-      RPC_NS_HANDLE  * ImportContext
-    );
-
-__declspec(dllimport) RPC_STATUS __stdcall
-RpcNsBindingSelect(
-      RPC_BINDING_VECTOR  * BindingVec,
-     RPC_BINDING_HANDLE   * Binding
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-typedef
-enum _RPC_NOTIFICATION_TYPES
-{
-    RpcNotificationTypeNone,
-    RpcNotificationTypeEvent,
-    RpcNotificationTypeApc,
-    RpcNotificationTypeIoc,
-    RpcNotificationTypeHwnd,
-    RpcNotificationTypeCallback
-} RPC_NOTIFICATION_TYPES;
-
-typedef
-enum _RPC_ASYNC_EVENT {
-    RpcCallComplete,
-    RpcSendComplete,
-    RpcReceiveComplete
-    } RPC_ASYNC_EVENT;
-
-struct _RPC_ASYNC_STATE;
-
-typedef void __stdcall
-RPCNOTIFICATION_ROUTINE (
-                  struct _RPC_ASYNC_STATE *pAsync,
-                  void *Context,
-                  RPC_ASYNC_EVENT Event);
-typedef RPCNOTIFICATION_ROUTINE *PFN_RPCNOTIFICATION_ROUTINE;
-
-typedef struct _RPC_ASYNC_STATE {
-    unsigned int    Size; 
-    unsigned long   Signature;
-    long   Lock;
-    unsigned long   Flags;
-    void           *StubInfo;
-    void           *UserInfo;
-    void           *RuntimeInfo;
-    RPC_ASYNC_EVENT Event;
-
-    RPC_NOTIFICATION_TYPES NotificationType;
-    union {
-        
-        
-        
-        struct {
-            PFN_RPCNOTIFICATION_ROUTINE NotificationRoutine;
-            HANDLE hThread;
-            } APC;
-
-        
-        
-        
-        struct {
-            HANDLE hIOPort;
-            DWORD dwNumberOfBytesTransferred;
-            DWORD_PTR dwCompletionKey;
-            LPOVERLAPPED lpOverlapped;
-            } IOC;
-
-        
-        
-        
-        struct {
-            HWND hWnd;
-            UINT Msg;
-            } HWND;
-
-
-        
-        
-        
-        HANDLE hEvent;
-
-        
-        
-        
-        
-        
-        PFN_RPCNOTIFICATION_ROUTINE NotificationRoutine;
-        } u;
-
-    LONG_PTR Reserved[4];
-    } RPC_ASYNC_STATE, *PRPC_ASYNC_STATE;
-
-
-
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcAsyncInitializeHandle (
-    PRPC_ASYNC_STATE pAsync,
-    unsigned int     Size
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcAsyncRegisterInfo (
-    PRPC_ASYNC_STATE pAsync
-    ) ;
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcAsyncGetCallStatus (
-    PRPC_ASYNC_STATE pAsync
-    ) ;
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcAsyncCompleteCall (
-    PRPC_ASYNC_STATE pAsync,
-    void *Reply
-    ) ;
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcAsyncAbortCall (
-    PRPC_ASYNC_STATE pAsync,
-    unsigned long ExceptionCode
-    ) ;
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcAsyncCancelCall (
-     PRPC_ASYNC_STATE pAsync,
-     BOOL fAbort
-    ) ;
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcAsyncCleanupThread (
-     DWORD dwTimeout
-    );
-
-typedef enum tagExtendedErrorParamTypes
-{
-    eeptAnsiString = 1,
-    eeptUnicodeString,
-    eeptLongVal,
-    eeptShortVal,
-    eeptPointerVal,
-    eeptNone,
-    eeptBinary
-} ExtendedErrorParamTypes;
-
-
-
-
-typedef struct tagBinaryParam
-{
-    void *Buffer;
-    short Size;
-} BinaryParam;
-
-typedef struct tagRPC_EE_INFO_PARAM
-{
-    ExtendedErrorParamTypes ParameterType;
-    union
-        {
-        LPSTR AnsiString;
-        LPWSTR UnicodeString;
-        long LVal;
-        short SVal;
-        ULONGLONG PVal;
-        BinaryParam BVal;
-        } u;
-} RPC_EE_INFO_PARAM;
-
-
-
-
-
-
-
-
-typedef struct tagRPC_EXTENDED_ERROR_INFO
-{
-    ULONG Version;
-    LPWSTR ComputerName;
-    ULONG ProcessID;
-    union
-        {
-        SYSTEMTIME SystemTime;
-        FILETIME FileTime;
-        } u;
-    ULONG GeneratingComponent;
-    ULONG Status;
-    USHORT DetectionLocation;
-    USHORT Flags;
-    int NumberOfParameters;
-    RPC_EE_INFO_PARAM Parameters[4];
-} RPC_EXTENDED_ERROR_INFO;
-
-typedef struct tagRPC_ERROR_ENUM_HANDLE
-{
-    ULONG Signature;
-    void *CurrentPos;
-    void *Head;
-} RPC_ERROR_ENUM_HANDLE;
-
-__declspec(dllimport)
-RPC_STATUS 
-__stdcall
-RpcErrorStartEnumeration (
-      RPC_ERROR_ENUM_HANDLE *EnumHandle
-    );
-
-__declspec(dllimport)
-RPC_STATUS 
-__stdcall
-RpcErrorGetNextRecord (
-     RPC_ERROR_ENUM_HANDLE *EnumHandle, 
-     BOOL CopyStrings, 
-     RPC_EXTENDED_ERROR_INFO *ErrorInfo
-    );
-
-__declspec(dllimport)
-RPC_STATUS 
-__stdcall
-RpcErrorEndEnumeration (
-      RPC_ERROR_ENUM_HANDLE *EnumHandle
-    );
-
-__declspec(dllimport)
-RPC_STATUS 
-__stdcall
-RpcErrorResetEnumeration (
-      RPC_ERROR_ENUM_HANDLE *EnumHandle
-    );
-
-__declspec(dllimport)
-RPC_STATUS 
-__stdcall
-RpcErrorGetNumberOfRecords (
-     RPC_ERROR_ENUM_HANDLE *EnumHandle, 
-     int *Records
-    );
-
-__declspec(dllimport)
-RPC_STATUS 
-__stdcall
-RpcErrorSaveErrorInfo (
-     RPC_ERROR_ENUM_HANDLE *EnumHandle, 
-     PVOID *ErrorBlob, 
-     size_t *BlobSize
-    );
-
-__declspec(dllimport)
-RPC_STATUS 
-__stdcall
-RpcErrorLoadErrorInfo (
-     PVOID ErrorBlob, 
-     size_t BlobSize, 
-     RPC_ERROR_ENUM_HANDLE *EnumHandle
-    );
-
-__declspec(dllimport)
-RPC_STATUS 
-__stdcall
-RpcErrorAddRecord (
-     RPC_EXTENDED_ERROR_INFO *ErrorInfo
-    );
-
-__declspec(dllimport)
-void 
-__stdcall
-RpcErrorClearInformation (
-    void
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcGetAuthorizationContextForClient (
-     RPC_BINDING_HANDLE ClientBinding ,
-     BOOL ImpersonateOnReturn,
-     PVOID Reserved1,
-     PLARGE_INTEGER pExpirationTime ,
-     LUID Reserved2,
-     DWORD Reserved3,
-     PVOID Reserved4,
-     PVOID *pAuthzClientContext
-    );
-
-__declspec(dllimport)
-RPC_STATUS 
-__stdcall
-RpcFreeAuthorizationContext (
-      PVOID *pAuthzClientContext
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcSsContextLockExclusive (
-     RPC_BINDING_HANDLE ServerBindingHandle,
-     PVOID UserContext
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcSsContextLockShared (
-     RPC_BINDING_HANDLE ServerBindingHandle,
-     PVOID UserContext
-    );
-
-
-
-
-
-typedef struct tagRPC_CALL_ATTRIBUTES_V1_W
-{
-    unsigned int Version;
-    unsigned long Flags;
-    unsigned long ServerPrincipalNameBufferLength;
-    unsigned short *ServerPrincipalName;
-    unsigned long ClientPrincipalNameBufferLength;
-    unsigned short *ClientPrincipalName;
-    unsigned long AuthenticationLevel;
-    unsigned long AuthenticationService;
-    BOOL NullSession;
-} RPC_CALL_ATTRIBUTES_V1_W;
-
-typedef struct tagRPC_CALL_ATTRIBUTES_V1_A
-{
-    unsigned int Version;
-    unsigned long Flags;
-    unsigned long ServerPrincipalNameBufferLength;
-    unsigned char *ServerPrincipalName;
-    unsigned long ClientPrincipalNameBufferLength;
-    unsigned char *ClientPrincipalName;
-    unsigned long AuthenticationLevel;
-    unsigned long AuthenticationService;
-    BOOL NullSession;
-} RPC_CALL_ATTRIBUTES_V1_A;
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerInqCallAttributesW (
-     RPC_BINDING_HANDLE ClientBinding, 
-      void *RpcCallAttributes
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcServerInqCallAttributesA (
-     RPC_BINDING_HANDLE ClientBinding, 
-      void *RpcCallAttributes
-    );
-
-
-
-
-
-
-
-
-
-typedef RPC_CALL_ATTRIBUTES_V1_W RPC_CALL_ATTRIBUTES;
-
-
-
-
-RPC_STATUS __stdcall
-I_RpcAsyncSetHandle (
-      PRPC_MESSAGE Message,
-      PRPC_ASYNC_STATE pAsync
-    );
-
-RPC_STATUS __stdcall
-I_RpcAsyncAbortCall (
-     PRPC_ASYNC_STATE pAsync,
-     unsigned long ExceptionCode
-    ) ;
-
-int 
-__stdcall
-I_RpcExceptionFilter (
-    unsigned long ExceptionCode
-    );
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,1)
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {            
-
-
-
-
-struct HDROP__ { int unused; }; typedef struct HDROP__ *HDROP;
-
-extern "C" __declspec(dllimport) UINT __stdcall DragQueryFileA(HDROP,UINT,LPSTR,UINT);
-extern "C" __declspec(dllimport) UINT __stdcall DragQueryFileW(HDROP,UINT,LPWSTR,UINT);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall DragQueryPoint(HDROP,LPPOINT);
-extern "C" __declspec(dllimport) void __stdcall DragFinish(HDROP);
-extern "C" __declspec(dllimport) void __stdcall DragAcceptFiles(HWND,BOOL);
-
-extern "C" __declspec(dllimport) HINSTANCE __stdcall ShellExecuteA(HWND hwnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpParameters, LPCSTR lpDirectory, INT nShowCmd);
-extern "C" __declspec(dllimport) HINSTANCE __stdcall ShellExecuteW(HWND hwnd, LPCWSTR lpOperation, LPCWSTR lpFile, LPCWSTR lpParameters, LPCWSTR lpDirectory, INT nShowCmd);
-
-
-
-
-
-extern "C" __declspec(dllimport) HINSTANCE __stdcall FindExecutableA(LPCSTR lpFile, LPCSTR lpDirectory, LPSTR lpResult);
-extern "C" __declspec(dllimport) HINSTANCE __stdcall FindExecutableW(LPCWSTR lpFile, LPCWSTR lpDirectory, LPWSTR lpResult);
-
-
-
-
-
-extern "C" __declspec(dllimport) LPWSTR * __stdcall  CommandLineToArgvW(LPCWSTR lpCmdLine, int*pNumArgs);
-
-extern "C" __declspec(dllimport) INT __stdcall ShellAboutA(HWND hWnd, LPCSTR szApp, LPCSTR szOtherStuff, HICON hIcon);
-extern "C" __declspec(dllimport) INT __stdcall ShellAboutW(HWND hWnd, LPCWSTR szApp, LPCWSTR szOtherStuff, HICON hIcon);
-
-
-
-
-
-extern "C" __declspec(dllimport) HICON __stdcall DuplicateIcon(HINSTANCE hInst, HICON hIcon);
-extern "C" __declspec(dllimport) HICON __stdcall ExtractAssociatedIconA(HINSTANCE hInst, LPSTR lpIconPath, LPWORD lpiIcon);
-extern "C" __declspec(dllimport) HICON __stdcall ExtractAssociatedIconW(HINSTANCE hInst, LPWSTR lpIconPath, LPWORD lpiIcon);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HICON __stdcall ExtractIconA(HINSTANCE hInst, LPCSTR lpszExeFileName, UINT nIconIndex);
-extern "C" __declspec(dllimport) HICON __stdcall ExtractIconW(HINSTANCE hInst, LPCWSTR lpszExeFileName, UINT nIconIndex);
-
-
-
-
-
-
-
-typedef struct _DRAGINFOA {
-    UINT uSize;                 
-    POINT pt;
-    BOOL fNC;
-    LPSTR   lpFileList;
-    DWORD grfKeyState;
-} DRAGINFOA, *LPDRAGINFOA;
-typedef struct _DRAGINFOW {
-    UINT uSize;                 
-    POINT pt;
-    BOOL fNC;
-    LPWSTR  lpFileList;
-    DWORD grfKeyState;
-} DRAGINFOW, *LPDRAGINFOW;
-
-typedef DRAGINFOW DRAGINFO;
-typedef LPDRAGINFOW LPDRAGINFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                        
-                                        
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _AppBarData
-{
-    DWORD cbSize;
-    HWND hWnd;
-    UINT uCallbackMessage;
-    UINT uEdge;
-    RECT rc;
-    LPARAM lParam; 
-} APPBARDATA, *PAPPBARDATA;
-
-
-extern "C" __declspec(dllimport) UINT_PTR __stdcall SHAppBarMessage(DWORD dwMessage, PAPPBARDATA pData);
-
-
-
-
-
-extern "C" __declspec(dllimport) DWORD __stdcall   DoEnvironmentSubstA(LPSTR szString, UINT cchString);
-extern "C" __declspec(dllimport) DWORD __stdcall   DoEnvironmentSubstW(LPWSTR szString, UINT cchString);
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) UINT __stdcall ExtractIconExA(LPCSTR lpszFile, int nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIcons);
-extern "C" __declspec(dllimport) UINT __stdcall ExtractIconExW(LPCWSTR lpszFile, int nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIcons);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                      
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef WORD FILEOP_FLAGS;
-
-
-
-
-                                
-                                
-                                
-                                
-
-
-
-
-typedef WORD PRINTEROP_FLAGS;
-
-
-
-
-
-
-
-
-
-
-typedef struct _SHFILEOPSTRUCTA
-{
-        HWND            hwnd;
-        UINT            wFunc;
-        LPCSTR          pFrom;
-        LPCSTR          pTo;
-        FILEOP_FLAGS    fFlags;
-        BOOL            fAnyOperationsAborted;
-        LPVOID          hNameMappings;
-        LPCSTR           lpszProgressTitle; 
-} SHFILEOPSTRUCTA, *LPSHFILEOPSTRUCTA;
-typedef struct _SHFILEOPSTRUCTW
-{
-        HWND            hwnd;
-        UINT            wFunc;
-        LPCWSTR         pFrom;
-        LPCWSTR         pTo;
-        FILEOP_FLAGS    fFlags;
-        BOOL            fAnyOperationsAborted;
-        LPVOID          hNameMappings;
-        LPCWSTR          lpszProgressTitle; 
-} SHFILEOPSTRUCTW, *LPSHFILEOPSTRUCTW;
-
-typedef SHFILEOPSTRUCTW SHFILEOPSTRUCT;
-typedef LPSHFILEOPSTRUCTW LPSHFILEOPSTRUCT;
-
-
-
-
-
-extern "C" __declspec(dllimport) int __stdcall SHFileOperationA(LPSHFILEOPSTRUCTA lpFileOp);
-extern "C" __declspec(dllimport) int __stdcall SHFileOperationW(LPSHFILEOPSTRUCTW lpFileOp);
-
-
-
-
-
-extern "C" __declspec(dllimport) void __stdcall SHFreeNameMappings(HANDLE hNameMappings);
-
-typedef struct _SHNAMEMAPPINGA
-{
-    LPSTR   pszOldPath;
-    LPSTR   pszNewPath;
-    int   cchOldPath;
-    int   cchNewPath;
-} SHNAMEMAPPINGA, *LPSHNAMEMAPPINGA;
-typedef struct _SHNAMEMAPPINGW
-{
-    LPWSTR  pszOldPath;
-    LPWSTR  pszNewPath;
-    int   cchOldPath;
-    int   cchNewPath;
-} SHNAMEMAPPINGW, *LPSHNAMEMAPPINGW;
-
-typedef SHNAMEMAPPINGW SHNAMEMAPPING;
-typedef LPSHNAMEMAPPINGW LPSHNAMEMAPPING;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _SHELLEXECUTEINFOA
-{
-        DWORD cbSize;
-        ULONG fMask;
-        HWND hwnd;
-        LPCSTR   lpVerb;
-        LPCSTR   lpFile;
-        LPCSTR   lpParameters;
-        LPCSTR   lpDirectory;
-        int nShow;
-        HINSTANCE hInstApp;
-        
-        LPVOID lpIDList;
-        LPCSTR   lpClass;
-        HKEY hkeyClass;
-        DWORD dwHotKey;
-        union {
-        HANDLE hIcon;
-        HANDLE hMonitor;
-        } ;
-        HANDLE hProcess;
-} SHELLEXECUTEINFOA, *LPSHELLEXECUTEINFOA;
-typedef struct _SHELLEXECUTEINFOW
-{
-        DWORD cbSize;
-        ULONG fMask;
-        HWND hwnd;
-        LPCWSTR  lpVerb;
-        LPCWSTR  lpFile;
-        LPCWSTR  lpParameters;
-        LPCWSTR  lpDirectory;
-        int nShow;
-        HINSTANCE hInstApp;
-        
-        LPVOID lpIDList;
-        LPCWSTR  lpClass;
-        HKEY hkeyClass;
-        DWORD dwHotKey;
-        union {
-        HANDLE hIcon;
-        HANDLE hMonitor;
-        } ;
-        HANDLE hProcess;
-} SHELLEXECUTEINFOW, *LPSHELLEXECUTEINFOW;
-
-typedef SHELLEXECUTEINFOW SHELLEXECUTEINFO;
-typedef LPSHELLEXECUTEINFOW LPSHELLEXECUTEINFO;
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall ShellExecuteExA(LPSHELLEXECUTEINFOA lpExecInfo);
-extern "C" __declspec(dllimport) BOOL __stdcall ShellExecuteExW(LPSHELLEXECUTEINFOW lpExecInfo);
-
-
-
-
-
-extern "C" __declspec(dllimport) void __stdcall WinExecErrorA(HWND hwnd, int error, LPCSTR lpstrFileName, LPCSTR lpstrTitle);
-extern "C" __declspec(dllimport) void __stdcall WinExecErrorW(HWND hwnd, int error, LPCWSTR lpstrFileName, LPCWSTR lpstrTitle);
-
-
-
-
-
-
-
-
-typedef struct _SHCREATEPROCESSINFOW
-{
-        DWORD cbSize;
-        ULONG fMask;
-        HWND hwnd;
-        LPCWSTR  pszFile;
-        LPCWSTR  pszParameters;
-        LPCWSTR  pszCurrentDirectory;
-         HANDLE hUserToken;
-         LPSECURITY_ATTRIBUTES lpProcessAttributes;
-         LPSECURITY_ATTRIBUTES lpThreadAttributes;
-         BOOL bInheritHandles;
-         DWORD dwCreationFlags;
-         LPSTARTUPINFOW lpStartupInfo;
-         LPPROCESS_INFORMATION lpProcessInformation;
-} SHCREATEPROCESSINFOW, *PSHCREATEPROCESSINFOW;
-
-extern "C" __declspec(dllimport) BOOL __stdcall SHCreateProcessAsUserW(PSHCREATEPROCESSINFOW pscpi);
-
-
-
-
-
-
-
-
-
-
-typedef struct _SHQUERYRBINFO {
-    DWORD   cbSize;
-
-    __int64 i64Size;
-    __int64 i64NumItems;
-
-
-
-
-} SHQUERYRBINFO, *LPSHQUERYRBINFO;
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall SHQueryRecycleBinA(LPCSTR pszRootPath, LPSHQUERYRBINFO pSHQueryRBInfo);
-extern "C" __declspec(dllimport) HRESULT __stdcall SHQueryRecycleBinW(LPCWSTR pszRootPath, LPSHQUERYRBINFO pSHQueryRBInfo);
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall SHEmptyRecycleBinA(HWND hwnd, LPCSTR pszRootPath, DWORD dwFlags);
-extern "C" __declspec(dllimport) HRESULT __stdcall SHEmptyRecycleBinW(HWND hwnd, LPCWSTR pszRootPath, DWORD dwFlags);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _NOTIFYICONDATAA {
-        DWORD cbSize;
-        HWND hWnd;
-        UINT uID;
-        UINT uFlags;
-        UINT uCallbackMessage;
-        HICON hIcon;
-
-
-
-        CHAR   szTip[128];
-
-
-        DWORD dwState;
-        DWORD dwStateMask;
-        CHAR   szInfo[256];
-        union {
-            UINT  uTimeout;
-            UINT  uVersion;
-        } ;
-        CHAR   szInfoTitle[64];
-        DWORD dwInfoFlags;
-
-
-        GUID guidItem;
-
-} NOTIFYICONDATAA, *PNOTIFYICONDATAA;
-typedef struct _NOTIFYICONDATAW {
-        DWORD cbSize;
-        HWND hWnd;
-        UINT uID;
-        UINT uFlags;
-        UINT uCallbackMessage;
-        HICON hIcon;
-
-
-
-        WCHAR  szTip[128];
-
-
-        DWORD dwState;
-        DWORD dwStateMask;
-        WCHAR  szInfo[256];
-        union {
-            UINT  uTimeout;
-            UINT  uVersion;
-        } ;
-        WCHAR  szInfoTitle[64];
-        DWORD dwInfoFlags;
-
-
-        GUID guidItem;
-
-} NOTIFYICONDATAW, *PNOTIFYICONDATAW;
-
-typedef NOTIFYICONDATAW NOTIFYICONDATA;
-typedef PNOTIFYICONDATAW PNOTIFYICONDATA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall Shell_NotifyIconA(DWORD dwMessage, PNOTIFYICONDATAA lpData);
-extern "C" __declspec(dllimport) BOOL __stdcall Shell_NotifyIconW(DWORD dwMessage, PNOTIFYICONDATAW lpData);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _SHFILEINFOA
-{
-        HICON       hIcon;                      
-        int         iIcon;                      
-        DWORD       dwAttributes;               
-        CHAR        szDisplayName[260];    
-        CHAR        szTypeName[80];             
-} SHFILEINFOA;
-typedef struct _SHFILEINFOW
-{
-        HICON       hIcon;                      
-        int         iIcon;                      
-        DWORD       dwAttributes;               
-        WCHAR       szDisplayName[260];    
-        WCHAR       szTypeName[80];             
-} SHFILEINFOW;
-
-typedef SHFILEINFOW SHFILEINFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                                
-
-
-extern "C" __declspec(dllimport) DWORD_PTR __stdcall SHGetFileInfoA(LPCSTR pszPath, DWORD dwFileAttributes, SHFILEINFOA *psfi, UINT cbFileInfo, UINT uFlags);
-extern "C" __declspec(dllimport) DWORD_PTR __stdcall SHGetFileInfoW(LPCWSTR pszPath, DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT cbFileInfo, UINT uFlags);
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall SHGetDiskFreeSpaceExA(LPCSTR pszDirectoryName, ULARGE_INTEGER* pulFreeBytesAvailableToCaller, ULARGE_INTEGER* pulTotalNumberOfBytes, ULARGE_INTEGER* pulTotalNumberOfFreeBytes);
-extern "C" __declspec(dllimport) BOOL __stdcall SHGetDiskFreeSpaceExW(LPCWSTR pszDirectoryName, ULARGE_INTEGER* pulFreeBytesAvailableToCaller, ULARGE_INTEGER* pulTotalNumberOfBytes, ULARGE_INTEGER* pulTotalNumberOfFreeBytes);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall SHGetNewLinkInfoA(LPCSTR pszLinkTo, LPCSTR pszDir, LPSTR pszName, BOOL *pfMustCopy, UINT uFlags);
-extern "C" __declspec(dllimport) BOOL __stdcall SHGetNewLinkInfoW(LPCWSTR pszLinkTo, LPCWSTR pszDir, LPWSTR pszName, BOOL *pfMustCopy, UINT uFlags);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall SHInvokePrinterCommandA(HWND hwnd, UINT uAction, LPCSTR lpBuf1, LPCSTR lpBuf2, BOOL fModal);
-extern "C" __declspec(dllimport) BOOL __stdcall SHInvokePrinterCommandW(HWND hwnd, UINT uAction, LPCWSTR lpBuf1, LPCWSTR lpBuf2, BOOL fModal);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall SHLoadNonloadedIconOverlayIdentifiers(void);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall SHIsFileAvailableOffline(LPCWSTR pwszPath, LPDWORD pdwStatus);
-
-
-
-
-                                            
-                                            
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall SHSetLocalizedName(LPWSTR pszPath, LPCWSTR pszResModule, int idsRes);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" HRESULT __stdcall          SHEnumerateUnreadMailAccountsA(HKEY hKeyUser, DWORD dwIndex, LPSTR pszMailAddress, int cchMailAddress);
-extern "C" HRESULT __stdcall          SHEnumerateUnreadMailAccountsW(HKEY hKeyUser, DWORD dwIndex, LPWSTR pszMailAddress, int cchMailAddress);
-
-
-
-
-
-extern "C" HRESULT __stdcall          SHGetUnreadMailCountA(HKEY hKeyUser, LPCSTR pszMailAddress, DWORD *pdwCount, FILETIME *pFileTime, LPSTR pszShellExecuteCommand, int cchShellExecuteCommand);
-extern "C" HRESULT __stdcall          SHGetUnreadMailCountW(HKEY hKeyUser, LPCWSTR pszMailAddress, DWORD *pdwCount, FILETIME *pFileTime, LPWSTR pszShellExecuteCommand, int cchShellExecuteCommand);
-
-
-
-
-
-extern "C" HRESULT __stdcall          SHSetUnreadMailCountA(LPCSTR pszMailAddress, DWORD dwCount, LPCSTR pszShellExecuteCommand);
-extern "C" HRESULT __stdcall          SHSetUnreadMailCountW(LPCWSTR pszMailAddress, DWORD dwCount, LPCWSTR pszShellExecuteCommand);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" HRESULT __stdcall SHGetImageList(int iImageList, const IID & riid, void **ppvObj);
-
-
-
-
-
-
-
-
-
-
-typedef HRESULT (__stdcall *PFNCANSHAREFOLDERW)( LPCWSTR pszPath);
-typedef HRESULT (__stdcall *PFNSHOWSHAREFOLDERUIW)( HWND hwndParent,  LPCWSTR pszPath);
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,8)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _PERF_DATA_BLOCK {
-    WCHAR           Signature[4];       
-    DWORD           LittleEndian;       
-    DWORD           Version;            
-                                        
-    DWORD           Revision;           
-                                        
-    DWORD           TotalByteLength;    
-    DWORD           HeaderLength;       
-    DWORD           NumObjectTypes;     
-                                        
-    LONG            DefaultObject;      
-                                        
-                                        
-                                        
-                                        
-    SYSTEMTIME      SystemTime;         
-                                        
-    LARGE_INTEGER   PerfTime;           
-                                        
-    LARGE_INTEGER   PerfFreq;           
-                                        
-    LARGE_INTEGER   PerfTime100nSec;    
-                                        
-    DWORD           SystemNameLength;   
-    DWORD           SystemNameOffset;   
-                                        
-                                        
-} PERF_DATA_BLOCK, *PPERF_DATA_BLOCK;
-
-
-
-
-
-
-
-
-
-typedef struct _PERF_OBJECT_TYPE {
-    DWORD           TotalByteLength;    
-                                        
-                                        
-                                        
-                                        
-                                        
-                                        
-                                        
-    DWORD           DefinitionLength;   
-                                        
-                                        
-                                        
-                                        
-                                        
-                                        
-                                        
-    DWORD           HeaderLength;       
-                                        
-                                        
-                                        
-    DWORD           ObjectNameTitleIndex;
-                                        
-
-
-
-    LPWSTR          ObjectNameTitle;    
-                                        
-                                        
-
-    DWORD           ObjectHelpTitleIndex;
-                                        
-
-
-
-    LPWSTR          ObjectHelpTitle;    
-                                        
-                                        
-
-    DWORD           DetailLevel;        
-                                        
-                                        
-                                        
-    DWORD           NumCounters;        
-                                        
-                                        
-    LONG            DefaultCounter;     
-                                        
-                                        
-                                        
-    LONG            NumInstances;       
-                                        
-                                        
-                                        
-                                        
-                                        
-                                        
-                                        
-                                        
-                                        
-                                        
-                                        
-    DWORD           CodePage;           
-                                        
-                                        
-    LARGE_INTEGER   PerfTime;           
-                                        
-    LARGE_INTEGER   PerfFreq;           
-                                        
-} PERF_OBJECT_TYPE, *PPERF_OBJECT_TYPE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                            
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                        
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _PERF_COUNTER_DEFINITION {
-    DWORD           ByteLength;         
-    DWORD           CounterNameTitleIndex;
-                                        
-                                        
-
-
-
-    LPWSTR          CounterNameTitle;   
-                                        
-                                        
-
-    DWORD           CounterHelpTitleIndex;
-                                        
-                                        
-
-
-
-    LPWSTR          CounterHelpTitle;   
-                                        
-                                        
-
-    LONG            DefaultScale;       
-                                        
-                                        
-    DWORD           DetailLevel;        
-                                        
-    DWORD           CounterType;        
-    DWORD           CounterSize;        
-    DWORD           CounterOffset;      
-                                        
-                                        
-} PERF_COUNTER_DEFINITION, *PPERF_COUNTER_DEFINITION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _PERF_INSTANCE_DEFINITION {
-    DWORD           ByteLength;         
-                                        
-    DWORD           ParentObjectTitleIndex;
-                                        
-                                        
-                                        
-                                        
-                                        
-    DWORD           ParentObjectInstance;
-                                        
-                                        
-                                        
-    LONG            UniqueID;           
-                                        
-                                        
-    DWORD           NameOffset;         
-                                        
-                                        
-    DWORD           NameLength;         
-                                        
-                                        
-                                        
-                                        
-                                        
-} PERF_INSTANCE_DEFINITION, *PPERF_INSTANCE_DEFINITION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _PERF_COUNTER_BLOCK {
-    DWORD           ByteLength;         
-                                        
-} PERF_COUNTER_BLOCK, *PPERF_COUNTER_BLOCK;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef DWORD (__stdcall PM_OPEN_PROC) (LPWSTR);
-typedef DWORD (__stdcall PM_COLLECT_PROC) (LPWSTR, LPVOID *, LPDWORD, LPDWORD);
-typedef DWORD (__stdcall PM_CLOSE_PROC) (void);
-typedef DWORD (__stdcall PM_QUERY_PROC) (LPDWORD, LPVOID *, LPDWORD, LPDWORD);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(push)
-
-#pragma warning(disable:4201)    
-
-
-
-#pragma once
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef unsigned int ALG_ID;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef ULONG_PTR HCRYPTPROV;
-typedef ULONG_PTR HCRYPTKEY;
-typedef ULONG_PTR HCRYPTHASH;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                            
-                                            
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMS_KEY_INFO {
-    DWORD       dwVersion;                      
-    ALG_ID  Algid;                              
-    BYTE    *pbOID;                             
-    DWORD   cbOID;                              
-} CMS_KEY_INFO, *PCMS_KEY_INFO;
-
-
-typedef struct _HMAC_Info {
-    ALG_ID  HashAlgid;
-    BYTE    *pbInnerString;
-    DWORD   cbInnerString;
-    BYTE    *pbOuterString;
-    DWORD   cbOuterString;
-} HMAC_INFO, *PHMAC_INFO;
-
-
-typedef struct _SCHANNEL_ALG {
-    DWORD   dwUse;
-    ALG_ID  Algid;
-    DWORD   cBits;
-    DWORD   dwFlags;
-    DWORD   dwReserved;
-} SCHANNEL_ALG, *PSCHANNEL_ALG;
-
-
-
-
-
-
-
-
-typedef struct _PROV_ENUMALGS {
-    ALG_ID    aiAlgid;
-    DWORD     dwBitLen;
-    DWORD     dwNameLen;
-    CHAR      szName[20];
-} PROV_ENUMALGS;
-
-typedef struct _PROV_ENUMALGS_EX {
-    ALG_ID    aiAlgid;
-    DWORD     dwDefaultLen;
-    DWORD     dwMinLen;
-    DWORD     dwMaxLen;
-    DWORD     dwProtocols;
-    DWORD     dwNameLen;
-    CHAR      szName[20];
-    DWORD     dwLongNameLen;
-    CHAR      szLongName[40];
-} PROV_ENUMALGS_EX;
-
-typedef struct _PUBLICKEYSTRUC {
-        BYTE    bType;
-        BYTE    bVersion;
-        WORD    reserved;
-        ALG_ID  aiKeyAlg;
-} BLOBHEADER, PUBLICKEYSTRUC;
-
-typedef struct _RSAPUBKEY {
-        DWORD   magic;                  
-        DWORD   bitlen;                 
-        DWORD   pubexp;                 
-                                        
-} RSAPUBKEY;
-
-typedef struct _PUBKEY {
-        DWORD   magic;
-        DWORD   bitlen;                 
-} DHPUBKEY, DSSPUBKEY, KEAPUBKEY, TEKPUBKEY;
-
-typedef struct _DSSSEED {
-        DWORD   counter;
-        BYTE    seed[20];
-} DSSSEED;
-
-typedef struct _PUBKEYVER3 {
-        DWORD   magic;
-        DWORD   bitlenP;                
-        DWORD   bitlenQ;                
-        DWORD   bitlenJ;                
-        DSSSEED DSSSeed;
-} DHPUBKEY_VER3, DSSPUBKEY_VER3;
-
-typedef struct _PRIVKEYVER3 {
-        DWORD   magic;
-        DWORD   bitlenP;                
-        DWORD   bitlenQ;                
-        DWORD   bitlenJ;                
-        DWORD   bitlenX;                
-        DSSSEED DSSSeed;
-} DHPRIVKEY_VER3, DSSPRIVKEY_VER3;
-
-typedef struct _KEY_TYPE_SUBTYPE {
-        DWORD   dwKeySpec;
-        GUID    Type;
-        GUID    Subtype;
-} KEY_TYPE_SUBTYPE, *PKEY_TYPE_SUBTYPE;
-
-typedef struct _CERT_FORTEZZA_DATA_PROP {
-    unsigned char   SerialNumber[8];
-    int             CertIndex;
-    unsigned char   CertLabel[36];
-} CERT_FORTEZZA_DATA_PROP;
-
-typedef struct _CRYPT_RC4_KEY_STATE {
-    unsigned char Key[16];
-    unsigned char SBox[256];
-    unsigned char i;
-    unsigned char j;
-} CRYPT_RC4_KEY_STATE, *PCRYPT_RC4_KEY_STATE;
-
-typedef struct _CRYPT_DES_KEY_STATE {
-    unsigned char Key[8];
-    unsigned char IV[8];
-    unsigned char Feedback[8];
-} CRYPT_DES_KEY_STATE, *PCRYPT_DES_KEY_STATE;
-
-typedef struct _CRYPT_3DES_KEY_STATE {
-    unsigned char Key[24];
-    unsigned char IV[8];
-    unsigned char Feedback[8];
-} CRYPT_3DES_KEY_STATE, *PCRYPT_3DES_KEY_STATE;
-
-
-
-
-
-typedef struct _CRYPTOAPI_BLOB {
-    DWORD   cbData;
-    BYTE    *pbData;
-} CRYPT_INTEGER_BLOB, *PCRYPT_INTEGER_BLOB,
-CRYPT_UINT_BLOB, *PCRYPT_UINT_BLOB,
-CRYPT_OBJID_BLOB, *PCRYPT_OBJID_BLOB,
-CERT_NAME_BLOB, *PCERT_NAME_BLOB,
-CERT_RDN_VALUE_BLOB, *PCERT_RDN_VALUE_BLOB,
-CERT_BLOB, *PCERT_BLOB,
-CRL_BLOB, *PCRL_BLOB,
-DATA_BLOB, *PDATA_BLOB,
-CRYPT_DATA_BLOB, *PCRYPT_DATA_BLOB,
-CRYPT_HASH_BLOB, *PCRYPT_HASH_BLOB,
-CRYPT_DIGEST_BLOB, *PCRYPT_DIGEST_BLOB,
-CRYPT_DER_BLOB, *PCRYPT_DER_BLOB,
-CRYPT_ATTR_BLOB, *PCRYPT_ATTR_BLOB;
-
-
-typedef struct _CMS_DH_KEY_INFO {
-    DWORD               dwVersion;                      
-    ALG_ID          Algid;                              
-    LPSTR           pszContentEncObjId; 
-    CRYPT_DATA_BLOB PubInfo;            
-    void            *pReserved;         
-} CMS_DH_KEY_INFO, *PCMS_DH_KEY_INFO;
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptAcquireContextA(
-    HCRYPTPROV *phProv,
-    LPCSTR szContainer,
-    LPCSTR szProvider,
-    DWORD dwProvType,
-    DWORD dwFlags
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptAcquireContextW(
-    HCRYPTPROV *phProv,
-    LPCWSTR szContainer,
-    LPCWSTR szProvider,
-    DWORD dwProvType,
-    DWORD dwFlags
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptReleaseContext(
-    HCRYPTPROV hProv,
-    DWORD dwFlags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptGenKey(
-    HCRYPTPROV hProv,
-    ALG_ID Algid,
-    DWORD dwFlags,
-    HCRYPTKEY *phKey
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptDeriveKey(
-    HCRYPTPROV hProv,
-    ALG_ID Algid,
-    HCRYPTHASH hBaseData,
-    DWORD dwFlags,
-    HCRYPTKEY *phKey
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptDestroyKey(
-    HCRYPTKEY hKey
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSetKeyParam(
-    HCRYPTKEY hKey,
-    DWORD dwParam,
-    const BYTE *pbData,
-    DWORD dwFlags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptGetKeyParam(
-    HCRYPTKEY hKey,
-    DWORD dwParam,
-    BYTE *pbData,
-    DWORD *pdwDataLen,
-    DWORD dwFlags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSetHashParam(
-    HCRYPTHASH hHash,
-    DWORD dwParam,
-    const BYTE *pbData,
-    DWORD dwFlags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptGetHashParam(
-    HCRYPTHASH hHash,
-    DWORD dwParam,
-    BYTE *pbData,
-    DWORD *pdwDataLen,
-    DWORD dwFlags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSetProvParam(
-    HCRYPTPROV hProv,
-    DWORD dwParam,
-    const BYTE *pbData,
-    DWORD dwFlags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptGetProvParam(
-    HCRYPTPROV hProv,
-    DWORD dwParam,
-    BYTE *pbData,
-    DWORD *pdwDataLen,
-    DWORD dwFlags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptGenRandom(
-    HCRYPTPROV hProv,
-    DWORD dwLen,
-    BYTE *pbBuffer
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptGetUserKey(
-    HCRYPTPROV hProv,
-    DWORD dwKeySpec,
-    HCRYPTKEY *phUserKey
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptExportKey(
-    HCRYPTKEY hKey,
-    HCRYPTKEY hExpKey,
-    DWORD dwBlobType,
-    DWORD dwFlags,
-    BYTE *pbData,
-    DWORD *pdwDataLen
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptImportKey(
-    HCRYPTPROV hProv,
-    const BYTE *pbData,
-    DWORD dwDataLen,
-    HCRYPTKEY hPubKey,
-    DWORD dwFlags,
-    HCRYPTKEY *phKey
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptEncrypt(
-    HCRYPTKEY hKey,
-    HCRYPTHASH hHash,
-    BOOL Final,
-    DWORD dwFlags,
-    BYTE *pbData,
-    DWORD *pdwDataLen,
-    DWORD dwBufLen
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptDecrypt(
-    HCRYPTKEY hKey,
-    HCRYPTHASH hHash,
-    BOOL Final,
-    DWORD dwFlags,
-    BYTE *pbData,
-    DWORD *pdwDataLen
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptCreateHash(
-    HCRYPTPROV hProv,
-    ALG_ID Algid,
-    HCRYPTKEY hKey,
-    DWORD dwFlags,
-    HCRYPTHASH *phHash
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptHashData(
-    HCRYPTHASH hHash,
-    const BYTE *pbData,
-    DWORD dwDataLen,
-    DWORD dwFlags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptHashSessionKey(
-    HCRYPTHASH hHash,
-    HCRYPTKEY hKey,
-    DWORD dwFlags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptDestroyHash(
-    HCRYPTHASH hHash
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSignHashA(
-    HCRYPTHASH hHash,
-    DWORD dwKeySpec,
-    LPCSTR szDescription,
-    DWORD dwFlags,
-    BYTE *pbSignature,
-    DWORD *pdwSigLen
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSignHashW(
-    HCRYPTHASH hHash,
-    DWORD dwKeySpec,
-    LPCWSTR szDescription,
-    DWORD dwFlags,
-    BYTE *pbSignature,
-    DWORD *pdwSigLen
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptVerifySignatureA(
-    HCRYPTHASH hHash,
-    const BYTE *pbSignature,
-    DWORD dwSigLen,
-    HCRYPTKEY hPubKey,
-    LPCSTR szDescription,
-    DWORD dwFlags
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptVerifySignatureW(
-    HCRYPTHASH hHash,
-    const BYTE *pbSignature,
-    DWORD dwSigLen,
-    HCRYPTKEY hPubKey,
-    LPCWSTR szDescription,
-    DWORD dwFlags
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSetProviderA(
-    LPCSTR pszProvName,
-    DWORD dwProvType
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSetProviderW(
-    LPCWSTR pszProvName,
-    DWORD dwProvType
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSetProviderExA(
-    LPCSTR pszProvName,
-    DWORD dwProvType,
-    DWORD *pdwReserved,
-    DWORD dwFlags
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSetProviderExW(
-    LPCWSTR pszProvName,
-    DWORD dwProvType,
-    DWORD *pdwReserved,
-    DWORD dwFlags
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptGetDefaultProviderA(
-    DWORD dwProvType,
-    DWORD *pdwReserved,
-    DWORD dwFlags,
-    LPSTR pszProvName,
-    DWORD *pcbProvName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptGetDefaultProviderW(
-    DWORD dwProvType,
-    DWORD *pdwReserved,
-    DWORD dwFlags,
-    LPWSTR pszProvName,
-    DWORD *pcbProvName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptEnumProviderTypesA(
-    DWORD dwIndex,
-    DWORD *pdwReserved,
-    DWORD dwFlags,
-    DWORD *pdwProvType,
-    LPSTR szTypeName,
-    DWORD *pcbTypeName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptEnumProviderTypesW(
-    DWORD dwIndex,
-    DWORD *pdwReserved,
-    DWORD dwFlags,
-    DWORD *pdwProvType,
-    LPWSTR szTypeName,
-    DWORD *pcbTypeName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptEnumProvidersA(
-    DWORD dwIndex,
-    DWORD *pdwReserved,
-    DWORD dwFlags,
-    DWORD *pdwProvType,
-    LPSTR szProvName,
-    DWORD *pcbProvName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptEnumProvidersW(
-    DWORD dwIndex,
-    DWORD *pdwReserved,
-    DWORD dwFlags,
-    DWORD *pdwProvType,
-    LPWSTR szProvName,
-    DWORD *pcbProvName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptContextAddRef(
-    HCRYPTPROV hProv,
-    DWORD *pdwReserved,
-    DWORD dwFlags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptDuplicateKey(
-    HCRYPTKEY hKey,
-    DWORD *pdwReserved,
-    DWORD dwFlags,
-    HCRYPTKEY *phKey
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptDuplicateHash(
-    HCRYPTHASH hHash,
-    DWORD *pdwReserved,
-    DWORD dwFlags,
-    HCRYPTHASH *phHash
-    );
-
-
-
-
-
-
-
-BOOL 
-__cdecl 
-GetEncSChannel(
-    BYTE **pData, 
-    DWORD *dwDecSize
-    );
-
-
-
-
-
-typedef struct _CRYPT_BIT_BLOB {
-    DWORD   cbData;
-    BYTE    *pbData;
-    DWORD   cUnusedBits;
-} CRYPT_BIT_BLOB, *PCRYPT_BIT_BLOB;
-
-
-
-
-
-
-
-typedef struct _CRYPT_ALGORITHM_IDENTIFIER {
-    LPSTR               pszObjId;
-    CRYPT_OBJID_BLOB    Parameters;
-} CRYPT_ALGORITHM_IDENTIFIER, *PCRYPT_ALGORITHM_IDENTIFIER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_OBJID_TABLE {
-    DWORD   dwAlgId;
-    LPCSTR  pszObjId;
-} CRYPT_OBJID_TABLE, *PCRYPT_OBJID_TABLE;
-
-
-
-
-
-typedef struct _CRYPT_HASH_INFO {
-    CRYPT_ALGORITHM_IDENTIFIER  HashAlgorithm;
-    CRYPT_HASH_BLOB             Hash;
-} CRYPT_HASH_INFO, *PCRYPT_HASH_INFO;
-
-
-
-
-
-
-typedef struct _CERT_EXTENSION {
-    LPSTR               pszObjId;
-    BOOL                fCritical;
-    CRYPT_OBJID_BLOB    Value;
-} CERT_EXTENSION, *PCERT_EXTENSION;
-
-
-
-
-
-
-typedef struct _CRYPT_ATTRIBUTE_TYPE_VALUE {
-    LPSTR               pszObjId;
-    CRYPT_OBJID_BLOB    Value;
-} CRYPT_ATTRIBUTE_TYPE_VALUE, *PCRYPT_ATTRIBUTE_TYPE_VALUE;
-
-
-
-
-
-
-typedef struct _CRYPT_ATTRIBUTE {
-    LPSTR               pszObjId;
-    DWORD               cValue;
-    PCRYPT_ATTR_BLOB    rgValue;
-} CRYPT_ATTRIBUTE, *PCRYPT_ATTRIBUTE;
-
-typedef struct _CRYPT_ATTRIBUTES {
-     DWORD                cAttr;
-     PCRYPT_ATTRIBUTE     rgAttr;
-} CRYPT_ATTRIBUTES, *PCRYPT_ATTRIBUTES;
-
-
-
-
-
-
-
-typedef struct _CERT_RDN_ATTR {
-    LPSTR                   pszObjId;
-    DWORD                   dwValueType;
-    CERT_RDN_VALUE_BLOB     Value;
-} CERT_RDN_ATTR, *PCERT_RDN_ATTR;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_RDN {
-    DWORD           cRDNAttr;
-    PCERT_RDN_ATTR  rgRDNAttr;
-} CERT_RDN, *PCERT_RDN;
-
-
-
-
-
-typedef struct _CERT_NAME_INFO {
-    DWORD       cRDN;
-    PCERT_RDN   rgRDN;
-} CERT_NAME_INFO, *PCERT_NAME_INFO;
-
-
-
-
-
-
-
-typedef struct _CERT_NAME_VALUE {
-    DWORD               dwValueType;
-    CERT_RDN_VALUE_BLOB Value;
-} CERT_NAME_VALUE, *PCERT_NAME_VALUE;
-
-
-
-
-
-
-
-typedef struct _CERT_PUBLIC_KEY_INFO {
-    CRYPT_ALGORITHM_IDENTIFIER    Algorithm;
-    CRYPT_BIT_BLOB                PublicKey;
-} CERT_PUBLIC_KEY_INFO, *PCERT_PUBLIC_KEY_INFO;
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_PRIVATE_KEY_INFO{
-    DWORD                       Version;
-    CRYPT_ALGORITHM_IDENTIFIER  Algorithm;
-    CRYPT_DER_BLOB              PrivateKey;
-    PCRYPT_ATTRIBUTES           pAttributes;
-}  CRYPT_PRIVATE_KEY_INFO, *PCRYPT_PRIVATE_KEY_INFO;
-
-
-
-
-
-typedef struct _CRYPT_ENCRYPTED_PRIVATE_KEY_INFO{
-    CRYPT_ALGORITHM_IDENTIFIER  EncryptionAlgorithm;
-    CRYPT_DATA_BLOB             EncryptedPrivateKey;
-} CRYPT_ENCRYPTED_PRIVATE_KEY_INFO, *PCRYPT_ENCRYPTED_PRIVATE_KEY_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PCRYPT_DECRYPT_PRIVATE_KEY_FUNC)(
-                                                        CRYPT_ALGORITHM_IDENTIFIER  Algorithm,
-                                                        CRYPT_DATA_BLOB             EncryptedPrivateKey,
-                                                        BYTE                        *pbClearTextKey,
-                                                        DWORD                       *pcbClearTextKey,
-                                                        LPVOID                      pVoidDecryptFunc);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PCRYPT_ENCRYPT_PRIVATE_KEY_FUNC)(
-                                                        CRYPT_ALGORITHM_IDENTIFIER* pAlgorithm,
-                                                        CRYPT_DATA_BLOB*            pClearTextPrivateKey,
-                                                        BYTE                        *pbEncryptedKey,
-                                                        DWORD                       *pcbEncryptedKey,
-                                                        LPVOID                      pVoidEncryptFunc);
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PCRYPT_RESOLVE_HCRYPTPROV_FUNC)(
-                                                       CRYPT_PRIVATE_KEY_INFO      *pPrivateKeyInfo,
-                                                       HCRYPTPROV                  *phCryptProv,
-                                                       LPVOID                      pVoidResolveFunc);
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_PKCS8_IMPORT_PARAMS{
-    CRYPT_DIGEST_BLOB               PrivateKey;             
-    PCRYPT_RESOLVE_HCRYPTPROV_FUNC  pResolvehCryptProvFunc; 
-    LPVOID                          pVoidResolveFunc;       
-    PCRYPT_DECRYPT_PRIVATE_KEY_FUNC pDecryptPrivateKeyFunc;
-    LPVOID                          pVoidDecryptFunc;
-} CRYPT_PKCS8_IMPORT_PARAMS, *PCRYPT_PKCS8_IMPORT_PARAMS, CRYPT_PRIVATE_KEY_BLOB_AND_PARAMS, *PCRYPT_PRIVATE_KEY_BLOB_AND_PARAMS;
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_PKCS8_EXPORT_PARAMS{
-    HCRYPTPROV                      hCryptProv;
-    DWORD                           dwKeySpec;
-    LPSTR                           pszPrivateKeyObjId;
-
-    PCRYPT_ENCRYPT_PRIVATE_KEY_FUNC pEncryptPrivateKeyFunc;
-    LPVOID                          pVoidEncryptFunc;
-} CRYPT_PKCS8_EXPORT_PARAMS, *PCRYPT_PKCS8_EXPORT_PARAMS;
-
-
-
-
-
-
-
-typedef struct _CERT_INFO {
-    DWORD                       dwVersion;
-    CRYPT_INTEGER_BLOB          SerialNumber;
-    CRYPT_ALGORITHM_IDENTIFIER  SignatureAlgorithm;
-    CERT_NAME_BLOB              Issuer;
-    FILETIME                    NotBefore;
-    FILETIME                    NotAfter;
-    CERT_NAME_BLOB              Subject;
-    CERT_PUBLIC_KEY_INFO        SubjectPublicKeyInfo;
-    CRYPT_BIT_BLOB              IssuerUniqueId;
-    CRYPT_BIT_BLOB              SubjectUniqueId;
-    DWORD                       cExtension;
-    PCERT_EXTENSION             rgExtension;
-} CERT_INFO, *PCERT_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRL_ENTRY {
-    CRYPT_INTEGER_BLOB  SerialNumber;
-    FILETIME            RevocationDate;
-    DWORD               cExtension;
-    PCERT_EXTENSION     rgExtension;
-} CRL_ENTRY, *PCRL_ENTRY;
-
-
-
-
-
-
-
-typedef struct _CRL_INFO {
-    DWORD                       dwVersion;
-    CRYPT_ALGORITHM_IDENTIFIER  SignatureAlgorithm;
-    CERT_NAME_BLOB              Issuer;
-    FILETIME                    ThisUpdate;
-    FILETIME                    NextUpdate;
-    DWORD                       cCRLEntry;
-    PCRL_ENTRY                  rgCRLEntry;
-    DWORD                       cExtension;
-    PCERT_EXTENSION             rgExtension;
-} CRL_INFO, *PCRL_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_REQUEST_INFO {
-    DWORD                   dwVersion;
-    CERT_NAME_BLOB          Subject;
-    CERT_PUBLIC_KEY_INFO    SubjectPublicKeyInfo;
-    DWORD                   cAttribute;
-    PCRYPT_ATTRIBUTE        rgAttribute;
-} CERT_REQUEST_INFO, *PCERT_REQUEST_INFO;
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_KEYGEN_REQUEST_INFO {
-    DWORD                   dwVersion;
-    CERT_PUBLIC_KEY_INFO    SubjectPublicKeyInfo;
-    LPWSTR                  pwszChallengeString;        
-} CERT_KEYGEN_REQUEST_INFO, *PCERT_KEYGEN_REQUEST_INFO;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_SIGNED_CONTENT_INFO {
-    CRYPT_DER_BLOB              ToBeSigned;
-    CRYPT_ALGORITHM_IDENTIFIER  SignatureAlgorithm;
-    CRYPT_BIT_BLOB              Signature;
-} CERT_SIGNED_CONTENT_INFO, *PCERT_SIGNED_CONTENT_INFO;
-
-
-
-
-
-
-
-
-
-typedef struct _CTL_USAGE {
-    DWORD               cUsageIdentifier;
-    LPSTR               *rgpszUsageIdentifier;      
-} CTL_USAGE, *PCTL_USAGE,
-CERT_ENHKEY_USAGE, *PCERT_ENHKEY_USAGE;
-
-
-
-
-
-typedef struct _CTL_ENTRY {
-    CRYPT_DATA_BLOB     SubjectIdentifier;          
-    DWORD               cAttribute;
-    PCRYPT_ATTRIBUTE    rgAttribute;                
-} CTL_ENTRY, *PCTL_ENTRY;
-
-
-
-
-typedef struct _CTL_INFO {
-    DWORD                       dwVersion;
-    CTL_USAGE                   SubjectUsage;
-    CRYPT_DATA_BLOB             ListIdentifier;     
-    CRYPT_INTEGER_BLOB          SequenceNumber;     
-    FILETIME                    ThisUpdate;
-    FILETIME                    NextUpdate;         
-    CRYPT_ALGORITHM_IDENTIFIER  SubjectAlgorithm;
-    DWORD                       cCTLEntry;
-    PCTL_ENTRY                  rgCTLEntry;         
-    DWORD                       cExtension;
-    PCERT_EXTENSION             rgExtension;        
-} CTL_INFO, *PCTL_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_TIME_STAMP_REQUEST_INFO {
-    LPSTR                   pszTimeStampAlgorithm;   
-    LPSTR                   pszContentType;          
-    CRYPT_OBJID_BLOB        Content;
-    DWORD                   cAttribute;
-    PCRYPT_ATTRIBUTE        rgAttribute;
-} CRYPT_TIME_STAMP_REQUEST_INFO, *PCRYPT_TIME_STAMP_REQUEST_INFO;
-
-
-
-
-typedef struct _CRYPT_ENROLLMENT_NAME_VALUE_PAIR {
-    LPWSTR      pwszName;
-    LPWSTR      pwszValue;
-} CRYPT_ENROLLMENT_NAME_VALUE_PAIR, * PCRYPT_ENROLLMENT_NAME_VALUE_PAIR;
-
-
-
-
-typedef struct _CRYPT_CSP_PROVIDER {
-    DWORD           dwKeySpec;
-    LPWSTR          pwszProviderName;
-    CRYPT_BIT_BLOB  Signature;
-} CRYPT_CSP_PROVIDER, * PCRYPT_CSP_PROVIDER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptFormatObject(
-     DWORD dwCertEncodingType,
-     DWORD dwFormatType,
-     DWORD dwFormatStrType,
-     void  *pFormatStruct,
-     LPCSTR lpszStructType,
-     const BYTE *pbEncoded,
-     DWORD cbEncoded,
-     void *pbFormat,
-      DWORD *pcbFormat
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef LPVOID (__stdcall *PFN_CRYPT_ALLOC)(
-     size_t cbSize
-    );
-
-typedef void (__stdcall *PFN_CRYPT_FREE)(
-     LPVOID pv
-    );
-
-
-typedef struct _CRYPT_ENCODE_PARA {
-    DWORD                   cbSize;
-    PFN_CRYPT_ALLOC         pfnAlloc;           
-    PFN_CRYPT_FREE          pfnFree;            
-} CRYPT_ENCODE_PARA, *PCRYPT_ENCODE_PARA;
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptEncodeObjectEx(
-     DWORD dwCertEncodingType,
-     LPCSTR lpszStructType,
-     const void *pvStructInfo,
-     DWORD dwFlags,
-      PCRYPT_ENCODE_PARA pEncodePara,
-     void *pvEncoded,
-      DWORD *pcbEncoded
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptEncodeObject(
-     DWORD        dwCertEncodingType,
-     LPCSTR       lpszStructType,
-     const void   *pvStructInfo,
-     BYTE        *pbEncoded,
-      DWORD    *pcbEncoded
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_DECODE_PARA {
-    DWORD                   cbSize;
-    PFN_CRYPT_ALLOC         pfnAlloc;           
-    PFN_CRYPT_FREE          pfnFree;            
-} CRYPT_DECODE_PARA, *PCRYPT_DECODE_PARA;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptDecodeObjectEx(
-     DWORD dwCertEncodingType,
-     LPCSTR lpszStructType,
-     const BYTE *pbEncoded,
-     DWORD cbEncoded,
-     DWORD dwFlags,
-      PCRYPT_DECODE_PARA pDecodePara,
-      void *pvStructInfo,
-      DWORD *pcbStructInfo
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptDecodeObject(
-     DWORD        dwCertEncodingType,
-     LPCSTR       lpszStructType,
-     const BYTE   *pbEncoded,
-     DWORD        cbEncoded,
-     DWORD        dwFlags,
-     void        *pvStructInfo,
-      DWORD    *pcbStructInfo
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_EXTENSIONS {
-    DWORD           cExtension;
-    PCERT_EXTENSION rgExtension;
-} CERT_EXTENSIONS, *PCERT_EXTENSIONS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_AUTHORITY_KEY_ID_INFO {
-    CRYPT_DATA_BLOB     KeyId;
-    CERT_NAME_BLOB      CertIssuer;
-    CRYPT_INTEGER_BLOB  CertSerialNumber;
-} CERT_AUTHORITY_KEY_ID_INFO, *PCERT_AUTHORITY_KEY_ID_INFO;
-
-
-
-
-
-
-
-typedef struct _CERT_PRIVATE_KEY_VALIDITY {
-    FILETIME            NotBefore;
-    FILETIME            NotAfter;
-} CERT_PRIVATE_KEY_VALIDITY, *PCERT_PRIVATE_KEY_VALIDITY;
-
-typedef struct _CERT_KEY_ATTRIBUTES_INFO {
-    CRYPT_DATA_BLOB             KeyId;
-    CRYPT_BIT_BLOB              IntendedKeyUsage;
-    PCERT_PRIVATE_KEY_VALIDITY  pPrivateKeyUsagePeriod;     
-} CERT_KEY_ATTRIBUTES_INFO, *PCERT_KEY_ATTRIBUTES_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_POLICY_ID {
-    DWORD                   cCertPolicyElementId;
-    LPSTR                   *rgpszCertPolicyElementId;  
-} CERT_POLICY_ID, *PCERT_POLICY_ID;
-
-typedef struct _CERT_KEY_USAGE_RESTRICTION_INFO {
-    DWORD                   cCertPolicyId;
-    PCERT_POLICY_ID         rgCertPolicyId;
-    CRYPT_BIT_BLOB          RestrictedKeyUsage;
-} CERT_KEY_USAGE_RESTRICTION_INFO, *PCERT_KEY_USAGE_RESTRICTION_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_OTHER_NAME {
-    LPSTR               pszObjId;
-    CRYPT_OBJID_BLOB    Value;
-} CERT_OTHER_NAME, *PCERT_OTHER_NAME;
-
-typedef struct _CERT_ALT_NAME_ENTRY {
-    DWORD   dwAltNameChoice;
-    union {
-        PCERT_OTHER_NAME            pOtherName;         
-        LPWSTR                      pwszRfc822Name;     
-        LPWSTR                      pwszDNSName;        
-        
-        CERT_NAME_BLOB              DirectoryName;      
-        
-        LPWSTR                      pwszURL;            
-        CRYPT_DATA_BLOB             IPAddress;          
-        LPSTR                       pszRegisteredID;    
-    };
-} CERT_ALT_NAME_ENTRY, *PCERT_ALT_NAME_ENTRY;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_ALT_NAME_INFO {
-    DWORD                   cAltEntry;
-    PCERT_ALT_NAME_ENTRY    rgAltEntry;
-} CERT_ALT_NAME_INFO, *PCERT_ALT_NAME_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_BASIC_CONSTRAINTS_INFO {
-    CRYPT_BIT_BLOB          SubjectType;
-    BOOL                    fPathLenConstraint;
-    DWORD                   dwPathLenConstraint;
-    DWORD                   cSubtreesConstraint;
-    CERT_NAME_BLOB          *rgSubtreesConstraint;
-} CERT_BASIC_CONSTRAINTS_INFO, *PCERT_BASIC_CONSTRAINTS_INFO;
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_BASIC_CONSTRAINTS2_INFO {
-    BOOL                    fCA;
-    BOOL                    fPathLenConstraint;
-    DWORD                   dwPathLenConstraint;
-} CERT_BASIC_CONSTRAINTS2_INFO, *PCERT_BASIC_CONSTRAINTS2_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_POLICY_QUALIFIER_INFO {
-    LPSTR                       pszPolicyQualifierId;   
-    CRYPT_OBJID_BLOB            Qualifier;              
-} CERT_POLICY_QUALIFIER_INFO, *PCERT_POLICY_QUALIFIER_INFO;
-
-typedef struct _CERT_POLICY_INFO {
-    LPSTR                       pszPolicyIdentifier;    
-    DWORD                       cPolicyQualifier;       
-    CERT_POLICY_QUALIFIER_INFO  *rgPolicyQualifier;
-} CERT_POLICY_INFO, *PCERT_POLICY_INFO;
-
-typedef struct _CERT_POLICIES_INFO {
-    DWORD                       cPolicyInfo;
-    CERT_POLICY_INFO            *rgPolicyInfo;
-} CERT_POLICIES_INFO, *PCERT_POLICIES_INFO;
-
-
-
-
-
-
-
-
-typedef struct _CERT_POLICY_QUALIFIER_NOTICE_REFERENCE {
-    LPSTR   pszOrganization;
-    DWORD   cNoticeNumbers;
-    int     *rgNoticeNumbers;
-} CERT_POLICY_QUALIFIER_NOTICE_REFERENCE, *PCERT_POLICY_QUALIFIER_NOTICE_REFERENCE;
-
-typedef struct _CERT_POLICY_QUALIFIER_USER_NOTICE {
-    CERT_POLICY_QUALIFIER_NOTICE_REFERENCE  *pNoticeReference;  
-    LPWSTR                                  pszDisplayText;     
-} CERT_POLICY_QUALIFIER_USER_NOTICE, *PCERT_POLICY_QUALIFIER_USER_NOTICE;
-
-
-
-
-
-
-
-typedef struct _CPS_URLS {
-    LPWSTR                      pszURL;
-    CRYPT_ALGORITHM_IDENTIFIER  *pAlgorithm; 
-    CRYPT_DATA_BLOB             *pDigest;    
-} CPS_URLS, *PCPS_URLS;
-
-typedef struct _CERT_POLICY95_QUALIFIER1 {
-    LPWSTR      pszPracticesReference;      
-    LPSTR       pszNoticeIdentifier;        
-    LPSTR       pszNSINoticeIdentifier;     
-    DWORD       cCPSURLs;
-    CPS_URLS    *rgCPSURLs;                 
-} CERT_POLICY95_QUALIFIER1, *PCERT_POLICY95_QUALIFIER1;
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_POLICY_MAPPING {
-    LPSTR                       pszIssuerDomainPolicy;      
-    LPSTR                       pszSubjectDomainPolicy;     
-} CERT_POLICY_MAPPING, *PCERT_POLICY_MAPPING;
-
-typedef struct _CERT_POLICY_MAPPINGS_INFO {
-    DWORD                       cPolicyMapping;
-    PCERT_POLICY_MAPPING        rgPolicyMapping;
-} CERT_POLICY_MAPPINGS_INFO, *PCERT_POLICY_MAPPINGS_INFO;
-
-
-
-
-
-
-
-typedef struct _CERT_POLICY_CONSTRAINTS_INFO {
-    BOOL                        fRequireExplicitPolicy;
-    DWORD                       dwRequireExplicitPolicySkipCerts;
-
-    BOOL                        fInhibitPolicyMapping;
-    DWORD                       dwInhibitPolicyMappingSkipCerts;
-} CERT_POLICY_CONSTRAINTS_INFO, *PCERT_POLICY_CONSTRAINTS_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_CONTENT_INFO_SEQUENCE_OF_ANY {
-    LPSTR               pszObjId;
-    DWORD               cValue;
-    PCRYPT_DER_BLOB     rgValue;
-} CRYPT_CONTENT_INFO_SEQUENCE_OF_ANY, *PCRYPT_CONTENT_INFO_SEQUENCE_OF_ANY;
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_CONTENT_INFO {
-    LPSTR               pszObjId;
-    CRYPT_DER_BLOB      Content;
-} CRYPT_CONTENT_INFO, *PCRYPT_CONTENT_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_SEQUENCE_OF_ANY {
-    DWORD               cValue;
-    PCRYPT_DER_BLOB     rgValue;
-} CRYPT_SEQUENCE_OF_ANY, *PCRYPT_SEQUENCE_OF_ANY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_AUTHORITY_KEY_ID2_INFO {
-    CRYPT_DATA_BLOB     KeyId;
-    CERT_ALT_NAME_INFO  AuthorityCertIssuer;    
-                                                
-    CRYPT_INTEGER_BLOB  AuthorityCertSerialNumber;
-} CERT_AUTHORITY_KEY_ID2_INFO, *PCERT_AUTHORITY_KEY_ID2_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_ACCESS_DESCRIPTION {
-    LPSTR               pszAccessMethod;        
-    CERT_ALT_NAME_ENTRY AccessLocation;
-} CERT_ACCESS_DESCRIPTION, *PCERT_ACCESS_DESCRIPTION;
-
-
-typedef struct _CERT_AUTHORITY_INFO_ACCESS {
-    DWORD                       cAccDescr;
-    PCERT_ACCESS_DESCRIPTION    rgAccDescr;
-} CERT_AUTHORITY_INFO_ACCESS, *PCERT_AUTHORITY_INFO_ACCESS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRL_DIST_POINT_NAME {
-    DWORD   dwDistPointNameChoice;
-    union {
-        CERT_ALT_NAME_INFO      FullName;       
-        
-    };
-} CRL_DIST_POINT_NAME, *PCRL_DIST_POINT_NAME;
-
-
-
-
-
-typedef struct _CRL_DIST_POINT {
-    CRL_DIST_POINT_NAME     DistPointName;      
-    CRYPT_BIT_BLOB          ReasonFlags;        
-    CERT_ALT_NAME_INFO      CRLIssuer;          
-} CRL_DIST_POINT, *PCRL_DIST_POINT;
-
-
-
-
-
-
-
-
-
-typedef struct _CRL_DIST_POINTS_INFO {
-    DWORD                   cDistPoint;
-    PCRL_DIST_POINT         rgDistPoint;
-} CRL_DIST_POINTS_INFO, *PCRL_DIST_POINTS_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CROSS_CERT_DIST_POINTS_INFO {
-    
-    DWORD                   dwSyncDeltaTime;
-
-    DWORD                   cDistPoint;
-    PCERT_ALT_NAME_INFO     rgDistPoint;
-} CROSS_CERT_DIST_POINTS_INFO, *PCROSS_CERT_DIST_POINTS_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_PAIR {
-   CERT_BLOB    Forward;        
-   CERT_BLOB    Reverse;        
-} CERT_PAIR, *PCERT_PAIR;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRL_ISSUING_DIST_POINT {
-    CRL_DIST_POINT_NAME     DistPointName;              
-    BOOL                    fOnlyContainsUserCerts;
-    BOOL                    fOnlyContainsCACerts;
-    CRYPT_BIT_BLOB          OnlySomeReasonFlags;        
-    BOOL                    fIndirectCRL;
-} CRL_ISSUING_DIST_POINT, *PCRL_ISSUING_DIST_POINT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_GENERAL_SUBTREE {
-    CERT_ALT_NAME_ENTRY     Base;
-    DWORD                   dwMinimum;
-    BOOL                    fMaximum;
-    DWORD                   dwMaximum;
-} CERT_GENERAL_SUBTREE, *PCERT_GENERAL_SUBTREE;
-
-typedef struct _CERT_NAME_CONSTRAINTS_INFO {
-    DWORD                   cPermittedSubtree;
-    PCERT_GENERAL_SUBTREE   rgPermittedSubtree;
-    DWORD                   cExcludedSubtree;
-    PCERT_GENERAL_SUBTREE   rgExcludedSubtree;
-} CERT_NAME_CONSTRAINTS_INFO, *PCERT_NAME_CONSTRAINTS_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_DSS_PARAMETERS {
-    CRYPT_UINT_BLOB     p;
-    CRYPT_UINT_BLOB     q;
-    CRYPT_UINT_BLOB     g;
-} CERT_DSS_PARAMETERS, *PCERT_DSS_PARAMETERS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_DH_PARAMETERS {
-    CRYPT_UINT_BLOB     p;
-    CRYPT_UINT_BLOB     g;
-} CERT_DH_PARAMETERS, *PCERT_DH_PARAMETERS;
-
-
-
-
-
-
-
-
-typedef struct _CERT_X942_DH_VALIDATION_PARAMS {
-    CRYPT_BIT_BLOB      seed;
-    DWORD               pgenCounter;
-} CERT_X942_DH_VALIDATION_PARAMS, *PCERT_X942_DH_VALIDATION_PARAMS;
-
-typedef struct _CERT_X942_DH_PARAMETERS {
-    CRYPT_UINT_BLOB     p;          
-    CRYPT_UINT_BLOB     g;          
-    CRYPT_UINT_BLOB     q;          
-    CRYPT_UINT_BLOB     j;          
-    PCERT_X942_DH_VALIDATION_PARAMS pValidationParams;  
-} CERT_X942_DH_PARAMETERS, *PCERT_X942_DH_PARAMETERS;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_X942_OTHER_INFO {
-    LPSTR               pszContentEncryptionObjId;
-    BYTE                rgbCounter[4];
-    BYTE                rgbKeyLength[4];
-    CRYPT_DATA_BLOB     PubInfo;    
-} CRYPT_X942_OTHER_INFO, *PCRYPT_X942_OTHER_INFO;
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_RC2_CBC_PARAMETERS {
-    DWORD               dwVersion;
-    BOOL                fIV;            
-    BYTE                rgbIV[8];
-} CRYPT_RC2_CBC_PARAMETERS, *PCRYPT_RC2_CBC_PARAMETERS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_SMIME_CAPABILITY {
-    LPSTR               pszObjId;
-    CRYPT_OBJID_BLOB    Parameters;
-} CRYPT_SMIME_CAPABILITY, *PCRYPT_SMIME_CAPABILITY;
-
-typedef struct _CRYPT_SMIME_CAPABILITIES {
-    DWORD                   cCapability;
-    PCRYPT_SMIME_CAPABILITY rgCapability;
-} CRYPT_SMIME_CAPABILITIES, *PCRYPT_SMIME_CAPABILITIES;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMC_TAGGED_ATTRIBUTE {
-    DWORD               dwBodyPartID;
-    CRYPT_ATTRIBUTE     Attribute;
-} CMC_TAGGED_ATTRIBUTE, *PCMC_TAGGED_ATTRIBUTE;
-
-typedef struct _CMC_TAGGED_CERT_REQUEST {
-    DWORD               dwBodyPartID;
-    CRYPT_DER_BLOB      SignedCertRequest;
-} CMC_TAGGED_CERT_REQUEST, *PCMC_TAGGED_CERT_REQUEST;
-
-typedef struct _CMC_TAGGED_REQUEST {
-    DWORD               dwTaggedRequestChoice;
-    union {
-        
-        PCMC_TAGGED_CERT_REQUEST   pTaggedCertRequest;
-    };
-} CMC_TAGGED_REQUEST, *PCMC_TAGGED_REQUEST;
-
-
-
-typedef struct _CMC_TAGGED_CONTENT_INFO {
-    DWORD               dwBodyPartID;
-    CRYPT_DER_BLOB      EncodedContentInfo;
-} CMC_TAGGED_CONTENT_INFO, *PCMC_TAGGED_CONTENT_INFO;
-
-typedef struct _CMC_TAGGED_OTHER_MSG {
-    DWORD               dwBodyPartID;
-    LPSTR               pszObjId;
-    CRYPT_OBJID_BLOB    Value;
-} CMC_TAGGED_OTHER_MSG, *PCMC_TAGGED_OTHER_MSG;
-
-
-
-typedef struct _CMC_DATA_INFO {
-    DWORD                       cTaggedAttribute;
-    PCMC_TAGGED_ATTRIBUTE       rgTaggedAttribute;
-    DWORD                       cTaggedRequest;
-    PCMC_TAGGED_REQUEST         rgTaggedRequest;
-    DWORD                       cTaggedContentInfo;
-    PCMC_TAGGED_CONTENT_INFO    rgTaggedContentInfo;
-    DWORD                       cTaggedOtherMsg;
-    PCMC_TAGGED_OTHER_MSG       rgTaggedOtherMsg;
-} CMC_DATA_INFO, *PCMC_DATA_INFO;
-
-
-
-typedef struct _CMC_RESPONSE_INFO {
-    DWORD                       cTaggedAttribute;
-    PCMC_TAGGED_ATTRIBUTE       rgTaggedAttribute;
-    DWORD                       cTaggedContentInfo;
-    PCMC_TAGGED_CONTENT_INFO    rgTaggedContentInfo;
-    DWORD                       cTaggedOtherMsg;
-    PCMC_TAGGED_OTHER_MSG       rgTaggedOtherMsg;
-} CMC_RESPONSE_INFO, *PCMC_RESPONSE_INFO;
-
-
-
-
-
-
-
-
-
-typedef struct _CMC_PEND_INFO {
-    CRYPT_DATA_BLOB             PendToken;
-    FILETIME                    PendTime;
-} CMC_PEND_INFO, *PCMC_PEND_INFO;
-
-typedef struct _CMC_STATUS_INFO {
-    DWORD                       dwStatus;
-    DWORD                       cBodyList;
-    DWORD                       *rgdwBodyList;
-    LPWSTR                      pwszStatusString;   
-    DWORD                       dwOtherInfoChoice;
-    union  {
-        
-        
-        
-        DWORD                       dwFailInfo;
-        
-        PCMC_PEND_INFO              pPendInfo;
-    };
-} CMC_STATUS_INFO, *PCMC_STATUS_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMC_ADD_EXTENSIONS_INFO {
-    DWORD                       dwCmcDataReference;
-    DWORD                       cCertReference;
-    DWORD                       *rgdwCertReference;
-    DWORD                       cExtension;
-    PCERT_EXTENSION             rgExtension;
-} CMC_ADD_EXTENSIONS_INFO, *PCMC_ADD_EXTENSIONS_INFO;
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMC_ADD_ATTRIBUTES_INFO {
-    DWORD                       dwCmcDataReference;
-    DWORD                       cCertReference;
-    DWORD                       *rgdwCertReference;
-    DWORD                       cAttribute;
-    PCRYPT_ATTRIBUTE            rgAttribute;
-} CMC_ADD_ATTRIBUTES_INFO, *PCMC_ADD_ATTRIBUTES_INFO;
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_TEMPLATE_EXT {
-    LPSTR               pszObjId;
-    DWORD               dwMajorVersion;
-    BOOL                fMinorVersion;      
-    DWORD               dwMinorVersion;
-} CERT_TEMPLATE_EXT, *PCERT_TEMPLATE_EXT;
-
-
-
-
-
-
-typedef void *HCRYPTOIDFUNCSET;
-typedef void *HCRYPTOIDFUNCADDR;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_OID_FUNC_ENTRY {
-    LPCSTR  pszOID;
-    void    *pvFuncAddr;
-} CRYPT_OID_FUNC_ENTRY, *PCRYPT_OID_FUNC_ENTRY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptInstallOIDFunctionAddress(
-     HMODULE hModule,         
-     DWORD dwEncodingType,
-     LPCSTR pszFuncName,
-     DWORD cFuncEntry,
-     const CRYPT_OID_FUNC_ENTRY rgFuncEntry[],
-     DWORD dwFlags
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-HCRYPTOIDFUNCSET
-__stdcall
-CryptInitOIDFunctionSet(
-     LPCSTR pszFuncName,
-     DWORD dwFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptGetOIDFunctionAddress(
-     HCRYPTOIDFUNCSET hFuncSet,
-     DWORD dwEncodingType,
-     LPCSTR pszOID,
-     DWORD dwFlags,
-     void **ppvFuncAddr,
-     HCRYPTOIDFUNCADDR *phFuncAddr
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptGetDefaultOIDDllList(
-     HCRYPTOIDFUNCSET hFuncSet,
-     DWORD dwEncodingType,
-     LPWSTR pwszDllList,
-      DWORD *pcchDllList
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptGetDefaultOIDFunctionAddress(
-     HCRYPTOIDFUNCSET hFuncSet,
-     DWORD dwEncodingType,
-      LPCWSTR pwszDll,
-     DWORD dwFlags,
-     void **ppvFuncAddr,
-      HCRYPTOIDFUNCADDR *phFuncAddr
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptFreeOIDFunctionAddress(
-     HCRYPTOIDFUNCADDR hFuncAddr,
-     DWORD dwFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptRegisterOIDFunction(
-     DWORD dwEncodingType,
-     LPCSTR pszFuncName,
-     LPCSTR pszOID,
-      LPCWSTR pwszDll,
-      LPCSTR pszOverrideFuncName
-    );
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptUnregisterOIDFunction(
-     DWORD dwEncodingType,
-     LPCSTR pszFuncName,
-     LPCSTR pszOID
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptRegisterDefaultOIDFunction(
-     DWORD dwEncodingType,
-     LPCSTR pszFuncName,
-     DWORD dwIndex,
-     LPCWSTR pwszDll
-    );
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptUnregisterDefaultOIDFunction(
-     DWORD dwEncodingType,
-     LPCSTR pszFuncName,
-     LPCWSTR pwszDll
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSetOIDFunctionValue(
-     DWORD dwEncodingType,
-     LPCSTR pszFuncName,
-     LPCSTR pszOID,
-     LPCWSTR pwszValueName,
-     DWORD dwValueType,
-     const BYTE *pbValueData,
-     DWORD cbValueData
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptGetOIDFunctionValue(
-     DWORD dwEncodingType,
-     LPCSTR pszFuncName,
-     LPCSTR pszOID,
-     LPCWSTR pwszValueName,
-     DWORD *pdwValueType,
-     BYTE *pbValueData,
-      DWORD *pcbValueData
-    );
-
-typedef BOOL (__stdcall *PFN_CRYPT_ENUM_OID_FUNC)(
-     DWORD dwEncodingType,
-     LPCSTR pszFuncName,
-     LPCSTR pszOID,
-     DWORD cValue,
-     const DWORD rgdwValueType[],
-     LPCWSTR const rgpwszValueName[],
-     const BYTE * const rgpbValueData[],
-     const DWORD rgcbValueData[],
-     void *pvArg
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptEnumOIDFunction(
-     DWORD dwEncodingType,
-      LPCSTR pszFuncName,
-      LPCSTR pszOID,
-     DWORD dwFlags,
-     void *pvArg,
-     PFN_CRYPT_ENUM_OID_FUNC pfnEnumOIDFunc
-    );
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_OID_INFO {
-    DWORD           cbSize;
-    LPCSTR          pszOID;
-    LPCWSTR         pwszName;
-    DWORD           dwGroupId;
-    union {
-        DWORD       dwValue;
-        ALG_ID      Algid;
-        DWORD       dwLength;
-    };
-    CRYPT_DATA_BLOB ExtraInfo;
-} CRYPT_OID_INFO, *PCRYPT_OID_INFO;
-typedef const CRYPT_OID_INFO CCRYPT_OID_INFO, *PCCRYPT_OID_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCCRYPT_OID_INFO
-__stdcall
-CryptFindOIDInfo(
-     DWORD dwKeyType,
-     void *pvKey,
-     DWORD dwGroupId
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptRegisterOIDInfo(
-     PCCRYPT_OID_INFO pInfo,
-     DWORD dwFlags
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptUnregisterOIDInfo(
-     PCCRYPT_OID_INFO pInfo
-    );
-
-
-typedef BOOL (__stdcall *PFN_CRYPT_ENUM_OID_INFO)(
-     PCCRYPT_OID_INFO pInfo,
-     void *pvArg
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptEnumOIDInfo(
-     DWORD dwGroupId,
-     DWORD dwFlags,
-     void *pvArg,
-     PFN_CRYPT_ENUM_OID_INFO pfnEnumOIDInfo
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-LPCWSTR
-__stdcall
-CryptFindLocalizedName(
-     LPCWSTR pwszCryptName
-    );
-
-
-
-
-
-
-
-
-typedef void *HCRYPTMSG;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_ISSUER_SERIAL_NUMBER {
-    CERT_NAME_BLOB      Issuer;
-    CRYPT_INTEGER_BLOB  SerialNumber;
-} CERT_ISSUER_SERIAL_NUMBER, *PCERT_ISSUER_SERIAL_NUMBER;
-
-
-
-
-typedef struct _CERT_ID {
-    DWORD   dwIdChoice;
-    union {
-        
-        CERT_ISSUER_SERIAL_NUMBER   IssuerSerialNumber;
-        
-        CRYPT_HASH_BLOB             KeyId;
-        
-        CRYPT_HASH_BLOB             HashId;
-    };
-} CERT_ID, *PCERT_ID;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_SIGNER_ENCODE_INFO {
-    DWORD                       cbSize;
-    PCERT_INFO                  pCertInfo;
-    HCRYPTPROV                  hCryptProv;
-    DWORD                       dwKeySpec;
-    CRYPT_ALGORITHM_IDENTIFIER  HashAlgorithm;
-    void                        *pvHashAuxInfo;
-    DWORD                       cAuthAttr;
-    PCRYPT_ATTRIBUTE            rgAuthAttr;
-    DWORD                       cUnauthAttr;
-    PCRYPT_ATTRIBUTE            rgUnauthAttr;
-
-
-
-
-
-
-} CMSG_SIGNER_ENCODE_INFO, *PCMSG_SIGNER_ENCODE_INFO;
-
-typedef struct _CMSG_SIGNED_ENCODE_INFO {
-    DWORD                       cbSize;
-    DWORD                       cSigners;
-    PCMSG_SIGNER_ENCODE_INFO    rgSigners;
-    DWORD                       cCertEncoded;
-    PCERT_BLOB                  rgCertEncoded;
-    DWORD                       cCrlEncoded;
-    PCRL_BLOB                   rgCrlEncoded;
-
-
-
-
-
-} CMSG_SIGNED_ENCODE_INFO, *PCMSG_SIGNED_ENCODE_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_RECIPIENT_ENCODE_INFO CMSG_RECIPIENT_ENCODE_INFO,
-    *PCMSG_RECIPIENT_ENCODE_INFO;
-
-typedef struct _CMSG_ENVELOPED_ENCODE_INFO {
-    DWORD                       cbSize;
-    HCRYPTPROV                  hCryptProv;
-    CRYPT_ALGORITHM_IDENTIFIER  ContentEncryptionAlgorithm;
-    void                        *pvEncryptionAuxInfo;
-    DWORD                       cRecipients;
-
-    
-    
-    
-    PCERT_INFO                  *rgpRecipients;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-} CMSG_ENVELOPED_ENCODE_INFO, *PCMSG_ENVELOPED_ENCODE_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO {
-    DWORD                       cbSize;
-    CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
-    void                        *pvKeyEncryptionAuxInfo;
-    HCRYPTPROV                  hCryptProv;
-    CRYPT_BIT_BLOB              RecipientPublicKey;
-    CERT_ID                     RecipientId;
-} CMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO, *PCMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_RECIPIENT_ENCRYPTED_KEY_ENCODE_INFO {
-    DWORD                       cbSize;
-    CRYPT_BIT_BLOB              RecipientPublicKey;
-    CERT_ID                     RecipientId;
-
-    
-    
-    FILETIME                    Date;
-    PCRYPT_ATTRIBUTE_TYPE_VALUE pOtherAttr;
-} CMSG_RECIPIENT_ENCRYPTED_KEY_ENCODE_INFO,
-    *PCMSG_RECIPIENT_ENCRYPTED_KEY_ENCODE_INFO;
-
-typedef struct _CMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO {
-    DWORD                       cbSize;
-    CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
-    void                        *pvKeyEncryptionAuxInfo;
-    CRYPT_ALGORITHM_IDENTIFIER  KeyWrapAlgorithm;
-    void                        *pvKeyWrapAuxInfo;
-
-    
-    
-    
-    
-    
-    HCRYPTPROV                  hCryptProv;
-    DWORD                       dwKeySpec;
-
-    DWORD                       dwKeyChoice;
-    union {
-        
-        
-        
-        PCRYPT_ALGORITHM_IDENTIFIER pEphemeralAlgorithm;
-
-        
-        
-        
-        PCERT_ID                    pSenderId;
-    };
-    CRYPT_DATA_BLOB             UserKeyingMaterial;     
-
-    DWORD                                       cRecipientEncryptedKeys;
-    PCMSG_RECIPIENT_ENCRYPTED_KEY_ENCODE_INFO   *rgpRecipientEncryptedKeys;
-} CMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO, *PCMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO {
-    DWORD                       cbSize;
-    CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
-    void                        *pvKeyEncryptionAuxInfo;
-    HCRYPTPROV                  hCryptProv;
-    DWORD                       dwKeyChoice;
-    union {
-        
-        HCRYPTKEY                   hKeyEncryptionKey;
-        
-        void                        *pvKeyEncryptionKey;
-    };
-    CRYPT_DATA_BLOB             KeyId;
-
-    
-    FILETIME                    Date;
-    PCRYPT_ATTRIBUTE_TYPE_VALUE pOtherAttr;
-} CMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO, *PCMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO;
-
-
-
-
-
-
-
-
-struct _CMSG_RECIPIENT_ENCODE_INFO {
-    DWORD   dwRecipientChoice;
-    union {
-        
-        PCMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO   pKeyTrans;
-        
-        PCMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO   pKeyAgree;
-        
-        PCMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO   pMailList;
-    };
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_RC2_AUX_INFO {
-    DWORD                       cbSize;
-    DWORD                       dwBitLen;
-} CMSG_RC2_AUX_INFO, *PCMSG_RC2_AUX_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_SP3_COMPATIBLE_AUX_INFO {
-    DWORD                       cbSize;
-    DWORD                       dwFlags;
-} CMSG_SP3_COMPATIBLE_AUX_INFO, *PCMSG_SP3_COMPATIBLE_AUX_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_RC4_AUX_INFO {
-    DWORD                       cbSize;
-    DWORD                       dwBitLen;
-} CMSG_RC4_AUX_INFO, *PCMSG_RC4_AUX_INFO;
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_SIGNED_AND_ENVELOPED_ENCODE_INFO {
-    DWORD                       cbSize;
-    CMSG_SIGNED_ENCODE_INFO     SignedInfo;
-    CMSG_ENVELOPED_ENCODE_INFO  EnvelopedInfo;
-} CMSG_SIGNED_AND_ENVELOPED_ENCODE_INFO, *PCMSG_SIGNED_AND_ENVELOPED_ENCODE_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_HASHED_ENCODE_INFO {
-    DWORD                       cbSize;
-    HCRYPTPROV                  hCryptProv;
-    CRYPT_ALGORITHM_IDENTIFIER  HashAlgorithm;
-    void                        *pvHashAuxInfo;
-} CMSG_HASHED_ENCODE_INFO, *PCMSG_HASHED_ENCODE_INFO;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_ENCRYPTED_ENCODE_INFO {
-    DWORD                       cbSize;
-    CRYPT_ALGORITHM_IDENTIFIER  ContentEncryptionAlgorithm;
-    void                        *pvEncryptionAuxInfo;
-} CMSG_ENCRYPTED_ENCODE_INFO, *PCMSG_ENCRYPTED_ENCODE_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CMSG_STREAM_OUTPUT)(
-     const void *pvArg,
-     BYTE *pbData,
-     DWORD cbData,
-     BOOL fFinal
-    );
-
-
-
-typedef struct _CMSG_STREAM_INFO {
-    DWORD                   cbContent;
-    PFN_CMSG_STREAM_OUTPUT  pfnStreamOutput;
-    void                    *pvArg;
-} CMSG_STREAM_INFO, *PCMSG_STREAM_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HCRYPTMSG
-__stdcall
-CryptMsgOpenToEncode(
-     DWORD dwMsgEncodingType,
-     DWORD dwFlags,
-     DWORD dwMsgType,
-     void const *pvMsgEncodeInfo,
-      LPSTR pszInnerContentObjID,
-      PCMSG_STREAM_INFO pStreamInfo
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-CryptMsgCalculateEncodedLength(
-     DWORD dwMsgEncodingType,
-     DWORD dwFlags,
-     DWORD dwMsgType,
-     void const *pvMsgEncodeInfo,
-      LPSTR pszInnerContentObjID,
-     DWORD cbData
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HCRYPTMSG
-__stdcall
-CryptMsgOpenToDecode(
-     DWORD dwMsgEncodingType,
-     DWORD dwFlags,
-     DWORD dwMsgType,
-     HCRYPTPROV hCryptProv,
-      PCERT_INFO pRecipientInfo,
-      PCMSG_STREAM_INFO pStreamInfo
-    );
-
-
-
-
-__declspec(dllimport)
-HCRYPTMSG
-__stdcall
-CryptMsgDuplicate(
-     HCRYPTMSG hCryptMsg
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptMsgClose(
-     HCRYPTMSG hCryptMsg
-    );
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptMsgUpdate(
-     HCRYPTMSG hCryptMsg,
-     const BYTE *pbData,
-     DWORD cbData,
-     BOOL fFinal
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptMsgGetParam(
-     HCRYPTMSG hCryptMsg,
-     DWORD dwParamType,
-     DWORD dwIndex,
-     void *pvData,
-      DWORD *pcbData
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_SIGNER_INFO {
-    DWORD                       dwVersion;
-    CERT_NAME_BLOB              Issuer;
-    CRYPT_INTEGER_BLOB          SerialNumber;
-    CRYPT_ALGORITHM_IDENTIFIER  HashAlgorithm;
-    CRYPT_ALGORITHM_IDENTIFIER  HashEncryptionAlgorithm;
-    CRYPT_DATA_BLOB             EncryptedHash;
-    CRYPT_ATTRIBUTES            AuthAttrs;
-    CRYPT_ATTRIBUTES            UnauthAttrs;
-} CMSG_SIGNER_INFO, *PCMSG_SIGNER_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_CMS_SIGNER_INFO {
-    DWORD                       dwVersion;
-    CERT_ID                     SignerId;
-    CRYPT_ALGORITHM_IDENTIFIER  HashAlgorithm;
-    CRYPT_ALGORITHM_IDENTIFIER  HashEncryptionAlgorithm;
-    CRYPT_DATA_BLOB             EncryptedHash;
-    CRYPT_ATTRIBUTES            AuthAttrs;
-    CRYPT_ATTRIBUTES            UnauthAttrs;
-} CMSG_CMS_SIGNER_INFO, *PCMSG_CMS_SIGNER_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef CRYPT_ATTRIBUTES CMSG_ATTR;
-typedef CRYPT_ATTRIBUTES *PCMSG_ATTR;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_KEY_TRANS_RECIPIENT_INFO {
-    DWORD                       dwVersion;
-
-    
-    CERT_ID                     RecipientId;
-
-    CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
-    CRYPT_DATA_BLOB             EncryptedKey;
-} CMSG_KEY_TRANS_RECIPIENT_INFO, *PCMSG_KEY_TRANS_RECIPIENT_INFO;
-
-typedef struct _CMSG_RECIPIENT_ENCRYPTED_KEY_INFO {
-    
-    CERT_ID                     RecipientId;
-
-    CRYPT_DATA_BLOB             EncryptedKey;
-
-    
-    FILETIME                    Date;
-    PCRYPT_ATTRIBUTE_TYPE_VALUE pOtherAttr;
-} CMSG_RECIPIENT_ENCRYPTED_KEY_INFO, *PCMSG_RECIPIENT_ENCRYPTED_KEY_INFO;
-
-typedef struct _CMSG_KEY_AGREE_RECIPIENT_INFO {
-    DWORD                       dwVersion;
-    DWORD                       dwOriginatorChoice;
-    union {
-        
-        CERT_ID                     OriginatorCertId;
-        
-        CERT_PUBLIC_KEY_INFO        OriginatorPublicKeyInfo;
-    };
-    CRYPT_DATA_BLOB             UserKeyingMaterial;
-    CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
-
-    DWORD                                cRecipientEncryptedKeys;
-    PCMSG_RECIPIENT_ENCRYPTED_KEY_INFO   *rgpRecipientEncryptedKeys;
-} CMSG_KEY_AGREE_RECIPIENT_INFO, *PCMSG_KEY_AGREE_RECIPIENT_INFO;
-
-
-
-
-
-typedef struct _CMSG_MAIL_LIST_RECIPIENT_INFO {
-    DWORD                       dwVersion;
-    CRYPT_DATA_BLOB             KeyId;
-    CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
-    CRYPT_DATA_BLOB             EncryptedKey;
-
-    
-    FILETIME                    Date;
-    PCRYPT_ATTRIBUTE_TYPE_VALUE pOtherAttr;
-} CMSG_MAIL_LIST_RECIPIENT_INFO, *PCMSG_MAIL_LIST_RECIPIENT_INFO;
-
-typedef struct _CMSG_CMS_RECIPIENT_INFO {
-    DWORD   dwRecipientChoice;
-    union {
-        
-        PCMSG_KEY_TRANS_RECIPIENT_INFO   pKeyTrans;
-        
-        PCMSG_KEY_AGREE_RECIPIENT_INFO   pKeyAgree;
-        
-        PCMSG_MAIL_LIST_RECIPIENT_INFO   pMailList;
-    };
-} CMSG_CMS_RECIPIENT_INFO, *PCMSG_CMS_RECIPIENT_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptMsgControl(
-     HCRYPTMSG hCryptMsg,
-     DWORD dwFlags,
-     DWORD dwCtrlType,
-     void const *pvCtrlPara
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_CTRL_VERIFY_SIGNATURE_EX_PARA {
-    DWORD               cbSize;
-    HCRYPTPROV          hCryptProv;
-    DWORD               dwSignerIndex;
-    DWORD               dwSignerType;
-    void                *pvSigner;
-} CMSG_CTRL_VERIFY_SIGNATURE_EX_PARA, *PCMSG_CTRL_VERIFY_SIGNATURE_EX_PARA;
-
-
-
-    
-
-    
-
-    
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_CTRL_DECRYPT_PARA {
-    DWORD       cbSize;
-    HCRYPTPROV  hCryptProv;
-    DWORD       dwKeySpec;
-    DWORD       dwRecipientIndex;
-} CMSG_CTRL_DECRYPT_PARA, *PCMSG_CTRL_DECRYPT_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_CTRL_KEY_TRANS_DECRYPT_PARA {
-    DWORD                           cbSize;
-    HCRYPTPROV                      hCryptProv;
-    DWORD                           dwKeySpec;
-    PCMSG_KEY_TRANS_RECIPIENT_INFO  pKeyTrans;
-    DWORD                           dwRecipientIndex;
-} CMSG_CTRL_KEY_TRANS_DECRYPT_PARA, *PCMSG_CTRL_KEY_TRANS_DECRYPT_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_CTRL_KEY_AGREE_DECRYPT_PARA {
-    DWORD                           cbSize;
-    HCRYPTPROV                      hCryptProv;
-    DWORD                           dwKeySpec;
-    PCMSG_KEY_AGREE_RECIPIENT_INFO  pKeyAgree;
-    DWORD                           dwRecipientIndex;
-    DWORD                           dwRecipientEncryptedKeyIndex;
-    CRYPT_BIT_BLOB                  OriginatorPublicKey;
-} CMSG_CTRL_KEY_AGREE_DECRYPT_PARA, *PCMSG_CTRL_KEY_AGREE_DECRYPT_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_CTRL_MAIL_LIST_DECRYPT_PARA {
-    DWORD                           cbSize;
-    HCRYPTPROV                      hCryptProv;
-    PCMSG_MAIL_LIST_RECIPIENT_INFO  pMailList;
-    DWORD                           dwRecipientIndex;
-    DWORD                           dwKeyChoice;
-    union {
-        
-        HCRYPTKEY                       hKeyEncryptionKey;
-        
-        void                            *pvKeyEncryptionKey;
-    };
-} CMSG_CTRL_MAIL_LIST_DECRYPT_PARA, *PCMSG_CTRL_MAIL_LIST_DECRYPT_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR_PARA {
-    DWORD               cbSize;
-    DWORD               dwSignerIndex;
-    CRYPT_DATA_BLOB     blob;
-} CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR_PARA, *PCMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR_PARA;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR_PARA {
-    DWORD               cbSize;
-    DWORD               dwSignerIndex;
-    DWORD               dwUnauthAttrIndex;
-} CMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR_PARA, *PCMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-BOOL
-__stdcall
-CryptMsgVerifyCountersignatureEncoded(
-     HCRYPTPROV   hCryptProv,
-     DWORD        dwEncodingType,
-     PBYTE        pbSignerInfo,
-     DWORD        cbSignerInfo,
-     PBYTE        pbSignerInfoCountersignature,
-     DWORD        cbSignerInfoCountersignature,
-     PCERT_INFO   pciCountersigner
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-BOOL
-__stdcall
-CryptMsgVerifyCountersignatureEncodedEx(
-     HCRYPTPROV   hCryptProv,
-     DWORD        dwEncodingType,
-     PBYTE        pbSignerInfo,
-     DWORD        cbSignerInfo,
-     PBYTE        pbSignerInfoCountersignature,
-     DWORD        cbSignerInfoCountersignature,
-     DWORD        dwSignerType,
-     void         *pvSigner,
-     DWORD        dwFlags,
-      void *pvReserved
-    );
-
-
-
-
-
-
-
-
-
-
-BOOL
-__stdcall
-CryptMsgCountersign(
-      HCRYPTMSG            hCryptMsg,
-     DWORD                    dwIndex,
-     DWORD                    cCountersigners,
-     PCMSG_SIGNER_ENCODE_INFO rgCountersigners
-    );
-
-
-
-
-
-
-
-BOOL
-__stdcall
-CryptMsgCountersignEncoded(
-     DWORD                    dwEncodingType,
-     PBYTE                    pbSignerInfo,
-     DWORD                    cbSignerInfo,
-     DWORD                    cCountersigners,
-     PCMSG_SIGNER_ENCODE_INFO rgCountersigners,
-     PBYTE                   pbCountersignature,
-      PDWORD               pcbCountersignature
-    );
-
-
-
-
-
-
-
-
-typedef void * (__stdcall *PFN_CMSG_ALLOC) (
-     size_t cb
-    );
-
-typedef void (__stdcall *PFN_CMSG_FREE)(
-     void *pv
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CMSG_GEN_ENCRYPT_KEY) (
-      HCRYPTPROV               *phCryptProv,
-     PCRYPT_ALGORITHM_IDENTIFIER  paiEncrypt,
-     PVOID                        pvEncryptAuxInfo,
-     PCERT_PUBLIC_KEY_INFO        pPublicKeyInfo,
-     PFN_CMSG_ALLOC               pfnAlloc,
-     HCRYPTKEY                   *phEncryptKey,
-     PBYTE                       *ppbEncryptParameters,
-     PDWORD                      pcbEncryptParameters
-    );
-
-
-typedef BOOL (__stdcall *PFN_CMSG_EXPORT_ENCRYPT_KEY) (
-     HCRYPTPROV                   hCryptProv,
-     HCRYPTKEY                    hEncryptKey,
-     PCERT_PUBLIC_KEY_INFO        pPublicKeyInfo,
-     PBYTE                       pbData,
-      PDWORD                   pcbData
-    );
-
-
-typedef BOOL (__stdcall *PFN_CMSG_IMPORT_ENCRYPT_KEY) (
-     HCRYPTPROV                   hCryptProv,
-     DWORD                        dwKeySpec,
-     PCRYPT_ALGORITHM_IDENTIFIER  paiEncrypt,
-     PCRYPT_ALGORITHM_IDENTIFIER  paiPubKey,
-     PBYTE                        pbEncodedKey,
-     DWORD                        cbEncodedKey,
-     HCRYPTKEY                   *phEncryptKey
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CMSG_CONTENT_ENCRYPT_INFO {
-    DWORD                       cbSize;
-    HCRYPTPROV                  hCryptProv;
-    CRYPT_ALGORITHM_IDENTIFIER  ContentEncryptionAlgorithm;
-    void                        *pvEncryptionAuxInfo;
-    DWORD                       cRecipients;
-    PCMSG_RECIPIENT_ENCODE_INFO rgCmsRecipients;
-    PFN_CMSG_ALLOC              pfnAlloc;
-    PFN_CMSG_FREE               pfnFree;
-    DWORD                       dwEncryptFlags;
-    HCRYPTKEY                   hContentEncryptKey;
-    DWORD                       dwFlags;
-} CMSG_CONTENT_ENCRYPT_INFO, *PCMSG_CONTENT_ENCRYPT_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CMSG_GEN_CONTENT_ENCRYPT_KEY) (
-      PCMSG_CONTENT_ENCRYPT_INFO pContentEncryptInfo,
-     DWORD dwFlags,
-      void *pvReserved
-    );
-
-
-
-
-
-
-
-typedef struct _CMSG_KEY_TRANS_ENCRYPT_INFO {
-    DWORD                       cbSize;
-    DWORD                       dwRecipientIndex;
-    CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
-    CRYPT_DATA_BLOB             EncryptedKey;
-    DWORD                       dwFlags;
-} CMSG_KEY_TRANS_ENCRYPT_INFO, *PCMSG_KEY_TRANS_ENCRYPT_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CMSG_EXPORT_KEY_TRANS) (
-     PCMSG_CONTENT_ENCRYPT_INFO pContentEncryptInfo,
-     PCMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO pKeyTransEncodeInfo,
-      PCMSG_KEY_TRANS_ENCRYPT_INFO pKeyTransEncryptInfo,
-     DWORD dwFlags,
-      void *pvReserved
-    );
-
-
-
-
-
-
-
-
-typedef struct _CMSG_KEY_AGREE_KEY_ENCRYPT_INFO {
-    DWORD                       cbSize;
-    CRYPT_DATA_BLOB             EncryptedKey;
-} CMSG_KEY_AGREE_KEY_ENCRYPT_INFO, *PCMSG_KEY_AGREE_KEY_ENCRYPT_INFO;
-
-
-
-
-
-
-
-typedef struct _CMSG_KEY_AGREE_ENCRYPT_INFO {
-    DWORD                       cbSize;
-    DWORD                       dwRecipientIndex;
-    CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
-    CRYPT_DATA_BLOB             UserKeyingMaterial;
-    DWORD                       dwOriginatorChoice;
-    union {
-        
-        CERT_ID                     OriginatorCertId;
-        
-        CERT_PUBLIC_KEY_INFO        OriginatorPublicKeyInfo;
-    };
-    DWORD                       cKeyAgreeKeyEncryptInfo;
-    PCMSG_KEY_AGREE_KEY_ENCRYPT_INFO *rgpKeyAgreeKeyEncryptInfo;
-    DWORD                       dwFlags;
-} CMSG_KEY_AGREE_ENCRYPT_INFO, *PCMSG_KEY_AGREE_ENCRYPT_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CMSG_EXPORT_KEY_AGREE) (
-     PCMSG_CONTENT_ENCRYPT_INFO pContentEncryptInfo,
-     PCMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO pKeyAgreeEncodeInfo,
-      PCMSG_KEY_AGREE_ENCRYPT_INFO pKeyAgreeEncryptInfo,
-     DWORD dwFlags,
-      void *pvReserved
-    );
-
-
-
-
-
-
-
-typedef struct _CMSG_MAIL_LIST_ENCRYPT_INFO {
-    DWORD                       cbSize;
-    DWORD                       dwRecipientIndex;
-    CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
-    CRYPT_DATA_BLOB             EncryptedKey;
-    DWORD                       dwFlags;
-} CMSG_MAIL_LIST_ENCRYPT_INFO, *PCMSG_MAIL_LIST_ENCRYPT_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CMSG_EXPORT_MAIL_LIST) (
-     PCMSG_CONTENT_ENCRYPT_INFO pContentEncryptInfo,
-     PCMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO pMailListEncodeInfo,
-      PCMSG_MAIL_LIST_ENCRYPT_INFO pMailListEncryptInfo,
-     DWORD dwFlags,
-      void *pvReserved
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CMSG_IMPORT_KEY_TRANS) (
-     PCRYPT_ALGORITHM_IDENTIFIER pContentEncryptionAlgorithm,
-     PCMSG_CTRL_KEY_TRANS_DECRYPT_PARA pKeyTransDecryptPara,
-     DWORD dwFlags,
-      void *pvReserved,
-     HCRYPTKEY *phContentEncryptKey
-    );
-
-
-typedef BOOL (__stdcall *PFN_CMSG_IMPORT_KEY_AGREE) (
-     PCRYPT_ALGORITHM_IDENTIFIER pContentEncryptionAlgorithm,
-     PCMSG_CTRL_KEY_AGREE_DECRYPT_PARA pKeyAgreeDecryptPara,
-     DWORD dwFlags,
-      void *pvReserved,
-     HCRYPTKEY *phContentEncryptKey
-    );
-
-
-typedef BOOL (__stdcall *PFN_CMSG_IMPORT_MAIL_LIST) (
-     PCRYPT_ALGORITHM_IDENTIFIER pContentEncryptionAlgorithm,
-     PCMSG_CTRL_MAIL_LIST_DECRYPT_PARA pMailListDecryptPara,
-     DWORD dwFlags,
-      void *pvReserved,
-     HCRYPTKEY *phContentEncryptKey
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef void *HCERTSTORE;
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_CONTEXT {
-    DWORD                   dwCertEncodingType;
-    BYTE                    *pbCertEncoded;
-    DWORD                   cbCertEncoded;
-    PCERT_INFO              pCertInfo;
-    HCERTSTORE              hCertStore;
-} CERT_CONTEXT, *PCERT_CONTEXT;
-typedef const CERT_CONTEXT *PCCERT_CONTEXT;
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRL_CONTEXT {
-    DWORD                   dwCertEncodingType;
-    BYTE                    *pbCrlEncoded;
-    DWORD                   cbCrlEncoded;
-    PCRL_INFO               pCrlInfo;
-    HCERTSTORE              hCertStore;
-} CRL_CONTEXT, *PCRL_CONTEXT;
-typedef const CRL_CONTEXT *PCCRL_CONTEXT;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CTL_CONTEXT {
-    DWORD                   dwMsgAndCertEncodingType;
-    BYTE                    *pbCtlEncoded;
-    DWORD                   cbCtlEncoded;
-    PCTL_INFO               pCtlInfo;
-    HCERTSTORE              hCertStore;
-    HCRYPTMSG               hCryptMsg;
-    BYTE                    *pbCtlContent;
-    DWORD                   cbCtlContent;
-} CTL_CONTEXT, *PCTL_CONTEXT;
-typedef const CTL_CONTEXT *PCCTL_CONTEXT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_KEY_PROV_PARAM {
-    DWORD           dwParam;
-    BYTE            *pbData;
-    DWORD           cbData;
-    DWORD           dwFlags;
-} CRYPT_KEY_PROV_PARAM, *PCRYPT_KEY_PROV_PARAM;
-
-typedef struct _CRYPT_KEY_PROV_INFO {
-    LPWSTR                  pwszContainerName;
-    LPWSTR                  pwszProvName;
-    DWORD                   dwProvType;
-    DWORD                   dwFlags;
-    DWORD                   cProvParam;
-    PCRYPT_KEY_PROV_PARAM   rgProvParam;
-    DWORD                   dwKeySpec;
-} CRYPT_KEY_PROV_INFO, *PCRYPT_KEY_PROV_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_KEY_CONTEXT {
-    DWORD           cbSize;           
-    HCRYPTPROV      hCryptProv;
-    DWORD           dwKeySpec;
-} CERT_KEY_CONTEXT, *PCERT_KEY_CONTEXT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_SYSTEM_STORE_RELOCATE_PARA {
-    union {
-        HKEY                hKeyBase;
-        void                *pvBase;
-    };
-    union {
-        void                *pvSystemStore;
-        LPCSTR              pszSystemStore;
-        LPCWSTR             pwszSystemStore;
-    };
-} CERT_SYSTEM_STORE_RELOCATE_PARA, *PCERT_SYSTEM_STORE_RELOCATE_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_REGISTRY_STORE_CLIENT_GPT_PARA {
-    HKEY                hKeyBase;
-    LPWSTR              pwszRegPath;
-} CERT_REGISTRY_STORE_CLIENT_GPT_PARA, *PCERT_REGISTRY_STORE_CLIENT_GPT_PARA;
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_REGISTRY_STORE_ROAMING_PARA {
-    HKEY                hKey;
-    LPWSTR              pwszStoreDirectory;
-} CERT_REGISTRY_STORE_ROAMING_PARA, *PCERT_REGISTRY_STORE_ROAMING_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_LDAP_STORE_OPENED_PARA {
-    void        *pvLdapSessionHandle;   
-                                        
-    LPCWSTR     pwszLdapUrl;
-} CERT_LDAP_STORE_OPENED_PARA, *PCERT_LDAP_STORE_OPENED_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HCERTSTORE
-__stdcall
-CertOpenStore(
-     LPCSTR lpszStoreProvider,
-     DWORD dwEncodingType,
-     HCRYPTPROV hCryptProv,
-     DWORD dwFlags,
-     const void *pvPara
-    );
-
-
-
-
-
-
-
-typedef void *HCERTSTOREPROV;
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_STORE_PROV_INFO {
-    DWORD               cbSize;
-    DWORD               cStoreProvFunc;
-    void                **rgpvStoreProvFunc;
-    HCERTSTOREPROV      hStoreProv;
-    DWORD               dwStoreProvFlags;
-    HCRYPTOIDFUNCADDR   hStoreProvFuncAddr2;
-} CERT_STORE_PROV_INFO, *PCERT_STORE_PROV_INFO;
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CERT_DLL_OPEN_STORE_PROV_FUNC)(
-     LPCSTR lpszStoreProvider,
-     DWORD dwEncodingType,
-     HCRYPTPROV hCryptProv,
-     DWORD dwFlags,
-     const void *pvPara,
-     HCERTSTORE hCertStore,
-      PCERT_STORE_PROV_INFO pStoreProvInfo
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef void (__stdcall *PFN_CERT_STORE_PROV_CLOSE)(
-     HCERTSTOREPROV hStoreProv,
-     DWORD dwFlags
-    );
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_READ_CERT)(
-     HCERTSTOREPROV hStoreProv,
-     PCCERT_CONTEXT pStoreCertContext,
-     DWORD dwFlags,
-     PCCERT_CONTEXT *ppProvCertContext
-    );
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_WRITE_CERT)(
-     HCERTSTOREPROV hStoreProv,
-     PCCERT_CONTEXT pCertContext,
-     DWORD dwFlags
-    );
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_DELETE_CERT)(
-     HCERTSTOREPROV hStoreProv,
-     PCCERT_CONTEXT pCertContext,
-     DWORD dwFlags
-    );
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_SET_CERT_PROPERTY)(
-     HCERTSTOREPROV hStoreProv,
-     PCCERT_CONTEXT pCertContext,
-     DWORD dwPropId,
-     DWORD dwFlags,
-     const void *pvData
-    );
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_READ_CRL)(
-     HCERTSTOREPROV hStoreProv,
-     PCCRL_CONTEXT pStoreCrlContext,
-     DWORD dwFlags,
-     PCCRL_CONTEXT *ppProvCrlContext
-    );
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_WRITE_CRL)(
-     HCERTSTOREPROV hStoreProv,
-     PCCRL_CONTEXT pCrlContext,
-     DWORD dwFlags
-    );
-
-
-
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_DELETE_CRL)(
-     HCERTSTOREPROV hStoreProv,
-     PCCRL_CONTEXT pCrlContext,
-     DWORD dwFlags
-    );
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_SET_CRL_PROPERTY)(
-     HCERTSTOREPROV hStoreProv,
-     PCCRL_CONTEXT pCrlContext,
-     DWORD dwPropId,
-     DWORD dwFlags,
-     const void *pvData
-    );
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_READ_CTL)(
-     HCERTSTOREPROV hStoreProv,
-     PCCTL_CONTEXT pStoreCtlContext,
-     DWORD dwFlags,
-     PCCTL_CONTEXT *ppProvCtlContext
-    );
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_WRITE_CTL)(
-     HCERTSTOREPROV hStoreProv,
-     PCCTL_CONTEXT pCtlContext,
-     DWORD dwFlags
-    );
-
-
-
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_DELETE_CTL)(
-     HCERTSTOREPROV hStoreProv,
-     PCCTL_CONTEXT pCtlContext,
-     DWORD dwFlags
-                                                     );
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_SET_CTL_PROPERTY)(
-     HCERTSTOREPROV hStoreProv,
-     PCCTL_CONTEXT pCtlContext,
-     DWORD dwPropId,
-     DWORD dwFlags,
-     const void *pvData
-    );
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_CONTROL)(
-     HCERTSTOREPROV hStoreProv,
-     DWORD dwFlags,
-     DWORD dwCtrlType,
-     void const *pvCtrlPara
-    );
-
-typedef struct _CERT_STORE_PROV_FIND_INFO {
-    DWORD               cbSize;
-    DWORD               dwMsgAndCertEncodingType;
-    DWORD               dwFindFlags;
-    DWORD               dwFindType;
-    const void          *pvFindPara;
-} CERT_STORE_PROV_FIND_INFO, *PCERT_STORE_PROV_FIND_INFO;
-typedef const CERT_STORE_PROV_FIND_INFO CCERT_STORE_PROV_FIND_INFO,
-*PCCERT_STORE_PROV_FIND_INFO;
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_FIND_CERT)(
-     HCERTSTOREPROV hStoreProv,
-     PCCERT_STORE_PROV_FIND_INFO pFindInfo,
-     PCCERT_CONTEXT pPrevCertContext,
-     DWORD dwFlags,
-      void **ppvStoreProvFindInfo,
-     PCCERT_CONTEXT *ppProvCertContext
-    );
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_FREE_FIND_CERT)(
-     HCERTSTOREPROV hStoreProv,
-     PCCERT_CONTEXT pCertContext,
-     void *pvStoreProvFindInfo,
-     DWORD dwFlags
-    );
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_GET_CERT_PROPERTY)(
-     HCERTSTOREPROV hStoreProv,
-     PCCERT_CONTEXT pCertContext,
-     DWORD dwPropId,
-     DWORD dwFlags,
-     void *pvData,
-      DWORD *pcbData
-    );
-
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_FIND_CRL)(
-     HCERTSTOREPROV hStoreProv,
-     PCCERT_STORE_PROV_FIND_INFO pFindInfo,
-     PCCRL_CONTEXT pPrevCrlContext,
-     DWORD dwFlags,
-      void **ppvStoreProvFindInfo,
-     PCCRL_CONTEXT *ppProvCrlContext
-    );
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_FREE_FIND_CRL)(
-     HCERTSTOREPROV hStoreProv,
-     PCCRL_CONTEXT pCrlContext,
-     void *pvStoreProvFindInfo,
-     DWORD dwFlags
-    );
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_GET_CRL_PROPERTY)(
-     HCERTSTOREPROV hStoreProv,
-     PCCRL_CONTEXT pCrlContext,
-     DWORD dwPropId,
-     DWORD dwFlags,
-     void *pvData,
-      DWORD *pcbData
-    );
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_FIND_CTL)(
-     HCERTSTOREPROV hStoreProv,
-     PCCERT_STORE_PROV_FIND_INFO pFindInfo,
-     PCCTL_CONTEXT pPrevCtlContext,
-     DWORD dwFlags,
-      void **ppvStoreProvFindInfo,
-     PCCTL_CONTEXT *ppProvCtlContext
-    );
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_FREE_FIND_CTL)(
-     HCERTSTOREPROV hStoreProv,
-     PCCTL_CONTEXT pCtlContext,
-     void *pvStoreProvFindInfo,
-     DWORD dwFlags
-    );
-
-typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_GET_CTL_PROPERTY)(
-     HCERTSTOREPROV hStoreProv,
-     PCCTL_CONTEXT pCtlContext,
-     DWORD dwPropId,
-     DWORD dwFlags,
-     void *pvData,
-      DWORD *pcbData
-    );
-
-
-
-
-
-__declspec(dllimport)
-HCERTSTORE
-__stdcall
-CertDuplicateStore(
-     HCERTSTORE hCertStore
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertSaveStore(
-     HCERTSTORE hCertStore,
-     DWORD dwEncodingType,
-     DWORD dwSaveAs,
-     DWORD dwSaveTo,
-      void *pvSaveToPara,
-     DWORD dwFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertCloseStore(
-     HCERTSTORE hCertStore,
-    DWORD dwFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCCERT_CONTEXT
-__stdcall
-CertGetSubjectCertificateFromStore(
-     HCERTSTORE hCertStore,
-     DWORD dwCertEncodingType,
-     PCERT_INFO pCertId           
-    
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCCERT_CONTEXT
-__stdcall
-CertEnumCertificatesInStore(
-     HCERTSTORE hCertStore,
-     PCCERT_CONTEXT pPrevCertContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCCERT_CONTEXT
-__stdcall
-CertFindCertificateInStore(
-     HCERTSTORE hCertStore,
-     DWORD dwCertEncodingType,
-     DWORD dwFindFlags,
-     DWORD dwFindType,
-     const void *pvFindPara,
-     PCCERT_CONTEXT pPrevCertContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCCERT_CONTEXT
-__stdcall
-CertGetIssuerCertificateFromStore(
-     HCERTSTORE hCertStore,
-     PCCERT_CONTEXT pSubjectContext,
-      PCCERT_CONTEXT pPrevIssuerContext,
-      DWORD *pdwFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertVerifySubjectCertificateContext(
-     PCCERT_CONTEXT pSubject,
-      PCCERT_CONTEXT pIssuer,
-      DWORD *pdwFlags
-    );
-
-
-
-
-__declspec(dllimport)
-PCCERT_CONTEXT
-__stdcall
-CertDuplicateCertificateContext(
-     PCCERT_CONTEXT pCertContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCCERT_CONTEXT
-__stdcall
-CertCreateCertificateContext(
-     DWORD dwCertEncodingType,
-     const BYTE *pbCertEncoded,
-     DWORD cbCertEncoded
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertFreeCertificateContext(
-     PCCERT_CONTEXT pCertContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertSetCertificateContextProperty(
-     PCCERT_CONTEXT pCertContext,
-     DWORD dwPropId,
-     DWORD dwFlags,
-     const void *pvData
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertGetCertificateContextProperty(
-     PCCERT_CONTEXT pCertContext,
-     DWORD dwPropId,
-     void *pvData,
-      DWORD *pcbData
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-CertEnumCertificateContextProperties(
-     PCCERT_CONTEXT pCertContext,
-     DWORD dwPropId
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertCreateCTLEntryFromCertificateContextProperties(
-     PCCERT_CONTEXT pCertContext,
-     DWORD cOptAttr,
-      PCRYPT_ATTRIBUTE rgOptAttr,
-     DWORD dwFlags,
-      void *pvReserved,
-      PCTL_ENTRY pCtlEntry,
-      DWORD *pcbCtlEntry
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertSetCertificateContextPropertiesFromCTLEntry(
-     PCCERT_CONTEXT pCertContext,
-     PCTL_ENTRY pCtlEntry,
-     DWORD dwFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCCRL_CONTEXT
-__stdcall
-CertGetCRLFromStore(
-     HCERTSTORE hCertStore,
-      PCCERT_CONTEXT pIssuerContext,
-     PCCRL_CONTEXT pPrevCrlContext,
-      DWORD *pdwFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCCRL_CONTEXT
-__stdcall
-CertEnumCRLsInStore(
-     HCERTSTORE hCertStore,
-     PCCRL_CONTEXT pPrevCrlContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCCRL_CONTEXT
-__stdcall
-CertFindCRLInStore(
-     HCERTSTORE hCertStore,
-     DWORD dwCertEncodingType,
-     DWORD dwFindFlags,
-     DWORD dwFindType,
-     const void *pvFindPara,
-     PCCRL_CONTEXT pPrevCrlContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRL_FIND_ISSUED_FOR_PARA {
-    PCCERT_CONTEXT              pSubjectCert;
-    PCCERT_CONTEXT              pIssuerCert;
-} CRL_FIND_ISSUED_FOR_PARA, *PCRL_FIND_ISSUED_FOR_PARA;
-
-
-
-
-
-__declspec(dllimport)
-PCCRL_CONTEXT
-__stdcall
-CertDuplicateCRLContext(
-     PCCRL_CONTEXT pCrlContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCCRL_CONTEXT
-__stdcall
-CertCreateCRLContext(
-     DWORD dwCertEncodingType,
-     const BYTE *pbCrlEncoded,
-     DWORD cbCrlEncoded
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertFreeCRLContext(
-     PCCRL_CONTEXT pCrlContext
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertSetCRLContextProperty(
-     PCCRL_CONTEXT pCrlContext,
-     DWORD dwPropId,
-     DWORD dwFlags,
-     const void *pvData
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertGetCRLContextProperty(
-     PCCRL_CONTEXT pCrlContext,
-     DWORD dwPropId,
-     void *pvData,
-      DWORD *pcbData
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-CertEnumCRLContextProperties(
-     PCCRL_CONTEXT pCrlContext,
-     DWORD dwPropId
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertFindCertificateInCRL(
-     PCCERT_CONTEXT pCert,
-     PCCRL_CONTEXT pCrlContext,
-     DWORD dwFlags,
-      void *pvReserved,
-     PCRL_ENTRY *ppCrlEntry
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertIsValidCRLForCertificate(
-     PCCERT_CONTEXT pCert,
-     PCCRL_CONTEXT pCrl,
-     DWORD dwFlags,
-     void *pvReserved
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertAddEncodedCertificateToStore(
-     HCERTSTORE hCertStore,
-     DWORD dwCertEncodingType,
-     const BYTE *pbCertEncoded,
-     DWORD cbCertEncoded,
-     DWORD dwAddDisposition,
-      PCCERT_CONTEXT *ppCertContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertAddCertificateContextToStore(
-     HCERTSTORE hCertStore,
-     PCCERT_CONTEXT pCertContext,
-     DWORD dwAddDisposition,
-      PCCERT_CONTEXT *ppStoreContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertAddSerializedElementToStore(
-     HCERTSTORE hCertStore,
-     const BYTE *pbElement,
-     DWORD cbElement,
-     DWORD dwAddDisposition,
-     DWORD dwFlags,
-     DWORD dwContextTypeFlags,
-      DWORD *pdwContextType,
-      const void **ppvContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertDeleteCertificateFromStore(
-     PCCERT_CONTEXT pCertContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertAddEncodedCRLToStore(
-     HCERTSTORE hCertStore,
-     DWORD dwCertEncodingType,
-     const BYTE *pbCrlEncoded,
-     DWORD cbCrlEncoded,
-     DWORD dwAddDisposition,
-      PCCRL_CONTEXT *ppCrlContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertAddCRLContextToStore(
-     HCERTSTORE hCertStore,
-     PCCRL_CONTEXT pCrlContext,
-     DWORD dwAddDisposition,
-      PCCRL_CONTEXT *ppStoreContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertDeleteCRLFromStore(
-     PCCRL_CONTEXT pCrlContext
-    );
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertSerializeCertificateStoreElement(
-     PCCERT_CONTEXT pCertContext,
-     DWORD dwFlags,
-     BYTE *pbElement,
-      DWORD *pcbElement
-    );
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertSerializeCRLStoreElement(
-     PCCRL_CONTEXT pCrlContext,
-     DWORD dwFlags,
-     BYTE *pbElement,
-      DWORD *pcbElement
-    );
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCCTL_CONTEXT
-__stdcall
-CertDuplicateCTLContext(
-     PCCTL_CONTEXT pCtlContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCCTL_CONTEXT
-__stdcall
-CertCreateCTLContext(
-     DWORD dwMsgAndCertEncodingType,
-     const BYTE *pbCtlEncoded,
-     DWORD cbCtlEncoded
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertFreeCTLContext(
-     PCCTL_CONTEXT pCtlContext
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertSetCTLContextProperty(
-     PCCTL_CONTEXT pCtlContext,
-     DWORD dwPropId,
-     DWORD dwFlags,
-     const void *pvData
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertGetCTLContextProperty(
-     PCCTL_CONTEXT pCtlContext,
-     DWORD dwPropId,
-     void *pvData,
-      DWORD *pcbData
-    );
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-CertEnumCTLContextProperties(
-     PCCTL_CONTEXT pCtlContext,
-     DWORD dwPropId
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCCTL_CONTEXT
-__stdcall
-CertEnumCTLsInStore(
-     HCERTSTORE hCertStore,
-     PCCTL_CONTEXT pPrevCtlContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCTL_ENTRY
-__stdcall
-CertFindSubjectInCTL(
-     DWORD dwEncodingType,
-     DWORD dwSubjectType,
-     void *pvSubject,
-     PCCTL_CONTEXT pCtlContext,
-     DWORD dwFlags
-    );
-
-
-
-
-
-
-
-typedef struct _CTL_ANY_SUBJECT_INFO {
-    CRYPT_ALGORITHM_IDENTIFIER  SubjectAlgorithm;
-    CRYPT_DATA_BLOB             SubjectIdentifier;
-} CTL_ANY_SUBJECT_INFO, *PCTL_ANY_SUBJECT_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCCTL_CONTEXT
-__stdcall
-CertFindCTLInStore(
-     HCERTSTORE hCertStore,
-     DWORD dwMsgAndCertEncodingType,
-     DWORD dwFindFlags,
-     DWORD dwFindType,
-     const void *pvFindPara,
-     PCCTL_CONTEXT pPrevCtlContext
-    );
-
-
-
-
-
-
-
-
-typedef struct _CTL_FIND_USAGE_PARA {
-    DWORD               cbSize;
-    CTL_USAGE           SubjectUsage;   
-    CRYPT_DATA_BLOB     ListIdentifier; 
-    PCERT_INFO          pSigner;        
-} CTL_FIND_USAGE_PARA, *PCTL_FIND_USAGE_PARA;
-
-
-
-
-
-
-
-typedef struct _CTL_FIND_SUBJECT_PARA {
-    DWORD                   cbSize;
-    PCTL_FIND_USAGE_PARA    pUsagePara; 
-    DWORD                   dwSubjectType;
-    void                    *pvSubject;
-} CTL_FIND_SUBJECT_PARA, *PCTL_FIND_SUBJECT_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertAddEncodedCTLToStore(
-     HCERTSTORE hCertStore,
-     DWORD dwMsgAndCertEncodingType,
-     const BYTE *pbCtlEncoded,
-     DWORD cbCtlEncoded,
-     DWORD dwAddDisposition,
-      PCCTL_CONTEXT *ppCtlContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertAddCTLContextToStore(
-     HCERTSTORE hCertStore,
-     PCCTL_CONTEXT pCtlContext,
-     DWORD dwAddDisposition,
-      PCCTL_CONTEXT *ppStoreContext
-    );
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertSerializeCTLStoreElement(
-     PCCTL_CONTEXT pCtlContext,
-     DWORD dwFlags,
-     BYTE *pbElement,
-      DWORD *pcbElement
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertDeleteCTLFromStore(
-     PCCTL_CONTEXT pCtlContext
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertAddCertificateLinkToStore(
-     HCERTSTORE hCertStore,
-     PCCERT_CONTEXT pCertContext,
-     DWORD dwAddDisposition,
-      PCCERT_CONTEXT *ppStoreContext
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertAddCRLLinkToStore(
-     HCERTSTORE hCertStore,
-     PCCRL_CONTEXT pCrlContext,
-     DWORD dwAddDisposition,
-      PCCRL_CONTEXT *ppStoreContext
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertAddCTLLinkToStore(
-     HCERTSTORE hCertStore,
-     PCCTL_CONTEXT pCtlContext,
-     DWORD dwAddDisposition,
-      PCCTL_CONTEXT *ppStoreContext
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertAddStoreToCollection(
-     HCERTSTORE hCollectionStore,
-      HCERTSTORE hSiblingStore,
-     DWORD dwUpdateFlags,
-     DWORD dwPriority
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-CertRemoveStoreFromCollection(
-     HCERTSTORE hCollectionStore,
-     HCERTSTORE hSiblingStore
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertControlStore(
-     HCERTSTORE hCertStore,
-     DWORD dwFlags,
-     DWORD dwCtrlType,
-     void const *pvCtrlPara
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertSetStoreProperty(
-     HCERTSTORE hCertStore,
-     DWORD dwPropId,
-     DWORD dwFlags,
-     const void *pvData
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertGetStoreProperty(
-     HCERTSTORE hCertStore,
-     DWORD dwPropId,
-     void *pvData,
-      DWORD *pcbData
-    );
-
-
-typedef struct _CERT_CREATE_CONTEXT_PARA {
-    DWORD                   cbSize;
-    PFN_CRYPT_FREE          pfnFree;            
-    void                    *pvFree;            
-} CERT_CREATE_CONTEXT_PARA, *PCERT_CREATE_CONTEXT_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-const void *
-__stdcall
-CertCreateContext(
-     DWORD dwContextType,
-     DWORD dwEncodingType,
-     const BYTE *pbEncoded,
-     DWORD cbEncoded,
-     DWORD dwFlags,
-      PCERT_CREATE_CONTEXT_PARA pCreatePara
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_SYSTEM_STORE_INFO {
-    DWORD   cbSize;
-} CERT_SYSTEM_STORE_INFO, *PCERT_SYSTEM_STORE_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_PHYSICAL_STORE_INFO {
-    DWORD               cbSize;
-    LPSTR               pszOpenStoreProvider;   
-    DWORD               dwOpenEncodingType;     
-    DWORD               dwOpenFlags;            
-    CRYPT_DATA_BLOB     OpenParameters;         
-    DWORD               dwFlags;                
-    DWORD               dwPriority;             
-} CERT_PHYSICAL_STORE_INFO, *PCERT_PHYSICAL_STORE_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertRegisterSystemStore(
-     const void *pvSystemStore,
-     DWORD dwFlags,
-     PCERT_SYSTEM_STORE_INFO pStoreInfo,
-      void *pvReserved
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertRegisterPhysicalStore(
-     const void *pvSystemStore,
-     DWORD dwFlags,
-     LPCWSTR pwszStoreName,
-     PCERT_PHYSICAL_STORE_INFO pStoreInfo,
-      void *pvReserved
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertUnregisterSystemStore(
-     const void *pvSystemStore,
-     DWORD dwFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertUnregisterPhysicalStore(
-     const void *pvSystemStore,
-     DWORD dwFlags,
-     LPCWSTR pwszStoreName
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CERT_ENUM_SYSTEM_STORE_LOCATION)(
-     LPCWSTR pwszStoreLocation,
-     DWORD dwFlags,
-      void *pvReserved,
-      void *pvArg
-    );
-
-typedef BOOL (__stdcall *PFN_CERT_ENUM_SYSTEM_STORE)(
-     const void *pvSystemStore,
-     DWORD dwFlags,
-     PCERT_SYSTEM_STORE_INFO pStoreInfo,
-      void *pvReserved,
-      void *pvArg
-    );
-
-typedef BOOL (__stdcall *PFN_CERT_ENUM_PHYSICAL_STORE)(
-     const void *pvSystemStore,
-     DWORD dwFlags,
-     LPCWSTR pwszStoreName,
-     PCERT_PHYSICAL_STORE_INFO pStoreInfo,
-      void *pvReserved,
-      void *pvArg
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertEnumSystemStoreLocation(
-     DWORD dwFlags,
-     void *pvArg,
-     PFN_CERT_ENUM_SYSTEM_STORE_LOCATION pfnEnum
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertEnumSystemStore(
-     DWORD dwFlags,
-      void *pvSystemStoreLocationPara,
-     void *pvArg,
-     PFN_CERT_ENUM_SYSTEM_STORE pfnEnum
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertEnumPhysicalStore(
-     const void *pvSystemStore,
-     DWORD dwFlags,
-     void *pvArg,
-     PFN_CERT_ENUM_PHYSICAL_STORE pfnEnum
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertGetEnhancedKeyUsage(
-     PCCERT_CONTEXT pCertContext,
-     DWORD dwFlags,
-     PCERT_ENHKEY_USAGE pUsage,
-      DWORD *pcbUsage
-    );
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertSetEnhancedKeyUsage(
-     PCCERT_CONTEXT pCertContext,
-     PCERT_ENHKEY_USAGE pUsage
-    );
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertAddEnhancedKeyUsageIdentifier(
-     PCCERT_CONTEXT pCertContext,
-     LPCSTR pszUsageIdentifier
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertRemoveEnhancedKeyUsageIdentifier(
-     PCCERT_CONTEXT pCertContext,
-     LPCSTR pszUsageIdentifier
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertGetValidUsages(
-          DWORD           cCerts,
-          PCCERT_CONTEXT  *rghCerts,
-         int             *cNumOIDs,
-         LPSTR           *rghOIDs,
-       DWORD           *pcbOIDs);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptMsgGetAndVerifySigner(
-     HCRYPTMSG hCryptMsg,
-     DWORD cSignerStore,
-      HCERTSTORE *rghSignerStore,
-     DWORD dwFlags,
-      PCCERT_CONTEXT *ppSigner,
-       DWORD *pdwSignerIndex
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptMsgSignCTL(
-     DWORD dwMsgEncodingType,
-     BYTE *pbCtlContent,
-     DWORD cbCtlContent,
-     PCMSG_SIGNED_ENCODE_INFO pSignInfo,
-     DWORD dwFlags,
-     BYTE *pbEncoded,
-      DWORD *pcbEncoded
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptMsgEncodeAndSignCTL(
-     DWORD dwMsgEncodingType,
-     PCTL_INFO pCtlInfo,
-     PCMSG_SIGNED_ENCODE_INFO pSignInfo,
-     DWORD dwFlags,
-     BYTE *pbEncoded,
-      DWORD *pcbEncoded
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertFindSubjectInSortedCTL(
-     PCRYPT_DATA_BLOB pSubjectIdentifier,
-     PCCTL_CONTEXT pCtlContext,
-     DWORD dwFlags,
-     void *pvReserved,
-      PCRYPT_DER_BLOB pEncodedAttributes
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertEnumSubjectInSortedCTL(
-     PCCTL_CONTEXT pCtlContext,
-      void **ppvNextSubject,
-      PCRYPT_DER_BLOB pSubjectIdentifier,
-      PCRYPT_DER_BLOB pEncodedAttributes
-    );
-
-
-
-
-
-
-typedef struct _CTL_VERIFY_USAGE_PARA {
-    DWORD                   cbSize;
-    CRYPT_DATA_BLOB         ListIdentifier;     
-    DWORD                   cCtlStore;
-    HCERTSTORE              *rghCtlStore;       
-    DWORD                   cSignerStore;
-    HCERTSTORE              *rghSignerStore;    
-} CTL_VERIFY_USAGE_PARA, *PCTL_VERIFY_USAGE_PARA;
-
-typedef struct _CTL_VERIFY_USAGE_STATUS {
-    DWORD                   cbSize;
-    DWORD                   dwError;
-    DWORD                   dwFlags;
-    PCCTL_CONTEXT           *ppCtl;             
-    DWORD                   dwCtlEntryIndex;
-    PCCERT_CONTEXT          *ppSigner;          
-    DWORD                   dwSignerIndex;
-} CTL_VERIFY_USAGE_STATUS, *PCTL_VERIFY_USAGE_STATUS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertVerifyCTLUsage(
-     DWORD dwEncodingType,
-     DWORD dwSubjectType,
-     void *pvSubject,
-     PCTL_USAGE pSubjectUsage,
-     DWORD dwFlags,
-      PCTL_VERIFY_USAGE_PARA pVerifyUsagePara,
-      PCTL_VERIFY_USAGE_STATUS pVerifyUsageStatus
-    );
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_REVOCATION_CRL_INFO {
-    DWORD                   cbSize;
-    PCCRL_CONTEXT           pBaseCrlContext;
-    PCCRL_CONTEXT           pDeltaCrlContext;
-
-    
-    
-    PCRL_ENTRY              pCrlEntry;
-    BOOL                    fDeltaCrlEntry; 
-} CERT_REVOCATION_CRL_INFO, *PCERT_REVOCATION_CRL_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_REVOCATION_PARA {
-    DWORD                       cbSize;
-    PCCERT_CONTEXT              pIssuerCert;
-    DWORD                       cCertStore;
-    HCERTSTORE                  *rgCertStore;
-    HCERTSTORE                  hCrlStore;
-    LPFILETIME                  pftTimeToUse;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-} CERT_REVOCATION_PARA, *PCERT_REVOCATION_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_REVOCATION_STATUS {
-    DWORD                   cbSize;
-    DWORD                   dwIndex;
-    DWORD                   dwError;
-    DWORD                   dwReason;
-
-    
-
-    
-    
-    
-    
-    
-    
-    BOOL                    fHasFreshnessTime;
-    DWORD                   dwFreshnessTime;    
-} CERT_REVOCATION_STATUS, *PCERT_REVOCATION_STATUS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertVerifyRevocation(
-     DWORD dwEncodingType,
-     DWORD dwRevType,
-     DWORD cContext,
-     PVOID rgpvContext[],
-     DWORD dwFlags,
-      PCERT_REVOCATION_PARA pRevPara,
-      PCERT_REVOCATION_STATUS pRevStatus
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-BOOL
-__stdcall
-CertCompareIntegerBlob(
-     PCRYPT_INTEGER_BLOB pInt1,
-     PCRYPT_INTEGER_BLOB pInt2
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertCompareCertificate(
-     DWORD dwCertEncodingType,
-     PCERT_INFO pCertId1,
-     PCERT_INFO pCertId2
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertCompareCertificateName(
-     DWORD dwCertEncodingType,
-     PCERT_NAME_BLOB pCertName1,
-     PCERT_NAME_BLOB pCertName2
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertIsRDNAttrsInCertificateName(
-     DWORD dwCertEncodingType,
-     DWORD dwFlags,
-     PCERT_NAME_BLOB pCertName,
-     PCERT_RDN pRDN
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertComparePublicKeyInfo(
-     DWORD dwCertEncodingType,
-     PCERT_PUBLIC_KEY_INFO pPublicKey1,
-     PCERT_PUBLIC_KEY_INFO pPublicKey2
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-CertGetPublicKeyLength(
-     DWORD dwCertEncodingType,
-     PCERT_PUBLIC_KEY_INFO pPublicKey
-    );
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptVerifyCertificateSignature(
-     HCRYPTPROV               hCryptProv,
-     DWORD                    dwCertEncodingType,
-     const BYTE *             pbEncoded,
-     DWORD                    cbEncoded,
-     PCERT_PUBLIC_KEY_INFO    pPublicKey
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptVerifyCertificateSignatureEx(
-      HCRYPTPROV hCryptProv,
-     DWORD dwCertEncodingType,
-     DWORD dwSubjectType,
-     void *pvSubject,
-     DWORD dwIssuerType,
-     void *pvIssuer,
-     DWORD dwFlags,
-      void *pvReserved
-    );
-
-
-
-
-    
-
-    
-
-    
-
-
-
-    
-
-    
-
-    
-
-    
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptHashToBeSigned(
-     HCRYPTPROV hCryptProv,
-     DWORD dwCertEncodingType,
-     const BYTE *pbEncoded,
-     DWORD cbEncoded,
-     BYTE *pbComputedHash,
-      DWORD *pcbComputedHash
-    );
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptHashCertificate(
-     HCRYPTPROV hCryptProv,
-     ALG_ID Algid,
-     DWORD dwFlags,
-     const BYTE *pbEncoded,
-     DWORD cbEncoded,
-     BYTE *pbComputedHash,
-      DWORD *pcbComputedHash
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSignCertificate(
-     HCRYPTPROV hCryptProv,
-     DWORD dwKeySpec,
-     DWORD dwCertEncodingType,
-     const BYTE *pbEncodedToBeSigned,
-     DWORD cbEncodedToBeSigned,
-     PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm,
-      const void *pvHashAuxInfo,
-     BYTE *pbSignature,
-      DWORD *pcbSignature
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSignAndEncodeCertificate(
-     HCRYPTPROV hCryptProv,
-     DWORD dwKeySpec,
-     DWORD dwCertEncodingType,
-     LPCSTR lpszStructType,       
-     const void *pvStructInfo,
-     PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm,
-      const void *pvHashAuxInfo,
-     PBYTE pbEncoded,
-      DWORD *pcbEncoded
-    );
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-CertVerifyTimeValidity(
-     LPFILETIME pTimeToVerify,
-     PCERT_INFO pCertInfo
-    );
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-CertVerifyCRLTimeValidity(
-     LPFILETIME pTimeToVerify,
-     PCRL_INFO pCrlInfo
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertVerifyValidityNesting(
-     PCERT_INFO pSubjectInfo,
-     PCERT_INFO pIssuerInfo
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertVerifyCRLRevocation(
-     DWORD dwCertEncodingType,
-     PCERT_INFO pCertId,          
-    
-     DWORD cCrlInfo,
-     PCRL_INFO rgpCrlInfo[]
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-LPCSTR
-__stdcall
-CertAlgIdToOID(
-     DWORD dwAlgId
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-CertOIDToAlgId(
-     LPCSTR pszObjId
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-PCERT_EXTENSION
-__stdcall
-CertFindExtension(
-     LPCSTR pszObjId,
-     DWORD cExtensions,
-     CERT_EXTENSION rgExtensions[]
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-PCRYPT_ATTRIBUTE
-__stdcall
-CertFindAttribute(
-     LPCSTR pszObjId,
-     DWORD cAttr,
-     CRYPT_ATTRIBUTE rgAttr[]
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCERT_RDN_ATTR
-__stdcall
-CertFindRDNAttr(
-     LPCSTR pszObjId,
-     PCERT_NAME_INFO pName
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertGetIntendedKeyUsage(
-     DWORD dwCertEncodingType,
-     PCERT_INFO pCertInfo,
-     BYTE *pbKeyUsage,
-     DWORD cbKeyUsage
-    );
-
-typedef void *HCRYPTDEFAULTCONTEXT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptInstallDefaultContext(
-     HCRYPTPROV hCryptProv,
-     DWORD dwDefaultType,
-     const void *pvDefaultPara,
-     DWORD dwFlags,
-     void *pvReserved,
-     HCRYPTDEFAULTCONTEXT *phDefaultContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_DEFAULT_CONTEXT_MULTI_OID_PARA {
-    DWORD               cOID;
-    LPSTR               *rgpszOID;
-} CRYPT_DEFAULT_CONTEXT_MULTI_OID_PARA, *PCRYPT_DEFAULT_CONTEXT_MULTI_OID_PARA;
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptUninstallDefaultContext(
-    HCRYPTDEFAULTCONTEXT hDefaultContext,
-     DWORD dwFlags,
-     void *pvReserved
-    );
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptExportPublicKeyInfo(
-     HCRYPTPROV hCryptProv,
-     DWORD dwKeySpec,
-     DWORD dwCertEncodingType,
-     PCERT_PUBLIC_KEY_INFO pInfo,
-      DWORD *pcbInfo
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptExportPublicKeyInfoEx(
-     HCRYPTPROV hCryptProv,
-     DWORD dwKeySpec,
-     DWORD dwCertEncodingType,
-     LPSTR pszPublicKeyObjId,
-     DWORD dwFlags,
-      void *pvAuxInfo,
-     PCERT_PUBLIC_KEY_INFO pInfo,
-      DWORD *pcbInfo
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptImportPublicKeyInfo(
-     HCRYPTPROV hCryptProv,
-     DWORD dwCertEncodingType,
-     PCERT_PUBLIC_KEY_INFO pInfo,
-     HCRYPTKEY *phKey
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptImportPublicKeyInfoEx(
-     HCRYPTPROV hCryptProv,
-     DWORD dwCertEncodingType,
-     PCERT_PUBLIC_KEY_INFO pInfo,
-     ALG_ID aiKeyAlg,
-     DWORD dwFlags,
-      void *pvAuxInfo,
-     HCRYPTKEY *phKey
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptAcquireCertificatePrivateKey(
-     PCCERT_CONTEXT pCert,
-     DWORD dwFlags,
-     void *pvReserved,
-     HCRYPTPROV *phCryptProv,
-      DWORD *pdwKeySpec,
-      BOOL *pfCallerFreeProv
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptFindCertificateKeyProvInfo(
-     PCCERT_CONTEXT pCert,
-     DWORD dwFlags,
-     void *pvReserved
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_IMPORT_PRIV_KEY_FUNC) (
-    HCRYPTPROV              hCryptProv,         
-    CRYPT_PRIVATE_KEY_INFO  *pPrivateKeyInfo,   
-    DWORD                   dwFlags,            
-    void                    *pvAuxInfo          
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptImportPKCS8(
-    CRYPT_PKCS8_IMPORT_PARAMS           sImportParams,          
-    DWORD                               dwFlags,                
-    HCRYPTPROV                          *phCryptProv,           
-    void                                *pvAuxInfo              
-    );
-
-
-
-
-typedef BOOL (__stdcall *PFN_EXPORT_PRIV_KEY_FUNC) (
-    HCRYPTPROV              hCryptProv,         
-    DWORD                   dwKeySpec,          
-    LPSTR                   pszPrivateKeyObjId, 
-    DWORD                   dwFlags,            
-    void                    *pvAuxInfo,         
-    CRYPT_PRIVATE_KEY_INFO  *pPrivateKeyInfo,   
-    DWORD                   *pcbPrivateKeyBlob  
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptExportPKCS8(
-    HCRYPTPROV  hCryptProv,         
-    DWORD       dwKeySpec,          
-    LPSTR       pszPrivateKeyObjId, 
-    DWORD       dwFlags,            
-    void        *pvAuxInfo,         
-    BYTE        *pbPrivateKeyBlob,  
-    DWORD       *pcbPrivateKeyBlob  
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptExportPKCS8Ex(
-    CRYPT_PKCS8_EXPORT_PARAMS* psExportParams, 
-    DWORD       dwFlags,            
-    void        *pvAuxInfo,         
-    BYTE        *pbPrivateKeyBlob,  
-    DWORD       *pcbPrivateKeyBlob  
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptHashPublicKeyInfo(
-     HCRYPTPROV hCryptProv,
-     ALG_ID Algid,
-     DWORD dwFlags,
-     DWORD dwCertEncodingType,
-     PCERT_PUBLIC_KEY_INFO pInfo,
-     BYTE *pbComputedHash,
-      DWORD *pcbComputedHash
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-CertRDNValueToStrA(
-     DWORD dwValueType,
-     PCERT_RDN_VALUE_BLOB pValue,
-      LPSTR psz,
-     DWORD csz
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-CertRDNValueToStrW(
-     DWORD dwValueType,
-     PCERT_RDN_VALUE_BLOB pValue,
-      LPWSTR psz,
-     DWORD csz
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-CertNameToStrA(
-     DWORD dwCertEncodingType,
-     PCERT_NAME_BLOB pName,
-     DWORD dwStrType,
-      LPSTR psz,
-     DWORD csz
-    );
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-CertNameToStrW(
-     DWORD dwCertEncodingType,
-     PCERT_NAME_BLOB pName,
-     DWORD dwStrType,
-      LPWSTR psz,
-     DWORD csz
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertStrToNameA(
-     DWORD dwCertEncodingType,
-     LPCSTR pszX500,
-     DWORD dwStrType,
-      void *pvReserved,
-     BYTE *pbEncoded,
-      DWORD *pcbEncoded,
-      LPCSTR *ppszError
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertStrToNameW(
-     DWORD dwCertEncodingType,
-     LPCWSTR pszX500,
-     DWORD dwStrType,
-      void *pvReserved,
-     BYTE *pbEncoded,
-      DWORD *pcbEncoded,
-      LPCWSTR *ppszError
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-CertGetNameStringA(
-     PCCERT_CONTEXT pCertContext,
-     DWORD dwType,
-     DWORD dwFlags,
-     void *pvTypePara,
-      LPSTR pszNameString,
-     DWORD cchNameString
-    );
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-CertGetNameStringW(
-     PCCERT_CONTEXT pCertContext,
-     DWORD dwType,
-     DWORD dwFlags,
-     void *pvTypePara,
-      LPWSTR pszNameString,
-     DWORD cchNameString
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef PCCERT_CONTEXT (__stdcall *PFN_CRYPT_GET_SIGNER_CERTIFICATE)(
-     void *pvGetArg,
-     DWORD dwCertEncodingType,
-     PCERT_INFO pSignerId,    
-                                
-     HCERTSTORE hMsgCertStore
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_SIGN_MESSAGE_PARA {
-    DWORD                       cbSize;
-    DWORD                       dwMsgEncodingType;
-    PCCERT_CONTEXT              pSigningCert;
-    CRYPT_ALGORITHM_IDENTIFIER  HashAlgorithm;
-    void                        *pvHashAuxInfo;
-    DWORD                       cMsgCert;
-    PCCERT_CONTEXT              *rgpMsgCert;
-    DWORD                       cMsgCrl;
-    PCCRL_CONTEXT               *rgpMsgCrl;
-    DWORD                       cAuthAttr;
-    PCRYPT_ATTRIBUTE            rgAuthAttr;
-    DWORD                       cUnauthAttr;
-    PCRYPT_ATTRIBUTE            rgUnauthAttr;
-    DWORD                       dwFlags;
-    DWORD                       dwInnerContentType;
-
-
-
-
-
-} CRYPT_SIGN_MESSAGE_PARA, *PCRYPT_SIGN_MESSAGE_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_VERIFY_MESSAGE_PARA {
-    DWORD                               cbSize;
-    DWORD                               dwMsgAndCertEncodingType;
-    HCRYPTPROV                          hCryptProv;
-    PFN_CRYPT_GET_SIGNER_CERTIFICATE    pfnGetSignerCertificate;
-    void                                *pvGetArg;
-} CRYPT_VERIFY_MESSAGE_PARA, *PCRYPT_VERIFY_MESSAGE_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_ENCRYPT_MESSAGE_PARA {
-    DWORD                       cbSize;
-    DWORD                       dwMsgEncodingType;
-    HCRYPTPROV                  hCryptProv;
-    CRYPT_ALGORITHM_IDENTIFIER  ContentEncryptionAlgorithm;
-    void                        *pvEncryptionAuxInfo;
-    DWORD                       dwFlags;
-    DWORD                       dwInnerContentType;
-} CRYPT_ENCRYPT_MESSAGE_PARA, *PCRYPT_ENCRYPT_MESSAGE_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_DECRYPT_MESSAGE_PARA {
-    DWORD                   cbSize;
-    DWORD                   dwMsgAndCertEncodingType;
-    DWORD                   cCertStore;
-    HCERTSTORE              *rghCertStore;
-
-
-
-
-
-
-
-
-
-} CRYPT_DECRYPT_MESSAGE_PARA, *PCRYPT_DECRYPT_MESSAGE_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_HASH_MESSAGE_PARA {
-    DWORD                       cbSize;
-    DWORD                       dwMsgEncodingType;
-    HCRYPTPROV                  hCryptProv;
-    CRYPT_ALGORITHM_IDENTIFIER  HashAlgorithm;
-    void                        *pvHashAuxInfo;
-} CRYPT_HASH_MESSAGE_PARA, *PCRYPT_HASH_MESSAGE_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_KEY_SIGN_MESSAGE_PARA {
-    DWORD                       cbSize;
-    DWORD                       dwMsgAndCertEncodingType;
-    HCRYPTPROV                  hCryptProv;
-    DWORD                       dwKeySpec;
-    CRYPT_ALGORITHM_IDENTIFIER  HashAlgorithm;
-    void                        *pvHashAuxInfo;
-    CRYPT_ALGORITHM_IDENTIFIER  PubKeyAlgorithm;
-} CRYPT_KEY_SIGN_MESSAGE_PARA, *PCRYPT_KEY_SIGN_MESSAGE_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_KEY_VERIFY_MESSAGE_PARA {
-    DWORD                   cbSize;
-    DWORD                   dwMsgEncodingType;
-    HCRYPTPROV              hCryptProv;
-} CRYPT_KEY_VERIFY_MESSAGE_PARA, *PCRYPT_KEY_VERIFY_MESSAGE_PARA;
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSignMessage(
-     PCRYPT_SIGN_MESSAGE_PARA pSignPara,
-     BOOL fDetachedSignature,
-     DWORD cToBeSigned,
-     const BYTE *rgpbToBeSigned[],
-     DWORD rgcbToBeSigned[],
-     BYTE *pbSignedBlob,
-      DWORD *pcbSignedBlob
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptVerifyMessageSignature(
-     PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
-     DWORD dwSignerIndex,
-     const BYTE *pbSignedBlob,
-     DWORD cbSignedBlob,
-     BYTE  *pbDecoded,
-       DWORD *pcbDecoded,
-      PCCERT_CONTEXT *ppSignerCert
-    );
-
-
-
-
-
-__declspec(dllimport)
-LONG
-__stdcall
-CryptGetMessageSignerCount(
-     DWORD dwMsgEncodingType,
-     const BYTE *pbSignedBlob,
-     DWORD cbSignedBlob
-    );
-
-
-
-
-
-__declspec(dllimport)
-HCERTSTORE
-__stdcall
-CryptGetMessageCertificates(
-     DWORD dwMsgAndCertEncodingType,
-     HCRYPTPROV hCryptProv,           
-     DWORD dwFlags,                   
-     const BYTE *pbSignedBlob,
-     DWORD cbSignedBlob
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptVerifyDetachedMessageSignature(
-     PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
-     DWORD dwSignerIndex,
-     const BYTE *pbDetachedSignBlob,
-     DWORD cbDetachedSignBlob,
-     DWORD cToBeSigned,
-     const BYTE *rgpbToBeSigned[],
-     DWORD rgcbToBeSigned[],
-      PCCERT_CONTEXT *ppSignerCert
-    );
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptEncryptMessage(
-     PCRYPT_ENCRYPT_MESSAGE_PARA pEncryptPara,
-     DWORD cRecipientCert,
-     PCCERT_CONTEXT rgpRecipientCert[],
-     const BYTE *pbToBeEncrypted,
-     DWORD cbToBeEncrypted,
-     BYTE *pbEncryptedBlob,
-      DWORD *pcbEncryptedBlob
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptDecryptMessage(
-     PCRYPT_DECRYPT_MESSAGE_PARA pDecryptPara,
-     const BYTE *pbEncryptedBlob,
-     DWORD cbEncryptedBlob,
-      BYTE *pbDecrypted,
-       DWORD *pcbDecrypted,
-      PCCERT_CONTEXT *ppXchgCert
-    );
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSignAndEncryptMessage(
-     PCRYPT_SIGN_MESSAGE_PARA pSignPara,
-     PCRYPT_ENCRYPT_MESSAGE_PARA pEncryptPara,
-     DWORD cRecipientCert,
-     PCCERT_CONTEXT rgpRecipientCert[],
-     const BYTE *pbToBeSignedAndEncrypted,
-     DWORD cbToBeSignedAndEncrypted,
-     BYTE *pbSignedAndEncryptedBlob,
-      DWORD *pcbSignedAndEncryptedBlob
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptDecryptAndVerifyMessageSignature(
-     PCRYPT_DECRYPT_MESSAGE_PARA pDecryptPara,
-     PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
-     DWORD dwSignerIndex,
-     const BYTE *pbEncryptedBlob,
-     DWORD cbEncryptedBlob,
-      BYTE *pbDecrypted,
-       DWORD *pcbDecrypted,
-      PCCERT_CONTEXT *ppXchgCert,
-      PCCERT_CONTEXT *ppSignerCert
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptDecodeMessage(
-     DWORD dwMsgTypeFlags,
-     PCRYPT_DECRYPT_MESSAGE_PARA pDecryptPara,
-     PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
-     DWORD dwSignerIndex,
-     const BYTE *pbEncodedBlob,
-     DWORD cbEncodedBlob,
-     DWORD dwPrevInnerContentType,
-      DWORD *pdwMsgType,
-      DWORD *pdwInnerContentType,
-      BYTE *pbDecoded,
-       DWORD *pcbDecoded,
-      PCCERT_CONTEXT *ppXchgCert,
-      PCCERT_CONTEXT *ppSignerCert
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptHashMessage(
-     PCRYPT_HASH_MESSAGE_PARA pHashPara,
-     BOOL fDetachedHash,
-     DWORD cToBeHashed,
-     const BYTE *rgpbToBeHashed[],
-     DWORD rgcbToBeHashed[],
-      BYTE *pbHashedBlob,
-       DWORD *pcbHashedBlob,
-      BYTE *pbComputedHash,
-       DWORD *pcbComputedHash
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptVerifyMessageHash(
-     PCRYPT_HASH_MESSAGE_PARA pHashPara,
-     BYTE *pbHashedBlob,
-     DWORD cbHashedBlob,
-      BYTE *pbToBeHashed,
-       DWORD *pcbToBeHashed,
-      BYTE *pbComputedHash,
-       DWORD *pcbComputedHash
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptVerifyDetachedMessageHash(
-     PCRYPT_HASH_MESSAGE_PARA pHashPara,
-     BYTE *pbDetachedHashBlob,
-     DWORD cbDetachedHashBlob,
-     DWORD cToBeHashed,
-     const BYTE *rgpbToBeHashed[],
-     DWORD rgcbToBeHashed[],
-      BYTE *pbComputedHash,
-       DWORD *pcbComputedHash
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSignMessageWithKey(
-     PCRYPT_KEY_SIGN_MESSAGE_PARA pSignPara,
-     const BYTE *pbToBeSigned,
-     DWORD cbToBeSigned,
-     BYTE *pbSignedBlob,
-      DWORD *pcbSignedBlob
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptVerifyMessageSignatureWithKey(
-     PCRYPT_KEY_VERIFY_MESSAGE_PARA pVerifyPara,
-      PCERT_PUBLIC_KEY_INFO pPublicKeyInfo,
-     const BYTE *pbSignedBlob,
-     DWORD cbSignedBlob,
-      BYTE *pbDecoded,
-       DWORD *pcbDecoded
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HCERTSTORE
-__stdcall
-CertOpenSystemStoreA(
-    HCRYPTPROV      hProv,
-    LPCSTR            szSubsystemProtocol
-    );
-__declspec(dllimport)
-HCERTSTORE
-__stdcall
-CertOpenSystemStoreW(
-    HCRYPTPROV      hProv,
-    LPCWSTR            szSubsystemProtocol
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertAddEncodedCertificateToSystemStoreA(
-    LPCSTR            szCertStoreName,
-    const BYTE *    pbCertEncoded,
-    DWORD           cbCertEncoded
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CertAddEncodedCertificateToSystemStoreW(
-    LPCWSTR            szCertStoreName,
-    const BYTE *    pbCertEncoded,
-    DWORD           cbCertEncoded
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_CHAIN {
-    DWORD                   cCerts;     
-    PCERT_BLOB              certs;      
-                                        
-    CRYPT_KEY_PROV_INFO     keyLocatorInfo; 
-} CERT_CHAIN, *PCERT_CHAIN;
-
-
-
-HRESULT
-__stdcall
-FindCertsByIssuer(
-     PCERT_CHAIN pCertChains,
-      DWORD *pcbCertChains,
-     DWORD *pcCertChains,        
-     BYTE* pbEncodedIssuerName,   
-     DWORD cbEncodedIssuerName,   
-     LPCWSTR pwszPurpose,         
-     DWORD dwKeySpec              
-    
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptQueryObject(
-    DWORD            dwObjectType,
-    const void       *pvObject,
-    DWORD            dwExpectedContentTypeFlags,
-    DWORD            dwExpectedFormatTypeFlags,
-    DWORD            dwFlags,
-    DWORD            *pdwMsgAndCertEncodingType,
-    DWORD            *pdwContentType,
-    DWORD            *pdwFormatType,
-    HCERTSTORE       *phCertStore,
-    HCRYPTMSG        *phMsg,
-    const void       **ppvContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-LPVOID
-__stdcall
-CryptMemAlloc (
-     ULONG cbSize
-    );
-
-__declspec(dllimport)
-LPVOID
-__stdcall
-CryptMemRealloc (
-     LPVOID pv,
-     ULONG cbSize
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-CryptMemFree (
-     LPVOID pv
-    );
-
-
-
-
-
-
-
-
-typedef HANDLE HCRYPTASYNC, *PHCRYPTASYNC;
-
-typedef void (__stdcall *PFN_CRYPT_ASYNC_PARAM_FREE_FUNC) (
-    LPSTR pszParamOid,
-    LPVOID pvParam
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptCreateAsyncHandle (
-     DWORD dwFlags,
-     PHCRYPTASYNC phAsync
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSetAsyncParam (
-     HCRYPTASYNC hAsync,
-     LPSTR pszParamOid,
-     LPVOID pvParam,
-      PFN_CRYPT_ASYNC_PARAM_FREE_FUNC pfnFree
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptGetAsyncParam (
-     HCRYPTASYNC hAsync,
-     LPSTR pszParamOid,
-     LPVOID* ppvParam,
-      PFN_CRYPT_ASYNC_PARAM_FREE_FUNC* ppfnFree
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptCloseAsyncHandle (
-     HCRYPTASYNC hAsync
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_BLOB_ARRAY {
-    DWORD            cBlob;
-    PCRYPT_DATA_BLOB rgBlob;
-} CRYPT_BLOB_ARRAY, *PCRYPT_BLOB_ARRAY;
-
-typedef struct _CRYPT_CREDENTIALS {
-    DWORD  cbSize;
-    LPCSTR pszCredentialsOid;
-    LPVOID pvCredentials;
-} CRYPT_CREDENTIALS, *PCRYPT_CREDENTIALS;
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_PASSWORD_CREDENTIALSA {
-    DWORD   cbSize;
-    LPSTR   pszUsername;
-    LPSTR   pszPassword;
-} CRYPT_PASSWORD_CREDENTIALSA, *PCRYPT_PASSWORD_CREDENTIALSA;
-typedef struct _CRYPT_PASSWORD_CREDENTIALSW {
-    DWORD   cbSize;
-    LPWSTR  pszUsername;
-    LPWSTR  pszPassword;
-} CRYPT_PASSWORD_CREDENTIALSW, *PCRYPT_PASSWORD_CREDENTIALSW;
-
-typedef CRYPT_PASSWORD_CREDENTIALSW CRYPT_PASSWORD_CREDENTIALS;
-typedef PCRYPT_PASSWORD_CREDENTIALSW PCRYPT_PASSWORD_CREDENTIALS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef void (__stdcall *PFN_FREE_ENCODED_OBJECT_FUNC) (
-    LPCSTR pszObjectOid,
-    PCRYPT_BLOB_ARRAY pObject,
-    LPVOID pvFreeContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_RETRIEVE_AUX_INFO {
-    DWORD       cbSize;
-    FILETIME    *pLastSyncTime;
-    DWORD       dwMaxUrlRetrievalByteCount;     
-} CRYPT_RETRIEVE_AUX_INFO, *PCRYPT_RETRIEVE_AUX_INFO;
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptRetrieveObjectByUrlA (
-     LPCSTR pszUrl,
-     LPCSTR pszObjectOid,
-     DWORD dwRetrievalFlags,
-     DWORD dwTimeout,                     
-     LPVOID* ppvObject,
-     HCRYPTASYNC hAsyncRetrieve,
-      PCRYPT_CREDENTIALS pCredentials,
-      LPVOID pvVerify,
-      PCRYPT_RETRIEVE_AUX_INFO pAuxInfo
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptRetrieveObjectByUrlW (
-     LPCWSTR pszUrl,
-     LPCSTR pszObjectOid,
-     DWORD dwRetrievalFlags,
-     DWORD dwTimeout,                     
-     LPVOID* ppvObject,
-     HCRYPTASYNC hAsyncRetrieve,
-      PCRYPT_CREDENTIALS pCredentials,
-      LPVOID pvVerify,
-      PCRYPT_RETRIEVE_AUX_INFO pAuxInfo
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CRYPT_CANCEL_RETRIEVAL)(
-     DWORD dwFlags,
-     void  *pvArg
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptInstallCancelRetrieval(
-     PFN_CRYPT_CANCEL_RETRIEVAL pfnCancel,
-     const void *pvArg,
-     DWORD dwFlags,
-     void *pvReserved
-);
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptUninstallCancelRetrieval(
-         DWORD dwFlags,
-         void  *pvReserved
-        );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptCancelAsyncRetrieval (
-    HCRYPTASYNC hAsyncRetrieval
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-typedef void (__stdcall *PFN_CRYPT_ASYNC_RETRIEVAL_COMPLETION_FUNC) (
-     LPVOID pvCompletion,
-     DWORD dwCompletionCode,
-     LPCSTR pszUrl,
-     LPSTR pszObjectOid,
-     LPVOID pvObject
-    );
-
-typedef struct _CRYPT_ASYNC_RETRIEVAL_COMPLETION {
-    PFN_CRYPT_ASYNC_RETRIEVAL_COMPLETION_FUNC pfnCompletion;
-    LPVOID pvCompletion;
-} CRYPT_ASYNC_RETRIEVAL_COMPLETION, *PCRYPT_ASYNC_RETRIEVAL_COMPLETION;
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CANCEL_ASYNC_RETRIEVAL_FUNC) (
-    HCRYPTASYNC hAsyncRetrieve
-    );
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRYPT_URL_ARRAY {
-    DWORD   cUrl;
-    LPWSTR* rgwszUrl;
-} CRYPT_URL_ARRAY, *PCRYPT_URL_ARRAY;
-
-typedef struct _CRYPT_URL_INFO {
-    DWORD   cbSize;
-
-    
-    DWORD   dwSyncDeltaTime;
-
-    
-    
-    
-    DWORD   cGroup;
-    DWORD   *rgcGroupEntry;
-} CRYPT_URL_INFO, *PCRYPT_URL_INFO;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptGetObjectUrl (
-     LPCSTR pszUrlOid,
-     LPVOID pvPara,
-     DWORD dwFlags,
-      PCRYPT_URL_ARRAY pUrlArray,
-      DWORD* pcbUrlArray,
-      PCRYPT_URL_INFO pUrlInfo,
-       DWORD* pcbUrlInfo,
-      LPVOID pvReserved
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_CRL_CONTEXT_PAIR {
-    PCCERT_CONTEXT          pCertContext;
-    PCCRL_CONTEXT           pCrlContext;
-} CERT_CRL_CONTEXT_PAIR, *PCERT_CRL_CONTEXT_PAIR;
-typedef const CERT_CRL_CONTEXT_PAIR *PCCERT_CRL_CONTEXT_PAIR;
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptGetTimeValidObject (
-     LPCSTR pszTimeValidOid,
-     LPVOID pvPara,
-     PCCERT_CONTEXT pIssuer,
-      LPFILETIME pftValidFor,
-     DWORD dwFlags,
-     DWORD dwTimeout,                         
-      LPVOID* ppvObject,
-      PCRYPT_CREDENTIALS pCredentials,
-      LPVOID pvReserved
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptFlushTimeValidObject (
-      LPCSTR pszFlushTimeValidOid,
-      LPVOID pvPara,
-      PCCERT_CONTEXT pIssuer,
-      DWORD dwFlags,
-      LPVOID pvReserved
-     );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct  _CRYPTPROTECT_PROMPTSTRUCT
-{
-    DWORD cbSize;
-    DWORD dwPromptFlags;
-    HWND  hwndApp;
-    LPCWSTR szPrompt;
-} CRYPTPROTECT_PROMPTSTRUCT, *PCRYPTPROTECT_PROMPTSTRUCT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptProtectData(
-                  DATA_BLOB*      pDataIn,
-                  LPCWSTR         szDataDescr,
-          DATA_BLOB*      pOptionalEntropy,
-                  PVOID           pvReserved,
-          CRYPTPROTECT_PROMPTSTRUCT*  pPromptStruct,
-                  DWORD           dwFlags,
-                 DATA_BLOB*      pDataOut            
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptUnprotectData(
-                  DATA_BLOB*      pDataIn,             
-         LPWSTR*         ppszDataDescr,       
-          DATA_BLOB*      pOptionalEntropy,
-                  PVOID           pvReserved,
-          CRYPTPROTECT_PROMPTSTRUCT*  pPromptStruct,
-                  DWORD           dwFlags,
-                 DATA_BLOB*      pDataOut
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptProtectMemory(
-               LPVOID          pDataIn,             
-                  DWORD           cbDataIn,            
-                  DWORD           dwFlags
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptUnprotectMemory(
-               LPVOID          pDataIn,             
-                  DWORD           cbDataIn,            
-                  DWORD           dwFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCCERT_CONTEXT
-__stdcall
-CertCreateSelfSignCertificate(
-              HCRYPTPROV                  hProv,
-              PCERT_NAME_BLOB             pSubjectIssuerBlob,
-              DWORD                       dwFlags,
-        PCRYPT_KEY_PROV_INFO        pKeyProvInfo,
-        PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm,
-        PSYSTEMTIME                 pStartTime,
-        PSYSTEMTIME                 pEndTime,
-        PCERT_EXTENSIONS            pExtensions
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptGetKeyIdentifierProperty(
-     const CRYPT_HASH_BLOB *pKeyIdentifier,
-     DWORD dwPropId,
-     DWORD dwFlags,
-      LPCWSTR pwszComputerName,
-      void *pvReserved,
-     void *pvData,
-      DWORD *pcbData
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptSetKeyIdentifierProperty(
-     const CRYPT_HASH_BLOB *pKeyIdentifier,
-     DWORD dwPropId,
-     DWORD dwFlags,
-      LPCWSTR pwszComputerName,
-      void *pvReserved,
-     const void *pvData
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CRYPT_ENUM_KEYID_PROP)(
-     const CRYPT_HASH_BLOB *pKeyIdentifier,
-     DWORD dwFlags,
-     void *pvReserved,
-     void *pvArg,
-     DWORD cProp,
-     DWORD *rgdwPropId,
-     void **rgpvData,
-     DWORD *rgcbData
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptEnumKeyIdentifierProperties(
-      const CRYPT_HASH_BLOB *pKeyIdentifier,
-     DWORD dwPropId,
-     DWORD dwFlags,
-      LPCWSTR pwszComputerName,
-      void *pvReserved,
-      void *pvArg,
-     PFN_CRYPT_ENUM_KEYID_PROP pfnEnum
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptCreateKeyIdentifierFromCSP(
-     DWORD dwCertEncodingType,
-      LPCSTR pszPubKeyOID,
-     const PUBLICKEYSTRUC *pPubKeyStruc,
-     DWORD cbPubKeyStruc,
-     DWORD dwFlags,
-      void *pvReserved,
-     BYTE *pbHash,
-      DWORD *pcbHash
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef HANDLE HCERTCHAINENGINE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_CHAIN_ENGINE_CONFIG {
-
-    DWORD       cbSize;
-    HCERTSTORE  hRestrictedRoot;
-    HCERTSTORE  hRestrictedTrust;
-    HCERTSTORE  hRestrictedOther;
-    DWORD       cAdditionalStore;
-    HCERTSTORE* rghAdditionalStore;
-    DWORD       dwFlags;
-    DWORD       dwUrlRetrievalTimeout;      
-    DWORD       MaximumCachedCertificates;
-    DWORD       CycleDetectionModulus;
-
-} CERT_CHAIN_ENGINE_CONFIG, *PCERT_CHAIN_ENGINE_CONFIG;
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertCreateCertificateChainEngine (
-     PCERT_CHAIN_ENGINE_CONFIG pConfig,
-     HCERTCHAINENGINE* phChainEngine
-    );
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-CertFreeCertificateChainEngine (
-     HCERTCHAINENGINE hChainEngine
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertResyncCertificateChainEngine (
-     HCERTCHAINENGINE hChainEngine
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_TRUST_STATUS {
-
-    DWORD dwErrorStatus;
-    DWORD dwInfoStatus;
-
-} CERT_TRUST_STATUS, *PCERT_TRUST_STATUS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_REVOCATION_INFO {
-
-    DWORD                       cbSize;
-    DWORD                       dwRevocationResult;
-    LPCSTR                      pszRevocationOid;
-    LPVOID                      pvOidSpecificInfo;
-
-    
-    
-    BOOL                        fHasFreshnessTime;
-    DWORD                       dwFreshnessTime;    
-
-    
-    PCERT_REVOCATION_CRL_INFO   pCrlInfo;
-
-} CERT_REVOCATION_INFO, *PCERT_REVOCATION_INFO;
-
-
-
-
-
-typedef struct _CERT_TRUST_LIST_INFO {
-
-    DWORD         cbSize;
-    PCTL_ENTRY    pCtlEntry;
-    PCCTL_CONTEXT pCtlContext;
-
-} CERT_TRUST_LIST_INFO, *PCERT_TRUST_LIST_INFO;
-
-
-
-
-
-typedef struct _CERT_CHAIN_ELEMENT {
-
-    DWORD                 cbSize;
-    PCCERT_CONTEXT        pCertContext;
-    CERT_TRUST_STATUS     TrustStatus;
-    PCERT_REVOCATION_INFO pRevocationInfo;
-
-    PCERT_ENHKEY_USAGE    pIssuanceUsage;       
-    PCERT_ENHKEY_USAGE    pApplicationUsage;    
-
-    LPCWSTR               pwszExtendedErrorInfo;    
-
-} CERT_CHAIN_ELEMENT, *PCERT_CHAIN_ELEMENT;
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_SIMPLE_CHAIN {
-
-    DWORD                 cbSize;
-    CERT_TRUST_STATUS     TrustStatus;
-    DWORD                 cElement;
-    PCERT_CHAIN_ELEMENT*  rgpElement;
-    PCERT_TRUST_LIST_INFO pTrustListInfo;
-
-    
-    
-    
-    
-    
-    
-    BOOL                   fHasRevocationFreshnessTime;
-    DWORD                  dwRevocationFreshnessTime;    
-
-} CERT_SIMPLE_CHAIN, *PCERT_SIMPLE_CHAIN;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_CHAIN_CONTEXT CERT_CHAIN_CONTEXT, *PCERT_CHAIN_CONTEXT;
-typedef const CERT_CHAIN_CONTEXT *PCCERT_CHAIN_CONTEXT;
-
-struct _CERT_CHAIN_CONTEXT {
-    DWORD                   cbSize;
-    CERT_TRUST_STATUS       TrustStatus;
-    DWORD                   cChain;
-    PCERT_SIMPLE_CHAIN*     rgpChain;
-
-    
-    
-    DWORD                   cLowerQualityChainContext;
-    PCCERT_CHAIN_CONTEXT*   rgpLowerQualityChainContext;
-
-    
-    
-    
-    
-    
-    
-    BOOL                    fHasRevocationFreshnessTime;
-    DWORD                   dwRevocationFreshnessTime;    
-};
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_USAGE_MATCH {
-
-    DWORD             dwType;
-    CERT_ENHKEY_USAGE Usage;
-
-} CERT_USAGE_MATCH, *PCERT_USAGE_MATCH;
-
-typedef struct _CTL_USAGE_MATCH {
-
-    DWORD     dwType;
-    CTL_USAGE Usage;
-
-} CTL_USAGE_MATCH, *PCTL_USAGE_MATCH;
-
-typedef struct _CERT_CHAIN_PARA {
-
-    DWORD            cbSize;
-    CERT_USAGE_MATCH RequestedUsage;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-} CERT_CHAIN_PARA, *PCERT_CHAIN_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertGetCertificateChain (
-      HCERTCHAINENGINE hChainEngine,
-     PCCERT_CONTEXT pCertContext,
-      LPFILETIME pTime,
-      HCERTSTORE hAdditionalStore,
-     PCERT_CHAIN_PARA pChainPara,
-     DWORD dwFlags,
-     LPVOID pvReserved,
-     PCCERT_CHAIN_CONTEXT* ppChainContext
-    );
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-CertFreeCertificateChain (
-     PCCERT_CHAIN_CONTEXT pChainContext
-    );
-
-
-
-
-
-__declspec(dllimport)
-PCCERT_CHAIN_CONTEXT
-__stdcall
-CertDuplicateCertificateChain (
-     PCCERT_CHAIN_CONTEXT pChainContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CRL_REVOCATION_INFO {
-
-    PCRL_ENTRY           pCrlEntry;
-    PCCRL_CONTEXT        pCrlContext;
-    PCCERT_CHAIN_CONTEXT pCrlIssuerChain;
-
-} CRL_REVOCATION_INFO, *PCRL_REVOCATION_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PCCERT_CHAIN_CONTEXT
-__stdcall
-CertFindChainInStore(
-     HCERTSTORE hCertStore,
-     DWORD dwCertEncodingType,
-     DWORD dwFindFlags,
-     DWORD dwFindType,
-     const void *pvFindPara,
-     PCCERT_CHAIN_CONTEXT pPrevChainContext
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *PFN_CERT_CHAIN_FIND_BY_ISSUER_CALLBACK)(
-     PCCERT_CONTEXT pCert,
-     void *pvFindArg
-    );
-
-typedef struct _CERT_CHAIN_FIND_BY_ISSUER_PARA {
-    DWORD                                   cbSize;
-
-    
-    LPCSTR                                  pszUsageIdentifier;
-
-    
-    DWORD                                   dwKeySpec;
-
-    
-    
-    
-    
-    
-    DWORD                                   dwAcquirePrivateKeyFlags;
-
-    
-    
-    DWORD                                   cIssuer;
-    CERT_NAME_BLOB                          *rgIssuer;
-
-    
-    
-    
-    PFN_CERT_CHAIN_FIND_BY_ISSUER_CALLBACK pfnFindCallback;
-    void                                    *pvFindArg;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-} CERT_CHAIN_FIND_ISSUER_PARA, *PCERT_CHAIN_FIND_ISSUER_PARA,
-    CERT_CHAIN_FIND_BY_ISSUER_PARA, *PCERT_CHAIN_FIND_BY_ISSUER_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERT_CHAIN_POLICY_PARA {
-    DWORD                   cbSize;
-    DWORD                   dwFlags;
-    void                    *pvExtraPolicyPara;     
-} CERT_CHAIN_POLICY_PARA, *PCERT_CHAIN_POLICY_PARA;
-
-
-
-
-
-
-typedef struct _CERT_CHAIN_POLICY_STATUS {
-    DWORD                   cbSize;
-    DWORD                   dwError;
-    LONG                    lChainIndex;
-    LONG                    lElementIndex;
-    void                    *pvExtraPolicyStatus;   
-} CERT_CHAIN_POLICY_STATUS, *PCERT_CHAIN_POLICY_STATUS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CertVerifyCertificateChainPolicy(
-     LPCSTR pszPolicyOID,
-     PCCERT_CHAIN_CONTEXT pChainContext,
-     PCERT_CHAIN_POLICY_PARA pPolicyPara,
-      PCERT_CHAIN_POLICY_STATUS pPolicyStatus
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA {
-    DWORD               cbSize;
-    DWORD               dwRegPolicySettings;
-    PCMSG_SIGNER_INFO   pSignerInfo;                
-} AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA,
-    *PAUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA;
-
-typedef struct _AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUS {
-    DWORD               cbSize;
-    BOOL                fCommercial;        
-} AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUS,
-    *PAUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _AUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA {
-    DWORD               cbSize;
-    DWORD               dwRegPolicySettings;
-    BOOL                fCommercial;
-} AUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA,
-    *PAUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _HTTPSPolicyCallbackData
-{
-    union {
-        DWORD           cbStruct;       
-        DWORD           cbSize;         
-    };
-
-    DWORD           dwAuthType;
-
-
-
-    DWORD           fdwChecks;
-
-    WCHAR           *pwszServerName; 
-
-} HTTPSPolicyCallbackData, *PHTTPSPolicyCallbackData,
-    SSL_EXTRA_CERT_CHAIN_POLICY_PARA, *PSSL_EXTRA_CERT_CHAIN_POLICY_PARA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptStringToBinaryA(
-         LPCSTR  pszString,
-         DWORD     cchString,
-         DWORD     dwFlags,
-         BYTE     *pbBinary,
-      DWORD    *pcbBinary,
-        DWORD    *pdwSkip,    
-        DWORD    *pdwFlags    
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptStringToBinaryW(
-         LPCWSTR  pszString,
-         DWORD     cchString,
-         DWORD     dwFlags,
-         BYTE     *pbBinary,
-      DWORD    *pcbBinary,
-        DWORD    *pdwSkip,    
-        DWORD    *pdwFlags    
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptBinaryToStringA(
-         const BYTE  *pbBinary,
-         DWORD        cbBinary,
-         DWORD        dwFlags,
-         LPSTR      pszString,
-      DWORD       *pcchString
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CryptBinaryToStringW(
-         const BYTE  *pbBinary,
-         DWORD        cbBinary,
-         DWORD        dwFlags,
-         LPWSTR      pszString,
-      DWORD       *pcchString
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HCERTSTORE
-__stdcall
-PFXImportCertStore(
-     CRYPT_DATA_BLOB* pPFX,
-     LPCWSTR szPassword,
-     DWORD   dwFlags);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-PFXIsPFXBlob(
-     CRYPT_DATA_BLOB* pPFX);
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL 
-__stdcall
-PFXVerifyPassword(
-     CRYPT_DATA_BLOB* pPFX,
-     LPCWSTR szPassword,
-     DWORD dwFlags);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-PFXExportCertStoreEx(
-     HCERTSTORE hStore,
-      CRYPT_DATA_BLOB* pPFX,
-     LPCWSTR szPassword,
-     void*   pvReserved,
-     DWORD   dwFlags);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-PFXExportCertStore(
-     HCERTSTORE hStore,
-      CRYPT_DATA_BLOB* pPFX,
-     LPCWSTR szPassword,
-     DWORD   dwFlags);
-
-
-
-
-
-}       
-
-
-
-
-
-
-#pragma warning(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CERTIFICATE_BLOB {
-
-    DWORD   dwCertEncodingType;
-
-
-
-
-
-    DWORD   cbData;
-
-
-
-
-    PBYTE    pbData;
-
-} EFS_CERTIFICATE_BLOB, *PEFS_CERTIFICATE_BLOB;
-
-
-
-
-
-
-typedef struct _EFS_HASH_BLOB {
-
-
-
-
-    DWORD   cbData;
-
-
-
-
-    PBYTE    pbData;
-
-} EFS_HASH_BLOB, *PEFS_HASH_BLOB;
-
-
-
-
-
-
-typedef struct _EFS_RPC_BLOB {
-
-
-
-
-    DWORD   cbData;
-
-
-
-
-    PBYTE    pbData;
-
-} EFS_RPC_BLOB, *PEFS_RPC_BLOB;
-
-typedef struct _EFS_KEY_INFO {
-
-    DWORD   dwVersion;
-    ULONG   Entropy;
-    ALG_ID  Algorithm;
-    ULONG   KeyLength;
-    
-} EFS_KEY_INFO, *PEFS_KEY_INFO;
-
-
-
-
-
-
-
-typedef struct _ENCRYPTION_CERTIFICATE {
-    DWORD cbTotalLength;
-    SID * pUserSid;
-    PEFS_CERTIFICATE_BLOB pCertBlob;
-} ENCRYPTION_CERTIFICATE, *PENCRYPTION_CERTIFICATE;
-
-
-
-
-typedef struct _ENCRYPTION_CERTIFICATE_HASH {
-    DWORD cbTotalLength;
-    SID * pUserSid;
-    PEFS_HASH_BLOB  pHash;
-
-
-
-
-    LPWSTR lpDisplayInformation;
-
-} ENCRYPTION_CERTIFICATE_HASH, *PENCRYPTION_CERTIFICATE_HASH;
-
-
-
-
-
-
-
-typedef struct _ENCRYPTION_CERTIFICATE_HASH_LIST {
-
-
-
-    DWORD nCert_Hash;
-
-
-
-     PENCRYPTION_CERTIFICATE_HASH * pUsers;
-} ENCRYPTION_CERTIFICATE_HASH_LIST, *PENCRYPTION_CERTIFICATE_HASH_LIST;
-
-
-
-typedef struct _ENCRYPTION_CERTIFICATE_LIST {    
-
-
-
-    DWORD nUsers;
-
-
-
-     PENCRYPTION_CERTIFICATE * pUsers;
-} ENCRYPTION_CERTIFICATE_LIST, *PENCRYPTION_CERTIFICATE_LIST;
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-QueryUsersOnEncryptedFile(
-          LPCWSTR lpFileName,
-          PENCRYPTION_CERTIFICATE_HASH_LIST * pUsers
-    );
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-QueryRecoveryAgentsOnEncryptedFile(
-          LPCWSTR lpFileName,
-          PENCRYPTION_CERTIFICATE_HASH_LIST * pRecoveryAgents
-    );
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-RemoveUsersFromEncryptedFile(
-          LPCWSTR lpFileName,
-          PENCRYPTION_CERTIFICATE_HASH_LIST pHashes
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-AddUsersToEncryptedFile(
-          LPCWSTR lpFileName,
-          PENCRYPTION_CERTIFICATE_LIST pUsers
-    );
-
-__declspec(dllimport)
-DWORD
-__stdcall
-SetUserFileEncryptionKey(
-           PENCRYPTION_CERTIFICATE pEncryptionCertificate
-    );
-
-
-__declspec(dllimport)
-void
-__stdcall
-FreeEncryptionCertificateHashList(
-           PENCRYPTION_CERTIFICATE_HASH_LIST pHashes
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EncryptionDisable(
-         LPCWSTR DirPath,
-         BOOL Disable
-    );
-
-
-__declspec(dllimport)
-DWORD
-__stdcall
-DuplicateEncryptionInfoFile(
-          LPCWSTR SrcFileName,
-          LPCWSTR DstFileName, 
-          DWORD dwCreationDistribution, 
-          DWORD dwAttributes, 
-          const LPSECURITY_ATTRIBUTES lpSecurityAttributes
-     );
-
-
-}       
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-#pragma warning( disable: 4049 )  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,8)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-extern "C" {
-
-
-typedef struct
-{
-   RPC_NS_HANDLE        LookupContext;
-   RPC_BINDING_HANDLE   ProposedHandle;
-   RPC_BINDING_VECTOR * Bindings;
-
-} RPC_IMPORT_CONTEXT_P, * PRPC_IMPORT_CONTEXT_P;
-
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcNsGetBuffer(
-     PRPC_MESSAGE Message
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcNsSendReceive(
-     PRPC_MESSAGE Message,
-     RPC_BINDING_HANDLE  * Handle
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-I_RpcNsRaiseException(
-     PRPC_MESSAGE Message,
-     RPC_STATUS Status
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_RpcReBindBuffer(
-     PRPC_MESSAGE Message
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_NsServerBindSearch(
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-I_NsClientBindSearch(
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-I_NsClientBindDone(
-    );
-
-
-}
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef unsigned char byte;
-typedef byte cs_byte;
-typedef unsigned char boolean;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-void  * __stdcall MIDL_user_allocate(size_t);
-void             __stdcall MIDL_user_free( void  * );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef void  * NDR_CCONTEXT;
-
-typedef struct
-    {
-    void  * pad[2];
-    void  * userContext;
-    }  * NDR_SCONTEXT;
-
-
-
-
-
-typedef void (__stdcall  * NDR_RUNDOWN)(void  * context);
-
-typedef void (__stdcall  * NDR_NOTIFY_ROUTINE)(void);
-typedef void (__stdcall  * NDR_NOTIFY2_ROUTINE)(boolean flag);
-
-typedef struct _SCONTEXT_QUEUE {
-    unsigned long   NumberOfObjects;
-    NDR_SCONTEXT  * ArrayOfObjects;
-    } SCONTEXT_QUEUE,  * PSCONTEXT_QUEUE;
-
-__declspec(dllimport)
-RPC_BINDING_HANDLE
-__stdcall
-NDRCContextBinding (
-     NDR_CCONTEXT     CContext
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NDRCContextMarshall (
-      NDR_CCONTEXT    CContext,
-     void  *pBuff
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NDRCContextUnmarshall (
-     NDR_CCONTEXT        *   pCContext,
-      RPC_BINDING_HANDLE      hBinding,
-      void                *   pBuff,
-      unsigned long           DataRepresentation
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NDRSContextMarshall (
-      NDR_SCONTEXT    CContext,
-     void          * pBuff,
-      NDR_RUNDOWN     userRunDownIn
-    );
-
-__declspec(dllimport)
-NDR_SCONTEXT
-__stdcall
-NDRSContextUnmarshall (
-      void          * pBuff,
-      unsigned long   DataRepresentation
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NDRSContextMarshallEx (
-      RPC_BINDING_HANDLE  BindingHandle,
-      NDR_SCONTEXT        CContext,
-     void              * pBuff,
-      NDR_RUNDOWN         userRunDownIn
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NDRSContextMarshall2 (
-      RPC_BINDING_HANDLE  BindingHandle,
-      NDR_SCONTEXT        CContext,
-     void              * pBuff,
-      NDR_RUNDOWN         userRunDownIn,
-      void              * CtxGuard,
-     unsigned long        Flags
-    );
-
-__declspec(dllimport)
-NDR_SCONTEXT
-__stdcall
-NDRSContextUnmarshallEx (
-      RPC_BINDING_HANDLE  BindingHandle,
-      void              * pBuff,
-      unsigned long       DataRepresentation
-    );
-
-__declspec(dllimport)
-NDR_SCONTEXT
-__stdcall
-NDRSContextUnmarshall2(
-      RPC_BINDING_HANDLE  BindingHandle,
-      void              * pBuff,
-      unsigned long       DataRepresentation,
-      void              * CtxGuard,
-     unsigned long        Flags
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-RpcSsDestroyClientContext (
-     void  *  * ContextHandle
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef unsigned long error_status_t;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct _MIDL_STUB_MESSAGE;
-struct _MIDL_STUB_DESC;
-struct _FULL_PTR_XLAT_TABLES;
-
-typedef unsigned char  *    RPC_BUFPTR;
-typedef unsigned long       RPC_LENGTH;
-
-
-typedef void (__stdcall  * EXPR_EVAL)( struct _MIDL_STUB_MESSAGE  * );
-
-typedef const unsigned char  * PFORMAT_STRING;
-
-
-
-
-typedef struct
-    {
-    long              Dimension;
-
-    
-    unsigned long  *  BufferConformanceMark;
-    unsigned long  *  BufferVarianceMark;
-
-    
-    unsigned long  *  MaxCountArray;
-    unsigned long  *  OffsetArray;
-    unsigned long  *  ActualCountArray;
-    } ARRAY_INFO,  *PARRAY_INFO;
-
-
-typedef struct _NDR_ASYNC_MESSAGE *   PNDR_ASYNC_MESSAGE;
-typedef struct _NDR_CORRELATION_INFO *PNDR_CORRELATION_INFO;
-
-
-
-
-
-typedef struct
-    {
-    unsigned long   WireCodeset;
-    unsigned long   DesiredReceivingCodeset;
-    void           *CSArrayInfo;
-    } CS_STUB_INFO;
-
-
-
-
-
-typedef const unsigned char  * PFORMAT_STRING;
-typedef struct _MIDL_SYNTAX_INFO MIDL_SYNTAX_INFO, *PMIDL_SYNTAX_INFO;
-
-struct NDR_ALLOC_ALL_NODES_CONTEXT;
-struct NDR_POINTER_QUEUE_STATE;
-struct _NDR_PROC_CONTEXT;
-
-typedef struct _MIDL_STUB_MESSAGE
-    {
-    
-    PRPC_MESSAGE            RpcMsg;
-
-    
-    unsigned char       *   Buffer;
-
-    
-
-
-
-    unsigned char       *   BufferStart;
-    unsigned char       *   BufferEnd;
-
-    
-
-
-
-
-
-
-    unsigned char       *   BufferMark;
-
-    
-    unsigned long           BufferLength;
-
-    
-    unsigned long           MemorySize;
-
-    
-    unsigned char       *   Memory;
-
-    
-    unsigned char           IsClient;
-    unsigned char           Pad;
-    unsigned short          uFlags2;
-
-    
-    int                     ReuseBuffer;
-
-    
-    struct NDR_ALLOC_ALL_NODES_CONTEXT *pAllocAllNodesContext;
-    struct NDR_POINTER_QUEUE_STATE     *pPointerQueueState;
-
-    
-
-
-
-    
-    int                     IgnoreEmbeddedPointers;
-
-    
-
-
-
-    unsigned char       *   PointerBufferMark;
-
-    
-
-
-    unsigned char           fBufferValid;
-
-    unsigned char           uFlags;
-    unsigned short          UniquePtrCount;
-
-    
-
-
-
-    ULONG_PTR               MaxCount;
-
-    
-
-
-
-    unsigned long           Offset;
-
-    
-
-
-
-    unsigned long           ActualCount;
-
-    
-    void  *                 ( __stdcall * pfnAllocate)(size_t);
-    void                    ( __stdcall * pfnFree)(void  *);
-
-    
-
-
-
-
-
-    unsigned char       *   StackTop;
-
-    
-
-
-
-    unsigned char       *   pPresentedType;
-    unsigned char       *   pTransmitType;
-
-    
-
-
-
-
-
-
-
-    handle_t                SavedHandle;
-
-    
-
-
-    const struct _MIDL_STUB_DESC  * StubDesc;
-
-    
-
-
-    struct _FULL_PTR_XLAT_TABLES  * FullPtrXlatTables;
-    unsigned long                   FullPtrRefId;
-
-    unsigned long                   PointerLength;
-
-    int                             fInDontFree       :1;
-    int                             fDontCallFreeInst :1;
-    int                             fInOnlyParam      :1;
-    int                             fHasReturn        :1;
-    int                             fHasExtensions    :1;
-    int                             fHasNewCorrDesc   :1;
-    int                             fIsOicfServer    :1;
-    int                             fHasMemoryValidateCallback: 1;
-    int                             fUnused           :8;
-    int                             fUnused2          :16;
-
-
-    unsigned long                   dwDestContext;
-    void  *                         pvDestContext;
-
-    NDR_SCONTEXT *                  SavedContextHandles;
-
-    long                            ParamNumber;
-
-    struct IRpcChannelBuffer    *   pRpcChannelBuffer;
-
-    PARRAY_INFO                     pArrayInfo;
-    unsigned long           *       SizePtrCountArray;
-    unsigned long           *       SizePtrOffsetArray;
-    unsigned long           *       SizePtrLengthArray;
-
-    
-
-
-    void                    *       pArgQueue;
-
-    unsigned long                   dwStubPhase;
-
-    void                    *       LowStackMark;
-
-    
-
-
-    PNDR_ASYNC_MESSAGE              pAsyncMsg;
-    PNDR_CORRELATION_INFO           pCorrInfo;
-    unsigned char *                 pCorrMemory;
-
-    void *                          pMemoryList;
-
-    
-
-
-
-
-
-    
-
-
-
-    CS_STUB_INFO *                  pCSInfo;
-
-    unsigned char *                 ConformanceMark;
-    unsigned char *                 VarianceMark;
-
-
-
-
-    INT_PTR                         Unused;
-
-
-    struct _NDR_PROC_CONTEXT *      pContext;
-
-    
-
-
-
-
-    void *                             pUserMarshalList;
-    INT_PTR                         Reserved51_2;
-    INT_PTR                         Reserved51_3;
-    INT_PTR                         Reserved51_4;
-    INT_PTR                         Reserved51_5;
-
-
-    
-
-
-    } MIDL_STUB_MESSAGE,  *PMIDL_STUB_MESSAGE;
-
-
-typedef  struct _MIDL_STUB_MESSAGE MIDL_STUB_MESSAGE,   *PMIDL_STUB_MESSAGE;
-
-
-
-
-typedef void  *
-        ( __stdcall * GENERIC_BINDING_ROUTINE)
-        (void  *);
-typedef void
-        ( __stdcall * GENERIC_UNBIND_ROUTINE)
-        (void  *, unsigned char  *);
-
-typedef struct _GENERIC_BINDING_ROUTINE_PAIR
-    {
-    GENERIC_BINDING_ROUTINE     pfnBind;
-    GENERIC_UNBIND_ROUTINE      pfnUnbind;
-    } GENERIC_BINDING_ROUTINE_PAIR,  *PGENERIC_BINDING_ROUTINE_PAIR;
-
-typedef struct __GENERIC_BINDING_INFO
-    {
-    void  *            pObj;
-    unsigned int                Size;
-    GENERIC_BINDING_ROUTINE     pfnBind;
-    GENERIC_UNBIND_ROUTINE      pfnUnbind;
-    } GENERIC_BINDING_INFO,  *PGENERIC_BINDING_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef void ( __stdcall * XMIT_HELPER_ROUTINE)
-    ( PMIDL_STUB_MESSAGE );
-
-typedef struct _XMIT_ROUTINE_QUINTUPLE
-    {
-    XMIT_HELPER_ROUTINE     pfnTranslateToXmit;
-    XMIT_HELPER_ROUTINE     pfnTranslateFromXmit;
-    XMIT_HELPER_ROUTINE     pfnFreeXmit;
-    XMIT_HELPER_ROUTINE     pfnFreeInst;
-    } XMIT_ROUTINE_QUINTUPLE,  *PXMIT_ROUTINE_QUINTUPLE;
-
-typedef unsigned long
-( __stdcall * USER_MARSHAL_SIZING_ROUTINE)
-    (unsigned long  *,
-     unsigned long,
-     void  * );
-
-typedef unsigned char  *
-( __stdcall * USER_MARSHAL_MARSHALLING_ROUTINE)
-    (unsigned long  *,
-     unsigned char  * ,
-     void  * );
-
-typedef unsigned char  *
-( __stdcall * USER_MARSHAL_UNMARSHALLING_ROUTINE)
-    (unsigned long  *,
-     unsigned char  *,
-     void  * );
-
-typedef void ( __stdcall * USER_MARSHAL_FREEING_ROUTINE)
-    (unsigned long  *,
-     void  * );
-
-typedef struct _USER_MARSHAL_ROUTINE_QUADRUPLE
-    {
-    USER_MARSHAL_SIZING_ROUTINE          pfnBufferSize;
-    USER_MARSHAL_MARSHALLING_ROUTINE     pfnMarshall;
-    USER_MARSHAL_UNMARSHALLING_ROUTINE   pfnUnmarshall;
-    USER_MARSHAL_FREEING_ROUTINE         pfnFree;
-    } USER_MARSHAL_ROUTINE_QUADRUPLE;
-
-
-
-typedef enum _USER_MARSHAL_CB_TYPE
-{
-    USER_MARSHAL_CB_BUFFER_SIZE,
-    USER_MARSHAL_CB_MARSHALL,
-    USER_MARSHAL_CB_UNMARSHALL,
-    USER_MARSHAL_CB_FREE
-} USER_MARSHAL_CB_TYPE;
-
-typedef struct _USER_MARSHAL_CB
-{
-    unsigned long           Flags;
-    PMIDL_STUB_MESSAGE      pStubMsg;
-    PFORMAT_STRING          pReserve;
-    unsigned long           Signature;
-    USER_MARSHAL_CB_TYPE    CBType;
-    PFORMAT_STRING          pFormat;
-    PFORMAT_STRING          pTypeFormat;
-} USER_MARSHAL_CB;
-
-
-
-
-
-
-
-
-
-typedef struct _MALLOC_FREE_STRUCT
-    {
-    void  *     ( __stdcall * pfnAllocate)(size_t);
-    void        ( __stdcall * pfnFree)(void  *);
-    } MALLOC_FREE_STRUCT;
-
-typedef struct _COMM_FAULT_OFFSETS
-    {
-    short       CommOffset;
-    short       FaultOffset;
-    } COMM_FAULT_OFFSETS;
-
-
-
-
-
-typedef enum _IDL_CS_CONVERT
-    {
-    IDL_CS_NO_CONVERT,
-    IDL_CS_IN_PLACE_CONVERT,
-    IDL_CS_NEW_BUFFER_CONVERT
-    } IDL_CS_CONVERT;
-
-typedef void
-( __stdcall * CS_TYPE_NET_SIZE_ROUTINE)
-    (RPC_BINDING_HANDLE     hBinding,
-     unsigned long          ulNetworkCodeSet,
-     unsigned long          ulLocalBufferSize,
-     IDL_CS_CONVERT     *   conversionType,
-     unsigned long      *   pulNetworkBufferSize,
-     error_status_t     *   pStatus);
-
-typedef void
-( __stdcall * CS_TYPE_LOCAL_SIZE_ROUTINE)
-    (RPC_BINDING_HANDLE     hBinding,
-     unsigned long          ulNetworkCodeSet,
-     unsigned long          ulNetworkBufferSize,
-     IDL_CS_CONVERT     *   conversionType,
-     unsigned long      *   pulLocalBufferSize,
-     error_status_t     *   pStatus);
-
-typedef void
-( __stdcall * CS_TYPE_TO_NETCS_ROUTINE)
-    (RPC_BINDING_HANDLE     hBinding,
-     unsigned long          ulNetworkCodeSet,
-     void               *   pLocalData,
-     unsigned long          ulLocalDataLength,
-     byte               *   pNetworkData,
-     unsigned long      *   pulNetworkDataLength,
-     error_status_t     *   pStatus);
-
-typedef void
-( __stdcall * CS_TYPE_FROM_NETCS_ROUTINE)
-    (RPC_BINDING_HANDLE     hBinding,
-     unsigned long          ulNetworkCodeSet,
-     byte               *   pNetworkData,
-     unsigned long          ulNetworkDataLength,
-     unsigned long          ulLocalBufferSize,
-     void               *   pLocalData,
-     unsigned long      *   pulLocalDataLength,
-     error_status_t     *   pStatus);
-
-typedef void
-( __stdcall * CS_TAG_GETTING_ROUTINE)
-    (RPC_BINDING_HANDLE     hBinding,
-     int                    fServerSide,
-     unsigned long      *   pulSendingTag,
-     unsigned long      *   pulDesiredReceivingTag,
-     unsigned long      *   pulReceivingTag,
-     error_status_t     *   pStatus);
-
-void __stdcall
-RpcCsGetTags(
-     RPC_BINDING_HANDLE     hBinding,
-     int                    fServerSide,
-     unsigned long      *   pulSendingTag,
-     unsigned long      *   pulDesiredReceivingTag,
-     unsigned long      *   pulReceivingTag,
-     error_status_t     *   pStatus);
-
-typedef struct _NDR_CS_SIZE_CONVERT_ROUTINES
-    {
-    CS_TYPE_NET_SIZE_ROUTINE    pfnNetSize;
-    CS_TYPE_TO_NETCS_ROUTINE    pfnToNetCs;
-    CS_TYPE_LOCAL_SIZE_ROUTINE  pfnLocalSize;
-    CS_TYPE_FROM_NETCS_ROUTINE  pfnFromNetCs;
-    } NDR_CS_SIZE_CONVERT_ROUTINES;
-
-typedef struct _NDR_CS_ROUTINES
-    {
-    NDR_CS_SIZE_CONVERT_ROUTINES   *pSizeConvertRoutines;
-    CS_TAG_GETTING_ROUTINE         *pTagGettingRoutines;
-    } NDR_CS_ROUTINES;
-
-
-
-
-
-typedef struct _MIDL_STUB_DESC
-    {
-    void  *    RpcInterfaceInformation;
-
-    void  *    ( __stdcall * pfnAllocate)(size_t);
-    void       ( __stdcall * pfnFree)(void  *);
-
-    union
-        {
-        handle_t  *             pAutoHandle;
-        handle_t  *             pPrimitiveHandle;
-        PGENERIC_BINDING_INFO   pGenericBindingInfo;
-        } IMPLICIT_HANDLE_INFO;
-
-    const NDR_RUNDOWN  *                    apfnNdrRundownRoutines;
-    const GENERIC_BINDING_ROUTINE_PAIR  *   aGenericBindingRoutinePairs;
-    const EXPR_EVAL  *                      apfnExprEval;
-    const XMIT_ROUTINE_QUINTUPLE  *         aXmitQuintuple;
-
-    const unsigned char  *                  pFormatTypes;
-
-    int                                     fCheckBounds;
-
-    
-    unsigned long                           Version;
-
-    MALLOC_FREE_STRUCT  *                   pMallocFreeStruct;
-
-    long                                    MIDLVersion;
-
-    const COMM_FAULT_OFFSETS  *    CommFaultOffsets;
-
-    
-    const USER_MARSHAL_ROUTINE_QUADRUPLE  * aUserMarshalQuadruple;
-
-    
-    const NDR_NOTIFY_ROUTINE  *             NotifyRoutineTable;
-
-    
-
-
-
-    ULONG_PTR                               mFlags;
-
-    
-    const NDR_CS_ROUTINES *                 CsRoutineTables;
-
-    void *                                  Reserved4;
-    ULONG_PTR                               Reserved5;
-
-    
-
-    } MIDL_STUB_DESC;
-
-
-typedef const MIDL_STUB_DESC  * PMIDL_STUB_DESC;
-
-typedef void  * PMIDL_XMIT_TYPE;
-
-
-
-
-
-
-#pragma warning(push)
-
-#pragma warning( disable:4200 )
-
-typedef struct _MIDL_FORMAT_STRING
-    {
-    short               Pad;
-    unsigned char       Format[];
-    } MIDL_FORMAT_STRING;
-
-
-#pragma warning(pop)
-
-
-
-
-
-
-
-
-typedef void ( __stdcall * STUB_THUNK)( PMIDL_STUB_MESSAGE );
-
-typedef long ( __stdcall * SERVER_ROUTINE)();
-
-
-
-
-typedef struct  _MIDL_SERVER_INFO_
-    {
-    PMIDL_STUB_DESC                     pStubDesc;
-    const SERVER_ROUTINE     *          DispatchTable;
-    PFORMAT_STRING                      ProcString;
-    const unsigned short *              FmtStringOffset;
-    const STUB_THUNK *                  ThunkTable;
-    PRPC_SYNTAX_IDENTIFIER              pTransferSyntax;
-    ULONG_PTR                           nCount;
-    PMIDL_SYNTAX_INFO                   pSyntaxInfo;
-    } MIDL_SERVER_INFO, *PMIDL_SERVER_INFO;
-
-
-
-
-
-
-typedef struct _MIDL_STUBLESS_PROXY_INFO
-    {
-    PMIDL_STUB_DESC                     pStubDesc;
-    PFORMAT_STRING                      ProcFormatString;
-    const unsigned short            *   FormatStringOffset;
-    PRPC_SYNTAX_IDENTIFIER              pTransferSyntax;
-    ULONG_PTR                           nCount;
-    PMIDL_SYNTAX_INFO                   pSyntaxInfo;
-    } MIDL_STUBLESS_PROXY_INFO;
-
-typedef MIDL_STUBLESS_PROXY_INFO  * PMIDL_STUBLESS_PROXY_INFO;
-
-
-
-
-typedef struct _MIDL_SYNTAX_INFO
-{
-RPC_SYNTAX_IDENTIFIER               TransferSyntax;
-RPC_DISPATCH_TABLE *                DispatchTable;
-PFORMAT_STRING                      ProcString;
-const unsigned short *              FmtStringOffset;
-PFORMAT_STRING                      TypeString;
-const void           *              aUserMarshalQuadruple;
-ULONG_PTR                           pReserved1;
-ULONG_PTR                           pReserved2;
-} MIDL_SYNTAX_INFO, *PMIDL_SYNTAX_INFO;
-
-typedef unsigned short * PARAM_OFFSETTABLE, *PPARAM_OFFSETTABLE;
-
-
-
-
-typedef union _CLIENT_CALL_RETURN
-    {
-    void  *         Pointer;
-    LONG_PTR        Simple;
-    } CLIENT_CALL_RETURN;
-
-
-
-
-
-typedef enum
-        {
-        XLAT_SERVER = 1,
-        XLAT_CLIENT
-        } XLAT_SIDE;
-
-
-
-
-
-typedef struct _FULL_PTR_TO_REFID_ELEMENT
-    {
-    struct _FULL_PTR_TO_REFID_ELEMENT  *  Next;
-
-    void  *             Pointer;
-    unsigned long       RefId;
-    unsigned char       State;
-    } FULL_PTR_TO_REFID_ELEMENT,  *PFULL_PTR_TO_REFID_ELEMENT;
-
-
-
-
-typedef struct _FULL_PTR_XLAT_TABLES
-    {
-    
-
-
-    struct
-        {
-        void  * *           XlatTable;
-        unsigned char  *    StateTable;
-        unsigned long       NumberOfEntries;
-        } RefIdToPointer;
-
-    
-
-
-    struct
-        {
-        PFULL_PTR_TO_REFID_ELEMENT  *   XlatTable;
-        unsigned long                   NumberOfBuckets;
-        unsigned long                   HashMask;
-        } PointerToRefId;
-
-    
-
-
-    unsigned long           NextRefId;
-
-    
-
-
-
-
-
-
-    XLAT_SIDE               XlatSide;
-    } FULL_PTR_XLAT_TABLES,  *PFULL_PTR_XLAT_TABLES;
-
-
-
-
-
-RPC_STATUS __stdcall
-NdrClientGetSupportedSyntaxes(
-     RPC_CLIENT_INTERFACE * pInf,
-     unsigned long       * pCount,
-     MIDL_SYNTAX_INFO   ** pArr );
-
-
-RPC_STATUS __stdcall
-NdrServerGetSupportedSyntaxes(
-     RPC_SERVER_INTERFACE * pInf,
-     unsigned long       * pCount,
-     MIDL_SYNTAX_INFO   ** pArr,
-     unsigned long       * pPreferSyntaxIndex);
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrSimpleTypeMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    unsigned char           FormatChar
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrPointerMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrCsArrayMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrCsTagMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrSimpleStructMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrConformantStructMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrConformantVaryingStructMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrComplexStructMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrFixedArrayMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrConformantArrayMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrConformantVaryingArrayMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrVaryingArrayMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrComplexArrayMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrNonConformantStringMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrConformantStringMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrEncapsulatedUnionMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrNonEncapsulatedUnionMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrByteCountPointerMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrXmitOrRepAsMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrUserMarshalMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrInterfacePointerMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrClientContextMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    NDR_CCONTEXT            ContextHandle,
-    int                     fCheck
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrServerContextMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    NDR_SCONTEXT            ContextHandle,
-    NDR_RUNDOWN             RundownRoutine
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrServerContextNewMarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    NDR_SCONTEXT            ContextHandle,
-    NDR_RUNDOWN             RundownRoutine,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrSimpleTypeUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    unsigned char           FormatChar
-    );
-
-__declspec(dllimport)
-unsigned char * __stdcall
-__stdcall
-NdrCsArrayUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char **        ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-__declspec(dllimport)
-unsigned char * __stdcall
-__stdcall
-NdrCsTagUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char **        ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-__declspec(dllimport)
-unsigned char * __stdcall
-NdrRangeUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char **        ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrCorrelationInitialize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    void  *                 pMemory,
-    unsigned long           CacheSize,
-    unsigned long           flags
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrCorrelationPass(
-    PMIDL_STUB_MESSAGE      pStubMsg
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrCorrelationFree(
-    PMIDL_STUB_MESSAGE      pStubMsg
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrPointerUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrSimpleStructUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrConformantStructUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrConformantVaryingStructUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrComplexStructUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrFixedArrayUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrConformantArrayUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrConformantVaryingArrayUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrVaryingArrayUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrComplexArrayUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrNonConformantStringUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrConformantStringUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrEncapsulatedUnionUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrNonEncapsulatedUnionUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrByteCountPointerUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrXmitOrRepAsUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrUserMarshalUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrInterfacePointerUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *  *     ppMemory,
-    PFORMAT_STRING          pFormat,
-    unsigned char           fMustAlloc
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrClientContextUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    NDR_CCONTEXT        *   pContextHandle,
-    RPC_BINDING_HANDLE      BindHandle
-    );
-
-__declspec(dllimport)
-NDR_SCONTEXT
-__stdcall
-NdrServerContextUnmarshall(
-    PMIDL_STUB_MESSAGE      pStubMsg
-    );
-
-
-
-__declspec(dllimport)
-NDR_SCONTEXT
-__stdcall
-NdrContextHandleInitialize(
-      PMIDL_STUB_MESSAGE  pStubMsg,
-      PFORMAT_STRING      pFormat
-    );
-
-__declspec(dllimport)
-NDR_SCONTEXT
-__stdcall
-NdrServerContextNewUnmarshall(
-      PMIDL_STUB_MESSAGE  pStubMsg,
-      PFORMAT_STRING      pFormat
-    );
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrPointerBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrCsArrayBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrCsTagBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrSimpleStructBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrConformantStructBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrConformantVaryingStructBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrComplexStructBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrFixedArrayBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrConformantArrayBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrConformantVaryingArrayBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrVaryingArrayBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrComplexArrayBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrConformantStringBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrNonConformantStringBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrEncapsulatedUnionBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrNonEncapsulatedUnionBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrByteCountPointerBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrXmitOrRepAsBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrUserMarshalBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrInterfacePointerBufferSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrContextHandleSize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrPointerMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrCsArrayMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrCsTagMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrSimpleStructMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrConformantStructMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrConformantVaryingStructMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrComplexStructMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrFixedArrayMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrConformantArrayMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrConformantVaryingArrayMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrVaryingArrayMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrComplexArrayMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrConformantStringMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrNonConformantStringMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrEncapsulatedUnionMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrNonEncapsulatedUnionMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrXmitOrRepAsMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrUserMarshalMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrInterfacePointerMemorySize(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrPointerFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrCsArrayFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrSimpleStructFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrConformantStructFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrConformantVaryingStructFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrComplexStructFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrFixedArrayFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrConformantArrayFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrConformantVaryingArrayFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrVaryingArrayFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrComplexArrayFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrEncapsulatedUnionFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrNonEncapsulatedUnionFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrByteCountPointerFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrXmitOrRepAsFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrUserMarshalFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrInterfacePointerFree(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pMemory,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrConvert2(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat,
-    long                    NumberParams
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrConvert(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrUserMarshalSimpleTypeConvert(
-    unsigned long *         pFlags,
-    unsigned char *         pBuffer,
-    unsigned char           FormatChar
-    );
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrClientInitializeNew(
-    PRPC_MESSAGE            pRpcMsg,
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PMIDL_STUB_DESC         pStubDescriptor,
-    unsigned int            ProcNum
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrServerInitializeNew(
-    PRPC_MESSAGE            pRpcMsg,
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PMIDL_STUB_DESC         pStubDescriptor
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrServerInitializePartial(
-    PRPC_MESSAGE            pRpcMsg,
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PMIDL_STUB_DESC         pStubDescriptor,
-    unsigned long           RequestedBufferSize
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrClientInitialize(
-    PRPC_MESSAGE            pRpcMsg,
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PMIDL_STUB_DESC         pStubDescriptor,
-    unsigned int            ProcNum
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrServerInitialize(
-    PRPC_MESSAGE            pRpcMsg,
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PMIDL_STUB_DESC         pStubDescriptor
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrServerInitializeUnmarshall (
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PMIDL_STUB_DESC         pStubDescriptor,
-    PRPC_MESSAGE            pRpcMsg
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrServerInitializeMarshall (
-    PRPC_MESSAGE            pRpcMsg,
-    PMIDL_STUB_MESSAGE      pStubMsg
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrGetBuffer(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned long           BufferLength,
-    RPC_BINDING_HANDLE      Handle
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrNsGetBuffer(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned long           BufferLength,
-    RPC_BINDING_HANDLE      Handle
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrSendReceive(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char *         pBufferEnd
-    );
-
-__declspec(dllimport)
-unsigned char  *
-__stdcall
-NdrNsSendReceive(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    unsigned char  *        pBufferEnd,
-    RPC_BINDING_HANDLE  *   pAutoHandle
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrFreeBuffer(
-    PMIDL_STUB_MESSAGE      pStubMsg
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-NdrGetDcomProtocolVersion(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    RPC_VERSION *           pVersion );
-
-
-
-
-
-
-
-
-CLIENT_CALL_RETURN __cdecl
-NdrClientCall2(
-    PMIDL_STUB_DESC         pStubDescriptor,
-    PFORMAT_STRING          pFormat,
-    ...
-    );
-
-
-
-extern "C"
-
-void * _AddressOfReturnAddress(void);
-
-
-
-CLIENT_CALL_RETURN __cdecl
-NdrClientCall(
-    PMIDL_STUB_DESC         pStubDescriptor,
-    PFORMAT_STRING          pFormat,
-    ...
-    );
-
-CLIENT_CALL_RETURN __cdecl
-NdrAsyncClientCall(
-    PMIDL_STUB_DESC         pStubDescriptor,
-    PFORMAT_STRING          pFormat,
-    ...
-    );
-
-CLIENT_CALL_RETURN __cdecl
-NdrDcomAsyncClientCall(
-    PMIDL_STUB_DESC         pStubDescriptor,
-    PFORMAT_STRING          pFormat,
-    ...
-    );
-
-
-typedef enum {
-    STUB_UNMARSHAL,
-    STUB_CALL_SERVER,
-    STUB_MARSHAL,
-    STUB_CALL_SERVER_NO_HRESULT
-}STUB_PHASE;
-
-typedef enum {
-    PROXY_CALCSIZE,
-    PROXY_GETBUFFER,
-    PROXY_MARSHAL,
-    PROXY_SENDRECEIVE,
-    PROXY_UNMARSHAL
-}PROXY_PHASE;
-
-struct IRpcStubBuffer;      
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrAsyncServerCall(
-    PRPC_MESSAGE                pRpcMsg
-    );
-
-
-__declspec(dllimport)
-long
-__stdcall
-NdrAsyncStubCall(
-    struct IRpcStubBuffer *     pThis,
-    struct IRpcChannelBuffer *  pChannel,
-    PRPC_MESSAGE                pRpcMsg,
-    unsigned long *             pdwStubPhase
-    );
-
-
-__declspec(dllimport)
-long
-__stdcall
-NdrDcomAsyncStubCall(
-    struct IRpcStubBuffer    *  pThis,
-    struct IRpcChannelBuffer *  pChannel,
-    PRPC_MESSAGE                pRpcMsg,
-    unsigned long            *  pdwStubPhase
-    );
-
-__declspec(dllimport)
-long
-__stdcall
-NdrStubCall2(
-    struct IRpcStubBuffer  *    pThis,
-    struct IRpcChannelBuffer  * pChannel,
-    PRPC_MESSAGE                pRpcMsg,
-    unsigned long  *            pdwStubPhase
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrServerCall2(
-    PRPC_MESSAGE                pRpcMsg
-    );
-
-__declspec(dllimport)
-long
-__stdcall
-NdrStubCall (
-    struct IRpcStubBuffer  *    pThis,
-    struct IRpcChannelBuffer  * pChannel,
-    PRPC_MESSAGE                pRpcMsg,
-    unsigned long  *            pdwStubPhase
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrServerCall(
-    PRPC_MESSAGE                pRpcMsg
-    );
-
-__declspec(dllimport)
-int
-__stdcall
-NdrServerUnmarshall(
-    struct IRpcChannelBuffer  * pChannel,
-    PRPC_MESSAGE                pRpcMsg,
-    PMIDL_STUB_MESSAGE          pStubMsg,
-    PMIDL_STUB_DESC             pStubDescriptor,
-    PFORMAT_STRING              pFormat,
-    void  *                     pParamList
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrServerMarshall(
-    struct IRpcStubBuffer  *    pThis,
-    struct IRpcChannelBuffer  * pChannel,
-    PMIDL_STUB_MESSAGE          pStubMsg,
-    PFORMAT_STRING              pFormat
-    );
-
-
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-NdrMapCommAndFaultStatus(
-    PMIDL_STUB_MESSAGE          pStubMsg,
-    unsigned long  *            pCommStatus,
-    unsigned long  *            pFaultStatus,
-    RPC_STATUS                  Status
-    );
-
-
-
-__declspec(dllimport)
-int
-__stdcall
-NdrSH_UPDecision(
-    PMIDL_STUB_MESSAGE          pStubMsg,
-    unsigned char          * *  pPtrInMem,
-    RPC_BUFPTR                  pBuffer
-    );
-
-__declspec(dllimport)
-int
-__stdcall
-NdrSH_TLUPDecision(
-    PMIDL_STUB_MESSAGE          pStubMsg,
-    unsigned char          * *  pPtrInMem
-    );
-
-__declspec(dllimport)
-int
-__stdcall
-NdrSH_TLUPDecisionBuffer(
-    PMIDL_STUB_MESSAGE          pStubMsg,
-    unsigned char          * *  pPtrInMem
-    );
-
-__declspec(dllimport)
-int
-__stdcall
-NdrSH_IfAlloc(
-    PMIDL_STUB_MESSAGE          pStubMsg,
-    unsigned char          * *  pPtrInMem,
-    unsigned long               Count
-    );
-
-__declspec(dllimport)
-int
-__stdcall
-NdrSH_IfAllocRef(
-    PMIDL_STUB_MESSAGE          pStubMsg,
-    unsigned char          * *  pPtrInMem,
-    unsigned long               Count
-    );
-
-__declspec(dllimport)
-int
-__stdcall
-NdrSH_IfAllocSet(
-    PMIDL_STUB_MESSAGE          pStubMsg,
-    unsigned char          * *  pPtrInMem,
-    unsigned long               Count
-    );
-
-__declspec(dllimport)
-RPC_BUFPTR
-__stdcall
-NdrSH_IfCopy(
-    PMIDL_STUB_MESSAGE          pStubMsg,
-    unsigned char          * *  pPtrInMem,
-    unsigned long               Count
-    );
-
-__declspec(dllimport)
-RPC_BUFPTR
-__stdcall
-NdrSH_IfAllocCopy(
-    PMIDL_STUB_MESSAGE          pStubMsg,
-    unsigned char          * *  pPtrInMem,
-    unsigned long               Count
-    );
-
-__declspec(dllimport)
-unsigned long
-__stdcall
-NdrSH_Copy(
-    unsigned char            *  pStubMsg,
-    unsigned char            *  pPtrInMem,
-    unsigned long               Count
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrSH_IfFree(
-    PMIDL_STUB_MESSAGE          pMessage,
-    unsigned char            *  pPtr );
-
-
-__declspec(dllimport)
-RPC_BUFPTR
-__stdcall
-NdrSH_StringMarshall(
-    PMIDL_STUB_MESSAGE          pMessage,
-    unsigned char            *  pMemory,
-    unsigned long               Count,
-    int                         Size );
-
-__declspec(dllimport)
-RPC_BUFPTR
-__stdcall
-NdrSH_StringUnMarshall(
-    PMIDL_STUB_MESSAGE          pMessage,
-    unsigned char          * *  pMemory,
-    int                         Size );
-
-
-
-
-
-typedef void  * RPC_SS_THREAD_HANDLE;
-
-typedef void  * __stdcall
-RPC_CLIENT_ALLOC (
-     size_t Size
-    );
-
-typedef void __stdcall
-RPC_CLIENT_FREE (
-     void  * Ptr
-    );
-
-
-
-
-
-__declspec(dllimport)
-void  *
-__stdcall
-RpcSsAllocate (
-     size_t Size
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-RpcSsDisableAllocate (
-    void
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-RpcSsEnableAllocate (
-    void
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-RpcSsFree (
-     void  * NodeToFree
-    );
-
-__declspec(dllimport)
-RPC_SS_THREAD_HANDLE
-__stdcall
-RpcSsGetThreadHandle (
-    void
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-RpcSsSetClientAllocFree (
-     RPC_CLIENT_ALLOC  * ClientAlloc,
-     RPC_CLIENT_FREE   * ClientFree
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-RpcSsSetThreadHandle (
-     RPC_SS_THREAD_HANDLE Id
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-RpcSsSwapClientAllocFree (
-     RPC_CLIENT_ALLOC     * ClientAlloc,
-     RPC_CLIENT_FREE      * ClientFree,
-     RPC_CLIENT_ALLOC *  * OldClientAlloc,
-     RPC_CLIENT_FREE  *  * OldClientFree
-    );
-
-
-
-
-
-__declspec(dllimport)
-void  *
-__stdcall
-RpcSmAllocate (
-      size_t          Size,
-     RPC_STATUS  *   pStatus
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcSmClientFree (
-      void        *   pNodeToFree
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcSmDestroyClientContext (
-     void         * * ContextHandle
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcSmDisableAllocate (
-    void
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcSmEnableAllocate (
-    void
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcSmFree (
-     void         *   NodeToFree
-    );
-
-__declspec(dllimport)
-RPC_SS_THREAD_HANDLE
-__stdcall
-RpcSmGetThreadHandle (
-     RPC_STATUS  *   pStatus
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcSmSetClientAllocFree (
-     RPC_CLIENT_ALLOC * ClientAlloc,
-     RPC_CLIENT_FREE  * ClientFree
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcSmSetThreadHandle (
-     RPC_SS_THREAD_HANDLE Id
-    );
-
-__declspec(dllimport)
-RPC_STATUS
-__stdcall
-RpcSmSwapClientAllocFree (
-     RPC_CLIENT_ALLOC     *   ClientAlloc,
-     RPC_CLIENT_FREE      *   ClientFree,
-     RPC_CLIENT_ALLOC    * * OldClientAlloc,
-     RPC_CLIENT_FREE     * * OldClientFree
-    );
-
-
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrRpcSsEnableAllocate(
-    PMIDL_STUB_MESSAGE      pMessage );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrRpcSsDisableAllocate(
-    PMIDL_STUB_MESSAGE      pMessage );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrRpcSmSetClientToOsf(
-    PMIDL_STUB_MESSAGE      pMessage );
-
-__declspec(dllimport)
-void  *
-__stdcall
-NdrRpcSmClientAllocate (
-     size_t Size
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrRpcSmClientFree (
-     void  * NodeToFree
-    );
-
-__declspec(dllimport)
-void  *
-__stdcall
-NdrRpcSsDefaultAllocate (
-     size_t Size
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrRpcSsDefaultFree (
-     void  * NodeToFree
-    );
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-PFULL_PTR_XLAT_TABLES
-__stdcall
-NdrFullPointerXlatInit(
-    unsigned long           NumberOfPointers,
-    XLAT_SIDE               XlatSide
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrFullPointerXlatFree(
-    PFULL_PTR_XLAT_TABLES   pXlatTables
-    );
-
-__declspec(dllimport)
-int
-__stdcall
-NdrFullPointerQueryPointer(
-    PFULL_PTR_XLAT_TABLES   pXlatTables,
-    void  *                 pPointer,
-    unsigned char           QueryType,
-    unsigned long  *        pRefId
-    );
-
-__declspec(dllimport)
-int
-__stdcall
-NdrFullPointerQueryRefId(
-    PFULL_PTR_XLAT_TABLES   pXlatTables,
-    unsigned long           RefId,
-    unsigned char           QueryType,
-    void  * *               ppPointer
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrFullPointerInsertRefId(
-    PFULL_PTR_XLAT_TABLES   pXlatTables,
-    unsigned long           RefId,
-    void  *                 pPointer
-    );
-
-__declspec(dllimport)
-int
-__stdcall
-NdrFullPointerFree(
-    PFULL_PTR_XLAT_TABLES   pXlatTables,
-    void  *                 Pointer
-    );
-
-__declspec(dllimport)
-void  *
-__stdcall
-NdrAllocate(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    size_t                  Len
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrClearOutParameters(
-    PMIDL_STUB_MESSAGE      pStubMsg,
-    PFORMAT_STRING          pFormat,
-    void  *                 ArgAddr
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-void  *
-__stdcall
-NdrOleAllocate (
-     size_t Size
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrOleFree (
-     void  * NodeToFree
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _NDR_USER_MARSHAL_INFO_LEVEL1
-{
-    void *                      Buffer;
-    unsigned long               BufferSize;
-    void *(__stdcall * pfnAllocate)(size_t);
-    void (__stdcall * pfnFree)(void *);
-    struct IRpcChannelBuffer *  pRpcChannelBuffer;
-    ULONG_PTR                   Reserved[5];
-} NDR_USER_MARSHAL_INFO_LEVEL1;
-
-
-
-#pragma warning(push)
-
-#pragma warning(disable:4201)
-
-
-typedef struct _NDR_USER_MARSHAL_INFO
-{
-    unsigned long InformationLevel;
-    union {
-        NDR_USER_MARSHAL_INFO_LEVEL1 Level1;
-    };
-} NDR_USER_MARSHAL_INFO;
-
-
-
-#pragma warning(pop)
-
-
-
-
-
-RPC_STATUS
-__stdcall
-NdrGetUserMarshalInfo (
-     unsigned long        *   pFlags,
-     unsigned long            InformationLevel,
-     NDR_USER_MARSHAL_INFO * pMarshalInfo
-    );
-
-
-
-
-RPC_STATUS __stdcall
-NdrCreateServerInterfaceFromStub(
-             struct IRpcStubBuffer* pStub,
-              RPC_SERVER_INTERFACE *pServerIf );
-
-
-
-
-CLIENT_CALL_RETURN __cdecl
-NdrClientCall3(
-    MIDL_STUBLESS_PROXY_INFO   *pProxyInfo,
-    unsigned long               nProcNum,
-    void *                      pReturnValue,
-    ...
-    );
-
-CLIENT_CALL_RETURN __cdecl
-Ndr64AsyncClientCall(
-    MIDL_STUBLESS_PROXY_INFO   *pProxyInfo,
-    unsigned long               nProcNum,
-    void *                      pReturnValue,
-    ...
-    );
-
-CLIENT_CALL_RETURN __cdecl
-Ndr64DcomAsyncClientCall(
-    MIDL_STUBLESS_PROXY_INFO   *pProxyInfo,
-    unsigned long               nProcNum,
-    void *                      pReturnValue,
-    ...
-    );
-
-struct IRpcStubBuffer;      
-
-__declspec(dllimport)
-void
-__stdcall
-Ndr64AsyncServerCall(
-    PRPC_MESSAGE                pRpcMsg
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-Ndr64AsyncServerCall64(
-    PRPC_MESSAGE                pRpcMsg
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-Ndr64AsyncServerCallAll(
-    PRPC_MESSAGE                pRpcMsg
-    );
-
-__declspec(dllimport)
-long
-__stdcall
-Ndr64AsyncStubCall(
-    struct IRpcStubBuffer *     pThis,
-    struct IRpcChannelBuffer *  pChannel,
-    PRPC_MESSAGE                pRpcMsg,
-    unsigned long *             pdwStubPhase
-    );
-
-
-__declspec(dllimport)
-long
-__stdcall
-Ndr64DcomAsyncStubCall(
-    struct IRpcStubBuffer    *  pThis,
-    struct IRpcChannelBuffer *  pChannel,
-    PRPC_MESSAGE                pRpcMsg,
-    unsigned long            *  pdwStubPhase
-    );
-
-__declspec(dllimport)
-long
-__stdcall
-NdrStubCall3 (
-    struct IRpcStubBuffer  *    pThis,
-    struct IRpcChannelBuffer  * pChannel,
-    PRPC_MESSAGE                pRpcMsg,
-    unsigned long  *            pdwStubPhase
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrServerCallAll(
-    PRPC_MESSAGE                pRpcMsg
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrServerCallNdr64(
-    PRPC_MESSAGE                pRpcMsg
-    );
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrServerCall3(
-    PRPC_MESSAGE                pRpcMsg
-    );
-
-
-
-__declspec(dllimport)
-void
-__stdcall
-NdrPartialIgnoreClientMarshall(
-    PMIDL_STUB_MESSAGE          pStubMsg,
-    void *                      pMemory
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrPartialIgnoreServerUnmarshall(
-    PMIDL_STUB_MESSAGE          pStubMsg,
-    void **                     ppMemory
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrPartialIgnoreClientBufferSize(
-    PMIDL_STUB_MESSAGE          pStubMsg,
-    void *                      pMemory
-    );
-
-__declspec(dllimport)
-void
-__stdcall
-NdrPartialIgnoreServerInitialize(
-    PMIDL_STUB_MESSAGE          pStubMsg,
-    void **                     ppMemory,
-    PFORMAT_STRING              pFormat
-    );
-
-
-void __stdcall
-RpcUserFree( handle_t AsyncHandle, void * pBuffer );
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C"{
-
-
-void * __stdcall MIDL_user_allocate(size_t);
-void __stdcall MIDL_user_free( void * ); 
-
-
- 
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_wtypes_0000_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_wtypes_0000_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef struct tagRemHGLOBAL
-    {
-    long fNullHGlobal;
-    unsigned long cbData;
-     byte data[ 1 ];
-    } 	RemHGLOBAL;
-
-typedef struct tagRemHMETAFILEPICT
-    {
-    long mm;
-    long xExt;
-    long yExt;
-    unsigned long cbData;
-     byte data[ 1 ];
-    } 	RemHMETAFILEPICT;
-
-typedef struct tagRemHENHMETAFILE
-    {
-    unsigned long cbData;
-     byte data[ 1 ];
-    } 	RemHENHMETAFILE;
-
-typedef struct tagRemHBITMAP
-    {
-    unsigned long cbData;
-     byte data[ 1 ];
-    } 	RemHBITMAP;
-
-typedef struct tagRemHPALETTE
-    {
-    unsigned long cbData;
-     byte data[ 1 ];
-    } 	RemHPALETTE;
-
-typedef struct tagRemBRUSH
-    {
-    unsigned long cbData;
-     byte data[ 1 ];
-    } 	RemHBRUSH;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef WCHAR OLECHAR;
-
-typedef  OLECHAR *LPOLESTR;
-
-typedef  const OLECHAR *LPCOLESTR;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef unsigned char UCHAR;
-
-typedef short SHORT;
-
-typedef unsigned short USHORT;
-
-typedef DWORD ULONG;
-
-typedef double DOUBLE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _COAUTHIDENTITY
-    {
-     USHORT *User;
-     ULONG UserLength;
-     USHORT *Domain;
-     ULONG DomainLength;
-     USHORT *Password;
-     ULONG PasswordLength;
-    ULONG Flags;
-    } 	COAUTHIDENTITY;
-
-typedef struct _COAUTHINFO
-    {
-    DWORD dwAuthnSvc;
-    DWORD dwAuthzSvc;
-    LPWSTR pwszServerPrincName;
-    DWORD dwAuthnLevel;
-    DWORD dwImpersonationLevel;
-    COAUTHIDENTITY *pAuthIdentityData;
-    DWORD dwCapabilities;
-    } 	COAUTHINFO;
-
-typedef LONG SCODE;
-
-
-
-
-
-
-typedef SCODE *PSCODE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef 
-enum tagMEMCTX
-    {	MEMCTX_TASK	= 1,
-	MEMCTX_SHARED	= 2,
-	MEMCTX_MACSYSTEM	= 3,
-	MEMCTX_UNKNOWN	= -1,
-	MEMCTX_SAME	= -2
-    } 	MEMCTX;
-
-
-
-
-
-
-
-
-
-
-typedef 
-enum tagCLSCTX
-    {	CLSCTX_INPROC_SERVER	= 0x1,
-	CLSCTX_INPROC_HANDLER	= 0x2,
-	CLSCTX_LOCAL_SERVER	= 0x4,
-	CLSCTX_INPROC_SERVER16	= 0x8,
-	CLSCTX_REMOTE_SERVER	= 0x10,
-	CLSCTX_INPROC_HANDLER16	= 0x20,
-	CLSCTX_RESERVED1	= 0x40,
-	CLSCTX_RESERVED2	= 0x80,
-	CLSCTX_RESERVED3	= 0x100,
-	CLSCTX_RESERVED4	= 0x200,
-	CLSCTX_NO_CODE_DOWNLOAD	= 0x400,
-	CLSCTX_RESERVED5	= 0x800,
-	CLSCTX_NO_CUSTOM_MARSHAL	= 0x1000,
-	CLSCTX_ENABLE_CODE_DOWNLOAD	= 0x2000,
-	CLSCTX_NO_FAILURE_LOG	= 0x4000,
-	CLSCTX_DISABLE_AAA	= 0x8000,
-	CLSCTX_ENABLE_AAA	= 0x10000,
-	CLSCTX_FROM_DEFAULT_CONTEXT	= 0x20000,
-	CLSCTX_ACTIVATE_32_BIT_SERVER	= 0x40000,
-	CLSCTX_ACTIVATE_64_BIT_SERVER	= 0x80000
-    } 	CLSCTX;
-
-typedef 
-enum tagMSHLFLAGS
-    {	MSHLFLAGS_NORMAL	= 0,
-	MSHLFLAGS_TABLESTRONG	= 1,
-	MSHLFLAGS_TABLEWEAK	= 2,
-	MSHLFLAGS_NOPING	= 4,
-	MSHLFLAGS_RESERVED1	= 8,
-	MSHLFLAGS_RESERVED2	= 16,
-	MSHLFLAGS_RESERVED3	= 32,
-	MSHLFLAGS_RESERVED4	= 64
-    } 	MSHLFLAGS;
-
-typedef 
-enum tagMSHCTX
-    {	MSHCTX_LOCAL	= 0,
-	MSHCTX_NOSHAREDMEM	= 1,
-	MSHCTX_DIFFERENTMACHINE	= 2,
-	MSHCTX_INPROC	= 3,
-	MSHCTX_CROSSCTX	= 4
-    } 	MSHCTX;
-
-typedef 
-enum tagDVASPECT
-    {	DVASPECT_CONTENT	= 1,
-	DVASPECT_THUMBNAIL	= 2,
-	DVASPECT_ICON	= 4,
-	DVASPECT_DOCPRINT	= 8
-    } 	DVASPECT;
-
-typedef 
-enum tagSTGC
-    {	STGC_DEFAULT	= 0,
-	STGC_OVERWRITE	= 1,
-	STGC_ONLYIFCURRENT	= 2,
-	STGC_DANGEROUSLYCOMMITMERELYTODISKCACHE	= 4,
-	STGC_CONSOLIDATE	= 8
-    } 	STGC;
-
-typedef 
-enum tagSTGMOVE
-    {	STGMOVE_MOVE	= 0,
-	STGMOVE_COPY	= 1,
-	STGMOVE_SHALLOWCOPY	= 2
-    } 	STGMOVE;
-
-typedef 
-enum tagSTATFLAG
-    {	STATFLAG_DEFAULT	= 0,
-	STATFLAG_NONAME	= 1,
-	STATFLAG_NOOPEN	= 2
-    } 	STATFLAG;
-
-typedef  void *HCONTEXT;
-
-
-
-typedef DWORD LCID;
-
-
-
-
-typedef USHORT LANGID;
-
-
-typedef struct _BYTE_BLOB
-    {
-    unsigned long clSize;
-     byte abData[ 1 ];
-    } 	BYTE_BLOB;
-
-typedef  BYTE_BLOB *UP_BYTE_BLOB;
-
-typedef struct _WORD_BLOB
-    {
-    unsigned long clSize;
-     unsigned short asData[ 1 ];
-    } 	WORD_BLOB;
-
-typedef  WORD_BLOB *UP_WORD_BLOB;
-
-typedef struct _DWORD_BLOB
-    {
-    unsigned long clSize;
-     unsigned long alData[ 1 ];
-    } 	DWORD_BLOB;
-
-typedef  DWORD_BLOB *UP_DWORD_BLOB;
-
-typedef struct _FLAGGED_BYTE_BLOB
-    {
-    unsigned long fFlags;
-    unsigned long clSize;
-     byte abData[ 1 ];
-    } 	FLAGGED_BYTE_BLOB;
-
-typedef  FLAGGED_BYTE_BLOB *UP_FLAGGED_BYTE_BLOB;
-
-typedef struct _FLAGGED_WORD_BLOB
-    {
-    unsigned long fFlags;
-    unsigned long clSize;
-     unsigned short asData[ 1 ];
-    } 	FLAGGED_WORD_BLOB;
-
-typedef  FLAGGED_WORD_BLOB *UP_FLAGGED_WORD_BLOB;
-
-typedef struct _BYTE_SIZEDARR
-    {
-    unsigned long clSize;
-     byte *pData;
-    } 	BYTE_SIZEDARR;
-
-typedef struct _SHORT_SIZEDARR
-    {
-    unsigned long clSize;
-     unsigned short *pData;
-    } 	WORD_SIZEDARR;
-
-typedef struct _LONG_SIZEDARR
-    {
-    unsigned long clSize;
-     unsigned long *pData;
-    } 	DWORD_SIZEDARR;
-
-typedef struct _HYPER_SIZEDARR
-    {
-    unsigned long clSize;
-     __int64 *pData;
-    } 	HYPER_SIZEDARR;
-
-
-
-
-
-
-
-typedef struct _userCLIPFORMAT
-    {
-    long fContext;
-      union __MIDL_IWinTypes_0001
-        {
-         DWORD dwValue;
-         wchar_t *pwszName;
-        } 	u;
-    } 	userCLIPFORMAT;
-
-typedef  userCLIPFORMAT *wireCLIPFORMAT;
-
-typedef  WORD CLIPFORMAT;
-
-typedef struct _GDI_NONREMOTE
-    {
-    long fContext;
-      union __MIDL_IWinTypes_0002
-        {
-         long hInproc;
-         DWORD_BLOB *hRemote;
-        } 	u;
-    } 	GDI_NONREMOTE;
-
-typedef struct _userHGLOBAL
-    {
-    long fContext;
-      union __MIDL_IWinTypes_0003
-        {
-         long hInproc;
-         FLAGGED_BYTE_BLOB *hRemote;
-         __int64 hInproc64;
-        } 	u;
-    } 	userHGLOBAL;
-
-typedef  userHGLOBAL *wireHGLOBAL;
-
-typedef struct _userHMETAFILE
-    {
-    long fContext;
-      union __MIDL_IWinTypes_0004
-        {
-         long hInproc;
-         BYTE_BLOB *hRemote;
-         __int64 hInproc64;
-        } 	u;
-    } 	userHMETAFILE;
-
-typedef struct _remoteMETAFILEPICT
-    {
-    long mm;
-    long xExt;
-    long yExt;
-    userHMETAFILE *hMF;
-    } 	remoteMETAFILEPICT;
-
-typedef struct _userHMETAFILEPICT
-    {
-    long fContext;
-      union __MIDL_IWinTypes_0005
-        {
-         long hInproc;
-         remoteMETAFILEPICT *hRemote;
-         __int64 hInproc64;
-        } 	u;
-    } 	userHMETAFILEPICT;
-
-typedef struct _userHENHMETAFILE
-    {
-    long fContext;
-      union __MIDL_IWinTypes_0006
-        {
-         long hInproc;
-         BYTE_BLOB *hRemote;
-         __int64 hInproc64;
-        } 	u;
-    } 	userHENHMETAFILE;
-
-typedef struct _userBITMAP
-    {
-    LONG bmType;
-    LONG bmWidth;
-    LONG bmHeight;
-    LONG bmWidthBytes;
-    WORD bmPlanes;
-    WORD bmBitsPixel;
-    ULONG cbSize;
-     byte pBuffer[ 1 ];
-    } 	userBITMAP;
-
-typedef struct _userHBITMAP
-    {
-    long fContext;
-      union __MIDL_IWinTypes_0007
-        {
-         long hInproc;
-         userBITMAP *hRemote;
-         __int64 hInproc64;
-        } 	u;
-    } 	userHBITMAP;
-
-typedef struct _userHPALETTE
-    {
-    long fContext;
-      union __MIDL_IWinTypes_0008
-        {
-         long hInproc;
-         LOGPALETTE *hRemote;
-         __int64 hInproc64;
-        } 	u;
-    } 	userHPALETTE;
-
-typedef struct _RemotableHandle
-    {
-    long fContext;
-      union __MIDL_IWinTypes_0009
-        {
-         long hInproc;
-         long hRemote;
-        } 	u;
-    } 	RemotableHandle;
-
-typedef  RemotableHandle *wireHWND;
-
-typedef  RemotableHandle *wireHMENU;
-
-typedef  RemotableHandle *wireHACCEL;
-
-typedef  RemotableHandle *wireHBRUSH;
-
-typedef  RemotableHandle *wireHFONT;
-
-typedef  RemotableHandle *wireHDC;
-
-typedef  RemotableHandle *wireHICON;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef  userHBITMAP *wireHBITMAP;
-
-typedef  userHPALETTE *wireHPALETTE;
-
-typedef  userHENHMETAFILE *wireHENHMETAFILE;
-
-typedef  userHMETAFILE *wireHMETAFILE;
-
-typedef  userHMETAFILEPICT *wireHMETAFILEPICT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef  void *HMETAFILEPICT;
-
-
-
-extern RPC_IF_HANDLE IWinTypes_v0_1_c_ifspec;
-extern RPC_IF_HANDLE IWinTypes_v0_1_s_ifspec;
-
-
-
- 
-
-
-
-#pragma warning(push)
-
-#pragma warning(disable:4201)
-
-typedef double DATE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef union tagCY {
-    struct {
-
-
-
-
-        unsigned long Lo;
-        long      Hi;
-
-    };
-    LONGLONG int64;
-} CY;
-
-
-typedef CY *LPCY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagDEC {
-    USHORT wReserved;
-    union {
-        struct {
-            BYTE scale;
-            BYTE sign;
-        };
-        USHORT signscale;
-    };
-    ULONG Hi32;
-    union {
-        struct {
-
-
-
-
-            ULONG Lo32;
-            ULONG Mid32;
-
-        };
-        ULONGLONG Lo64;
-    };
-} DECIMAL;
-
-
-
-
-typedef DECIMAL *LPDECIMAL;
-
-
-
-#pragma warning(pop)
-
-
-
-
-typedef  FLAGGED_WORD_BLOB *wireBSTR;
-
-typedef  OLECHAR *BSTR;
-
-typedef BSTR *LPBSTR;
-
-
-typedef short VARIANT_BOOL;
-
-
-
-
-
-
-
-
-
-typedef boolean BOOLEAN;
-
-
-
-
-
-
-typedef struct tagBSTRBLOB
-    {
-    ULONG cbSize;
-     BYTE *pData;
-    } 	BSTRBLOB;
-
-typedef struct tagBSTRBLOB *LPBSTRBLOB;
-
-
-
-
-
-
-
-
-typedef struct tagBLOB
-    {
-    ULONG cbSize;
-     BYTE *pBlobData;
-    } 	BLOB;
-
-typedef struct tagBLOB *LPBLOB;
-
-
-typedef struct tagCLIPDATA
-    {
-    ULONG cbSize;
-    long ulClipFmt;
-     BYTE *pClipData;
-    } 	CLIPDATA;
-
-
-
-typedef unsigned short VARTYPE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-enum VARENUM
-    {	VT_EMPTY	= 0,
-	VT_NULL	= 1,
-	VT_I2	= 2,
-	VT_I4	= 3,
-	VT_R4	= 4,
-	VT_R8	= 5,
-	VT_CY	= 6,
-	VT_DATE	= 7,
-	VT_BSTR	= 8,
-	VT_DISPATCH	= 9,
-	VT_ERROR	= 10,
-	VT_BOOL	= 11,
-	VT_VARIANT	= 12,
-	VT_UNKNOWN	= 13,
-	VT_DECIMAL	= 14,
-	VT_I1	= 16,
-	VT_UI1	= 17,
-	VT_UI2	= 18,
-	VT_UI4	= 19,
-	VT_I8	= 20,
-	VT_UI8	= 21,
-	VT_INT	= 22,
-	VT_UINT	= 23,
-	VT_VOID	= 24,
-	VT_HRESULT	= 25,
-	VT_PTR	= 26,
-	VT_SAFEARRAY	= 27,
-	VT_CARRAY	= 28,
-	VT_USERDEFINED	= 29,
-	VT_LPSTR	= 30,
-	VT_LPWSTR	= 31,
-	VT_RECORD	= 36,
-	VT_INT_PTR	= 37,
-	VT_UINT_PTR	= 38,
-	VT_FILETIME	= 64,
-	VT_BLOB	= 65,
-	VT_STREAM	= 66,
-	VT_STORAGE	= 67,
-	VT_STREAMED_OBJECT	= 68,
-	VT_STORED_OBJECT	= 69,
-	VT_BLOB_OBJECT	= 70,
-	VT_CF	= 71,
-	VT_CLSID	= 72,
-	VT_VERSIONED_STREAM	= 73,
-	VT_BSTR_BLOB	= 0xfff,
-	VT_VECTOR	= 0x1000,
-	VT_ARRAY	= 0x2000,
-	VT_BYREF	= 0x4000,
-	VT_RESERVED	= 0x8000,
-	VT_ILLEGAL	= 0xffff,
-	VT_ILLEGALMASKED	= 0xfff,
-	VT_TYPEMASK	= 0xfff
-    } ;
-typedef ULONG PROPID;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagCSPLATFORM
-    {
-    DWORD dwPlatformId;
-    DWORD dwVersionHi;
-    DWORD dwVersionLo;
-    DWORD dwProcessorArch;
-    } 	CSPLATFORM;
-
-typedef struct tagQUERYCONTEXT
-    {
-    DWORD dwContext;
-    CSPLATFORM Platform;
-    LCID Locale;
-    DWORD dwVersionHi;
-    DWORD dwVersionLo;
-    } 	QUERYCONTEXT;
-
-typedef  
-enum tagTYSPEC
-    {	TYSPEC_CLSID	= 0,
-	TYSPEC_FILEEXT	= TYSPEC_CLSID + 1,
-	TYSPEC_MIMETYPE	= TYSPEC_FILEEXT + 1,
-	TYSPEC_FILENAME	= TYSPEC_MIMETYPE + 1,
-	TYSPEC_PROGID	= TYSPEC_FILENAME + 1,
-	TYSPEC_PACKAGENAME	= TYSPEC_PROGID + 1,
-	TYSPEC_OBJECTID	= TYSPEC_PACKAGENAME + 1
-    } 	TYSPEC;
-
-typedef  struct __MIDL___MIDL_itf_wtypes_0003_0001
-    {
-    DWORD tyspec;
-      union __MIDL___MIDL_itf_wtypes_0003_0005
-        {
-         CLSID clsid;
-         LPOLESTR pFileExt;
-         LPOLESTR pMimeType;
-         LPOLESTR pProgId;
-         LPOLESTR pFileName;
-         struct 
-            {
-            LPOLESTR pPackageName;
-            GUID PolicyId;
-            } 	ByName;
-         struct 
-            {
-            GUID ObjectId;
-            GUID PolicyId;
-            } 	ByObjectId;
-        } 	tagged_union;
-    } 	uCLSSPEC;
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_wtypes_0003_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_wtypes_0003_v0_0_s_ifspec;
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" const GUID  GUID_DEVINTERFACE_DISK;
-extern "C" const GUID  GUID_DEVINTERFACE_CDROM;
-extern "C" const GUID  GUID_DEVINTERFACE_PARTITION;
-extern "C" const GUID  GUID_DEVINTERFACE_TAPE;
-extern "C" const GUID  GUID_DEVINTERFACE_WRITEONCEDISK;
-extern "C" const GUID  GUID_DEVINTERFACE_VOLUME;
-extern "C" const GUID  GUID_DEVINTERFACE_MEDIUMCHANGER;
-extern "C" const GUID  GUID_DEVINTERFACE_FLOPPY;
-extern "C" const GUID  GUID_DEVINTERFACE_CDCHANGER;
-extern "C" const GUID  GUID_DEVINTERFACE_STORAGEPORT;
-extern "C" const GUID  GUID_DEVINTERFACE_COMPORT;
-extern "C" const GUID  GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _STORAGE_HOTPLUG_INFO {
-    DWORD Size; 
-    BOOLEAN MediaRemovable; 
-    BOOLEAN MediaHotplug;   
-    BOOLEAN DeviceHotplug;  
-    BOOLEAN WriteCacheEnableOverride; 
-} STORAGE_HOTPLUG_INFO, *PSTORAGE_HOTPLUG_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _STORAGE_DEVICE_NUMBER {
-
-    
-    
-    
-
-    DWORD DeviceType;
-
-    
-    
-    
-
-    DWORD       DeviceNumber;
-
-    
-    
-    
-    
-
-    DWORD       PartitionNumber;
-} STORAGE_DEVICE_NUMBER, *PSTORAGE_DEVICE_NUMBER;
-
-
-
-
-
-typedef struct _STORAGE_BUS_RESET_REQUEST {
-    BYTE  PathId;
-} STORAGE_BUS_RESET_REQUEST, *PSTORAGE_BUS_RESET_REQUEST;
-
-
-
-
-
-typedef struct STORAGE_BREAK_RESERVATION_REQUEST {
-        DWORD Length;
-        BYTE  _unused;
-    BYTE  PathId;
-    BYTE  TargetId;
-    BYTE  Lun;
-} STORAGE_BREAK_RESERVATION_REQUEST, *PSTORAGE_BREAK_RESERVATION_REQUEST;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _PREVENT_MEDIA_REMOVAL {
-    BOOLEAN PreventMediaRemoval;
-} PREVENT_MEDIA_REMOVAL, *PPREVENT_MEDIA_REMOVAL;
-
-
-
-
-
-
-
-typedef struct _CLASS_MEDIA_CHANGE_CONTEXT {
-        DWORD MediaChangeCount;
-        DWORD NewState;         
-} CLASS_MEDIA_CHANGE_CONTEXT, *PCLASS_MEDIA_CHANGE_CONTEXT;
-
-
-
-
-
-typedef struct _TAPE_STATISTICS {
-    DWORD Version;
-    DWORD Flags;
-    LARGE_INTEGER RecoveredWrites;
-    LARGE_INTEGER UnrecoveredWrites;
-    LARGE_INTEGER RecoveredReads;
-    LARGE_INTEGER UnrecoveredReads;
-    BYTE          CompressionRatioReads;
-    BYTE          CompressionRatioWrites;
-} TAPE_STATISTICS, *PTAPE_STATISTICS;
-
-
-
-
-
-
-
-
-typedef struct _TAPE_GET_STATISTICS {
-    DWORD Operation;
-} TAPE_GET_STATISTICS, *PTAPE_GET_STATISTICS;
-
-
-
-
-
-
-
-
-
-
-typedef enum _STORAGE_MEDIA_TYPE {
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-
-    DDS_4mm = 0x20,            
-    MiniQic,                   
-    Travan,                    
-    QIC,                       
-    MP_8mm,                    
-    AME_8mm,                   
-    AIT1_8mm,                  
-    DLT,                       
-    NCTP,                      
-    IBM_3480,                  
-    IBM_3490E,                 
-    IBM_Magstar_3590,          
-    IBM_Magstar_MP,            
-    STK_DATA_D3,               
-    SONY_DTF,                  
-    DV_6mm,                    
-    DMI,                       
-    SONY_D2,                   
-    CLEANER_CARTRIDGE,         
-    CD_ROM,                    
-    CD_R,                      
-    CD_RW,                     
-    DVD_ROM,                   
-    DVD_R,                     
-    DVD_RW,                    
-    MO_3_RW,                   
-    MO_5_WO,                   
-    MO_5_RW,                   
-    MO_5_LIMDOW,               
-    PC_5_WO,                   
-    PC_5_RW,                   
-    PD_5_RW,                   
-    ABL_5_WO,                  
-    PINNACLE_APEX_5_RW,        
-    SONY_12_WO,                
-    PHILIPS_12_WO,             
-    HITACHI_12_WO,             
-    CYGNET_12_WO,              
-    KODAK_14_WO,               
-    MO_NFR_525,                
-    NIKON_12_RW,               
-    IOMEGA_ZIP,                
-    IOMEGA_JAZ,                
-    SYQUEST_EZ135,             
-    SYQUEST_EZFLYER,           
-    SYQUEST_SYJET,             
-    AVATAR_F2,                 
-    MP2_8mm,                   
-    DST_S,                     
-    DST_M,                     
-    DST_L,                     
-    VXATape_1,                 
-    VXATape_2,                 
-    STK_9840,                  
-    LTO_Ultrium,               
-    LTO_Accelis,               
-    DVD_RAM,                   
-    AIT_8mm,                   
-    ADR_1,                     
-    ADR_2,
-    STK_9940,                  
-    SAIT                       
-} STORAGE_MEDIA_TYPE, *PSTORAGE_MEDIA_TYPE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _STORAGE_BUS_TYPE {
-    BusTypeUnknown = 0x00,
-    BusTypeScsi,
-    BusTypeAtapi,
-    BusTypeAta,
-    BusType1394,
-    BusTypeSsa,
-    BusTypeFibre,
-    BusTypeUsb,
-    BusTypeRAID,
-    BusTypeiScsi,
-    BusTypeSas,
-    BusTypeSata,
-    BusTypeMaxReserved = 0x7F
-} STORAGE_BUS_TYPE, *PSTORAGE_BUS_TYPE;
-
-typedef struct _DEVICE_MEDIA_INFO {
-    union {
-        struct {
-            LARGE_INTEGER Cylinders;
-            STORAGE_MEDIA_TYPE MediaType;
-            DWORD TracksPerCylinder;
-            DWORD SectorsPerTrack;
-            DWORD BytesPerSector;
-            DWORD NumberMediaSides;
-            DWORD MediaCharacteristics; 
-        } DiskInfo;
-
-        struct {
-            LARGE_INTEGER Cylinders;
-            STORAGE_MEDIA_TYPE MediaType;
-            DWORD TracksPerCylinder;
-            DWORD SectorsPerTrack;
-            DWORD BytesPerSector;
-            DWORD NumberMediaSides;
-            DWORD MediaCharacteristics; 
-        } RemovableDiskInfo;
-
-        struct {
-            STORAGE_MEDIA_TYPE MediaType;
-            DWORD   MediaCharacteristics; 
-            DWORD   CurrentBlockSize;
-            STORAGE_BUS_TYPE BusType;
-
-            
-            
-            
-
-            union {
-                struct {
-                    BYTE  MediumType;
-                    BYTE  DensityCode;
-                } ScsiInformation;
-            } BusSpecificData;
-
-        } TapeInfo;
-    } DeviceSpecific;
-} DEVICE_MEDIA_INFO, *PDEVICE_MEDIA_INFO;
-
-typedef struct _GET_MEDIA_TYPES {
-    DWORD DeviceType;              
-    DWORD MediaInfoCount;
-    DEVICE_MEDIA_INFO MediaInfo[1];
-} GET_MEDIA_TYPES, *PGET_MEDIA_TYPES;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _STORAGE_PREDICT_FAILURE
-{
-    DWORD PredictFailure;
-    BYTE  VendorSpecific[512];
-} STORAGE_PREDICT_FAILURE, *PSTORAGE_PREDICT_FAILURE;
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _MEDIA_TYPE {
-    Unknown,                
-    F5_1Pt2_512,            
-    F3_1Pt44_512,           
-    F3_2Pt88_512,           
-    F3_20Pt8_512,           
-    F3_720_512,             
-    F5_360_512,             
-    F5_320_512,             
-    F5_320_1024,            
-    F5_180_512,             
-    F5_160_512,             
-    RemovableMedia,         
-    FixedMedia,             
-    F3_120M_512,            
-    F3_640_512,             
-    F5_640_512,             
-    F5_720_512,             
-    F3_1Pt2_512,            
-    F3_1Pt23_1024,          
-    F5_1Pt23_1024,          
-    F3_128Mb_512,           
-    F3_230Mb_512,           
-    F8_256_128,             
-    F3_200Mb_512,           
-    F3_240M_512,            
-    F3_32M_512              
-} MEDIA_TYPE, *PMEDIA_TYPE;
-
-
-
-
-
-
-typedef struct _FORMAT_PARAMETERS {
-   MEDIA_TYPE MediaType;
-   DWORD StartCylinderNumber;
-   DWORD EndCylinderNumber;
-   DWORD StartHeadNumber;
-   DWORD EndHeadNumber;
-} FORMAT_PARAMETERS, *PFORMAT_PARAMETERS;
-
-
-
-
-
-
-
-
-typedef WORD   BAD_TRACK_NUMBER;
-typedef WORD   *PBAD_TRACK_NUMBER;
-
-
-
-
-
-
-typedef struct _FORMAT_EX_PARAMETERS {
-   MEDIA_TYPE MediaType;
-   DWORD StartCylinderNumber;
-   DWORD EndCylinderNumber;
-   DWORD StartHeadNumber;
-   DWORD EndHeadNumber;
-   WORD   FormatGapLength;
-   WORD   SectorsPerTrack;
-   WORD   SectorNumber[1];
-} FORMAT_EX_PARAMETERS, *PFORMAT_EX_PARAMETERS;
-
-
-
-
-
-
-
-typedef struct _DISK_GEOMETRY {
-    LARGE_INTEGER Cylinders;
-    MEDIA_TYPE MediaType;
-    DWORD TracksPerCylinder;
-    DWORD SectorsPerTrack;
-    DWORD BytesPerSector;
-} DISK_GEOMETRY, *PDISK_GEOMETRY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _PARTITION_INFORMATION {
-    LARGE_INTEGER StartingOffset;
-    LARGE_INTEGER PartitionLength;
-    DWORD HiddenSectors;
-    DWORD PartitionNumber;
-    BYTE  PartitionType;
-    BOOLEAN BootIndicator;
-    BOOLEAN RecognizedPartition;
-    BOOLEAN RewritePartition;
-} PARTITION_INFORMATION, *PPARTITION_INFORMATION;
-
-
-
-
-
-
-
-typedef struct _SET_PARTITION_INFORMATION {
-    BYTE  PartitionType;
-} SET_PARTITION_INFORMATION, *PSET_PARTITION_INFORMATION;
-
-
-
-
-
-
-typedef struct _DRIVE_LAYOUT_INFORMATION {
-    DWORD PartitionCount;
-    DWORD Signature;
-    PARTITION_INFORMATION PartitionEntry[1];
-} DRIVE_LAYOUT_INFORMATION, *PDRIVE_LAYOUT_INFORMATION;
-
-
-
-
-
-
-typedef struct _VERIFY_INFORMATION {
-    LARGE_INTEGER StartingOffset;
-    DWORD Length;
-} VERIFY_INFORMATION, *PVERIFY_INFORMATION;
-
-
-
-
-
-
-typedef struct _REASSIGN_BLOCKS {
-    WORD   Reserved;
-    WORD   Count;
-    DWORD BlockNumber[1];
-} REASSIGN_BLOCKS, *PREASSIGN_BLOCKS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,1)
-
-
-
-
-
-
-
-
-typedef struct _REASSIGN_BLOCKS_EX {
-    WORD   Reserved;
-    WORD   Count;
-    LARGE_INTEGER BlockNumber[1];
-} REASSIGN_BLOCKS_EX, *PREASSIGN_BLOCKS_EX;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _PARTITION_STYLE {
-    PARTITION_STYLE_MBR,
-    PARTITION_STYLE_GPT,
-    PARTITION_STYLE_RAW
-} PARTITION_STYLE;
-
-
-
-
-
-
-
-typedef struct _PARTITION_INFORMATION_GPT {
-    GUID PartitionType;                 
-    GUID PartitionId;                   
-    DWORD64 Attributes;                 
-    WCHAR Name [36];                    
-} PARTITION_INFORMATION_GPT, *PPARTITION_INFORMATION_GPT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _PARTITION_INFORMATION_MBR {
-    BYTE  PartitionType;
-    BOOLEAN BootIndicator;
-    BOOLEAN RecognizedPartition;
-    DWORD HiddenSectors;
-} PARTITION_INFORMATION_MBR, *PPARTITION_INFORMATION_MBR;
-
-
-
-
-
-
-
-
-
-
-typedef SET_PARTITION_INFORMATION SET_PARTITION_INFORMATION_MBR;
-typedef PARTITION_INFORMATION_GPT SET_PARTITION_INFORMATION_GPT;
-
-
-typedef struct _SET_PARTITION_INFORMATION_EX {
-    PARTITION_STYLE PartitionStyle;
-    union {
-        SET_PARTITION_INFORMATION_MBR Mbr;
-        SET_PARTITION_INFORMATION_GPT Gpt;
-    };
-} SET_PARTITION_INFORMATION_EX, *PSET_PARTITION_INFORMATION_EX;
-
-
-
-
-
-
-
-typedef struct _CREATE_DISK_GPT {
-    GUID DiskId;                    
-    DWORD MaxPartitionCount;        
-} CREATE_DISK_GPT, *PCREATE_DISK_GPT;
-
-
-
-
-
-
-typedef struct _CREATE_DISK_MBR {
-    DWORD Signature;
-} CREATE_DISK_MBR, *PCREATE_DISK_MBR;
-
-
-typedef struct _CREATE_DISK {
-    PARTITION_STYLE PartitionStyle;
-    union {
-        CREATE_DISK_MBR Mbr;
-        CREATE_DISK_GPT Gpt;
-    };
-} CREATE_DISK, *PCREATE_DISK;
-
-
-
-
-
-
-
-
-typedef struct _GET_LENGTH_INFORMATION {
-    LARGE_INTEGER   Length;
-} GET_LENGTH_INFORMATION, *PGET_LENGTH_INFORMATION;
-
-
-
-
-
-
-
-typedef struct _PARTITION_INFORMATION_EX {
-    PARTITION_STYLE PartitionStyle;
-    LARGE_INTEGER StartingOffset;
-    LARGE_INTEGER PartitionLength;
-    DWORD PartitionNumber;
-    BOOLEAN RewritePartition;
-    union {
-        PARTITION_INFORMATION_MBR Mbr;
-        PARTITION_INFORMATION_GPT Gpt;
-    };
-} PARTITION_INFORMATION_EX, *PPARTITION_INFORMATION_EX;
-
-
-
-
-
-
-typedef struct _DRIVE_LAYOUT_INFORMATION_GPT {
-    GUID DiskId;
-    LARGE_INTEGER StartingUsableOffset;
-    LARGE_INTEGER UsableLength;
-    DWORD MaxPartitionCount;
-} DRIVE_LAYOUT_INFORMATION_GPT, *PDRIVE_LAYOUT_INFORMATION_GPT;
-
-
-
-
-
-
-typedef struct _DRIVE_LAYOUT_INFORMATION_MBR {
-    DWORD Signature;
-} DRIVE_LAYOUT_INFORMATION_MBR, *PDRIVE_LAYOUT_INFORMATION_MBR;
-
-
-
-
-
-
-typedef struct _DRIVE_LAYOUT_INFORMATION_EX {
-    DWORD PartitionStyle;
-    DWORD PartitionCount;
-    union {
-        DRIVE_LAYOUT_INFORMATION_MBR Mbr;
-        DRIVE_LAYOUT_INFORMATION_GPT Gpt;
-    };
-    PARTITION_INFORMATION_EX PartitionEntry[1];
-} DRIVE_LAYOUT_INFORMATION_EX, *PDRIVE_LAYOUT_INFORMATION_EX;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _DETECTION_TYPE {
-        DetectNone,
-        DetectInt13,
-        DetectExInt13
-} DETECTION_TYPE;
-
-typedef struct _DISK_INT13_INFO {
-        WORD   DriveSelect;
-        DWORD MaxCylinders;
-        WORD   SectorsPerTrack;
-        WORD   MaxHeads;
-        WORD   NumberDrives;
-} DISK_INT13_INFO, *PDISK_INT13_INFO;
-
-typedef struct _DISK_EX_INT13_INFO {
-        WORD   ExBufferSize;
-        WORD   ExFlags;
-        DWORD ExCylinders;
-        DWORD ExHeads;
-        DWORD ExSectorsPerTrack;
-        DWORD64 ExSectorsPerDrive;
-        WORD   ExSectorSize;
-        WORD   ExReserved;
-} DISK_EX_INT13_INFO, *PDISK_EX_INT13_INFO;
-
-typedef struct _DISK_DETECTION_INFO {
-        DWORD SizeOfDetectInfo;
-        DETECTION_TYPE DetectionType;
-        union {
-                struct {
-
-                        
-                        
-                        
-                        
-
-                        DISK_INT13_INFO Int13;
-
-                        
-                        
-                        
-                        
-
-                        DISK_EX_INT13_INFO ExInt13;     
-                };
-        };
-} DISK_DETECTION_INFO, *PDISK_DETECTION_INFO;
-
-
-typedef struct _DISK_PARTITION_INFO {
-        DWORD SizeOfPartitionInfo;
-        PARTITION_STYLE PartitionStyle;                 
-        union {
-                struct {                                                        
-                        DWORD Signature;                                
-                        DWORD CheckSum;                                 
-                } Mbr;
-                struct {                                                        
-                        GUID DiskId;
-                } Gpt;
-        };
-} DISK_PARTITION_INFO, *PDISK_PARTITION_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _DISK_GEOMETRY_EX {
-        DISK_GEOMETRY Geometry;                                 
-        LARGE_INTEGER DiskSize;                                 
-        BYTE  Data[1];                                                  
-} DISK_GEOMETRY_EX, *PDISK_GEOMETRY_EX;
-
-
-
-
-
-
-
-
-
-
-typedef struct _DISK_CONTROLLER_NUMBER {
-    DWORD ControllerNumber;
-    DWORD DiskNumber;
-} DISK_CONTROLLER_NUMBER, *PDISK_CONTROLLER_NUMBER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum {
-    EqualPriority,
-    KeepPrefetchedData,
-    KeepReadData
-} DISK_CACHE_RETENTION_PRIORITY;
-
-typedef struct _DISK_CACHE_INFORMATION {
-
-    
-    
-    
-    
-    
-
-    BOOLEAN ParametersSavable;
-
-    
-    
-    
-
-    BOOLEAN ReadCacheEnabled;
-    BOOLEAN WriteCacheEnabled;
-
-    
-    
-    
-    
-    
-    
-
-    DISK_CACHE_RETENTION_PRIORITY ReadRetentionPriority;
-    DISK_CACHE_RETENTION_PRIORITY WriteRetentionPriority;
-
-    
-    
-    
-    
-
-    WORD   DisablePrefetchTransferLength;
-
-    
-    
-    
-    
-    
-
-    BOOLEAN PrefetchScalar;
-
-    
-    
-    
-    
-    
-    
-    
-
-    union {
-        struct {
-            WORD   Minimum;
-            WORD   Maximum;
-
-            
-            
-            
-            
-
-            WORD   MaximumBlocks;
-        } ScalarPrefetch;
-
-        struct {
-            WORD   Minimum;
-            WORD   Maximum;
-        } BlockPrefetch;
-    };
-
-} DISK_CACHE_INFORMATION, *PDISK_CACHE_INFORMATION;
-
-
-
-
-
-
-
-typedef struct _DISK_GROW_PARTITION {
-    DWORD PartitionNumber;
-    LARGE_INTEGER BytesToGrow;
-} DISK_GROW_PARTITION, *PDISK_GROW_PARTITION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _HISTOGRAM_BUCKET {
-    DWORD       Reads;
-    DWORD       Writes;
-} HISTOGRAM_BUCKET, *PHISTOGRAM_BUCKET;
-
-
-
-typedef struct _DISK_HISTOGRAM {
-    LARGE_INTEGER   DiskSize;
-    LARGE_INTEGER   Start;
-    LARGE_INTEGER   End;
-    LARGE_INTEGER   Average;
-    LARGE_INTEGER   AverageRead;
-    LARGE_INTEGER   AverageWrite;
-    DWORD           Granularity;
-    DWORD           Size;
-    DWORD           ReadCount;
-    DWORD           WriteCount;
-    PHISTOGRAM_BUCKET  Histogram;
-} DISK_HISTOGRAM, *PDISK_HISTOGRAM;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _DISK_PERFORMANCE {
-        LARGE_INTEGER BytesRead;
-        LARGE_INTEGER BytesWritten;
-        LARGE_INTEGER ReadTime;
-        LARGE_INTEGER WriteTime;
-        LARGE_INTEGER IdleTime;
-        DWORD ReadCount;
-        DWORD WriteCount;
-        DWORD QueueDepth;
-        DWORD SplitCount;
-        LARGE_INTEGER QueryTime;
-        DWORD   StorageDeviceNumber;
-        WCHAR   StorageManagerName[8];
-} DISK_PERFORMANCE, *PDISK_PERFORMANCE;
-
-
-
-
-
-
-
-typedef struct _DISK_RECORD {
-   LARGE_INTEGER ByteOffset;
-   LARGE_INTEGER StartTime;
-   LARGE_INTEGER EndTime;
-   PVOID VirtualAddress;
-   DWORD NumberOfBytes;
-   BYTE  DeviceNumber;
-   BOOLEAN ReadRequest;
-} DISK_RECORD, *PDISK_RECORD;
-
-
-
-
-
-
-typedef struct _DISK_LOGGING {
-    BYTE  Function;
-    PVOID BufferAddress;
-    DWORD BufferSize;
-} DISK_LOGGING, *PDISK_LOGGING;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _BIN_TYPES {
-    RequestSize,
-    RequestLocation
-} BIN_TYPES;
-
-
-
-
-
-typedef struct _BIN_RANGE {
-    LARGE_INTEGER StartValue;
-    LARGE_INTEGER Length;
-} BIN_RANGE, *PBIN_RANGE;
-
-
-
-
-
-typedef struct _PERF_BIN {
-    DWORD NumberOfBins;
-    DWORD TypeOfBin;
-    BIN_RANGE BinsRanges[1];
-} PERF_BIN, *PPERF_BIN ;
-
-
-
-
-
-typedef struct _BIN_COUNT {
-    BIN_RANGE BinRange;
-    DWORD BinCount;
-} BIN_COUNT, *PBIN_COUNT;
-
-
-
-
-
-typedef struct _BIN_RESULTS {
-    DWORD NumberOfBins;
-    BIN_COUNT BinCounts[1];
-} BIN_RESULTS, *PBIN_RESULTS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,1)
-
-
-
-
-
-
-
-
-typedef struct _GETVERSIONINPARAMS {
-        BYTE     bVersion;               
-        BYTE     bRevision;              
-        BYTE     bReserved;              
-        BYTE     bIDEDeviceMap;          
-        DWORD   fCapabilities;          
-        DWORD   dwReserved[4];          
-} GETVERSIONINPARAMS, *PGETVERSIONINPARAMS, *LPGETVERSIONINPARAMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,1)
-
-
-
-
-
-
-
-
-typedef struct _IDEREGS {
-        BYTE     bFeaturesReg;           
-        BYTE     bSectorCountReg;        
-        BYTE     bSectorNumberReg;       
-        BYTE     bCylLowReg;             
-        BYTE     bCylHighReg;            
-        BYTE     bDriveHeadReg;          
-        BYTE     bCommandReg;            
-        BYTE     bReserved;                      
-} IDEREGS, *PIDEREGS, *LPIDEREGS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                        
-                                        
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,1)
-
-
-
-
-
-
-
-
-typedef struct _SENDCMDINPARAMS {
-        DWORD   cBufferSize;            
-        IDEREGS irDriveRegs;            
-        BYTE     bDriveNumber;           
-                                                                
-        BYTE     bReserved[3];           
-        DWORD   dwReserved[4];          
-        BYTE     bBuffer[1];                     
-} SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,1)
-
-
-
-
-
-
-
-
-typedef struct _DRIVERSTATUS {
-        BYTE     bDriverError;           
-                                                                
-        BYTE     bIDEError;                      
-                                                                
-                                                                
-        BYTE     bReserved[2];           
-        DWORD   dwReserved[2];          
-} DRIVERSTATUS, *PDRIVERSTATUS, *LPDRIVERSTATUS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                        
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,1)
-
-
-
-
-
-
-
-
-typedef struct _SENDCMDOUTPARAMS {
-        DWORD                   cBufferSize;            
-        DRIVERSTATUS            DriverStatus;           
-        BYTE                    bBuffer[1];             
-} SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef  enum _ELEMENT_TYPE {
-    AllElements,        
-    ChangerTransport,   
-    ChangerSlot,        
-    ChangerIEPort,      
-    ChangerDrive,       
-    ChangerDoor,        
-    ChangerKeypad,      
-    ChangerMaxElement   
-} ELEMENT_TYPE, *PELEMENT_TYPE;
-
-typedef  struct _CHANGER_ELEMENT {
-    ELEMENT_TYPE    ElementType;
-    DWORD   ElementAddress;
-} CHANGER_ELEMENT, *PCHANGER_ELEMENT;
-
-typedef  struct _CHANGER_ELEMENT_LIST {
-    CHANGER_ELEMENT Element;
-    DWORD   NumberOfElements;
-} CHANGER_ELEMENT_LIST , *PCHANGER_ELEMENT_LIST;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                                       
-
-
-
-
-
-
-
-                                                       
-
-                                                       
-
-
-
-                                                       
-
-
-
-
-
-
-
-
-                                                       
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef  struct _GET_CHANGER_PARAMETERS {
-
-    
-    
-    
-
-    DWORD Size;
-
-    
-    
-    
-
-    WORD   NumberTransportElements;
-    WORD   NumberStorageElements;                
-    WORD   NumberCleanerSlots;                   
-    WORD   NumberIEElements;
-    WORD   NumberDataTransferElements;
-
-    
-    
-    
-
-    WORD   NumberOfDoors;
-
-    
-    
-    
-    
-
-    WORD   FirstSlotNumber;
-    WORD   FirstDriveNumber;
-    WORD   FirstTransportNumber;
-    WORD   FirstIEPortNumber;
-    WORD   FirstCleanerSlotAddress;
-
-    
-    
-    
-
-    WORD   MagazineSize;
-
-    
-    
-    
-    
-
-    DWORD DriveCleanTimeout;
-
-    
-    
-    
-
-    DWORD Features0;
-    DWORD Features1;
-
-    
-    
-    
-    
-
-    BYTE  MoveFromTransport;
-    BYTE  MoveFromSlot;
-    BYTE  MoveFromIePort;
-    BYTE  MoveFromDrive;
-
-    
-    
-    
-    
-
-    BYTE  ExchangeFromTransport;
-    BYTE  ExchangeFromSlot;
-    BYTE  ExchangeFromIePort;
-    BYTE  ExchangeFromDrive;
-
-    
-    
-    
-    
-
-    BYTE  LockUnlockCapabilities;
-
-    
-    
-    
-    
-
-    BYTE  PositionCapabilities;
-
-    
-    
-    
-
-    BYTE  Reserved1[2];
-    DWORD Reserved2[2];
-
-} GET_CHANGER_PARAMETERS, * PGET_CHANGER_PARAMETERS;
-
-
-
-
-
-
-typedef  struct _CHANGER_PRODUCT_DATA {
-
-    
-    
-    
-
-    BYTE  VendorId[8];
-
-    
-    
-    
-
-    BYTE  ProductId[16];
-
-    
-    
-    
-
-    BYTE  Revision[4];
-
-    
-    
-    
-    
-
-    BYTE  SerialNumber[32];
-
-    
-    
-    
-
-    BYTE  DeviceType;
-
-} CHANGER_PRODUCT_DATA, *PCHANGER_PRODUCT_DATA;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CHANGER_SET_ACCESS {
-
-    
-    
-    
-
-    CHANGER_ELEMENT Element;
-
-    
-    
-    
-
-    DWORD           Control;
-} CHANGER_SET_ACCESS, *PCHANGER_SET_ACCESS;
-
-
-
-
-
-
-
-
-
-
-typedef struct _CHANGER_READ_ELEMENT_STATUS {
-
-    
-    
-    
-
-    CHANGER_ELEMENT_LIST ElementList;
-
-    
-    
-    
-
-    BOOLEAN VolumeTagInfo;
-} CHANGER_READ_ELEMENT_STATUS, *PCHANGER_READ_ELEMENT_STATUS;
-
-
-
-
-
-typedef  struct _CHANGER_ELEMENT_STATUS {
-
-    
-    
-    
-
-    CHANGER_ELEMENT Element;
-
-    
-    
-    
-    
-    
-
-    CHANGER_ELEMENT SrcElementAddress;
-
-    
-    
-    
-
-    DWORD Flags;
-
-    
-    
-    
-
-    DWORD ExceptionCode;
-
-    
-    
-    
-    
-
-    BYTE  TargetId;
-
-    
-    
-    
-    
-
-    BYTE  Lun;
-    WORD   Reserved;
-
-    
-    
-    
-    
-
-    BYTE  PrimaryVolumeID[36];
-
-    
-    
-    
-    
-    
-
-    BYTE  AlternateVolumeID[36];
-
-} CHANGER_ELEMENT_STATUS, *PCHANGER_ELEMENT_STATUS;
-
-
-
-
-
-
-
-typedef  struct _CHANGER_ELEMENT_STATUS_EX {
-
-    
-    
-    
-
-    CHANGER_ELEMENT Element;
-
-    
-    
-    
-    
-    
-
-    CHANGER_ELEMENT SrcElementAddress;
-
-    
-    
-    
-
-    DWORD Flags;
-
-    
-    
-    
-
-    DWORD ExceptionCode;
-
-    
-    
-    
-    
-
-    BYTE  TargetId;
-
-    
-    
-    
-    
-
-    BYTE  Lun;
-    WORD   Reserved;
-
-    
-    
-    
-    
-
-    BYTE  PrimaryVolumeID[36];
-
-    
-    
-    
-    
-    
-
-    BYTE  AlternateVolumeID[36];
-
-    
-    
-    
-    BYTE  VendorIdentification[8];
-
-    
-    
-    
-    BYTE  ProductIdentification[16];
-
-    
-    
-    
-    BYTE  SerialNumber[32];
-
-} CHANGER_ELEMENT_STATUS_EX, *PCHANGER_ELEMENT_STATUS_EX;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _CHANGER_INITIALIZE_ELEMENT_STATUS {
-
-    
-    
-    
-
-    CHANGER_ELEMENT_LIST ElementList;
-
-    
-    
-    
-    
-
-    BOOLEAN BarCodeScan;
-} CHANGER_INITIALIZE_ELEMENT_STATUS, *PCHANGER_INITIALIZE_ELEMENT_STATUS;
-
-
-
-
-
-
-typedef struct _CHANGER_SET_POSITION {
-
-
-    
-    
-    
-
-    CHANGER_ELEMENT Transport;
-
-    
-    
-    
-
-    CHANGER_ELEMENT Destination;
-
-    
-    
-    
-
-    BOOLEAN         Flip;
-} CHANGER_SET_POSITION, *PCHANGER_SET_POSITION;
-
-
-
-
-
-
-typedef struct _CHANGER_EXCHANGE_MEDIUM {
-
-    
-    
-    
-
-    CHANGER_ELEMENT Transport;
-
-    
-    
-    
-
-    CHANGER_ELEMENT Source;
-
-    
-    
-    
-
-    CHANGER_ELEMENT Destination1;
-
-    
-    
-    
-
-    CHANGER_ELEMENT Destination2;
-
-    
-    
-    
-
-    BOOLEAN         Flip1;
-    BOOLEAN         Flip2;
-} CHANGER_EXCHANGE_MEDIUM, *PCHANGER_EXCHANGE_MEDIUM;
-
-
-
-
-
-
-typedef struct _CHANGER_MOVE_MEDIUM {
-
-    
-    
-    
-
-    CHANGER_ELEMENT Transport;
-
-    
-    
-    
-
-    CHANGER_ELEMENT Source;
-
-    
-    
-    
-
-    CHANGER_ELEMENT Destination;
-
-    
-    
-    
-
-    BOOLEAN         Flip;
-} CHANGER_MOVE_MEDIUM, *PCHANGER_MOVE_MEDIUM;
-
-
-
-
-
-
-
-
-
-
-
-typedef  struct _CHANGER_SEND_VOLUME_TAG_INFORMATION {
-
-    
-    
-    
-
-    CHANGER_ELEMENT StartingElement;
-
-    
-    
-    
-
-    DWORD ActionCode;
-
-    
-    
-    
-
-    BYTE  VolumeIDTemplate[40];
-} CHANGER_SEND_VOLUME_TAG_INFORMATION, *PCHANGER_SEND_VOLUME_TAG_INFORMATION;
-
-
-
-
-
-
-typedef struct _READ_ELEMENT_ADDRESS_INFO {
-
-    
-    
-    
-
-    DWORD NumberOfElements;
-
-    
-    
-    
-    
-
-    CHANGER_ELEMENT_STATUS ElementStatus[1];
-} READ_ELEMENT_ADDRESS_INFO, *PREAD_ELEMENT_ADDRESS_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _CHANGER_DEVICE_PROBLEM_TYPE {
-   DeviceProblemNone,
-   DeviceProblemHardware,
-   DeviceProblemCHMError,
-   DeviceProblemDoorOpen,
-   DeviceProblemCalibrationError,
-   DeviceProblemTargetFailure,
-   DeviceProblemCHMMoveError,
-   DeviceProblemCHMZeroError,
-   DeviceProblemCartridgeInsertError,
-   DeviceProblemPositionError,
-   DeviceProblemSensorError,
-   DeviceProblemCartridgeEjectError,
-   DeviceProblemGripperError,
-   DeviceProblemDriveError
-} CHANGER_DEVICE_PROBLEM_TYPE, *PCHANGER_DEVICE_PROBLEM_TYPE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _PATHNAME_BUFFER {
-
-    DWORD PathNameLength;
-    WCHAR Name[1];
-
-} PATHNAME_BUFFER, *PPATHNAME_BUFFER;
-
-
-
-
-
-typedef struct _FSCTL_QUERY_FAT_BPB_BUFFER {
-
-    BYTE  First0x24BytesOfBootSector[0x24];
-
-} FSCTL_QUERY_FAT_BPB_BUFFER, *PFSCTL_QUERY_FAT_BPB_BUFFER;
-
-
-
-
-
-
-
-
-
-typedef struct {
-
-    LARGE_INTEGER VolumeSerialNumber;
-    LARGE_INTEGER NumberSectors;
-    LARGE_INTEGER TotalClusters;
-    LARGE_INTEGER FreeClusters;
-    LARGE_INTEGER TotalReserved;
-    DWORD BytesPerSector;
-    DWORD BytesPerCluster;
-    DWORD BytesPerFileRecordSegment;
-    DWORD ClustersPerFileRecordSegment;
-    LARGE_INTEGER MftValidDataLength;
-    LARGE_INTEGER MftStartLcn;
-    LARGE_INTEGER Mft2StartLcn;
-    LARGE_INTEGER MftZoneStart;
-    LARGE_INTEGER MftZoneEnd;
-
-} NTFS_VOLUME_DATA_BUFFER, *PNTFS_VOLUME_DATA_BUFFER;
-
-typedef struct {
-
-    DWORD ByteCount;
-
-    WORD   MajorVersion;
-    WORD   MinorVersion;
-
-} NTFS_EXTENDED_VOLUME_DATA, *PNTFS_EXTENDED_VOLUME_DATA;
-
-
-
-
-
-
-
-typedef struct {
-
-    LARGE_INTEGER StartingLcn;
-
-} STARTING_LCN_INPUT_BUFFER, *PSTARTING_LCN_INPUT_BUFFER;
-
-typedef struct {
-
-    LARGE_INTEGER StartingLcn;
-    LARGE_INTEGER BitmapSize;
-    BYTE  Buffer[1];
-
-} VOLUME_BITMAP_BUFFER, *PVOLUME_BITMAP_BUFFER;
-
-
-
-
-
-
-
-typedef struct {
-
-    LARGE_INTEGER StartingVcn;
-
-} STARTING_VCN_INPUT_BUFFER, *PSTARTING_VCN_INPUT_BUFFER;
-
-typedef struct RETRIEVAL_POINTERS_BUFFER {
-
-    DWORD ExtentCount;
-    LARGE_INTEGER StartingVcn;
-    struct {
-        LARGE_INTEGER NextVcn;
-        LARGE_INTEGER Lcn;
-    } Extents[1];
-
-} RETRIEVAL_POINTERS_BUFFER, *PRETRIEVAL_POINTERS_BUFFER;
-
-
-
-
-
-
-
-typedef struct {
-
-    LARGE_INTEGER FileReferenceNumber;
-
-} NTFS_FILE_RECORD_INPUT_BUFFER, *PNTFS_FILE_RECORD_INPUT_BUFFER;
-
-typedef struct {
-
-    LARGE_INTEGER FileReferenceNumber;
-    DWORD FileRecordLength;
-    BYTE  FileRecordBuffer[1];
-
-} NTFS_FILE_RECORD_OUTPUT_BUFFER, *PNTFS_FILE_RECORD_OUTPUT_BUFFER;
-
-
-
-
-
-
-
-typedef struct {
-
-    HANDLE FileHandle;
-    LARGE_INTEGER StartingVcn;
-    LARGE_INTEGER StartingLcn;
-    DWORD ClusterCount;
-
-} MOVE_FILE_DATA, *PMOVE_FILE_DATA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-    DWORD Restart;
-    SID Sid;
-} FIND_BY_SID_DATA, *PFIND_BY_SID_DATA;
-
-typedef struct {
-    DWORD NextEntryOffset;
-    DWORD FileIndex;
-    DWORD FileNameLength;
-    WCHAR FileName[1];
-} FIND_BY_SID_OUTPUT, *PFIND_BY_SID_OUTPUT;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-
-    DWORDLONG StartFileReferenceNumber;
-    USN LowUsn;
-    USN HighUsn;
-
-} MFT_ENUM_DATA, *PMFT_ENUM_DATA;
-
-
-
-
-
-typedef struct {
-
-    DWORDLONG MaximumSize;
-    DWORDLONG AllocationDelta;
-
-} CREATE_USN_JOURNAL_DATA, *PCREATE_USN_JOURNAL_DATA;
-
-
-
-
-
-typedef struct {
-
-    USN StartUsn;
-    DWORD ReasonMask;
-    DWORD ReturnOnlyOnClose;
-    DWORDLONG Timeout;
-    DWORDLONG BytesToWaitFor;
-    DWORDLONG UsnJournalID;
-
-} READ_USN_JOURNAL_DATA, *PREAD_USN_JOURNAL_DATA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-
-    DWORD RecordLength;
-    WORD   MajorVersion;
-    WORD   MinorVersion;
-    DWORDLONG FileReferenceNumber;
-    DWORDLONG ParentFileReferenceNumber;
-    USN Usn;
-    LARGE_INTEGER TimeStamp;
-    DWORD Reason;
-    DWORD SourceInfo;
-    DWORD SecurityId;
-    DWORD FileAttributes;
-    WORD   FileNameLength;
-    WORD   FileNameOffset;
-    WCHAR FileName[1];
-
-} USN_RECORD, *PUSN_RECORD;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-
-    DWORDLONG UsnJournalID;
-    USN FirstUsn;
-    USN NextUsn;
-    USN LowestValidUsn;
-    USN MaxUsn;
-    DWORDLONG MaximumSize;
-    DWORDLONG AllocationDelta;
-
-} USN_JOURNAL_DATA, *PUSN_JOURNAL_DATA;
-
-
-
-
-
-typedef struct {
-
-    DWORDLONG UsnJournalID;
-    DWORD DeleteFlags;
-
-} DELETE_USN_JOURNAL_DATA, *PDELETE_USN_JOURNAL_DATA;
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-
-    DWORD UsnSourceInfo;
-    HANDLE VolumeHandle;
-    DWORD HandleInfo;
-
-} MARK_HANDLE_INFO, *PMARK_HANDLE_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-
-    ACCESS_MASK DesiredAccess;
-    DWORD SecurityIds[1];
-
-} BULK_SECURITY_TEST_DATA, *PBULK_SECURITY_TEST_DATA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _FILE_PREFETCH {
-    DWORD Type;
-    DWORD Count;
-    DWORDLONG Prefetch[1];
-} FILE_PREFETCH, *PFILE_PREFETCH;
-
-
-
-
-
-
-
-
-typedef struct _FILESYSTEM_STATISTICS {
-
-    WORD   FileSystemType;
-    WORD   Version;                     
-
-    DWORD SizeOfCompleteStructure;      
-
-    DWORD UserFileReads;
-    DWORD UserFileReadBytes;
-    DWORD UserDiskReads;
-    DWORD UserFileWrites;
-    DWORD UserFileWriteBytes;
-    DWORD UserDiskWrites;
-
-    DWORD MetaDataReads;
-    DWORD MetaDataReadBytes;
-    DWORD MetaDataDiskReads;
-    DWORD MetaDataWrites;
-    DWORD MetaDataWriteBytes;
-    DWORD MetaDataDiskWrites;
-
-    
-    
-    
-
-} FILESYSTEM_STATISTICS, *PFILESYSTEM_STATISTICS;
-
-
-
-
-
-
-
-
-
-
-typedef struct _FAT_STATISTICS {
-    DWORD CreateHits;
-    DWORD SuccessfulCreates;
-    DWORD FailedCreates;
-
-    DWORD NonCachedReads;
-    DWORD NonCachedReadBytes;
-    DWORD NonCachedWrites;
-    DWORD NonCachedWriteBytes;
-
-    DWORD NonCachedDiskReads;
-    DWORD NonCachedDiskWrites;
-} FAT_STATISTICS, *PFAT_STATISTICS;
-
-typedef struct _NTFS_STATISTICS {
-
-    DWORD LogFileFullExceptions;
-    DWORD OtherExceptions;
-
-    
-    
-    
-
-    DWORD MftReads;
-    DWORD MftReadBytes;
-    DWORD MftWrites;
-    DWORD MftWriteBytes;
-    struct {
-        WORD   Write;
-        WORD   Create;
-        WORD   SetInfo;
-        WORD   Flush;
-    } MftWritesUserLevel;
-
-    WORD   MftWritesFlushForLogFileFull;
-    WORD   MftWritesLazyWriter;
-    WORD   MftWritesUserRequest;
-
-    DWORD Mft2Writes;
-    DWORD Mft2WriteBytes;
-    struct {
-        WORD   Write;
-        WORD   Create;
-        WORD   SetInfo;
-        WORD   Flush;
-    } Mft2WritesUserLevel;
-
-    WORD   Mft2WritesFlushForLogFileFull;
-    WORD   Mft2WritesLazyWriter;
-    WORD   Mft2WritesUserRequest;
-
-    DWORD RootIndexReads;
-    DWORD RootIndexReadBytes;
-    DWORD RootIndexWrites;
-    DWORD RootIndexWriteBytes;
-
-    DWORD BitmapReads;
-    DWORD BitmapReadBytes;
-    DWORD BitmapWrites;
-    DWORD BitmapWriteBytes;
-
-    WORD   BitmapWritesFlushForLogFileFull;
-    WORD   BitmapWritesLazyWriter;
-    WORD   BitmapWritesUserRequest;
-
-    struct {
-        WORD   Write;
-        WORD   Create;
-        WORD   SetInfo;
-    } BitmapWritesUserLevel;
-
-    DWORD MftBitmapReads;
-    DWORD MftBitmapReadBytes;
-    DWORD MftBitmapWrites;
-    DWORD MftBitmapWriteBytes;
-
-    WORD   MftBitmapWritesFlushForLogFileFull;
-    WORD   MftBitmapWritesLazyWriter;
-    WORD   MftBitmapWritesUserRequest;
-
-    struct {
-        WORD   Write;
-        WORD   Create;
-        WORD   SetInfo;
-        WORD   Flush;
-    } MftBitmapWritesUserLevel;
-
-    DWORD UserIndexReads;
-    DWORD UserIndexReadBytes;
-    DWORD UserIndexWrites;
-    DWORD UserIndexWriteBytes;
-
-    
-    
-    
-
-    DWORD LogFileReads;
-    DWORD LogFileReadBytes;
-    DWORD LogFileWrites;
-    DWORD LogFileWriteBytes;
-
-    struct {
-        DWORD Calls;                
-        DWORD Clusters;             
-        DWORD Hints;                
-
-        DWORD RunsReturned;         
-
-        DWORD HintsHonored;         
-        DWORD HintsClusters;        
-        DWORD Cache;                
-        DWORD CacheClusters;        
-        DWORD CacheMiss;            
-        DWORD CacheMissClusters;    
-    } Allocate;
-
-} NTFS_STATISTICS, *PNTFS_STATISTICS;
-
-
-
-
-
-
-
-#pragma warning(push)
-
-#pragma warning(disable:4201)       
-
-typedef struct _FILE_OBJECTID_BUFFER {
-
-    
-    
-    
-
-    BYTE  ObjectId[16];
-
-    
-    
-    
-    
-
-    union {
-        struct {
-            BYTE  BirthVolumeId[16];
-            BYTE  BirthObjectId[16];
-            BYTE  DomainId[16];
-        } ;
-        BYTE  ExtendedInfo[48];
-    };
-
-} FILE_OBJECTID_BUFFER, *PFILE_OBJECTID_BUFFER;
-
-
-#pragma warning(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _FILE_SET_SPARSE_BUFFER {
-    BOOLEAN SetSparse;
-} FILE_SET_SPARSE_BUFFER, *PFILE_SET_SPARSE_BUFFER;
-
-
-
-
-
-
-
-
-
-
-typedef struct _FILE_ZERO_DATA_INFORMATION {
-
-    LARGE_INTEGER FileOffset;
-    LARGE_INTEGER BeyondFinalZero;
-
-} FILE_ZERO_DATA_INFORMATION, *PFILE_ZERO_DATA_INFORMATION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _FILE_ALLOCATED_RANGE_BUFFER {
-
-    LARGE_INTEGER FileOffset;
-    LARGE_INTEGER Length;
-
-} FILE_ALLOCATED_RANGE_BUFFER, *PFILE_ALLOCATED_RANGE_BUFFER;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _ENCRYPTION_BUFFER {
-
-    DWORD EncryptionOperation;
-    BYTE  Private[1];
-
-} ENCRYPTION_BUFFER, *PENCRYPTION_BUFFER;
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _DECRYPTION_STATUS_BUFFER {
-
-    BOOLEAN NoEncryptedStreams;
-
-} DECRYPTION_STATUS_BUFFER, *PDECRYPTION_STATUS_BUFFER;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _REQUEST_RAW_ENCRYPTED_DATA {
-
-    
-    
-    
-    
-    
-    
-
-    LONGLONG FileOffset;
-    DWORD Length;
-
-} REQUEST_RAW_ENCRYPTED_DATA, *PREQUEST_RAW_ENCRYPTED_DATA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _ENCRYPTED_DATA_INFO {
-
-    
-    
-    
-    
-    
-    
-
-    DWORDLONG StartingFileOffset;
-
-    
-    
-    
-    
-    
-    
-    
-
-    DWORD OutputBufferOffset;
-
-    
-    
-    
-    
-    
-    
-    
-    
-
-    DWORD BytesWithinFileSize;
-
-    
-    
-    
-    
-    
-    
-    
-    
-
-    DWORD BytesWithinValidDataLength;
-
-    
-    
-    
-    
-    
-    
-
-    WORD   CompressionFormat;
-
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-
-    BYTE  DataUnitShift;
-    BYTE  ChunkShift;
-    BYTE  ClusterShift;
-
-    
-    
-    
-
-    BYTE  EncryptionFormat;
-
-    
-    
-    
-    
-
-    WORD   NumberOfDataBlocks;
-
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-
-    DWORD DataBlockSize[1];
-
-} ENCRYPTED_DATA_INFO;
-typedef ENCRYPTED_DATA_INFO *PENCRYPTED_DATA_INFO;
-
-
-
-
-
-
-
-
-
-
-typedef struct _PLEX_READ_DATA_REQUEST {
-
-    
-    
-    
-    
-    
-    
-    
-    
-    
-
-    LARGE_INTEGER ByteOffset;
-    DWORD ByteLength;
-    DWORD PlexNumber;
-
-} PLEX_READ_DATA_REQUEST, *PPLEX_READ_DATA_REQUEST;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _SI_COPYFILE {
-    DWORD SourceFileNameLength;
-    DWORD DestinationFileNameLength;
-    DWORD Flags;
-    WCHAR FileNameBuffer[1];
-} SI_COPYFILE, *PSI_COPYFILE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _DISK_EXTENT {
-    DWORD           DiskNumber;
-    LARGE_INTEGER   StartingOffset;
-    LARGE_INTEGER   ExtentLength;
-} DISK_EXTENT, *PDISK_EXTENT;
-
-
-
-
-
-typedef struct _VOLUME_DISK_EXTENTS {
-    DWORD       NumberOfDiskExtents;
-    DISK_EXTENT Extents[1];
-} VOLUME_DISK_EXTENTS, *PVOLUME_DISK_EXTENTS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-extern "C" {
-
-
-
-typedef DWORD ULONG;
-typedef WORD UWORD;
-typedef BYTE UCHAR;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                              
-
-                              
-
-                              
-                              
-
-                              
-                              
-
-                              
-                              
-                              
-
-                              
-
-                              
-                              
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _SCARD_IO_REQUEST{
-    DWORD dwProtocol;   
-    DWORD cbPciLength;  
-} SCARD_IO_REQUEST, *PSCARD_IO_REQUEST, *LPSCARD_IO_REQUEST;
-typedef const SCARD_IO_REQUEST *LPCSCARD_IO_REQUEST;
-
-
-
-
-
-
-typedef struct {
-    BYTE
-        bCla,   
-        bIns,   
-        bP1,
-        bP2,    
-        bP3;    
-} SCARD_T0_COMMAND, *LPSCARD_T0_COMMAND;
-
-typedef struct {
-    SCARD_IO_REQUEST ioRequest;
-    BYTE
-        bSw1,
-        bSw2;           
-    union
-    {
-        SCARD_T0_COMMAND CmdBytes;
-        BYTE rgbHeader[5];
-    };
-} SCARD_T0_REQUEST;
-
-typedef SCARD_T0_REQUEST *PSCARD_T0_REQUEST, *LPSCARD_T0_REQUEST;
-
-
-
-
-
-
-typedef struct {
-    SCARD_IO_REQUEST ioRequest;
-} SCARD_T1_REQUEST;
-typedef SCARD_T1_REQUEST *PSCARD_T1_REQUEST, *LPSCARD_T1_REQUEST;
-
-
-
-
-
-
-
-
-
-                                                
-
-                                                
-
-                                                
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-typedef const BYTE *LPCBYTE;
-
-
-
-typedef const void *LPCVOID;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) extern const SCARD_IO_REQUEST
-    g_rgSCardT0Pci,
-    g_rgSCardT1Pci,
-    g_rgSCardRawPci;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef ULONG_PTR SCARDCONTEXT;
-typedef SCARDCONTEXT *PSCARDCONTEXT, *LPSCARDCONTEXT;
-
-typedef ULONG_PTR SCARDHANDLE;
-typedef SCARDHANDLE *PSCARDHANDLE, *LPSCARDHANDLE;
-
-
-
-
-                                
-                                
-
-                                
-                                
-                                
-                                
-
-                                
-                                
-                                
-                                
-
-extern  LONG __stdcall
-SCardEstablishContext(
-      DWORD dwScope,
-      LPCVOID pvReserved1,
-      LPCVOID pvReserved2,
-     LPSCARDCONTEXT phContext);
-
-extern  LONG __stdcall
-SCardReleaseContext(
-          SCARDCONTEXT hContext);
-
-extern  LONG __stdcall
-SCardIsValidContext(
-          SCARDCONTEXT hContext);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardListReaderGroupsA(
-          SCARDCONTEXT hContext,
-         LPSTR mszGroups,
-       LPDWORD pcchGroups);
-extern  LONG __stdcall
-SCardListReaderGroupsW(
-          SCARDCONTEXT hContext,
-         LPWSTR mszGroups,
-       LPDWORD pcchGroups);
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardListReadersA(
-          SCARDCONTEXT hContext,
-          LPCSTR mszGroups,
-         LPSTR mszReaders,
-       LPDWORD pcchReaders);
-extern  LONG __stdcall
-SCardListReadersW(
-          SCARDCONTEXT hContext,
-          LPCWSTR mszGroups,
-         LPWSTR mszReaders,
-       LPDWORD pcchReaders);
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardListCardsA(
-          SCARDCONTEXT hContext,
-          LPCBYTE pbAtr,
-          LPCGUID rgquidInterfaces,
-          DWORD cguidInterfaceCount,
-         LPSTR mszCards,
-       LPDWORD pcchCards);
-extern  LONG __stdcall
-SCardListCardsW(
-          SCARDCONTEXT hContext,
-          LPCBYTE pbAtr,
-          LPCGUID rgquidInterfaces,
-          DWORD cguidInterfaceCount,
-         LPWSTR mszCards,
-       LPDWORD pcchCards);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardListInterfacesA(
-          SCARDCONTEXT hContext,
-          LPCSTR szCard,
-         LPGUID pguidInterfaces,
-       LPDWORD pcguidInterfaces);
-extern  LONG __stdcall
-SCardListInterfacesW(
-          SCARDCONTEXT hContext,
-          LPCWSTR szCard,
-         LPGUID pguidInterfaces,
-       LPDWORD pcguidInterfaces);
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardGetProviderIdA(
-          SCARDCONTEXT hContext,
-          LPCSTR szCard,
-         LPGUID pguidProviderId);
-extern  LONG __stdcall
-SCardGetProviderIdW(
-          SCARDCONTEXT hContext,
-          LPCWSTR szCard,
-         LPGUID pguidProviderId);
-
-
-
-
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardGetCardTypeProviderNameA(
-     SCARDCONTEXT hContext,
-     LPCSTR szCardName,
-     DWORD dwProviderId,
-     LPSTR szProvider,
-      LPDWORD pcchProvider);
-extern  LONG __stdcall
-SCardGetCardTypeProviderNameW(
-     SCARDCONTEXT hContext,
-     LPCWSTR szCardName,
-     DWORD dwProviderId,
-     LPWSTR szProvider,
-      LPDWORD pcchProvider);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardIntroduceReaderGroupA(
-     SCARDCONTEXT hContext,
-     LPCSTR szGroupName);
-extern  LONG __stdcall
-SCardIntroduceReaderGroupW(
-     SCARDCONTEXT hContext,
-     LPCWSTR szGroupName);
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardForgetReaderGroupA(
-     SCARDCONTEXT hContext,
-     LPCSTR szGroupName);
-extern  LONG __stdcall
-SCardForgetReaderGroupW(
-     SCARDCONTEXT hContext,
-     LPCWSTR szGroupName);
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardIntroduceReaderA(
-     SCARDCONTEXT hContext,
-     LPCSTR szReaderName,
-     LPCSTR szDeviceName);
-extern  LONG __stdcall
-SCardIntroduceReaderW(
-     SCARDCONTEXT hContext,
-     LPCWSTR szReaderName,
-     LPCWSTR szDeviceName);
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardForgetReaderA(
-     SCARDCONTEXT hContext,
-     LPCSTR szReaderName);
-extern  LONG __stdcall
-SCardForgetReaderW(
-     SCARDCONTEXT hContext,
-     LPCWSTR szReaderName);
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardAddReaderToGroupA(
-     SCARDCONTEXT hContext,
-     LPCSTR szReaderName,
-     LPCSTR szGroupName);
-extern  LONG __stdcall
-SCardAddReaderToGroupW(
-     SCARDCONTEXT hContext,
-     LPCWSTR szReaderName,
-     LPCWSTR szGroupName);
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardRemoveReaderFromGroupA(
-     SCARDCONTEXT hContext,
-     LPCSTR szReaderName,
-     LPCSTR szGroupName);
-extern  LONG __stdcall
-SCardRemoveReaderFromGroupW(
-     SCARDCONTEXT hContext,
-     LPCWSTR szReaderName,
-     LPCWSTR szGroupName);
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardIntroduceCardTypeA(
-     SCARDCONTEXT hContext,
-     LPCSTR szCardName,
-     LPCGUID pguidPrimaryProvider,
-     LPCGUID rgguidInterfaces,
-     DWORD dwInterfaceCount,
-     LPCBYTE pbAtr,
-     LPCBYTE pbAtrMask,
-     DWORD cbAtrLen);
-extern  LONG __stdcall
-SCardIntroduceCardTypeW(
-     SCARDCONTEXT hContext,
-     LPCWSTR szCardName,
-     LPCGUID pguidPrimaryProvider,
-     LPCGUID rgguidInterfaces,
-     DWORD dwInterfaceCount,
-     LPCBYTE pbAtr,
-     LPCBYTE pbAtrMask,
-     DWORD cbAtrLen);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardSetCardTypeProviderNameA(
-     SCARDCONTEXT hContext,
-     LPCSTR szCardName,
-     DWORD dwProviderId,
-     LPCSTR szProvider);
-extern  LONG __stdcall
-SCardSetCardTypeProviderNameW(
-     SCARDCONTEXT hContext,
-     LPCWSTR szCardName,
-     DWORD dwProviderId,
-     LPCWSTR szProvider);
-
-
-
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardForgetCardTypeA(
-     SCARDCONTEXT hContext,
-     LPCSTR szCardName);
-extern  LONG __stdcall
-SCardForgetCardTypeW(
-     SCARDCONTEXT hContext,
-     LPCWSTR szCardName);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardFreeMemory(
-     SCARDCONTEXT hContext,
-     LPCVOID pvMem);
-
-extern  HANDLE __stdcall
-SCardAccessStartedEvent(void);
-
-extern  void __stdcall
-SCardReleaseStartedEvent(void);
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-    LPCSTR      szReader;       
-    LPVOID      pvUserData;     
-    DWORD       dwCurrentState; 
-    DWORD       dwEventState;   
-    DWORD       cbAtr;          
-    BYTE        rgbAtr[36];     
-} SCARD_READERSTATEA, *PSCARD_READERSTATEA, *LPSCARD_READERSTATEA;
-typedef struct {
-    LPCWSTR     szReader;       
-    LPVOID      pvUserData;     
-    DWORD       dwCurrentState; 
-    DWORD       dwEventState;   
-    DWORD       cbAtr;          
-    BYTE        rgbAtr[36];     
-} SCARD_READERSTATEW, *PSCARD_READERSTATEW, *LPSCARD_READERSTATEW;
-
-typedef SCARD_READERSTATEW SCARD_READERSTATE;
-typedef PSCARD_READERSTATEW PSCARD_READERSTATE;
-typedef LPSCARD_READERSTATEW LPSCARD_READERSTATE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                            
-                                            
-                                            
-                                            
-                                            
-                                            
-
-                                            
-                                            
-
-                                            
-                                            
-                                            
-                                            
-                                            
-                                            
-                                            
-
-                                            
-                                            
-                                            
-                                            
-                                            
-
-                                            
-                                            
-                                            
-                                            
-
-                                            
-                                            
-                                            
-
-                                            
-
-                                            
-                                            
-                                            
-                                            
-                                            
-                                            
-
-                                            
-                                            
-                                            
-                                            
-                                            
-
-                                            
-                                            
-                                            
-                                            
-                                            
-                                            
-
-                                            
-                                            
-                                            
-
-                                            
-
-extern  LONG __stdcall
-SCardLocateCardsA(
-          SCARDCONTEXT hContext,
-          LPCSTR mszCards,
-       LPSCARD_READERSTATEA rgReaderStates,
-          DWORD cReaders);
-extern  LONG __stdcall
-SCardLocateCardsW(
-          SCARDCONTEXT hContext,
-          LPCWSTR mszCards,
-       LPSCARD_READERSTATEW rgReaderStates,
-          DWORD cReaders);
-
-
-
-
-
-
-typedef struct _SCARD_ATRMASK {
-    DWORD       cbAtr;          
-    BYTE        rgbAtr[36];     
-    BYTE        rgbMask[36];    
-} SCARD_ATRMASK, *PSCARD_ATRMASK, *LPSCARD_ATRMASK;
-
-
-extern  LONG __stdcall
-SCardLocateCardsByATRA(
-          SCARDCONTEXT hContext,
-          LPSCARD_ATRMASK rgAtrMasks,
-          DWORD cAtrs,
-       LPSCARD_READERSTATEA rgReaderStates,
-          DWORD cReaders);
-extern  LONG __stdcall
-SCardLocateCardsByATRW(
-          SCARDCONTEXT hContext,
-          LPSCARD_ATRMASK rgAtrMasks,
-          DWORD cAtrs,
-       LPSCARD_READERSTATEW rgReaderStates,
-          DWORD cReaders);
-
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardGetStatusChangeA(
-          SCARDCONTEXT hContext,
-          DWORD dwTimeout,
-       LPSCARD_READERSTATEA rgReaderStates,
-          DWORD cReaders);
-extern  LONG __stdcall
-SCardGetStatusChangeW(
-          SCARDCONTEXT hContext,
-          DWORD dwTimeout,
-       LPSCARD_READERSTATEW rgReaderStates,
-          DWORD cReaders);
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardCancel(
-          SCARDCONTEXT hContext);
-
-
-
-
-
-
-
-
-
-
-
-                                
-
-                                
-
-                                
-                                
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardConnectA(
-          SCARDCONTEXT hContext,
-          LPCSTR szReader,
-          DWORD dwShareMode,
-          DWORD dwPreferredProtocols,
-         LPSCARDHANDLE phCard,
-         LPDWORD pdwActiveProtocol);
-extern  LONG __stdcall
-SCardConnectW(
-          SCARDCONTEXT hContext,
-          LPCWSTR szReader,
-          DWORD dwShareMode,
-          DWORD dwPreferredProtocols,
-         LPSCARDHANDLE phCard,
-         LPDWORD pdwActiveProtocol);
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardReconnect(
-          SCARDHANDLE hCard,
-          DWORD dwShareMode,
-          DWORD dwPreferredProtocols,
-          DWORD dwInitialization,
-         LPDWORD pdwActiveProtocol);
-
-extern  LONG __stdcall
-SCardDisconnect(
-          SCARDHANDLE hCard,
-          DWORD dwDisposition);
-
-extern  LONG __stdcall
-SCardBeginTransaction(
-          SCARDHANDLE hCard);
-
-extern  LONG __stdcall
-SCardEndTransaction(
-          SCARDHANDLE hCard,
-          DWORD dwDisposition);
-
-extern  LONG __stdcall
-SCardCancelTransaction(
-          SCARDHANDLE hCard);
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardState(
-     SCARDHANDLE hCard,
-     LPDWORD pdwState,
-     LPDWORD pdwProtocol,
-     LPBYTE pbAtr,
-      LPDWORD pcbAtrLen);
-
-
-
-
-
-extern  LONG __stdcall
-SCardStatusA(
-     SCARDHANDLE hCard,
-     LPSTR szReaderName,
-      LPDWORD pcchReaderLen,
-     LPDWORD pdwState,
-     LPDWORD pdwProtocol,
-     LPBYTE pbAtr,
-      LPDWORD pcbAtrLen);
-extern  LONG __stdcall
-SCardStatusW(
-     SCARDHANDLE hCard,
-     LPWSTR szReaderName,
-      LPDWORD pcchReaderLen,
-     LPDWORD pdwState,
-     LPDWORD pdwProtocol,
-     LPBYTE pbAtr,
-      LPDWORD pcbAtrLen);
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardTransmit(
-     SCARDHANDLE hCard,
-     LPCSCARD_IO_REQUEST pioSendPci,
-     LPCBYTE pbSendBuffer,
-     DWORD cbSendLength,
-      LPSCARD_IO_REQUEST pioRecvPci,
-     LPBYTE pbRecvBuffer,
-      LPDWORD pcbRecvLength);
-
-
-
-
-
-
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardControl(
-          SCARDHANDLE hCard,
-          DWORD dwControlCode,
-          LPCVOID lpInBuffer,
-          DWORD nInBufferSize,
-         LPVOID lpOutBuffer,
-          DWORD nOutBufferSize,
-         LPDWORD lpBytesReturned);
-
-extern  LONG __stdcall
-SCardGetAttrib(
-     SCARDHANDLE hCard,
-     DWORD dwAttrId,
-     LPBYTE pbAttr,
-      LPDWORD pcbAttrLen);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardSetAttrib(
-     SCARDHANDLE hCard,
-     DWORD dwAttrId,
-     LPCBYTE pbAttr,
-     DWORD cbAttrLen);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef SCARDHANDLE (__stdcall *LPOCNCONNPROCA) ( SCARDCONTEXT,  LPSTR,  LPSTR,  PVOID);
-typedef SCARDHANDLE (__stdcall *LPOCNCONNPROCW) ( SCARDCONTEXT,  LPWSTR,  LPWSTR,  PVOID);
-
-
-
-
-
-typedef BOOL (__stdcall *LPOCNCHKPROC) ( SCARDCONTEXT,  SCARDHANDLE,  PVOID);
-typedef void (__stdcall *LPOCNDSCPROC) ( SCARDCONTEXT,  SCARDHANDLE,  PVOID);
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-    DWORD           dwStructSize;
-    LPSTR           lpstrGroupNames;        
-    DWORD           nMaxGroupNames;         
-                                            
-    LPCGUID         rgguidInterfaces;       
-    DWORD           cguidInterfaces;        
-    LPSTR           lpstrCardNames;         
-    DWORD           nMaxCardNames;          
-    LPOCNCHKPROC    lpfnCheck;              
-    LPOCNCONNPROCA  lpfnConnect;            
-    LPOCNDSCPROC    lpfnDisconnect;         
-    LPVOID          pvUserData;             
-    DWORD           dwShareMode;            
-    DWORD           dwPreferredProtocols;   
-} OPENCARD_SEARCH_CRITERIAA, *POPENCARD_SEARCH_CRITERIAA, *LPOPENCARD_SEARCH_CRITERIAA;
-typedef struct {
-    DWORD           dwStructSize;
-    LPWSTR          lpstrGroupNames;        
-    DWORD           nMaxGroupNames;         
-                                            
-    LPCGUID         rgguidInterfaces;       
-    DWORD           cguidInterfaces;        
-    LPWSTR          lpstrCardNames;         
-    DWORD           nMaxCardNames;          
-    LPOCNCHKPROC    lpfnCheck;              
-    LPOCNCONNPROCW  lpfnConnect;            
-    LPOCNDSCPROC    lpfnDisconnect;         
-    LPVOID          pvUserData;             
-    DWORD           dwShareMode;            
-    DWORD           dwPreferredProtocols;   
-} OPENCARD_SEARCH_CRITERIAW, *POPENCARD_SEARCH_CRITERIAW, *LPOPENCARD_SEARCH_CRITERIAW;
-
-typedef OPENCARD_SEARCH_CRITERIAW OPENCARD_SEARCH_CRITERIA;
-typedef POPENCARD_SEARCH_CRITERIAW POPENCARD_SEARCH_CRITERIA;
-typedef LPOPENCARD_SEARCH_CRITERIAW LPOPENCARD_SEARCH_CRITERIA;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-    DWORD           dwStructSize;           
-    SCARDCONTEXT    hSCardContext;          
-    HWND            hwndOwner;              
-    DWORD           dwFlags;                
-    LPCSTR          lpstrTitle;             
-    LPCSTR          lpstrSearchDesc;        
-    HICON           hIcon;                  
-    POPENCARD_SEARCH_CRITERIAA pOpenCardSearchCriteria; 
-    LPOCNCONNPROCA  lpfnConnect;            
-    LPVOID          pvUserData;             
-    DWORD           dwShareMode;            
-    DWORD           dwPreferredProtocols;   
-                                            
-    LPSTR           lpstrRdr;               
-    DWORD           nMaxRdr;                
-    LPSTR           lpstrCard;              
-    DWORD           nMaxCard;               
-    DWORD           dwActiveProtocol;       
-    SCARDHANDLE     hCardHandle;            
-} OPENCARDNAME_EXA, *POPENCARDNAME_EXA, *LPOPENCARDNAME_EXA;
-typedef struct {
-    DWORD           dwStructSize;           
-    SCARDCONTEXT    hSCardContext;          
-    HWND            hwndOwner;              
-    DWORD           dwFlags;                
-    LPCWSTR         lpstrTitle;             
-    LPCWSTR         lpstrSearchDesc;        
-    HICON           hIcon;                  
-    POPENCARD_SEARCH_CRITERIAW pOpenCardSearchCriteria; 
-    LPOCNCONNPROCW  lpfnConnect;            
-    LPVOID          pvUserData;             
-    DWORD           dwShareMode;            
-    DWORD           dwPreferredProtocols;   
-                                            
-    LPWSTR          lpstrRdr;               
-    DWORD           nMaxRdr;                
-    LPWSTR          lpstrCard;              
-    DWORD           nMaxCard;               
-    DWORD           dwActiveProtocol;       
-    SCARDHANDLE     hCardHandle;            
-} OPENCARDNAME_EXW, *POPENCARDNAME_EXW, *LPOPENCARDNAME_EXW;
-
-typedef OPENCARDNAME_EXW OPENCARDNAME_EX;
-typedef POPENCARDNAME_EXW POPENCARDNAME_EX;
-typedef LPOPENCARDNAME_EXW LPOPENCARDNAME_EX;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardUIDlgSelectCardA(
-    LPOPENCARDNAME_EXA);
-extern  LONG __stdcall
-SCardUIDlgSelectCardW(
-    LPOPENCARDNAME_EXW);
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-    DWORD           dwStructSize;
-    HWND            hwndOwner;
-    SCARDCONTEXT    hSCardContext;
-    LPSTR           lpstrGroupNames;
-    DWORD           nMaxGroupNames;
-    LPSTR           lpstrCardNames;
-    DWORD           nMaxCardNames;
-    LPCGUID         rgguidInterfaces;
-    DWORD           cguidInterfaces;
-    LPSTR           lpstrRdr;
-    DWORD           nMaxRdr;
-    LPSTR           lpstrCard;
-    DWORD           nMaxCard;
-    LPCSTR          lpstrTitle;
-    DWORD           dwFlags;
-    LPVOID          pvUserData;
-    DWORD           dwShareMode;
-    DWORD           dwPreferredProtocols;
-    DWORD           dwActiveProtocol;
-    LPOCNCONNPROCA  lpfnConnect;
-    LPOCNCHKPROC    lpfnCheck;
-    LPOCNDSCPROC    lpfnDisconnect;
-    SCARDHANDLE     hCardHandle;
-} OPENCARDNAMEA, *POPENCARDNAMEA, *LPOPENCARDNAMEA;
-typedef struct {
-    DWORD           dwStructSize;
-    HWND            hwndOwner;
-    SCARDCONTEXT    hSCardContext;
-    LPWSTR          lpstrGroupNames;
-    DWORD           nMaxGroupNames;
-    LPWSTR          lpstrCardNames;
-    DWORD           nMaxCardNames;
-    LPCGUID         rgguidInterfaces;
-    DWORD           cguidInterfaces;
-    LPWSTR          lpstrRdr;
-    DWORD           nMaxRdr;
-    LPWSTR          lpstrCard;
-    DWORD           nMaxCard;
-    LPCWSTR         lpstrTitle;
-    DWORD           dwFlags;
-    LPVOID          pvUserData;
-    DWORD           dwShareMode;
-    DWORD           dwPreferredProtocols;
-    DWORD           dwActiveProtocol;
-    LPOCNCONNPROCW  lpfnConnect;
-    LPOCNCHKPROC    lpfnCheck;
-    LPOCNDSCPROC    lpfnDisconnect;
-    SCARDHANDLE     hCardHandle;
-} OPENCARDNAMEW, *POPENCARDNAMEW, *LPOPENCARDNAMEW;
-
-typedef OPENCARDNAMEW OPENCARDNAME;
-typedef POPENCARDNAMEW POPENCARDNAME;
-typedef LPOPENCARDNAMEW LPOPENCARDNAME;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern  LONG __stdcall
-GetOpenCardNameA(
-    LPOPENCARDNAMEA);
-extern  LONG __stdcall
-GetOpenCardNameW(
-    LPOPENCARDNAMEW);
-
-
-
-
-
-
-extern  LONG __stdcall
-SCardDlgExtendedError (void);
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,4)
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct _PSP;
-typedef struct _PSP * HPROPSHEETPAGE;
-
-
-struct _PROPSHEETPAGEA;
-struct _PROPSHEETPAGEW;
-
-
-typedef UINT (__stdcall *LPFNPSPCALLBACKA)(HWND hwnd, UINT uMsg, struct _PROPSHEETPAGEA *ppsp);
-typedef UINT (__stdcall *LPFNPSPCALLBACKW)(HWND hwnd, UINT uMsg, struct _PROPSHEETPAGEW *ppsp);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef LPCDLGTEMPLATE PROPSHEETPAGE_RESOURCE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _PROPSHEETPAGEA_V1
-{
-    DWORD dwSize; DWORD dwFlags; HINSTANCE hInstance; union { LPCSTR pszTemplate; PROPSHEETPAGE_RESOURCE pResource; } ; union { HICON hIcon; LPCSTR pszIcon; } ; LPCSTR pszTitle; DLGPROC pfnDlgProc; LPARAM lParam; LPFNPSPCALLBACKA pfnCallback; UINT *pcRefParent;
-} PROPSHEETPAGEA_V1, *LPPROPSHEETPAGEA_V1;
-typedef const PROPSHEETPAGEA_V1 *LPCPROPSHEETPAGEA_V1;
-
-typedef struct _PROPSHEETPAGEA_V2
-{
-    DWORD dwSize; DWORD dwFlags; HINSTANCE hInstance; union { LPCSTR pszTemplate; PROPSHEETPAGE_RESOURCE pResource; } ; union { HICON hIcon; LPCSTR pszIcon; } ; LPCSTR pszTitle; DLGPROC pfnDlgProc; LPARAM lParam; LPFNPSPCALLBACKA pfnCallback; UINT *pcRefParent;
-
-    LPCSTR           pszHeaderTitle;    
-    LPCSTR           pszHeaderSubTitle; 
-} PROPSHEETPAGEA_V2, *LPPROPSHEETPAGEA_V2;
-typedef const PROPSHEETPAGEA_V2 *LPCPROPSHEETPAGEA_V2;
-
-typedef struct _PROPSHEETPAGEA
-{
-    DWORD dwSize; DWORD dwFlags; HINSTANCE hInstance; union { LPCSTR pszTemplate; PROPSHEETPAGE_RESOURCE pResource; } ; union { HICON hIcon; LPCSTR pszIcon; } ; LPCSTR pszTitle; DLGPROC pfnDlgProc; LPARAM lParam; LPFNPSPCALLBACKA pfnCallback; UINT *pcRefParent;
-
-    LPCSTR           pszHeaderTitle;    
-    LPCSTR           pszHeaderSubTitle; 
-
-    HANDLE           hActCtx;
-} PROPSHEETPAGEA_V3, *LPPROPSHEETPAGEA_V3;
-typedef const PROPSHEETPAGEA_V3 *LPCPROPSHEETPAGEA_V3;
-
-
-typedef struct _PROPSHEETPAGEW_V1
-{
-    DWORD dwSize; DWORD dwFlags; HINSTANCE hInstance; union { LPCWSTR pszTemplate; PROPSHEETPAGE_RESOURCE pResource; } ; union { HICON hIcon; LPCWSTR pszIcon; } ; LPCWSTR pszTitle; DLGPROC pfnDlgProc; LPARAM lParam; LPFNPSPCALLBACKW pfnCallback; UINT *pcRefParent;
-} PROPSHEETPAGEW_V1, *LPPROPSHEETPAGEW_V1;
-typedef const PROPSHEETPAGEW_V1 *LPCPROPSHEETPAGEW_V1;
-
-typedef struct _PROPSHEETPAGEW_V2
-{
-    DWORD dwSize; DWORD dwFlags; HINSTANCE hInstance; union { LPCWSTR pszTemplate; PROPSHEETPAGE_RESOURCE pResource; } ; union { HICON hIcon; LPCWSTR pszIcon; } ; LPCWSTR pszTitle; DLGPROC pfnDlgProc; LPARAM lParam; LPFNPSPCALLBACKW pfnCallback; UINT *pcRefParent;
-
-    LPCWSTR           pszHeaderTitle;    
-    LPCWSTR           pszHeaderSubTitle; 
-} PROPSHEETPAGEW_V2, *LPPROPSHEETPAGEW_V2;
-typedef const PROPSHEETPAGEW_V2 *LPCPROPSHEETPAGEW_V2;
-
-typedef struct _PROPSHEETPAGEW
-{
-    DWORD dwSize; DWORD dwFlags; HINSTANCE hInstance; union { LPCWSTR pszTemplate; PROPSHEETPAGE_RESOURCE pResource; } ; union { HICON hIcon; LPCWSTR pszIcon; } ; LPCWSTR pszTitle; DLGPROC pfnDlgProc; LPARAM lParam; LPFNPSPCALLBACKW pfnCallback; UINT *pcRefParent;
-
-    LPCWSTR           pszHeaderTitle;    
-    LPCWSTR           pszHeaderSubTitle; 
-
-    HANDLE           hActCtx;
-} PROPSHEETPAGEW_V3, *LPPROPSHEETPAGEW_V3;
-typedef const PROPSHEETPAGEW_V3 *LPCPROPSHEETPAGEW_V3;
-
-typedef    PROPSHEETPAGEA_V3    PROPSHEETPAGEA_LATEST;
-typedef    PROPSHEETPAGEW_V3    PROPSHEETPAGEW_LATEST;
-typedef  LPPROPSHEETPAGEA_V3  LPPROPSHEETPAGEA_LATEST;
-typedef  LPPROPSHEETPAGEW_V3  LPPROPSHEETPAGEW_LATEST;
-typedef LPCPROPSHEETPAGEA_V3 LPCPROPSHEETPAGEA_LATEST;
-typedef LPCPROPSHEETPAGEW_V3 LPCPROPSHEETPAGEW_LATEST;
-
-
-typedef    PROPSHEETPAGEA_V3    PROPSHEETPAGEA;
-typedef    PROPSHEETPAGEW_V3    PROPSHEETPAGEW;
-typedef  LPPROPSHEETPAGEA_V3  LPPROPSHEETPAGEA;
-typedef  LPPROPSHEETPAGEW_V3  LPPROPSHEETPAGEW;
-typedef LPCPROPSHEETPAGEA_V3 LPCPROPSHEETPAGEA;
-typedef LPCPROPSHEETPAGEW_V3 LPCPROPSHEETPAGEW;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef int (__stdcall *PFNPROPSHEETCALLBACK)(HWND, UINT, LPARAM);
-
-
-
-
-
-
-
-typedef struct _PROPSHEETHEADERA 
-{
-        DWORD           dwSize;
-        DWORD           dwFlags;
-        HWND            hwndParent;
-        HINSTANCE       hInstance;
-        union 
-        {
-            HICON       hIcon;
-            LPCSTR      pszIcon;
-        } ;
-        LPCSTR          pszCaption;
-
-        UINT            nPages;
-        union 
-        {
-            UINT        nStartPage;
-            LPCSTR      pStartPage;
-        } ;
-        union 
-        {
-            LPCPROPSHEETPAGEA ppsp;
-            HPROPSHEETPAGE *phpage;
-        } ;
-        PFNPROPSHEETCALLBACK pfnCallback;
-
-
-        union 
-        {
-            HBITMAP hbmWatermark;
-            LPCSTR pszbmWatermark;
-        } ;
-        HPALETTE hplWatermark;
-        union 
-        {
-            HBITMAP hbmHeader;     
-            LPCSTR pszbmHeader;
-        } ;
-
-} PROPSHEETHEADERA, *LPPROPSHEETHEADERA;
-
-typedef const PROPSHEETHEADERA *LPCPROPSHEETHEADERA;
-
-typedef struct _PROPSHEETHEADERW 
-{
-        DWORD           dwSize;
-        DWORD           dwFlags;
-        HWND            hwndParent;
-        HINSTANCE       hInstance;
-        union 
-        {
-            HICON       hIcon;
-            LPCWSTR     pszIcon;
-        } ;
-        LPCWSTR         pszCaption;
-
-
-        UINT            nPages;
-        union 
-        {
-            UINT        nStartPage;
-            LPCWSTR     pStartPage;
-        } ;
-        union 
-        {
-            LPCPROPSHEETPAGEW ppsp;
-            HPROPSHEETPAGE *phpage;
-        } ;
-        PFNPROPSHEETCALLBACK pfnCallback;
-
-
-        union 
-        {
-            HBITMAP hbmWatermark;
-            LPCWSTR pszbmWatermark;
-        } ;
-        HPALETTE hplWatermark;
-        union 
-        {
-            HBITMAP hbmHeader;
-            LPCWSTR pszbmHeader;
-        } ;
-
-} PROPSHEETHEADERW, *LPPROPSHEETHEADERW;
-typedef const PROPSHEETHEADERW *LPCPROPSHEETHEADERW;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) HPROPSHEETPAGE __stdcall CreatePropertySheetPageA(LPCPROPSHEETPAGEA constPropSheetPagePointer);
-__declspec(dllimport) HPROPSHEETPAGE __stdcall CreatePropertySheetPageW(LPCPROPSHEETPAGEW constPropSheetPagePointer);
-__declspec(dllimport) BOOL           __stdcall DestroyPropertySheetPage(HPROPSHEETPAGE);
-
-__declspec(dllimport) INT_PTR        __stdcall PropertySheetA(LPCPROPSHEETHEADERA);
-
-__declspec(dllimport) INT_PTR        __stdcall PropertySheetW(LPCPROPSHEETHEADERW);
-
-
-
-
-
-
-
-
-
-
-
-typedef BOOL (__stdcall *LPFNADDPROPSHEETPAGE)(HPROPSHEETPAGE, LPARAM);
-typedef BOOL (__stdcall *LPFNADDPROPSHEETPAGES)(LPVOID, LPFNADDPROPSHEETPAGE, LPARAM);
-
-
-typedef struct _PSHNOTIFY
-{
-    NMHDR hdr;
-    LPARAM lParam;
-} PSHNOTIFY, *LPPSHNOTIFY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-typedef struct _PRINTER_INFO_1A {
-    DWORD   Flags;
-    LPSTR   pDescription;
-    LPSTR   pName;
-    LPSTR   pComment;
-} PRINTER_INFO_1A, *PPRINTER_INFO_1A, *LPPRINTER_INFO_1A;
-typedef struct _PRINTER_INFO_1W {
-    DWORD   Flags;
-    LPWSTR  pDescription;
-    LPWSTR  pName;
-    LPWSTR  pComment;
-} PRINTER_INFO_1W, *PPRINTER_INFO_1W, *LPPRINTER_INFO_1W;
-
-typedef PRINTER_INFO_1W PRINTER_INFO_1;
-typedef PPRINTER_INFO_1W PPRINTER_INFO_1;
-typedef LPPRINTER_INFO_1W LPPRINTER_INFO_1;
-
-
-
-
-
-
-typedef struct _PRINTER_INFO_2A {
-    LPSTR     pServerName;
-    LPSTR     pPrinterName;
-    LPSTR     pShareName;
-    LPSTR     pPortName;
-    LPSTR     pDriverName;
-    LPSTR     pComment;
-    LPSTR     pLocation;
-    LPDEVMODEA pDevMode;
-    LPSTR     pSepFile;
-    LPSTR     pPrintProcessor;
-    LPSTR     pDatatype;
-    LPSTR     pParameters;
-    PSECURITY_DESCRIPTOR pSecurityDescriptor;
-    DWORD   Attributes;
-    DWORD   Priority;
-    DWORD   DefaultPriority;
-    DWORD   StartTime;
-    DWORD   UntilTime;
-    DWORD   Status;
-    DWORD   cJobs;
-    DWORD   AveragePPM;
-} PRINTER_INFO_2A, *PPRINTER_INFO_2A, *LPPRINTER_INFO_2A;
-typedef struct _PRINTER_INFO_2W {
-    LPWSTR    pServerName;
-    LPWSTR    pPrinterName;
-    LPWSTR    pShareName;
-    LPWSTR    pPortName;
-    LPWSTR    pDriverName;
-    LPWSTR    pComment;
-    LPWSTR    pLocation;
-    LPDEVMODEW pDevMode;
-    LPWSTR    pSepFile;
-    LPWSTR    pPrintProcessor;
-    LPWSTR    pDatatype;
-    LPWSTR    pParameters;
-    PSECURITY_DESCRIPTOR pSecurityDescriptor;
-    DWORD   Attributes;
-    DWORD   Priority;
-    DWORD   DefaultPriority;
-    DWORD   StartTime;
-    DWORD   UntilTime;
-    DWORD   Status;
-    DWORD   cJobs;
-    DWORD   AveragePPM;
-} PRINTER_INFO_2W, *PPRINTER_INFO_2W, *LPPRINTER_INFO_2W;
-
-typedef PRINTER_INFO_2W PRINTER_INFO_2;
-typedef PPRINTER_INFO_2W PPRINTER_INFO_2;
-typedef LPPRINTER_INFO_2W LPPRINTER_INFO_2;
-
-
-
-
-
-
-typedef struct _PRINTER_INFO_3 {
-    PSECURITY_DESCRIPTOR pSecurityDescriptor;
-} PRINTER_INFO_3, *PPRINTER_INFO_3, *LPPRINTER_INFO_3;
-
-typedef struct _PRINTER_INFO_4A {
-    LPSTR   pPrinterName;
-    LPSTR   pServerName;
-    DWORD   Attributes;
-} PRINTER_INFO_4A, *PPRINTER_INFO_4A, *LPPRINTER_INFO_4A;
-typedef struct _PRINTER_INFO_4W {
-    LPWSTR  pPrinterName;
-    LPWSTR  pServerName;
-    DWORD   Attributes;
-} PRINTER_INFO_4W, *PPRINTER_INFO_4W, *LPPRINTER_INFO_4W;
-
-typedef PRINTER_INFO_4W PRINTER_INFO_4;
-typedef PPRINTER_INFO_4W PPRINTER_INFO_4;
-typedef LPPRINTER_INFO_4W LPPRINTER_INFO_4;
-
-
-
-
-
-
-typedef struct _PRINTER_INFO_5A {
-    LPSTR   pPrinterName;
-    LPSTR   pPortName;
-    DWORD   Attributes;
-    DWORD   DeviceNotSelectedTimeout;
-    DWORD   TransmissionRetryTimeout;
-} PRINTER_INFO_5A, *PPRINTER_INFO_5A, *LPPRINTER_INFO_5A;
-typedef struct _PRINTER_INFO_5W {
-    LPWSTR  pPrinterName;
-    LPWSTR  pPortName;
-    DWORD   Attributes;
-    DWORD   DeviceNotSelectedTimeout;
-    DWORD   TransmissionRetryTimeout;
-} PRINTER_INFO_5W, *PPRINTER_INFO_5W, *LPPRINTER_INFO_5W;
-
-typedef PRINTER_INFO_5W PRINTER_INFO_5;
-typedef PPRINTER_INFO_5W PPRINTER_INFO_5;
-typedef LPPRINTER_INFO_5W LPPRINTER_INFO_5;
-
-
-
-
-
-
-typedef struct _PRINTER_INFO_6 {
-    DWORD   dwStatus;
-} PRINTER_INFO_6, *PPRINTER_INFO_6, *LPPRINTER_INFO_6;
-
-typedef struct _PRINTER_INFO_7A {
-  LPSTR    pszObjectGUID;
-  DWORD    dwAction;
-} PRINTER_INFO_7A, *PPRINTER_INFO_7A, *LPPRINTER_INFO_7A;
-typedef struct _PRINTER_INFO_7W {
-  LPWSTR   pszObjectGUID;
-  DWORD    dwAction;
-} PRINTER_INFO_7W, *PPRINTER_INFO_7W, *LPPRINTER_INFO_7W;
-
-typedef PRINTER_INFO_7W PRINTER_INFO_7;
-typedef PPRINTER_INFO_7W PPRINTER_INFO_7;
-typedef LPPRINTER_INFO_7W LPPRINTER_INFO_7;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _PRINTER_INFO_8A {
-    LPDEVMODEA pDevMode;
-} PRINTER_INFO_8A, *PPRINTER_INFO_8A, *LPPRINTER_INFO_8A;
-typedef struct _PRINTER_INFO_8W {
-    LPDEVMODEW pDevMode;
-} PRINTER_INFO_8W, *PPRINTER_INFO_8W, *LPPRINTER_INFO_8W;
-
-typedef PRINTER_INFO_8W PRINTER_INFO_8;
-typedef PPRINTER_INFO_8W PPRINTER_INFO_8;
-typedef LPPRINTER_INFO_8W LPPRINTER_INFO_8;
-
-
-
-
-
-
-typedef struct _PRINTER_INFO_9A {
-    LPDEVMODEA pDevMode;
-} PRINTER_INFO_9A, *PPRINTER_INFO_9A, *LPPRINTER_INFO_9A;
-typedef struct _PRINTER_INFO_9W {
-    LPDEVMODEW pDevMode;
-} PRINTER_INFO_9W, *PPRINTER_INFO_9W, *LPPRINTER_INFO_9W;
-
-typedef PRINTER_INFO_9W PRINTER_INFO_9;
-typedef PPRINTER_INFO_9W PPRINTER_INFO_9;
-typedef LPPRINTER_INFO_9W LPPRINTER_INFO_9;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _JOB_INFO_1A {
-   DWORD    JobId;
-   LPSTR      pPrinterName;
-   LPSTR      pMachineName;
-   LPSTR      pUserName;
-   LPSTR      pDocument;
-   LPSTR      pDatatype;
-   LPSTR      pStatus;
-   DWORD    Status;
-   DWORD    Priority;
-   DWORD    Position;
-   DWORD    TotalPages;
-   DWORD    PagesPrinted;
-   SYSTEMTIME Submitted;
-} JOB_INFO_1A, *PJOB_INFO_1A, *LPJOB_INFO_1A;
-typedef struct _JOB_INFO_1W {
-   DWORD    JobId;
-   LPWSTR     pPrinterName;
-   LPWSTR     pMachineName;
-   LPWSTR     pUserName;
-   LPWSTR     pDocument;
-   LPWSTR     pDatatype;
-   LPWSTR     pStatus;
-   DWORD    Status;
-   DWORD    Priority;
-   DWORD    Position;
-   DWORD    TotalPages;
-   DWORD    PagesPrinted;
-   SYSTEMTIME Submitted;
-} JOB_INFO_1W, *PJOB_INFO_1W, *LPJOB_INFO_1W;
-
-typedef JOB_INFO_1W JOB_INFO_1;
-typedef PJOB_INFO_1W PJOB_INFO_1;
-typedef LPJOB_INFO_1W LPJOB_INFO_1;
-
-
-
-
-
-
-typedef struct _JOB_INFO_2A {
-   DWORD    JobId;
-   LPSTR      pPrinterName;
-   LPSTR      pMachineName;
-   LPSTR      pUserName;
-   LPSTR      pDocument;
-   LPSTR      pNotifyName;
-   LPSTR      pDatatype;
-   LPSTR      pPrintProcessor;
-   LPSTR      pParameters;
-   LPSTR      pDriverName;
-   LPDEVMODEA pDevMode;
-   LPSTR      pStatus;
-   PSECURITY_DESCRIPTOR pSecurityDescriptor;
-   DWORD    Status;
-   DWORD    Priority;
-   DWORD    Position;
-   DWORD    StartTime;
-   DWORD    UntilTime;
-   DWORD    TotalPages;
-   DWORD    Size;
-   SYSTEMTIME Submitted;    
-   DWORD    Time;           
-   DWORD    PagesPrinted;
-} JOB_INFO_2A, *PJOB_INFO_2A, *LPJOB_INFO_2A;
-typedef struct _JOB_INFO_2W {
-   DWORD    JobId;
-   LPWSTR     pPrinterName;
-   LPWSTR     pMachineName;
-   LPWSTR     pUserName;
-   LPWSTR     pDocument;
-   LPWSTR     pNotifyName;
-   LPWSTR     pDatatype;
-   LPWSTR     pPrintProcessor;
-   LPWSTR     pParameters;
-   LPWSTR     pDriverName;
-   LPDEVMODEW pDevMode;
-   LPWSTR     pStatus;
-   PSECURITY_DESCRIPTOR pSecurityDescriptor;
-   DWORD    Status;
-   DWORD    Priority;
-   DWORD    Position;
-   DWORD    StartTime;
-   DWORD    UntilTime;
-   DWORD    TotalPages;
-   DWORD    Size;
-   SYSTEMTIME Submitted;    
-   DWORD    Time;           
-   DWORD    PagesPrinted;
-} JOB_INFO_2W, *PJOB_INFO_2W, *LPJOB_INFO_2W;
-
-typedef JOB_INFO_2W JOB_INFO_2;
-typedef PJOB_INFO_2W PJOB_INFO_2;
-typedef LPJOB_INFO_2W LPJOB_INFO_2;
-
-
-
-
-
-
-typedef struct _JOB_INFO_3 {
-    DWORD   JobId;
-    DWORD   NextJobId;
-    DWORD   Reserved;
-} JOB_INFO_3, *PJOB_INFO_3, *LPJOB_INFO_3;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _ADDJOB_INFO_1A {
-    LPSTR     Path;
-    DWORD   JobId;
-} ADDJOB_INFO_1A, *PADDJOB_INFO_1A, *LPADDJOB_INFO_1A;
-typedef struct _ADDJOB_INFO_1W {
-    LPWSTR    Path;
-    DWORD   JobId;
-} ADDJOB_INFO_1W, *PADDJOB_INFO_1W, *LPADDJOB_INFO_1W;
-
-typedef ADDJOB_INFO_1W ADDJOB_INFO_1;
-typedef PADDJOB_INFO_1W PADDJOB_INFO_1;
-typedef LPADDJOB_INFO_1W LPADDJOB_INFO_1;
-
-
-
-
-
-
-
-typedef struct _DRIVER_INFO_1A {
-    LPSTR     pName;              
-} DRIVER_INFO_1A, *PDRIVER_INFO_1A, *LPDRIVER_INFO_1A;
-typedef struct _DRIVER_INFO_1W {
-    LPWSTR    pName;              
-} DRIVER_INFO_1W, *PDRIVER_INFO_1W, *LPDRIVER_INFO_1W;
-
-typedef DRIVER_INFO_1W DRIVER_INFO_1;
-typedef PDRIVER_INFO_1W PDRIVER_INFO_1;
-typedef LPDRIVER_INFO_1W LPDRIVER_INFO_1;
-
-
-
-
-
-
-typedef struct _DRIVER_INFO_2A {
-    DWORD   cVersion;
-    LPSTR     pName;              
-    LPSTR     pEnvironment;       
-    LPSTR     pDriverPath;        
-    LPSTR     pDataFile;          
-    LPSTR     pConfigFile;        
-} DRIVER_INFO_2A, *PDRIVER_INFO_2A, *LPDRIVER_INFO_2A;
-typedef struct _DRIVER_INFO_2W {
-    DWORD   cVersion;
-    LPWSTR    pName;              
-    LPWSTR    pEnvironment;       
-    LPWSTR    pDriverPath;        
-    LPWSTR    pDataFile;          
-    LPWSTR    pConfigFile;        
-} DRIVER_INFO_2W, *PDRIVER_INFO_2W, *LPDRIVER_INFO_2W;
-
-typedef DRIVER_INFO_2W DRIVER_INFO_2;
-typedef PDRIVER_INFO_2W PDRIVER_INFO_2;
-typedef LPDRIVER_INFO_2W LPDRIVER_INFO_2;
-
-
-
-
-
-
-typedef struct _DRIVER_INFO_3A {
-    DWORD   cVersion;
-    LPSTR     pName;                    
-    LPSTR     pEnvironment;             
-    LPSTR     pDriverPath;              
-    LPSTR     pDataFile;                
-    LPSTR     pConfigFile;              
-    LPSTR     pHelpFile;                
-    LPSTR     pDependentFiles;          
-    LPSTR     pMonitorName;             
-    LPSTR     pDefaultDataType;         
-} DRIVER_INFO_3A, *PDRIVER_INFO_3A, *LPDRIVER_INFO_3A;
-typedef struct _DRIVER_INFO_3W {
-    DWORD   cVersion;
-    LPWSTR    pName;                    
-    LPWSTR    pEnvironment;             
-    LPWSTR    pDriverPath;              
-    LPWSTR    pDataFile;                
-    LPWSTR    pConfigFile;              
-    LPWSTR    pHelpFile;                
-    LPWSTR    pDependentFiles;          
-    LPWSTR    pMonitorName;             
-    LPWSTR    pDefaultDataType;         
-} DRIVER_INFO_3W, *PDRIVER_INFO_3W, *LPDRIVER_INFO_3W;
-
-typedef DRIVER_INFO_3W DRIVER_INFO_3;
-typedef PDRIVER_INFO_3W PDRIVER_INFO_3;
-typedef LPDRIVER_INFO_3W LPDRIVER_INFO_3;
-
-
-
-
-
-
-typedef struct _DRIVER_INFO_4A {
-    DWORD   cVersion;
-    LPSTR     pName;                    
-    LPSTR     pEnvironment;             
-    LPSTR     pDriverPath;              
-    LPSTR     pDataFile;                
-    LPSTR     pConfigFile;              
-    LPSTR     pHelpFile;                
-    LPSTR     pDependentFiles;          
-    LPSTR     pMonitorName;             
-    LPSTR     pDefaultDataType;         
-    LPSTR     pszzPreviousNames;        
-} DRIVER_INFO_4A, *PDRIVER_INFO_4A, *LPDRIVER_INFO_4A;
-typedef struct _DRIVER_INFO_4W {
-    DWORD   cVersion;
-    LPWSTR    pName;                    
-    LPWSTR    pEnvironment;             
-    LPWSTR    pDriverPath;              
-    LPWSTR    pDataFile;                
-    LPWSTR    pConfigFile;              
-    LPWSTR    pHelpFile;                
-    LPWSTR    pDependentFiles;          
-    LPWSTR    pMonitorName;             
-    LPWSTR    pDefaultDataType;         
-    LPWSTR    pszzPreviousNames;        
-} DRIVER_INFO_4W, *PDRIVER_INFO_4W, *LPDRIVER_INFO_4W;
-
-typedef DRIVER_INFO_4W DRIVER_INFO_4;
-typedef PDRIVER_INFO_4W PDRIVER_INFO_4;
-typedef LPDRIVER_INFO_4W LPDRIVER_INFO_4;
-
-
-
-
-
-
-typedef struct _DRIVER_INFO_5A {
-    DWORD   cVersion;
-    LPSTR     pName;                    
-    LPSTR     pEnvironment;             
-    LPSTR     pDriverPath;              
-    LPSTR     pDataFile;                
-    LPSTR     pConfigFile;              
-    DWORD     dwDriverAttributes;       
-    DWORD     dwConfigVersion;          
-    DWORD     dwDriverVersion;          
-} DRIVER_INFO_5A, *PDRIVER_INFO_5A, *LPDRIVER_INFO_5A;
-typedef struct _DRIVER_INFO_5W {
-    DWORD   cVersion;
-    LPWSTR    pName;                    
-    LPWSTR    pEnvironment;             
-    LPWSTR    pDriverPath;              
-    LPWSTR    pDataFile;                
-    LPWSTR    pConfigFile;              
-    DWORD     dwDriverAttributes;       
-    DWORD     dwConfigVersion;          
-    DWORD     dwDriverVersion;          
-} DRIVER_INFO_5W, *PDRIVER_INFO_5W, *LPDRIVER_INFO_5W;
-
-typedef DRIVER_INFO_5W DRIVER_INFO_5;
-typedef PDRIVER_INFO_5W PDRIVER_INFO_5;
-typedef LPDRIVER_INFO_5W LPDRIVER_INFO_5;
-
-
-
-
-
-
-typedef struct _DRIVER_INFO_6A {
-    DWORD     cVersion;
-    LPSTR     pName;                    
-    LPSTR     pEnvironment;             
-    LPSTR     pDriverPath;              
-    LPSTR     pDataFile;                
-    LPSTR     pConfigFile;              
-    LPSTR     pHelpFile;                
-    LPSTR     pDependentFiles;          
-    LPSTR     pMonitorName;             
-    LPSTR     pDefaultDataType;         
-    LPSTR     pszzPreviousNames;        
-    FILETIME  ftDriverDate;
-    DWORDLONG dwlDriverVersion;
-    LPSTR      pszMfgName;
-    LPSTR      pszOEMUrl;
-    LPSTR      pszHardwareID;
-    LPSTR      pszProvider;
-} DRIVER_INFO_6A, *PDRIVER_INFO_6A, *LPDRIVER_INFO_6A;
-typedef struct _DRIVER_INFO_6W {
-    DWORD     cVersion;
-    LPWSTR    pName;                    
-    LPWSTR    pEnvironment;             
-    LPWSTR    pDriverPath;              
-    LPWSTR    pDataFile;                
-    LPWSTR    pConfigFile;              
-    LPWSTR    pHelpFile;                
-    LPWSTR    pDependentFiles;          
-    LPWSTR    pMonitorName;             
-    LPWSTR    pDefaultDataType;         
-    LPWSTR    pszzPreviousNames;        
-    FILETIME  ftDriverDate;
-    DWORDLONG dwlDriverVersion;
-    LPWSTR     pszMfgName;
-    LPWSTR     pszOEMUrl;
-    LPWSTR     pszHardwareID;
-    LPWSTR     pszProvider;
-} DRIVER_INFO_6W, *PDRIVER_INFO_6W, *LPDRIVER_INFO_6W;
-
-typedef DRIVER_INFO_6W DRIVER_INFO_6;
-typedef PDRIVER_INFO_6W PDRIVER_INFO_6;
-typedef LPDRIVER_INFO_6W LPDRIVER_INFO_6;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _DOC_INFO_1A {
-    LPSTR     pDocName;
-    LPSTR     pOutputFile;
-    LPSTR     pDatatype;
-} DOC_INFO_1A, *PDOC_INFO_1A, *LPDOC_INFO_1A;
-typedef struct _DOC_INFO_1W {
-    LPWSTR    pDocName;
-    LPWSTR    pOutputFile;
-    LPWSTR    pDatatype;
-} DOC_INFO_1W, *PDOC_INFO_1W, *LPDOC_INFO_1W;
-
-typedef DOC_INFO_1W DOC_INFO_1;
-typedef PDOC_INFO_1W PDOC_INFO_1;
-typedef LPDOC_INFO_1W LPDOC_INFO_1;
-
-
-
-
-
-
-typedef struct _FORM_INFO_1A {
-    DWORD   Flags;
-    LPSTR     pName;
-    SIZEL   Size;
-    RECTL   ImageableArea;
-} FORM_INFO_1A, *PFORM_INFO_1A, *LPFORM_INFO_1A;
-typedef struct _FORM_INFO_1W {
-    DWORD   Flags;
-    LPWSTR    pName;
-    SIZEL   Size;
-    RECTL   ImageableArea;
-} FORM_INFO_1W, *PFORM_INFO_1W, *LPFORM_INFO_1W;
-
-typedef FORM_INFO_1W FORM_INFO_1;
-typedef PFORM_INFO_1W PFORM_INFO_1;
-typedef LPFORM_INFO_1W LPFORM_INFO_1;
-
-
-
-
-
-
-typedef struct _DOC_INFO_2A {
-    LPSTR     pDocName;
-    LPSTR     pOutputFile;
-    LPSTR     pDatatype;
-    DWORD   dwMode;
-    DWORD   JobId;
-} DOC_INFO_2A, *PDOC_INFO_2A, *LPDOC_INFO_2A;
-typedef struct _DOC_INFO_2W {
-    LPWSTR    pDocName;
-    LPWSTR    pOutputFile;
-    LPWSTR    pDatatype;
-    DWORD   dwMode;
-    DWORD   JobId;
-} DOC_INFO_2W, *PDOC_INFO_2W, *LPDOC_INFO_2W;
-
-typedef DOC_INFO_2W DOC_INFO_2;
-typedef PDOC_INFO_2W PDOC_INFO_2;
-typedef LPDOC_INFO_2W LPDOC_INFO_2;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _DOC_INFO_3A {
-    LPSTR     pDocName;
-    LPSTR     pOutputFile;
-    LPSTR     pDatatype;
-    DWORD     dwFlags;
-} DOC_INFO_3A, *PDOC_INFO_3A, *LPDOC_INFO_3A;
-typedef struct _DOC_INFO_3W {
-    LPWSTR    pDocName;
-    LPWSTR    pOutputFile;
-    LPWSTR    pDatatype;
-    DWORD     dwFlags;
-} DOC_INFO_3W, *PDOC_INFO_3W, *LPDOC_INFO_3W;
-
-typedef DOC_INFO_3W DOC_INFO_3;
-typedef PDOC_INFO_3W PDOC_INFO_3;
-typedef LPDOC_INFO_3W LPDOC_INFO_3;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _PRINTPROCESSOR_INFO_1A {
-    LPSTR     pName;
-} PRINTPROCESSOR_INFO_1A, *PPRINTPROCESSOR_INFO_1A, *LPPRINTPROCESSOR_INFO_1A;
-typedef struct _PRINTPROCESSOR_INFO_1W {
-    LPWSTR    pName;
-} PRINTPROCESSOR_INFO_1W, *PPRINTPROCESSOR_INFO_1W, *LPPRINTPROCESSOR_INFO_1W;
-
-typedef PRINTPROCESSOR_INFO_1W PRINTPROCESSOR_INFO_1;
-typedef PPRINTPROCESSOR_INFO_1W PPRINTPROCESSOR_INFO_1;
-typedef LPPRINTPROCESSOR_INFO_1W LPPRINTPROCESSOR_INFO_1;
-
-
-
-
-
-
-typedef struct _PRINTPROCESSOR_CAPS_1 {
-    DWORD     dwLevel;
-    DWORD     dwNupOptions;
-    DWORD     dwPageOrderFlags;
-    DWORD     dwNumberOfCopies;
-} PRINTPROCESSOR_CAPS_1, *PPRINTPROCESSOR_CAPS_1;
-
-
-
-
-typedef struct _PORT_INFO_1A {
-    LPSTR     pName;
-} PORT_INFO_1A, *PPORT_INFO_1A, *LPPORT_INFO_1A;
-typedef struct _PORT_INFO_1W {
-    LPWSTR    pName;
-} PORT_INFO_1W, *PPORT_INFO_1W, *LPPORT_INFO_1W;
-
-typedef PORT_INFO_1W PORT_INFO_1;
-typedef PPORT_INFO_1W PPORT_INFO_1;
-typedef LPPORT_INFO_1W LPPORT_INFO_1;
-
-
-
-
-
-
-typedef struct _PORT_INFO_2A {
-    LPSTR     pPortName;
-    LPSTR     pMonitorName;
-    LPSTR     pDescription;
-    DWORD     fPortType;
-    DWORD     Reserved;
-} PORT_INFO_2A, *PPORT_INFO_2A, *LPPORT_INFO_2A;
-typedef struct _PORT_INFO_2W {
-    LPWSTR    pPortName;
-    LPWSTR    pMonitorName;
-    LPWSTR    pDescription;
-    DWORD     fPortType;
-    DWORD     Reserved;
-} PORT_INFO_2W, *PPORT_INFO_2W, *LPPORT_INFO_2W;
-
-typedef PORT_INFO_2W PORT_INFO_2;
-typedef PPORT_INFO_2W PPORT_INFO_2;
-typedef LPPORT_INFO_2W LPPORT_INFO_2;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _PORT_INFO_3A {
-    DWORD   dwStatus;
-    LPSTR   pszStatus;
-    DWORD   dwSeverity;
-} PORT_INFO_3A, *PPORT_INFO_3A, *LPPORT_INFO_3A;
-typedef struct _PORT_INFO_3W {
-    DWORD   dwStatus;
-    LPWSTR  pszStatus;
-    DWORD   dwSeverity;
-} PORT_INFO_3W, *PPORT_INFO_3W, *LPPORT_INFO_3W;
-
-typedef PORT_INFO_3W PORT_INFO_3;
-typedef PPORT_INFO_3W PPORT_INFO_3;
-typedef LPPORT_INFO_3W LPPORT_INFO_3;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _MONITOR_INFO_1A{
-    LPSTR     pName;
-} MONITOR_INFO_1A, *PMONITOR_INFO_1A, *LPMONITOR_INFO_1A;
-typedef struct _MONITOR_INFO_1W{
-    LPWSTR    pName;
-} MONITOR_INFO_1W, *PMONITOR_INFO_1W, *LPMONITOR_INFO_1W;
-
-typedef MONITOR_INFO_1W MONITOR_INFO_1;
-typedef PMONITOR_INFO_1W PMONITOR_INFO_1;
-typedef LPMONITOR_INFO_1W LPMONITOR_INFO_1;
-
-
-
-
-
-
-typedef struct _MONITOR_INFO_2A{
-    LPSTR     pName;
-    LPSTR     pEnvironment;
-    LPSTR     pDLLName;
-} MONITOR_INFO_2A, *PMONITOR_INFO_2A, *LPMONITOR_INFO_2A;
-typedef struct _MONITOR_INFO_2W{
-    LPWSTR    pName;
-    LPWSTR    pEnvironment;
-    LPWSTR    pDLLName;
-} MONITOR_INFO_2W, *PMONITOR_INFO_2W, *LPMONITOR_INFO_2W;
-
-typedef MONITOR_INFO_2W MONITOR_INFO_2;
-typedef PMONITOR_INFO_2W PMONITOR_INFO_2;
-typedef LPMONITOR_INFO_2W LPMONITOR_INFO_2;
-
-
-
-
-
-
-typedef struct _DATATYPES_INFO_1A{
-    LPSTR     pName;
-} DATATYPES_INFO_1A, *PDATATYPES_INFO_1A, *LPDATATYPES_INFO_1A;
-typedef struct _DATATYPES_INFO_1W{
-    LPWSTR    pName;
-} DATATYPES_INFO_1W, *PDATATYPES_INFO_1W, *LPDATATYPES_INFO_1W;
-
-typedef DATATYPES_INFO_1W DATATYPES_INFO_1;
-typedef PDATATYPES_INFO_1W PDATATYPES_INFO_1;
-typedef LPDATATYPES_INFO_1W LPDATATYPES_INFO_1;
-
-
-
-
-
-
-typedef struct _PRINTER_DEFAULTSA{
-    LPSTR         pDatatype;
-    LPDEVMODEA pDevMode;
-    ACCESS_MASK DesiredAccess;
-} PRINTER_DEFAULTSA, *PPRINTER_DEFAULTSA, *LPPRINTER_DEFAULTSA;
-typedef struct _PRINTER_DEFAULTSW{
-    LPWSTR        pDatatype;
-    LPDEVMODEW pDevMode;
-    ACCESS_MASK DesiredAccess;
-} PRINTER_DEFAULTSW, *PPRINTER_DEFAULTSW, *LPPRINTER_DEFAULTSW;
-
-typedef PRINTER_DEFAULTSW PRINTER_DEFAULTS;
-typedef PPRINTER_DEFAULTSW PPRINTER_DEFAULTS;
-typedef LPPRINTER_DEFAULTSW LPPRINTER_DEFAULTS;
-
-
-
-
-
-
-typedef struct _PRINTER_ENUM_VALUESA {
-    LPSTR   pValueName;
-    DWORD   cbValueName;
-    DWORD   dwType;
-    LPBYTE  pData;
-    DWORD   cbData;
-} PRINTER_ENUM_VALUESA, *PPRINTER_ENUM_VALUESA, *LPPRINTER_ENUM_VALUESA;
-typedef struct _PRINTER_ENUM_VALUESW {
-    LPWSTR  pValueName;
-    DWORD   cbValueName;
-    DWORD   dwType;
-    LPBYTE  pData;
-    DWORD   cbData;
-} PRINTER_ENUM_VALUESW, *PPRINTER_ENUM_VALUESW, *LPPRINTER_ENUM_VALUESW;
-
-typedef PRINTER_ENUM_VALUESW PRINTER_ENUM_VALUES;
-typedef PPRINTER_ENUM_VALUESW PPRINTER_ENUM_VALUES;
-typedef LPPRINTER_ENUM_VALUESW LPPRINTER_ENUM_VALUES;
-
-
-
-
-
-
-BOOL
-__stdcall
-EnumPrintersA (
-         DWORD Flags,
-         LPSTR Name,
-         DWORD Level,
-             LPBYTE pPrinterEnum,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded,
-         LPDWORD pcReturned
-);
-BOOL
-__stdcall
-EnumPrintersW (
-         DWORD Flags,
-         LPWSTR Name,
-         DWORD Level,
-             LPBYTE pPrinterEnum,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded,
-         LPDWORD pcReturned
-);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-BOOL
-__stdcall
-OpenPrinterA (
-        LPSTR pPrinterName,
-        LPHANDLE phPrinter,
-          LPPRINTER_DEFAULTSA pDefault
-);
-BOOL
-__stdcall
-OpenPrinterW (
-        LPWSTR pPrinterName,
-        LPHANDLE phPrinter,
-          LPPRINTER_DEFAULTSW pDefault
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-ResetPrinterA (
-        HANDLE   hPrinter,
-          LPPRINTER_DEFAULTSA pDefault
-);
-BOOL
-__stdcall
-ResetPrinterW (
-        HANDLE   hPrinter,
-          LPPRINTER_DEFAULTSW pDefault
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-SetJobA (
-         HANDLE hPrinter,
-         DWORD JobId,
-         DWORD Level,
-           LPBYTE pJob,
-         DWORD Command
-);
-BOOL
-__stdcall
-SetJobW (
-         HANDLE hPrinter,
-         DWORD JobId,
-         DWORD Level,
-           LPBYTE pJob,
-         DWORD Command
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-GetJobA (
-        HANDLE hPrinter,
-        DWORD JobId,
-        DWORD Level,
-          LPBYTE pJob,
-        DWORD cbBuf,
-        LPDWORD pcbNeeded
-);
-BOOL
-__stdcall
-GetJobW (
-        HANDLE hPrinter,
-        DWORD JobId,
-        DWORD Level,
-          LPBYTE pJob,
-        DWORD cbBuf,
-        LPDWORD pcbNeeded
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-EnumJobsA (
-         HANDLE hPrinter,
-         DWORD FirstJob,
-         DWORD NoJobs,
-         DWORD Level,
-           LPBYTE pJob,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded,
-         LPDWORD pcReturned
-);
-BOOL
-__stdcall
-EnumJobsW (
-         HANDLE hPrinter,
-         DWORD FirstJob,
-         DWORD NoJobs,
-         DWORD Level,
-           LPBYTE pJob,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded,
-         LPDWORD pcReturned
-);
-
-
-
-
-
-
-HANDLE
-__stdcall
-AddPrinterA (
-         LPSTR pName,
-         DWORD Level,
-         LPBYTE pPrinter
-);
-HANDLE
-__stdcall
-AddPrinterW (
-         LPWSTR pName,
-         DWORD Level,
-         LPBYTE pPrinter
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-DeletePrinter (
-        HANDLE hPrinter
-);
-
-BOOL
-__stdcall
-SetPrinterA (
-         HANDLE hPrinter,
-         DWORD Level,
-         LPBYTE pPrinter,
-         DWORD Command
-);
-BOOL
-__stdcall
-SetPrinterW (
-         HANDLE hPrinter,
-         DWORD Level,
-         LPBYTE pPrinter,
-         DWORD Command
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-GetPrinterA (
-         HANDLE hPrinter,
-         DWORD Level,
-           LPBYTE pPrinter,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded
-);
-BOOL
-__stdcall
-GetPrinterW (
-         HANDLE hPrinter,
-         DWORD Level,
-           LPBYTE pPrinter,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-AddPrinterDriverA (
-         LPSTR pName,
-         DWORD Level,
-         LPBYTE pDriverInfo
-);
-BOOL
-__stdcall
-AddPrinterDriverW (
-         LPWSTR pName,
-         DWORD Level,
-         LPBYTE pDriverInfo
-);
-
-
-
-
-
-
-
-BOOL
-__stdcall
-AddPrinterDriverExA (
-         LPSTR pName,
-         DWORD Level,
-         LPBYTE pDriverInfo,
-         DWORD dwFileCopyFlags
-);
-BOOL
-__stdcall
-AddPrinterDriverExW (
-         LPWSTR pName,
-         DWORD Level,
-         LPBYTE pDriverInfo,
-         DWORD dwFileCopyFlags
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-EnumPrinterDriversA (
-         LPSTR pName,
-           LPSTR pEnvironment,
-         DWORD Level,
-           LPBYTE pDriverInfo,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded,
-         LPDWORD pcReturned
-);
-BOOL
-__stdcall
-EnumPrinterDriversW (
-         LPWSTR pName,
-           LPWSTR pEnvironment,
-         DWORD Level,
-           LPBYTE pDriverInfo,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded,
-         LPDWORD pcReturned
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-GetPrinterDriverA (
-         HANDLE hPrinter,
-           LPSTR pEnvironment,
-         DWORD Level,
-           LPBYTE pDriverInfo,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded
-);
-BOOL
-__stdcall
-GetPrinterDriverW (
-         HANDLE hPrinter,
-           LPWSTR pEnvironment,
-         DWORD Level,
-           LPBYTE pDriverInfo,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-GetPrinterDriverDirectoryA (
-         LPSTR pName,
-           LPSTR pEnvironment,
-         DWORD Level,
-           LPBYTE pDriverDirectory,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded
-);
-BOOL
-__stdcall
-GetPrinterDriverDirectoryW (
-         LPWSTR pName,
-           LPWSTR pEnvironment,
-         DWORD Level,
-           LPBYTE pDriverDirectory,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-DeletePrinterDriverA (
-         LPSTR pName,
-           LPSTR pEnvironment,
-         LPSTR pDriverName
-);
-BOOL
-__stdcall
-DeletePrinterDriverW (
-         LPWSTR pName,
-           LPWSTR pEnvironment,
-         LPWSTR pDriverName
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-DeletePrinterDriverExA (
-         LPSTR pName,
-           LPSTR pEnvironment,
-         LPSTR pDriverName,
-         DWORD dwDeleteFlag,
-         DWORD dwVersionFlag
-);
-BOOL
-__stdcall
-DeletePrinterDriverExW (
-         LPWSTR pName,
-           LPWSTR pEnvironment,
-         LPWSTR pDriverName,
-         DWORD dwDeleteFlag,
-         DWORD dwVersionFlag
-);
-
-
-
-
-
-
-
-BOOL
-__stdcall
-AddPrintProcessorA (
-         LPSTR pName,
-           LPSTR pEnvironment,
-         LPSTR pPathName,
-         LPSTR pPrintProcessorName
-);
-BOOL
-__stdcall
-AddPrintProcessorW (
-         LPWSTR pName,
-           LPWSTR pEnvironment,
-         LPWSTR pPathName,
-         LPWSTR pPrintProcessorName
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-EnumPrintProcessorsA (
-         LPSTR pName,
-           LPSTR pEnvironment,
-         DWORD Level,
-             LPBYTE pPrintProcessorInfo,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded,
-         LPDWORD pcReturned
-);
-BOOL
-__stdcall
-EnumPrintProcessorsW (
-         LPWSTR pName,
-           LPWSTR pEnvironment,
-         DWORD Level,
-             LPBYTE pPrintProcessorInfo,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded,
-         LPDWORD pcReturned
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-GetPrintProcessorDirectoryA (
-         LPSTR pName,
-           LPSTR pEnvironment,
-         DWORD Level,
-           LPBYTE pPrintProcessorInfo,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded
-);
-BOOL
-__stdcall
-GetPrintProcessorDirectoryW (
-         LPWSTR pName,
-           LPWSTR pEnvironment,
-         DWORD Level,
-           LPBYTE pPrintProcessorInfo,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-EnumPrintProcessorDatatypesA (
-         LPSTR pName,
-         LPSTR pPrintProcessorName,
-         DWORD Level,
-             LPBYTE pDatatypes,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded,
-         LPDWORD pcReturned
-);
-BOOL
-__stdcall
-EnumPrintProcessorDatatypesW (
-         LPWSTR pName,
-         LPWSTR pPrintProcessorName,
-         DWORD Level,
-             LPBYTE pDatatypes,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded,
-         LPDWORD pcReturned
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-DeletePrintProcessorA (
-         LPSTR pName,
-           LPSTR pEnvironment,
-         LPSTR pPrintProcessorName
-);
-BOOL
-__stdcall
-DeletePrintProcessorW (
-         LPWSTR pName,
-           LPWSTR pEnvironment,
-         LPWSTR pPrintProcessorName
-);
-
-
-
-
-
-
-DWORD
-__stdcall
-StartDocPrinterA ( 
-         HANDLE hPrinter,
-         DWORD Level,
-         LPBYTE pDocInfo
-);
-DWORD
-__stdcall
-StartDocPrinterW ( 
-         HANDLE hPrinter,
-         DWORD Level,
-         LPBYTE pDocInfo
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-StartPagePrinter (
-         HANDLE hPrinter
-);
-
-BOOL
-__stdcall
-WritePrinter (
-         HANDLE hPrinter,
-           LPVOID pBuf,
-         DWORD cbBuf,
-         LPDWORD pcWritten
-);
-
-
-BOOL
-__stdcall
-FlushPrinter (
-         HANDLE hPrinter,
-           LPVOID pBuf,
-         DWORD cbBuf,
-         LPDWORD pcWritten,
-         DWORD cSleep
-);
-
-BOOL
-__stdcall
-EndPagePrinter (
-        HANDLE hPrinter
-);
-
-BOOL
-__stdcall
-AbortPrinter (
-        HANDLE hPrinter
-);
-
-BOOL
-__stdcall
-ReadPrinter (
-         HANDLE  hPrinter,
-           LPVOID pBuf,
-         DWORD cbBuf,
-         LPDWORD pNoBytesRead
-);
-
-BOOL
-__stdcall
-EndDocPrinter (
-        HANDLE hPrinter
-);
-
-BOOL
-__stdcall
-AddJobA (
-         HANDLE hPrinter,
-         DWORD Level,
-           LPBYTE pData,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded
-);
-BOOL
-__stdcall
-AddJobW (
-         HANDLE hPrinter,
-         DWORD Level,
-           LPBYTE pData,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-ScheduleJob (
-         HANDLE hPrinter,
-         DWORD JobId
-);
-
-BOOL
-__stdcall
-PrinterProperties (
-         HWND hWnd,
-         HANDLE hPrinter
-);
-
-LONG
-__stdcall
-DocumentPropertiesA (
-         HWND hWnd,
-           HANDLE hPrinter,
-         LPSTR pDeviceName,
-           PDEVMODEA pDevModeOutput,
-           PDEVMODEA pDevModeInput,
-         DWORD fMode
-);
-LONG
-__stdcall
-DocumentPropertiesW (
-         HWND hWnd,
-           HANDLE hPrinter,
-         LPWSTR pDeviceName,
-           PDEVMODEW pDevModeOutput,
-           PDEVMODEW pDevModeInput,
-         DWORD fMode
-);
-
-
-
-
-
-
-LONG
-__stdcall
-AdvancedDocumentPropertiesA (
-         HWND hWnd,
-           HANDLE hPrinter,
-         LPSTR   pDeviceName,
-           PDEVMODEA pDevModeOutput,
-           PDEVMODEA pDevModeInput
-);
-LONG
-__stdcall
-AdvancedDocumentPropertiesW (
-         HWND hWnd,
-           HANDLE hPrinter,
-         LPWSTR   pDeviceName,
-           PDEVMODEW pDevModeOutput,
-           PDEVMODEW pDevModeInput
-);
-
-
-
-
-
-
-LONG
-ExtDeviceMode (
-         HWND hWnd,
-           HANDLE hInst,
-           LPDEVMODEA pDevModeOutput,
-         LPSTR pDeviceName,
-           LPSTR pPort,
-           LPDEVMODEA pDevModeInput,
-           LPSTR pProfile,
-         DWORD fMode
-);
-
-
-DWORD
-__stdcall
-GetPrinterDataA (
-         HANDLE hPrinter,
-           LPSTR pValueName,
-           LPDWORD pType,
-           LPBYTE pData,
-         DWORD nSize,
-         LPDWORD pcbNeeded
-);
-DWORD
-__stdcall
-GetPrinterDataW (
-         HANDLE hPrinter,
-           LPWSTR pValueName,
-           LPDWORD pType,
-           LPBYTE pData,
-         DWORD nSize,
-         LPDWORD pcbNeeded
-);
-
-
-
-
-
-
-DWORD
-__stdcall
-GetPrinterDataExA (
-         HANDLE hPrinter,
-           LPCSTR pKeyName,
-           LPCSTR pValueName,
-           LPDWORD pType,
-           LPBYTE pData,
-         DWORD nSize,
-         LPDWORD pcbNeeded
-);
-DWORD
-__stdcall
-GetPrinterDataExW (
-         HANDLE hPrinter,
-           LPCWSTR pKeyName,
-           LPCWSTR pValueName,
-           LPDWORD pType,
-           LPBYTE pData,
-         DWORD nSize,
-         LPDWORD pcbNeeded
-);
-
-
-
-
-
-
-DWORD
-__stdcall
-EnumPrinterDataA (
-         HANDLE hPrinter,
-         DWORD dwIndex,
-             LPSTR pValueName,
-         DWORD cbValueName,
-         LPDWORD pcbValueName,
-           LPDWORD pType,
-             LPBYTE pData,
-         DWORD cbData,
-         LPDWORD pcbData
-);
-DWORD
-__stdcall
-EnumPrinterDataW (
-         HANDLE hPrinter,
-         DWORD dwIndex,
-             LPWSTR pValueName,
-         DWORD cbValueName,
-         LPDWORD pcbValueName,
-           LPDWORD pType,
-             LPBYTE pData,
-         DWORD cbData,
-         LPDWORD pcbData
-);
-
-
-
-
-
-
-DWORD
-__stdcall
-EnumPrinterDataExA (
-         HANDLE hPrinter,
-         LPCSTR pKeyName,
-             LPBYTE pEnumValues,
-         DWORD cbEnumValues,
-         LPDWORD pcbEnumValues,
-         LPDWORD pnEnumValues
-);
-DWORD
-__stdcall
-EnumPrinterDataExW (
-         HANDLE hPrinter,
-         LPCWSTR pKeyName,
-             LPBYTE pEnumValues,
-         DWORD cbEnumValues,
-         LPDWORD pcbEnumValues,
-         LPDWORD pnEnumValues
-);
-
-
-
-
-
-
-DWORD
-__stdcall
-EnumPrinterKeyA (
-         HANDLE hPrinter,
-         LPCSTR pKeyName,
-             LPSTR pSubkey,
-         DWORD cbSubkey,
-         LPDWORD pcbSubkey
-);
-DWORD
-__stdcall
-EnumPrinterKeyW (
-         HANDLE hPrinter,
-         LPCWSTR pKeyName,
-             LPWSTR pSubkey,
-         DWORD cbSubkey,
-         LPDWORD pcbSubkey
-);
-
-
-
-
-
-
-DWORD
-__stdcall
-SetPrinterDataA (
-         HANDLE hPrinter,
-         LPSTR pValueName,
-         DWORD Type,
-           LPBYTE pData,
-         DWORD cbData
-);
-DWORD
-__stdcall
-SetPrinterDataW (
-         HANDLE hPrinter,
-         LPWSTR pValueName,
-         DWORD Type,
-           LPBYTE pData,
-         DWORD cbData
-);
-
-
-
-
-
-
-DWORD
-__stdcall
-SetPrinterDataExA (
-         HANDLE hPrinter,
-           LPCSTR pKeyName,
-         LPCSTR pValueName,
-         DWORD Type,
-           LPBYTE pData,
-         DWORD cbData
-);
-DWORD
-__stdcall
-SetPrinterDataExW (
-         HANDLE hPrinter,
-           LPCWSTR pKeyName,
-         LPCWSTR pValueName,
-         DWORD Type,
-           LPBYTE pData,
-         DWORD cbData
-);
-
-
-
-
-
-
-DWORD
-__stdcall
-DeletePrinterDataA (
-         HANDLE hPrinter,
-         LPSTR pValueName
-);
-DWORD
-__stdcall
-DeletePrinterDataW (
-         HANDLE hPrinter,
-         LPWSTR pValueName
-);
-
-
-
-
-
-
-DWORD
-__stdcall
-DeletePrinterDataExA (
-         HANDLE hPrinter,
-         LPCSTR pKeyName,
-         LPCSTR pValueName
-);
-DWORD
-__stdcall
-DeletePrinterDataExW (
-         HANDLE hPrinter,
-         LPCWSTR pKeyName,
-         LPCWSTR pValueName
-);
-
-
-
-
-
-
-DWORD
-__stdcall
-DeletePrinterKeyA (
-         HANDLE hPrinter,
-         LPCSTR pKeyName
-);
-DWORD
-__stdcall
-DeletePrinterKeyW (
-         HANDLE hPrinter,
-         LPCWSTR pKeyName
-);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _PRINTER_NOTIFY_OPTIONS_TYPE {
-    WORD Type;
-    WORD Reserved0;
-    DWORD Reserved1;
-    DWORD Reserved2;
-    DWORD Count;
-    PWORD pFields;
-} PRINTER_NOTIFY_OPTIONS_TYPE, *PPRINTER_NOTIFY_OPTIONS_TYPE, *LPPRINTER_NOTIFY_OPTIONS_TYPE;
-
-
-
-typedef struct _PRINTER_NOTIFY_OPTIONS {
-    DWORD Version;
-    DWORD Flags;
-    DWORD Count;
-    PPRINTER_NOTIFY_OPTIONS_TYPE pTypes;
-} PRINTER_NOTIFY_OPTIONS, *PPRINTER_NOTIFY_OPTIONS, *LPPRINTER_NOTIFY_OPTIONS;
-
-
-
-typedef struct _PRINTER_NOTIFY_INFO_DATA {
-    WORD Type;
-    WORD Field;
-    DWORD Reserved;
-    DWORD Id;
-    union {
-        DWORD adwData[2];
-        struct {
-            DWORD  cbBuf;
-            LPVOID pBuf;
-        } Data;
-    } NotifyData;
-} PRINTER_NOTIFY_INFO_DATA, *PPRINTER_NOTIFY_INFO_DATA, *LPPRINTER_NOTIFY_INFO_DATA;
-
-typedef struct _PRINTER_NOTIFY_INFO {
-    DWORD Version;
-    DWORD Flags;
-    DWORD Count;
-    PRINTER_NOTIFY_INFO_DATA aData[1];
-} PRINTER_NOTIFY_INFO, *PPRINTER_NOTIFY_INFO, *LPPRINTER_NOTIFY_INFO;
-
-typedef struct _BINARY_CONTAINER{
-    DWORD cbBuf;
-    LPBYTE pData;
-} BINARY_CONTAINER, *PBINARY_CONTAINER;
-
-typedef struct _BIDI_DATA{
-    DWORD dwBidiType;
-    union {
-        BOOL   bData;
-        LONG   iData;
-        LPWSTR sData;
-        FLOAT  fData;
-        BINARY_CONTAINER biData;
-        }u;
-} BIDI_DATA, *PBIDI_DATA, *LPBIDI_DATA;
-
-typedef struct _BIDI_REQUEST_DATA{
-    DWORD     dwReqNumber;
-    LPWSTR    pSchema;
-    BIDI_DATA data;
-} BIDI_REQUEST_DATA , *PBIDI_REQUEST_DATA , *LPBIDI_REQUEST_DATA;
-
-typedef struct _BIDI_REQUEST_CONTAINER{
-    DWORD Version;
-    DWORD Flags;
-    DWORD Count;
-    BIDI_REQUEST_DATA aData[ 1 ];
-}BIDI_REQUEST_CONTAINER, *PBIDI_REQUEST_CONTAINER, *LPBIDI_REQUEST_CONTAINER;
-
-typedef struct _BIDI_RESPONSE_DATA{
-    DWORD  dwResult;
-    DWORD  dwReqNumber;
-    LPWSTR pSchema;
-    BIDI_DATA data;
-} BIDI_RESPONSE_DATA, *PBIDI_RESPONSE_DATA, *LPBIDI_RESPONSE_DATA;
-
-typedef struct _BIDI_RESPONSE_CONTAINER{
-    DWORD Version;
-    DWORD Flags;
-    DWORD Count;
-    BIDI_RESPONSE_DATA aData[ 1 ];
-} BIDI_RESPONSE_CONTAINER, *PBIDI_RESPONSE_CONTAINER, *LPBIDI_RESPONSE_CONTAINER;
-
-
-
-
-
-
-typedef enum {
-    BIDI_NULL   = 0,
-    BIDI_INT    = 1,
-    BIDI_FLOAT  = 2,
-    BIDI_BOOL   = 3,
-    BIDI_STRING = 4,
-    BIDI_TEXT   = 5,
-    BIDI_ENUM   = 6,
-    BIDI_BLOB   = 7
-} BIDI_TYPE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-DWORD
-__stdcall
-WaitForPrinterChange (
-         HANDLE hPrinter,
-         DWORD Flags
-);
-
-HANDLE
-__stdcall
-FindFirstPrinterChangeNotification (
-         HANDLE hPrinter,
-         DWORD fdwFlags,
-         DWORD fdwOptions,
-           LPVOID pPrinterNotifyOptions
-);
-
-BOOL
-__stdcall
-FindNextPrinterChangeNotification (
-         HANDLE hChange,
-           PDWORD pdwChange,
-           LPVOID pPrinterNotifyOptions,
-           LPVOID *ppPrinterNotifyInfo
-);
-
-BOOL
-__stdcall
-FreePrinterNotifyInfo (
-         PPRINTER_NOTIFY_INFO pPrinterNotifyInfo
-);
-
-BOOL
-__stdcall
-FindClosePrinterChangeNotification (
-         HANDLE hChange
-);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-DWORD
-__stdcall
-PrinterMessageBoxA (
-         HANDLE hPrinter,
-         DWORD Error,
-         HWND hWnd,
-           LPSTR pText,
-           LPSTR pCaption,
-         DWORD dwType
-);
-DWORD
-__stdcall
-PrinterMessageBoxW (
-         HANDLE hPrinter,
-         DWORD Error,
-         HWND hWnd,
-           LPWSTR pText,
-           LPWSTR pCaption,
-         DWORD dwType
-);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-BOOL
-__stdcall
-ClosePrinter (
-         HANDLE hPrinter
-);
-
-BOOL
-__stdcall
-AddFormA (
-         HANDLE hPrinter,
-         DWORD Level,
-         LPBYTE pForm
-);
-BOOL
-__stdcall
-AddFormW (
-         HANDLE hPrinter,
-         DWORD Level,
-         LPBYTE pForm
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-DeleteFormA (
-         HANDLE hPrinter,
-         LPSTR pFormName
-);
-BOOL
-__stdcall
-DeleteFormW (
-         HANDLE hPrinter,
-         LPWSTR pFormName
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-GetFormA (
-         HANDLE hPrinter,
-         LPSTR pFormName,
-         DWORD Level,
-           LPBYTE pForm,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded
-);
-BOOL
-__stdcall
-GetFormW (
-         HANDLE hPrinter,
-         LPWSTR pFormName,
-         DWORD Level,
-           LPBYTE pForm,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-SetFormA (
-         HANDLE hPrinter,
-         LPSTR pFormName,
-         DWORD Level,
-         LPBYTE pForm
-);
-BOOL
-__stdcall
-SetFormW (
-         HANDLE hPrinter,
-         LPWSTR pFormName,
-         DWORD Level,
-         LPBYTE pForm
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-EnumFormsA (
-         HANDLE hPrinter,
-         DWORD Level,
-             LPBYTE pForm,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded,
-         LPDWORD pcReturned
-);
-BOOL
-__stdcall
-EnumFormsW (
-         HANDLE hPrinter,
-         DWORD Level,
-             LPBYTE pForm,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded,
-         LPDWORD pcReturned
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-EnumMonitorsA (
-         LPSTR pName,
-         DWORD Level,
-             LPBYTE pMonitor,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded,
-         LPDWORD pcReturned
-);
-BOOL
-__stdcall
-EnumMonitorsW (
-         LPWSTR pName,
-         DWORD Level,
-             LPBYTE pMonitor,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded,
-         LPDWORD pcReturned
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-AddMonitorA (
-         LPSTR pName,
-         DWORD Level,
-           LPBYTE pMonitorInfo
-);
-BOOL
-__stdcall
-AddMonitorW (
-         LPWSTR pName,
-         DWORD Level,
-           LPBYTE pMonitorInfo
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-DeleteMonitorA (
-         LPSTR pName,
-           LPSTR pEnvironment,
-         LPSTR pMonitorName
-);
-BOOL
-__stdcall
-DeleteMonitorW (
-         LPWSTR pName,
-           LPWSTR pEnvironment,
-         LPWSTR pMonitorName
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-EnumPortsA (
-         LPSTR pName,
-         DWORD Level,
-             LPBYTE  pPorts,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded,
-         LPDWORD pcReturned
-);
-BOOL
-__stdcall
-EnumPortsW (
-         LPWSTR pName,
-         DWORD Level,
-             LPBYTE  pPorts,
-         DWORD cbBuf,
-         LPDWORD pcbNeeded,
-         LPDWORD pcReturned
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-AddPortA (
-         LPSTR pName,
-         HWND hWnd,
-         LPSTR pMonitorName
-);
-BOOL
-__stdcall
-AddPortW (
-         LPWSTR pName,
-         HWND hWnd,
-         LPWSTR pMonitorName
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-ConfigurePortA (
-         LPSTR pName,
-         HWND hWnd,
-         LPSTR pPortName
-);
-BOOL
-__stdcall
-ConfigurePortW (
-         LPWSTR pName,
-         HWND hWnd,
-         LPWSTR pPortName
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-DeletePortA (
-         LPSTR pName,
-         HWND hWnd,
-         LPSTR pPortName
-);
-BOOL
-__stdcall
-DeletePortW (
-         LPWSTR pName,
-         HWND hWnd,
-         LPWSTR pPortName
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-XcvDataW (
-         HANDLE hXcv,
-         PCWSTR pszDataName,
-             PBYTE pInputData,
-         DWORD cbInputData,
-           PBYTE pOutputData,
-         DWORD cbOutputData,
-         PDWORD pcbOutputNeeded,
-         PDWORD  pdwStatus
-);
-
-
-
-BOOL
-__stdcall
-GetDefaultPrinterA (
-             LPSTR pszBuffer,
-         LPDWORD pcchBuffer
-    );
-BOOL
-__stdcall
-GetDefaultPrinterW (
-             LPWSTR pszBuffer,
-         LPDWORD pcchBuffer
-    );
-
-
-
-
-
-
-BOOL
-__stdcall
-SetDefaultPrinterA (
-         LPCSTR pszPrinter
-    );
-BOOL
-__stdcall
-SetDefaultPrinterW (
-         LPCWSTR pszPrinter
-    );
-
-
-
-
-
-
-
-BOOL
-__stdcall
-SetPortA (
-         LPSTR pName,
-         LPSTR pPortName,
-         DWORD dwLevel,
-         LPBYTE pPortInfo
-);
-BOOL
-__stdcall
-SetPortW (
-         LPWSTR pName,
-         LPWSTR pPortName,
-         DWORD dwLevel,
-         LPBYTE pPortInfo
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-AddPrinterConnectionA (
-         LPSTR pName
-);
-BOOL
-__stdcall
-AddPrinterConnectionW (
-         LPWSTR pName
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-DeletePrinterConnectionA ( 
-         LPSTR pName
-);
-BOOL
-__stdcall
-DeletePrinterConnectionW ( 
-         LPWSTR pName
-);
-
-
-
-
-
-
-HANDLE
-__stdcall
-ConnectToPrinterDlg (
-         HWND hwnd,
-         DWORD Flags
-);
-
-typedef struct _PROVIDOR_INFO_1A{
-    LPSTR     pName;
-    LPSTR     pEnvironment;
-    LPSTR     pDLLName;
-} PROVIDOR_INFO_1A, *PPROVIDOR_INFO_1A, *LPPROVIDOR_INFO_1A;
-typedef struct _PROVIDOR_INFO_1W{
-    LPWSTR    pName;
-    LPWSTR    pEnvironment;
-    LPWSTR    pDLLName;
-} PROVIDOR_INFO_1W, *PPROVIDOR_INFO_1W, *LPPROVIDOR_INFO_1W;
-
-typedef PROVIDOR_INFO_1W PROVIDOR_INFO_1;
-typedef PPROVIDOR_INFO_1W PPROVIDOR_INFO_1;
-typedef LPPROVIDOR_INFO_1W LPPROVIDOR_INFO_1;
-
-
-
-
-
-
-typedef struct _PROVIDOR_INFO_2A{
-    LPSTR     pOrder;
-} PROVIDOR_INFO_2A, *PPROVIDOR_INFO_2A, *LPPROVIDOR_INFO_2A;
-typedef struct _PROVIDOR_INFO_2W{
-    LPWSTR    pOrder;
-} PROVIDOR_INFO_2W, *PPROVIDOR_INFO_2W, *LPPROVIDOR_INFO_2W;
-
-typedef PROVIDOR_INFO_2W PROVIDOR_INFO_2;
-typedef PPROVIDOR_INFO_2W PPROVIDOR_INFO_2;
-typedef LPPROVIDOR_INFO_2W LPPROVIDOR_INFO_2;
-
-
-
-
-
-
-BOOL
-__stdcall
-AddPrintProvidorA (
-         LPSTR pName,
-         DWORD level,
-         LPBYTE pProvidorInfo
-);
-BOOL
-__stdcall
-AddPrintProvidorW (
-         LPWSTR pName,
-         DWORD level,
-         LPBYTE pProvidorInfo
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-DeletePrintProvidorA (
-         LPSTR pName,
-           LPSTR pEnvironment,
-         LPSTR pPrintProvidorName
-);
-BOOL
-__stdcall
-DeletePrintProvidorW (
-         LPWSTR pName,
-           LPWSTR pEnvironment,
-         LPWSTR pPrintProvidorName
-);
-
-
-
-
-
-
-BOOL
-__stdcall
-IsValidDevmodeA (
-         PDEVMODEA pDevmode,
-         size_t DevmodeSize
-    );
-BOOL
-__stdcall
-IsValidDevmodeW (
-         PDEVMODEW pDevmode,
-         size_t DevmodeSize
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,8)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,8)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-   
-   
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum tagREGCLS
-{
-    REGCLS_SINGLEUSE = 0,       
-    REGCLS_MULTIPLEUSE = 1,     
-                                
-    REGCLS_MULTI_SEPARATE = 2,  
-                                
-    REGCLS_SUSPENDED      = 4,  
-                                
-    REGCLS_SURROGATE      = 8   
-                                
-                                
-} REGCLS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct    IRpcStubBuffer     IRpcStubBuffer;
-typedef struct    IRpcChannelBuffer  IRpcChannelBuffer;
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-#pragma warning( disable: 4049 )  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
- 
-
-
-
-typedef struct IUnknown IUnknown;
-
-
-
-
-
-typedef struct AsyncIUnknown AsyncIUnknown;
-
-
-
-
-
-typedef struct IClassFactory IClassFactory;
-
-
-
-
-
-
-
-extern "C"{
-
-
-void * __stdcall MIDL_user_allocate(size_t);
-void __stdcall MIDL_user_free( void * ); 
-
-
- 
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_unknwn_0000_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_unknwn_0000_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IUnknown *LPUNKNOWN;
-
-
-
-
-
-
-
-    extern "C" const IID IID_IUnknown;
-    extern "C++"
-    {
-        struct __declspec(uuid("00000000-0000-0000-C000-000000000046")) __declspec(novtable)
-        IUnknown
-        {
-        public:
-            
-            virtual HRESULT __stdcall QueryInterface( 
-                 const IID & riid,
-                 void  * *ppvObject) = 0;
-            
-            virtual ULONG __stdcall AddRef( void) = 0;
-            
-            virtual ULONG __stdcall Release( void) = 0;
-    	
-            template<class Q>
-    	HRESULT __stdcall QueryInterface(Q** pp)
-    	{
-    	    return QueryInterface(__uuidof(Q), (void **)pp);
-    	}
-            
-            
-        };
-    } 
-    HRESULT __stdcall IUnknown_QueryInterface_Proxy(
-        IUnknown  * This,
-         const IID & riid,
-         void  * *ppvObject);
-    
-    void __stdcall IUnknown_QueryInterface_Stub(
-        IRpcStubBuffer *This,
-        IRpcChannelBuffer *_pRpcChannelBuffer,
-        PRPC_MESSAGE _pRpcMessage,
-        DWORD *_pdwStubPhase);
-    
-    ULONG __stdcall IUnknown_AddRef_Proxy(
-        IUnknown  * This);
-    
-    void __stdcall IUnknown_AddRef_Stub(
-        IRpcStubBuffer *This,
-        IRpcChannelBuffer *_pRpcChannelBuffer,
-        PRPC_MESSAGE _pRpcMessage,
-        DWORD *_pdwStubPhase);
-    
-    ULONG __stdcall IUnknown_Release_Proxy(
-        IUnknown  * This);
-    
-    void __stdcall IUnknown_Release_Stub(
-        IRpcStubBuffer *This,
-        IRpcChannelBuffer *_pRpcChannelBuffer,
-        PRPC_MESSAGE _pRpcMessage,
-        DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_unknwn_0005_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_unknwn_0005_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_AsyncIUnknown;
-
-
-    
-    struct __declspec(uuid("000e0000-0000-0000-C000-000000000046")) __declspec(novtable)
-    AsyncIUnknown : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Begin_QueryInterface( 
-             const IID & riid) = 0;
-        
-        virtual HRESULT __stdcall Finish_QueryInterface( 
-             void **ppvObject) = 0;
-        
-        virtual HRESULT __stdcall Begin_AddRef( void) = 0;
-        
-        virtual ULONG __stdcall Finish_AddRef( void) = 0;
-        
-        virtual HRESULT __stdcall Begin_Release( void) = 0;
-        
-        virtual ULONG __stdcall Finish_Release( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall AsyncIUnknown_Begin_QueryInterface_Proxy( 
-    AsyncIUnknown * This,
-     const IID & riid);
-
-
-void __stdcall AsyncIUnknown_Begin_QueryInterface_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall AsyncIUnknown_Finish_QueryInterface_Proxy( 
-    AsyncIUnknown * This,
-     void **ppvObject);
-
-
-void __stdcall AsyncIUnknown_Finish_QueryInterface_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall AsyncIUnknown_Begin_AddRef_Proxy( 
-    AsyncIUnknown * This);
-
-
-void __stdcall AsyncIUnknown_Begin_AddRef_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-ULONG __stdcall AsyncIUnknown_Finish_AddRef_Proxy( 
-    AsyncIUnknown * This);
-
-
-void __stdcall AsyncIUnknown_Finish_AddRef_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall AsyncIUnknown_Begin_Release_Proxy( 
-    AsyncIUnknown * This);
-
-
-void __stdcall AsyncIUnknown_Begin_Release_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-ULONG __stdcall AsyncIUnknown_Finish_Release_Proxy( 
-    AsyncIUnknown * This);
-
-
-void __stdcall AsyncIUnknown_Finish_Release_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IClassFactory *LPCLASSFACTORY;
-
-
-extern "C" const IID IID_IClassFactory;
-
-
-    
-    struct __declspec(uuid("00000001-0000-0000-C000-000000000046")) __declspec(novtable)
-    IClassFactory : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall CreateInstance( 
-             IUnknown *pUnkOuter,
-             const IID & riid,
-             void **ppvObject) = 0;
-        
-        virtual  HRESULT __stdcall LockServer( 
-             BOOL fLock) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IClassFactory_RemoteCreateInstance_Proxy( 
-    IClassFactory * This,
-     const IID & riid,
-     IUnknown **ppvObject);
-
-
-void __stdcall IClassFactory_RemoteCreateInstance_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IClassFactory_RemoteLockServer_Proxy( 
-    IClassFactory * This,
-     BOOL fLock);
-
-
-void __stdcall IClassFactory_RemoteLockServer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
- HRESULT __stdcall IClassFactory_CreateInstance_Proxy( 
-    IClassFactory * This,
-     IUnknown *pUnkOuter,
-     const IID & riid,
-     void **ppvObject);
-
-
- HRESULT __stdcall IClassFactory_CreateInstance_Stub( 
-    IClassFactory * This,
-     const IID & riid,
-     IUnknown **ppvObject);
-
- HRESULT __stdcall IClassFactory_LockServer_Proxy( 
-    IClassFactory * This,
-     BOOL fLock);
-
-
- HRESULT __stdcall IClassFactory_LockServer_Stub( 
-    IClassFactory * This,
-     BOOL fLock);
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-#pragma warning( disable: 4049 )  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
- 
-
-
-
-typedef struct IMarshal IMarshal;
-
-
-
-
-
-typedef struct IMarshal2 IMarshal2;
-
-
-
-
-
-typedef struct IMalloc IMalloc;
-
-
-
-
-
-typedef struct IMallocSpy IMallocSpy;
-
-
-
-
-
-typedef struct IStdMarshalInfo IStdMarshalInfo;
-
-
-
-
-
-typedef struct IExternalConnection IExternalConnection;
-
-
-
-
-
-typedef struct IMultiQI IMultiQI;
-
-
-
-
-
-typedef struct AsyncIMultiQI AsyncIMultiQI;
-
-
-
-
-
-typedef struct IInternalUnknown IInternalUnknown;
-
-
-
-
-
-typedef struct IEnumUnknown IEnumUnknown;
-
-
-
-
-
-typedef struct IBindCtx IBindCtx;
-
-
-
-
-
-typedef struct IEnumMoniker IEnumMoniker;
-
-
-
-
-
-typedef struct IRunnableObject IRunnableObject;
-
-
-
-
-
-typedef struct IRunningObjectTable IRunningObjectTable;
-
-
-
-
-
-typedef struct IPersist IPersist;
-
-
-
-
-
-typedef struct IPersistStream IPersistStream;
-
-
-
-
-
-typedef struct IMoniker IMoniker;
-
-
-
-
-
-typedef struct IROTData IROTData;
-
-
-
-
-
-typedef struct IEnumString IEnumString;
-
-
-
-
-
-typedef struct ISequentialStream ISequentialStream;
-
-
-
-
-
-typedef struct IStream IStream;
-
-
-
-
-
-typedef struct IEnumSTATSTG IEnumSTATSTG;
-
-
-
-
-
-typedef struct IStorage IStorage;
-
-
-
-
-
-typedef struct IPersistFile IPersistFile;
-
-
-
-
-
-typedef struct IPersistStorage IPersistStorage;
-
-
-
-
-
-typedef struct ILockBytes ILockBytes;
-
-
-
-
-
-typedef struct IEnumFORMATETC IEnumFORMATETC;
-
-
-
-
-
-typedef struct IEnumSTATDATA IEnumSTATDATA;
-
-
-
-
-
-typedef struct IRootStorage IRootStorage;
-
-
-
-
-
-typedef struct IAdviseSink IAdviseSink;
-
-
-
-
-
-typedef struct AsyncIAdviseSink AsyncIAdviseSink;
-
-
-
-
-
-typedef struct IAdviseSink2 IAdviseSink2;
-
-
-
-
-
-typedef struct AsyncIAdviseSink2 AsyncIAdviseSink2;
-
-
-
-
-
-typedef struct IDataObject IDataObject;
-
-
-
-
-
-typedef struct IDataAdviseHolder IDataAdviseHolder;
-
-
-
-
-
-typedef struct IMessageFilter IMessageFilter;
-
-
-
-
-
-typedef struct IRpcChannelBuffer IRpcChannelBuffer;
-
-
-
-
-
-typedef struct IRpcChannelBuffer2 IRpcChannelBuffer2;
-
-
-
-
-
-typedef struct IAsyncRpcChannelBuffer IAsyncRpcChannelBuffer;
-
-
-
-
-
-typedef struct IRpcChannelBuffer3 IRpcChannelBuffer3;
-
-
-
-
-
-typedef struct IRpcSyntaxNegotiate IRpcSyntaxNegotiate;
-
-
-
-
-
-typedef struct IRpcProxyBuffer IRpcProxyBuffer;
-
-
-
-
-
-typedef struct IRpcStubBuffer IRpcStubBuffer;
-
-
-
-
-
-typedef struct IPSFactoryBuffer IPSFactoryBuffer;
-
-
-
-
-
-typedef struct IChannelHook IChannelHook;
-
-
-
-
-
-typedef struct IClientSecurity IClientSecurity;
-
-
-
-
-
-typedef struct IServerSecurity IServerSecurity;
-
-
-
-
-
-typedef struct IClassActivator IClassActivator;
-
-
-
-
-
-typedef struct IRpcOptions IRpcOptions;
-
-
-
-
-
-typedef struct IFillLockBytes IFillLockBytes;
-
-
-
-
-
-typedef struct IProgressNotify IProgressNotify;
-
-
-
-
-
-typedef struct ILayoutStorage ILayoutStorage;
-
-
-
-
-
-typedef struct IBlockingLock IBlockingLock;
-
-
-
-
-
-typedef struct ITimeAndNoticeControl ITimeAndNoticeControl;
-
-
-
-
-
-typedef struct IOplockStorage IOplockStorage;
-
-
-
-
-
-typedef struct ISurrogate ISurrogate;
-
-
-
-
-
-typedef struct IGlobalInterfaceTable IGlobalInterfaceTable;
-
-
-
-
-
-typedef struct IDirectWriterLock IDirectWriterLock;
-
-
-
-
-
-typedef struct ISynchronize ISynchronize;
-
-
-
-
-
-typedef struct ISynchronizeHandle ISynchronizeHandle;
-
-
-
-
-
-typedef struct ISynchronizeEvent ISynchronizeEvent;
-
-
-
-
-
-typedef struct ISynchronizeContainer ISynchronizeContainer;
-
-
-
-
-
-typedef struct ISynchronizeMutex ISynchronizeMutex;
-
-
-
-
-
-typedef struct ICancelMethodCalls ICancelMethodCalls;
-
-
-
-
-
-typedef struct IAsyncManager IAsyncManager;
-
-
-
-
-
-typedef struct ICallFactory ICallFactory;
-
-
-
-
-
-typedef struct IRpcHelper IRpcHelper;
-
-
-
-
-
-typedef struct IReleaseMarshalBuffers IReleaseMarshalBuffers;
-
-
-
-
-
-typedef struct IWaitMultiple IWaitMultiple;
-
-
-
-
-
-typedef struct IUrlMon IUrlMon;
-
-
-
-
-
-typedef struct IForegroundTransfer IForegroundTransfer;
-
-
-
-
-
-typedef struct IAddrTrackingControl IAddrTrackingControl;
-
-
-
-
-
-typedef struct IAddrExclusionControl IAddrExclusionControl;
-
-
-
-
-
-typedef struct IPipeByte IPipeByte;
-
-
-
-
-
-typedef struct AsyncIPipeByte AsyncIPipeByte;
-
-
-
-
-
-typedef struct IPipeLong IPipeLong;
-
-
-
-
-
-typedef struct AsyncIPipeLong AsyncIPipeLong;
-
-
-
-
-
-typedef struct IPipeDouble IPipeDouble;
-
-
-
-
-
-typedef struct AsyncIPipeDouble AsyncIPipeDouble;
-
-
-
-
-
-typedef struct IThumbnailExtractor IThumbnailExtractor;
-
-
-
-
-
-typedef struct IDummyHICONIncluder IDummyHICONIncluder;
-
-
-
-
-
-typedef struct IEnumContextProps IEnumContextProps;
-
-
-
-
-
-typedef struct IContext IContext;
-
-
-
-
-
-typedef struct IObjContext IObjContext;
-
-
-
-
-
-typedef struct IProcessLock IProcessLock;
-
-
-
-
-
-typedef struct ISurrogateService ISurrogateService;
-
-
-
-
-
-typedef struct IComThreadingInfo IComThreadingInfo;
-
-
-
-
-
-typedef struct IProcessInitControl IProcessInitControl;
-
-
-
-
-
-typedef struct IInitializeSpy IInitializeSpy;
-
-
-
-
-
-
-
-extern "C"{
-
-
-void * __stdcall MIDL_user_allocate(size_t);
-void __stdcall MIDL_user_free( void * ); 
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(push)
-
-#pragma warning(disable:4201)
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _COSERVERINFO
-    {
-    DWORD dwReserved1;
-    LPWSTR pwszName;
-    COAUTHINFO *pAuthInfo;
-    DWORD dwReserved2;
-    } 	COSERVERINFO;
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0000_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0000_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IMarshal *LPMARSHAL;
-
-
-extern "C" const IID IID_IMarshal;
-
-
-    
-    struct __declspec(uuid("00000003-0000-0000-C000-000000000046")) __declspec(novtable)
-    IMarshal : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetUnmarshalClass( 
-             const IID & riid,
-             void *pv,
-             DWORD dwDestContext,
-             void *pvDestContext,
-             DWORD mshlflags,
-             CLSID *pCid) = 0;
-        
-        virtual HRESULT __stdcall GetMarshalSizeMax( 
-             const IID & riid,
-             void *pv,
-             DWORD dwDestContext,
-             void *pvDestContext,
-             DWORD mshlflags,
-             DWORD *pSize) = 0;
-        
-        virtual HRESULT __stdcall MarshalInterface( 
-             IStream *pStm,
-             const IID & riid,
-             void *pv,
-             DWORD dwDestContext,
-             void *pvDestContext,
-             DWORD mshlflags) = 0;
-        
-        virtual HRESULT __stdcall UnmarshalInterface( 
-             IStream *pStm,
-             const IID & riid,
-             void **ppv) = 0;
-        
-        virtual HRESULT __stdcall ReleaseMarshalData( 
-             IStream *pStm) = 0;
-        
-        virtual HRESULT __stdcall DisconnectObject( 
-             DWORD dwReserved) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IMarshal_GetUnmarshalClass_Proxy( 
-    IMarshal * This,
-     const IID & riid,
-     void *pv,
-     DWORD dwDestContext,
-     void *pvDestContext,
-     DWORD mshlflags,
-     CLSID *pCid);
-
-
-void __stdcall IMarshal_GetUnmarshalClass_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMarshal_GetMarshalSizeMax_Proxy( 
-    IMarshal * This,
-     const IID & riid,
-     void *pv,
-     DWORD dwDestContext,
-     void *pvDestContext,
-     DWORD mshlflags,
-     DWORD *pSize);
-
-
-void __stdcall IMarshal_GetMarshalSizeMax_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMarshal_MarshalInterface_Proxy( 
-    IMarshal * This,
-     IStream *pStm,
-     const IID & riid,
-     void *pv,
-     DWORD dwDestContext,
-     void *pvDestContext,
-     DWORD mshlflags);
-
-
-void __stdcall IMarshal_MarshalInterface_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMarshal_UnmarshalInterface_Proxy( 
-    IMarshal * This,
-     IStream *pStm,
-     const IID & riid,
-     void **ppv);
-
-
-void __stdcall IMarshal_UnmarshalInterface_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMarshal_ReleaseMarshalData_Proxy( 
-    IMarshal * This,
-     IStream *pStm);
-
-
-void __stdcall IMarshal_ReleaseMarshalData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMarshal_DisconnectObject_Proxy( 
-    IMarshal * This,
-     DWORD dwReserved);
-
-
-void __stdcall IMarshal_DisconnectObject_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IMarshal2 *LPMARSHAL2;
-
-
-extern "C" const IID IID_IMarshal2;
-
-
-    
-    struct __declspec(uuid("000001cf-0000-0000-C000-000000000046")) __declspec(novtable)
-    IMarshal2 : public IMarshal
-    {
-    public:
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IMalloc *LPMALLOC;
-
-
-extern "C" const IID IID_IMalloc;
-
-
-    
-    struct __declspec(uuid("00000002-0000-0000-C000-000000000046")) __declspec(novtable)
-    IMalloc : public IUnknown
-    {
-    public:
-        virtual void *__stdcall Alloc( 
-             SIZE_T cb) = 0;
-        
-        virtual void *__stdcall Realloc( 
-             void *pv,
-             SIZE_T cb) = 0;
-        
-        virtual void __stdcall Free( 
-             void *pv) = 0;
-        
-        virtual SIZE_T __stdcall GetSize( 
-             void *pv) = 0;
-        
-        virtual int __stdcall DidAlloc( 
-            void *pv) = 0;
-        
-        virtual void __stdcall HeapMinimize( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-void *__stdcall IMalloc_Alloc_Proxy( 
-    IMalloc * This,
-     SIZE_T cb);
-
-
-void __stdcall IMalloc_Alloc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void *__stdcall IMalloc_Realloc_Proxy( 
-    IMalloc * This,
-     void *pv,
-     SIZE_T cb);
-
-
-void __stdcall IMalloc_Realloc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void __stdcall IMalloc_Free_Proxy( 
-    IMalloc * This,
-     void *pv);
-
-
-void __stdcall IMalloc_Free_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-SIZE_T __stdcall IMalloc_GetSize_Proxy( 
-    IMalloc * This,
-     void *pv);
-
-
-void __stdcall IMalloc_GetSize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-int __stdcall IMalloc_DidAlloc_Proxy( 
-    IMalloc * This,
-    void *pv);
-
-
-void __stdcall IMalloc_DidAlloc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void __stdcall IMalloc_HeapMinimize_Proxy( 
-    IMalloc * This);
-
-
-void __stdcall IMalloc_HeapMinimize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IMallocSpy *LPMALLOCSPY;
-
-
-extern "C" const IID IID_IMallocSpy;
-
-
-    
-    struct __declspec(uuid("0000001d-0000-0000-C000-000000000046")) __declspec(novtable)
-    IMallocSpy : public IUnknown
-    {
-    public:
-        virtual SIZE_T __stdcall PreAlloc( 
-             SIZE_T cbRequest) = 0;
-        
-        virtual void *__stdcall PostAlloc( 
-             void *pActual) = 0;
-        
-        virtual void *__stdcall PreFree( 
-             void *pRequest,
-             BOOL fSpyed) = 0;
-        
-        virtual void __stdcall PostFree( 
-             BOOL fSpyed) = 0;
-        
-        virtual SIZE_T __stdcall PreRealloc( 
-             void *pRequest,
-             SIZE_T cbRequest,
-             void **ppNewRequest,
-             BOOL fSpyed) = 0;
-        
-        virtual void *__stdcall PostRealloc( 
-             void *pActual,
-             BOOL fSpyed) = 0;
-        
-        virtual void *__stdcall PreGetSize( 
-             void *pRequest,
-             BOOL fSpyed) = 0;
-        
-        virtual SIZE_T __stdcall PostGetSize( 
-             SIZE_T cbActual,
-             BOOL fSpyed) = 0;
-        
-        virtual void *__stdcall PreDidAlloc( 
-             void *pRequest,
-             BOOL fSpyed) = 0;
-        
-        virtual int __stdcall PostDidAlloc( 
-             void *pRequest,
-             BOOL fSpyed,
-             int fActual) = 0;
-        
-        virtual void __stdcall PreHeapMinimize( void) = 0;
-        
-        virtual void __stdcall PostHeapMinimize( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-SIZE_T __stdcall IMallocSpy_PreAlloc_Proxy( 
-    IMallocSpy * This,
-     SIZE_T cbRequest);
-
-
-void __stdcall IMallocSpy_PreAlloc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void *__stdcall IMallocSpy_PostAlloc_Proxy( 
-    IMallocSpy * This,
-     void *pActual);
-
-
-void __stdcall IMallocSpy_PostAlloc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void *__stdcall IMallocSpy_PreFree_Proxy( 
-    IMallocSpy * This,
-     void *pRequest,
-     BOOL fSpyed);
-
-
-void __stdcall IMallocSpy_PreFree_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void __stdcall IMallocSpy_PostFree_Proxy( 
-    IMallocSpy * This,
-     BOOL fSpyed);
-
-
-void __stdcall IMallocSpy_PostFree_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-SIZE_T __stdcall IMallocSpy_PreRealloc_Proxy( 
-    IMallocSpy * This,
-     void *pRequest,
-     SIZE_T cbRequest,
-     void **ppNewRequest,
-     BOOL fSpyed);
-
-
-void __stdcall IMallocSpy_PreRealloc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void *__stdcall IMallocSpy_PostRealloc_Proxy( 
-    IMallocSpy * This,
-     void *pActual,
-     BOOL fSpyed);
-
-
-void __stdcall IMallocSpy_PostRealloc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void *__stdcall IMallocSpy_PreGetSize_Proxy( 
-    IMallocSpy * This,
-     void *pRequest,
-     BOOL fSpyed);
-
-
-void __stdcall IMallocSpy_PreGetSize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-SIZE_T __stdcall IMallocSpy_PostGetSize_Proxy( 
-    IMallocSpy * This,
-     SIZE_T cbActual,
-     BOOL fSpyed);
-
-
-void __stdcall IMallocSpy_PostGetSize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void *__stdcall IMallocSpy_PreDidAlloc_Proxy( 
-    IMallocSpy * This,
-     void *pRequest,
-     BOOL fSpyed);
-
-
-void __stdcall IMallocSpy_PreDidAlloc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-int __stdcall IMallocSpy_PostDidAlloc_Proxy( 
-    IMallocSpy * This,
-     void *pRequest,
-     BOOL fSpyed,
-     int fActual);
-
-
-void __stdcall IMallocSpy_PostDidAlloc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void __stdcall IMallocSpy_PreHeapMinimize_Proxy( 
-    IMallocSpy * This);
-
-
-void __stdcall IMallocSpy_PreHeapMinimize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void __stdcall IMallocSpy_PostHeapMinimize_Proxy( 
-    IMallocSpy * This);
-
-
-void __stdcall IMallocSpy_PostHeapMinimize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IStdMarshalInfo *LPSTDMARSHALINFO;
-
-
-extern "C" const IID IID_IStdMarshalInfo;
-
-
-    
-    struct __declspec(uuid("00000018-0000-0000-C000-000000000046")) __declspec(novtable)
-    IStdMarshalInfo : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetClassForHandler( 
-             DWORD dwDestContext,
-             void *pvDestContext,
-             CLSID *pClsid) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IStdMarshalInfo_GetClassForHandler_Proxy( 
-    IStdMarshalInfo * This,
-     DWORD dwDestContext,
-     void *pvDestContext,
-     CLSID *pClsid);
-
-
-void __stdcall IStdMarshalInfo_GetClassForHandler_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IExternalConnection *LPEXTERNALCONNECTION;
-
-typedef 
-enum tagEXTCONN
-    {	EXTCONN_STRONG	= 0x1,
-	EXTCONN_WEAK	= 0x2,
-	EXTCONN_CALLABLE	= 0x4
-    } 	EXTCONN;
-
-
-extern "C" const IID IID_IExternalConnection;
-
-
-    
-    struct __declspec(uuid("00000019-0000-0000-C000-000000000046")) __declspec(novtable)
-    IExternalConnection : public IUnknown
-    {
-    public:
-        virtual DWORD __stdcall AddConnection( 
-             DWORD extconn,
-             DWORD reserved) = 0;
-        
-        virtual DWORD __stdcall ReleaseConnection( 
-             DWORD extconn,
-             DWORD reserved,
-             BOOL fLastReleaseCloses) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-DWORD __stdcall IExternalConnection_AddConnection_Proxy( 
-    IExternalConnection * This,
-     DWORD extconn,
-     DWORD reserved);
-
-
-void __stdcall IExternalConnection_AddConnection_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-DWORD __stdcall IExternalConnection_ReleaseConnection_Proxy( 
-    IExternalConnection * This,
-     DWORD extconn,
-     DWORD reserved,
-     BOOL fLastReleaseCloses);
-
-
-void __stdcall IExternalConnection_ReleaseConnection_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-typedef  IMultiQI *LPMULTIQI;
-
-typedef struct tagMULTI_QI
-    {
-    const IID *pIID;
-    IUnknown *pItf;
-    HRESULT hr;
-    } 	MULTI_QI;
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0015_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0015_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IMultiQI;
-
-
-    
-    struct __declspec(uuid("00000020-0000-0000-C000-000000000046")) __declspec(novtable)
-    IMultiQI : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall QueryMultipleInterfaces( 
-             ULONG cMQIs,
-             MULTI_QI *pMQIs) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IMultiQI_QueryMultipleInterfaces_Proxy( 
-    IMultiQI * This,
-     ULONG cMQIs,
-     MULTI_QI *pMQIs);
-
-
-void __stdcall IMultiQI_QueryMultipleInterfaces_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_AsyncIMultiQI;
-
-
-    
-    struct __declspec(uuid("000e0020-0000-0000-C000-000000000046")) __declspec(novtable)
-    AsyncIMultiQI : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Begin_QueryMultipleInterfaces( 
-             ULONG cMQIs,
-             MULTI_QI *pMQIs) = 0;
-        
-        virtual HRESULT __stdcall Finish_QueryMultipleInterfaces( 
-             MULTI_QI *pMQIs) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall AsyncIMultiQI_Begin_QueryMultipleInterfaces_Proxy( 
-    AsyncIMultiQI * This,
-     ULONG cMQIs,
-     MULTI_QI *pMQIs);
-
-
-void __stdcall AsyncIMultiQI_Begin_QueryMultipleInterfaces_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall AsyncIMultiQI_Finish_QueryMultipleInterfaces_Proxy( 
-    AsyncIMultiQI * This,
-     MULTI_QI *pMQIs);
-
-
-void __stdcall AsyncIMultiQI_Finish_QueryMultipleInterfaces_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IInternalUnknown;
-
-
-    
-    struct __declspec(uuid("00000021-0000-0000-C000-000000000046")) __declspec(novtable)
-    IInternalUnknown : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall QueryInternalInterface( 
-             const IID & riid,
-             void **ppv) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternalUnknown_QueryInternalInterface_Proxy( 
-    IInternalUnknown * This,
-     const IID & riid,
-     void **ppv);
-
-
-void __stdcall IInternalUnknown_QueryInternalInterface_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IEnumUnknown *LPENUMUNKNOWN;
-
-
-extern "C" const IID IID_IEnumUnknown;
-
-
-    
-    struct __declspec(uuid("00000100-0000-0000-C000-000000000046")) __declspec(novtable)
-    IEnumUnknown : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Next( 
-             ULONG celt,
-             IUnknown **rgelt,
-             ULONG *pceltFetched) = 0;
-        
-        virtual HRESULT __stdcall Skip( 
-             ULONG celt) = 0;
-        
-        virtual HRESULT __stdcall Reset( void) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IEnumUnknown **ppenum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IEnumUnknown_RemoteNext_Proxy( 
-    IEnumUnknown * This,
-     ULONG celt,
-     IUnknown **rgelt,
-     ULONG *pceltFetched);
-
-
-void __stdcall IEnumUnknown_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumUnknown_Skip_Proxy( 
-    IEnumUnknown * This,
-     ULONG celt);
-
-
-void __stdcall IEnumUnknown_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumUnknown_Reset_Proxy( 
-    IEnumUnknown * This);
-
-
-void __stdcall IEnumUnknown_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumUnknown_Clone_Proxy( 
-    IEnumUnknown * This,
-     IEnumUnknown **ppenum);
-
-
-void __stdcall IEnumUnknown_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IBindCtx *LPBC;
-
-typedef  IBindCtx *LPBINDCTX;
-
-typedef struct tagBIND_OPTS
-    {
-    DWORD cbStruct;
-    DWORD grfFlags;
-    DWORD grfMode;
-    DWORD dwTickCountDeadline;
-    } 	BIND_OPTS;
-
-typedef struct tagBIND_OPTS *LPBIND_OPTS;
-
-
-    typedef struct tagBIND_OPTS2 : tagBIND_OPTS{
-    DWORD           dwTrackFlags;
-    DWORD           dwClassContext;
-    LCID            locale;
-    COSERVERINFO *  pServerInfo;
-    } BIND_OPTS2, * LPBIND_OPTS2;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef 
-enum tagBIND_FLAGS
-    {	BIND_MAYBOTHERUSER	= 1,
-	BIND_JUSTTESTEXISTENCE	= 2
-    } 	BIND_FLAGS;
-
-
-extern "C" const IID IID_IBindCtx;
-
-
-    
-    struct __declspec(uuid("0000000e-0000-0000-C000-000000000046")) __declspec(novtable)
-    IBindCtx : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall RegisterObjectBound( 
-             IUnknown *punk) = 0;
-        
-        virtual HRESULT __stdcall RevokeObjectBound( 
-             IUnknown *punk) = 0;
-        
-        virtual HRESULT __stdcall ReleaseBoundObjects( void) = 0;
-        
-        virtual  HRESULT __stdcall SetBindOptions( 
-             BIND_OPTS *pbindopts) = 0;
-        
-        virtual  HRESULT __stdcall GetBindOptions( 
-             BIND_OPTS *pbindopts) = 0;
-        
-        virtual HRESULT __stdcall GetRunningObjectTable( 
-             IRunningObjectTable **pprot) = 0;
-        
-        virtual HRESULT __stdcall RegisterObjectParam( 
-             LPOLESTR pszKey,
-             IUnknown *punk) = 0;
-        
-        virtual HRESULT __stdcall GetObjectParam( 
-             LPOLESTR pszKey,
-             IUnknown **ppunk) = 0;
-        
-        virtual HRESULT __stdcall EnumObjectParam( 
-             IEnumString **ppenum) = 0;
-        
-        virtual HRESULT __stdcall RevokeObjectParam( 
-             LPOLESTR pszKey) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IBindCtx_RegisterObjectBound_Proxy( 
-    IBindCtx * This,
-     IUnknown *punk);
-
-
-void __stdcall IBindCtx_RegisterObjectBound_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBindCtx_RevokeObjectBound_Proxy( 
-    IBindCtx * This,
-     IUnknown *punk);
-
-
-void __stdcall IBindCtx_RevokeObjectBound_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBindCtx_ReleaseBoundObjects_Proxy( 
-    IBindCtx * This);
-
-
-void __stdcall IBindCtx_ReleaseBoundObjects_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IBindCtx_RemoteSetBindOptions_Proxy( 
-    IBindCtx * This,
-     BIND_OPTS2 *pbindopts);
-
-
-void __stdcall IBindCtx_RemoteSetBindOptions_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IBindCtx_RemoteGetBindOptions_Proxy( 
-    IBindCtx * This,
-     BIND_OPTS2 *pbindopts);
-
-
-void __stdcall IBindCtx_RemoteGetBindOptions_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBindCtx_GetRunningObjectTable_Proxy( 
-    IBindCtx * This,
-     IRunningObjectTable **pprot);
-
-
-void __stdcall IBindCtx_GetRunningObjectTable_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBindCtx_RegisterObjectParam_Proxy( 
-    IBindCtx * This,
-     LPOLESTR pszKey,
-     IUnknown *punk);
-
-
-void __stdcall IBindCtx_RegisterObjectParam_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBindCtx_GetObjectParam_Proxy( 
-    IBindCtx * This,
-     LPOLESTR pszKey,
-     IUnknown **ppunk);
-
-
-void __stdcall IBindCtx_GetObjectParam_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBindCtx_EnumObjectParam_Proxy( 
-    IBindCtx * This,
-     IEnumString **ppenum);
-
-
-void __stdcall IBindCtx_EnumObjectParam_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBindCtx_RevokeObjectParam_Proxy( 
-    IBindCtx * This,
-     LPOLESTR pszKey);
-
-
-void __stdcall IBindCtx_RevokeObjectParam_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IEnumMoniker *LPENUMMONIKER;
-
-
-extern "C" const IID IID_IEnumMoniker;
-
-
-    
-    struct __declspec(uuid("00000102-0000-0000-C000-000000000046")) __declspec(novtable)
-    IEnumMoniker : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Next( 
-             ULONG celt,
-             IMoniker **rgelt,
-             ULONG *pceltFetched) = 0;
-        
-        virtual HRESULT __stdcall Skip( 
-             ULONG celt) = 0;
-        
-        virtual HRESULT __stdcall Reset( void) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IEnumMoniker **ppenum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IEnumMoniker_RemoteNext_Proxy( 
-    IEnumMoniker * This,
-     ULONG celt,
-     IMoniker **rgelt,
-     ULONG *pceltFetched);
-
-
-void __stdcall IEnumMoniker_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumMoniker_Skip_Proxy( 
-    IEnumMoniker * This,
-     ULONG celt);
-
-
-void __stdcall IEnumMoniker_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumMoniker_Reset_Proxy( 
-    IEnumMoniker * This);
-
-
-void __stdcall IEnumMoniker_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumMoniker_Clone_Proxy( 
-    IEnumMoniker * This,
-     IEnumMoniker **ppenum);
-
-
-void __stdcall IEnumMoniker_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IRunnableObject *LPRUNNABLEOBJECT;
-
-
-extern "C" const IID IID_IRunnableObject;
-
-
-    
-    struct __declspec(uuid("00000126-0000-0000-C000-000000000046")) __declspec(novtable)
-    IRunnableObject : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetRunningClass( 
-             LPCLSID lpClsid) = 0;
-        
-        virtual HRESULT __stdcall Run( 
-             LPBINDCTX pbc) = 0;
-        
-        virtual  BOOL __stdcall IsRunning( void) = 0;
-        
-        virtual HRESULT __stdcall LockRunning( 
-             BOOL fLock,
-             BOOL fLastUnlockCloses) = 0;
-        
-        virtual HRESULT __stdcall SetContainedObject( 
-             BOOL fContained) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IRunnableObject_GetRunningClass_Proxy( 
-    IRunnableObject * This,
-     LPCLSID lpClsid);
-
-
-void __stdcall IRunnableObject_GetRunningClass_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRunnableObject_Run_Proxy( 
-    IRunnableObject * This,
-     LPBINDCTX pbc);
-
-
-void __stdcall IRunnableObject_Run_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IRunnableObject_RemoteIsRunning_Proxy( 
-    IRunnableObject * This);
-
-
-void __stdcall IRunnableObject_RemoteIsRunning_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRunnableObject_LockRunning_Proxy( 
-    IRunnableObject * This,
-     BOOL fLock,
-     BOOL fLastUnlockCloses);
-
-
-void __stdcall IRunnableObject_LockRunning_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRunnableObject_SetContainedObject_Proxy( 
-    IRunnableObject * This,
-     BOOL fContained);
-
-
-void __stdcall IRunnableObject_SetContainedObject_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IRunningObjectTable *LPRUNNINGOBJECTTABLE;
-
-
-extern "C" const IID IID_IRunningObjectTable;
-
-
-    
-    struct __declspec(uuid("00000010-0000-0000-C000-000000000046")) __declspec(novtable)
-    IRunningObjectTable : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Register( 
-             DWORD grfFlags,
-             IUnknown *punkObject,
-             IMoniker *pmkObjectName,
-             DWORD *pdwRegister) = 0;
-        
-        virtual HRESULT __stdcall Revoke( 
-             DWORD dwRegister) = 0;
-        
-        virtual HRESULT __stdcall IsRunning( 
-             IMoniker *pmkObjectName) = 0;
-        
-        virtual HRESULT __stdcall GetObjectW( 
-             IMoniker *pmkObjectName,
-             IUnknown **ppunkObject) = 0;
-        
-        virtual HRESULT __stdcall NoteChangeTime( 
-             DWORD dwRegister,
-             FILETIME *pfiletime) = 0;
-        
-        virtual HRESULT __stdcall GetTimeOfLastChange( 
-             IMoniker *pmkObjectName,
-             FILETIME *pfiletime) = 0;
-        
-        virtual HRESULT __stdcall EnumRunning( 
-             IEnumMoniker **ppenumMoniker) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IRunningObjectTable_Register_Proxy( 
-    IRunningObjectTable * This,
-     DWORD grfFlags,
-     IUnknown *punkObject,
-     IMoniker *pmkObjectName,
-     DWORD *pdwRegister);
-
-
-void __stdcall IRunningObjectTable_Register_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRunningObjectTable_Revoke_Proxy( 
-    IRunningObjectTable * This,
-     DWORD dwRegister);
-
-
-void __stdcall IRunningObjectTable_Revoke_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRunningObjectTable_IsRunning_Proxy( 
-    IRunningObjectTable * This,
-     IMoniker *pmkObjectName);
-
-
-void __stdcall IRunningObjectTable_IsRunning_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRunningObjectTable_GetObject_Proxy( 
-    IRunningObjectTable * This,
-     IMoniker *pmkObjectName,
-     IUnknown **ppunkObject);
-
-
-void __stdcall IRunningObjectTable_GetObject_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRunningObjectTable_NoteChangeTime_Proxy( 
-    IRunningObjectTable * This,
-     DWORD dwRegister,
-     FILETIME *pfiletime);
-
-
-void __stdcall IRunningObjectTable_NoteChangeTime_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRunningObjectTable_GetTimeOfLastChange_Proxy( 
-    IRunningObjectTable * This,
-     IMoniker *pmkObjectName,
-     FILETIME *pfiletime);
-
-
-void __stdcall IRunningObjectTable_GetTimeOfLastChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRunningObjectTable_EnumRunning_Proxy( 
-    IRunningObjectTable * This,
-     IEnumMoniker **ppenumMoniker);
-
-
-void __stdcall IRunningObjectTable_EnumRunning_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IPersist *LPPERSIST;
-
-
-extern "C" const IID IID_IPersist;
-
-
-    
-    struct __declspec(uuid("0000010c-0000-0000-C000-000000000046")) __declspec(novtable)
-    IPersist : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetClassID( 
-             CLSID *pClassID) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPersist_GetClassID_Proxy( 
-    IPersist * This,
-     CLSID *pClassID);
-
-
-void __stdcall IPersist_GetClassID_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IPersistStream *LPPERSISTSTREAM;
-
-
-extern "C" const IID IID_IPersistStream;
-
-
-    
-    struct __declspec(uuid("00000109-0000-0000-C000-000000000046")) __declspec(novtable)
-    IPersistStream : public IPersist
-    {
-    public:
-        virtual HRESULT __stdcall IsDirty( void) = 0;
-        
-        virtual HRESULT __stdcall Load( 
-             IStream *pStm) = 0;
-        
-        virtual HRESULT __stdcall Save( 
-             IStream *pStm,
-             BOOL fClearDirty) = 0;
-        
-        virtual HRESULT __stdcall GetSizeMax( 
-             ULARGE_INTEGER *pcbSize) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPersistStream_IsDirty_Proxy( 
-    IPersistStream * This);
-
-
-void __stdcall IPersistStream_IsDirty_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistStream_Load_Proxy( 
-    IPersistStream * This,
-     IStream *pStm);
-
-
-void __stdcall IPersistStream_Load_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistStream_Save_Proxy( 
-    IPersistStream * This,
-     IStream *pStm,
-     BOOL fClearDirty);
-
-
-void __stdcall IPersistStream_Save_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistStream_GetSizeMax_Proxy( 
-    IPersistStream * This,
-     ULARGE_INTEGER *pcbSize);
-
-
-void __stdcall IPersistStream_GetSizeMax_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IMoniker *LPMONIKER;
-
-typedef 
-enum tagMKSYS
-    {	MKSYS_NONE	= 0,
-	MKSYS_GENERICCOMPOSITE	= 1,
-	MKSYS_FILEMONIKER	= 2,
-	MKSYS_ANTIMONIKER	= 3,
-	MKSYS_ITEMMONIKER	= 4,
-	MKSYS_POINTERMONIKER	= 5,
-	MKSYS_CLASSMONIKER	= 7,
-	MKSYS_OBJREFMONIKER	= 8,
-	MKSYS_SESSIONMONIKER	= 9
-    } 	MKSYS;
-
-typedef  
-enum tagMKREDUCE
-    {	MKRREDUCE_ONE	= 3 << 16,
-	MKRREDUCE_TOUSER	= 2 << 16,
-	MKRREDUCE_THROUGHUSER	= 1 << 16,
-	MKRREDUCE_ALL	= 0
-    } 	MKRREDUCE;
-
-
-extern "C" const IID IID_IMoniker;
-
-
-    
-    struct __declspec(uuid("0000000f-0000-0000-C000-000000000046")) __declspec(novtable)
-    IMoniker : public IPersistStream
-    {
-    public:
-        virtual  HRESULT __stdcall BindToObject( 
-             IBindCtx *pbc,
-             IMoniker *pmkToLeft,
-             const IID & riidResult,
-             void **ppvResult) = 0;
-        
-        virtual  HRESULT __stdcall BindToStorage( 
-             IBindCtx *pbc,
-             IMoniker *pmkToLeft,
-             const IID & riid,
-             void **ppvObj) = 0;
-        
-        virtual HRESULT __stdcall Reduce( 
-             IBindCtx *pbc,
-             DWORD dwReduceHowFar,
-             IMoniker **ppmkToLeft,
-             IMoniker **ppmkReduced) = 0;
-        
-        virtual HRESULT __stdcall ComposeWith( 
-             IMoniker *pmkRight,
-             BOOL fOnlyIfNotGeneric,
-             IMoniker **ppmkComposite) = 0;
-        
-        virtual HRESULT __stdcall Enum( 
-             BOOL fForward,
-             IEnumMoniker **ppenumMoniker) = 0;
-        
-        virtual HRESULT __stdcall IsEqual( 
-             IMoniker *pmkOtherMoniker) = 0;
-        
-        virtual HRESULT __stdcall Hash( 
-             DWORD *pdwHash) = 0;
-        
-        virtual HRESULT __stdcall IsRunning( 
-             IBindCtx *pbc,
-             IMoniker *pmkToLeft,
-             IMoniker *pmkNewlyRunning) = 0;
-        
-        virtual HRESULT __stdcall GetTimeOfLastChange( 
-             IBindCtx *pbc,
-             IMoniker *pmkToLeft,
-             FILETIME *pFileTime) = 0;
-        
-        virtual HRESULT __stdcall Inverse( 
-             IMoniker **ppmk) = 0;
-        
-        virtual HRESULT __stdcall CommonPrefixWith( 
-             IMoniker *pmkOther,
-             IMoniker **ppmkPrefix) = 0;
-        
-        virtual HRESULT __stdcall RelativePathTo( 
-             IMoniker *pmkOther,
-             IMoniker **ppmkRelPath) = 0;
-        
-        virtual HRESULT __stdcall GetDisplayName( 
-             IBindCtx *pbc,
-             IMoniker *pmkToLeft,
-             LPOLESTR *ppszDisplayName) = 0;
-        
-        virtual HRESULT __stdcall ParseDisplayName( 
-             IBindCtx *pbc,
-             IMoniker *pmkToLeft,
-             LPOLESTR pszDisplayName,
-             ULONG *pchEaten,
-             IMoniker **ppmkOut) = 0;
-        
-        virtual HRESULT __stdcall IsSystemMoniker( 
-             DWORD *pdwMksys) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IMoniker_RemoteBindToObject_Proxy( 
-    IMoniker * This,
-     IBindCtx *pbc,
-     IMoniker *pmkToLeft,
-     const IID & riidResult,
-     IUnknown **ppvResult);
-
-
-void __stdcall IMoniker_RemoteBindToObject_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IMoniker_RemoteBindToStorage_Proxy( 
-    IMoniker * This,
-     IBindCtx *pbc,
-     IMoniker *pmkToLeft,
-     const IID & riid,
-     IUnknown **ppvObj);
-
-
-void __stdcall IMoniker_RemoteBindToStorage_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMoniker_Reduce_Proxy( 
-    IMoniker * This,
-     IBindCtx *pbc,
-     DWORD dwReduceHowFar,
-     IMoniker **ppmkToLeft,
-     IMoniker **ppmkReduced);
-
-
-void __stdcall IMoniker_Reduce_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMoniker_ComposeWith_Proxy( 
-    IMoniker * This,
-     IMoniker *pmkRight,
-     BOOL fOnlyIfNotGeneric,
-     IMoniker **ppmkComposite);
-
-
-void __stdcall IMoniker_ComposeWith_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMoniker_Enum_Proxy( 
-    IMoniker * This,
-     BOOL fForward,
-     IEnumMoniker **ppenumMoniker);
-
-
-void __stdcall IMoniker_Enum_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMoniker_IsEqual_Proxy( 
-    IMoniker * This,
-     IMoniker *pmkOtherMoniker);
-
-
-void __stdcall IMoniker_IsEqual_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMoniker_Hash_Proxy( 
-    IMoniker * This,
-     DWORD *pdwHash);
-
-
-void __stdcall IMoniker_Hash_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMoniker_IsRunning_Proxy( 
-    IMoniker * This,
-     IBindCtx *pbc,
-     IMoniker *pmkToLeft,
-     IMoniker *pmkNewlyRunning);
-
-
-void __stdcall IMoniker_IsRunning_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMoniker_GetTimeOfLastChange_Proxy( 
-    IMoniker * This,
-     IBindCtx *pbc,
-     IMoniker *pmkToLeft,
-     FILETIME *pFileTime);
-
-
-void __stdcall IMoniker_GetTimeOfLastChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMoniker_Inverse_Proxy( 
-    IMoniker * This,
-     IMoniker **ppmk);
-
-
-void __stdcall IMoniker_Inverse_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMoniker_CommonPrefixWith_Proxy( 
-    IMoniker * This,
-     IMoniker *pmkOther,
-     IMoniker **ppmkPrefix);
-
-
-void __stdcall IMoniker_CommonPrefixWith_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMoniker_RelativePathTo_Proxy( 
-    IMoniker * This,
-     IMoniker *pmkOther,
-     IMoniker **ppmkRelPath);
-
-
-void __stdcall IMoniker_RelativePathTo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMoniker_GetDisplayName_Proxy( 
-    IMoniker * This,
-     IBindCtx *pbc,
-     IMoniker *pmkToLeft,
-     LPOLESTR *ppszDisplayName);
-
-
-void __stdcall IMoniker_GetDisplayName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMoniker_ParseDisplayName_Proxy( 
-    IMoniker * This,
-     IBindCtx *pbc,
-     IMoniker *pmkToLeft,
-     LPOLESTR pszDisplayName,
-     ULONG *pchEaten,
-     IMoniker **ppmkOut);
-
-
-void __stdcall IMoniker_ParseDisplayName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IMoniker_IsSystemMoniker_Proxy( 
-    IMoniker * This,
-     DWORD *pdwMksys);
-
-
-void __stdcall IMoniker_IsSystemMoniker_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IROTData;
-
-
-    
-    struct __declspec(uuid("f29f6bc0-5021-11ce-aa15-00006901293f")) __declspec(novtable)
-    IROTData : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetComparisonData( 
-             byte *pbData,
-             ULONG cbMax,
-             ULONG *pcbData) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IROTData_GetComparisonData_Proxy( 
-    IROTData * This,
-     byte *pbData,
-     ULONG cbMax,
-     ULONG *pcbData);
-
-
-void __stdcall IROTData_GetComparisonData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IEnumString *LPENUMSTRING;
-
-
-extern "C" const IID IID_IEnumString;
-
-
-    
-    struct __declspec(uuid("00000101-0000-0000-C000-000000000046")) __declspec(novtable)
-    IEnumString : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Next( 
-             ULONG celt,
-             LPOLESTR *rgelt,
-             ULONG *pceltFetched) = 0;
-        
-        virtual HRESULT __stdcall Skip( 
-             ULONG celt) = 0;
-        
-        virtual HRESULT __stdcall Reset( void) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IEnumString **ppenum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IEnumString_RemoteNext_Proxy( 
-    IEnumString * This,
-     ULONG celt,
-     LPOLESTR *rgelt,
-     ULONG *pceltFetched);
-
-
-void __stdcall IEnumString_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumString_Skip_Proxy( 
-    IEnumString * This,
-     ULONG celt);
-
-
-void __stdcall IEnumString_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumString_Reset_Proxy( 
-    IEnumString * This);
-
-
-void __stdcall IEnumString_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumString_Clone_Proxy( 
-    IEnumString * This,
-     IEnumString **ppenum);
-
-
-void __stdcall IEnumString_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_ISequentialStream;
-
-
-    
-    struct __declspec(uuid("0c733a30-2a1c-11ce-ade5-00aa0044773d")) __declspec(novtable)
-    ISequentialStream : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Read( 
-             void *pv,
-             ULONG cb,
-             ULONG *pcbRead) = 0;
-        
-        virtual  HRESULT __stdcall Write( 
-             const void *pv,
-             ULONG cb,
-             ULONG *pcbWritten) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall ISequentialStream_RemoteRead_Proxy( 
-    ISequentialStream * This,
-     byte *pv,
-     ULONG cb,
-     ULONG *pcbRead);
-
-
-void __stdcall ISequentialStream_RemoteRead_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ISequentialStream_RemoteWrite_Proxy( 
-    ISequentialStream * This,
-     const byte *pv,
-     ULONG cb,
-     ULONG *pcbWritten);
-
-
-void __stdcall ISequentialStream_RemoteWrite_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IStream *LPSTREAM;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagSTATSTG
-    {
-    LPOLESTR pwcsName;
-    DWORD type;
-    ULARGE_INTEGER cbSize;
-    FILETIME mtime;
-    FILETIME ctime;
-    FILETIME atime;
-    DWORD grfMode;
-    DWORD grfLocksSupported;
-    CLSID clsid;
-    DWORD grfStateBits;
-    DWORD reserved;
-    } 	STATSTG;
-
-
-typedef 
-enum tagSTGTY
-    {	STGTY_STORAGE	= 1,
-	STGTY_STREAM	= 2,
-	STGTY_LOCKBYTES	= 3,
-	STGTY_PROPERTY	= 4
-    } 	STGTY;
-
-typedef 
-enum tagSTREAM_SEEK
-    {	STREAM_SEEK_SET	= 0,
-	STREAM_SEEK_CUR	= 1,
-	STREAM_SEEK_END	= 2
-    } 	STREAM_SEEK;
-
-typedef 
-enum tagLOCKTYPE
-    {	LOCK_WRITE	= 1,
-	LOCK_EXCLUSIVE	= 2,
-	LOCK_ONLYONCE	= 4
-    } 	LOCKTYPE;
-
-
-extern "C" const IID IID_IStream;
-
-
-    
-    struct __declspec(uuid("0000000c-0000-0000-C000-000000000046")) __declspec(novtable)
-    IStream : public ISequentialStream
-    {
-    public:
-        virtual  HRESULT __stdcall Seek( 
-             LARGE_INTEGER dlibMove,
-             DWORD dwOrigin,
-             ULARGE_INTEGER *plibNewPosition) = 0;
-        
-        virtual HRESULT __stdcall SetSize( 
-             ULARGE_INTEGER libNewSize) = 0;
-        
-        virtual  HRESULT __stdcall CopyTo( 
-             IStream *pstm,
-             ULARGE_INTEGER cb,
-             ULARGE_INTEGER *pcbRead,
-             ULARGE_INTEGER *pcbWritten) = 0;
-        
-        virtual HRESULT __stdcall Commit( 
-             DWORD grfCommitFlags) = 0;
-        
-        virtual HRESULT __stdcall Revert( void) = 0;
-        
-        virtual HRESULT __stdcall LockRegion( 
-             ULARGE_INTEGER libOffset,
-             ULARGE_INTEGER cb,
-             DWORD dwLockType) = 0;
-        
-        virtual HRESULT __stdcall UnlockRegion( 
-             ULARGE_INTEGER libOffset,
-             ULARGE_INTEGER cb,
-             DWORD dwLockType) = 0;
-        
-        virtual HRESULT __stdcall Stat( 
-             STATSTG *pstatstg,
-             DWORD grfStatFlag) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IStream **ppstm) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IStream_RemoteSeek_Proxy( 
-    IStream * This,
-     LARGE_INTEGER dlibMove,
-     DWORD dwOrigin,
-     ULARGE_INTEGER *plibNewPosition);
-
-
-void __stdcall IStream_RemoteSeek_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStream_SetSize_Proxy( 
-    IStream * This,
-     ULARGE_INTEGER libNewSize);
-
-
-void __stdcall IStream_SetSize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IStream_RemoteCopyTo_Proxy( 
-    IStream * This,
-     IStream *pstm,
-     ULARGE_INTEGER cb,
-     ULARGE_INTEGER *pcbRead,
-     ULARGE_INTEGER *pcbWritten);
-
-
-void __stdcall IStream_RemoteCopyTo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStream_Commit_Proxy( 
-    IStream * This,
-     DWORD grfCommitFlags);
-
-
-void __stdcall IStream_Commit_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStream_Revert_Proxy( 
-    IStream * This);
-
-
-void __stdcall IStream_Revert_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStream_LockRegion_Proxy( 
-    IStream * This,
-     ULARGE_INTEGER libOffset,
-     ULARGE_INTEGER cb,
-     DWORD dwLockType);
-
-
-void __stdcall IStream_LockRegion_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStream_UnlockRegion_Proxy( 
-    IStream * This,
-     ULARGE_INTEGER libOffset,
-     ULARGE_INTEGER cb,
-     DWORD dwLockType);
-
-
-void __stdcall IStream_UnlockRegion_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStream_Stat_Proxy( 
-    IStream * This,
-     STATSTG *pstatstg,
-     DWORD grfStatFlag);
-
-
-void __stdcall IStream_Stat_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStream_Clone_Proxy( 
-    IStream * This,
-     IStream **ppstm);
-
-
-void __stdcall IStream_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IEnumSTATSTG *LPENUMSTATSTG;
-
-
-extern "C" const IID IID_IEnumSTATSTG;
-
-
-    
-    struct __declspec(uuid("0000000d-0000-0000-C000-000000000046")) __declspec(novtable)
-    IEnumSTATSTG : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Next( 
-             ULONG celt,
-             STATSTG *rgelt,
-             ULONG *pceltFetched) = 0;
-        
-        virtual HRESULT __stdcall Skip( 
-             ULONG celt) = 0;
-        
-        virtual HRESULT __stdcall Reset( void) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IEnumSTATSTG **ppenum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IEnumSTATSTG_RemoteNext_Proxy( 
-    IEnumSTATSTG * This,
-     ULONG celt,
-     STATSTG *rgelt,
-     ULONG *pceltFetched);
-
-
-void __stdcall IEnumSTATSTG_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumSTATSTG_Skip_Proxy( 
-    IEnumSTATSTG * This,
-     ULONG celt);
-
-
-void __stdcall IEnumSTATSTG_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumSTATSTG_Reset_Proxy( 
-    IEnumSTATSTG * This);
-
-
-void __stdcall IEnumSTATSTG_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumSTATSTG_Clone_Proxy( 
-    IEnumSTATSTG * This,
-     IEnumSTATSTG **ppenum);
-
-
-void __stdcall IEnumSTATSTG_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IStorage *LPSTORAGE;
-
-typedef struct tagRemSNB
-    {
-    unsigned long ulCntStr;
-    unsigned long ulCntChar;
-     OLECHAR rgString[ 1 ];
-    } 	RemSNB;
-
-typedef  RemSNB *wireSNB;
-
-typedef  OLECHAR **SNB;
-
-
-extern "C" const IID IID_IStorage;
-
-
-    
-    struct __declspec(uuid("0000000b-0000-0000-C000-000000000046")) __declspec(novtable)
-    IStorage : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall CreateStream( 
-             const OLECHAR *pwcsName,
-             DWORD grfMode,
-             DWORD reserved1,
-             DWORD reserved2,
-             IStream **ppstm) = 0;
-        
-        virtual  HRESULT __stdcall OpenStream( 
-             const OLECHAR *pwcsName,
-             void *reserved1,
-             DWORD grfMode,
-             DWORD reserved2,
-             IStream **ppstm) = 0;
-        
-        virtual HRESULT __stdcall CreateStorage( 
-             const OLECHAR *pwcsName,
-             DWORD grfMode,
-             DWORD reserved1,
-             DWORD reserved2,
-             IStorage **ppstg) = 0;
-        
-        virtual HRESULT __stdcall OpenStorage( 
-             const OLECHAR *pwcsName,
-             IStorage *pstgPriority,
-             DWORD grfMode,
-             SNB snbExclude,
-             DWORD reserved,
-             IStorage **ppstg) = 0;
-        
-        virtual HRESULT __stdcall CopyTo( 
-             DWORD ciidExclude,
-             const IID *rgiidExclude,
-             SNB snbExclude,
-             IStorage *pstgDest) = 0;
-        
-        virtual HRESULT __stdcall MoveElementTo( 
-             const OLECHAR *pwcsName,
-             IStorage *pstgDest,
-             const OLECHAR *pwcsNewName,
-             DWORD grfFlags) = 0;
-        
-        virtual HRESULT __stdcall Commit( 
-             DWORD grfCommitFlags) = 0;
-        
-        virtual HRESULT __stdcall Revert( void) = 0;
-        
-        virtual  HRESULT __stdcall EnumElements( 
-             DWORD reserved1,
-             void *reserved2,
-             DWORD reserved3,
-             IEnumSTATSTG **ppenum) = 0;
-        
-        virtual HRESULT __stdcall DestroyElement( 
-             const OLECHAR *pwcsName) = 0;
-        
-        virtual HRESULT __stdcall RenameElement( 
-             const OLECHAR *pwcsOldName,
-             const OLECHAR *pwcsNewName) = 0;
-        
-        virtual HRESULT __stdcall SetElementTimes( 
-             const OLECHAR *pwcsName,
-             const FILETIME *pctime,
-             const FILETIME *patime,
-             const FILETIME *pmtime) = 0;
-        
-        virtual HRESULT __stdcall SetClass( 
-             const IID & clsid) = 0;
-        
-        virtual HRESULT __stdcall SetStateBits( 
-             DWORD grfStateBits,
-             DWORD grfMask) = 0;
-        
-        virtual HRESULT __stdcall Stat( 
-             STATSTG *pstatstg,
-             DWORD grfStatFlag) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IStorage_CreateStream_Proxy( 
-    IStorage * This,
-     const OLECHAR *pwcsName,
-     DWORD grfMode,
-     DWORD reserved1,
-     DWORD reserved2,
-     IStream **ppstm);
-
-
-void __stdcall IStorage_CreateStream_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IStorage_RemoteOpenStream_Proxy( 
-    IStorage * This,
-     const OLECHAR *pwcsName,
-     unsigned long cbReserved1,
-     byte *reserved1,
-     DWORD grfMode,
-     DWORD reserved2,
-     IStream **ppstm);
-
-
-void __stdcall IStorage_RemoteOpenStream_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStorage_CreateStorage_Proxy( 
-    IStorage * This,
-     const OLECHAR *pwcsName,
-     DWORD grfMode,
-     DWORD reserved1,
-     DWORD reserved2,
-     IStorage **ppstg);
-
-
-void __stdcall IStorage_CreateStorage_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStorage_OpenStorage_Proxy( 
-    IStorage * This,
-     const OLECHAR *pwcsName,
-     IStorage *pstgPriority,
-     DWORD grfMode,
-     SNB snbExclude,
-     DWORD reserved,
-     IStorage **ppstg);
-
-
-void __stdcall IStorage_OpenStorage_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStorage_CopyTo_Proxy( 
-    IStorage * This,
-     DWORD ciidExclude,
-     const IID *rgiidExclude,
-     SNB snbExclude,
-     IStorage *pstgDest);
-
-
-void __stdcall IStorage_CopyTo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStorage_MoveElementTo_Proxy( 
-    IStorage * This,
-     const OLECHAR *pwcsName,
-     IStorage *pstgDest,
-     const OLECHAR *pwcsNewName,
-     DWORD grfFlags);
-
-
-void __stdcall IStorage_MoveElementTo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStorage_Commit_Proxy( 
-    IStorage * This,
-     DWORD grfCommitFlags);
-
-
-void __stdcall IStorage_Commit_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStorage_Revert_Proxy( 
-    IStorage * This);
-
-
-void __stdcall IStorage_Revert_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IStorage_RemoteEnumElements_Proxy( 
-    IStorage * This,
-     DWORD reserved1,
-     unsigned long cbReserved2,
-     byte *reserved2,
-     DWORD reserved3,
-     IEnumSTATSTG **ppenum);
-
-
-void __stdcall IStorage_RemoteEnumElements_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStorage_DestroyElement_Proxy( 
-    IStorage * This,
-     const OLECHAR *pwcsName);
-
-
-void __stdcall IStorage_DestroyElement_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStorage_RenameElement_Proxy( 
-    IStorage * This,
-     const OLECHAR *pwcsOldName,
-     const OLECHAR *pwcsNewName);
-
-
-void __stdcall IStorage_RenameElement_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStorage_SetElementTimes_Proxy( 
-    IStorage * This,
-     const OLECHAR *pwcsName,
-     const FILETIME *pctime,
-     const FILETIME *patime,
-     const FILETIME *pmtime);
-
-
-void __stdcall IStorage_SetElementTimes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStorage_SetClass_Proxy( 
-    IStorage * This,
-     const IID & clsid);
-
-
-void __stdcall IStorage_SetClass_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStorage_SetStateBits_Proxy( 
-    IStorage * This,
-     DWORD grfStateBits,
-     DWORD grfMask);
-
-
-void __stdcall IStorage_SetStateBits_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IStorage_Stat_Proxy( 
-    IStorage * This,
-     STATSTG *pstatstg,
-     DWORD grfStatFlag);
-
-
-void __stdcall IStorage_Stat_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IPersistFile *LPPERSISTFILE;
-
-
-extern "C" const IID IID_IPersistFile;
-
-
-    
-    struct __declspec(uuid("0000010b-0000-0000-C000-000000000046")) __declspec(novtable)
-    IPersistFile : public IPersist
-    {
-    public:
-        virtual HRESULT __stdcall IsDirty( void) = 0;
-        
-        virtual HRESULT __stdcall Load( 
-             LPCOLESTR pszFileName,
-             DWORD dwMode) = 0;
-        
-        virtual HRESULT __stdcall Save( 
-             LPCOLESTR pszFileName,
-             BOOL fRemember) = 0;
-        
-        virtual HRESULT __stdcall SaveCompleted( 
-             LPCOLESTR pszFileName) = 0;
-        
-        virtual HRESULT __stdcall GetCurFile( 
-             LPOLESTR *ppszFileName) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPersistFile_IsDirty_Proxy( 
-    IPersistFile * This);
-
-
-void __stdcall IPersistFile_IsDirty_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistFile_Load_Proxy( 
-    IPersistFile * This,
-     LPCOLESTR pszFileName,
-     DWORD dwMode);
-
-
-void __stdcall IPersistFile_Load_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistFile_Save_Proxy( 
-    IPersistFile * This,
-     LPCOLESTR pszFileName,
-     BOOL fRemember);
-
-
-void __stdcall IPersistFile_Save_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistFile_SaveCompleted_Proxy( 
-    IPersistFile * This,
-     LPCOLESTR pszFileName);
-
-
-void __stdcall IPersistFile_SaveCompleted_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistFile_GetCurFile_Proxy( 
-    IPersistFile * This,
-     LPOLESTR *ppszFileName);
-
-
-void __stdcall IPersistFile_GetCurFile_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IPersistStorage *LPPERSISTSTORAGE;
-
-
-extern "C" const IID IID_IPersistStorage;
-
-
-    
-    struct __declspec(uuid("0000010a-0000-0000-C000-000000000046")) __declspec(novtable)
-    IPersistStorage : public IPersist
-    {
-    public:
-        virtual HRESULT __stdcall IsDirty( void) = 0;
-        
-        virtual HRESULT __stdcall InitNew( 
-             IStorage *pStg) = 0;
-        
-        virtual HRESULT __stdcall Load( 
-             IStorage *pStg) = 0;
-        
-        virtual HRESULT __stdcall Save( 
-             IStorage *pStgSave,
-             BOOL fSameAsLoad) = 0;
-        
-        virtual HRESULT __stdcall SaveCompleted( 
-             IStorage *pStgNew) = 0;
-        
-        virtual HRESULT __stdcall HandsOffStorage( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPersistStorage_IsDirty_Proxy( 
-    IPersistStorage * This);
-
-
-void __stdcall IPersistStorage_IsDirty_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistStorage_InitNew_Proxy( 
-    IPersistStorage * This,
-     IStorage *pStg);
-
-
-void __stdcall IPersistStorage_InitNew_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistStorage_Load_Proxy( 
-    IPersistStorage * This,
-     IStorage *pStg);
-
-
-void __stdcall IPersistStorage_Load_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistStorage_Save_Proxy( 
-    IPersistStorage * This,
-     IStorage *pStgSave,
-     BOOL fSameAsLoad);
-
-
-void __stdcall IPersistStorage_Save_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistStorage_SaveCompleted_Proxy( 
-    IPersistStorage * This,
-     IStorage *pStgNew);
-
-
-void __stdcall IPersistStorage_SaveCompleted_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistStorage_HandsOffStorage_Proxy( 
-    IPersistStorage * This);
-
-
-void __stdcall IPersistStorage_HandsOffStorage_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  ILockBytes *LPLOCKBYTES;
-
-
-extern "C" const IID IID_ILockBytes;
-
-
-    
-    struct __declspec(uuid("0000000a-0000-0000-C000-000000000046")) __declspec(novtable)
-    ILockBytes : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall ReadAt( 
-             ULARGE_INTEGER ulOffset,
-             void *pv,
-             ULONG cb,
-             ULONG *pcbRead) = 0;
-        
-        virtual  HRESULT __stdcall WriteAt( 
-             ULARGE_INTEGER ulOffset,
-             const void *pv,
-             ULONG cb,
-             ULONG *pcbWritten) = 0;
-        
-        virtual HRESULT __stdcall Flush( void) = 0;
-        
-        virtual HRESULT __stdcall SetSize( 
-             ULARGE_INTEGER cb) = 0;
-        
-        virtual HRESULT __stdcall LockRegion( 
-             ULARGE_INTEGER libOffset,
-             ULARGE_INTEGER cb,
-             DWORD dwLockType) = 0;
-        
-        virtual HRESULT __stdcall UnlockRegion( 
-             ULARGE_INTEGER libOffset,
-             ULARGE_INTEGER cb,
-             DWORD dwLockType) = 0;
-        
-        virtual HRESULT __stdcall Stat( 
-             STATSTG *pstatstg,
-             DWORD grfStatFlag) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall ILockBytes_RemoteReadAt_Proxy( 
-    ILockBytes * This,
-     ULARGE_INTEGER ulOffset,
-     byte *pv,
-     ULONG cb,
-     ULONG *pcbRead);
-
-
-void __stdcall ILockBytes_RemoteReadAt_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ILockBytes_RemoteWriteAt_Proxy( 
-    ILockBytes * This,
-     ULARGE_INTEGER ulOffset,
-     const byte *pv,
-     ULONG cb,
-     ULONG *pcbWritten);
-
-
-void __stdcall ILockBytes_RemoteWriteAt_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ILockBytes_Flush_Proxy( 
-    ILockBytes * This);
-
-
-void __stdcall ILockBytes_Flush_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ILockBytes_SetSize_Proxy( 
-    ILockBytes * This,
-     ULARGE_INTEGER cb);
-
-
-void __stdcall ILockBytes_SetSize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ILockBytes_LockRegion_Proxy( 
-    ILockBytes * This,
-     ULARGE_INTEGER libOffset,
-     ULARGE_INTEGER cb,
-     DWORD dwLockType);
-
-
-void __stdcall ILockBytes_LockRegion_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ILockBytes_UnlockRegion_Proxy( 
-    ILockBytes * This,
-     ULARGE_INTEGER libOffset,
-     ULARGE_INTEGER cb,
-     DWORD dwLockType);
-
-
-void __stdcall ILockBytes_UnlockRegion_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ILockBytes_Stat_Proxy( 
-    ILockBytes * This,
-     STATSTG *pstatstg,
-     DWORD grfStatFlag);
-
-
-void __stdcall ILockBytes_Stat_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IEnumFORMATETC *LPENUMFORMATETC;
-
-typedef struct tagDVTARGETDEVICE
-    {
-    DWORD tdSize;
-    WORD tdDriverNameOffset;
-    WORD tdDeviceNameOffset;
-    WORD tdPortNameOffset;
-    WORD tdExtDevmodeOffset;
-     BYTE tdData[ 1 ];
-    } 	DVTARGETDEVICE;
-
-typedef CLIPFORMAT *LPCLIPFORMAT;
-
-typedef struct tagFORMATETC
-    {
-    CLIPFORMAT cfFormat;
-     DVTARGETDEVICE *ptd;
-    DWORD dwAspect;
-    LONG lindex;
-    DWORD tymed;
-    } 	FORMATETC;
-
-typedef struct tagFORMATETC *LPFORMATETC;
-
-
-extern "C" const IID IID_IEnumFORMATETC;
-
-
-    
-    struct __declspec(uuid("00000103-0000-0000-C000-000000000046")) __declspec(novtable)
-    IEnumFORMATETC : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Next( 
-             ULONG celt,
-             FORMATETC *rgelt,
-             ULONG *pceltFetched) = 0;
-        
-        virtual HRESULT __stdcall Skip( 
-             ULONG celt) = 0;
-        
-        virtual HRESULT __stdcall Reset( void) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IEnumFORMATETC **ppenum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IEnumFORMATETC_RemoteNext_Proxy( 
-    IEnumFORMATETC * This,
-     ULONG celt,
-     FORMATETC *rgelt,
-     ULONG *pceltFetched);
-
-
-void __stdcall IEnumFORMATETC_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumFORMATETC_Skip_Proxy( 
-    IEnumFORMATETC * This,
-     ULONG celt);
-
-
-void __stdcall IEnumFORMATETC_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumFORMATETC_Reset_Proxy( 
-    IEnumFORMATETC * This);
-
-
-void __stdcall IEnumFORMATETC_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumFORMATETC_Clone_Proxy( 
-    IEnumFORMATETC * This,
-     IEnumFORMATETC **ppenum);
-
-
-void __stdcall IEnumFORMATETC_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IEnumSTATDATA *LPENUMSTATDATA;
-
-typedef 
-enum tagADVF
-    {	ADVF_NODATA	= 1,
-	ADVF_PRIMEFIRST	= 2,
-	ADVF_ONLYONCE	= 4,
-	ADVF_DATAONSTOP	= 64,
-	ADVFCACHE_NOHANDLER	= 8,
-	ADVFCACHE_FORCEBUILTIN	= 16,
-	ADVFCACHE_ONSAVE	= 32
-    } 	ADVF;
-
-typedef struct tagSTATDATA
-    {
-    FORMATETC formatetc;
-    DWORD advf;
-     IAdviseSink *pAdvSink;
-    DWORD dwConnection;
-    } 	STATDATA;
-
-typedef STATDATA *LPSTATDATA;
-
-
-extern "C" const IID IID_IEnumSTATDATA;
-
-
-    
-    struct __declspec(uuid("00000105-0000-0000-C000-000000000046")) __declspec(novtable)
-    IEnumSTATDATA : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Next( 
-             ULONG celt,
-             STATDATA *rgelt,
-             ULONG *pceltFetched) = 0;
-        
-        virtual HRESULT __stdcall Skip( 
-             ULONG celt) = 0;
-        
-        virtual HRESULT __stdcall Reset( void) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IEnumSTATDATA **ppenum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IEnumSTATDATA_RemoteNext_Proxy( 
-    IEnumSTATDATA * This,
-     ULONG celt,
-     STATDATA *rgelt,
-     ULONG *pceltFetched);
-
-
-void __stdcall IEnumSTATDATA_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumSTATDATA_Skip_Proxy( 
-    IEnumSTATDATA * This,
-     ULONG celt);
-
-
-void __stdcall IEnumSTATDATA_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumSTATDATA_Reset_Proxy( 
-    IEnumSTATDATA * This);
-
-
-void __stdcall IEnumSTATDATA_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumSTATDATA_Clone_Proxy( 
-    IEnumSTATDATA * This,
-     IEnumSTATDATA **ppenum);
-
-
-void __stdcall IEnumSTATDATA_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IRootStorage *LPROOTSTORAGE;
-
-
-extern "C" const IID IID_IRootStorage;
-
-
-    
-    struct __declspec(uuid("00000012-0000-0000-C000-000000000046")) __declspec(novtable)
-    IRootStorage : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall SwitchToFile( 
-             LPOLESTR pszFile) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IRootStorage_SwitchToFile_Proxy( 
-    IRootStorage * This,
-     LPOLESTR pszFile);
-
-
-void __stdcall IRootStorage_SwitchToFile_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IAdviseSink *LPADVISESINK;
-
-typedef  
-enum tagTYMED
-    {	TYMED_HGLOBAL	= 1,
-	TYMED_FILE	= 2,
-	TYMED_ISTREAM	= 4,
-	TYMED_ISTORAGE	= 8,
-	TYMED_GDI	= 16,
-	TYMED_MFPICT	= 32,
-	TYMED_ENHMF	= 64,
-	TYMED_NULL	= 0
-    } 	TYMED;
-
-
-
-#pragma warning(push)
-
-#pragma warning(disable:4200)
-
-typedef struct tagRemSTGMEDIUM
-    {
-    DWORD tymed;
-    DWORD dwHandleType;
-    unsigned long pData;
-    unsigned long pUnkForRelease;
-    unsigned long cbData;
-     byte data[ 1 ];
-    } 	RemSTGMEDIUM;
-
-
-
-#pragma warning(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagSTGMEDIUM
-    {
-    DWORD tymed;
-     union 
-        {
-         HBITMAP hBitmap;
-         HMETAFILEPICT hMetaFilePict;
-         HENHMETAFILE hEnhMetaFile;
-         HGLOBAL hGlobal;
-         LPOLESTR lpszFileName;
-         IStream *pstm;
-         IStorage *pstg;
-           
-        } 	;
-     IUnknown *pUnkForRelease;
-    } 	uSTGMEDIUM;
-
-
-typedef struct _GDI_OBJECT
-    {
-    DWORD ObjectType;
-      union __MIDL_IAdviseSink_0002
-        {
-         wireHBITMAP hBitmap;
-         wireHPALETTE hPalette;
-         wireHGLOBAL hGeneric;
-        } 	u;
-    } 	GDI_OBJECT;
-
-typedef struct _userSTGMEDIUM
-    {
-    struct _STGMEDIUM_UNION
-        {
-        DWORD tymed;
-          union __MIDL_IAdviseSink_0003
-            {
-               
-             wireHMETAFILEPICT hMetaFilePict;
-             wireHENHMETAFILE hHEnhMetaFile;
-             GDI_OBJECT *hGdiHandle;
-             wireHGLOBAL hGlobal;
-             LPOLESTR lpszFileName;
-             BYTE_BLOB *pstm;
-             BYTE_BLOB *pstg;
-            } 	u;
-        } 	;
-    IUnknown *pUnkForRelease;
-    } 	userSTGMEDIUM;
-
-typedef  userSTGMEDIUM *wireSTGMEDIUM;
-
-typedef  uSTGMEDIUM STGMEDIUM;
-
-typedef  userSTGMEDIUM *wireASYNC_STGMEDIUM;
-
-typedef  STGMEDIUM ASYNC_STGMEDIUM;
-
-typedef STGMEDIUM *LPSTGMEDIUM;
-
-typedef struct _userFLAG_STGMEDIUM
-    {
-    long ContextFlags;
-    long fPassOwnership;
-    userSTGMEDIUM Stgmed;
-    } 	userFLAG_STGMEDIUM;
-
-typedef  userFLAG_STGMEDIUM *wireFLAG_STGMEDIUM;
-
-typedef  struct _FLAG_STGMEDIUM
-    {
-    long ContextFlags;
-    long fPassOwnership;
-    STGMEDIUM Stgmed;
-    } 	FLAG_STGMEDIUM;
-
-
-extern "C" const IID IID_IAdviseSink;
-
-
-    
-    struct __declspec(uuid("0000010f-0000-0000-C000-000000000046")) __declspec(novtable)
-    IAdviseSink : public IUnknown
-    {
-    public:
-        virtual  void __stdcall OnDataChange( 
-             FORMATETC *pFormatetc,
-             STGMEDIUM *pStgmed) = 0;
-        
-        virtual  void __stdcall OnViewChange( 
-             DWORD dwAspect,
-             LONG lindex) = 0;
-        
-        virtual  void __stdcall OnRename( 
-             IMoniker *pmk) = 0;
-        
-        virtual  void __stdcall OnSave( void) = 0;
-        
-        virtual  void __stdcall OnClose( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IAdviseSink_RemoteOnDataChange_Proxy( 
-    IAdviseSink * This,
-     FORMATETC *pFormatetc,
-     ASYNC_STGMEDIUM *pStgmed);
-
-
-void __stdcall IAdviseSink_RemoteOnDataChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAdviseSink_RemoteOnViewChange_Proxy( 
-    IAdviseSink * This,
-     DWORD dwAspect,
-     LONG lindex);
-
-
-void __stdcall IAdviseSink_RemoteOnViewChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAdviseSink_RemoteOnRename_Proxy( 
-    IAdviseSink * This,
-     IMoniker *pmk);
-
-
-void __stdcall IAdviseSink_RemoteOnRename_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAdviseSink_RemoteOnSave_Proxy( 
-    IAdviseSink * This);
-
-
-void __stdcall IAdviseSink_RemoteOnSave_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAdviseSink_RemoteOnClose_Proxy( 
-    IAdviseSink * This);
-
-
-void __stdcall IAdviseSink_RemoteOnClose_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_AsyncIAdviseSink;
-
-
-    
-    struct __declspec(uuid("00000150-0000-0000-C000-000000000046")) __declspec(novtable)
-    AsyncIAdviseSink : public IUnknown
-    {
-    public:
-        virtual  void __stdcall Begin_OnDataChange( 
-             FORMATETC *pFormatetc,
-             STGMEDIUM *pStgmed) = 0;
-        
-        virtual  void __stdcall Finish_OnDataChange( void) = 0;
-        
-        virtual  void __stdcall Begin_OnViewChange( 
-             DWORD dwAspect,
-             LONG lindex) = 0;
-        
-        virtual  void __stdcall Finish_OnViewChange( void) = 0;
-        
-        virtual  void __stdcall Begin_OnRename( 
-             IMoniker *pmk) = 0;
-        
-        virtual  void __stdcall Finish_OnRename( void) = 0;
-        
-        virtual  void __stdcall Begin_OnSave( void) = 0;
-        
-        virtual  void __stdcall Finish_OnSave( void) = 0;
-        
-        virtual  void __stdcall Begin_OnClose( void) = 0;
-        
-        virtual  void __stdcall Finish_OnClose( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall AsyncIAdviseSink_Begin_RemoteOnDataChange_Proxy( 
-    AsyncIAdviseSink * This,
-     FORMATETC *pFormatetc,
-     ASYNC_STGMEDIUM *pStgmed);
-
-
-void __stdcall AsyncIAdviseSink_Begin_RemoteOnDataChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Finish_RemoteOnDataChange_Proxy( 
-    AsyncIAdviseSink * This);
-
-
-void __stdcall AsyncIAdviseSink_Finish_RemoteOnDataChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Begin_RemoteOnViewChange_Proxy( 
-    AsyncIAdviseSink * This,
-     DWORD dwAspect,
-     LONG lindex);
-
-
-void __stdcall AsyncIAdviseSink_Begin_RemoteOnViewChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Finish_RemoteOnViewChange_Proxy( 
-    AsyncIAdviseSink * This);
-
-
-void __stdcall AsyncIAdviseSink_Finish_RemoteOnViewChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Begin_RemoteOnRename_Proxy( 
-    AsyncIAdviseSink * This,
-     IMoniker *pmk);
-
-
-void __stdcall AsyncIAdviseSink_Begin_RemoteOnRename_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Finish_RemoteOnRename_Proxy( 
-    AsyncIAdviseSink * This);
-
-
-void __stdcall AsyncIAdviseSink_Finish_RemoteOnRename_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Begin_RemoteOnSave_Proxy( 
-    AsyncIAdviseSink * This);
-
-
-void __stdcall AsyncIAdviseSink_Begin_RemoteOnSave_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Finish_RemoteOnSave_Proxy( 
-    AsyncIAdviseSink * This);
-
-
-void __stdcall AsyncIAdviseSink_Finish_RemoteOnSave_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Begin_RemoteOnClose_Proxy( 
-    AsyncIAdviseSink * This);
-
-
-void __stdcall AsyncIAdviseSink_Begin_RemoteOnClose_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Finish_RemoteOnClose_Proxy( 
-    AsyncIAdviseSink * This);
-
-
-void __stdcall AsyncIAdviseSink_Finish_RemoteOnClose_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IAdviseSink2 *LPADVISESINK2;
-
-
-extern "C" const IID IID_IAdviseSink2;
-
-
-    
-    struct __declspec(uuid("00000125-0000-0000-C000-000000000046")) __declspec(novtable)
-    IAdviseSink2 : public IAdviseSink
-    {
-    public:
-        virtual  void __stdcall OnLinkSrcChange( 
-             IMoniker *pmk) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IAdviseSink2_RemoteOnLinkSrcChange_Proxy( 
-    IAdviseSink2 * This,
-     IMoniker *pmk);
-
-
-void __stdcall IAdviseSink2_RemoteOnLinkSrcChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_AsyncIAdviseSink2;
-
-
-    
-    struct __declspec(uuid("00000151-0000-0000-C000-000000000046")) __declspec(novtable)
-    AsyncIAdviseSink2 : public AsyncIAdviseSink
-    {
-    public:
-        virtual  void __stdcall Begin_OnLinkSrcChange( 
-             IMoniker *pmk) = 0;
-        
-        virtual  void __stdcall Finish_OnLinkSrcChange( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall AsyncIAdviseSink2_Begin_RemoteOnLinkSrcChange_Proxy( 
-    AsyncIAdviseSink2 * This,
-     IMoniker *pmk);
-
-
-void __stdcall AsyncIAdviseSink2_Begin_RemoteOnLinkSrcChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall AsyncIAdviseSink2_Finish_RemoteOnLinkSrcChange_Proxy( 
-    AsyncIAdviseSink2 * This);
-
-
-void __stdcall AsyncIAdviseSink2_Finish_RemoteOnLinkSrcChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IDataObject *LPDATAOBJECT;
-
-typedef 
-enum tagDATADIR
-    {	DATADIR_GET	= 1,
-	DATADIR_SET	= 2
-    } 	DATADIR;
-
-
-extern "C" const IID IID_IDataObject;
-
-
-    
-    struct __declspec(uuid("0000010e-0000-0000-C000-000000000046")) __declspec(novtable)
-    IDataObject : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall GetData( 
-             FORMATETC *pformatetcIn,
-             STGMEDIUM *pmedium) = 0;
-        
-        virtual  HRESULT __stdcall GetDataHere( 
-             FORMATETC *pformatetc,
-             STGMEDIUM *pmedium) = 0;
-        
-        virtual HRESULT __stdcall QueryGetData( 
-             FORMATETC *pformatetc) = 0;
-        
-        virtual HRESULT __stdcall GetCanonicalFormatEtc( 
-             FORMATETC *pformatectIn,
-             FORMATETC *pformatetcOut) = 0;
-        
-        virtual  HRESULT __stdcall SetData( 
-             FORMATETC *pformatetc,
-             STGMEDIUM *pmedium,
-             BOOL fRelease) = 0;
-        
-        virtual HRESULT __stdcall EnumFormatEtc( 
-             DWORD dwDirection,
-             IEnumFORMATETC **ppenumFormatEtc) = 0;
-        
-        virtual HRESULT __stdcall DAdvise( 
-             FORMATETC *pformatetc,
-             DWORD advf,
-             IAdviseSink *pAdvSink,
-             DWORD *pdwConnection) = 0;
-        
-        virtual HRESULT __stdcall DUnadvise( 
-             DWORD dwConnection) = 0;
-        
-        virtual HRESULT __stdcall EnumDAdvise( 
-             IEnumSTATDATA **ppenumAdvise) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IDataObject_RemoteGetData_Proxy( 
-    IDataObject * This,
-     FORMATETC *pformatetcIn,
-     STGMEDIUM *pRemoteMedium);
-
-
-void __stdcall IDataObject_RemoteGetData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IDataObject_RemoteGetDataHere_Proxy( 
-    IDataObject * This,
-     FORMATETC *pformatetc,
-     STGMEDIUM *pRemoteMedium);
-
-
-void __stdcall IDataObject_RemoteGetDataHere_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDataObject_QueryGetData_Proxy( 
-    IDataObject * This,
-     FORMATETC *pformatetc);
-
-
-void __stdcall IDataObject_QueryGetData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDataObject_GetCanonicalFormatEtc_Proxy( 
-    IDataObject * This,
-     FORMATETC *pformatectIn,
-     FORMATETC *pformatetcOut);
-
-
-void __stdcall IDataObject_GetCanonicalFormatEtc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IDataObject_RemoteSetData_Proxy( 
-    IDataObject * This,
-     FORMATETC *pformatetc,
-     FLAG_STGMEDIUM *pmedium,
-     BOOL fRelease);
-
-
-void __stdcall IDataObject_RemoteSetData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDataObject_EnumFormatEtc_Proxy( 
-    IDataObject * This,
-     DWORD dwDirection,
-     IEnumFORMATETC **ppenumFormatEtc);
-
-
-void __stdcall IDataObject_EnumFormatEtc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDataObject_DAdvise_Proxy( 
-    IDataObject * This,
-     FORMATETC *pformatetc,
-     DWORD advf,
-     IAdviseSink *pAdvSink,
-     DWORD *pdwConnection);
-
-
-void __stdcall IDataObject_DAdvise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDataObject_DUnadvise_Proxy( 
-    IDataObject * This,
-     DWORD dwConnection);
-
-
-void __stdcall IDataObject_DUnadvise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDataObject_EnumDAdvise_Proxy( 
-    IDataObject * This,
-     IEnumSTATDATA **ppenumAdvise);
-
-
-void __stdcall IDataObject_EnumDAdvise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IDataAdviseHolder *LPDATAADVISEHOLDER;
-
-
-extern "C" const IID IID_IDataAdviseHolder;
-
-
-    
-    struct __declspec(uuid("00000110-0000-0000-C000-000000000046")) __declspec(novtable)
-    IDataAdviseHolder : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Advise( 
-             IDataObject *pDataObject,
-             FORMATETC *pFetc,
-             DWORD advf,
-             IAdviseSink *pAdvise,
-             DWORD *pdwConnection) = 0;
-        
-        virtual HRESULT __stdcall Unadvise( 
-             DWORD dwConnection) = 0;
-        
-        virtual HRESULT __stdcall EnumAdvise( 
-             IEnumSTATDATA **ppenumAdvise) = 0;
-        
-        virtual HRESULT __stdcall SendOnDataChange( 
-             IDataObject *pDataObject,
-             DWORD dwReserved,
-             DWORD advf) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IDataAdviseHolder_Advise_Proxy( 
-    IDataAdviseHolder * This,
-     IDataObject *pDataObject,
-     FORMATETC *pFetc,
-     DWORD advf,
-     IAdviseSink *pAdvise,
-     DWORD *pdwConnection);
-
-
-void __stdcall IDataAdviseHolder_Advise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDataAdviseHolder_Unadvise_Proxy( 
-    IDataAdviseHolder * This,
-     DWORD dwConnection);
-
-
-void __stdcall IDataAdviseHolder_Unadvise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDataAdviseHolder_EnumAdvise_Proxy( 
-    IDataAdviseHolder * This,
-     IEnumSTATDATA **ppenumAdvise);
-
-
-void __stdcall IDataAdviseHolder_EnumAdvise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDataAdviseHolder_SendOnDataChange_Proxy( 
-    IDataAdviseHolder * This,
-     IDataObject *pDataObject,
-     DWORD dwReserved,
-     DWORD advf);
-
-
-void __stdcall IDataAdviseHolder_SendOnDataChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IMessageFilter *LPMESSAGEFILTER;
-
-typedef 
-enum tagCALLTYPE
-    {	CALLTYPE_TOPLEVEL	= 1,
-	CALLTYPE_NESTED	= 2,
-	CALLTYPE_ASYNC	= 3,
-	CALLTYPE_TOPLEVEL_CALLPENDING	= 4,
-	CALLTYPE_ASYNC_CALLPENDING	= 5
-    } 	CALLTYPE;
-
-typedef 
-enum tagSERVERCALL
-    {	SERVERCALL_ISHANDLED	= 0,
-	SERVERCALL_REJECTED	= 1,
-	SERVERCALL_RETRYLATER	= 2
-    } 	SERVERCALL;
-
-typedef 
-enum tagPENDINGTYPE
-    {	PENDINGTYPE_TOPLEVEL	= 1,
-	PENDINGTYPE_NESTED	= 2
-    } 	PENDINGTYPE;
-
-typedef 
-enum tagPENDINGMSG
-    {	PENDINGMSG_CANCELCALL	= 0,
-	PENDINGMSG_WAITNOPROCESS	= 1,
-	PENDINGMSG_WAITDEFPROCESS	= 2
-    } 	PENDINGMSG;
-
-typedef struct tagINTERFACEINFO
-    {
-    IUnknown *pUnk;
-    IID iid;
-    WORD wMethod;
-    } 	INTERFACEINFO;
-
-typedef struct tagINTERFACEINFO *LPINTERFACEINFO;
-
-
-extern "C" const IID IID_IMessageFilter;
-
-
-    
-    struct __declspec(uuid("00000016-0000-0000-C000-000000000046")) __declspec(novtable)
-    IMessageFilter : public IUnknown
-    {
-    public:
-        virtual DWORD __stdcall HandleInComingCall( 
-             DWORD dwCallType,
-             HTASK htaskCaller,
-             DWORD dwTickCount,
-             LPINTERFACEINFO lpInterfaceInfo) = 0;
-        
-        virtual DWORD __stdcall RetryRejectedCall( 
-             HTASK htaskCallee,
-             DWORD dwTickCount,
-             DWORD dwRejectType) = 0;
-        
-        virtual DWORD __stdcall MessagePending( 
-             HTASK htaskCallee,
-             DWORD dwTickCount,
-             DWORD dwPendingType) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-DWORD __stdcall IMessageFilter_HandleInComingCall_Proxy( 
-    IMessageFilter * This,
-     DWORD dwCallType,
-     HTASK htaskCaller,
-     DWORD dwTickCount,
-     LPINTERFACEINFO lpInterfaceInfo);
-
-
-void __stdcall IMessageFilter_HandleInComingCall_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-DWORD __stdcall IMessageFilter_RetryRejectedCall_Proxy( 
-    IMessageFilter * This,
-     HTASK htaskCallee,
-     DWORD dwTickCount,
-     DWORD dwRejectType);
-
-
-void __stdcall IMessageFilter_RetryRejectedCall_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-DWORD __stdcall IMessageFilter_MessagePending_Proxy( 
-    IMessageFilter * This,
-     HTASK htaskCallee,
-     DWORD dwTickCount,
-     DWORD dwPendingType);
-
-
-void __stdcall IMessageFilter_MessagePending_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef unsigned long RPCOLEDATAREP;
-
-typedef struct tagRPCOLEMESSAGE
-    {
-    void *reserved1;
-    RPCOLEDATAREP dataRepresentation;
-    void *Buffer;
-    ULONG cbBuffer;
-    ULONG iMethod;
-    void *reserved2[ 5 ];
-    ULONG rpcFlags;
-    } 	RPCOLEMESSAGE;
-
-typedef RPCOLEMESSAGE *PRPCOLEMESSAGE;
-
-
-extern "C" const IID IID_IRpcChannelBuffer;
-
-
-    
-    struct __declspec(uuid("D5F56B60-593B-101A-B569-08002B2DBF7A")) __declspec(novtable)
-    IRpcChannelBuffer : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetBuffer( 
-             RPCOLEMESSAGE *pMessage,
-             const IID & riid) = 0;
-        
-        virtual HRESULT __stdcall SendReceive( 
-             RPCOLEMESSAGE *pMessage,
-             ULONG *pStatus) = 0;
-        
-        virtual HRESULT __stdcall FreeBuffer( 
-             RPCOLEMESSAGE *pMessage) = 0;
-        
-        virtual HRESULT __stdcall GetDestCtx( 
-             DWORD *pdwDestContext,
-             void **ppvDestContext) = 0;
-        
-        virtual HRESULT __stdcall IsConnected( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IRpcChannelBuffer_GetBuffer_Proxy( 
-    IRpcChannelBuffer * This,
-     RPCOLEMESSAGE *pMessage,
-     const IID & riid);
-
-
-void __stdcall IRpcChannelBuffer_GetBuffer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRpcChannelBuffer_SendReceive_Proxy( 
-    IRpcChannelBuffer * This,
-     RPCOLEMESSAGE *pMessage,
-     ULONG *pStatus);
-
-
-void __stdcall IRpcChannelBuffer_SendReceive_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRpcChannelBuffer_FreeBuffer_Proxy( 
-    IRpcChannelBuffer * This,
-     RPCOLEMESSAGE *pMessage);
-
-
-void __stdcall IRpcChannelBuffer_FreeBuffer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRpcChannelBuffer_GetDestCtx_Proxy( 
-    IRpcChannelBuffer * This,
-     DWORD *pdwDestContext,
-     void **ppvDestContext);
-
-
-void __stdcall IRpcChannelBuffer_GetDestCtx_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRpcChannelBuffer_IsConnected_Proxy( 
-    IRpcChannelBuffer * This);
-
-
-void __stdcall IRpcChannelBuffer_IsConnected_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IRpcChannelBuffer2;
-
-
-    
-    struct __declspec(uuid("594f31d0-7f19-11d0-b194-00a0c90dc8bf")) __declspec(novtable)
-    IRpcChannelBuffer2 : public IRpcChannelBuffer
-    {
-    public:
-        virtual HRESULT __stdcall GetProtocolVersion( 
-             DWORD *pdwVersion) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IRpcChannelBuffer2_GetProtocolVersion_Proxy( 
-    IRpcChannelBuffer2 * This,
-     DWORD *pdwVersion);
-
-
-void __stdcall IRpcChannelBuffer2_GetProtocolVersion_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IAsyncRpcChannelBuffer;
-
-
-    
-    struct __declspec(uuid("a5029fb6-3c34-11d1-9c99-00c04fb998aa")) __declspec(novtable)
-    IAsyncRpcChannelBuffer : public IRpcChannelBuffer2
-    {
-    public:
-        virtual HRESULT __stdcall Send( 
-             RPCOLEMESSAGE *pMsg,
-             ISynchronize *pSync,
-             ULONG *pulStatus) = 0;
-        
-        virtual HRESULT __stdcall Receive( 
-             RPCOLEMESSAGE *pMsg,
-             ULONG *pulStatus) = 0;
-        
-        virtual HRESULT __stdcall GetDestCtxEx( 
-             RPCOLEMESSAGE *pMsg,
-             DWORD *pdwDestContext,
-             void **ppvDestContext) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IAsyncRpcChannelBuffer_Send_Proxy( 
-    IAsyncRpcChannelBuffer * This,
-     RPCOLEMESSAGE *pMsg,
-     ISynchronize *pSync,
-     ULONG *pulStatus);
-
-
-void __stdcall IAsyncRpcChannelBuffer_Send_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAsyncRpcChannelBuffer_Receive_Proxy( 
-    IAsyncRpcChannelBuffer * This,
-     RPCOLEMESSAGE *pMsg,
-     ULONG *pulStatus);
-
-
-void __stdcall IAsyncRpcChannelBuffer_Receive_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAsyncRpcChannelBuffer_GetDestCtxEx_Proxy( 
-    IAsyncRpcChannelBuffer * This,
-     RPCOLEMESSAGE *pMsg,
-     DWORD *pdwDestContext,
-     void **ppvDestContext);
-
-
-void __stdcall IAsyncRpcChannelBuffer_GetDestCtxEx_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IRpcChannelBuffer3;
-
-
-    
-    struct __declspec(uuid("25B15600-0115-11d0-BF0D-00AA00B8DFD2")) __declspec(novtable)
-    IRpcChannelBuffer3 : public IRpcChannelBuffer2
-    {
-    public:
-        virtual HRESULT __stdcall Send( 
-             RPCOLEMESSAGE *pMsg,
-             ULONG *pulStatus) = 0;
-        
-        virtual HRESULT __stdcall Receive( 
-             RPCOLEMESSAGE *pMsg,
-             ULONG ulSize,
-             ULONG *pulStatus) = 0;
-        
-        virtual HRESULT __stdcall Cancel( 
-             RPCOLEMESSAGE *pMsg) = 0;
-        
-        virtual HRESULT __stdcall GetCallContext( 
-             RPCOLEMESSAGE *pMsg,
-             const IID & riid,
-             void **pInterface) = 0;
-        
-        virtual HRESULT __stdcall GetDestCtxEx( 
-             RPCOLEMESSAGE *pMsg,
-             DWORD *pdwDestContext,
-             void **ppvDestContext) = 0;
-        
-        virtual HRESULT __stdcall GetState( 
-             RPCOLEMESSAGE *pMsg,
-             DWORD *pState) = 0;
-        
-        virtual HRESULT __stdcall RegisterAsync( 
-             RPCOLEMESSAGE *pMsg,
-             IAsyncManager *pAsyncMgr) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IRpcChannelBuffer3_Send_Proxy( 
-    IRpcChannelBuffer3 * This,
-     RPCOLEMESSAGE *pMsg,
-     ULONG *pulStatus);
-
-
-void __stdcall IRpcChannelBuffer3_Send_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRpcChannelBuffer3_Receive_Proxy( 
-    IRpcChannelBuffer3 * This,
-     RPCOLEMESSAGE *pMsg,
-     ULONG ulSize,
-     ULONG *pulStatus);
-
-
-void __stdcall IRpcChannelBuffer3_Receive_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRpcChannelBuffer3_Cancel_Proxy( 
-    IRpcChannelBuffer3 * This,
-     RPCOLEMESSAGE *pMsg);
-
-
-void __stdcall IRpcChannelBuffer3_Cancel_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRpcChannelBuffer3_GetCallContext_Proxy( 
-    IRpcChannelBuffer3 * This,
-     RPCOLEMESSAGE *pMsg,
-     const IID & riid,
-     void **pInterface);
-
-
-void __stdcall IRpcChannelBuffer3_GetCallContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRpcChannelBuffer3_GetDestCtxEx_Proxy( 
-    IRpcChannelBuffer3 * This,
-     RPCOLEMESSAGE *pMsg,
-     DWORD *pdwDestContext,
-     void **ppvDestContext);
-
-
-void __stdcall IRpcChannelBuffer3_GetDestCtxEx_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRpcChannelBuffer3_GetState_Proxy( 
-    IRpcChannelBuffer3 * This,
-     RPCOLEMESSAGE *pMsg,
-     DWORD *pState);
-
-
-void __stdcall IRpcChannelBuffer3_GetState_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRpcChannelBuffer3_RegisterAsync_Proxy( 
-    IRpcChannelBuffer3 * This,
-     RPCOLEMESSAGE *pMsg,
-     IAsyncManager *pAsyncMgr);
-
-
-void __stdcall IRpcChannelBuffer3_RegisterAsync_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IRpcSyntaxNegotiate;
-
-
-    
-    struct __declspec(uuid("58a08519-24c8-4935-b482-3fd823333a4f")) __declspec(novtable)
-    IRpcSyntaxNegotiate : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall NegotiateSyntax( 
-             RPCOLEMESSAGE *pMsg) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IRpcSyntaxNegotiate_NegotiateSyntax_Proxy( 
-    IRpcSyntaxNegotiate * This,
-     RPCOLEMESSAGE *pMsg);
-
-
-void __stdcall IRpcSyntaxNegotiate_NegotiateSyntax_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IRpcProxyBuffer;
-
-
-    
-    struct __declspec(uuid("D5F56A34-593B-101A-B569-08002B2DBF7A")) __declspec(novtable)
-    IRpcProxyBuffer : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Connect( 
-             IRpcChannelBuffer *pRpcChannelBuffer) = 0;
-        
-        virtual void __stdcall Disconnect( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IRpcProxyBuffer_Connect_Proxy( 
-    IRpcProxyBuffer * This,
-     IRpcChannelBuffer *pRpcChannelBuffer);
-
-
-void __stdcall IRpcProxyBuffer_Connect_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void __stdcall IRpcProxyBuffer_Disconnect_Proxy( 
-    IRpcProxyBuffer * This);
-
-
-void __stdcall IRpcProxyBuffer_Disconnect_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IRpcStubBuffer;
-
-
-    
-    struct __declspec(uuid("D5F56AFC-593B-101A-B569-08002B2DBF7A")) __declspec(novtable)
-    IRpcStubBuffer : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Connect( 
-             IUnknown *pUnkServer) = 0;
-        
-        virtual void __stdcall Disconnect( void) = 0;
-        
-        virtual HRESULT __stdcall Invoke( 
-             RPCOLEMESSAGE *_prpcmsg,
-             IRpcChannelBuffer *_pRpcChannelBuffer) = 0;
-        
-        virtual IRpcStubBuffer *__stdcall IsIIDSupported( 
-             const IID & riid) = 0;
-        
-        virtual ULONG __stdcall CountRefs( void) = 0;
-        
-        virtual HRESULT __stdcall DebugServerQueryInterface( 
-            void **ppv) = 0;
-        
-        virtual void __stdcall DebugServerRelease( 
-            void *pv) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IRpcStubBuffer_Connect_Proxy( 
-    IRpcStubBuffer * This,
-     IUnknown *pUnkServer);
-
-
-void __stdcall IRpcStubBuffer_Connect_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void __stdcall IRpcStubBuffer_Disconnect_Proxy( 
-    IRpcStubBuffer * This);
-
-
-void __stdcall IRpcStubBuffer_Disconnect_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRpcStubBuffer_Invoke_Proxy( 
-    IRpcStubBuffer * This,
-     RPCOLEMESSAGE *_prpcmsg,
-     IRpcChannelBuffer *_pRpcChannelBuffer);
-
-
-void __stdcall IRpcStubBuffer_Invoke_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-IRpcStubBuffer *__stdcall IRpcStubBuffer_IsIIDSupported_Proxy( 
-    IRpcStubBuffer * This,
-     const IID & riid);
-
-
-void __stdcall IRpcStubBuffer_IsIIDSupported_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-ULONG __stdcall IRpcStubBuffer_CountRefs_Proxy( 
-    IRpcStubBuffer * This);
-
-
-void __stdcall IRpcStubBuffer_CountRefs_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRpcStubBuffer_DebugServerQueryInterface_Proxy( 
-    IRpcStubBuffer * This,
-    void **ppv);
-
-
-void __stdcall IRpcStubBuffer_DebugServerQueryInterface_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void __stdcall IRpcStubBuffer_DebugServerRelease_Proxy( 
-    IRpcStubBuffer * This,
-    void *pv);
-
-
-void __stdcall IRpcStubBuffer_DebugServerRelease_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IPSFactoryBuffer;
-
-
-    
-    struct __declspec(uuid("D5F569D0-593B-101A-B569-08002B2DBF7A")) __declspec(novtable)
-    IPSFactoryBuffer : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall CreateProxy( 
-             IUnknown *pUnkOuter,
-             const IID & riid,
-             IRpcProxyBuffer **ppProxy,
-             void **ppv) = 0;
-        
-        virtual HRESULT __stdcall CreateStub( 
-             const IID & riid,
-             IUnknown *pUnkServer,
-             IRpcStubBuffer **ppStub) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPSFactoryBuffer_CreateProxy_Proxy( 
-    IPSFactoryBuffer * This,
-     IUnknown *pUnkOuter,
-     const IID & riid,
-     IRpcProxyBuffer **ppProxy,
-     void **ppv);
-
-
-void __stdcall IPSFactoryBuffer_CreateProxy_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPSFactoryBuffer_CreateStub_Proxy( 
-    IPSFactoryBuffer * This,
-     const IID & riid,
-     IUnknown *pUnkServer,
-     IRpcStubBuffer **ppStub);
-
-
-void __stdcall IPSFactoryBuffer_CreateStub_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-typedef struct SChannelHookCallInfo
-    {
-    IID iid;
-    DWORD cbSize;
-    GUID uCausality;
-    DWORD dwServerPid;
-    DWORD iMethod;
-    void *pObject;
-    } 	SChannelHookCallInfo;
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0050_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0050_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IChannelHook;
-
-
-    
-    struct __declspec(uuid("1008c4a0-7613-11cf-9af1-0020af6e72f4")) __declspec(novtable)
-    IChannelHook : public IUnknown
-    {
-    public:
-        virtual void __stdcall ClientGetSize( 
-             const GUID & uExtent,
-             const IID & riid,
-             ULONG *pDataSize) = 0;
-        
-        virtual void __stdcall ClientFillBuffer( 
-             const GUID & uExtent,
-             const IID & riid,
-             ULONG *pDataSize,
-             void *pDataBuffer) = 0;
-        
-        virtual void __stdcall ClientNotify( 
-             const GUID & uExtent,
-             const IID & riid,
-             ULONG cbDataSize,
-             void *pDataBuffer,
-             DWORD lDataRep,
-             HRESULT hrFault) = 0;
-        
-        virtual void __stdcall ServerNotify( 
-             const GUID & uExtent,
-             const IID & riid,
-             ULONG cbDataSize,
-             void *pDataBuffer,
-             DWORD lDataRep) = 0;
-        
-        virtual void __stdcall ServerGetSize( 
-             const GUID & uExtent,
-             const IID & riid,
-             HRESULT hrFault,
-             ULONG *pDataSize) = 0;
-        
-        virtual void __stdcall ServerFillBuffer( 
-             const GUID & uExtent,
-             const IID & riid,
-             ULONG *pDataSize,
-             void *pDataBuffer,
-             HRESULT hrFault) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-void __stdcall IChannelHook_ClientGetSize_Proxy( 
-    IChannelHook * This,
-     const GUID & uExtent,
-     const IID & riid,
-     ULONG *pDataSize);
-
-
-void __stdcall IChannelHook_ClientGetSize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void __stdcall IChannelHook_ClientFillBuffer_Proxy( 
-    IChannelHook * This,
-     const GUID & uExtent,
-     const IID & riid,
-     ULONG *pDataSize,
-     void *pDataBuffer);
-
-
-void __stdcall IChannelHook_ClientFillBuffer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void __stdcall IChannelHook_ClientNotify_Proxy( 
-    IChannelHook * This,
-     const GUID & uExtent,
-     const IID & riid,
-     ULONG cbDataSize,
-     void *pDataBuffer,
-     DWORD lDataRep,
-     HRESULT hrFault);
-
-
-void __stdcall IChannelHook_ClientNotify_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void __stdcall IChannelHook_ServerNotify_Proxy( 
-    IChannelHook * This,
-     const GUID & uExtent,
-     const IID & riid,
-     ULONG cbDataSize,
-     void *pDataBuffer,
-     DWORD lDataRep);
-
-
-void __stdcall IChannelHook_ServerNotify_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void __stdcall IChannelHook_ServerGetSize_Proxy( 
-    IChannelHook * This,
-     const GUID & uExtent,
-     const IID & riid,
-     HRESULT hrFault,
-     ULONG *pDataSize);
-
-
-void __stdcall IChannelHook_ServerGetSize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-void __stdcall IChannelHook_ServerFillBuffer_Proxy( 
-    IChannelHook * This,
-     const GUID & uExtent,
-     const IID & riid,
-     ULONG *pDataSize,
-     void *pDataBuffer,
-     HRESULT hrFault);
-
-
-void __stdcall IChannelHook_ServerFillBuffer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-extern const FMTID FMTID_SummaryInformation;
-
-extern const FMTID FMTID_DocSummaryInformation;
-
-extern const FMTID FMTID_UserDefinedProperties;
-
-extern const FMTID FMTID_DiscardableInformation;
-
-extern const FMTID FMTID_ImageSummaryInformation;
-
-extern const FMTID FMTID_AudioSummaryInformation;
-
-extern const FMTID FMTID_VideoSummaryInformation;
-
-extern const FMTID FMTID_MediaFileSummaryInformation;
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0051_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0051_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef struct tagSOLE_AUTHENTICATION_SERVICE
-    {
-    DWORD dwAuthnSvc;
-    DWORD dwAuthzSvc;
-    OLECHAR *pPrincipalName;
-    HRESULT hr;
-    } 	SOLE_AUTHENTICATION_SERVICE;
-
-typedef SOLE_AUTHENTICATION_SERVICE *PSOLE_AUTHENTICATION_SERVICE;
-
-typedef 
-enum tagEOLE_AUTHENTICATION_CAPABILITIES
-    {	EOAC_NONE	= 0,
-	EOAC_MUTUAL_AUTH	= 0x1,
-	EOAC_STATIC_CLOAKING	= 0x20,
-	EOAC_DYNAMIC_CLOAKING	= 0x40,
-	EOAC_ANY_AUTHORITY	= 0x80,
-	EOAC_MAKE_FULLSIC	= 0x100,
-	EOAC_DEFAULT	= 0x800,
-	EOAC_SECURE_REFS	= 0x2,
-	EOAC_ACCESS_CONTROL	= 0x4,
-	EOAC_APPID	= 0x8,
-	EOAC_DYNAMIC	= 0x10,
-	EOAC_REQUIRE_FULLSIC	= 0x200,
-	EOAC_AUTO_IMPERSONATE	= 0x400,
-	EOAC_NO_CUSTOM_MARSHAL	= 0x2000,
-	EOAC_DISABLE_AAA	= 0x1000
-    } 	EOLE_AUTHENTICATION_CAPABILITIES;
-
-
-
-
-
-typedef struct tagSOLE_AUTHENTICATION_INFO
-    {
-    DWORD dwAuthnSvc;
-    DWORD dwAuthzSvc;
-    void *pAuthInfo;
-    } 	SOLE_AUTHENTICATION_INFO;
-
-typedef struct tagSOLE_AUTHENTICATION_INFO *PSOLE_AUTHENTICATION_INFO;
-
-typedef struct tagSOLE_AUTHENTICATION_LIST
-    {
-    DWORD cAuthInfo;
-    SOLE_AUTHENTICATION_INFO *aAuthInfo;
-    } 	SOLE_AUTHENTICATION_LIST;
-
-typedef struct tagSOLE_AUTHENTICATION_LIST *PSOLE_AUTHENTICATION_LIST;
-
-
-extern "C" const IID IID_IClientSecurity;
-
-
-    
-    struct __declspec(uuid("0000013D-0000-0000-C000-000000000046")) __declspec(novtable)
-    IClientSecurity : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall QueryBlanket( 
-             IUnknown *pProxy,
-             DWORD *pAuthnSvc,
-             DWORD *pAuthzSvc,
-             OLECHAR **pServerPrincName,
-             DWORD *pAuthnLevel,
-             DWORD *pImpLevel,
-             void **pAuthInfo,
-             DWORD *pCapabilites) = 0;
-        
-        virtual HRESULT __stdcall SetBlanket( 
-             IUnknown *pProxy,
-             DWORD dwAuthnSvc,
-             DWORD dwAuthzSvc,
-             OLECHAR *pServerPrincName,
-             DWORD dwAuthnLevel,
-             DWORD dwImpLevel,
-             void *pAuthInfo,
-             DWORD dwCapabilities) = 0;
-        
-        virtual HRESULT __stdcall CopyProxy( 
-             IUnknown *pProxy,
-             IUnknown **ppCopy) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IClientSecurity_QueryBlanket_Proxy( 
-    IClientSecurity * This,
-     IUnknown *pProxy,
-     DWORD *pAuthnSvc,
-     DWORD *pAuthzSvc,
-     OLECHAR **pServerPrincName,
-     DWORD *pAuthnLevel,
-     DWORD *pImpLevel,
-     void **pAuthInfo,
-     DWORD *pCapabilites);
-
-
-void __stdcall IClientSecurity_QueryBlanket_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IClientSecurity_SetBlanket_Proxy( 
-    IClientSecurity * This,
-     IUnknown *pProxy,
-     DWORD dwAuthnSvc,
-     DWORD dwAuthzSvc,
-     OLECHAR *pServerPrincName,
-     DWORD dwAuthnLevel,
-     DWORD dwImpLevel,
-     void *pAuthInfo,
-     DWORD dwCapabilities);
-
-
-void __stdcall IClientSecurity_SetBlanket_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IClientSecurity_CopyProxy_Proxy( 
-    IClientSecurity * This,
-     IUnknown *pProxy,
-     IUnknown **ppCopy);
-
-
-void __stdcall IClientSecurity_CopyProxy_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IServerSecurity;
-
-
-    
-    struct __declspec(uuid("0000013E-0000-0000-C000-000000000046")) __declspec(novtable)
-    IServerSecurity : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall QueryBlanket( 
-             DWORD *pAuthnSvc,
-             DWORD *pAuthzSvc,
-             OLECHAR **pServerPrincName,
-             DWORD *pAuthnLevel,
-             DWORD *pImpLevel,
-             void **pPrivs,
-             DWORD *pCapabilities) = 0;
-        
-        virtual HRESULT __stdcall ImpersonateClient( void) = 0;
-        
-        virtual HRESULT __stdcall RevertToSelf( void) = 0;
-        
-        virtual BOOL __stdcall IsImpersonating( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IServerSecurity_QueryBlanket_Proxy( 
-    IServerSecurity * This,
-     DWORD *pAuthnSvc,
-     DWORD *pAuthzSvc,
-     OLECHAR **pServerPrincName,
-     DWORD *pAuthnLevel,
-     DWORD *pImpLevel,
-     void **pPrivs,
-     DWORD *pCapabilities);
-
-
-void __stdcall IServerSecurity_QueryBlanket_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IServerSecurity_ImpersonateClient_Proxy( 
-    IServerSecurity * This);
-
-
-void __stdcall IServerSecurity_ImpersonateClient_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IServerSecurity_RevertToSelf_Proxy( 
-    IServerSecurity * This);
-
-
-void __stdcall IServerSecurity_RevertToSelf_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-BOOL __stdcall IServerSecurity_IsImpersonating_Proxy( 
-    IServerSecurity * This);
-
-
-void __stdcall IServerSecurity_IsImpersonating_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IClassActivator;
-
-
-    
-    struct __declspec(uuid("00000140-0000-0000-C000-000000000046")) __declspec(novtable)
-    IClassActivator : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetClassObject( 
-             const IID & rclsid,
-             DWORD dwClassContext,
-             LCID locale,
-             const IID & riid,
-             void **ppv) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IClassActivator_GetClassObject_Proxy( 
-    IClassActivator * This,
-     const IID & rclsid,
-     DWORD dwClassContext,
-     LCID locale,
-     const IID & riid,
-     void **ppv);
-
-
-void __stdcall IClassActivator_GetClassObject_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IRpcOptions;
-
-
-    
-    struct __declspec(uuid("00000144-0000-0000-C000-000000000046")) __declspec(novtable)
-    IRpcOptions : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Set( 
-             IUnknown *pPrx,
-             DWORD dwProperty,
-             ULONG_PTR dwValue) = 0;
-        
-        virtual HRESULT __stdcall Query( 
-             IUnknown *pPrx,
-             DWORD dwProperty,
-             ULONG_PTR *pdwValue) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IRpcOptions_Set_Proxy( 
-    IRpcOptions * This,
-     IUnknown *pPrx,
-     DWORD dwProperty,
-     ULONG_PTR dwValue);
-
-
-void __stdcall IRpcOptions_Set_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRpcOptions_Query_Proxy( 
-    IRpcOptions * This,
-     IUnknown *pPrx,
-     DWORD dwProperty,
-     ULONG_PTR *pdwValue);
-
-
-void __stdcall IRpcOptions_Query_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-enum __MIDL___MIDL_itf_objidl_0055_0001
-    {	COMBND_RPCTIMEOUT	= 0x1,
-	COMBND_SERVER_LOCALITY	= 0x2
-    } ;
-
-enum __MIDL___MIDL_itf_objidl_0055_0002
-    {	SERVER_LOCALITY_PROCESS_LOCAL	= 0,
-	SERVER_LOCALITY_MACHINE_LOCAL	= 1,
-	SERVER_LOCALITY_REMOTE	= 2
-    } ;
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0055_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0055_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IFillLockBytes;
-
-
-    
-    struct __declspec(uuid("99caf010-415e-11cf-8814-00aa00b569f5")) __declspec(novtable)
-    IFillLockBytes : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall FillAppend( 
-             const void *pv,
-             ULONG cb,
-             ULONG *pcbWritten) = 0;
-        
-        virtual  HRESULT __stdcall FillAt( 
-             ULARGE_INTEGER ulOffset,
-             const void *pv,
-             ULONG cb,
-             ULONG *pcbWritten) = 0;
-        
-        virtual HRESULT __stdcall SetFillSize( 
-             ULARGE_INTEGER ulSize) = 0;
-        
-        virtual HRESULT __stdcall Terminate( 
-             BOOL bCanceled) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IFillLockBytes_RemoteFillAppend_Proxy( 
-    IFillLockBytes * This,
-     const byte *pv,
-     ULONG cb,
-     ULONG *pcbWritten);
-
-
-void __stdcall IFillLockBytes_RemoteFillAppend_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IFillLockBytes_RemoteFillAt_Proxy( 
-    IFillLockBytes * This,
-     ULARGE_INTEGER ulOffset,
-     const byte *pv,
-     ULONG cb,
-     ULONG *pcbWritten);
-
-
-void __stdcall IFillLockBytes_RemoteFillAt_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFillLockBytes_SetFillSize_Proxy( 
-    IFillLockBytes * This,
-     ULARGE_INTEGER ulSize);
-
-
-void __stdcall IFillLockBytes_SetFillSize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFillLockBytes_Terminate_Proxy( 
-    IFillLockBytes * This,
-     BOOL bCanceled);
-
-
-void __stdcall IFillLockBytes_Terminate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IProgressNotify;
-
-
-    
-    struct __declspec(uuid("a9d758a0-4617-11cf-95fc-00aa00680db4")) __declspec(novtable)
-    IProgressNotify : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall OnProgress( 
-             DWORD dwProgressCurrent,
-             DWORD dwProgressMaximum,
-             BOOL fAccurate,
-             BOOL fOwner) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IProgressNotify_OnProgress_Proxy( 
-    IProgressNotify * This,
-     DWORD dwProgressCurrent,
-     DWORD dwProgressMaximum,
-     BOOL fAccurate,
-     BOOL fOwner);
-
-
-void __stdcall IProgressNotify_OnProgress_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef struct tagStorageLayout
-    {
-    DWORD LayoutType;
-    OLECHAR *pwcsElementName;
-    LARGE_INTEGER cOffset;
-    LARGE_INTEGER cBytes;
-    } 	StorageLayout;
-
-
-extern "C" const IID IID_ILayoutStorage;
-
-
-    
-    struct __declspec(uuid("0e6d4d90-6738-11cf-9608-00aa00680db4")) __declspec(novtable)
-    ILayoutStorage : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall LayoutScript( 
-             StorageLayout *pStorageLayout,
-             DWORD nEntries,
-             DWORD glfInterleavedFlag) = 0;
-        
-        virtual HRESULT __stdcall BeginMonitor( void) = 0;
-        
-        virtual HRESULT __stdcall EndMonitor( void) = 0;
-        
-        virtual HRESULT __stdcall ReLayoutDocfile( 
-             OLECHAR *pwcsNewDfName) = 0;
-        
-        virtual HRESULT __stdcall ReLayoutDocfileOnILockBytes( 
-             ILockBytes *pILockBytes) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ILayoutStorage_LayoutScript_Proxy( 
-    ILayoutStorage * This,
-     StorageLayout *pStorageLayout,
-     DWORD nEntries,
-     DWORD glfInterleavedFlag);
-
-
-void __stdcall ILayoutStorage_LayoutScript_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ILayoutStorage_BeginMonitor_Proxy( 
-    ILayoutStorage * This);
-
-
-void __stdcall ILayoutStorage_BeginMonitor_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ILayoutStorage_EndMonitor_Proxy( 
-    ILayoutStorage * This);
-
-
-void __stdcall ILayoutStorage_EndMonitor_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ILayoutStorage_ReLayoutDocfile_Proxy( 
-    ILayoutStorage * This,
-     OLECHAR *pwcsNewDfName);
-
-
-void __stdcall ILayoutStorage_ReLayoutDocfile_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ILayoutStorage_ReLayoutDocfileOnILockBytes_Proxy( 
-    ILayoutStorage * This,
-     ILockBytes *pILockBytes);
-
-
-void __stdcall ILayoutStorage_ReLayoutDocfileOnILockBytes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IBlockingLock;
-
-
-    
-    struct __declspec(uuid("30f3d47a-6447-11d1-8e3c-00c04fb9386d")) __declspec(novtable)
-    IBlockingLock : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Lock( 
-             DWORD dwTimeout) = 0;
-        
-        virtual HRESULT __stdcall Unlock( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IBlockingLock_Lock_Proxy( 
-    IBlockingLock * This,
-     DWORD dwTimeout);
-
-
-void __stdcall IBlockingLock_Lock_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBlockingLock_Unlock_Proxy( 
-    IBlockingLock * This);
-
-
-void __stdcall IBlockingLock_Unlock_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_ITimeAndNoticeControl;
-
-
-    
-    struct __declspec(uuid("bc0bf6ae-8878-11d1-83e9-00c04fc2c6d4")) __declspec(novtable)
-    ITimeAndNoticeControl : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall SuppressChanges( 
-             DWORD res1,
-             DWORD res2) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ITimeAndNoticeControl_SuppressChanges_Proxy( 
-    ITimeAndNoticeControl * This,
-     DWORD res1,
-     DWORD res2);
-
-
-void __stdcall ITimeAndNoticeControl_SuppressChanges_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IOplockStorage;
-
-
-    
-    struct __declspec(uuid("8d19c834-8879-11d1-83e9-00c04fc2c6d4")) __declspec(novtable)
-    IOplockStorage : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall CreateStorageEx( 
-             LPCWSTR pwcsName,
-             DWORD grfMode,
-             DWORD stgfmt,
-             DWORD grfAttrs,
-             const IID & riid,
-             void **ppstgOpen) = 0;
-        
-        virtual HRESULT __stdcall OpenStorageEx( 
-             LPCWSTR pwcsName,
-             DWORD grfMode,
-             DWORD stgfmt,
-             DWORD grfAttrs,
-             const IID & riid,
-             void **ppstgOpen) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOplockStorage_CreateStorageEx_Proxy( 
-    IOplockStorage * This,
-     LPCWSTR pwcsName,
-     DWORD grfMode,
-     DWORD stgfmt,
-     DWORD grfAttrs,
-     const IID & riid,
-     void **ppstgOpen);
-
-
-void __stdcall IOplockStorage_CreateStorageEx_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOplockStorage_OpenStorageEx_Proxy( 
-    IOplockStorage * This,
-     LPCWSTR pwcsName,
-     DWORD grfMode,
-     DWORD stgfmt,
-     DWORD grfAttrs,
-     const IID & riid,
-     void **ppstgOpen);
-
-
-void __stdcall IOplockStorage_OpenStorageEx_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  ISurrogate *LPSURROGATE;
-
-
-extern "C" const IID IID_ISurrogate;
-
-
-    
-    struct __declspec(uuid("00000022-0000-0000-C000-000000000046")) __declspec(novtable)
-    ISurrogate : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall LoadDllServer( 
-             const IID & Clsid) = 0;
-        
-        virtual HRESULT __stdcall FreeSurrogate( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ISurrogate_LoadDllServer_Proxy( 
-    ISurrogate * This,
-     const IID & Clsid);
-
-
-void __stdcall ISurrogate_LoadDllServer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ISurrogate_FreeSurrogate_Proxy( 
-    ISurrogate * This);
-
-
-void __stdcall ISurrogate_FreeSurrogate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IGlobalInterfaceTable *LPGLOBALINTERFACETABLE;
-
-
-extern "C" const IID IID_IGlobalInterfaceTable;
-
-
-    
-    struct __declspec(uuid("00000146-0000-0000-C000-000000000046")) __declspec(novtable)
-    IGlobalInterfaceTable : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall RegisterInterfaceInGlobal( 
-             IUnknown *pUnk,
-             const IID & riid,
-             DWORD *pdwCookie) = 0;
-        
-        virtual HRESULT __stdcall RevokeInterfaceFromGlobal( 
-             DWORD dwCookie) = 0;
-        
-        virtual HRESULT __stdcall GetInterfaceFromGlobal( 
-             DWORD dwCookie,
-             const IID & riid,
-             void **ppv) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IGlobalInterfaceTable_RegisterInterfaceInGlobal_Proxy( 
-    IGlobalInterfaceTable * This,
-     IUnknown *pUnk,
-     const IID & riid,
-     DWORD *pdwCookie);
-
-
-void __stdcall IGlobalInterfaceTable_RegisterInterfaceInGlobal_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IGlobalInterfaceTable_RevokeInterfaceFromGlobal_Proxy( 
-    IGlobalInterfaceTable * This,
-     DWORD dwCookie);
-
-
-void __stdcall IGlobalInterfaceTable_RevokeInterfaceFromGlobal_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IGlobalInterfaceTable_GetInterfaceFromGlobal_Proxy( 
-    IGlobalInterfaceTable * This,
-     DWORD dwCookie,
-     const IID & riid,
-     void **ppv);
-
-
-void __stdcall IGlobalInterfaceTable_GetInterfaceFromGlobal_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IDirectWriterLock;
-
-
-    
-    struct __declspec(uuid("0e6d4d92-6738-11cf-9608-00aa00680db4")) __declspec(novtable)
-    IDirectWriterLock : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall WaitForWriteAccess( 
-             DWORD dwTimeout) = 0;
-        
-        virtual HRESULT __stdcall ReleaseWriteAccess( void) = 0;
-        
-        virtual HRESULT __stdcall HaveWriteAccess( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IDirectWriterLock_WaitForWriteAccess_Proxy( 
-    IDirectWriterLock * This,
-     DWORD dwTimeout);
-
-
-void __stdcall IDirectWriterLock_WaitForWriteAccess_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDirectWriterLock_ReleaseWriteAccess_Proxy( 
-    IDirectWriterLock * This);
-
-
-void __stdcall IDirectWriterLock_ReleaseWriteAccess_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDirectWriterLock_HaveWriteAccess_Proxy( 
-    IDirectWriterLock * This);
-
-
-void __stdcall IDirectWriterLock_HaveWriteAccess_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_ISynchronize;
-
-
-    
-    struct __declspec(uuid("00000030-0000-0000-C000-000000000046")) __declspec(novtable)
-    ISynchronize : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Wait( 
-             DWORD dwFlags,
-             DWORD dwMilliseconds) = 0;
-        
-        virtual HRESULT __stdcall Signal( void) = 0;
-        
-        virtual HRESULT __stdcall Reset( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ISynchronize_Wait_Proxy( 
-    ISynchronize * This,
-     DWORD dwFlags,
-     DWORD dwMilliseconds);
-
-
-void __stdcall ISynchronize_Wait_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ISynchronize_Signal_Proxy( 
-    ISynchronize * This);
-
-
-void __stdcall ISynchronize_Signal_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ISynchronize_Reset_Proxy( 
-    ISynchronize * This);
-
-
-void __stdcall ISynchronize_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_ISynchronizeHandle;
-
-
-    
-    struct __declspec(uuid("00000031-0000-0000-C000-000000000046")) __declspec(novtable)
-    ISynchronizeHandle : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetHandle( 
-             HANDLE *ph) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ISynchronizeHandle_GetHandle_Proxy( 
-    ISynchronizeHandle * This,
-     HANDLE *ph);
-
-
-void __stdcall ISynchronizeHandle_GetHandle_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_ISynchronizeEvent;
-
-
-    
-    struct __declspec(uuid("00000032-0000-0000-C000-000000000046")) __declspec(novtable)
-    ISynchronizeEvent : public ISynchronizeHandle
-    {
-    public:
-        virtual HRESULT __stdcall SetEventHandle( 
-             HANDLE *ph) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ISynchronizeEvent_SetEventHandle_Proxy( 
-    ISynchronizeEvent * This,
-     HANDLE *ph);
-
-
-void __stdcall ISynchronizeEvent_SetEventHandle_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_ISynchronizeContainer;
-
-
-    
-    struct __declspec(uuid("00000033-0000-0000-C000-000000000046")) __declspec(novtable)
-    ISynchronizeContainer : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall AddSynchronize( 
-             ISynchronize *pSync) = 0;
-        
-        virtual HRESULT __stdcall WaitMultiple( 
-             DWORD dwFlags,
-             DWORD dwTimeOut,
-             ISynchronize **ppSync) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ISynchronizeContainer_AddSynchronize_Proxy( 
-    ISynchronizeContainer * This,
-     ISynchronize *pSync);
-
-
-void __stdcall ISynchronizeContainer_AddSynchronize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ISynchronizeContainer_WaitMultiple_Proxy( 
-    ISynchronizeContainer * This,
-     DWORD dwFlags,
-     DWORD dwTimeOut,
-     ISynchronize **ppSync);
-
-
-void __stdcall ISynchronizeContainer_WaitMultiple_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_ISynchronizeMutex;
-
-
-    
-    struct __declspec(uuid("00000025-0000-0000-C000-000000000046")) __declspec(novtable)
-    ISynchronizeMutex : public ISynchronize
-    {
-    public:
-        virtual HRESULT __stdcall ReleaseMutex( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ISynchronizeMutex_ReleaseMutex_Proxy( 
-    ISynchronizeMutex * This);
-
-
-void __stdcall ISynchronizeMutex_ReleaseMutex_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  ICancelMethodCalls *LPCANCELMETHODCALLS;
-
-
-extern "C" const IID IID_ICancelMethodCalls;
-
-
-    
-    struct __declspec(uuid("00000029-0000-0000-C000-000000000046")) __declspec(novtable)
-    ICancelMethodCalls : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Cancel( 
-             ULONG ulSeconds) = 0;
-        
-        virtual HRESULT __stdcall TestCancel( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ICancelMethodCalls_Cancel_Proxy( 
-    ICancelMethodCalls * This,
-     ULONG ulSeconds);
-
-
-void __stdcall ICancelMethodCalls_Cancel_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICancelMethodCalls_TestCancel_Proxy( 
-    ICancelMethodCalls * This);
-
-
-void __stdcall ICancelMethodCalls_TestCancel_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef 
-enum tagDCOM_CALL_STATE
-    {	DCOM_NONE	= 0,
-	DCOM_CALL_COMPLETE	= 0x1,
-	DCOM_CALL_CANCELED	= 0x2
-    } 	DCOM_CALL_STATE;
-
-
-extern "C" const IID IID_IAsyncManager;
-
-
-    
-    struct __declspec(uuid("0000002A-0000-0000-C000-000000000046")) __declspec(novtable)
-    IAsyncManager : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall CompleteCall( 
-             HRESULT Result) = 0;
-        
-        virtual HRESULT __stdcall GetCallContext( 
-             const IID & riid,
-             void **pInterface) = 0;
-        
-        virtual HRESULT __stdcall GetState( 
-             ULONG *pulStateFlags) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IAsyncManager_CompleteCall_Proxy( 
-    IAsyncManager * This,
-     HRESULT Result);
-
-
-void __stdcall IAsyncManager_CompleteCall_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAsyncManager_GetCallContext_Proxy( 
-    IAsyncManager * This,
-     const IID & riid,
-     void **pInterface);
-
-
-void __stdcall IAsyncManager_GetCallContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAsyncManager_GetState_Proxy( 
-    IAsyncManager * This,
-     ULONG *pulStateFlags);
-
-
-void __stdcall IAsyncManager_GetState_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_ICallFactory;
-
-
-    
-    struct __declspec(uuid("1c733a30-2a1c-11ce-ade5-00aa0044773d")) __declspec(novtable)
-    ICallFactory : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall CreateCall( 
-             const IID & riid,
-             IUnknown *pCtrlUnk,
-             const IID & riid2,
-             IUnknown **ppv) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ICallFactory_CreateCall_Proxy( 
-    ICallFactory * This,
-     const IID & riid,
-     IUnknown *pCtrlUnk,
-     const IID & riid2,
-     IUnknown **ppv);
-
-
-void __stdcall ICallFactory_CreateCall_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IRpcHelper;
-
-
-    
-    struct __declspec(uuid("00000149-0000-0000-C000-000000000046")) __declspec(novtable)
-    IRpcHelper : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetDCOMProtocolVersion( 
-             DWORD *pComVersion) = 0;
-        
-        virtual HRESULT __stdcall GetIIDFromOBJREF( 
-             void *pObjRef,
-             IID **piid) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IRpcHelper_GetDCOMProtocolVersion_Proxy( 
-    IRpcHelper * This,
-     DWORD *pComVersion);
-
-
-void __stdcall IRpcHelper_GetDCOMProtocolVersion_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRpcHelper_GetIIDFromOBJREF_Proxy( 
-    IRpcHelper * This,
-     void *pObjRef,
-     IID **piid);
-
-
-void __stdcall IRpcHelper_GetIIDFromOBJREF_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IReleaseMarshalBuffers;
-
-
-    
-    struct __declspec(uuid("eb0cb9e8-7996-11d2-872e-0000f8080859")) __declspec(novtable)
-    IReleaseMarshalBuffers : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall ReleaseMarshalBuffer( 
-             RPCOLEMESSAGE *pMsg,
-             DWORD dwFlags,
-             IUnknown *pChnl) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IReleaseMarshalBuffers_ReleaseMarshalBuffer_Proxy( 
-    IReleaseMarshalBuffers * This,
-     RPCOLEMESSAGE *pMsg,
-     DWORD dwFlags,
-     IUnknown *pChnl);
-
-
-void __stdcall IReleaseMarshalBuffers_ReleaseMarshalBuffer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IWaitMultiple;
-
-
-    
-    struct __declspec(uuid("0000002B-0000-0000-C000-000000000046")) __declspec(novtable)
-    IWaitMultiple : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall WaitMultiple( 
-             DWORD timeout,
-             ISynchronize **pSync) = 0;
-        
-        virtual HRESULT __stdcall AddSynchronize( 
-             ISynchronize *pSync) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IWaitMultiple_WaitMultiple_Proxy( 
-    IWaitMultiple * This,
-     DWORD timeout,
-     ISynchronize **pSync);
-
-
-void __stdcall IWaitMultiple_WaitMultiple_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IWaitMultiple_AddSynchronize_Proxy( 
-    IWaitMultiple * This,
-     ISynchronize *pSync);
-
-
-void __stdcall IWaitMultiple_AddSynchronize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IUrlMon;
-
-
-    
-    struct __declspec(uuid("00000026-0000-0000-C000-000000000046")) __declspec(novtable)
-    IUrlMon : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall AsyncGetClassBits( 
-             const IID & rclsid,
-             LPCWSTR pszTYPE,
-             LPCWSTR pszExt,
-             DWORD dwFileVersionMS,
-             DWORD dwFileVersionLS,
-             LPCWSTR pszCodeBase,
-             IBindCtx *pbc,
-             DWORD dwClassContext,
-             const IID & riid,
-             DWORD flags) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IUrlMon_AsyncGetClassBits_Proxy( 
-    IUrlMon * This,
-     const IID & rclsid,
-     LPCWSTR pszTYPE,
-     LPCWSTR pszExt,
-     DWORD dwFileVersionMS,
-     DWORD dwFileVersionLS,
-     LPCWSTR pszCodeBase,
-     IBindCtx *pbc,
-     DWORD dwClassContext,
-     const IID & riid,
-     DWORD flags);
-
-
-void __stdcall IUrlMon_AsyncGetClassBits_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IForegroundTransfer;
-
-
-    
-    struct __declspec(uuid("00000145-0000-0000-C000-000000000046")) __declspec(novtable)
-    IForegroundTransfer : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall AllowForegroundTransfer( 
-             void *lpvReserved) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IForegroundTransfer_AllowForegroundTransfer_Proxy( 
-    IForegroundTransfer * This,
-     void *lpvReserved);
-
-
-void __stdcall IForegroundTransfer_AllowForegroundTransfer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IAddrTrackingControl *LPADDRTRACKINGCONTROL;
-
-
-extern "C" const IID IID_IAddrTrackingControl;
-
-
-    
-    struct __declspec(uuid("00000147-0000-0000-C000-000000000046")) __declspec(novtable)
-    IAddrTrackingControl : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall EnableCOMDynamicAddrTracking( void) = 0;
-        
-        virtual HRESULT __stdcall DisableCOMDynamicAddrTracking( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IAddrTrackingControl_EnableCOMDynamicAddrTracking_Proxy( 
-    IAddrTrackingControl * This);
-
-
-void __stdcall IAddrTrackingControl_EnableCOMDynamicAddrTracking_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAddrTrackingControl_DisableCOMDynamicAddrTracking_Proxy( 
-    IAddrTrackingControl * This);
-
-
-void __stdcall IAddrTrackingControl_DisableCOMDynamicAddrTracking_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IAddrExclusionControl *LPADDREXCLUSIONCONTROL;
-
-
-extern "C" const IID IID_IAddrExclusionControl;
-
-
-    
-    struct __declspec(uuid("00000148-0000-0000-C000-000000000046")) __declspec(novtable)
-    IAddrExclusionControl : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetCurrentAddrExclusionList( 
-             const IID & riid,
-             void **ppEnumerator) = 0;
-        
-        virtual HRESULT __stdcall UpdateAddrExclusionList( 
-             IUnknown *pEnumerator) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IAddrExclusionControl_GetCurrentAddrExclusionList_Proxy( 
-    IAddrExclusionControl * This,
-     const IID & riid,
-     void **ppEnumerator);
-
-
-void __stdcall IAddrExclusionControl_GetCurrentAddrExclusionList_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAddrExclusionControl_UpdateAddrExclusionList_Proxy( 
-    IAddrExclusionControl * This,
-     IUnknown *pEnumerator);
-
-
-void __stdcall IAddrExclusionControl_UpdateAddrExclusionList_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IPipeByte;
-
-
-    
-    struct __declspec(uuid("DB2F3ACA-2F86-11d1-8E04-00C04FB9989A")) __declspec(novtable)
-    IPipeByte : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Pull( 
-             BYTE *buf,
-             ULONG cRequest,
-             ULONG *pcReturned) = 0;
-        
-        virtual HRESULT __stdcall Push( 
-             BYTE *buf,
-             ULONG cSent) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPipeByte_Pull_Proxy( 
-    IPipeByte * This,
-     BYTE *buf,
-     ULONG cRequest,
-     ULONG *pcReturned);
-
-
-void __stdcall IPipeByte_Pull_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPipeByte_Push_Proxy( 
-    IPipeByte * This,
-     BYTE *buf,
-     ULONG cSent);
-
-
-void __stdcall IPipeByte_Push_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_AsyncIPipeByte;
-
-
-    
-    struct __declspec(uuid("DB2F3ACB-2F86-11d1-8E04-00C04FB9989A")) __declspec(novtable)
-    AsyncIPipeByte : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Begin_Pull( 
-             ULONG cRequest) = 0;
-        
-        virtual HRESULT __stdcall Finish_Pull( 
-             BYTE *buf,
-             ULONG *pcReturned) = 0;
-        
-        virtual HRESULT __stdcall Begin_Push( 
-             BYTE *buf,
-             ULONG cSent) = 0;
-        
-        virtual HRESULT __stdcall Finish_Push( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall AsyncIPipeByte_Begin_Pull_Proxy( 
-    AsyncIPipeByte * This,
-     ULONG cRequest);
-
-
-void __stdcall AsyncIPipeByte_Begin_Pull_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall AsyncIPipeByte_Finish_Pull_Proxy( 
-    AsyncIPipeByte * This,
-     BYTE *buf,
-     ULONG *pcReturned);
-
-
-void __stdcall AsyncIPipeByte_Finish_Pull_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall AsyncIPipeByte_Begin_Push_Proxy( 
-    AsyncIPipeByte * This,
-     BYTE *buf,
-     ULONG cSent);
-
-
-void __stdcall AsyncIPipeByte_Begin_Push_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall AsyncIPipeByte_Finish_Push_Proxy( 
-    AsyncIPipeByte * This);
-
-
-void __stdcall AsyncIPipeByte_Finish_Push_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IPipeLong;
-
-
-    
-    struct __declspec(uuid("DB2F3ACC-2F86-11d1-8E04-00C04FB9989A")) __declspec(novtable)
-    IPipeLong : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Pull( 
-             LONG *buf,
-             ULONG cRequest,
-             ULONG *pcReturned) = 0;
-        
-        virtual HRESULT __stdcall Push( 
-             LONG *buf,
-             ULONG cSent) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPipeLong_Pull_Proxy( 
-    IPipeLong * This,
-     LONG *buf,
-     ULONG cRequest,
-     ULONG *pcReturned);
-
-
-void __stdcall IPipeLong_Pull_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPipeLong_Push_Proxy( 
-    IPipeLong * This,
-     LONG *buf,
-     ULONG cSent);
-
-
-void __stdcall IPipeLong_Push_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_AsyncIPipeLong;
-
-
-    
-    struct __declspec(uuid("DB2F3ACD-2F86-11d1-8E04-00C04FB9989A")) __declspec(novtable)
-    AsyncIPipeLong : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Begin_Pull( 
-             ULONG cRequest) = 0;
-        
-        virtual HRESULT __stdcall Finish_Pull( 
-             LONG *buf,
-             ULONG *pcReturned) = 0;
-        
-        virtual HRESULT __stdcall Begin_Push( 
-             LONG *buf,
-             ULONG cSent) = 0;
-        
-        virtual HRESULT __stdcall Finish_Push( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall AsyncIPipeLong_Begin_Pull_Proxy( 
-    AsyncIPipeLong * This,
-     ULONG cRequest);
-
-
-void __stdcall AsyncIPipeLong_Begin_Pull_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall AsyncIPipeLong_Finish_Pull_Proxy( 
-    AsyncIPipeLong * This,
-     LONG *buf,
-     ULONG *pcReturned);
-
-
-void __stdcall AsyncIPipeLong_Finish_Pull_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall AsyncIPipeLong_Begin_Push_Proxy( 
-    AsyncIPipeLong * This,
-     LONG *buf,
-     ULONG cSent);
-
-
-void __stdcall AsyncIPipeLong_Begin_Push_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall AsyncIPipeLong_Finish_Push_Proxy( 
-    AsyncIPipeLong * This);
-
-
-void __stdcall AsyncIPipeLong_Finish_Push_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IPipeDouble;
-
-
-    
-    struct __declspec(uuid("DB2F3ACE-2F86-11d1-8E04-00C04FB9989A")) __declspec(novtable)
-    IPipeDouble : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Pull( 
-             DOUBLE *buf,
-             ULONG cRequest,
-             ULONG *pcReturned) = 0;
-        
-        virtual HRESULT __stdcall Push( 
-             DOUBLE *buf,
-             ULONG cSent) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPipeDouble_Pull_Proxy( 
-    IPipeDouble * This,
-     DOUBLE *buf,
-     ULONG cRequest,
-     ULONG *pcReturned);
-
-
-void __stdcall IPipeDouble_Pull_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPipeDouble_Push_Proxy( 
-    IPipeDouble * This,
-     DOUBLE *buf,
-     ULONG cSent);
-
-
-void __stdcall IPipeDouble_Push_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_AsyncIPipeDouble;
-
-
-    
-    struct __declspec(uuid("DB2F3ACF-2F86-11d1-8E04-00C04FB9989A")) __declspec(novtable)
-    AsyncIPipeDouble : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Begin_Pull( 
-             ULONG cRequest) = 0;
-        
-        virtual HRESULT __stdcall Finish_Pull( 
-             DOUBLE *buf,
-             ULONG *pcReturned) = 0;
-        
-        virtual HRESULT __stdcall Begin_Push( 
-             DOUBLE *buf,
-             ULONG cSent) = 0;
-        
-        virtual HRESULT __stdcall Finish_Push( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall AsyncIPipeDouble_Begin_Pull_Proxy( 
-    AsyncIPipeDouble * This,
-     ULONG cRequest);
-
-
-void __stdcall AsyncIPipeDouble_Begin_Pull_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall AsyncIPipeDouble_Finish_Pull_Proxy( 
-    AsyncIPipeDouble * This,
-     DOUBLE *buf,
-     ULONG *pcReturned);
-
-
-void __stdcall AsyncIPipeDouble_Finish_Pull_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall AsyncIPipeDouble_Begin_Push_Proxy( 
-    AsyncIPipeDouble * This,
-     DOUBLE *buf,
-     ULONG cSent);
-
-
-void __stdcall AsyncIPipeDouble_Begin_Push_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall AsyncIPipeDouble_Finish_Push_Proxy( 
-    AsyncIPipeDouble * This);
-
-
-void __stdcall AsyncIPipeDouble_Finish_Push_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IThumbnailExtractor;
-
-
-    
-    struct __declspec(uuid("969dc708-5c76-11d1-8d86-0000f804b057")) __declspec(novtable)
-    IThumbnailExtractor : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall ExtractThumbnail( 
-             IStorage *pStg,
-             ULONG ulLength,
-             ULONG ulHeight,
-             ULONG *pulOutputLength,
-             ULONG *pulOutputHeight,
-             HBITMAP *phOutputBitmap) = 0;
-        
-        virtual HRESULT __stdcall OnFileUpdated( 
-             IStorage *pStg) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IThumbnailExtractor_ExtractThumbnail_Proxy( 
-    IThumbnailExtractor * This,
-     IStorage *pStg,
-     ULONG ulLength,
-     ULONG ulHeight,
-     ULONG *pulOutputLength,
-     ULONG *pulOutputHeight,
-     HBITMAP *phOutputBitmap);
-
-
-void __stdcall IThumbnailExtractor_ExtractThumbnail_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IThumbnailExtractor_OnFileUpdated_Proxy( 
-    IThumbnailExtractor * This,
-     IStorage *pStg);
-
-
-void __stdcall IThumbnailExtractor_OnFileUpdated_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IDummyHICONIncluder;
-
-
-    
-    struct __declspec(uuid("947990de-cc28-11d2-a0f7-00805f858fb1")) __declspec(novtable)
-    IDummyHICONIncluder : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Dummy( 
-             HICON h1,
-             HDC h2) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IDummyHICONIncluder_Dummy_Proxy( 
-    IDummyHICONIncluder * This,
-     HICON h1,
-     HDC h2);
-
-
-void __stdcall IDummyHICONIncluder_Dummy_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef 
-enum tagApplicationType
-    {	ServerApplication	= 0,
-	LibraryApplication	= ServerApplication + 1
-    } 	ApplicationType;
-
-typedef 
-enum tagShutdownType
-    {	IdleShutdown	= 0,
-	ForcedShutdown	= IdleShutdown + 1
-    } 	ShutdownType;
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0087_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0087_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IProcessLock;
-
-
-    
-    struct __declspec(uuid("000001d5-0000-0000-C000-000000000046")) __declspec(novtable)
-    IProcessLock : public IUnknown
-    {
-    public:
-        virtual ULONG __stdcall AddRefOnProcess( void) = 0;
-        
-        virtual ULONG __stdcall ReleaseRefOnProcess( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-ULONG __stdcall IProcessLock_AddRefOnProcess_Proxy( 
-    IProcessLock * This);
-
-
-void __stdcall IProcessLock_AddRefOnProcess_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-ULONG __stdcall IProcessLock_ReleaseRefOnProcess_Proxy( 
-    IProcessLock * This);
-
-
-void __stdcall IProcessLock_ReleaseRefOnProcess_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_ISurrogateService;
-
-
-    
-    struct __declspec(uuid("000001d4-0000-0000-C000-000000000046")) __declspec(novtable)
-    ISurrogateService : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Init( 
-             const GUID & rguidProcessID,
-             IProcessLock *pProcessLock,
-             BOOL *pfApplicationAware) = 0;
-        
-        virtual HRESULT __stdcall ApplicationLaunch( 
-             const GUID & rguidApplID,
-             ApplicationType appType) = 0;
-        
-        virtual HRESULT __stdcall ApplicationFree( 
-             const GUID & rguidApplID) = 0;
-        
-        virtual HRESULT __stdcall CatalogRefresh( 
-             ULONG ulReserved) = 0;
-        
-        virtual HRESULT __stdcall ProcessShutdown( 
-             ShutdownType shutdownType) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ISurrogateService_Init_Proxy( 
-    ISurrogateService * This,
-     const GUID & rguidProcessID,
-     IProcessLock *pProcessLock,
-     BOOL *pfApplicationAware);
-
-
-void __stdcall ISurrogateService_Init_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ISurrogateService_ApplicationLaunch_Proxy( 
-    ISurrogateService * This,
-     const GUID & rguidApplID,
-     ApplicationType appType);
-
-
-void __stdcall ISurrogateService_ApplicationLaunch_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ISurrogateService_ApplicationFree_Proxy( 
-    ISurrogateService * This,
-     const GUID & rguidApplID);
-
-
-void __stdcall ISurrogateService_ApplicationFree_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ISurrogateService_CatalogRefresh_Proxy( 
-    ISurrogateService * This,
-     ULONG ulReserved);
-
-
-void __stdcall ISurrogateService_CatalogRefresh_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ISurrogateService_ProcessShutdown_Proxy( 
-    ISurrogateService * This,
-     ShutdownType shutdownType);
-
-
-void __stdcall ISurrogateService_ProcessShutdown_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-typedef 
-enum _APTTYPE
-    {	APTTYPE_CURRENT	= -1,
-	APTTYPE_STA	= 0,
-	APTTYPE_MTA	= 1,
-	APTTYPE_NA	= 2,
-	APTTYPE_MAINSTA	= 3
-    } 	APTTYPE;
-
-typedef 
-enum _THDTYPE
-    {	THDTYPE_BLOCKMESSAGES	= 0,
-	THDTYPE_PROCESSMESSAGES	= 1
-    } 	THDTYPE;
-
-typedef DWORD APARTMENTID;
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0089_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0089_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IComThreadingInfo;
-
-
-    
-    struct __declspec(uuid("000001ce-0000-0000-C000-000000000046")) __declspec(novtable)
-    IComThreadingInfo : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetCurrentApartmentType( 
-             APTTYPE *pAptType) = 0;
-        
-        virtual HRESULT __stdcall GetCurrentThreadType( 
-             THDTYPE *pThreadType) = 0;
-        
-        virtual HRESULT __stdcall GetCurrentLogicalThreadId( 
-             GUID *pguidLogicalThreadId) = 0;
-        
-        virtual HRESULT __stdcall SetCurrentLogicalThreadId( 
-             const GUID & rguid) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IComThreadingInfo_GetCurrentApartmentType_Proxy( 
-    IComThreadingInfo * This,
-     APTTYPE *pAptType);
-
-
-void __stdcall IComThreadingInfo_GetCurrentApartmentType_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IComThreadingInfo_GetCurrentThreadType_Proxy( 
-    IComThreadingInfo * This,
-     THDTYPE *pThreadType);
-
-
-void __stdcall IComThreadingInfo_GetCurrentThreadType_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IComThreadingInfo_GetCurrentLogicalThreadId_Proxy( 
-    IComThreadingInfo * This,
-     GUID *pguidLogicalThreadId);
-
-
-void __stdcall IComThreadingInfo_GetCurrentLogicalThreadId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IComThreadingInfo_SetCurrentLogicalThreadId_Proxy( 
-    IComThreadingInfo * This,
-     const GUID & rguid);
-
-
-void __stdcall IComThreadingInfo_SetCurrentLogicalThreadId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IProcessInitControl;
-
-
-    
-    struct __declspec(uuid("72380d55-8d2b-43a3-8513-2b6ef31434e9")) __declspec(novtable)
-    IProcessInitControl : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall ResetInitializerTimeout( 
-             DWORD dwSecondsRemaining) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IProcessInitControl_ResetInitializerTimeout_Proxy( 
-    IProcessInitControl * This,
-     DWORD dwSecondsRemaining);
-
-
-void __stdcall IProcessInitControl_ResetInitializerTimeout_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0091_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0091_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IInitializeSpy *LPINITIALIZESPY;
-
-
-extern "C" const IID IID_IInitializeSpy;
-
-
-    
-    struct __declspec(uuid("00000034-0000-0000-C000-000000000046")) __declspec(novtable)
-    IInitializeSpy : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall PreInitialize( 
-             DWORD dwCoInit,
-             DWORD dwCurThreadAptRefs) = 0;
-        
-        virtual HRESULT __stdcall PostInitialize( 
-             HRESULT hrCoInit,
-             DWORD dwCoInit,
-             DWORD dwNewThreadAptRefs) = 0;
-        
-        virtual HRESULT __stdcall PreUninitialize( 
-             DWORD dwCurThreadAptRefs) = 0;
-        
-        virtual HRESULT __stdcall PostUninitialize( 
-             DWORD dwNewThreadAptRefs) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInitializeSpy_PreInitialize_Proxy( 
-    IInitializeSpy * This,
-     DWORD dwCoInit,
-     DWORD dwCurThreadAptRefs);
-
-
-void __stdcall IInitializeSpy_PreInitialize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInitializeSpy_PostInitialize_Proxy( 
-    IInitializeSpy * This,
-     HRESULT hrCoInit,
-     DWORD dwCoInit,
-     DWORD dwNewThreadAptRefs);
-
-
-void __stdcall IInitializeSpy_PostInitialize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInitializeSpy_PreUninitialize_Proxy( 
-    IInitializeSpy * This,
-     DWORD dwCurThreadAptRefs);
-
-
-void __stdcall IInitializeSpy_PreUninitialize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInitializeSpy_PostUninitialize_Proxy( 
-    IInitializeSpy * This,
-     DWORD dwNewThreadAptRefs);
-
-
-void __stdcall IInitializeSpy_PostUninitialize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-#pragma warning(pop)
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0092_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_objidl_0092_v0_0_s_ifspec;
-
-
-
-unsigned long             __stdcall  ASYNC_STGMEDIUM_UserSize(     unsigned long *, unsigned long            , ASYNC_STGMEDIUM * ); 
-unsigned char * __stdcall  ASYNC_STGMEDIUM_UserMarshal(  unsigned long *, unsigned char *, ASYNC_STGMEDIUM * ); 
-unsigned char * __stdcall  ASYNC_STGMEDIUM_UserUnmarshal(unsigned long *, unsigned char *, ASYNC_STGMEDIUM * ); 
-void                      __stdcall  ASYNC_STGMEDIUM_UserFree(     unsigned long *, ASYNC_STGMEDIUM * ); 
-
-unsigned long             __stdcall  CLIPFORMAT_UserSize(     unsigned long *, unsigned long            , CLIPFORMAT * ); 
-unsigned char * __stdcall  CLIPFORMAT_UserMarshal(  unsigned long *, unsigned char *, CLIPFORMAT * ); 
-unsigned char * __stdcall  CLIPFORMAT_UserUnmarshal(unsigned long *, unsigned char *, CLIPFORMAT * ); 
-void                      __stdcall  CLIPFORMAT_UserFree(     unsigned long *, CLIPFORMAT * ); 
-
-unsigned long             __stdcall  FLAG_STGMEDIUM_UserSize(     unsigned long *, unsigned long            , FLAG_STGMEDIUM * ); 
-unsigned char * __stdcall  FLAG_STGMEDIUM_UserMarshal(  unsigned long *, unsigned char *, FLAG_STGMEDIUM * ); 
-unsigned char * __stdcall  FLAG_STGMEDIUM_UserUnmarshal(unsigned long *, unsigned char *, FLAG_STGMEDIUM * ); 
-void                      __stdcall  FLAG_STGMEDIUM_UserFree(     unsigned long *, FLAG_STGMEDIUM * ); 
-
-unsigned long             __stdcall  HBITMAP_UserSize(     unsigned long *, unsigned long            , HBITMAP * ); 
-unsigned char * __stdcall  HBITMAP_UserMarshal(  unsigned long *, unsigned char *, HBITMAP * ); 
-unsigned char * __stdcall  HBITMAP_UserUnmarshal(unsigned long *, unsigned char *, HBITMAP * ); 
-void                      __stdcall  HBITMAP_UserFree(     unsigned long *, HBITMAP * ); 
-
-unsigned long             __stdcall  HDC_UserSize(     unsigned long *, unsigned long            , HDC * ); 
-unsigned char * __stdcall  HDC_UserMarshal(  unsigned long *, unsigned char *, HDC * ); 
-unsigned char * __stdcall  HDC_UserUnmarshal(unsigned long *, unsigned char *, HDC * ); 
-void                      __stdcall  HDC_UserFree(     unsigned long *, HDC * ); 
-
-unsigned long             __stdcall  HICON_UserSize(     unsigned long *, unsigned long            , HICON * ); 
-unsigned char * __stdcall  HICON_UserMarshal(  unsigned long *, unsigned char *, HICON * ); 
-unsigned char * __stdcall  HICON_UserUnmarshal(unsigned long *, unsigned char *, HICON * ); 
-void                      __stdcall  HICON_UserFree(     unsigned long *, HICON * ); 
-
-unsigned long             __stdcall  SNB_UserSize(     unsigned long *, unsigned long            , SNB * ); 
-unsigned char * __stdcall  SNB_UserMarshal(  unsigned long *, unsigned char *, SNB * ); 
-unsigned char * __stdcall  SNB_UserUnmarshal(unsigned long *, unsigned char *, SNB * ); 
-void                      __stdcall  SNB_UserFree(     unsigned long *, SNB * ); 
-
-unsigned long             __stdcall  STGMEDIUM_UserSize(     unsigned long *, unsigned long            , STGMEDIUM * ); 
-unsigned char * __stdcall  STGMEDIUM_UserMarshal(  unsigned long *, unsigned char *, STGMEDIUM * ); 
-unsigned char * __stdcall  STGMEDIUM_UserUnmarshal(unsigned long *, unsigned char *, STGMEDIUM * ); 
-void                      __stdcall  STGMEDIUM_UserFree(     unsigned long *, STGMEDIUM * ); 
-
- HRESULT __stdcall IEnumUnknown_Next_Proxy( 
-    IEnumUnknown * This,
-     ULONG celt,
-     IUnknown **rgelt,
-     ULONG *pceltFetched);
-
-
- HRESULT __stdcall IEnumUnknown_Next_Stub( 
-    IEnumUnknown * This,
-     ULONG celt,
-     IUnknown **rgelt,
-     ULONG *pceltFetched);
-
- HRESULT __stdcall IBindCtx_SetBindOptions_Proxy( 
-    IBindCtx * This,
-     BIND_OPTS *pbindopts);
-
-
- HRESULT __stdcall IBindCtx_SetBindOptions_Stub( 
-    IBindCtx * This,
-     BIND_OPTS2 *pbindopts);
-
- HRESULT __stdcall IBindCtx_GetBindOptions_Proxy( 
-    IBindCtx * This,
-     BIND_OPTS *pbindopts);
-
-
- HRESULT __stdcall IBindCtx_GetBindOptions_Stub( 
-    IBindCtx * This,
-     BIND_OPTS2 *pbindopts);
-
- HRESULT __stdcall IEnumMoniker_Next_Proxy( 
-    IEnumMoniker * This,
-     ULONG celt,
-     IMoniker **rgelt,
-     ULONG *pceltFetched);
-
-
- HRESULT __stdcall IEnumMoniker_Next_Stub( 
-    IEnumMoniker * This,
-     ULONG celt,
-     IMoniker **rgelt,
-     ULONG *pceltFetched);
-
- BOOL __stdcall IRunnableObject_IsRunning_Proxy( 
-    IRunnableObject * This);
-
-
- HRESULT __stdcall IRunnableObject_IsRunning_Stub( 
-    IRunnableObject * This);
-
- HRESULT __stdcall IMoniker_BindToObject_Proxy( 
-    IMoniker * This,
-     IBindCtx *pbc,
-     IMoniker *pmkToLeft,
-     const IID & riidResult,
-     void **ppvResult);
-
-
- HRESULT __stdcall IMoniker_BindToObject_Stub( 
-    IMoniker * This,
-     IBindCtx *pbc,
-     IMoniker *pmkToLeft,
-     const IID & riidResult,
-     IUnknown **ppvResult);
-
- HRESULT __stdcall IMoniker_BindToStorage_Proxy( 
-    IMoniker * This,
-     IBindCtx *pbc,
-     IMoniker *pmkToLeft,
-     const IID & riid,
-     void **ppvObj);
-
-
- HRESULT __stdcall IMoniker_BindToStorage_Stub( 
-    IMoniker * This,
-     IBindCtx *pbc,
-     IMoniker *pmkToLeft,
-     const IID & riid,
-     IUnknown **ppvObj);
-
- HRESULT __stdcall IEnumString_Next_Proxy( 
-    IEnumString * This,
-     ULONG celt,
-     LPOLESTR *rgelt,
-     ULONG *pceltFetched);
-
-
- HRESULT __stdcall IEnumString_Next_Stub( 
-    IEnumString * This,
-     ULONG celt,
-     LPOLESTR *rgelt,
-     ULONG *pceltFetched);
-
- HRESULT __stdcall ISequentialStream_Read_Proxy( 
-    ISequentialStream * This,
-     void *pv,
-     ULONG cb,
-     ULONG *pcbRead);
-
-
- HRESULT __stdcall ISequentialStream_Read_Stub( 
-    ISequentialStream * This,
-     byte *pv,
-     ULONG cb,
-     ULONG *pcbRead);
-
- HRESULT __stdcall ISequentialStream_Write_Proxy( 
-    ISequentialStream * This,
-     const void *pv,
-     ULONG cb,
-     ULONG *pcbWritten);
-
-
- HRESULT __stdcall ISequentialStream_Write_Stub( 
-    ISequentialStream * This,
-     const byte *pv,
-     ULONG cb,
-     ULONG *pcbWritten);
-
- HRESULT __stdcall IStream_Seek_Proxy( 
-    IStream * This,
-     LARGE_INTEGER dlibMove,
-     DWORD dwOrigin,
-     ULARGE_INTEGER *plibNewPosition);
-
-
- HRESULT __stdcall IStream_Seek_Stub( 
-    IStream * This,
-     LARGE_INTEGER dlibMove,
-     DWORD dwOrigin,
-     ULARGE_INTEGER *plibNewPosition);
-
- HRESULT __stdcall IStream_CopyTo_Proxy( 
-    IStream * This,
-     IStream *pstm,
-     ULARGE_INTEGER cb,
-     ULARGE_INTEGER *pcbRead,
-     ULARGE_INTEGER *pcbWritten);
-
-
- HRESULT __stdcall IStream_CopyTo_Stub( 
-    IStream * This,
-     IStream *pstm,
-     ULARGE_INTEGER cb,
-     ULARGE_INTEGER *pcbRead,
-     ULARGE_INTEGER *pcbWritten);
-
- HRESULT __stdcall IEnumSTATSTG_Next_Proxy( 
-    IEnumSTATSTG * This,
-     ULONG celt,
-     STATSTG *rgelt,
-     ULONG *pceltFetched);
-
-
- HRESULT __stdcall IEnumSTATSTG_Next_Stub( 
-    IEnumSTATSTG * This,
-     ULONG celt,
-     STATSTG *rgelt,
-     ULONG *pceltFetched);
-
- HRESULT __stdcall IStorage_OpenStream_Proxy( 
-    IStorage * This,
-     const OLECHAR *pwcsName,
-     void *reserved1,
-     DWORD grfMode,
-     DWORD reserved2,
-     IStream **ppstm);
-
-
- HRESULT __stdcall IStorage_OpenStream_Stub( 
-    IStorage * This,
-     const OLECHAR *pwcsName,
-     unsigned long cbReserved1,
-     byte *reserved1,
-     DWORD grfMode,
-     DWORD reserved2,
-     IStream **ppstm);
-
- HRESULT __stdcall IStorage_EnumElements_Proxy( 
-    IStorage * This,
-     DWORD reserved1,
-     void *reserved2,
-     DWORD reserved3,
-     IEnumSTATSTG **ppenum);
-
-
- HRESULT __stdcall IStorage_EnumElements_Stub( 
-    IStorage * This,
-     DWORD reserved1,
-     unsigned long cbReserved2,
-     byte *reserved2,
-     DWORD reserved3,
-     IEnumSTATSTG **ppenum);
-
- HRESULT __stdcall ILockBytes_ReadAt_Proxy( 
-    ILockBytes * This,
-     ULARGE_INTEGER ulOffset,
-     void *pv,
-     ULONG cb,
-     ULONG *pcbRead);
-
-
- HRESULT __stdcall ILockBytes_ReadAt_Stub( 
-    ILockBytes * This,
-     ULARGE_INTEGER ulOffset,
-     byte *pv,
-     ULONG cb,
-     ULONG *pcbRead);
-
- HRESULT __stdcall ILockBytes_WriteAt_Proxy( 
-    ILockBytes * This,
-     ULARGE_INTEGER ulOffset,
-     const void *pv,
-     ULONG cb,
-     ULONG *pcbWritten);
-
-
- HRESULT __stdcall ILockBytes_WriteAt_Stub( 
-    ILockBytes * This,
-     ULARGE_INTEGER ulOffset,
-     const byte *pv,
-     ULONG cb,
-     ULONG *pcbWritten);
-
- HRESULT __stdcall IEnumFORMATETC_Next_Proxy( 
-    IEnumFORMATETC * This,
-     ULONG celt,
-     FORMATETC *rgelt,
-     ULONG *pceltFetched);
-
-
- HRESULT __stdcall IEnumFORMATETC_Next_Stub( 
-    IEnumFORMATETC * This,
-     ULONG celt,
-     FORMATETC *rgelt,
-     ULONG *pceltFetched);
-
- HRESULT __stdcall IEnumSTATDATA_Next_Proxy( 
-    IEnumSTATDATA * This,
-     ULONG celt,
-     STATDATA *rgelt,
-     ULONG *pceltFetched);
-
-
- HRESULT __stdcall IEnumSTATDATA_Next_Stub( 
-    IEnumSTATDATA * This,
-     ULONG celt,
-     STATDATA *rgelt,
-     ULONG *pceltFetched);
-
- void __stdcall IAdviseSink_OnDataChange_Proxy( 
-    IAdviseSink * This,
-     FORMATETC *pFormatetc,
-     STGMEDIUM *pStgmed);
-
-
- HRESULT __stdcall IAdviseSink_OnDataChange_Stub( 
-    IAdviseSink * This,
-     FORMATETC *pFormatetc,
-     ASYNC_STGMEDIUM *pStgmed);
-
- void __stdcall IAdviseSink_OnViewChange_Proxy( 
-    IAdviseSink * This,
-     DWORD dwAspect,
-     LONG lindex);
-
-
- HRESULT __stdcall IAdviseSink_OnViewChange_Stub( 
-    IAdviseSink * This,
-     DWORD dwAspect,
-     LONG lindex);
-
- void __stdcall IAdviseSink_OnRename_Proxy( 
-    IAdviseSink * This,
-     IMoniker *pmk);
-
-
- HRESULT __stdcall IAdviseSink_OnRename_Stub( 
-    IAdviseSink * This,
-     IMoniker *pmk);
-
- void __stdcall IAdviseSink_OnSave_Proxy( 
-    IAdviseSink * This);
-
-
- HRESULT __stdcall IAdviseSink_OnSave_Stub( 
-    IAdviseSink * This);
-
- void __stdcall IAdviseSink_OnClose_Proxy( 
-    IAdviseSink * This);
-
-
- HRESULT __stdcall IAdviseSink_OnClose_Stub( 
-    IAdviseSink * This);
-
- void __stdcall IAdviseSink2_OnLinkSrcChange_Proxy( 
-    IAdviseSink2 * This,
-     IMoniker *pmk);
-
-
- HRESULT __stdcall IAdviseSink2_OnLinkSrcChange_Stub( 
-    IAdviseSink2 * This,
-     IMoniker *pmk);
-
- HRESULT __stdcall IDataObject_GetData_Proxy( 
-    IDataObject * This,
-     FORMATETC *pformatetcIn,
-     STGMEDIUM *pmedium);
-
-
- HRESULT __stdcall IDataObject_GetData_Stub( 
-    IDataObject * This,
-     FORMATETC *pformatetcIn,
-     STGMEDIUM *pRemoteMedium);
-
- HRESULT __stdcall IDataObject_GetDataHere_Proxy( 
-    IDataObject * This,
-     FORMATETC *pformatetc,
-     STGMEDIUM *pmedium);
-
-
- HRESULT __stdcall IDataObject_GetDataHere_Stub( 
-    IDataObject * This,
-     FORMATETC *pformatetc,
-     STGMEDIUM *pRemoteMedium);
-
- HRESULT __stdcall IDataObject_SetData_Proxy( 
-    IDataObject * This,
-     FORMATETC *pformatetc,
-     STGMEDIUM *pmedium,
-     BOOL fRelease);
-
-
- HRESULT __stdcall IDataObject_SetData_Stub( 
-    IDataObject * This,
-     FORMATETC *pformatetc,
-     FLAG_STGMEDIUM *pmedium,
-     BOOL fRelease);
-
- HRESULT __stdcall IFillLockBytes_FillAppend_Proxy( 
-    IFillLockBytes * This,
-     const void *pv,
-     ULONG cb,
-     ULONG *pcbWritten);
-
-
- HRESULT __stdcall IFillLockBytes_FillAppend_Stub( 
-    IFillLockBytes * This,
-     const byte *pv,
-     ULONG cb,
-     ULONG *pcbWritten);
-
- HRESULT __stdcall IFillLockBytes_FillAt_Proxy( 
-    IFillLockBytes * This,
-     ULARGE_INTEGER ulOffset,
-     const void *pv,
-     ULONG cb,
-     ULONG *pcbWritten);
-
-
- HRESULT __stdcall IFillLockBytes_FillAt_Stub( 
-    IFillLockBytes * This,
-     ULARGE_INTEGER ulOffset,
-     const byte *pv,
-     ULONG cb,
-     ULONG *pcbWritten);
-
- void __stdcall AsyncIAdviseSink_Begin_OnDataChange_Proxy( 
-    AsyncIAdviseSink * This,
-     FORMATETC *pFormatetc,
-     STGMEDIUM *pStgmed);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Begin_OnDataChange_Stub( 
-    AsyncIAdviseSink * This,
-     FORMATETC *pFormatetc,
-     ASYNC_STGMEDIUM *pStgmed);
-
- void __stdcall AsyncIAdviseSink_Finish_OnDataChange_Proxy( 
-    AsyncIAdviseSink * This);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Finish_OnDataChange_Stub( 
-    AsyncIAdviseSink * This);
-
- void __stdcall AsyncIAdviseSink_Begin_OnViewChange_Proxy( 
-    AsyncIAdviseSink * This,
-     DWORD dwAspect,
-     LONG lindex);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Begin_OnViewChange_Stub( 
-    AsyncIAdviseSink * This,
-     DWORD dwAspect,
-     LONG lindex);
-
- void __stdcall AsyncIAdviseSink_Finish_OnViewChange_Proxy( 
-    AsyncIAdviseSink * This);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Finish_OnViewChange_Stub( 
-    AsyncIAdviseSink * This);
-
- void __stdcall AsyncIAdviseSink_Begin_OnRename_Proxy( 
-    AsyncIAdviseSink * This,
-     IMoniker *pmk);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Begin_OnRename_Stub( 
-    AsyncIAdviseSink * This,
-     IMoniker *pmk);
-
- void __stdcall AsyncIAdviseSink_Finish_OnRename_Proxy( 
-    AsyncIAdviseSink * This);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Finish_OnRename_Stub( 
-    AsyncIAdviseSink * This);
-
- void __stdcall AsyncIAdviseSink_Begin_OnSave_Proxy( 
-    AsyncIAdviseSink * This);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Begin_OnSave_Stub( 
-    AsyncIAdviseSink * This);
-
- void __stdcall AsyncIAdviseSink_Finish_OnSave_Proxy( 
-    AsyncIAdviseSink * This);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Finish_OnSave_Stub( 
-    AsyncIAdviseSink * This);
-
- void __stdcall AsyncIAdviseSink_Begin_OnClose_Proxy( 
-    AsyncIAdviseSink * This);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Begin_OnClose_Stub( 
-    AsyncIAdviseSink * This);
-
- void __stdcall AsyncIAdviseSink_Finish_OnClose_Proxy( 
-    AsyncIAdviseSink * This);
-
-
- HRESULT __stdcall AsyncIAdviseSink_Finish_OnClose_Stub( 
-    AsyncIAdviseSink * This);
-
- void __stdcall AsyncIAdviseSink2_Begin_OnLinkSrcChange_Proxy( 
-    AsyncIAdviseSink2 * This,
-     IMoniker *pmk);
-
-
- HRESULT __stdcall AsyncIAdviseSink2_Begin_OnLinkSrcChange_Stub( 
-    AsyncIAdviseSink2 * This,
-     IMoniker *pmk);
-
- void __stdcall AsyncIAdviseSink2_Finish_OnLinkSrcChange_Proxy( 
-    AsyncIAdviseSink2 * This);
-
-
- HRESULT __stdcall AsyncIAdviseSink2_Finish_OnLinkSrcChange_Stub( 
-    AsyncIAdviseSink2 * This);
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-extern "C" {
-
-
-extern const IID GUID_NULL;
-extern const IID CATID_MARSHALER;
-extern const IID IID_IRpcChannel;
-extern const IID IID_IRpcStub;
-extern const IID IID_IStubManager;
-extern const IID IID_IRpcProxy;
-extern const IID IID_IProxyManager;
-extern const IID IID_IPSFactory;
-extern const IID IID_IInternalMoniker;
-extern const IID IID_IDfReserved1;
-extern const IID IID_IDfReserved2;
-extern const IID IID_IDfReserved3;
-extern const CLSID CLSID_StdMarshal;
-extern const CLSID CLSID_AggStdMarshal;
-extern const CLSID CLSID_StdAsyncActManager;
-extern const IID IID_IStub;
-extern const IID IID_IProxy;
-extern const IID IID_IEnumGeneric;
-extern const IID IID_IEnumHolder;
-extern const IID IID_IEnumCallback;
-extern const IID IID_IOleManager;
-extern const IID IID_IOlePresObj;
-extern const IID IID_IDebug;
-extern const IID IID_IDebugStream;
-extern const CLSID CLSID_PSGenObject;
-extern const CLSID CLSID_PSClientSite;
-extern const CLSID CLSID_PSClassObject;
-extern const CLSID CLSID_PSInPlaceActive;
-extern const CLSID CLSID_PSInPlaceFrame;
-extern const CLSID CLSID_PSDragDrop;
-extern const CLSID CLSID_PSBindCtx;
-extern const CLSID CLSID_PSEnumerators;
-extern const CLSID CLSID_StaticMetafile;
-extern const CLSID CLSID_StaticDib;
-extern const CLSID CID_CDfsVolume;
-extern const CLSID CLSID_DCOMAccessControl;
-extern const CLSID CLSID_StdGlobalInterfaceTable;
-extern const CLSID CLSID_ComBinding;
-extern const CLSID CLSID_StdEvent;
-extern const CLSID CLSID_ManualResetEvent;
-extern const CLSID CLSID_SynchronizeContainer;
-extern const CLSID CLSID_AddrControl;
-
-
-
-
-
-
-
-
-
-
-extern const CLSID CLSID_CCDFormKrnl;
-extern const CLSID CLSID_CCDPropertyPage;
-extern const CLSID CLSID_CCDFormDialog;
-
-
-
-
-extern const CLSID CLSID_CCDCommandButton;
-extern const CLSID CLSID_CCDComboBox;
-extern const CLSID CLSID_CCDTextBox;
-extern const CLSID CLSID_CCDCheckBox;
-extern const CLSID CLSID_CCDLabel;
-extern const CLSID CLSID_CCDOptionButton;
-extern const CLSID CLSID_CCDListBox;
-extern const CLSID CLSID_CCDScrollBar;
-extern const CLSID CLSID_CCDGroupBox;
-
-
-
-
-extern const CLSID CLSID_CCDGeneralPropertyPage;
-extern const CLSID CLSID_CCDGenericPropertyPage;
-extern const CLSID CLSID_CCDFontPropertyPage;
-extern const CLSID CLSID_CCDColorPropertyPage;
-extern const CLSID CLSID_CCDLabelPropertyPage;
-extern const CLSID CLSID_CCDCheckBoxPropertyPage;
-extern const CLSID CLSID_CCDTextBoxPropertyPage;
-extern const CLSID CLSID_CCDOptionButtonPropertyPage;
-extern const CLSID CLSID_CCDListBoxPropertyPage;
-extern const CLSID CLSID_CCDCommandButtonPropertyPage;
-extern const CLSID CLSID_CCDComboBoxPropertyPage;
-extern const CLSID CLSID_CCDScrollBarPropertyPage;
-extern const CLSID CLSID_CCDGroupBoxPropertyPage;
-extern const CLSID CLSID_CCDXObjectPropertyPage;
-
-extern const CLSID CLSID_CStdPropertyFrame;
-
-extern const CLSID CLSID_CFormPropertyPage;
-extern const CLSID CLSID_CGridPropertyPage;
-
-extern const CLSID CLSID_CWSJArticlePage;
-extern const CLSID CLSID_CSystemPage;
-
-extern const CLSID CLSID_IdentityUnmarshal;
-extern const CLSID CLSID_InProcFreeMarshaler;
-
-extern const CLSID CLSID_Picture_Metafile;
-extern const CLSID CLSID_Picture_EnhMetafile;
-extern const CLSID CLSID_Picture_Dib;
-
-
-
-
-extern const GUID GUID_TRISTATE;
-
-
-}
-
-
-
-
-
-
-
-
-typedef enum tagCOINIT
-{
-  COINIT_APARTMENTTHREADED  = 0x2,      
-
-
-  
-  COINIT_MULTITHREADED      = 0x0,      
-  COINIT_DISABLE_OLE1DDE    = 0x4,      
-  COINIT_SPEED_OVER_MEMORY  = 0x8,      
-
-} COINIT;
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) DWORD __stdcall CoBuildVersion( void );
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoInitialize( LPVOID pvReserved);
-extern "C" __declspec(dllimport) void __stdcall  CoUninitialize(void);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoGetMalloc( DWORD dwMemContext,  LPMALLOC * ppMalloc);
-extern "C" __declspec(dllimport) DWORD __stdcall CoGetCurrentProcess(void);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoRegisterMallocSpy( LPMALLOCSPY pMallocSpy);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoRevokeMallocSpy(void);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoCreateStandardMalloc( DWORD memctx,  IMalloc * * ppMalloc);
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoInitializeEx( LPVOID pvReserved,  DWORD dwCoInit);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoGetCallerTID( LPDWORD lpdwTID );
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoRegisterInitializeSpy( LPINITIALIZESPY pSpy,  ULARGE_INTEGER *puliCookie);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoRevokeInitializeSpy( ULARGE_INTEGER uliCookie);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoGetContextToken(ULONG_PTR* pToken);
-
-
-
-typedef enum tagCOMSD
-{
-    SD_LAUNCHPERMISSIONS = 0,   	
-    SD_ACCESSPERMISSIONS = 1,   	
-    SD_LAUNCHRESTRICTIONS = 2,   	
-    SD_ACCESSRESTRICTIONS = 3   	
-    
-} COMSD;
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoGetSystemSecurityPermissions(COMSD comSDType, PSECURITY_DESCRIPTOR *ppSD);
-
-
-
-
-
-
-
-
-
-
-typedef struct tagSOleTlsDataPublic
-{
-    void *pvReserved0[2];
-    DWORD dwReserved0[3];
-    void *pvReserved1[1];
-    DWORD dwReserved1[3];
-    void *pvReserved2[4];
-    DWORD dwReserved2[1];
-    void *pCurrentCtx;
-} SOleTlsDataPublic;
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall     CoGetObjectContext( const IID & riid,  LPVOID * ppv);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoGetClassObject( const IID & rclsid,  DWORD dwClsContext,  LPVOID pvReserved,
-                     const IID & riid,  LPVOID * ppv);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoRegisterClassObject( const IID & rclsid,  LPUNKNOWN pUnk,
-                     DWORD dwClsContext,  DWORD flags,  LPDWORD lpdwRegister);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoRevokeClassObject( DWORD dwRegister);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoResumeClassObjects(void);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoSuspendClassObjects(void);
-extern "C" __declspec(dllimport) ULONG __stdcall CoAddRefServerProcess(void);
-extern "C" __declspec(dllimport) ULONG __stdcall CoReleaseServerProcess(void);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoGetPSClsid( const IID & riid,  CLSID *pClsid);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoRegisterPSClsid( const IID & riid,  const IID & rclsid);
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoRegisterSurrogate( LPSURROGATE pSurrogate);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoGetMarshalSizeMax( ULONG *pulSize,  const IID & riid,  LPUNKNOWN pUnk,
-                     DWORD dwDestContext,  LPVOID pvDestContext,  DWORD mshlflags);
-extern "C" __declspec(dllimport) HRESULT __stdcall CoMarshalInterface( LPSTREAM pStm,  const IID & riid,  LPUNKNOWN pUnk,
-                     DWORD dwDestContext,  LPVOID pvDestContext,  DWORD mshlflags);
-extern "C" __declspec(dllimport) HRESULT __stdcall CoUnmarshalInterface( LPSTREAM pStm,  const IID & riid,  LPVOID * ppv);
-extern "C" __declspec(dllimport) HRESULT __stdcall CoMarshalHresult( LPSTREAM pstm,  HRESULT hresult);
-extern "C" __declspec(dllimport) HRESULT __stdcall CoUnmarshalHresult( LPSTREAM pstm,  HRESULT  * phresult);
-extern "C" __declspec(dllimport) HRESULT __stdcall CoReleaseMarshalData( LPSTREAM pStm);
-extern "C" __declspec(dllimport) HRESULT __stdcall CoDisconnectObject( LPUNKNOWN pUnk,  DWORD dwReserved);
-extern "C" __declspec(dllimport) HRESULT __stdcall CoLockObjectExternal( LPUNKNOWN pUnk,  BOOL fLock,  BOOL fLastUnlockReleases);
-extern "C" __declspec(dllimport) HRESULT __stdcall CoGetStandardMarshal( const IID & riid,  LPUNKNOWN pUnk,
-                     DWORD dwDestContext,  LPVOID pvDestContext,  DWORD mshlflags,
-                     LPMARSHAL * ppMarshal);
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoGetStdMarshalEx( LPUNKNOWN pUnkOuter,  DWORD smexflags,
-                             LPUNKNOWN * ppUnkInner);
-
-
-typedef enum tagSTDMSHLFLAGS
-{
-    SMEXF_SERVER     = 0x01,       
-    SMEXF_HANDLER    = 0x02        
-} STDMSHLFLAGS;
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall CoIsHandlerConnected( LPUNKNOWN pUnk);
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoMarshalInterThreadInterfaceInStream( const IID & riid,  LPUNKNOWN pUnk,
-                     LPSTREAM *ppStm);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoGetInterfaceAndReleaseStream( LPSTREAM pStm,  const IID & iid,
-                     LPVOID * ppv);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoCreateFreeThreadedMarshaler( LPUNKNOWN  punkOuter,
-                     LPUNKNOWN *ppunkMarshal);
-
-
-
-extern "C" __declspec(dllimport) HINSTANCE __stdcall CoLoadLibrary( LPOLESTR lpszLibName,  BOOL bAutoFree);
-extern "C" __declspec(dllimport) void __stdcall CoFreeLibrary( HINSTANCE hInst);
-extern "C" __declspec(dllimport) void __stdcall CoFreeAllLibraries(void);
-extern "C" __declspec(dllimport) void __stdcall CoFreeUnusedLibraries(void);
-
-
-
-extern "C" __declspec(dllimport) void __stdcall CoFreeUnusedLibrariesEx( DWORD dwUnloadDelay,  DWORD dwReserved);
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoInitializeSecurity(
-                     PSECURITY_DESCRIPTOR         pSecDesc,
-                     LONG                         cAuthSvc,
-                     SOLE_AUTHENTICATION_SERVICE *asAuthSvc,
-                     void                        *pReserved1,
-                     DWORD                        dwAuthnLevel,
-                     DWORD                        dwImpLevel,
-                     void                        *pAuthList,
-                     DWORD                        dwCapabilities,
-                     void                        *pReserved3 );
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoGetCallContext(  const IID & riid,  void **ppInterface );
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoQueryProxyBlanket(
-      IUnknown                  *pProxy,
-     DWORD                     *pwAuthnSvc,
-     DWORD                     *pAuthzSvc,
-     OLECHAR                  **pServerPrincName,
-     DWORD                     *pAuthnLevel,
-     DWORD                     *pImpLevel,
-     RPC_AUTH_IDENTITY_HANDLE  *pAuthInfo,
-     DWORD                     *pCapabilites );
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoSetProxyBlanket(
-     IUnknown                 *pProxy,
-     DWORD                     dwAuthnSvc,
-     DWORD                     dwAuthzSvc,
-     OLECHAR                  *pServerPrincName,
-     DWORD                     dwAuthnLevel,
-     DWORD                     dwImpLevel,
-     RPC_AUTH_IDENTITY_HANDLE  pAuthInfo,
-     DWORD                     dwCapabilities );
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoCopyProxy(
-      IUnknown    *pProxy,
-     IUnknown   **ppCopy );
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoQueryClientBlanket(
-     DWORD             *pAuthnSvc,
-     DWORD             *pAuthzSvc,
-     OLECHAR          **pServerPrincName,
-     DWORD             *pAuthnLevel,
-     DWORD             *pImpLevel,
-     RPC_AUTHZ_HANDLE  *pPrivs,
-     DWORD             *pCapabilities );
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoImpersonateClient();
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoRevertToSelf();
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoQueryAuthenticationServices(
-     DWORD *pcAuthSvc,
-     SOLE_AUTHENTICATION_SERVICE **asAuthSvc );
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoSwitchCallContext(  IUnknown *pNewObject,  IUnknown **ppOldObject );
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoCreateInstance( const IID & rclsid,  LPUNKNOWN pUnkOuter,
-                     DWORD dwClsContext,  const IID & riid,  LPVOID * ppv);
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoGetInstanceFromFile(
-     COSERVERINFO *              pServerInfo,
-     CLSID       *               pClsid,
-     IUnknown    *               punkOuter, 
-     DWORD                       dwClsCtx,
-     DWORD                       grfMode,
-     OLECHAR *                   pwszName,
-     DWORD                       dwCount,
-      MULTI_QI    *           pResults );
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoGetInstanceFromIStorage(
-     COSERVERINFO *              pServerInfo,
-     CLSID       *               pClsid,
-     IUnknown    *               punkOuter, 
-     DWORD                       dwClsCtx,
-     struct IStorage *           pstg,
-     DWORD                       dwCount,
-      MULTI_QI    *           pResults );
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoCreateInstanceEx(
-     const IID &                    Clsid,
-     IUnknown    *               punkOuter, 
-     DWORD                       dwClsCtx,
-     COSERVERINFO *              pServerInfo,
-     DWORD                       dwCount,
-      MULTI_QI    *           pResults );
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoGetCancelObject( DWORD dwThreadId,  const IID & iid,  void **ppUnk);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoSetCancelObject( IUnknown *pUnk);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoCancelCall( DWORD dwThreadId,  ULONG ulTimeout);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoTestCancel();
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoEnableCallCancellation( LPVOID pReserved);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoDisableCallCancellation( LPVOID pReserved);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoAllowSetForegroundWindow( IUnknown *pUnk,  LPVOID lpvReserved);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall DcomChannelSetHResult( LPVOID pvReserved,  ULONG* pulReserved,  HRESULT appsHR);
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall StringFromCLSID( const IID & rclsid,  LPOLESTR * lplpsz);
-extern "C" __declspec(dllimport) HRESULT __stdcall CLSIDFromString( LPOLESTR lpsz,  LPCLSID pclsid);
-extern "C" __declspec(dllimport) HRESULT __stdcall StringFromIID( const IID & rclsid,  LPOLESTR * lplpsz);
-extern "C" __declspec(dllimport) HRESULT __stdcall IIDFromString( LPOLESTR lpsz,  LPIID lpiid);
-extern "C" __declspec(dllimport) BOOL __stdcall CoIsOle1Class( const IID & rclsid);
-extern "C" __declspec(dllimport) HRESULT __stdcall ProgIDFromCLSID ( const IID & clsid,  LPOLESTR * lplpszProgID);
-extern "C" __declspec(dllimport) HRESULT __stdcall CLSIDFromProgID ( LPCOLESTR lpszProgID,  LPCLSID lpclsid);
-extern "C" __declspec(dllimport) HRESULT __stdcall CLSIDFromProgIDEx ( LPCOLESTR lpszProgID,  LPCLSID lpclsid);
-extern "C" __declspec(dllimport) int __stdcall StringFromGUID2( const GUID & rguid,  LPOLESTR lpsz,  int cchMax);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoCreateGuid( GUID  *pguid);
-
-extern "C" __declspec(dllimport) BOOL __stdcall CoFileTimeToDosDateTime(
-                  FILETIME * lpFileTime,  LPWORD lpDosDate,  LPWORD lpDosTime);
-extern "C" __declspec(dllimport) BOOL __stdcall CoDosDateTimeToFileTime(
-                        WORD nDosDate,  WORD nDosTime,  FILETIME * lpFileTime);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoFileTimeNow(  FILETIME * lpFileTime );
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoRegisterMessageFilter(  LPMESSAGEFILTER lpMessageFilter,
-                                 LPMESSAGEFILTER * lplpMessageFilter );
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoRegisterChannelHook(  const GUID & ExtensionUuid,  IChannelHook *pChannelHook );
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoWaitForMultipleHandles ( DWORD dwFlags,
-                                     DWORD dwTimeout,
-                                     ULONG cHandles,
-                                     LPHANDLE pHandles,
-                                     LPDWORD  lpdwindex);
-
-
-
-typedef enum tagCOWAIT_FLAGS
-{
-  COWAIT_WAITALL = 1,
-  COWAIT_ALERTABLE = 2,
-  COWAIT_INPUTAVAILABLE = 4
-}COWAIT_FLAGS;
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoInvalidateRemoteMachineBindings(LPOLESTR pszMachineName);
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CoGetTreatAsClass( const IID & clsidOld,  LPCLSID pClsidNew);
-extern "C" __declspec(dllimport) HRESULT __stdcall CoTreatAsClass( const IID & clsidOld,  const IID & clsidNew);
-
-
-
-
-
-
-
-
-
-
-typedef HRESULT (__stdcall * LPFNGETCLASSOBJECT) (const IID &, const IID &, LPVOID *);
-
-
-
-
-
-typedef HRESULT (__stdcall * LPFNCANUNLOADNOW)(void);
-
-
-extern "C" HRESULT __stdcall  DllGetClassObject( const IID & rclsid,  const IID & riid,  LPVOID * ppv);
-
-extern "C" HRESULT __stdcall  DllCanUnloadNow(void);
-
-
-
-extern "C" __declspec(dllimport) LPVOID __stdcall CoTaskMemAlloc( SIZE_T cb);
-extern "C" __declspec(dllimport) LPVOID __stdcall CoTaskMemRealloc( LPVOID pv,  SIZE_T cb);
-extern "C" __declspec(dllimport) void __stdcall   CoTaskMemFree( LPVOID pv);
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CreateDataAdviseHolder( LPDATAADVISEHOLDER * ppDAHolder);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CreateDataCache( LPUNKNOWN pUnkOuter,  const IID & rclsid,
-                                         const IID & iid,  LPVOID * ppv);
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall StgCreateDocfile( const OLECHAR * pwcsName,
-             DWORD grfMode,
-             DWORD reserved,
-             IStorage  *  *ppstgOpen);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall StgCreateDocfileOnILockBytes( ILockBytes  *plkbyt,
-                     DWORD grfMode,
-                     DWORD reserved,
-                     IStorage  *  *ppstgOpen);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall StgOpenStorage( const OLECHAR * pwcsName,
-                IStorage  *pstgPriority,
-                DWORD grfMode,
-                SNB snbExclude,
-                DWORD reserved,
-               IStorage  *  *ppstgOpen);
-extern "C" __declspec(dllimport) HRESULT __stdcall StgOpenStorageOnILockBytes( ILockBytes  *plkbyt,
-                    IStorage  *pstgPriority,
-                    DWORD grfMode,
-                    SNB snbExclude,
-                    DWORD reserved,
-                   IStorage  *  *ppstgOpen);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall StgIsStorageFile( const OLECHAR * pwcsName);
-extern "C" __declspec(dllimport) HRESULT __stdcall StgIsStorageILockBytes( ILockBytes * plkbyt);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall StgSetTimes( OLECHAR const * lpszName,
-                    FILETIME const * pctime,
-                    FILETIME const * patime,
-                    FILETIME const * pmtime);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall StgOpenAsyncDocfileOnIFillLockBytes(  IFillLockBytes *pflb,
-               DWORD grfMode,
-               DWORD asyncFlags,
-              IStorage **ppstgOpen);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall StgGetIFillLockBytesOnILockBytes(  ILockBytes *pilb,
-              IFillLockBytes **ppflb);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall StgGetIFillLockBytesOnFile( OLECHAR const *pwcsName,
-              IFillLockBytes **ppflb);
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall StgOpenLayoutDocfile( OLECHAR const *pwcsDfName,
-               DWORD grfMode,
-               DWORD reserved,
-              IStorage **ppstgOpen);
-
-
-
-
-
-
-
-
-
-
-typedef struct tagSTGOPTIONS
-{
-    USHORT usVersion;            
-    USHORT reserved;             
-    ULONG ulSectorSize;          
-
-    const WCHAR *pwcsTemplateFile;  
-
-} STGOPTIONS;
-
-extern "C" __declspec(dllimport) HRESULT __stdcall StgCreateStorageEx ( const WCHAR* pwcsName,
-              DWORD grfMode,
-              DWORD stgfmt,              
-              DWORD grfAttrs,             
-              STGOPTIONS * pStgOptions,
-              void * reserved,
-              const IID & riid,
-             void ** ppObjectOpen);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall StgOpenStorageEx ( const WCHAR* pwcsName,
-              DWORD grfMode,
-              DWORD stgfmt,              
-              DWORD grfAttrs,             
-              STGOPTIONS * pStgOptions,
-              void * reserved,
-              const IID & riid,
-             void ** ppObjectOpen);
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  BindMoniker( LPMONIKER pmk,  DWORD grfOpt,  const IID & iidResult,  LPVOID * ppvResult);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoInstall(
-      IBindCtx     * pbc,
-      DWORD          dwFlags,
-      uCLSSPEC     * pClassSpec,
-      QUERYCONTEXT * pQuery,
-      LPWSTR         pszCodeBase);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  CoGetObject( LPCWSTR pszName,  BIND_OPTS *pBindOptions,  const IID & riid,  void **ppv);
-extern "C" __declspec(dllimport) HRESULT __stdcall  MkParseDisplayName( LPBC pbc,  LPCOLESTR szUserName,
-                 ULONG  * pchEaten,  LPMONIKER  * ppmk);
-extern "C" __declspec(dllimport) HRESULT __stdcall  MonikerRelativePathTo( LPMONIKER pmkSrc,  LPMONIKER pmkDest,  LPMONIKER
-                * ppmkRelPath,  BOOL dwReserved);
-extern "C" __declspec(dllimport) HRESULT __stdcall  MonikerCommonPrefixWith( LPMONIKER pmkThis,  LPMONIKER pmkOther,
-                 LPMONIKER * ppmkCommon);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CreateBindCtx( DWORD reserved,  LPBC * ppbc);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CreateGenericComposite( LPMONIKER pmkFirst,  LPMONIKER pmkRest,
-     LPMONIKER * ppmkComposite);
-extern "C" __declspec(dllimport) HRESULT __stdcall  GetClassFile ( LPCOLESTR szFilename,  CLSID * pclsid);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  CreateClassMoniker( const IID & rclsid,  LPMONIKER * ppmk);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  CreateFileMoniker( LPCOLESTR lpszPathName,  LPMONIKER * ppmk);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  CreateItemMoniker( LPCOLESTR lpszDelim,  LPCOLESTR lpszItem,
-     LPMONIKER * ppmk);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CreateAntiMoniker( LPMONIKER * ppmk);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CreatePointerMoniker( LPUNKNOWN punk,  LPMONIKER * ppmk);
-extern "C" __declspec(dllimport) HRESULT __stdcall  CreateObjrefMoniker( LPUNKNOWN punk,  LPMONIKER  * ppmk);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  GetRunningObjectTable(  DWORD reserved,  LPRUNNINGOBJECTTABLE * pprot);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-#pragma warning( disable: 4049 )  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
- 
-
-
-
-typedef struct IPersistMoniker IPersistMoniker;
-
-
-
-
-
-typedef struct IMonikerProp IMonikerProp;
-
-
-
-
-
-typedef struct IBindProtocol IBindProtocol;
-
-
-
-
-
-typedef struct IBinding IBinding;
-
-
-
-
-
-typedef struct IBindStatusCallback IBindStatusCallback;
-
-
-
-
-
-typedef struct IAuthenticate IAuthenticate;
-
-
-
-
-
-typedef struct IHttpNegotiate IHttpNegotiate;
-
-
-
-
-
-typedef struct IHttpNegotiate2 IHttpNegotiate2;
-
-
-
-
-
-typedef struct IWinInetFileStream IWinInetFileStream;
-
-
-
-
-
-typedef struct IWindowForBindingUI IWindowForBindingUI;
-
-
-
-
-
-typedef struct ICodeInstall ICodeInstall;
-
-
-
-
-
-typedef struct IWinInetInfo IWinInetInfo;
-
-
-
-
-
-typedef struct IHttpSecurity IHttpSecurity;
-
-
-
-
-
-typedef struct IWinInetHttpInfo IWinInetHttpInfo;
-
-
-
-
-
-typedef struct IWinInetCacheHints IWinInetCacheHints;
-
-
-
-
-
-typedef struct IBindHost IBindHost;
-
-
-
-
-
-typedef struct IInternet IInternet;
-
-
-
-
-
-typedef struct IInternetBindInfo IInternetBindInfo;
-
-
-
-
-
-typedef struct IInternetProtocolRoot IInternetProtocolRoot;
-
-
-
-
-
-typedef struct IInternetProtocol IInternetProtocol;
-
-
-
-
-
-typedef struct IInternetProtocolSink IInternetProtocolSink;
-
-
-
-
-
-typedef struct IInternetProtocolSinkStackable IInternetProtocolSinkStackable;
-
-
-
-
-
-typedef struct IInternetSession IInternetSession;
-
-
-
-
-
-typedef struct IInternetThreadSwitch IInternetThreadSwitch;
-
-
-
-
-
-typedef struct IInternetPriority IInternetPriority;
-
-
-
-
-
-typedef struct IInternetProtocolInfo IInternetProtocolInfo;
-
-
-
-
-
-typedef struct IInternetSecurityMgrSite IInternetSecurityMgrSite;
-
-
-
-
-
-typedef struct IInternetSecurityManager IInternetSecurityManager;
-
-
-
-
-
-typedef struct IInternetSecurityManagerEx IInternetSecurityManagerEx;
-
-
-
-
-
-typedef struct IZoneIdentifier IZoneIdentifier;
-
-
-
-
-
-typedef struct IInternetHostSecurityManager IInternetHostSecurityManager;
-
-
-
-
-
-typedef struct IInternetZoneManager IInternetZoneManager;
-
-
-
-
-
-typedef struct IInternetZoneManagerEx IInternetZoneManagerEx;
-
-
-
-
-
-typedef struct ISoftDistExt ISoftDistExt;
-
-
-
-
-
-typedef struct ICatalogFileInfo ICatalogFileInfo;
-
-
-
-
-
-typedef struct IDataFilter IDataFilter;
-
-
-
-
-
-typedef struct IEncodingFilterFactory IEncodingFilterFactory;
-
-
-
-
-
-typedef struct IWrappedProtocol IWrappedProtocol;
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-#pragma warning( disable: 4049 )  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
- 
-
-
-
-typedef struct IOleAdviseHolder IOleAdviseHolder;
-
-
-
-
-
-typedef struct IOleCache IOleCache;
-
-
-
-
-
-typedef struct IOleCache2 IOleCache2;
-
-
-
-
-
-typedef struct IOleCacheControl IOleCacheControl;
-
-
-
-
-
-typedef struct IParseDisplayName IParseDisplayName;
-
-
-
-
-
-typedef struct IOleContainer IOleContainer;
-
-
-
-
-
-typedef struct IOleClientSite IOleClientSite;
-
-
-
-
-
-typedef struct IOleObject IOleObject;
-
-
-
-
-
-typedef struct IOleWindow IOleWindow;
-
-
-
-
-
-typedef struct IOleLink IOleLink;
-
-
-
-
-
-typedef struct IOleItemContainer IOleItemContainer;
-
-
-
-
-
-typedef struct IOleInPlaceUIWindow IOleInPlaceUIWindow;
-
-
-
-
-
-typedef struct IOleInPlaceActiveObject IOleInPlaceActiveObject;
-
-
-
-
-
-typedef struct IOleInPlaceFrame IOleInPlaceFrame;
-
-
-
-
-
-typedef struct IOleInPlaceObject IOleInPlaceObject;
-
-
-
-
-
-typedef struct IOleInPlaceSite IOleInPlaceSite;
-
-
-
-
-
-typedef struct IContinue IContinue;
-
-
-
-
-
-typedef struct IViewObject IViewObject;
-
-
-
-
-
-typedef struct IViewObject2 IViewObject2;
-
-
-
-
-
-typedef struct IDropSource IDropSource;
-
-
-
-
-
-typedef struct IDropTarget IDropTarget;
-
-
-
-
-
-typedef struct IEnumOLEVERB IEnumOLEVERB;
-
-
-
-
-
-
-
-extern "C"{
-
-
-void * __stdcall MIDL_user_allocate(size_t);
-void __stdcall MIDL_user_free( void * ); 
-
-
- 
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_oleidl_0000_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_oleidl_0000_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IOleAdviseHolder *LPOLEADVISEHOLDER;
-
-
-extern "C" const IID IID_IOleAdviseHolder;
-
-
-    
-    struct __declspec(uuid("00000111-0000-0000-C000-000000000046")) __declspec(novtable)
-    IOleAdviseHolder : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Advise( 
-             IAdviseSink *pAdvise,
-             DWORD *pdwConnection) = 0;
-        
-        virtual HRESULT __stdcall Unadvise( 
-             DWORD dwConnection) = 0;
-        
-        virtual HRESULT __stdcall EnumAdvise( 
-             IEnumSTATDATA **ppenumAdvise) = 0;
-        
-        virtual HRESULT __stdcall SendOnRename( 
-             IMoniker *pmk) = 0;
-        
-        virtual HRESULT __stdcall SendOnSave( void) = 0;
-        
-        virtual HRESULT __stdcall SendOnClose( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleAdviseHolder_Advise_Proxy( 
-    IOleAdviseHolder * This,
-     IAdviseSink *pAdvise,
-     DWORD *pdwConnection);
-
-
-void __stdcall IOleAdviseHolder_Advise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleAdviseHolder_Unadvise_Proxy( 
-    IOleAdviseHolder * This,
-     DWORD dwConnection);
-
-
-void __stdcall IOleAdviseHolder_Unadvise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleAdviseHolder_EnumAdvise_Proxy( 
-    IOleAdviseHolder * This,
-     IEnumSTATDATA **ppenumAdvise);
-
-
-void __stdcall IOleAdviseHolder_EnumAdvise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleAdviseHolder_SendOnRename_Proxy( 
-    IOleAdviseHolder * This,
-     IMoniker *pmk);
-
-
-void __stdcall IOleAdviseHolder_SendOnRename_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleAdviseHolder_SendOnSave_Proxy( 
-    IOleAdviseHolder * This);
-
-
-void __stdcall IOleAdviseHolder_SendOnSave_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleAdviseHolder_SendOnClose_Proxy( 
-    IOleAdviseHolder * This);
-
-
-void __stdcall IOleAdviseHolder_SendOnClose_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IOleCache *LPOLECACHE;
-
-
-extern "C" const IID IID_IOleCache;
-
-
-    
-    struct __declspec(uuid("0000011e-0000-0000-C000-000000000046")) __declspec(novtable)
-    IOleCache : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Cache( 
-             FORMATETC *pformatetc,
-             DWORD advf,
-             DWORD *pdwConnection) = 0;
-        
-        virtual HRESULT __stdcall Uncache( 
-             DWORD dwConnection) = 0;
-        
-        virtual HRESULT __stdcall EnumCache( 
-             IEnumSTATDATA **ppenumSTATDATA) = 0;
-        
-        virtual HRESULT __stdcall InitCache( 
-             IDataObject *pDataObject) = 0;
-        
-        virtual HRESULT __stdcall SetData( 
-             FORMATETC *pformatetc,
-             STGMEDIUM *pmedium,
-             BOOL fRelease) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleCache_Cache_Proxy( 
-    IOleCache * This,
-     FORMATETC *pformatetc,
-     DWORD advf,
-     DWORD *pdwConnection);
-
-
-void __stdcall IOleCache_Cache_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleCache_Uncache_Proxy( 
-    IOleCache * This,
-     DWORD dwConnection);
-
-
-void __stdcall IOleCache_Uncache_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleCache_EnumCache_Proxy( 
-    IOleCache * This,
-     IEnumSTATDATA **ppenumSTATDATA);
-
-
-void __stdcall IOleCache_EnumCache_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleCache_InitCache_Proxy( 
-    IOleCache * This,
-     IDataObject *pDataObject);
-
-
-void __stdcall IOleCache_InitCache_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleCache_SetData_Proxy( 
-    IOleCache * This,
-     FORMATETC *pformatetc,
-     STGMEDIUM *pmedium,
-     BOOL fRelease);
-
-
-void __stdcall IOleCache_SetData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IOleCache2 *LPOLECACHE2;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef  
-enum tagDISCARDCACHE
-    {	DISCARDCACHE_SAVEIFDIRTY	= 0,
-	DISCARDCACHE_NOSAVE	= 1
-    } 	DISCARDCACHE;
-
-
-extern "C" const IID IID_IOleCache2;
-
-
-    
-    struct __declspec(uuid("00000128-0000-0000-C000-000000000046")) __declspec(novtable)
-    IOleCache2 : public IOleCache
-    {
-    public:
-        virtual  HRESULT __stdcall UpdateCache( 
-             LPDATAOBJECT pDataObject,
-             DWORD grfUpdf,
-             LPVOID pReserved) = 0;
-        
-        virtual HRESULT __stdcall DiscardCache( 
-             DWORD dwDiscardOptions) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IOleCache2_RemoteUpdateCache_Proxy( 
-    IOleCache2 * This,
-     LPDATAOBJECT pDataObject,
-     DWORD grfUpdf,
-     LONG_PTR pReserved);
-
-
-void __stdcall IOleCache2_RemoteUpdateCache_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleCache2_DiscardCache_Proxy( 
-    IOleCache2 * This,
-     DWORD dwDiscardOptions);
-
-
-void __stdcall IOleCache2_DiscardCache_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IOleCacheControl *LPOLECACHECONTROL;
-
-
-extern "C" const IID IID_IOleCacheControl;
-
-
-    
-    struct __declspec(uuid("00000129-0000-0000-C000-000000000046")) __declspec(novtable)
-    IOleCacheControl : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall OnRun( 
-            LPDATAOBJECT pDataObject) = 0;
-        
-        virtual HRESULT __stdcall OnStop( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleCacheControl_OnRun_Proxy( 
-    IOleCacheControl * This,
-    LPDATAOBJECT pDataObject);
-
-
-void __stdcall IOleCacheControl_OnRun_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleCacheControl_OnStop_Proxy( 
-    IOleCacheControl * This);
-
-
-void __stdcall IOleCacheControl_OnStop_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IParseDisplayName *LPPARSEDISPLAYNAME;
-
-
-extern "C" const IID IID_IParseDisplayName;
-
-
-    
-    struct __declspec(uuid("0000011a-0000-0000-C000-000000000046")) __declspec(novtable)
-    IParseDisplayName : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall ParseDisplayName( 
-             IBindCtx *pbc,
-             LPOLESTR pszDisplayName,
-             ULONG *pchEaten,
-             IMoniker **ppmkOut) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IParseDisplayName_ParseDisplayName_Proxy( 
-    IParseDisplayName * This,
-     IBindCtx *pbc,
-     LPOLESTR pszDisplayName,
-     ULONG *pchEaten,
-     IMoniker **ppmkOut);
-
-
-void __stdcall IParseDisplayName_ParseDisplayName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IOleContainer *LPOLECONTAINER;
-
-
-extern "C" const IID IID_IOleContainer;
-
-
-    
-    struct __declspec(uuid("0000011b-0000-0000-C000-000000000046")) __declspec(novtable)
-    IOleContainer : public IParseDisplayName
-    {
-    public:
-        virtual HRESULT __stdcall EnumObjects( 
-             DWORD grfFlags,
-             IEnumUnknown **ppenum) = 0;
-        
-        virtual HRESULT __stdcall LockContainer( 
-             BOOL fLock) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleContainer_EnumObjects_Proxy( 
-    IOleContainer * This,
-     DWORD grfFlags,
-     IEnumUnknown **ppenum);
-
-
-void __stdcall IOleContainer_EnumObjects_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleContainer_LockContainer_Proxy( 
-    IOleContainer * This,
-     BOOL fLock);
-
-
-void __stdcall IOleContainer_LockContainer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IOleClientSite *LPOLECLIENTSITE;
-
-
-extern "C" const IID IID_IOleClientSite;
-
-
-    
-    struct __declspec(uuid("00000118-0000-0000-C000-000000000046")) __declspec(novtable)
-    IOleClientSite : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall SaveObject( void) = 0;
-        
-        virtual HRESULT __stdcall GetMoniker( 
-             DWORD dwAssign,
-             DWORD dwWhichMoniker,
-             IMoniker **ppmk) = 0;
-        
-        virtual HRESULT __stdcall GetContainer( 
-             IOleContainer **ppContainer) = 0;
-        
-        virtual HRESULT __stdcall ShowObject( void) = 0;
-        
-        virtual HRESULT __stdcall OnShowWindow( 
-             BOOL fShow) = 0;
-        
-        virtual HRESULT __stdcall RequestNewObjectLayout( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleClientSite_SaveObject_Proxy( 
-    IOleClientSite * This);
-
-
-void __stdcall IOleClientSite_SaveObject_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleClientSite_GetMoniker_Proxy( 
-    IOleClientSite * This,
-     DWORD dwAssign,
-     DWORD dwWhichMoniker,
-     IMoniker **ppmk);
-
-
-void __stdcall IOleClientSite_GetMoniker_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleClientSite_GetContainer_Proxy( 
-    IOleClientSite * This,
-     IOleContainer **ppContainer);
-
-
-void __stdcall IOleClientSite_GetContainer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleClientSite_ShowObject_Proxy( 
-    IOleClientSite * This);
-
-
-void __stdcall IOleClientSite_ShowObject_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleClientSite_OnShowWindow_Proxy( 
-    IOleClientSite * This,
-     BOOL fShow);
-
-
-void __stdcall IOleClientSite_OnShowWindow_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleClientSite_RequestNewObjectLayout_Proxy( 
-    IOleClientSite * This);
-
-
-void __stdcall IOleClientSite_RequestNewObjectLayout_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IOleObject *LPOLEOBJECT;
-
-typedef 
-enum tagOLEGETMONIKER
-    {	OLEGETMONIKER_ONLYIFTHERE	= 1,
-	OLEGETMONIKER_FORCEASSIGN	= 2,
-	OLEGETMONIKER_UNASSIGN	= 3,
-	OLEGETMONIKER_TEMPFORUSER	= 4
-    } 	OLEGETMONIKER;
-
-typedef 
-enum tagOLEWHICHMK
-    {	OLEWHICHMK_CONTAINER	= 1,
-	OLEWHICHMK_OBJREL	= 2,
-	OLEWHICHMK_OBJFULL	= 3
-    } 	OLEWHICHMK;
-
-typedef 
-enum tagUSERCLASSTYPE
-    {	USERCLASSTYPE_FULL	= 1,
-	USERCLASSTYPE_SHORT	= 2,
-	USERCLASSTYPE_APPNAME	= 3
-    } 	USERCLASSTYPE;
-
-typedef 
-enum tagOLEMISC
-    {	OLEMISC_RECOMPOSEONRESIZE	= 0x1,
-	OLEMISC_ONLYICONIC	= 0x2,
-	OLEMISC_INSERTNOTREPLACE	= 0x4,
-	OLEMISC_STATIC	= 0x8,
-	OLEMISC_CANTLINKINSIDE	= 0x10,
-	OLEMISC_CANLINKBYOLE1	= 0x20,
-	OLEMISC_ISLINKOBJECT	= 0x40,
-	OLEMISC_INSIDEOUT	= 0x80,
-	OLEMISC_ACTIVATEWHENVISIBLE	= 0x100,
-	OLEMISC_RENDERINGISDEVICEINDEPENDENT	= 0x200,
-	OLEMISC_INVISIBLEATRUNTIME	= 0x400,
-	OLEMISC_ALWAYSRUN	= 0x800,
-	OLEMISC_ACTSLIKEBUTTON	= 0x1000,
-	OLEMISC_ACTSLIKELABEL	= 0x2000,
-	OLEMISC_NOUIACTIVATE	= 0x4000,
-	OLEMISC_ALIGNABLE	= 0x8000,
-	OLEMISC_SIMPLEFRAME	= 0x10000,
-	OLEMISC_SETCLIENTSITEFIRST	= 0x20000,
-	OLEMISC_IMEMODE	= 0x40000,
-	OLEMISC_IGNOREACTIVATEWHENVISIBLE	= 0x80000,
-	OLEMISC_WANTSTOMENUMERGE	= 0x100000,
-	OLEMISC_SUPPORTSMULTILEVELUNDO	= 0x200000
-    } 	OLEMISC;
-
-typedef 
-enum tagOLECLOSE
-    {	OLECLOSE_SAVEIFDIRTY	= 0,
-	OLECLOSE_NOSAVE	= 1,
-	OLECLOSE_PROMPTSAVE	= 2
-    } 	OLECLOSE;
-
-
-extern "C" const IID IID_IOleObject;
-
-
-    
-    struct __declspec(uuid("00000112-0000-0000-C000-000000000046")) __declspec(novtable)
-    IOleObject : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall SetClientSite( 
-             IOleClientSite *pClientSite) = 0;
-        
-        virtual HRESULT __stdcall GetClientSite( 
-             IOleClientSite **ppClientSite) = 0;
-        
-        virtual HRESULT __stdcall SetHostNames( 
-             LPCOLESTR szContainerApp,
-             LPCOLESTR szContainerObj) = 0;
-        
-        virtual HRESULT __stdcall Close( 
-             DWORD dwSaveOption) = 0;
-        
-        virtual HRESULT __stdcall SetMoniker( 
-             DWORD dwWhichMoniker,
-             IMoniker *pmk) = 0;
-        
-        virtual HRESULT __stdcall GetMoniker( 
-             DWORD dwAssign,
-             DWORD dwWhichMoniker,
-             IMoniker **ppmk) = 0;
-        
-        virtual HRESULT __stdcall InitFromData( 
-             IDataObject *pDataObject,
-             BOOL fCreation,
-             DWORD dwReserved) = 0;
-        
-        virtual HRESULT __stdcall GetClipboardData( 
-             DWORD dwReserved,
-             IDataObject **ppDataObject) = 0;
-        
-        virtual HRESULT __stdcall DoVerb( 
-             LONG iVerb,
-             LPMSG lpmsg,
-             IOleClientSite *pActiveSite,
-             LONG lindex,
-             HWND hwndParent,
-             LPCRECT lprcPosRect) = 0;
-        
-        virtual HRESULT __stdcall EnumVerbs( 
-             IEnumOLEVERB **ppEnumOleVerb) = 0;
-        
-        virtual HRESULT __stdcall Update( void) = 0;
-        
-        virtual HRESULT __stdcall IsUpToDate( void) = 0;
-        
-        virtual HRESULT __stdcall GetUserClassID( 
-             CLSID *pClsid) = 0;
-        
-        virtual HRESULT __stdcall GetUserType( 
-             DWORD dwFormOfType,
-             LPOLESTR *pszUserType) = 0;
-        
-        virtual HRESULT __stdcall SetExtent( 
-             DWORD dwDrawAspect,
-             SIZEL *psizel) = 0;
-        
-        virtual HRESULT __stdcall GetExtent( 
-             DWORD dwDrawAspect,
-             SIZEL *psizel) = 0;
-        
-        virtual HRESULT __stdcall Advise( 
-             IAdviseSink *pAdvSink,
-             DWORD *pdwConnection) = 0;
-        
-        virtual HRESULT __stdcall Unadvise( 
-             DWORD dwConnection) = 0;
-        
-        virtual HRESULT __stdcall EnumAdvise( 
-             IEnumSTATDATA **ppenumAdvise) = 0;
-        
-        virtual HRESULT __stdcall GetMiscStatus( 
-             DWORD dwAspect,
-             DWORD *pdwStatus) = 0;
-        
-        virtual HRESULT __stdcall SetColorScheme( 
-             LOGPALETTE *pLogpal) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleObject_SetClientSite_Proxy( 
-    IOleObject * This,
-     IOleClientSite *pClientSite);
-
-
-void __stdcall IOleObject_SetClientSite_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_GetClientSite_Proxy( 
-    IOleObject * This,
-     IOleClientSite **ppClientSite);
-
-
-void __stdcall IOleObject_GetClientSite_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_SetHostNames_Proxy( 
-    IOleObject * This,
-     LPCOLESTR szContainerApp,
-     LPCOLESTR szContainerObj);
-
-
-void __stdcall IOleObject_SetHostNames_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_Close_Proxy( 
-    IOleObject * This,
-     DWORD dwSaveOption);
-
-
-void __stdcall IOleObject_Close_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_SetMoniker_Proxy( 
-    IOleObject * This,
-     DWORD dwWhichMoniker,
-     IMoniker *pmk);
-
-
-void __stdcall IOleObject_SetMoniker_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_GetMoniker_Proxy( 
-    IOleObject * This,
-     DWORD dwAssign,
-     DWORD dwWhichMoniker,
-     IMoniker **ppmk);
-
-
-void __stdcall IOleObject_GetMoniker_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_InitFromData_Proxy( 
-    IOleObject * This,
-     IDataObject *pDataObject,
-     BOOL fCreation,
-     DWORD dwReserved);
-
-
-void __stdcall IOleObject_InitFromData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_GetClipboardData_Proxy( 
-    IOleObject * This,
-     DWORD dwReserved,
-     IDataObject **ppDataObject);
-
-
-void __stdcall IOleObject_GetClipboardData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_DoVerb_Proxy( 
-    IOleObject * This,
-     LONG iVerb,
-     LPMSG lpmsg,
-     IOleClientSite *pActiveSite,
-     LONG lindex,
-     HWND hwndParent,
-     LPCRECT lprcPosRect);
-
-
-void __stdcall IOleObject_DoVerb_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_EnumVerbs_Proxy( 
-    IOleObject * This,
-     IEnumOLEVERB **ppEnumOleVerb);
-
-
-void __stdcall IOleObject_EnumVerbs_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_Update_Proxy( 
-    IOleObject * This);
-
-
-void __stdcall IOleObject_Update_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_IsUpToDate_Proxy( 
-    IOleObject * This);
-
-
-void __stdcall IOleObject_IsUpToDate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_GetUserClassID_Proxy( 
-    IOleObject * This,
-     CLSID *pClsid);
-
-
-void __stdcall IOleObject_GetUserClassID_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_GetUserType_Proxy( 
-    IOleObject * This,
-     DWORD dwFormOfType,
-     LPOLESTR *pszUserType);
-
-
-void __stdcall IOleObject_GetUserType_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_SetExtent_Proxy( 
-    IOleObject * This,
-     DWORD dwDrawAspect,
-     SIZEL *psizel);
-
-
-void __stdcall IOleObject_SetExtent_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_GetExtent_Proxy( 
-    IOleObject * This,
-     DWORD dwDrawAspect,
-     SIZEL *psizel);
-
-
-void __stdcall IOleObject_GetExtent_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_Advise_Proxy( 
-    IOleObject * This,
-     IAdviseSink *pAdvSink,
-     DWORD *pdwConnection);
-
-
-void __stdcall IOleObject_Advise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_Unadvise_Proxy( 
-    IOleObject * This,
-     DWORD dwConnection);
-
-
-void __stdcall IOleObject_Unadvise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_EnumAdvise_Proxy( 
-    IOleObject * This,
-     IEnumSTATDATA **ppenumAdvise);
-
-
-void __stdcall IOleObject_EnumAdvise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_GetMiscStatus_Proxy( 
-    IOleObject * This,
-     DWORD dwAspect,
-     DWORD *pdwStatus);
-
-
-void __stdcall IOleObject_GetMiscStatus_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleObject_SetColorScheme_Proxy( 
-    IOleObject * This,
-     LOGPALETTE *pLogpal);
-
-
-void __stdcall IOleObject_SetColorScheme_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef 
-enum tagOLERENDER
-    {	OLERENDER_NONE	= 0,
-	OLERENDER_DRAW	= 1,
-	OLERENDER_FORMAT	= 2,
-	OLERENDER_ASIS	= 3
-    } 	OLERENDER;
-
-typedef OLERENDER *LPOLERENDER;
-
-typedef struct tagOBJECTDESCRIPTOR
-    {
-    ULONG cbSize;
-    CLSID clsid;
-    DWORD dwDrawAspect;
-    SIZEL sizel;
-    POINTL pointl;
-    DWORD dwStatus;
-    DWORD dwFullUserTypeName;
-    DWORD dwSrcOfCopy;
-    } 	OBJECTDESCRIPTOR;
-
-typedef struct tagOBJECTDESCRIPTOR *POBJECTDESCRIPTOR;
-
-typedef struct tagOBJECTDESCRIPTOR *LPOBJECTDESCRIPTOR;
-
-typedef struct tagOBJECTDESCRIPTOR LINKSRCDESCRIPTOR;
-
-typedef struct tagOBJECTDESCRIPTOR *PLINKSRCDESCRIPTOR;
-
-typedef struct tagOBJECTDESCRIPTOR *LPLINKSRCDESCRIPTOR;
-
-
-
-extern RPC_IF_HANDLE IOLETypes_v0_0_c_ifspec;
-extern RPC_IF_HANDLE IOLETypes_v0_0_s_ifspec;
-
-
-
-
-
-
- 
-
-typedef  IOleWindow *LPOLEWINDOW;
-
-
-extern "C" const IID IID_IOleWindow;
-
-
-    
-    struct __declspec(uuid("00000114-0000-0000-C000-000000000046")) __declspec(novtable)
-    IOleWindow : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall GetWindow( 
-             HWND *phwnd) = 0;
-        
-        virtual HRESULT __stdcall ContextSensitiveHelp( 
-             BOOL fEnterMode) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IOleWindow_GetWindow_Proxy( 
-    IOleWindow * This,
-     HWND *phwnd);
-
-
-void __stdcall IOleWindow_GetWindow_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleWindow_ContextSensitiveHelp_Proxy( 
-    IOleWindow * This,
-     BOOL fEnterMode);
-
-
-void __stdcall IOleWindow_ContextSensitiveHelp_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IOleLink *LPOLELINK;
-
-typedef 
-enum tagOLEUPDATE
-    {	OLEUPDATE_ALWAYS	= 1,
-	OLEUPDATE_ONCALL	= 3
-    } 	OLEUPDATE;
-
-typedef OLEUPDATE *LPOLEUPDATE;
-
-typedef OLEUPDATE *POLEUPDATE;
-
-typedef 
-enum tagOLELINKBIND
-    {	OLELINKBIND_EVENIFCLASSDIFF	= 1
-    } 	OLELINKBIND;
-
-
-extern "C" const IID IID_IOleLink;
-
-
-    
-    struct __declspec(uuid("0000011d-0000-0000-C000-000000000046")) __declspec(novtable)
-    IOleLink : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall SetUpdateOptions( 
-             DWORD dwUpdateOpt) = 0;
-        
-        virtual HRESULT __stdcall GetUpdateOptions( 
-             DWORD *pdwUpdateOpt) = 0;
-        
-        virtual HRESULT __stdcall SetSourceMoniker( 
-             IMoniker *pmk,
-             const IID & rclsid) = 0;
-        
-        virtual HRESULT __stdcall GetSourceMoniker( 
-             IMoniker **ppmk) = 0;
-        
-        virtual HRESULT __stdcall SetSourceDisplayName( 
-             LPCOLESTR pszStatusText) = 0;
-        
-        virtual HRESULT __stdcall GetSourceDisplayName( 
-             LPOLESTR *ppszDisplayName) = 0;
-        
-        virtual HRESULT __stdcall BindToSource( 
-             DWORD bindflags,
-             IBindCtx *pbc) = 0;
-        
-        virtual HRESULT __stdcall BindIfRunning( void) = 0;
-        
-        virtual HRESULT __stdcall GetBoundSource( 
-             IUnknown **ppunk) = 0;
-        
-        virtual HRESULT __stdcall UnbindSource( void) = 0;
-        
-        virtual HRESULT __stdcall Update( 
-             IBindCtx *pbc) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleLink_SetUpdateOptions_Proxy( 
-    IOleLink * This,
-     DWORD dwUpdateOpt);
-
-
-void __stdcall IOleLink_SetUpdateOptions_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleLink_GetUpdateOptions_Proxy( 
-    IOleLink * This,
-     DWORD *pdwUpdateOpt);
-
-
-void __stdcall IOleLink_GetUpdateOptions_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleLink_SetSourceMoniker_Proxy( 
-    IOleLink * This,
-     IMoniker *pmk,
-     const IID & rclsid);
-
-
-void __stdcall IOleLink_SetSourceMoniker_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleLink_GetSourceMoniker_Proxy( 
-    IOleLink * This,
-     IMoniker **ppmk);
-
-
-void __stdcall IOleLink_GetSourceMoniker_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleLink_SetSourceDisplayName_Proxy( 
-    IOleLink * This,
-     LPCOLESTR pszStatusText);
-
-
-void __stdcall IOleLink_SetSourceDisplayName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleLink_GetSourceDisplayName_Proxy( 
-    IOleLink * This,
-     LPOLESTR *ppszDisplayName);
-
-
-void __stdcall IOleLink_GetSourceDisplayName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleLink_BindToSource_Proxy( 
-    IOleLink * This,
-     DWORD bindflags,
-     IBindCtx *pbc);
-
-
-void __stdcall IOleLink_BindToSource_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleLink_BindIfRunning_Proxy( 
-    IOleLink * This);
-
-
-void __stdcall IOleLink_BindIfRunning_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleLink_GetBoundSource_Proxy( 
-    IOleLink * This,
-     IUnknown **ppunk);
-
-
-void __stdcall IOleLink_GetBoundSource_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleLink_UnbindSource_Proxy( 
-    IOleLink * This);
-
-
-void __stdcall IOleLink_UnbindSource_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleLink_Update_Proxy( 
-    IOleLink * This,
-     IBindCtx *pbc);
-
-
-void __stdcall IOleLink_Update_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IOleItemContainer *LPOLEITEMCONTAINER;
-
-typedef 
-enum tagBINDSPEED
-    {	BINDSPEED_INDEFINITE	= 1,
-	BINDSPEED_MODERATE	= 2,
-	BINDSPEED_IMMEDIATE	= 3
-    } 	BINDSPEED;
-
-typedef  
-enum tagOLECONTF
-    {	OLECONTF_EMBEDDINGS	= 1,
-	OLECONTF_LINKS	= 2,
-	OLECONTF_OTHERS	= 4,
-	OLECONTF_ONLYUSER	= 8,
-	OLECONTF_ONLYIFRUNNING	= 16
-    } 	OLECONTF;
-
-
-extern "C" const IID IID_IOleItemContainer;
-
-
-    
-    struct __declspec(uuid("0000011c-0000-0000-C000-000000000046")) __declspec(novtable)
-    IOleItemContainer : public IOleContainer
-    {
-    public:
-        virtual HRESULT __stdcall GetObjectW( 
-             LPOLESTR pszItem,
-             DWORD dwSpeedNeeded,
-             IBindCtx *pbc,
-             const IID & riid,
-             void **ppvObject) = 0;
-        
-        virtual HRESULT __stdcall GetObjectStorage( 
-             LPOLESTR pszItem,
-             IBindCtx *pbc,
-             const IID & riid,
-             void **ppvStorage) = 0;
-        
-        virtual HRESULT __stdcall IsRunning( 
-             LPOLESTR pszItem) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleItemContainer_GetObject_Proxy( 
-    IOleItemContainer * This,
-     LPOLESTR pszItem,
-     DWORD dwSpeedNeeded,
-     IBindCtx *pbc,
-     const IID & riid,
-     void **ppvObject);
-
-
-void __stdcall IOleItemContainer_GetObject_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleItemContainer_GetObjectStorage_Proxy( 
-    IOleItemContainer * This,
-     LPOLESTR pszItem,
-     IBindCtx *pbc,
-     const IID & riid,
-     void **ppvStorage);
-
-
-void __stdcall IOleItemContainer_GetObjectStorage_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleItemContainer_IsRunning_Proxy( 
-    IOleItemContainer * This,
-     LPOLESTR pszItem);
-
-
-void __stdcall IOleItemContainer_IsRunning_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IOleInPlaceUIWindow *LPOLEINPLACEUIWINDOW;
-
-typedef RECT BORDERWIDTHS;
-
-typedef LPRECT LPBORDERWIDTHS;
-
-typedef LPCRECT LPCBORDERWIDTHS;
-
-
-extern "C" const IID IID_IOleInPlaceUIWindow;
-
-
-    
-    struct __declspec(uuid("00000115-0000-0000-C000-000000000046")) __declspec(novtable)
-    IOleInPlaceUIWindow : public IOleWindow
-    {
-    public:
-        virtual  HRESULT __stdcall GetBorder( 
-             LPRECT lprectBorder) = 0;
-        
-        virtual  HRESULT __stdcall RequestBorderSpace( 
-             LPCBORDERWIDTHS pborderwidths) = 0;
-        
-        virtual  HRESULT __stdcall SetBorderSpace( 
-             LPCBORDERWIDTHS pborderwidths) = 0;
-        
-        virtual HRESULT __stdcall SetActiveObject( 
-             IOleInPlaceActiveObject *pActiveObject,
-             LPCOLESTR pszObjName) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IOleInPlaceUIWindow_GetBorder_Proxy( 
-    IOleInPlaceUIWindow * This,
-     LPRECT lprectBorder);
-
-
-void __stdcall IOleInPlaceUIWindow_GetBorder_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IOleInPlaceUIWindow_RequestBorderSpace_Proxy( 
-    IOleInPlaceUIWindow * This,
-     LPCBORDERWIDTHS pborderwidths);
-
-
-void __stdcall IOleInPlaceUIWindow_RequestBorderSpace_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IOleInPlaceUIWindow_SetBorderSpace_Proxy( 
-    IOleInPlaceUIWindow * This,
-     LPCBORDERWIDTHS pborderwidths);
-
-
-void __stdcall IOleInPlaceUIWindow_SetBorderSpace_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceUIWindow_SetActiveObject_Proxy( 
-    IOleInPlaceUIWindow * This,
-     IOleInPlaceActiveObject *pActiveObject,
-     LPCOLESTR pszObjName);
-
-
-void __stdcall IOleInPlaceUIWindow_SetActiveObject_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IOleInPlaceActiveObject *LPOLEINPLACEACTIVEOBJECT;
-
-
-extern "C" const IID IID_IOleInPlaceActiveObject;
-
-
-    
-    struct __declspec(uuid("00000117-0000-0000-C000-000000000046")) __declspec(novtable)
-    IOleInPlaceActiveObject : public IOleWindow
-    {
-    public:
-        virtual  HRESULT __stdcall TranslateAcceleratorW( 
-             LPMSG lpmsg) = 0;
-        
-        virtual  HRESULT __stdcall OnFrameWindowActivate( 
-             BOOL fActivate) = 0;
-        
-        virtual  HRESULT __stdcall OnDocWindowActivate( 
-             BOOL fActivate) = 0;
-        
-        virtual  HRESULT __stdcall ResizeBorder( 
-             LPCRECT prcBorder,
-             IOleInPlaceUIWindow *pUIWindow,
-             BOOL fFrameWindow) = 0;
-        
-        virtual HRESULT __stdcall EnableModeless( 
-             BOOL fEnable) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IOleInPlaceActiveObject_RemoteTranslateAccelerator_Proxy( 
-    IOleInPlaceActiveObject * This);
-
-
-void __stdcall IOleInPlaceActiveObject_RemoteTranslateAccelerator_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IOleInPlaceActiveObject_OnFrameWindowActivate_Proxy( 
-    IOleInPlaceActiveObject * This,
-     BOOL fActivate);
-
-
-void __stdcall IOleInPlaceActiveObject_OnFrameWindowActivate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IOleInPlaceActiveObject_OnDocWindowActivate_Proxy( 
-    IOleInPlaceActiveObject * This,
-     BOOL fActivate);
-
-
-void __stdcall IOleInPlaceActiveObject_OnDocWindowActivate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IOleInPlaceActiveObject_RemoteResizeBorder_Proxy( 
-    IOleInPlaceActiveObject * This,
-     LPCRECT prcBorder,
-     const IID & riid,
-     IOleInPlaceUIWindow *pUIWindow,
-     BOOL fFrameWindow);
-
-
-void __stdcall IOleInPlaceActiveObject_RemoteResizeBorder_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceActiveObject_EnableModeless_Proxy( 
-    IOleInPlaceActiveObject * This,
-     BOOL fEnable);
-
-
-void __stdcall IOleInPlaceActiveObject_EnableModeless_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IOleInPlaceFrame *LPOLEINPLACEFRAME;
-
-typedef struct tagOIFI
-    {
-    UINT cb;
-    BOOL fMDIApp;
-    HWND hwndFrame;
-    HACCEL haccel;
-    UINT cAccelEntries;
-    } 	OLEINPLACEFRAMEINFO;
-
-typedef struct tagOIFI *LPOLEINPLACEFRAMEINFO;
-
-typedef struct tagOleMenuGroupWidths
-    {
-    LONG width[ 6 ];
-    } 	OLEMENUGROUPWIDTHS;
-
-typedef struct tagOleMenuGroupWidths *LPOLEMENUGROUPWIDTHS;
-
-typedef HGLOBAL HOLEMENU;
-
-
-extern "C" const IID IID_IOleInPlaceFrame;
-
-
-    
-    struct __declspec(uuid("00000116-0000-0000-C000-000000000046")) __declspec(novtable)
-    IOleInPlaceFrame : public IOleInPlaceUIWindow
-    {
-    public:
-        virtual HRESULT __stdcall InsertMenus( 
-             HMENU hmenuShared,
-             LPOLEMENUGROUPWIDTHS lpMenuWidths) = 0;
-        
-        virtual  HRESULT __stdcall SetMenu( 
-             HMENU hmenuShared,
-             HOLEMENU holemenu,
-             HWND hwndActiveObject) = 0;
-        
-        virtual HRESULT __stdcall RemoveMenus( 
-             HMENU hmenuShared) = 0;
-        
-        virtual  HRESULT __stdcall SetStatusText( 
-             LPCOLESTR pszStatusText) = 0;
-        
-        virtual HRESULT __stdcall EnableModeless( 
-             BOOL fEnable) = 0;
-        
-        virtual HRESULT __stdcall TranslateAcceleratorW( 
-             LPMSG lpmsg,
-             WORD wID) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleInPlaceFrame_InsertMenus_Proxy( 
-    IOleInPlaceFrame * This,
-     HMENU hmenuShared,
-     LPOLEMENUGROUPWIDTHS lpMenuWidths);
-
-
-void __stdcall IOleInPlaceFrame_InsertMenus_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IOleInPlaceFrame_SetMenu_Proxy( 
-    IOleInPlaceFrame * This,
-     HMENU hmenuShared,
-     HOLEMENU holemenu,
-     HWND hwndActiveObject);
-
-
-void __stdcall IOleInPlaceFrame_SetMenu_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceFrame_RemoveMenus_Proxy( 
-    IOleInPlaceFrame * This,
-     HMENU hmenuShared);
-
-
-void __stdcall IOleInPlaceFrame_RemoveMenus_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IOleInPlaceFrame_SetStatusText_Proxy( 
-    IOleInPlaceFrame * This,
-     LPCOLESTR pszStatusText);
-
-
-void __stdcall IOleInPlaceFrame_SetStatusText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceFrame_EnableModeless_Proxy( 
-    IOleInPlaceFrame * This,
-     BOOL fEnable);
-
-
-void __stdcall IOleInPlaceFrame_EnableModeless_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceFrame_TranslateAccelerator_Proxy( 
-    IOleInPlaceFrame * This,
-     LPMSG lpmsg,
-     WORD wID);
-
-
-void __stdcall IOleInPlaceFrame_TranslateAccelerator_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IOleInPlaceObject *LPOLEINPLACEOBJECT;
-
-
-extern "C" const IID IID_IOleInPlaceObject;
-
-
-    
-    struct __declspec(uuid("00000113-0000-0000-C000-000000000046")) __declspec(novtable)
-    IOleInPlaceObject : public IOleWindow
-    {
-    public:
-        virtual HRESULT __stdcall InPlaceDeactivate( void) = 0;
-        
-        virtual HRESULT __stdcall UIDeactivate( void) = 0;
-        
-        virtual  HRESULT __stdcall SetObjectRects( 
-             LPCRECT lprcPosRect,
-             LPCRECT lprcClipRect) = 0;
-        
-        virtual HRESULT __stdcall ReactivateAndUndo( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleInPlaceObject_InPlaceDeactivate_Proxy( 
-    IOleInPlaceObject * This);
-
-
-void __stdcall IOleInPlaceObject_InPlaceDeactivate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceObject_UIDeactivate_Proxy( 
-    IOleInPlaceObject * This);
-
-
-void __stdcall IOleInPlaceObject_UIDeactivate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IOleInPlaceObject_SetObjectRects_Proxy( 
-    IOleInPlaceObject * This,
-     LPCRECT lprcPosRect,
-     LPCRECT lprcClipRect);
-
-
-void __stdcall IOleInPlaceObject_SetObjectRects_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceObject_ReactivateAndUndo_Proxy( 
-    IOleInPlaceObject * This);
-
-
-void __stdcall IOleInPlaceObject_ReactivateAndUndo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IOleInPlaceSite *LPOLEINPLACESITE;
-
-
-extern "C" const IID IID_IOleInPlaceSite;
-
-
-    
-    struct __declspec(uuid("00000119-0000-0000-C000-000000000046")) __declspec(novtable)
-    IOleInPlaceSite : public IOleWindow
-    {
-    public:
-        virtual HRESULT __stdcall CanInPlaceActivate( void) = 0;
-        
-        virtual HRESULT __stdcall OnInPlaceActivate( void) = 0;
-        
-        virtual HRESULT __stdcall OnUIActivate( void) = 0;
-        
-        virtual HRESULT __stdcall GetWindowContext( 
-             IOleInPlaceFrame **ppFrame,
-             IOleInPlaceUIWindow **ppDoc,
-             LPRECT lprcPosRect,
-             LPRECT lprcClipRect,
-             LPOLEINPLACEFRAMEINFO lpFrameInfo) = 0;
-        
-        virtual HRESULT __stdcall Scroll( 
-             SIZE scrollExtant) = 0;
-        
-        virtual HRESULT __stdcall OnUIDeactivate( 
-             BOOL fUndoable) = 0;
-        
-        virtual HRESULT __stdcall OnInPlaceDeactivate( void) = 0;
-        
-        virtual HRESULT __stdcall DiscardUndoState( void) = 0;
-        
-        virtual HRESULT __stdcall DeactivateAndUndo( void) = 0;
-        
-        virtual HRESULT __stdcall OnPosRectChange( 
-             LPCRECT lprcPosRect) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleInPlaceSite_CanInPlaceActivate_Proxy( 
-    IOleInPlaceSite * This);
-
-
-void __stdcall IOleInPlaceSite_CanInPlaceActivate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSite_OnInPlaceActivate_Proxy( 
-    IOleInPlaceSite * This);
-
-
-void __stdcall IOleInPlaceSite_OnInPlaceActivate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSite_OnUIActivate_Proxy( 
-    IOleInPlaceSite * This);
-
-
-void __stdcall IOleInPlaceSite_OnUIActivate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSite_GetWindowContext_Proxy( 
-    IOleInPlaceSite * This,
-     IOleInPlaceFrame **ppFrame,
-     IOleInPlaceUIWindow **ppDoc,
-     LPRECT lprcPosRect,
-     LPRECT lprcClipRect,
-     LPOLEINPLACEFRAMEINFO lpFrameInfo);
-
-
-void __stdcall IOleInPlaceSite_GetWindowContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSite_Scroll_Proxy( 
-    IOleInPlaceSite * This,
-     SIZE scrollExtant);
-
-
-void __stdcall IOleInPlaceSite_Scroll_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSite_OnUIDeactivate_Proxy( 
-    IOleInPlaceSite * This,
-     BOOL fUndoable);
-
-
-void __stdcall IOleInPlaceSite_OnUIDeactivate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSite_OnInPlaceDeactivate_Proxy( 
-    IOleInPlaceSite * This);
-
-
-void __stdcall IOleInPlaceSite_OnInPlaceDeactivate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSite_DiscardUndoState_Proxy( 
-    IOleInPlaceSite * This);
-
-
-void __stdcall IOleInPlaceSite_DiscardUndoState_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSite_DeactivateAndUndo_Proxy( 
-    IOleInPlaceSite * This);
-
-
-void __stdcall IOleInPlaceSite_DeactivateAndUndo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSite_OnPosRectChange_Proxy( 
-    IOleInPlaceSite * This,
-     LPCRECT lprcPosRect);
-
-
-void __stdcall IOleInPlaceSite_OnPosRectChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IContinue;
-
-
-    
-    struct __declspec(uuid("0000012a-0000-0000-C000-000000000046")) __declspec(novtable)
-    IContinue : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall FContinue( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IContinue_FContinue_Proxy( 
-    IContinue * This);
-
-
-void __stdcall IContinue_FContinue_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IViewObject *LPVIEWOBJECT;
-
-
-extern "C" const IID IID_IViewObject;
-
-
-    
-    struct __declspec(uuid("0000010d-0000-0000-C000-000000000046")) __declspec(novtable)
-    IViewObject : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Draw( 
-             DWORD dwDrawAspect,
-             LONG lindex,
-             void *pvAspect,
-             DVTARGETDEVICE *ptd,
-             HDC hdcTargetDev,
-             HDC hdcDraw,
-             LPCRECTL lprcBounds,
-             LPCRECTL lprcWBounds,
-             BOOL ( __stdcall *pfnContinue )( 
-                ULONG_PTR dwContinue),
-             ULONG_PTR dwContinue) = 0;
-        
-        virtual  HRESULT __stdcall GetColorSet( 
-             DWORD dwDrawAspect,
-             LONG lindex,
-             void *pvAspect,
-             DVTARGETDEVICE *ptd,
-             HDC hicTargetDev,
-             LOGPALETTE **ppColorSet) = 0;
-        
-        virtual  HRESULT __stdcall Freeze( 
-             DWORD dwDrawAspect,
-             LONG lindex,
-             void *pvAspect,
-             DWORD *pdwFreeze) = 0;
-        
-        virtual HRESULT __stdcall Unfreeze( 
-             DWORD dwFreeze) = 0;
-        
-        virtual HRESULT __stdcall SetAdvise( 
-             DWORD aspects,
-             DWORD advf,
-             IAdviseSink *pAdvSink) = 0;
-        
-        virtual  HRESULT __stdcall GetAdvise( 
-             DWORD *pAspects,
-             DWORD *pAdvf,
-             IAdviseSink **ppAdvSink) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IViewObject_RemoteDraw_Proxy( 
-    IViewObject * This,
-     DWORD dwDrawAspect,
-     LONG lindex,
-     ULONG_PTR pvAspect,
-     DVTARGETDEVICE *ptd,
-     ULONG_PTR hdcTargetDev,
-     ULONG_PTR hdcDraw,
-     LPCRECTL lprcBounds,
-     LPCRECTL lprcWBounds,
-     IContinue *pContinue);
-
-
-void __stdcall IViewObject_RemoteDraw_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IViewObject_RemoteGetColorSet_Proxy( 
-    IViewObject * This,
-     DWORD dwDrawAspect,
-     LONG lindex,
-     ULONG_PTR pvAspect,
-     DVTARGETDEVICE *ptd,
-     ULONG_PTR hicTargetDev,
-     LOGPALETTE **ppColorSet);
-
-
-void __stdcall IViewObject_RemoteGetColorSet_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IViewObject_RemoteFreeze_Proxy( 
-    IViewObject * This,
-     DWORD dwDrawAspect,
-     LONG lindex,
-     ULONG_PTR pvAspect,
-     DWORD *pdwFreeze);
-
-
-void __stdcall IViewObject_RemoteFreeze_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IViewObject_Unfreeze_Proxy( 
-    IViewObject * This,
-     DWORD dwFreeze);
-
-
-void __stdcall IViewObject_Unfreeze_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IViewObject_SetAdvise_Proxy( 
-    IViewObject * This,
-     DWORD aspects,
-     DWORD advf,
-     IAdviseSink *pAdvSink);
-
-
-void __stdcall IViewObject_SetAdvise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IViewObject_RemoteGetAdvise_Proxy( 
-    IViewObject * This,
-     DWORD *pAspects,
-     DWORD *pAdvf,
-     IAdviseSink **ppAdvSink);
-
-
-void __stdcall IViewObject_RemoteGetAdvise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IViewObject2 *LPVIEWOBJECT2;
-
-
-extern "C" const IID IID_IViewObject2;
-
-
-    
-    struct __declspec(uuid("00000127-0000-0000-C000-000000000046")) __declspec(novtable)
-    IViewObject2 : public IViewObject
-    {
-    public:
-        virtual HRESULT __stdcall GetExtent( 
-             DWORD dwDrawAspect,
-             LONG lindex,
-             DVTARGETDEVICE *ptd,
-             LPSIZEL lpsizel) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IViewObject2_GetExtent_Proxy( 
-    IViewObject2 * This,
-     DWORD dwDrawAspect,
-     LONG lindex,
-     DVTARGETDEVICE *ptd,
-     LPSIZEL lpsizel);
-
-
-void __stdcall IViewObject2_GetExtent_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IDropSource *LPDROPSOURCE;
-
-
-extern "C" const IID IID_IDropSource;
-
-
-    
-    struct __declspec(uuid("00000121-0000-0000-C000-000000000046")) __declspec(novtable)
-    IDropSource : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall QueryContinueDrag( 
-             BOOL fEscapePressed,
-             DWORD grfKeyState) = 0;
-        
-        virtual HRESULT __stdcall GiveFeedback( 
-             DWORD dwEffect) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IDropSource_QueryContinueDrag_Proxy( 
-    IDropSource * This,
-     BOOL fEscapePressed,
-     DWORD grfKeyState);
-
-
-void __stdcall IDropSource_QueryContinueDrag_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDropSource_GiveFeedback_Proxy( 
-    IDropSource * This,
-     DWORD dwEffect);
-
-
-void __stdcall IDropSource_GiveFeedback_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IDropTarget *LPDROPTARGET;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" const IID IID_IDropTarget;
-
-
-    
-    struct __declspec(uuid("00000122-0000-0000-C000-000000000046")) __declspec(novtable)
-    IDropTarget : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall DragEnter( 
-             IDataObject *pDataObj,
-             DWORD grfKeyState,
-             POINTL pt,
-             DWORD *pdwEffect) = 0;
-        
-        virtual HRESULT __stdcall DragOver( 
-             DWORD grfKeyState,
-             POINTL pt,
-             DWORD *pdwEffect) = 0;
-        
-        virtual HRESULT __stdcall DragLeave( void) = 0;
-        
-        virtual HRESULT __stdcall Drop( 
-             IDataObject *pDataObj,
-             DWORD grfKeyState,
-             POINTL pt,
-             DWORD *pdwEffect) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IDropTarget_DragEnter_Proxy( 
-    IDropTarget * This,
-     IDataObject *pDataObj,
-     DWORD grfKeyState,
-     POINTL pt,
-     DWORD *pdwEffect);
-
-
-void __stdcall IDropTarget_DragEnter_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDropTarget_DragOver_Proxy( 
-    IDropTarget * This,
-     DWORD grfKeyState,
-     POINTL pt,
-     DWORD *pdwEffect);
-
-
-void __stdcall IDropTarget_DragOver_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDropTarget_DragLeave_Proxy( 
-    IDropTarget * This);
-
-
-void __stdcall IDropTarget_DragLeave_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDropTarget_Drop_Proxy( 
-    IDropTarget * This,
-     IDataObject *pDataObj,
-     DWORD grfKeyState,
-     POINTL pt,
-     DWORD *pdwEffect);
-
-
-void __stdcall IDropTarget_Drop_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IEnumOLEVERB *LPENUMOLEVERB;
-
-typedef struct tagOLEVERB
-    {
-    LONG lVerb;
-    LPOLESTR lpszVerbName;
-    DWORD fuFlags;
-    DWORD grfAttribs;
-    } 	OLEVERB;
-
-typedef struct tagOLEVERB *LPOLEVERB;
-
-typedef  
-enum tagOLEVERBATTRIB
-    {	OLEVERBATTRIB_NEVERDIRTIES	= 1,
-	OLEVERBATTRIB_ONCONTAINERMENU	= 2
-    } 	OLEVERBATTRIB;
-
-
-extern "C" const IID IID_IEnumOLEVERB;
-
-
-    
-    struct __declspec(uuid("00000104-0000-0000-C000-000000000046")) __declspec(novtable)
-    IEnumOLEVERB : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Next( 
-             ULONG celt,
-             LPOLEVERB rgelt,
-             ULONG *pceltFetched) = 0;
-        
-        virtual HRESULT __stdcall Skip( 
-             ULONG celt) = 0;
-        
-        virtual HRESULT __stdcall Reset( void) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IEnumOLEVERB **ppenum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IEnumOLEVERB_RemoteNext_Proxy( 
-    IEnumOLEVERB * This,
-     ULONG celt,
-     LPOLEVERB rgelt,
-     ULONG *pceltFetched);
-
-
-void __stdcall IEnumOLEVERB_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumOLEVERB_Skip_Proxy( 
-    IEnumOLEVERB * This,
-     ULONG celt);
-
-
-void __stdcall IEnumOLEVERB_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumOLEVERB_Reset_Proxy( 
-    IEnumOLEVERB * This);
-
-
-void __stdcall IEnumOLEVERB_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumOLEVERB_Clone_Proxy( 
-    IEnumOLEVERB * This,
-     IEnumOLEVERB **ppenum);
-
-
-void __stdcall IEnumOLEVERB_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-unsigned long             __stdcall  CLIPFORMAT_UserSize(     unsigned long *, unsigned long            , CLIPFORMAT * ); 
-unsigned char * __stdcall  CLIPFORMAT_UserMarshal(  unsigned long *, unsigned char *, CLIPFORMAT * ); 
-unsigned char * __stdcall  CLIPFORMAT_UserUnmarshal(unsigned long *, unsigned char *, CLIPFORMAT * ); 
-void                      __stdcall  CLIPFORMAT_UserFree(     unsigned long *, CLIPFORMAT * ); 
-
-unsigned long             __stdcall  HACCEL_UserSize(     unsigned long *, unsigned long            , HACCEL * ); 
-unsigned char * __stdcall  HACCEL_UserMarshal(  unsigned long *, unsigned char *, HACCEL * ); 
-unsigned char * __stdcall  HACCEL_UserUnmarshal(unsigned long *, unsigned char *, HACCEL * ); 
-void                      __stdcall  HACCEL_UserFree(     unsigned long *, HACCEL * ); 
-
-unsigned long             __stdcall  HGLOBAL_UserSize(     unsigned long *, unsigned long            , HGLOBAL * ); 
-unsigned char * __stdcall  HGLOBAL_UserMarshal(  unsigned long *, unsigned char *, HGLOBAL * ); 
-unsigned char * __stdcall  HGLOBAL_UserUnmarshal(unsigned long *, unsigned char *, HGLOBAL * ); 
-void                      __stdcall  HGLOBAL_UserFree(     unsigned long *, HGLOBAL * ); 
-
-unsigned long             __stdcall  HMENU_UserSize(     unsigned long *, unsigned long            , HMENU * ); 
-unsigned char * __stdcall  HMENU_UserMarshal(  unsigned long *, unsigned char *, HMENU * ); 
-unsigned char * __stdcall  HMENU_UserUnmarshal(unsigned long *, unsigned char *, HMENU * ); 
-void                      __stdcall  HMENU_UserFree(     unsigned long *, HMENU * ); 
-
-unsigned long             __stdcall  HWND_UserSize(     unsigned long *, unsigned long            , HWND * ); 
-unsigned char * __stdcall  HWND_UserMarshal(  unsigned long *, unsigned char *, HWND * ); 
-unsigned char * __stdcall  HWND_UserUnmarshal(unsigned long *, unsigned char *, HWND * ); 
-void                      __stdcall  HWND_UserFree(     unsigned long *, HWND * ); 
-
-unsigned long             __stdcall  STGMEDIUM_UserSize(     unsigned long *, unsigned long            , STGMEDIUM * ); 
-unsigned char * __stdcall  STGMEDIUM_UserMarshal(  unsigned long *, unsigned char *, STGMEDIUM * ); 
-unsigned char * __stdcall  STGMEDIUM_UserUnmarshal(unsigned long *, unsigned char *, STGMEDIUM * ); 
-void                      __stdcall  STGMEDIUM_UserFree(     unsigned long *, STGMEDIUM * ); 
-
- HRESULT __stdcall IOleCache2_UpdateCache_Proxy( 
-    IOleCache2 * This,
-     LPDATAOBJECT pDataObject,
-     DWORD grfUpdf,
-     LPVOID pReserved);
-
-
- HRESULT __stdcall IOleCache2_UpdateCache_Stub( 
-    IOleCache2 * This,
-     LPDATAOBJECT pDataObject,
-     DWORD grfUpdf,
-     LONG_PTR pReserved);
-
- HRESULT __stdcall IOleInPlaceActiveObject_TranslateAccelerator_Proxy( 
-    IOleInPlaceActiveObject * This,
-     LPMSG lpmsg);
-
-
- HRESULT __stdcall IOleInPlaceActiveObject_TranslateAccelerator_Stub( 
-    IOleInPlaceActiveObject * This);
-
- HRESULT __stdcall IOleInPlaceActiveObject_ResizeBorder_Proxy( 
-    IOleInPlaceActiveObject * This,
-     LPCRECT prcBorder,
-     IOleInPlaceUIWindow *pUIWindow,
-     BOOL fFrameWindow);
-
-
- HRESULT __stdcall IOleInPlaceActiveObject_ResizeBorder_Stub( 
-    IOleInPlaceActiveObject * This,
-     LPCRECT prcBorder,
-     const IID & riid,
-     IOleInPlaceUIWindow *pUIWindow,
-     BOOL fFrameWindow);
-
- HRESULT __stdcall IViewObject_Draw_Proxy( 
-    IViewObject * This,
-     DWORD dwDrawAspect,
-     LONG lindex,
-     void *pvAspect,
-     DVTARGETDEVICE *ptd,
-     HDC hdcTargetDev,
-     HDC hdcDraw,
-     LPCRECTL lprcBounds,
-     LPCRECTL lprcWBounds,
-     BOOL ( __stdcall *pfnContinue )( 
-        ULONG_PTR dwContinue),
-     ULONG_PTR dwContinue);
-
-
- HRESULT __stdcall IViewObject_Draw_Stub( 
-    IViewObject * This,
-     DWORD dwDrawAspect,
-     LONG lindex,
-     ULONG_PTR pvAspect,
-     DVTARGETDEVICE *ptd,
-     ULONG_PTR hdcTargetDev,
-     ULONG_PTR hdcDraw,
-     LPCRECTL lprcBounds,
-     LPCRECTL lprcWBounds,
-     IContinue *pContinue);
-
- HRESULT __stdcall IViewObject_GetColorSet_Proxy( 
-    IViewObject * This,
-     DWORD dwDrawAspect,
-     LONG lindex,
-     void *pvAspect,
-     DVTARGETDEVICE *ptd,
-     HDC hicTargetDev,
-     LOGPALETTE **ppColorSet);
-
-
- HRESULT __stdcall IViewObject_GetColorSet_Stub( 
-    IViewObject * This,
-     DWORD dwDrawAspect,
-     LONG lindex,
-     ULONG_PTR pvAspect,
-     DVTARGETDEVICE *ptd,
-     ULONG_PTR hicTargetDev,
-     LOGPALETTE **ppColorSet);
-
- HRESULT __stdcall IViewObject_Freeze_Proxy( 
-    IViewObject * This,
-     DWORD dwDrawAspect,
-     LONG lindex,
-     void *pvAspect,
-     DWORD *pdwFreeze);
-
-
- HRESULT __stdcall IViewObject_Freeze_Stub( 
-    IViewObject * This,
-     DWORD dwDrawAspect,
-     LONG lindex,
-     ULONG_PTR pvAspect,
-     DWORD *pdwFreeze);
-
- HRESULT __stdcall IViewObject_GetAdvise_Proxy( 
-    IViewObject * This,
-     DWORD *pAspects,
-     DWORD *pAdvf,
-     IAdviseSink **ppAdvSink);
-
-
- HRESULT __stdcall IViewObject_GetAdvise_Stub( 
-    IViewObject * This,
-     DWORD *pAspects,
-     DWORD *pAdvf,
-     IAdviseSink **ppAdvSink);
-
- HRESULT __stdcall IEnumOLEVERB_Next_Proxy( 
-    IEnumOLEVERB * This,
-     ULONG celt,
-     LPOLEVERB rgelt,
-     ULONG *pceltFetched);
-
-
- HRESULT __stdcall IEnumOLEVERB_Next_Stub( 
-    IEnumOLEVERB * This,
-     ULONG celt,
-     LPOLEVERB rgelt,
-     ULONG *pceltFetched);
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-#pragma warning( disable: 4049 )  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
- 
-
-
-
-typedef struct IServiceProvider IServiceProvider;
-
-
-
-
-
-
-
-extern "C"{
-
-
-void * __stdcall MIDL_user_allocate(size_t);
-void __stdcall MIDL_user_free( void * ); 
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma comment(lib,"uuid.lib")
-
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_servprov_0000_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_servprov_0000_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IServiceProvider *LPSERVICEPROVIDER;
-
-
-    extern "C" const IID IID_IServiceProvider;
-    extern "C++"
-    {
-        struct __declspec(uuid("6d5140c1-7436-11ce-8034-00aa006009fa")) __declspec(novtable)
-        IServiceProvider : public IUnknown
-        {
-        public:
-            virtual  HRESULT __stdcall QueryService( 
-                 const GUID & guidService,
-                 const IID & riid,
-                 void  * *ppvObject) = 0;
-            
-            template <class Q>
-            HRESULT __stdcall QueryService(const GUID & guidService, Q** pp)
-            {
-                return QueryService(guidService, __uuidof(Q), (void **)pp);
-            }
-        };
-    }
-
-     HRESULT __stdcall IServiceProvider_RemoteQueryService_Proxy( 
-        IServiceProvider  * This,
-         const GUID & guidService,
-         const IID & riid,
-         IUnknown  * *ppvObject);
-
-    void __stdcall IServiceProvider_RemoteQueryService_Stub(
-        IRpcStubBuffer *This,
-        IRpcChannelBuffer *_pRpcChannelBuffer,
-        PRPC_MESSAGE _pRpcMessage,
-        DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_servprov_0093_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_servprov_0093_v0_0_s_ifspec;
-
-
-
- HRESULT __stdcall IServiceProvider_QueryService_Proxy( 
-    IServiceProvider * This,
-     const GUID & guidService,
-     const IID & riid,
-     void **ppvObject);
-
-
- HRESULT __stdcall IServiceProvider_QueryService_Stub( 
-    IServiceProvider * This,
-     const GUID & guidService,
-     const IID & riid,
-     IUnknown **ppvObject);
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-#pragma warning( disable: 4049 )  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
- 
-
-
-
-typedef struct IXMLDOMImplementation IXMLDOMImplementation;
-
-
-
-
-
-typedef struct IXMLDOMNode IXMLDOMNode;
-
-
-
-
-
-typedef struct IXMLDOMDocumentFragment IXMLDOMDocumentFragment;
-
-
-
-
-
-typedef struct IXMLDOMDocument IXMLDOMDocument;
-
-
-
-
-
-typedef struct IXMLDOMNodeList IXMLDOMNodeList;
-
-
-
-
-
-typedef struct IXMLDOMNamedNodeMap IXMLDOMNamedNodeMap;
-
-
-
-
-
-typedef struct IXMLDOMCharacterData IXMLDOMCharacterData;
-
-
-
-
-
-typedef struct IXMLDOMAttribute IXMLDOMAttribute;
-
-
-
-
-
-typedef struct IXMLDOMElement IXMLDOMElement;
-
-
-
-
-
-typedef struct IXMLDOMText IXMLDOMText;
-
-
-
-
-
-typedef struct IXMLDOMComment IXMLDOMComment;
-
-
-
-
-
-typedef struct IXMLDOMProcessingInstruction IXMLDOMProcessingInstruction;
-
-
-
-
-
-typedef struct IXMLDOMCDATASection IXMLDOMCDATASection;
-
-
-
-
-
-typedef struct IXMLDOMDocumentType IXMLDOMDocumentType;
-
-
-
-
-
-typedef struct IXMLDOMNotation IXMLDOMNotation;
-
-
-
-
-
-typedef struct IXMLDOMEntity IXMLDOMEntity;
-
-
-
-
-
-typedef struct IXMLDOMEntityReference IXMLDOMEntityReference;
-
-
-
-
-
-typedef struct IXMLDOMParseError IXMLDOMParseError;
-
-
-
-
-
-typedef struct IXTLRuntime IXTLRuntime;
-
-
-
-
-
-typedef struct XMLDOMDocumentEvents XMLDOMDocumentEvents;
-
-
-
-
-
-
-
-typedef class DOMDocument DOMDocument;
-
-
-
-
-
-
-
-
-
-
-
-typedef class DOMFreeThreadedDocument DOMFreeThreadedDocument;
-
-
-
-
-
-
-
-
-
-typedef struct IXMLHttpRequest IXMLHttpRequest;
-
-
-
-
-
-
-
-typedef class XMLHTTPRequest XMLHTTPRequest;
-
-
-
-
-
-
-
-
-
-typedef struct IXMLDSOControl IXMLDSOControl;
-
-
-
-
-
-
-
-typedef class XMLDSOControl XMLDSOControl;
-
-
-
-
-
-
-
-
-
-typedef struct IXMLElementCollection IXMLElementCollection;
-
-
-
-
-
-typedef struct IXMLDocument IXMLDocument;
-
-
-
-
-
-typedef struct IXMLDocument2 IXMLDocument2;
-
-
-
-
-
-typedef struct IXMLElement IXMLElement;
-
-
-
-
-
-typedef struct IXMLElement2 IXMLElement2;
-
-
-
-
-
-typedef struct IXMLAttribute IXMLAttribute;
-
-
-
-
-
-typedef struct IXMLError IXMLError;
-
-
-
-
-
-
-
-typedef class XMLDocument XMLDocument;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-#pragma warning( disable: 4049 )  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
- 
-
-
-
-typedef struct ICreateTypeInfo ICreateTypeInfo;
-
-
-
-
-
-typedef struct ICreateTypeInfo2 ICreateTypeInfo2;
-
-
-
-
-
-typedef struct ICreateTypeLib ICreateTypeLib;
-
-
-
-
-
-typedef struct ICreateTypeLib2 ICreateTypeLib2;
-
-
-
-
-
-typedef struct IDispatch IDispatch;
-
-
-
-
-
-typedef struct IEnumVARIANT IEnumVARIANT;
-
-
-
-
-
-typedef struct ITypeComp ITypeComp;
-
-
-
-
-
-typedef struct ITypeInfo ITypeInfo;
-
-
-
-
-
-typedef struct ITypeInfo2 ITypeInfo2;
-
-
-
-
-
-typedef struct ITypeLib ITypeLib;
-
-
-
-
-
-typedef struct ITypeLib2 ITypeLib2;
-
-
-
-
-
-typedef struct ITypeChangeEvents ITypeChangeEvents;
-
-
-
-
-
-typedef struct IErrorInfo IErrorInfo;
-
-
-
-
-
-typedef struct ICreateErrorInfo ICreateErrorInfo;
-
-
-
-
-
-typedef struct ISupportErrorInfo ISupportErrorInfo;
-
-
-
-
-
-typedef struct ITypeFactory ITypeFactory;
-
-
-
-
-
-typedef struct ITypeMarshal ITypeMarshal;
-
-
-
-
-
-typedef struct IRecordInfo IRecordInfo;
-
-
-
-
-
-typedef struct IErrorLog IErrorLog;
-
-
-
-
-
-typedef struct IPropertyBag IPropertyBag;
-
-
-
-
-
-
-
-extern "C"{
-
-
-void * __stdcall MIDL_user_allocate(size_t);
-void __stdcall MIDL_user_free( void * ); 
-
-
- 
-
-
-
-
-
-
-
-
-
-#pragma warning(push)
-
-#pragma warning(disable:4201)    
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_oaidl_0000_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_oaidl_0000_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef CY CURRENCY;
-
-typedef struct tagSAFEARRAYBOUND
-    {
-    ULONG cElements;
-    LONG lLbound;
-    } 	SAFEARRAYBOUND;
-
-typedef struct tagSAFEARRAYBOUND *LPSAFEARRAYBOUND;
-
-
-typedef  struct _wireVARIANT *wireVARIANT;
-
-typedef  struct _wireBRECORD *wireBRECORD;
-
-typedef struct _wireSAFEARR_BSTR
-    {
-    ULONG Size;
-     wireBSTR *aBstr;
-    } 	SAFEARR_BSTR;
-
-typedef struct _wireSAFEARR_UNKNOWN
-    {
-    ULONG Size;
-     IUnknown **apUnknown;
-    } 	SAFEARR_UNKNOWN;
-
-typedef struct _wireSAFEARR_DISPATCH
-    {
-    ULONG Size;
-     IDispatch **apDispatch;
-    } 	SAFEARR_DISPATCH;
-
-typedef struct _wireSAFEARR_VARIANT
-    {
-    ULONG Size;
-     wireVARIANT *aVariant;
-    } 	SAFEARR_VARIANT;
-
-typedef struct _wireSAFEARR_BRECORD
-    {
-    ULONG Size;
-     wireBRECORD *aRecord;
-    } 	SAFEARR_BRECORD;
-
-typedef struct _wireSAFEARR_HAVEIID
-    {
-    ULONG Size;
-     IUnknown **apUnknown;
-    IID iid;
-    } 	SAFEARR_HAVEIID;
-
-typedef  
-enum tagSF_TYPE
-    {	SF_ERROR	= VT_ERROR,
-	SF_I1	= VT_I1,
-	SF_I2	= VT_I2,
-	SF_I4	= VT_I4,
-	SF_I8	= VT_I8,
-	SF_BSTR	= VT_BSTR,
-	SF_UNKNOWN	= VT_UNKNOWN,
-	SF_DISPATCH	= VT_DISPATCH,
-	SF_VARIANT	= VT_VARIANT,
-	SF_RECORD	= VT_RECORD,
-	SF_HAVEIID	= VT_UNKNOWN | VT_RESERVED
-    } 	SF_TYPE;
-
-typedef struct _wireSAFEARRAY_UNION
-    {
-    ULONG sfType;
-      union __MIDL_IOleAutomationTypes_0001
-        {
-         SAFEARR_BSTR BstrStr;
-         SAFEARR_UNKNOWN UnknownStr;
-         SAFEARR_DISPATCH DispatchStr;
-         SAFEARR_VARIANT VariantStr;
-         SAFEARR_BRECORD RecordStr;
-         SAFEARR_HAVEIID HaveIidStr;
-         BYTE_SIZEDARR ByteStr;
-         WORD_SIZEDARR WordStr;
-         DWORD_SIZEDARR LongStr;
-         HYPER_SIZEDARR HyperStr;
-        } 	u;
-    } 	SAFEARRAYUNION;
-
-typedef  struct _wireSAFEARRAY
-    {
-    USHORT cDims;
-    USHORT fFeatures;
-    ULONG cbElements;
-    ULONG cLocks;
-    SAFEARRAYUNION uArrayStructs;
-     SAFEARRAYBOUND rgsabound[ 1 ];
-    } 	*wireSAFEARRAY;
-
-typedef  wireSAFEARRAY *wirePSAFEARRAY;
-
-typedef struct tagSAFEARRAY
-    {
-    USHORT cDims;
-    USHORT fFeatures;
-    ULONG cbElements;
-    ULONG cLocks;
-    PVOID pvData;
-    SAFEARRAYBOUND rgsabound[ 1 ];
-    } 	SAFEARRAY;
-
-typedef  SAFEARRAY *LPSAFEARRAY;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef  struct tagVARIANT VARIANT;
-
-struct tagVARIANT
-    {
-    union 
-        {
-        struct 
-            {
-            VARTYPE vt;
-            WORD wReserved1;
-            WORD wReserved2;
-            WORD wReserved3;
-            union 
-                {
-                LONGLONG llVal;
-                LONG lVal;
-                BYTE bVal;
-                SHORT iVal;
-                FLOAT fltVal;
-                DOUBLE dblVal;
-                VARIANT_BOOL boolVal;
-                
-                SCODE scode;
-                CY cyVal;
-                DATE date;
-                BSTR bstrVal;
-                IUnknown *punkVal;
-                IDispatch *pdispVal;
-                SAFEARRAY *parray;
-                BYTE *pbVal;
-                SHORT *piVal;
-                LONG *plVal;
-                LONGLONG *pllVal;
-                FLOAT *pfltVal;
-                DOUBLE *pdblVal;
-                VARIANT_BOOL *pboolVal;
-                
-                SCODE *pscode;
-                CY *pcyVal;
-                DATE *pdate;
-                BSTR *pbstrVal;
-                IUnknown **ppunkVal;
-                IDispatch **ppdispVal;
-                SAFEARRAY **pparray;
-                VARIANT *pvarVal;
-                PVOID byref;
-                CHAR cVal;
-                USHORT uiVal;
-                ULONG ulVal;
-                ULONGLONG ullVal;
-                INT intVal;
-                UINT uintVal;
-                DECIMAL *pdecVal;
-                CHAR *pcVal;
-                USHORT *puiVal;
-                ULONG *pulVal;
-                ULONGLONG *pullVal;
-                INT *pintVal;
-                UINT *puintVal;
-                struct 
-                    {
-                    PVOID pvRecord;
-                    IRecordInfo *pRecInfo;
-                    } 	;
-                } 	;
-            } 	;
-        DECIMAL decVal;
-        } 	;
-    } ;
-typedef VARIANT *LPVARIANT;
-
-typedef VARIANT VARIANTARG;
-
-typedef VARIANT *LPVARIANTARG;
-
-
-struct _wireBRECORD
-    {
-    ULONG fFlags;
-    ULONG clSize;
-    IRecordInfo *pRecInfo;
-     byte *pRecord;
-    } ;
-struct _wireVARIANT
-    {
-    DWORD clSize;
-    DWORD rpcReserved;
-    USHORT vt;
-    USHORT wReserved1;
-    USHORT wReserved2;
-    USHORT wReserved3;
-     union 
-        {
-         LONGLONG llVal;
-         LONG lVal;
-         BYTE bVal;
-         SHORT iVal;
-         FLOAT fltVal;
-         DOUBLE dblVal;
-         VARIANT_BOOL boolVal;
-         SCODE scode;
-         CY cyVal;
-         DATE date;
-         wireBSTR bstrVal;
-         IUnknown *punkVal;
-         IDispatch *pdispVal;
-         wirePSAFEARRAY parray;
-         wireBRECORD brecVal;
-         BYTE *pbVal;
-         SHORT *piVal;
-         LONG *plVal;
-         LONGLONG *pllVal;
-         FLOAT *pfltVal;
-         DOUBLE *pdblVal;
-         VARIANT_BOOL *pboolVal;
-         SCODE *pscode;
-         CY *pcyVal;
-         DATE *pdate;
-         wireBSTR *pbstrVal;
-         IUnknown **ppunkVal;
-         IDispatch **ppdispVal;
-         wirePSAFEARRAY *pparray;
-         wireVARIANT *pvarVal;
-         CHAR cVal;
-         USHORT uiVal;
-         ULONG ulVal;
-         ULONGLONG ullVal;
-         INT intVal;
-         UINT uintVal;
-         DECIMAL decVal;
-         DECIMAL *pdecVal;
-         CHAR *pcVal;
-         USHORT *puiVal;
-         ULONG *pulVal;
-         ULONGLONG *pullVal;
-         INT *pintVal;
-         UINT *puintVal;
-           
-           
-        } 	;
-    } ;
-typedef LONG DISPID;
-
-typedef DISPID MEMBERID;
-
-typedef DWORD HREFTYPE;
-
-typedef  
-enum tagTYPEKIND
-    {	TKIND_ENUM	= 0,
-	TKIND_RECORD	= TKIND_ENUM + 1,
-	TKIND_MODULE	= TKIND_RECORD + 1,
-	TKIND_INTERFACE	= TKIND_MODULE + 1,
-	TKIND_DISPATCH	= TKIND_INTERFACE + 1,
-	TKIND_COCLASS	= TKIND_DISPATCH + 1,
-	TKIND_ALIAS	= TKIND_COCLASS + 1,
-	TKIND_UNION	= TKIND_ALIAS + 1,
-	TKIND_MAX	= TKIND_UNION + 1
-    } 	TYPEKIND;
-
-typedef struct tagTYPEDESC
-    {
-     union 
-        {
-         struct tagTYPEDESC *lptdesc;
-         struct tagARRAYDESC *lpadesc;
-         HREFTYPE hreftype;
-           
-        } 	;
-    VARTYPE vt;
-    } 	TYPEDESC;
-
-typedef struct tagARRAYDESC
-    {
-    TYPEDESC tdescElem;
-    USHORT cDims;
-     SAFEARRAYBOUND rgbounds[ 1 ];
-    } 	ARRAYDESC;
-
-typedef struct tagPARAMDESCEX
-    {
-    ULONG cBytes;
-    VARIANTARG varDefaultValue;
-    } 	PARAMDESCEX;
-
-typedef struct tagPARAMDESCEX *LPPARAMDESCEX;
-
-typedef struct tagPARAMDESC
-    {
-    LPPARAMDESCEX pparamdescex;
-    USHORT wParamFlags;
-    } 	PARAMDESC;
-
-typedef struct tagPARAMDESC *LPPARAMDESC;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagIDLDESC
-    {
-    ULONG_PTR dwReserved;
-    USHORT wIDLFlags;
-    } 	IDLDESC;
-
-typedef struct tagIDLDESC *LPIDLDESC;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagELEMDESC {
-    TYPEDESC tdesc;             
-    union {
-        IDLDESC idldesc;        
-        PARAMDESC paramdesc;    
-    };
-} ELEMDESC, * LPELEMDESC;
-
-
-
-typedef struct tagTYPEATTR
-    {
-    GUID guid;
-    LCID lcid;
-    DWORD dwReserved;
-    MEMBERID memidConstructor;
-    MEMBERID memidDestructor;
-    LPOLESTR lpstrSchema;
-    ULONG cbSizeInstance;
-    TYPEKIND typekind;
-    WORD cFuncs;
-    WORD cVars;
-    WORD cImplTypes;
-    WORD cbSizeVft;
-    WORD cbAlignment;
-    WORD wTypeFlags;
-    WORD wMajorVerNum;
-    WORD wMinorVerNum;
-    TYPEDESC tdescAlias;
-    IDLDESC idldescType;
-    } 	TYPEATTR;
-
-typedef struct tagTYPEATTR *LPTYPEATTR;
-
-typedef struct tagDISPPARAMS
-    {
-     VARIANTARG *rgvarg;
-     DISPID *rgdispidNamedArgs;
-    UINT cArgs;
-    UINT cNamedArgs;
-    } 	DISPPARAMS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagEXCEPINFO {
-    WORD  wCode;
-    WORD  wReserved;
-    BSTR  bstrSource;
-    BSTR  bstrDescription;
-    BSTR  bstrHelpFile;
-    DWORD dwHelpContext;
-    PVOID pvReserved;
-    HRESULT (__stdcall *pfnDeferredFillIn)(struct tagEXCEPINFO *);
-    SCODE scode;
-} EXCEPINFO, * LPEXCEPINFO;
-
-
-
-typedef  
-enum tagCALLCONV
-    {	CC_FASTCALL	= 0,
-	CC_CDECL	= 1,
-	CC_MSCPASCAL	= CC_CDECL + 1,
-	CC_PASCAL	= CC_MSCPASCAL,
-	CC_MACPASCAL	= CC_PASCAL + 1,
-	CC_STDCALL	= CC_MACPASCAL + 1,
-	CC_FPFASTCALL	= CC_STDCALL + 1,
-	CC_SYSCALL	= CC_FPFASTCALL + 1,
-	CC_MPWCDECL	= CC_SYSCALL + 1,
-	CC_MPWPASCAL	= CC_MPWCDECL + 1,
-	CC_MAX	= CC_MPWPASCAL + 1
-    } 	CALLCONV;
-
-typedef  
-enum tagFUNCKIND
-    {	FUNC_VIRTUAL	= 0,
-	FUNC_PUREVIRTUAL	= FUNC_VIRTUAL + 1,
-	FUNC_NONVIRTUAL	= FUNC_PUREVIRTUAL + 1,
-	FUNC_STATIC	= FUNC_NONVIRTUAL + 1,
-	FUNC_DISPATCH	= FUNC_STATIC + 1
-    } 	FUNCKIND;
-
-typedef  
-enum tagINVOKEKIND
-    {	INVOKE_FUNC	= 1,
-	INVOKE_PROPERTYGET	= 2,
-	INVOKE_PROPERTYPUT	= 4,
-	INVOKE_PROPERTYPUTREF	= 8
-    } 	INVOKEKIND;
-
-typedef struct tagFUNCDESC
-    {
-    MEMBERID memid;
-     SCODE *lprgscode;
-     ELEMDESC *lprgelemdescParam;
-    FUNCKIND funckind;
-    INVOKEKIND invkind;
-    CALLCONV callconv;
-    SHORT cParams;
-    SHORT cParamsOpt;
-    SHORT oVft;
-    SHORT cScodes;
-    ELEMDESC elemdescFunc;
-    WORD wFuncFlags;
-    } 	FUNCDESC;
-
-typedef struct tagFUNCDESC *LPFUNCDESC;
-
-typedef  
-enum tagVARKIND
-    {	VAR_PERINSTANCE	= 0,
-	VAR_STATIC	= VAR_PERINSTANCE + 1,
-	VAR_CONST	= VAR_STATIC + 1,
-	VAR_DISPATCH	= VAR_CONST + 1
-    } 	VARKIND;
-
-
-
-
-
-
-
-
-
-typedef struct tagVARDESC
-    {
-    MEMBERID memid;
-    LPOLESTR lpstrSchema;
-     union 
-        {
-         ULONG oInst;
-         VARIANT *lpvarValue;
-        } 	;
-    ELEMDESC elemdescVar;
-    WORD wVarFlags;
-    VARKIND varkind;
-    } 	VARDESC;
-
-typedef struct tagVARDESC *LPVARDESC;
-
-typedef 
-enum tagTYPEFLAGS
-    {	TYPEFLAG_FAPPOBJECT	= 0x1,
-	TYPEFLAG_FCANCREATE	= 0x2,
-	TYPEFLAG_FLICENSED	= 0x4,
-	TYPEFLAG_FPREDECLID	= 0x8,
-	TYPEFLAG_FHIDDEN	= 0x10,
-	TYPEFLAG_FCONTROL	= 0x20,
-	TYPEFLAG_FDUAL	= 0x40,
-	TYPEFLAG_FNONEXTENSIBLE	= 0x80,
-	TYPEFLAG_FOLEAUTOMATION	= 0x100,
-	TYPEFLAG_FRESTRICTED	= 0x200,
-	TYPEFLAG_FAGGREGATABLE	= 0x400,
-	TYPEFLAG_FREPLACEABLE	= 0x800,
-	TYPEFLAG_FDISPATCHABLE	= 0x1000,
-	TYPEFLAG_FREVERSEBIND	= 0x2000,
-	TYPEFLAG_FPROXY	= 0x4000
-    } 	TYPEFLAGS;
-
-typedef 
-enum tagFUNCFLAGS
-    {	FUNCFLAG_FRESTRICTED	= 0x1,
-	FUNCFLAG_FSOURCE	= 0x2,
-	FUNCFLAG_FBINDABLE	= 0x4,
-	FUNCFLAG_FREQUESTEDIT	= 0x8,
-	FUNCFLAG_FDISPLAYBIND	= 0x10,
-	FUNCFLAG_FDEFAULTBIND	= 0x20,
-	FUNCFLAG_FHIDDEN	= 0x40,
-	FUNCFLAG_FUSESGETLASTERROR	= 0x80,
-	FUNCFLAG_FDEFAULTCOLLELEM	= 0x100,
-	FUNCFLAG_FUIDEFAULT	= 0x200,
-	FUNCFLAG_FNONBROWSABLE	= 0x400,
-	FUNCFLAG_FREPLACEABLE	= 0x800,
-	FUNCFLAG_FIMMEDIATEBIND	= 0x1000
-    } 	FUNCFLAGS;
-
-typedef 
-enum tagVARFLAGS
-    {	VARFLAG_FREADONLY	= 0x1,
-	VARFLAG_FSOURCE	= 0x2,
-	VARFLAG_FBINDABLE	= 0x4,
-	VARFLAG_FREQUESTEDIT	= 0x8,
-	VARFLAG_FDISPLAYBIND	= 0x10,
-	VARFLAG_FDEFAULTBIND	= 0x20,
-	VARFLAG_FHIDDEN	= 0x40,
-	VARFLAG_FRESTRICTED	= 0x80,
-	VARFLAG_FDEFAULTCOLLELEM	= 0x100,
-	VARFLAG_FUIDEFAULT	= 0x200,
-	VARFLAG_FNONBROWSABLE	= 0x400,
-	VARFLAG_FREPLACEABLE	= 0x800,
-	VARFLAG_FIMMEDIATEBIND	= 0x1000
-    } 	VARFLAGS;
-
-typedef  struct tagCLEANLOCALSTORAGE
-    {
-    IUnknown *pInterface;
-    PVOID pStorage;
-    DWORD flags;
-    } 	CLEANLOCALSTORAGE;
-
-typedef struct tagCUSTDATAITEM
-    {
-    GUID guid;
-    VARIANTARG varValue;
-    } 	CUSTDATAITEM;
-
-typedef struct tagCUSTDATAITEM *LPCUSTDATAITEM;
-
-typedef struct tagCUSTDATA
-    {
-    DWORD cCustData;
-     LPCUSTDATAITEM prgCustData;
-    } 	CUSTDATA;
-
-typedef struct tagCUSTDATA *LPCUSTDATA;
-
-
-
-extern RPC_IF_HANDLE IOleAutomationTypes_v1_0_c_ifspec;
-extern RPC_IF_HANDLE IOleAutomationTypes_v1_0_s_ifspec;
-
-
-
-
-
-
- 
-
-typedef  ICreateTypeInfo *LPCREATETYPEINFO;
-
-
-extern "C" const IID IID_ICreateTypeInfo;
-
-
-    
-    struct __declspec(uuid("00020405-0000-0000-C000-000000000046")) __declspec(novtable)
-    ICreateTypeInfo : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall SetGuid( 
-             const GUID & guid) = 0;
-        
-        virtual HRESULT __stdcall SetTypeFlags( 
-             UINT uTypeFlags) = 0;
-        
-        virtual HRESULT __stdcall SetDocString( 
-             LPOLESTR pStrDoc) = 0;
-        
-        virtual HRESULT __stdcall SetHelpContext( 
-             DWORD dwHelpContext) = 0;
-        
-        virtual HRESULT __stdcall SetVersion( 
-             WORD wMajorVerNum,
-             WORD wMinorVerNum) = 0;
-        
-        virtual HRESULT __stdcall AddRefTypeInfo( 
-             ITypeInfo *pTInfo,
-             HREFTYPE *phRefType) = 0;
-        
-        virtual HRESULT __stdcall AddFuncDesc( 
-             UINT index,
-             FUNCDESC *pFuncDesc) = 0;
-        
-        virtual HRESULT __stdcall AddImplType( 
-             UINT index,
-             HREFTYPE hRefType) = 0;
-        
-        virtual HRESULT __stdcall SetImplTypeFlags( 
-             UINT index,
-             INT implTypeFlags) = 0;
-        
-        virtual HRESULT __stdcall SetAlignment( 
-             WORD cbAlignment) = 0;
-        
-        virtual HRESULT __stdcall SetSchema( 
-             LPOLESTR pStrSchema) = 0;
-        
-        virtual HRESULT __stdcall AddVarDesc( 
-             UINT index,
-             VARDESC *pVarDesc) = 0;
-        
-        virtual HRESULT __stdcall SetFuncAndParamNames( 
-             UINT index,
-             LPOLESTR *rgszNames,
-             UINT cNames) = 0;
-        
-        virtual HRESULT __stdcall SetVarName( 
-             UINT index,
-             LPOLESTR szName) = 0;
-        
-        virtual HRESULT __stdcall SetTypeDescAlias( 
-             TYPEDESC *pTDescAlias) = 0;
-        
-        virtual HRESULT __stdcall DefineFuncAsDllEntry( 
-             UINT index,
-             LPOLESTR szDllName,
-             LPOLESTR szProcName) = 0;
-        
-        virtual HRESULT __stdcall SetFuncDocString( 
-             UINT index,
-             LPOLESTR szDocString) = 0;
-        
-        virtual HRESULT __stdcall SetVarDocString( 
-             UINT index,
-             LPOLESTR szDocString) = 0;
-        
-        virtual HRESULT __stdcall SetFuncHelpContext( 
-             UINT index,
-             DWORD dwHelpContext) = 0;
-        
-        virtual HRESULT __stdcall SetVarHelpContext( 
-             UINT index,
-             DWORD dwHelpContext) = 0;
-        
-        virtual HRESULT __stdcall SetMops( 
-             UINT index,
-             BSTR bstrMops) = 0;
-        
-        virtual HRESULT __stdcall SetTypeIdldesc( 
-             IDLDESC *pIdlDesc) = 0;
-        
-        virtual HRESULT __stdcall LayOut( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ICreateTypeInfo_SetGuid_Proxy( 
-    ICreateTypeInfo * This,
-     const GUID & guid);
-
-
-void __stdcall ICreateTypeInfo_SetGuid_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_SetTypeFlags_Proxy( 
-    ICreateTypeInfo * This,
-     UINT uTypeFlags);
-
-
-void __stdcall ICreateTypeInfo_SetTypeFlags_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_SetDocString_Proxy( 
-    ICreateTypeInfo * This,
-     LPOLESTR pStrDoc);
-
-
-void __stdcall ICreateTypeInfo_SetDocString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_SetHelpContext_Proxy( 
-    ICreateTypeInfo * This,
-     DWORD dwHelpContext);
-
-
-void __stdcall ICreateTypeInfo_SetHelpContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_SetVersion_Proxy( 
-    ICreateTypeInfo * This,
-     WORD wMajorVerNum,
-     WORD wMinorVerNum);
-
-
-void __stdcall ICreateTypeInfo_SetVersion_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_AddRefTypeInfo_Proxy( 
-    ICreateTypeInfo * This,
-     ITypeInfo *pTInfo,
-     HREFTYPE *phRefType);
-
-
-void __stdcall ICreateTypeInfo_AddRefTypeInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_AddFuncDesc_Proxy( 
-    ICreateTypeInfo * This,
-     UINT index,
-     FUNCDESC *pFuncDesc);
-
-
-void __stdcall ICreateTypeInfo_AddFuncDesc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_AddImplType_Proxy( 
-    ICreateTypeInfo * This,
-     UINT index,
-     HREFTYPE hRefType);
-
-
-void __stdcall ICreateTypeInfo_AddImplType_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_SetImplTypeFlags_Proxy( 
-    ICreateTypeInfo * This,
-     UINT index,
-     INT implTypeFlags);
-
-
-void __stdcall ICreateTypeInfo_SetImplTypeFlags_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_SetAlignment_Proxy( 
-    ICreateTypeInfo * This,
-     WORD cbAlignment);
-
-
-void __stdcall ICreateTypeInfo_SetAlignment_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_SetSchema_Proxy( 
-    ICreateTypeInfo * This,
-     LPOLESTR pStrSchema);
-
-
-void __stdcall ICreateTypeInfo_SetSchema_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_AddVarDesc_Proxy( 
-    ICreateTypeInfo * This,
-     UINT index,
-     VARDESC *pVarDesc);
-
-
-void __stdcall ICreateTypeInfo_AddVarDesc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_SetFuncAndParamNames_Proxy( 
-    ICreateTypeInfo * This,
-     UINT index,
-     LPOLESTR *rgszNames,
-     UINT cNames);
-
-
-void __stdcall ICreateTypeInfo_SetFuncAndParamNames_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_SetVarName_Proxy( 
-    ICreateTypeInfo * This,
-     UINT index,
-     LPOLESTR szName);
-
-
-void __stdcall ICreateTypeInfo_SetVarName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_SetTypeDescAlias_Proxy( 
-    ICreateTypeInfo * This,
-     TYPEDESC *pTDescAlias);
-
-
-void __stdcall ICreateTypeInfo_SetTypeDescAlias_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_DefineFuncAsDllEntry_Proxy( 
-    ICreateTypeInfo * This,
-     UINT index,
-     LPOLESTR szDllName,
-     LPOLESTR szProcName);
-
-
-void __stdcall ICreateTypeInfo_DefineFuncAsDllEntry_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_SetFuncDocString_Proxy( 
-    ICreateTypeInfo * This,
-     UINT index,
-     LPOLESTR szDocString);
-
-
-void __stdcall ICreateTypeInfo_SetFuncDocString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_SetVarDocString_Proxy( 
-    ICreateTypeInfo * This,
-     UINT index,
-     LPOLESTR szDocString);
-
-
-void __stdcall ICreateTypeInfo_SetVarDocString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_SetFuncHelpContext_Proxy( 
-    ICreateTypeInfo * This,
-     UINT index,
-     DWORD dwHelpContext);
-
-
-void __stdcall ICreateTypeInfo_SetFuncHelpContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_SetVarHelpContext_Proxy( 
-    ICreateTypeInfo * This,
-     UINT index,
-     DWORD dwHelpContext);
-
-
-void __stdcall ICreateTypeInfo_SetVarHelpContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_SetMops_Proxy( 
-    ICreateTypeInfo * This,
-     UINT index,
-     BSTR bstrMops);
-
-
-void __stdcall ICreateTypeInfo_SetMops_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_SetTypeIdldesc_Proxy( 
-    ICreateTypeInfo * This,
-     IDLDESC *pIdlDesc);
-
-
-void __stdcall ICreateTypeInfo_SetTypeIdldesc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo_LayOut_Proxy( 
-    ICreateTypeInfo * This);
-
-
-void __stdcall ICreateTypeInfo_LayOut_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  ICreateTypeInfo2 *LPCREATETYPEINFO2;
-
-
-extern "C" const IID IID_ICreateTypeInfo2;
-
-
-    
-    struct __declspec(uuid("0002040E-0000-0000-C000-000000000046")) __declspec(novtable)
-    ICreateTypeInfo2 : public ICreateTypeInfo
-    {
-    public:
-        virtual HRESULT __stdcall DeleteFuncDesc( 
-             UINT index) = 0;
-        
-        virtual HRESULT __stdcall DeleteFuncDescByMemId( 
-             MEMBERID memid,
-             INVOKEKIND invKind) = 0;
-        
-        virtual HRESULT __stdcall DeleteVarDesc( 
-             UINT index) = 0;
-        
-        virtual HRESULT __stdcall DeleteVarDescByMemId( 
-             MEMBERID memid) = 0;
-        
-        virtual HRESULT __stdcall DeleteImplType( 
-             UINT index) = 0;
-        
-        virtual HRESULT __stdcall SetCustData( 
-             const GUID & guid,
-             VARIANT *pVarVal) = 0;
-        
-        virtual HRESULT __stdcall SetFuncCustData( 
-             UINT index,
-             const GUID & guid,
-             VARIANT *pVarVal) = 0;
-        
-        virtual HRESULT __stdcall SetParamCustData( 
-             UINT indexFunc,
-             UINT indexParam,
-             const GUID & guid,
-             VARIANT *pVarVal) = 0;
-        
-        virtual HRESULT __stdcall SetVarCustData( 
-             UINT index,
-             const GUID & guid,
-             VARIANT *pVarVal) = 0;
-        
-        virtual HRESULT __stdcall SetImplTypeCustData( 
-             UINT index,
-             const GUID & guid,
-             VARIANT *pVarVal) = 0;
-        
-        virtual HRESULT __stdcall SetHelpStringContext( 
-             ULONG dwHelpStringContext) = 0;
-        
-        virtual HRESULT __stdcall SetFuncHelpStringContext( 
-             UINT index,
-             ULONG dwHelpStringContext) = 0;
-        
-        virtual HRESULT __stdcall SetVarHelpStringContext( 
-             UINT index,
-             ULONG dwHelpStringContext) = 0;
-        
-        virtual HRESULT __stdcall Invalidate( void) = 0;
-        
-        virtual HRESULT __stdcall SetName( 
-             LPOLESTR szName) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ICreateTypeInfo2_DeleteFuncDesc_Proxy( 
-    ICreateTypeInfo2 * This,
-     UINT index);
-
-
-void __stdcall ICreateTypeInfo2_DeleteFuncDesc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo2_DeleteFuncDescByMemId_Proxy( 
-    ICreateTypeInfo2 * This,
-     MEMBERID memid,
-     INVOKEKIND invKind);
-
-
-void __stdcall ICreateTypeInfo2_DeleteFuncDescByMemId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo2_DeleteVarDesc_Proxy( 
-    ICreateTypeInfo2 * This,
-     UINT index);
-
-
-void __stdcall ICreateTypeInfo2_DeleteVarDesc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo2_DeleteVarDescByMemId_Proxy( 
-    ICreateTypeInfo2 * This,
-     MEMBERID memid);
-
-
-void __stdcall ICreateTypeInfo2_DeleteVarDescByMemId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo2_DeleteImplType_Proxy( 
-    ICreateTypeInfo2 * This,
-     UINT index);
-
-
-void __stdcall ICreateTypeInfo2_DeleteImplType_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo2_SetCustData_Proxy( 
-    ICreateTypeInfo2 * This,
-     const GUID & guid,
-     VARIANT *pVarVal);
-
-
-void __stdcall ICreateTypeInfo2_SetCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo2_SetFuncCustData_Proxy( 
-    ICreateTypeInfo2 * This,
-     UINT index,
-     const GUID & guid,
-     VARIANT *pVarVal);
-
-
-void __stdcall ICreateTypeInfo2_SetFuncCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo2_SetParamCustData_Proxy( 
-    ICreateTypeInfo2 * This,
-     UINT indexFunc,
-     UINT indexParam,
-     const GUID & guid,
-     VARIANT *pVarVal);
-
-
-void __stdcall ICreateTypeInfo2_SetParamCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo2_SetVarCustData_Proxy( 
-    ICreateTypeInfo2 * This,
-     UINT index,
-     const GUID & guid,
-     VARIANT *pVarVal);
-
-
-void __stdcall ICreateTypeInfo2_SetVarCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo2_SetImplTypeCustData_Proxy( 
-    ICreateTypeInfo2 * This,
-     UINT index,
-     const GUID & guid,
-     VARIANT *pVarVal);
-
-
-void __stdcall ICreateTypeInfo2_SetImplTypeCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo2_SetHelpStringContext_Proxy( 
-    ICreateTypeInfo2 * This,
-     ULONG dwHelpStringContext);
-
-
-void __stdcall ICreateTypeInfo2_SetHelpStringContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo2_SetFuncHelpStringContext_Proxy( 
-    ICreateTypeInfo2 * This,
-     UINT index,
-     ULONG dwHelpStringContext);
-
-
-void __stdcall ICreateTypeInfo2_SetFuncHelpStringContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo2_SetVarHelpStringContext_Proxy( 
-    ICreateTypeInfo2 * This,
-     UINT index,
-     ULONG dwHelpStringContext);
-
-
-void __stdcall ICreateTypeInfo2_SetVarHelpStringContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo2_Invalidate_Proxy( 
-    ICreateTypeInfo2 * This);
-
-
-void __stdcall ICreateTypeInfo2_Invalidate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeInfo2_SetName_Proxy( 
-    ICreateTypeInfo2 * This,
-     LPOLESTR szName);
-
-
-void __stdcall ICreateTypeInfo2_SetName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  ICreateTypeLib *LPCREATETYPELIB;
-
-
-extern "C" const IID IID_ICreateTypeLib;
-
-
-    
-    struct __declspec(uuid("00020406-0000-0000-C000-000000000046")) __declspec(novtable)
-    ICreateTypeLib : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall CreateTypeInfo( 
-             LPOLESTR szName,
-             TYPEKIND tkind,
-             ICreateTypeInfo **ppCTInfo) = 0;
-        
-        virtual HRESULT __stdcall SetName( 
-             LPOLESTR szName) = 0;
-        
-        virtual HRESULT __stdcall SetVersion( 
-             WORD wMajorVerNum,
-             WORD wMinorVerNum) = 0;
-        
-        virtual HRESULT __stdcall SetGuid( 
-             const GUID & guid) = 0;
-        
-        virtual HRESULT __stdcall SetDocString( 
-             LPOLESTR szDoc) = 0;
-        
-        virtual HRESULT __stdcall SetHelpFileName( 
-             LPOLESTR szHelpFileName) = 0;
-        
-        virtual HRESULT __stdcall SetHelpContext( 
-             DWORD dwHelpContext) = 0;
-        
-        virtual HRESULT __stdcall SetLcid( 
-             LCID lcid) = 0;
-        
-        virtual HRESULT __stdcall SetLibFlags( 
-             UINT uLibFlags) = 0;
-        
-        virtual HRESULT __stdcall SaveAllChanges( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ICreateTypeLib_CreateTypeInfo_Proxy( 
-    ICreateTypeLib * This,
-     LPOLESTR szName,
-     TYPEKIND tkind,
-     ICreateTypeInfo **ppCTInfo);
-
-
-void __stdcall ICreateTypeLib_CreateTypeInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeLib_SetName_Proxy( 
-    ICreateTypeLib * This,
-     LPOLESTR szName);
-
-
-void __stdcall ICreateTypeLib_SetName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeLib_SetVersion_Proxy( 
-    ICreateTypeLib * This,
-     WORD wMajorVerNum,
-     WORD wMinorVerNum);
-
-
-void __stdcall ICreateTypeLib_SetVersion_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeLib_SetGuid_Proxy( 
-    ICreateTypeLib * This,
-     const GUID & guid);
-
-
-void __stdcall ICreateTypeLib_SetGuid_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeLib_SetDocString_Proxy( 
-    ICreateTypeLib * This,
-     LPOLESTR szDoc);
-
-
-void __stdcall ICreateTypeLib_SetDocString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeLib_SetHelpFileName_Proxy( 
-    ICreateTypeLib * This,
-     LPOLESTR szHelpFileName);
-
-
-void __stdcall ICreateTypeLib_SetHelpFileName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeLib_SetHelpContext_Proxy( 
-    ICreateTypeLib * This,
-     DWORD dwHelpContext);
-
-
-void __stdcall ICreateTypeLib_SetHelpContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeLib_SetLcid_Proxy( 
-    ICreateTypeLib * This,
-     LCID lcid);
-
-
-void __stdcall ICreateTypeLib_SetLcid_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeLib_SetLibFlags_Proxy( 
-    ICreateTypeLib * This,
-     UINT uLibFlags);
-
-
-void __stdcall ICreateTypeLib_SetLibFlags_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeLib_SaveAllChanges_Proxy( 
-    ICreateTypeLib * This);
-
-
-void __stdcall ICreateTypeLib_SaveAllChanges_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  ICreateTypeLib2 *LPCREATETYPELIB2;
-
-
-extern "C" const IID IID_ICreateTypeLib2;
-
-
-    
-    struct __declspec(uuid("0002040F-0000-0000-C000-000000000046")) __declspec(novtable)
-    ICreateTypeLib2 : public ICreateTypeLib
-    {
-    public:
-        virtual HRESULT __stdcall DeleteTypeInfo( 
-             LPOLESTR szName) = 0;
-        
-        virtual HRESULT __stdcall SetCustData( 
-             const GUID & guid,
-             VARIANT *pVarVal) = 0;
-        
-        virtual HRESULT __stdcall SetHelpStringContext( 
-             ULONG dwHelpStringContext) = 0;
-        
-        virtual HRESULT __stdcall SetHelpStringDll( 
-             LPOLESTR szFileName) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ICreateTypeLib2_DeleteTypeInfo_Proxy( 
-    ICreateTypeLib2 * This,
-     LPOLESTR szName);
-
-
-void __stdcall ICreateTypeLib2_DeleteTypeInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeLib2_SetCustData_Proxy( 
-    ICreateTypeLib2 * This,
-     const GUID & guid,
-     VARIANT *pVarVal);
-
-
-void __stdcall ICreateTypeLib2_SetCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeLib2_SetHelpStringContext_Proxy( 
-    ICreateTypeLib2 * This,
-     ULONG dwHelpStringContext);
-
-
-void __stdcall ICreateTypeLib2_SetHelpStringContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateTypeLib2_SetHelpStringDll_Proxy( 
-    ICreateTypeLib2 * This,
-     LPOLESTR szFileName);
-
-
-void __stdcall ICreateTypeLib2_SetHelpStringDll_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IDispatch *LPDISPATCH;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" const IID IID_IDispatch;
-
-
-    
-    struct __declspec(uuid("00020400-0000-0000-C000-000000000046")) __declspec(novtable)
-    IDispatch : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetTypeInfoCount( 
-             UINT *pctinfo) = 0;
-        
-        virtual HRESULT __stdcall GetTypeInfo( 
-             UINT iTInfo,
-             LCID lcid,
-             ITypeInfo **ppTInfo) = 0;
-        
-        virtual HRESULT __stdcall GetIDsOfNames( 
-             const IID & riid,
-             LPOLESTR *rgszNames,
-             UINT cNames,
-             LCID lcid,
-             DISPID *rgDispId) = 0;
-        
-        virtual  HRESULT __stdcall Invoke( 
-             DISPID dispIdMember,
-             const IID & riid,
-             LCID lcid,
-             WORD wFlags,
-             DISPPARAMS *pDispParams,
-             VARIANT *pVarResult,
-             EXCEPINFO *pExcepInfo,
-             UINT *puArgErr) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IDispatch_GetTypeInfoCount_Proxy( 
-    IDispatch * This,
-     UINT *pctinfo);
-
-
-void __stdcall IDispatch_GetTypeInfoCount_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDispatch_GetTypeInfo_Proxy( 
-    IDispatch * This,
-     UINT iTInfo,
-     LCID lcid,
-     ITypeInfo **ppTInfo);
-
-
-void __stdcall IDispatch_GetTypeInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDispatch_GetIDsOfNames_Proxy( 
-    IDispatch * This,
-     const IID & riid,
-     LPOLESTR *rgszNames,
-     UINT cNames,
-     LCID lcid,
-     DISPID *rgDispId);
-
-
-void __stdcall IDispatch_GetIDsOfNames_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IDispatch_RemoteInvoke_Proxy( 
-    IDispatch * This,
-     DISPID dispIdMember,
-     const IID & riid,
-     LCID lcid,
-     DWORD dwFlags,
-     DISPPARAMS *pDispParams,
-     VARIANT *pVarResult,
-     EXCEPINFO *pExcepInfo,
-     UINT *pArgErr,
-     UINT cVarRef,
-     UINT *rgVarRefIdx,
-     VARIANTARG *rgVarRef);
-
-
-void __stdcall IDispatch_RemoteInvoke_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IEnumVARIANT *LPENUMVARIANT;
-
-
-extern "C" const IID IID_IEnumVARIANT;
-
-
-    
-    struct __declspec(uuid("00020404-0000-0000-C000-000000000046")) __declspec(novtable)
-    IEnumVARIANT : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Next( 
-             ULONG celt,
-             VARIANT *rgVar,
-             ULONG *pCeltFetched) = 0;
-        
-        virtual HRESULT __stdcall Skip( 
-             ULONG celt) = 0;
-        
-        virtual HRESULT __stdcall Reset( void) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IEnumVARIANT **ppEnum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IEnumVARIANT_RemoteNext_Proxy( 
-    IEnumVARIANT * This,
-     ULONG celt,
-     VARIANT *rgVar,
-     ULONG *pCeltFetched);
-
-
-void __stdcall IEnumVARIANT_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumVARIANT_Skip_Proxy( 
-    IEnumVARIANT * This,
-     ULONG celt);
-
-
-void __stdcall IEnumVARIANT_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumVARIANT_Reset_Proxy( 
-    IEnumVARIANT * This);
-
-
-void __stdcall IEnumVARIANT_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumVARIANT_Clone_Proxy( 
-    IEnumVARIANT * This,
-     IEnumVARIANT **ppEnum);
-
-
-void __stdcall IEnumVARIANT_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  ITypeComp *LPTYPECOMP;
-
-typedef  
-enum tagDESCKIND
-    {	DESCKIND_NONE	= 0,
-	DESCKIND_FUNCDESC	= DESCKIND_NONE + 1,
-	DESCKIND_VARDESC	= DESCKIND_FUNCDESC + 1,
-	DESCKIND_TYPECOMP	= DESCKIND_VARDESC + 1,
-	DESCKIND_IMPLICITAPPOBJ	= DESCKIND_TYPECOMP + 1,
-	DESCKIND_MAX	= DESCKIND_IMPLICITAPPOBJ + 1
-    } 	DESCKIND;
-
-typedef union tagBINDPTR
-    {
-    FUNCDESC *lpfuncdesc;
-    VARDESC *lpvardesc;
-    ITypeComp *lptcomp;
-    } 	BINDPTR;
-
-typedef union tagBINDPTR *LPBINDPTR;
-
-
-extern "C" const IID IID_ITypeComp;
-
-
-    
-    struct __declspec(uuid("00020403-0000-0000-C000-000000000046")) __declspec(novtable)
-    ITypeComp : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Bind( 
-             LPOLESTR szName,
-             ULONG lHashVal,
-             WORD wFlags,
-             ITypeInfo **ppTInfo,
-             DESCKIND *pDescKind,
-             BINDPTR *pBindPtr) = 0;
-        
-        virtual  HRESULT __stdcall BindType( 
-             LPOLESTR szName,
-             ULONG lHashVal,
-             ITypeInfo **ppTInfo,
-             ITypeComp **ppTComp) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall ITypeComp_RemoteBind_Proxy( 
-    ITypeComp * This,
-     LPOLESTR szName,
-     ULONG lHashVal,
-     WORD wFlags,
-     ITypeInfo **ppTInfo,
-     DESCKIND *pDescKind,
-     LPFUNCDESC *ppFuncDesc,
-     LPVARDESC *ppVarDesc,
-     ITypeComp **ppTypeComp,
-     CLEANLOCALSTORAGE *pDummy);
-
-
-void __stdcall ITypeComp_RemoteBind_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeComp_RemoteBindType_Proxy( 
-    ITypeComp * This,
-     LPOLESTR szName,
-     ULONG lHashVal,
-     ITypeInfo **ppTInfo);
-
-
-void __stdcall ITypeComp_RemoteBindType_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  ITypeInfo *LPTYPEINFO;
-
-
-extern "C" const IID IID_ITypeInfo;
-
-
-    
-    struct __declspec(uuid("00020401-0000-0000-C000-000000000046")) __declspec(novtable)
-    ITypeInfo : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall GetTypeAttr( 
-             TYPEATTR **ppTypeAttr) = 0;
-        
-        virtual HRESULT __stdcall GetTypeComp( 
-             ITypeComp **ppTComp) = 0;
-        
-        virtual  HRESULT __stdcall GetFuncDesc( 
-             UINT index,
-             FUNCDESC **ppFuncDesc) = 0;
-        
-        virtual  HRESULT __stdcall GetVarDesc( 
-             UINT index,
-             VARDESC **ppVarDesc) = 0;
-        
-        virtual  HRESULT __stdcall GetNames( 
-             MEMBERID memid,
-             BSTR *rgBstrNames,
-             UINT cMaxNames,
-             UINT *pcNames) = 0;
-        
-        virtual HRESULT __stdcall GetRefTypeOfImplType( 
-             UINT index,
-             HREFTYPE *pRefType) = 0;
-        
-        virtual HRESULT __stdcall GetImplTypeFlags( 
-             UINT index,
-             INT *pImplTypeFlags) = 0;
-        
-        virtual  HRESULT __stdcall GetIDsOfNames( 
-             LPOLESTR *rgszNames,
-             UINT cNames,
-             MEMBERID *pMemId) = 0;
-        
-        virtual  HRESULT __stdcall Invoke( 
-             PVOID pvInstance,
-             MEMBERID memid,
-             WORD wFlags,
-             DISPPARAMS *pDispParams,
-             VARIANT *pVarResult,
-             EXCEPINFO *pExcepInfo,
-             UINT *puArgErr) = 0;
-        
-        virtual  HRESULT __stdcall GetDocumentation( 
-             MEMBERID memid,
-             BSTR *pBstrName,
-             BSTR *pBstrDocString,
-             DWORD *pdwHelpContext,
-             BSTR *pBstrHelpFile) = 0;
-        
-        virtual  HRESULT __stdcall GetDllEntry( 
-             MEMBERID memid,
-             INVOKEKIND invKind,
-             BSTR *pBstrDllName,
-             BSTR *pBstrName,
-             WORD *pwOrdinal) = 0;
-        
-        virtual HRESULT __stdcall GetRefTypeInfo( 
-             HREFTYPE hRefType,
-             ITypeInfo **ppTInfo) = 0;
-        
-        virtual  HRESULT __stdcall AddressOfMember( 
-             MEMBERID memid,
-             INVOKEKIND invKind,
-             PVOID *ppv) = 0;
-        
-        virtual  HRESULT __stdcall CreateInstance( 
-             IUnknown *pUnkOuter,
-             const IID & riid,
-             PVOID *ppvObj) = 0;
-        
-        virtual HRESULT __stdcall GetMops( 
-             MEMBERID memid,
-             BSTR *pBstrMops) = 0;
-        
-        virtual  HRESULT __stdcall GetContainingTypeLib( 
-             ITypeLib **ppTLib,
-             UINT *pIndex) = 0;
-        
-        virtual  void __stdcall ReleaseTypeAttr( 
-             TYPEATTR *pTypeAttr) = 0;
-        
-        virtual  void __stdcall ReleaseFuncDesc( 
-             FUNCDESC *pFuncDesc) = 0;
-        
-        virtual  void __stdcall ReleaseVarDesc( 
-             VARDESC *pVarDesc) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall ITypeInfo_RemoteGetTypeAttr_Proxy( 
-    ITypeInfo * This,
-     LPTYPEATTR *ppTypeAttr,
-     CLEANLOCALSTORAGE *pDummy);
-
-
-void __stdcall ITypeInfo_RemoteGetTypeAttr_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo_GetTypeComp_Proxy( 
-    ITypeInfo * This,
-     ITypeComp **ppTComp);
-
-
-void __stdcall ITypeInfo_GetTypeComp_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeInfo_RemoteGetFuncDesc_Proxy( 
-    ITypeInfo * This,
-     UINT index,
-     LPFUNCDESC *ppFuncDesc,
-     CLEANLOCALSTORAGE *pDummy);
-
-
-void __stdcall ITypeInfo_RemoteGetFuncDesc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeInfo_RemoteGetVarDesc_Proxy( 
-    ITypeInfo * This,
-     UINT index,
-     LPVARDESC *ppVarDesc,
-     CLEANLOCALSTORAGE *pDummy);
-
-
-void __stdcall ITypeInfo_RemoteGetVarDesc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeInfo_RemoteGetNames_Proxy( 
-    ITypeInfo * This,
-     MEMBERID memid,
-     BSTR *rgBstrNames,
-     UINT cMaxNames,
-     UINT *pcNames);
-
-
-void __stdcall ITypeInfo_RemoteGetNames_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo_GetRefTypeOfImplType_Proxy( 
-    ITypeInfo * This,
-     UINT index,
-     HREFTYPE *pRefType);
-
-
-void __stdcall ITypeInfo_GetRefTypeOfImplType_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo_GetImplTypeFlags_Proxy( 
-    ITypeInfo * This,
-     UINT index,
-     INT *pImplTypeFlags);
-
-
-void __stdcall ITypeInfo_GetImplTypeFlags_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeInfo_LocalGetIDsOfNames_Proxy( 
-    ITypeInfo * This);
-
-
-void __stdcall ITypeInfo_LocalGetIDsOfNames_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeInfo_LocalInvoke_Proxy( 
-    ITypeInfo * This);
-
-
-void __stdcall ITypeInfo_LocalInvoke_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeInfo_RemoteGetDocumentation_Proxy( 
-    ITypeInfo * This,
-     MEMBERID memid,
-     DWORD refPtrFlags,
-     BSTR *pBstrName,
-     BSTR *pBstrDocString,
-     DWORD *pdwHelpContext,
-     BSTR *pBstrHelpFile);
-
-
-void __stdcall ITypeInfo_RemoteGetDocumentation_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeInfo_RemoteGetDllEntry_Proxy( 
-    ITypeInfo * This,
-     MEMBERID memid,
-     INVOKEKIND invKind,
-     DWORD refPtrFlags,
-     BSTR *pBstrDllName,
-     BSTR *pBstrName,
-     WORD *pwOrdinal);
-
-
-void __stdcall ITypeInfo_RemoteGetDllEntry_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo_GetRefTypeInfo_Proxy( 
-    ITypeInfo * This,
-     HREFTYPE hRefType,
-     ITypeInfo **ppTInfo);
-
-
-void __stdcall ITypeInfo_GetRefTypeInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeInfo_LocalAddressOfMember_Proxy( 
-    ITypeInfo * This);
-
-
-void __stdcall ITypeInfo_LocalAddressOfMember_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeInfo_RemoteCreateInstance_Proxy( 
-    ITypeInfo * This,
-     const IID & riid,
-     IUnknown **ppvObj);
-
-
-void __stdcall ITypeInfo_RemoteCreateInstance_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo_GetMops_Proxy( 
-    ITypeInfo * This,
-     MEMBERID memid,
-     BSTR *pBstrMops);
-
-
-void __stdcall ITypeInfo_GetMops_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeInfo_RemoteGetContainingTypeLib_Proxy( 
-    ITypeInfo * This,
-     ITypeLib **ppTLib,
-     UINT *pIndex);
-
-
-void __stdcall ITypeInfo_RemoteGetContainingTypeLib_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeInfo_LocalReleaseTypeAttr_Proxy( 
-    ITypeInfo * This);
-
-
-void __stdcall ITypeInfo_LocalReleaseTypeAttr_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeInfo_LocalReleaseFuncDesc_Proxy( 
-    ITypeInfo * This);
-
-
-void __stdcall ITypeInfo_LocalReleaseFuncDesc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeInfo_LocalReleaseVarDesc_Proxy( 
-    ITypeInfo * This);
-
-
-void __stdcall ITypeInfo_LocalReleaseVarDesc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  ITypeInfo2 *LPTYPEINFO2;
-
-
-extern "C" const IID IID_ITypeInfo2;
-
-
-    
-    struct __declspec(uuid("00020412-0000-0000-C000-000000000046")) __declspec(novtable)
-    ITypeInfo2 : public ITypeInfo
-    {
-    public:
-        virtual HRESULT __stdcall GetTypeKind( 
-             TYPEKIND *pTypeKind) = 0;
-        
-        virtual HRESULT __stdcall GetTypeFlags( 
-             ULONG *pTypeFlags) = 0;
-        
-        virtual HRESULT __stdcall GetFuncIndexOfMemId( 
-             MEMBERID memid,
-             INVOKEKIND invKind,
-             UINT *pFuncIndex) = 0;
-        
-        virtual HRESULT __stdcall GetVarIndexOfMemId( 
-             MEMBERID memid,
-             UINT *pVarIndex) = 0;
-        
-        virtual HRESULT __stdcall GetCustData( 
-             const GUID & guid,
-             VARIANT *pVarVal) = 0;
-        
-        virtual HRESULT __stdcall GetFuncCustData( 
-             UINT index,
-             const GUID & guid,
-             VARIANT *pVarVal) = 0;
-        
-        virtual HRESULT __stdcall GetParamCustData( 
-             UINT indexFunc,
-             UINT indexParam,
-             const GUID & guid,
-             VARIANT *pVarVal) = 0;
-        
-        virtual HRESULT __stdcall GetVarCustData( 
-             UINT index,
-             const GUID & guid,
-             VARIANT *pVarVal) = 0;
-        
-        virtual HRESULT __stdcall GetImplTypeCustData( 
-             UINT index,
-             const GUID & guid,
-             VARIANT *pVarVal) = 0;
-        
-        virtual  HRESULT __stdcall GetDocumentation2( 
-             MEMBERID memid,
-             LCID lcid,
-             BSTR *pbstrHelpString,
-             DWORD *pdwHelpStringContext,
-             BSTR *pbstrHelpStringDll) = 0;
-        
-        virtual HRESULT __stdcall GetAllCustData( 
-             CUSTDATA *pCustData) = 0;
-        
-        virtual HRESULT __stdcall GetAllFuncCustData( 
-             UINT index,
-             CUSTDATA *pCustData) = 0;
-        
-        virtual HRESULT __stdcall GetAllParamCustData( 
-             UINT indexFunc,
-             UINT indexParam,
-             CUSTDATA *pCustData) = 0;
-        
-        virtual HRESULT __stdcall GetAllVarCustData( 
-             UINT index,
-             CUSTDATA *pCustData) = 0;
-        
-        virtual HRESULT __stdcall GetAllImplTypeCustData( 
-             UINT index,
-             CUSTDATA *pCustData) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ITypeInfo2_GetTypeKind_Proxy( 
-    ITypeInfo2 * This,
-     TYPEKIND *pTypeKind);
-
-
-void __stdcall ITypeInfo2_GetTypeKind_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo2_GetTypeFlags_Proxy( 
-    ITypeInfo2 * This,
-     ULONG *pTypeFlags);
-
-
-void __stdcall ITypeInfo2_GetTypeFlags_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo2_GetFuncIndexOfMemId_Proxy( 
-    ITypeInfo2 * This,
-     MEMBERID memid,
-     INVOKEKIND invKind,
-     UINT *pFuncIndex);
-
-
-void __stdcall ITypeInfo2_GetFuncIndexOfMemId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo2_GetVarIndexOfMemId_Proxy( 
-    ITypeInfo2 * This,
-     MEMBERID memid,
-     UINT *pVarIndex);
-
-
-void __stdcall ITypeInfo2_GetVarIndexOfMemId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo2_GetCustData_Proxy( 
-    ITypeInfo2 * This,
-     const GUID & guid,
-     VARIANT *pVarVal);
-
-
-void __stdcall ITypeInfo2_GetCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo2_GetFuncCustData_Proxy( 
-    ITypeInfo2 * This,
-     UINT index,
-     const GUID & guid,
-     VARIANT *pVarVal);
-
-
-void __stdcall ITypeInfo2_GetFuncCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo2_GetParamCustData_Proxy( 
-    ITypeInfo2 * This,
-     UINT indexFunc,
-     UINT indexParam,
-     const GUID & guid,
-     VARIANT *pVarVal);
-
-
-void __stdcall ITypeInfo2_GetParamCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo2_GetVarCustData_Proxy( 
-    ITypeInfo2 * This,
-     UINT index,
-     const GUID & guid,
-     VARIANT *pVarVal);
-
-
-void __stdcall ITypeInfo2_GetVarCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo2_GetImplTypeCustData_Proxy( 
-    ITypeInfo2 * This,
-     UINT index,
-     const GUID & guid,
-     VARIANT *pVarVal);
-
-
-void __stdcall ITypeInfo2_GetImplTypeCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeInfo2_RemoteGetDocumentation2_Proxy( 
-    ITypeInfo2 * This,
-     MEMBERID memid,
-     LCID lcid,
-     DWORD refPtrFlags,
-     BSTR *pbstrHelpString,
-     DWORD *pdwHelpStringContext,
-     BSTR *pbstrHelpStringDll);
-
-
-void __stdcall ITypeInfo2_RemoteGetDocumentation2_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo2_GetAllCustData_Proxy( 
-    ITypeInfo2 * This,
-     CUSTDATA *pCustData);
-
-
-void __stdcall ITypeInfo2_GetAllCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo2_GetAllFuncCustData_Proxy( 
-    ITypeInfo2 * This,
-     UINT index,
-     CUSTDATA *pCustData);
-
-
-void __stdcall ITypeInfo2_GetAllFuncCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo2_GetAllParamCustData_Proxy( 
-    ITypeInfo2 * This,
-     UINT indexFunc,
-     UINT indexParam,
-     CUSTDATA *pCustData);
-
-
-void __stdcall ITypeInfo2_GetAllParamCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo2_GetAllVarCustData_Proxy( 
-    ITypeInfo2 * This,
-     UINT index,
-     CUSTDATA *pCustData);
-
-
-void __stdcall ITypeInfo2_GetAllVarCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeInfo2_GetAllImplTypeCustData_Proxy( 
-    ITypeInfo2 * This,
-     UINT index,
-     CUSTDATA *pCustData);
-
-
-void __stdcall ITypeInfo2_GetAllImplTypeCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  
-enum tagSYSKIND
-    {	SYS_WIN16	= 0,
-	SYS_WIN32	= SYS_WIN16 + 1,
-	SYS_MAC	= SYS_WIN32 + 1,
-	SYS_WIN64	= SYS_MAC + 1
-    } 	SYSKIND;
-
-typedef  
-enum tagLIBFLAGS
-    {	LIBFLAG_FRESTRICTED	= 0x1,
-	LIBFLAG_FCONTROL	= 0x2,
-	LIBFLAG_FHIDDEN	= 0x4,
-	LIBFLAG_FHASDISKIMAGE	= 0x8
-    } 	LIBFLAGS;
-
-typedef  ITypeLib *LPTYPELIB;
-
-typedef struct tagTLIBATTR
-    {
-    GUID guid;
-    LCID lcid;
-    SYSKIND syskind;
-    WORD wMajorVerNum;
-    WORD wMinorVerNum;
-    WORD wLibFlags;
-    } 	TLIBATTR;
-
-typedef struct tagTLIBATTR *LPTLIBATTR;
-
-
-extern "C" const IID IID_ITypeLib;
-
-
-    
-    struct __declspec(uuid("00020402-0000-0000-C000-000000000046")) __declspec(novtable)
-    ITypeLib : public IUnknown
-    {
-    public:
-        virtual  UINT __stdcall GetTypeInfoCount( void) = 0;
-        
-        virtual HRESULT __stdcall GetTypeInfo( 
-             UINT index,
-             ITypeInfo **ppTInfo) = 0;
-        
-        virtual HRESULT __stdcall GetTypeInfoType( 
-             UINT index,
-             TYPEKIND *pTKind) = 0;
-        
-        virtual HRESULT __stdcall GetTypeInfoOfGuid( 
-             const GUID & guid,
-             ITypeInfo **ppTinfo) = 0;
-        
-        virtual  HRESULT __stdcall GetLibAttr( 
-             TLIBATTR **ppTLibAttr) = 0;
-        
-        virtual HRESULT __stdcall GetTypeComp( 
-             ITypeComp **ppTComp) = 0;
-        
-        virtual  HRESULT __stdcall GetDocumentation( 
-             INT index,
-             BSTR *pBstrName,
-             BSTR *pBstrDocString,
-             DWORD *pdwHelpContext,
-             BSTR *pBstrHelpFile) = 0;
-        
-        virtual  HRESULT __stdcall IsName( 
-             LPOLESTR szNameBuf,
-             ULONG lHashVal,
-             BOOL *pfName) = 0;
-        
-        virtual  HRESULT __stdcall FindName( 
-             LPOLESTR szNameBuf,
-             ULONG lHashVal,
-             ITypeInfo **ppTInfo,
-             MEMBERID *rgMemId,
-             USHORT *pcFound) = 0;
-        
-        virtual  void __stdcall ReleaseTLibAttr( 
-             TLIBATTR *pTLibAttr) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall ITypeLib_RemoteGetTypeInfoCount_Proxy( 
-    ITypeLib * This,
-     UINT *pcTInfo);
-
-
-void __stdcall ITypeLib_RemoteGetTypeInfoCount_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeLib_GetTypeInfo_Proxy( 
-    ITypeLib * This,
-     UINT index,
-     ITypeInfo **ppTInfo);
-
-
-void __stdcall ITypeLib_GetTypeInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeLib_GetTypeInfoType_Proxy( 
-    ITypeLib * This,
-     UINT index,
-     TYPEKIND *pTKind);
-
-
-void __stdcall ITypeLib_GetTypeInfoType_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeLib_GetTypeInfoOfGuid_Proxy( 
-    ITypeLib * This,
-     const GUID & guid,
-     ITypeInfo **ppTinfo);
-
-
-void __stdcall ITypeLib_GetTypeInfoOfGuid_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeLib_RemoteGetLibAttr_Proxy( 
-    ITypeLib * This,
-     LPTLIBATTR *ppTLibAttr,
-     CLEANLOCALSTORAGE *pDummy);
-
-
-void __stdcall ITypeLib_RemoteGetLibAttr_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeLib_GetTypeComp_Proxy( 
-    ITypeLib * This,
-     ITypeComp **ppTComp);
-
-
-void __stdcall ITypeLib_GetTypeComp_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeLib_RemoteGetDocumentation_Proxy( 
-    ITypeLib * This,
-     INT index,
-     DWORD refPtrFlags,
-     BSTR *pBstrName,
-     BSTR *pBstrDocString,
-     DWORD *pdwHelpContext,
-     BSTR *pBstrHelpFile);
-
-
-void __stdcall ITypeLib_RemoteGetDocumentation_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeLib_RemoteIsName_Proxy( 
-    ITypeLib * This,
-     LPOLESTR szNameBuf,
-     ULONG lHashVal,
-     BOOL *pfName,
-     BSTR *pBstrLibName);
-
-
-void __stdcall ITypeLib_RemoteIsName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeLib_RemoteFindName_Proxy( 
-    ITypeLib * This,
-     LPOLESTR szNameBuf,
-     ULONG lHashVal,
-     ITypeInfo **ppTInfo,
-     MEMBERID *rgMemId,
-     USHORT *pcFound,
-     BSTR *pBstrLibName);
-
-
-void __stdcall ITypeLib_RemoteFindName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeLib_LocalReleaseTLibAttr_Proxy( 
-    ITypeLib * This);
-
-
-void __stdcall ITypeLib_LocalReleaseTLibAttr_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  ITypeLib2 *LPTYPELIB2;
-
-
-extern "C" const IID IID_ITypeLib2;
-
-
-    
-    struct __declspec(uuid("00020411-0000-0000-C000-000000000046")) __declspec(novtable)
-    ITypeLib2 : public ITypeLib
-    {
-    public:
-        virtual HRESULT __stdcall GetCustData( 
-             const GUID & guid,
-             VARIANT *pVarVal) = 0;
-        
-        virtual  HRESULT __stdcall GetLibStatistics( 
-             ULONG *pcUniqueNames,
-             ULONG *pcchUniqueNames) = 0;
-        
-        virtual  HRESULT __stdcall GetDocumentation2( 
-             INT index,
-             LCID lcid,
-             BSTR *pbstrHelpString,
-             DWORD *pdwHelpStringContext,
-             BSTR *pbstrHelpStringDll) = 0;
-        
-        virtual HRESULT __stdcall GetAllCustData( 
-             CUSTDATA *pCustData) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ITypeLib2_GetCustData_Proxy( 
-    ITypeLib2 * This,
-     const GUID & guid,
-     VARIANT *pVarVal);
-
-
-void __stdcall ITypeLib2_GetCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeLib2_RemoteGetLibStatistics_Proxy( 
-    ITypeLib2 * This,
-     ULONG *pcUniqueNames,
-     ULONG *pcchUniqueNames);
-
-
-void __stdcall ITypeLib2_RemoteGetLibStatistics_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ITypeLib2_RemoteGetDocumentation2_Proxy( 
-    ITypeLib2 * This,
-     INT index,
-     LCID lcid,
-     DWORD refPtrFlags,
-     BSTR *pbstrHelpString,
-     DWORD *pdwHelpStringContext,
-     BSTR *pbstrHelpStringDll);
-
-
-void __stdcall ITypeLib2_RemoteGetDocumentation2_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeLib2_GetAllCustData_Proxy( 
-    ITypeLib2 * This,
-     CUSTDATA *pCustData);
-
-
-void __stdcall ITypeLib2_GetAllCustData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  ITypeChangeEvents *LPTYPECHANGEEVENTS;
-
-typedef 
-enum tagCHANGEKIND
-    {	CHANGEKIND_ADDMEMBER	= 0,
-	CHANGEKIND_DELETEMEMBER	= CHANGEKIND_ADDMEMBER + 1,
-	CHANGEKIND_SETNAMES	= CHANGEKIND_DELETEMEMBER + 1,
-	CHANGEKIND_SETDOCUMENTATION	= CHANGEKIND_SETNAMES + 1,
-	CHANGEKIND_GENERAL	= CHANGEKIND_SETDOCUMENTATION + 1,
-	CHANGEKIND_INVALIDATE	= CHANGEKIND_GENERAL + 1,
-	CHANGEKIND_CHANGEFAILED	= CHANGEKIND_INVALIDATE + 1,
-	CHANGEKIND_MAX	= CHANGEKIND_CHANGEFAILED + 1
-    } 	CHANGEKIND;
-
-
-extern "C" const IID IID_ITypeChangeEvents;
-
-
-    
-    struct __declspec(uuid("00020410-0000-0000-C000-000000000046")) __declspec(novtable)
-    ITypeChangeEvents : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall RequestTypeChange( 
-             CHANGEKIND changeKind,
-             ITypeInfo *pTInfoBefore,
-             LPOLESTR pStrName,
-             INT *pfCancel) = 0;
-        
-        virtual HRESULT __stdcall AfterTypeChange( 
-             CHANGEKIND changeKind,
-             ITypeInfo *pTInfoAfter,
-             LPOLESTR pStrName) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ITypeChangeEvents_RequestTypeChange_Proxy( 
-    ITypeChangeEvents * This,
-     CHANGEKIND changeKind,
-     ITypeInfo *pTInfoBefore,
-     LPOLESTR pStrName,
-     INT *pfCancel);
-
-
-void __stdcall ITypeChangeEvents_RequestTypeChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeChangeEvents_AfterTypeChange_Proxy( 
-    ITypeChangeEvents * This,
-     CHANGEKIND changeKind,
-     ITypeInfo *pTInfoAfter,
-     LPOLESTR pStrName);
-
-
-void __stdcall ITypeChangeEvents_AfterTypeChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IErrorInfo *LPERRORINFO;
-
-
-extern "C" const IID IID_IErrorInfo;
-
-
-    
-    struct __declspec(uuid("1CF2B120-547D-101B-8E65-08002B2BD119")) __declspec(novtable)
-    IErrorInfo : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetGUID( 
-             GUID *pGUID) = 0;
-        
-        virtual HRESULT __stdcall GetSource( 
-             BSTR *pBstrSource) = 0;
-        
-        virtual HRESULT __stdcall GetDescription( 
-             BSTR *pBstrDescription) = 0;
-        
-        virtual HRESULT __stdcall GetHelpFile( 
-             BSTR *pBstrHelpFile) = 0;
-        
-        virtual HRESULT __stdcall GetHelpContext( 
-             DWORD *pdwHelpContext) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IErrorInfo_GetGUID_Proxy( 
-    IErrorInfo * This,
-     GUID *pGUID);
-
-
-void __stdcall IErrorInfo_GetGUID_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IErrorInfo_GetSource_Proxy( 
-    IErrorInfo * This,
-     BSTR *pBstrSource);
-
-
-void __stdcall IErrorInfo_GetSource_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IErrorInfo_GetDescription_Proxy( 
-    IErrorInfo * This,
-     BSTR *pBstrDescription);
-
-
-void __stdcall IErrorInfo_GetDescription_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IErrorInfo_GetHelpFile_Proxy( 
-    IErrorInfo * This,
-     BSTR *pBstrHelpFile);
-
-
-void __stdcall IErrorInfo_GetHelpFile_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IErrorInfo_GetHelpContext_Proxy( 
-    IErrorInfo * This,
-     DWORD *pdwHelpContext);
-
-
-void __stdcall IErrorInfo_GetHelpContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  ICreateErrorInfo *LPCREATEERRORINFO;
-
-
-extern "C" const IID IID_ICreateErrorInfo;
-
-
-    
-    struct __declspec(uuid("22F03340-547D-101B-8E65-08002B2BD119")) __declspec(novtable)
-    ICreateErrorInfo : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall SetGUID( 
-             const GUID & rguid) = 0;
-        
-        virtual HRESULT __stdcall SetSource( 
-             LPOLESTR szSource) = 0;
-        
-        virtual HRESULT __stdcall SetDescription( 
-             LPOLESTR szDescription) = 0;
-        
-        virtual HRESULT __stdcall SetHelpFile( 
-             LPOLESTR szHelpFile) = 0;
-        
-        virtual HRESULT __stdcall SetHelpContext( 
-             DWORD dwHelpContext) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ICreateErrorInfo_SetGUID_Proxy( 
-    ICreateErrorInfo * This,
-     const GUID & rguid);
-
-
-void __stdcall ICreateErrorInfo_SetGUID_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateErrorInfo_SetSource_Proxy( 
-    ICreateErrorInfo * This,
-     LPOLESTR szSource);
-
-
-void __stdcall ICreateErrorInfo_SetSource_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateErrorInfo_SetDescription_Proxy( 
-    ICreateErrorInfo * This,
-     LPOLESTR szDescription);
-
-
-void __stdcall ICreateErrorInfo_SetDescription_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateErrorInfo_SetHelpFile_Proxy( 
-    ICreateErrorInfo * This,
-     LPOLESTR szHelpFile);
-
-
-void __stdcall ICreateErrorInfo_SetHelpFile_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICreateErrorInfo_SetHelpContext_Proxy( 
-    ICreateErrorInfo * This,
-     DWORD dwHelpContext);
-
-
-void __stdcall ICreateErrorInfo_SetHelpContext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  ISupportErrorInfo *LPSUPPORTERRORINFO;
-
-
-extern "C" const IID IID_ISupportErrorInfo;
-
-
-    
-    struct __declspec(uuid("DF0B3D60-548F-101B-8E65-08002B2BD119")) __declspec(novtable)
-    ISupportErrorInfo : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall InterfaceSupportsErrorInfo( 
-             const IID & riid) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ISupportErrorInfo_InterfaceSupportsErrorInfo_Proxy( 
-    ISupportErrorInfo * This,
-     const IID & riid);
-
-
-void __stdcall ISupportErrorInfo_InterfaceSupportsErrorInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_ITypeFactory;
-
-
-    
-    struct __declspec(uuid("0000002E-0000-0000-C000-000000000046")) __declspec(novtable)
-    ITypeFactory : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall CreateFromTypeInfo( 
-             ITypeInfo *pTypeInfo,
-             const IID & riid,
-             IUnknown **ppv) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ITypeFactory_CreateFromTypeInfo_Proxy( 
-    ITypeFactory * This,
-     ITypeInfo *pTypeInfo,
-     const IID & riid,
-     IUnknown **ppv);
-
-
-void __stdcall ITypeFactory_CreateFromTypeInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_ITypeMarshal;
-
-
-    
-    struct __declspec(uuid("0000002D-0000-0000-C000-000000000046")) __declspec(novtable)
-    ITypeMarshal : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Size( 
-             PVOID pvType,
-             DWORD dwDestContext,
-             PVOID pvDestContext,
-             ULONG *pSize) = 0;
-        
-        virtual HRESULT __stdcall Marshal( 
-             PVOID pvType,
-             DWORD dwDestContext,
-             PVOID pvDestContext,
-             ULONG cbBufferLength,
-             BYTE *pBuffer,
-             ULONG *pcbWritten) = 0;
-        
-        virtual HRESULT __stdcall Unmarshal( 
-             PVOID pvType,
-             DWORD dwFlags,
-             ULONG cbBufferLength,
-             BYTE *pBuffer,
-             ULONG *pcbRead) = 0;
-        
-        virtual HRESULT __stdcall Free( 
-             PVOID pvType) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ITypeMarshal_Size_Proxy( 
-    ITypeMarshal * This,
-     PVOID pvType,
-     DWORD dwDestContext,
-     PVOID pvDestContext,
-     ULONG *pSize);
-
-
-void __stdcall ITypeMarshal_Size_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeMarshal_Marshal_Proxy( 
-    ITypeMarshal * This,
-     PVOID pvType,
-     DWORD dwDestContext,
-     PVOID pvDestContext,
-     ULONG cbBufferLength,
-     BYTE *pBuffer,
-     ULONG *pcbWritten);
-
-
-void __stdcall ITypeMarshal_Marshal_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeMarshal_Unmarshal_Proxy( 
-    ITypeMarshal * This,
-     PVOID pvType,
-     DWORD dwFlags,
-     ULONG cbBufferLength,
-     BYTE *pBuffer,
-     ULONG *pcbRead);
-
-
-void __stdcall ITypeMarshal_Unmarshal_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ITypeMarshal_Free_Proxy( 
-    ITypeMarshal * This,
-     PVOID pvType);
-
-
-void __stdcall ITypeMarshal_Free_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IRecordInfo *LPRECORDINFO;
-
-
-extern "C" const IID IID_IRecordInfo;
-
-
-    
-    struct __declspec(uuid("0000002F-0000-0000-C000-000000000046")) __declspec(novtable)
-    IRecordInfo : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall RecordInit( 
-             PVOID pvNew) = 0;
-        
-        virtual HRESULT __stdcall RecordClear( 
-             PVOID pvExisting) = 0;
-        
-        virtual HRESULT __stdcall RecordCopy( 
-             PVOID pvExisting,
-             PVOID pvNew) = 0;
-        
-        virtual HRESULT __stdcall GetGuid( 
-             GUID *pguid) = 0;
-        
-        virtual HRESULT __stdcall GetName( 
-             BSTR *pbstrName) = 0;
-        
-        virtual HRESULT __stdcall GetSize( 
-             ULONG *pcbSize) = 0;
-        
-        virtual HRESULT __stdcall GetTypeInfo( 
-             ITypeInfo **ppTypeInfo) = 0;
-        
-        virtual HRESULT __stdcall GetField( 
-             PVOID pvData,
-             LPCOLESTR szFieldName,
-             VARIANT *pvarField) = 0;
-        
-        virtual HRESULT __stdcall GetFieldNoCopy( 
-             PVOID pvData,
-             LPCOLESTR szFieldName,
-             VARIANT *pvarField,
-             PVOID *ppvDataCArray) = 0;
-        
-        virtual HRESULT __stdcall PutField( 
-             ULONG wFlags,
-             PVOID pvData,
-             LPCOLESTR szFieldName,
-             VARIANT *pvarField) = 0;
-        
-        virtual HRESULT __stdcall PutFieldNoCopy( 
-             ULONG wFlags,
-             PVOID pvData,
-             LPCOLESTR szFieldName,
-             VARIANT *pvarField) = 0;
-        
-        virtual HRESULT __stdcall GetFieldNames( 
-             ULONG *pcNames,
-             BSTR *rgBstrNames) = 0;
-        
-        virtual BOOL __stdcall IsMatchingType( 
-             IRecordInfo *pRecordInfo) = 0;
-        
-        virtual PVOID __stdcall RecordCreate( void) = 0;
-        
-        virtual HRESULT __stdcall RecordCreateCopy( 
-             PVOID pvSource,
-             PVOID *ppvDest) = 0;
-        
-        virtual HRESULT __stdcall RecordDestroy( 
-             PVOID pvRecord) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IRecordInfo_RecordInit_Proxy( 
-    IRecordInfo * This,
-     PVOID pvNew);
-
-
-void __stdcall IRecordInfo_RecordInit_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRecordInfo_RecordClear_Proxy( 
-    IRecordInfo * This,
-     PVOID pvExisting);
-
-
-void __stdcall IRecordInfo_RecordClear_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRecordInfo_RecordCopy_Proxy( 
-    IRecordInfo * This,
-     PVOID pvExisting,
-     PVOID pvNew);
-
-
-void __stdcall IRecordInfo_RecordCopy_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRecordInfo_GetGuid_Proxy( 
-    IRecordInfo * This,
-     GUID *pguid);
-
-
-void __stdcall IRecordInfo_GetGuid_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRecordInfo_GetName_Proxy( 
-    IRecordInfo * This,
-     BSTR *pbstrName);
-
-
-void __stdcall IRecordInfo_GetName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRecordInfo_GetSize_Proxy( 
-    IRecordInfo * This,
-     ULONG *pcbSize);
-
-
-void __stdcall IRecordInfo_GetSize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRecordInfo_GetTypeInfo_Proxy( 
-    IRecordInfo * This,
-     ITypeInfo **ppTypeInfo);
-
-
-void __stdcall IRecordInfo_GetTypeInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRecordInfo_GetField_Proxy( 
-    IRecordInfo * This,
-     PVOID pvData,
-     LPCOLESTR szFieldName,
-     VARIANT *pvarField);
-
-
-void __stdcall IRecordInfo_GetField_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRecordInfo_GetFieldNoCopy_Proxy( 
-    IRecordInfo * This,
-     PVOID pvData,
-     LPCOLESTR szFieldName,
-     VARIANT *pvarField,
-     PVOID *ppvDataCArray);
-
-
-void __stdcall IRecordInfo_GetFieldNoCopy_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRecordInfo_PutField_Proxy( 
-    IRecordInfo * This,
-     ULONG wFlags,
-     PVOID pvData,
-     LPCOLESTR szFieldName,
-     VARIANT *pvarField);
-
-
-void __stdcall IRecordInfo_PutField_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRecordInfo_PutFieldNoCopy_Proxy( 
-    IRecordInfo * This,
-     ULONG wFlags,
-     PVOID pvData,
-     LPCOLESTR szFieldName,
-     VARIANT *pvarField);
-
-
-void __stdcall IRecordInfo_PutFieldNoCopy_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRecordInfo_GetFieldNames_Proxy( 
-    IRecordInfo * This,
-     ULONG *pcNames,
-     BSTR *rgBstrNames);
-
-
-void __stdcall IRecordInfo_GetFieldNames_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-BOOL __stdcall IRecordInfo_IsMatchingType_Proxy( 
-    IRecordInfo * This,
-     IRecordInfo *pRecordInfo);
-
-
-void __stdcall IRecordInfo_IsMatchingType_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-PVOID __stdcall IRecordInfo_RecordCreate_Proxy( 
-    IRecordInfo * This);
-
-
-void __stdcall IRecordInfo_RecordCreate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRecordInfo_RecordCreateCopy_Proxy( 
-    IRecordInfo * This,
-     PVOID pvSource,
-     PVOID *ppvDest);
-
-
-void __stdcall IRecordInfo_RecordCreateCopy_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRecordInfo_RecordDestroy_Proxy( 
-    IRecordInfo * This,
-     PVOID pvRecord);
-
-
-void __stdcall IRecordInfo_RecordDestroy_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IErrorLog *LPERRORLOG;
-
-
-extern "C" const IID IID_IErrorLog;
-
-
-    
-    struct __declspec(uuid("3127CA40-446E-11CE-8135-00AA004BB851")) __declspec(novtable)
-    IErrorLog : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall AddError( 
-             LPCOLESTR pszPropName,
-             EXCEPINFO *pExcepInfo) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IErrorLog_AddError_Proxy( 
-    IErrorLog * This,
-     LPCOLESTR pszPropName,
-     EXCEPINFO *pExcepInfo);
-
-
-void __stdcall IErrorLog_AddError_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IPropertyBag *LPPROPERTYBAG;
-
-
-extern "C" const IID IID_IPropertyBag;
-
-
-    
-    struct __declspec(uuid("55272A00-42CB-11CE-8135-00AA004BB851")) __declspec(novtable)
-    IPropertyBag : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Read( 
-             LPCOLESTR pszPropName,
-             VARIANT *pVar,
-             IErrorLog *pErrorLog) = 0;
-        
-        virtual HRESULT __stdcall Write( 
-             LPCOLESTR pszPropName,
-             VARIANT *pVar) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IPropertyBag_RemoteRead_Proxy( 
-    IPropertyBag * This,
-     LPCOLESTR pszPropName,
-     VARIANT *pVar,
-     IErrorLog *pErrorLog,
-     DWORD varType,
-     IUnknown *pUnkObj);
-
-
-void __stdcall IPropertyBag_RemoteRead_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyBag_Write_Proxy( 
-    IPropertyBag * This,
-     LPCOLESTR pszPropName,
-     VARIANT *pVar);
-
-
-void __stdcall IPropertyBag_Write_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-#pragma warning(pop)
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_oaidl_0114_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_oaidl_0114_v0_0_s_ifspec;
-
-
-
-unsigned long             __stdcall  BSTR_UserSize(     unsigned long *, unsigned long            , BSTR * ); 
-unsigned char * __stdcall  BSTR_UserMarshal(  unsigned long *, unsigned char *, BSTR * ); 
-unsigned char * __stdcall  BSTR_UserUnmarshal(unsigned long *, unsigned char *, BSTR * ); 
-void                      __stdcall  BSTR_UserFree(     unsigned long *, BSTR * ); 
-
-unsigned long             __stdcall  CLEANLOCALSTORAGE_UserSize(     unsigned long *, unsigned long            , CLEANLOCALSTORAGE * ); 
-unsigned char * __stdcall  CLEANLOCALSTORAGE_UserMarshal(  unsigned long *, unsigned char *, CLEANLOCALSTORAGE * ); 
-unsigned char * __stdcall  CLEANLOCALSTORAGE_UserUnmarshal(unsigned long *, unsigned char *, CLEANLOCALSTORAGE * ); 
-void                      __stdcall  CLEANLOCALSTORAGE_UserFree(     unsigned long *, CLEANLOCALSTORAGE * ); 
-
-unsigned long             __stdcall  VARIANT_UserSize(     unsigned long *, unsigned long            , VARIANT * ); 
-unsigned char * __stdcall  VARIANT_UserMarshal(  unsigned long *, unsigned char *, VARIANT * ); 
-unsigned char * __stdcall  VARIANT_UserUnmarshal(unsigned long *, unsigned char *, VARIANT * ); 
-void                      __stdcall  VARIANT_UserFree(     unsigned long *, VARIANT * ); 
-
- HRESULT __stdcall IDispatch_Invoke_Proxy( 
-    IDispatch * This,
-     DISPID dispIdMember,
-     const IID & riid,
-     LCID lcid,
-     WORD wFlags,
-     DISPPARAMS *pDispParams,
-     VARIANT *pVarResult,
-     EXCEPINFO *pExcepInfo,
-     UINT *puArgErr);
-
-
- HRESULT __stdcall IDispatch_Invoke_Stub( 
-    IDispatch * This,
-     DISPID dispIdMember,
-     const IID & riid,
-     LCID lcid,
-     DWORD dwFlags,
-     DISPPARAMS *pDispParams,
-     VARIANT *pVarResult,
-     EXCEPINFO *pExcepInfo,
-     UINT *pArgErr,
-     UINT cVarRef,
-     UINT *rgVarRefIdx,
-     VARIANTARG *rgVarRef);
-
- HRESULT __stdcall IEnumVARIANT_Next_Proxy( 
-    IEnumVARIANT * This,
-     ULONG celt,
-     VARIANT *rgVar,
-     ULONG *pCeltFetched);
-
-
- HRESULT __stdcall IEnumVARIANT_Next_Stub( 
-    IEnumVARIANT * This,
-     ULONG celt,
-     VARIANT *rgVar,
-     ULONG *pCeltFetched);
-
- HRESULT __stdcall ITypeComp_Bind_Proxy( 
-    ITypeComp * This,
-     LPOLESTR szName,
-     ULONG lHashVal,
-     WORD wFlags,
-     ITypeInfo **ppTInfo,
-     DESCKIND *pDescKind,
-     BINDPTR *pBindPtr);
-
-
- HRESULT __stdcall ITypeComp_Bind_Stub( 
-    ITypeComp * This,
-     LPOLESTR szName,
-     ULONG lHashVal,
-     WORD wFlags,
-     ITypeInfo **ppTInfo,
-     DESCKIND *pDescKind,
-     LPFUNCDESC *ppFuncDesc,
-     LPVARDESC *ppVarDesc,
-     ITypeComp **ppTypeComp,
-     CLEANLOCALSTORAGE *pDummy);
-
- HRESULT __stdcall ITypeComp_BindType_Proxy( 
-    ITypeComp * This,
-     LPOLESTR szName,
-     ULONG lHashVal,
-     ITypeInfo **ppTInfo,
-     ITypeComp **ppTComp);
-
-
- HRESULT __stdcall ITypeComp_BindType_Stub( 
-    ITypeComp * This,
-     LPOLESTR szName,
-     ULONG lHashVal,
-     ITypeInfo **ppTInfo);
-
- HRESULT __stdcall ITypeInfo_GetTypeAttr_Proxy( 
-    ITypeInfo * This,
-     TYPEATTR **ppTypeAttr);
-
-
- HRESULT __stdcall ITypeInfo_GetTypeAttr_Stub( 
-    ITypeInfo * This,
-     LPTYPEATTR *ppTypeAttr,
-     CLEANLOCALSTORAGE *pDummy);
-
- HRESULT __stdcall ITypeInfo_GetFuncDesc_Proxy( 
-    ITypeInfo * This,
-     UINT index,
-     FUNCDESC **ppFuncDesc);
-
-
- HRESULT __stdcall ITypeInfo_GetFuncDesc_Stub( 
-    ITypeInfo * This,
-     UINT index,
-     LPFUNCDESC *ppFuncDesc,
-     CLEANLOCALSTORAGE *pDummy);
-
- HRESULT __stdcall ITypeInfo_GetVarDesc_Proxy( 
-    ITypeInfo * This,
-     UINT index,
-     VARDESC **ppVarDesc);
-
-
- HRESULT __stdcall ITypeInfo_GetVarDesc_Stub( 
-    ITypeInfo * This,
-     UINT index,
-     LPVARDESC *ppVarDesc,
-     CLEANLOCALSTORAGE *pDummy);
-
- HRESULT __stdcall ITypeInfo_GetNames_Proxy( 
-    ITypeInfo * This,
-     MEMBERID memid,
-     BSTR *rgBstrNames,
-     UINT cMaxNames,
-     UINT *pcNames);
-
-
- HRESULT __stdcall ITypeInfo_GetNames_Stub( 
-    ITypeInfo * This,
-     MEMBERID memid,
-     BSTR *rgBstrNames,
-     UINT cMaxNames,
-     UINT *pcNames);
-
- HRESULT __stdcall ITypeInfo_GetIDsOfNames_Proxy( 
-    ITypeInfo * This,
-     LPOLESTR *rgszNames,
-     UINT cNames,
-     MEMBERID *pMemId);
-
-
- HRESULT __stdcall ITypeInfo_GetIDsOfNames_Stub( 
-    ITypeInfo * This);
-
- HRESULT __stdcall ITypeInfo_Invoke_Proxy( 
-    ITypeInfo * This,
-     PVOID pvInstance,
-     MEMBERID memid,
-     WORD wFlags,
-     DISPPARAMS *pDispParams,
-     VARIANT *pVarResult,
-     EXCEPINFO *pExcepInfo,
-     UINT *puArgErr);
-
-
- HRESULT __stdcall ITypeInfo_Invoke_Stub( 
-    ITypeInfo * This);
-
- HRESULT __stdcall ITypeInfo_GetDocumentation_Proxy( 
-    ITypeInfo * This,
-     MEMBERID memid,
-     BSTR *pBstrName,
-     BSTR *pBstrDocString,
-     DWORD *pdwHelpContext,
-     BSTR *pBstrHelpFile);
-
-
- HRESULT __stdcall ITypeInfo_GetDocumentation_Stub( 
-    ITypeInfo * This,
-     MEMBERID memid,
-     DWORD refPtrFlags,
-     BSTR *pBstrName,
-     BSTR *pBstrDocString,
-     DWORD *pdwHelpContext,
-     BSTR *pBstrHelpFile);
-
- HRESULT __stdcall ITypeInfo_GetDllEntry_Proxy( 
-    ITypeInfo * This,
-     MEMBERID memid,
-     INVOKEKIND invKind,
-     BSTR *pBstrDllName,
-     BSTR *pBstrName,
-     WORD *pwOrdinal);
-
-
- HRESULT __stdcall ITypeInfo_GetDllEntry_Stub( 
-    ITypeInfo * This,
-     MEMBERID memid,
-     INVOKEKIND invKind,
-     DWORD refPtrFlags,
-     BSTR *pBstrDllName,
-     BSTR *pBstrName,
-     WORD *pwOrdinal);
-
- HRESULT __stdcall ITypeInfo_AddressOfMember_Proxy( 
-    ITypeInfo * This,
-     MEMBERID memid,
-     INVOKEKIND invKind,
-     PVOID *ppv);
-
-
- HRESULT __stdcall ITypeInfo_AddressOfMember_Stub( 
-    ITypeInfo * This);
-
- HRESULT __stdcall ITypeInfo_CreateInstance_Proxy( 
-    ITypeInfo * This,
-     IUnknown *pUnkOuter,
-     const IID & riid,
-     PVOID *ppvObj);
-
-
- HRESULT __stdcall ITypeInfo_CreateInstance_Stub( 
-    ITypeInfo * This,
-     const IID & riid,
-     IUnknown **ppvObj);
-
- HRESULT __stdcall ITypeInfo_GetContainingTypeLib_Proxy( 
-    ITypeInfo * This,
-     ITypeLib **ppTLib,
-     UINT *pIndex);
-
-
- HRESULT __stdcall ITypeInfo_GetContainingTypeLib_Stub( 
-    ITypeInfo * This,
-     ITypeLib **ppTLib,
-     UINT *pIndex);
-
- void __stdcall ITypeInfo_ReleaseTypeAttr_Proxy( 
-    ITypeInfo * This,
-     TYPEATTR *pTypeAttr);
-
-
- HRESULT __stdcall ITypeInfo_ReleaseTypeAttr_Stub( 
-    ITypeInfo * This);
-
- void __stdcall ITypeInfo_ReleaseFuncDesc_Proxy( 
-    ITypeInfo * This,
-     FUNCDESC *pFuncDesc);
-
-
- HRESULT __stdcall ITypeInfo_ReleaseFuncDesc_Stub( 
-    ITypeInfo * This);
-
- void __stdcall ITypeInfo_ReleaseVarDesc_Proxy( 
-    ITypeInfo * This,
-     VARDESC *pVarDesc);
-
-
- HRESULT __stdcall ITypeInfo_ReleaseVarDesc_Stub( 
-    ITypeInfo * This);
-
- HRESULT __stdcall ITypeInfo2_GetDocumentation2_Proxy( 
-    ITypeInfo2 * This,
-     MEMBERID memid,
-     LCID lcid,
-     BSTR *pbstrHelpString,
-     DWORD *pdwHelpStringContext,
-     BSTR *pbstrHelpStringDll);
-
-
- HRESULT __stdcall ITypeInfo2_GetDocumentation2_Stub( 
-    ITypeInfo2 * This,
-     MEMBERID memid,
-     LCID lcid,
-     DWORD refPtrFlags,
-     BSTR *pbstrHelpString,
-     DWORD *pdwHelpStringContext,
-     BSTR *pbstrHelpStringDll);
-
- UINT __stdcall ITypeLib_GetTypeInfoCount_Proxy( 
-    ITypeLib * This);
-
-
- HRESULT __stdcall ITypeLib_GetTypeInfoCount_Stub( 
-    ITypeLib * This,
-     UINT *pcTInfo);
-
- HRESULT __stdcall ITypeLib_GetLibAttr_Proxy( 
-    ITypeLib * This,
-     TLIBATTR **ppTLibAttr);
-
-
- HRESULT __stdcall ITypeLib_GetLibAttr_Stub( 
-    ITypeLib * This,
-     LPTLIBATTR *ppTLibAttr,
-     CLEANLOCALSTORAGE *pDummy);
-
- HRESULT __stdcall ITypeLib_GetDocumentation_Proxy( 
-    ITypeLib * This,
-     INT index,
-     BSTR *pBstrName,
-     BSTR *pBstrDocString,
-     DWORD *pdwHelpContext,
-     BSTR *pBstrHelpFile);
-
-
- HRESULT __stdcall ITypeLib_GetDocumentation_Stub( 
-    ITypeLib * This,
-     INT index,
-     DWORD refPtrFlags,
-     BSTR *pBstrName,
-     BSTR *pBstrDocString,
-     DWORD *pdwHelpContext,
-     BSTR *pBstrHelpFile);
-
- HRESULT __stdcall ITypeLib_IsName_Proxy( 
-    ITypeLib * This,
-     LPOLESTR szNameBuf,
-     ULONG lHashVal,
-     BOOL *pfName);
-
-
- HRESULT __stdcall ITypeLib_IsName_Stub( 
-    ITypeLib * This,
-     LPOLESTR szNameBuf,
-     ULONG lHashVal,
-     BOOL *pfName,
-     BSTR *pBstrLibName);
-
- HRESULT __stdcall ITypeLib_FindName_Proxy( 
-    ITypeLib * This,
-     LPOLESTR szNameBuf,
-     ULONG lHashVal,
-     ITypeInfo **ppTInfo,
-     MEMBERID *rgMemId,
-     USHORT *pcFound);
-
-
- HRESULT __stdcall ITypeLib_FindName_Stub( 
-    ITypeLib * This,
-     LPOLESTR szNameBuf,
-     ULONG lHashVal,
-     ITypeInfo **ppTInfo,
-     MEMBERID *rgMemId,
-     USHORT *pcFound,
-     BSTR *pBstrLibName);
-
- void __stdcall ITypeLib_ReleaseTLibAttr_Proxy( 
-    ITypeLib * This,
-     TLIBATTR *pTLibAttr);
-
-
- HRESULT __stdcall ITypeLib_ReleaseTLibAttr_Stub( 
-    ITypeLib * This);
-
- HRESULT __stdcall ITypeLib2_GetLibStatistics_Proxy( 
-    ITypeLib2 * This,
-     ULONG *pcUniqueNames,
-     ULONG *pcchUniqueNames);
-
-
- HRESULT __stdcall ITypeLib2_GetLibStatistics_Stub( 
-    ITypeLib2 * This,
-     ULONG *pcUniqueNames,
-     ULONG *pcchUniqueNames);
-
- HRESULT __stdcall ITypeLib2_GetDocumentation2_Proxy( 
-    ITypeLib2 * This,
-     INT index,
-     LCID lcid,
-     BSTR *pbstrHelpString,
-     DWORD *pdwHelpStringContext,
-     BSTR *pbstrHelpStringDll);
-
-
- HRESULT __stdcall ITypeLib2_GetDocumentation2_Stub( 
-    ITypeLib2 * This,
-     INT index,
-     LCID lcid,
-     DWORD refPtrFlags,
-     BSTR *pbstrHelpString,
-     DWORD *pdwHelpStringContext,
-     BSTR *pbstrHelpStringDll);
-
- HRESULT __stdcall IPropertyBag_Read_Proxy( 
-    IPropertyBag * This,
-     LPCOLESTR pszPropName,
-     VARIANT *pVar,
-     IErrorLog *pErrorLog);
-
-
- HRESULT __stdcall IPropertyBag_Read_Stub( 
-    IPropertyBag * This,
-     LPCOLESTR pszPropName,
-     VARIANT *pVar,
-     IErrorLog *pErrorLog,
-     DWORD varType,
-     IUnknown *pUnkObj);
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-extern "C"{
-
-
-void * __stdcall MIDL_user_allocate(size_t);
-void __stdcall MIDL_user_free( void * ); 
-
-
- 
-
-
-
-
-
-
-
-typedef struct _xml_error
-    {
-    unsigned int _nLine;
-    BSTR _pchBuf;
-    unsigned int _cchBuf;
-    unsigned int _ich;
-    BSTR _pszFound;
-    BSTR _pszExpected;
-    DWORD _reserved1;
-    DWORD _reserved2;
-    } 	XML_ERROR;
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_msxml_0000_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_msxml_0000_v0_0_s_ifspec;
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef  
-enum tagDOMNodeType
-    {	NODE_INVALID	= 0,
-	NODE_ELEMENT	= NODE_INVALID + 1,
-	NODE_ATTRIBUTE	= NODE_ELEMENT + 1,
-	NODE_TEXT	= NODE_ATTRIBUTE + 1,
-	NODE_CDATA_SECTION	= NODE_TEXT + 1,
-	NODE_ENTITY_REFERENCE	= NODE_CDATA_SECTION + 1,
-	NODE_ENTITY	= NODE_ENTITY_REFERENCE + 1,
-	NODE_PROCESSING_INSTRUCTION	= NODE_ENTITY + 1,
-	NODE_COMMENT	= NODE_PROCESSING_INSTRUCTION + 1,
-	NODE_DOCUMENT	= NODE_COMMENT + 1,
-	NODE_DOCUMENT_TYPE	= NODE_DOCUMENT + 1,
-	NODE_DOCUMENT_FRAGMENT	= NODE_DOCUMENT_TYPE + 1,
-	NODE_NOTATION	= NODE_DOCUMENT_FRAGMENT + 1
-    } 	DOMNodeType;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef  
-enum tagXMLEMEM_TYPE
-    {	XMLELEMTYPE_ELEMENT	= 0,
-	XMLELEMTYPE_TEXT	= XMLELEMTYPE_ELEMENT + 1,
-	XMLELEMTYPE_COMMENT	= XMLELEMTYPE_TEXT + 1,
-	XMLELEMTYPE_DOCUMENT	= XMLELEMTYPE_COMMENT + 1,
-	XMLELEMTYPE_DTD	= XMLELEMTYPE_DOCUMENT + 1,
-	XMLELEMTYPE_PI	= XMLELEMTYPE_DTD + 1,
-	XMLELEMTYPE_OTHER	= XMLELEMTYPE_PI + 1
-    } 	XMLELEM_TYPE;
-
-
-extern "C" const IID LIBID_MSXML;
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMImplementation;
-
-
-    
-    struct __declspec(uuid("2933BF8F-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
-    IXMLDOMImplementation : public IDispatch
-    {
-    public:
-        virtual  HRESULT __stdcall hasFeature( 
-             BSTR feature,
-             BSTR version,
-             VARIANT_BOOL *hasFeature) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDOMImplementation_hasFeature_Proxy( 
-    IXMLDOMImplementation * This,
-     BSTR feature,
-     BSTR version,
-     VARIANT_BOOL *hasFeature);
-
-
-void __stdcall IXMLDOMImplementation_hasFeature_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMNode;
-
-
-    
-    struct __declspec(uuid("2933BF80-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
-    IXMLDOMNode : public IDispatch
-    {
-    public:
-        virtual  HRESULT __stdcall get_nodeName( 
-             BSTR *name) = 0;
-        
-        virtual  HRESULT __stdcall get_nodeValue( 
-             VARIANT *value) = 0;
-        
-        virtual  HRESULT __stdcall put_nodeValue( 
-             VARIANT value) = 0;
-        
-        virtual  HRESULT __stdcall get_nodeType( 
-             DOMNodeType *type) = 0;
-        
-        virtual  HRESULT __stdcall get_parentNode( 
-             IXMLDOMNode **parent) = 0;
-        
-        virtual  HRESULT __stdcall get_childNodes( 
-             IXMLDOMNodeList **childList) = 0;
-        
-        virtual  HRESULT __stdcall get_firstChild( 
-             IXMLDOMNode **firstChild) = 0;
-        
-        virtual  HRESULT __stdcall get_lastChild( 
-             IXMLDOMNode **lastChild) = 0;
-        
-        virtual  HRESULT __stdcall get_previousSibling( 
-             IXMLDOMNode **previousSibling) = 0;
-        
-        virtual  HRESULT __stdcall get_nextSibling( 
-             IXMLDOMNode **nextSibling) = 0;
-        
-        virtual  HRESULT __stdcall get_attributes( 
-             IXMLDOMNamedNodeMap **attributeMap) = 0;
-        
-        virtual  HRESULT __stdcall insertBefore( 
-             IXMLDOMNode *newChild,
-             VARIANT refChild,
-             IXMLDOMNode **outNewChild) = 0;
-        
-        virtual  HRESULT __stdcall replaceChild( 
-             IXMLDOMNode *newChild,
-             IXMLDOMNode *oldChild,
-             IXMLDOMNode **outOldChild) = 0;
-        
-        virtual  HRESULT __stdcall removeChild( 
-             IXMLDOMNode *childNode,
-             IXMLDOMNode **oldChild) = 0;
-        
-        virtual  HRESULT __stdcall appendChild( 
-             IXMLDOMNode *newChild,
-             IXMLDOMNode **outNewChild) = 0;
-        
-        virtual  HRESULT __stdcall hasChildNodes( 
-             VARIANT_BOOL *hasChild) = 0;
-        
-        virtual  HRESULT __stdcall get_ownerDocument( 
-             IXMLDOMDocument **DOMDocument) = 0;
-        
-        virtual  HRESULT __stdcall cloneNode( 
-             VARIANT_BOOL deep,
-             IXMLDOMNode **cloneRoot) = 0;
-        
-        virtual  HRESULT __stdcall get_nodeTypeString( 
-             BSTR *nodeType) = 0;
-        
-        virtual  HRESULT __stdcall get_text( 
-             BSTR *text) = 0;
-        
-        virtual  HRESULT __stdcall put_text( 
-             BSTR text) = 0;
-        
-        virtual  HRESULT __stdcall get_specified( 
-             VARIANT_BOOL *isSpecified) = 0;
-        
-        virtual  HRESULT __stdcall get_definition( 
-             IXMLDOMNode **definitionNode) = 0;
-        
-        virtual  HRESULT __stdcall get_nodeTypedValue( 
-             VARIANT *typedValue) = 0;
-        
-        virtual  HRESULT __stdcall put_nodeTypedValue( 
-             VARIANT typedValue) = 0;
-        
-        virtual  HRESULT __stdcall get_dataType( 
-             VARIANT *dataTypeName) = 0;
-        
-        virtual  HRESULT __stdcall put_dataType( 
-             BSTR dataTypeName) = 0;
-        
-        virtual  HRESULT __stdcall get_xml( 
-             BSTR *xmlString) = 0;
-        
-        virtual  HRESULT __stdcall transformNode( 
-             IXMLDOMNode *stylesheet,
-             BSTR *xmlString) = 0;
-        
-        virtual  HRESULT __stdcall selectNodes( 
-             BSTR queryString,
-             IXMLDOMNodeList **resultList) = 0;
-        
-        virtual  HRESULT __stdcall selectSingleNode( 
-             BSTR queryString,
-             IXMLDOMNode **resultNode) = 0;
-        
-        virtual  HRESULT __stdcall get_parsed( 
-             VARIANT_BOOL *isParsed) = 0;
-        
-        virtual  HRESULT __stdcall get_namespaceURI( 
-             BSTR *namespaceURI) = 0;
-        
-        virtual  HRESULT __stdcall get_prefix( 
-             BSTR *prefixString) = 0;
-        
-        virtual  HRESULT __stdcall get_baseName( 
-             BSTR *nameString) = 0;
-        
-        virtual  HRESULT __stdcall transformNodeToObject( 
-             IXMLDOMNode *stylesheet,
-             VARIANT outputObject) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDOMNode_get_nodeName_Proxy( 
-    IXMLDOMNode * This,
-     BSTR *name);
-
-
-void __stdcall IXMLDOMNode_get_nodeName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_nodeValue_Proxy( 
-    IXMLDOMNode * This,
-     VARIANT *value);
-
-
-void __stdcall IXMLDOMNode_get_nodeValue_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_put_nodeValue_Proxy( 
-    IXMLDOMNode * This,
-     VARIANT value);
-
-
-void __stdcall IXMLDOMNode_put_nodeValue_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_nodeType_Proxy( 
-    IXMLDOMNode * This,
-     DOMNodeType *type);
-
-
-void __stdcall IXMLDOMNode_get_nodeType_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_parentNode_Proxy( 
-    IXMLDOMNode * This,
-     IXMLDOMNode **parent);
-
-
-void __stdcall IXMLDOMNode_get_parentNode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_childNodes_Proxy( 
-    IXMLDOMNode * This,
-     IXMLDOMNodeList **childList);
-
-
-void __stdcall IXMLDOMNode_get_childNodes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_firstChild_Proxy( 
-    IXMLDOMNode * This,
-     IXMLDOMNode **firstChild);
-
-
-void __stdcall IXMLDOMNode_get_firstChild_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_lastChild_Proxy( 
-    IXMLDOMNode * This,
-     IXMLDOMNode **lastChild);
-
-
-void __stdcall IXMLDOMNode_get_lastChild_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_previousSibling_Proxy( 
-    IXMLDOMNode * This,
-     IXMLDOMNode **previousSibling);
-
-
-void __stdcall IXMLDOMNode_get_previousSibling_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_nextSibling_Proxy( 
-    IXMLDOMNode * This,
-     IXMLDOMNode **nextSibling);
-
-
-void __stdcall IXMLDOMNode_get_nextSibling_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_attributes_Proxy( 
-    IXMLDOMNode * This,
-     IXMLDOMNamedNodeMap **attributeMap);
-
-
-void __stdcall IXMLDOMNode_get_attributes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_insertBefore_Proxy( 
-    IXMLDOMNode * This,
-     IXMLDOMNode *newChild,
-     VARIANT refChild,
-     IXMLDOMNode **outNewChild);
-
-
-void __stdcall IXMLDOMNode_insertBefore_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_replaceChild_Proxy( 
-    IXMLDOMNode * This,
-     IXMLDOMNode *newChild,
-     IXMLDOMNode *oldChild,
-     IXMLDOMNode **outOldChild);
-
-
-void __stdcall IXMLDOMNode_replaceChild_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_removeChild_Proxy( 
-    IXMLDOMNode * This,
-     IXMLDOMNode *childNode,
-     IXMLDOMNode **oldChild);
-
-
-void __stdcall IXMLDOMNode_removeChild_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_appendChild_Proxy( 
-    IXMLDOMNode * This,
-     IXMLDOMNode *newChild,
-     IXMLDOMNode **outNewChild);
-
-
-void __stdcall IXMLDOMNode_appendChild_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_hasChildNodes_Proxy( 
-    IXMLDOMNode * This,
-     VARIANT_BOOL *hasChild);
-
-
-void __stdcall IXMLDOMNode_hasChildNodes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_ownerDocument_Proxy( 
-    IXMLDOMNode * This,
-     IXMLDOMDocument **DOMDocument);
-
-
-void __stdcall IXMLDOMNode_get_ownerDocument_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_cloneNode_Proxy( 
-    IXMLDOMNode * This,
-     VARIANT_BOOL deep,
-     IXMLDOMNode **cloneRoot);
-
-
-void __stdcall IXMLDOMNode_cloneNode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_nodeTypeString_Proxy( 
-    IXMLDOMNode * This,
-     BSTR *nodeType);
-
-
-void __stdcall IXMLDOMNode_get_nodeTypeString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_text_Proxy( 
-    IXMLDOMNode * This,
-     BSTR *text);
-
-
-void __stdcall IXMLDOMNode_get_text_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_put_text_Proxy( 
-    IXMLDOMNode * This,
-     BSTR text);
-
-
-void __stdcall IXMLDOMNode_put_text_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_specified_Proxy( 
-    IXMLDOMNode * This,
-     VARIANT_BOOL *isSpecified);
-
-
-void __stdcall IXMLDOMNode_get_specified_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_definition_Proxy( 
-    IXMLDOMNode * This,
-     IXMLDOMNode **definitionNode);
-
-
-void __stdcall IXMLDOMNode_get_definition_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_nodeTypedValue_Proxy( 
-    IXMLDOMNode * This,
-     VARIANT *typedValue);
-
-
-void __stdcall IXMLDOMNode_get_nodeTypedValue_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_put_nodeTypedValue_Proxy( 
-    IXMLDOMNode * This,
-     VARIANT typedValue);
-
-
-void __stdcall IXMLDOMNode_put_nodeTypedValue_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_dataType_Proxy( 
-    IXMLDOMNode * This,
-     VARIANT *dataTypeName);
-
-
-void __stdcall IXMLDOMNode_get_dataType_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_put_dataType_Proxy( 
-    IXMLDOMNode * This,
-     BSTR dataTypeName);
-
-
-void __stdcall IXMLDOMNode_put_dataType_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_xml_Proxy( 
-    IXMLDOMNode * This,
-     BSTR *xmlString);
-
-
-void __stdcall IXMLDOMNode_get_xml_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_transformNode_Proxy( 
-    IXMLDOMNode * This,
-     IXMLDOMNode *stylesheet,
-     BSTR *xmlString);
-
-
-void __stdcall IXMLDOMNode_transformNode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_selectNodes_Proxy( 
-    IXMLDOMNode * This,
-     BSTR queryString,
-     IXMLDOMNodeList **resultList);
-
-
-void __stdcall IXMLDOMNode_selectNodes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_selectSingleNode_Proxy( 
-    IXMLDOMNode * This,
-     BSTR queryString,
-     IXMLDOMNode **resultNode);
-
-
-void __stdcall IXMLDOMNode_selectSingleNode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_parsed_Proxy( 
-    IXMLDOMNode * This,
-     VARIANT_BOOL *isParsed);
-
-
-void __stdcall IXMLDOMNode_get_parsed_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_namespaceURI_Proxy( 
-    IXMLDOMNode * This,
-     BSTR *namespaceURI);
-
-
-void __stdcall IXMLDOMNode_get_namespaceURI_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_prefix_Proxy( 
-    IXMLDOMNode * This,
-     BSTR *prefixString);
-
-
-void __stdcall IXMLDOMNode_get_prefix_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_get_baseName_Proxy( 
-    IXMLDOMNode * This,
-     BSTR *nameString);
-
-
-void __stdcall IXMLDOMNode_get_baseName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNode_transformNodeToObject_Proxy( 
-    IXMLDOMNode * This,
-     IXMLDOMNode *stylesheet,
-     VARIANT outputObject);
-
-
-void __stdcall IXMLDOMNode_transformNodeToObject_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMDocumentFragment;
-
-
-    
-    struct __declspec(uuid("3efaa413-272f-11d2-836f-0000f87a7782")) __declspec(novtable)
-    IXMLDOMDocumentFragment : public IXMLDOMNode
-    {
-    public:
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMDocument;
-
-
-    
-    struct __declspec(uuid("2933BF81-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
-    IXMLDOMDocument : public IXMLDOMNode
-    {
-    public:
-        virtual  HRESULT __stdcall get_doctype( 
-             IXMLDOMDocumentType **documentType) = 0;
-        
-        virtual  HRESULT __stdcall get_implementation( 
-             IXMLDOMImplementation **impl) = 0;
-        
-        virtual  HRESULT __stdcall get_documentElement( 
-             IXMLDOMElement **DOMElement) = 0;
-        
-        virtual  HRESULT __stdcall putref_documentElement( 
-             IXMLDOMElement *DOMElement) = 0;
-        
-        virtual  HRESULT __stdcall createElement( 
-             BSTR tagName,
-             IXMLDOMElement **element) = 0;
-        
-        virtual  HRESULT __stdcall createDocumentFragment( 
-             IXMLDOMDocumentFragment **docFrag) = 0;
-        
-        virtual  HRESULT __stdcall createTextNode( 
-             BSTR data,
-             IXMLDOMText **text) = 0;
-        
-        virtual  HRESULT __stdcall createComment( 
-             BSTR data,
-             IXMLDOMComment **comment) = 0;
-        
-        virtual  HRESULT __stdcall createCDATASection( 
-             BSTR data,
-             IXMLDOMCDATASection **cdata) = 0;
-        
-        virtual  HRESULT __stdcall createProcessingInstruction( 
-             BSTR target,
-             BSTR data,
-             IXMLDOMProcessingInstruction **pi) = 0;
-        
-        virtual  HRESULT __stdcall createAttribute( 
-             BSTR name,
-             IXMLDOMAttribute **attribute) = 0;
-        
-        virtual  HRESULT __stdcall createEntityReference( 
-             BSTR name,
-             IXMLDOMEntityReference **entityRef) = 0;
-        
-        virtual  HRESULT __stdcall getElementsByTagName( 
-             BSTR tagName,
-             IXMLDOMNodeList **resultList) = 0;
-        
-        virtual  HRESULT __stdcall createNode( 
-             VARIANT Type,
-             BSTR name,
-             BSTR namespaceURI,
-             IXMLDOMNode **node) = 0;
-        
-        virtual  HRESULT __stdcall nodeFromID( 
-             BSTR idString,
-             IXMLDOMNode **node) = 0;
-        
-        virtual  HRESULT __stdcall load( 
-             VARIANT xmlSource,
-             VARIANT_BOOL *isSuccessful) = 0;
-        
-        virtual  HRESULT __stdcall get_readyState( 
-             long *value) = 0;
-        
-        virtual  HRESULT __stdcall get_parseError( 
-             IXMLDOMParseError **errorObj) = 0;
-        
-        virtual  HRESULT __stdcall get_url( 
-             BSTR *urlString) = 0;
-        
-        virtual  HRESULT __stdcall get_async( 
-             VARIANT_BOOL *isAsync) = 0;
-        
-        virtual  HRESULT __stdcall put_async( 
-             VARIANT_BOOL isAsync) = 0;
-        
-        virtual  HRESULT __stdcall abort( void) = 0;
-        
-        virtual  HRESULT __stdcall loadXML( 
-             BSTR bstrXML,
-             VARIANT_BOOL *isSuccessful) = 0;
-        
-        virtual  HRESULT __stdcall save( 
-             VARIANT destination) = 0;
-        
-        virtual  HRESULT __stdcall get_validateOnParse( 
-             VARIANT_BOOL *isValidating) = 0;
-        
-        virtual  HRESULT __stdcall put_validateOnParse( 
-             VARIANT_BOOL isValidating) = 0;
-        
-        virtual  HRESULT __stdcall get_resolveExternals( 
-             VARIANT_BOOL *isResolving) = 0;
-        
-        virtual  HRESULT __stdcall put_resolveExternals( 
-             VARIANT_BOOL isResolving) = 0;
-        
-        virtual  HRESULT __stdcall get_preserveWhiteSpace( 
-             VARIANT_BOOL *isPreserving) = 0;
-        
-        virtual  HRESULT __stdcall put_preserveWhiteSpace( 
-             VARIANT_BOOL isPreserving) = 0;
-        
-        virtual  HRESULT __stdcall put_onreadystatechange( 
-             VARIANT readystatechangeSink) = 0;
-        
-        virtual  HRESULT __stdcall put_ondataavailable( 
-             VARIANT ondataavailableSink) = 0;
-        
-        virtual  HRESULT __stdcall put_ontransformnode( 
-             VARIANT ontransformnodeSink) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDOMDocument_get_doctype_Proxy( 
-    IXMLDOMDocument * This,
-     IXMLDOMDocumentType **documentType);
-
-
-void __stdcall IXMLDOMDocument_get_doctype_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_get_implementation_Proxy( 
-    IXMLDOMDocument * This,
-     IXMLDOMImplementation **impl);
-
-
-void __stdcall IXMLDOMDocument_get_implementation_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_get_documentElement_Proxy( 
-    IXMLDOMDocument * This,
-     IXMLDOMElement **DOMElement);
-
-
-void __stdcall IXMLDOMDocument_get_documentElement_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_putref_documentElement_Proxy( 
-    IXMLDOMDocument * This,
-     IXMLDOMElement *DOMElement);
-
-
-void __stdcall IXMLDOMDocument_putref_documentElement_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_createElement_Proxy( 
-    IXMLDOMDocument * This,
-     BSTR tagName,
-     IXMLDOMElement **element);
-
-
-void __stdcall IXMLDOMDocument_createElement_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_createDocumentFragment_Proxy( 
-    IXMLDOMDocument * This,
-     IXMLDOMDocumentFragment **docFrag);
-
-
-void __stdcall IXMLDOMDocument_createDocumentFragment_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_createTextNode_Proxy( 
-    IXMLDOMDocument * This,
-     BSTR data,
-     IXMLDOMText **text);
-
-
-void __stdcall IXMLDOMDocument_createTextNode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_createComment_Proxy( 
-    IXMLDOMDocument * This,
-     BSTR data,
-     IXMLDOMComment **comment);
-
-
-void __stdcall IXMLDOMDocument_createComment_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_createCDATASection_Proxy( 
-    IXMLDOMDocument * This,
-     BSTR data,
-     IXMLDOMCDATASection **cdata);
-
-
-void __stdcall IXMLDOMDocument_createCDATASection_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_createProcessingInstruction_Proxy( 
-    IXMLDOMDocument * This,
-     BSTR target,
-     BSTR data,
-     IXMLDOMProcessingInstruction **pi);
-
-
-void __stdcall IXMLDOMDocument_createProcessingInstruction_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_createAttribute_Proxy( 
-    IXMLDOMDocument * This,
-     BSTR name,
-     IXMLDOMAttribute **attribute);
-
-
-void __stdcall IXMLDOMDocument_createAttribute_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_createEntityReference_Proxy( 
-    IXMLDOMDocument * This,
-     BSTR name,
-     IXMLDOMEntityReference **entityRef);
-
-
-void __stdcall IXMLDOMDocument_createEntityReference_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_getElementsByTagName_Proxy( 
-    IXMLDOMDocument * This,
-     BSTR tagName,
-     IXMLDOMNodeList **resultList);
-
-
-void __stdcall IXMLDOMDocument_getElementsByTagName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_createNode_Proxy( 
-    IXMLDOMDocument * This,
-     VARIANT Type,
-     BSTR name,
-     BSTR namespaceURI,
-     IXMLDOMNode **node);
-
-
-void __stdcall IXMLDOMDocument_createNode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_nodeFromID_Proxy( 
-    IXMLDOMDocument * This,
-     BSTR idString,
-     IXMLDOMNode **node);
-
-
-void __stdcall IXMLDOMDocument_nodeFromID_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_load_Proxy( 
-    IXMLDOMDocument * This,
-     VARIANT xmlSource,
-     VARIANT_BOOL *isSuccessful);
-
-
-void __stdcall IXMLDOMDocument_load_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_get_readyState_Proxy( 
-    IXMLDOMDocument * This,
-     long *value);
-
-
-void __stdcall IXMLDOMDocument_get_readyState_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_get_parseError_Proxy( 
-    IXMLDOMDocument * This,
-     IXMLDOMParseError **errorObj);
-
-
-void __stdcall IXMLDOMDocument_get_parseError_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_get_url_Proxy( 
-    IXMLDOMDocument * This,
-     BSTR *urlString);
-
-
-void __stdcall IXMLDOMDocument_get_url_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_get_async_Proxy( 
-    IXMLDOMDocument * This,
-     VARIANT_BOOL *isAsync);
-
-
-void __stdcall IXMLDOMDocument_get_async_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_put_async_Proxy( 
-    IXMLDOMDocument * This,
-     VARIANT_BOOL isAsync);
-
-
-void __stdcall IXMLDOMDocument_put_async_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_abort_Proxy( 
-    IXMLDOMDocument * This);
-
-
-void __stdcall IXMLDOMDocument_abort_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_loadXML_Proxy( 
-    IXMLDOMDocument * This,
-     BSTR bstrXML,
-     VARIANT_BOOL *isSuccessful);
-
-
-void __stdcall IXMLDOMDocument_loadXML_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_save_Proxy( 
-    IXMLDOMDocument * This,
-     VARIANT destination);
-
-
-void __stdcall IXMLDOMDocument_save_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_get_validateOnParse_Proxy( 
-    IXMLDOMDocument * This,
-     VARIANT_BOOL *isValidating);
-
-
-void __stdcall IXMLDOMDocument_get_validateOnParse_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_put_validateOnParse_Proxy( 
-    IXMLDOMDocument * This,
-     VARIANT_BOOL isValidating);
-
-
-void __stdcall IXMLDOMDocument_put_validateOnParse_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_get_resolveExternals_Proxy( 
-    IXMLDOMDocument * This,
-     VARIANT_BOOL *isResolving);
-
-
-void __stdcall IXMLDOMDocument_get_resolveExternals_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_put_resolveExternals_Proxy( 
-    IXMLDOMDocument * This,
-     VARIANT_BOOL isResolving);
-
-
-void __stdcall IXMLDOMDocument_put_resolveExternals_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_get_preserveWhiteSpace_Proxy( 
-    IXMLDOMDocument * This,
-     VARIANT_BOOL *isPreserving);
-
-
-void __stdcall IXMLDOMDocument_get_preserveWhiteSpace_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_put_preserveWhiteSpace_Proxy( 
-    IXMLDOMDocument * This,
-     VARIANT_BOOL isPreserving);
-
-
-void __stdcall IXMLDOMDocument_put_preserveWhiteSpace_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_put_onreadystatechange_Proxy( 
-    IXMLDOMDocument * This,
-     VARIANT readystatechangeSink);
-
-
-void __stdcall IXMLDOMDocument_put_onreadystatechange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_put_ondataavailable_Proxy( 
-    IXMLDOMDocument * This,
-     VARIANT ondataavailableSink);
-
-
-void __stdcall IXMLDOMDocument_put_ondataavailable_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocument_put_ontransformnode_Proxy( 
-    IXMLDOMDocument * This,
-     VARIANT ontransformnodeSink);
-
-
-void __stdcall IXMLDOMDocument_put_ontransformnode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMNodeList;
-
-
-    
-    struct __declspec(uuid("2933BF82-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
-    IXMLDOMNodeList : public IDispatch
-    {
-    public:
-        virtual  HRESULT __stdcall get_item( 
-             long index,
-             IXMLDOMNode **listItem) = 0;
-        
-        virtual  HRESULT __stdcall get_length( 
-             long *listLength) = 0;
-        
-        virtual  HRESULT __stdcall nextNode( 
-             IXMLDOMNode **nextItem) = 0;
-        
-        virtual  HRESULT __stdcall reset( void) = 0;
-        
-        virtual  HRESULT __stdcall get__newEnum( 
-             IUnknown **ppUnk) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDOMNodeList_get_item_Proxy( 
-    IXMLDOMNodeList * This,
-     long index,
-     IXMLDOMNode **listItem);
-
-
-void __stdcall IXMLDOMNodeList_get_item_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNodeList_get_length_Proxy( 
-    IXMLDOMNodeList * This,
-     long *listLength);
-
-
-void __stdcall IXMLDOMNodeList_get_length_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNodeList_nextNode_Proxy( 
-    IXMLDOMNodeList * This,
-     IXMLDOMNode **nextItem);
-
-
-void __stdcall IXMLDOMNodeList_nextNode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNodeList_reset_Proxy( 
-    IXMLDOMNodeList * This);
-
-
-void __stdcall IXMLDOMNodeList_reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNodeList_get__newEnum_Proxy( 
-    IXMLDOMNodeList * This,
-     IUnknown **ppUnk);
-
-
-void __stdcall IXMLDOMNodeList_get__newEnum_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMNamedNodeMap;
-
-
-    
-    struct __declspec(uuid("2933BF83-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
-    IXMLDOMNamedNodeMap : public IDispatch
-    {
-    public:
-        virtual  HRESULT __stdcall getNamedItem( 
-             BSTR name,
-             IXMLDOMNode **namedItem) = 0;
-        
-        virtual  HRESULT __stdcall setNamedItem( 
-             IXMLDOMNode *newItem,
-             IXMLDOMNode **nameItem) = 0;
-        
-        virtual  HRESULT __stdcall removeNamedItem( 
-             BSTR name,
-             IXMLDOMNode **namedItem) = 0;
-        
-        virtual  HRESULT __stdcall get_item( 
-             long index,
-             IXMLDOMNode **listItem) = 0;
-        
-        virtual  HRESULT __stdcall get_length( 
-             long *listLength) = 0;
-        
-        virtual  HRESULT __stdcall getQualifiedItem( 
-             BSTR baseName,
-             BSTR namespaceURI,
-             IXMLDOMNode **qualifiedItem) = 0;
-        
-        virtual  HRESULT __stdcall removeQualifiedItem( 
-             BSTR baseName,
-             BSTR namespaceURI,
-             IXMLDOMNode **qualifiedItem) = 0;
-        
-        virtual  HRESULT __stdcall nextNode( 
-             IXMLDOMNode **nextItem) = 0;
-        
-        virtual  HRESULT __stdcall reset( void) = 0;
-        
-        virtual  HRESULT __stdcall get__newEnum( 
-             IUnknown **ppUnk) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDOMNamedNodeMap_getNamedItem_Proxy( 
-    IXMLDOMNamedNodeMap * This,
-     BSTR name,
-     IXMLDOMNode **namedItem);
-
-
-void __stdcall IXMLDOMNamedNodeMap_getNamedItem_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNamedNodeMap_setNamedItem_Proxy( 
-    IXMLDOMNamedNodeMap * This,
-     IXMLDOMNode *newItem,
-     IXMLDOMNode **nameItem);
-
-
-void __stdcall IXMLDOMNamedNodeMap_setNamedItem_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNamedNodeMap_removeNamedItem_Proxy( 
-    IXMLDOMNamedNodeMap * This,
-     BSTR name,
-     IXMLDOMNode **namedItem);
-
-
-void __stdcall IXMLDOMNamedNodeMap_removeNamedItem_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNamedNodeMap_get_item_Proxy( 
-    IXMLDOMNamedNodeMap * This,
-     long index,
-     IXMLDOMNode **listItem);
-
-
-void __stdcall IXMLDOMNamedNodeMap_get_item_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNamedNodeMap_get_length_Proxy( 
-    IXMLDOMNamedNodeMap * This,
-     long *listLength);
-
-
-void __stdcall IXMLDOMNamedNodeMap_get_length_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNamedNodeMap_getQualifiedItem_Proxy( 
-    IXMLDOMNamedNodeMap * This,
-     BSTR baseName,
-     BSTR namespaceURI,
-     IXMLDOMNode **qualifiedItem);
-
-
-void __stdcall IXMLDOMNamedNodeMap_getQualifiedItem_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNamedNodeMap_removeQualifiedItem_Proxy( 
-    IXMLDOMNamedNodeMap * This,
-     BSTR baseName,
-     BSTR namespaceURI,
-     IXMLDOMNode **qualifiedItem);
-
-
-void __stdcall IXMLDOMNamedNodeMap_removeQualifiedItem_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNamedNodeMap_nextNode_Proxy( 
-    IXMLDOMNamedNodeMap * This,
-     IXMLDOMNode **nextItem);
-
-
-void __stdcall IXMLDOMNamedNodeMap_nextNode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNamedNodeMap_reset_Proxy( 
-    IXMLDOMNamedNodeMap * This);
-
-
-void __stdcall IXMLDOMNamedNodeMap_reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNamedNodeMap_get__newEnum_Proxy( 
-    IXMLDOMNamedNodeMap * This,
-     IUnknown **ppUnk);
-
-
-void __stdcall IXMLDOMNamedNodeMap_get__newEnum_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMCharacterData;
-
-
-    
-    struct __declspec(uuid("2933BF84-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
-    IXMLDOMCharacterData : public IXMLDOMNode
-    {
-    public:
-        virtual  HRESULT __stdcall get_data( 
-             BSTR *data) = 0;
-        
-        virtual  HRESULT __stdcall put_data( 
-             BSTR data) = 0;
-        
-        virtual  HRESULT __stdcall get_length( 
-             long *dataLength) = 0;
-        
-        virtual  HRESULT __stdcall substringData( 
-             long offset,
-             long count,
-             BSTR *data) = 0;
-        
-        virtual  HRESULT __stdcall appendData( 
-             BSTR data) = 0;
-        
-        virtual  HRESULT __stdcall insertData( 
-             long offset,
-             BSTR data) = 0;
-        
-        virtual  HRESULT __stdcall deleteData( 
-             long offset,
-             long count) = 0;
-        
-        virtual  HRESULT __stdcall replaceData( 
-             long offset,
-             long count,
-             BSTR data) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDOMCharacterData_get_data_Proxy( 
-    IXMLDOMCharacterData * This,
-     BSTR *data);
-
-
-void __stdcall IXMLDOMCharacterData_get_data_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMCharacterData_put_data_Proxy( 
-    IXMLDOMCharacterData * This,
-     BSTR data);
-
-
-void __stdcall IXMLDOMCharacterData_put_data_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMCharacterData_get_length_Proxy( 
-    IXMLDOMCharacterData * This,
-     long *dataLength);
-
-
-void __stdcall IXMLDOMCharacterData_get_length_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMCharacterData_substringData_Proxy( 
-    IXMLDOMCharacterData * This,
-     long offset,
-     long count,
-     BSTR *data);
-
-
-void __stdcall IXMLDOMCharacterData_substringData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMCharacterData_appendData_Proxy( 
-    IXMLDOMCharacterData * This,
-     BSTR data);
-
-
-void __stdcall IXMLDOMCharacterData_appendData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMCharacterData_insertData_Proxy( 
-    IXMLDOMCharacterData * This,
-     long offset,
-     BSTR data);
-
-
-void __stdcall IXMLDOMCharacterData_insertData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMCharacterData_deleteData_Proxy( 
-    IXMLDOMCharacterData * This,
-     long offset,
-     long count);
-
-
-void __stdcall IXMLDOMCharacterData_deleteData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMCharacterData_replaceData_Proxy( 
-    IXMLDOMCharacterData * This,
-     long offset,
-     long count,
-     BSTR data);
-
-
-void __stdcall IXMLDOMCharacterData_replaceData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMAttribute;
-
-
-    
-    struct __declspec(uuid("2933BF85-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
-    IXMLDOMAttribute : public IXMLDOMNode
-    {
-    public:
-        virtual  HRESULT __stdcall get_name( 
-             BSTR *attributeName) = 0;
-        
-        virtual  HRESULT __stdcall get_value( 
-             VARIANT *attributeValue) = 0;
-        
-        virtual  HRESULT __stdcall put_value( 
-             VARIANT attributeValue) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDOMAttribute_get_name_Proxy( 
-    IXMLDOMAttribute * This,
-     BSTR *attributeName);
-
-
-void __stdcall IXMLDOMAttribute_get_name_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMAttribute_get_value_Proxy( 
-    IXMLDOMAttribute * This,
-     VARIANT *attributeValue);
-
-
-void __stdcall IXMLDOMAttribute_get_value_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMAttribute_put_value_Proxy( 
-    IXMLDOMAttribute * This,
-     VARIANT attributeValue);
-
-
-void __stdcall IXMLDOMAttribute_put_value_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMElement;
-
-
-    
-    struct __declspec(uuid("2933BF86-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
-    IXMLDOMElement : public IXMLDOMNode
-    {
-    public:
-        virtual  HRESULT __stdcall get_tagName( 
-             BSTR *tagName) = 0;
-        
-        virtual  HRESULT __stdcall getAttribute( 
-             BSTR name,
-             VARIANT *value) = 0;
-        
-        virtual  HRESULT __stdcall setAttribute( 
-             BSTR name,
-             VARIANT value) = 0;
-        
-        virtual  HRESULT __stdcall removeAttribute( 
-             BSTR name) = 0;
-        
-        virtual  HRESULT __stdcall getAttributeNode( 
-             BSTR name,
-             IXMLDOMAttribute **attributeNode) = 0;
-        
-        virtual  HRESULT __stdcall setAttributeNode( 
-             IXMLDOMAttribute *DOMAttribute,
-             IXMLDOMAttribute **attributeNode) = 0;
-        
-        virtual  HRESULT __stdcall removeAttributeNode( 
-             IXMLDOMAttribute *DOMAttribute,
-             IXMLDOMAttribute **attributeNode) = 0;
-        
-        virtual  HRESULT __stdcall getElementsByTagName( 
-             BSTR tagName,
-             IXMLDOMNodeList **resultList) = 0;
-        
-        virtual  HRESULT __stdcall normalize( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDOMElement_get_tagName_Proxy( 
-    IXMLDOMElement * This,
-     BSTR *tagName);
-
-
-void __stdcall IXMLDOMElement_get_tagName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMElement_getAttribute_Proxy( 
-    IXMLDOMElement * This,
-     BSTR name,
-     VARIANT *value);
-
-
-void __stdcall IXMLDOMElement_getAttribute_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMElement_setAttribute_Proxy( 
-    IXMLDOMElement * This,
-     BSTR name,
-     VARIANT value);
-
-
-void __stdcall IXMLDOMElement_setAttribute_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMElement_removeAttribute_Proxy( 
-    IXMLDOMElement * This,
-     BSTR name);
-
-
-void __stdcall IXMLDOMElement_removeAttribute_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMElement_getAttributeNode_Proxy( 
-    IXMLDOMElement * This,
-     BSTR name,
-     IXMLDOMAttribute **attributeNode);
-
-
-void __stdcall IXMLDOMElement_getAttributeNode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMElement_setAttributeNode_Proxy( 
-    IXMLDOMElement * This,
-     IXMLDOMAttribute *DOMAttribute,
-     IXMLDOMAttribute **attributeNode);
-
-
-void __stdcall IXMLDOMElement_setAttributeNode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMElement_removeAttributeNode_Proxy( 
-    IXMLDOMElement * This,
-     IXMLDOMAttribute *DOMAttribute,
-     IXMLDOMAttribute **attributeNode);
-
-
-void __stdcall IXMLDOMElement_removeAttributeNode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMElement_getElementsByTagName_Proxy( 
-    IXMLDOMElement * This,
-     BSTR tagName,
-     IXMLDOMNodeList **resultList);
-
-
-void __stdcall IXMLDOMElement_getElementsByTagName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMElement_normalize_Proxy( 
-    IXMLDOMElement * This);
-
-
-void __stdcall IXMLDOMElement_normalize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMText;
-
-
-    
-    struct __declspec(uuid("2933BF87-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
-    IXMLDOMText : public IXMLDOMCharacterData
-    {
-    public:
-        virtual  HRESULT __stdcall splitText( 
-             long offset,
-             IXMLDOMText **rightHandTextNode) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDOMText_splitText_Proxy( 
-    IXMLDOMText * This,
-     long offset,
-     IXMLDOMText **rightHandTextNode);
-
-
-void __stdcall IXMLDOMText_splitText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMComment;
-
-
-    
-    struct __declspec(uuid("2933BF88-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
-    IXMLDOMComment : public IXMLDOMCharacterData
-    {
-    public:
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMProcessingInstruction;
-
-
-    
-    struct __declspec(uuid("2933BF89-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
-    IXMLDOMProcessingInstruction : public IXMLDOMNode
-    {
-    public:
-        virtual  HRESULT __stdcall get_target( 
-             BSTR *name) = 0;
-        
-        virtual  HRESULT __stdcall get_data( 
-             BSTR *value) = 0;
-        
-        virtual  HRESULT __stdcall put_data( 
-             BSTR value) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDOMProcessingInstruction_get_target_Proxy( 
-    IXMLDOMProcessingInstruction * This,
-     BSTR *name);
-
-
-void __stdcall IXMLDOMProcessingInstruction_get_target_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMProcessingInstruction_get_data_Proxy( 
-    IXMLDOMProcessingInstruction * This,
-     BSTR *value);
-
-
-void __stdcall IXMLDOMProcessingInstruction_get_data_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMProcessingInstruction_put_data_Proxy( 
-    IXMLDOMProcessingInstruction * This,
-     BSTR value);
-
-
-void __stdcall IXMLDOMProcessingInstruction_put_data_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMCDATASection;
-
-
-    
-    struct __declspec(uuid("2933BF8A-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
-    IXMLDOMCDATASection : public IXMLDOMText
-    {
-    public:
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMDocumentType;
-
-
-    
-    struct __declspec(uuid("2933BF8B-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
-    IXMLDOMDocumentType : public IXMLDOMNode
-    {
-    public:
-        virtual  HRESULT __stdcall get_name( 
-             BSTR *rootName) = 0;
-        
-        virtual  HRESULT __stdcall get_entities( 
-             IXMLDOMNamedNodeMap **entityMap) = 0;
-        
-        virtual  HRESULT __stdcall get_notations( 
-             IXMLDOMNamedNodeMap **notationMap) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDOMDocumentType_get_name_Proxy( 
-    IXMLDOMDocumentType * This,
-     BSTR *rootName);
-
-
-void __stdcall IXMLDOMDocumentType_get_name_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocumentType_get_entities_Proxy( 
-    IXMLDOMDocumentType * This,
-     IXMLDOMNamedNodeMap **entityMap);
-
-
-void __stdcall IXMLDOMDocumentType_get_entities_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMDocumentType_get_notations_Proxy( 
-    IXMLDOMDocumentType * This,
-     IXMLDOMNamedNodeMap **notationMap);
-
-
-void __stdcall IXMLDOMDocumentType_get_notations_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMNotation;
-
-
-    
-    struct __declspec(uuid("2933BF8C-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
-    IXMLDOMNotation : public IXMLDOMNode
-    {
-    public:
-        virtual  HRESULT __stdcall get_publicId( 
-             VARIANT *publicID) = 0;
-        
-        virtual  HRESULT __stdcall get_systemId( 
-             VARIANT *systemID) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDOMNotation_get_publicId_Proxy( 
-    IXMLDOMNotation * This,
-     VARIANT *publicID);
-
-
-void __stdcall IXMLDOMNotation_get_publicId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMNotation_get_systemId_Proxy( 
-    IXMLDOMNotation * This,
-     VARIANT *systemID);
-
-
-void __stdcall IXMLDOMNotation_get_systemId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMEntity;
-
-
-    
-    struct __declspec(uuid("2933BF8D-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
-    IXMLDOMEntity : public IXMLDOMNode
-    {
-    public:
-        virtual  HRESULT __stdcall get_publicId( 
-             VARIANT *publicID) = 0;
-        
-        virtual  HRESULT __stdcall get_systemId( 
-             VARIANT *systemID) = 0;
-        
-        virtual  HRESULT __stdcall get_notationName( 
-             BSTR *name) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDOMEntity_get_publicId_Proxy( 
-    IXMLDOMEntity * This,
-     VARIANT *publicID);
-
-
-void __stdcall IXMLDOMEntity_get_publicId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMEntity_get_systemId_Proxy( 
-    IXMLDOMEntity * This,
-     VARIANT *systemID);
-
-
-void __stdcall IXMLDOMEntity_get_systemId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMEntity_get_notationName_Proxy( 
-    IXMLDOMEntity * This,
-     BSTR *name);
-
-
-void __stdcall IXMLDOMEntity_get_notationName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMEntityReference;
-
-
-    
-    struct __declspec(uuid("2933BF8E-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
-    IXMLDOMEntityReference : public IXMLDOMNode
-    {
-    public:
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDOMParseError;
-
-
-    
-    struct __declspec(uuid("3efaa426-272f-11d2-836f-0000f87a7782")) __declspec(novtable)
-    IXMLDOMParseError : public IDispatch
-    {
-    public:
-        virtual  HRESULT __stdcall get_errorCode( 
-             long *errorCode) = 0;
-        
-        virtual  HRESULT __stdcall get_url( 
-             BSTR *urlString) = 0;
-        
-        virtual  HRESULT __stdcall get_reason( 
-             BSTR *reasonString) = 0;
-        
-        virtual  HRESULT __stdcall get_srcText( 
-             BSTR *sourceString) = 0;
-        
-        virtual  HRESULT __stdcall get_line( 
-             long *lineNumber) = 0;
-        
-        virtual  HRESULT __stdcall get_linepos( 
-             long *linePosition) = 0;
-        
-        virtual  HRESULT __stdcall get_filepos( 
-             long *filePosition) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDOMParseError_get_errorCode_Proxy( 
-    IXMLDOMParseError * This,
-     long *errorCode);
-
-
-void __stdcall IXMLDOMParseError_get_errorCode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMParseError_get_url_Proxy( 
-    IXMLDOMParseError * This,
-     BSTR *urlString);
-
-
-void __stdcall IXMLDOMParseError_get_url_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMParseError_get_reason_Proxy( 
-    IXMLDOMParseError * This,
-     BSTR *reasonString);
-
-
-void __stdcall IXMLDOMParseError_get_reason_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMParseError_get_srcText_Proxy( 
-    IXMLDOMParseError * This,
-     BSTR *sourceString);
-
-
-void __stdcall IXMLDOMParseError_get_srcText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMParseError_get_line_Proxy( 
-    IXMLDOMParseError * This,
-     long *lineNumber);
-
-
-void __stdcall IXMLDOMParseError_get_line_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMParseError_get_linepos_Proxy( 
-    IXMLDOMParseError * This,
-     long *linePosition);
-
-
-void __stdcall IXMLDOMParseError_get_linepos_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDOMParseError_get_filepos_Proxy( 
-    IXMLDOMParseError * This,
-     long *filePosition);
-
-
-void __stdcall IXMLDOMParseError_get_filepos_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXTLRuntime;
-
-
-    
-    struct __declspec(uuid("3efaa425-272f-11d2-836f-0000f87a7782")) __declspec(novtable)
-    IXTLRuntime : public IXMLDOMNode
-    {
-    public:
-        virtual  HRESULT __stdcall uniqueID( 
-             IXMLDOMNode *pNode,
-             long *pID) = 0;
-        
-        virtual  HRESULT __stdcall depth( 
-             IXMLDOMNode *pNode,
-             long *pDepth) = 0;
-        
-        virtual  HRESULT __stdcall childNumber( 
-             IXMLDOMNode *pNode,
-             long *pNumber) = 0;
-        
-        virtual  HRESULT __stdcall ancestorChildNumber( 
-             BSTR bstrNodeName,
-             IXMLDOMNode *pNode,
-             long *pNumber) = 0;
-        
-        virtual  HRESULT __stdcall absoluteChildNumber( 
-             IXMLDOMNode *pNode,
-             long *pNumber) = 0;
-        
-        virtual  HRESULT __stdcall formatIndex( 
-             long lIndex,
-             BSTR bstrFormat,
-             BSTR *pbstrFormattedString) = 0;
-        
-        virtual  HRESULT __stdcall formatNumber( 
-             double dblNumber,
-             BSTR bstrFormat,
-             BSTR *pbstrFormattedString) = 0;
-        
-        virtual  HRESULT __stdcall formatDate( 
-             VARIANT varDate,
-             BSTR bstrFormat,
-             VARIANT varDestLocale,
-             BSTR *pbstrFormattedString) = 0;
-        
-        virtual  HRESULT __stdcall formatTime( 
-             VARIANT varTime,
-             BSTR bstrFormat,
-             VARIANT varDestLocale,
-             BSTR *pbstrFormattedString) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXTLRuntime_uniqueID_Proxy( 
-    IXTLRuntime * This,
-     IXMLDOMNode *pNode,
-     long *pID);
-
-
-void __stdcall IXTLRuntime_uniqueID_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXTLRuntime_depth_Proxy( 
-    IXTLRuntime * This,
-     IXMLDOMNode *pNode,
-     long *pDepth);
-
-
-void __stdcall IXTLRuntime_depth_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXTLRuntime_childNumber_Proxy( 
-    IXTLRuntime * This,
-     IXMLDOMNode *pNode,
-     long *pNumber);
-
-
-void __stdcall IXTLRuntime_childNumber_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXTLRuntime_ancestorChildNumber_Proxy( 
-    IXTLRuntime * This,
-     BSTR bstrNodeName,
-     IXMLDOMNode *pNode,
-     long *pNumber);
-
-
-void __stdcall IXTLRuntime_ancestorChildNumber_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXTLRuntime_absoluteChildNumber_Proxy( 
-    IXTLRuntime * This,
-     IXMLDOMNode *pNode,
-     long *pNumber);
-
-
-void __stdcall IXTLRuntime_absoluteChildNumber_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXTLRuntime_formatIndex_Proxy( 
-    IXTLRuntime * This,
-     long lIndex,
-     BSTR bstrFormat,
-     BSTR *pbstrFormattedString);
-
-
-void __stdcall IXTLRuntime_formatIndex_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXTLRuntime_formatNumber_Proxy( 
-    IXTLRuntime * This,
-     double dblNumber,
-     BSTR bstrFormat,
-     BSTR *pbstrFormattedString);
-
-
-void __stdcall IXTLRuntime_formatNumber_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXTLRuntime_formatDate_Proxy( 
-    IXTLRuntime * This,
-     VARIANT varDate,
-     BSTR bstrFormat,
-     VARIANT varDestLocale,
-     BSTR *pbstrFormattedString);
-
-
-void __stdcall IXTLRuntime_formatDate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXTLRuntime_formatTime_Proxy( 
-    IXTLRuntime * This,
-     VARIANT varTime,
-     BSTR bstrFormat,
-     VARIANT varDestLocale,
-     BSTR *pbstrFormattedString);
-
-
-void __stdcall IXTLRuntime_formatTime_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID DIID_XMLDOMDocumentEvents;
-
-
-
-    struct __declspec(uuid("3efaa427-272f-11d2-836f-0000f87a7782")) __declspec(novtable)
-    XMLDOMDocumentEvents : public IDispatch
-    {
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" const CLSID CLSID_DOMDocument;
-
-
-
-class __declspec(uuid("2933BF90-7B36-11d2-B20E-00C04F983E60"))
-DOMDocument;
-
-
-extern "C" const CLSID CLSID_DOMFreeThreadedDocument;
-
-
-
-class __declspec(uuid("2933BF91-7B36-11d2-B20E-00C04F983E60"))
-DOMFreeThreadedDocument;
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLHttpRequest;
-
-
-    
-    struct __declspec(uuid("ED8C108D-4349-11D2-91A4-00C04F7969E8")) __declspec(novtable)
-    IXMLHttpRequest : public IDispatch
-    {
-    public:
-        virtual  HRESULT __stdcall open( 
-             BSTR bstrMethod,
-             BSTR bstrUrl,
-             VARIANT varAsync,
-             VARIANT bstrUser,
-             VARIANT bstrPassword) = 0;
-        
-        virtual  HRESULT __stdcall setRequestHeader( 
-             BSTR bstrHeader,
-             BSTR bstrValue) = 0;
-        
-        virtual  HRESULT __stdcall getResponseHeader( 
-             BSTR bstrHeader,
-             BSTR *pbstrValue) = 0;
-        
-        virtual  HRESULT __stdcall getAllResponseHeaders( 
-             BSTR *pbstrHeaders) = 0;
-        
-        virtual  HRESULT __stdcall send( 
-             VARIANT varBody) = 0;
-        
-        virtual  HRESULT __stdcall abort( void) = 0;
-        
-        virtual  HRESULT __stdcall get_status( 
-             long *plStatus) = 0;
-        
-        virtual  HRESULT __stdcall get_statusText( 
-             BSTR *pbstrStatus) = 0;
-        
-        virtual  HRESULT __stdcall get_responseXML( 
-             IDispatch **ppBody) = 0;
-        
-        virtual  HRESULT __stdcall get_responseText( 
-             BSTR *pbstrBody) = 0;
-        
-        virtual  HRESULT __stdcall get_responseBody( 
-             VARIANT *pvarBody) = 0;
-        
-        virtual  HRESULT __stdcall get_responseStream( 
-             VARIANT *pvarBody) = 0;
-        
-        virtual  HRESULT __stdcall get_readyState( 
-             long *plState) = 0;
-        
-        virtual  HRESULT __stdcall put_onreadystatechange( 
-             IDispatch *pReadyStateSink) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLHttpRequest_open_Proxy( 
-    IXMLHttpRequest * This,
-     BSTR bstrMethod,
-     BSTR bstrUrl,
-     VARIANT varAsync,
-     VARIANT bstrUser,
-     VARIANT bstrPassword);
-
-
-void __stdcall IXMLHttpRequest_open_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLHttpRequest_setRequestHeader_Proxy( 
-    IXMLHttpRequest * This,
-     BSTR bstrHeader,
-     BSTR bstrValue);
-
-
-void __stdcall IXMLHttpRequest_setRequestHeader_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLHttpRequest_getResponseHeader_Proxy( 
-    IXMLHttpRequest * This,
-     BSTR bstrHeader,
-     BSTR *pbstrValue);
-
-
-void __stdcall IXMLHttpRequest_getResponseHeader_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLHttpRequest_getAllResponseHeaders_Proxy( 
-    IXMLHttpRequest * This,
-     BSTR *pbstrHeaders);
-
-
-void __stdcall IXMLHttpRequest_getAllResponseHeaders_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLHttpRequest_send_Proxy( 
-    IXMLHttpRequest * This,
-     VARIANT varBody);
-
-
-void __stdcall IXMLHttpRequest_send_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLHttpRequest_abort_Proxy( 
-    IXMLHttpRequest * This);
-
-
-void __stdcall IXMLHttpRequest_abort_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLHttpRequest_get_status_Proxy( 
-    IXMLHttpRequest * This,
-     long *plStatus);
-
-
-void __stdcall IXMLHttpRequest_get_status_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLHttpRequest_get_statusText_Proxy( 
-    IXMLHttpRequest * This,
-     BSTR *pbstrStatus);
-
-
-void __stdcall IXMLHttpRequest_get_statusText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLHttpRequest_get_responseXML_Proxy( 
-    IXMLHttpRequest * This,
-     IDispatch **ppBody);
-
-
-void __stdcall IXMLHttpRequest_get_responseXML_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLHttpRequest_get_responseText_Proxy( 
-    IXMLHttpRequest * This,
-     BSTR *pbstrBody);
-
-
-void __stdcall IXMLHttpRequest_get_responseText_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLHttpRequest_get_responseBody_Proxy( 
-    IXMLHttpRequest * This,
-     VARIANT *pvarBody);
-
-
-void __stdcall IXMLHttpRequest_get_responseBody_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLHttpRequest_get_responseStream_Proxy( 
-    IXMLHttpRequest * This,
-     VARIANT *pvarBody);
-
-
-void __stdcall IXMLHttpRequest_get_responseStream_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLHttpRequest_get_readyState_Proxy( 
-    IXMLHttpRequest * This,
-     long *plState);
-
-
-void __stdcall IXMLHttpRequest_get_readyState_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLHttpRequest_put_onreadystatechange_Proxy( 
-    IXMLHttpRequest * This,
-     IDispatch *pReadyStateSink);
-
-
-void __stdcall IXMLHttpRequest_put_onreadystatechange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-extern "C" const CLSID CLSID_XMLHTTPRequest;
-
-
-
-class __declspec(uuid("ED8C108E-4349-11D2-91A4-00C04F7969E8"))
-XMLHTTPRequest;
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDSOControl;
-
-
-    
-    struct __declspec(uuid("310afa62-0575-11d2-9ca9-0060b0ec3d39")) __declspec(novtable)
-    IXMLDSOControl : public IDispatch
-    {
-    public:
-        virtual  HRESULT __stdcall get_XMLDocument( 
-             IXMLDOMDocument **ppDoc) = 0;
-        
-        virtual  HRESULT __stdcall put_XMLDocument( 
-             IXMLDOMDocument *ppDoc) = 0;
-        
-        virtual  HRESULT __stdcall get_JavaDSOCompatible( 
-             BOOL *fJavaDSOCompatible) = 0;
-        
-        virtual  HRESULT __stdcall put_JavaDSOCompatible( 
-             BOOL fJavaDSOCompatible) = 0;
-        
-        virtual  HRESULT __stdcall get_readyState( 
-             long *state) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDSOControl_get_XMLDocument_Proxy( 
-    IXMLDSOControl * This,
-     IXMLDOMDocument **ppDoc);
-
-
-void __stdcall IXMLDSOControl_get_XMLDocument_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDSOControl_put_XMLDocument_Proxy( 
-    IXMLDSOControl * This,
-     IXMLDOMDocument *ppDoc);
-
-
-void __stdcall IXMLDSOControl_put_XMLDocument_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDSOControl_get_JavaDSOCompatible_Proxy( 
-    IXMLDSOControl * This,
-     BOOL *fJavaDSOCompatible);
-
-
-void __stdcall IXMLDSOControl_get_JavaDSOCompatible_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDSOControl_put_JavaDSOCompatible_Proxy( 
-    IXMLDSOControl * This,
-     BOOL fJavaDSOCompatible);
-
-
-void __stdcall IXMLDSOControl_put_JavaDSOCompatible_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDSOControl_get_readyState_Proxy( 
-    IXMLDSOControl * This,
-     long *state);
-
-
-void __stdcall IXMLDSOControl_get_readyState_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-extern "C" const CLSID CLSID_XMLDSOControl;
-
-
-
-class __declspec(uuid("550dda30-0541-11d2-9ca9-0060b0ec3d39"))
-XMLDSOControl;
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLElementCollection;
-
-
-    
-    struct __declspec(uuid("65725580-9B5D-11d0-9BFE-00C04FC99C8E")) __declspec(novtable)
-    IXMLElementCollection : public IDispatch
-    {
-    public:
-        virtual  HRESULT __stdcall put_length( 
-             long v) = 0;
-        
-        virtual  HRESULT __stdcall get_length( 
-             long *p) = 0;
-        
-        virtual  HRESULT __stdcall get__newEnum( 
-             IUnknown **ppUnk) = 0;
-        
-        virtual  HRESULT __stdcall item( 
-             VARIANT var1,
-             VARIANT var2,
-             IDispatch **ppDisp) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLElementCollection_put_length_Proxy( 
-    IXMLElementCollection * This,
-     long v);
-
-
-void __stdcall IXMLElementCollection_put_length_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElementCollection_get_length_Proxy( 
-    IXMLElementCollection * This,
-     long *p);
-
-
-void __stdcall IXMLElementCollection_get_length_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElementCollection_get__newEnum_Proxy( 
-    IXMLElementCollection * This,
-     IUnknown **ppUnk);
-
-
-void __stdcall IXMLElementCollection_get__newEnum_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElementCollection_item_Proxy( 
-    IXMLElementCollection * This,
-     VARIANT var1,
-     VARIANT var2,
-     IDispatch **ppDisp);
-
-
-void __stdcall IXMLElementCollection_item_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDocument;
-
-
-    
-    struct __declspec(uuid("F52E2B61-18A1-11d1-B105-00805F49916B")) __declspec(novtable)
-    IXMLDocument : public IDispatch
-    {
-    public:
-        virtual  HRESULT __stdcall get_root( 
-             IXMLElement **p) = 0;
-        
-        virtual  HRESULT __stdcall get_fileSize( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall get_fileModifiedDate( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall get_fileUpdatedDate( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall get_URL( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall put_URL( 
-             BSTR p) = 0;
-        
-        virtual  HRESULT __stdcall get_mimeType( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall get_readyState( 
-             long *pl) = 0;
-        
-        virtual  HRESULT __stdcall get_charset( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall put_charset( 
-             BSTR p) = 0;
-        
-        virtual  HRESULT __stdcall get_version( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall get_doctype( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall get_dtdURL( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall createElement( 
-             VARIANT vType,
-             VARIANT var1,
-             IXMLElement **ppElem) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDocument_get_root_Proxy( 
-    IXMLDocument * This,
-     IXMLElement **p);
-
-
-void __stdcall IXMLDocument_get_root_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument_get_fileSize_Proxy( 
-    IXMLDocument * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument_get_fileSize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument_get_fileModifiedDate_Proxy( 
-    IXMLDocument * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument_get_fileModifiedDate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument_get_fileUpdatedDate_Proxy( 
-    IXMLDocument * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument_get_fileUpdatedDate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument_get_URL_Proxy( 
-    IXMLDocument * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument_get_URL_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument_put_URL_Proxy( 
-    IXMLDocument * This,
-     BSTR p);
-
-
-void __stdcall IXMLDocument_put_URL_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument_get_mimeType_Proxy( 
-    IXMLDocument * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument_get_mimeType_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument_get_readyState_Proxy( 
-    IXMLDocument * This,
-     long *pl);
-
-
-void __stdcall IXMLDocument_get_readyState_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument_get_charset_Proxy( 
-    IXMLDocument * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument_get_charset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument_put_charset_Proxy( 
-    IXMLDocument * This,
-     BSTR p);
-
-
-void __stdcall IXMLDocument_put_charset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument_get_version_Proxy( 
-    IXMLDocument * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument_get_version_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument_get_doctype_Proxy( 
-    IXMLDocument * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument_get_doctype_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument_get_dtdURL_Proxy( 
-    IXMLDocument * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument_get_dtdURL_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument_createElement_Proxy( 
-    IXMLDocument * This,
-     VARIANT vType,
-     VARIANT var1,
-     IXMLElement **ppElem);
-
-
-void __stdcall IXMLDocument_createElement_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLDocument2;
-
-
-    
-    struct __declspec(uuid("2B8DE2FE-8D2D-11d1-B2FC-00C04FD915A9")) __declspec(novtable)
-    IXMLDocument2 : public IDispatch
-    {
-    public:
-        virtual  HRESULT __stdcall get_root( 
-             IXMLElement2 **p) = 0;
-        
-        virtual  HRESULT __stdcall get_fileSize( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall get_fileModifiedDate( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall get_fileUpdatedDate( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall get_URL( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall put_URL( 
-             BSTR p) = 0;
-        
-        virtual  HRESULT __stdcall get_mimeType( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall get_readyState( 
-             long *pl) = 0;
-        
-        virtual  HRESULT __stdcall get_charset( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall put_charset( 
-             BSTR p) = 0;
-        
-        virtual  HRESULT __stdcall get_version( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall get_doctype( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall get_dtdURL( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall createElement( 
-             VARIANT vType,
-             VARIANT var1,
-             IXMLElement2 **ppElem) = 0;
-        
-        virtual  HRESULT __stdcall get_async( 
-             VARIANT_BOOL *pf) = 0;
-        
-        virtual  HRESULT __stdcall put_async( 
-             VARIANT_BOOL f) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLDocument2_get_root_Proxy( 
-    IXMLDocument2 * This,
-     IXMLElement2 **p);
-
-
-void __stdcall IXMLDocument2_get_root_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument2_get_fileSize_Proxy( 
-    IXMLDocument2 * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument2_get_fileSize_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument2_get_fileModifiedDate_Proxy( 
-    IXMLDocument2 * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument2_get_fileModifiedDate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument2_get_fileUpdatedDate_Proxy( 
-    IXMLDocument2 * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument2_get_fileUpdatedDate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument2_get_URL_Proxy( 
-    IXMLDocument2 * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument2_get_URL_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument2_put_URL_Proxy( 
-    IXMLDocument2 * This,
-     BSTR p);
-
-
-void __stdcall IXMLDocument2_put_URL_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument2_get_mimeType_Proxy( 
-    IXMLDocument2 * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument2_get_mimeType_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument2_get_readyState_Proxy( 
-    IXMLDocument2 * This,
-     long *pl);
-
-
-void __stdcall IXMLDocument2_get_readyState_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument2_get_charset_Proxy( 
-    IXMLDocument2 * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument2_get_charset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument2_put_charset_Proxy( 
-    IXMLDocument2 * This,
-     BSTR p);
-
-
-void __stdcall IXMLDocument2_put_charset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument2_get_version_Proxy( 
-    IXMLDocument2 * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument2_get_version_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument2_get_doctype_Proxy( 
-    IXMLDocument2 * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument2_get_doctype_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument2_get_dtdURL_Proxy( 
-    IXMLDocument2 * This,
-     BSTR *p);
-
-
-void __stdcall IXMLDocument2_get_dtdURL_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument2_createElement_Proxy( 
-    IXMLDocument2 * This,
-     VARIANT vType,
-     VARIANT var1,
-     IXMLElement2 **ppElem);
-
-
-void __stdcall IXMLDocument2_createElement_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument2_get_async_Proxy( 
-    IXMLDocument2 * This,
-     VARIANT_BOOL *pf);
-
-
-void __stdcall IXMLDocument2_get_async_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLDocument2_put_async_Proxy( 
-    IXMLDocument2 * This,
-     VARIANT_BOOL f);
-
-
-void __stdcall IXMLDocument2_put_async_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLElement;
-
-
-    
-    struct __declspec(uuid("3F7F31AC-E15F-11d0-9C25-00C04FC99C8E")) __declspec(novtable)
-    IXMLElement : public IDispatch
-    {
-    public:
-        virtual  HRESULT __stdcall get_tagName( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall put_tagName( 
-             BSTR p) = 0;
-        
-        virtual  HRESULT __stdcall get_parent( 
-             IXMLElement **ppParent) = 0;
-        
-        virtual  HRESULT __stdcall setAttribute( 
-             BSTR strPropertyName,
-             VARIANT PropertyValue) = 0;
-        
-        virtual  HRESULT __stdcall getAttribute( 
-             BSTR strPropertyName,
-             VARIANT *PropertyValue) = 0;
-        
-        virtual  HRESULT __stdcall removeAttribute( 
-             BSTR strPropertyName) = 0;
-        
-        virtual  HRESULT __stdcall get_children( 
-             IXMLElementCollection **pp) = 0;
-        
-        virtual  HRESULT __stdcall get_type( 
-             long *plType) = 0;
-        
-        virtual  HRESULT __stdcall get_text( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall put_text( 
-             BSTR p) = 0;
-        
-        virtual  HRESULT __stdcall addChild( 
-             IXMLElement *pChildElem,
-            long lIndex,
-            long lReserved) = 0;
-        
-        virtual  HRESULT __stdcall removeChild( 
-             IXMLElement *pChildElem) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLElement_get_tagName_Proxy( 
-    IXMLElement * This,
-     BSTR *p);
-
-
-void __stdcall IXMLElement_get_tagName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement_put_tagName_Proxy( 
-    IXMLElement * This,
-     BSTR p);
-
-
-void __stdcall IXMLElement_put_tagName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement_get_parent_Proxy( 
-    IXMLElement * This,
-     IXMLElement **ppParent);
-
-
-void __stdcall IXMLElement_get_parent_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement_setAttribute_Proxy( 
-    IXMLElement * This,
-     BSTR strPropertyName,
-     VARIANT PropertyValue);
-
-
-void __stdcall IXMLElement_setAttribute_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement_getAttribute_Proxy( 
-    IXMLElement * This,
-     BSTR strPropertyName,
-     VARIANT *PropertyValue);
-
-
-void __stdcall IXMLElement_getAttribute_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement_removeAttribute_Proxy( 
-    IXMLElement * This,
-     BSTR strPropertyName);
-
-
-void __stdcall IXMLElement_removeAttribute_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement_get_children_Proxy( 
-    IXMLElement * This,
-     IXMLElementCollection **pp);
-
-
-void __stdcall IXMLElement_get_children_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement_get_type_Proxy( 
-    IXMLElement * This,
-     long *plType);
-
-
-void __stdcall IXMLElement_get_type_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement_get_text_Proxy( 
-    IXMLElement * This,
-     BSTR *p);
-
-
-void __stdcall IXMLElement_get_text_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement_put_text_Proxy( 
-    IXMLElement * This,
-     BSTR p);
-
-
-void __stdcall IXMLElement_put_text_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement_addChild_Proxy( 
-    IXMLElement * This,
-     IXMLElement *pChildElem,
-    long lIndex,
-    long lReserved);
-
-
-void __stdcall IXMLElement_addChild_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement_removeChild_Proxy( 
-    IXMLElement * This,
-     IXMLElement *pChildElem);
-
-
-void __stdcall IXMLElement_removeChild_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLElement2;
-
-
-    
-    struct __declspec(uuid("2B8DE2FF-8D2D-11d1-B2FC-00C04FD915A9")) __declspec(novtable)
-    IXMLElement2 : public IDispatch
-    {
-    public:
-        virtual  HRESULT __stdcall get_tagName( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall put_tagName( 
-             BSTR p) = 0;
-        
-        virtual  HRESULT __stdcall get_parent( 
-             IXMLElement2 **ppParent) = 0;
-        
-        virtual  HRESULT __stdcall setAttribute( 
-             BSTR strPropertyName,
-             VARIANT PropertyValue) = 0;
-        
-        virtual  HRESULT __stdcall getAttribute( 
-             BSTR strPropertyName,
-             VARIANT *PropertyValue) = 0;
-        
-        virtual  HRESULT __stdcall removeAttribute( 
-             BSTR strPropertyName) = 0;
-        
-        virtual  HRESULT __stdcall get_children( 
-             IXMLElementCollection **pp) = 0;
-        
-        virtual  HRESULT __stdcall get_type( 
-             long *plType) = 0;
-        
-        virtual  HRESULT __stdcall get_text( 
-             BSTR *p) = 0;
-        
-        virtual  HRESULT __stdcall put_text( 
-             BSTR p) = 0;
-        
-        virtual  HRESULT __stdcall addChild( 
-             IXMLElement2 *pChildElem,
-            long lIndex,
-            long lReserved) = 0;
-        
-        virtual  HRESULT __stdcall removeChild( 
-             IXMLElement2 *pChildElem) = 0;
-        
-        virtual  HRESULT __stdcall get_attributes( 
-             IXMLElementCollection **pp) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLElement2_get_tagName_Proxy( 
-    IXMLElement2 * This,
-     BSTR *p);
-
-
-void __stdcall IXMLElement2_get_tagName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement2_put_tagName_Proxy( 
-    IXMLElement2 * This,
-     BSTR p);
-
-
-void __stdcall IXMLElement2_put_tagName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement2_get_parent_Proxy( 
-    IXMLElement2 * This,
-     IXMLElement2 **ppParent);
-
-
-void __stdcall IXMLElement2_get_parent_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement2_setAttribute_Proxy( 
-    IXMLElement2 * This,
-     BSTR strPropertyName,
-     VARIANT PropertyValue);
-
-
-void __stdcall IXMLElement2_setAttribute_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement2_getAttribute_Proxy( 
-    IXMLElement2 * This,
-     BSTR strPropertyName,
-     VARIANT *PropertyValue);
-
-
-void __stdcall IXMLElement2_getAttribute_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement2_removeAttribute_Proxy( 
-    IXMLElement2 * This,
-     BSTR strPropertyName);
-
-
-void __stdcall IXMLElement2_removeAttribute_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement2_get_children_Proxy( 
-    IXMLElement2 * This,
-     IXMLElementCollection **pp);
-
-
-void __stdcall IXMLElement2_get_children_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement2_get_type_Proxy( 
-    IXMLElement2 * This,
-     long *plType);
-
-
-void __stdcall IXMLElement2_get_type_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement2_get_text_Proxy( 
-    IXMLElement2 * This,
-     BSTR *p);
-
-
-void __stdcall IXMLElement2_get_text_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement2_put_text_Proxy( 
-    IXMLElement2 * This,
-     BSTR p);
-
-
-void __stdcall IXMLElement2_put_text_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement2_addChild_Proxy( 
-    IXMLElement2 * This,
-     IXMLElement2 *pChildElem,
-    long lIndex,
-    long lReserved);
-
-
-void __stdcall IXMLElement2_addChild_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement2_removeChild_Proxy( 
-    IXMLElement2 * This,
-     IXMLElement2 *pChildElem);
-
-
-void __stdcall IXMLElement2_removeChild_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLElement2_get_attributes_Proxy( 
-    IXMLElement2 * This,
-     IXMLElementCollection **pp);
-
-
-void __stdcall IXMLElement2_get_attributes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLAttribute;
-
-
-    
-    struct __declspec(uuid("D4D4A0FC-3B73-11d1-B2B4-00C04FB92596")) __declspec(novtable)
-    IXMLAttribute : public IDispatch
-    {
-    public:
-        virtual  HRESULT __stdcall get_name( 
-             BSTR *n) = 0;
-        
-        virtual  HRESULT __stdcall get_value( 
-             BSTR *v) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IXMLAttribute_get_name_Proxy( 
-    IXMLAttribute * This,
-     BSTR *n);
-
-
-void __stdcall IXMLAttribute_get_name_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IXMLAttribute_get_value_Proxy( 
-    IXMLAttribute * This,
-     BSTR *v);
-
-
-void __stdcall IXMLAttribute_get_value_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IXMLError;
-
-
-    
-    struct __declspec(uuid("948C5AD3-C58D-11d0-9C0B-00C04FC99C8E")) __declspec(novtable)
-    IXMLError : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetErrorInfo( 
-            XML_ERROR *pErrorReturn) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IXMLError_GetErrorInfo_Proxy( 
-    IXMLError * This,
-    XML_ERROR *pErrorReturn);
-
-
-void __stdcall IXMLError_GetErrorInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-extern "C" const CLSID CLSID_XMLDocument;
-
-
-
-class __declspec(uuid("CFC399AF-D876-11d0-9C10-00C04FC99C8E"))
-XMLDocument;
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-extern "C"{
-
-
-void * __stdcall MIDL_user_allocate(size_t);
-void __stdcall MIDL_user_free( void * ); 
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma comment(lib,"uuid.lib")
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" const IID CLSID_SBS_StdURLMoniker;  
-extern "C" const IID CLSID_SBS_HttpProtocol;   
-extern "C" const IID CLSID_SBS_FtpProtocol;    
-extern "C" const IID CLSID_SBS_GopherProtocol; 
-extern "C" const IID CLSID_SBS_HttpSProtocol;  
-extern "C" const IID CLSID_SBS_FileProtocol;   
-extern "C" const IID CLSID_SBS_MkProtocol;     
-extern "C" const IID CLSID_SBS_UrlMkBindCtx;   
-extern "C" const IID CLSID_SBS_SoftDistExt;  
-extern "C" const IID CLSID_SBS_StdEncodingFilterFac; 
-extern "C" const IID CLSID_SBS_DeCompMimeFilter;     
-extern "C" const IID CLSID_SBS_CdlProtocol;          
-extern "C" const IID CLSID_SBS_ClassInstallFilter;   
-extern "C" const IID CLSID_SBS_InternetSecurityManager;  
-extern "C" const IID CLSID_SBS_InternetZoneManager;  
-
-
-
-
-
-
-
-extern "C" const IID IID_IAsyncMoniker;    
-extern "C" const IID CLSID_StdURLMoniker;  
-extern "C" const IID CLSID_HttpProtocol;   
-extern "C" const IID CLSID_FtpProtocol;    
-extern "C" const IID CLSID_GopherProtocol; 
-extern "C" const IID CLSID_HttpSProtocol;  
-extern "C" const IID CLSID_FileProtocol;   
-extern "C" const IID CLSID_MkProtocol;     
-extern "C" const IID CLSID_StdURLProtocol; 
-extern "C" const IID CLSID_UrlMkBindCtx;   
-extern "C" const IID CLSID_StdEncodingFilterFac; 
-extern "C" const IID CLSID_DeCompMimeFilter;     
-extern "C" const IID CLSID_CdlProtocol;          
-extern "C" const IID CLSID_ClassInstallFilter;   
-extern "C" const IID IID_IAsyncBindCtx;    
- 
-
-
-
-
-
-
- 
-extern "C" HRESULT __stdcall CreateURLMoniker(LPMONIKER pMkCtx, LPCWSTR szURL, LPMONIKER  * ppmk);             
-extern "C" HRESULT __stdcall CreateURLMonikerEx(LPMONIKER pMkCtx, LPCWSTR szURL, LPMONIKER  * ppmk, DWORD dwFlags);             
-extern "C" HRESULT __stdcall GetClassURL(LPCWSTR szURL, CLSID *pClsID);                                           
-extern "C" HRESULT __stdcall CreateAsyncBindCtx(DWORD reserved, IBindStatusCallback *pBSCb,                       
-                                IEnumFORMATETC *pEFetc, IBindCtx **ppBC);                   
-extern "C" HRESULT __stdcall CreateAsyncBindCtxEx(IBindCtx *pbc, DWORD dwOptions, IBindStatusCallback *pBSCb, IEnumFORMATETC *pEnum,   
-                            IBindCtx **ppBC, DWORD reserved);                                                     
-extern "C" HRESULT __stdcall MkParseDisplayNameEx(IBindCtx *pbc, LPCWSTR szDisplayName, ULONG *pchEaten,          
-                                LPMONIKER *ppmk);                                           
-extern "C" HRESULT __stdcall RegisterBindStatusCallback(LPBC pBC, IBindStatusCallback *pBSCb,                     
-                                IBindStatusCallback**  ppBSCBPrev, DWORD dwReserved);       
-extern "C" HRESULT __stdcall RevokeBindStatusCallback(LPBC pBC, IBindStatusCallback *pBSCb);                      
-extern "C" HRESULT __stdcall GetClassFileOrMime(LPBC pBC, LPCWSTR szFilename, LPVOID pBuffer, DWORD cbSize, LPCWSTR szMime, DWORD dwReserved, CLSID *pclsid); 
-extern "C" HRESULT __stdcall IsValidURL(LPBC pBC, LPCWSTR szURL, DWORD dwReserved);                               
-extern "C" HRESULT __stdcall CoGetClassObjectFromURL( const IID & rCLASSID,
-            LPCWSTR szCODE, DWORD dwFileVersionMS, 
-            DWORD dwFileVersionLS, LPCWSTR szTYPE,
-            LPBINDCTX pBindCtx, DWORD dwClsContext,
-            LPVOID pvReserved, const IID & riid, LPVOID * ppv);
-extern "C" HRESULT __stdcall FaultInIEFeature( HWND hWnd,
-            uCLSSPEC *pClassSpec,
-            QUERYCONTEXT *pQuery, DWORD dwFlags);                                           
-extern "C" HRESULT __stdcall GetComponentIDFromCLSSPEC(uCLSSPEC *pClassspec,
-             LPSTR * ppszComponentID);                                                      
-
-
-                                                 
-                                                 
-                                                 
-
-
- 
-
-extern "C" HRESULT __stdcall IsAsyncMoniker(IMoniker* pmk);                                                       
-extern "C" HRESULT __stdcall CreateURLBinding(LPCWSTR lpszUrl, IBindCtx *pbc, IBinding **ppBdg);                  
- 
-extern "C" HRESULT __stdcall RegisterMediaTypes(UINT ctypes, const LPCSTR* rgszTypes, CLIPFORMAT* rgcfTypes);            
-extern "C" HRESULT __stdcall FindMediaType(LPCSTR rgszTypes, CLIPFORMAT* rgcfTypes);                                       
-extern "C" HRESULT __stdcall CreateFormatEnumerator( UINT cfmtetc, FORMATETC* rgfmtetc, IEnumFORMATETC** ppenumfmtetc); 
-extern "C" HRESULT __stdcall RegisterFormatEnumerator(LPBC pBC, IEnumFORMATETC *pEFetc, DWORD reserved);          
-extern "C" HRESULT __stdcall RevokeFormatEnumerator(LPBC pBC, IEnumFORMATETC *pEFetc);                            
-extern "C" HRESULT __stdcall RegisterMediaTypeClass(LPBC pBC,UINT ctypes, const LPCSTR* rgszTypes, CLSID *rgclsID, DWORD reserved);    
-extern "C" HRESULT __stdcall FindMediaTypeClass(LPBC pBC, LPCSTR szType, CLSID *pclsID, DWORD reserved);                          
-extern "C" HRESULT __stdcall UrlMkSetSessionOption(DWORD dwOption, LPVOID pBuffer, DWORD dwBufferLength, DWORD dwReserved);       
-extern "C" HRESULT __stdcall UrlMkGetSessionOption(DWORD dwOption, LPVOID pBuffer, DWORD dwBufferLength, DWORD *pdwBufferLength, DWORD dwReserved);       
-extern "C" HRESULT __stdcall FindMimeFromData(                                                                                                                  
-                        LPBC pBC,                           
-                        LPCWSTR pwzUrl,                     
-                        LPVOID pBuffer,                     
-                        DWORD cbSize,                       
-                        LPCWSTR pwzMimeProposed,            
-                        DWORD dwMimeFlags,                  
-                        LPWSTR *ppwzMimeOut,                
-                        DWORD dwReserved);                  
-
-
-
-
-extern "C" HRESULT __stdcall ObtainUserAgentString(DWORD dwOption, LPSTR pszUAOut, DWORD* cbSize);       
-extern "C" HRESULT __stdcall CompareSecurityIds(BYTE* pbSecurityId1, DWORD dwLen1, BYTE* pbSecurityId2, DWORD dwLen2, DWORD dwReserved);    
-extern "C" HRESULT __stdcall CompatFlagsFromClsid(CLSID *pclsid, LPDWORD pdwCompatFlags, LPDWORD pdwMiscStatusFlags);             
- 
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-                                                                             
-
-
-
-                                                                             
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0000_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0000_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IPersistMoniker *LPPERSISTMONIKER;
-
-
-extern "C" const IID IID_IPersistMoniker;
-
-
-    
-    struct __declspec(uuid("79eac9c9-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IPersistMoniker : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetClassID( 
-             CLSID *pClassID) = 0;
-        
-        virtual HRESULT __stdcall IsDirty( void) = 0;
-        
-        virtual HRESULT __stdcall Load( 
-             BOOL fFullyAvailable,
-             IMoniker *pimkName,
-             LPBC pibc,
-             DWORD grfMode) = 0;
-        
-        virtual HRESULT __stdcall Save( 
-             IMoniker *pimkName,
-             LPBC pbc,
-             BOOL fRemember) = 0;
-        
-        virtual HRESULT __stdcall SaveCompleted( 
-             IMoniker *pimkName,
-             LPBC pibc) = 0;
-        
-        virtual HRESULT __stdcall GetCurMoniker( 
-             IMoniker **ppimkName) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPersistMoniker_GetClassID_Proxy( 
-    IPersistMoniker * This,
-     CLSID *pClassID);
-
-
-void __stdcall IPersistMoniker_GetClassID_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistMoniker_IsDirty_Proxy( 
-    IPersistMoniker * This);
-
-
-void __stdcall IPersistMoniker_IsDirty_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistMoniker_Load_Proxy( 
-    IPersistMoniker * This,
-     BOOL fFullyAvailable,
-     IMoniker *pimkName,
-     LPBC pibc,
-     DWORD grfMode);
-
-
-void __stdcall IPersistMoniker_Load_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistMoniker_Save_Proxy( 
-    IPersistMoniker * This,
-     IMoniker *pimkName,
-     LPBC pbc,
-     BOOL fRemember);
-
-
-void __stdcall IPersistMoniker_Save_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistMoniker_SaveCompleted_Proxy( 
-    IPersistMoniker * This,
-     IMoniker *pimkName,
-     LPBC pibc);
-
-
-void __stdcall IPersistMoniker_SaveCompleted_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistMoniker_GetCurMoniker_Proxy( 
-    IPersistMoniker * This,
-     IMoniker **ppimkName);
-
-
-void __stdcall IPersistMoniker_GetCurMoniker_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0178_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0178_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IMonikerProp *LPMONIKERPROP;
-
-typedef  
-enum __MIDL_IMonikerProp_0001
-    {	MIMETYPEPROP	= 0,
-	USE_SRC_URL	= 0x1,
-	CLASSIDPROP	= 0x2,
-	TRUSTEDDOWNLOADPROP	= 0x3,
-	POPUPLEVELPROP	= 0x4
-    } 	MONIKERPROPERTY;
-
-
-extern "C" const IID IID_IMonikerProp;
-
-
-    
-    struct __declspec(uuid("a5ca5f7f-1847-4d87-9c5b-918509f7511d")) __declspec(novtable)
-    IMonikerProp : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall PutProperty( 
-             MONIKERPROPERTY mkp,
-             LPCWSTR val) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IMonikerProp_PutProperty_Proxy( 
-    IMonikerProp * This,
-     MONIKERPROPERTY mkp,
-     LPCWSTR val);
-
-
-void __stdcall IMonikerProp_PutProperty_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0179_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0179_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IBindProtocol *LPBINDPROTOCOL;
-
-
-extern "C" const IID IID_IBindProtocol;
-
-
-    
-    struct __declspec(uuid("79eac9cd-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IBindProtocol : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall CreateBinding( 
-             LPCWSTR szUrl,
-             IBindCtx *pbc,
-             IBinding **ppb) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IBindProtocol_CreateBinding_Proxy( 
-    IBindProtocol * This,
-     LPCWSTR szUrl,
-     IBindCtx *pbc,
-     IBinding **ppb);
-
-
-void __stdcall IBindProtocol_CreateBinding_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0180_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0180_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IBinding *LPBINDING;
-
-
-extern "C" const IID IID_IBinding;
-
-
-    
-    struct __declspec(uuid("79eac9c0-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IBinding : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Abort( void) = 0;
-        
-        virtual HRESULT __stdcall Suspend( void) = 0;
-        
-        virtual HRESULT __stdcall Resume( void) = 0;
-        
-        virtual HRESULT __stdcall SetPriority( 
-             LONG nPriority) = 0;
-        
-        virtual HRESULT __stdcall GetPriority( 
-             LONG *pnPriority) = 0;
-        
-        virtual  HRESULT __stdcall GetBindResult( 
-             CLSID *pclsidProtocol,
-             DWORD *pdwResult,
-             LPOLESTR *pszResult,
-             DWORD *pdwReserved) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IBinding_Abort_Proxy( 
-    IBinding * This);
-
-
-void __stdcall IBinding_Abort_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBinding_Suspend_Proxy( 
-    IBinding * This);
-
-
-void __stdcall IBinding_Suspend_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBinding_Resume_Proxy( 
-    IBinding * This);
-
-
-void __stdcall IBinding_Resume_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBinding_SetPriority_Proxy( 
-    IBinding * This,
-     LONG nPriority);
-
-
-void __stdcall IBinding_SetPriority_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBinding_GetPriority_Proxy( 
-    IBinding * This,
-     LONG *pnPriority);
-
-
-void __stdcall IBinding_GetPriority_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IBinding_RemoteGetBindResult_Proxy( 
-    IBinding * This,
-     CLSID *pclsidProtocol,
-     DWORD *pdwResult,
-     LPOLESTR *pszResult,
-     DWORD dwReserved);
-
-
-void __stdcall IBinding_RemoteGetBindResult_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0181_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0181_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IBindStatusCallback *LPBINDSTATUSCALLBACK;
-
-typedef  
-enum __MIDL_IBindStatusCallback_0001
-    {	BINDVERB_GET	= 0,
-	BINDVERB_POST	= 0x1,
-	BINDVERB_PUT	= 0x2,
-	BINDVERB_CUSTOM	= 0x3
-    } 	BINDVERB;
-
-typedef  
-enum __MIDL_IBindStatusCallback_0002
-    {	BINDINFOF_URLENCODESTGMEDDATA	= 0x1,
-	BINDINFOF_URLENCODEDEXTRAINFO	= 0x2
-    } 	BINDINFOF;
-
-typedef  
-enum __MIDL_IBindStatusCallback_0003
-    {	BINDF_ASYNCHRONOUS	= 0x1,
-	BINDF_ASYNCSTORAGE	= 0x2,
-	BINDF_NOPROGRESSIVERENDERING	= 0x4,
-	BINDF_OFFLINEOPERATION	= 0x8,
-	BINDF_GETNEWESTVERSION	= 0x10,
-	BINDF_NOWRITECACHE	= 0x20,
-	BINDF_NEEDFILE	= 0x40,
-	BINDF_PULLDATA	= 0x80,
-	BINDF_IGNORESECURITYPROBLEM	= 0x100,
-	BINDF_RESYNCHRONIZE	= 0x200,
-	BINDF_HYPERLINK	= 0x400,
-	BINDF_NO_UI	= 0x800,
-	BINDF_SILENTOPERATION	= 0x1000,
-	BINDF_PRAGMA_NO_CACHE	= 0x2000,
-	BINDF_GETCLASSOBJECT	= 0x4000,
-	BINDF_RESERVED_1	= 0x8000,
-	BINDF_FREE_THREADED	= 0x10000,
-	BINDF_DIRECT_READ	= 0x20000,
-	BINDF_FORMS_SUBMIT	= 0x40000,
-	BINDF_GETFROMCACHE_IF_NET_FAIL	= 0x80000,
-	BINDF_FROMURLMON	= 0x100000,
-	BINDF_FWD_BACK	= 0x200000,
-	BINDF_PREFERDEFAULTHANDLER	= 0x400000,
-	BINDF_ENFORCERESTRICTED	= 0x800000
-    } 	BINDF;
-
-typedef  
-enum __MIDL_IBindStatusCallback_0004
-    {	URL_ENCODING_NONE	= 0,
-	URL_ENCODING_ENABLE_UTF8	= 0x10000000,
-	URL_ENCODING_DISABLE_UTF8	= 0x20000000
-    } 	URL_ENCODING;
-
-typedef struct _tagBINDINFO
-    {
-    ULONG cbSize;
-    LPWSTR szExtraInfo;
-    STGMEDIUM stgmedData;
-    DWORD grfBindInfoF;
-    DWORD dwBindVerb;
-    LPWSTR szCustomVerb;
-    DWORD cbstgmedData;
-    DWORD dwOptions;
-    DWORD dwOptionsFlags;
-    DWORD dwCodePage;
-    SECURITY_ATTRIBUTES securityAttributes;
-    IID iid;
-    IUnknown *pUnk;
-    DWORD dwReserved;
-    } 	BINDINFO;
-
-typedef struct _REMSECURITY_ATTRIBUTES
-    {
-    DWORD nLength;
-    DWORD lpSecurityDescriptor;
-    BOOL bInheritHandle;
-    } 	REMSECURITY_ATTRIBUTES;
-
-typedef struct _REMSECURITY_ATTRIBUTES *PREMSECURITY_ATTRIBUTES;
-
-typedef struct _REMSECURITY_ATTRIBUTES *LPREMSECURITY_ATTRIBUTES;
-
-typedef struct _tagRemBINDINFO
-    {
-    ULONG cbSize;
-    LPWSTR szExtraInfo;
-    DWORD grfBindInfoF;
-    DWORD dwBindVerb;
-    LPWSTR szCustomVerb;
-    DWORD cbstgmedData;
-    DWORD dwOptions;
-    DWORD dwOptionsFlags;
-    DWORD dwCodePage;
-    REMSECURITY_ATTRIBUTES securityAttributes;
-    IID iid;
-    IUnknown *pUnk;
-    DWORD dwReserved;
-    } 	RemBINDINFO;
-
-typedef struct tagRemFORMATETC
-    {
-    DWORD cfFormat;
-    DWORD ptd;
-    DWORD dwAspect;
-    LONG lindex;
-    DWORD tymed;
-    } 	RemFORMATETC;
-
-typedef struct tagRemFORMATETC *LPREMFORMATETC;
-
-typedef  
-enum __MIDL_IBindStatusCallback_0005
-    {	BINDINFO_OPTIONS_WININETFLAG	= 0x10000,
-	BINDINFO_OPTIONS_ENABLE_UTF8	= 0x20000,
-	BINDINFO_OPTIONS_DISABLE_UTF8	= 0x40000,
-	BINDINFO_OPTIONS_USE_IE_ENCODING	= 0x80000,
-	BINDINFO_OPTIONS_BINDTOOBJECT	= 0x100000,
-	BINDINFO_OPTIONS_SECURITYOPTOUT	= 0x200000,
-	BINDINFO_OPTIONS_IGNOREMIMETEXTPLAIN	= 0x400000,
-	BINDINFO_OPTIONS_USEBINDSTRINGCREDS	= 0x800000,
-	BINDINFO_OPTIONS_IGNOREHTTPHTTPSREDIRECTS	= 0x1000000,
-	BINDINFO_OPTIONS_SHDOCVW_NAVIGATE	= 0x80000000
-    } 	BINDINFO_OPTIONS;
-
-typedef  
-enum __MIDL_IBindStatusCallback_0006
-    {	BSCF_FIRSTDATANOTIFICATION	= 0x1,
-	BSCF_INTERMEDIATEDATANOTIFICATION	= 0x2,
-	BSCF_LASTDATANOTIFICATION	= 0x4,
-	BSCF_DATAFULLYAVAILABLE	= 0x8,
-	BSCF_AVAILABLEDATASIZEUNKNOWN	= 0x10
-    } 	BSCF;
-
-typedef 
-enum tagBINDSTATUS
-    {	BINDSTATUS_FINDINGRESOURCE	= 1,
-	BINDSTATUS_CONNECTING	= BINDSTATUS_FINDINGRESOURCE + 1,
-	BINDSTATUS_REDIRECTING	= BINDSTATUS_CONNECTING + 1,
-	BINDSTATUS_BEGINDOWNLOADDATA	= BINDSTATUS_REDIRECTING + 1,
-	BINDSTATUS_DOWNLOADINGDATA	= BINDSTATUS_BEGINDOWNLOADDATA + 1,
-	BINDSTATUS_ENDDOWNLOADDATA	= BINDSTATUS_DOWNLOADINGDATA + 1,
-	BINDSTATUS_BEGINDOWNLOADCOMPONENTS	= BINDSTATUS_ENDDOWNLOADDATA + 1,
-	BINDSTATUS_INSTALLINGCOMPONENTS	= BINDSTATUS_BEGINDOWNLOADCOMPONENTS + 1,
-	BINDSTATUS_ENDDOWNLOADCOMPONENTS	= BINDSTATUS_INSTALLINGCOMPONENTS + 1,
-	BINDSTATUS_USINGCACHEDCOPY	= BINDSTATUS_ENDDOWNLOADCOMPONENTS + 1,
-	BINDSTATUS_SENDINGREQUEST	= BINDSTATUS_USINGCACHEDCOPY + 1,
-	BINDSTATUS_CLASSIDAVAILABLE	= BINDSTATUS_SENDINGREQUEST + 1,
-	BINDSTATUS_MIMETYPEAVAILABLE	= BINDSTATUS_CLASSIDAVAILABLE + 1,
-	BINDSTATUS_CACHEFILENAMEAVAILABLE	= BINDSTATUS_MIMETYPEAVAILABLE + 1,
-	BINDSTATUS_BEGINSYNCOPERATION	= BINDSTATUS_CACHEFILENAMEAVAILABLE + 1,
-	BINDSTATUS_ENDSYNCOPERATION	= BINDSTATUS_BEGINSYNCOPERATION + 1,
-	BINDSTATUS_BEGINUPLOADDATA	= BINDSTATUS_ENDSYNCOPERATION + 1,
-	BINDSTATUS_UPLOADINGDATA	= BINDSTATUS_BEGINUPLOADDATA + 1,
-	BINDSTATUS_ENDUPLOADDATA	= BINDSTATUS_UPLOADINGDATA + 1,
-	BINDSTATUS_PROTOCOLCLASSID	= BINDSTATUS_ENDUPLOADDATA + 1,
-	BINDSTATUS_ENCODING	= BINDSTATUS_PROTOCOLCLASSID + 1,
-	BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE	= BINDSTATUS_ENCODING + 1,
-	BINDSTATUS_CLASSINSTALLLOCATION	= BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE + 1,
-	BINDSTATUS_DECODING	= BINDSTATUS_CLASSINSTALLLOCATION + 1,
-	BINDSTATUS_LOADINGMIMEHANDLER	= BINDSTATUS_DECODING + 1,
-	BINDSTATUS_CONTENTDISPOSITIONATTACH	= BINDSTATUS_LOADINGMIMEHANDLER + 1,
-	BINDSTATUS_FILTERREPORTMIMETYPE	= BINDSTATUS_CONTENTDISPOSITIONATTACH + 1,
-	BINDSTATUS_CLSIDCANINSTANTIATE	= BINDSTATUS_FILTERREPORTMIMETYPE + 1,
-	BINDSTATUS_IUNKNOWNAVAILABLE	= BINDSTATUS_CLSIDCANINSTANTIATE + 1,
-	BINDSTATUS_DIRECTBIND	= BINDSTATUS_IUNKNOWNAVAILABLE + 1,
-	BINDSTATUS_RAWMIMETYPE	= BINDSTATUS_DIRECTBIND + 1,
-	BINDSTATUS_PROXYDETECTING	= BINDSTATUS_RAWMIMETYPE + 1,
-	BINDSTATUS_ACCEPTRANGES	= BINDSTATUS_PROXYDETECTING + 1,
-	BINDSTATUS_COOKIE_SENT	= BINDSTATUS_ACCEPTRANGES + 1,
-	BINDSTATUS_COMPACT_POLICY_RECEIVED	= BINDSTATUS_COOKIE_SENT + 1,
-	BINDSTATUS_COOKIE_SUPPRESSED	= BINDSTATUS_COMPACT_POLICY_RECEIVED + 1,
-	BINDSTATUS_COOKIE_STATE_UNKNOWN	= BINDSTATUS_COOKIE_SUPPRESSED + 1,
-	BINDSTATUS_COOKIE_STATE_ACCEPT	= BINDSTATUS_COOKIE_STATE_UNKNOWN + 1,
-	BINDSTATUS_COOKIE_STATE_REJECT	= BINDSTATUS_COOKIE_STATE_ACCEPT + 1,
-	BINDSTATUS_COOKIE_STATE_PROMPT	= BINDSTATUS_COOKIE_STATE_REJECT + 1,
-	BINDSTATUS_COOKIE_STATE_LEASH	= BINDSTATUS_COOKIE_STATE_PROMPT + 1,
-	BINDSTATUS_COOKIE_STATE_DOWNGRADE	= BINDSTATUS_COOKIE_STATE_LEASH + 1,
-	BINDSTATUS_POLICY_HREF	= BINDSTATUS_COOKIE_STATE_DOWNGRADE + 1,
-	BINDSTATUS_P3P_HEADER	= BINDSTATUS_POLICY_HREF + 1,
-	BINDSTATUS_SESSION_COOKIE_RECEIVED	= BINDSTATUS_P3P_HEADER + 1,
-	BINDSTATUS_PERSISTENT_COOKIE_RECEIVED	= BINDSTATUS_SESSION_COOKIE_RECEIVED + 1,
-	BINDSTATUS_SESSION_COOKIES_ALLOWED	= BINDSTATUS_PERSISTENT_COOKIE_RECEIVED + 1,
-	BINDSTATUS_CACHECONTROL	= BINDSTATUS_SESSION_COOKIES_ALLOWED + 1,
-	BINDSTATUS_CONTENTDISPOSITIONFILENAME	= BINDSTATUS_CACHECONTROL + 1,
-	BINDSTATUS_MIMETEXTPLAINMISMATCH	= BINDSTATUS_CONTENTDISPOSITIONFILENAME + 1,
-	BINDSTATUS_PUBLISHERAVAILABLE	= BINDSTATUS_MIMETEXTPLAINMISMATCH + 1,
-	BINDSTATUS_DISPLAYNAMEAVAILABLE	= BINDSTATUS_PUBLISHERAVAILABLE + 1
-    } 	BINDSTATUS;
-
-
-extern "C" const IID IID_IBindStatusCallback;
-
-
-    
-    struct __declspec(uuid("79eac9c1-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IBindStatusCallback : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall OnStartBinding( 
-             DWORD dwReserved,
-             IBinding *pib) = 0;
-        
-        virtual HRESULT __stdcall GetPriority( 
-             LONG *pnPriority) = 0;
-        
-        virtual HRESULT __stdcall OnLowResource( 
-             DWORD reserved) = 0;
-        
-        virtual HRESULT __stdcall OnProgress( 
-             ULONG ulProgress,
-             ULONG ulProgressMax,
-             ULONG ulStatusCode,
-             LPCWSTR szStatusText) = 0;
-        
-        virtual HRESULT __stdcall OnStopBinding( 
-             HRESULT hresult,
-             LPCWSTR szError) = 0;
-        
-        virtual  HRESULT __stdcall GetBindInfo( 
-             DWORD *grfBINDF,
-             BINDINFO *pbindinfo) = 0;
-        
-        virtual  HRESULT __stdcall OnDataAvailable( 
-             DWORD grfBSCF,
-             DWORD dwSize,
-             FORMATETC *pformatetc,
-             STGMEDIUM *pstgmed) = 0;
-        
-        virtual HRESULT __stdcall OnObjectAvailable( 
-             const IID & riid,
-             IUnknown *punk) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IBindStatusCallback_OnStartBinding_Proxy( 
-    IBindStatusCallback * This,
-     DWORD dwReserved,
-     IBinding *pib);
-
-
-void __stdcall IBindStatusCallback_OnStartBinding_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBindStatusCallback_GetPriority_Proxy( 
-    IBindStatusCallback * This,
-     LONG *pnPriority);
-
-
-void __stdcall IBindStatusCallback_GetPriority_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBindStatusCallback_OnLowResource_Proxy( 
-    IBindStatusCallback * This,
-     DWORD reserved);
-
-
-void __stdcall IBindStatusCallback_OnLowResource_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBindStatusCallback_OnProgress_Proxy( 
-    IBindStatusCallback * This,
-     ULONG ulProgress,
-     ULONG ulProgressMax,
-     ULONG ulStatusCode,
-     LPCWSTR szStatusText);
-
-
-void __stdcall IBindStatusCallback_OnProgress_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBindStatusCallback_OnStopBinding_Proxy( 
-    IBindStatusCallback * This,
-     HRESULT hresult,
-     LPCWSTR szError);
-
-
-void __stdcall IBindStatusCallback_OnStopBinding_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IBindStatusCallback_RemoteGetBindInfo_Proxy( 
-    IBindStatusCallback * This,
-     DWORD *grfBINDF,
-     RemBINDINFO *pbindinfo,
-     RemSTGMEDIUM *pstgmed);
-
-
-void __stdcall IBindStatusCallback_RemoteGetBindInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IBindStatusCallback_RemoteOnDataAvailable_Proxy( 
-    IBindStatusCallback * This,
-     DWORD grfBSCF,
-     DWORD dwSize,
-     RemFORMATETC *pformatetc,
-     RemSTGMEDIUM *pstgmed);
-
-
-void __stdcall IBindStatusCallback_RemoteOnDataAvailable_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IBindStatusCallback_OnObjectAvailable_Proxy( 
-    IBindStatusCallback * This,
-     const IID & riid,
-     IUnknown *punk);
-
-
-void __stdcall IBindStatusCallback_OnObjectAvailable_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0182_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0182_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IAuthenticate *LPAUTHENTICATION;
-
-
-extern "C" const IID IID_IAuthenticate;
-
-
-    
-    struct __declspec(uuid("79eac9d0-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IAuthenticate : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Authenticate( 
-             HWND *phwnd,
-             LPWSTR *pszUsername,
-             LPWSTR *pszPassword) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IAuthenticate_Authenticate_Proxy( 
-    IAuthenticate * This,
-     HWND *phwnd,
-     LPWSTR *pszUsername,
-     LPWSTR *pszPassword);
-
-
-void __stdcall IAuthenticate_Authenticate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0183_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0183_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IHttpNegotiate *LPHTTPNEGOTIATE;
-
-
-extern "C" const IID IID_IHttpNegotiate;
-
-
-    
-    struct __declspec(uuid("79eac9d2-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IHttpNegotiate : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall BeginningTransaction( 
-             LPCWSTR szURL,
-             LPCWSTR szHeaders,
-             DWORD dwReserved,
-             LPWSTR *pszAdditionalHeaders) = 0;
-        
-        virtual HRESULT __stdcall OnResponse( 
-             DWORD dwResponseCode,
-             LPCWSTR szResponseHeaders,
-             LPCWSTR szRequestHeaders,
-             LPWSTR *pszAdditionalRequestHeaders) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IHttpNegotiate_BeginningTransaction_Proxy( 
-    IHttpNegotiate * This,
-     LPCWSTR szURL,
-     LPCWSTR szHeaders,
-     DWORD dwReserved,
-     LPWSTR *pszAdditionalHeaders);
-
-
-void __stdcall IHttpNegotiate_BeginningTransaction_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IHttpNegotiate_OnResponse_Proxy( 
-    IHttpNegotiate * This,
-     DWORD dwResponseCode,
-     LPCWSTR szResponseHeaders,
-     LPCWSTR szRequestHeaders,
-     LPWSTR *pszAdditionalRequestHeaders);
-
-
-void __stdcall IHttpNegotiate_OnResponse_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0184_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0184_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IHttpNegotiate2 *LPHTTPNEGOTIATE2;
-
-
-extern "C" const IID IID_IHttpNegotiate2;
-
-
-    
-    struct __declspec(uuid("4F9F9FCB-E0F4-48eb-B7AB-FA2EA9365CB4")) __declspec(novtable)
-    IHttpNegotiate2 : public IHttpNegotiate
-    {
-    public:
-        virtual HRESULT __stdcall GetRootSecurityId( 
-             BYTE *pbSecurityId,
-             DWORD *pcbSecurityId,
-             DWORD_PTR dwReserved) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IHttpNegotiate2_GetRootSecurityId_Proxy( 
-    IHttpNegotiate2 * This,
-     BYTE *pbSecurityId,
-     DWORD *pcbSecurityId,
-     DWORD_PTR dwReserved);
-
-
-void __stdcall IHttpNegotiate2_GetRootSecurityId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0185_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0185_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IWinInetFileStream *LPWININETFILESTREAM;
-
-
-extern "C" const IID IID_IWinInetFileStream;
-
-
-    
-    struct __declspec(uuid("F134C4B7-B1F8-4e75-B886-74B90943BECB")) __declspec(novtable)
-    IWinInetFileStream : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall SetHandleForUnlock( 
-             DWORD_PTR hWinInetLockHandle,
-             DWORD_PTR dwReserved) = 0;
-        
-        virtual HRESULT __stdcall SetDeleteFile( 
-             DWORD_PTR dwReserved) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IWinInetFileStream_SetHandleForUnlock_Proxy( 
-    IWinInetFileStream * This,
-     DWORD_PTR hWinInetLockHandle,
-     DWORD_PTR dwReserved);
-
-
-void __stdcall IWinInetFileStream_SetHandleForUnlock_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IWinInetFileStream_SetDeleteFile_Proxy( 
-    IWinInetFileStream * This,
-     DWORD_PTR dwReserved);
-
-
-void __stdcall IWinInetFileStream_SetDeleteFile_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0186_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0186_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IWindowForBindingUI *LPWINDOWFORBINDINGUI;
-
-
-extern "C" const IID IID_IWindowForBindingUI;
-
-
-    
-    struct __declspec(uuid("79eac9d5-bafa-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IWindowForBindingUI : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetWindow( 
-             const GUID & rguidReason,
-             HWND *phwnd) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IWindowForBindingUI_GetWindow_Proxy( 
-    IWindowForBindingUI * This,
-     const GUID & rguidReason,
-     HWND *phwnd);
-
-
-void __stdcall IWindowForBindingUI_GetWindow_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0187_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0187_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  ICodeInstall *LPCODEINSTALL;
-
-typedef  
-enum __MIDL_ICodeInstall_0001
-    {	CIP_DISK_FULL	= 0,
-	CIP_ACCESS_DENIED	= CIP_DISK_FULL + 1,
-	CIP_NEWER_VERSION_EXISTS	= CIP_ACCESS_DENIED + 1,
-	CIP_OLDER_VERSION_EXISTS	= CIP_NEWER_VERSION_EXISTS + 1,
-	CIP_NAME_CONFLICT	= CIP_OLDER_VERSION_EXISTS + 1,
-	CIP_TRUST_VERIFICATION_COMPONENT_MISSING	= CIP_NAME_CONFLICT + 1,
-	CIP_EXE_SELF_REGISTERATION_TIMEOUT	= CIP_TRUST_VERIFICATION_COMPONENT_MISSING + 1,
-	CIP_UNSAFE_TO_ABORT	= CIP_EXE_SELF_REGISTERATION_TIMEOUT + 1,
-	CIP_NEED_REBOOT	= CIP_UNSAFE_TO_ABORT + 1,
-	CIP_NEED_REBOOT_UI_PERMISSION	= CIP_NEED_REBOOT + 1
-    } 	CIP_STATUS;
-
-
-extern "C" const IID IID_ICodeInstall;
-
-
-    
-    struct __declspec(uuid("79eac9d1-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    ICodeInstall : public IWindowForBindingUI
-    {
-    public:
-        virtual HRESULT __stdcall OnCodeInstallProblem( 
-             ULONG ulStatusCode,
-             LPCWSTR szDestination,
-             LPCWSTR szSource,
-             DWORD dwReserved) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ICodeInstall_OnCodeInstallProblem_Proxy( 
-    ICodeInstall * This,
-     ULONG ulStatusCode,
-     LPCWSTR szDestination,
-     LPCWSTR szSource,
-     DWORD dwReserved);
-
-
-void __stdcall ICodeInstall_OnCodeInstallProblem_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0188_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0188_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IWinInetInfo *LPWININETINFO;
-
-
-extern "C" const IID IID_IWinInetInfo;
-
-
-    
-    struct __declspec(uuid("79eac9d6-bafa-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IWinInetInfo : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall QueryOption( 
-             DWORD dwOption,
-             LPVOID pBuffer,
-             DWORD *pcbBuf) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IWinInetInfo_RemoteQueryOption_Proxy( 
-    IWinInetInfo * This,
-     DWORD dwOption,
-     BYTE *pBuffer,
-     DWORD *pcbBuf);
-
-
-void __stdcall IWinInetInfo_RemoteQueryOption_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0189_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0189_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IHttpSecurity *LPHTTPSECURITY;
-
-
-extern "C" const IID IID_IHttpSecurity;
-
-
-    
-    struct __declspec(uuid("79eac9d7-bafa-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IHttpSecurity : public IWindowForBindingUI
-    {
-    public:
-        virtual HRESULT __stdcall OnSecurityProblem( 
-             DWORD dwProblem) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IHttpSecurity_OnSecurityProblem_Proxy( 
-    IHttpSecurity * This,
-     DWORD dwProblem);
-
-
-void __stdcall IHttpSecurity_OnSecurityProblem_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0190_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0190_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IWinInetHttpInfo *LPWININETHTTPINFO;
-
-
-extern "C" const IID IID_IWinInetHttpInfo;
-
-
-    
-    struct __declspec(uuid("79eac9d8-bafa-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IWinInetHttpInfo : public IWinInetInfo
-    {
-    public:
-        virtual  HRESULT __stdcall QueryInfo( 
-             DWORD dwOption,
-             LPVOID pBuffer,
-             DWORD *pcbBuf,
-             DWORD *pdwFlags,
-             DWORD *pdwReserved) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IWinInetHttpInfo_RemoteQueryInfo_Proxy( 
-    IWinInetHttpInfo * This,
-     DWORD dwOption,
-     BYTE *pBuffer,
-     DWORD *pcbBuf,
-     DWORD *pdwFlags,
-     DWORD *pdwReserved);
-
-
-void __stdcall IWinInetHttpInfo_RemoteQueryInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0191_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0191_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IWinInetCacheHints *LPWININETCACHEHINTS;
-
-
-extern "C" const IID IID_IWinInetCacheHints;
-
-
-    
-    struct __declspec(uuid("DD1EC3B3-8391-4fdb-A9E6-347C3CAAA7DD")) __declspec(novtable)
-    IWinInetCacheHints : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall SetCacheExtension( 
-             LPCWSTR pwzExt,
-             LPVOID pszCacheFile,
-             DWORD *pcbCacheFile,
-             DWORD *pdwWinInetError,
-             DWORD *pdwReserved) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IWinInetCacheHints_SetCacheExtension_Proxy( 
-    IWinInetCacheHints * This,
-     LPCWSTR pwzExt,
-     LPVOID pszCacheFile,
-     DWORD *pcbCacheFile,
-     DWORD *pdwWinInetError,
-     DWORD *pdwReserved);
-
-
-void __stdcall IWinInetCacheHints_SetCacheExtension_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern "C" const GUID SID_BindHost;
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0192_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0192_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IBindHost *LPBINDHOST;
-
-
-extern "C" const IID IID_IBindHost;
-
-
-    
-    struct __declspec(uuid("fc4801a1-2ba9-11cf-a229-00aa003d7352")) __declspec(novtable)
-    IBindHost : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall CreateMoniker( 
-             LPOLESTR szName,
-             IBindCtx *pBC,
-             IMoniker **ppmk,
-             DWORD dwReserved) = 0;
-        
-        virtual  HRESULT __stdcall MonikerBindToStorage( 
-             IMoniker *pMk,
-             IBindCtx *pBC,
-             IBindStatusCallback *pBSC,
-             const IID & riid,
-             void **ppvObj) = 0;
-        
-        virtual  HRESULT __stdcall MonikerBindToObject( 
-             IMoniker *pMk,
-             IBindCtx *pBC,
-             IBindStatusCallback *pBSC,
-             const IID & riid,
-             void **ppvObj) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IBindHost_CreateMoniker_Proxy( 
-    IBindHost * This,
-     LPOLESTR szName,
-     IBindCtx *pBC,
-     IMoniker **ppmk,
-     DWORD dwReserved);
-
-
-void __stdcall IBindHost_CreateMoniker_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IBindHost_RemoteMonikerBindToStorage_Proxy( 
-    IBindHost * This,
-     IMoniker *pMk,
-     IBindCtx *pBC,
-     IBindStatusCallback *pBSC,
-     const IID & riid,
-     IUnknown **ppvObj);
-
-
-void __stdcall IBindHost_RemoteMonikerBindToStorage_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IBindHost_RemoteMonikerBindToObject_Proxy( 
-    IBindHost * This,
-     IMoniker *pMk,
-     IBindCtx *pBC,
-     IBindStatusCallback *pBSC,
-     const IID & riid,
-     IUnknown **ppvObj);
-
-
-void __stdcall IBindHost_RemoteMonikerBindToObject_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-                                                                                                           
-
-
-
-
-
-                                                                                                           
-                                                                                                           
-struct IBindStatusCallback;                                                                                
-extern "C" HRESULT __stdcall HlinkSimpleNavigateToString(                                                                        
-     LPCWSTR szTarget,         
-     LPCWSTR szLocation,       
-     LPCWSTR szTargetFrameName,
-     IUnknown *pUnk,           
-     IBindCtx *pbc,            
-     IBindStatusCallback *,                                                                      
-     DWORD grfHLNF,            
-     DWORD dwReserved          
-);                                                                                                         
-                                                                                                           
-extern "C" HRESULT __stdcall HlinkSimpleNavigateToMoniker(                                                                       
-     IMoniker *pmkTarget,      
-     LPCWSTR szLocation,       
-     LPCWSTR szTargetFrameName,
-     IUnknown *pUnk,           
-     IBindCtx *pbc,            
-     IBindStatusCallback *,                                                                      
-     DWORD grfHLNF,            
-     DWORD dwReserved          
-);                                                                                                         
-                                                                                                           
-extern "C" HRESULT __stdcall URLOpenStreamA(LPUNKNOWN,LPCSTR,DWORD,LPBINDSTATUSCALLBACK);                                        
-extern "C" HRESULT __stdcall URLOpenStreamW(LPUNKNOWN,LPCWSTR,DWORD,LPBINDSTATUSCALLBACK);                                       
-extern "C" HRESULT __stdcall URLOpenPullStreamA(LPUNKNOWN,LPCSTR,DWORD,LPBINDSTATUSCALLBACK);                                    
-extern "C" HRESULT __stdcall URLOpenPullStreamW(LPUNKNOWN,LPCWSTR,DWORD,LPBINDSTATUSCALLBACK);                                   
-extern "C" HRESULT __stdcall URLDownloadToFileA(LPUNKNOWN,LPCSTR,LPCSTR,DWORD,LPBINDSTATUSCALLBACK);                             
-extern "C" HRESULT __stdcall URLDownloadToFileW(LPUNKNOWN,LPCWSTR,LPCWSTR,DWORD,LPBINDSTATUSCALLBACK);                           
-extern "C" HRESULT __stdcall URLDownloadToCacheFileA(LPUNKNOWN,LPCSTR,LPTSTR,DWORD,DWORD,LPBINDSTATUSCALLBACK);                  
-extern "C" HRESULT __stdcall URLDownloadToCacheFileW(LPUNKNOWN,LPCWSTR,LPWSTR,DWORD,DWORD,LPBINDSTATUSCALLBACK);                 
-extern "C" HRESULT __stdcall URLOpenBlockingStreamA(LPUNKNOWN,LPCSTR,LPSTREAM*,DWORD,LPBINDSTATUSCALLBACK);                      
-extern "C" HRESULT __stdcall URLOpenBlockingStreamW(LPUNKNOWN,LPCWSTR,LPSTREAM*,DWORD,LPBINDSTATUSCALLBACK);                     
-                                                                                                           
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                                                                                           
-                                                                                                           
-extern "C" HRESULT __stdcall HlinkGoBack(IUnknown *pUnk);                                                                        
-extern "C" HRESULT __stdcall HlinkGoForward(IUnknown *pUnk);                                                                     
-extern "C" HRESULT __stdcall HlinkNavigateString(IUnknown *pUnk, LPCWSTR szTarget);                                              
-extern "C" HRESULT __stdcall HlinkNavigateMoniker(IUnknown *pUnk, IMoniker *pmkTarget);                                          
-                                                                                                           
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0193_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0193_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IInternet *LPIINTERNET;
-
-
-extern "C" const IID IID_IInternet;
-
-
-    
-    struct __declspec(uuid("79eac9e0-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IInternet : public IUnknown
-    {
-    public:
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0194_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0194_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IInternetBindInfo *LPIINTERNETBINDINFO;
-
-typedef 
-enum tagBINDSTRING
-    {	BINDSTRING_HEADERS	= 1,
-	BINDSTRING_ACCEPT_MIMES	= BINDSTRING_HEADERS + 1,
-	BINDSTRING_EXTRA_URL	= BINDSTRING_ACCEPT_MIMES + 1,
-	BINDSTRING_LANGUAGE	= BINDSTRING_EXTRA_URL + 1,
-	BINDSTRING_USERNAME	= BINDSTRING_LANGUAGE + 1,
-	BINDSTRING_PASSWORD	= BINDSTRING_USERNAME + 1,
-	BINDSTRING_UA_PIXELS	= BINDSTRING_PASSWORD + 1,
-	BINDSTRING_UA_COLOR	= BINDSTRING_UA_PIXELS + 1,
-	BINDSTRING_OS	= BINDSTRING_UA_COLOR + 1,
-	BINDSTRING_USER_AGENT	= BINDSTRING_OS + 1,
-	BINDSTRING_ACCEPT_ENCODINGS	= BINDSTRING_USER_AGENT + 1,
-	BINDSTRING_POST_COOKIE	= BINDSTRING_ACCEPT_ENCODINGS + 1,
-	BINDSTRING_POST_DATA_MIME	= BINDSTRING_POST_COOKIE + 1,
-	BINDSTRING_URL	= BINDSTRING_POST_DATA_MIME + 1,
-	BINDSTRING_IID	= BINDSTRING_URL + 1,
-	BINDSTRING_FLAG_BIND_TO_OBJECT	= BINDSTRING_IID + 1,
-	BINDSTRING_PTR_BIND_CONTEXT	= BINDSTRING_FLAG_BIND_TO_OBJECT + 1
-    } 	BINDSTRING;
-
-
-extern "C" const IID IID_IInternetBindInfo;
-
-
-    
-    struct __declspec(uuid("79eac9e1-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IInternetBindInfo : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetBindInfo( 
-             DWORD *grfBINDF,
-             BINDINFO *pbindinfo) = 0;
-        
-        virtual HRESULT __stdcall GetBindString( 
-             ULONG ulStringType,
-             LPOLESTR *ppwzStr,
-             ULONG cEl,
-             ULONG *pcElFetched) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternetBindInfo_GetBindInfo_Proxy( 
-    IInternetBindInfo * This,
-     DWORD *grfBINDF,
-     BINDINFO *pbindinfo);
-
-
-void __stdcall IInternetBindInfo_GetBindInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetBindInfo_GetBindString_Proxy( 
-    IInternetBindInfo * This,
-     ULONG ulStringType,
-     LPOLESTR *ppwzStr,
-     ULONG cEl,
-     ULONG *pcElFetched);
-
-
-void __stdcall IInternetBindInfo_GetBindString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0195_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0195_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IInternetProtocolRoot *LPIINTERNETPROTOCOLROOT;
-
-typedef 
-enum _tagPI_FLAGS
-    {	PI_PARSE_URL	= 0x1,
-	PI_FILTER_MODE	= 0x2,
-	PI_FORCE_ASYNC	= 0x4,
-	PI_USE_WORKERTHREAD	= 0x8,
-	PI_MIMEVERIFICATION	= 0x10,
-	PI_CLSIDLOOKUP	= 0x20,
-	PI_DATAPROGRESS	= 0x40,
-	PI_SYNCHRONOUS	= 0x80,
-	PI_APARTMENTTHREADED	= 0x100,
-	PI_CLASSINSTALL	= 0x200,
-	PI_PASSONBINDCTX	= 0x2000,
-	PI_NOMIMEHANDLER	= 0x8000,
-	PI_LOADAPPDIRECT	= 0x4000,
-	PD_FORCE_SWITCH	= 0x10000,
-	PI_PREFERDEFAULTHANDLER	= 0x20000
-    } 	PI_FLAGS;
-
-typedef struct _tagPROTOCOLDATA
-    {
-    DWORD grfFlags;
-    DWORD dwState;
-    LPVOID pData;
-    ULONG cbData;
-    } 	PROTOCOLDATA;
-
-typedef struct _tagStartParam
-    {
-    IID iid;
-    IBindCtx *pIBindCtx;
-    IUnknown *pItf;
-    } 	StartParam;
-
-
-extern "C" const IID IID_IInternetProtocolRoot;
-
-
-    
-    struct __declspec(uuid("79eac9e3-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IInternetProtocolRoot : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Start( 
-             LPCWSTR szUrl,
-             IInternetProtocolSink *pOIProtSink,
-             IInternetBindInfo *pOIBindInfo,
-             DWORD grfPI,
-             HANDLE_PTR dwReserved) = 0;
-        
-        virtual HRESULT __stdcall Continue( 
-             PROTOCOLDATA *pProtocolData) = 0;
-        
-        virtual HRESULT __stdcall Abort( 
-             HRESULT hrReason,
-             DWORD dwOptions) = 0;
-        
-        virtual HRESULT __stdcall Terminate( 
-             DWORD dwOptions) = 0;
-        
-        virtual HRESULT __stdcall Suspend( void) = 0;
-        
-        virtual HRESULT __stdcall Resume( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternetProtocolRoot_Start_Proxy( 
-    IInternetProtocolRoot * This,
-     LPCWSTR szUrl,
-     IInternetProtocolSink *pOIProtSink,
-     IInternetBindInfo *pOIBindInfo,
-     DWORD grfPI,
-     HANDLE_PTR dwReserved);
-
-
-void __stdcall IInternetProtocolRoot_Start_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetProtocolRoot_Continue_Proxy( 
-    IInternetProtocolRoot * This,
-     PROTOCOLDATA *pProtocolData);
-
-
-void __stdcall IInternetProtocolRoot_Continue_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetProtocolRoot_Abort_Proxy( 
-    IInternetProtocolRoot * This,
-     HRESULT hrReason,
-     DWORD dwOptions);
-
-
-void __stdcall IInternetProtocolRoot_Abort_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetProtocolRoot_Terminate_Proxy( 
-    IInternetProtocolRoot * This,
-     DWORD dwOptions);
-
-
-void __stdcall IInternetProtocolRoot_Terminate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetProtocolRoot_Suspend_Proxy( 
-    IInternetProtocolRoot * This);
-
-
-void __stdcall IInternetProtocolRoot_Suspend_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetProtocolRoot_Resume_Proxy( 
-    IInternetProtocolRoot * This);
-
-
-void __stdcall IInternetProtocolRoot_Resume_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0196_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0196_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IInternetProtocol *LPIINTERNETPROTOCOL;
-
-
-extern "C" const IID IID_IInternetProtocol;
-
-
-    
-    struct __declspec(uuid("79eac9e4-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IInternetProtocol : public IInternetProtocolRoot
-    {
-    public:
-        virtual HRESULT __stdcall Read( 
-             void *pv,
-             ULONG cb,
-             ULONG *pcbRead) = 0;
-        
-        virtual HRESULT __stdcall Seek( 
-             LARGE_INTEGER dlibMove,
-             DWORD dwOrigin,
-             ULARGE_INTEGER *plibNewPosition) = 0;
-        
-        virtual HRESULT __stdcall LockRequest( 
-             DWORD dwOptions) = 0;
-        
-        virtual HRESULT __stdcall UnlockRequest( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternetProtocol_Read_Proxy( 
-    IInternetProtocol * This,
-     void *pv,
-     ULONG cb,
-     ULONG *pcbRead);
-
-
-void __stdcall IInternetProtocol_Read_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetProtocol_Seek_Proxy( 
-    IInternetProtocol * This,
-     LARGE_INTEGER dlibMove,
-     DWORD dwOrigin,
-     ULARGE_INTEGER *plibNewPosition);
-
-
-void __stdcall IInternetProtocol_Seek_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetProtocol_LockRequest_Proxy( 
-    IInternetProtocol * This,
-     DWORD dwOptions);
-
-
-void __stdcall IInternetProtocol_LockRequest_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetProtocol_UnlockRequest_Proxy( 
-    IInternetProtocol * This);
-
-
-void __stdcall IInternetProtocol_UnlockRequest_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0197_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0197_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IInternetProtocolSink *LPIINTERNETPROTOCOLSINK;
-
-
-extern "C" const IID IID_IInternetProtocolSink;
-
-
-    
-    struct __declspec(uuid("79eac9e5-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IInternetProtocolSink : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Switch( 
-             PROTOCOLDATA *pProtocolData) = 0;
-        
-        virtual HRESULT __stdcall ReportProgress( 
-             ULONG ulStatusCode,
-             LPCWSTR szStatusText) = 0;
-        
-        virtual HRESULT __stdcall ReportData( 
-             DWORD grfBSCF,
-             ULONG ulProgress,
-             ULONG ulProgressMax) = 0;
-        
-        virtual HRESULT __stdcall ReportResult( 
-             HRESULT hrResult,
-             DWORD dwError,
-             LPCWSTR szResult) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternetProtocolSink_Switch_Proxy( 
-    IInternetProtocolSink * This,
-     PROTOCOLDATA *pProtocolData);
-
-
-void __stdcall IInternetProtocolSink_Switch_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetProtocolSink_ReportProgress_Proxy( 
-    IInternetProtocolSink * This,
-     ULONG ulStatusCode,
-     LPCWSTR szStatusText);
-
-
-void __stdcall IInternetProtocolSink_ReportProgress_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetProtocolSink_ReportData_Proxy( 
-    IInternetProtocolSink * This,
-     DWORD grfBSCF,
-     ULONG ulProgress,
-     ULONG ulProgressMax);
-
-
-void __stdcall IInternetProtocolSink_ReportData_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetProtocolSink_ReportResult_Proxy( 
-    IInternetProtocolSink * This,
-     HRESULT hrResult,
-     DWORD dwError,
-     LPCWSTR szResult);
-
-
-void __stdcall IInternetProtocolSink_ReportResult_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0198_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0198_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IInternetProtocolSinkStackable *LPIINTERNETPROTOCOLSINKStackable;
-
-
-extern "C" const IID IID_IInternetProtocolSinkStackable;
-
-
-    
-    struct __declspec(uuid("79eac9f0-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IInternetProtocolSinkStackable : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall SwitchSink( 
-             IInternetProtocolSink *pOIProtSink) = 0;
-        
-        virtual HRESULT __stdcall CommitSwitch( void) = 0;
-        
-        virtual HRESULT __stdcall RollbackSwitch( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternetProtocolSinkStackable_SwitchSink_Proxy( 
-    IInternetProtocolSinkStackable * This,
-     IInternetProtocolSink *pOIProtSink);
-
-
-void __stdcall IInternetProtocolSinkStackable_SwitchSink_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetProtocolSinkStackable_CommitSwitch_Proxy( 
-    IInternetProtocolSinkStackable * This);
-
-
-void __stdcall IInternetProtocolSinkStackable_CommitSwitch_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetProtocolSinkStackable_RollbackSwitch_Proxy( 
-    IInternetProtocolSinkStackable * This);
-
-
-void __stdcall IInternetProtocolSinkStackable_RollbackSwitch_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0199_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0199_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IInternetSession *LPIINTERNETSESSION;
-
-typedef 
-enum _tagOIBDG_FLAGS
-    {	OIBDG_APARTMENTTHREADED	= 0x100,
-	OIBDG_DATAONLY	= 0x1000
-    } 	OIBDG_FLAGS;
-
-
-extern "C" const IID IID_IInternetSession;
-
-
-    
-    struct __declspec(uuid("79eac9e7-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IInternetSession : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall RegisterNameSpace( 
-             IClassFactory *pCF,
-             const IID & rclsid,
-             LPCWSTR pwzProtocol,
-             ULONG cPatterns,
-             const LPCWSTR *ppwzPatterns,
-             DWORD dwReserved) = 0;
-        
-        virtual HRESULT __stdcall UnregisterNameSpace( 
-             IClassFactory *pCF,
-             LPCWSTR pszProtocol) = 0;
-        
-        virtual HRESULT __stdcall RegisterMimeFilter( 
-             IClassFactory *pCF,
-             const IID & rclsid,
-             LPCWSTR pwzType) = 0;
-        
-        virtual HRESULT __stdcall UnregisterMimeFilter( 
-             IClassFactory *pCF,
-             LPCWSTR pwzType) = 0;
-        
-        virtual HRESULT __stdcall CreateBinding( 
-             LPBC pBC,
-             LPCWSTR szUrl,
-             IUnknown *pUnkOuter,
-             IUnknown **ppUnk,
-             IInternetProtocol **ppOInetProt,
-             DWORD dwOption) = 0;
-        
-        virtual HRESULT __stdcall SetSessionOption( 
-             DWORD dwOption,
-             LPVOID pBuffer,
-             DWORD dwBufferLength,
-             DWORD dwReserved) = 0;
-        
-        virtual HRESULT __stdcall GetSessionOption( 
-             DWORD dwOption,
-             LPVOID pBuffer,
-             DWORD *pdwBufferLength,
-             DWORD dwReserved) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternetSession_RegisterNameSpace_Proxy( 
-    IInternetSession * This,
-     IClassFactory *pCF,
-     const IID & rclsid,
-     LPCWSTR pwzProtocol,
-     ULONG cPatterns,
-     const LPCWSTR *ppwzPatterns,
-     DWORD dwReserved);
-
-
-void __stdcall IInternetSession_RegisterNameSpace_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetSession_UnregisterNameSpace_Proxy( 
-    IInternetSession * This,
-     IClassFactory *pCF,
-     LPCWSTR pszProtocol);
-
-
-void __stdcall IInternetSession_UnregisterNameSpace_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetSession_RegisterMimeFilter_Proxy( 
-    IInternetSession * This,
-     IClassFactory *pCF,
-     const IID & rclsid,
-     LPCWSTR pwzType);
-
-
-void __stdcall IInternetSession_RegisterMimeFilter_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetSession_UnregisterMimeFilter_Proxy( 
-    IInternetSession * This,
-     IClassFactory *pCF,
-     LPCWSTR pwzType);
-
-
-void __stdcall IInternetSession_UnregisterMimeFilter_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetSession_CreateBinding_Proxy( 
-    IInternetSession * This,
-     LPBC pBC,
-     LPCWSTR szUrl,
-     IUnknown *pUnkOuter,
-     IUnknown **ppUnk,
-     IInternetProtocol **ppOInetProt,
-     DWORD dwOption);
-
-
-void __stdcall IInternetSession_CreateBinding_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetSession_SetSessionOption_Proxy( 
-    IInternetSession * This,
-     DWORD dwOption,
-     LPVOID pBuffer,
-     DWORD dwBufferLength,
-     DWORD dwReserved);
-
-
-void __stdcall IInternetSession_SetSessionOption_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetSession_GetSessionOption_Proxy( 
-    IInternetSession * This,
-     DWORD dwOption,
-     LPVOID pBuffer,
-     DWORD *pdwBufferLength,
-     DWORD dwReserved);
-
-
-void __stdcall IInternetSession_GetSessionOption_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0200_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0200_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IInternetThreadSwitch *LPIINTERNETTHREADSWITCH;
-
-
-extern "C" const IID IID_IInternetThreadSwitch;
-
-
-    
-    struct __declspec(uuid("79eac9e8-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IInternetThreadSwitch : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Prepare( void) = 0;
-        
-        virtual HRESULT __stdcall Continue( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternetThreadSwitch_Prepare_Proxy( 
-    IInternetThreadSwitch * This);
-
-
-void __stdcall IInternetThreadSwitch_Prepare_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetThreadSwitch_Continue_Proxy( 
-    IInternetThreadSwitch * This);
-
-
-void __stdcall IInternetThreadSwitch_Continue_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0201_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0201_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IInternetPriority *LPIINTERNETPRIORITY;
-
-
-extern "C" const IID IID_IInternetPriority;
-
-
-    
-    struct __declspec(uuid("79eac9eb-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IInternetPriority : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall SetPriority( 
-             LONG nPriority) = 0;
-        
-        virtual HRESULT __stdcall GetPriority( 
-             LONG *pnPriority) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternetPriority_SetPriority_Proxy( 
-    IInternetPriority * This,
-     LONG nPriority);
-
-
-void __stdcall IInternetPriority_SetPriority_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetPriority_GetPriority_Proxy( 
-    IInternetPriority * This,
-     LONG *pnPriority);
-
-
-void __stdcall IInternetPriority_GetPriority_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0202_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0202_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IInternetProtocolInfo *LPIINTERNETPROTOCOLINFO;
-
-typedef 
-enum _tagPARSEACTION
-    {	PARSE_CANONICALIZE	= 1,
-	PARSE_FRIENDLY	= PARSE_CANONICALIZE + 1,
-	PARSE_SECURITY_URL	= PARSE_FRIENDLY + 1,
-	PARSE_ROOTDOCUMENT	= PARSE_SECURITY_URL + 1,
-	PARSE_DOCUMENT	= PARSE_ROOTDOCUMENT + 1,
-	PARSE_ANCHOR	= PARSE_DOCUMENT + 1,
-	PARSE_ENCODE	= PARSE_ANCHOR + 1,
-	PARSE_DECODE	= PARSE_ENCODE + 1,
-	PARSE_PATH_FROM_URL	= PARSE_DECODE + 1,
-	PARSE_URL_FROM_PATH	= PARSE_PATH_FROM_URL + 1,
-	PARSE_MIME	= PARSE_URL_FROM_PATH + 1,
-	PARSE_SERVER	= PARSE_MIME + 1,
-	PARSE_SCHEMA	= PARSE_SERVER + 1,
-	PARSE_SITE	= PARSE_SCHEMA + 1,
-	PARSE_DOMAIN	= PARSE_SITE + 1,
-	PARSE_LOCATION	= PARSE_DOMAIN + 1,
-	PARSE_SECURITY_DOMAIN	= PARSE_LOCATION + 1,
-	PARSE_ESCAPE	= PARSE_SECURITY_DOMAIN + 1,
-	PARSE_UNESCAPE	= PARSE_ESCAPE + 1
-    } 	PARSEACTION;
-
-typedef 
-enum _tagPSUACTION
-    {	PSU_DEFAULT	= 1,
-	PSU_SECURITY_URL_ONLY	= PSU_DEFAULT + 1
-    } 	PSUACTION;
-
-typedef 
-enum _tagQUERYOPTION
-    {	QUERY_EXPIRATION_DATE	= 1,
-	QUERY_TIME_OF_LAST_CHANGE	= QUERY_EXPIRATION_DATE + 1,
-	QUERY_CONTENT_ENCODING	= QUERY_TIME_OF_LAST_CHANGE + 1,
-	QUERY_CONTENT_TYPE	= QUERY_CONTENT_ENCODING + 1,
-	QUERY_REFRESH	= QUERY_CONTENT_TYPE + 1,
-	QUERY_RECOMBINE	= QUERY_REFRESH + 1,
-	QUERY_CAN_NAVIGATE	= QUERY_RECOMBINE + 1,
-	QUERY_USES_NETWORK	= QUERY_CAN_NAVIGATE + 1,
-	QUERY_IS_CACHED	= QUERY_USES_NETWORK + 1,
-	QUERY_IS_INSTALLEDENTRY	= QUERY_IS_CACHED + 1,
-	QUERY_IS_CACHED_OR_MAPPED	= QUERY_IS_INSTALLEDENTRY + 1,
-	QUERY_USES_CACHE	= QUERY_IS_CACHED_OR_MAPPED + 1,
-	QUERY_IS_SECURE	= QUERY_USES_CACHE + 1,
-	QUERY_IS_SAFE	= QUERY_IS_SECURE + 1
-    } 	QUERYOPTION;
-
-
-extern "C" const IID IID_IInternetProtocolInfo;
-
-
-    
-    struct __declspec(uuid("79eac9ec-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IInternetProtocolInfo : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall ParseUrl( 
-             LPCWSTR pwzUrl,
-             PARSEACTION ParseAction,
-             DWORD dwParseFlags,
-             LPWSTR pwzResult,
-             DWORD cchResult,
-             DWORD *pcchResult,
-             DWORD dwReserved) = 0;
-        
-        virtual HRESULT __stdcall CombineUrl( 
-             LPCWSTR pwzBaseUrl,
-             LPCWSTR pwzRelativeUrl,
-             DWORD dwCombineFlags,
-             LPWSTR pwzResult,
-             DWORD cchResult,
-             DWORD *pcchResult,
-             DWORD dwReserved) = 0;
-        
-        virtual HRESULT __stdcall CompareUrl( 
-             LPCWSTR pwzUrl1,
-             LPCWSTR pwzUrl2,
-             DWORD dwCompareFlags) = 0;
-        
-        virtual HRESULT __stdcall QueryInfo( 
-             LPCWSTR pwzUrl,
-             QUERYOPTION OueryOption,
-             DWORD dwQueryFlags,
-             LPVOID pBuffer,
-             DWORD cbBuffer,
-             DWORD *pcbBuf,
-             DWORD dwReserved) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternetProtocolInfo_ParseUrl_Proxy( 
-    IInternetProtocolInfo * This,
-     LPCWSTR pwzUrl,
-     PARSEACTION ParseAction,
-     DWORD dwParseFlags,
-     LPWSTR pwzResult,
-     DWORD cchResult,
-     DWORD *pcchResult,
-     DWORD dwReserved);
-
-
-void __stdcall IInternetProtocolInfo_ParseUrl_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetProtocolInfo_CombineUrl_Proxy( 
-    IInternetProtocolInfo * This,
-     LPCWSTR pwzBaseUrl,
-     LPCWSTR pwzRelativeUrl,
-     DWORD dwCombineFlags,
-     LPWSTR pwzResult,
-     DWORD cchResult,
-     DWORD *pcchResult,
-     DWORD dwReserved);
-
-
-void __stdcall IInternetProtocolInfo_CombineUrl_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetProtocolInfo_CompareUrl_Proxy( 
-    IInternetProtocolInfo * This,
-     LPCWSTR pwzUrl1,
-     LPCWSTR pwzUrl2,
-     DWORD dwCompareFlags);
-
-
-void __stdcall IInternetProtocolInfo_CompareUrl_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetProtocolInfo_QueryInfo_Proxy( 
-    IInternetProtocolInfo * This,
-     LPCWSTR pwzUrl,
-     QUERYOPTION OueryOption,
-     DWORD dwQueryFlags,
-     LPVOID pBuffer,
-     DWORD cbBuffer,
-     DWORD *pcbBuf,
-     DWORD dwReserved);
-
-
-void __stdcall IInternetProtocolInfo_QueryInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" HRESULT __stdcall CoInternetParseUrl(               
-    LPCWSTR     pwzUrl,                  
-    PARSEACTION ParseAction,             
-    DWORD       dwFlags,                 
-    LPWSTR      pszResult,               
-    DWORD       cchResult,               
-    DWORD      *pcchResult,              
-    DWORD       dwReserved               
-    );                                   
-extern "C" HRESULT __stdcall CoInternetCombineUrl(             
-    LPCWSTR     pwzBaseUrl,              
-    LPCWSTR     pwzRelativeUrl,          
-    DWORD       dwCombineFlags,          
-    LPWSTR      pszResult,               
-    DWORD       cchResult,               
-    DWORD      *pcchResult,              
-    DWORD       dwReserved               
-    );                                   
-extern "C" HRESULT __stdcall CoInternetCompareUrl(             
-    LPCWSTR pwzUrl1,                     
-    LPCWSTR pwzUrl2,                     
-    DWORD dwFlags                        
-    );                                   
-extern "C" HRESULT __stdcall CoInternetGetProtocolFlags(       
-    LPCWSTR     pwzUrl,                  
-    DWORD      *pdwFlags,                
-    DWORD       dwReserved               
-    );                                   
-extern "C" HRESULT __stdcall CoInternetQueryInfo(              
-    LPCWSTR     pwzUrl,                  
-    QUERYOPTION QueryOptions,            
-    DWORD       dwQueryFlags,            
-    LPVOID      pvBuffer,                
-    DWORD       cbBuffer,                
-    DWORD      *pcbBuffer,               
-    DWORD       dwReserved               
-    );                                   
-extern "C" HRESULT __stdcall CoInternetGetSession(             
-    DWORD       dwSessionMode,           
-    IInternetSession **ppIInternetSession,
-    DWORD       dwReserved               
-    );                                   
-extern "C" HRESULT __stdcall CoInternetGetSecurityUrl(         
-    LPCWSTR pwzUrl,                      
-    LPWSTR  *ppwzSecUrl,                 
-    PSUACTION  psuAction,                
-    DWORD   dwReserved                   
-    );                                   
-extern "C" HRESULT __stdcall AsyncInstallDistributionUnit(     
-    LPCWSTR szDistUnit,                  
-    LPCWSTR szTYPE,                      
-    LPCWSTR szExt,                       
-    DWORD dwFileVersionMS,               
-    DWORD dwFileVersionLS,               
-    LPCWSTR szURL,                       
-    IBindCtx *pbc,                       
-    LPVOID   pvReserved,                 
-    DWORD   flags                        
-    );                                   
-
-
-typedef 
-enum _tagINTERNETFEATURELIST
-    {	FEATURE_OBJECT_CACHING	= 0,
-	FEATURE_ZONE_ELEVATION	= FEATURE_OBJECT_CACHING + 1,
-	FEATURE_MIME_HANDLING	= FEATURE_ZONE_ELEVATION + 1,
-	FEATURE_MIME_SNIFFING	= FEATURE_MIME_HANDLING + 1,
-	FEATURE_WINDOW_RESTRICTIONS	= FEATURE_MIME_SNIFFING + 1,
-	FEATURE_WEBOC_POPUPMANAGEMENT	= FEATURE_WINDOW_RESTRICTIONS + 1,
-	FEATURE_BEHAVIORS	= FEATURE_WEBOC_POPUPMANAGEMENT + 1,
-	FEATURE_DISABLE_MK_PROTOCOL	= FEATURE_BEHAVIORS + 1,
-	FEATURE_LOCALMACHINE_LOCKDOWN	= FEATURE_DISABLE_MK_PROTOCOL + 1,
-	FEATURE_SECURITYBAND	= FEATURE_LOCALMACHINE_LOCKDOWN + 1,
-	FEATURE_RESTRICT_ACTIVEXINSTALL	= FEATURE_SECURITYBAND + 1,
-	FEATURE_VALIDATE_NAVIGATE_URL	= FEATURE_RESTRICT_ACTIVEXINSTALL + 1,
-	FEATURE_RESTRICT_FILEDOWNLOAD	= FEATURE_VALIDATE_NAVIGATE_URL + 1,
-	FEATURE_ADDON_MANAGEMENT	= FEATURE_RESTRICT_FILEDOWNLOAD + 1,
-	FEATURE_PROTOCOL_LOCKDOWN	= FEATURE_ADDON_MANAGEMENT + 1,
-	FEATURE_HTTP_USERNAME_PASSWORD_DISABLE	= FEATURE_PROTOCOL_LOCKDOWN + 1,
-	FEATURE_SAFE_BINDTOOBJECT	= FEATURE_HTTP_USERNAME_PASSWORD_DISABLE + 1,
-	FEATURE_UNC_SAVEDFILECHECK	= FEATURE_SAFE_BINDTOOBJECT + 1,
-	FEATURE_GET_URL_DOM_FILEPATH_UNENCODED	= FEATURE_UNC_SAVEDFILECHECK + 1,
-	FEATURE_ENTRY_COUNT	= FEATURE_GET_URL_DOM_FILEPATH_UNENCODED + 1
-    } 	INTERNETFEATURELIST;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" HRESULT __stdcall CoInternetSetFeatureEnabled(      
-    INTERNETFEATURELIST FeatureEntry,    
-    DWORD dwFlags,                       
-    BOOL fEnable                         
-    );                                   
-extern "C" HRESULT __stdcall CoInternetIsFeatureEnabled(       
-    INTERNETFEATURELIST FeatureEntry,    
-    DWORD dwFlags                        
-    );                                   
-extern "C" HRESULT __stdcall CoInternetIsFeatureEnabledForUrl( 
-    INTERNETFEATURELIST FeatureEntry,    
-    DWORD dwFlags,                       
-    LPCWSTR szURL,                       
-    IInternetSecurityManager *pSecMgr    
-    );                                   
-extern "C" HRESULT __stdcall CoInternetIsFeatureZoneElevationEnabled( 
-    LPCWSTR szFromURL,                          
-    LPCWSTR szToURL,                            
-    IInternetSecurityManager *pSecMgr,          
-    DWORD dwFlags                               
-    );                                          
- 
-extern "C" HRESULT __stdcall CopyStgMedium(const STGMEDIUM * pcstgmedSrc,  
-                           STGMEDIUM * pstgmedDest); 
-extern "C" HRESULT __stdcall CopyBindInfo( const BINDINFO * pcbiSrc,   
-                           BINDINFO * pbiDest ); 
-extern "C" void __stdcall ReleaseBindInfo( BINDINFO * pbindinfo );  
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" HRESULT __stdcall CoInternetCreateSecurityManager(IServiceProvider *pSP, IInternetSecurityManager **ppSM, DWORD dwReserved);
-
-extern "C" HRESULT __stdcall CoInternetCreateZoneManager(IServiceProvider *pSP, IInternetZoneManager **ppZM, DWORD dwReserved);
-
-
-
-extern "C" const IID CLSID_InternetSecurityManager;  
-extern "C" const IID CLSID_InternetZoneManager;  
-extern "C" const IID CLSID_PersistentZoneIdentifier;  
-
-
-
-
-
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0203_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0203_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IInternetSecurityMgrSite;
-
-
-    
-    struct __declspec(uuid("79eac9ed-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IInternetSecurityMgrSite : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetWindow( 
-             HWND *phwnd) = 0;
-        
-        virtual HRESULT __stdcall EnableModeless( 
-             BOOL fEnable) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternetSecurityMgrSite_GetWindow_Proxy( 
-    IInternetSecurityMgrSite * This,
-     HWND *phwnd);
-
-
-void __stdcall IInternetSecurityMgrSite_GetWindow_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetSecurityMgrSite_EnableModeless_Proxy( 
-    IInternetSecurityMgrSite * This,
-     BOOL fEnable);
-
-
-void __stdcall IInternetSecurityMgrSite_EnableModeless_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0204_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0204_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-typedef  
-enum __MIDL_IInternetSecurityManager_0001
-    {	PUAF_DEFAULT	= 0,
-	PUAF_NOUI	= 0x1,
-	PUAF_ISFILE	= 0x2,
-	PUAF_WARN_IF_DENIED	= 0x4,
-	PUAF_FORCEUI_FOREGROUND	= 0x8,
-	PUAF_CHECK_TIFS	= 0x10,
-	PUAF_DONTCHECKBOXINDIALOG	= 0x20,
-	PUAF_TRUSTED	= 0x40,
-	PUAF_ACCEPT_WILDCARD_SCHEME	= 0x80,
-	PUAF_ENFORCERESTRICTED	= 0x100,
-	PUAF_NOSAVEDFILECHECK	= 0x200,
-	PUAF_REQUIRESAVEDFILECHECK	= 0x400,
-	PUAF_LMZ_UNLOCKED	= 0x10000,
-	PUAF_LMZ_LOCKED	= 0x20000,
-	PUAF_DEFAULTZONEPOL	= 0x40000,
-	PUAF_NPL_USE_LOCKED_IF_RESTRICTED	= 0x80000,
-	PUAF_NOUIIFLOCKED	= 0x100000,
-	PUAF_DRAGPROTOCOLCHECK	= 0x200000
-    } 	PUAF;
-
-typedef  
-enum __MIDL_IInternetSecurityManager_0002
-    {	PUAFOUT_DEFAULT	= 0,
-	PUAFOUT_ISLOCKZONEPOLICY	= 0x1
-    } 	PUAFOUT;
-
-
-
-
-
-
-
-typedef  
-enum __MIDL_IInternetSecurityManager_0003
-    {	SZM_CREATE	= 0,
-	SZM_DELETE	= 0x1
-    } 	SZM_FLAGS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" const IID IID_IInternetSecurityManager;
-
-
-    
-    struct __declspec(uuid("79eac9ee-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IInternetSecurityManager : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall SetSecuritySite( 
-             IInternetSecurityMgrSite *pSite) = 0;
-        
-        virtual HRESULT __stdcall GetSecuritySite( 
-             IInternetSecurityMgrSite **ppSite) = 0;
-        
-        virtual HRESULT __stdcall MapUrlToZone( 
-             LPCWSTR pwszUrl,
-             DWORD *pdwZone,
-             DWORD dwFlags) = 0;
-        
-        virtual HRESULT __stdcall GetSecurityId( 
-             LPCWSTR pwszUrl,
-             BYTE *pbSecurityId,
-             DWORD *pcbSecurityId,
-             DWORD_PTR dwReserved) = 0;
-        
-        virtual HRESULT __stdcall ProcessUrlAction( 
-             LPCWSTR pwszUrl,
-             DWORD dwAction,
-             BYTE *pPolicy,
-             DWORD cbPolicy,
-             BYTE *pContext,
-             DWORD cbContext,
-             DWORD dwFlags,
-             DWORD dwReserved) = 0;
-        
-        virtual HRESULT __stdcall QueryCustomPolicy( 
-             LPCWSTR pwszUrl,
-             const GUID & guidKey,
-             BYTE **ppPolicy,
-             DWORD *pcbPolicy,
-             BYTE *pContext,
-             DWORD cbContext,
-             DWORD dwReserved) = 0;
-        
-        virtual HRESULT __stdcall SetZoneMapping( 
-             DWORD dwZone,
-             LPCWSTR lpszPattern,
-             DWORD dwFlags) = 0;
-        
-        virtual HRESULT __stdcall GetZoneMappings( 
-             DWORD dwZone,
-             IEnumString **ppenumString,
-             DWORD dwFlags) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternetSecurityManager_SetSecuritySite_Proxy( 
-    IInternetSecurityManager * This,
-     IInternetSecurityMgrSite *pSite);
-
-
-void __stdcall IInternetSecurityManager_SetSecuritySite_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetSecurityManager_GetSecuritySite_Proxy( 
-    IInternetSecurityManager * This,
-     IInternetSecurityMgrSite **ppSite);
-
-
-void __stdcall IInternetSecurityManager_GetSecuritySite_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetSecurityManager_MapUrlToZone_Proxy( 
-    IInternetSecurityManager * This,
-     LPCWSTR pwszUrl,
-     DWORD *pdwZone,
-     DWORD dwFlags);
-
-
-void __stdcall IInternetSecurityManager_MapUrlToZone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetSecurityManager_GetSecurityId_Proxy( 
-    IInternetSecurityManager * This,
-     LPCWSTR pwszUrl,
-     BYTE *pbSecurityId,
-     DWORD *pcbSecurityId,
-     DWORD_PTR dwReserved);
-
-
-void __stdcall IInternetSecurityManager_GetSecurityId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetSecurityManager_ProcessUrlAction_Proxy( 
-    IInternetSecurityManager * This,
-     LPCWSTR pwszUrl,
-     DWORD dwAction,
-     BYTE *pPolicy,
-     DWORD cbPolicy,
-     BYTE *pContext,
-     DWORD cbContext,
-     DWORD dwFlags,
-     DWORD dwReserved);
-
-
-void __stdcall IInternetSecurityManager_ProcessUrlAction_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetSecurityManager_QueryCustomPolicy_Proxy( 
-    IInternetSecurityManager * This,
-     LPCWSTR pwszUrl,
-     const GUID & guidKey,
-     BYTE **ppPolicy,
-     DWORD *pcbPolicy,
-     BYTE *pContext,
-     DWORD cbContext,
-     DWORD dwReserved);
-
-
-void __stdcall IInternetSecurityManager_QueryCustomPolicy_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetSecurityManager_SetZoneMapping_Proxy( 
-    IInternetSecurityManager * This,
-     DWORD dwZone,
-     LPCWSTR lpszPattern,
-     DWORD dwFlags);
-
-
-void __stdcall IInternetSecurityManager_SetZoneMapping_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetSecurityManager_GetZoneMappings_Proxy( 
-    IInternetSecurityManager * This,
-     DWORD dwZone,
-     IEnumString **ppenumString,
-     DWORD dwFlags);
-
-
-void __stdcall IInternetSecurityManager_GetZoneMappings_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-extern "C" const IID IID_IInternetSecurityManagerEx;
-
-
-    
-    struct __declspec(uuid("F164EDF1-CC7C-4f0d-9A94-34222625C393")) __declspec(novtable)
-    IInternetSecurityManagerEx : public IInternetSecurityManager
-    {
-    public:
-        virtual HRESULT __stdcall ProcessUrlActionEx( 
-             LPCWSTR pwszUrl,
-             DWORD dwAction,
-             BYTE *pPolicy,
-             DWORD cbPolicy,
-             BYTE *pContext,
-             DWORD cbContext,
-             DWORD dwFlags,
-             DWORD dwReserved,
-             DWORD *pdwOutFlags) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternetSecurityManagerEx_ProcessUrlActionEx_Proxy( 
-    IInternetSecurityManagerEx * This,
-     LPCWSTR pwszUrl,
-     DWORD dwAction,
-     BYTE *pPolicy,
-     DWORD cbPolicy,
-     BYTE *pContext,
-     DWORD cbContext,
-     DWORD dwFlags,
-     DWORD dwReserved,
-     DWORD *pdwOutFlags);
-
-
-void __stdcall IInternetSecurityManagerEx_ProcessUrlActionEx_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0205_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0205_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IZoneIdentifier;
-
-
-    
-    struct __declspec(uuid("cd45f185-1b21-48e2-967b-ead743a8914e")) __declspec(novtable)
-    IZoneIdentifier : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetId( 
-             DWORD *pdwZone) = 0;
-        
-        virtual HRESULT __stdcall SetId( 
-             DWORD dwZone) = 0;
-        
-        virtual HRESULT __stdcall Remove( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IZoneIdentifier_GetId_Proxy( 
-    IZoneIdentifier * This,
-     DWORD *pdwZone);
-
-
-void __stdcall IZoneIdentifier_GetId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IZoneIdentifier_SetId_Proxy( 
-    IZoneIdentifier * This,
-     DWORD dwZone);
-
-
-void __stdcall IZoneIdentifier_SetId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IZoneIdentifier_Remove_Proxy( 
-    IZoneIdentifier * This);
-
-
-void __stdcall IZoneIdentifier_Remove_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0207_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0207_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IInternetHostSecurityManager;
-
-
-    
-    struct __declspec(uuid("3af280b6-cb3f-11d0-891e-00c04fb6bfc4")) __declspec(novtable)
-    IInternetHostSecurityManager : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetSecurityId( 
-             BYTE *pbSecurityId,
-             DWORD *pcbSecurityId,
-             DWORD_PTR dwReserved) = 0;
-        
-        virtual HRESULT __stdcall ProcessUrlAction( 
-             DWORD dwAction,
-             BYTE *pPolicy,
-             DWORD cbPolicy,
-             BYTE *pContext,
-             DWORD cbContext,
-             DWORD dwFlags,
-             DWORD dwReserved) = 0;
-        
-        virtual HRESULT __stdcall QueryCustomPolicy( 
-             const GUID & guidKey,
-             BYTE **ppPolicy,
-             DWORD *pcbPolicy,
-             BYTE *pContext,
-             DWORD cbContext,
-             DWORD dwReserved) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternetHostSecurityManager_GetSecurityId_Proxy( 
-    IInternetHostSecurityManager * This,
-     BYTE *pbSecurityId,
-     DWORD *pcbSecurityId,
-     DWORD_PTR dwReserved);
-
-
-void __stdcall IInternetHostSecurityManager_GetSecurityId_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetHostSecurityManager_ProcessUrlAction_Proxy( 
-    IInternetHostSecurityManager * This,
-     DWORD dwAction,
-     BYTE *pPolicy,
-     DWORD cbPolicy,
-     BYTE *pContext,
-     DWORD cbContext,
-     DWORD dwFlags,
-     DWORD dwReserved);
-
-
-void __stdcall IInternetHostSecurityManager_ProcessUrlAction_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetHostSecurityManager_QueryCustomPolicy_Proxy( 
-    IInternetHostSecurityManager * This,
-     const GUID & guidKey,
-     BYTE **ppPolicy,
-     DWORD *pcbPolicy,
-     BYTE *pContext,
-     DWORD cbContext,
-     DWORD dwReserved);
-
-
-void __stdcall IInternetHostSecurityManager_QueryCustomPolicy_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" const GUID GUID_CUSTOM_LOCALMACHINEZONEUNLOCKED; 
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0208_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0208_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IInternetZoneManager *LPURLZONEMANAGER;
-
-typedef 
-enum tagURLZONE
-    {	URLZONE_PREDEFINED_MIN	= 0,
-	URLZONE_LOCAL_MACHINE	= 0,
-	URLZONE_INTRANET	= URLZONE_LOCAL_MACHINE + 1,
-	URLZONE_TRUSTED	= URLZONE_INTRANET + 1,
-	URLZONE_INTERNET	= URLZONE_TRUSTED + 1,
-	URLZONE_UNTRUSTED	= URLZONE_INTERNET + 1,
-	URLZONE_PREDEFINED_MAX	= 999,
-	URLZONE_USER_MIN	= 1000,
-	URLZONE_USER_MAX	= 10000
-    } 	URLZONE;
-
-
-
-typedef 
-enum tagURLTEMPLATE
-    {	URLTEMPLATE_CUSTOM	= 0,
-	URLTEMPLATE_PREDEFINED_MIN	= 0x10000,
-	URLTEMPLATE_LOW	= 0x10000,
-	URLTEMPLATE_MEDLOW	= 0x10500,
-	URLTEMPLATE_MEDIUM	= 0x11000,
-	URLTEMPLATE_HIGH	= 0x12000,
-	URLTEMPLATE_PREDEFINED_MAX	= 0x20000
-    } 	URLTEMPLATE;
-
-
-enum __MIDL_IInternetZoneManager_0001
-    {	MAX_ZONE_PATH	= 260,
-	MAX_ZONE_DESCRIPTION	= 200
-    } ;
-typedef  
-enum __MIDL_IInternetZoneManager_0002
-    {	ZAFLAGS_CUSTOM_EDIT	= 0x1,
-	ZAFLAGS_ADD_SITES	= 0x2,
-	ZAFLAGS_REQUIRE_VERIFICATION	= 0x4,
-	ZAFLAGS_INCLUDE_PROXY_OVERRIDE	= 0x8,
-	ZAFLAGS_INCLUDE_INTRANET_SITES	= 0x10,
-	ZAFLAGS_NO_UI	= 0x20,
-	ZAFLAGS_SUPPORTS_VERIFICATION	= 0x40,
-	ZAFLAGS_UNC_AS_INTRANET	= 0x80,
-	ZAFLAGS_USE_LOCKED_ZONES	= 0x10000
-    } 	ZAFLAGS;
-
-typedef struct _ZONEATTRIBUTES
-    {
-    ULONG cbSize;
-    WCHAR szDisplayName[ 260 ];
-    WCHAR szDescription[ 200 ];
-    WCHAR szIconPath[ 260 ];
-    DWORD dwTemplateMinLevel;
-    DWORD dwTemplateRecommended;
-    DWORD dwTemplateCurrentLevel;
-    DWORD dwFlags;
-    } 	ZONEATTRIBUTES;
-
-typedef struct _ZONEATTRIBUTES *LPZONEATTRIBUTES;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef 
-enum _URLZONEREG
-    {	URLZONEREG_DEFAULT	= 0,
-	URLZONEREG_HKLM	= URLZONEREG_DEFAULT + 1,
-	URLZONEREG_HKCU	= URLZONEREG_HKLM + 1
-    } 	URLZONEREG;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" const IID IID_IInternetZoneManager;
-
-
-    
-    struct __declspec(uuid("79eac9ef-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
-    IInternetZoneManager : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetZoneAttributes( 
-             DWORD dwZone,
-             ZONEATTRIBUTES *pZoneAttributes) = 0;
-        
-        virtual HRESULT __stdcall SetZoneAttributes( 
-             DWORD dwZone,
-             ZONEATTRIBUTES *pZoneAttributes) = 0;
-        
-        virtual HRESULT __stdcall GetZoneCustomPolicy( 
-             DWORD dwZone,
-             const GUID & guidKey,
-             BYTE **ppPolicy,
-             DWORD *pcbPolicy,
-             URLZONEREG urlZoneReg) = 0;
-        
-        virtual HRESULT __stdcall SetZoneCustomPolicy( 
-             DWORD dwZone,
-             const GUID & guidKey,
-             BYTE *pPolicy,
-             DWORD cbPolicy,
-             URLZONEREG urlZoneReg) = 0;
-        
-        virtual HRESULT __stdcall GetZoneActionPolicy( 
-             DWORD dwZone,
-             DWORD dwAction,
-             BYTE *pPolicy,
-             DWORD cbPolicy,
-             URLZONEREG urlZoneReg) = 0;
-        
-        virtual HRESULT __stdcall SetZoneActionPolicy( 
-             DWORD dwZone,
-             DWORD dwAction,
-             BYTE *pPolicy,
-             DWORD cbPolicy,
-             URLZONEREG urlZoneReg) = 0;
-        
-        virtual HRESULT __stdcall PromptAction( 
-             DWORD dwAction,
-             HWND hwndParent,
-             LPCWSTR pwszUrl,
-             LPCWSTR pwszText,
-             DWORD dwPromptFlags) = 0;
-        
-        virtual HRESULT __stdcall LogAction( 
-             DWORD dwAction,
-             LPCWSTR pwszUrl,
-             LPCWSTR pwszText,
-             DWORD dwLogFlags) = 0;
-        
-        virtual HRESULT __stdcall CreateZoneEnumerator( 
-             DWORD *pdwEnum,
-             DWORD *pdwCount,
-             DWORD dwFlags) = 0;
-        
-        virtual HRESULT __stdcall GetZoneAt( 
-             DWORD dwEnum,
-             DWORD dwIndex,
-             DWORD *pdwZone) = 0;
-        
-        virtual HRESULT __stdcall DestroyZoneEnumerator( 
-             DWORD dwEnum) = 0;
-        
-        virtual HRESULT __stdcall CopyTemplatePoliciesToZone( 
-             DWORD dwTemplate,
-             DWORD dwZone,
-             DWORD dwReserved) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternetZoneManager_GetZoneAttributes_Proxy( 
-    IInternetZoneManager * This,
-     DWORD dwZone,
-     ZONEATTRIBUTES *pZoneAttributes);
-
-
-void __stdcall IInternetZoneManager_GetZoneAttributes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetZoneManager_SetZoneAttributes_Proxy( 
-    IInternetZoneManager * This,
-     DWORD dwZone,
-     ZONEATTRIBUTES *pZoneAttributes);
-
-
-void __stdcall IInternetZoneManager_SetZoneAttributes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetZoneManager_GetZoneCustomPolicy_Proxy( 
-    IInternetZoneManager * This,
-     DWORD dwZone,
-     const GUID & guidKey,
-     BYTE **ppPolicy,
-     DWORD *pcbPolicy,
-     URLZONEREG urlZoneReg);
-
-
-void __stdcall IInternetZoneManager_GetZoneCustomPolicy_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetZoneManager_SetZoneCustomPolicy_Proxy( 
-    IInternetZoneManager * This,
-     DWORD dwZone,
-     const GUID & guidKey,
-     BYTE *pPolicy,
-     DWORD cbPolicy,
-     URLZONEREG urlZoneReg);
-
-
-void __stdcall IInternetZoneManager_SetZoneCustomPolicy_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetZoneManager_GetZoneActionPolicy_Proxy( 
-    IInternetZoneManager * This,
-     DWORD dwZone,
-     DWORD dwAction,
-     BYTE *pPolicy,
-     DWORD cbPolicy,
-     URLZONEREG urlZoneReg);
-
-
-void __stdcall IInternetZoneManager_GetZoneActionPolicy_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetZoneManager_SetZoneActionPolicy_Proxy( 
-    IInternetZoneManager * This,
-     DWORD dwZone,
-     DWORD dwAction,
-     BYTE *pPolicy,
-     DWORD cbPolicy,
-     URLZONEREG urlZoneReg);
-
-
-void __stdcall IInternetZoneManager_SetZoneActionPolicy_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetZoneManager_PromptAction_Proxy( 
-    IInternetZoneManager * This,
-     DWORD dwAction,
-     HWND hwndParent,
-     LPCWSTR pwszUrl,
-     LPCWSTR pwszText,
-     DWORD dwPromptFlags);
-
-
-void __stdcall IInternetZoneManager_PromptAction_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetZoneManager_LogAction_Proxy( 
-    IInternetZoneManager * This,
-     DWORD dwAction,
-     LPCWSTR pwszUrl,
-     LPCWSTR pwszText,
-     DWORD dwLogFlags);
-
-
-void __stdcall IInternetZoneManager_LogAction_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetZoneManager_CreateZoneEnumerator_Proxy( 
-    IInternetZoneManager * This,
-     DWORD *pdwEnum,
-     DWORD *pdwCount,
-     DWORD dwFlags);
-
-
-void __stdcall IInternetZoneManager_CreateZoneEnumerator_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetZoneManager_GetZoneAt_Proxy( 
-    IInternetZoneManager * This,
-     DWORD dwEnum,
-     DWORD dwIndex,
-     DWORD *pdwZone);
-
-
-void __stdcall IInternetZoneManager_GetZoneAt_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetZoneManager_DestroyZoneEnumerator_Proxy( 
-    IInternetZoneManager * This,
-     DWORD dwEnum);
-
-
-void __stdcall IInternetZoneManager_DestroyZoneEnumerator_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetZoneManager_CopyTemplatePoliciesToZone_Proxy( 
-    IInternetZoneManager * This,
-     DWORD dwTemplate,
-     DWORD dwZone,
-     DWORD dwReserved);
-
-
-void __stdcall IInternetZoneManager_CopyTemplatePoliciesToZone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0209_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0209_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-extern "C" const IID IID_IInternetZoneManagerEx;
-
-
-    
-    struct __declspec(uuid("A4C23339-8E06-431e-9BF4-7E711C085648")) __declspec(novtable)
-    IInternetZoneManagerEx : public IInternetZoneManager
-    {
-    public:
-        virtual HRESULT __stdcall GetZoneActionPolicyEx( 
-             DWORD dwZone,
-             DWORD dwAction,
-             BYTE *pPolicy,
-             DWORD cbPolicy,
-             URLZONEREG urlZoneReg,
-             DWORD dwFlags) = 0;
-        
-        virtual HRESULT __stdcall SetZoneActionPolicyEx( 
-             DWORD dwZone,
-             DWORD dwAction,
-             BYTE *pPolicy,
-             DWORD cbPolicy,
-             URLZONEREG urlZoneReg,
-             DWORD dwFlags) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternetZoneManagerEx_GetZoneActionPolicyEx_Proxy( 
-    IInternetZoneManagerEx * This,
-     DWORD dwZone,
-     DWORD dwAction,
-     BYTE *pPolicy,
-     DWORD cbPolicy,
-     URLZONEREG urlZoneReg,
-     DWORD dwFlags);
-
-
-void __stdcall IInternetZoneManagerEx_GetZoneActionPolicyEx_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternetZoneManagerEx_SetZoneActionPolicyEx_Proxy( 
-    IInternetZoneManagerEx * This,
-     DWORD dwZone,
-     DWORD dwAction,
-     BYTE *pPolicy,
-     DWORD cbPolicy,
-     URLZONEREG urlZoneReg,
-     DWORD dwFlags);
-
-
-void __stdcall IInternetZoneManagerEx_SetZoneActionPolicyEx_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID CLSID_SoftDistExt;  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _tagCODEBASEHOLD
-    {
-    ULONG cbSize;
-    LPWSTR szDistUnit;
-    LPWSTR szCodeBase;
-    DWORD dwVersionMS;
-    DWORD dwVersionLS;
-    DWORD dwStyle;
-    } 	CODEBASEHOLD;
-
-typedef struct _tagCODEBASEHOLD *LPCODEBASEHOLD;
-
-typedef struct _tagSOFTDISTINFO
-    {
-    ULONG cbSize;
-    DWORD dwFlags;
-    DWORD dwAdState;
-    LPWSTR szTitle;
-    LPWSTR szAbstract;
-    LPWSTR szHREF;
-    DWORD dwInstalledVersionMS;
-    DWORD dwInstalledVersionLS;
-    DWORD dwUpdateVersionMS;
-    DWORD dwUpdateVersionLS;
-    DWORD dwAdvertisedVersionMS;
-    DWORD dwAdvertisedVersionLS;
-    DWORD dwReserved;
-    } 	SOFTDISTINFO;
-
-typedef struct _tagSOFTDISTINFO *LPSOFTDISTINFO;
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0210_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0210_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_ISoftDistExt;
-
-
-    
-    struct __declspec(uuid("B15B8DC1-C7E1-11d0-8680-00AA00BDCB71")) __declspec(novtable)
-    ISoftDistExt : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall ProcessSoftDist( 
-             LPCWSTR szCDFURL,
-             IXMLElement *pSoftDistElement,
-             LPSOFTDISTINFO lpsdi) = 0;
-        
-        virtual HRESULT __stdcall GetFirstCodeBase( 
-             LPWSTR *szCodeBase,
-             LPDWORD dwMaxSize) = 0;
-        
-        virtual HRESULT __stdcall GetNextCodeBase( 
-             LPWSTR *szCodeBase,
-             LPDWORD dwMaxSize) = 0;
-        
-        virtual HRESULT __stdcall AsyncInstallDistributionUnit( 
-             IBindCtx *pbc,
-             LPVOID pvReserved,
-             DWORD flags,
-             LPCODEBASEHOLD lpcbh) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ISoftDistExt_ProcessSoftDist_Proxy( 
-    ISoftDistExt * This,
-     LPCWSTR szCDFURL,
-     IXMLElement *pSoftDistElement,
-     LPSOFTDISTINFO lpsdi);
-
-
-void __stdcall ISoftDistExt_ProcessSoftDist_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ISoftDistExt_GetFirstCodeBase_Proxy( 
-    ISoftDistExt * This,
-     LPWSTR *szCodeBase,
-     LPDWORD dwMaxSize);
-
-
-void __stdcall ISoftDistExt_GetFirstCodeBase_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ISoftDistExt_GetNextCodeBase_Proxy( 
-    ISoftDistExt * This,
-     LPWSTR *szCodeBase,
-     LPDWORD dwMaxSize);
-
-
-void __stdcall ISoftDistExt_GetNextCodeBase_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ISoftDistExt_AsyncInstallDistributionUnit_Proxy( 
-    ISoftDistExt * This,
-     IBindCtx *pbc,
-     LPVOID pvReserved,
-     DWORD flags,
-     LPCODEBASEHOLD lpcbh);
-
-
-void __stdcall ISoftDistExt_AsyncInstallDistributionUnit_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-extern "C" HRESULT __stdcall GetSoftwareUpdateInfo( LPCWSTR szDistUnit, LPSOFTDISTINFO psdi );
-extern "C" HRESULT __stdcall SetSoftwareUpdateAdvertisementState( LPCWSTR szDistUnit, DWORD dwAdState, DWORD dwAdvertisedVersionMS, DWORD dwAdvertisedVersionLS );
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0211_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0211_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  ICatalogFileInfo *LPCATALOGFILEINFO;
-
-
-extern "C" const IID IID_ICatalogFileInfo;
-
-
-    
-    struct __declspec(uuid("711C7600-6B48-11d1-B403-00AA00B92AF1")) __declspec(novtable)
-    ICatalogFileInfo : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetCatalogFile( 
-             LPSTR *ppszCatalogFile) = 0;
-        
-        virtual HRESULT __stdcall GetJavaTrust( 
-             void **ppJavaTrust) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ICatalogFileInfo_GetCatalogFile_Proxy( 
-    ICatalogFileInfo * This,
-     LPSTR *ppszCatalogFile);
-
-
-void __stdcall ICatalogFileInfo_GetCatalogFile_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICatalogFileInfo_GetJavaTrust_Proxy( 
-    ICatalogFileInfo * This,
-     void **ppJavaTrust);
-
-
-void __stdcall ICatalogFileInfo_GetJavaTrust_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0212_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0212_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IDataFilter *LPDATAFILTER;
-
-
-extern "C" const IID IID_IDataFilter;
-
-
-    
-    struct __declspec(uuid("69d14c80-c18e-11d0-a9ce-006097942311")) __declspec(novtable)
-    IDataFilter : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall DoEncode( 
-             DWORD dwFlags,
-             LONG lInBufferSize,
-             BYTE *pbInBuffer,
-             LONG lOutBufferSize,
-             BYTE *pbOutBuffer,
-             LONG lInBytesAvailable,
-             LONG *plInBytesRead,
-             LONG *plOutBytesWritten,
-             DWORD dwReserved) = 0;
-        
-        virtual HRESULT __stdcall DoDecode( 
-             DWORD dwFlags,
-             LONG lInBufferSize,
-             BYTE *pbInBuffer,
-             LONG lOutBufferSize,
-             BYTE *pbOutBuffer,
-             LONG lInBytesAvailable,
-             LONG *plInBytesRead,
-             LONG *plOutBytesWritten,
-             DWORD dwReserved) = 0;
-        
-        virtual HRESULT __stdcall SetEncodingLevel( 
-             DWORD dwEncLevel) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IDataFilter_DoEncode_Proxy( 
-    IDataFilter * This,
-     DWORD dwFlags,
-     LONG lInBufferSize,
-     BYTE *pbInBuffer,
-     LONG lOutBufferSize,
-     BYTE *pbOutBuffer,
-     LONG lInBytesAvailable,
-     LONG *plInBytesRead,
-     LONG *plOutBytesWritten,
-     DWORD dwReserved);
-
-
-void __stdcall IDataFilter_DoEncode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDataFilter_DoDecode_Proxy( 
-    IDataFilter * This,
-     DWORD dwFlags,
-     LONG lInBufferSize,
-     BYTE *pbInBuffer,
-     LONG lOutBufferSize,
-     BYTE *pbOutBuffer,
-     LONG lInBytesAvailable,
-     LONG *plInBytesRead,
-     LONG *plOutBytesWritten,
-     DWORD dwReserved);
-
-
-void __stdcall IDataFilter_DoDecode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDataFilter_SetEncodingLevel_Proxy( 
-    IDataFilter * This,
-     DWORD dwEncLevel);
-
-
-void __stdcall IDataFilter_SetEncodingLevel_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-typedef struct _tagPROTOCOLFILTERDATA
-    {
-    DWORD cbSize;
-    IInternetProtocolSink *pProtocolSink;
-    IInternetProtocol *pProtocol;
-    IUnknown *pUnk;
-    DWORD dwFilterFlags;
-    } 	PROTOCOLFILTERDATA;
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0213_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0213_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IEncodingFilterFactory *LPENCODINGFILTERFACTORY;
-
-typedef struct _tagDATAINFO
-    {
-    ULONG ulTotalSize;
-    ULONG ulavrPacketSize;
-    ULONG ulConnectSpeed;
-    ULONG ulProcessorSpeed;
-    } 	DATAINFO;
-
-
-extern "C" const IID IID_IEncodingFilterFactory;
-
-
-    
-    struct __declspec(uuid("70bdde00-c18e-11d0-a9ce-006097942311")) __declspec(novtable)
-    IEncodingFilterFactory : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall FindBestFilter( 
-             LPCWSTR pwzCodeIn,
-             LPCWSTR pwzCodeOut,
-             DATAINFO info,
-             IDataFilter **ppDF) = 0;
-        
-        virtual HRESULT __stdcall GetDefaultFilter( 
-             LPCWSTR pwzCodeIn,
-             LPCWSTR pwzCodeOut,
-             IDataFilter **ppDF) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IEncodingFilterFactory_FindBestFilter_Proxy( 
-    IEncodingFilterFactory * This,
-     LPCWSTR pwzCodeIn,
-     LPCWSTR pwzCodeOut,
-     DATAINFO info,
-     IDataFilter **ppDF);
-
-
-void __stdcall IEncodingFilterFactory_FindBestFilter_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEncodingFilterFactory_GetDefaultFilter_Proxy( 
-    IEncodingFilterFactory * This,
-     LPCWSTR pwzCodeIn,
-     LPCWSTR pwzCodeOut,
-     IDataFilter **ppDF);
-
-
-void __stdcall IEncodingFilterFactory_GetDefaultFilter_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-BOOL __stdcall IsLoggingEnabledA( LPCSTR  pszUrl);                    
-BOOL __stdcall IsLoggingEnabledW( LPCWSTR  pwszUrl);                  
-
-
-
-
-
-typedef struct _tagHIT_LOGGING_INFO
-    {
-    DWORD dwStructSize;
-    LPSTR lpszLoggedUrlName;
-    SYSTEMTIME StartTime;
-    SYSTEMTIME EndTime;
-    LPSTR lpszExtendedInfo;
-    } 	HIT_LOGGING_INFO;
-
-typedef struct _tagHIT_LOGGING_INFO *LPHIT_LOGGING_INFO;
-
-BOOL __stdcall WriteHitLogging( LPHIT_LOGGING_INFO lpLogginginfo);    
-
-struct CONFIRMSAFETY
-    {
-    CLSID clsid;
-    IUnknown *pUnk;
-    DWORD dwFlags;
-    } ;
-extern "C" const GUID GUID_CUSTOM_CONFIRMOBJECTSAFETY; 
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0214_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0214_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IWrappedProtocol *LPIWRAPPEDPROTOCOL;
-
-
-extern "C" const IID IID_IWrappedProtocol;
-
-
-    
-    struct __declspec(uuid("53c84785-8425-4dc5-971b-e58d9c19f9b6")) __declspec(novtable)
-    IWrappedProtocol : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetWrapperCode( 
-             LONG *pnCode,
-             DWORD_PTR dwReserved) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IWrappedProtocol_GetWrapperCode_Proxy( 
-    IWrappedProtocol * This,
-     LONG *pnCode,
-     DWORD_PTR dwReserved);
-
-
-void __stdcall IWrappedProtocol_GetWrapperCode_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0215_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_urlmon_0215_v0_0_s_ifspec;
-
-
-
-unsigned long             __stdcall  HWND_UserSize(     unsigned long *, unsigned long            , HWND * ); 
-unsigned char * __stdcall  HWND_UserMarshal(  unsigned long *, unsigned char *, HWND * ); 
-unsigned char * __stdcall  HWND_UserUnmarshal(unsigned long *, unsigned char *, HWND * ); 
-void                      __stdcall  HWND_UserFree(     unsigned long *, HWND * ); 
-
- HRESULT __stdcall IBinding_GetBindResult_Proxy( 
-    IBinding * This,
-     CLSID *pclsidProtocol,
-     DWORD *pdwResult,
-     LPOLESTR *pszResult,
-     DWORD *pdwReserved);
-
-
- HRESULT __stdcall IBinding_GetBindResult_Stub( 
-    IBinding * This,
-     CLSID *pclsidProtocol,
-     DWORD *pdwResult,
-     LPOLESTR *pszResult,
-     DWORD dwReserved);
-
- HRESULT __stdcall IBindStatusCallback_GetBindInfo_Proxy( 
-    IBindStatusCallback * This,
-     DWORD *grfBINDF,
-     BINDINFO *pbindinfo);
-
-
- HRESULT __stdcall IBindStatusCallback_GetBindInfo_Stub( 
-    IBindStatusCallback * This,
-     DWORD *grfBINDF,
-     RemBINDINFO *pbindinfo,
-     RemSTGMEDIUM *pstgmed);
-
- HRESULT __stdcall IBindStatusCallback_OnDataAvailable_Proxy( 
-    IBindStatusCallback * This,
-     DWORD grfBSCF,
-     DWORD dwSize,
-     FORMATETC *pformatetc,
-     STGMEDIUM *pstgmed);
-
-
- HRESULT __stdcall IBindStatusCallback_OnDataAvailable_Stub( 
-    IBindStatusCallback * This,
-     DWORD grfBSCF,
-     DWORD dwSize,
-     RemFORMATETC *pformatetc,
-     RemSTGMEDIUM *pstgmed);
-
- HRESULT __stdcall IWinInetInfo_QueryOption_Proxy( 
-    IWinInetInfo * This,
-     DWORD dwOption,
-     LPVOID pBuffer,
-     DWORD *pcbBuf);
-
-
- HRESULT __stdcall IWinInetInfo_QueryOption_Stub( 
-    IWinInetInfo * This,
-     DWORD dwOption,
-     BYTE *pBuffer,
-     DWORD *pcbBuf);
-
- HRESULT __stdcall IWinInetHttpInfo_QueryInfo_Proxy( 
-    IWinInetHttpInfo * This,
-     DWORD dwOption,
-     LPVOID pBuffer,
-     DWORD *pcbBuf,
-     DWORD *pdwFlags,
-     DWORD *pdwReserved);
-
-
- HRESULT __stdcall IWinInetHttpInfo_QueryInfo_Stub( 
-    IWinInetHttpInfo * This,
-     DWORD dwOption,
-     BYTE *pBuffer,
-     DWORD *pcbBuf,
-     DWORD *pdwFlags,
-     DWORD *pdwReserved);
-
- HRESULT __stdcall IBindHost_MonikerBindToStorage_Proxy( 
-    IBindHost * This,
-     IMoniker *pMk,
-     IBindCtx *pBC,
-     IBindStatusCallback *pBSC,
-     const IID & riid,
-     void **ppvObj);
-
-
- HRESULT __stdcall IBindHost_MonikerBindToStorage_Stub( 
-    IBindHost * This,
-     IMoniker *pMk,
-     IBindCtx *pBC,
-     IBindStatusCallback *pBSC,
-     const IID & riid,
-     IUnknown **ppvObj);
-
- HRESULT __stdcall IBindHost_MonikerBindToObject_Proxy( 
-    IBindHost * This,
-     IMoniker *pMk,
-     IBindCtx *pBC,
-     IBindStatusCallback *pBSC,
-     const IID & riid,
-     void **ppvObj);
-
-
- HRESULT __stdcall IBindHost_MonikerBindToObject_Stub( 
-    IBindHost * This,
-     IMoniker *pMk,
-     IBindCtx *pBC,
-     IBindStatusCallback *pBSC,
-     const IID & riid,
-     IUnknown **ppvObj);
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-#pragma warning( disable: 4049 )  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
- 
-
-
-
-typedef struct IPropertyStorage IPropertyStorage;
-
-
-
-
-
-typedef struct IPropertySetStorage IPropertySetStorage;
-
-
-
-
-
-typedef struct IEnumSTATPROPSTG IEnumSTATPROPSTG;
-
-
-
-
-
-typedef struct IEnumSTATPROPSETSTG IEnumSTATPROPSETSTG;
-
-
-
-
-
-
-
-
-extern "C"{
-
-
-void * __stdcall MIDL_user_allocate(size_t);
-void __stdcall MIDL_user_free( void * ); 
-
-
- 
-
-
-
-
-
-
-
-
-
-#pragma warning(push)
-
-#pragma warning(disable:4201)    
-#pragma warning(disable:4237)    
-
-
-#pragma once
-
-
-
-
-typedef struct tagVersionedStream
-    {
-    GUID guidVersion;
-    IStream *pStream;
-    } 	VERSIONEDSTREAM;
-
-typedef struct tagVersionedStream *LPVERSIONEDSTREAM;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagPROPVARIANT PROPVARIANT;
-
-typedef struct tagCAC
-    {
-    ULONG cElems;
-     CHAR *pElems;
-    } 	CAC;
-
-typedef struct tagCAUB
-    {
-    ULONG cElems;
-     UCHAR *pElems;
-    } 	CAUB;
-
-typedef struct tagCAI
-    {
-    ULONG cElems;
-     SHORT *pElems;
-    } 	CAI;
-
-typedef struct tagCAUI
-    {
-    ULONG cElems;
-     USHORT *pElems;
-    } 	CAUI;
-
-typedef struct tagCAL
-    {
-    ULONG cElems;
-     LONG *pElems;
-    } 	CAL;
-
-typedef struct tagCAUL
-    {
-    ULONG cElems;
-     ULONG *pElems;
-    } 	CAUL;
-
-typedef struct tagCAFLT
-    {
-    ULONG cElems;
-     FLOAT *pElems;
-    } 	CAFLT;
-
-typedef struct tagCADBL
-    {
-    ULONG cElems;
-     DOUBLE *pElems;
-    } 	CADBL;
-
-typedef struct tagCACY
-    {
-    ULONG cElems;
-     CY *pElems;
-    } 	CACY;
-
-typedef struct tagCADATE
-    {
-    ULONG cElems;
-     DATE *pElems;
-    } 	CADATE;
-
-typedef struct tagCABSTR
-    {
-    ULONG cElems;
-     BSTR *pElems;
-    } 	CABSTR;
-
-typedef struct tagCABSTRBLOB
-    {
-    ULONG cElems;
-     BSTRBLOB *pElems;
-    } 	CABSTRBLOB;
-
-typedef struct tagCABOOL
-    {
-    ULONG cElems;
-     VARIANT_BOOL *pElems;
-    } 	CABOOL;
-
-typedef struct tagCASCODE
-    {
-    ULONG cElems;
-     SCODE *pElems;
-    } 	CASCODE;
-
-typedef struct tagCAPROPVARIANT
-    {
-    ULONG cElems;
-     PROPVARIANT *pElems;
-    } 	CAPROPVARIANT;
-
-typedef struct tagCAH
-    {
-    ULONG cElems;
-     LARGE_INTEGER *pElems;
-    } 	CAH;
-
-typedef struct tagCAUH
-    {
-    ULONG cElems;
-     ULARGE_INTEGER *pElems;
-    } 	CAUH;
-
-typedef struct tagCALPSTR
-    {
-    ULONG cElems;
-     LPSTR *pElems;
-    } 	CALPSTR;
-
-typedef struct tagCALPWSTR
-    {
-    ULONG cElems;
-     LPWSTR *pElems;
-    } 	CALPWSTR;
-
-typedef struct tagCAFILETIME
-    {
-    ULONG cElems;
-     FILETIME *pElems;
-    } 	CAFILETIME;
-
-typedef struct tagCACLIPDATA
-    {
-    ULONG cElems;
-     CLIPDATA *pElems;
-    } 	CACLIPDATA;
-
-typedef struct tagCACLSID
-    {
-    ULONG cElems;
-     CLSID *pElems;
-    } 	CACLSID;
-
-
-
-
-
-
-
-
-
-
-
-typedef WORD PROPVAR_PAD1;
-typedef WORD PROPVAR_PAD2;
-typedef WORD PROPVAR_PAD3;
-
-
-
-struct tagPROPVARIANT {
-  union {
-
-struct 
-    {
-    VARTYPE vt;
-    PROPVAR_PAD1 wReserved1;
-    PROPVAR_PAD2 wReserved2;
-    PROPVAR_PAD3 wReserved3;
-      union 
-        {
-           
-         CHAR cVal;
-         UCHAR bVal;
-         SHORT iVal;
-         USHORT uiVal;
-         LONG lVal;
-         ULONG ulVal;
-         INT intVal;
-         UINT uintVal;
-         LARGE_INTEGER hVal;
-         ULARGE_INTEGER uhVal;
-         FLOAT fltVal;
-         DOUBLE dblVal;
-         VARIANT_BOOL boolVal;
-         
-         SCODE scode;
-         CY cyVal;
-         DATE date;
-         FILETIME filetime;
-         CLSID *puuid;
-         CLIPDATA *pclipdata;
-         BSTR bstrVal;
-         BSTRBLOB bstrblobVal;
-         BLOB blob;
-         LPSTR pszVal;
-         LPWSTR pwszVal;
-         IUnknown *punkVal;
-         IDispatch *pdispVal;
-         IStream *pStream;
-         IStorage *pStorage;
-         LPVERSIONEDSTREAM pVersionedStream;
-         LPSAFEARRAY parray;
-         CAC cac;
-         CAUB caub;
-         CAI cai;
-         CAUI caui;
-         CAL cal;
-         CAUL caul;
-         CAH cah;
-         CAUH cauh;
-         CAFLT caflt;
-         CADBL cadbl;
-         CABOOL cabool;
-         CASCODE cascode;
-         CACY cacy;
-         CADATE cadate;
-         CAFILETIME cafiletime;
-         CACLSID cauuid;
-         CACLIPDATA caclipdata;
-         CABSTR cabstr;
-         CABSTRBLOB cabstrblob;
-         CALPSTR calpstr;
-         CALPWSTR calpwstr;
-         CAPROPVARIANT capropvar;
-         CHAR *pcVal;
-         UCHAR *pbVal;
-         SHORT *piVal;
-         USHORT *puiVal;
-         LONG *plVal;
-         ULONG *pulVal;
-         INT *pintVal;
-         UINT *puintVal;
-         FLOAT *pfltVal;
-         DOUBLE *pdblVal;
-         VARIANT_BOOL *pboolVal;
-         DECIMAL *pdecVal;
-         SCODE *pscode;
-         CY *pcyVal;
-         DATE *pdate;
-         BSTR *pbstrVal;
-         IUnknown **ppunkVal;
-         IDispatch **ppdispVal;
-         LPSAFEARRAY *pparray;
-         PROPVARIANT *pvarVal;
-        } 	;
-    } ;
-
-    DECIMAL decVal;
-  };
-};
-
-
-
-
-
-
-
-typedef struct tagPROPVARIANT * LPPROPVARIANT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-enum PIDMSI_STATUS_VALUE
-    {	PIDMSI_STATUS_NORMAL	= 0,
-	PIDMSI_STATUS_NEW	= PIDMSI_STATUS_NORMAL + 1,
-	PIDMSI_STATUS_PRELIM	= PIDMSI_STATUS_NEW + 1,
-	PIDMSI_STATUS_DRAFT	= PIDMSI_STATUS_PRELIM + 1,
-	PIDMSI_STATUS_INPROGRESS	= PIDMSI_STATUS_DRAFT + 1,
-	PIDMSI_STATUS_EDIT	= PIDMSI_STATUS_INPROGRESS + 1,
-	PIDMSI_STATUS_REVIEW	= PIDMSI_STATUS_EDIT + 1,
-	PIDMSI_STATUS_PROOF	= PIDMSI_STATUS_REVIEW + 1,
-	PIDMSI_STATUS_FINAL	= PIDMSI_STATUS_PROOF + 1,
-	PIDMSI_STATUS_OTHER	= 0x7fff
-    } ;
-
-
-
-
-
-
-typedef struct tagPROPSPEC
-    {
-    ULONG ulKind;
-      union 
-        {
-         PROPID propid;
-         LPOLESTR lpwstr;
-           
-        } 	;
-    } 	PROPSPEC;
-
-typedef struct tagSTATPROPSTG
-    {
-    LPOLESTR lpwstrName;
-    PROPID propid;
-    VARTYPE vt;
-    } 	STATPROPSTG;
-
-
-
-
-
-
-typedef struct tagSTATPROPSETSTG
-    {
-    FMTID fmtid;
-    CLSID clsid;
-    DWORD grfFlags;
-    FILETIME mtime;
-    FILETIME ctime;
-    FILETIME atime;
-    DWORD dwOSVersion;
-    } 	STATPROPSETSTG;
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_propidl_0000_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_propidl_0000_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IPropertyStorage;
-
-
-    
-    struct __declspec(uuid("00000138-0000-0000-C000-000000000046")) __declspec(novtable)
-    IPropertyStorage : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall ReadMultiple( 
-             ULONG cpspec,
-             const PROPSPEC rgpspec[  ],
-             PROPVARIANT rgpropvar[  ]) = 0;
-        
-        virtual HRESULT __stdcall WriteMultiple( 
-             ULONG cpspec,
-             const PROPSPEC rgpspec[  ],
-             const PROPVARIANT rgpropvar[  ],
-             PROPID propidNameFirst) = 0;
-        
-        virtual HRESULT __stdcall DeleteMultiple( 
-             ULONG cpspec,
-             const PROPSPEC rgpspec[  ]) = 0;
-        
-        virtual HRESULT __stdcall ReadPropertyNames( 
-             ULONG cpropid,
-             const PROPID rgpropid[  ],
-             LPOLESTR rglpwstrName[  ]) = 0;
-        
-        virtual HRESULT __stdcall WritePropertyNames( 
-             ULONG cpropid,
-             const PROPID rgpropid[  ],
-             const LPOLESTR rglpwstrName[  ]) = 0;
-        
-        virtual HRESULT __stdcall DeletePropertyNames( 
-             ULONG cpropid,
-             const PROPID rgpropid[  ]) = 0;
-        
-        virtual HRESULT __stdcall Commit( 
-             DWORD grfCommitFlags) = 0;
-        
-        virtual HRESULT __stdcall Revert( void) = 0;
-        
-        virtual HRESULT __stdcall Enum( 
-             IEnumSTATPROPSTG **ppenum) = 0;
-        
-        virtual HRESULT __stdcall SetTimes( 
-             const FILETIME *pctime,
-             const FILETIME *patime,
-             const FILETIME *pmtime) = 0;
-        
-        virtual HRESULT __stdcall SetClass( 
-             const IID & clsid) = 0;
-        
-        virtual HRESULT __stdcall Stat( 
-             STATPROPSETSTG *pstatpsstg) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPropertyStorage_ReadMultiple_Proxy( 
-    IPropertyStorage * This,
-     ULONG cpspec,
-     const PROPSPEC rgpspec[  ],
-     PROPVARIANT rgpropvar[  ]);
-
-
-void __stdcall IPropertyStorage_ReadMultiple_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyStorage_WriteMultiple_Proxy( 
-    IPropertyStorage * This,
-     ULONG cpspec,
-     const PROPSPEC rgpspec[  ],
-     const PROPVARIANT rgpropvar[  ],
-     PROPID propidNameFirst);
-
-
-void __stdcall IPropertyStorage_WriteMultiple_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyStorage_DeleteMultiple_Proxy( 
-    IPropertyStorage * This,
-     ULONG cpspec,
-     const PROPSPEC rgpspec[  ]);
-
-
-void __stdcall IPropertyStorage_DeleteMultiple_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyStorage_ReadPropertyNames_Proxy( 
-    IPropertyStorage * This,
-     ULONG cpropid,
-     const PROPID rgpropid[  ],
-     LPOLESTR rglpwstrName[  ]);
-
-
-void __stdcall IPropertyStorage_ReadPropertyNames_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyStorage_WritePropertyNames_Proxy( 
-    IPropertyStorage * This,
-     ULONG cpropid,
-     const PROPID rgpropid[  ],
-     const LPOLESTR rglpwstrName[  ]);
-
-
-void __stdcall IPropertyStorage_WritePropertyNames_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyStorage_DeletePropertyNames_Proxy( 
-    IPropertyStorage * This,
-     ULONG cpropid,
-     const PROPID rgpropid[  ]);
-
-
-void __stdcall IPropertyStorage_DeletePropertyNames_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyStorage_Commit_Proxy( 
-    IPropertyStorage * This,
-     DWORD grfCommitFlags);
-
-
-void __stdcall IPropertyStorage_Commit_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyStorage_Revert_Proxy( 
-    IPropertyStorage * This);
-
-
-void __stdcall IPropertyStorage_Revert_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyStorage_Enum_Proxy( 
-    IPropertyStorage * This,
-     IEnumSTATPROPSTG **ppenum);
-
-
-void __stdcall IPropertyStorage_Enum_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyStorage_SetTimes_Proxy( 
-    IPropertyStorage * This,
-     const FILETIME *pctime,
-     const FILETIME *patime,
-     const FILETIME *pmtime);
-
-
-void __stdcall IPropertyStorage_SetTimes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyStorage_SetClass_Proxy( 
-    IPropertyStorage * This,
-     const IID & clsid);
-
-
-void __stdcall IPropertyStorage_SetClass_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyStorage_Stat_Proxy( 
-    IPropertyStorage * This,
-     STATPROPSETSTG *pstatpsstg);
-
-
-void __stdcall IPropertyStorage_Stat_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IPropertySetStorage *LPPROPERTYSETSTORAGE;
-
-
-extern "C" const IID IID_IPropertySetStorage;
-
-
-    
-    struct __declspec(uuid("0000013A-0000-0000-C000-000000000046")) __declspec(novtable)
-    IPropertySetStorage : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Create( 
-             const IID & rfmtid,
-             const CLSID *pclsid,
-             DWORD grfFlags,
-             DWORD grfMode,
-             IPropertyStorage **ppprstg) = 0;
-        
-        virtual HRESULT __stdcall Open( 
-             const IID & rfmtid,
-             DWORD grfMode,
-             IPropertyStorage **ppprstg) = 0;
-        
-        virtual HRESULT __stdcall Delete( 
-             const IID & rfmtid) = 0;
-        
-        virtual HRESULT __stdcall Enum( 
-             IEnumSTATPROPSETSTG **ppenum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPropertySetStorage_Create_Proxy( 
-    IPropertySetStorage * This,
-     const IID & rfmtid,
-     const CLSID *pclsid,
-     DWORD grfFlags,
-     DWORD grfMode,
-     IPropertyStorage **ppprstg);
-
-
-void __stdcall IPropertySetStorage_Create_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertySetStorage_Open_Proxy( 
-    IPropertySetStorage * This,
-     const IID & rfmtid,
-     DWORD grfMode,
-     IPropertyStorage **ppprstg);
-
-
-void __stdcall IPropertySetStorage_Open_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertySetStorage_Delete_Proxy( 
-    IPropertySetStorage * This,
-     const IID & rfmtid);
-
-
-void __stdcall IPropertySetStorage_Delete_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertySetStorage_Enum_Proxy( 
-    IPropertySetStorage * This,
-     IEnumSTATPROPSETSTG **ppenum);
-
-
-void __stdcall IPropertySetStorage_Enum_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IEnumSTATPROPSTG *LPENUMSTATPROPSTG;
-
-
-extern "C" const IID IID_IEnumSTATPROPSTG;
-
-
-    
-    struct __declspec(uuid("00000139-0000-0000-C000-000000000046")) __declspec(novtable)
-    IEnumSTATPROPSTG : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Next( 
-             ULONG celt,
-             STATPROPSTG *rgelt,
-             ULONG *pceltFetched) = 0;
-        
-        virtual HRESULT __stdcall Skip( 
-             ULONG celt) = 0;
-        
-        virtual HRESULT __stdcall Reset( void) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IEnumSTATPROPSTG **ppenum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IEnumSTATPROPSTG_RemoteNext_Proxy( 
-    IEnumSTATPROPSTG * This,
-     ULONG celt,
-     STATPROPSTG *rgelt,
-     ULONG *pceltFetched);
-
-
-void __stdcall IEnumSTATPROPSTG_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumSTATPROPSTG_Skip_Proxy( 
-    IEnumSTATPROPSTG * This,
-     ULONG celt);
-
-
-void __stdcall IEnumSTATPROPSTG_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumSTATPROPSTG_Reset_Proxy( 
-    IEnumSTATPROPSTG * This);
-
-
-void __stdcall IEnumSTATPROPSTG_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumSTATPROPSTG_Clone_Proxy( 
-    IEnumSTATPROPSTG * This,
-     IEnumSTATPROPSTG **ppenum);
-
-
-void __stdcall IEnumSTATPROPSTG_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IEnumSTATPROPSETSTG *LPENUMSTATPROPSETSTG;
-
-
-extern "C" const IID IID_IEnumSTATPROPSETSTG;
-
-
-    
-    struct __declspec(uuid("0000013B-0000-0000-C000-000000000046")) __declspec(novtable)
-    IEnumSTATPROPSETSTG : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Next( 
-             ULONG celt,
-             STATPROPSETSTG *rgelt,
-             ULONG *pceltFetched) = 0;
-        
-        virtual HRESULT __stdcall Skip( 
-             ULONG celt) = 0;
-        
-        virtual HRESULT __stdcall Reset( void) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IEnumSTATPROPSETSTG **ppenum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IEnumSTATPROPSETSTG_RemoteNext_Proxy( 
-    IEnumSTATPROPSETSTG * This,
-     ULONG celt,
-     STATPROPSETSTG *rgelt,
-     ULONG *pceltFetched);
-
-
-void __stdcall IEnumSTATPROPSETSTG_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumSTATPROPSETSTG_Skip_Proxy( 
-    IEnumSTATPROPSETSTG * This,
-     ULONG celt);
-
-
-void __stdcall IEnumSTATPROPSETSTG_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumSTATPROPSETSTG_Reset_Proxy( 
-    IEnumSTATPROPSETSTG * This);
-
-
-void __stdcall IEnumSTATPROPSETSTG_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumSTATPROPSETSTG_Clone_Proxy( 
-    IEnumSTATPROPSETSTG * This,
-     IEnumSTATPROPSETSTG **ppenum);
-
-
-void __stdcall IEnumSTATPROPSETSTG_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-typedef  IPropertyStorage *LPPROPERTYSTORAGE;
-
-extern "C" __declspec(dllimport) HRESULT __stdcall PropVariantCopy ( PROPVARIANT * pvarDest, const PROPVARIANT * pvarSrc );
-extern "C" __declspec(dllimport) HRESULT __stdcall PropVariantClear ( PROPVARIANT * pvar );
-extern "C" __declspec(dllimport) HRESULT __stdcall FreePropVariantArray ( ULONG cVariants, PROPVARIANT * rgvars );
-
-
-
-inline void PropVariantInit ( PROPVARIANT * pvar )
-{
-    memset ( pvar, 0, sizeof(PROPVARIANT) );
-}
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall StgCreatePropStg( IUnknown* pUnk, const IID & fmtid, const CLSID *pclsid, DWORD grfFlags, DWORD dwReserved, IPropertyStorage **ppPropStg );
-extern "C" __declspec(dllimport) HRESULT __stdcall StgOpenPropStg( IUnknown* pUnk, const IID & fmtid, DWORD grfFlags, DWORD dwReserved, IPropertyStorage **ppPropStg );
-extern "C" __declspec(dllimport) HRESULT __stdcall StgCreatePropSetStg( IStorage *pStorage, DWORD dwReserved, IPropertySetStorage **ppPropSetStg);
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall FmtIdToPropStgName( const FMTID *pfmtid, LPOLESTR oszName );
-extern "C" __declspec(dllimport) HRESULT __stdcall PropStgNameToFmtId( const LPOLESTR oszName, FMTID *pfmtid );
-
-
-#pragma warning(pop)
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_propidl_0120_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_propidl_0120_v0_0_s_ifspec;
-
-
-
-unsigned long             __stdcall  BSTR_UserSize(     unsigned long *, unsigned long            , BSTR * ); 
-unsigned char * __stdcall  BSTR_UserMarshal(  unsigned long *, unsigned char *, BSTR * ); 
-unsigned char * __stdcall  BSTR_UserUnmarshal(unsigned long *, unsigned char *, BSTR * ); 
-void                      __stdcall  BSTR_UserFree(     unsigned long *, BSTR * ); 
-
-unsigned long             __stdcall  LPSAFEARRAY_UserSize(     unsigned long *, unsigned long            , LPSAFEARRAY * ); 
-unsigned char * __stdcall  LPSAFEARRAY_UserMarshal(  unsigned long *, unsigned char *, LPSAFEARRAY * ); 
-unsigned char * __stdcall  LPSAFEARRAY_UserUnmarshal(unsigned long *, unsigned char *, LPSAFEARRAY * ); 
-void                      __stdcall  LPSAFEARRAY_UserFree(     unsigned long *, LPSAFEARRAY * ); 
-
- HRESULT __stdcall IEnumSTATPROPSTG_Next_Proxy( 
-    IEnumSTATPROPSTG * This,
-     ULONG celt,
-     STATPROPSTG *rgelt,
-     ULONG *pceltFetched);
-
-
- HRESULT __stdcall IEnumSTATPROPSTG_Next_Stub( 
-    IEnumSTATPROPSTG * This,
-     ULONG celt,
-     STATPROPSTG *rgelt,
-     ULONG *pceltFetched);
-
- HRESULT __stdcall IEnumSTATPROPSETSTG_Next_Proxy( 
-    IEnumSTATPROPSETSTG * This,
-     ULONG celt,
-     STATPROPSETSTG *rgelt,
-     ULONG *pceltFetched);
-
-
- HRESULT __stdcall IEnumSTATPROPSETSTG_Next_Stub( 
-    IEnumSTATPROPSETSTG * This,
-     ULONG celt,
-     STATPROPSETSTG *rgelt,
-     ULONG *pceltFetched);
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CreateStdProgressIndicator( HWND hwndParent,
-                                     LPCOLESTR pszTitle,
-                                     IBindStatusCallback * pIbscCaller,
-                                    IBindStatusCallback ** ppIbsc);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,8)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" const IID IID_StdOle;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) BSTR __stdcall SysAllocString(const OLECHAR *);
-extern "C" __declspec(dllimport) INT __stdcall  SysReAllocString(BSTR *, const OLECHAR *);
-extern "C" __declspec(dllimport) BSTR __stdcall SysAllocStringLen(const OLECHAR *, UINT);
-extern "C" __declspec(dllimport) INT __stdcall  SysReAllocStringLen(BSTR *, const OLECHAR *, UINT);
-extern "C" __declspec(dllimport) void __stdcall SysFreeString(BSTR);
-extern "C" __declspec(dllimport) UINT __stdcall SysStringLen(BSTR);
-
-
-extern "C" __declspec(dllimport) UINT __stdcall SysStringByteLen(BSTR bstr);
-extern "C" __declspec(dllimport) BSTR __stdcall SysAllocStringByteLen(LPCSTR psz, UINT len);
-
-
-
-
-
-
-extern "C" __declspec(dllimport) INT __stdcall DosDateTimeToVariantTime(USHORT wDosDate, USHORT wDosTime, DOUBLE * pvtime);
-
-extern "C" __declspec(dllimport) INT __stdcall VariantTimeToDosDateTime(DOUBLE vtime, USHORT * pwDosDate, USHORT * pwDosTime);
-
-
-extern "C" __declspec(dllimport) INT __stdcall SystemTimeToVariantTime(LPSYSTEMTIME lpSystemTime, DOUBLE *pvtime);
-extern "C" __declspec(dllimport) INT __stdcall VariantTimeToSystemTime(DOUBLE vtime, LPSYSTEMTIME lpSystemTime);
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayAllocDescriptor(UINT cDims, SAFEARRAY ** ppsaOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayAllocDescriptorEx(VARTYPE vt, UINT cDims, SAFEARRAY ** ppsaOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayAllocData(SAFEARRAY * psa);
-extern "C" __declspec(dllimport) SAFEARRAY * __stdcall SafeArrayCreate(VARTYPE vt, UINT cDims, SAFEARRAYBOUND * rgsabound);
-extern "C" __declspec(dllimport) SAFEARRAY * __stdcall SafeArrayCreateEx(VARTYPE vt, UINT cDims, SAFEARRAYBOUND * rgsabound, PVOID pvExtra);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayCopyData(SAFEARRAY *psaSource, SAFEARRAY *psaTarget);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayDestroyDescriptor(SAFEARRAY * psa);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayDestroyData(SAFEARRAY * psa);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayDestroy(SAFEARRAY * psa);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayRedim(SAFEARRAY * psa, SAFEARRAYBOUND * psaboundNew);
-extern "C" __declspec(dllimport) UINT __stdcall SafeArrayGetDim(SAFEARRAY * psa);
-extern "C" __declspec(dllimport) UINT __stdcall SafeArrayGetElemsize(SAFEARRAY * psa);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayGetUBound(SAFEARRAY * psa, UINT nDim, LONG * plUbound);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayGetLBound(SAFEARRAY * psa, UINT nDim, LONG * plLbound);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayLock(SAFEARRAY * psa);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayUnlock(SAFEARRAY * psa);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayAccessData(SAFEARRAY * psa, void ** ppvData);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayUnaccessData(SAFEARRAY * psa);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayGetElement(SAFEARRAY * psa, LONG * rgIndices, void * pv);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayPutElement(SAFEARRAY * psa, LONG * rgIndices, void * pv);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayCopy(SAFEARRAY * psa, SAFEARRAY ** ppsaOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayPtrOfIndex(SAFEARRAY * psa, LONG * rgIndices, void ** ppvData);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArraySetRecordInfo(SAFEARRAY * psa, IRecordInfo * prinfo);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayGetRecordInfo(SAFEARRAY * psa, IRecordInfo ** prinfo);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArraySetIID(SAFEARRAY * psa, const GUID & guid);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayGetIID(SAFEARRAY * psa, GUID * pguid);
-extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayGetVartype(SAFEARRAY * psa, VARTYPE * pvt);
-extern "C" __declspec(dllimport) SAFEARRAY * __stdcall SafeArrayCreateVector(VARTYPE vt, LONG lLbound, ULONG cElements);
-extern "C" __declspec(dllimport) SAFEARRAY * __stdcall SafeArrayCreateVectorEx(VARTYPE vt, LONG lLbound, ULONG cElements, PVOID pvExtra);
-
-
-
-
-
-extern "C" __declspec(dllimport) void __stdcall VariantInit(VARIANTARG * pvarg);
-extern "C" __declspec(dllimport) HRESULT __stdcall VariantClear(VARIANTARG * pvarg);
-extern "C" __declspec(dllimport) HRESULT __stdcall VariantCopy(VARIANTARG * pvargDest, VARIANTARG * pvargSrc);
-extern "C" __declspec(dllimport) HRESULT __stdcall VariantCopyInd(VARIANT * pvarDest, VARIANTARG * pvargSrc);
-extern "C" __declspec(dllimport) HRESULT __stdcall VariantChangeType(VARIANTARG * pvargDest,
-                VARIANTARG * pvarSrc, USHORT wFlags, VARTYPE vt);
-extern "C" __declspec(dllimport) HRESULT __stdcall VariantChangeTypeEx(VARIANTARG * pvargDest,
-                VARIANTARG * pvarSrc, LCID lcid, USHORT wFlags, VARTYPE vt);
-
-
-
-
-                                      
-                                      
-
-				      
-				      
-
-
-                                      
-                                      
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VectorFromBstr (BSTR bstr, SAFEARRAY ** ppsa);
-extern "C" __declspec(dllimport) HRESULT __stdcall BstrFromVector (SAFEARRAY *psa, BSTR *pbstr);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromI2(SHORT sIn, BYTE * pbOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromI4(LONG lIn, BYTE * pbOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromI8(LONG64 i64In, BYTE * pbOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromR4(FLOAT fltIn, BYTE * pbOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromR8(DOUBLE dblIn, BYTE * pbOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromCy(CY cyIn, BYTE * pbOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromDate(DATE dateIn, BYTE * pbOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromStr(OLECHAR * strIn, LCID lcid, ULONG dwFlags, BYTE * pbOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromDisp(IDispatch * pdispIn, LCID lcid, BYTE * pbOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromBool(VARIANT_BOOL boolIn, BYTE * pbOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromI1(CHAR cIn, BYTE *pbOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromUI2(USHORT uiIn, BYTE *pbOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromUI4(ULONG ulIn, BYTE *pbOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromUI8(ULONG64 ui64In, BYTE * pbOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromDec(DECIMAL *pdecIn, BYTE *pbOut);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromUI1(BYTE bIn, SHORT * psOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromI4(LONG lIn, SHORT * psOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromI8(LONG64 i64In, SHORT * psOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromR4(FLOAT fltIn, SHORT * psOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromR8(DOUBLE dblIn, SHORT * psOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromCy(CY cyIn, SHORT * psOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromDate(DATE dateIn, SHORT * psOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromStr(OLECHAR * strIn, LCID lcid, ULONG dwFlags, SHORT * psOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromDisp(IDispatch * pdispIn, LCID lcid, SHORT * psOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromBool(VARIANT_BOOL boolIn, SHORT * psOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromI1(CHAR cIn, SHORT *psOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromUI2(USHORT uiIn, SHORT *psOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromUI4(ULONG ulIn, SHORT *psOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromUI8(ULONG64 ui64In, SHORT * psOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromDec(DECIMAL *pdecIn, SHORT *psOut);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromUI1(BYTE bIn, LONG * plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromI2(SHORT sIn, LONG * plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromI8(LONG64 i64In, LONG * plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromR4(FLOAT fltIn, LONG * plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromR8(DOUBLE dblIn, LONG * plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromCy(CY cyIn, LONG * plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromDate(DATE dateIn, LONG * plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromStr(OLECHAR * strIn, LCID lcid, ULONG dwFlags, LONG * plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromDisp(IDispatch * pdispIn, LCID lcid, LONG * plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromBool(VARIANT_BOOL boolIn, LONG * plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromI1(CHAR cIn, LONG *plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromUI2(USHORT uiIn, LONG *plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromUI4(ULONG ulIn, LONG *plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromUI8(ULONG64 ui64In, LONG * plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromDec(DECIMAL *pdecIn, LONG *plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromInt(INT intIn, LONG *plOut);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromUI1(BYTE bIn, LONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromI2(SHORT sIn, LONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromI4(LONG lIn, LONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromR4(FLOAT fltIn, LONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromR8(DOUBLE dblIn, LONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromCy(CY cyIn, LONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromDate(DATE dateIn, LONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromStr(OLECHAR * strIn, LCID lcid, unsigned long dwFlags, LONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromDisp(IDispatch * pdispIn, LCID lcid, LONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromBool(VARIANT_BOOL boolIn, LONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromI1(CHAR cIn, LONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromUI2(USHORT uiIn, LONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromUI4(ULONG ulIn, LONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromUI8(ULONG64 ui64In, LONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromDec(DECIMAL *pdecIn, LONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromInt(INT intIn, LONG64 * pi64Out);
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromUI1(BYTE bIn, FLOAT * pfltOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromI2(SHORT sIn, FLOAT * pfltOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromI4(LONG lIn, FLOAT * pfltOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromI8(LONG64 i64In, FLOAT * pfltOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromR8(DOUBLE dblIn, FLOAT * pfltOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromCy(CY cyIn, FLOAT * pfltOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromDate(DATE dateIn, FLOAT * pfltOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromStr(OLECHAR * strIn, LCID lcid, ULONG dwFlags, FLOAT *pfltOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromDisp(IDispatch * pdispIn, LCID lcid, FLOAT * pfltOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromBool(VARIANT_BOOL boolIn, FLOAT * pfltOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromI1(CHAR cIn, FLOAT *pfltOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromUI2(USHORT uiIn, FLOAT *pfltOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromUI4(ULONG ulIn, FLOAT *pfltOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromUI8(ULONG64 ui64In, FLOAT * pfltOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromDec(DECIMAL *pdecIn, FLOAT *pfltOut);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromUI1(BYTE bIn, DOUBLE * pdblOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromI2(SHORT sIn, DOUBLE * pdblOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromI4(LONG lIn, DOUBLE * pdblOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromI8(LONG64 i64In, DOUBLE * pdblOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromR4(FLOAT fltIn, DOUBLE * pdblOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromCy(CY cyIn, DOUBLE * pdblOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromDate(DATE dateIn, DOUBLE * pdblOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromStr(OLECHAR *strIn, LCID lcid, ULONG dwFlags, DOUBLE *pdblOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromDisp(IDispatch * pdispIn, LCID lcid, DOUBLE * pdblOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromBool(VARIANT_BOOL boolIn, DOUBLE * pdblOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromI1(CHAR cIn, DOUBLE *pdblOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromUI2(USHORT uiIn, DOUBLE *pdblOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromUI4(ULONG ulIn, DOUBLE *pdblOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromUI8(ULONG64 ui64In, DOUBLE * pdblOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromDec(DECIMAL *pdecIn, DOUBLE *pdblOut);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromUI1(BYTE bIn, DATE * pdateOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromI2(SHORT sIn, DATE * pdateOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromI4(LONG lIn, DATE * pdateOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromI8(LONG64 i64In, DATE * pdateOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromR4(FLOAT fltIn, DATE * pdateOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromR8(DOUBLE dblIn, DATE * pdateOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromCy(CY cyIn, DATE * pdateOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromStr(OLECHAR *strIn, LCID lcid, ULONG dwFlags, DATE *pdateOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromDisp(IDispatch * pdispIn, LCID lcid, DATE * pdateOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromBool(VARIANT_BOOL boolIn, DATE * pdateOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromI1(CHAR cIn, DATE *pdateOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromUI2(USHORT uiIn, DATE *pdateOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromUI4(ULONG ulIn, DATE *pdateOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromUI8(ULONG64 ui64In, DATE * pdateOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromDec(DECIMAL *pdecIn, DATE *pdateOut);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromUI1(BYTE bIn, CY * pcyOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromI2(SHORT sIn, CY * pcyOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromI4(LONG lIn, CY * pcyOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromI8(LONG64 i64In, CY * pcyOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromR4(FLOAT fltIn, CY * pcyOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromR8(DOUBLE dblIn, CY * pcyOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromDate(DATE dateIn, CY * pcyOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromStr(OLECHAR * strIn, LCID lcid, ULONG dwFlags, CY * pcyOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromDisp(IDispatch * pdispIn, LCID lcid, CY * pcyOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromBool(VARIANT_BOOL boolIn, CY * pcyOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromI1(CHAR cIn, CY *pcyOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromUI2(USHORT uiIn, CY *pcyOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromUI4(ULONG ulIn, CY *pcyOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromUI8(ULONG64 ui64In, CY * pcyOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromDec(DECIMAL *pdecIn, CY *pcyOut);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromUI1(BYTE bVal, LCID lcid, ULONG dwFlags, BSTR * pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromI2(SHORT iVal, LCID lcid, ULONG dwFlags, BSTR * pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromI4(LONG lIn, LCID lcid, ULONG dwFlags, BSTR * pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromI8(LONG64 i64In, LCID lcid, unsigned long dwFlags, BSTR * pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromR4(FLOAT fltIn, LCID lcid, ULONG dwFlags, BSTR * pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromR8(DOUBLE dblIn, LCID lcid, ULONG dwFlags, BSTR * pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromCy(CY cyIn, LCID lcid, ULONG dwFlags, BSTR * pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromDate(DATE dateIn, LCID lcid, ULONG dwFlags, BSTR * pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromDisp(IDispatch * pdispIn, LCID lcid, ULONG dwFlags, BSTR * pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromBool(VARIANT_BOOL boolIn, LCID lcid, ULONG dwFlags, BSTR * pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromI1(CHAR cIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromUI2(USHORT uiIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromUI4(ULONG ulIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromUI8(ULONG64 ui64In, LCID lcid, unsigned long dwFlags, BSTR * pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromDec(DECIMAL *pdecIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromUI1(BYTE bIn, VARIANT_BOOL * pboolOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromI2(SHORT sIn, VARIANT_BOOL * pboolOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromI4(LONG lIn, VARIANT_BOOL * pboolOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromI8(LONG64 i64In, VARIANT_BOOL * pboolOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromR4(FLOAT fltIn, VARIANT_BOOL * pboolOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromR8(DOUBLE dblIn, VARIANT_BOOL * pboolOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromDate(DATE dateIn, VARIANT_BOOL * pboolOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromCy(CY cyIn, VARIANT_BOOL * pboolOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromStr(OLECHAR * strIn, LCID lcid, ULONG dwFlags, VARIANT_BOOL * pboolOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromDisp(IDispatch * pdispIn, LCID lcid, VARIANT_BOOL * pboolOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromI1(CHAR cIn, VARIANT_BOOL *pboolOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromUI2(USHORT uiIn, VARIANT_BOOL *pboolOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromUI4(ULONG ulIn, VARIANT_BOOL *pboolOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromUI8(ULONG64 i64In, VARIANT_BOOL * pboolOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromDec(DECIMAL *pdecIn, VARIANT_BOOL *pboolOut);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall 
-VarI1FromUI1(
-         BYTE bIn,
-         CHAR *pcOut
-    );
-
-extern "C" __declspec(dllimport) HRESULT __stdcall 
-VarI1FromI2(
-         SHORT uiIn,
-         CHAR *pcOut
-    );
-
-extern "C" __declspec(dllimport) HRESULT __stdcall 
-VarI1FromI4(
-         LONG lIn,
-         CHAR *pcOut
-    );
-
-extern "C" __declspec(dllimport) HRESULT __stdcall 
-VarI1FromI8(
-         LONG64 i64In,
-         CHAR *pcOut
-    );
-
-extern "C" __declspec(dllimport) HRESULT __stdcall 
-VarI1FromR4(
-         FLOAT fltIn,
-         CHAR *pcOut
-    );
-
-extern "C" __declspec(dllimport) HRESULT __stdcall 
-VarI1FromR8(
-         DOUBLE dblIn,
-         CHAR *pcOut
-    );
-
-extern "C" __declspec(dllimport) HRESULT __stdcall 
-VarI1FromDate(
-         DATE dateIn,
-         CHAR *pcOut
-    );
-
-extern "C" __declspec(dllimport) HRESULT __stdcall 
-VarI1FromCy(
-         CY cyIn,
-         CHAR *pcOut
-    );
-
-extern "C" __declspec(dllimport) HRESULT __stdcall 
-VarI1FromStr(
-         OLECHAR *strIn,
-         LCID lcid,
-         ULONG dwFlags,
-         CHAR *pcOut
-    );
-
-extern "C" __declspec(dllimport) HRESULT __stdcall 
-VarI1FromDisp(
-         IDispatch *pdispIn,
-         LCID lcid,
-         CHAR *pcOut
-    );
-
-extern "C" __declspec(dllimport) HRESULT __stdcall 
-VarI1FromBool(
-         VARIANT_BOOL boolIn,
-         CHAR *pcOut
-    );
-
-extern "C" __declspec(dllimport) HRESULT __stdcall 
-VarI1FromUI2(
-         USHORT uiIn,
-         CHAR *pcOut
-    );
-
-extern "C" __declspec(dllimport) HRESULT __stdcall 
-VarI1FromUI4(
-         ULONG ulIn,
-         CHAR *pcOut
-    );
-
-extern "C" __declspec(dllimport) HRESULT __stdcall 
-VarI1FromUI8(
-         ULONG64 i64In,
-         CHAR *pcOut
-    );
-
-extern "C" __declspec(dllimport) HRESULT __stdcall 
-VarI1FromDec(
-         DECIMAL *pdecIn,
-         CHAR *pcOut
-    );
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromUI1(BYTE bIn, USHORT *puiOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromI2(SHORT uiIn, USHORT *puiOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromI4(LONG lIn, USHORT *puiOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromI8(LONG64 i64In, USHORT *puiOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromR4(FLOAT fltIn, USHORT *puiOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromR8(DOUBLE dblIn, USHORT *puiOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromDate(DATE dateIn, USHORT *puiOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromCy(CY cyIn, USHORT *puiOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromStr(OLECHAR *strIn, LCID lcid, ULONG dwFlags, USHORT *puiOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromDisp(IDispatch *pdispIn, LCID lcid, USHORT *puiOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromBool(VARIANT_BOOL boolIn, USHORT *puiOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromI1(CHAR cIn, USHORT *puiOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromUI4(ULONG ulIn, USHORT *puiOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromUI8(ULONG64 i64In, USHORT *puiOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromDec(DECIMAL *pdecIn, USHORT *puiOut);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromUI1(BYTE bIn, ULONG *pulOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromI2(SHORT uiIn, ULONG *pulOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromI4(LONG lIn, ULONG *pulOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromI8(LONG64 i64In, ULONG *plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromR4(FLOAT fltIn, ULONG *pulOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromR8(DOUBLE dblIn, ULONG *pulOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromDate(DATE dateIn, ULONG *pulOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromCy(CY cyIn, ULONG *pulOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromStr(OLECHAR *strIn, LCID lcid, ULONG dwFlags, ULONG *pulOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromDisp(IDispatch *pdispIn, LCID lcid, ULONG *pulOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromBool(VARIANT_BOOL boolIn, ULONG *pulOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromI1(CHAR cIn, ULONG *pulOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromUI2(USHORT uiIn, ULONG *pulOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromUI8(ULONG64 ui64In, ULONG *plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromDec(DECIMAL *pdecIn, ULONG *pulOut);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromUI1(BYTE bIn, ULONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromI2(SHORT sIn, ULONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromI4(LONG lIn, ULONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromI8(LONG64 ui64In, ULONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromR4(FLOAT fltIn, ULONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromR8(DOUBLE dblIn, ULONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromCy(CY cyIn, ULONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromDate(DATE dateIn, ULONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromStr(OLECHAR * strIn, LCID lcid, unsigned long dwFlags, ULONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromDisp(IDispatch * pdispIn, LCID lcid, ULONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromBool(VARIANT_BOOL boolIn, ULONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromI1(CHAR cIn, ULONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromUI2(USHORT uiIn, ULONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromUI4(ULONG ulIn, ULONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromDec(DECIMAL *pdecIn, ULONG64 * pi64Out);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromInt(INT intIn, ULONG64 * pi64Out);
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromUI1(BYTE bIn, DECIMAL *pdecOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromI2(SHORT uiIn, DECIMAL *pdecOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromI4(LONG lIn, DECIMAL *pdecOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromI8(LONG64 i64In, DECIMAL *pdecOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromR4(FLOAT fltIn, DECIMAL *pdecOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromR8(DOUBLE dblIn, DECIMAL *pdecOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromDate(DATE dateIn, DECIMAL *pdecOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromCy(CY cyIn, DECIMAL *pdecOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromStr(OLECHAR *strIn, LCID lcid, ULONG dwFlags, DECIMAL *pdecOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromDisp(IDispatch *pdispIn, LCID lcid, DECIMAL *pdecOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromBool(VARIANT_BOOL boolIn, DECIMAL *pdecOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromI1(CHAR cIn, DECIMAL *pdecOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromUI2(USHORT uiIn, DECIMAL *pdecOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromUI4(ULONG ulIn, DECIMAL *pdecOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromUI8(ULONG64 ui64In, DECIMAL *pdecOut);
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromI8(LONG64 i64In, LONG *plOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromUI8(ULONG64 ui64In, LONG *plOut);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-    INT   cDig;
-    ULONG dwInFlags;
-    ULONG dwOutFlags;
-    INT   cchUsed;
-    INT   nBaseShift;
-    INT   nPwr10;
-} NUMPARSE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarParseNumFromStr(OLECHAR * strIn, LCID lcid, ULONG dwFlags,
-            NUMPARSE * pnumprs, BYTE * rgbDig);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarNumFromParseNum(NUMPARSE * pnumprs, BYTE * rgbDig,
-            ULONG dwVtBits, VARIANT * pvar);
-
-
-
-
-
-extern "C" HRESULT __stdcall VarAdd(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
-extern "C" HRESULT __stdcall VarAnd(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
-extern "C" HRESULT __stdcall VarCat(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
-extern "C" HRESULT __stdcall VarDiv(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
-extern "C" HRESULT __stdcall VarEqv(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
-extern "C" HRESULT __stdcall VarIdiv(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
-extern "C" HRESULT __stdcall VarImp(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
-extern "C" HRESULT __stdcall VarMod(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
-extern "C" HRESULT __stdcall VarMul(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
-extern "C" HRESULT __stdcall VarOr(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
-extern "C" HRESULT __stdcall VarPow(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
-extern "C" HRESULT __stdcall VarSub(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
-extern "C" HRESULT __stdcall VarXor(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
-
-extern "C" HRESULT __stdcall VarAbs(LPVARIANT pvarIn, LPVARIANT pvarResult);
-extern "C" HRESULT __stdcall VarFix(LPVARIANT pvarIn, LPVARIANT pvarResult);
-extern "C" HRESULT __stdcall VarInt(LPVARIANT pvarIn, LPVARIANT pvarResult);
-extern "C" HRESULT __stdcall VarNeg(LPVARIANT pvarIn, LPVARIANT pvarResult);
-extern "C" HRESULT __stdcall VarNot(LPVARIANT pvarIn, LPVARIANT pvarResult);
-
-extern "C" HRESULT __stdcall VarRound(LPVARIANT pvarIn, int cDecimals, LPVARIANT pvarResult);
-
-
-extern "C" HRESULT __stdcall VarCmp(LPVARIANT pvarLeft, LPVARIANT pvarRight, LCID lcid, ULONG dwFlags);
-
-
-extern "C++" {
-
-__inline
-HRESULT
-
-__stdcall
-
-VarCmp(LPVARIANT pvarLeft, LPVARIANT pvarRight, LCID lcid) {
-    return VarCmp(pvarLeft, pvarRight, lcid, 0);
-}
-} 
-
-
-
-
-
-extern "C" HRESULT __stdcall VarDecAdd(LPDECIMAL pdecLeft, LPDECIMAL pdecRight, LPDECIMAL pdecResult);
-extern "C" HRESULT __stdcall VarDecDiv(LPDECIMAL pdecLeft, LPDECIMAL pdecRight, LPDECIMAL pdecResult);
-extern "C" HRESULT __stdcall VarDecMul(LPDECIMAL pdecLeft, LPDECIMAL pdecRight, LPDECIMAL pdecResult);
-extern "C" HRESULT __stdcall VarDecSub(LPDECIMAL pdecLeft, LPDECIMAL pdecRight, LPDECIMAL pdecResult);
-
-extern "C" HRESULT __stdcall VarDecAbs(LPDECIMAL pdecIn, LPDECIMAL pdecResult);
-extern "C" HRESULT __stdcall VarDecFix(LPDECIMAL pdecIn, LPDECIMAL pdecResult);
-extern "C" HRESULT __stdcall VarDecInt(LPDECIMAL pdecIn, LPDECIMAL pdecResult);
-extern "C" HRESULT __stdcall VarDecNeg(LPDECIMAL pdecIn, LPDECIMAL pdecResult);
-
-extern "C" HRESULT __stdcall VarDecRound(LPDECIMAL pdecIn, int cDecimals, LPDECIMAL pdecResult);
-
-extern "C" HRESULT __stdcall VarDecCmp(LPDECIMAL pdecLeft, LPDECIMAL pdecRight);
-extern "C" HRESULT __stdcall VarDecCmpR8(LPDECIMAL pdecLeft, double dblRight);
-
-
-
-
-extern "C" HRESULT __stdcall VarCyAdd(CY cyLeft, CY cyRight, LPCY pcyResult);
-extern "C" HRESULT __stdcall VarCyMul(CY cyLeft, CY cyRight, LPCY pcyResult);
-extern "C" HRESULT __stdcall VarCyMulI4(CY cyLeft, long lRight, LPCY pcyResult);
-extern "C" HRESULT __stdcall VarCyMulI8(CY cyLeft, LONG64 lRight, LPCY pcyResult);
-extern "C" HRESULT __stdcall VarCySub(CY cyLeft, CY cyRight, LPCY pcyResult);
-
-extern "C" HRESULT __stdcall VarCyAbs(CY cyIn, LPCY pcyResult);
-extern "C" HRESULT __stdcall VarCyFix(CY cyIn, LPCY pcyResult);
-extern "C" HRESULT __stdcall VarCyInt(CY cyIn, LPCY pcyResult);
-extern "C" HRESULT __stdcall VarCyNeg(CY cyIn, LPCY pcyResult);
-
-extern "C" HRESULT __stdcall VarCyRound(CY cyIn, int cDecimals, LPCY pcyResult);
-
-extern "C" HRESULT __stdcall VarCyCmp(CY cyLeft, CY cyRight);
-extern "C" HRESULT __stdcall VarCyCmpR8(CY cyLeft, double dblRight);
-
-
-
-
-extern "C" HRESULT __stdcall VarBstrCat(BSTR bstrLeft, BSTR bstrRight, LPBSTR pbstrResult);
-extern "C" HRESULT __stdcall VarBstrCmp(BSTR bstrLeft, BSTR bstrRight, LCID lcid, ULONG dwFlags); 
-extern "C" HRESULT __stdcall VarR8Pow(double dblLeft, double dblRight, double *pdblResult);
-extern "C" HRESULT __stdcall VarR4CmpR8(float fltLeft, double dblRight);
-extern "C" HRESULT __stdcall VarR8Round(double dblIn, int cDecimals, double *pdblResult);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct {
-    SYSTEMTIME st;
-    USHORT  wDayOfYear;
-} UDATE;
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromUdate(UDATE *pudateIn, ULONG dwFlags, DATE *pdateOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromUdateEx(UDATE *pudateIn, LCID lcid, ULONG dwFlags, DATE *pdateOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarUdateFromDate(DATE dateIn, ULONG dwFlags, UDATE *pudateOut);
-
-
-
-   
-extern "C" __declspec(dllimport) HRESULT __stdcall GetAltMonthNames(LCID lcid, LPOLESTR * * prgp);
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarFormat(LPVARIANT pvarIn, LPOLESTR pstrFormat, int iFirstDay, int iFirstWeek, ULONG dwFlags, BSTR *pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarFormatDateTime(LPVARIANT pvarIn, int iNamedFormat, ULONG dwFlags, BSTR *pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarFormatNumber(LPVARIANT pvarIn, int iNumDig, int iIncLead, int iUseParens, int iGroup, ULONG dwFlags, BSTR *pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarFormatPercent(LPVARIANT pvarIn, int iNumDig, int iIncLead, int iUseParens, int iGroup, ULONG dwFlags, BSTR *pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarFormatCurrency(LPVARIANT pvarIn, int iNumDig, int iIncLead, int iUseParens, int iGroup, ULONG dwFlags, BSTR *pbstrOut);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarWeekdayName(int iWeekday, int fAbbrev, int iFirstDay, ULONG dwFlags, BSTR *pbstrOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarMonthName(int iMonth, int fAbbrev, ULONG dwFlags, BSTR *pbstrOut);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall VarFormatFromTokens(LPVARIANT pvarIn, LPOLESTR pstrFormat, LPBYTE pbTokCur, ULONG dwFlags, BSTR *pbstrOut, LCID lcid);
-extern "C" __declspec(dllimport) HRESULT __stdcall VarTokenizeFormatString(LPOLESTR pstrFormat, LPBYTE rgbTok, int cbTok, int iFirstDay, int iFirstWeek, LCID lcid, int *pcbActual);
-
-
-
-
-
-typedef ITypeLib * LPTYPELIB;
-
-
-
-
-
-
-
-typedef LONG DISPID;
-typedef DISPID MEMBERID;
-
-
-
-
-
-
-
-
-
-
-
-typedef ITypeInfo * LPTYPEINFO;
-
-
-
-
-
-
-typedef ITypeComp * LPTYPECOMP;
-
-
-
-
-
-
-typedef ICreateTypeLib * LPCREATETYPELIB;
-
-typedef ICreateTypeInfo * LPCREATETYPEINFO;
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) ULONG __stdcall LHashValOfNameSysA(SYSKIND syskind, LCID lcid,
-            LPCSTR szName);
-
-
-extern "C" __declspec(dllimport) ULONG __stdcall
-LHashValOfNameSys(SYSKIND syskind, LCID lcid, const OLECHAR * szName);
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall LoadTypeLib(const OLECHAR  *szFile, ITypeLib ** pptlib);
-
-
-
-typedef enum tagREGKIND
-{
-    REGKIND_DEFAULT,
-    REGKIND_REGISTER,
-    REGKIND_NONE
-} REGKIND;
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall LoadTypeLibEx(LPCOLESTR szFile, REGKIND regkind,
-            ITypeLib ** pptlib);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall LoadRegTypeLib(const GUID & rguid, WORD wVerMajor, WORD wVerMinor,
-            LCID lcid, ITypeLib ** pptlib);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall QueryPathOfRegTypeLib(const GUID & guid, USHORT wMaj, USHORT wMin,
-            LCID lcid, LPBSTR lpbstrPathName);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall RegisterTypeLib(ITypeLib * ptlib, OLECHAR  *szFullPath,
-            OLECHAR  *szHelpDir);
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall UnRegisterTypeLib(const GUID & libID, WORD wVerMajor,
-            WORD wVerMinor, LCID lcid, SYSKIND syskind);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CreateTypeLib(SYSKIND syskind, const OLECHAR  *szFile,
-            ICreateTypeLib ** ppctlib);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CreateTypeLib2(SYSKIND syskind, LPCOLESTR szFile,
-            ICreateTypeLib2 **ppctlib);
-
-
-
-
-
-
-typedef IDispatch * LPDISPATCH;
-
-typedef struct tagPARAMDATA {
-    OLECHAR * szName;   
-    VARTYPE vt;         
-} PARAMDATA, * LPPARAMDATA;
-
-typedef struct tagMETHODDATA {
-    OLECHAR * szName;   
-    PARAMDATA * ppdata; 
-    DISPID dispid;      
-    UINT iMeth;         
-    CALLCONV cc;        
-    UINT cArgs;         
-    WORD wFlags;        
-    VARTYPE vtReturn;
-} METHODDATA, * LPMETHODDATA;
-
-typedef struct tagINTERFACEDATA {
-    METHODDATA * pmethdata;  
-    UINT cMembers;      
-} INTERFACEDATA, * LPINTERFACEDATA;
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall DispGetParam(DISPPARAMS * pdispparams, UINT position,
-            VARTYPE vtTarg, VARIANT * pvarResult, UINT * puArgErr);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall DispGetIDsOfNames(ITypeInfo * ptinfo, OLECHAR ** rgszNames,
-            UINT cNames, DISPID * rgdispid);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall DispInvoke(void * _this, ITypeInfo * ptinfo, DISPID dispidMember,
-            WORD wFlags, DISPPARAMS * pparams, VARIANT * pvarResult,
-            EXCEPINFO * pexcepinfo, UINT * puArgErr);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CreateDispTypeInfo(INTERFACEDATA * pidata, LCID lcid,
-            ITypeInfo ** pptinfo);
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CreateStdDispatch(IUnknown * punkOuter, void * pvThis,
-            ITypeInfo * ptinfo, IUnknown ** ppunkStdDisp);
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall DispCallFunc(void * pvInstance, ULONG_PTR oVft, CALLCONV cc,
-            VARTYPE vtReturn, UINT  cActuals, VARTYPE * prgvt,
-            VARIANTARG ** prgpvarg, VARIANT * pvargResult);
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall RegisterActiveObject(IUnknown * punk, const IID & rclsid,
-            DWORD dwFlags, DWORD * pdwRegister);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall RevokeActiveObject(DWORD dwRegister, void * pvReserved);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall GetActiveObject(const IID & rclsid, void * pvReserved,
-            IUnknown ** ppunk);
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall SetErrorInfo(ULONG dwReserved, IErrorInfo * perrinfo);
-extern "C" __declspec(dllimport) HRESULT __stdcall GetErrorInfo(ULONG dwReserved, IErrorInfo ** pperrinfo);
-extern "C" __declspec(dllimport) HRESULT __stdcall CreateErrorInfo(ICreateErrorInfo ** pperrinfo);
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall GetRecordInfoFromTypeInfo(ITypeInfo * pTypeInfo,
-            IRecordInfo ** ppRecInfo);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall GetRecordInfoFromGuids(const GUID & rGuidTypeLib,
-            ULONG uVerMajor, ULONG uVerMinor, LCID lcid,
-            const GUID & rGuidTypeInfo, IRecordInfo ** ppRecInfo);
-
-
-
-
-
-extern "C" __declspec(dllimport) ULONG __stdcall OaBuildVersion(void);
-
-extern "C" __declspec(dllimport) void __stdcall ClearCustData(LPCUSTDATA pCustData);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall CreateDataAdviseHolder( LPDATAADVISEHOLDER * ppDAHolder);
-
-
-
-
-
-extern "C" __declspec(dllimport) DWORD __stdcall OleBuildVersion( void );
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall ReadClassStg( LPSTORAGE pStg,  CLSID * pclsid);
-extern "C" __declspec(dllimport) HRESULT __stdcall WriteClassStg( LPSTORAGE pStg,  const IID & rclsid);
-extern "C" __declspec(dllimport) HRESULT __stdcall ReadClassStm( LPSTREAM pStm,  CLSID * pclsid);
-extern "C" __declspec(dllimport) HRESULT __stdcall WriteClassStm( LPSTREAM pStm,  const IID & rclsid);
-extern "C" __declspec(dllimport) HRESULT __stdcall WriteFmtUserTypeStg ( LPSTORAGE pstg,  CLIPFORMAT cf,  LPOLESTR lpszUserType);
-extern "C" __declspec(dllimport) HRESULT __stdcall ReadFmtUserTypeStg ( LPSTORAGE pstg,  CLIPFORMAT * pcf,  LPOLESTR * lplpszUserType);
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleInitialize( LPVOID pvReserved);
-extern "C" __declspec(dllimport) void __stdcall OleUninitialize(void);
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleQueryLinkFromData( LPDATAOBJECT pSrcDataObject);
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleQueryCreateFromData( LPDATAOBJECT pSrcDataObject);
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreate( const IID & rclsid,  const IID & riid,  DWORD renderopt,
-                 LPFORMATETC pFormatEtc,  LPOLECLIENTSITE pClientSite,
-                 LPSTORAGE pStg,  LPVOID * ppvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateEx( const IID & rclsid,  const IID & riid,  DWORD dwFlags,
-                 DWORD renderopt,  ULONG cFormats,  DWORD* rgAdvf,
-                 LPFORMATETC rgFormatEtc,  IAdviseSink * lpAdviseSink,
-                 DWORD * rgdwConnection,  LPOLECLIENTSITE pClientSite,
-                 LPSTORAGE pStg,  LPVOID * ppvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateFromData( LPDATAOBJECT pSrcDataObj,  const IID & riid,
-                 DWORD renderopt,  LPFORMATETC pFormatEtc,
-                 LPOLECLIENTSITE pClientSite,  LPSTORAGE pStg,
-                 LPVOID * ppvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateFromDataEx( LPDATAOBJECT pSrcDataObj,  const IID & riid,
-                 DWORD dwFlags,  DWORD renderopt,  ULONG cFormats,  DWORD* rgAdvf,
-                 LPFORMATETC rgFormatEtc,  IAdviseSink * lpAdviseSink,
-                 DWORD * rgdwConnection,  LPOLECLIENTSITE pClientSite,
-                 LPSTORAGE pStg,  LPVOID * ppvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateLinkFromData( LPDATAOBJECT pSrcDataObj,  const IID & riid,
-                 DWORD renderopt,  LPFORMATETC pFormatEtc,
-                 LPOLECLIENTSITE pClientSite,  LPSTORAGE pStg,
-                 LPVOID * ppvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateLinkFromDataEx( LPDATAOBJECT pSrcDataObj,  const IID & riid,
-                 DWORD dwFlags,  DWORD renderopt,  ULONG cFormats,  DWORD* rgAdvf,
-                 LPFORMATETC rgFormatEtc,  IAdviseSink * lpAdviseSink,
-                  DWORD * rgdwConnection,  LPOLECLIENTSITE pClientSite,
-                 LPSTORAGE pStg,  LPVOID * ppvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateStaticFromData( LPDATAOBJECT pSrcDataObj,  const IID & iid,
-                 DWORD renderopt,  LPFORMATETC pFormatEtc,
-                 LPOLECLIENTSITE pClientSite,  LPSTORAGE pStg,
-                 LPVOID * ppvObj);
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateLink( LPMONIKER pmkLinkSrc,  const IID & riid,
-             DWORD renderopt,  LPFORMATETC lpFormatEtc,
-             LPOLECLIENTSITE pClientSite,  LPSTORAGE pStg,  LPVOID * ppvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateLinkEx( LPMONIKER pmkLinkSrc,  const IID & riid,
-             DWORD dwFlags,  DWORD renderopt,  ULONG cFormats,  DWORD* rgAdvf,
-             LPFORMATETC rgFormatEtc,  IAdviseSink * lpAdviseSink,
-             DWORD * rgdwConnection,  LPOLECLIENTSITE pClientSite,
-             LPSTORAGE pStg,  LPVOID * ppvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateLinkToFile( LPCOLESTR lpszFileName,  const IID & riid,
-             DWORD renderopt,  LPFORMATETC lpFormatEtc,
-             LPOLECLIENTSITE pClientSite,  LPSTORAGE pStg,  LPVOID * ppvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateLinkToFileEx( LPCOLESTR lpszFileName,  const IID & riid,
-             DWORD dwFlags,  DWORD renderopt,  ULONG cFormats,  DWORD* rgAdvf,
-             LPFORMATETC rgFormatEtc,  IAdviseSink * lpAdviseSink,
-             DWORD * rgdwConnection,  LPOLECLIENTSITE pClientSite,
-             LPSTORAGE pStg,  LPVOID * ppvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateFromFile( const IID & rclsid,  LPCOLESTR lpszFileName,  const IID & riid,
-             DWORD renderopt,  LPFORMATETC lpFormatEtc,
-             LPOLECLIENTSITE pClientSite,  LPSTORAGE pStg,  LPVOID * ppvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateFromFileEx( const IID & rclsid,  LPCOLESTR lpszFileName,  const IID & riid,
-             DWORD dwFlags,  DWORD renderopt,  ULONG cFormats,  DWORD* rgAdvf,
-             LPFORMATETC rgFormatEtc,  IAdviseSink * lpAdviseSink,
-             DWORD * rgdwConnection,  LPOLECLIENTSITE pClientSite,
-             LPSTORAGE pStg,  LPVOID * ppvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleLoad( LPSTORAGE pStg,  const IID & riid,  LPOLECLIENTSITE pClientSite,
-             LPVOID * ppvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleSave( LPPERSISTSTORAGE pPS,  LPSTORAGE pStg,  BOOL fSameAsLoad);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleLoadFromStream(  LPSTREAM pStm,  const IID & iidInterface,  LPVOID * ppvObj);
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleSaveToStream(  LPPERSISTSTREAM pPStm,  LPSTREAM pStm );
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleSetContainedObject( LPUNKNOWN pUnknown,  BOOL fContained);
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleNoteObjectVisible( LPUNKNOWN pUnknown,  BOOL fVisible);
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  RegisterDragDrop( HWND hwnd,  LPDROPTARGET pDropTarget);
-extern "C" __declspec(dllimport) HRESULT __stdcall  RevokeDragDrop( HWND hwnd);
-extern "C" __declspec(dllimport) HRESULT __stdcall  DoDragDrop( LPDATAOBJECT pDataObj,  LPDROPSOURCE pDropSource,
-             DWORD dwOKEffects,  LPDWORD pdwEffect);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleSetClipboard( LPDATAOBJECT pDataObj);
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleGetClipboard( LPDATAOBJECT * ppDataObj);
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleFlushClipboard(void);
-extern "C" __declspec(dllimport) HRESULT __stdcall  OleIsCurrentClipboard( LPDATAOBJECT pDataObj);
-
-
-
-
-extern "C" __declspec(dllimport) HOLEMENU __stdcall   OleCreateMenuDescriptor ( HMENU hmenuCombined,
-                                 LPOLEMENUGROUPWIDTHS lpMenuWidths);
-extern "C" __declspec(dllimport) HRESULT __stdcall              OleSetMenuDescriptor ( HOLEMENU holemenu,  HWND hwndFrame,
-                                 HWND hwndActiveObject,
-                                 LPOLEINPLACEFRAME lpFrame,
-                                 LPOLEINPLACEACTIVEOBJECT lpActiveObj);
-extern "C" __declspec(dllimport) HRESULT __stdcall              OleDestroyMenuDescriptor ( HOLEMENU holemenu);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall              OleTranslateAccelerator ( LPOLEINPLACEFRAME lpFrame,
-                             LPOLEINPLACEFRAMEINFO lpFrameInfo,  LPMSG lpmsg);
-
-
-
-extern "C" __declspec(dllimport) HANDLE __stdcall OleDuplicateData ( HANDLE hSrc,  CLIPFORMAT cfFormat,
-                         UINT uiFlags);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall          OleDraw ( LPUNKNOWN pUnknown,  DWORD dwAspect,  HDC hdcDraw,
-                     LPCRECT lprcBounds);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall          OleRun( LPUNKNOWN pUnknown);
-extern "C" __declspec(dllimport) BOOL __stdcall   OleIsRunning( LPOLEOBJECT pObject);
-extern "C" __declspec(dllimport) HRESULT __stdcall          OleLockRunning( LPUNKNOWN pUnknown,  BOOL fLock,  BOOL fLastUnlockCloses);
-extern "C" __declspec(dllimport) void __stdcall   ReleaseStgMedium( LPSTGMEDIUM);
-extern "C" __declspec(dllimport) HRESULT __stdcall          CreateOleAdviseHolder( LPOLEADVISEHOLDER * ppOAHolder);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall          OleCreateDefaultHandler( const IID & clsid,  LPUNKNOWN pUnkOuter,
-                     const IID & riid,  LPVOID * lplpObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall          OleCreateEmbeddingHelper( const IID & clsid,  LPUNKNOWN pUnkOuter,
-                     DWORD flags,  LPCLASSFACTORY pCF,
-                     const IID & riid,  LPVOID * lplpObj);
-
-extern "C" __declspec(dllimport) BOOL __stdcall   IsAccelerator( HACCEL hAccel,  int cAccelEntries,  LPMSG lpMsg,
-                                         WORD * lpwCmd);
-
-
-extern "C" __declspec(dllimport) HGLOBAL __stdcall OleGetIconOfFile( LPOLESTR lpszPath,  BOOL fUseFileAsLabel);
-
-extern "C" __declspec(dllimport) HGLOBAL __stdcall OleGetIconOfClass( const IID & rclsid,      LPOLESTR lpszLabel,
-                                         BOOL fUseTypeAsLabel);
-
-extern "C" __declspec(dllimport) HGLOBAL __stdcall OleMetafilePictFromIconAndLabel( HICON hIcon,  LPOLESTR lpszLabel,
-                                         LPOLESTR lpszSourceFile,  UINT iIconIndex);
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall                  OleRegGetUserType ( const IID & clsid,  DWORD dwFormOfType,
-                                         LPOLESTR * pszUserType);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall                  OleRegGetMiscStatus     ( const IID & clsid,  DWORD dwAspect,
-                                         DWORD * pdwStatus);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall                  OleRegEnumFormatEtc     ( const IID & clsid,  DWORD dwDirection,
-                                         LPENUMFORMATETC * ppenum);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall                  OleRegEnumVerbs ( const IID & clsid,  LPENUMOLEVERB * ppenum);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _OLESTREAM *  LPOLESTREAM;
-
-typedef struct _OLESTREAMVTBL
-{
-    DWORD (__stdcall* Get)(LPOLESTREAM, void *, DWORD);
-    DWORD (__stdcall* Put)(LPOLESTREAM, const void *, DWORD);
-} OLESTREAMVTBL;
-typedef  OLESTREAMVTBL *  LPOLESTREAMVTBL;
-
-typedef struct _OLESTREAM
-{
-    LPOLESTREAMVTBL lpstbl;
-} OLESTREAM;
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleConvertOLESTREAMToIStorage
-    ( LPOLESTREAM                lpolestream,
-     LPSTORAGE                   pstg,
-     const DVTARGETDEVICE *   ptd);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleConvertIStorageToOLESTREAM
-    ( LPSTORAGE      pstg,
-     LPOLESTREAM     lpolestream);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall GetHGlobalFromILockBytes ( LPLOCKBYTES plkbyt,  HGLOBAL * phglobal);
-extern "C" __declspec(dllimport) HRESULT __stdcall CreateILockBytesOnHGlobal ( HGLOBAL hGlobal,  BOOL fDeleteOnRelease,
-                                     LPLOCKBYTES * pplkbyt);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall GetHGlobalFromStream ( LPSTREAM pstm,  HGLOBAL * phglobal);
-extern "C" __declspec(dllimport) HRESULT __stdcall CreateStreamOnHGlobal ( HGLOBAL hGlobal,  BOOL fDeleteOnRelease,
-                                 LPSTREAM * ppstm);
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleDoAutoConvert( LPSTORAGE pStg,  LPCLSID pClsidNew);
-extern "C" __declspec(dllimport) HRESULT __stdcall OleGetAutoConvert( const IID & clsidOld,  LPCLSID pClsidNew);
-extern "C" __declspec(dllimport) HRESULT __stdcall OleSetAutoConvert( const IID & clsidOld,  const IID & clsidNew);
-extern "C" __declspec(dllimport) HRESULT __stdcall GetConvertStg( LPSTORAGE pStg);
-extern "C" __declspec(dllimport) HRESULT __stdcall SetConvertStg( LPSTORAGE pStg,  BOOL fConvert);
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleConvertIStorageToOLESTREAMEx
-    ( LPSTORAGE          pstg,
-                                    
-      CLIPFORMAT         cfFormat,   
-      LONG               lWidth,     
-      LONG               lHeight,    
-      DWORD              dwSize,     
-      LPSTGMEDIUM        pmedium,    
-      LPOLESTREAM        polestm);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleConvertOLESTREAMToIStorageEx
-    ( LPOLESTREAM        polestm,
-      LPSTORAGE          pstg,
-                                    
-      CLIPFORMAT *    pcfFormat,  
-      LONG *          plwWidth,   
-      LONG *          plHeight,   
-      DWORD *         pdwSize,    
-      LPSTGMEDIUM        pmedium);   
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" const GUID  IID_IPrintDialogCallback;
-
-
-
-
-
-
-extern "C" const GUID  IID_IPrintDialogServices;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,1)
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {            
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef UINT_PTR (__stdcall *LPOFNHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagOFN_NT4A {
-   DWORD        lStructSize;
-   HWND         hwndOwner;
-   HINSTANCE    hInstance;
-   LPCSTR       lpstrFilter;
-   LPSTR        lpstrCustomFilter;
-   DWORD        nMaxCustFilter;
-   DWORD        nFilterIndex;
-   LPSTR        lpstrFile;
-   DWORD        nMaxFile;
-   LPSTR        lpstrFileTitle;
-   DWORD        nMaxFileTitle;
-   LPCSTR       lpstrInitialDir;
-   LPCSTR       lpstrTitle;
-   DWORD        Flags;
-   WORD         nFileOffset;
-   WORD         nFileExtension;
-   LPCSTR       lpstrDefExt;
-   LPARAM       lCustData;
-   LPOFNHOOKPROC lpfnHook;
-   LPCSTR       lpTemplateName;
-} OPENFILENAME_NT4A, *LPOPENFILENAME_NT4A;
-typedef struct tagOFN_NT4W {
-   DWORD        lStructSize;
-   HWND         hwndOwner;
-   HINSTANCE    hInstance;
-   LPCWSTR      lpstrFilter;
-   LPWSTR       lpstrCustomFilter;
-   DWORD        nMaxCustFilter;
-   DWORD        nFilterIndex;
-   LPWSTR       lpstrFile;
-   DWORD        nMaxFile;
-   LPWSTR       lpstrFileTitle;
-   DWORD        nMaxFileTitle;
-   LPCWSTR      lpstrInitialDir;
-   LPCWSTR      lpstrTitle;
-   DWORD        Flags;
-   WORD         nFileOffset;
-   WORD         nFileExtension;
-   LPCWSTR      lpstrDefExt;
-   LPARAM       lCustData;
-   LPOFNHOOKPROC lpfnHook;
-   LPCWSTR      lpTemplateName;
-} OPENFILENAME_NT4W, *LPOPENFILENAME_NT4W;
-
-typedef OPENFILENAME_NT4W OPENFILENAME_NT4;
-typedef LPOPENFILENAME_NT4W LPOPENFILENAME_NT4;
-
-
-
-
-
-typedef struct tagOFNA {
-   DWORD        lStructSize;
-   HWND         hwndOwner;
-   HINSTANCE    hInstance;
-   LPCSTR       lpstrFilter;
-   LPSTR        lpstrCustomFilter;
-   DWORD        nMaxCustFilter;
-   DWORD        nFilterIndex;
-   LPSTR        lpstrFile;
-   DWORD        nMaxFile;
-   LPSTR        lpstrFileTitle;
-   DWORD        nMaxFileTitle;
-   LPCSTR       lpstrInitialDir;
-   LPCSTR       lpstrTitle;
-   DWORD        Flags;
-   WORD         nFileOffset;
-   WORD         nFileExtension;
-   LPCSTR       lpstrDefExt;
-   LPARAM       lCustData;
-   LPOFNHOOKPROC lpfnHook;
-   LPCSTR       lpTemplateName;
-
-
-
-
-
-   void *		pvReserved;
-   DWORD        dwReserved;
-   DWORD        FlagsEx;
-
-} OPENFILENAMEA, *LPOPENFILENAMEA;
-typedef struct tagOFNW {
-   DWORD        lStructSize;
-   HWND         hwndOwner;
-   HINSTANCE    hInstance;
-   LPCWSTR      lpstrFilter;
-   LPWSTR       lpstrCustomFilter;
-   DWORD        nMaxCustFilter;
-   DWORD        nFilterIndex;
-   LPWSTR       lpstrFile;
-   DWORD        nMaxFile;
-   LPWSTR       lpstrFileTitle;
-   DWORD        nMaxFileTitle;
-   LPCWSTR      lpstrInitialDir;
-   LPCWSTR      lpstrTitle;
-   DWORD        Flags;
-   WORD         nFileOffset;
-   WORD         nFileExtension;
-   LPCWSTR      lpstrDefExt;
-   LPARAM       lCustData;
-   LPOFNHOOKPROC lpfnHook;
-   LPCWSTR      lpTemplateName;
-
-
-
-
-
-   void *		pvReserved;
-   DWORD        dwReserved;
-   DWORD        FlagsEx;
-
-} OPENFILENAMEW, *LPOPENFILENAMEW;
-
-typedef OPENFILENAMEW OPENFILENAME;
-typedef LPOPENFILENAMEW LPOPENFILENAME;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall GetOpenFileNameA(LPOPENFILENAMEA);
-__declspec(dllimport) BOOL  __stdcall GetOpenFileNameW(LPOPENFILENAMEW);
-
-
-
-
-
-__declspec(dllimport) BOOL  __stdcall GetSaveFileNameA(LPOPENFILENAMEA);
-__declspec(dllimport) BOOL  __stdcall GetSaveFileNameW(LPOPENFILENAMEW);
-
-
-
-
-
-
-
-__declspec(dllimport) short __stdcall GetFileTitleA(LPCSTR, LPSTR, WORD);
-__declspec(dllimport) short __stdcall GetFileTitleW(LPCWSTR, LPWSTR, WORD);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef UINT_PTR (__stdcall *LPCCHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
-
-
-
-typedef struct _OFNOTIFYA
-{
-        NMHDR           hdr;
-        LPOPENFILENAMEA lpOFN;
-        LPSTR           pszFile;        
-} OFNOTIFYA, *LPOFNOTIFYA;
-
-typedef struct _OFNOTIFYW
-{
-        NMHDR           hdr;
-        LPOPENFILENAMEW lpOFN;
-        LPWSTR          pszFile;        
-} OFNOTIFYW, *LPOFNOTIFYW;
-
-typedef OFNOTIFYW OFNOTIFY;
-typedef LPOFNOTIFYW LPOFNOTIFY;
-
-
-
-
-
-
-
-typedef struct _OFNOTIFYEXA
-{
-        NMHDR           hdr;
-        LPOPENFILENAMEA lpOFN;
-        LPVOID          psf;
-        LPVOID          pidl;          
-} OFNOTIFYEXA, *LPOFNOTIFYEXA;
-
-typedef struct _OFNOTIFYEXW
-{
-        NMHDR           hdr;
-        LPOPENFILENAMEW lpOFN;
-        LPVOID          psf;
-        LPVOID          pidl;          
-} OFNOTIFYEXW, *LPOFNOTIFYEXW;
-
-typedef OFNOTIFYEXW OFNOTIFYEX;
-typedef LPOFNOTIFYEXW LPOFNOTIFYEX;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagCHOOSECOLORA {
-   DWORD        lStructSize;
-   HWND         hwndOwner;
-   HWND         hInstance;
-   COLORREF     rgbResult;
-   COLORREF*    lpCustColors;
-   DWORD        Flags;
-   LPARAM       lCustData;
-   LPCCHOOKPROC lpfnHook;
-   LPCSTR       lpTemplateName;
-} CHOOSECOLORA, *LPCHOOSECOLORA;
-typedef struct tagCHOOSECOLORW {
-   DWORD        lStructSize;
-   HWND         hwndOwner;
-   HWND         hInstance;
-   COLORREF     rgbResult;
-   COLORREF*    lpCustColors;
-   DWORD        Flags;
-   LPARAM       lCustData;
-   LPCCHOOKPROC lpfnHook;
-   LPCWSTR      lpTemplateName;
-} CHOOSECOLORW, *LPCHOOSECOLORW;
-
-typedef CHOOSECOLORW CHOOSECOLOR;
-typedef LPCHOOSECOLORW LPCHOOSECOLOR;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) BOOL __stdcall ChooseColorA(LPCHOOSECOLORA);
-__declspec(dllimport) BOOL __stdcall ChooseColorW(LPCHOOSECOLORW);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef UINT_PTR (__stdcall *LPFRHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
-
-typedef struct tagFINDREPLACEA {
-   DWORD        lStructSize;        
-   HWND         hwndOwner;          
-   HINSTANCE    hInstance;          
-                                    
-   DWORD        Flags;              
-   LPSTR        lpstrFindWhat;      
-   LPSTR        lpstrReplaceWith;   
-   WORD         wFindWhatLen;       
-   WORD         wReplaceWithLen;    
-   LPARAM       lCustData;          
-   LPFRHOOKPROC lpfnHook;           
-   LPCSTR       lpTemplateName;     
-} FINDREPLACEA, *LPFINDREPLACEA;
-typedef struct tagFINDREPLACEW {
-   DWORD        lStructSize;        
-   HWND         hwndOwner;          
-   HINSTANCE    hInstance;          
-                                    
-   DWORD        Flags;              
-   LPWSTR       lpstrFindWhat;      
-   LPWSTR       lpstrReplaceWith;   
-   WORD         wFindWhatLen;       
-   WORD         wReplaceWithLen;    
-   LPARAM       lCustData;          
-   LPFRHOOKPROC lpfnHook;           
-   LPCWSTR      lpTemplateName;     
-} FINDREPLACEW, *LPFINDREPLACEW;
-
-typedef FINDREPLACEW FINDREPLACE;
-typedef LPFINDREPLACEW LPFINDREPLACE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) HWND __stdcall FindTextA(LPFINDREPLACEA);
-__declspec(dllimport) HWND __stdcall FindTextW(LPFINDREPLACEW);
-
-
-
-
-
-
-__declspec(dllimport) HWND __stdcall ReplaceTextA(LPFINDREPLACEA);
-__declspec(dllimport) HWND __stdcall ReplaceTextW(LPFINDREPLACEW);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef UINT_PTR (__stdcall *LPCFHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
-
-typedef struct tagCHOOSEFONTA {
-   DWORD           lStructSize;
-   HWND            hwndOwner;          
-   HDC             hDC;                
-   LPLOGFONTA      lpLogFont;          
-   INT             iPointSize;         
-   DWORD           Flags;              
-   COLORREF        rgbColors;          
-   LPARAM          lCustData;          
-   LPCFHOOKPROC    lpfnHook;           
-   LPCSTR          lpTemplateName;     
-   HINSTANCE       hInstance;          
-                                       
-   LPSTR           lpszStyle;          
-                                       
-   WORD            nFontType;          
-                                       
-                                       
-   WORD            ___MISSING_ALIGNMENT__;
-   INT             nSizeMin;           
-   INT             nSizeMax;           
-                                       
-} CHOOSEFONTA, *LPCHOOSEFONTA;
-typedef struct tagCHOOSEFONTW {
-   DWORD           lStructSize;
-   HWND            hwndOwner;          
-   HDC             hDC;                
-   LPLOGFONTW      lpLogFont;          
-   INT             iPointSize;         
-   DWORD           Flags;              
-   COLORREF        rgbColors;          
-   LPARAM          lCustData;          
-   LPCFHOOKPROC    lpfnHook;           
-   LPCWSTR         lpTemplateName;     
-   HINSTANCE       hInstance;          
-                                       
-   LPWSTR          lpszStyle;          
-                                       
-   WORD            nFontType;          
-                                       
-                                       
-   WORD            ___MISSING_ALIGNMENT__;
-   INT             nSizeMin;           
-   INT             nSizeMax;           
-                                       
-} CHOOSEFONTW, *LPCHOOSEFONTW;
-
-typedef CHOOSEFONTW CHOOSEFONT;
-typedef LPCHOOSEFONTW LPCHOOSEFONT;
-
-
-
-
-
-__declspec(dllimport) BOOL __stdcall ChooseFontA(LPCHOOSEFONTA);
-__declspec(dllimport) BOOL __stdcall ChooseFontW(LPCHOOSEFONTW);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef UINT_PTR (__stdcall *LPPRINTHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
-typedef UINT_PTR (__stdcall *LPSETUPHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
-
-typedef struct tagPDA {
-   DWORD            lStructSize;
-   HWND             hwndOwner;
-   HGLOBAL          hDevMode;
-   HGLOBAL          hDevNames;
-   HDC              hDC;
-   DWORD            Flags;
-   WORD             nFromPage;
-   WORD             nToPage;
-   WORD             nMinPage;
-   WORD             nMaxPage;
-   WORD             nCopies;
-   HINSTANCE        hInstance;
-   LPARAM           lCustData;
-   LPPRINTHOOKPROC  lpfnPrintHook;
-   LPSETUPHOOKPROC  lpfnSetupHook;
-   LPCSTR           lpPrintTemplateName;
-   LPCSTR           lpSetupTemplateName;
-   HGLOBAL          hPrintTemplate;
-   HGLOBAL          hSetupTemplate;
-} PRINTDLGA, *LPPRINTDLGA;
-typedef struct tagPDW {
-   DWORD            lStructSize;
-   HWND             hwndOwner;
-   HGLOBAL          hDevMode;
-   HGLOBAL          hDevNames;
-   HDC              hDC;
-   DWORD            Flags;
-   WORD             nFromPage;
-   WORD             nToPage;
-   WORD             nMinPage;
-   WORD             nMaxPage;
-   WORD             nCopies;
-   HINSTANCE        hInstance;
-   LPARAM           lCustData;
-   LPPRINTHOOKPROC  lpfnPrintHook;
-   LPSETUPHOOKPROC  lpfnSetupHook;
-   LPCWSTR          lpPrintTemplateName;
-   LPCWSTR          lpSetupTemplateName;
-   HGLOBAL          hPrintTemplate;
-   HGLOBAL          hSetupTemplate;
-} PRINTDLGW, *LPPRINTDLGW;
-
-typedef PRINTDLGW PRINTDLG;
-typedef LPPRINTDLGW LPPRINTDLG;
-
-
-
-
-
-__declspec(dllimport) BOOL __stdcall PrintDlgA(LPPRINTDLGA);
-__declspec(dllimport) BOOL __stdcall PrintDlgW(LPPRINTDLGW);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct __declspec(novtable) IPrintDialogCallback : public IUnknown
-{
-    
-    virtual HRESULT __stdcall QueryInterface ( const IID & riid, LPVOID *ppvObj) = 0;
-    virtual ULONG __stdcall AddRef (void) = 0;
-    virtual ULONG __stdcall Release (void) = 0;
-
-    
-    virtual HRESULT __stdcall InitDone (void) = 0;
-    virtual HRESULT __stdcall SelectionChange (void) = 0;
-    virtual HRESULT __stdcall HandleMessage ( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pResult) = 0;
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct __declspec(novtable) IPrintDialogServices : public IUnknown
-{
-    
-    virtual HRESULT __stdcall QueryInterface ( const IID & riid, LPVOID *ppvObj) = 0;
-    virtual ULONG __stdcall AddRef (void) = 0;
-    virtual ULONG __stdcall Release (void) = 0;
-
-    
-    virtual HRESULT __stdcall GetCurrentDevMode ( LPDEVMODE pDevMode, UINT *pcbSize) = 0;
-    virtual HRESULT __stdcall GetCurrentPrinterName ( LPTSTR pPrinterName, UINT *pcchSize) = 0;
-    virtual HRESULT __stdcall GetCurrentPortName ( LPTSTR pPortName, UINT *pcchSize) = 0;
-};
-
-
-
-
-
-typedef struct tagPRINTPAGERANGE {
-   DWORD  nFromPage;
-   DWORD  nToPage;
-} PRINTPAGERANGE, *LPPRINTPAGERANGE;
-
-
-
-
-
-typedef struct tagPDEXA {
-   DWORD                 lStructSize;          
-   HWND                  hwndOwner;            
-   HGLOBAL               hDevMode;             
-   HGLOBAL               hDevNames;            
-   HDC                   hDC;                  
-   DWORD                 Flags;                
-   DWORD                 Flags2;               
-   DWORD                 ExclusionFlags;       
-   DWORD                 nPageRanges;          
-   DWORD                 nMaxPageRanges;       
-   LPPRINTPAGERANGE      lpPageRanges;         
-   DWORD                 nMinPage;             
-   DWORD                 nMaxPage;             
-   DWORD                 nCopies;              
-   HINSTANCE             hInstance;            
-   LPCSTR                lpPrintTemplateName;  
-   LPUNKNOWN             lpCallback;           
-   DWORD                 nPropertyPages;       
-   HPROPSHEETPAGE       *lphPropertyPages;     
-   DWORD                 nStartPage;           
-   DWORD                 dwResultAction;       
-} PRINTDLGEXA, *LPPRINTDLGEXA;
-
-
-
-typedef struct tagPDEXW {
-   DWORD                 lStructSize;          
-   HWND                  hwndOwner;            
-   HGLOBAL               hDevMode;             
-   HGLOBAL               hDevNames;            
-   HDC                   hDC;                  
-   DWORD                 Flags;                
-   DWORD                 Flags2;               
-   DWORD                 ExclusionFlags;       
-   DWORD                 nPageRanges;          
-   DWORD                 nMaxPageRanges;       
-   LPPRINTPAGERANGE      lpPageRanges;         
-   DWORD                 nMinPage;             
-   DWORD                 nMaxPage;             
-   DWORD                 nCopies;              
-   HINSTANCE             hInstance;            
-   LPCWSTR               lpPrintTemplateName;  
-   LPUNKNOWN             lpCallback;           
-   DWORD                 nPropertyPages;       
-   HPROPSHEETPAGE       *lphPropertyPages;     
-   DWORD                 nStartPage;           
-   DWORD                 dwResultAction;       
-} PRINTDLGEXW, *LPPRINTDLGEXW;
-
-typedef PRINTDLGEXW PRINTDLGEX;
-typedef LPPRINTDLGEXW LPPRINTDLGEX;
-
-
-
-
-
-
-
-__declspec(dllimport) HRESULT __stdcall PrintDlgExA(LPPRINTDLGEXA);
-__declspec(dllimport) HRESULT __stdcall PrintDlgExW(LPPRINTDLGEXW);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagDEVNAMES {
-   WORD wDriverOffset;
-   WORD wDeviceOffset;
-   WORD wOutputOffset;
-   WORD wDefault;
-} DEVNAMES, *LPDEVNAMES;
-
-
-
-
-__declspec(dllimport) DWORD __stdcall CommDlgExtendedError(void);
-
-
-
-
-
-
-
-
-
-
-typedef UINT_PTR (__stdcall* LPPAGEPAINTHOOK)( HWND, UINT, WPARAM, LPARAM );
-typedef UINT_PTR (__stdcall* LPPAGESETUPHOOK)( HWND, UINT, WPARAM, LPARAM );
-
-typedef struct tagPSDA
-{
-    DWORD           lStructSize;
-    HWND            hwndOwner;
-    HGLOBAL         hDevMode;
-    HGLOBAL         hDevNames;
-    DWORD           Flags;
-    POINT           ptPaperSize;
-    RECT            rtMinMargin;
-    RECT            rtMargin;
-    HINSTANCE       hInstance;
-    LPARAM          lCustData;
-    LPPAGESETUPHOOK lpfnPageSetupHook;
-    LPPAGEPAINTHOOK lpfnPagePaintHook;
-    LPCSTR          lpPageSetupTemplateName;
-    HGLOBAL         hPageSetupTemplate;
-} PAGESETUPDLGA, * LPPAGESETUPDLGA;
-typedef struct tagPSDW
-{
-    DWORD           lStructSize;
-    HWND            hwndOwner;
-    HGLOBAL         hDevMode;
-    HGLOBAL         hDevNames;
-    DWORD           Flags;
-    POINT           ptPaperSize;
-    RECT            rtMinMargin;
-    RECT            rtMargin;
-    HINSTANCE       hInstance;
-    LPARAM          lCustData;
-    LPPAGESETUPHOOK lpfnPageSetupHook;
-    LPPAGEPAINTHOOK lpfnPagePaintHook;
-    LPCWSTR         lpPageSetupTemplateName;
-    HGLOBAL         hPageSetupTemplate;
-} PAGESETUPDLGW, * LPPAGESETUPDLGW;
-
-typedef PAGESETUPDLGW PAGESETUPDLG;
-typedef LPPAGESETUPDLGW LPPAGESETUPDLG;
-
-
-
-
-
-__declspec(dllimport) BOOL __stdcall PageSetupDlgA( LPPAGESETUPDLGA );
-__declspec(dllimport) BOOL __stdcall PageSetupDlgW( LPPAGESETUPDLGW );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__inline
-PUWSTR
-static
-__declspec(deprecated)
-ua_wcscpy(
-     PUWSTR  Destination,
-     PCUWSTR Source
-    )
-{
-#pragma warning(push)
-#pragma warning(disable:4996)
-    return wcscpy(Destination, Source);
-#pragma warning(pop)
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-    
-
-                                         
-
-
-
-                                                      
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _SERVICE_DESCRIPTIONA {
-    LPSTR       lpDescription;
-} SERVICE_DESCRIPTIONA, *LPSERVICE_DESCRIPTIONA;
-
-
-
-typedef struct _SERVICE_DESCRIPTIONW {
-    LPWSTR      lpDescription;
-} SERVICE_DESCRIPTIONW, *LPSERVICE_DESCRIPTIONW;
-
-typedef SERVICE_DESCRIPTIONW SERVICE_DESCRIPTION;
-typedef LPSERVICE_DESCRIPTIONW LPSERVICE_DESCRIPTION;
-
-
-
-
-
-
-
-
-typedef enum _SC_ACTION_TYPE {
-        SC_ACTION_NONE          = 0,
-        SC_ACTION_RESTART       = 1,
-        SC_ACTION_REBOOT        = 2,
-        SC_ACTION_RUN_COMMAND   = 3
-} SC_ACTION_TYPE;
-
-typedef struct _SC_ACTION {
-    SC_ACTION_TYPE  Type;
-    DWORD           Delay;
-} SC_ACTION, *LPSC_ACTION;
-
-typedef struct _SERVICE_FAILURE_ACTIONSA {
-    DWORD       dwResetPeriod;
-    LPSTR       lpRebootMsg;
-    LPSTR       lpCommand;
-    DWORD       cActions;
-
-
-
-    SC_ACTION * lpsaActions;
-} SERVICE_FAILURE_ACTIONSA, *LPSERVICE_FAILURE_ACTIONSA;
-typedef struct _SERVICE_FAILURE_ACTIONSW {
-    DWORD       dwResetPeriod;
-    LPWSTR      lpRebootMsg;
-    LPWSTR      lpCommand;
-    DWORD       cActions;
-
-
-
-    SC_ACTION * lpsaActions;
-} SERVICE_FAILURE_ACTIONSW, *LPSERVICE_FAILURE_ACTIONSW;
-
-typedef SERVICE_FAILURE_ACTIONSW SERVICE_FAILURE_ACTIONS;
-typedef LPSERVICE_FAILURE_ACTIONSW LPSERVICE_FAILURE_ACTIONS;
-
-
-
-
-
-
-
-
-
-
-struct SC_HANDLE__ { int unused; }; typedef struct SC_HANDLE__ *SC_HANDLE;
-typedef SC_HANDLE   *LPSC_HANDLE;
-
-struct SERVICE_STATUS_HANDLE__ { int unused; }; typedef struct SERVICE_STATUS_HANDLE__ *SERVICE_STATUS_HANDLE;
-
-
-
-
-
-typedef enum _SC_STATUS_TYPE {
-        SC_STATUS_PROCESS_INFO      = 0
-} SC_STATUS_TYPE;
-
-
-
-
-typedef enum _SC_ENUM_TYPE {
-        SC_ENUM_PROCESS_INFO        = 0
-} SC_ENUM_TYPE;
-
-
-
-
-
-
-typedef struct _SERVICE_STATUS {
-    DWORD   dwServiceType;
-    DWORD   dwCurrentState;
-    DWORD   dwControlsAccepted;
-    DWORD   dwWin32ExitCode;
-    DWORD   dwServiceSpecificExitCode;
-    DWORD   dwCheckPoint;
-    DWORD   dwWaitHint;
-} SERVICE_STATUS, *LPSERVICE_STATUS;
-
-typedef struct _SERVICE_STATUS_PROCESS {
-    DWORD   dwServiceType;
-    DWORD   dwCurrentState;
-    DWORD   dwControlsAccepted;
-    DWORD   dwWin32ExitCode;
-    DWORD   dwServiceSpecificExitCode;
-    DWORD   dwCheckPoint;
-    DWORD   dwWaitHint;
-    DWORD   dwProcessId;
-    DWORD   dwServiceFlags;
-} SERVICE_STATUS_PROCESS, *LPSERVICE_STATUS_PROCESS;
-
-
-
-
-
-
-typedef struct _ENUM_SERVICE_STATUSA {
-    LPSTR             lpServiceName;
-    LPSTR             lpDisplayName;
-    SERVICE_STATUS    ServiceStatus;
-} ENUM_SERVICE_STATUSA, *LPENUM_SERVICE_STATUSA;
-typedef struct _ENUM_SERVICE_STATUSW {
-    LPWSTR            lpServiceName;
-    LPWSTR            lpDisplayName;
-    SERVICE_STATUS    ServiceStatus;
-} ENUM_SERVICE_STATUSW, *LPENUM_SERVICE_STATUSW;
-
-typedef ENUM_SERVICE_STATUSW ENUM_SERVICE_STATUS;
-typedef LPENUM_SERVICE_STATUSW LPENUM_SERVICE_STATUS;
-
-
-
-
-
-typedef struct _ENUM_SERVICE_STATUS_PROCESSA {
-    LPSTR                     lpServiceName;
-    LPSTR                     lpDisplayName;
-    SERVICE_STATUS_PROCESS    ServiceStatusProcess;
-} ENUM_SERVICE_STATUS_PROCESSA, *LPENUM_SERVICE_STATUS_PROCESSA;
-typedef struct _ENUM_SERVICE_STATUS_PROCESSW {
-    LPWSTR                    lpServiceName;
-    LPWSTR                    lpDisplayName;
-    SERVICE_STATUS_PROCESS    ServiceStatusProcess;
-} ENUM_SERVICE_STATUS_PROCESSW, *LPENUM_SERVICE_STATUS_PROCESSW;
-
-typedef ENUM_SERVICE_STATUS_PROCESSW ENUM_SERVICE_STATUS_PROCESS;
-typedef LPENUM_SERVICE_STATUS_PROCESSW LPENUM_SERVICE_STATUS_PROCESS;
-
-
-
-
-
-
-
-
-
-typedef LPVOID  SC_LOCK;
-
-typedef struct _QUERY_SERVICE_LOCK_STATUSA {
-    DWORD   fIsLocked;
-    LPSTR   lpLockOwner;
-    DWORD   dwLockDuration;
-} QUERY_SERVICE_LOCK_STATUSA, *LPQUERY_SERVICE_LOCK_STATUSA;
-typedef struct _QUERY_SERVICE_LOCK_STATUSW {
-    DWORD   fIsLocked;
-    LPWSTR  lpLockOwner;
-    DWORD   dwLockDuration;
-} QUERY_SERVICE_LOCK_STATUSW, *LPQUERY_SERVICE_LOCK_STATUSW;
-
-typedef QUERY_SERVICE_LOCK_STATUSW QUERY_SERVICE_LOCK_STATUS;
-typedef LPQUERY_SERVICE_LOCK_STATUSW LPQUERY_SERVICE_LOCK_STATUS;
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _QUERY_SERVICE_CONFIGA {
-    DWORD   dwServiceType;
-    DWORD   dwStartType;
-    DWORD   dwErrorControl;
-    LPSTR   lpBinaryPathName;
-    LPSTR   lpLoadOrderGroup;
-    DWORD   dwTagId;
-    LPSTR   lpDependencies;
-    LPSTR   lpServiceStartName;
-    LPSTR   lpDisplayName;
-} QUERY_SERVICE_CONFIGA, *LPQUERY_SERVICE_CONFIGA;
-typedef struct _QUERY_SERVICE_CONFIGW {
-    DWORD   dwServiceType;
-    DWORD   dwStartType;
-    DWORD   dwErrorControl;
-    LPWSTR  lpBinaryPathName;
-    LPWSTR  lpLoadOrderGroup;
-    DWORD   dwTagId;
-    LPWSTR  lpDependencies;
-    LPWSTR  lpServiceStartName;
-    LPWSTR  lpDisplayName;
-} QUERY_SERVICE_CONFIGW, *LPQUERY_SERVICE_CONFIGW;
-
-typedef QUERY_SERVICE_CONFIGW QUERY_SERVICE_CONFIG;
-typedef LPQUERY_SERVICE_CONFIGW LPQUERY_SERVICE_CONFIG;
-
-
-
-
-
-
-
-
-
-
-
-typedef void (__stdcall *LPSERVICE_MAIN_FUNCTIONW)(
-    DWORD   dwNumServicesArgs,
-    LPWSTR  *lpServiceArgVectors
-    );
-
-typedef void (__stdcall *LPSERVICE_MAIN_FUNCTIONA)(
-    DWORD   dwNumServicesArgs,
-    LPSTR   *lpServiceArgVectors
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _SERVICE_TABLE_ENTRYA {
-    LPSTR                       lpServiceName;
-    LPSERVICE_MAIN_FUNCTIONA    lpServiceProc;
-}SERVICE_TABLE_ENTRYA, *LPSERVICE_TABLE_ENTRYA;
-typedef struct _SERVICE_TABLE_ENTRYW {
-    LPWSTR                      lpServiceName;
-    LPSERVICE_MAIN_FUNCTIONW    lpServiceProc;
-}SERVICE_TABLE_ENTRYW, *LPSERVICE_TABLE_ENTRYW;
-
-typedef SERVICE_TABLE_ENTRYW SERVICE_TABLE_ENTRY;
-typedef LPSERVICE_TABLE_ENTRYW LPSERVICE_TABLE_ENTRY;
-
-
-
-
-
-
-
-
-
-typedef void (__stdcall *LPHANDLER_FUNCTION)(
-    DWORD    dwControl
-    );
-
-typedef DWORD (__stdcall *LPHANDLER_FUNCTION_EX)(
-    DWORD    dwControl,
-    DWORD    dwEventType,
-    LPVOID   lpEventData,
-    LPVOID   lpContext
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ChangeServiceConfigA(
-                SC_HANDLE    hService,
-                DWORD        dwServiceType,
-                DWORD        dwStartType,
-                DWORD        dwErrorControl,
-              LPCSTR     lpBinaryPathName,
-              LPCSTR     lpLoadOrderGroup,
-             LPDWORD      lpdwTagId,
-              LPCSTR     lpDependencies,
-              LPCSTR     lpServiceStartName,
-              LPCSTR     lpPassword,
-              LPCSTR     lpDisplayName
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-ChangeServiceConfigW(
-                SC_HANDLE    hService,
-                DWORD        dwServiceType,
-                DWORD        dwStartType,
-                DWORD        dwErrorControl,
-              LPCWSTR     lpBinaryPathName,
-              LPCWSTR     lpLoadOrderGroup,
-             LPDWORD      lpdwTagId,
-              LPCWSTR     lpDependencies,
-              LPCWSTR     lpServiceStartName,
-              LPCWSTR     lpPassword,
-              LPCWSTR     lpDisplayName
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ChangeServiceConfig2A(
-                SC_HANDLE    hService,
-                DWORD        dwInfoLevel,
-              LPVOID       lpInfo
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-ChangeServiceConfig2W(
-                SC_HANDLE    hService,
-                DWORD        dwInfoLevel,
-              LPVOID       lpInfo
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-CloseServiceHandle(
-                SC_HANDLE   hSCObject
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-ControlService(
-                SC_HANDLE           hService,
-                DWORD               dwControl,
-               LPSERVICE_STATUS    lpServiceStatus
-    );
-
-
-__declspec(dllimport)
-SC_HANDLE
-__stdcall
-CreateServiceA(
-                SC_HANDLE    hSCManager,
-                LPCSTR     lpServiceName,
-              LPCSTR     lpDisplayName,
-                DWORD        dwDesiredAccess,
-                DWORD        dwServiceType,
-                DWORD        dwStartType,
-                DWORD        dwErrorControl,
-              LPCSTR     lpBinaryPathName,
-              LPCSTR     lpLoadOrderGroup,
-             LPDWORD      lpdwTagId,
-              LPCSTR     lpDependencies,
-              LPCSTR     lpServiceStartName,
-              LPCSTR     lpPassword
-    );
-
-__declspec(dllimport)
-SC_HANDLE
-__stdcall
-CreateServiceW(
-                SC_HANDLE    hSCManager,
-                LPCWSTR     lpServiceName,
-              LPCWSTR     lpDisplayName,
-                DWORD        dwDesiredAccess,
-                DWORD        dwServiceType,
-                DWORD        dwStartType,
-                DWORD        dwErrorControl,
-              LPCWSTR     lpBinaryPathName,
-              LPCWSTR     lpLoadOrderGroup,
-             LPDWORD      lpdwTagId,
-              LPCWSTR     lpDependencies,
-              LPCWSTR     lpServiceStartName,
-              LPCWSTR     lpPassword
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-DeleteService(
-                SC_HANDLE   hService
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumDependentServicesA(
-                    SC_HANDLE               hService,
-                    DWORD                   dwServiceState,
-               
-                    LPENUM_SERVICE_STATUSA  lpServices,
-                    DWORD                   cbBufSize,
-                   LPDWORD                 pcbBytesNeeded,
-                   LPDWORD                 lpServicesReturned
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumDependentServicesW(
-                    SC_HANDLE               hService,
-                    DWORD                   dwServiceState,
-               
-                    LPENUM_SERVICE_STATUSW  lpServices,
-                    DWORD                   cbBufSize,
-                   LPDWORD                 pcbBytesNeeded,
-                   LPDWORD                 lpServicesReturned
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumServicesStatusA(
-                    SC_HANDLE               hSCManager,
-                    DWORD                   dwServiceType,
-                    DWORD                   dwServiceState,
-          
-                    LPENUM_SERVICE_STATUSA  lpServices,
-                    DWORD                   cbBufSize,
-                   LPDWORD                 pcbBytesNeeded,
-                   LPDWORD                 lpServicesReturned,
-               LPDWORD                 lpResumeHandle
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumServicesStatusW(
-                    SC_HANDLE               hSCManager,
-                    DWORD                   dwServiceType,
-                    DWORD                   dwServiceState,
-          
-                    LPENUM_SERVICE_STATUSW  lpServices,
-                    DWORD                   cbBufSize,
-                   LPDWORD                 pcbBytesNeeded,
-                   LPDWORD                 lpServicesReturned,
-               LPDWORD                 lpResumeHandle
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumServicesStatusExA(
-                    SC_HANDLE               hSCManager,
-                    SC_ENUM_TYPE            InfoLevel,
-                    DWORD                   dwServiceType,
-                    DWORD                   dwServiceState,
-           
-                    LPBYTE                  lpServices,
-                    DWORD                   cbBufSize,
-                   LPDWORD                 pcbBytesNeeded,
-                   LPDWORD                 lpServicesReturned,
-               LPDWORD                 lpResumeHandle,
-                  LPCSTR                pszGroupName
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-EnumServicesStatusExW(
-                    SC_HANDLE               hSCManager,
-                    SC_ENUM_TYPE            InfoLevel,
-                    DWORD                   dwServiceType,
-                    DWORD                   dwServiceState,
-           
-                    LPBYTE                  lpServices,
-                    DWORD                   cbBufSize,
-                   LPDWORD                 pcbBytesNeeded,
-                   LPDWORD                 lpServicesReturned,
-               LPDWORD                 lpResumeHandle,
-                  LPCWSTR                pszGroupName
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetServiceKeyNameA(
-                    SC_HANDLE               hSCManager,
-                    LPCSTR                lpDisplayName,
-          
-                    LPSTR                 lpServiceName,
-                 LPDWORD                 lpcchBuffer
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetServiceKeyNameW(
-                    SC_HANDLE               hSCManager,
-                    LPCWSTR                lpDisplayName,
-          
-                    LPWSTR                 lpServiceName,
-                 LPDWORD                 lpcchBuffer
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetServiceDisplayNameA(
-                    SC_HANDLE               hSCManager,
-                    LPCSTR                lpServiceName,
-           
-                    LPSTR                 lpDisplayName,
-                 LPDWORD                 lpcchBuffer
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-GetServiceDisplayNameW(
-                    SC_HANDLE               hSCManager,
-                    LPCWSTR                lpServiceName,
-           
-                    LPWSTR                 lpDisplayName,
-                 LPDWORD                 lpcchBuffer
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-SC_LOCK
-__stdcall
-LockServiceDatabase(
-                    SC_HANDLE               hSCManager
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-NotifyBootConfigStatus(
-                    BOOL                    BootAcceptable
-    );
-
-
-__declspec(dllimport)
-SC_HANDLE
-__stdcall
-OpenSCManagerA(
-                  LPCSTR                lpMachineName,
-                  LPCSTR                lpDatabaseName,
-                    DWORD                   dwDesiredAccess
-    );
-
-__declspec(dllimport)
-SC_HANDLE
-__stdcall
-OpenSCManagerW(
-                  LPCWSTR                lpMachineName,
-                  LPCWSTR                lpDatabaseName,
-                    DWORD                   dwDesiredAccess
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-SC_HANDLE
-__stdcall
-OpenServiceA(
-                    SC_HANDLE               hSCManager,
-                    LPCSTR                lpServiceName,
-                    DWORD                   dwDesiredAccess
-    );
-
-__declspec(dllimport)
-SC_HANDLE
-__stdcall
-OpenServiceW(
-                    SC_HANDLE               hSCManager,
-                    LPCWSTR                lpServiceName,
-                    DWORD                   dwDesiredAccess
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-QueryServiceConfigA(
-                    SC_HANDLE               hService,
-                
-                    LPQUERY_SERVICE_CONFIGA lpServiceConfig,
-                    DWORD                   cbBufSize,
-                   LPDWORD                 pcbBytesNeeded
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-QueryServiceConfigW(
-                    SC_HANDLE               hService,
-                
-                    LPQUERY_SERVICE_CONFIGW lpServiceConfig,
-                    DWORD                   cbBufSize,
-                   LPDWORD                 pcbBytesNeeded
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-QueryServiceConfig2A(
-                    SC_HANDLE               hService,
-                    DWORD                   dwInfoLevel,
-           
-                    LPBYTE                  lpBuffer,
-                    DWORD                   cbBufSize,
-                   LPDWORD                 pcbBytesNeeded
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-QueryServiceConfig2W(
-                    SC_HANDLE               hService,
-                    DWORD                   dwInfoLevel,
-           
-                    LPBYTE                  lpBuffer,
-                    DWORD                   cbBufSize,
-                   LPDWORD                 pcbBytesNeeded
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-QueryServiceLockStatusA(
-                    SC_HANDLE                       hSCManager,
-           
-                    LPQUERY_SERVICE_LOCK_STATUSA    lpLockStatus,
-                    DWORD                           cbBufSize,
-                   LPDWORD                         pcbBytesNeeded
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-QueryServiceLockStatusW(
-                    SC_HANDLE                       hSCManager,
-           
-                    LPQUERY_SERVICE_LOCK_STATUSW    lpLockStatus,
-                    DWORD                           cbBufSize,
-                   LPDWORD                         pcbBytesNeeded
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-QueryServiceObjectSecurity(
-                    SC_HANDLE               hService,
-                    SECURITY_INFORMATION    dwSecurityInformation,
-           
-                    PSECURITY_DESCRIPTOR    lpSecurityDescriptor,
-                    DWORD                   cbBufSize,
-                   LPDWORD                 pcbBytesNeeded
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-QueryServiceStatus(
-                    SC_HANDLE           hService,
-                   LPSERVICE_STATUS    lpServiceStatus
-    );
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-QueryServiceStatusEx(
-                    SC_HANDLE           hService,
-                    SC_STATUS_TYPE      InfoLevel,
-           
-                    LPBYTE              lpBuffer,
-                    DWORD               cbBufSize,
-                   LPDWORD             pcbBytesNeeded
-    );
-
-
-__declspec(dllimport)
-SERVICE_STATUS_HANDLE
-__stdcall
-RegisterServiceCtrlHandlerA(
-            LPCSTR                    lpServiceName,
-              
-            LPHANDLER_FUNCTION          lpHandlerProc
-    );
-
-__declspec(dllimport)
-SERVICE_STATUS_HANDLE
-__stdcall
-RegisterServiceCtrlHandlerW(
-            LPCWSTR                    lpServiceName,
-              
-            LPHANDLER_FUNCTION          lpHandlerProc
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-SERVICE_STATUS_HANDLE
-__stdcall
-RegisterServiceCtrlHandlerExA(
-            LPCSTR                    lpServiceName,
-            
-            LPHANDLER_FUNCTION_EX       lpHandlerProc,
-           LPVOID                     lpContext
-    );
-
-__declspec(dllimport)
-SERVICE_STATUS_HANDLE
-__stdcall
-RegisterServiceCtrlHandlerExW(
-            LPCWSTR                    lpServiceName,
-            
-            LPHANDLER_FUNCTION_EX       lpHandlerProc,
-           LPVOID                     lpContext
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetServiceObjectSecurity(
-                SC_HANDLE               hService,
-                SECURITY_INFORMATION    dwSecurityInformation,
-                PSECURITY_DESCRIPTOR    lpSecurityDescriptor
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-SetServiceStatus(
-                SERVICE_STATUS_HANDLE   hServiceStatus,
-                LPSERVICE_STATUS        lpServiceStatus
-    );
-
-__declspec(dllimport)
-BOOL
-__stdcall
-StartServiceCtrlDispatcherA(
-         const  SERVICE_TABLE_ENTRYA    *lpServiceStartTable
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-StartServiceCtrlDispatcherW(
-         const  SERVICE_TABLE_ENTRYW    *lpServiceStartTable
-    );
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-StartServiceA(
-                    SC_HANDLE            hService,
-                    DWORD                dwNumServiceArgs,
-                   
-                    LPCSTR             *lpServiceArgVectors
-    );
-__declspec(dllimport)
-BOOL
-__stdcall
-StartServiceW(
-                    SC_HANDLE            hService,
-                    DWORD                dwNumServiceArgs,
-                   
-                    LPCWSTR             *lpServiceArgVectors
-    );
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
-__stdcall
-UnlockServiceDatabase(
-                    SC_LOCK             ScLock
-    );
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-typedef struct _MODEMDEVCAPS {
-    DWORD   dwActualSize;
-    DWORD   dwRequiredSize;
-    DWORD   dwDevSpecificOffset;
-    DWORD   dwDevSpecificSize;
-
-    
-    DWORD   dwModemProviderVersion;
-    DWORD   dwModemManufacturerOffset;
-    DWORD   dwModemManufacturerSize;
-    DWORD   dwModemModelOffset;
-    DWORD   dwModemModelSize;
-    DWORD   dwModemVersionOffset;
-    DWORD   dwModemVersionSize;
-
-    
-    DWORD   dwDialOptions;          
-    DWORD   dwCallSetupFailTimer;   
-    DWORD   dwInactivityTimeout;    
-    DWORD   dwSpeakerVolume;        
-    DWORD   dwSpeakerMode;          
-    DWORD   dwModemOptions;         
-    DWORD   dwMaxDTERate;           
-    DWORD   dwMaxDCERate;           
-
-    
-    BYTE    abVariablePortion [1];
-} MODEMDEVCAPS, *PMODEMDEVCAPS, *LPMODEMDEVCAPS;
-
-typedef struct _MODEMSETTINGS {
-    DWORD   dwActualSize;
-    DWORD   dwRequiredSize;
-    DWORD   dwDevSpecificOffset;
-    DWORD   dwDevSpecificSize;
-
-    
-    DWORD   dwCallSetupFailTimer;       
-    DWORD   dwInactivityTimeout;        
-    DWORD   dwSpeakerVolume;            
-    DWORD   dwSpeakerMode;              
-    DWORD   dwPreferredModemOptions;    
-
-    
-    DWORD   dwNegotiatedModemOptions;   
-    DWORD   dwNegotiatedDCERate;        
-
-    
-    BYTE    abVariablePortion [1];
-} MODEMSETTINGS, *PMODEMSETTINGS, *LPMODEMSETTINGS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-struct HIMC__ { int unused; }; typedef struct HIMC__ *HIMC;
-struct HIMCC__ { int unused; }; typedef struct HIMCC__ *HIMCC;
-
-
-
-
-
-typedef HKL   *LPHKL;
-typedef UINT  *LPUINT;
-
-typedef struct tagCOMPOSITIONFORM {
-    DWORD dwStyle;
-    POINT ptCurrentPos;
-    RECT  rcArea;
-} COMPOSITIONFORM, *PCOMPOSITIONFORM,  *NPCOMPOSITIONFORM,  *LPCOMPOSITIONFORM;
-
-
-typedef struct tagCANDIDATEFORM {
-    DWORD dwIndex;
-    DWORD dwStyle;
-    POINT ptCurrentPos;
-    RECT  rcArea;
-} CANDIDATEFORM, *PCANDIDATEFORM,  *NPCANDIDATEFORM,  *LPCANDIDATEFORM;
-
-
-typedef struct tagCANDIDATELIST {
-    DWORD dwSize;
-    DWORD dwStyle;
-    DWORD dwCount;
-    DWORD dwSelection;
-    DWORD dwPageStart;
-    DWORD dwPageSize;
-    DWORD dwOffset[1];
-} CANDIDATELIST, *PCANDIDATELIST,  *NPCANDIDATELIST,  *LPCANDIDATELIST;
-
-typedef struct tagREGISTERWORDA {
-    LPSTR   lpReading;
-    LPSTR   lpWord;
-} REGISTERWORDA, *PREGISTERWORDA,  *NPREGISTERWORDA,  *LPREGISTERWORDA;
-typedef struct tagREGISTERWORDW {
-    LPWSTR  lpReading;
-    LPWSTR  lpWord;
-} REGISTERWORDW, *PREGISTERWORDW,  *NPREGISTERWORDW,  *LPREGISTERWORDW;
-
-typedef REGISTERWORDW REGISTERWORD;
-typedef PREGISTERWORDW PREGISTERWORD;
-typedef NPREGISTERWORDW NPREGISTERWORD;
-typedef LPREGISTERWORDW LPREGISTERWORD;
-
-
-
-
-
-
-
-
-
-typedef struct tagRECONVERTSTRING {
-    DWORD dwSize;
-    DWORD dwVersion;
-    DWORD dwStrLen;
-    DWORD dwStrOffset;
-    DWORD dwCompStrLen;
-    DWORD dwCompStrOffset;
-    DWORD dwTargetStrLen;
-    DWORD dwTargetStrOffset;
-} RECONVERTSTRING, *PRECONVERTSTRING,  *NPRECONVERTSTRING,  *LPRECONVERTSTRING;
-
-
-
-
-
-typedef struct tagSTYLEBUFA {
-    DWORD       dwStyle;
-    CHAR        szDescription[32];
-} STYLEBUFA, *PSTYLEBUFA,  *NPSTYLEBUFA,  *LPSTYLEBUFA;
-typedef struct tagSTYLEBUFW {
-    DWORD       dwStyle;
-    WCHAR       szDescription[32];
-} STYLEBUFW, *PSTYLEBUFW,  *NPSTYLEBUFW,  *LPSTYLEBUFW;
-
-typedef STYLEBUFW STYLEBUF;
-typedef PSTYLEBUFW PSTYLEBUF;
-typedef NPSTYLEBUFW NPSTYLEBUF;
-typedef LPSTYLEBUFW LPSTYLEBUF;
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagIMEMENUITEMINFOA {
-    UINT        cbSize;
-    UINT        fType;
-    UINT        fState;
-    UINT        wID;
-    HBITMAP     hbmpChecked;
-    HBITMAP     hbmpUnchecked;
-    DWORD       dwItemData;
-    CHAR        szString[80];
-    HBITMAP     hbmpItem;
-} IMEMENUITEMINFOA, *PIMEMENUITEMINFOA,  *NPIMEMENUITEMINFOA,  *LPIMEMENUITEMINFOA;
-typedef struct tagIMEMENUITEMINFOW {
-    UINT        cbSize;
-    UINT        fType;
-    UINT        fState;
-    UINT        wID;
-    HBITMAP     hbmpChecked;
-    HBITMAP     hbmpUnchecked;
-    DWORD       dwItemData;
-    WCHAR       szString[80];
-    HBITMAP     hbmpItem;
-} IMEMENUITEMINFOW, *PIMEMENUITEMINFOW,  *NPIMEMENUITEMINFOW,  *LPIMEMENUITEMINFOW;
-
-typedef IMEMENUITEMINFOW IMEMENUITEMINFO;
-typedef PIMEMENUITEMINFOW PIMEMENUITEMINFO;
-typedef NPIMEMENUITEMINFOW NPIMEMENUITEMINFO;
-typedef LPIMEMENUITEMINFOW LPIMEMENUITEMINFO;
-
-
-
-
-
-
-
-typedef struct tagIMECHARPOSITION {
-    DWORD       dwSize;
-    DWORD       dwCharPos;
-    POINT       pt;
-    UINT        cLineHeight;
-    RECT        rcDocument;
-} IMECHARPOSITION, *PIMECHARPOSITION,  *NPIMECHARPOSITION,  *LPIMECHARPOSITION;
-
-typedef BOOL    (__stdcall* IMCENUMPROC)(HIMC, LPARAM);
-
-
-
-
-
-
-
-HKL  __stdcall ImmInstallIMEA( LPCSTR lpszIMEFileName,  LPCSTR lpszLayoutText);
-HKL  __stdcall ImmInstallIMEW( LPCWSTR lpszIMEFileName,  LPCWSTR lpszLayoutText);
-
-
-
-
-
-
-HWND __stdcall ImmGetDefaultIMEWnd( HWND);
-
-UINT __stdcall ImmGetDescriptionA( HKL,  LPSTR,  UINT uBufLen);
-UINT __stdcall ImmGetDescriptionW( HKL,  LPWSTR,  UINT uBufLen);
-
-
-
-
-
-
-UINT __stdcall ImmGetIMEFileNameA( HKL,  LPSTR,  UINT uBufLen);
-UINT __stdcall ImmGetIMEFileNameW( HKL,  LPWSTR,  UINT uBufLen);
-
-
-
-
-
-
-DWORD __stdcall ImmGetProperty( HKL,  DWORD);
-
-BOOL __stdcall ImmIsIME( HKL);
-
-BOOL __stdcall ImmSimulateHotKey( HWND,  DWORD);
-
-HIMC __stdcall ImmCreateContext(void);
-BOOL __stdcall ImmDestroyContext( HIMC);
-HIMC __stdcall ImmGetContext( HWND);
-BOOL __stdcall ImmReleaseContext( HWND,  HIMC);
-HIMC __stdcall ImmAssociateContext( HWND,  HIMC);
-
-BOOL __stdcall ImmAssociateContextEx( HWND,  HIMC,  DWORD);
-
-
-LONG  __stdcall ImmGetCompositionStringA( HIMC,  DWORD,  LPVOID,  DWORD);
-LONG  __stdcall ImmGetCompositionStringW( HIMC,  DWORD,  LPVOID,  DWORD);
-
-
-
-
-
-
-BOOL  __stdcall ImmSetCompositionStringA( HIMC,  DWORD dwIndex,  LPVOID lpComp,  DWORD,  LPVOID lpRead,  DWORD);
-BOOL  __stdcall ImmSetCompositionStringW( HIMC,  DWORD dwIndex,  LPVOID lpComp,  DWORD,  LPVOID lpRead,  DWORD);
-
-
-
-
-
-
-DWORD __stdcall ImmGetCandidateListCountA( HIMC,  LPDWORD lpdwListCount);
-DWORD __stdcall ImmGetCandidateListCountW( HIMC,  LPDWORD lpdwListCount);
-
-
-
-
-
-
-DWORD __stdcall ImmGetCandidateListA( HIMC,  DWORD deIndex,  LPCANDIDATELIST,  DWORD dwBufLen);
-DWORD __stdcall ImmGetCandidateListW( HIMC,  DWORD deIndex,  LPCANDIDATELIST,  DWORD dwBufLen);
-
-
-
-
-
-
-DWORD __stdcall ImmGetGuideLineA( HIMC,  DWORD dwIndex,  LPSTR,  DWORD dwBufLen);
-DWORD __stdcall ImmGetGuideLineW( HIMC,  DWORD dwIndex,  LPWSTR,  DWORD dwBufLen);
-
-
-
-
-
-
-BOOL __stdcall ImmGetConversionStatus( HIMC,  LPDWORD,  LPDWORD);
-BOOL __stdcall ImmSetConversionStatus( HIMC,  DWORD,  DWORD);
-BOOL __stdcall ImmGetOpenStatus( HIMC);
-BOOL __stdcall ImmSetOpenStatus( HIMC,  BOOL);
-
-
-BOOL __stdcall ImmGetCompositionFontA( HIMC,  LPLOGFONTA);
-BOOL __stdcall ImmGetCompositionFontW( HIMC,  LPLOGFONTW);
-
-
-
-
-
-
-BOOL __stdcall ImmSetCompositionFontA( HIMC,  LPLOGFONTA);
-BOOL __stdcall ImmSetCompositionFontW( HIMC,  LPLOGFONTW);
-
-
-
-
-
-
-
-BOOL    __stdcall ImmConfigureIMEA( HKL,  HWND,  DWORD,  LPVOID);
-BOOL    __stdcall ImmConfigureIMEW( HKL,  HWND,  DWORD,  LPVOID);
-
-
-
-
-
-
-LRESULT __stdcall ImmEscapeA( HKL,  HIMC,  UINT,  LPVOID);
-LRESULT __stdcall ImmEscapeW( HKL,  HIMC,  UINT,  LPVOID);
-
-
-
-
-
-
-DWORD   __stdcall ImmGetConversionListA( HKL,  HIMC,  LPCSTR,  LPCANDIDATELIST,  DWORD dwBufLen,  UINT uFlag);
-DWORD   __stdcall ImmGetConversionListW( HKL,  HIMC,  LPCWSTR,  LPCANDIDATELIST,  DWORD dwBufLen,  UINT uFlag);
-
-
-
-
-
-
-BOOL    __stdcall ImmNotifyIME( HIMC,  DWORD dwAction,  DWORD dwIndex,  DWORD dwValue);
-
-BOOL __stdcall ImmGetStatusWindowPos( HIMC,  LPPOINT);
-BOOL __stdcall ImmSetStatusWindowPos( HIMC,  LPPOINT);
-BOOL __stdcall ImmGetCompositionWindow( HIMC,  LPCOMPOSITIONFORM);
-BOOL __stdcall ImmSetCompositionWindow( HIMC,  LPCOMPOSITIONFORM);
-BOOL __stdcall ImmGetCandidateWindow( HIMC,  DWORD,  LPCANDIDATEFORM);
-BOOL __stdcall ImmSetCandidateWindow( HIMC,  LPCANDIDATEFORM);
-
-BOOL __stdcall ImmIsUIMessageA( HWND,  UINT,  WPARAM,  LPARAM);
-BOOL __stdcall ImmIsUIMessageW( HWND,  UINT,  WPARAM,  LPARAM);
-
-
-
-
-
-
-
-UINT __stdcall ImmGetVirtualKey( HWND);
-
-typedef int (__stdcall *REGISTERWORDENUMPROCA)(LPCSTR, DWORD, LPCSTR, LPVOID);
-typedef int (__stdcall *REGISTERWORDENUMPROCW)(LPCWSTR, DWORD, LPCWSTR, LPVOID);
-
-
-
-
-
-
-BOOL __stdcall ImmRegisterWordA( HKL,  LPCSTR lpszReading,  DWORD,  LPCSTR lpszRegister);
-BOOL __stdcall ImmRegisterWordW( HKL,  LPCWSTR lpszReading,  DWORD,  LPCWSTR lpszRegister);
-
-
-
-
-
-
-BOOL __stdcall ImmUnregisterWordA( HKL,  LPCSTR lpszReading,  DWORD,  LPCSTR lpszUnregister);
-BOOL __stdcall ImmUnregisterWordW( HKL,  LPCWSTR lpszReading,  DWORD,  LPCWSTR lpszUnregister);
-
-
-
-
-
-
-UINT __stdcall ImmGetRegisterWordStyleA( HKL,  UINT nItem,  LPSTYLEBUFA);
-UINT __stdcall ImmGetRegisterWordStyleW( HKL,  UINT nItem,  LPSTYLEBUFW);
-
-
-
-
-
-
-UINT __stdcall ImmEnumRegisterWordA( HKL,  REGISTERWORDENUMPROCA,  LPCSTR lpszReading,  DWORD,  LPCSTR lpszRegister,  LPVOID);
-UINT __stdcall ImmEnumRegisterWordW( HKL,  REGISTERWORDENUMPROCW,  LPCWSTR lpszReading,  DWORD,  LPCWSTR lpszRegister,  LPVOID);
-
-
-
-
-
-
-
-BOOL __stdcall ImmDisableIME( DWORD);
-BOOL __stdcall ImmEnumInputContext(DWORD idThread, IMCENUMPROC lpfn, LPARAM lParam);
-DWORD __stdcall ImmGetImeMenuItemsA( HIMC,  DWORD,  DWORD,  LPIMEMENUITEMINFOA,  LPIMEMENUITEMINFOA,  DWORD);
-DWORD __stdcall ImmGetImeMenuItemsW( HIMC,  DWORD,  DWORD,  LPIMEMENUITEMINFOW,  LPIMEMENUITEMINFOW,  DWORD);
-
-
-
-
-
-
-BOOL __stdcall ImmDisableTextFrameService(DWORD idThread);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-typedef unsigned char   u_char;
-typedef unsigned short  u_short;
-typedef unsigned int    u_int;
-typedef unsigned long   u_long;
-typedef unsigned __int64 u_int64;
-
-
-
-
-
-
-typedef UINT_PTR        SOCKET;
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct fd_set {
-        u_int fd_count;               
-        SOCKET  fd_array[64];   
-} fd_set;
-
-extern int __stdcall  __WSAFDIsSet(SOCKET, fd_set  *);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct timeval {
-        long    tv_sec;         
-        long    tv_usec;        
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                        
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct  hostent {
-        char     * h_name;           
-        char     *  * h_aliases;  
-        short   h_addrtype;             
-        short   h_length;               
-        char     *  * h_addr_list; 
-
-};
-
-
-
-
-
-struct  netent {
-        char     * n_name;           
-        char     *  * n_aliases;  
-        short   n_addrtype;             
-        u_long  n_net;                  
-};
-
-struct  servent {
-        char     * s_name;           
-        char     *  * s_aliases;  
-
-
-
-
-        short   s_port;                 
-        char     * s_proto;          
-
-};
-
-struct  protoent {
-        char     * p_name;           
-        char     *  * p_aliases;  
-        short   p_proto;                
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                        
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct in_addr {
-        union {
-                struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
-                struct { u_short s_w1,s_w2; } S_un_w;
-                u_long S_addr;
-        } S_un;
-
-                                
-
-                                
-
-                                
-
-                                
-
-                                
-
-                                
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct sockaddr_in {
-        short   sin_family;
-        u_short sin_port;
-        struct  in_addr sin_addr;
-        char    sin_zero[8];
-};
-
-
-
-
-typedef struct WSAData {
-        WORD                    wVersion;
-        WORD                    wHighVersion;
-
-
-
-
-
-
-
-        char                    szDescription[256+1];
-        char                    szSystemStatus[128+1];
-        unsigned short          iMaxSockets;
-        unsigned short          iMaxUdpDg;
-        char  *              lpVendorInfo;
-
-} WSADATA,  * LPWSADATA;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                       
-                                       
-                                       
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct sockaddr {
-        u_short sa_family;              
-        char    sa_data[14];            
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct sockaddr_storage {
-    short ss_family;               
-    char __ss_pad1[((sizeof(__int64)) - sizeof (short))];  
-                                   
-                                   
-                                   
-    __int64 __ss_align;            
-    char __ss_pad2[(128 - (sizeof (short) + ((sizeof(__int64)) - sizeof (short)) + (sizeof(__int64))))];  
-                                   
-                                   
-                                   
-};
-
-
-
-
-
-struct sockproto {
-        u_short sp_family;              
-        u_short sp_protocol;            
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct  linger {
-        u_short l_onoff;                
-        u_short l_linger;               
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _OVERLAPPED *    LPWSAOVERLAPPED;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _WSABUF {
-    u_long      len;     
-    char  *  buf;     
-} WSABUF,  * LPWSABUF;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef ULONG   SERVICETYPE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _flowspec
-{
-    ULONG       TokenRate;              
-    ULONG       TokenBucketSize;        
-    ULONG       PeakBandwidth;          
-    ULONG       Latency;                
-    ULONG       DelayVariation;         
-    SERVICETYPE ServiceType;
-    ULONG       MaxSduSize;             
-    ULONG       MinimumPolicedSize;     
-
-} FLOWSPEC, *PFLOWSPEC, * LPFLOWSPEC;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct  {
-
-    ULONG   ObjectType;
-    ULONG   ObjectLength;  
-
-
-} QOS_OBJECT_HDR, *LPQOS_OBJECT_HDR;
-
-
-
-
-
-
-
-
-
-          
-
-          
-
-          
-
-          
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _QOS_SD_MODE {
-
-    QOS_OBJECT_HDR   ObjectHdr;
-    ULONG            ShapeDiscardMode;
-
-} QOS_SD_MODE, *LPQOS_SD_MODE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _QOS_SHAPING_RATE {
-
-    QOS_OBJECT_HDR   ObjectHdr;
-    ULONG            ShapingRate;
-
-} QOS_SHAPING_RATE, *LPQOS_SHAPING_RATE;
-
-
-
-
-
-typedef struct _QualityOfService
-{
-    FLOWSPEC      SendingFlowspec;       
-    FLOWSPEC      ReceivingFlowspec;     
-    WSABUF        ProviderSpecific;      
-} QOS,  * LPQOS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef unsigned int             GROUP;
-
-
-
-
-
-
-
-typedef struct _WSANETWORKEVENTS {
-       long lNetworkEvents;
-       int iErrorCode[10];
-} WSANETWORKEVENTS,  * LPWSANETWORKEVENTS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _WSAPROTOCOLCHAIN {
-    int ChainLen;                                 
-                                                  
-                                                  
-                                                  
-    DWORD ChainEntries[7];       
-} WSAPROTOCOLCHAIN,  * LPWSAPROTOCOLCHAIN;
-
-
-
-typedef struct _WSAPROTOCOL_INFOA {
-    DWORD dwServiceFlags1;
-    DWORD dwServiceFlags2;
-    DWORD dwServiceFlags3;
-    DWORD dwServiceFlags4;
-    DWORD dwProviderFlags;
-    GUID ProviderId;
-    DWORD dwCatalogEntryId;
-    WSAPROTOCOLCHAIN ProtocolChain;
-    int iVersion;
-    int iAddressFamily;
-    int iMaxSockAddr;
-    int iMinSockAddr;
-    int iSocketType;
-    int iProtocol;
-    int iProtocolMaxOffset;
-    int iNetworkByteOrder;
-    int iSecurityScheme;
-    DWORD dwMessageSize;
-    DWORD dwProviderReserved;
-    CHAR   szProtocol[255+1];
-} WSAPROTOCOL_INFOA,  * LPWSAPROTOCOL_INFOA;
-typedef struct _WSAPROTOCOL_INFOW {
-    DWORD dwServiceFlags1;
-    DWORD dwServiceFlags2;
-    DWORD dwServiceFlags3;
-    DWORD dwServiceFlags4;
-    DWORD dwProviderFlags;
-    GUID ProviderId;
-    DWORD dwCatalogEntryId;
-    WSAPROTOCOLCHAIN ProtocolChain;
-    int iVersion;
-    int iAddressFamily;
-    int iMaxSockAddr;
-    int iMinSockAddr;
-    int iSocketType;
-    int iProtocol;
-    int iProtocolMaxOffset;
-    int iNetworkByteOrder;
-    int iSecurityScheme;
-    DWORD dwMessageSize;
-    DWORD dwProviderReserved;
-    WCHAR  szProtocol[255+1];
-} WSAPROTOCOL_INFOW,  * LPWSAPROTOCOL_INFOW;
-
-typedef WSAPROTOCOL_INFOW WSAPROTOCOL_INFO;
-typedef LPWSAPROTOCOL_INFOW LPWSAPROTOCOL_INFO;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef
-int
-(__stdcall * LPCONDITIONPROC)(
-     LPWSABUF lpCallerId,
-     LPWSABUF lpCallerData,
-      LPQOS lpSQOS,
-      LPQOS lpGQOS,
-     LPWSABUF lpCalleeId,
-     LPWSABUF lpCalleeData,
-     GROUP  * g,
-     DWORD_PTR dwCallbackData
-    );
-
-typedef
-void
-(__stdcall * LPWSAOVERLAPPED_COMPLETION_ROUTINE)(
-     DWORD dwError,
-     DWORD cbTransferred,
-     LPWSAOVERLAPPED lpOverlapped,
-     DWORD dwFlags
-    );
-
-
-
-
-
-
-
-typedef enum _WSACOMPLETIONTYPE {
-    NSP_NOTIFY_IMMEDIATELY = 0,
-    NSP_NOTIFY_HWND,
-    NSP_NOTIFY_EVENT,
-    NSP_NOTIFY_PORT,
-    NSP_NOTIFY_APC,
-} WSACOMPLETIONTYPE, *PWSACOMPLETIONTYPE,  * LPWSACOMPLETIONTYPE;
-
-typedef struct _WSACOMPLETION {
-    WSACOMPLETIONTYPE Type;
-    union {
-        struct {
-            HWND hWnd;
-            UINT uMsg;
-            WPARAM context;
-        } WindowMessage;
-        struct {
-            LPWSAOVERLAPPED lpOverlapped;
-        } Event;
-        struct {
-            LPWSAOVERLAPPED lpOverlapped;
-            LPWSAOVERLAPPED_COMPLETION_ROUTINE lpfnCompletionProc;
-        } Apc;
-        struct {
-            LPWSAOVERLAPPED lpOverlapped;
-            HANDLE hPort;
-            ULONG_PTR Key;
-        } Port;
-    } Parameters;
-} WSACOMPLETION, *PWSACOMPLETION,  *LPWSACOMPLETION;
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct sockaddr SOCKADDR;
-typedef struct sockaddr *PSOCKADDR;
-typedef struct sockaddr  *LPSOCKADDR;
-
-typedef struct sockaddr_storage SOCKADDR_STORAGE;
-typedef struct sockaddr_storage *PSOCKADDR_STORAGE;
-typedef struct sockaddr_storage  *LPSOCKADDR_STORAGE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _SOCKET_ADDRESS {
-    LPSOCKADDR lpSockaddr ;
-    INT iSockaddrLength ;
-} SOCKET_ADDRESS, *PSOCKET_ADDRESS,  * LPSOCKET_ADDRESS ;
-
-
-
-
-typedef struct _CSADDR_INFO {
-    SOCKET_ADDRESS LocalAddr ;
-    SOCKET_ADDRESS RemoteAddr ;
-    INT iSocketType ;
-    INT iProtocol ;
-} CSADDR_INFO, *PCSADDR_INFO,  * LPCSADDR_INFO ;
-
-
-
-
-
-typedef struct _SOCKET_ADDRESS_LIST {
-    INT             iAddressCount;
-    SOCKET_ADDRESS  Address[1];
-} SOCKET_ADDRESS_LIST,  * LPSOCKET_ADDRESS_LIST;
-
-
-
-
-typedef struct _AFPROTOCOLS {
-    INT iAddressFamily;
-    INT iProtocol;
-} AFPROTOCOLS, *PAFPROTOCOLS, *LPAFPROTOCOLS;
-
-
-
-
-
-
-
-
-typedef enum _WSAEcomparator
-{
-    COMP_EQUAL = 0,
-    COMP_NOTLESS
-} WSAECOMPARATOR, *PWSAECOMPARATOR, *LPWSAECOMPARATOR;
-
-typedef struct _WSAVersion
-{
-    DWORD           dwVersion;
-    WSAECOMPARATOR  ecHow;
-}WSAVERSION, *PWSAVERSION, *LPWSAVERSION;
-
-typedef struct _WSAQuerySetA
-{
-    DWORD           dwSize;
-    LPSTR           lpszServiceInstanceName;
-    LPGUID          lpServiceClassId;
-    LPWSAVERSION    lpVersion;
-    LPSTR           lpszComment;
-    DWORD           dwNameSpace;
-    LPGUID          lpNSProviderId;
-    LPSTR           lpszContext;
-    DWORD           dwNumberOfProtocols;
-    LPAFPROTOCOLS   lpafpProtocols;
-    LPSTR           lpszQueryString;
-    DWORD           dwNumberOfCsAddrs;
-    LPCSADDR_INFO   lpcsaBuffer;
-    DWORD           dwOutputFlags;
-    LPBLOB          lpBlob;
-} WSAQUERYSETA, *PWSAQUERYSETA, *LPWSAQUERYSETA;
-typedef struct _WSAQuerySetW
-{
-    DWORD           dwSize;
-    LPWSTR          lpszServiceInstanceName;
-    LPGUID          lpServiceClassId;
-    LPWSAVERSION    lpVersion;
-    LPWSTR          lpszComment;
-    DWORD           dwNameSpace;
-    LPGUID          lpNSProviderId;
-    LPWSTR          lpszContext;
-    DWORD           dwNumberOfProtocols;
-    LPAFPROTOCOLS   lpafpProtocols;
-    LPWSTR          lpszQueryString;
-    DWORD           dwNumberOfCsAddrs;
-    LPCSADDR_INFO   lpcsaBuffer;
-    DWORD           dwOutputFlags;
-    LPBLOB          lpBlob;
-} WSAQUERYSETW, *PWSAQUERYSETW, *LPWSAQUERYSETW;
-
-typedef WSAQUERYSETW WSAQUERYSET;
-typedef PWSAQUERYSETW PWSAQUERYSET;
-typedef LPWSAQUERYSETW LPWSAQUERYSET;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum _WSAESETSERVICEOP
-{
-    RNRSERVICE_REGISTER=0,
-    RNRSERVICE_DEREGISTER,
-    RNRSERVICE_DELETE
-} WSAESETSERVICEOP, *PWSAESETSERVICEOP, *LPWSAESETSERVICEOP;
-
-
-
-
-
-typedef struct _WSANSClassInfoA
-{
-    LPSTR   lpszName;
-    DWORD   dwNameSpace;
-    DWORD   dwValueType;
-    DWORD   dwValueSize;
-    LPVOID  lpValue;
-}WSANSCLASSINFOA, *PWSANSCLASSINFOA, *LPWSANSCLASSINFOA;
-typedef struct _WSANSClassInfoW
-{
-    LPWSTR  lpszName;
-    DWORD   dwNameSpace;
-    DWORD   dwValueType;
-    DWORD   dwValueSize;
-    LPVOID  lpValue;
-}WSANSCLASSINFOW, *PWSANSCLASSINFOW, *LPWSANSCLASSINFOW;
-
-typedef WSANSCLASSINFOW WSANSCLASSINFO;
-typedef PWSANSCLASSINFOW PWSANSCLASSINFO;
-typedef LPWSANSCLASSINFOW LPWSANSCLASSINFO;
-
-
-
-
-
-
-typedef struct _WSAServiceClassInfoA
-{
-    LPGUID              lpServiceClassId;
-    LPSTR               lpszServiceClassName;
-    DWORD               dwCount;
-    LPWSANSCLASSINFOA   lpClassInfos;
-}WSASERVICECLASSINFOA, *PWSASERVICECLASSINFOA, *LPWSASERVICECLASSINFOA;
-typedef struct _WSAServiceClassInfoW
-{
-    LPGUID              lpServiceClassId;
-    LPWSTR              lpszServiceClassName;
-    DWORD               dwCount;
-    LPWSANSCLASSINFOW   lpClassInfos;
-}WSASERVICECLASSINFOW, *PWSASERVICECLASSINFOW, *LPWSASERVICECLASSINFOW;
-
-typedef WSASERVICECLASSINFOW WSASERVICECLASSINFO;
-typedef PWSASERVICECLASSINFOW PWSASERVICECLASSINFO;
-typedef LPWSASERVICECLASSINFOW LPWSASERVICECLASSINFO;
-
-
-
-
-
-
-typedef struct _WSANAMESPACE_INFOA {
-    GUID                NSProviderId;
-    DWORD               dwNameSpace;
-    BOOL                fActive;
-    DWORD               dwVersion;
-    LPSTR               lpszIdentifier;
-} WSANAMESPACE_INFOA, *PWSANAMESPACE_INFOA, *LPWSANAMESPACE_INFOA;
-typedef struct _WSANAMESPACE_INFOW {
-    GUID                NSProviderId;
-    DWORD               dwNameSpace;
-    BOOL                fActive;
-    DWORD               dwVersion;
-    LPWSTR              lpszIdentifier;
-} WSANAMESPACE_INFOW, *PWSANAMESPACE_INFOW, *LPWSANAMESPACE_INFOW;
-
-typedef WSANAMESPACE_INFOW WSANAMESPACE_INFO;
-typedef PWSANAMESPACE_INFOW PWSANAMESPACE_INFO;
-typedef LPWSANAMESPACE_INFOW LPWSANAMESPACE_INFO;
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-SOCKET
- __stdcall
-accept(
-     SOCKET s,
-     struct sockaddr  * addr,
-      int  * addrlen
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-bind(
-     SOCKET s,
-     const struct sockaddr  * name,
-     int namelen
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-closesocket(
-     SOCKET s
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-connect(
-     SOCKET s,
-     const struct sockaddr  * name,
-     int namelen
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-ioctlsocket(
-     SOCKET s,
-     long cmd,
-      u_long  * argp
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-getpeername(
-     SOCKET s,
-     struct sockaddr  * name,
-      int  * namelen
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-getsockname(
-     SOCKET s,
-     struct sockaddr  * name,
-      int  * namelen
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-getsockopt(
-     SOCKET s,
-     int level,
-     int optname,
-     char  * optval,
-      int  * optlen
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-u_long
- __stdcall
-htonl(
-     u_long hostlong
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-u_short
- __stdcall
-htons(
-     u_short hostshort
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-unsigned long
- __stdcall
-inet_addr(
-     const char  * cp
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-char  *
- __stdcall
-inet_ntoa(
-     struct in_addr in
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-listen(
-     SOCKET s,
-     int backlog
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-u_long
- __stdcall
-ntohl(
-     u_long netlong
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-u_short
- __stdcall
-ntohs(
-     u_short netshort
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-recv(
-     SOCKET s,
-     char  * buf,
-     int len,
-     int flags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-recvfrom(
-     SOCKET s,
-     char  * buf,
-     int len,
-     int flags,
-     struct sockaddr  * from,
-      int  * fromlen
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-select(
-     int nfds,
-      fd_set  * readfds,
-      fd_set  * writefds,
-      fd_set  *exceptfds,
-     const struct timeval  * timeout
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-send(
-     SOCKET s,
-     const char  * buf,
-     int len,
-     int flags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-sendto(
-     SOCKET s,
-     const char  * buf,
-     int len,
-     int flags,
-     const struct sockaddr  * to,
-     int tolen
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-setsockopt(
-     SOCKET s,
-     int level,
-     int optname,
-     const char  * optval,
-     int optlen
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-shutdown(
-     SOCKET s,
-     int how
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-SOCKET
- __stdcall
-socket(
-     int af,
-     int type,
-     int protocol
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-struct hostent  *
- __stdcall
-gethostbyaddr(
-     const char  * addr,
-     int len,
-     int type
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-struct hostent  *
- __stdcall
-gethostbyname(
-     const char  * name
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-gethostname(
-     char  * name,
-     int namelen
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-struct servent  *
- __stdcall
-getservbyport(
-     int port,
-     const char  * proto
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-struct servent  *
- __stdcall
-getservbyname(
-     const char  * name,
-     const char  * proto
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-struct protoent  *
- __stdcall
-getprotobynumber(
-     int number
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-struct protoent  *
- __stdcall
-getprotobyname(
-     const char  * name
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSAStartup(
-     WORD wVersionRequested,
-     LPWSADATA lpWSAData
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSACleanup(
-    void
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-void
- __stdcall
-WSASetLastError(
-     int iError
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSAGetLastError(
-    void
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
- __stdcall
-WSAIsBlocking(
-    void
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSAUnhookBlockingHook(
-    void
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-FARPROC
- __stdcall
-WSASetBlockingHook(
-     FARPROC lpBlockFunc
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSACancelBlockingCall(
-    void
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HANDLE
- __stdcall
-WSAAsyncGetServByName(
-     HWND hWnd,
-     u_int wMsg,
-     const char  * name,
-     const char  * proto,
-     char  * buf,
-     int buflen
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HANDLE
- __stdcall
-WSAAsyncGetServByPort(
-     HWND hWnd,
-     u_int wMsg,
-     int port,
-     const char  * proto,
-     char  * buf,
-     int buflen
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HANDLE
- __stdcall
-WSAAsyncGetProtoByName(
-     HWND hWnd,
-     u_int wMsg,
-     const char  * name,
-     char  * buf,
-     int buflen
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HANDLE
- __stdcall
-WSAAsyncGetProtoByNumber(
-     HWND hWnd,
-     u_int wMsg,
-     int number,
-     char  * buf,
-     int buflen
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HANDLE
- __stdcall
-WSAAsyncGetHostByName(
-     HWND hWnd,
-     u_int wMsg,
-     const char  * name,
-     char  * buf,
-     int buflen
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HANDLE
- __stdcall
-WSAAsyncGetHostByAddr(
-     HWND hWnd,
-     u_int wMsg,
-     const char  * addr,
-     int len,
-     int type,
-     char  * buf,
-     int buflen
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSACancelAsyncRequest(
-     HANDLE hAsyncTaskHandle
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSAAsyncSelect(
-     SOCKET s,
-     HWND hWnd,
-     u_int wMsg,
-     long lEvent
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-SOCKET
- __stdcall
-WSAAccept(
-     SOCKET s,
-     struct sockaddr  * addr,
-      LPINT addrlen,
-     LPCONDITIONPROC lpfnCondition,
-     DWORD_PTR dwCallbackData
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
- __stdcall
-WSACloseEvent(
-     HANDLE hEvent
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSAConnect(
-     SOCKET s,
-     const struct sockaddr  * name,
-     int namelen,
-     LPWSABUF lpCallerData,
-     LPWSABUF lpCalleeData,
-     LPQOS lpSQOS,
-     LPQOS lpGQOS
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-HANDLE
- __stdcall
-WSACreateEvent(
-    void
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSADuplicateSocketA(
-     SOCKET s,
-     DWORD dwProcessId,
-     LPWSAPROTOCOL_INFOA lpProtocolInfo
-    );
-__declspec(dllimport)
-int
- __stdcall
-WSADuplicateSocketW(
-     SOCKET s,
-     DWORD dwProcessId,
-     LPWSAPROTOCOL_INFOW lpProtocolInfo
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSAEnumNetworkEvents(
-     SOCKET s,
-     HANDLE hEventObject,
-     LPWSANETWORKEVENTS lpNetworkEvents
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSAEnumProtocolsA(
-     LPINT lpiProtocols,
-     LPWSAPROTOCOL_INFOA lpProtocolBuffer,
-      LPDWORD lpdwBufferLength
-    );
-__declspec(dllimport)
-int
- __stdcall
-WSAEnumProtocolsW(
-     LPINT lpiProtocols,
-     LPWSAPROTOCOL_INFOW lpProtocolBuffer,
-      LPDWORD lpdwBufferLength
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSAEventSelect(
-     SOCKET s,
-     HANDLE hEventObject,
-     long lNetworkEvents
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
- __stdcall
-WSAGetOverlappedResult(
-     SOCKET s,
-     LPWSAOVERLAPPED lpOverlapped,
-     LPDWORD lpcbTransfer,
-     BOOL fWait,
-     LPDWORD lpdwFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
- __stdcall
-WSAGetQOSByName(
-     SOCKET s,
-     LPWSABUF lpQOSName,
-     LPQOS lpQOS
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSAHtonl(
-     SOCKET s,
-     u_long hostlong,
-     u_long  * lpnetlong
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSAHtons(
-     SOCKET s,
-     u_short hostshort,
-     u_short  * lpnetshort
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSAIoctl(
-     SOCKET s,
-     DWORD dwIoControlCode,
-     LPVOID lpvInBuffer,
-     DWORD cbInBuffer,
-     LPVOID lpvOutBuffer,
-     DWORD cbOutBuffer,
-     LPDWORD lpcbBytesReturned,
-     LPWSAOVERLAPPED lpOverlapped,
-     LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-SOCKET
- __stdcall
-WSAJoinLeaf(
-     SOCKET s,
-     const struct sockaddr  * name,
-     int namelen,
-     LPWSABUF lpCallerData,
-     LPWSABUF lpCalleeData,
-     LPQOS lpSQOS,
-     LPQOS lpGQOS,
-     DWORD dwFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSANtohl(
-     SOCKET s,
-     u_long netlong,
-     u_long  * lphostlong
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSANtohs(
-     SOCKET s,
-     u_short netshort,
-     u_short  * lphostshort
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSARecv(
-     SOCKET s,
-      LPWSABUF lpBuffers,
-     DWORD dwBufferCount,
-     LPDWORD lpNumberOfBytesRecvd,
-      LPDWORD lpFlags,
-     LPWSAOVERLAPPED lpOverlapped,
-     LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSARecvDisconnect(
-     SOCKET s,
-     LPWSABUF lpInboundDisconnectData
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSARecvFrom(
-     SOCKET s,
-      LPWSABUF lpBuffers,
-     DWORD dwBufferCount,
-     LPDWORD lpNumberOfBytesRecvd,
-      LPDWORD lpFlags,
-     struct sockaddr  * lpFrom,
-      LPINT lpFromlen,
-     LPWSAOVERLAPPED lpOverlapped,
-     LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
- __stdcall
-WSAResetEvent(
-     HANDLE hEvent
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSASend(
-     SOCKET s,
-     LPWSABUF lpBuffers,
-     DWORD dwBufferCount,
-     LPDWORD lpNumberOfBytesSent,
-     DWORD dwFlags,
-     LPWSAOVERLAPPED lpOverlapped,
-     LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSASendDisconnect(
-     SOCKET s,
-     LPWSABUF lpOutboundDisconnectData
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-int
- __stdcall
-WSASendTo(
-     SOCKET s,
-     LPWSABUF lpBuffers,
-     DWORD dwBufferCount,
-     LPDWORD lpNumberOfBytesSent,
-     DWORD dwFlags,
-     const struct sockaddr  * lpTo,
-     int iTolen,
-     LPWSAOVERLAPPED lpOverlapped,
-     LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-BOOL
- __stdcall
-WSASetEvent(
-     HANDLE hEvent
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-SOCKET
- __stdcall
-WSASocketA(
-     int af,
-     int type,
-     int protocol,
-     LPWSAPROTOCOL_INFOA lpProtocolInfo,
-     GROUP g,
-     DWORD dwFlags
-    );
-__declspec(dllimport)
-SOCKET
- __stdcall
-WSASocketW(
-     int af,
-     int type,
-     int protocol,
-     LPWSAPROTOCOL_INFOW lpProtocolInfo,
-     GROUP g,
-     DWORD dwFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-DWORD
- __stdcall
-WSAWaitForMultipleEvents(
-     DWORD cEvents,
-     const HANDLE  * lphEvents,
-     BOOL fWaitAll,
-     DWORD dwTimeout,
-     BOOL fAlertable
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-INT
- __stdcall
-WSAAddressToStringA(
-         LPSOCKADDR          lpsaAddress,
-         DWORD               dwAddressLength,
-         LPWSAPROTOCOL_INFOA lpProtocolInfo,
-      LPSTR             lpszAddressString,
-      LPDWORD             lpdwAddressStringLength
-    );
-__declspec(dllimport)
-INT
- __stdcall
-WSAAddressToStringW(
-         LPSOCKADDR          lpsaAddress,
-         DWORD               dwAddressLength,
-         LPWSAPROTOCOL_INFOW lpProtocolInfo,
-      LPWSTR             lpszAddressString,
-      LPDWORD             lpdwAddressStringLength
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-INT
- __stdcall
-WSAStringToAddressA(
-         LPSTR               AddressString,
-         INT                 AddressFamily,
-         LPWSAPROTOCOL_INFOA lpProtocolInfo,
-        LPSOCKADDR          lpAddress,
-      LPINT               lpAddressLength
-    );
-__declspec(dllimport)
-INT
- __stdcall
-WSAStringToAddressW(
-         LPWSTR              AddressString,
-         INT                 AddressFamily,
-         LPWSAPROTOCOL_INFOW lpProtocolInfo,
-        LPSOCKADDR          lpAddress,
-      LPINT               lpAddressLength
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-INT
- __stdcall
-WSALookupServiceBeginA(
-      LPWSAQUERYSETA lpqsRestrictions,
-      DWORD          dwControlFlags,
-     LPHANDLE       lphLookup
-    );
-__declspec(dllimport)
-INT
- __stdcall
-WSALookupServiceBeginW(
-      LPWSAQUERYSETW lpqsRestrictions,
-      DWORD          dwControlFlags,
-     LPHANDLE       lphLookup
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-INT
- __stdcall
-WSALookupServiceNextA(
-         HANDLE           hLookup,
-         DWORD            dwControlFlags,
-      LPDWORD          lpdwBufferLength,
-        LPWSAQUERYSETA   lpqsResults
-    );
-__declspec(dllimport)
-INT
- __stdcall
-WSALookupServiceNextW(
-         HANDLE           hLookup,
-         DWORD            dwControlFlags,
-      LPDWORD          lpdwBufferLength,
-        LPWSAQUERYSETW   lpqsResults
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-INT
- __stdcall
-WSANSPIoctl(
-      HANDLE           hLookup,
-      DWORD            dwControlCode,
-      LPVOID           lpvInBuffer,
-      DWORD            cbInBuffer,
-     LPVOID           lpvOutBuffer,
-      DWORD            cbOutBuffer,
-     LPDWORD          lpcbBytesReturned,
-      LPWSACOMPLETION  lpCompletion
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-INT
- __stdcall
-WSALookupServiceEnd(
-     HANDLE  hLookup
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-INT
- __stdcall
-WSAInstallServiceClassA(
-      LPWSASERVICECLASSINFOA   lpServiceClassInfo
-    );
-__declspec(dllimport)
-INT
- __stdcall
-WSAInstallServiceClassW(
-      LPWSASERVICECLASSINFOW   lpServiceClassInfo
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-INT
- __stdcall
-WSARemoveServiceClass(
-      LPGUID  lpServiceClassId
-    );
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-INT
- __stdcall
-WSAGetServiceClassInfoA(
-      LPGUID  lpProviderId,
-      LPGUID  lpServiceClassId,
-      LPDWORD  lpdwBufSize,
-     LPWSASERVICECLASSINFOA lpServiceClassInfo
-    );
-__declspec(dllimport)
-INT
- __stdcall
-WSAGetServiceClassInfoW(
-      LPGUID  lpProviderId,
-      LPGUID  lpServiceClassId,
-      LPDWORD  lpdwBufSize,
-     LPWSASERVICECLASSINFOW lpServiceClassInfo
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-INT
- __stdcall
-WSAEnumNameSpaceProvidersA(
-      LPDWORD              lpdwBufferLength,
-        LPWSANAMESPACE_INFOA lpnspBuffer
-    );
-__declspec(dllimport)
-INT
- __stdcall
-WSAEnumNameSpaceProvidersW(
-      LPDWORD              lpdwBufferLength,
-        LPWSANAMESPACE_INFOW lpnspBuffer
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-INT
- __stdcall
-WSAGetServiceClassNameByClassIdA(
-          LPGUID  lpServiceClassId,
-         LPSTR lpszServiceClassName,
-       LPDWORD lpdwBufferLength
-    );
-__declspec(dllimport)
-INT
- __stdcall
-WSAGetServiceClassNameByClassIdW(
-          LPGUID  lpServiceClassId,
-         LPWSTR lpszServiceClassName,
-       LPDWORD lpdwBufferLength
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-INT
- __stdcall
-WSASetServiceA(
-     LPWSAQUERYSETA lpqsRegInfo,
-     WSAESETSERVICEOP essoperation,
-     DWORD dwControlFlags
-    );
-__declspec(dllimport)
-INT
- __stdcall
-WSASetServiceW(
-     LPWSAQUERYSETW lpqsRegInfo,
-     WSAESETSERVICEOP essoperation,
-     DWORD dwControlFlags
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)
-INT
- __stdcall
-WSAProviderConfigChange(
-      LPHANDLE lpNotificationHandle,
-     LPWSAOVERLAPPED lpOverlapped,
-     LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
-    );
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct sockaddr_in SOCKADDR_IN;
-typedef struct sockaddr_in *PSOCKADDR_IN;
-typedef struct sockaddr_in  *LPSOCKADDR_IN;
-
-typedef struct linger LINGER;
-typedef struct linger *PLINGER;
-typedef struct linger  *LPLINGER;
-
-typedef struct in_addr IN_ADDR;
-typedef struct in_addr *PIN_ADDR;
-typedef struct in_addr  *LPIN_ADDR;
-
-typedef struct fd_set FD_SET;
-typedef struct fd_set *PFD_SET;
-typedef struct fd_set  *LPFD_SET;
-
-typedef struct hostent HOSTENT;
-typedef struct hostent *PHOSTENT;
-typedef struct hostent  *LPHOSTENT;
-
-typedef struct servent SERVENT;
-typedef struct servent *PSERVENT;
-typedef struct servent  *LPSERVENT;
-
-typedef struct protoent PROTOENT;
-typedef struct protoent *PPROTOENT;
-typedef struct protoent  *LPPROTOENT;
-
-typedef struct timeval TIMEVAL;
-typedef struct timeval *PTIMEVAL;
-typedef struct timeval  *LPTIMEVAL;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-#pragma warning(disable: 4786) 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4514)       
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-#pragma deprecated("_ftcscat")
-#pragma deprecated("_ftcschr")
-#pragma deprecated("_ftcscpy")
-#pragma deprecated("_ftcscspn")
-#pragma deprecated("_ftcslen")
-#pragma deprecated("_ftcsncat")
-#pragma deprecated("_ftcsncpy")
-#pragma deprecated("_ftcspbrk")
-#pragma deprecated("_ftcsrchr")
-#pragma deprecated("_ftcsspn")
-#pragma deprecated("_ftcsstr")
-#pragma deprecated("_ftcstok")
-#pragma deprecated("_ftcsdup")
-#pragma deprecated("_ftcsnset")
-#pragma deprecated("_ftcsrev")
-#pragma deprecated("_ftcsset")
-#pragma deprecated("_ftcscmp")
-#pragma deprecated("_ftcsicmp")
-#pragma deprecated("_ftcsnccmp")
-#pragma deprecated("_ftcsncmp")
-#pragma deprecated("_ftcsncicmp")
-#pragma deprecated("_ftcsnicmp")
-#pragma deprecated("_ftcscoll")
-#pragma deprecated("_ftcsicoll")
-#pragma deprecated("_ftcsnccoll")
-#pragma deprecated("_ftcsncoll")
-#pragma deprecated("_ftcsncicoll")
-#pragma deprecated("_ftcsnicoll")
-#pragma deprecated("_ftcsclen")
-#pragma deprecated("_ftcsnccat")
-#pragma deprecated("_ftcsnccpy")
-#pragma deprecated("_ftcsncset")
-#pragma deprecated("_ftcsdec")
-#pragma deprecated("_ftcsinc")
-#pragma deprecated("_ftcsnbcnt")
-#pragma deprecated("_ftcsnccnt")
-#pragma deprecated("_ftcsnextc")
-#pragma deprecated("_ftcsninc")
-#pragma deprecated("_ftcsspnp")
-#pragma deprecated("_ftcslwr")
-#pragma deprecated("_ftcsupr")
-#pragma deprecated("_ftclen")
-#pragma deprecated("_ftccpy")
-#pragma deprecated("_ftccmp")
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}   
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma pack(push,8)
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct _iobuf {
-        char *_ptr;
-        int   _cnt;
-        char *_base;
-        int   _flag;
-        int   _file;
-        int   _charbuf;
-        int   _bufsiz;
-        char *_tmpfname;
-        };
-typedef struct _iobuf FILE;
-
-
-
-
-
-
-__declspec(dllimport) FILE * __cdecl __iob_func(void);
-
-
-
-
-
-
-
-
-
-
-typedef unsigned long _fsize_t; 
-
-
-
-
-
-struct _wfinddata32_t {
-        unsigned    attrib;
-        __time32_t  time_create;    
-        __time32_t  time_access;    
-        __time32_t  time_write;
-        _fsize_t    size;
-        wchar_t     name[260];
-};
-
-
-
-struct _wfinddata32i64_t {
-        unsigned    attrib;
-        __time32_t  time_create;    
-        __time32_t  time_access;    
-        __time32_t  time_write;
-        __int64     size;
-        wchar_t     name[260];
-};
-
-struct _wfinddata64i32_t {
-        unsigned    attrib;
-        __time64_t  time_create;    
-        __time64_t  time_access;    
-        __time64_t  time_write;
-        _fsize_t    size;
-        wchar_t     name[260];
-};
-
-struct _wfinddata64_t {
-        unsigned    attrib;
-        __time64_t  time_create;    
-        __time64_t  time_access;    
-        __time64_t  time_write;
-        __int64     size;
-        wchar_t     name[260];
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)         wchar_t * __cdecl _wgetcwd(       wchar_t * _DstBuf,      int _SizeInWords);
-__declspec(dllimport)         wchar_t * __cdecl _wgetdcwd(     int _Drive,        wchar_t * _DstBuf,      int _SizeInWords);
-        wchar_t * __cdecl _wgetdcwd_nolock(     int _Drive,        wchar_t * _DstBuf,      int _SizeInWords);
-
-
-
-
-
-
-
-__declspec(dllimport)  int __cdecl _wchdir(       const wchar_t * _Path);
-__declspec(dllimport)  int __cdecl _wmkdir(       const wchar_t * _Path);
-__declspec(dllimport)  int __cdecl _wrmdir(       const wchar_t * _Path);
-
-
-
-
-
-
-__declspec(dllimport)  int __cdecl _waccess(       const wchar_t * _Filename,      int _AccessMode);
-__declspec(dllimport)  errno_t __cdecl _waccess_s(       const wchar_t * _Filename,      int _AccessMode);
-__declspec(dllimport)  int __cdecl _wchmod(       const wchar_t * _Filename,      int _Mode);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wsopen_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _wcreat(       const wchar_t * _Filename,      int _PermissionMode);
-__declspec(dllimport)  intptr_t __cdecl _wfindfirst32(       const wchar_t * _Filename,      struct _wfinddata32_t * _FindData);
-__declspec(dllimport)  int __cdecl _wfindnext32(     intptr_t _FindHandle,      struct _wfinddata32_t * _FindData);
-__declspec(dllimport)  int __cdecl _wunlink(       const wchar_t * _Filename);
-__declspec(dllimport)  int __cdecl _wrename(       const wchar_t * _NewFilename,        const wchar_t * _OldFilename);
-__declspec(dllimport) errno_t __cdecl _wmktemp_s(           wchar_t * _TemplateName,      size_t _SizeInWords);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wmktemp_s(       wchar_t (&_TemplateName)[_Size]) { return _wmktemp_s(_TemplateName, _Size); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wmktemp_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wmktemp( wchar_t *_TemplateName);
-
-
-__declspec(dllimport)  intptr_t __cdecl _wfindfirst32i64(       const wchar_t * _Filename,      struct _wfinddata32i64_t * _FindData);
-__declspec(dllimport)  intptr_t __cdecl _wfindfirst64i32(       const wchar_t * _Filename,      struct _wfinddata64i32_t * _FindData);
-__declspec(dllimport)  intptr_t __cdecl _wfindfirst64(       const wchar_t * _Filename,      struct _wfinddata64_t * _FindData);
-__declspec(dllimport)  int __cdecl _wfindnext32i64(     intptr_t _FindHandle,      struct _wfinddata32i64_t * _FindData);
-__declspec(dllimport)  int __cdecl _wfindnext64i32(     intptr_t _FindHandle,      struct _wfinddata64i32_t * _FindData);
-__declspec(dllimport)  int __cdecl _wfindnext64(     intptr_t _FindHandle,      struct _wfinddata64_t * _FindData);
-
-
-__declspec(dllimport)  errno_t __cdecl _wsopen_s(     int * _FileHandle,        const wchar_t * _Filename,      int _OpenFlag,      int _ShareFlag,      int _PermissionFlag);
-
-
-
-
-
-
-
-
-
-extern "C++" __declspec(deprecated("This function or variable may be unsafe. Consider using " "_wsopen_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) int __cdecl _wopen(       const wchar_t * _Filename,      int _OpenFlag,      int _PermissionMode = 0);
-extern "C++" __declspec(deprecated("This function or variable may be unsafe. Consider using " "_wsopen_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) int __cdecl _wsopen(       const wchar_t * _Filename,      int _OpenFlag,      int _ShareFlag, int _PermissionMode = 0);
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)  wchar_t * __cdecl _wsetlocale(     int _Category,          const wchar_t * _Locale);
-
-
-
-
-
-
-
-
-__declspec(dllimport) intptr_t __cdecl _wexecl(       const wchar_t * _Filename,        const wchar_t * _ArgList, ...);
-__declspec(dllimport) intptr_t __cdecl _wexecle(       const wchar_t * _Filename,        const wchar_t * _ArgList, ...);
-__declspec(dllimport) intptr_t __cdecl _wexeclp(       const wchar_t * _Filename,        const wchar_t * _ArgList, ...);
-__declspec(dllimport) intptr_t __cdecl _wexeclpe(       const wchar_t * _Filename,        const wchar_t * _ArgList, ...);
-__declspec(dllimport) intptr_t __cdecl _wexecv(       const wchar_t * _Filename,        const wchar_t * const * _ArgList);
-__declspec(dllimport) intptr_t __cdecl _wexecve(       const wchar_t * _Filename,        const wchar_t * const * _ArgList,
-                 const wchar_t * const * _Env);
-__declspec(dllimport) intptr_t __cdecl _wexecvp(       const wchar_t * _Filename,        const wchar_t * const * _ArgList);
-__declspec(dllimport) intptr_t __cdecl _wexecvpe(       const wchar_t * _Filename,        const wchar_t * const * _ArgList, 
-                 const wchar_t * const * _Env);
-__declspec(dllimport) intptr_t __cdecl _wspawnl(     int _Mode,        const wchar_t * _Filename,        const wchar_t * _ArgList, ...);
-__declspec(dllimport) intptr_t __cdecl _wspawnle(     int _Mode,        const wchar_t * _Filename,        const wchar_t * _ArgList, ...);
-__declspec(dllimport) intptr_t __cdecl _wspawnlp(     int _Mode,        const wchar_t * _Filename,        const wchar_t * _ArgList, ...);
-__declspec(dllimport) intptr_t __cdecl _wspawnlpe(     int _Mode,        const wchar_t * _Filename,        const wchar_t * _ArgList, ...);
-__declspec(dllimport) intptr_t __cdecl _wspawnv(     int _Mode,        const wchar_t * _Filename,        const wchar_t * const * _ArgList);
-__declspec(dllimport) intptr_t __cdecl _wspawnve(     int _Mode,        const wchar_t * _Filename,        const wchar_t * const * _ArgList,
-                 const wchar_t * const * _Env);
-__declspec(dllimport) intptr_t __cdecl _wspawnvp(     int _Mode,        const wchar_t * _Filename,        const wchar_t * const * _ArgList);
-__declspec(dllimport) intptr_t __cdecl _wspawnvpe(     int _Mode,        const wchar_t * _Filename,        const wchar_t * const * _ArgList,
-                 const wchar_t * const * _Env);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef unsigned short _ino_t;      
-
-
-typedef unsigned short ino_t;
-
-
-
-
-
-typedef unsigned int _dev_t;        
-
-
-typedef unsigned int dev_t;
-
-
-
-
-
-typedef long _off_t;                
-
-
-typedef long off_t;
-
-
-
-
-
-
-struct _stat32 {
-        _dev_t     st_dev;
-        _ino_t     st_ino;
-        unsigned short st_mode;
-        short      st_nlink;
-        short      st_uid;
-        short      st_gid;
-        _dev_t     st_rdev;
-        _off_t     st_size;
-        __time32_t st_atime;
-        __time32_t st_mtime;
-        __time32_t st_ctime;
-        };
-
-
-
-struct stat {
-        _dev_t     st_dev;
-        _ino_t     st_ino;
-        unsigned short st_mode;
-        short      st_nlink;
-        short      st_uid;
-        short      st_gid;
-        _dev_t     st_rdev;
-        _off_t     st_size;
-        time_t st_atime;
-        time_t st_mtime;
-        time_t st_ctime;
-        };
-
-
-
-
-
-struct _stat32i64 {
-        _dev_t     st_dev;
-        _ino_t     st_ino;
-        unsigned short st_mode;
-        short      st_nlink;
-        short      st_uid;
-        short      st_gid;
-        _dev_t     st_rdev;
-        __int64    st_size;
-        __time32_t st_atime;
-        __time32_t st_mtime;
-        __time32_t st_ctime;
-        };
-
-struct _stat64i32 {
-        _dev_t     st_dev;
-        _ino_t     st_ino;
-        unsigned short st_mode;
-        short      st_nlink;
-        short      st_uid;
-        short      st_gid;
-        _dev_t     st_rdev;
-        _off_t     st_size;
-        __time64_t st_atime;
-        __time64_t st_mtime;
-        __time64_t st_ctime;
-        };
-
-struct _stat64 {
-        _dev_t     st_dev;
-        _ino_t     st_ino;
-        unsigned short st_mode;
-        short      st_nlink;
-        short      st_uid;
-        short      st_gid;
-        _dev_t     st_rdev;
-        __int64    st_size;
-        __time64_t st_atime;
-        __time64_t st_mtime;
-        __time64_t st_ctime;
-        };
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) int __cdecl _wstat32(       const wchar_t * _Name,      struct _stat32 * _Stat);
-
-
-__declspec(dllimport) int __cdecl _wstat32i64(       const wchar_t * _Name,      struct _stat32i64 * _Stat);
-__declspec(dllimport) int __cdecl _wstat64i32(       const wchar_t * _Name,      struct _stat64i32 * _Stat);
-__declspec(dllimport) int __cdecl _wstat64(       const wchar_t * _Name,      struct _stat64 * _Stat);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)  errno_t __cdecl _cgetws_s(       wchar_t * _Buffer, size_t _SizeInWords,      size_t * _SizeRead);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _cgetws_s(       wchar_t (&_Buffer)[_Size], size_t * _Size) { return _cgetws_s(_Buffer, _Size, _Size); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_cgetws_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _cgetws(         wchar_t *_Buffer);
-__declspec(dllimport)  wint_t __cdecl _getwch(void);
-__declspec(dllimport)  wint_t __cdecl _getwche(void);
-__declspec(dllimport)  wint_t __cdecl _putwch(wchar_t _WCh);
-__declspec(dllimport)  wint_t __cdecl _ungetwch(wint_t _WCh);
-__declspec(dllimport)  int __cdecl _cputws(       const wchar_t * _String);
-__declspec(dllimport)  int __cdecl _cwprintf(        const wchar_t * _Format, ...);
-__declspec(dllimport)  int __cdecl _cwprintf_s(        const wchar_t * _Format, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_cwscanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _cwscanf(        const wchar_t * _Format, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_cwscanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _cwscanf_l(        const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _cwscanf_s(        const wchar_t * _Format, ...);
-__declspec(dllimport)  int __cdecl _cwscanf_s_l(        const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _vcwprintf(        const wchar_t *_Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vcwprintf_s(        const wchar_t *_Format, va_list _ArgList);
-
-__declspec(dllimport)  int __cdecl _cwprintf_p(        const wchar_t * _Format, ...);
-__declspec(dllimport)  int __cdecl _vcwprintf_p(        const wchar_t*  _Format, va_list _ArgList);
-
-__declspec(dllimport) int __cdecl _cwprintf_l(       const  wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport) int __cdecl _cwprintf_s_l(        const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport) int __cdecl _vcwprintf_l(        const wchar_t *_Format,        _locale_t _Locale, va_list _ArgList);
-__declspec(dllimport) int __cdecl _vcwprintf_s_l(        const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
-__declspec(dllimport) int __cdecl _cwprintf_p_l(        const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport) int __cdecl _vcwprintf_p_l(        const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
-
- wint_t __cdecl _putwch_nolock(wchar_t _WCh);
- wint_t __cdecl _getwch_nolock(void);
- wint_t __cdecl _getwche_nolock(void);
- wint_t __cdecl _ungetwch_nolock(wint_t _WCh);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)  FILE * __cdecl _wfsopen(       const wchar_t * _Filename,        const wchar_t * _Mode,      int _ShFlag);
-
-
-__declspec(dllimport)  wint_t __cdecl fgetwc(     FILE * _File);
-__declspec(dllimport)  wint_t __cdecl _fgetwchar(void);
-__declspec(dllimport)  wint_t __cdecl fputwc(       wchar_t _Ch,      FILE * _File);
-__declspec(dllimport)  wint_t __cdecl _fputwchar(       wchar_t _Ch);
-__declspec(dllimport)  wint_t __cdecl getwc(     FILE * _File);
-__declspec(dllimport)  wint_t __cdecl getwchar(void);
-__declspec(dllimport)  wint_t __cdecl putwc(       wchar_t _Ch,      FILE * _File);
-__declspec(dllimport)  wint_t __cdecl putwchar(       wchar_t _Ch);
-__declspec(dllimport)  wint_t __cdecl ungetwc(     wint_t _Ch,      FILE * _File);
-
-__declspec(dllimport)  wchar_t * __cdecl fgetws(       wchar_t * _Dst,      int _SizeInWords,      FILE * _File);
-__declspec(dllimport)  int __cdecl fputws(       const wchar_t * _Str,      FILE * _File);
-__declspec(dllimport)  wchar_t * __cdecl _getws_s(       wchar_t * _Str,      size_t _SizeInWords);
-extern "C++" { template <size_t _Size> inline wchar_t * __cdecl _getws_s(     wchar_t (&_String)[_Size]) { return _getws_s(_String, _Size); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_getws_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _getws( wchar_t *_String);
-__declspec(dllimport)  int __cdecl _putws(       const wchar_t * _Str);
-
-__declspec(dllimport)  int __cdecl fwprintf(     FILE * _File,         const wchar_t * _Format, ...);
-__declspec(dllimport)  int __cdecl fwprintf_s(     FILE * _File,         const wchar_t * _Format, ...);
-__declspec(dllimport)  int __cdecl wprintf(        const wchar_t * _Format, ...);
-__declspec(dllimport)  int __cdecl wprintf_s(        const wchar_t * _Format, ...);
-__declspec(dllimport)  int __cdecl _scwprintf(        const wchar_t * _Format, ...);
-__declspec(dllimport)  int __cdecl vfwprintf(     FILE * _File,         const wchar_t * _Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl vfwprintf_s(     FILE * _File,         const wchar_t * _Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl vwprintf(        const wchar_t * _Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl vwprintf_s(        const wchar_t * _Format, va_list _ArgList);
-
-__declspec(dllimport) int __cdecl swprintf_s(       wchar_t * _Dst,      size_t _SizeInWords,         const wchar_t * _Format, ...);
-extern "C++" { __pragma(warning(push)); __pragma(warning(disable: 4793)); template <size_t _Size> inline int __cdecl swprintf_s(     wchar_t (&_Dest)[_Size],         const wchar_t * _Format, ...) { va_list _ArgList; ( _ArgList = (va_list)( &reinterpret_cast<const char &>(_Format) ) + ( (sizeof(_Format) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) ); return vswprintf_s(_Dest, _Size, _Format, _ArgList); } __pragma(warning(pop)); }
-__declspec(dllimport) int __cdecl vswprintf_s(       wchar_t * _Dst,      size_t _SizeInWords,         const wchar_t * _Format, va_list _ArgList);
-extern "C++" { template <size_t _Size> inline int __cdecl vswprintf_s(     wchar_t (&_Dest)[_Size],         const wchar_t * _Format, va_list _Args) { return vswprintf_s(_Dest, _Size, _Format, _Args); } }
-
-__declspec(dllimport)  int __cdecl _swprintf_c(       wchar_t * _DstBuf,      size_t _SizeInWords,         const wchar_t * _Format, ...);
-__declspec(dllimport)  int __cdecl _vswprintf_c(       wchar_t * _DstBuf,      size_t _SizeInWords,         const wchar_t * _Format, va_list _ArgList);
-
-__declspec(dllimport)  int __cdecl _snwprintf_s(       wchar_t * _DstBuf,      size_t _DstSizeInWords,      size_t _MaxCount,         const wchar_t * _Format, ...);
-extern "C++" { __pragma(warning(push)); __pragma(warning(disable: 4793)); template <size_t _Size> inline int __cdecl _snwprintf_s(     wchar_t (&_Dest)[_Size],      size_t _Count,         const wchar_t * _Format, ...) { va_list _ArgList; ( _ArgList = (va_list)( &reinterpret_cast<const char &>(_Format) ) + ( (sizeof(_Format) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) ); return _vsnwprintf_s(_Dest, _Size, _Count, _Format, _ArgList); } __pragma(warning(pop)); }
-__declspec(dllimport)  int __cdecl _vsnwprintf_s(       wchar_t * _DstBuf,      size_t _DstSizeInWords,      size_t _MaxCount,         const wchar_t * _Format, va_list _ArgList);
-extern "C++" { template <size_t _Size> inline int __cdecl _vsnwprintf_s(     wchar_t (&_Dest)[_Size],      size_t _Count,         const wchar_t * _Format, va_list _Args) { return _vsnwprintf_s(_Dest, _Size, _Count, _Format, _Args); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_snwprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) int __cdecl _snwprintf(     wchar_t *_Dest,      size_t _Count,         const wchar_t * _Format, ...); __declspec(deprecated("This function or variable may be unsafe. Consider using " "_vsnwprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) int __cdecl _vsnwprintf(     wchar_t *_Dest,      size_t _Count,         const wchar_t * _Format, va_list _Args);
-
-__declspec(dllimport)  int __cdecl _fwprintf_p(     FILE * _File,         const wchar_t * _Format, ...);
-__declspec(dllimport)  int __cdecl _wprintf_p(        const wchar_t * _Format, ...);
-__declspec(dllimport)  int __cdecl _vfwprintf_p(     FILE * _File,         const wchar_t * _Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vwprintf_p(        const wchar_t * _Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _swprintf_p(       wchar_t * _DstBuf,      size_t _MaxCount,         const wchar_t * _Format, ...);
-__declspec(dllimport)  int __cdecl _vswprintf_p(       wchar_t * _DstBuf,      size_t _MaxCount,         const wchar_t * _Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _scwprintf_p(        const wchar_t * _Format, ...);
-__declspec(dllimport)  int __cdecl _vscwprintf_p(        const wchar_t * _Format, va_list _ArgList);
-
-__declspec(dllimport)  int __cdecl _wprintf_l(        const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _wprintf_p_l(        const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _wprintf_s_l(        const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _vwprintf_l(        const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vwprintf_p_l(        const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vwprintf_s_l(        const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
-
-__declspec(dllimport)  int __cdecl _fwprintf_l(     FILE * _File,         const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _fwprintf_p_l(     FILE * _File,         const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _fwprintf_s_l(     FILE * _File,         const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _vfwprintf_l(     FILE * _File,         const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vfwprintf_p_l(     FILE * _File,         const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vfwprintf_s_l(     FILE * _File,         const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
-
-__declspec(dllimport)  int __cdecl _swprintf_c_l(       wchar_t * _DstBuf,      size_t _MaxCount,         const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _swprintf_p_l(       wchar_t * _DstBuf,      size_t _MaxCount,         const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _swprintf_s_l(       wchar_t * _DstBuf,      size_t _DstSize,         const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _vswprintf_c_l(       wchar_t * _DstBuf,      size_t _MaxCount,         const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vswprintf_p_l(       wchar_t * _DstBuf,      size_t _MaxCount,         const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vswprintf_s_l(       wchar_t * _DstBuf,      size_t _DstSize,         const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
-
-__declspec(dllimport)  int __cdecl _scwprintf_l(        const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _scwprintf_p_l(        const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _vscwprintf_p_l(        const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
-
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_snwprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _snwprintf_l(     wchar_t * _DstBuf,      size_t _MaxCount,         const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _snwprintf_s_l(       wchar_t * _DstBuf,      size_t _DstSize,      size_t _MaxCount,         const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_vsnwprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _vsnwprintf_l(     wchar_t * _DstBuf,      size_t _MaxCount,         const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vsnwprintf_s_l(       wchar_t * _DstBuf,      size_t _DstSize,      size_t _MaxCount,         const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(push)
-#pragma warning(disable:4141 4996)
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_swprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.")) __declspec(dllimport) int __cdecl _swprintf(     wchar_t *_Dest,         const wchar_t * _Format, ...); __declspec(deprecated("This function or variable may be unsafe. Consider using " "vswprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.")) __declspec(dllimport) int __cdecl _vswprintf(     wchar_t *_Dest,         const wchar_t * _Format, va_list _Args);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "__swprintf_l_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.")) __declspec(dllimport) int __cdecl __swprintf_l(     wchar_t *_Dest,         const wchar_t * _Format, _locale_t _Plocinfo, ...); __declspec(deprecated("This function or variable may be unsafe. Consider using " "_vswprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.")) __declspec(dllimport) int __cdecl __vswprintf_l(     wchar_t *_Dest,         const wchar_t * _Format, _locale_t _Plocinfo, va_list _Args);
-#pragma warning(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning( push )
-#pragma warning( disable : 4793 4412 )
-static __inline int swprintf(wchar_t * _String, size_t _Count, const wchar_t * _Format, ...)
-{
-    va_list _Arglist;
-    int _Ret;
-    ( _Arglist = (va_list)( &reinterpret_cast<const char &>(_Format) ) + ( (sizeof(_Format) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
-    _Ret = _vswprintf_c_l(_String, _Count, _Format, 0, _Arglist);
-    ( _Arglist = (va_list)0 );
-    return _Ret;
-}
-#pragma warning( pop )
-
-#pragma warning( push )
-#pragma warning( disable : 4412 )
-static __inline int __cdecl vswprintf(wchar_t * _String, size_t _Count, const wchar_t * _Format, va_list _Ap)
-{
-    return _vswprintf_c_l(_String, _Count, _Format, 0, _Ap);
-}
-#pragma warning( pop )
-
-
-
-
-#pragma warning( push )
-#pragma warning( disable : 4793 4412 )
-static __inline int _swprintf_l(wchar_t * _String, size_t _Count, const wchar_t * _Format, _locale_t _Plocinfo, ...)
-{
-    va_list _Arglist;
-    int _Ret;
-    ( _Arglist = (va_list)( &reinterpret_cast<const char &>(_Plocinfo) ) + ( (sizeof(_Plocinfo) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
-    _Ret = _vswprintf_c_l(_String, _Count, _Format, _Plocinfo, _Arglist);
-    ( _Arglist = (va_list)0 );
-    return _Ret;
-}
-#pragma warning( pop )
-
-#pragma warning( push )
-#pragma warning( disable : 4412 )
-static __inline int __cdecl _vswprintf_l(wchar_t * _String, size_t _Count, const wchar_t * _Format, _locale_t _Plocinfo, va_list _Ap)
-{
-    return _vswprintf_c_l(_String, _Count, _Format, _Plocinfo, _Ap);
-}
-#pragma warning( pop )
-
-
-#pragma warning( push )
-#pragma warning( disable : 4996 )
-
-#pragma warning( push )
-#pragma warning( disable : 4793 4141 )
-extern "C++" __declspec(deprecated("swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "swprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __inline int swprintf(     wchar_t * _String,         const wchar_t * _Format, ...)
-{
-    va_list _Arglist;
-    ( _Arglist = (va_list)( &reinterpret_cast<const char &>(_Format) ) + ( (sizeof(_Format) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
-    int _Ret = _vswprintf(_String, _Format, _Arglist);
-    ( _Arglist = (va_list)0 );
-    return _Ret;
-}
-#pragma warning( pop )
-
-#pragma warning( push )
-#pragma warning( disable : 4141 )
-extern "C++" __declspec(deprecated("swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "vswprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __inline int __cdecl vswprintf(     wchar_t * _String,         const wchar_t * _Format, va_list _Ap)
-{
-    return _vswprintf(_String, _Format, _Ap);
-}
-#pragma warning( pop )
-
-#pragma warning( push )
-#pragma warning( disable : 4793 4141 )
-extern "C++" __declspec(deprecated("swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_swprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __inline int _swprintf_l(     wchar_t * _String,         const wchar_t * _Format, _locale_t _Plocinfo, ...)
-{
-    va_list _Arglist;
-    ( _Arglist = (va_list)( &reinterpret_cast<const char &>(_Plocinfo) ) + ( (sizeof(_Plocinfo) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
-    int _Ret = __vswprintf_l(_String, _Format, _Plocinfo, _Arglist);
-    ( _Arglist = (va_list)0 );
-    return _Ret;
-}
-#pragma warning( pop )
-
-#pragma warning( push )
-#pragma warning( disable : 4141 )
-extern "C++" __declspec(deprecated("swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_vswprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __inline int __cdecl _vswprintf_l(     wchar_t * _String,         const wchar_t * _Format, _locale_t _Plocinfo, va_list _Ap)
-{
-    return __vswprintf_l(_String, _Format, _Plocinfo, _Ap);
-}
-#pragma warning( pop )
-
-#pragma warning( pop )
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)  wchar_t * __cdecl _wtempnam(         const wchar_t * _Directory,          const wchar_t * _FilePrefix);
-
-
-
-
-
-__declspec(dllimport)  int __cdecl _vscwprintf(        const wchar_t * _Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vscwprintf_l(        const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "fwscanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl fwscanf(     FILE * _File,         const wchar_t * _Format, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_fwscanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _fwscanf_l(     FILE * _File,         const wchar_t * _Format,        _locale_t _Locale, ...);
-
-__declspec(dllimport)  int __cdecl fwscanf_s(     FILE * _File,         const wchar_t * _Format, ...);
-
-__declspec(dllimport)  int __cdecl _fwscanf_s_l(     FILE * _File,         const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "swscanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl swscanf(       const wchar_t * _Src,         const wchar_t * _Format, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_swscanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _swscanf_l(       const wchar_t * _Src,         const wchar_t * _Format,        _locale_t _Locale, ...);
-
-__declspec(dllimport)  int __cdecl swscanf_s(       const wchar_t *_Src,         const wchar_t * _Format, ...);
-
-__declspec(dllimport)  int __cdecl _swscanf_s_l(       const wchar_t * _Src,         const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_snwscanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _snwscanf(         const wchar_t * _Src,      size_t _MaxCount,         const wchar_t * _Format, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_snwscanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _snwscanf_l(         const wchar_t * _Src,      size_t _MaxCount,         const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _snwscanf_s(         const wchar_t * _Src,      size_t _MaxCount,         const wchar_t * _Format, ...);
-__declspec(dllimport)  int __cdecl _snwscanf_s_l(         const wchar_t * _Src,      size_t _MaxCount,         const wchar_t * _Format,        _locale_t _Locale, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "wscanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl wscanf(        const wchar_t * _Format, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wscanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _wscanf_l(        const wchar_t * _Format,        _locale_t _Locale, ...);
-
-__declspec(dllimport)  int __cdecl wscanf_s(        const wchar_t * _Format, ...);
-
-__declspec(dllimport)  int __cdecl _wscanf_s_l(        const wchar_t * _Format,        _locale_t _Locale, ...);
-
-__declspec(dllimport)  FILE * __cdecl _wfdopen(     int _FileHandle ,        const wchar_t * _Mode);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wfopen_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  FILE * __cdecl _wfopen(       const wchar_t * _Filename,        const wchar_t * _Mode);
-__declspec(dllimport)  errno_t __cdecl _wfopen_s(                  FILE ** _File,        const wchar_t * _Filename,        const wchar_t * _Mode);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wfreopen_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  FILE * __cdecl _wfreopen(       const wchar_t * _Filename,        const wchar_t * _Mode,      FILE * _OldFile);
-__declspec(dllimport)  errno_t __cdecl _wfreopen_s(                  FILE ** _File,        const wchar_t * _Filename,        const wchar_t * _Mode,      FILE * _OldFile);
-
-
-
-
-
-__declspec(dllimport)  FILE * __cdecl _wpopen(       const wchar_t *_Command,        const wchar_t * _Mode);
-__declspec(dllimport)  int __cdecl _wremove(       const wchar_t * _Filename);
-__declspec(dllimport)  errno_t __cdecl _wtmpnam_s(       wchar_t * _DstBuf,      size_t _SizeInWords);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wtmpnam_s(       wchar_t (&_Buffer)[_Size]) { return _wtmpnam_s(_Buffer, _Size); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wtmpnam_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wtmpnam( wchar_t *_Buffer);
-
-__declspec(dllimport)  wint_t __cdecl _fgetwc_nolock(     FILE * _File);
-__declspec(dllimport)  wint_t __cdecl _fputwc_nolock(       wchar_t _Ch,      FILE * _File);
-__declspec(dllimport)  wint_t __cdecl _ungetwc_nolock(     wint_t _Ch,      FILE * _File);
-
-
-
-
-
-
-
-inline wint_t __cdecl getwchar()
-        {return (fgetwc((&__iob_func()[0]))); }   
-inline wint_t __cdecl putwchar(wchar_t _C)
-        {return (fputwc(_C, (&__iob_func()[1]))); }       
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct tm {
-        int tm_sec;     
-        int tm_min;     
-        int tm_hour;    
-        int tm_mday;    
-        int tm_mon;     
-        int tm_year;    
-        int tm_wday;    
-        int tm_yday;    
-        int tm_isdst;   
-        };
-
-
-
-
-
-
- 
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wasctime_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wasctime(     const struct tm * _Tm);
-__declspec(dllimport) errno_t __cdecl _wasctime_s(       wchar_t *_Buf,      size_t _SizeInWords,      const struct tm * _Tm);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wasctime_s(       wchar_t (&_Buffer)[_Size],      const struct tm * _Time) { return _wasctime_s(_Buffer, _Size, _Time); } }
-
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wctime32_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wctime32(     const __time32_t *_Time);
-__declspec(dllimport) errno_t __cdecl _wctime32_s(       wchar_t* _Buf,      size_t _SizeInWords,      const __time32_t * _Time);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wctime32_s(       wchar_t (&_Buffer)[_Size],      const __time32_t * _Time) { return _wctime32_s(_Buffer, _Size, _Time); } }
-
-__declspec(dllimport) size_t __cdecl wcsftime(       wchar_t * _Buf,      size_t _SizeInWords,         const wchar_t * _Format,       const struct tm * _Tm);
-__declspec(dllimport) size_t __cdecl _wcsftime_l(       wchar_t * _Buf,      size_t _SizeInWords,         const wchar_t *_Format,      const struct tm *_Tm,        _locale_t _Locale);
-
-__declspec(dllimport) errno_t __cdecl _wstrdate_s(       wchar_t * _Buf,      size_t _SizeInWords);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wstrdate_s(       wchar_t (&_Buffer)[_Size]) { return _wstrdate_s(_Buffer, _Size); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wstrdate_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wstrdate( wchar_t *_Buffer);
-
-__declspec(dllimport) errno_t __cdecl _wstrtime_s(       wchar_t * _Buf,      size_t _SizeInWords);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wstrtime_s(       wchar_t (&_Buffer)[_Size]) { return _wstrtime_s(_Buffer, _Size); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wstrtime_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wstrtime( wchar_t *_Buffer);
-
-
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wctime64_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wctime64(     const __time64_t * _Time);
-__declspec(dllimport) errno_t __cdecl _wctime64_s(       wchar_t* _Buf,      size_t _SizeInWords,      const __time64_t *_Time);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wctime64_s(       wchar_t (&_Buffer)[_Size],      const __time64_t * _Time) { return _wctime64_s(_Buffer, _Size, _Time); } }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(push)
-#pragma warning(disable:4996)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-static __inline wchar_t * __cdecl _wctime(const time_t * _Time)
-{
-#pragma warning( push )
-#pragma warning( disable : 4996 )
-    return _wctime64(_Time);
-#pragma warning( pop )
-}
-
-static __inline errno_t __cdecl _wctime_s(wchar_t *_Buffer, size_t _SizeInWords, const time_t * _Time)
-{
-    return _wctime64_s(_Buffer, _SizeInWords, _Time);
-}
-
-
-#pragma warning(pop)
-
-
-
-
-
-
-
-
-
-
-typedef int mbstate_t;
-typedef wchar_t _Wint_t;
-
-__declspec(dllimport) wint_t __cdecl btowc(int);
-__declspec(dllimport) size_t __cdecl mbrlen(           const char * _Ch,      size_t _SizeInBytes,
-                                     mbstate_t * _State);
-__declspec(dllimport) size_t __cdecl mbrtowc(       wchar_t * _DstCh,            const char * _SrcCh,
-                                    size_t _SizeInBytes,        mbstate_t * _State);
-__declspec(dllimport) errno_t __cdecl mbsrtowcs_s(       size_t* _Retval,          wchar_t * _Dst,      size_t _SizeInWords,                  const char ** _PSrc,      size_t _N,        mbstate_t * _State);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl mbsrtowcs_s(       size_t * _Retval,        wchar_t (&_Dest)[_Size],                  const char ** _PSource,      size_t _Count,        mbstate_t * _State) { return mbsrtowcs_s(_Retval, _Dest, _Size, _PSource, _Count, _State); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "mbsrtowcs_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) size_t __cdecl mbsrtowcs( wchar_t *_Dest,  const char ** _PSrc,  size_t _Count,  mbstate_t * _State);
-
-__declspec(dllimport) errno_t __cdecl wcrtomb_s(       size_t * _Retval,          char * _Dst,
-             size_t _SizeInBytes,        wchar_t _Ch,        mbstate_t * _State);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl wcrtomb_s(       size_t * _Retval,          char (&_Dest)[_Size],        wchar_t _Source,        mbstate_t * _State) { return wcrtomb_s(_Retval, _Dest, _Size, _Source, _State); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "wcrtomb_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) size_t __cdecl wcrtomb( char *_Dest,  wchar_t _Source,  mbstate_t * _State);
-__declspec(dllimport) errno_t __cdecl wcsrtombs_s(       size_t * _Retval,          char * _Dst,
-             size_t _SizeInBytes,                const wchar_t ** _Src,      size_t _Size,        mbstate_t * _State);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl wcsrtombs_s(       size_t * _Retval,          char (&_Dest)[_Size],                const wchar_t ** _PSrc,      size_t _Count,        mbstate_t * _State) { return wcsrtombs_s(_Retval, _Dest, _Size, _PSrc, _Count, _State); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "wcsrtombs_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) size_t __cdecl wcsrtombs( char *_Dest,  const wchar_t ** _PSource,  size_t _Count,  mbstate_t * _State);
-__declspec(dllimport) int __cdecl wctob(     wint_t _WCh);
-
-
-
-
-
-
-
-__declspec(dllimport)  void *  __cdecl memmove(         void * _Dst,          const void * _Src,      size_t _MaxCount);
-
- void *  __cdecl memcpy(         void * _Dst,          const void * _Src,      size_t _MaxCount);
-
-__declspec(dllimport) errno_t __cdecl memcpy_s(         void * _Dst,      rsize_t _DstSize,          const void * _Src,      rsize_t _MaxCount);
-__declspec(dllimport) errno_t __cdecl memmove_s(         void * _Dst,      rsize_t _DstSize,          const void * _Src,      rsize_t _MaxCount);
-
-__inline int __cdecl fwide(       FILE * _F, int _M)
-        {(void)_F; return (_M); }
-__inline int __cdecl mbsinit(       const mbstate_t *_P)
-        {return (_P == 0 || *_P == 0); }
-__inline const wchar_t * __cdecl wmemchr(       const wchar_t *_S,        wchar_t _C,      size_t _N)
-        {for (; 0 < _N; ++_S, --_N)
-                if (*_S == _C)
-                        return (const wchar_t *)(_S);
-        return (0); }
-__inline int __cdecl wmemcmp(       const wchar_t *_S1,        const wchar_t *_S2,      size_t _N)
-        {for (; 0 < _N; ++_S1, ++_S2, --_N)
-                if (*_S1 != *_S2)
-                        return (*_S1 < *_S2 ? -1 : +1);
-        return (0); }
-
-__inline  wchar_t * __cdecl wmemcpy(       wchar_t *_S1,          const wchar_t *_S2,      size_t _N)
-        {
-#pragma warning( push )
-#pragma warning( disable : 4996 6386 )
-            return (wchar_t *)memcpy(_S1, _S2, _N*sizeof(wchar_t));
-#pragma warning( pop )
-        }
-
-
-__inline errno_t __cdecl wmemcpy_s(         wchar_t *_S1,      rsize_t _N1,          const wchar_t *_S2, rsize_t _N)
-        {
-#pragma warning( push )
-#pragma warning( disable : 6386 )
-            return memcpy_s(_S1, _N1*sizeof(wchar_t), _S2, _N*sizeof(wchar_t));
-        }
-#pragma warning( pop )
-
-
-__inline  wchar_t * __cdecl wmemmove(         wchar_t *_S1,          const wchar_t *_S2,      size_t _N)
-        {
-#pragma warning( push )
-#pragma warning( disable : 4996 6386 )
-#pragma warning( disable : 6387)
-			
-            return (wchar_t *)memmove(_S1, _S2, _N*sizeof(wchar_t));
-#pragma warning( pop )
-        }
-
-
-__inline errno_t __cdecl wmemmove_s(         wchar_t *_S1,      rsize_t _N1,          const wchar_t *_S2,      rsize_t _N)
-        {
-#pragma warning( push )
-#pragma warning( disable : 6386 )
-            return memmove_s(_S1, _N1*sizeof(wchar_t), _S2, _N*sizeof(wchar_t));
-#pragma warning( pop )
-        }
-
-
-__inline wchar_t * __cdecl wmemset(       wchar_t *_S,        wchar_t _C,      size_t _N)
-        {
-            wchar_t *_Su = _S;
-            for (; 0 < _N; ++_Su, --_N)
-            {
-                *_Su = _C;
-            }
-            return (_S);
-        }
-
-
-extern "C++" {
-inline wchar_t * __cdecl wmemchr(       wchar_t *_S,      wchar_t _C,      size_t _N)
-        { return (wchar_t *)wmemchr((const wchar_t *)_S, _C, _N); }
-}
-
-
-
-
-}       
-
-
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-typedef wchar_t     _TCHAR;
-typedef wchar_t     _TSCHAR;
-typedef wchar_t     _TUCHAR;
-typedef wchar_t     _TXCHAR;
-typedef wint_t      _TINT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__inline  size_t __cdecl _tclen(       const wchar_t *_Cpc)
-{ 
-    
-    (void *)_Cpc;
-    return 1;
-}
-__inline void __cdecl _tccpy(     wchar_t *_Pc1,        const wchar_t *_Cpc2) { *_Pc1 = (wchar_t)*_Cpc2; }
-__inline void __cdecl _tccpy_l(     wchar_t *_Pc1,        const wchar_t *_Cpc2,        _locale_t _Locale)
-{
-    (void)_Locale;
-    _tccpy(_Pc1, _Cpc2);
-}
-__inline  int __cdecl _tccmp(       const wchar_t *_Cpc1,        const wchar_t *_Cpc2) { return (int) ((*_Cpc1)-(*_Cpc2)); }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__inline  wchar_t * __cdecl _wcsdec(       const wchar_t * _Cpc1,        const wchar_t * _Cpc2) { return (wchar_t *)((_Cpc1)>=(_Cpc2) ? 0 : ((_Cpc2)-1)); }
-__inline  wchar_t * __cdecl _wcsinc(       const wchar_t * _Pc) { return (wchar_t *)(_Pc+1); }
-__inline  unsigned int __cdecl _wcsnextc(       const wchar_t * _Cpc) { return (unsigned int)*_Cpc; }
-__inline  wchar_t * __cdecl _wcsninc(       const wchar_t * _Pc,      size_t _Sz) { return (wchar_t *)(_Pc+_Sz); }
-__inline  size_t __cdecl _wcsncnt(          const wchar_t * _String,      size_t _Cnt) 
-{ 
-        size_t n = _Cnt; 
-        wchar_t *cp = (wchar_t *)_String; 
-        while (n-- && *cp) 
-                cp++; 
-        return _Cnt - n - 1; 
-}
-__inline  wchar_t * __cdecl _wcsspnp
-( 
-           const wchar_t * _Cpc1, 
-           const wchar_t * _Cpc2
-)
-{
-    return _Cpc1==0 ? 0 : ((*(_Cpc1 += wcsspn(_Cpc1,_Cpc2))!='\0') ? (wchar_t*)_Cpc1 : 0); 
-}
-
-
-__inline  errno_t __cdecl _wcsncpy_s_l(       wchar_t *_Destination,      size_t _Destination_size_chars,        const wchar_t *_Source,      size_t _Count,        _locale_t _Locale)
-{
-    (void)_Locale;
-    return wcsncpy_s(_Destination, _Destination_size_chars, _Source, _Count);
-}
-
-
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcsncpy_s_l(     wchar_t (&_Dest)[_Size],        const wchar_t * _Source,      size_t _Count,        _locale_t _Locale) { return _wcsncpy_s_l(_Dest, _Size, _Source, _Count, _Locale); } }
-
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcsncpy_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __inline wchar_t * __cdecl _wcsncpy_l(     wchar_t *_Dst,        const wchar_t * _Source,      size_t _Count,        _locale_t _Locale)
-{
-    (void)_Locale;
-#pragma warning( push )
-#pragma warning( disable : 4996 6054)
-    return wcsncpy(_Dst, _Source, _Count);
-#pragma warning( pop )
-}
-
-
-
-
-__inline  errno_t __cdecl _wcsncat_s_l(           wchar_t *_Destination,      size_t _Destination_size_chars,        const wchar_t *_Source,      size_t _Count,        _locale_t _Locale)
-{
-    (void)_Locale;
-    return wcsncat_s(_Destination, _Destination_size_chars, _Source, _Count);
-}
-
-
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcsncat_s_l(       wchar_t (&_Dest)[_Size],        const wchar_t * _Source,      size_t _Count,        _locale_t _Locale) { return _wcsncat_s_l(_Dest, _Size, _Source, _Count, _Locale); } }
-
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcsncat_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __inline wchar_t * __cdecl _wcsncat_l(         wchar_t *_Dst,        const wchar_t * _Source,      size_t _Count,        _locale_t _Locale)
-{
-    (void)_Locale;
-#pragma warning( push )
-#pragma warning( disable : 4996 6054 6059)
-
-    return wcsncat(_Dst, _Source, _Count);
-#pragma warning( pop )
-}
-
-
-
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcstok_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __inline wchar_t * _wcstok_l(           wchar_t * _String,        const wchar_t * _Delimiters,        _locale_t _Locale) 
-{
-    (void)_Locale;
-#pragma warning(push)
-#pragma warning(disable:4996)
-	return wcstok(_String,_Delimiters);
-#pragma warning(pop)
-}
-
-__inline wchar_t * _wcstok_s_l(           wchar_t * _String,        const wchar_t * _Delimiters,                        wchar_t **_Current_position,        _locale_t _Locale) 
-{
-    (void)_Locale;
-    return wcstok_s(_String, _Delimiters, _Current_position);
-}
-
-__inline  errno_t _wcsnset_s_l(           wchar_t * _Destination,      size_t _Destination_size_chars,        wchar_t _Value,      size_t _Count,        _locale_t _Locale)
-{
-    (void)_Locale;
-    return _wcsnset_s(_Destination, _Destination_size_chars, _Value, _Count);
-}
-
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcsnset_s_l(           wchar_t (&_Dest)[_Size],        wchar_t _Value,      size_t _Count,        _locale_t _Locale) { return _wcsnset_s_l(_Dest, _Size, _Value, _Count, _Locale); } }
-
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcsnset_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __inline wchar_t * __cdecl _wcsnset_l(           wchar_t *_Dst,        wchar_t _Value,      size_t _MaxCount,        _locale_t _Locale)
-{
-    (void)_Locale;
-#pragma warning( push )
-#pragma warning( disable : 4996 )
-    return _wcsnset(_Dst, _Value, _MaxCount);
-#pragma warning( pop )
-}
-
-
-
-__inline  errno_t _wcsset_s_l(           wchar_t * _Destination,      size_t _Destination_size_chars,        wchar_t _Value,        _locale_t _Locale) 
-{
-    (void)_Locale;
-    return _wcsset_s(_Destination, _Destination_size_chars, _Value);
-}
-
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcsset_s_l(           wchar_t (&_Dest)[_Size],        wchar_t _Value,        _locale_t _Locale) { return _wcsset_s_l(_Dest, _Size, _Value, _Locale); } }
-
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcsset_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __inline wchar_t * __cdecl _wcsset_l(         wchar_t *_Dst,        wchar_t _Value,        _locale_t _Locale)
-{
-    (void)_Locale;
-#pragma warning( push )
-#pragma warning( disable : 4996 )
-    return _wcsset(_Dst, _Value);
-#pragma warning( pop )
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}   
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma pack(push,8)
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)  unsigned char * __cdecl _mbsdup(       const unsigned char * _Str);
-
-
-
-
-
-__declspec(dllimport)  unsigned int __cdecl _mbbtombc(     unsigned int _Ch);
-__declspec(dllimport)  unsigned int __cdecl _mbbtombc_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _mbbtype(     unsigned char _Ch,      int _CType);
-__declspec(dllimport)  int __cdecl _mbbtype_l(     unsigned char _Ch,      int _CType,        _locale_t _Locale);
-__declspec(dllimport)  unsigned int __cdecl _mbctombb(     unsigned int _Ch);
-__declspec(dllimport)  unsigned int __cdecl _mbctombb_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport) int __cdecl _mbsbtype(         const unsigned char * _Str,      size_t _Pos);
-__declspec(dllimport) int __cdecl _mbsbtype_l(         const unsigned char * _Str,      size_t _Pos,        _locale_t _Locale);
-__declspec(dllimport) errno_t __cdecl _mbscat_s(           unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbscat_s(       unsigned char (&_Dst)[_Size],        const unsigned char * _DstSizeInBytes) { return _mbscat_s(_Dst, _Size, _DstSizeInBytes); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbscat_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbscat( unsigned char *_Dest,  const unsigned char * _Source);
-__declspec(dllimport) errno_t __cdecl _mbscat_s_l(           unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbscat_s_l(       unsigned char (&_Dest)[_Size],        const unsigned char * _Source,        _locale_t _Locale) { return _mbscat_s_l(_Dest, _Size, _Source, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbscat_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbscat_l(         unsigned char *_Dest,        const unsigned char * _Source,        _locale_t _Locale);
-__declspec(dllimport)   const unsigned char * __cdecl _mbschr(       const unsigned char * _Str,      unsigned int _Ch);
-__declspec(dllimport)   const unsigned char * __cdecl _mbschr_l(       const unsigned char * _Str,      unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _mbscmp(       const unsigned char * _Str1,        const unsigned char * _Str2);
-__declspec(dllimport)  int __cdecl _mbscmp_l(       const unsigned char * _Str1,        const unsigned char * _Str2,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _mbscoll(       const unsigned char * _Str1,        const unsigned char * _Str2);
-__declspec(dllimport)  int __cdecl _mbscoll_l(       const unsigned char * _Str1,        const unsigned char * _Str2,        _locale_t _Locale);
-__declspec(dllimport) errno_t __cdecl _mbscpy_s(       unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbscpy_s(     unsigned char (&_Dest)[_Size],        const unsigned char * _Source) { return _mbscpy_s(_Dest, _Size, _Source); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbscpy_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbscpy( unsigned char *_Dest,  const unsigned char * _Source);
-__declspec(dllimport) errno_t __cdecl _mbscpy_s_l(       unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbscpy_s(     unsigned char (&_Dest)[_Size],        const unsigned char * _Source,        _locale_t _Locale) { return _mbscpy_s(_Dest, _Size, _Source, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbscpy_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbscpy_l(     unsigned char *_Dest,        const unsigned char * _Source,        _locale_t _Locale);
-__declspec(dllimport)  size_t __cdecl _mbscspn(       const unsigned char * _Str,        const unsigned char * _Control);
-__declspec(dllimport)  size_t __cdecl _mbscspn_l(       const unsigned char * _Str,        const unsigned char * _Control,        _locale_t _Locale);
-__declspec(dllimport)  unsigned char * __cdecl _mbsdec(         const unsigned char * _Start,        const unsigned char * _Pos);
-__declspec(dllimport)  unsigned char * __cdecl _mbsdec_l(         const unsigned char * _Start,        const unsigned char * _Pos,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _mbsicmp(       const unsigned char * _Str1,        const unsigned char * _Str2);
-__declspec(dllimport)  int __cdecl _mbsicmp_l(       const unsigned char * _Str1,        const unsigned char * _Str2,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _mbsicoll(       const unsigned char * _Str1,        const unsigned char * _Str2);
-__declspec(dllimport)  int __cdecl _mbsicoll_l(       const unsigned char * _Str1,        const unsigned char * _Str2,        _locale_t _Locale);
-__declspec(dllimport)  unsigned char * __cdecl _mbsinc(       const unsigned char * _Ptr);
-__declspec(dllimport)  unsigned char * __cdecl _mbsinc_l(       const unsigned char * _Ptr,        _locale_t _Locale);
-__declspec(dllimport)  size_t __cdecl _mbslen(       const unsigned char * _Str);
-__declspec(dllimport)  size_t __cdecl _mbslen_l(       const unsigned char * _Str,        _locale_t _Locale);
-__declspec(dllimport)  size_t __cdecl _mbsnlen(       const unsigned char * _Str,      size_t _MaxCount);
-__declspec(dllimport)  size_t __cdecl _mbsnlen_l(       const unsigned char * _Str,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport) errno_t __cdecl _mbslwr_s(         unsigned char *_Str,      size_t _SizeInBytes);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbslwr_s(         unsigned char (&_String)[_Size]) { return _mbslwr_s(_String, _Size); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbslwr_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbslwr( unsigned char *_String);
-__declspec(dllimport) errno_t __cdecl _mbslwr_s_l(         unsigned char *_Str,      size_t _SizeInBytes,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbslwr_s_l(       unsigned char (&_String)[_Size],        _locale_t _Locale) { return _mbslwr_s_l(_String, _Size, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbslwr_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbslwr_l(         unsigned char *_String,        _locale_t _Locale);
-__declspec(dllimport) errno_t __cdecl _mbsnbcat_s(           unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src,      size_t _MaxCount);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsnbcat_s(       unsigned char (&_Dest)[_Size],        const unsigned char * _Source,      size_t _Count) { return _mbsnbcat_s(_Dest, _Size, _Source, _Count); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsnbcat_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsnbcat( unsigned char *_Dest,  const unsigned char * _Source,  size_t _Count);
-__declspec(dllimport) errno_t __cdecl _mbsnbcat_s_l(           unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src,      size_t _MaxCount,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsnbcat_s_l(       unsigned char (&_Dest)[_Size],        const unsigned char * _Source,      size_t _Count,        _locale_t _Locale) { return _mbsnbcat_s_l(_Dest, _Size, _Source, _Count, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsnbcat_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsnbcat_l(         unsigned char *_Dest,        const unsigned char * _Source,      size_t _Count,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _mbsnbcmp(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount);
-__declspec(dllimport)  int __cdecl _mbsnbcmp_l(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _mbsnbcoll(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount);
-__declspec(dllimport)  int __cdecl _mbsnbcoll_l(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport)  size_t __cdecl _mbsnbcnt(         const unsigned char * _Str,      size_t _MaxCount);
-__declspec(dllimport)  size_t __cdecl _mbsnbcnt_l(         const unsigned char * _Str,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport) errno_t __cdecl _mbsnbcpy_s(       unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src,      size_t _MaxCount);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsnbcpy_s(     unsigned char (&_Dest)[_Size],        const unsigned char * _Source,      size_t _Count) { return _mbsnbcpy_s(_Dest, _Size, _Source, _Count); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsnbcpy_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsnbcpy( unsigned char *_Dest,  const unsigned char * _Source,  size_t _Count);
-__declspec(dllimport) errno_t __cdecl _mbsnbcpy_s_l(       unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src,      size_t _MaxCount,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsnbcpy_s_l(     unsigned char (&_Dest)[_Size],        const unsigned char * _Source,      size_t _Count,        _locale_t _Locale) { return _mbsnbcpy_s_l(_Dest, _Size, _Source, _Count, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsnbcpy_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsnbcpy_l(       unsigned char *_Dest,        const unsigned char * _Source,      size_t _Count,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _mbsnbicmp(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount);
-__declspec(dllimport)  int __cdecl _mbsnbicmp_l(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _mbsnbicoll(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount);
-__declspec(dllimport)  int __cdecl _mbsnbicoll_l(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport) errno_t __cdecl _mbsnbset_s(           unsigned char * _Dst,      size_t _DstSizeInBytes,      unsigned int _Ch,      size_t _MaxCount);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsnbset_s(           unsigned char (&_Dest)[_Size],      unsigned int _Val,      size_t _MaxCount) { return _mbsnbset_s(_Dest, _Size, _Val, _MaxCount); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsnbset_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsnbset(           unsigned char *_String,      unsigned int _Val,      size_t _MaxCount);
-__declspec(dllimport) errno_t __cdecl _mbsnbset_s_l(           unsigned char * _Dst,      size_t _DstSizeInBytes,      unsigned int _Ch,      size_t _MaxCount,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsnbset_s_l(           unsigned char (&_Dest)[_Size],      unsigned int _Val,      size_t _MaxCount,        _locale_t _Locale) { return _mbsnbset_s_l(_Dest, _Size, _Val, _MaxCount, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsnbset_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsnbset_l(           unsigned char *_String,      unsigned int _Val,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport) errno_t __cdecl _mbsncat_s(           unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src,      size_t _MaxCount);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsncat_s(       unsigned char (&_Dest)[_Size],        const unsigned char * _Source,      size_t _Count) { return _mbsncat_s(_Dest, _Size, _Source, _Count); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsncat_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsncat( unsigned char *_Dest,  const unsigned char * _Source,  size_t _Count);
-__declspec(dllimport) errno_t __cdecl _mbsncat_s_l(           unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src,      size_t _MaxCount,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsncat_s_l(       unsigned char (&_Dest)[_Size],        const unsigned char * _Source,      size_t _Count,        _locale_t _Locale) { return _mbsncat_s_l(_Dest, _Size, _Source, _Count, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsncat_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsncat_l(         unsigned char *_Dest,        const unsigned char * _Source,      size_t _Count,        _locale_t _Locale);
-__declspec(dllimport)  size_t __cdecl _mbsnccnt(         const unsigned char * _Str,      size_t _MaxCount);
-__declspec(dllimport)  size_t __cdecl _mbsnccnt_l(         const unsigned char * _Str,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _mbsncmp(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount);
-__declspec(dllimport)  int __cdecl _mbsncmp_l(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _mbsncoll(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount);
-__declspec(dllimport)  int __cdecl _mbsncoll_l(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport) errno_t __cdecl _mbsncpy_s(       unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src,      size_t _MaxCount);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsncpy_s(     unsigned char (&_Dest)[_Size],        const unsigned char * _Source,      size_t _Count) { return _mbsncpy_s(_Dest, _Size, _Source, _Count); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsncpy_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsncpy( unsigned char *_Dest,  const unsigned char * _Source,  size_t _Count);
-__declspec(dllimport) errno_t __cdecl _mbsncpy_s_l(       unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src,      size_t _MaxCount,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsncpy_s_l(     unsigned char (&_Dest)[_Size],        const unsigned char * _Source,      size_t _Count,        _locale_t _Locale) { return _mbsncpy_s_l(_Dest, _Size, _Source, _Count, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsncpy_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsncpy_l(     unsigned char *_Dest,        const unsigned char * _Source,      size_t _Count,        _locale_t _Locale);
-__declspec(dllimport)  unsigned int __cdecl _mbsnextc (       const unsigned char * _Str);
-__declspec(dllimport)  unsigned int __cdecl _mbsnextc_l(       const unsigned char * _Str,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _mbsnicmp(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount);
-__declspec(dllimport)  int __cdecl _mbsnicmp_l(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _mbsnicoll(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount);
-__declspec(dllimport)  int __cdecl _mbsnicoll_l(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport)  unsigned char * __cdecl _mbsninc(         const unsigned char * _Str,      size_t _Count);
-__declspec(dllimport)  unsigned char * __cdecl _mbsninc_l(         const unsigned char * _Str,      size_t _Count,        _locale_t _Locale);
-__declspec(dllimport) errno_t __cdecl _mbsnset_s(           unsigned char * _Dst,      size_t _DstSizeInBytes,      unsigned int _Val,      size_t _MaxCount);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsnset_s(           unsigned char (&_Dest)[_Size],      unsigned int _Val,      size_t _MaxCount) { return _mbsnset_s(_Dest, _Size, _Val, _MaxCount); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsnset_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsnset(           unsigned char *_String,      unsigned int _Val,      size_t _MaxCount);
-__declspec(dllimport) errno_t __cdecl _mbsnset_s_l(           unsigned char * _Dst,      size_t _DstSizeInBytes,      unsigned int _Val,      size_t _MaxCount,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsnset_s_l(           unsigned char (&_Dest)[_Size],      unsigned int _Val,      size_t _MaxCount,        _locale_t _Locale) { return _mbsnset_s_l(_Dest, _Size, _Val, _MaxCount, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsnset_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsnset_l(           unsigned char *_String,      unsigned int _Val,      size_t _MaxCount,        _locale_t _Locale);
-__declspec(dllimport)   const unsigned char * __cdecl _mbspbrk(       const unsigned char * _Str,        const unsigned char * _Control);
-__declspec(dllimport)   const unsigned char * __cdecl _mbspbrk_l(       const unsigned char * _Str,        const unsigned char * _Control,        _locale_t _Locale);
-__declspec(dllimport)   const unsigned char * __cdecl _mbsrchr(       const unsigned char * _Str,      unsigned int _Ch);
-__declspec(dllimport)   const unsigned char * __cdecl _mbsrchr_l(       const unsigned char *_Str,      unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport) unsigned char * __cdecl _mbsrev(         unsigned char * _Str);
-__declspec(dllimport) unsigned char * __cdecl _mbsrev_l(         unsigned char *_Str,        _locale_t _Locale);
-__declspec(dllimport) errno_t __cdecl _mbsset_s(           unsigned char * _Dst,      size_t _DstSizeInBytes,      unsigned int _Val);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsset_s(           unsigned char (&_Dest)[_Size],      unsigned int _Val) { return _mbsset_s(_Dest, _Size, _Val); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsset_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsset(         unsigned char *_String,      unsigned int _Val);
-__declspec(dllimport) errno_t __cdecl _mbsset_s_l(           unsigned char * _Dst,      size_t _DstSizeInBytes,      unsigned int _Val,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsset_s_l(           unsigned char (&_Dest)[_Size],      unsigned int _Val,        _locale_t _Locale) { return _mbsset_s_l(_Dest, _Size, _Val, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsset_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsset_l(         unsigned char *_String,      unsigned int _Val,        _locale_t _Locale);
-__declspec(dllimport)  size_t __cdecl _mbsspn(       const unsigned char *_Str,        const unsigned char * _Control);
-__declspec(dllimport)  size_t __cdecl _mbsspn_l(       const unsigned char * _Str,        const unsigned char * _Control,        _locale_t _Locale);
-__declspec(dllimport)  unsigned char * __cdecl _mbsspnp(       const unsigned char * _Str1,        const unsigned char *_Str2);
-__declspec(dllimport)  unsigned char * __cdecl _mbsspnp_l(       const unsigned char *_Str1,        const unsigned char *_Str2,        _locale_t _Locale);
-__declspec(dllimport)   const unsigned char * __cdecl _mbsstr(       const unsigned char * _Str,        const unsigned char * _Substr);
-__declspec(dllimport)   const unsigned char * __cdecl _mbsstr_l(       const unsigned char * _Str,        const unsigned char * _Substr,        _locale_t _Locale);
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbstok_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))  unsigned char * __cdecl _mbstok(           unsigned char * _Str,        const unsigned char * _Delim);
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbstok_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))  unsigned char * __cdecl _mbstok_l(           unsigned char *_Str,        const unsigned char * _Delim,        _locale_t _Locale);
-__declspec(dllimport)  unsigned char * __cdecl _mbstok_s(           unsigned char *_Str,        const unsigned char * _Delim,                        unsigned char ** _Context);
-__declspec(dllimport)  unsigned char * __cdecl _mbstok_s_l(           unsigned char * _Str,        const unsigned char * _Delim,                        unsigned char ** _Context,        _locale_t _Locale);
-__declspec(dllimport) errno_t __cdecl _mbsupr_s(           unsigned char *_Str,      size_t _SizeInBytes);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsupr_s(       unsigned char (&_String)[_Size]) { return _mbsupr_s(_String, _Size); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsupr_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsupr( unsigned char *_String);
-__declspec(dllimport) errno_t __cdecl _mbsupr_s_l(           unsigned char *_Str,      size_t _SizeInBytes,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsupr_s_l(       unsigned char (&_String)[_Size],        _locale_t _Locale) { return _mbsupr_s_l(_String, _Size, _Locale); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsupr_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsupr_l(         unsigned char *_String,        _locale_t _Locale);
-
-__declspec(dllimport)  size_t __cdecl _mbclen(       const unsigned char *_Str);
-__declspec(dllimport)  size_t __cdecl _mbclen_l(       const unsigned char * _Str,        _locale_t _Locale);
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbccpy_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) void __cdecl _mbccpy(     unsigned char * _Dst,        const unsigned char * _Src);
-__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbccpy_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) void __cdecl _mbccpy_l(     unsigned char *_Dst,        const unsigned char *_Src,        _locale_t _Locale);
-__declspec(dllimport) errno_t __cdecl _mbccpy_s(     unsigned char * _Dst,      size_t _DstSizeInBytes,        int * _PCopied,        const unsigned char * _Src);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbccpy_s(     unsigned char (&_Dest)[_Size],        int * _PCopied,        const unsigned char * _Source) { return _mbccpy_s(_Dest, _Size, _PCopied, _Source); } }
-__declspec(dllimport) errno_t __cdecl _mbccpy_s_l(     unsigned char * _Dst,      size_t _DstSizeInBytes,        int * _PCopied,        const unsigned char * _Src,        _locale_t _Locale);
-extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbccpy_s_l(     unsigned char (&_Dest)[_Size],        int * _PCopied,        const unsigned char * _Source,        _locale_t _Locale) { return _mbccpy_s_l(_Dest, _Size, _PCopied, _Source, _Locale); } }
-
-
-
-
-
-extern "C++" {
-inline  unsigned char * __cdecl _mbschr(       unsigned char *_String,      unsigned int _Char)
-{
-    return ((unsigned char *)_mbschr((const unsigned char *)_String, _Char)); 
-}
-
-inline  unsigned char * __cdecl _mbschr_l(       unsigned char *_String,      unsigned int _Char,        _locale_t _Locale)
-{
-    return ((unsigned char *)_mbschr_l((const unsigned char *)_String, _Char, _Locale)); 
-}
-
-inline  unsigned char * __cdecl _mbspbrk(       unsigned char *_String,        const unsigned char *_CharSet)
-{
-    return ((unsigned char *)_mbspbrk((const unsigned char *)_String, _CharSet)); 
-}
-
-inline  unsigned char * __cdecl _mbspbrk_l(       unsigned char *_String,        const unsigned char *_CharSet,        _locale_t _Locale)
-{
-    return ((unsigned char *)_mbspbrk_l((const unsigned char *)_String, _CharSet, _Locale)); 
-}
-
-inline  unsigned char * __cdecl _mbsrchr(       unsigned char *_String,      unsigned int _Char)
-{
-    return ((unsigned char *)_mbsrchr((const unsigned char *)_String, _Char)); 
-}
-
-inline  unsigned char * __cdecl _mbsrchr_l(       unsigned char *_String,      unsigned int _Char,        _locale_t _Locale)
-{
-    return ((unsigned char *)_mbsrchr_l((const unsigned char *)_String, _Char, _Locale)); 
-}
-
-inline  unsigned char * __cdecl _mbsstr(       unsigned char *_String,        const unsigned char *_Match)
-{
-    return ((unsigned char *)_mbsstr((const unsigned char *)_String, _Match)); 
-}
-
-inline  unsigned char * __cdecl _mbsstr_l(       unsigned char *_String,        const unsigned char *_Match,        _locale_t _Locale)
-{
-    return ((unsigned char *)_mbsstr_l((const unsigned char *)_String, _Match, _Locale)); 
-}
-}
-
-
-
-
-
-__declspec(dllimport)  int __cdecl _ismbcalnum(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbcalnum_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbcalpha(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbcalpha_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbcdigit(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbcdigit_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbcgraph(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbcgraph_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbclegal(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbclegal_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbclower(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbclower_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbcprint(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbcprint_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbcpunct(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbcpunct_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbcspace(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbcspace_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbcupper(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbcupper_l(     unsigned int _Ch,        _locale_t _Locale);
-
-__declspec(dllimport)  unsigned int __cdecl _mbctolower(     unsigned int _Ch);
-__declspec(dllimport)  unsigned int __cdecl _mbctolower_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  unsigned int __cdecl _mbctoupper(     unsigned int _Ch);
-__declspec(dllimport)  unsigned int __cdecl _mbctoupper_l(     unsigned int _Ch,        _locale_t _Locale);
-
-
-
-
-
-__declspec(dllimport)  int __cdecl _ismbblead(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbblead_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbbtrail(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbbtrail_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbslead(         const unsigned char * _Str,        const unsigned char * _Pos);
-__declspec(dllimport)  int __cdecl _ismbslead_l(         const unsigned char * _Str,        const unsigned char * _Pos,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbstrail(         const unsigned char * _Str,        const unsigned char * _Pos);
-__declspec(dllimport)  int __cdecl _ismbstrail_l(         const unsigned char * _Str,        const unsigned char * _Pos,        _locale_t _Locale);
-
-
-
-
-
-__declspec(dllimport)  int __cdecl _ismbchira(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbchira_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbckata(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbckata_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbcsymbol(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbcsymbol_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbcl0(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbcl0_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbcl1(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbcl1_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  int __cdecl _ismbcl2(     unsigned int _Ch);
-__declspec(dllimport)  int __cdecl _ismbcl2_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  unsigned int __cdecl _mbcjistojms(     unsigned int _Ch);
-__declspec(dllimport)  unsigned int __cdecl _mbcjistojms_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  unsigned int __cdecl _mbcjmstojis(     unsigned int _Ch);
-__declspec(dllimport)  unsigned int __cdecl _mbcjmstojis_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  unsigned int __cdecl _mbctohira(     unsigned int _Ch);
-__declspec(dllimport)  unsigned int __cdecl _mbctohira_l(     unsigned int _Ch,        _locale_t _Locale);
-__declspec(dllimport)  unsigned int __cdecl _mbctokata(     unsigned int _Ch);
-__declspec(dllimport)  unsigned int __cdecl _mbctokata_l(     unsigned int _Ch,        _locale_t _Locale);
-
-
-
-}
-
-
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-#pragma warning (push)
-#pragma warning(disable: 4127) 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) extern unsigned long  __cdecl __threadid(void);
-
-__declspec(dllimport) extern uintptr_t __cdecl __threadhandle(void);
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-#pragma pack(push,8)
-namespace ATL
-{
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-template<typename T>
-class AtlLimits;
-
-template<>
-class AtlLimits<int __w64>
-{
-public:
-	static const int _Min=(-2147483647 - 1);
-	static const int _Max=2147483647;
-};
-
-template<>
-class AtlLimits<unsigned int __w64>
-{
-public:
-	static const unsigned int _Min=0;
-	static const unsigned int _Max=0xffffffff;
-};
-
-template<>
-class AtlLimits<long __w64>
-{
-public:
-	static const long _Min=(-2147483647L - 1);
-	static const long _Max=2147483647L;
-};
-
-template<>
-class AtlLimits<unsigned long __w64>
-{
-public:
-	static const unsigned long _Min=0;
-	static const unsigned long _Max=0xffffffffUL;
-};
-
-template<>
-class AtlLimits<long long>
-{
-public:
-	static const long long _Min=(-9223372036854775807i64 - 1);
-	static const long long _Max=9223372036854775807i64;
-};
-
-template<>
-class AtlLimits<unsigned long long>
-{
-public:
-	static const unsigned long long _Min=0;
-	static const unsigned long long _Max=0xffffffffffffffffui64;
-};
-
-
-template<typename T>
-inline HRESULT AtlAdd(T* ptResult, T tLeft, T tRight)
-{
-	if(::ATL::AtlLimits<T>::_Max-tLeft < tRight)
-	{
-		return ((HRESULT)0x80070057L);
-	}
-	*ptResult= tLeft + tRight;
-	return ((HRESULT)0x00000000L);
-}
-
-
-template<typename T>
-inline HRESULT AtlMultiply(T* ptResult,	T tLeft, T tRight)
-{
-	
-	if(tLeft==0)
-	{
-		*ptResult=0;
-		return ((HRESULT)0x00000000L);
-	}
-	if(::ATL::AtlLimits<T>::_Max/tLeft < tRight)
-	{
-		return ((HRESULT)0x80070057L);
-	}
-	*ptResult= tLeft * tRight;
-	return ((HRESULT)0x00000000L);
-}
-
-
-template<>
-inline HRESULT AtlMultiply(int __w64	*piResult, int __w64	iLeft, int __w64 iRight)
-{
-	__int64 i64Result=static_cast<__int64>(iLeft) * static_cast<__int64>(iRight);
-	if(i64Result>2147483647 || i64Result < (-2147483647 - 1))
-	{
-		return ((HRESULT)0x80070057L);
-	}
-	*piResult=static_cast<int __w64>(i64Result);
-	return ((HRESULT)0x00000000L);
-}
-
-template<>
-inline HRESULT AtlMultiply(unsigned int	__w64 *piResult, unsigned int __w64 iLeft, unsigned int __w64 iRight)
-{
-	unsigned __int64 i64Result=static_cast<unsigned __int64>(iLeft) * static_cast<unsigned __int64>(iRight);
-	if(i64Result>0xffffffff)
-	{
-		return ((HRESULT)0x80070057L);
-	}
-	*piResult=static_cast<unsigned int __w64>(i64Result);
-	return ((HRESULT)0x00000000L);
-}
-
-template<>
-inline HRESULT AtlMultiply(long	__w64 *piResult, long __w64 iLeft, long __w64 iRight)
-{
-	__int64 i64Result=static_cast<__int64>(iLeft) * static_cast<__int64>(iRight);
-	if(i64Result>2147483647L || i64Result < (-2147483647L - 1))
-	{
-		return ((HRESULT)0x80070057L);
-	}
-	*piResult=static_cast<long __w64>(i64Result);
-	return ((HRESULT)0x00000000L);
-}
-
-template<>
-inline HRESULT AtlMultiply(unsigned long __w64 *piResult, unsigned long __w64 iLeft, unsigned long __w64 iRight)
-{
-	unsigned __int64 i64Result=static_cast<unsigned __int64>(iLeft) * static_cast<unsigned __int64>(iRight);
-	if(i64Result>0xffffffffUL)
-	{
-		return ((HRESULT)0x80070057L);
-	}
-	*piResult=static_cast<unsigned long __w64>(i64Result);
-	return ((HRESULT)0x00000000L);
-}
-
-template <typename T>
-inline T AtlMultiplyThrow(T tLeft, T tRight)
-{
-	T tResult;
-	HRESULT hr=AtlMultiply(&tResult, tLeft, tRight);
-	if(((HRESULT)(hr) < 0))
-	{
-		ATL::AtlThrowImpl(hr);
-	}
-	return tResult;
-}
-
-template <typename T>
-inline T AtlAddThrow(T tLeft, T	tRight)
-{
-	T tResult;
-	HRESULT hr=AtlAdd(&tResult, tLeft, tRight);
-	if(((HRESULT)(hr) < 0))
-	{
-		ATL::AtlThrowImpl(hr);
-	}
-	return tResult;
-}
-
-inline LPVOID AtlCoTaskMemCAlloc(ULONG nCount, ULONG nSize)
-{
-	HRESULT hr;
-	ULONG nBytes=0;
-	if( ((HRESULT)(hr=::ATL::AtlMultiply(&nBytes, nCount, nSize)) < 0))
-	{
-		return 0;
-	}
-	return ::CoTaskMemAlloc(nBytes);
-}
-
-inline LPVOID AtlCoTaskMemRecalloc(void	*pvMemory, ULONG nCount, ULONG nSize)
-{
-	HRESULT hr;
-	ULONG nBytes=0;
-	if( ((HRESULT)(hr=::ATL::AtlMultiply(&nBytes, nCount, nSize)) < 0))
-	{
-		return 0;
-	}
-	return ::CoTaskMemRealloc(pvMemory, nBytes);
-}
-
-}	
-#pragma pack(pop)
-
-#pragma pack(push,8)
-namespace ATL
-{
-
-
-namespace Checked
-{
-    void __cdecl memcpy_s(void *s1, size_t s1max, const void *s2, size_t n);
-}
-
-
-
-
-class CCRTAllocator 
-{
-public:
-	static void* Reallocate(void* p, size_t nBytes) throw()
-	{
-		return realloc(p, nBytes);
-	}
-
-	static void* Allocate(size_t nBytes) throw()
-	{
-		return malloc(nBytes);
-	}
-
-	static void Free(void* p) throw()
-	{
-		free(p);
-	}
-};
-
-class CLocalAllocator
-{
-public:
-	static void* Allocate(size_t nBytes) throw()
-	{
-		return ::LocalAlloc(0x0000, nBytes);
-	}
-	static void* Reallocate(void* p, size_t nBytes) throw()
-	{
-		if (p==0){
-			return ( Allocate(nBytes) );
-		
-		}
-		if (nBytes==0){
-			Free(p);
-			return 0;
-		}
-			return ::LocalReAlloc(p, nBytes, 0);
-		 
-	}
-	static void Free(void* p) throw()
-	{
-		::LocalFree(p);
-	}
-};
-
-class CGlobalAllocator
-{
-public:
-	static void* Allocate(size_t nBytes) throw()
-	{
-		return ::GlobalAlloc(0x0000, nBytes);
-	}
-	static void* Reallocate(void* p, size_t nBytes) throw()
-	{
-		if (p==0){
-			return ( Allocate(nBytes) );
-		
-		}
-		if (nBytes==0){
-			Free(p);
-			return 0;
-		}
-		return ( ::GlobalReAlloc(p, nBytes, 0) );
-	}
-	static void Free(void* p) throw()
-	{
-		::GlobalFree(p);
-	}
-};
-
-template <class T, class Allocator = CCRTAllocator>
-class CHeapPtrBase
-{
-protected:
-	CHeapPtrBase() throw() :
-		m_pData(0)
-	{
-	}
-	CHeapPtrBase(CHeapPtrBase<T, Allocator>& p) throw()
-	{
-		m_pData = p.Detach();  
-	}
-	explicit CHeapPtrBase(T* pData) throw() :
-		m_pData(pData)
-	{
-	}
-
-public:
-	~CHeapPtrBase() throw()
-	{
-		Free();
-	}
-
-protected:
-	CHeapPtrBase<T, Allocator>& operator=(CHeapPtrBase<T, Allocator>& p) throw()
-	{
-		if(m_pData != p.m_pData)
-			Attach(p.Detach());  
-		return *this;
-	}
-
-public:
-	operator T*() const throw()
-	{
-		return m_pData;
-	}
-
-	T* operator->() const throw()
-	{
-		(void) ((!!((m_pData != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlalloc.h", 342, 0, L"m_pData != 0")) || (__debugbreak(), 0));
-		return m_pData;
-	}
-
-	T** operator&() throw()
-	{
-		do { (void) ((!!((m_pData == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlalloc.h", 348, 0, L"m_pData == 0")) || (__debugbreak(), 0)); ; } while(0);
-		return &m_pData;
-	}
-
-	
-	bool AllocateBytes(size_t nBytes) throw()
-	{
-		(void) ((!!((m_pData == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlalloc.h", 355, 0, L"m_pData == 0")) || (__debugbreak(), 0));
-		m_pData = static_cast<T*>(Allocator::Allocate(nBytes));
-		if (m_pData == 0)
-			return false;
-
-		return true;
-	}
-
-	
-	void Attach(T* pData) throw()
-	{
-		Allocator::Free(m_pData);
-		m_pData = pData;
-	}
-
-	
-	T* Detach() throw() 
-	{
-		T* pTemp = m_pData;
-		m_pData = 0;
-		return pTemp;
-	}
-
-	
-	void Free() throw()
-	{
-		Allocator::Free(m_pData);
-		m_pData = 0;
-	}
-
-	
-	bool ReallocateBytes(size_t nBytes) throw()
-	{
-		T* pNew;
-
-		pNew = static_cast<T*>(Allocator::Reallocate(m_pData, nBytes));
-		if (pNew == 0)
-			return false;
-		m_pData = pNew;
-
-		return true;
-	}
-
-public:
-	T* m_pData;
-};
-
-template <typename T, class Allocator = CCRTAllocator>
-class CHeapPtr :
-	public CHeapPtrBase<T, Allocator>
-{
-public:
-	CHeapPtr() throw()
-	{
-	}
-	CHeapPtr(CHeapPtr<T, Allocator>& p) throw() :
-		CHeapPtrBase<T, Allocator>(p)
-	{
-	}
-	explicit CHeapPtr(T* p) throw() :
-		CHeapPtrBase<T, Allocator>(p)
-	{
-	}
-
-	CHeapPtr<T, Allocator>& operator=(CHeapPtr<T, Allocator>& p) throw()
-	{
-		CHeapPtrBase<T, Allocator>::operator=(p);
-
-		return *this;
-	}
-
-	
-	bool Allocate(size_t nElements = 1) throw()
-	{
-		size_t nBytes=0;
-		if(((HRESULT)(::ATL::AtlMultiply(&nBytes, nElements, sizeof(T))) < 0))
-		{
-			return false;
-		}
-		return AllocateBytes(nBytes);
-	}
-
-	
-	bool Reallocate(size_t nElements) throw()
-	{
-		size_t nBytes=0;
-		if(((HRESULT)(::ATL::AtlMultiply(&nBytes, nElements, sizeof(T))) < 0))
-		{
-			return false;
-		}
-		return ReallocateBytes(nBytes);
-	}
-};
-
-template< typename T, int t_nFixedBytes = 128, class Allocator = CCRTAllocator >
-class CTempBuffer
-{
-public:
-	CTempBuffer() throw() :
-		m_p( 0 )
-	{
-	}
-	CTempBuffer( size_t nElements ) throw( ... ) :
-		m_p( 0 )
-	{
-		Allocate( nElements );
-	}
-
-	~CTempBuffer() throw()
-	{
-		if( m_p != reinterpret_cast< T* >( m_abFixedBuffer ) )
-		{
-			FreeHeap();
-		}
-	}
-
-	operator T*() const throw()
-	{
-		return( m_p );
-	}
-	T* operator->() const throw()
-	{
-		(void) ((!!((m_p != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlalloc.h", 477, 0, L"m_p != 0")) || (__debugbreak(), 0));
-		return( m_p );
-	}
-
-	T* Allocate( size_t nElements ) throw( ... )
-	{
-		return( AllocateBytes( ::ATL::AtlMultiplyThrow(nElements,sizeof( T )) ) );
-	}
-
-	T* Reallocate( size_t nElements ) throw( ... )
-	{
-		do { int __atl_condVal=!!(nElements < size_t(-1)/sizeof(T)); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlalloc.h", 488, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);		
-		size_t nNewSize = nElements*sizeof( T ) ;
-				
-		if (m_p == 0)
-			return AllocateBytes(nNewSize);
-
-		if (nNewSize > t_nFixedBytes)
-		{
-			if( m_p == reinterpret_cast< T* >( m_abFixedBuffer ) )
-			{
-				
-				AllocateHeap(nNewSize);
-				Checked::memcpy_s(m_p, nNewSize, m_abFixedBuffer, t_nFixedBytes);
-			}
-			else
-			{
-				ReAllocateHeap( nNewSize );
-			}
-		}
-		else
-		{
-			m_p = reinterpret_cast< T* >( m_abFixedBuffer );
-		}
-
-		return m_p;
-	}
-
-	T* AllocateBytes( size_t nBytes )
-	{
-		(void) ((!!((m_p == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlalloc.h", 517, 0, L"m_p == 0")) || (__debugbreak(), 0));
-		if( nBytes > t_nFixedBytes )
-		{
-			AllocateHeap( nBytes );
-		}
-		else
-		{
-			m_p = reinterpret_cast< T* >( m_abFixedBuffer );
-		}
-
-		return( m_p );
-	}
-
-private:
-	__declspec( noinline ) void AllocateHeap( size_t nBytes )
-	{
-		T* p = static_cast< T* >( Allocator::Allocate( nBytes ) );
-		if( p == 0 )
-		{
-			ATL::AtlThrowImpl( ((HRESULT)0x8007000EL) );
-		}
-		m_p = p;
-	}
- 
-	__declspec( noinline ) void ReAllocateHeap( size_t nNewSize)
-	{
-		T* p = static_cast< T* >( Allocator::Reallocate(m_p, nNewSize) );
-		if ( p == 0 )
-		{
-			ATL::AtlThrowImpl( ((HRESULT)0x8007000EL) );
-		}
-		m_p = p;
-	}
-
-	__declspec( noinline ) void FreeHeap() throw()
-	{
-		Allocator::Free( m_p );
-	}
-
-private:
-	T* m_p;
-	BYTE m_abFixedBuffer[t_nFixedBytes];
-};
-
-
-
-
-namespace _ATL_SAFE_ALLOCA_IMPL
-{
-
-
-
-
-
-
-
-
-
-
-
-
-
-inline bool _AtlVerifyStackAvailable(SIZE_T Size)
-{
-    bool bStackAvailable = true;
-
-    __try
-    {
-		SIZE_T size=0;
-		HRESULT hrAdd=::ATL::AtlAdd(&size, Size, static_cast<SIZE_T>(0x2000));
-		if(((HRESULT)(hrAdd) < 0))
-		{
-			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlalloc.h", 589, 0, L"0")) || (__debugbreak(), 0));
-			bStackAvailable = false;
-		}
-		else
-		{
-			PVOID p = _alloca(size);
-			(p);
-		}
-    }
-    __except ((((DWORD )0xC00000FDL) == _exception_code()) ?
-                   1 :
-                   0)
-    {
-        bStackAvailable = false;
-        _resetstkoflw();
-    }
-    return bStackAvailable;
-}
-
-
-
-template < class Allocator>
-class CAtlSafeAllocBufferManager
-{
-private :
-	struct CAtlSafeAllocBufferNode
-	{
-		CAtlSafeAllocBufferNode* m_pNext;
-
-		BYTE _pad[4];
-
-
-
-
-
-
-
-		void* GetData()
-		{
-			return (this + 1);
-		}
-	};
-
-	CAtlSafeAllocBufferNode* m_pHead;
-public :
-	
-	CAtlSafeAllocBufferManager() : m_pHead(0) {};
-	void* Allocate(SIZE_T nRequestedSize)
-	{
-		CAtlSafeAllocBufferNode *p = (CAtlSafeAllocBufferNode*)Allocator::Allocate(::ATL::AtlAddThrow(nRequestedSize, static_cast<SIZE_T>(sizeof(CAtlSafeAllocBufferNode))));
-		if (p == 0)
-			return 0;
-		
-		
-		p->m_pNext = m_pHead;
-		m_pHead = p;
-		
-		return p->GetData();
-	}
-	~CAtlSafeAllocBufferManager()
-	{
-		
-		while (m_pHead != 0)
-		{
-			CAtlSafeAllocBufferNode* p = m_pHead;
-			m_pHead = m_pHead->m_pNext;
-			Allocator::Free(p);
-		}
-	}
-};
-
-}	
-
-}	
- #pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-inline void* __stdcall InterlockedExchangePointer(void** pp, void* pNew) throw()
-{
-	return( reinterpret_cast<void*>(static_cast<LONG_PTR>(::InterlockedExchange(reinterpret_cast<LONG*>(pp), static_cast<LONG>(reinterpret_cast<LONG_PTR>(pNew))))) );
-}
-
-
-
-
-#pragma pack(push,8)
-namespace ATL
-{
-
-typedef UINT (__stdcall *ATLGETTHREADACP)();
-
-inline UINT __stdcall _AtlGetThreadACPFake() throw()
-{
-	UINT nACP = 0;
-
-	LCID lcidThread = ::GetThreadLocale();
-
-	char szACP[7];
-	
-	
-	
-	if (::GetLocaleInfoA(lcidThread, 0x00001004, szACP, 7) != 0)
-	{
-		char* pch = szACP;
-		while (*pch != '\0')
-		{
-			nACP *= 10;
-			nACP += *pch++ - '0';
-		}
-	}
-	
-	if (nACP == 0)
-		nACP = ::GetACP();
-
-	return nACP;
-}
-
-inline UINT __stdcall _AtlGetThreadACPReal() throw()
-{
-	return( 3 );
-}
-
-extern ATLGETTHREADACP g_pfnGetThreadACP;
-
-inline UINT __stdcall _AtlGetThreadACPThunk() throw()
-{
-	OSVERSIONINFO ver;
-	ATLGETTHREADACP pfnGetThreadACP;
-
-	ver.dwOSVersionInfoSize = sizeof( ver );
-	::GetVersionExW( &ver );
-	if( (ver.dwPlatformId == 2) && (ver.dwMajorVersion >= 5) )
-	{
-		
-		pfnGetThreadACP = _AtlGetThreadACPReal;
-	}
-	else
-	{
-		pfnGetThreadACP = _AtlGetThreadACPFake;
-	}
-	InterlockedExchangePointer( reinterpret_cast< void** >(&g_pfnGetThreadACP), reinterpret_cast< void** >(pfnGetThreadACP) );
-
-	return( g_pfnGetThreadACP() );
-}
-
-inline UINT __stdcall _AtlGetConversionACP() throw()
-{
-	return( g_pfnGetThreadACP() );
-}
-
-
-
-
-
-
-
-
-
-template <class _CharType>
-inline  void AtlConvAllocMemory(              _CharType** ppBuff,     int nLength,       _CharType* pszFixedBuffer,     int nFixedBufferLength)
-{
-	do { int __atl_condVal=!!(ppBuff != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 174, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80070057L)); } while (0);
-	do { int __atl_condVal=!!(nLength >= 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 175, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80070057L)); } while (0);
-	do { int __atl_condVal=!!(pszFixedBuffer != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 176, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80070057L)); } while (0);
-
-	
-	if (*ppBuff != pszFixedBuffer)
-	{
-		if( nLength > nFixedBufferLength )
-		{
-			_CharType* ppReallocBuf = static_cast< _CharType* >( _recalloc(*ppBuff, nLength,sizeof( _CharType ) ) );
-			if (ppReallocBuf == 0) 
-			{
-				ATL::AtlThrowImpl( ((HRESULT)0x8007000EL) );
-			}
-			*ppBuff = ppReallocBuf;
-		} else
-		{
-			free(*ppBuff);
-			*ppBuff=pszFixedBuffer;
-		}
-
-	} else 
-	{
-		if( nLength > nFixedBufferLength )
-		{
-			*ppBuff = static_cast< _CharType* >( calloc(nLength,sizeof( _CharType ) ) );
-		} else
-		{			
-			*ppBuff=pszFixedBuffer;
-		}
-	}
-
-	if (*ppBuff == 0)
-	{
-		ATL::AtlThrowImpl( ((HRESULT)0x8007000EL) );
-	}
-
-}
-
-template <class _CharType>
-inline void AtlConvFreeMemory(_CharType* pBuff,_CharType* pszFixedBuffer,int nFixedBufferLength)
-{
-	(nFixedBufferLength);
-	if( pBuff != pszFixedBuffer )
-	{
-		free( pBuff );
-	} 	
-
-	else
-	{		
-		memset(pszFixedBuffer,0xFD,nFixedBufferLength*sizeof(_CharType));
-	}
-
-
-}
-
-template< int t_nBufferLength = 128 >
-class CW2WEX
-{
-public:
-	CW2WEX(        LPCWSTR psz ) throw(...) :
-		m_psz( m_szBuffer )
-	{
-		Init( psz );
-	}
-	CW2WEX(        LPCWSTR psz, UINT nCodePage ) throw(...) :
-		m_psz( m_szBuffer )
-	{
-		(void)nCodePage;  
-
-		Init( psz );
-	}
-	~CW2WEX() throw()
-	{
-		AtlConvFreeMemory(m_psz,m_szBuffer,t_nBufferLength);
-	}
-
-	operator LPWSTR() const throw()
-	{
-		return( m_psz );
-	}
-
-private:
-	void Init(        LPCWSTR psz ) throw(...)
-	{
-		if (psz == 0)
-		{
-			m_psz = 0;
-			return;
-		}
-		int nLength = lstrlenW( psz )+1;
-		AtlConvAllocMemory(&m_psz,nLength,m_szBuffer,t_nBufferLength);
-		Checked::memcpy_s( m_psz, nLength*sizeof( wchar_t ), psz, nLength*sizeof( wchar_t ));
-	}
-
-public:
-	LPWSTR m_psz;
-	wchar_t m_szBuffer[t_nBufferLength];
-
-private:
-	CW2WEX( const CW2WEX& ) throw();
-	CW2WEX& operator=( const CW2WEX& ) throw();
-};
-typedef CW2WEX<> CW2W;
-
-template< int t_nBufferLength = 128 >
-class CA2AEX
-{
-public:
-	CA2AEX(        LPCSTR psz ) throw(...) :
-		m_psz( m_szBuffer )
-	{
-		Init( psz );
-	}
-	CA2AEX(        LPCSTR psz, UINT nCodePage ) throw(...) :
-		m_psz( m_szBuffer )
-	{
-		(void)nCodePage;  
-
-		Init( psz );
-	}
-	~CA2AEX() throw()
-	{
-		AtlConvFreeMemory(m_psz,m_szBuffer,t_nBufferLength);
-	}
-
-	operator LPSTR() const throw()
-	{
-		return( m_psz );
-	}
-
-private:
-	void Init(        LPCSTR psz ) throw(...)
-	{
-		if (psz == 0)
-		{
-			m_psz = 0;
-			return;
-		}
-		int nLength = lstrlenA( psz )+1;
-		AtlConvAllocMemory(&m_psz,nLength,m_szBuffer,t_nBufferLength);		
-		Checked::memcpy_s( m_psz, nLength*sizeof( char ), psz, nLength*sizeof( char ));
-	}
-
-public:
-	LPSTR m_psz;
-	char m_szBuffer[t_nBufferLength];
-
-private:
-	CA2AEX( const CA2AEX& ) throw();
-	CA2AEX& operator=( const CA2AEX& ) throw();
-};
-typedef CA2AEX<> CA2A;
-
-template< int t_nBufferLength = 128 >
-class CA2CAEX
-{
-public:
-	CA2CAEX(      LPCSTR psz ) throw(...) :
-		m_psz( psz )
-	{
-	}
-	CA2CAEX(      LPCSTR psz, UINT nCodePage ) throw(...) :
-		m_psz( psz )
-	{
-		(void)nCodePage;
-	}
-	~CA2CAEX() throw()
-	{
-	}
-
-	operator LPCSTR() const throw()
-	{
-		return( m_psz );
-	}
-
-public:
-	LPCSTR m_psz;
-
-private:
-	CA2CAEX( const CA2CAEX& ) throw();
-	CA2CAEX& operator=( const CA2CAEX& ) throw();
-};
-typedef CA2CAEX<> CA2CA;
-
-template< int t_nBufferLength = 128 >
-class CW2CWEX
-{
-public:
-	CW2CWEX(      LPCWSTR psz ) throw(...) :
-		m_psz( psz )
-	{
-	}
-	CW2CWEX(      LPCWSTR psz, UINT nCodePage ) throw(...) :
-		m_psz( psz )
-	{
-		(void)nCodePage;
-	}
-	~CW2CWEX() throw()
-	{
-	}
-
-	operator LPCWSTR() const throw()
-	{
-		return( m_psz );
-	}
-
-public:
-	LPCWSTR m_psz;
-
-private:
-	CW2CWEX( const CW2CWEX& ) throw();
-	CW2CWEX& operator=( const CW2CWEX& ) throw();
-};
-typedef CW2CWEX<> CW2CW;
-
-template< int t_nBufferLength = 128 >
-class CA2WEX
-{
-public:
-	CA2WEX(        LPCSTR psz ) throw(...) :
-		m_psz( m_szBuffer )
-	{
-		Init( psz, _AtlGetConversionACP() );
-	}
-	CA2WEX(        LPCSTR psz, UINT nCodePage ) throw(...) :
-		m_psz( m_szBuffer )
-	{
-		Init( psz, nCodePage );
-	}
-	~CA2WEX() throw()
-	{
-		AtlConvFreeMemory(m_psz,m_szBuffer,t_nBufferLength);
-	}
-
-	operator LPWSTR() const throw()
-	{
-		return( m_psz );
-	}
-
-private:
-	void Init(        LPCSTR psz, UINT nCodePage ) throw(...)
-	{
-		if (psz == 0)
-		{
-			m_psz = 0;
-			return;
-		}
-		int nLengthA = lstrlenA( psz )+1;
-		int nLengthW = nLengthA;
-
-		AtlConvAllocMemory(&m_psz,nLengthW,m_szBuffer,t_nBufferLength);
-
-		BOOL bFailed=(0 == ::MultiByteToWideChar( nCodePage, 0, psz, nLengthA, m_psz, nLengthW ) );
-		if (bFailed)
-		{
-			if (GetLastError()==122L)
-			{
-				nLengthW = ::MultiByteToWideChar( nCodePage, 0, psz, nLengthA, 0, 0);
-				AtlConvAllocMemory(&m_psz,nLengthW,m_szBuffer,t_nBufferLength);
-				bFailed=(0 == ::MultiByteToWideChar( nCodePage, 0, psz, nLengthA, m_psz, nLengthW ) );
-			}			
-		}
-		if (bFailed)
-		{
-			AtlThrowLastWin32();
-		}		
-	}
-
-public:
-	LPWSTR m_psz;
-	wchar_t m_szBuffer[t_nBufferLength];
-
-private:
-	CA2WEX( const CA2WEX& ) throw();
-	CA2WEX& operator=( const CA2WEX& ) throw();
-};
-typedef CA2WEX<> CA2W;
-
-template< int t_nBufferLength = 128 >
-class CW2AEX
-{
-public:
-	CW2AEX(        LPCWSTR psz ) throw(...) :
-		m_psz( m_szBuffer )
-	{
-		Init( psz, _AtlGetConversionACP() );
-	}
-	CW2AEX(        LPCWSTR psz, UINT nCodePage ) throw(...) :
-		m_psz( m_szBuffer )
-	{
-		Init( psz, nCodePage );
-	}
-	~CW2AEX() throw()
-	{		
-		AtlConvFreeMemory(m_psz,m_szBuffer,t_nBufferLength);
-	}
-
-	operator LPSTR() const throw()
-	{
-		return( m_psz );
-	}
-
-private:
-	void Init(        LPCWSTR psz,      UINT nConvertCodePage ) throw(...)
-	{
-		if (psz == 0)
-		{
-			m_psz = 0;
-			return;
-		}
-		int nLengthW = lstrlenW( psz )+1;		 
-		int nLengthA = nLengthW*4;
-		
-		AtlConvAllocMemory(&m_psz,nLengthA,m_szBuffer,t_nBufferLength);
-
-		BOOL bFailed=(0 == ::WideCharToMultiByte( nConvertCodePage, 0, psz, nLengthW, m_psz, nLengthA, 0, 0 ));
-		if (bFailed)
-		{
-			if (GetLastError()==122L)
-			{
-				nLengthA = ::WideCharToMultiByte( nConvertCodePage, 0, psz, nLengthW, 0, 0, 0, 0 );
-				AtlConvAllocMemory(&m_psz,nLengthA,m_szBuffer,t_nBufferLength);
-				bFailed=(0 == ::WideCharToMultiByte( nConvertCodePage, 0, psz, nLengthW, m_psz, nLengthA, 0, 0 ));
-			}			
-		}
-		if (bFailed)
-		{
-			AtlThrowLastWin32();
-		}
-	}
-
-public:
-	LPSTR m_psz;
-	char m_szBuffer[t_nBufferLength];
-
-private:
-	CW2AEX( const CW2AEX& ) throw();
-	CW2AEX& operator=( const CW2AEX& ) throw();
-};
-typedef CW2AEX<> CW2A;
-
-
-
-	
-	
-	
-	
-	
-	
-	
-	
-
-	
-	
-	
-	
-	
-	
-	
-	
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-};  
-#pragma pack(pop)
-
-#pragma pack(push,8)
-
-
-
-
-
-
-	
-
-
-
-
-
-
-
-	
-
-
-
-	extern "C" __declspec(dllimport) LPDEVMODEA __stdcall AtlDevModeW2A(LPDEVMODEA lpDevModeA, const DEVMODEW* lpDevModeW);
-
-
-
-
-inline          LPWSTR __stdcall AtlA2WHelper(       LPWSTR lpw,        LPCSTR lpa,      int nChars,      UINT acp) throw()
-{
-	(void) ((!!((lpa != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 596, 0, L"lpa != 0")) || (__debugbreak(), 0));
-	(void) ((!!((lpw != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 597, 0, L"lpw != 0")) || (__debugbreak(), 0));
-	if (lpw == 0 || lpa == 0)
-		return 0;
-	
-	
-	
-	lpw[0] = '\0';
-	int ret = MultiByteToWideChar(acp, 0, lpa, -1, lpw, nChars);
-	if(ret == 0)
-	{
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 607, 0, L"0")) || (__debugbreak(), 0));
-		return 0;
-	}		
-	return lpw;
-}
-
-inline          LPSTR __stdcall AtlW2AHelper(       LPSTR lpa,        LPCWSTR lpw,      int nChars,      UINT acp) throw()
-{
-	(void) ((!!((lpw != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 615, 0, L"lpw != 0")) || (__debugbreak(), 0));
-	(void) ((!!((lpa != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 616, 0, L"lpa != 0")) || (__debugbreak(), 0));
-	if (lpa == 0 || lpw == 0)
-		return 0;
-	
-	
-	
-	lpa[0] = '\0';
-	int ret = WideCharToMultiByte(acp, 0, lpw, -1, lpa, nChars, 0, 0);
-	if(ret == 0)
-	{
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 626, 0, L"0")) || (__debugbreak(), 0));
-		return 0;
-	}
-	return lpa;
-}
-inline          LPWSTR __stdcall AtlA2WHelper(       LPWSTR lpw,        LPCSTR lpa,      int nChars) throw()
-{
-	return AtlA2WHelper(lpw, lpa, nChars, 0);
-}
-
-inline          LPSTR __stdcall AtlW2AHelper(       LPSTR lpa,        LPCWSTR lpw,      int nChars) throw()
-{
-	return AtlW2AHelper(lpa, lpw, nChars, 0);
-}
-
-
-	
-
-
-
-	
-	
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-	inline int ocslen(       LPCOLESTR x) throw() { return lstrlenW(x); }
-
-
-	inline bool ocscpy_s(       LPOLESTR dest,      size_t maxSize,        LPCOLESTR src) throw() 
-		{ return 0 == memcpy_s(dest, maxSize*sizeof(WCHAR), src, (ocslen(src)+1)*sizeof(WCHAR)); }
-	inline bool ocscat_s(       LPOLESTR dest,      size_t maxSize,        LPCOLESTR src) throw() 
-		{ return 0 == wcscat_s(dest, maxSize,src); }
-
-
-
-
-
-
-
-
-
-
-
-
-	__declspec(deprecated("ocscpy is not safe. Intead, use ocscpy_s"))
-	inline OLECHAR* ocscpy(     LPOLESTR dest,        LPCOLESTR src) throw()
-	{
-#pragma warning(push)
-#pragma warning(disable:4996)
-		return wcscpy(dest, src);
-#pragma warning(pop)
-	}
-	__declspec(deprecated("ocscat is not safe. Intead, use ocscat_s"))
-	inline OLECHAR* ocscat(     LPOLESTR dest,        LPCOLESTR src) throw()
-	{
-#pragma warning(push)
-#pragma warning(disable:4996)
-		return wcscat(dest, src);
-#pragma warning(pop)
-	}
-
-
-
-
-
-	inline LPCOLESTR T2COLE_EX(       LPCTSTR lp, UINT) { return lp; }
-	inline LPCOLESTR T2COLE_EX_DEF(       LPCTSTR lp) { return lp; }
-	inline LPCTSTR OLE2CT_EX(       LPCOLESTR lp, UINT) { return lp; }
-	inline LPCTSTR OLE2CT_EX_DEF(       LPCOLESTR lp) { return lp; }
-	inline LPOLESTR T2OLE_EX(       LPTSTR lp, UINT) { return lp; }
-	inline LPOLESTR T2OLE_EX_DEF(       LPTSTR lp) { return lp; }
-	inline LPTSTR OLE2T_EX(       LPOLESTR lp, UINT) { return lp; }	
-	inline LPTSTR OLE2T_EX_DEF(       LPOLESTR lp) { return lp; }	
-
-
-
-	inline LPCOLESTR T2COLE(       LPCTSTR lp) { return lp; }
-	inline LPCTSTR OLE2CT(       LPCOLESTR lp) { return lp; }
-	inline LPOLESTR T2OLE(       LPTSTR lp) { return lp; }
-	inline LPTSTR OLE2T(       LPOLESTR lp) { return lp; }
-	inline LPOLESTR CharNextO(     LPCOLESTR lp) throw() {return CharNextW(lp);}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-	inline LPOLESTR W2OLE_EX(       LPWSTR lp, UINT) { return lp; }
-	inline LPOLESTR W2OLE_EX_DEF(       LPWSTR lp) { return lp; }
-	inline LPWSTR OLE2W_EX(       LPOLESTR lp, UINT) { return lp; }
-	inline LPWSTR OLE2W_EX_DEF(       LPOLESTR lp) { return lp; }
-	
-	
-	
-	
-	inline LPCOLESTR W2COLE_EX(       LPCWSTR lp, UINT) { return lp; }
-	inline LPCOLESTR W2COLE_EX_DEF(       LPCWSTR lp) { return lp; }
-	inline LPCWSTR OLE2CW_EX(       LPCOLESTR lp, UINT) { return lp; }
-	inline LPCWSTR OLE2CW_EX_DEF(       LPCOLESTR lp) { return lp; }
-	
-	
-	
-	
-
-
-
-	inline LPOLESTR W2OLE(       LPWSTR lp) { return lp; }
-	inline LPWSTR OLE2W(       LPOLESTR lp) { return lp; }
-	
-	
-	inline LPCOLESTR W2COLE(       LPCWSTR lp) { return lp; }
-	inline LPCWSTR OLE2CW(       LPCOLESTR lp) { return lp; }
-	
-	
-	
-
-
-
-
-	
-	
-	
-	
-	inline LPWSTR T2W_EX(       LPTSTR lp, UINT) { return lp; }
-	inline LPWSTR T2W_EX_DEF(       LPTSTR lp) { return lp; }
-	inline LPTSTR W2T_EX(       LPWSTR lp, UINT) { return lp; }
-	inline LPTSTR W2T_DEF(       LPWSTR lp) { return lp; }
-	
-	
-	
-	
-	inline LPCWSTR T2CW_EX(       LPCTSTR lp, UINT) { return lp; }
-	inline LPCWSTR T2CW_EX_DEF(       LPCTSTR lp) { return lp; }
-	inline LPCTSTR W2CT_EX(       LPCWSTR lp, UINT) { return lp; }
-	inline LPCTSTR W2CT_EX_DEF(       LPCWSTR lp) { return lp; }
-
-
-
-	
-	
-	inline LPWSTR T2W(       LPTSTR lp) { return lp; }
-	inline LPTSTR W2T(       LPWSTR lp) { return lp; }
-	
-	
-	inline LPCWSTR T2CW(       LPCTSTR lp) { return lp; }
-	inline LPCTSTR W2CT(       LPCWSTR lp) { return lp; }
-
-
-	
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-inline  BSTR A2WBSTR(       LPCSTR lp, int nLen = -1)
-{
-	if (lp == 0 || nLen == 0)
-		return 0;
-	int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
-	BSTR str = 0;
-	int nConvertedLen = MultiByteToWideChar(_acp_ex, 0, lp,
-		nLen, 0, 0);
-	int nAllocLen = nConvertedLen;
-	if (nLen == -1)
-		nAllocLen -= 1;  
-	str = ::SysAllocStringLen(0, nAllocLen);
-
-	if (str != 0)
-	{
-		int nResult;
-		nResult = MultiByteToWideChar(_acp_ex, 0, lp, nLen, str, nConvertedLen);
-		(void) ((!!((nResult == nConvertedLen))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 978, 0, L"nResult == nConvertedLen")) || (__debugbreak(), 0));
-		if(nResult != nConvertedLen)
-		{
-			SysFreeString(str);
-			return 0;
-		}
-
-	}
-	return str;
-}
-
-inline BSTR OLE2BSTR(       LPCOLESTR lp) {return ::SysAllocString(lp);}
-
-
-	inline BSTR T2BSTR_EX(       LPCTSTR lp) {return ::SysAllocString(lp);}
-	inline BSTR A2BSTR_EX(       LPCSTR lp) {return A2WBSTR(lp);}
-	inline BSTR W2BSTR_EX(       LPCWSTR lp) {return ::SysAllocString(lp);}
-
-
-
-	inline BSTR T2BSTR(       LPCTSTR lp) {return ::SysAllocString(lp);}
-	inline BSTR A2BSTR(       LPCSTR lp) {return A2WBSTR(lp);}
-	inline BSTR W2BSTR(       LPCWSTR lp) {return ::SysAllocString(lp);}
-	
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-inline LPDEVMODEW AtlDevModeA2W(     LPDEVMODEW lpDevModeW,      const DEVMODEA* lpDevModeA)
-{
-	int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
-	(void) ((!!((lpDevModeW != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1025, 0, L"lpDevModeW != 0")) || (__debugbreak(), 0));
-	if (lpDevModeA == 0 || lpDevModeW == 0)
-	{
-		return 0;
-	}
-
-	AtlA2WHelper(lpDevModeW->dmDeviceName, (LPCSTR)lpDevModeA->dmDeviceName, 32, _acp_ex);
-
-
-	if(0 != memcpy_s(&lpDevModeW->dmSpecVersion, (size_t)&reinterpret_cast<const volatile char&>((((DEVMODEW *)0)->dmFormName)) - (size_t)&reinterpret_cast<const volatile char&>((((DEVMODEW *)0)->dmSpecVersion)),
-		&lpDevModeA->dmSpecVersion, (size_t)&reinterpret_cast<const volatile char&>((((DEVMODEW *)0)->dmFormName)) - (size_t)&reinterpret_cast<const volatile char&>((((DEVMODEW *)0)->dmSpecVersion))))
-	{
-		return 0;
-	}
-
-
-
-
-
-	AtlA2WHelper(lpDevModeW->dmFormName, (LPCSTR)lpDevModeA->dmFormName, 32, _acp_ex);
-
-
-	if(0 != memcpy_s(&lpDevModeW->dmLogPixels, sizeof(DEVMODEW) - (size_t)&reinterpret_cast<const volatile char&>((((DEVMODEW *)0)->dmLogPixels)),
-		&lpDevModeA->dmLogPixels, sizeof(DEVMODEW) - (size_t)&reinterpret_cast<const volatile char&>((((DEVMODEW *)0)->dmLogPixels))))
-	{
-		return 0;
-	}
-
-
-
-
-
-	if (lpDevModeA->dmDriverExtra != 0)
-	{
-		
-#pragma warning(push)
-#pragma warning(disable:26000)
-
-		if(0 != memcpy_s(lpDevModeW+1, lpDevModeA->dmDriverExtra, lpDevModeA+1, lpDevModeA->dmDriverExtra))
-		{
-			return 0;
-		}
-
-
-
-#pragma warning(pop)
-	}
-	lpDevModeW->dmSize = sizeof(DEVMODEW);
-	return lpDevModeW;
-}
-
-inline LPTEXTMETRICW AtlTextMetricA2W(     LPTEXTMETRICW lptmW,      LPTEXTMETRICA lptmA)
-{
-	int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
-	(void) ((!!((lptmW != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1079, 0, L"lptmW != 0")) || (__debugbreak(), 0));
-	if (lptmA == 0 || lptmW == 0)
-		return 0;
-
-
-	if(0 != memcpy_s(lptmW, sizeof(LONG) * 11, lptmA, sizeof(LONG) * 11))
-	{
-		return 0;
-	}
-
-
-
-
-
-	if(0 != memcpy_s(&lptmW->tmItalic, sizeof(BYTE) * 5, &lptmA->tmItalic, sizeof(BYTE) * 5))
-	{
-		return 0;
-	}
-
-
-
-
-	if(MultiByteToWideChar(_acp_ex, 0, (LPCSTR)&lptmA->tmFirstChar, 1, &lptmW->tmFirstChar, 1) == 0)
-	{
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1103, 0, L"0")) || (__debugbreak(), 0));
-		return 0;
-	}
-		
-	if(MultiByteToWideChar(_acp_ex, 0, (LPCSTR)&lptmA->tmLastChar, 1, &lptmW->tmLastChar, 1) == 0)
-	{
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1109, 0, L"0")) || (__debugbreak(), 0));
-		return 0;
-	}
-		
-	if(MultiByteToWideChar(_acp_ex, 0, (LPCSTR)&lptmA->tmDefaultChar, 1, &lptmW->tmDefaultChar, 1)== 0)
-	{
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1115, 0, L"0")) || (__debugbreak(), 0));
-		return 0;
-	}
-		
-	if(MultiByteToWideChar(_acp_ex, 0, (LPCSTR)&lptmA->tmBreakChar, 1, &lptmW->tmBreakChar, 1) == 0)
-	{
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1121, 0, L"0")) || (__debugbreak(), 0));
-		return 0;
-	}
-	
-	return lptmW;
-}
-
-inline LPTEXTMETRICA AtlTextMetricW2A(     LPTEXTMETRICA lptmA,      LPTEXTMETRICW lptmW)
-{
-	int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
-	(void) ((!!((lptmA != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1131, 0, L"lptmA != 0")) || (__debugbreak(), 0));
-	if (lptmW == 0 || lptmA == 0)
-	{
-		return 0;
-	}
-
-
-	if(0 != memcpy_s(lptmA, sizeof(LONG) * 11, lptmW, sizeof(LONG) * 11))
-	{
-		return 0;
-	}
-
-
-
-
-
-	if(0 != memcpy_s(&lptmA->tmItalic, sizeof(BYTE) * 5, &lptmW->tmItalic, sizeof(BYTE) * 5))
-	{
-		return 0;
-	}
-
-
-
-	
-	if(WideCharToMultiByte(_acp_ex, 0, &lptmW->tmFirstChar, 1, (LPSTR)&lptmA->tmFirstChar, 1, 0, 0) == 0)
-	{
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1157, 0, L"0")) || (__debugbreak(), 0));
-		return 0;
-	}
-
-	if(WideCharToMultiByte(_acp_ex, 0, &lptmW->tmLastChar, 1, (LPSTR)&lptmA->tmLastChar, 1, 0, 0) == 0)
-	{
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1163, 0, L"0")) || (__debugbreak(), 0));
-		return 0;
-	}
-
-	if(WideCharToMultiByte(_acp_ex, 0, &lptmW->tmDefaultChar, 1, (LPSTR)&lptmA->tmDefaultChar, 1, 0, 0) == 0)
-	{
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1169, 0, L"0")) || (__debugbreak(), 0));
-		return 0;
-	}
-
-	if(WideCharToMultiByte(_acp_ex, 0, &lptmW->tmBreakChar, 1, (LPSTR)&lptmA->tmBreakChar, 1, 0, 0) == 0)
-	{
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1175, 0, L"0")) || (__debugbreak(), 0));
-		return 0;
-	}
-
-	return lptmA;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-	inline LPDEVMODEW DEVMODEOLE2T_EX(LPDEVMODEW lp) { return lp; }
-	inline LPDEVMODEW DEVMODET2OLE_EX(LPDEVMODEW lp) { return lp; }
-	inline LPTEXTMETRICW TEXTMETRICOLE2T_EX(LPTEXTMETRICW lp) { return lp; }
-	inline LPTEXTMETRICW TEXTMETRICT2OLE_EX(LPTEXTMETRICW lp) { return lp; }
-
-	inline LPDEVMODEW DEVMODEOLE2T(LPDEVMODEW lp) { return lp; }
-	inline LPDEVMODEW DEVMODET2OLE(LPDEVMODEW lp) { return lp; }
-	inline LPTEXTMETRICW TEXTMETRICOLE2T(LPTEXTMETRICW lp) { return lp; }
-	inline LPTEXTMETRICW TEXTMETRICT2OLE(LPTEXTMETRICW lp) { return lp; }
-
-	
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning (pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma pack(push,8)
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) FILE * __cdecl __iob_func(void);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef __int64 fpos_t;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport)  int __cdecl _filbuf(     FILE * _File );
-__declspec(dllimport)  int __cdecl _flsbuf(     int _Ch,      FILE * _File);
-
-
-
-
-__declspec(dllimport)  FILE * __cdecl _fsopen(       const char * _Filename,        const char * _Mode,      int _ShFlag);
-
-
-__declspec(dllimport) void __cdecl clearerr(     FILE * _File);
-__declspec(dllimport)  errno_t __cdecl clearerr_s(     FILE * _File );
-__declspec(dllimport)  int __cdecl fclose(     FILE * _File);
-__declspec(dllimport)  int __cdecl _fcloseall(void);
-
-
-
-
-__declspec(dllimport)  FILE * __cdecl _fdopen(     int _FileHandle,        const char * _Mode);
-
-
-__declspec(dllimport)  int __cdecl feof(     FILE * _File);
-__declspec(dllimport)  int __cdecl ferror(     FILE * _File);
-__declspec(dllimport)  int __cdecl fflush(       FILE * _File);
-__declspec(dllimport)  int __cdecl fgetc(     FILE * _File);
-__declspec(dllimport)  int __cdecl _fgetchar(void);
-__declspec(dllimport)  int __cdecl fgetpos(     FILE * _File ,      fpos_t * _Pos);
-__declspec(dllimport)  char * __cdecl fgets(       char * _Buf,      int _MaxCount,      FILE * _File);
-
-
-
-
-__declspec(dllimport)  int __cdecl _fileno(     FILE * _File);
-
-
-
-
-
-
-
-__declspec(dllimport)  char * __cdecl _tempnam(         const char * _DirName,          const char * _FilePrefix);
-
-
-
-
-
-__declspec(dllimport)  int __cdecl _flushall(void);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "fopen_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  FILE * __cdecl fopen(       const char * _Filename,        const char * _Mode);
-
-__declspec(dllimport)  errno_t __cdecl fopen_s(                  FILE ** _File,        const char * _Filename,        const char * _Mode);
-
-__declspec(dllimport)  int __cdecl fprintf(     FILE * _File,         const char * _Format, ...);
-__declspec(dllimport)  int __cdecl fprintf_s(     FILE * _File,         const char * _Format, ...);
-__declspec(dllimport)  int __cdecl fputc(     int _Ch,      FILE * _File);
-__declspec(dllimport)  int __cdecl _fputchar(     int _Ch);
-__declspec(dllimport)  int __cdecl fputs(       const char * _Str,      FILE * _File);
-__declspec(dllimport)  size_t __cdecl fread(     void * _DstBuf,      size_t _ElementSize,      size_t _Count,      FILE * _File);
-__declspec(dllimport)  size_t __cdecl fread_s(     void * _DstBuf,      size_t _DstSize,      size_t _ElementSize,      size_t _Count,      FILE * _File);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "freopen_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  FILE * __cdecl freopen(       const char * _Filename,        const char * _Mode,      FILE * _File);
-
-__declspec(dllimport)  errno_t __cdecl freopen_s(                  FILE ** _File,        const char * _Filename,        const char * _Mode,      FILE * _OldFile);
-
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "fscanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl fscanf(     FILE * _File,         const char * _Format, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_fscanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _fscanf_l(     FILE * _File,         const char * _Format,        _locale_t _Locale, ...);
-
-__declspec(dllimport)  int __cdecl fscanf_s(     FILE * _File,         const char * _Format, ...);
-
-__declspec(dllimport)  int __cdecl _fscanf_s_l(     FILE * _File,         const char * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl fsetpos(     FILE * _File,      const fpos_t * _Pos);
-__declspec(dllimport)  int __cdecl fseek(     FILE * _File,      long _Offset,      int _Origin);
-__declspec(dllimport)  long __cdecl ftell(     FILE * _File);
-
-__declspec(dllimport)  int __cdecl _fseeki64(     FILE * _File,      __int64 _Offset,      int _Origin);
-__declspec(dllimport)  __int64 __cdecl _ftelli64(     FILE * _File);
-
-__declspec(dllimport)  size_t __cdecl fwrite(       const void * _Str,      size_t _Size,      size_t _Count,      FILE * _File);
-__declspec(dllimport)  int __cdecl getc(     FILE * _File);
-__declspec(dllimport)  int __cdecl getchar(void);
-__declspec(dllimport)  int __cdecl _getmaxstdio(void);
-
-__declspec(dllimport) char * __cdecl gets_s(       char * _Buf,      rsize_t _Size);
-
-extern "C++" { template <size_t _Size> inline char * __cdecl gets_s(     char (&_Buffer)[_Size]) { return gets_s(_Buffer, _Size); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "gets_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl gets( char *_Buffer);
- int __cdecl _getw(     FILE * _File);
-
-
-
-
-__declspec(dllimport)  int __cdecl _pclose(     FILE * _File);
-__declspec(dllimport)  FILE * __cdecl _popen(       const char * _Command,        const char * _Mode);
-__declspec(dllimport)  int __cdecl printf(        const char * _Format, ...);
-__declspec(dllimport)  int __cdecl printf_s(        const char * _Format, ...);
-__declspec(dllimport)  int __cdecl putc(     int _Ch,      FILE * _File);
-__declspec(dllimport)  int __cdecl putchar(     int _Ch);
-__declspec(dllimport)  int __cdecl puts(       const char * _Str);
-__declspec(dllimport)  int __cdecl _putw(     int _Word,      FILE * _File);
-
-
-__declspec(dllimport)  int __cdecl remove(       const char * _Filename);
-__declspec(dllimport)  int __cdecl rename(       const char * _OldFilename,        const char * _NewFilename);
-__declspec(dllimport)  int __cdecl _unlink(       const char * _Filename);
-
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_unlink" ". See online help for details.")) __declspec(dllimport)  int __cdecl unlink(       const char * _Filename);
-
-
-__declspec(dllimport) void __cdecl rewind(     FILE * _File);
-__declspec(dllimport)  int __cdecl _rmtmp(void);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "scanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl scanf(        const char * _Format, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_scanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _scanf_l(        const char * _Format,        _locale_t _Locale, ...);
-
-__declspec(dllimport)  int __cdecl scanf_s(        const char * _Format, ...);
-
-__declspec(dllimport)  int __cdecl _scanf_s_l(        const char * _Format,        _locale_t _Locale, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "setvbuf" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) void __cdecl setbuf(     FILE * _File,              char * _Buffer);
-__declspec(dllimport)  int __cdecl _setmaxstdio(     int _Max);
-__declspec(dllimport)  unsigned int __cdecl _set_output_format(     unsigned int _Format);
-__declspec(dllimport)  unsigned int __cdecl _get_output_format(void);
-__declspec(dllimport)  int __cdecl setvbuf(     FILE * _File,          char * _Buf,      int _Mode,      size_t _Size);
-__declspec(dllimport)  int __cdecl _snprintf_s(       char * _DstBuf,      size_t _DstSize,      size_t _MaxCount,         const char * _Format, ...);
-extern "C++" { __pragma(warning(push)); __pragma(warning(disable: 4793)); template <size_t _Size> inline int __cdecl _snprintf_s(     char (&_Dest)[_Size],      size_t _Size,         const char * _Format, ...) { va_list _ArgList; ( _ArgList = (va_list)( &reinterpret_cast<const char &>(_Format) ) + ( (sizeof(_Format) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) ); return _vsnprintf_s(_Dest, _Size, _Size, _Format, _ArgList); } __pragma(warning(pop)); }
-__declspec(dllimport)  int __cdecl sprintf_s(       char * _DstBuf,      size_t _DstSize,         const char * _Format, ...);
-extern "C++" { __pragma(warning(push)); __pragma(warning(disable: 4793)); template <size_t _Size> inline int __cdecl sprintf_s(     char (&_Dest)[_Size],         const char * _Format, ...) { va_list _ArgList; ( _ArgList = (va_list)( &reinterpret_cast<const char &>(_Format) ) + ( (sizeof(_Format) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) ); return vsprintf_s(_Dest, _Size, _Format, _ArgList); } __pragma(warning(pop)); }
-__declspec(dllimport)  int __cdecl _scprintf(        const char * _Format, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "sscanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl sscanf(       const char * _Src,         const char * _Format, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_sscanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _sscanf_l(       const char * _Src,         const char * _Format,        _locale_t _Locale, ...);
-
-__declspec(dllimport)  int __cdecl sscanf_s(       const char * _Src,         const char * _Format, ...);
-
-__declspec(dllimport)  int __cdecl _sscanf_s_l(       const char * _Src,         const char * _Format,        _locale_t _Locale, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_snscanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _snscanf(         const char * _Src,      size_t _MaxCount,         const char * _Format, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_snscanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _snscanf_l(         const char * _Src,      size_t _MaxCount,         const char * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _snscanf_s(         const char * _Src,      size_t _MaxCount,         const char * _Format, ...);
-__declspec(dllimport)  int __cdecl _snscanf_s_l(         const char * _Src,      size_t _MaxCount,         const char * _Format,        _locale_t _Locale, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "tmpfile_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  FILE * __cdecl tmpfile(void);
-
-__declspec(dllimport)  errno_t __cdecl tmpfile_s(                FILE ** _File);
-__declspec(dllimport)  errno_t __cdecl tmpnam_s(       char * _Buf,      rsize_t _Size);
-
-extern "C++" { template <size_t _Size> inline errno_t __cdecl tmpnam_s(       char (&_Buf)[_Size]) { return tmpnam_s(_Buf, _Size); } }
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "tmpnam_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl tmpnam( char *_Buffer);
-__declspec(dllimport)  int __cdecl ungetc(     int _Ch,      FILE * _File);
-__declspec(dllimport)  int __cdecl vfprintf(     FILE * _File,         const char * _Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl vfprintf_s(     FILE * _File,         const char * _Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl vprintf(        const char * _Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl vprintf_s(        const char * _Format, va_list _ArgList);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "vsnprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl vsnprintf(     char * _DstBuf,      size_t _MaxCount,         const char * _Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl vsnprintf_s(       char * _DstBuf,      size_t _DstSize,      size_t _MaxCount,         const char * _Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vsnprintf_s(       char * _DstBuf,      size_t _DstSize,      size_t _MaxCount,         const char * _Format, va_list _ArgList);
-extern "C++" { template <size_t _Size> inline int __cdecl _vsnprintf_s(     char (&_Dest)[_Size],      size_t _Size,         const char * _Format, va_list _Args) { return _vsnprintf_s(_Dest, _Size, _Size, _Format, _Args); } }
-#pragma warning(push)
-#pragma warning(disable:4793)
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_snprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) int __cdecl _snprintf(     char *_Dest,      size_t _Count,         const char * _Format, ...); __declspec(deprecated("This function or variable may be unsafe. Consider using " "_vsnprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) int __cdecl _vsnprintf(     char *_Dest,      size_t _Count,         const char * _Format, va_list _Args);
-#pragma warning(pop)
-__declspec(dllimport) int __cdecl vsprintf_s(       char * _DstBuf,      size_t _Size,         const char * _Format, va_list _ArgList);
-extern "C++" { template <size_t _Size> inline int __cdecl vsprintf_s(     char (&_Dest)[_Size],         const char * _Format, va_list _Args) { return vsprintf_s(_Dest, _Size, _Format, _Args); } }
-#pragma warning(push)
-#pragma warning(disable:4793)
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "sprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) int __cdecl sprintf( char *_Dest,  const char * _Format, ...); __declspec(deprecated("This function or variable may be unsafe. Consider using " "vsprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) int __cdecl vsprintf( char *_Dest,  const char * _Format, va_list _Args);
-#pragma warning(pop)
-__declspec(dllimport)  int __cdecl _vscprintf(        const char * _Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _snprintf_c(     char * _DstBuf,      size_t _MaxCount,         const char * _Format, ...);
-__declspec(dllimport)  int __cdecl _vsnprintf_c(     char *_DstBuf,      size_t _MaxCount,         const char * _Format, va_list _ArgList);
-
-__declspec(dllimport)  int __cdecl _fprintf_p(     FILE * _File,         const char * _Format, ...);
-__declspec(dllimport)  int __cdecl _printf_p(        const char * _Format, ...);
-__declspec(dllimport)  int __cdecl _sprintf_p(       char * _Dst,      size_t _MaxCount,         const char * _Format, ...);
-__declspec(dllimport)  int __cdecl _vfprintf_p(     FILE * _File,         const char * _Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vprintf_p(        const char * _Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vsprintf_p(       char * _Dst,      size_t _MaxCount,         const char * _Format, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _scprintf_p(        const char * _Format, ...);
-__declspec(dllimport)  int __cdecl _vscprintf_p(        const char * _Format, va_list _ArgList);
-__declspec(dllimport) int __cdecl _set_printf_count_output(     int _Value);
-__declspec(dllimport) int __cdecl _get_printf_count_output();
-
-__declspec(dllimport)  int __cdecl _printf_l(        const char * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _printf_p_l(        const char * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _printf_s_l(        const char * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _vprintf_l(        const char * _Format,        _locale_t _Locale, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vprintf_p_l(        const char * _Format,        _locale_t _Locale, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vprintf_s_l(        const char * _Format,        _locale_t _Locale, va_list _ArgList);
-
-__declspec(dllimport)  int __cdecl _fprintf_l(     FILE * _File,         const char * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _fprintf_p_l(     FILE * _File,         const char * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _fprintf_s_l(     FILE * _File,         const char * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _vfprintf_l(     FILE * _File,        const char * _Format,        _locale_t _Locale, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vfprintf_p_l(     FILE * _File,        const char * _Format,        _locale_t _Locale, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vfprintf_s_l(     FILE * _File,        const char * _Format,        _locale_t _Locale, va_list _ArgList);
-
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_sprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _sprintf_l(     char * _DstBuf,         const char * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _sprintf_p_l(       char * _DstBuf,      size_t _MaxCount,         const char * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _sprintf_s_l(       char * _DstBuf,      size_t _DstSize,         const char * _Format,        _locale_t _Locale, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_vsprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _vsprintf_l(     char * _DstBuf,        const char * _Format,        _locale_t, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vsprintf_p_l(       char * _DstBuf,      size_t _MaxCount,         const char* _Format,        _locale_t _Locale,  va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vsprintf_s_l(       char * _DstBuf,      size_t _DstSize,         const char * _Format,        _locale_t _Locale, va_list _ArgList);
-
-__declspec(dllimport)  int __cdecl _scprintf_l(        const char * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _scprintf_p_l(        const char * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _vscprintf_l(        const char * _Format,        _locale_t _Locale, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vscprintf_p_l(        const char * _Format,        _locale_t _Locale, va_list _ArgList);
-
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_snprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _snprintf_l(     char * _DstBuf,      size_t _MaxCount,         const char * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _snprintf_c_l(     char * _DstBuf,      size_t _MaxCount,         const char * _Format,        _locale_t _Locale, ...);
-__declspec(dllimport)  int __cdecl _snprintf_s_l(       char * _DstBuf,      size_t _DstSize,      size_t _MaxCount,         const char * _Format,        _locale_t _Locale, ...);
-__declspec(deprecated("This function or variable may be unsafe. Consider using " "_vsnprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _vsnprintf_l(     char * _DstBuf,      size_t _MaxCount,         const char * _Format,        _locale_t _Locale, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vsnprintf_c_l(     char * _DstBuf,      size_t _MaxCount, const char *,        _locale_t _Locale, va_list _ArgList);
-__declspec(dllimport)  int __cdecl _vsnprintf_s_l(       char * _DstBuf,      size_t _DstSize,      size_t _MaxCount,         const char* _Format,       _locale_t _Locale, va_list _ArgList);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) void __cdecl _lock_file(     FILE * _File);
-__declspec(dllimport) void __cdecl _unlock_file(     FILE * _File);
-
-
-
-
-
-
-__declspec(dllimport)  int __cdecl _fclose_nolock(     FILE * _File);
-__declspec(dllimport)  int __cdecl _fflush_nolock(       FILE * _File);
-__declspec(dllimport)  size_t __cdecl _fread_nolock(     void * _DstBuf,      size_t _ElementSize,      size_t _Count,      FILE * _File);
-__declspec(dllimport)  size_t __cdecl _fread_nolock_s(     void * _DstBuf,      size_t _DstSize,      size_t _ElementSize,      size_t _Count,      FILE * _File);
-__declspec(dllimport)  int __cdecl _fseek_nolock(     FILE * _File,      long _Offset,      int _Origin);
-__declspec(dllimport)  long __cdecl _ftell_nolock(     FILE * _File);
-__declspec(dllimport)  int __cdecl _fseeki64_nolock(     FILE * _File,      __int64 _Offset,      int _Origin);
-__declspec(dllimport)  __int64 __cdecl _ftelli64_nolock(     FILE * _File);
-__declspec(dllimport)  size_t __cdecl _fwrite_nolock(       const void * _DstBuf,      size_t _Size,      size_t _Count,      FILE * _File);
-__declspec(dllimport)  int __cdecl _ungetc_nolock(     int _Ch,      FILE * _File);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_tempnam" ". See online help for details.")) __declspec(dllimport) char * __cdecl tempnam(         const char * _Directory,          const char * _FilePrefix);
-
-
-
-
-
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_fcloseall" ". See online help for details.")) __declspec(dllimport)  int __cdecl fcloseall(void);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_fdopen" ". See online help for details.")) __declspec(dllimport)  FILE * __cdecl fdopen(     int _FileHandle,         const char * _Format);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_fgetchar" ". See online help for details.")) __declspec(dllimport)  int __cdecl fgetchar(void);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_fileno" ". See online help for details.")) __declspec(dllimport)  int __cdecl fileno(     FILE * _File);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_flushall" ". See online help for details.")) __declspec(dllimport)  int __cdecl flushall(void);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_fputchar" ". See online help for details.")) __declspec(dllimport)  int __cdecl fputchar(     int _Ch);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_getw" ". See online help for details.")) __declspec(dllimport)  int __cdecl getw(     FILE * _File);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_putw" ". See online help for details.")) __declspec(dllimport)  int __cdecl putw(     int _Ch,      FILE * _File);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_rmtmp" ". See online help for details.")) __declspec(dllimport)  int __cdecl rmtmp(void);
-
-
-
-
-}
-
-
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-#pragma pack(push,8)
-namespace ATL
-{
-extern "C" {
-
-
-
-typedef enum ATLTRACESTATUS
-{
-	ATLTRACESTATUS_INHERIT, ATLTRACESTATUS_ENABLED, ATLTRACESTATUS_DISABLED
-} ATLTRACESTATUS;
-
-DWORD_PTR __stdcall AtlTraceOpenProcess( DWORD idProcess );
-void __stdcall AtlTraceCloseProcess( DWORD_PTR dwProcess );
-void __stdcall AtlTraceSnapshotProcess( DWORD_PTR dwProcess );
-
-DWORD_PTR __stdcall AtlTraceRegister(HINSTANCE hInst,
-	int (__cdecl *fnCrtDbgReport)(int,const char *,int,const char *,const char *,...));
-BOOL __stdcall AtlTraceUnregister(DWORD_PTR dwModule);
-
-DWORD_PTR __stdcall AtlTraceRegisterCategoryA(DWORD_PTR dwModule, const CHAR szCategoryName[64]);
-DWORD_PTR __stdcall AtlTraceRegisterCategoryU(DWORD_PTR dwModule, const WCHAR szCategoryName[64]);
-
-BOOL __stdcall AtlTraceModifyProcess(DWORD_PTR dwProcess, UINT nLevel, BOOL bEnabled, BOOL bFuncAndCategoryNames, BOOL bFileNameAndLineNo);
-BOOL __stdcall AtlTraceModifyModule(DWORD_PTR dwProcess, DWORD_PTR dwModule, UINT nLevel, ATLTRACESTATUS eStatus);
-BOOL __stdcall AtlTraceModifyCategory(DWORD_PTR dwProcess, DWORD_PTR dwCategory, UINT nLevel, ATLTRACESTATUS eStatus);
-BOOL __stdcall AtlTraceGetProcess(DWORD_PTR dwProcess, UINT *pnLevel, BOOL *pbEnabled, BOOL *pbFuncAndCategoryNames, BOOL *pbFileNameAndLineNo);
-BOOL __stdcall AtlTraceGetModule(DWORD_PTR dwProcess, DWORD_PTR dwModule, UINT *pnLevel, ATLTRACESTATUS *pStatus);
-BOOL __stdcall AtlTraceGetCategory(DWORD_PTR dwProcess, DWORD_PTR dwCategory, UINT *pnLevel, ATLTRACESTATUS *pStatus);
-
-__declspec(deprecated("AtlTraceGetUpdateEventNameA is unsafe. Instead use AtlTraceGetUpdateEventNameA_s")) 
-void __stdcall AtlTraceGetUpdateEventNameA(     CHAR *pszEventName);
-__declspec(deprecated("AtlTraceGetUpdateEventNameU is unsafe. Instead use AtlTraceGetUpdateEventNameU_s")) 
-void __stdcall AtlTraceGetUpdateEventNameU(     WCHAR *pszEventName);
-
-void __stdcall AtlTraceGetUpdateEventNameA_s(       CHAR *pszEventName,      size_t cchEventName);
-void __stdcall AtlTraceGetUpdateEventNameU_s(       WCHAR *pszEventName,      size_t cchEventName);
-
-void __cdecl AtlTraceVA(DWORD_PTR dwModule, const char *pszFileName, int nLineNo,
-						DWORD_PTR dwCategory, UINT nLevel, const CHAR *pszFormat, va_list ptr);
-void __cdecl AtlTraceVU(DWORD_PTR dwModule,const char *pszFileName, int nLineNo,
-						DWORD_PTR dwCategory, UINT nLevel, const WCHAR *pszFormat, va_list ptr);
-
-BOOL __stdcall AtlTraceLoadSettingsA(const CHAR *pszFileName, DWORD_PTR dwProcess = 0);
-BOOL __stdcall AtlTraceLoadSettingsU(const WCHAR *pszFileName, DWORD_PTR dwProcess = 0);
-BOOL __stdcall AtlTraceSaveSettingsA(const CHAR *pszFileName, DWORD_PTR dwProcess = 0);
-BOOL __stdcall AtlTraceSaveSettingsU(const WCHAR *pszFileName, DWORD_PTR dwProcess = 0);
-
-typedef struct ATLTRACESETTINGS
-{
-	UINT nLevel;
-	ATLTRACESTATUS eStatus;
-} ATLTRACESETTINGS;
-
-typedef struct ATLTRACEPROCESSSETTINGS
-{
-	UINT nLevel;
-	BOOL bEnabled, bFuncAndCategoryNames, bFileNameAndLineNo;
-} ATLTRACEPROCESSSETTINGS;
-
-typedef struct ATLTRACEPROCESSINFO
-{
-	WCHAR szName[64], szPath[260];
-	DWORD dwId;
-	ATLTRACEPROCESSSETTINGS settings;
-	int nModules;
-} ATLTRACEPROCESSINFO;
-
-typedef struct ATLTRACEMODULEINFO
-{
-	WCHAR szName[64], szPath[260];
-	ATLTRACESETTINGS settings;
-	DWORD_PTR dwModule;
-	int nCategories;
-} ATLTRACEMODULEINFO;
-
-typedef struct ATLTRACECATEGORYINFO
-{
-	WCHAR szName[64];
-	ATLTRACESETTINGS settings;
-	DWORD_PTR dwCategory;
-} ATLTRACECATEGORYINFO;
-
-BOOL __stdcall AtlTraceGetProcessInfo(DWORD_PTR dwProcess, ATLTRACEPROCESSINFO* pProcessInfo);
-void __stdcall AtlTraceGetModuleInfo(DWORD_PTR dwProcess, int iModule, ATLTRACEMODULEINFO* pModuleInfo);
-void __stdcall AtlTraceGetCategoryInfo(DWORD_PTR dwProcess, DWORD_PTR dwModule, int iCategory, ATLTRACECATEGORYINFO* pAtlTraceCategoryInfo);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-};
-
-};  
-#pragma pack(pop)
-
-
-
-
-
-extern "C" IMAGE_DOS_HEADER __ImageBase;
-
- 
-
-#pragma pack(push,8)
-namespace ATL
-{
-
-
-class CTraceCategory
-{
-public:
-	explicit CTraceCategory( LPCTSTR pszCategoryName, UINT nStartingLevel = 0 ) throw();
-
-
-	UINT GetLevel() const throw();
-	void SetLevel( UINT nLevel ) throw();
-	ATLTRACESTATUS GetStatus() const throw();
-	void SetStatus( ATLTRACESTATUS eStatus) throw();
-
-
-	operator DWORD_PTR() const throw();
-
-public:
-
-	DWORD_PTR m_dwCategory;
-
-};
-
-
-
-class CTrace
-{
-public:
-	typedef int (__cdecl *fnCrtDbgReport_t)(int,const char *,int,const char *,const char *,...);
-
-private:
-	CTrace(
-
-
-
-		fnCrtDbgReport_t pfnCrtDbgReport = _CrtDbgReport)
-
-		: m_hInst(reinterpret_cast<HINSTANCE>(&__ImageBase)),
-			m_dwModule( 0 )
-	{
-		m_dwModule = AtlTraceRegister(m_hInst, pfnCrtDbgReport);
-	}
-
-	~CTrace()
-	{
-		AtlTraceUnregister(m_dwModule);
-	}
-
-public:
-	bool ChangeCategory(DWORD_PTR dwCategory, UINT nLevel, ATLTRACESTATUS eStatus)
-	{
-		return 0 !=
-			AtlTraceModifyCategory(0, dwCategory, nLevel, eStatus);
-	}
-
-	bool GetCategory(DWORD_PTR dwCategory, UINT *pnLevel, ATLTRACESTATUS *peStatus)
-	{
-		(void) ((!!((pnLevel && peStatus))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atltrace.h", 90, 0, L"pnLevel && peStatus")) || (__debugbreak(), 0));
-		return 0 != AtlTraceGetCategory(0, dwCategory, pnLevel, peStatus);
-	}
-	UINT GetLevel()
-	{
-		ATLTRACESTATUS eStatus;
-		UINT nLevel;
-		AtlTraceGetModule(0, m_dwModule, &nLevel, &eStatus);
-
-		return nLevel;
-	}
-	void SetLevel(UINT nLevel)
-	{
-		AtlTraceModifyModule(0, m_dwModule, nLevel, ATLTRACESTATUS_ENABLED);
-	}
-	ATLTRACESTATUS GetStatus()
-	{
-		ATLTRACESTATUS eStatus;
-		UINT nLevel;
-		AtlTraceGetModule(0, m_dwModule, &nLevel, &eStatus);
-
-		return eStatus;
-	}
-	void SetStatus(ATLTRACESTATUS eStatus)
-	{
-		ATLTRACESTATUS eOldStatus;
-		UINT nLevel;
-		AtlTraceGetModule(0, m_dwModule, &nLevel, &eOldStatus);
-		AtlTraceModifyModule(0, m_dwModule, nLevel, eStatus);
-	}
-	void __cdecl TraceV(const char *pszFileName, int nLine,
-		DWORD_PTR dwCategory, UINT nLevel, LPCSTR pszFmt, va_list args) const;
-	void __cdecl TraceV(const char *pszFileName, int nLine,
-		DWORD_PTR dwCategory, UINT nLevel, LPCWSTR pszFmt, va_list args) const;
-
-	DWORD_PTR RegisterCategory(LPCSTR pszCategory)
-		{return(AtlTraceRegisterCategoryA(m_dwModule, pszCategory));}
-
-	DWORD_PTR RegisterCategory(LPCWSTR pszCategory)
-		{return(AtlTraceRegisterCategoryU(m_dwModule, pszCategory));}
-
-
-	bool LoadSettings(LPCTSTR pszFileName = 0) const
-		{return 0 != AtlTraceLoadSettingsU(pszFileName);}
-	void SaveSettings(LPCTSTR pszFileName = 0) const
-		{AtlTraceSaveSettingsU(pszFileName);}
-
-public:
-	static CTrace s_trace;
-
-protected:
-	HINSTANCE m_hInst;
-	DWORD_PTR m_dwModule;
-};
-
-    inline void __cdecl CTrace::TraceV(const char *pszFileName, int nLine,
-		DWORD_PTR dwCategory, UINT nLevel, LPCSTR pszFmt, va_list args) const
-	{
-		AtlTraceVA(m_dwModule, pszFileName, nLine, dwCategory, nLevel, pszFmt, args);
-	}
-	inline void __cdecl CTrace::TraceV(const char *pszFileName, int nLine,
-		DWORD_PTR dwCategory, UINT nLevel, LPCWSTR pszFmt, va_list args) const
-	{
-		AtlTraceVU(m_dwModule, pszFileName, nLine, dwCategory, nLevel, pszFmt, args);
-	}
-
-extern CTraceCategory atlTraceGeneral;
-
-class CTraceFileAndLineInfo
-{
-public:
-	CTraceFileAndLineInfo(const char *pszFileName, int nLineNo)
-		: m_pszFileName(pszFileName), m_nLineNo(nLineNo)
-	{}
-
-#pragma warning(push)
-#pragma warning(disable : 4793)
-	void __cdecl operator()(DWORD_PTR dwCategory, UINT nLevel, const char *pszFmt, ...) const
-	{
-		va_list ptr; ( ptr = (va_list)( &reinterpret_cast<const char &>(pszFmt) ) + ( (sizeof(pszFmt) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
-		ATL::CTrace::s_trace.TraceV(m_pszFileName, m_nLineNo, dwCategory, nLevel, pszFmt, ptr);
-		( ptr = (va_list)0 );
-	}
-#pragma warning(pop)
-
-#pragma warning(push)
-#pragma warning(disable : 4793)
-	void __cdecl operator()(DWORD_PTR dwCategory, UINT nLevel, const wchar_t *pszFmt, ...) const
-	{
-		va_list ptr; ( ptr = (va_list)( &reinterpret_cast<const char &>(pszFmt) ) + ( (sizeof(pszFmt) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
-		ATL::CTrace::s_trace.TraceV(m_pszFileName, m_nLineNo, dwCategory, nLevel, pszFmt, ptr);
-		( ptr = (va_list)0 );
-	}
-#pragma warning(pop)
-
-#pragma warning(push)
-#pragma warning(disable : 4793)
-	void __cdecl operator()(const char *pszFmt, ...) const
-	{
-		va_list ptr; ( ptr = (va_list)( &reinterpret_cast<const char &>(pszFmt) ) + ( (sizeof(pszFmt) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
-		ATL::CTrace::s_trace.TraceV(m_pszFileName, m_nLineNo, atlTraceGeneral, 0, pszFmt, ptr);
-		( ptr = (va_list)0 );
-	}
-#pragma warning(pop)
-
-#pragma warning(push)
-#pragma warning(disable : 4793)
-	void __cdecl operator()(const wchar_t *pszFmt, ...) const
-	{
-		va_list ptr; ( ptr = (va_list)( &reinterpret_cast<const char &>(pszFmt) ) + ( (sizeof(pszFmt) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
-		ATL::CTrace::s_trace.TraceV(m_pszFileName, m_nLineNo, atlTraceGeneral, 0, pszFmt, ptr);
-		( ptr = (va_list)0 );
-	}
-#pragma warning(pop)
-
-private:
-	
-	CTraceFileAndLineInfo &__cdecl operator=(const CTraceFileAndLineInfo &right);
-
-	const char *const m_pszFileName;
-	const int m_nLineNo;
-};
-
-
-
-
-
-inline CTraceCategory::CTraceCategory( LPCTSTR pszCategoryName, UINT nStartingLevel ) throw() :
-	m_dwCategory( 0 )
-{
-	m_dwCategory = ATL::CTrace::s_trace.RegisterCategory( pszCategoryName );
-	ATL::CTrace::s_trace.ChangeCategory( m_dwCategory, nStartingLevel, ATLTRACESTATUS_INHERIT);
-}
-
-inline CTraceCategory::operator DWORD_PTR() const throw()
-{
-	return( m_dwCategory );
-}
-
-inline UINT CTraceCategory::GetLevel() const throw()
-{
-	UINT nLevel;
-	ATLTRACESTATUS eStatus;
-	ATL::CTrace::s_trace.GetCategory( m_dwCategory, &nLevel, &eStatus );
-
-	return( nLevel );
-}
-
-inline void CTraceCategory::SetLevel( UINT nLevel ) throw()
-{
-	ATL::CTrace::s_trace.ChangeCategory( m_dwCategory, nLevel, ATLTRACESTATUS_ENABLED );
-}
-
-inline ATLTRACESTATUS CTraceCategory::GetStatus() const throw()
-{
-	UINT nLevel;
-	ATLTRACESTATUS eStatus;
-	ATL::CTrace::s_trace.GetCategory( m_dwCategory, &nLevel, &eStatus );
-
-	return( eStatus );
-}
-
-inline void CTraceCategory::SetStatus( ATLTRACESTATUS eStatus ) throw()
-{
-	UINT nLevel;
-	ATLTRACESTATUS eOldStatus;
-	ATL::CTrace::s_trace.GetCategory( m_dwCategory, &nLevel, &eOldStatus );
-	ATL::CTrace::s_trace.ChangeCategory( m_dwCategory, nLevel, eStatus );
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}  
- 
-namespace ATL
-{
-
-
-
-
-
-
-
-extern ATL::CTraceCategory atlTraceGeneral;
-extern ATL::CTraceCategory atlTraceCOM;  
-extern ATL::CTraceCategory atlTraceQI;	
-extern ATL::CTraceCategory atlTraceRegistrar;
-extern ATL::CTraceCategory atlTraceRefcount;
-extern ATL::CTraceCategory atlTraceWindowing;
-extern ATL::CTraceCategory atlTraceControls;
-extern ATL::CTraceCategory atlTraceHosting; 
-extern ATL::CTraceCategory atlTraceDBClient;  
-extern ATL::CTraceCategory atlTraceDBProvider;
-extern ATL::CTraceCategory atlTraceSnapin;
-extern ATL::CTraceCategory atlTraceNotImpl;   
-extern ATL::CTraceCategory atlTraceAllocation;
-extern ATL::CTraceCategory atlTraceException;
-extern ATL::CTraceCategory atlTraceTime;
-extern ATL::CTraceCategory atlTraceCache;		
-extern ATL::CTraceCategory atlTraceStencil;
-extern ATL::CTraceCategory atlTraceString;
-extern ATL::CTraceCategory atlTraceMap;	
-extern ATL::CTraceCategory atlTraceUtil;		
-extern ATL::CTraceCategory atlTraceSecurity;
-extern ATL::CTraceCategory atlTraceSync;
-extern ATL::CTraceCategory atlTraceISAPI;		
-
-
-extern ATL::CTraceCategory atlTraceUser;
-extern ATL::CTraceCategory atlTraceUser2;
-extern ATL::CTraceCategory atlTraceUser3;
-extern ATL::CTraceCategory atlTraceUser4;
-
-#pragma deprecated( atlTraceUser )
-#pragma deprecated( atlTraceUser2 )
-#pragma deprecated( atlTraceUser3 )
-#pragma deprecated( atlTraceUser4 )
-
-
-
-
-class CNoUIAssertHook
-{
-public:
-	CNoUIAssertHook()
-	{
-		(void) ((!!((s_pfnPrevHook == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atltrace.h", 329, 0, L"s_pfnPrevHook == 0")) || (__debugbreak(), 0));
-		s_pfnPrevHook = _CrtSetReportHook(CrtHookProc);
-	}
-	~CNoUIAssertHook()
-	{
-		_CrtSetReportHook(s_pfnPrevHook);
-		s_pfnPrevHook = 0;
-	}
-
-private:
-	static int __cdecl CrtHookProc(     int eReportType,        char* pszMessage,      int* pnRetVal)
-	{
-		
-		if (eReportType == 2)
-		{
-			::OutputDebugStringA( "ASSERTION FAILED\n" );
-			::OutputDebugStringA( pszMessage );
-			
-			if (pnRetVal != 0)
-			{
-				*pnRetVal = 1;
-			}
-			return 1;
-		}
-
-		if (s_pfnPrevHook != 0)
-		{
-			return s_pfnPrevHook(eReportType, pszMessage, pnRetVal);
-		}
-		else
-		{
-			return 0;
-		}
-	}
-
-private:
-	static _CRT_REPORT_HOOK s_pfnPrevHook;
-};
-
-__declspec( selectany ) _CRT_REPORT_HOOK CNoUIAssertHook::s_pfnPrevHook = 0;
-
-
-
-
-
-
-
-
-
-
-#pragma warning(push)
-#pragma warning(disable : 4793)
-inline void __cdecl AtlTraceU(LPCSTR pszFormat, ...)
-{
-	va_list ptr;
-	( ptr = (va_list)( &reinterpret_cast<const char &>(pszFormat) ) + ( (sizeof(pszFormat) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
-	ATL::CTrace::s_trace.TraceV(0, -1, atlTraceGeneral, 0, pszFormat, ptr);
-	( ptr = (va_list)0 );
-}
-#pragma warning(pop)
-
-#pragma warning(push)
-#pragma warning(disable : 4793)
-inline void __cdecl AtlTraceU(LPCWSTR pszFormat, ...)
-{
-	va_list ptr;
-	( ptr = (va_list)( &reinterpret_cast<const char &>(pszFormat) ) + ( (sizeof(pszFormat) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
-	ATL::CTrace::s_trace.TraceV(0, -1, atlTraceGeneral, 0, pszFormat, ptr);
-	( ptr = (va_list)0 );
-}
-#pragma warning(pop)
-
-#pragma warning(push)
-#pragma warning(disable : 4793)
-inline void __cdecl AtlTrace2(DWORD_PTR dwCategory, UINT nLevel, LPCSTR pszFormat, ...)
-{
-	va_list ptr;
-	( ptr = (va_list)( &reinterpret_cast<const char &>(pszFormat) ) + ( (sizeof(pszFormat) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
-	ATL::CTrace::s_trace.TraceV(0, -1, dwCategory, nLevel, pszFormat, ptr);
-	( ptr = (va_list)0 );
-}
-#pragma warning(pop)
-
-#pragma warning(push)
-#pragma warning(disable : 4793)
-inline void __cdecl AtlTrace2(DWORD_PTR dwCategory, UINT nLevel, LPCWSTR pszFormat, ...)
-{
-	va_list ptr;
-	( ptr = (va_list)( &reinterpret_cast<const char &>(pszFormat) ) + ( (sizeof(pszFormat) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
-	ATL::CTrace::s_trace.TraceV(0, -1, dwCategory, nLevel, pszFormat, ptr);
-	( ptr = (va_list)0 );
-}
-#pragma warning(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-};  
-#pragma pack(pop)
-
-
-
-
-
-#pragma pack(push,8)
-namespace ATL
-{
-
-
-
-
-inline void __declspec(noreturn) _AtlRaiseException( DWORD dwExceptionCode, DWORD dwExceptionFlags = 0x1 )
-{
-	RaiseException( dwExceptionCode, dwExceptionFlags, 0, 0 );
-}
-
-class CAtlException
-{
-public:
-	CAtlException() throw() :
-		m_hr( ((HRESULT)0x80004005L) )
-	{
-	}
-
-	CAtlException( HRESULT hr ) throw() :
-		m_hr( hr )
-	{
-	}
-
-	operator HRESULT() const throw()
-	{
-		return( m_hr );
-	}
-
-public:
-	HRESULT m_hr;
-};
-
-
-
-
-
-
-
-
-
-__declspec( noinline ) __declspec(noreturn) inline void __stdcall AtlThrowImpl( HRESULT hr )
-{
-	ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlexcept.h", 64)(atlTraceException, 0, L"AtlThrow: hr = 0x%x\n", hr );
-
-
-
-
-
-
-
-
-
-
-	throw CAtlException( hr );
-
-};
-
-
-
-__declspec( noinline ) __declspec(noreturn) inline void __stdcall AtlThrowLastWin32()
-{
-	DWORD dwError = ::GetLastError();
-	ATL::AtlThrowImpl( ((HRESULT)(dwError) <= 0 ? ((HRESULT)(dwError)) : ((HRESULT) (((dwError) & 0x0000FFFF) | (7 << 16) | 0x80000000))) );
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-};  
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-#pragma pack(push,8)
-namespace ATL
-{
-
-inline errno_t AtlCrtErrorCheck(errno_t nError)
-{
-	switch(nError)
-	{
-	case 12:
-		ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
-		break;
-	case 22:
-	case 34:
-		ATL::AtlThrowImpl(((HRESULT)0x80070057L));
-		break;
-	case 0:
-	case 80:
-		break;
-	default:
-		ATL::AtlThrowImpl(((HRESULT)0x80004005L));
-		break;
-	}
-	return nError;
-}
-
-
-
-
-namespace Checked
-{
-
-
-
-
-
-
-
-
-
-inline void __cdecl memcpy_s(        void *_S1,      size_t _S1max,        const void *_S2,      size_t _N)
-{
-	AtlCrtErrorCheck(::memcpy_s(_S1, _S1max, _S2, _N));
-}
-
-inline void __cdecl wmemcpy_s(       wchar_t *_S1,      size_t _N1,        const wchar_t *_S2,      size_t _N)
-{
-	AtlCrtErrorCheck(::wmemcpy_s(_S1, _N1, _S2, _N));
-}
-
-inline void __cdecl memmove_s(       void *_S1,      size_t _S1max,        const void *_S2, size_t _N)
-{
-	AtlCrtErrorCheck(::memmove_s(_S1, _S1max, _S2, _N));
-}
-
-inline void __cdecl strcpy_s(     char *_S1,      size_t _S1max,        const char *_S2)
-{
-	AtlCrtErrorCheck(::strcpy_s(_S1, _S1max, _S2));
-}
-
-inline void __cdecl wcscpy_s(     wchar_t *_S1,      size_t _S1max,        const wchar_t *_S2)
-{
-	AtlCrtErrorCheck(::wcscpy_s(_S1, _S1max, _S2));
-}
-
-inline void __cdecl tcscpy_s(     TCHAR * _Dst,      size_t _SizeInChars,        const TCHAR * _Src)
-{
-
-	AtlCrtErrorCheck(::wcscpy_s(_Dst, _SizeInChars, _Src));
-
-
-
-
-
-
-
-}
-
-inline errno_t __cdecl strncpy_s(     char *_Dest,      size_t _SizeInChars,        const char *_Source,      size_t _Count)
-{
-	return AtlCrtErrorCheck(::strncpy_s(_Dest, _SizeInChars, _Source,_Count));	
-}
-
-inline errno_t __cdecl wcsncpy_s(     wchar_t *_Dest,      size_t _SizeInChars,        const wchar_t *_Source,      size_t _Count)
-{
-	return AtlCrtErrorCheck(::wcsncpy_s(_Dest, _SizeInChars, _Source,_Count));	
-}
-
-inline errno_t __cdecl tcsncpy_s(     TCHAR *_Dest,      size_t _SizeInChars,        const TCHAR *_Source,      size_t _Count)
-{
-
-	return AtlCrtErrorCheck(::wcsncpy_s(_Dest, _SizeInChars, _Source,_Count));	
-
-
-
-
-
-
-
-}
-
-inline void __cdecl strcat_s(           char * _Dst,      size_t _SizeInChars,        const char * _Src)
-{
-	AtlCrtErrorCheck(::strcat_s(_Dst, _SizeInChars, _Src));
-}
-
-inline void __cdecl wcscat_s(           wchar_t * _Dst,      size_t _SizeInChars,        const wchar_t * _Src)
-{
-	AtlCrtErrorCheck(::wcscat_s(_Dst, _SizeInChars, _Src));
-}
-
-inline void __cdecl tcscat_s(           TCHAR * _Dst,      size_t _SizeInChars,        const TCHAR * _Src)
-{
-
-	AtlCrtErrorCheck(::wcscat_s(_Dst, _SizeInChars, _Src));
-
-
-
-
-
-
-
-}
-
-inline void __cdecl strlwr_s(           char * _Str,      size_t _SizeInChars)
-{
-	AtlCrtErrorCheck(::_strlwr_s(_Str, _SizeInChars));	
-}
-
-inline void __cdecl wcslwr_s(           wchar_t * _Str,      size_t _SizeInChars)
-{
-	AtlCrtErrorCheck(::_wcslwr_s(_Str, _SizeInChars));	
-}
-
-inline void __cdecl mbslwr_s(           unsigned char * _Str,      size_t _SizeInChars)
-{
-	AtlCrtErrorCheck(::_mbslwr_s(_Str, _SizeInChars));	
-}
-
-inline void __cdecl tcslwr_s(           TCHAR * _Str,      size_t _SizeInChars)
-{
-
-	AtlCrtErrorCheck(::_wcslwr_s(_Str, _SizeInChars));	
-
-
-
-
-
-
-
-}
-
-inline void __cdecl strupr_s(           char * _Str,      size_t _SizeInChars)
-{
-	AtlCrtErrorCheck(::_strupr_s(_Str, _SizeInChars));	
-}
-
-inline void __cdecl wcsupr_s(           wchar_t * _Str,      size_t _SizeInChars)
-{
-	AtlCrtErrorCheck(::_wcsupr_s(_Str, _SizeInChars));	
-}
-
-inline void __cdecl mbsupr_s(           unsigned char * _Str,      size_t _SizeInChars)
-{
-	AtlCrtErrorCheck(::_mbsupr_s(_Str, _SizeInChars));	
-}
-
-inline void __cdecl tcsupr_s(           TCHAR * _Str,      size_t _SizeInChars)
-{
-	AtlCrtErrorCheck(::_wcsupr_s(_Str, _SizeInChars));	
-}
-
-inline void __cdecl itoa_s(     int _Val,        char *_Buf,      size_t _SizeInChars,      int _Radix)
-{
-	AtlCrtErrorCheck(::_itoa_s(_Val, _Buf, _SizeInChars, _Radix));
-}
-
-inline void __cdecl itot_s(     int _Val,        TCHAR *_Buf,      size_t _SizeInChars,      int _Radix)
-{
-	AtlCrtErrorCheck(::_itow_s(_Val, _Buf, _SizeInChars, _Radix));
-}
-
-inline void __cdecl ltoa_s(     long _Val,        char *_Buf,      size_t _SizeInChars,      int _Radix)
-{
-	AtlCrtErrorCheck(::_ltoa_s(_Val, _Buf, _SizeInChars, _Radix));
-}
-
-inline void __cdecl ltot_s(     long _Val,        TCHAR *_Buf,      size_t _SizeInChars,      int _Radix)
-{
-	AtlCrtErrorCheck(::_ltow_s(_Val, _Buf, _SizeInChars, _Radix));
-}
-
-inline void __cdecl ultoa_s(     unsigned long _Val,        char *_Buf,      size_t _SizeInChars,      int _Radix)
-{
-	AtlCrtErrorCheck(::_ultoa_s(_Val, _Buf, _SizeInChars, _Radix));
-}
-
-inline void __cdecl ultow_s(     unsigned long _Val,        wchar_t *_Buf,      size_t _SizeInChars,      int _Radix)
-{
-	AtlCrtErrorCheck(::_ultow_s(_Val, _Buf, _SizeInChars, _Radix));
-}
-
-inline void __cdecl ultot_s(     unsigned long _Val,        TCHAR *_Buf,      size_t _SizeInChars,      int _Radix)
-{
-	AtlCrtErrorCheck(::_ultow_s(_Val, _Buf, _SizeInChars, _Radix));
-}
-
-inline void __cdecl i64toa_s(     __int64 _Val,        char *_Buf,      size_t _SizeInChars,      int _Radix)
-{
-	AtlCrtErrorCheck(::_i64toa_s(_Val, _Buf, _SizeInChars, _Radix));
-}
-
-inline void __cdecl i64tow_s(     __int64 _Val,        wchar_t *_Buf,      size_t _SizeInChars,      int _Radix)
-{
-	AtlCrtErrorCheck(::_i64tow_s(_Val, _Buf, _SizeInChars, _Radix));
-}
-
-inline void __cdecl ui64toa_s(     unsigned __int64 _Val,        char *_Buf,      size_t _SizeInChars,      int _Radix)
-{
-	AtlCrtErrorCheck(::_ui64toa_s(_Val, _Buf, _SizeInChars, _Radix));
-}
-
-inline void __cdecl ui64tow_s(     unsigned __int64 _Val,        wchar_t *_Buf,      size_t _SizeInChars,      int _Radix)
-{
-	AtlCrtErrorCheck(::_ui64tow_s(_Val, _Buf, _SizeInChars, _Radix));
-}
-
-inline void __cdecl gcvt_s(       char *_Buffer,      size_t _SizeInChars,      double _Value,      int _Ndec)
-{
-	AtlCrtErrorCheck(::_gcvt_s(_Buffer, _SizeInChars, _Value, _Ndec));
-}
-
-inline void __cdecl tsplitpath_s(       const TCHAR *_Path,          TCHAR *_Drive,      size_t _Drive_len, 
-	         TCHAR *_Dir,      size_t _Dir_len, 
-	         TCHAR *_Fname,      size_t _Fname_len, 
-	         TCHAR *_Ext,      size_t _Ext_len)
-{
-	AtlCrtErrorCheck(::_wsplitpath_s(_Path, _Drive, _Drive_len, _Dir, _Dir_len, _Fname, _Fname_len, _Ext, _Ext_len));
-}
-
-inline void __cdecl tmakepath_s(       TCHAR *_Path,      size_t _SizeInChars,        const TCHAR *_Drive, 
-	       const TCHAR *_Dir,        const TCHAR *_Fname,        const TCHAR *_Ext)
-{
-	AtlCrtErrorCheck(::_wmakepath_s(_Path, _SizeInChars, _Drive, _Dir, _Fname, _Ext));
-}
-
-inline size_t __cdecl strnlen(       const char *_Str,      size_t _Maxsize)
-{
-	return ::strnlen(_Str, _Maxsize);
-}
-
-inline size_t __cdecl wcsnlen(       const wchar_t *_Wcs,      size_t _Maxsize)
-{
-	return ::wcsnlen(_Wcs, _Maxsize);
-}
-
-inline size_t __cdecl tcsnlen(       const TCHAR *_Str,      size_t _Maxsize)
-{
-	return ::wcsnlen(_Str, _Maxsize);
-}
-
-inline int get_errno() throw()
-{
-	int nErrNo=0;
-	errno_t nErrCall=::_get_errno(&nErrNo);
-	if(nErrCall)
-	{
-		return nErrCall;
-	}
-	return nErrNo;
-}
-
-inline void set_errno(     int _Value)
-{
-	AtlCrtErrorCheck(::_set_errno(_Value));
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-} 
-
-} 
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(push)
-#pragma warning(disable: 4800) 
-
-
-#pragma pack(push,8)
-namespace ATL
-{
-
-
-
-
-
-
-
-
-
-template <class T>
-class CSimpleArrayEqualHelper
-{
-public:
-	static bool IsEqual(const T& t1, const T& t2)
-	{
-		return (t1 == t2);
-	}
-};
-
-template <class T>
-class CSimpleArrayEqualHelperFalse
-{
-public:
-	static bool IsEqual(const T&, const T&)
-	{
-		(void) ((!!((false))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlsimpcoll.h", 63, 0, L"false")) || (__debugbreak(), 0));
-		return false;
-	}
-};
-
-template <class TKey, class TVal>
-class CSimpleMapEqualHelper
-{
-public:
-	static bool IsEqualKey(const TKey& k1, const TKey& k2)
-	{
-		return CSimpleArrayEqualHelper<TKey>::IsEqual(k1, k2);
-	}
-
-	static bool IsEqualValue(const TVal& v1, const TVal& v2)
-	{
-		return CSimpleArrayEqualHelper<TVal>::IsEqual(v1, v2);
-	}
-};
-
-template <class TKey, class TVal>
-class CSimpleMapEqualHelperFalse
-{
-public:
-	static bool IsEqualKey(const TKey& k1, const TKey& k2)
-	{
-		return CSimpleArrayEqualHelper<TKey>::IsEqual(k1, k2);
-	}
-
-	static bool IsEqualValue(const TVal&, const TVal&)
-	{
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlsimpcoll.h", 94, 0, L"0")) || (__debugbreak(), 0));
-		return false;
-	}
-};
-
-template <class T, class TEqual = CSimpleArrayEqualHelper< T > >
-class CSimpleArray
-{
-public:
-
-	CSimpleArray() : m_aT(0), m_nSize(0), m_nAllocSize(0)
-	{ }
-
-	~CSimpleArray();
-
-	CSimpleArray(const CSimpleArray< T, TEqual >& src) : m_aT(0), m_nSize(0), m_nAllocSize(0)
-	{
-        if (src.GetSize())
-        {
-			m_aT = (T*)calloc(src.GetSize(), sizeof(T));
-			if (m_aT != 0)
-			{
-				m_nAllocSize = src.GetSize();
-				for (int i=0; i<src.GetSize(); i++)
-					Add(src[i]);
-			}
-		}
-	}
-	CSimpleArray< T, TEqual >& operator=(const CSimpleArray< T, TEqual >& src)
-	{
-		if (GetSize() != src.GetSize())
-		{
-			RemoveAll();
-			m_aT = (T*)calloc(src.GetSize(), sizeof(T));
-			if (m_aT != 0)
-				m_nAllocSize = src.GetSize();
-		}
-		else
-		{
-			for (int i = GetSize(); i > 0; i--)
-				RemoveAt(i - 1);
-		}
-		for (int i=0; i<src.GetSize(); i++)
-			Add(src[i]);
-		return *this;
-	}
-
-
-	int GetSize() const
-	{
-		return m_nSize;
-	}
-	BOOL Add(const T& t)
-	{
-		if(m_nSize == m_nAllocSize)
-		{
-			
-			
-			do { int __atl_condVal=!!((&t < m_aT) || (&t >= (m_aT + m_nAllocSize) )); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlsimpcoll.h", 153, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-
-			T* aT;
-			int nNewAllocSize = (m_nAllocSize == 0) ? 1 : (m_nSize * 2);
-	  
-			if (nNewAllocSize<0||nNewAllocSize>2147483647/sizeof(T))
-			{
-				return 0;
-			}
-
-			aT = (T*)_recalloc(m_aT, nNewAllocSize, sizeof(T));
-			if(aT == 0)
-				return 0;
-			m_nAllocSize = nNewAllocSize;
-			m_aT = aT;
-		}
-		InternalSetAtIndex(m_nSize, t);
-		m_nSize++;
-		return 1;
-	}
-	BOOL Remove(const T& t)
-	{
-		int nIndex = Find(t);
-		if(nIndex == -1)
-			return 0;
-		return RemoveAt(nIndex);
-	}
-	BOOL RemoveAt(int nIndex)
-	{
-		(void) ((!!((nIndex >= 0 && nIndex < m_nSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlsimpcoll.h", 182, 0, L"nIndex >= 0 && nIndex < m_nSize")) || (__debugbreak(), 0));
-		if (nIndex < 0 || nIndex >= m_nSize)
-			return 0;
-		m_aT[nIndex].~T();
-		if(nIndex != (m_nSize - 1))
-			Checked::memmove_s((void*)(m_aT + nIndex), (m_nSize - nIndex) * sizeof(T), (void*)(m_aT + nIndex + 1), (m_nSize - (nIndex + 1)) * sizeof(T));
-		m_nSize--;
-		return 1;
-	}
-	void RemoveAll()
-	{
-		if(m_aT != 0)
-		{
-			for(int i = 0; i < m_nSize; i++)
-				m_aT[i].~T();
-			free(m_aT);
-			m_aT = 0;
-		}
-		m_nSize = 0;
-		m_nAllocSize = 0;
-    }   
-	const T& operator[] (int nIndex) const
-	{
-		(void) ((!!((nIndex >= 0 && nIndex < m_nSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlsimpcoll.h", 205, 0, L"nIndex >= 0 && nIndex < m_nSize")) || (__debugbreak(), 0));
-		if(nIndex < 0 || nIndex >= m_nSize)
-		{
-			_AtlRaiseException((DWORD)((DWORD )0xC000008CL));					
-		}
-		return m_aT[nIndex];
-	}
-	T& operator[] (int nIndex)
-	{
-		(void) ((!!((nIndex >= 0 && nIndex < m_nSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlsimpcoll.h", 214, 0, L"nIndex >= 0 && nIndex < m_nSize")) || (__debugbreak(), 0));
-		if(nIndex < 0 || nIndex >= m_nSize)
-		{
-			_AtlRaiseException((DWORD)((DWORD )0xC000008CL));					
-		}
-		return m_aT[nIndex];
-	}
-	T* GetData() const
-	{
-		return m_aT;
-	}
-
-	int Find(const T& t) const
-	{
-		for(int i = 0; i < m_nSize; i++)
-		{
-			if(TEqual::IsEqual(m_aT[i], t))
-				return i;
-		}
-		return -1;  
-	}
-
-	BOOL SetAtIndex(int nIndex, const T& t)
-	{
-		if (nIndex < 0 || nIndex >= m_nSize)
-			return 0;
-		InternalSetAtIndex(nIndex, t);
-		return 1;
-	}
-
-
-	class Wrapper
-	{
-	public:
-		Wrapper(const T& _t) : t(_t)
-		{
-		}
-		template <class _Ty>
-		void * __cdecl operator new(size_t, _Ty* p)
-		{
-			return p;
-		}
-		template <class _Ty>
-		void __cdecl operator delete(void* , _Ty* )
-		{
-		}
-		T t;
-	};
-
-
-	void InternalSetAtIndex(int nIndex, const T& t)
-	{
-		new(m_aT + nIndex) Wrapper(t);
-	}
-
-	typedef T _ArrayElementType;
-	T* m_aT;
-	int m_nSize;
-	int m_nAllocSize;
-
-};
-
-
-
-	template <class T, class TEqual> inline  CSimpleArray<T, TEqual>::~CSimpleArray()
-	{
-		RemoveAll();
-	}
-
-
-template <class TKey, class TVal, class TEqual = CSimpleMapEqualHelper< TKey, TVal > >
-class CSimpleMap
-{
-public:
-	TKey* m_aKey;
-	TVal* m_aVal;
-	int m_nSize;
-
-	typedef TKey _ArrayKeyType;
-	typedef TVal _ArrayElementType;
-
-
-	CSimpleMap() : m_aKey(0), m_aVal(0), m_nSize(0)
-	{ }
-
-	~CSimpleMap()
-	{
-		RemoveAll();	
-	}
-
-
-	int GetSize() const
-	{
-		return m_nSize;
-	}
-	BOOL Add(const TKey& key, const TVal& val)
-	{
-		TKey* pKey;
-		pKey = (TKey*)_recalloc(m_aKey, (m_nSize + 1), sizeof(TKey));
-		if(pKey == 0)
-			return 0;
-		m_aKey = pKey;
-		TVal* pVal;
-		pVal = (TVal*)_recalloc(m_aVal, (m_nSize + 1), sizeof(TVal));
-		if(pVal == 0)
-			return 0;
-		m_aVal = pVal;
-		InternalSetAtIndex(m_nSize, key, val);
-		m_nSize++;
-		return 1;
-	}
-	BOOL Remove(const TKey& key)
-	{
-		int nIndex = FindKey(key);
-		if(nIndex == -1)
-			return 0;
-		return RemoveAt(nIndex);
-	}
-	BOOL RemoveAt(int nIndex)
-	{
-		(void) ((!!((nIndex >= 0 && nIndex < m_nSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlsimpcoll.h", 334, 0, L"nIndex >= 0 && nIndex < m_nSize")) || (__debugbreak(), 0));
-		if (nIndex < 0 || nIndex >= m_nSize)
-			return 0;
-		m_aKey[nIndex].~TKey();
-		m_aVal[nIndex].~TVal();
-		if(nIndex != (m_nSize - 1))
-		{
-			Checked::memmove_s((void*)(m_aKey + nIndex), (m_nSize - nIndex) * sizeof(TKey), (void*)(m_aKey + nIndex + 1), (m_nSize - (nIndex + 1)) * sizeof(TKey));
-			Checked::memmove_s((void*)(m_aVal + nIndex), (m_nSize - nIndex) * sizeof(TVal), (void*)(m_aVal + nIndex + 1), (m_nSize - (nIndex + 1)) * sizeof(TVal));
-		}
-		TKey* pKey;
-		pKey = (TKey*)_recalloc(m_aKey, (m_nSize - 1), sizeof(TKey));
-		if(pKey != 0 || m_nSize == 1)
-			m_aKey = pKey;
-		TVal* pVal;
-		pVal = (TVal*)_recalloc(m_aVal, (m_nSize - 1), sizeof(TVal));
-		if(pVal != 0 || m_nSize == 1)
-			m_aVal = pVal;
-		m_nSize--;
-		return 1;
-	}
-	void RemoveAll()
-	{
-		if(m_aKey != 0)
-		{
-			for(int i = 0; i < m_nSize; i++)
-			{
-				m_aKey[i].~TKey();
-				m_aVal[i].~TVal();
-			}
-			free(m_aKey);
-			m_aKey = 0;
-		}
-		if(m_aVal != 0)
-		{
-			free(m_aVal);
-			m_aVal = 0;
-		}
-
-		m_nSize = 0;
-	}
-	BOOL SetAt(const TKey& key, const TVal& val)
-	{
-		int nIndex = FindKey(key);
-		if(nIndex == -1)
-			return 0;
-		(void) ((!!((nIndex >= 0 && nIndex < m_nSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlsimpcoll.h", 380, 0, L"nIndex >= 0 && nIndex < m_nSize")) || (__debugbreak(), 0));
-		m_aKey[nIndex].~TKey();
-		m_aVal[nIndex].~TVal();
-		InternalSetAtIndex(nIndex, key, val);
-		return 1;
-	}
-	TVal Lookup(const TKey& key) const
-	{
-		int nIndex = FindKey(key);
-		if(nIndex == -1)
-			return 0;    
-		return GetValueAt(nIndex);
-	}
-	TKey ReverseLookup(const TVal& val) const
-	{
-		int nIndex = FindVal(val);
-		if(nIndex == -1)
-			return 0;    
-		return GetKeyAt(nIndex);
-	}
-	TKey& GetKeyAt(int nIndex) const
-	{
-		(void) ((!!((nIndex >= 0 && nIndex < m_nSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlsimpcoll.h", 402, 0, L"nIndex >= 0 && nIndex < m_nSize")) || (__debugbreak(), 0));
-		if(nIndex < 0 || nIndex >= m_nSize)
-			_AtlRaiseException((DWORD)((DWORD )0xC000008CL));
-			
-		return m_aKey[nIndex];
-	}
-	TVal& GetValueAt(int nIndex) const
-	{
-		(void) ((!!((nIndex >= 0 && nIndex < m_nSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlsimpcoll.h", 410, 0, L"nIndex >= 0 && nIndex < m_nSize")) || (__debugbreak(), 0));
-		if(nIndex < 0 || nIndex >= m_nSize)
-			_AtlRaiseException((DWORD)((DWORD )0xC000008CL));	
-			
-		return m_aVal[nIndex];
-	}
-
-	int FindKey(const TKey& key) const
-	{
-		for(int i = 0; i < m_nSize; i++)
-		{
-			if(TEqual::IsEqualKey(m_aKey[i], key))
-				return i;
-		}
-		return -1;  
-	}
-	int FindVal(const TVal& val) const
-	{
-		for(int i = 0; i < m_nSize; i++)
-		{
-			if(TEqual::IsEqualValue(m_aVal[i], val))
-				return i;
-		}
-		return -1;  
-	}
-
-	BOOL SetAtIndex(int nIndex, const TKey& key, const TVal& val)
-	{
-		if (nIndex < 0 || nIndex >= m_nSize)
-			return 0;
-		InternalSetAtIndex(nIndex, key, val);
-		return 1;
-	}
-
-
-
-
-	template <typename T>
-	class Wrapper
-	{
-	public:
-		Wrapper(const T& _t) : t(_t)
-		{
-		}
-		template <class _Ty>
-		void *operator new(size_t, _Ty* p)
-		{
-			return p;
-		}
-		template <class _Ty>
-		void operator delete(void* , _Ty* )
-		{
-		}
-		T t;
-	};
-	void InternalSetAtIndex(int nIndex, const TKey& key, const TVal& val)
-	{
-		new(m_aKey + nIndex) Wrapper<TKey>(key);
-		new(m_aVal + nIndex) Wrapper<TVal>(val);
-	}
-};
-
-
-
-};  
-#pragma pack(pop)
-
-#pragma warning(pop)
-
-
-
-
-
-
-
-
-
-
-
-#pragma pack(push,8)
-namespace ATL
-{
-
-
-inline BOOL AtlIsValidString(LPCWSTR psz, size_t nMaxLength = 2147483647)
-{
-	(nMaxLength);
-	return (psz != 0);
-}
-
-
-inline BOOL AtlIsValidString(LPCSTR psz, size_t nMaxLength = 0xffffffff)
-{
-	(nMaxLength);
-	return (psz != 0);
-}
-
-
-inline BOOL AtlIsValidAddress(const void* p, size_t nBytes,
-	BOOL bReadWrite = 1)
-{
-	(bReadWrite);
-	(nBytes);
-	return (p != 0);
-}
-
-template<typename T>
-inline void AtlAssertValidObject(const T *pOb)
-{
-	(void) ((!!((pOb))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcore.h", 63, 0, L"pOb")) || (__debugbreak(), 0));
-	(void) ((!!((AtlIsValidAddress(pOb, sizeof(T))))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcore.h", 64, 0, L"AtlIsValidAddress(pOb, sizeof(T))")) || (__debugbreak(), 0));
-	if(pOb)
-		pOb->AssertValid();
-}
-
-
-
-
-
-
-
-class CComCriticalSection
-{
-public:
-	CComCriticalSection() throw()
-	{
-		memset(&m_sec, 0, sizeof(CRITICAL_SECTION));
-	}
-	~CComCriticalSection()
-	{
-	}
-	HRESULT Lock() throw()
-	{
-		EnterCriticalSection(&m_sec);
-		return ((HRESULT)0x00000000L);
-	}
-	HRESULT Unlock() throw()
-	{
-		LeaveCriticalSection(&m_sec);
-		return ((HRESULT)0x00000000L);
-	}
-	HRESULT Init() throw()
-	{
-		HRESULT hRes = ((HRESULT)0x80004005L);
-		__try
-		{
-			InitializeCriticalSection(&m_sec);
-			hRes = ((HRESULT)0x00000000L);
-		}
-		
-		__except(((DWORD )0xC0000017L) == _exception_code())
-		{			
-			hRes = ((HRESULT)0x8007000EL);		
-		}
-		return hRes;
-	}
-
-	HRESULT Term() throw()
-	{
-		DeleteCriticalSection(&m_sec);
-		return ((HRESULT)0x00000000L);
-	}	
-	CRITICAL_SECTION m_sec;
-};
-
-class CComAutoCriticalSection : public CComCriticalSection
-{
-public:
-	CComAutoCriticalSection()
-	{
-		HRESULT hr = CComCriticalSection::Init();
-		if (((HRESULT)(hr) < 0))
-			ATL::AtlThrowImpl(hr);
-	}
-	~CComAutoCriticalSection() throw()
-	{
-		CComCriticalSection::Term();
-	}
-private :
-	HRESULT Init(); 
-	HRESULT Term(); 
-};
-
-class CComSafeDeleteCriticalSection : public CComCriticalSection
-{
-public:
-	CComSafeDeleteCriticalSection(): m_bInitialized(false) 
-	{
-	}
-
-	~CComSafeDeleteCriticalSection() throw()
-	{
-		if (!m_bInitialized)
-		{
-			return;
-		}
-		m_bInitialized = false;
-		CComCriticalSection::Term();
-	}
-
-	HRESULT Init() throw()
-	{
-		(void) ((!!((!m_bInitialized))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcore.h", 156, 0, L"!m_bInitialized")) || (__debugbreak(), 0));
-		HRESULT hr = CComCriticalSection::Init();
-		if (((HRESULT)(hr) >= 0))
-		{
-			m_bInitialized = true;
-		}
-		return hr;
-	}
-
-	HRESULT Term() throw()
-	{
-		if (!m_bInitialized)
-		{
-			return ((HRESULT)0x00000000L);
-		}
-		m_bInitialized = false;
-		return CComCriticalSection::Term();
-	}
-
-	HRESULT Lock()
-	{
-		
-		
-		
-		
-		
-		do { (void) ((!!((m_bInitialized))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcore.h", 182, 0, L"m_bInitialized")) || (__debugbreak(), 0)); ; } while(0);
-		return CComCriticalSection::Lock();
-	}
-
-private:
-	bool m_bInitialized;
-};
-
-class CComAutoDeleteCriticalSection : public CComSafeDeleteCriticalSection
-{
-private:
-	
-	HRESULT Term() throw();
-};
-
-class CComFakeCriticalSection
-{
-public:
-	HRESULT Lock() throw() { return ((HRESULT)0x00000000L); }
-	HRESULT Unlock() throw() { return ((HRESULT)0x00000000L); }
-	HRESULT Init() throw() { return ((HRESULT)0x00000000L); }
-	HRESULT Term() throw() { return ((HRESULT)0x00000000L); }
-};
-
-
-
-
-
-struct _ATL_BASE_MODULE70
-{
-	UINT cbSize;
-	HINSTANCE m_hInst;
-	HINSTANCE m_hInstResource;
-	bool m_bNT5orWin98;
-	DWORD dwAtlBuildVer;
-	const GUID* pguidVer;
-	CComCriticalSection m_csResource;
-	CSimpleArray<HINSTANCE> m_rgResourceInstance;
-};
-typedef _ATL_BASE_MODULE70 _ATL_BASE_MODULE;
-
-class CAtlBaseModule : public _ATL_BASE_MODULE
-{
-public :
-	static bool m_bInitFailed;
-	CAtlBaseModule() throw();
-	~CAtlBaseModule() throw ();
-
-	HINSTANCE GetModuleInstance() throw()
-	{
-		return m_hInst;
-	}
-	HINSTANCE GetResourceInstance() throw()
-	{
-		return m_hInstResource;
-	}
-	HINSTANCE SetResourceInstance(HINSTANCE hInst) throw()
-	{
-		return static_cast< HINSTANCE >(InterlockedExchangePointer((void**)&m_hInstResource, hInst));
-	}
-
-	bool AddResourceInstance(HINSTANCE hInst) throw();
-	bool RemoveResourceInstance(HINSTANCE hInst) throw();
-	HINSTANCE GetHInstanceAt(int i) throw();
-};
-
-__declspec(selectany) bool CAtlBaseModule::m_bInitFailed = false;
-extern CAtlBaseModule _AtlBaseModule;
-
-
-
-
-#pragma warning(push)
-#pragma warning(disable: 4200)
-	struct ATLSTRINGRESOURCEIMAGE
-	{
-		WORD nLength;
-		WCHAR achString[];
-	};
-#pragma warning(pop)	
-
-inline const ATLSTRINGRESOURCEIMAGE* _AtlGetStringResourceImage( HINSTANCE hInstance, HRSRC hResource, UINT id ) throw()
-{
-	const ATLSTRINGRESOURCEIMAGE* pImage;
-	const ATLSTRINGRESOURCEIMAGE* pImageEnd;
-	ULONG nResourceSize;
-	HGLOBAL hGlobal;
-	UINT iIndex;
-
-	hGlobal = ::LoadResource( hInstance, hResource );
-	if( hGlobal == 0 )
-	{
-		return( 0 );
-	}
-
-	pImage = (const ATLSTRINGRESOURCEIMAGE*)::LockResource( hGlobal );
-	if( pImage == 0 )
-	{
-		return( 0 );
-	}
-
-	nResourceSize = ::SizeofResource( hInstance, hResource );
-	pImageEnd = (const ATLSTRINGRESOURCEIMAGE*)(LPBYTE( pImage )+nResourceSize);
-	iIndex = id&0x000f;
-
-	while( (iIndex > 0) && (pImage < pImageEnd) )
-	{
-		pImage = (const ATLSTRINGRESOURCEIMAGE*)(LPBYTE( pImage )+(sizeof( ATLSTRINGRESOURCEIMAGE )+(pImage->nLength*sizeof( WCHAR ))));
-		iIndex--;
-	}
-	if( pImage >= pImageEnd )
-	{
-		return( 0 );
-	}
-	if( pImage->nLength == 0 )
-	{
-		return( 0 );
-	}
-
-	return( pImage );
-}
-
-inline const ATLSTRINGRESOURCEIMAGE* AtlGetStringResourceImage( HINSTANCE hInstance, UINT id ) throw()
-{
-	HRSRC hResource;
-
-	hResource = ::FindResourceW( hInstance, ((LPWSTR)((ULONG_PTR)((WORD)(((id>>4)+1))))), ((LPWSTR)((ULONG_PTR)((WORD)(6)))) );
-	if( hResource == 0 )
-	{
-		return( 0 );
-	}
-
-	return _AtlGetStringResourceImage( hInstance, hResource, id );
-}
-
-inline const ATLSTRINGRESOURCEIMAGE* AtlGetStringResourceImage( HINSTANCE hInstance, UINT id, WORD wLanguage ) throw()
-{
-	HRSRC hResource;
-
-	hResource = ::FindResourceExW( hInstance, ((LPWSTR)((ULONG_PTR)((WORD)(6)))), ((LPWSTR)((ULONG_PTR)((WORD)(((id>>4)+1))))), wLanguage );
-	if( hResource == 0 )
-	{
-		return( 0 );
-	}
-
-	return _AtlGetStringResourceImage( hInstance, hResource, id );
-}
-
-inline const ATLSTRINGRESOURCEIMAGE* AtlGetStringResourceImage( UINT id ) throw()
-{
-	const ATLSTRINGRESOURCEIMAGE* p = 0;
-	HINSTANCE hInst = _AtlBaseModule.GetHInstanceAt(0);
-
-	for (int i = 1; hInst != 0 && p == 0; hInst = _AtlBaseModule.GetHInstanceAt(i++))
-	{
-		p = AtlGetStringResourceImage(hInst, id);
-	}
-	return p;
-}
-
-inline const ATLSTRINGRESOURCEIMAGE* AtlGetStringResourceImage( UINT id, WORD wLanguage ) throw()
-{
-	const ATLSTRINGRESOURCEIMAGE* p = 0;
-	HINSTANCE hInst = _AtlBaseModule.GetHInstanceAt(0);
-
-	for (int i = 1; hInst != 0 && p == 0; hInst = _AtlBaseModule.GetHInstanceAt(i++))
-	{
-		p = AtlGetStringResourceImage(hInst, id, wLanguage);
-	}
-	return p;
-}
-
-inline int AtlLoadString(     UINT nID,          LPTSTR lpBuffer,      int nBufferMax) throw()
-{
-	HINSTANCE hInst = _AtlBaseModule.GetHInstanceAt(0);
-	int nRet = 0;
-
-	for (int i = 1; hInst != 0 && nRet == 0; hInst = _AtlBaseModule.GetHInstanceAt(i++))
-	{
-		nRet = LoadStringW(hInst, nID, lpBuffer, nBufferMax);
-	}
-	return nRet;
-}
-
-inline HINSTANCE AtlFindResourceInstance(LPCTSTR lpName, LPCTSTR lpType, WORD wLanguage = 0) throw()
-{
-	(void) ((!!((lpType != ((LPWSTR)((ULONG_PTR)((WORD)(6))))))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcore.h", 368, 0, L"lpType != ((LPWSTR)((ULONG_PTR)((WORD)(6))))")) || (__debugbreak(), 0));	
-	if (lpType == ((LPWSTR)((ULONG_PTR)((WORD)(6)))))
-		return 0;
-
-	if (((((ULONG_PTR)(lpType)) >> 16) == 0))
-	{
-		
-		if (lpType == ((LPWSTR)((ULONG_PTR)((WORD)(3)))))
-		{
-			lpType = ((LPWSTR)((ULONG_PTR)((WORD)((ULONG_PTR)((LPWSTR)((ULONG_PTR)((WORD)(3)))) + 11))));
-		}
-		else if (lpType == ((LPWSTR)((ULONG_PTR)((WORD)(1)))))
-		{
-			lpType = ((LPWSTR)((ULONG_PTR)((WORD)((ULONG_PTR)((LPWSTR)((ULONG_PTR)((WORD)(1)))) + 11))));
-		}
-	}
-
-	HINSTANCE hInst = _AtlBaseModule.GetHInstanceAt(0);
-	HRSRC hResource = 0;
-
-	for (int i = 1; hInst != 0; hInst = _AtlBaseModule.GetHInstanceAt(i++))
-	{
-		hResource = ::FindResourceExW(hInst, lpType, lpName, wLanguage);
-		if (hResource != 0)
-		{
-			return hInst;
-		}
-	}
-
-	return 0;
-}
-
-inline HINSTANCE AtlFindResourceInstance(UINT nID, LPCTSTR lpType, WORD wLanguage = 0) throw()
-{
-	return AtlFindResourceInstance(((LPWSTR)((ULONG_PTR)((WORD)(nID)))), lpType, wLanguage);
-}
-
-inline HINSTANCE AtlFindStringResourceInstance(UINT nID, WORD wLanguage = 0) throw()
-{
-	const ATLSTRINGRESOURCEIMAGE* p = 0;
-	HINSTANCE hInst = _AtlBaseModule.GetHInstanceAt(0);
-
-	for (int i = 1; hInst != 0 && p == 0; hInst = _AtlBaseModule.GetHInstanceAt(i++))
-	{
-		p = AtlGetStringResourceImage(hInst, nID, wLanguage);
-		if (p != 0)
-			return hInst;
-	}
-
-	return 0;
-}
-
-
-
-
-inline HRESULT AtlSafeArrayGetActualVartype
-(
-    SAFEARRAY *psaArray,
-    VARTYPE *pvtType
-)
-{
-    HRESULT hrSystem=::SafeArrayGetVartype(psaArray, pvtType);
-
-    if(((HRESULT)(hrSystem) < 0))
-    {
-        return hrSystem;
-    }
-
-    
-
-
-
-    if(pvtType && *pvtType==VT_UNKNOWN)
-    {
-        if(psaArray && ((psaArray->fFeatures & ( 0x40 ))!=0))
-        {
-            if(psaArray->fFeatures & ( 0x400 ))
-            {
-                *pvtType=VT_DISPATCH;
-            }
-        }
-    }
-
-    return hrSystem;
-}
-template <typename _CharType>
-inline _CharType* AtlCharNext(const _CharType* p) throw()
-{
-	do { (void) ((!!((p != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcore.h", 456, 0, L"p != 0")) || (__debugbreak(), 0)); ; } while(0);	
-	if (*p == '\0')  
-		return const_cast<_CharType*>(p+1);
-	else
-		return ::CharNextA(p);
-}
-
-template <>
-inline wchar_t* AtlCharNext<wchar_t>(const wchar_t* p) throw()
-{
-	return const_cast< wchar_t* >( p+1 );
-}
-template<typename CharType>
-inline const CharType* AtlstrchrT(const CharType* p, CharType ch) throw()
-{
-	(void) ((!!((p != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcore.h", 471, 0, L"p != 0")) || (__debugbreak(), 0));	
-	if(p==0)
-	{
-		return 0;
-	}
-	while( *p != 0 )
-	{
-		if (*p == ch)
-		{
-			return p;
-		}
-		p = AtlCharNext(p);
-	}
-	
-	
-	return (*p == ch) ? p : 0;
-}
-
-#pragma warning(push)
-#pragma warning(disable : 4793)
-template<typename CharType>
-inline int AtlprintfT(const CharType* pszFormat,... ) throw()
-{
-	int retval=0;
-	va_list argList;
-	( argList = (va_list)( &reinterpret_cast<const char &>(pszFormat) ) + ( (sizeof(pszFormat) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
-	retval=vprintf(pszFormat,argList);
-	( argList = (va_list)0 );
-	return retval;
-}
-#pragma warning(pop)
-
-#pragma warning(push)
-#pragma warning(disable : 4793)
-template<>
-inline int AtlprintfT(const wchar_t* pszFormat,... ) throw()
-{
-	int retval=0;
-	va_list argList;
-	( argList = (va_list)( &reinterpret_cast<const char &>(pszFormat) ) + ( (sizeof(pszFormat) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
-	retval=vwprintf(pszFormat,	argList);
-	( argList = (va_list)0 );
-	return retval;
-}
-#pragma warning(pop)
-
-inline BOOL AtlConvertSystemTimeToVariantTime(const SYSTEMTIME& systimeSrc,double* pVarDtTm)
-{
-	do { int __atl_condVal=!!(pVarDtTm!=0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcore.h", 519, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-	
-	
-	BOOL ok = ::SystemTimeToVariantTime(const_cast<SYSTEMTIME*>(&systimeSrc), pVarDtTm);
-	SYSTEMTIME sysTime;
-	::memset((&sysTime),0,(sizeof(SYSTEMTIME)));
-
-	ok = ok && ::VariantTimeToSystemTime(*pVarDtTm, &sysTime);
-	ok = ok && (systimeSrc.wYear == sysTime.wYear &&
-			systimeSrc.wMonth == sysTime.wMonth &&
-			systimeSrc.wDay == sysTime.wDay &&
-			systimeSrc.wHour == sysTime.wHour &&
-			systimeSrc.wMinute == sysTime.wMinute && 
-			systimeSrc.wSecond == sysTime.wSecond);
-
-	return ok;
-}
-
-
-}	
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,8)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-#pragma warning( disable: 4049 )  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
- 
-
-
-
-typedef struct IEnumConnections IEnumConnections;
-
-
-
-
-
-typedef struct IConnectionPoint IConnectionPoint;
-
-
-
-
-
-typedef struct IEnumConnectionPoints IEnumConnectionPoints;
-
-
-
-
-
-typedef struct IConnectionPointContainer IConnectionPointContainer;
-
-
-
-
-
-typedef struct IClassFactory2 IClassFactory2;
-
-
-
-
-
-typedef struct IProvideClassInfo IProvideClassInfo;
-
-
-
-
-
-typedef struct IProvideClassInfo2 IProvideClassInfo2;
-
-
-
-
-
-typedef struct IProvideMultipleClassInfo IProvideMultipleClassInfo;
-
-
-
-
-
-typedef struct IOleControl IOleControl;
-
-
-
-
-
-typedef struct IOleControlSite IOleControlSite;
-
-
-
-
-
-typedef struct IPropertyPage IPropertyPage;
-
-
-
-
-
-typedef struct IPropertyPage2 IPropertyPage2;
-
-
-
-
-
-typedef struct IPropertyPageSite IPropertyPageSite;
-
-
-
-
-
-typedef struct IPropertyNotifySink IPropertyNotifySink;
-
-
-
-
-
-typedef struct ISpecifyPropertyPages ISpecifyPropertyPages;
-
-
-
-
-
-typedef struct IPersistMemory IPersistMemory;
-
-
-
-
-
-typedef struct IPersistStreamInit IPersistStreamInit;
-
-
-
-
-
-typedef struct IPersistPropertyBag IPersistPropertyBag;
-
-
-
-
-
-typedef struct ISimpleFrameSite ISimpleFrameSite;
-
-
-
-
-
-typedef struct IFont IFont;
-
-
-
-
-
-typedef struct IPicture IPicture;
-
-
-
-
-
-typedef struct IFontEventsDisp IFontEventsDisp;
-
-
-
-
-
-typedef struct IFontDisp IFontDisp;
-
-
-
-
-
-typedef struct IPictureDisp IPictureDisp;
-
-
-
-
-
-typedef struct IOleInPlaceObjectWindowless IOleInPlaceObjectWindowless;
-
-
-
-
-
-typedef struct IOleInPlaceSiteEx IOleInPlaceSiteEx;
-
-
-
-
-
-typedef struct IOleInPlaceSiteWindowless IOleInPlaceSiteWindowless;
-
-
-
-
-
-typedef struct IViewObjectEx IViewObjectEx;
-
-
-
-
-
-typedef struct IOleUndoUnit IOleUndoUnit;
-
-
-
-
-
-typedef struct IOleParentUndoUnit IOleParentUndoUnit;
-
-
-
-
-
-typedef struct IEnumOleUndoUnits IEnumOleUndoUnits;
-
-
-
-
-
-typedef struct IOleUndoManager IOleUndoManager;
-
-
-
-
-
-typedef struct IPointerInactive IPointerInactive;
-
-
-
-
-
-typedef struct IObjectWithSite IObjectWithSite;
-
-
-
-
-
-typedef struct IPerPropertyBrowsing IPerPropertyBrowsing;
-
-
-
-
-
-typedef struct IPropertyBag2 IPropertyBag2;
-
-
-
-
-
-typedef struct IPersistPropertyBag2 IPersistPropertyBag2;
-
-
-
-
-
-typedef struct IAdviseSinkEx IAdviseSinkEx;
-
-
-
-
-
-typedef struct IQuickActivate IQuickActivate;
-
-
-
-
-
-
-
-
-
-
-extern "C"{
-
-
-void * __stdcall MIDL_user_allocate(size_t);
-void __stdcall MIDL_user_free( void * ); 
-
-
- 
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_ocidl_0000_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_ocidl_0000_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  
-enum tagUASFLAGS
-    {	UAS_NORMAL	= 0,
-	UAS_BLOCKED	= 0x1,
-	UAS_NOPARENTENABLE	= 0x2,
-	UAS_MASK	= 0x3
-    } 	UASFLAGS;
-
-
-typedef  
-enum tagREADYSTATE
-    {	READYSTATE_UNINITIALIZED	= 0,
-	READYSTATE_LOADING	= 1,
-	READYSTATE_LOADED	= 2,
-	READYSTATE_INTERACTIVE	= 3,
-	READYSTATE_COMPLETE	= 4
-    } 	READYSTATE;
-
-
-
-extern RPC_IF_HANDLE IOleControlTypes_v1_0_c_ifspec;
-extern RPC_IF_HANDLE IOleControlTypes_v1_0_s_ifspec;
-
-
-
-
-
-
- 
-
-typedef IEnumConnections *PENUMCONNECTIONS;
-
-typedef IEnumConnections *LPENUMCONNECTIONS;
-
-typedef struct tagCONNECTDATA
-    {
-    IUnknown *pUnk;
-    DWORD dwCookie;
-    } 	CONNECTDATA;
-
-typedef struct tagCONNECTDATA *PCONNECTDATA;
-
-typedef struct tagCONNECTDATA *LPCONNECTDATA;
-
-
-extern "C" const IID IID_IEnumConnections;
-
-
-    
-    struct __declspec(uuid("B196B287-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
-    IEnumConnections : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Next( 
-             ULONG cConnections,
-             LPCONNECTDATA rgcd,
-             ULONG *pcFetched) = 0;
-        
-        virtual HRESULT __stdcall Skip( 
-             ULONG cConnections) = 0;
-        
-        virtual HRESULT __stdcall Reset( void) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IEnumConnections **ppEnum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IEnumConnections_RemoteNext_Proxy( 
-    IEnumConnections * This,
-     ULONG cConnections,
-     LPCONNECTDATA rgcd,
-     ULONG *pcFetched);
-
-
-void __stdcall IEnumConnections_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumConnections_Skip_Proxy( 
-    IEnumConnections * This,
-     ULONG cConnections);
-
-
-void __stdcall IEnumConnections_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumConnections_Reset_Proxy( 
-    IEnumConnections * This);
-
-
-void __stdcall IEnumConnections_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumConnections_Clone_Proxy( 
-    IEnumConnections * This,
-     IEnumConnections **ppEnum);
-
-
-void __stdcall IEnumConnections_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IConnectionPoint *PCONNECTIONPOINT;
-
-typedef IConnectionPoint *LPCONNECTIONPOINT;
-
-
-extern "C" const IID IID_IConnectionPoint;
-
-
-    
-    struct __declspec(uuid("B196B286-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
-    IConnectionPoint : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetConnectionInterface( 
-             IID *pIID) = 0;
-        
-        virtual HRESULT __stdcall GetConnectionPointContainer( 
-             IConnectionPointContainer **ppCPC) = 0;
-        
-        virtual HRESULT __stdcall Advise( 
-             IUnknown *pUnkSink,
-             DWORD *pdwCookie) = 0;
-        
-        virtual HRESULT __stdcall Unadvise( 
-             DWORD dwCookie) = 0;
-        
-        virtual HRESULT __stdcall EnumConnections( 
-             IEnumConnections **ppEnum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IConnectionPoint_GetConnectionInterface_Proxy( 
-    IConnectionPoint * This,
-     IID *pIID);
-
-
-void __stdcall IConnectionPoint_GetConnectionInterface_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IConnectionPoint_GetConnectionPointContainer_Proxy( 
-    IConnectionPoint * This,
-     IConnectionPointContainer **ppCPC);
-
-
-void __stdcall IConnectionPoint_GetConnectionPointContainer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IConnectionPoint_Advise_Proxy( 
-    IConnectionPoint * This,
-     IUnknown *pUnkSink,
-     DWORD *pdwCookie);
-
-
-void __stdcall IConnectionPoint_Advise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IConnectionPoint_Unadvise_Proxy( 
-    IConnectionPoint * This,
-     DWORD dwCookie);
-
-
-void __stdcall IConnectionPoint_Unadvise_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IConnectionPoint_EnumConnections_Proxy( 
-    IConnectionPoint * This,
-     IEnumConnections **ppEnum);
-
-
-void __stdcall IConnectionPoint_EnumConnections_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IEnumConnectionPoints *PENUMCONNECTIONPOINTS;
-
-typedef IEnumConnectionPoints *LPENUMCONNECTIONPOINTS;
-
-
-extern "C" const IID IID_IEnumConnectionPoints;
-
-
-    
-    struct __declspec(uuid("B196B285-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
-    IEnumConnectionPoints : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Next( 
-             ULONG cConnections,
-             LPCONNECTIONPOINT *ppCP,
-             ULONG *pcFetched) = 0;
-        
-        virtual HRESULT __stdcall Skip( 
-             ULONG cConnections) = 0;
-        
-        virtual HRESULT __stdcall Reset( void) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IEnumConnectionPoints **ppEnum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IEnumConnectionPoints_RemoteNext_Proxy( 
-    IEnumConnectionPoints * This,
-     ULONG cConnections,
-     LPCONNECTIONPOINT *ppCP,
-     ULONG *pcFetched);
-
-
-void __stdcall IEnumConnectionPoints_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumConnectionPoints_Skip_Proxy( 
-    IEnumConnectionPoints * This,
-     ULONG cConnections);
-
-
-void __stdcall IEnumConnectionPoints_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumConnectionPoints_Reset_Proxy( 
-    IEnumConnectionPoints * This);
-
-
-void __stdcall IEnumConnectionPoints_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumConnectionPoints_Clone_Proxy( 
-    IEnumConnectionPoints * This,
-     IEnumConnectionPoints **ppEnum);
-
-
-void __stdcall IEnumConnectionPoints_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IConnectionPointContainer *PCONNECTIONPOINTCONTAINER;
-
-typedef IConnectionPointContainer *LPCONNECTIONPOINTCONTAINER;
-
-
-extern "C" const IID IID_IConnectionPointContainer;
-
-
-    
-    struct __declspec(uuid("B196B284-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
-    IConnectionPointContainer : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall EnumConnectionPoints( 
-             IEnumConnectionPoints **ppEnum) = 0;
-        
-        virtual HRESULT __stdcall FindConnectionPoint( 
-             const IID & riid,
-             IConnectionPoint **ppCP) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IConnectionPointContainer_EnumConnectionPoints_Proxy( 
-    IConnectionPointContainer * This,
-     IEnumConnectionPoints **ppEnum);
-
-
-void __stdcall IConnectionPointContainer_EnumConnectionPoints_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IConnectionPointContainer_FindConnectionPoint_Proxy( 
-    IConnectionPointContainer * This,
-     const IID & riid,
-     IConnectionPoint **ppCP);
-
-
-void __stdcall IConnectionPointContainer_FindConnectionPoint_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IClassFactory2 *LPCLASSFACTORY2;
-
-typedef struct tagLICINFO
-    {
-    LONG cbLicInfo;
-    BOOL fRuntimeKeyAvail;
-    BOOL fLicVerified;
-    } 	LICINFO;
-
-typedef struct tagLICINFO *LPLICINFO;
-
-
-extern "C" const IID IID_IClassFactory2;
-
-
-    
-    struct __declspec(uuid("B196B28F-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
-    IClassFactory2 : public IClassFactory
-    {
-    public:
-        virtual HRESULT __stdcall GetLicInfo( 
-             LICINFO *pLicInfo) = 0;
-        
-        virtual HRESULT __stdcall RequestLicKey( 
-             DWORD dwReserved,
-             BSTR *pBstrKey) = 0;
-        
-        virtual  HRESULT __stdcall CreateInstanceLic( 
-             IUnknown *pUnkOuter,
-             IUnknown *pUnkReserved,
-             const IID & riid,
-             BSTR bstrKey,
-             PVOID *ppvObj) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IClassFactory2_GetLicInfo_Proxy( 
-    IClassFactory2 * This,
-     LICINFO *pLicInfo);
-
-
-void __stdcall IClassFactory2_GetLicInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IClassFactory2_RequestLicKey_Proxy( 
-    IClassFactory2 * This,
-     DWORD dwReserved,
-     BSTR *pBstrKey);
-
-
-void __stdcall IClassFactory2_RequestLicKey_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IClassFactory2_RemoteCreateInstanceLic_Proxy( 
-    IClassFactory2 * This,
-     const IID & riid,
-     BSTR bstrKey,
-     IUnknown **ppvObj);
-
-
-void __stdcall IClassFactory2_RemoteCreateInstanceLic_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IProvideClassInfo *LPPROVIDECLASSINFO;
-
-
-extern "C" const IID IID_IProvideClassInfo;
-
-
-    
-    struct __declspec(uuid("B196B283-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
-    IProvideClassInfo : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetClassInfoW( 
-             ITypeInfo **ppTI) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IProvideClassInfo_GetClassInfo_Proxy( 
-    IProvideClassInfo * This,
-     ITypeInfo **ppTI);
-
-
-void __stdcall IProvideClassInfo_GetClassInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IProvideClassInfo2 *LPPROVIDECLASSINFO2;
-
-typedef 
-enum tagGUIDKIND
-    {	GUIDKIND_DEFAULT_SOURCE_DISP_IID	= 1
-    } 	GUIDKIND;
-
-
-extern "C" const IID IID_IProvideClassInfo2;
-
-
-    
-    struct __declspec(uuid("A6BC3AC0-DBAA-11CE-9DE3-00AA004BB851")) __declspec(novtable)
-    IProvideClassInfo2 : public IProvideClassInfo
-    {
-    public:
-        virtual HRESULT __stdcall GetGUID( 
-             DWORD dwGuidKind,
-             GUID *pGUID) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IProvideClassInfo2_GetGUID_Proxy( 
-    IProvideClassInfo2 * This,
-     DWORD dwGuidKind,
-     GUID *pGUID);
-
-
-void __stdcall IProvideClassInfo2_GetGUID_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-typedef IProvideMultipleClassInfo *LPPROVIDEMULTIPLECLASSINFO;
-
-
-extern "C" const IID IID_IProvideMultipleClassInfo;
-
-
-    
-    struct __declspec(uuid("A7ABA9C1-8983-11cf-8F20-00805F2CD064")) __declspec(novtable)
-    IProvideMultipleClassInfo : public IProvideClassInfo2
-    {
-    public:
-        virtual HRESULT __stdcall GetMultiTypeInfoCount( 
-             ULONG *pcti) = 0;
-        
-        virtual HRESULT __stdcall GetInfoOfIndex( 
-             ULONG iti,
-             DWORD dwFlags,
-             ITypeInfo **pptiCoClass,
-             DWORD *pdwTIFlags,
-             ULONG *pcdispidReserved,
-             IID *piidPrimary,
-             IID *piidSource) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IProvideMultipleClassInfo_GetMultiTypeInfoCount_Proxy( 
-    IProvideMultipleClassInfo * This,
-     ULONG *pcti);
-
-
-void __stdcall IProvideMultipleClassInfo_GetMultiTypeInfoCount_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IProvideMultipleClassInfo_GetInfoOfIndex_Proxy( 
-    IProvideMultipleClassInfo * This,
-     ULONG iti,
-     DWORD dwFlags,
-     ITypeInfo **pptiCoClass,
-     DWORD *pdwTIFlags,
-     ULONG *pcdispidReserved,
-     IID *piidPrimary,
-     IID *piidSource);
-
-
-void __stdcall IProvideMultipleClassInfo_GetInfoOfIndex_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IOleControl *LPOLECONTROL;
-
-typedef struct tagCONTROLINFO
-    {
-    ULONG cb;
-    HACCEL hAccel;
-    USHORT cAccel;
-    DWORD dwFlags;
-    } 	CONTROLINFO;
-
-typedef struct tagCONTROLINFO *LPCONTROLINFO;
-
-typedef 
-enum tagCTRLINFO
-    {	CTRLINFO_EATS_RETURN	= 1,
-	CTRLINFO_EATS_ESCAPE	= 2
-    } 	CTRLINFO;
-
-
-extern "C" const IID IID_IOleControl;
-
-
-    
-    struct __declspec(uuid("B196B288-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
-    IOleControl : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetControlInfo( 
-             CONTROLINFO *pCI) = 0;
-        
-        virtual HRESULT __stdcall OnMnemonic( 
-             MSG *pMsg) = 0;
-        
-        virtual HRESULT __stdcall OnAmbientPropertyChange( 
-             DISPID dispID) = 0;
-        
-        virtual HRESULT __stdcall FreezeEvents( 
-             BOOL bFreeze) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleControl_GetControlInfo_Proxy( 
-    IOleControl * This,
-     CONTROLINFO *pCI);
-
-
-void __stdcall IOleControl_GetControlInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleControl_OnMnemonic_Proxy( 
-    IOleControl * This,
-     MSG *pMsg);
-
-
-void __stdcall IOleControl_OnMnemonic_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleControl_OnAmbientPropertyChange_Proxy( 
-    IOleControl * This,
-     DISPID dispID);
-
-
-void __stdcall IOleControl_OnAmbientPropertyChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleControl_FreezeEvents_Proxy( 
-    IOleControl * This,
-     BOOL bFreeze);
-
-
-void __stdcall IOleControl_FreezeEvents_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IOleControlSite *LPOLECONTROLSITE;
-
-typedef struct tagPOINTF
-    {
-    FLOAT x;
-    FLOAT y;
-    } 	POINTF;
-
-typedef struct tagPOINTF *LPPOINTF;
-
-typedef 
-enum tagXFORMCOORDS
-    {	XFORMCOORDS_POSITION	= 0x1,
-	XFORMCOORDS_SIZE	= 0x2,
-	XFORMCOORDS_HIMETRICTOCONTAINER	= 0x4,
-	XFORMCOORDS_CONTAINERTOHIMETRIC	= 0x8,
-	XFORMCOORDS_EVENTCOMPAT	= 0x10
-    } 	XFORMCOORDS;
-
-
-extern "C" const IID IID_IOleControlSite;
-
-
-    
-    struct __declspec(uuid("B196B289-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
-    IOleControlSite : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall OnControlInfoChanged( void) = 0;
-        
-        virtual HRESULT __stdcall LockInPlaceActive( 
-             BOOL fLock) = 0;
-        
-        virtual HRESULT __stdcall GetExtendedControl( 
-             IDispatch **ppDisp) = 0;
-        
-        virtual HRESULT __stdcall TransformCoords( 
-             POINTL *pPtlHimetric,
-             POINTF *pPtfContainer,
-             DWORD dwFlags) = 0;
-        
-        virtual HRESULT __stdcall TranslateAcceleratorW( 
-             MSG *pMsg,
-             DWORD grfModifiers) = 0;
-        
-        virtual HRESULT __stdcall OnFocus( 
-             BOOL fGotFocus) = 0;
-        
-        virtual HRESULT __stdcall ShowPropertyFrame( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleControlSite_OnControlInfoChanged_Proxy( 
-    IOleControlSite * This);
-
-
-void __stdcall IOleControlSite_OnControlInfoChanged_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleControlSite_LockInPlaceActive_Proxy( 
-    IOleControlSite * This,
-     BOOL fLock);
-
-
-void __stdcall IOleControlSite_LockInPlaceActive_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleControlSite_GetExtendedControl_Proxy( 
-    IOleControlSite * This,
-     IDispatch **ppDisp);
-
-
-void __stdcall IOleControlSite_GetExtendedControl_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleControlSite_TransformCoords_Proxy( 
-    IOleControlSite * This,
-     POINTL *pPtlHimetric,
-     POINTF *pPtfContainer,
-     DWORD dwFlags);
-
-
-void __stdcall IOleControlSite_TransformCoords_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleControlSite_TranslateAccelerator_Proxy( 
-    IOleControlSite * This,
-     MSG *pMsg,
-     DWORD grfModifiers);
-
-
-void __stdcall IOleControlSite_TranslateAccelerator_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleControlSite_OnFocus_Proxy( 
-    IOleControlSite * This,
-     BOOL fGotFocus);
-
-
-void __stdcall IOleControlSite_OnFocus_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleControlSite_ShowPropertyFrame_Proxy( 
-    IOleControlSite * This);
-
-
-void __stdcall IOleControlSite_ShowPropertyFrame_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IPropertyPage *LPPROPERTYPAGE;
-
-typedef struct tagPROPPAGEINFO
-    {
-    ULONG cb;
-    LPOLESTR pszTitle;
-    SIZE size;
-    LPOLESTR pszDocString;
-    LPOLESTR pszHelpFile;
-    DWORD dwHelpContext;
-    } 	PROPPAGEINFO;
-
-typedef struct tagPROPPAGEINFO *LPPROPPAGEINFO;
-
-
-extern "C" const IID IID_IPropertyPage;
-
-
-    
-    struct __declspec(uuid("B196B28D-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
-    IPropertyPage : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall SetPageSite( 
-             IPropertyPageSite *pPageSite) = 0;
-        
-        virtual HRESULT __stdcall Activate( 
-             HWND hWndParent,
-             LPCRECT pRect,
-             BOOL bModal) = 0;
-        
-        virtual HRESULT __stdcall Deactivate( void) = 0;
-        
-        virtual HRESULT __stdcall GetPageInfo( 
-             PROPPAGEINFO *pPageInfo) = 0;
-        
-        virtual HRESULT __stdcall SetObjects( 
-             ULONG cObjects,
-             IUnknown **ppUnk) = 0;
-        
-        virtual HRESULT __stdcall Show( 
-             UINT nCmdShow) = 0;
-        
-        virtual HRESULT __stdcall Move( 
-             LPCRECT pRect) = 0;
-        
-        virtual HRESULT __stdcall IsPageDirty( void) = 0;
-        
-        virtual HRESULT __stdcall Apply( void) = 0;
-        
-        virtual HRESULT __stdcall Help( 
-             LPCOLESTR pszHelpDir) = 0;
-        
-        virtual HRESULT __stdcall TranslateAcceleratorW( 
-             MSG *pMsg) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPropertyPage_SetPageSite_Proxy( 
-    IPropertyPage * This,
-     IPropertyPageSite *pPageSite);
-
-
-void __stdcall IPropertyPage_SetPageSite_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyPage_Activate_Proxy( 
-    IPropertyPage * This,
-     HWND hWndParent,
-     LPCRECT pRect,
-     BOOL bModal);
-
-
-void __stdcall IPropertyPage_Activate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyPage_Deactivate_Proxy( 
-    IPropertyPage * This);
-
-
-void __stdcall IPropertyPage_Deactivate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyPage_GetPageInfo_Proxy( 
-    IPropertyPage * This,
-     PROPPAGEINFO *pPageInfo);
-
-
-void __stdcall IPropertyPage_GetPageInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyPage_SetObjects_Proxy( 
-    IPropertyPage * This,
-     ULONG cObjects,
-     IUnknown **ppUnk);
-
-
-void __stdcall IPropertyPage_SetObjects_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyPage_Show_Proxy( 
-    IPropertyPage * This,
-     UINT nCmdShow);
-
-
-void __stdcall IPropertyPage_Show_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyPage_Move_Proxy( 
-    IPropertyPage * This,
-     LPCRECT pRect);
-
-
-void __stdcall IPropertyPage_Move_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyPage_IsPageDirty_Proxy( 
-    IPropertyPage * This);
-
-
-void __stdcall IPropertyPage_IsPageDirty_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyPage_Apply_Proxy( 
-    IPropertyPage * This);
-
-
-void __stdcall IPropertyPage_Apply_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyPage_Help_Proxy( 
-    IPropertyPage * This,
-     LPCOLESTR pszHelpDir);
-
-
-void __stdcall IPropertyPage_Help_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyPage_TranslateAccelerator_Proxy( 
-    IPropertyPage * This,
-     MSG *pMsg);
-
-
-void __stdcall IPropertyPage_TranslateAccelerator_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IPropertyPage2 *LPPROPERTYPAGE2;
-
-
-extern "C" const IID IID_IPropertyPage2;
-
-
-    
-    struct __declspec(uuid("01E44665-24AC-101B-84ED-08002B2EC713")) __declspec(novtable)
-    IPropertyPage2 : public IPropertyPage
-    {
-    public:
-        virtual HRESULT __stdcall EditProperty( 
-             DISPID dispID) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPropertyPage2_EditProperty_Proxy( 
-    IPropertyPage2 * This,
-     DISPID dispID);
-
-
-void __stdcall IPropertyPage2_EditProperty_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IPropertyPageSite *LPPROPERTYPAGESITE;
-
-typedef 
-enum tagPROPPAGESTATUS
-    {	PROPPAGESTATUS_DIRTY	= 0x1,
-	PROPPAGESTATUS_VALIDATE	= 0x2,
-	PROPPAGESTATUS_CLEAN	= 0x4
-    } 	PROPPAGESTATUS;
-
-
-extern "C" const IID IID_IPropertyPageSite;
-
-
-    
-    struct __declspec(uuid("B196B28C-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
-    IPropertyPageSite : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall OnStatusChange( 
-             DWORD dwFlags) = 0;
-        
-        virtual HRESULT __stdcall GetLocaleID( 
-             LCID *pLocaleID) = 0;
-        
-        virtual HRESULT __stdcall GetPageContainer( 
-             IUnknown **ppUnk) = 0;
-        
-        virtual HRESULT __stdcall TranslateAcceleratorW( 
-             MSG *pMsg) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPropertyPageSite_OnStatusChange_Proxy( 
-    IPropertyPageSite * This,
-     DWORD dwFlags);
-
-
-void __stdcall IPropertyPageSite_OnStatusChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyPageSite_GetLocaleID_Proxy( 
-    IPropertyPageSite * This,
-     LCID *pLocaleID);
-
-
-void __stdcall IPropertyPageSite_GetLocaleID_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyPageSite_GetPageContainer_Proxy( 
-    IPropertyPageSite * This,
-     IUnknown **ppUnk);
-
-
-void __stdcall IPropertyPageSite_GetPageContainer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyPageSite_TranslateAccelerator_Proxy( 
-    IPropertyPageSite * This,
-     MSG *pMsg);
-
-
-void __stdcall IPropertyPageSite_TranslateAccelerator_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IPropertyNotifySink *LPPROPERTYNOTIFYSINK;
-
-
-extern "C" const IID IID_IPropertyNotifySink;
-
-
-    
-    struct __declspec(uuid("9BFBBC02-EFF1-101A-84ED-00AA00341D07")) __declspec(novtable)
-    IPropertyNotifySink : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall OnChanged( 
-             DISPID dispID) = 0;
-        
-        virtual HRESULT __stdcall OnRequestEdit( 
-             DISPID dispID) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPropertyNotifySink_OnChanged_Proxy( 
-    IPropertyNotifySink * This,
-     DISPID dispID);
-
-
-void __stdcall IPropertyNotifySink_OnChanged_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyNotifySink_OnRequestEdit_Proxy( 
-    IPropertyNotifySink * This,
-     DISPID dispID);
-
-
-void __stdcall IPropertyNotifySink_OnRequestEdit_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef ISpecifyPropertyPages *LPSPECIFYPROPERTYPAGES;
-
-typedef struct tagCAUUID
-    {
-    ULONG cElems;
-     GUID *pElems;
-    } 	CAUUID;
-
-typedef struct tagCAUUID *LPCAUUID;
-
-
-extern "C" const IID IID_ISpecifyPropertyPages;
-
-
-    
-    struct __declspec(uuid("B196B28B-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
-    ISpecifyPropertyPages : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetPages( 
-             CAUUID *pPages) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ISpecifyPropertyPages_GetPages_Proxy( 
-    ISpecifyPropertyPages * This,
-     CAUUID *pPages);
-
-
-void __stdcall ISpecifyPropertyPages_GetPages_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IPersistMemory *LPPERSISTMEMORY;
-
-
-extern "C" const IID IID_IPersistMemory;
-
-
-    
-    struct __declspec(uuid("BD1AE5E0-A6AE-11CE-BD37-504200C10000")) __declspec(novtable)
-    IPersistMemory : public IPersist
-    {
-    public:
-        virtual HRESULT __stdcall IsDirty( void) = 0;
-        
-        virtual  HRESULT __stdcall Load( 
-             LPVOID pMem,
-             ULONG cbSize) = 0;
-        
-        virtual  HRESULT __stdcall Save( 
-             LPVOID pMem,
-             BOOL fClearDirty,
-             ULONG cbSize) = 0;
-        
-        virtual HRESULT __stdcall GetSizeMax( 
-             ULONG *pCbSize) = 0;
-        
-        virtual HRESULT __stdcall InitNew( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPersistMemory_IsDirty_Proxy( 
-    IPersistMemory * This);
-
-
-void __stdcall IPersistMemory_IsDirty_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IPersistMemory_RemoteLoad_Proxy( 
-    IPersistMemory * This,
-     BYTE *pMem,
-     ULONG cbSize);
-
-
-void __stdcall IPersistMemory_RemoteLoad_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IPersistMemory_RemoteSave_Proxy( 
-    IPersistMemory * This,
-     BYTE *pMem,
-     BOOL fClearDirty,
-     ULONG cbSize);
-
-
-void __stdcall IPersistMemory_RemoteSave_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistMemory_GetSizeMax_Proxy( 
-    IPersistMemory * This,
-     ULONG *pCbSize);
-
-
-void __stdcall IPersistMemory_GetSizeMax_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistMemory_InitNew_Proxy( 
-    IPersistMemory * This);
-
-
-void __stdcall IPersistMemory_InitNew_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IPersistStreamInit *LPPERSISTSTREAMINIT;
-
-
-extern "C" const IID IID_IPersistStreamInit;
-
-
-    
-    struct __declspec(uuid("7FD52380-4E07-101B-AE2D-08002B2EC713")) __declspec(novtable)
-    IPersistStreamInit : public IPersist
-    {
-    public:
-        virtual HRESULT __stdcall IsDirty( void) = 0;
-        
-        virtual HRESULT __stdcall Load( 
-             LPSTREAM pStm) = 0;
-        
-        virtual HRESULT __stdcall Save( 
-             LPSTREAM pStm,
-             BOOL fClearDirty) = 0;
-        
-        virtual HRESULT __stdcall GetSizeMax( 
-             ULARGE_INTEGER *pCbSize) = 0;
-        
-        virtual HRESULT __stdcall InitNew( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPersistStreamInit_IsDirty_Proxy( 
-    IPersistStreamInit * This);
-
-
-void __stdcall IPersistStreamInit_IsDirty_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistStreamInit_Load_Proxy( 
-    IPersistStreamInit * This,
-     LPSTREAM pStm);
-
-
-void __stdcall IPersistStreamInit_Load_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistStreamInit_Save_Proxy( 
-    IPersistStreamInit * This,
-     LPSTREAM pStm,
-     BOOL fClearDirty);
-
-
-void __stdcall IPersistStreamInit_Save_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistStreamInit_GetSizeMax_Proxy( 
-    IPersistStreamInit * This,
-     ULARGE_INTEGER *pCbSize);
-
-
-void __stdcall IPersistStreamInit_GetSizeMax_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistStreamInit_InitNew_Proxy( 
-    IPersistStreamInit * This);
-
-
-void __stdcall IPersistStreamInit_InitNew_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IPersistPropertyBag *LPPERSISTPROPERTYBAG;
-
-
-extern "C" const IID IID_IPersistPropertyBag;
-
-
-    
-    struct __declspec(uuid("37D84F60-42CB-11CE-8135-00AA004BB851")) __declspec(novtable)
-    IPersistPropertyBag : public IPersist
-    {
-    public:
-        virtual HRESULT __stdcall InitNew( void) = 0;
-        
-        virtual HRESULT __stdcall Load( 
-             IPropertyBag *pPropBag,
-             IErrorLog *pErrorLog) = 0;
-        
-        virtual HRESULT __stdcall Save( 
-             IPropertyBag *pPropBag,
-             BOOL fClearDirty,
-             BOOL fSaveAllProperties) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPersistPropertyBag_InitNew_Proxy( 
-    IPersistPropertyBag * This);
-
-
-void __stdcall IPersistPropertyBag_InitNew_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistPropertyBag_Load_Proxy( 
-    IPersistPropertyBag * This,
-     IPropertyBag *pPropBag,
-     IErrorLog *pErrorLog);
-
-
-void __stdcall IPersistPropertyBag_Load_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistPropertyBag_Save_Proxy( 
-    IPersistPropertyBag * This,
-     IPropertyBag *pPropBag,
-     BOOL fClearDirty,
-     BOOL fSaveAllProperties);
-
-
-void __stdcall IPersistPropertyBag_Save_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef ISimpleFrameSite *LPSIMPLEFRAMESITE;
-
-
-extern "C" const IID IID_ISimpleFrameSite;
-
-
-    
-    struct __declspec(uuid("742B0E01-14E6-101B-914E-00AA00300CAB")) __declspec(novtable)
-    ISimpleFrameSite : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall PreMessageFilter( 
-             HWND hWnd,
-             UINT msg,
-             WPARAM wp,
-             LPARAM lp,
-             LRESULT *plResult,
-             DWORD *pdwCookie) = 0;
-        
-        virtual HRESULT __stdcall PostMessageFilter( 
-             HWND hWnd,
-             UINT msg,
-             WPARAM wp,
-             LPARAM lp,
-             LRESULT *plResult,
-             DWORD dwCookie) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ISimpleFrameSite_PreMessageFilter_Proxy( 
-    ISimpleFrameSite * This,
-     HWND hWnd,
-     UINT msg,
-     WPARAM wp,
-     LPARAM lp,
-     LRESULT *plResult,
-     DWORD *pdwCookie);
-
-
-void __stdcall ISimpleFrameSite_PreMessageFilter_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ISimpleFrameSite_PostMessageFilter_Proxy( 
-    ISimpleFrameSite * This,
-     HWND hWnd,
-     UINT msg,
-     WPARAM wp,
-     LPARAM lp,
-     LRESULT *plResult,
-     DWORD dwCookie);
-
-
-void __stdcall ISimpleFrameSite_PostMessageFilter_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IFont *LPFONT;
-
-
-typedef TEXTMETRICW TEXTMETRICW;
-
-
-
-
-typedef TEXTMETRICW *LPTEXTMETRICW;
-
-
-extern "C" const IID IID_IFont;
-
-
-    
-    struct __declspec(uuid("BEF6E002-A874-101A-8BBA-00AA00300CAB")) __declspec(novtable)
-    IFont : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall get_Name( 
-             BSTR *pName) = 0;
-        
-        virtual HRESULT __stdcall put_Name( 
-             BSTR name) = 0;
-        
-        virtual HRESULT __stdcall get_Size( 
-             CY *pSize) = 0;
-        
-        virtual HRESULT __stdcall put_Size( 
-             CY size) = 0;
-        
-        virtual HRESULT __stdcall get_Bold( 
-             BOOL *pBold) = 0;
-        
-        virtual HRESULT __stdcall put_Bold( 
-             BOOL bold) = 0;
-        
-        virtual HRESULT __stdcall get_Italic( 
-             BOOL *pItalic) = 0;
-        
-        virtual HRESULT __stdcall put_Italic( 
-             BOOL italic) = 0;
-        
-        virtual HRESULT __stdcall get_Underline( 
-             BOOL *pUnderline) = 0;
-        
-        virtual HRESULT __stdcall put_Underline( 
-             BOOL underline) = 0;
-        
-        virtual HRESULT __stdcall get_Strikethrough( 
-             BOOL *pStrikethrough) = 0;
-        
-        virtual HRESULT __stdcall put_Strikethrough( 
-             BOOL strikethrough) = 0;
-        
-        virtual HRESULT __stdcall get_Weight( 
-             SHORT *pWeight) = 0;
-        
-        virtual HRESULT __stdcall put_Weight( 
-             SHORT weight) = 0;
-        
-        virtual HRESULT __stdcall get_Charset( 
-             SHORT *pCharset) = 0;
-        
-        virtual HRESULT __stdcall put_Charset( 
-             SHORT charset) = 0;
-        
-        virtual HRESULT __stdcall get_hFont( 
-             HFONT *phFont) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IFont **ppFont) = 0;
-        
-        virtual HRESULT __stdcall IsEqual( 
-             IFont *pFontOther) = 0;
-        
-        virtual HRESULT __stdcall SetRatio( 
-             LONG cyLogical,
-             LONG cyHimetric) = 0;
-        
-        virtual HRESULT __stdcall QueryTextMetrics( 
-             TEXTMETRICW *pTM) = 0;
-        
-        virtual HRESULT __stdcall AddRefHfont( 
-             HFONT hFont) = 0;
-        
-        virtual HRESULT __stdcall ReleaseHfont( 
-             HFONT hFont) = 0;
-        
-        virtual HRESULT __stdcall SetHdc( 
-             HDC hDC) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IFont_get_Name_Proxy( 
-    IFont * This,
-     BSTR *pName);
-
-
-void __stdcall IFont_get_Name_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_put_Name_Proxy( 
-    IFont * This,
-     BSTR name);
-
-
-void __stdcall IFont_put_Name_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_get_Size_Proxy( 
-    IFont * This,
-     CY *pSize);
-
-
-void __stdcall IFont_get_Size_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_put_Size_Proxy( 
-    IFont * This,
-     CY size);
-
-
-void __stdcall IFont_put_Size_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_get_Bold_Proxy( 
-    IFont * This,
-     BOOL *pBold);
-
-
-void __stdcall IFont_get_Bold_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_put_Bold_Proxy( 
-    IFont * This,
-     BOOL bold);
-
-
-void __stdcall IFont_put_Bold_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_get_Italic_Proxy( 
-    IFont * This,
-     BOOL *pItalic);
-
-
-void __stdcall IFont_get_Italic_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_put_Italic_Proxy( 
-    IFont * This,
-     BOOL italic);
-
-
-void __stdcall IFont_put_Italic_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_get_Underline_Proxy( 
-    IFont * This,
-     BOOL *pUnderline);
-
-
-void __stdcall IFont_get_Underline_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_put_Underline_Proxy( 
-    IFont * This,
-     BOOL underline);
-
-
-void __stdcall IFont_put_Underline_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_get_Strikethrough_Proxy( 
-    IFont * This,
-     BOOL *pStrikethrough);
-
-
-void __stdcall IFont_get_Strikethrough_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_put_Strikethrough_Proxy( 
-    IFont * This,
-     BOOL strikethrough);
-
-
-void __stdcall IFont_put_Strikethrough_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_get_Weight_Proxy( 
-    IFont * This,
-     SHORT *pWeight);
-
-
-void __stdcall IFont_get_Weight_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_put_Weight_Proxy( 
-    IFont * This,
-     SHORT weight);
-
-
-void __stdcall IFont_put_Weight_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_get_Charset_Proxy( 
-    IFont * This,
-     SHORT *pCharset);
-
-
-void __stdcall IFont_get_Charset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_put_Charset_Proxy( 
-    IFont * This,
-     SHORT charset);
-
-
-void __stdcall IFont_put_Charset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_get_hFont_Proxy( 
-    IFont * This,
-     HFONT *phFont);
-
-
-void __stdcall IFont_get_hFont_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_Clone_Proxy( 
-    IFont * This,
-     IFont **ppFont);
-
-
-void __stdcall IFont_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_IsEqual_Proxy( 
-    IFont * This,
-     IFont *pFontOther);
-
-
-void __stdcall IFont_IsEqual_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_SetRatio_Proxy( 
-    IFont * This,
-     LONG cyLogical,
-     LONG cyHimetric);
-
-
-void __stdcall IFont_SetRatio_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_QueryTextMetrics_Proxy( 
-    IFont * This,
-     TEXTMETRICW *pTM);
-
-
-void __stdcall IFont_QueryTextMetrics_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_AddRefHfont_Proxy( 
-    IFont * This,
-     HFONT hFont);
-
-
-void __stdcall IFont_AddRefHfont_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_ReleaseHfont_Proxy( 
-    IFont * This,
-     HFONT hFont);
-
-
-void __stdcall IFont_ReleaseHfont_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IFont_SetHdc_Proxy( 
-    IFont * This,
-     HDC hDC);
-
-
-void __stdcall IFont_SetHdc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IPicture *LPPICTURE;
-
-typedef 
-enum tagPictureAttributes
-    {	PICTURE_SCALABLE	= 0x1,
-	PICTURE_TRANSPARENT	= 0x2
-    } 	PICTUREATTRIBUTES;
-
-typedef   __declspec(uuid("66504313-BE0F-101A-8BBB-00AA00300CAB")) UINT OLE_HANDLE;
-
-typedef   __declspec(uuid("66504306-BE0F-101A-8BBB-00AA00300CAB")) LONG OLE_XPOS_HIMETRIC;
-
-typedef   __declspec(uuid("66504307-BE0F-101A-8BBB-00AA00300CAB")) LONG OLE_YPOS_HIMETRIC;
-
-typedef   __declspec(uuid("66504308-BE0F-101A-8BBB-00AA00300CAB")) LONG OLE_XSIZE_HIMETRIC;
-
-typedef   __declspec(uuid("66504309-BE0F-101A-8BBB-00AA00300CAB")) LONG OLE_YSIZE_HIMETRIC;
-
-
-extern "C" const IID IID_IPicture;
-
-
-    
-    struct __declspec(uuid("7BF80980-BF32-101A-8BBB-00AA00300CAB")) __declspec(novtable)
-    IPicture : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall get_Handle( 
-             OLE_HANDLE *pHandle) = 0;
-        
-        virtual HRESULT __stdcall get_hPal( 
-             OLE_HANDLE *phPal) = 0;
-        
-        virtual HRESULT __stdcall get_Type( 
-             SHORT *pType) = 0;
-        
-        virtual HRESULT __stdcall get_Width( 
-             OLE_XSIZE_HIMETRIC *pWidth) = 0;
-        
-        virtual HRESULT __stdcall get_Height( 
-             OLE_YSIZE_HIMETRIC *pHeight) = 0;
-        
-        virtual HRESULT __stdcall Render( 
-             HDC hDC,
-             LONG x,
-             LONG y,
-             LONG cx,
-             LONG cy,
-             OLE_XPOS_HIMETRIC xSrc,
-             OLE_YPOS_HIMETRIC ySrc,
-             OLE_XSIZE_HIMETRIC cxSrc,
-             OLE_YSIZE_HIMETRIC cySrc,
-             LPCRECT pRcWBounds) = 0;
-        
-        virtual HRESULT __stdcall set_hPal( 
-             OLE_HANDLE hPal) = 0;
-        
-        virtual HRESULT __stdcall get_CurDC( 
-             HDC *phDC) = 0;
-        
-        virtual HRESULT __stdcall SelectPicture( 
-             HDC hDCIn,
-             HDC *phDCOut,
-             OLE_HANDLE *phBmpOut) = 0;
-        
-        virtual HRESULT __stdcall get_KeepOriginalFormat( 
-             BOOL *pKeep) = 0;
-        
-        virtual HRESULT __stdcall put_KeepOriginalFormat( 
-             BOOL keep) = 0;
-        
-        virtual HRESULT __stdcall PictureChanged( void) = 0;
-        
-        virtual HRESULT __stdcall SaveAsFile( 
-             LPSTREAM pStream,
-             BOOL fSaveMemCopy,
-             LONG *pCbSize) = 0;
-        
-        virtual HRESULT __stdcall get_Attributes( 
-             DWORD *pDwAttr) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPicture_get_Handle_Proxy( 
-    IPicture * This,
-     OLE_HANDLE *pHandle);
-
-
-void __stdcall IPicture_get_Handle_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPicture_get_hPal_Proxy( 
-    IPicture * This,
-     OLE_HANDLE *phPal);
-
-
-void __stdcall IPicture_get_hPal_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPicture_get_Type_Proxy( 
-    IPicture * This,
-     SHORT *pType);
-
-
-void __stdcall IPicture_get_Type_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPicture_get_Width_Proxy( 
-    IPicture * This,
-     OLE_XSIZE_HIMETRIC *pWidth);
-
-
-void __stdcall IPicture_get_Width_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPicture_get_Height_Proxy( 
-    IPicture * This,
-     OLE_YSIZE_HIMETRIC *pHeight);
-
-
-void __stdcall IPicture_get_Height_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPicture_Render_Proxy( 
-    IPicture * This,
-     HDC hDC,
-     LONG x,
-     LONG y,
-     LONG cx,
-     LONG cy,
-     OLE_XPOS_HIMETRIC xSrc,
-     OLE_YPOS_HIMETRIC ySrc,
-     OLE_XSIZE_HIMETRIC cxSrc,
-     OLE_YSIZE_HIMETRIC cySrc,
-     LPCRECT pRcWBounds);
-
-
-void __stdcall IPicture_Render_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPicture_set_hPal_Proxy( 
-    IPicture * This,
-     OLE_HANDLE hPal);
-
-
-void __stdcall IPicture_set_hPal_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPicture_get_CurDC_Proxy( 
-    IPicture * This,
-     HDC *phDC);
-
-
-void __stdcall IPicture_get_CurDC_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPicture_SelectPicture_Proxy( 
-    IPicture * This,
-     HDC hDCIn,
-     HDC *phDCOut,
-     OLE_HANDLE *phBmpOut);
-
-
-void __stdcall IPicture_SelectPicture_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPicture_get_KeepOriginalFormat_Proxy( 
-    IPicture * This,
-     BOOL *pKeep);
-
-
-void __stdcall IPicture_get_KeepOriginalFormat_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPicture_put_KeepOriginalFormat_Proxy( 
-    IPicture * This,
-     BOOL keep);
-
-
-void __stdcall IPicture_put_KeepOriginalFormat_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPicture_PictureChanged_Proxy( 
-    IPicture * This);
-
-
-void __stdcall IPicture_PictureChanged_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPicture_SaveAsFile_Proxy( 
-    IPicture * This,
-     LPSTREAM pStream,
-     BOOL fSaveMemCopy,
-     LONG *pCbSize);
-
-
-void __stdcall IPicture_SaveAsFile_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPicture_get_Attributes_Proxy( 
-    IPicture * This,
-     DWORD *pDwAttr);
-
-
-void __stdcall IPicture_get_Attributes_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IFontEventsDisp *LPFONTEVENTS;
-
-
-extern "C" const IID IID_IFontEventsDisp;
-
-
-    
-    struct __declspec(uuid("4EF6100A-AF88-11D0-9846-00C04FC29993")) __declspec(novtable)
-    IFontEventsDisp : public IDispatch
-    {
-    public:
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IFontDisp *LPFONTDISP;
-
-
-extern "C" const IID IID_IFontDisp;
-
-
-    
-    struct __declspec(uuid("BEF6E003-A874-101A-8BBA-00AA00300CAB")) __declspec(novtable)
-    IFontDisp : public IDispatch
-    {
-    public:
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IPictureDisp *LPPICTUREDISP;
-
-
-extern "C" const IID IID_IPictureDisp;
-
-
-    
-    struct __declspec(uuid("7BF80981-BF32-101A-8BBB-00AA00300CAB")) __declspec(novtable)
-    IPictureDisp : public IDispatch
-    {
-    public:
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IOleInPlaceObjectWindowless *LPOLEINPLACEOBJECTWINDOWLESS;
-
-
-extern "C" const IID IID_IOleInPlaceObjectWindowless;
-
-
-    
-    struct __declspec(uuid("1C2056CC-5EF4-101B-8BC8-00AA003E3B29")) __declspec(novtable)
-    IOleInPlaceObjectWindowless : public IOleInPlaceObject
-    {
-    public:
-        virtual HRESULT __stdcall OnWindowMessage( 
-             UINT msg,
-             WPARAM wParam,
-             LPARAM lParam,
-             LRESULT *plResult) = 0;
-        
-        virtual HRESULT __stdcall GetDropTarget( 
-             IDropTarget **ppDropTarget) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleInPlaceObjectWindowless_OnWindowMessage_Proxy( 
-    IOleInPlaceObjectWindowless * This,
-     UINT msg,
-     WPARAM wParam,
-     LPARAM lParam,
-     LRESULT *plResult);
-
-
-void __stdcall IOleInPlaceObjectWindowless_OnWindowMessage_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceObjectWindowless_GetDropTarget_Proxy( 
-    IOleInPlaceObjectWindowless * This,
-     IDropTarget **ppDropTarget);
-
-
-void __stdcall IOleInPlaceObjectWindowless_GetDropTarget_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IOleInPlaceSiteEx *LPOLEINPLACESITEEX;
-
-typedef  
-enum tagACTIVATEFLAGS
-    {	ACTIVATE_WINDOWLESS	= 1
-    } 	ACTIVATEFLAGS;
-
-
-extern "C" const IID IID_IOleInPlaceSiteEx;
-
-
-    
-    struct __declspec(uuid("9C2CAD80-3424-11CF-B670-00AA004CD6D8")) __declspec(novtable)
-    IOleInPlaceSiteEx : public IOleInPlaceSite
-    {
-    public:
-        virtual HRESULT __stdcall OnInPlaceActivateEx( 
-             BOOL *pfNoRedraw,
-             DWORD dwFlags) = 0;
-        
-        virtual HRESULT __stdcall OnInPlaceDeactivateEx( 
-             BOOL fNoRedraw) = 0;
-        
-        virtual HRESULT __stdcall RequestUIActivate( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleInPlaceSiteEx_OnInPlaceActivateEx_Proxy( 
-    IOleInPlaceSiteEx * This,
-     BOOL *pfNoRedraw,
-     DWORD dwFlags);
-
-
-void __stdcall IOleInPlaceSiteEx_OnInPlaceActivateEx_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSiteEx_OnInPlaceDeactivateEx_Proxy( 
-    IOleInPlaceSiteEx * This,
-     BOOL fNoRedraw);
-
-
-void __stdcall IOleInPlaceSiteEx_OnInPlaceDeactivateEx_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSiteEx_RequestUIActivate_Proxy( 
-    IOleInPlaceSiteEx * This);
-
-
-void __stdcall IOleInPlaceSiteEx_RequestUIActivate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IOleInPlaceSiteWindowless *LPOLEINPLACESITEWINDOWLESS;
-
-typedef  
-enum tagOLEDCFLAGS
-    {	OLEDC_NODRAW	= 0x1,
-	OLEDC_PAINTBKGND	= 0x2,
-	OLEDC_OFFSCREEN	= 0x4
-    } 	OLEDCFLAGS;
-
-
-extern "C" const IID IID_IOleInPlaceSiteWindowless;
-
-
-    
-    struct __declspec(uuid("922EADA0-3424-11CF-B670-00AA004CD6D8")) __declspec(novtable)
-    IOleInPlaceSiteWindowless : public IOleInPlaceSiteEx
-    {
-    public:
-        virtual HRESULT __stdcall CanWindowlessActivate( void) = 0;
-        
-        virtual HRESULT __stdcall GetCapture( void) = 0;
-        
-        virtual HRESULT __stdcall SetCapture( 
-             BOOL fCapture) = 0;
-        
-        virtual HRESULT __stdcall GetFocus( void) = 0;
-        
-        virtual HRESULT __stdcall SetFocus( 
-             BOOL fFocus) = 0;
-        
-        virtual HRESULT __stdcall GetDC( 
-             LPCRECT pRect,
-             DWORD grfFlags,
-             HDC *phDC) = 0;
-        
-        virtual HRESULT __stdcall ReleaseDC( 
-             HDC hDC) = 0;
-        
-        virtual HRESULT __stdcall InvalidateRect( 
-             LPCRECT pRect,
-             BOOL fErase) = 0;
-        
-        virtual HRESULT __stdcall InvalidateRgn( 
-             HRGN hRGN,
-             BOOL fErase) = 0;
-        
-        virtual HRESULT __stdcall ScrollRect( 
-             INT dx,
-             INT dy,
-             LPCRECT pRectScroll,
-             LPCRECT pRectClip) = 0;
-        
-        virtual HRESULT __stdcall AdjustRect( 
-             LPRECT prc) = 0;
-        
-        virtual HRESULT __stdcall OnDefWindowMessage( 
-             UINT msg,
-             WPARAM wParam,
-             LPARAM lParam,
-             LRESULT *plResult) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleInPlaceSiteWindowless_CanWindowlessActivate_Proxy( 
-    IOleInPlaceSiteWindowless * This);
-
-
-void __stdcall IOleInPlaceSiteWindowless_CanWindowlessActivate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSiteWindowless_GetCapture_Proxy( 
-    IOleInPlaceSiteWindowless * This);
-
-
-void __stdcall IOleInPlaceSiteWindowless_GetCapture_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSiteWindowless_SetCapture_Proxy( 
-    IOleInPlaceSiteWindowless * This,
-     BOOL fCapture);
-
-
-void __stdcall IOleInPlaceSiteWindowless_SetCapture_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSiteWindowless_GetFocus_Proxy( 
-    IOleInPlaceSiteWindowless * This);
-
-
-void __stdcall IOleInPlaceSiteWindowless_GetFocus_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSiteWindowless_SetFocus_Proxy( 
-    IOleInPlaceSiteWindowless * This,
-     BOOL fFocus);
-
-
-void __stdcall IOleInPlaceSiteWindowless_SetFocus_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSiteWindowless_GetDC_Proxy( 
-    IOleInPlaceSiteWindowless * This,
-     LPCRECT pRect,
-     DWORD grfFlags,
-     HDC *phDC);
-
-
-void __stdcall IOleInPlaceSiteWindowless_GetDC_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSiteWindowless_ReleaseDC_Proxy( 
-    IOleInPlaceSiteWindowless * This,
-     HDC hDC);
-
-
-void __stdcall IOleInPlaceSiteWindowless_ReleaseDC_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSiteWindowless_InvalidateRect_Proxy( 
-    IOleInPlaceSiteWindowless * This,
-     LPCRECT pRect,
-     BOOL fErase);
-
-
-void __stdcall IOleInPlaceSiteWindowless_InvalidateRect_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSiteWindowless_InvalidateRgn_Proxy( 
-    IOleInPlaceSiteWindowless * This,
-     HRGN hRGN,
-     BOOL fErase);
-
-
-void __stdcall IOleInPlaceSiteWindowless_InvalidateRgn_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSiteWindowless_ScrollRect_Proxy( 
-    IOleInPlaceSiteWindowless * This,
-     INT dx,
-     INT dy,
-     LPCRECT pRectScroll,
-     LPCRECT pRectClip);
-
-
-void __stdcall IOleInPlaceSiteWindowless_ScrollRect_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSiteWindowless_AdjustRect_Proxy( 
-    IOleInPlaceSiteWindowless * This,
-     LPRECT prc);
-
-
-void __stdcall IOleInPlaceSiteWindowless_AdjustRect_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleInPlaceSiteWindowless_OnDefWindowMessage_Proxy( 
-    IOleInPlaceSiteWindowless * This,
-     UINT msg,
-     WPARAM wParam,
-     LPARAM lParam,
-     LRESULT *plResult);
-
-
-void __stdcall IOleInPlaceSiteWindowless_OnDefWindowMessage_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IViewObjectEx *LPVIEWOBJECTEX;
-
-typedef  
-enum tagVIEWSTATUS
-    {	VIEWSTATUS_OPAQUE	= 1,
-	VIEWSTATUS_SOLIDBKGND	= 2,
-	VIEWSTATUS_DVASPECTOPAQUE	= 4,
-	VIEWSTATUS_DVASPECTTRANSPARENT	= 8,
-	VIEWSTATUS_SURFACE	= 16,
-	VIEWSTATUS_3DSURFACE	= 32
-    } 	VIEWSTATUS;
-
-typedef  
-enum tagHITRESULT
-    {	HITRESULT_OUTSIDE	= 0,
-	HITRESULT_TRANSPARENT	= 1,
-	HITRESULT_CLOSE	= 2,
-	HITRESULT_HIT	= 3
-    } 	HITRESULT;
-
-typedef  
-enum tagDVASPECT2
-    {	DVASPECT_OPAQUE	= 16,
-	DVASPECT_TRANSPARENT	= 32
-    } 	DVASPECT2;
-
-typedef struct tagExtentInfo
-    {
-    ULONG cb;
-    DWORD dwExtentMode;
-    SIZEL sizelProposed;
-    } 	DVEXTENTINFO;
-
-typedef  
-enum tagExtentMode
-    {	DVEXTENT_CONTENT	= 0,
-	DVEXTENT_INTEGRAL	= DVEXTENT_CONTENT + 1
-    } 	DVEXTENTMODE;
-
-typedef  
-enum tagAspectInfoFlag
-    {	DVASPECTINFOFLAG_CANOPTIMIZE	= 1
-    } 	DVASPECTINFOFLAG;
-
-typedef struct tagAspectInfo
-    {
-    ULONG cb;
-    DWORD dwFlags;
-    } 	DVASPECTINFO;
-
-
-extern "C" const IID IID_IViewObjectEx;
-
-
-    
-    struct __declspec(uuid("3AF24292-0C96-11CE-A0CF-00AA00600AB8")) __declspec(novtable)
-    IViewObjectEx : public IViewObject2
-    {
-    public:
-        virtual HRESULT __stdcall GetRect( 
-             DWORD dwAspect,
-             LPRECTL pRect) = 0;
-        
-        virtual HRESULT __stdcall GetViewStatus( 
-             DWORD *pdwStatus) = 0;
-        
-        virtual HRESULT __stdcall QueryHitPoint( 
-             DWORD dwAspect,
-             LPCRECT pRectBounds,
-             POINT ptlLoc,
-             LONG lCloseHint,
-             DWORD *pHitResult) = 0;
-        
-        virtual HRESULT __stdcall QueryHitRect( 
-             DWORD dwAspect,
-             LPCRECT pRectBounds,
-             LPCRECT pRectLoc,
-             LONG lCloseHint,
-             DWORD *pHitResult) = 0;
-        
-        virtual HRESULT __stdcall GetNaturalExtent( 
-             DWORD dwAspect,
-             LONG lindex,
-             DVTARGETDEVICE *ptd,
-             HDC hicTargetDev,
-             DVEXTENTINFO *pExtentInfo,
-             LPSIZEL pSizel) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IViewObjectEx_GetRect_Proxy( 
-    IViewObjectEx * This,
-     DWORD dwAspect,
-     LPRECTL pRect);
-
-
-void __stdcall IViewObjectEx_GetRect_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IViewObjectEx_GetViewStatus_Proxy( 
-    IViewObjectEx * This,
-     DWORD *pdwStatus);
-
-
-void __stdcall IViewObjectEx_GetViewStatus_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IViewObjectEx_QueryHitPoint_Proxy( 
-    IViewObjectEx * This,
-     DWORD dwAspect,
-     LPCRECT pRectBounds,
-     POINT ptlLoc,
-     LONG lCloseHint,
-     DWORD *pHitResult);
-
-
-void __stdcall IViewObjectEx_QueryHitPoint_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IViewObjectEx_QueryHitRect_Proxy( 
-    IViewObjectEx * This,
-     DWORD dwAspect,
-     LPCRECT pRectBounds,
-     LPCRECT pRectLoc,
-     LONG lCloseHint,
-     DWORD *pHitResult);
-
-
-void __stdcall IViewObjectEx_QueryHitRect_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IViewObjectEx_GetNaturalExtent_Proxy( 
-    IViewObjectEx * This,
-     DWORD dwAspect,
-     LONG lindex,
-     DVTARGETDEVICE *ptd,
-     HDC hicTargetDev,
-     DVEXTENTINFO *pExtentInfo,
-     LPSIZEL pSizel);
-
-
-void __stdcall IViewObjectEx_GetNaturalExtent_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IOleUndoUnit *LPOLEUNDOUNIT;
-
-
-extern "C" const IID IID_IOleUndoUnit;
-
-
-    
-    struct __declspec(uuid("894AD3B0-EF97-11CE-9BC9-00AA00608E01")) __declspec(novtable)
-    IOleUndoUnit : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Do( 
-             IOleUndoManager *pUndoManager) = 0;
-        
-        virtual HRESULT __stdcall GetDescription( 
-             BSTR *pBstr) = 0;
-        
-        virtual HRESULT __stdcall GetUnitType( 
-             CLSID *pClsid,
-             LONG *plID) = 0;
-        
-        virtual HRESULT __stdcall OnNextAdd( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleUndoUnit_Do_Proxy( 
-    IOleUndoUnit * This,
-     IOleUndoManager *pUndoManager);
-
-
-void __stdcall IOleUndoUnit_Do_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleUndoUnit_GetDescription_Proxy( 
-    IOleUndoUnit * This,
-     BSTR *pBstr);
-
-
-void __stdcall IOleUndoUnit_GetDescription_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleUndoUnit_GetUnitType_Proxy( 
-    IOleUndoUnit * This,
-     CLSID *pClsid,
-     LONG *plID);
-
-
-void __stdcall IOleUndoUnit_GetUnitType_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleUndoUnit_OnNextAdd_Proxy( 
-    IOleUndoUnit * This);
-
-
-void __stdcall IOleUndoUnit_OnNextAdd_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IOleParentUndoUnit *LPOLEPARENTUNDOUNIT;
-
-
-extern "C" const IID IID_IOleParentUndoUnit;
-
-
-    
-    struct __declspec(uuid("A1FAF330-EF97-11CE-9BC9-00AA00608E01")) __declspec(novtable)
-    IOleParentUndoUnit : public IOleUndoUnit
-    {
-    public:
-        virtual HRESULT __stdcall Open( 
-             IOleParentUndoUnit *pPUU) = 0;
-        
-        virtual HRESULT __stdcall Close( 
-             IOleParentUndoUnit *pPUU,
-             BOOL fCommit) = 0;
-        
-        virtual HRESULT __stdcall Add( 
-             IOleUndoUnit *pUU) = 0;
-        
-        virtual HRESULT __stdcall FindUnit( 
-             IOleUndoUnit *pUU) = 0;
-        
-        virtual HRESULT __stdcall GetParentState( 
-             DWORD *pdwState) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleParentUndoUnit_Open_Proxy( 
-    IOleParentUndoUnit * This,
-     IOleParentUndoUnit *pPUU);
-
-
-void __stdcall IOleParentUndoUnit_Open_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleParentUndoUnit_Close_Proxy( 
-    IOleParentUndoUnit * This,
-     IOleParentUndoUnit *pPUU,
-     BOOL fCommit);
-
-
-void __stdcall IOleParentUndoUnit_Close_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleParentUndoUnit_Add_Proxy( 
-    IOleParentUndoUnit * This,
-     IOleUndoUnit *pUU);
-
-
-void __stdcall IOleParentUndoUnit_Add_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleParentUndoUnit_FindUnit_Proxy( 
-    IOleParentUndoUnit * This,
-     IOleUndoUnit *pUU);
-
-
-void __stdcall IOleParentUndoUnit_FindUnit_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleParentUndoUnit_GetParentState_Proxy( 
-    IOleParentUndoUnit * This,
-     DWORD *pdwState);
-
-
-void __stdcall IOleParentUndoUnit_GetParentState_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IEnumOleUndoUnits *LPENUMOLEUNDOUNITS;
-
-
-extern "C" const IID IID_IEnumOleUndoUnits;
-
-
-    
-    struct __declspec(uuid("B3E7C340-EF97-11CE-9BC9-00AA00608E01")) __declspec(novtable)
-    IEnumOleUndoUnits : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall Next( 
-             ULONG cElt,
-             IOleUndoUnit **rgElt,
-             ULONG *pcEltFetched) = 0;
-        
-        virtual HRESULT __stdcall Skip( 
-             ULONG cElt) = 0;
-        
-        virtual HRESULT __stdcall Reset( void) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IEnumOleUndoUnits **ppEnum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IEnumOleUndoUnits_RemoteNext_Proxy( 
-    IEnumOleUndoUnits * This,
-     ULONG cElt,
-     IOleUndoUnit **rgElt,
-     ULONG *pcEltFetched);
-
-
-void __stdcall IEnumOleUndoUnits_RemoteNext_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumOleUndoUnits_Skip_Proxy( 
-    IEnumOleUndoUnits * This,
-     ULONG cElt);
-
-
-void __stdcall IEnumOleUndoUnits_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumOleUndoUnits_Reset_Proxy( 
-    IEnumOleUndoUnits * This);
-
-
-void __stdcall IEnumOleUndoUnits_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumOleUndoUnits_Clone_Proxy( 
-    IEnumOleUndoUnits * This,
-     IEnumOleUndoUnits **ppEnum);
-
-
-void __stdcall IEnumOleUndoUnits_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-typedef IOleUndoManager *LPOLEUNDOMANAGER;
-
-
-extern "C" const IID IID_IOleUndoManager;
-
-
-    
-    struct __declspec(uuid("D001F200-EF97-11CE-9BC9-00AA00608E01")) __declspec(novtable)
-    IOleUndoManager : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Open( 
-             IOleParentUndoUnit *pPUU) = 0;
-        
-        virtual HRESULT __stdcall Close( 
-             IOleParentUndoUnit *pPUU,
-             BOOL fCommit) = 0;
-        
-        virtual HRESULT __stdcall Add( 
-             IOleUndoUnit *pUU) = 0;
-        
-        virtual HRESULT __stdcall GetOpenParentState( 
-             DWORD *pdwState) = 0;
-        
-        virtual HRESULT __stdcall DiscardFrom( 
-             IOleUndoUnit *pUU) = 0;
-        
-        virtual HRESULT __stdcall UndoTo( 
-             IOleUndoUnit *pUU) = 0;
-        
-        virtual HRESULT __stdcall RedoTo( 
-             IOleUndoUnit *pUU) = 0;
-        
-        virtual HRESULT __stdcall EnumUndoable( 
-             IEnumOleUndoUnits **ppEnum) = 0;
-        
-        virtual HRESULT __stdcall EnumRedoable( 
-             IEnumOleUndoUnits **ppEnum) = 0;
-        
-        virtual HRESULT __stdcall GetLastUndoDescription( 
-             BSTR *pBstr) = 0;
-        
-        virtual HRESULT __stdcall GetLastRedoDescription( 
-             BSTR *pBstr) = 0;
-        
-        virtual HRESULT __stdcall Enable( 
-             BOOL fEnable) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IOleUndoManager_Open_Proxy( 
-    IOleUndoManager * This,
-     IOleParentUndoUnit *pPUU);
-
-
-void __stdcall IOleUndoManager_Open_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleUndoManager_Close_Proxy( 
-    IOleUndoManager * This,
-     IOleParentUndoUnit *pPUU,
-     BOOL fCommit);
-
-
-void __stdcall IOleUndoManager_Close_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleUndoManager_Add_Proxy( 
-    IOleUndoManager * This,
-     IOleUndoUnit *pUU);
-
-
-void __stdcall IOleUndoManager_Add_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleUndoManager_GetOpenParentState_Proxy( 
-    IOleUndoManager * This,
-     DWORD *pdwState);
-
-
-void __stdcall IOleUndoManager_GetOpenParentState_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleUndoManager_DiscardFrom_Proxy( 
-    IOleUndoManager * This,
-     IOleUndoUnit *pUU);
-
-
-void __stdcall IOleUndoManager_DiscardFrom_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleUndoManager_UndoTo_Proxy( 
-    IOleUndoManager * This,
-     IOleUndoUnit *pUU);
-
-
-void __stdcall IOleUndoManager_UndoTo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleUndoManager_RedoTo_Proxy( 
-    IOleUndoManager * This,
-     IOleUndoUnit *pUU);
-
-
-void __stdcall IOleUndoManager_RedoTo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleUndoManager_EnumUndoable_Proxy( 
-    IOleUndoManager * This,
-     IEnumOleUndoUnits **ppEnum);
-
-
-void __stdcall IOleUndoManager_EnumUndoable_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleUndoManager_EnumRedoable_Proxy( 
-    IOleUndoManager * This,
-     IEnumOleUndoUnits **ppEnum);
-
-
-void __stdcall IOleUndoManager_EnumRedoable_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleUndoManager_GetLastUndoDescription_Proxy( 
-    IOleUndoManager * This,
-     BSTR *pBstr);
-
-
-void __stdcall IOleUndoManager_GetLastUndoDescription_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleUndoManager_GetLastRedoDescription_Proxy( 
-    IOleUndoManager * This,
-     BSTR *pBstr);
-
-
-void __stdcall IOleUndoManager_GetLastRedoDescription_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IOleUndoManager_Enable_Proxy( 
-    IOleUndoManager * This,
-     BOOL fEnable);
-
-
-void __stdcall IOleUndoManager_Enable_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IPointerInactive *LPPOINTERINACTIVE;
-
-typedef  
-enum tagPOINTERINACTIVE
-    {	POINTERINACTIVE_ACTIVATEONENTRY	= 1,
-	POINTERINACTIVE_DEACTIVATEONLEAVE	= 2,
-	POINTERINACTIVE_ACTIVATEONDRAG	= 4
-    } 	POINTERINACTIVE;
-
-
-extern "C" const IID IID_IPointerInactive;
-
-
-    
-    struct __declspec(uuid("55980BA0-35AA-11CF-B671-00AA004CD6D8")) __declspec(novtable)
-    IPointerInactive : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetActivationPolicy( 
-             DWORD *pdwPolicy) = 0;
-        
-        virtual HRESULT __stdcall OnInactiveMouseMove( 
-             LPCRECT pRectBounds,
-             LONG x,
-             LONG y,
-             DWORD grfKeyState) = 0;
-        
-        virtual HRESULT __stdcall OnInactiveSetCursor( 
-             LPCRECT pRectBounds,
-             LONG x,
-             LONG y,
-             DWORD dwMouseMsg,
-             BOOL fSetAlways) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPointerInactive_GetActivationPolicy_Proxy( 
-    IPointerInactive * This,
-     DWORD *pdwPolicy);
-
-
-void __stdcall IPointerInactive_GetActivationPolicy_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPointerInactive_OnInactiveMouseMove_Proxy( 
-    IPointerInactive * This,
-     LPCRECT pRectBounds,
-     LONG x,
-     LONG y,
-     DWORD grfKeyState);
-
-
-void __stdcall IPointerInactive_OnInactiveMouseMove_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPointerInactive_OnInactiveSetCursor_Proxy( 
-    IPointerInactive * This,
-     LPCRECT pRectBounds,
-     LONG x,
-     LONG y,
-     DWORD dwMouseMsg,
-     BOOL fSetAlways);
-
-
-void __stdcall IPointerInactive_OnInactiveSetCursor_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IObjectWithSite *LPOBJECTWITHSITE;
-
-
-extern "C" const IID IID_IObjectWithSite;
-
-
-    
-    struct __declspec(uuid("FC4801A3-2BA9-11CF-A229-00AA003D7352")) __declspec(novtable)
-    IObjectWithSite : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall SetSite( 
-             IUnknown *pUnkSite) = 0;
-        
-        virtual HRESULT __stdcall GetSite( 
-             const IID & riid,
-             void **ppvSite) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IObjectWithSite_SetSite_Proxy( 
-    IObjectWithSite * This,
-     IUnknown *pUnkSite);
-
-
-void __stdcall IObjectWithSite_SetSite_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IObjectWithSite_GetSite_Proxy( 
-    IObjectWithSite * This,
-     const IID & riid,
-     void **ppvSite);
-
-
-void __stdcall IObjectWithSite_GetSite_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IPerPropertyBrowsing *LPPERPROPERTYBROWSING;
-
-typedef struct tagCALPOLESTR
-    {
-    ULONG cElems;
-     LPOLESTR *pElems;
-    } 	CALPOLESTR;
-
-typedef struct tagCALPOLESTR *LPCALPOLESTR;
-
-typedef struct tagCADWORD
-    {
-    ULONG cElems;
-     DWORD *pElems;
-    } 	CADWORD;
-
-typedef struct tagCADWORD *LPCADWORD;
-
-
-extern "C" const IID IID_IPerPropertyBrowsing;
-
-
-    
-    struct __declspec(uuid("376BD3AA-3845-101B-84ED-08002B2EC713")) __declspec(novtable)
-    IPerPropertyBrowsing : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetDisplayString( 
-             DISPID dispID,
-             BSTR *pBstr) = 0;
-        
-        virtual HRESULT __stdcall MapPropertyToPage( 
-             DISPID dispID,
-             CLSID *pClsid) = 0;
-        
-        virtual HRESULT __stdcall GetPredefinedStrings( 
-             DISPID dispID,
-             CALPOLESTR *pCaStringsOut,
-             CADWORD *pCaCookiesOut) = 0;
-        
-        virtual HRESULT __stdcall GetPredefinedValue( 
-             DISPID dispID,
-             DWORD dwCookie,
-             VARIANT *pVarOut) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPerPropertyBrowsing_GetDisplayString_Proxy( 
-    IPerPropertyBrowsing * This,
-     DISPID dispID,
-     BSTR *pBstr);
-
-
-void __stdcall IPerPropertyBrowsing_GetDisplayString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPerPropertyBrowsing_MapPropertyToPage_Proxy( 
-    IPerPropertyBrowsing * This,
-     DISPID dispID,
-     CLSID *pClsid);
-
-
-void __stdcall IPerPropertyBrowsing_MapPropertyToPage_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPerPropertyBrowsing_GetPredefinedStrings_Proxy( 
-    IPerPropertyBrowsing * This,
-     DISPID dispID,
-     CALPOLESTR *pCaStringsOut,
-     CADWORD *pCaCookiesOut);
-
-
-void __stdcall IPerPropertyBrowsing_GetPredefinedStrings_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPerPropertyBrowsing_GetPredefinedValue_Proxy( 
-    IPerPropertyBrowsing * This,
-     DISPID dispID,
-     DWORD dwCookie,
-     VARIANT *pVarOut);
-
-
-void __stdcall IPerPropertyBrowsing_GetPredefinedValue_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IPropertyBag2 *LPPROPERTYBAG2;
-
-typedef  
-enum tagPROPBAG2_TYPE
-    {	PROPBAG2_TYPE_UNDEFINED	= 0,
-	PROPBAG2_TYPE_DATA	= 1,
-	PROPBAG2_TYPE_URL	= 2,
-	PROPBAG2_TYPE_OBJECT	= 3,
-	PROPBAG2_TYPE_STREAM	= 4,
-	PROPBAG2_TYPE_STORAGE	= 5,
-	PROPBAG2_TYPE_MONIKER	= 6
-    } 	PROPBAG2_TYPE;
-
-typedef struct tagPROPBAG2
-    {
-    DWORD dwType;
-    VARTYPE vt;
-    CLIPFORMAT cfType;
-    DWORD dwHint;
-    LPOLESTR pstrName;
-    CLSID clsid;
-    } 	PROPBAG2;
-
-
-extern "C" const IID IID_IPropertyBag2;
-
-
-    
-    struct __declspec(uuid("22F55882-280B-11d0-A8A9-00A0C90C2004")) __declspec(novtable)
-    IPropertyBag2 : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Read( 
-             ULONG cProperties,
-             PROPBAG2 *pPropBag,
-             IErrorLog *pErrLog,
-             VARIANT *pvarValue,
-             HRESULT *phrError) = 0;
-        
-        virtual HRESULT __stdcall Write( 
-             ULONG cProperties,
-             PROPBAG2 *pPropBag,
-             VARIANT *pvarValue) = 0;
-        
-        virtual HRESULT __stdcall CountProperties( 
-             ULONG *pcProperties) = 0;
-        
-        virtual HRESULT __stdcall GetPropertyInfo( 
-             ULONG iProperty,
-             ULONG cProperties,
-             PROPBAG2 *pPropBag,
-             ULONG *pcProperties) = 0;
-        
-        virtual HRESULT __stdcall LoadObject( 
-             LPCOLESTR pstrName,
-             DWORD dwHint,
-             IUnknown *pUnkObject,
-             IErrorLog *pErrLog) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPropertyBag2_Read_Proxy( 
-    IPropertyBag2 * This,
-     ULONG cProperties,
-     PROPBAG2 *pPropBag,
-     IErrorLog *pErrLog,
-     VARIANT *pvarValue,
-     HRESULT *phrError);
-
-
-void __stdcall IPropertyBag2_Read_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyBag2_Write_Proxy( 
-    IPropertyBag2 * This,
-     ULONG cProperties,
-     PROPBAG2 *pPropBag,
-     VARIANT *pvarValue);
-
-
-void __stdcall IPropertyBag2_Write_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyBag2_CountProperties_Proxy( 
-    IPropertyBag2 * This,
-     ULONG *pcProperties);
-
-
-void __stdcall IPropertyBag2_CountProperties_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyBag2_GetPropertyInfo_Proxy( 
-    IPropertyBag2 * This,
-     ULONG iProperty,
-     ULONG cProperties,
-     PROPBAG2 *pPropBag,
-     ULONG *pcProperties);
-
-
-void __stdcall IPropertyBag2_GetPropertyInfo_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPropertyBag2_LoadObject_Proxy( 
-    IPropertyBag2 * This,
-     LPCOLESTR pstrName,
-     DWORD dwHint,
-     IUnknown *pUnkObject,
-     IErrorLog *pErrLog);
-
-
-void __stdcall IPropertyBag2_LoadObject_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IPersistPropertyBag2 *LPPERSISTPROPERTYBAG2;
-
-
-extern "C" const IID IID_IPersistPropertyBag2;
-
-
-    
-    struct __declspec(uuid("22F55881-280B-11d0-A8A9-00A0C90C2004")) __declspec(novtable)
-    IPersistPropertyBag2 : public IPersist
-    {
-    public:
-        virtual HRESULT __stdcall InitNew( void) = 0;
-        
-        virtual HRESULT __stdcall Load( 
-             IPropertyBag2 *pPropBag,
-             IErrorLog *pErrLog) = 0;
-        
-        virtual HRESULT __stdcall Save( 
-             IPropertyBag2 *pPropBag,
-             BOOL fClearDirty,
-             BOOL fSaveAllProperties) = 0;
-        
-        virtual HRESULT __stdcall IsDirty( void) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IPersistPropertyBag2_InitNew_Proxy( 
-    IPersistPropertyBag2 * This);
-
-
-void __stdcall IPersistPropertyBag2_InitNew_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistPropertyBag2_Load_Proxy( 
-    IPersistPropertyBag2 * This,
-     IPropertyBag2 *pPropBag,
-     IErrorLog *pErrLog);
-
-
-void __stdcall IPersistPropertyBag2_Load_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistPropertyBag2_Save_Proxy( 
-    IPersistPropertyBag2 * This,
-     IPropertyBag2 *pPropBag,
-     BOOL fClearDirty,
-     BOOL fSaveAllProperties);
-
-
-void __stdcall IPersistPropertyBag2_Save_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IPersistPropertyBag2_IsDirty_Proxy( 
-    IPersistPropertyBag2 * This);
-
-
-void __stdcall IPersistPropertyBag2_IsDirty_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IAdviseSinkEx *LPADVISESINKEX;
-
-
-extern "C" const IID IID_IAdviseSinkEx;
-
-
-    
-    struct __declspec(uuid("3AF24290-0C96-11CE-A0CF-00AA00600AB8")) __declspec(novtable)
-    IAdviseSinkEx : public IAdviseSink
-    {
-    public:
-        virtual  void __stdcall OnViewStatusChange( 
-             DWORD dwViewStatus) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IAdviseSinkEx_RemoteOnViewStatusChange_Proxy( 
-    IAdviseSinkEx * This,
-     DWORD dwViewStatus);
-
-
-void __stdcall IAdviseSinkEx_RemoteOnViewStatusChange_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef IQuickActivate *LPQUICKACTIVATE;
-
-typedef  
-enum tagQACONTAINERFLAGS
-    {	QACONTAINER_SHOWHATCHING	= 0x1,
-	QACONTAINER_SHOWGRABHANDLES	= 0x2,
-	QACONTAINER_USERMODE	= 0x4,
-	QACONTAINER_DISPLAYASDEFAULT	= 0x8,
-	QACONTAINER_UIDEAD	= 0x10,
-	QACONTAINER_AUTOCLIP	= 0x20,
-	QACONTAINER_MESSAGEREFLECT	= 0x40,
-	QACONTAINER_SUPPORTSMNEMONICS	= 0x80
-    } 	QACONTAINERFLAGS;
-
-typedef   __declspec(uuid("66504301-BE0F-101A-8BBB-00AA00300CAB")) DWORD OLE_COLOR;
-
-typedef struct tagQACONTAINER
-    {
-    ULONG cbSize;
-    IOleClientSite *pClientSite;
-    IAdviseSinkEx *pAdviseSink;
-    IPropertyNotifySink *pPropertyNotifySink;
-    IUnknown *pUnkEventSink;
-    DWORD dwAmbientFlags;
-    OLE_COLOR colorFore;
-    OLE_COLOR colorBack;
-    IFont *pFont;
-    IOleUndoManager *pUndoMgr;
-    DWORD dwAppearance;
-    LONG lcid;
-    HPALETTE hpal;
-    IBindHost *pBindHost;
-    IOleControlSite *pOleControlSite;
-    IServiceProvider *pServiceProvider;
-    } 	QACONTAINER;
-
-typedef struct tagQACONTROL
-    {
-    ULONG cbSize;
-    DWORD dwMiscStatus;
-    DWORD dwViewStatus;
-    DWORD dwEventCookie;
-    DWORD dwPropNotifyCookie;
-    DWORD dwPointerActivationPolicy;
-    } 	QACONTROL;
-
-
-extern "C" const IID IID_IQuickActivate;
-
-
-    
-    struct __declspec(uuid("CF51ED10-62FE-11CF-BF86-00A0C9034836")) __declspec(novtable)
-    IQuickActivate : public IUnknown
-    {
-    public:
-        virtual  HRESULT __stdcall QuickActivate( 
-             QACONTAINER *pQaContainer,
-             QACONTROL *pQaControl) = 0;
-        
-        virtual HRESULT __stdcall SetContentExtent( 
-             LPSIZEL pSizel) = 0;
-        
-        virtual HRESULT __stdcall GetContentExtent( 
-             LPSIZEL pSizel) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IQuickActivate_RemoteQuickActivate_Proxy( 
-    IQuickActivate * This,
-     QACONTAINER *pQaContainer,
-     QACONTROL *pQaControl);
-
-
-void __stdcall IQuickActivate_RemoteQuickActivate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IQuickActivate_SetContentExtent_Proxy( 
-    IQuickActivate * This,
-     LPSIZEL pSizel);
-
-
-void __stdcall IQuickActivate_SetContentExtent_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IQuickActivate_GetContentExtent_Proxy( 
-    IQuickActivate * This,
-     LPSIZEL pSizel);
-
-
-void __stdcall IQuickActivate_GetContentExtent_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-unsigned long             __stdcall  BSTR_UserSize(     unsigned long *, unsigned long            , BSTR * ); 
-unsigned char * __stdcall  BSTR_UserMarshal(  unsigned long *, unsigned char *, BSTR * ); 
-unsigned char * __stdcall  BSTR_UserUnmarshal(unsigned long *, unsigned char *, BSTR * ); 
-void                      __stdcall  BSTR_UserFree(     unsigned long *, BSTR * ); 
-
-unsigned long             __stdcall  CLIPFORMAT_UserSize(     unsigned long *, unsigned long            , CLIPFORMAT * ); 
-unsigned char * __stdcall  CLIPFORMAT_UserMarshal(  unsigned long *, unsigned char *, CLIPFORMAT * ); 
-unsigned char * __stdcall  CLIPFORMAT_UserUnmarshal(unsigned long *, unsigned char *, CLIPFORMAT * ); 
-void                      __stdcall  CLIPFORMAT_UserFree(     unsigned long *, CLIPFORMAT * ); 
-
-unsigned long             __stdcall  HACCEL_UserSize(     unsigned long *, unsigned long            , HACCEL * ); 
-unsigned char * __stdcall  HACCEL_UserMarshal(  unsigned long *, unsigned char *, HACCEL * ); 
-unsigned char * __stdcall  HACCEL_UserUnmarshal(unsigned long *, unsigned char *, HACCEL * ); 
-void                      __stdcall  HACCEL_UserFree(     unsigned long *, HACCEL * ); 
-
-unsigned long             __stdcall  HDC_UserSize(     unsigned long *, unsigned long            , HDC * ); 
-unsigned char * __stdcall  HDC_UserMarshal(  unsigned long *, unsigned char *, HDC * ); 
-unsigned char * __stdcall  HDC_UserUnmarshal(unsigned long *, unsigned char *, HDC * ); 
-void                      __stdcall  HDC_UserFree(     unsigned long *, HDC * ); 
-
-unsigned long             __stdcall  HFONT_UserSize(     unsigned long *, unsigned long            , HFONT * ); 
-unsigned char * __stdcall  HFONT_UserMarshal(  unsigned long *, unsigned char *, HFONT * ); 
-unsigned char * __stdcall  HFONT_UserUnmarshal(unsigned long *, unsigned char *, HFONT * ); 
-void                      __stdcall  HFONT_UserFree(     unsigned long *, HFONT * ); 
-
-unsigned long             __stdcall  HPALETTE_UserSize(     unsigned long *, unsigned long            , HPALETTE * ); 
-unsigned char * __stdcall  HPALETTE_UserMarshal(  unsigned long *, unsigned char *, HPALETTE * ); 
-unsigned char * __stdcall  HPALETTE_UserUnmarshal(unsigned long *, unsigned char *, HPALETTE * ); 
-void                      __stdcall  HPALETTE_UserFree(     unsigned long *, HPALETTE * ); 
-
-unsigned long             __stdcall  HWND_UserSize(     unsigned long *, unsigned long            , HWND * ); 
-unsigned char * __stdcall  HWND_UserMarshal(  unsigned long *, unsigned char *, HWND * ); 
-unsigned char * __stdcall  HWND_UserUnmarshal(unsigned long *, unsigned char *, HWND * ); 
-void                      __stdcall  HWND_UserFree(     unsigned long *, HWND * ); 
-
-unsigned long             __stdcall  VARIANT_UserSize(     unsigned long *, unsigned long            , VARIANT * ); 
-unsigned char * __stdcall  VARIANT_UserMarshal(  unsigned long *, unsigned char *, VARIANT * ); 
-unsigned char * __stdcall  VARIANT_UserUnmarshal(unsigned long *, unsigned char *, VARIANT * ); 
-void                      __stdcall  VARIANT_UserFree(     unsigned long *, VARIANT * ); 
-
- HRESULT __stdcall IEnumConnections_Next_Proxy( 
-    IEnumConnections * This,
-     ULONG cConnections,
-     LPCONNECTDATA rgcd,
-     ULONG *pcFetched);
-
-
- HRESULT __stdcall IEnumConnections_Next_Stub( 
-    IEnumConnections * This,
-     ULONG cConnections,
-     LPCONNECTDATA rgcd,
-     ULONG *pcFetched);
-
- HRESULT __stdcall IEnumConnectionPoints_Next_Proxy( 
-    IEnumConnectionPoints * This,
-     ULONG cConnections,
-     LPCONNECTIONPOINT *ppCP,
-     ULONG *pcFetched);
-
-
- HRESULT __stdcall IEnumConnectionPoints_Next_Stub( 
-    IEnumConnectionPoints * This,
-     ULONG cConnections,
-     LPCONNECTIONPOINT *ppCP,
-     ULONG *pcFetched);
-
- HRESULT __stdcall IClassFactory2_CreateInstanceLic_Proxy( 
-    IClassFactory2 * This,
-     IUnknown *pUnkOuter,
-     IUnknown *pUnkReserved,
-     const IID & riid,
-     BSTR bstrKey,
-     PVOID *ppvObj);
-
-
- HRESULT __stdcall IClassFactory2_CreateInstanceLic_Stub( 
-    IClassFactory2 * This,
-     const IID & riid,
-     BSTR bstrKey,
-     IUnknown **ppvObj);
-
- HRESULT __stdcall IPersistMemory_Load_Proxy( 
-    IPersistMemory * This,
-     LPVOID pMem,
-     ULONG cbSize);
-
-
- HRESULT __stdcall IPersistMemory_Load_Stub( 
-    IPersistMemory * This,
-     BYTE *pMem,
-     ULONG cbSize);
-
- HRESULT __stdcall IPersistMemory_Save_Proxy( 
-    IPersistMemory * This,
-     LPVOID pMem,
-     BOOL fClearDirty,
-     ULONG cbSize);
-
-
- HRESULT __stdcall IPersistMemory_Save_Stub( 
-    IPersistMemory * This,
-     BYTE *pMem,
-     BOOL fClearDirty,
-     ULONG cbSize);
-
- HRESULT __stdcall IEnumOleUndoUnits_Next_Proxy( 
-    IEnumOleUndoUnits * This,
-     ULONG cElt,
-     IOleUndoUnit **rgElt,
-     ULONG *pcEltFetched);
-
-
- HRESULT __stdcall IEnumOleUndoUnits_Next_Stub( 
-    IEnumOleUndoUnits * This,
-     ULONG cElt,
-     IOleUndoUnit **rgElt,
-     ULONG *pcEltFetched);
-
- void __stdcall IAdviseSinkEx_OnViewStatusChange_Proxy( 
-    IAdviseSinkEx * This,
-     DWORD dwViewStatus);
-
-
- HRESULT __stdcall IAdviseSinkEx_OnViewStatusChange_Stub( 
-    IAdviseSinkEx * This,
-     DWORD dwViewStatus);
-
- HRESULT __stdcall IQuickActivate_QuickActivate_Proxy( 
-    IQuickActivate * This,
-     QACONTAINER *pQaContainer,
-     QACONTROL *pQaControl);
-
-
- HRESULT __stdcall IQuickActivate_QuickActivate_Stub( 
-    IQuickActivate * This,
-     QACONTAINER *pQaContainer,
-     QACONTROL *pQaControl);
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" const GUID  IID_IPropertyFrame;
-
-
-
-
-
-extern "C" const GUID  CLSID_CFontPropPage;
-extern "C" const GUID  CLSID_CColorPropPage;
-extern "C" const GUID  CLSID_CPicturePropPage;
-
-
-
-
-
-extern "C" const GUID  CLSID_PersistPropset;
-extern "C" const GUID  CLSID_ConvertVBX;
-
-
-
-
-extern "C" const GUID  CLSID_StdFont;
-extern "C" const GUID  CLSID_StdPicture;
-
-
-
-
-
-extern "C" const GUID  GUID_HIMETRIC;
-extern "C" const GUID  GUID_COLOR;
-extern "C" const GUID  GUID_XPOSPIXEL;
-extern "C" const GUID  GUID_YPOSPIXEL;
-extern "C" const GUID  GUID_XSIZEPIXEL;
-extern "C" const GUID  GUID_YSIZEPIXEL;
-extern "C" const GUID  GUID_XPOS;
-extern "C" const GUID  GUID_YPOS;
-extern "C" const GUID  GUID_XSIZE;
-extern "C" const GUID  GUID_YSIZE;
-
-
-
-
-
-
-extern "C" const GUID  GUID_OPTIONVALUEEXCLUSIVE;
-extern "C" const GUID  GUID_CHECKVALUEEXCLUSIVE;
-extern "C" const GUID  GUID_FONTNAME;
-extern "C" const GUID  GUID_FONTSIZE;
-extern "C" const GUID  GUID_FONTBOLD;
-extern "C" const GUID  GUID_FONTITALIC;
-extern "C" const GUID  GUID_FONTUNDERSCORE;
-extern "C" const GUID  GUID_FONTSTRIKETHROUGH;
-extern "C" const GUID  GUID_HANDLE;
-
-
-
-
-
-
-
-typedef struct tagOCPFIPARAMS
-{
-    ULONG cbStructSize;
-    HWND hWndOwner;
-    int x;
-    int y;
-    LPCOLESTR lpszCaption;
-    ULONG cObjects;
-    LPUNKNOWN * lplpUnk;
-    ULONG cPages;
-    CLSID * lpPages;
-    LCID lcid;
-    DISPID dispidInitialProperty;
-
-} OCPFIPARAMS, * LPOCPFIPARAMS;
-
-
-
-
-
-
-
-typedef struct tagFONTDESC
-{
-    UINT cbSizeofstruct;
-    LPOLESTR lpstrName;
-    CY cySize;
-    SHORT sWeight;
-    SHORT sCharset;
-    BOOL fItalic;
-    BOOL fUnderline;
-    BOOL fStrikethrough;
-
-} FONTDESC, * LPFONTDESC;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagPICTDESC
-{
-    UINT cbSizeofstruct;
-    UINT picType;
-    union
-    {
-        struct
-        {
-            HBITMAP   hbitmap;        
-            HPALETTE  hpal;           
-        } bmp;
-
-        struct
-        {
-            HMETAFILE hmeta;          
-            int       xExt;
-            int       yExt;           
-        } wmf;
-
-        struct
-        {
-            HICON hicon;              
-        } icon;
-
-
-        struct
-        {
-            HENHMETAFILE hemf;        
-        } emf;
-
-    };
-
-} PICTDESC, * LPPICTDESC;
-
-
-
-
-
-typedef long OLE_XPOS_PIXELS;
-typedef long OLE_YPOS_PIXELS;
-typedef long OLE_XSIZE_PIXELS;
-typedef long OLE_YSIZE_PIXELS;
-typedef float OLE_XPOS_CONTAINER;
-typedef float OLE_YPOS_CONTAINER;
-typedef float OLE_XSIZE_CONTAINER;
-typedef float OLE_YSIZE_CONTAINER;
-typedef enum { triUnchecked = 0, triChecked = 1, triGray = 2 } OLE_TRISTATE;
-typedef VARIANT_BOOL OLE_OPTEXCLUSIVE;
-typedef VARIANT_BOOL OLE_CANCELBOOL;
-typedef VARIANT_BOOL OLE_ENABLEDEFAULTBOOL;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" HRESULT __stdcall DllRegisterServer(void);
-extern "C" HRESULT __stdcall DllUnregisterServer(void);
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleCreatePropertyFrame(HWND hwndOwner, UINT x, UINT y,
-    LPCOLESTR lpszCaption, ULONG cObjects, LPUNKNOWN * ppUnk, ULONG cPages,
-    LPCLSID pPageClsID, LCID lcid, DWORD dwReserved, LPVOID pvReserved);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleCreatePropertyFrameIndirect(LPOCPFIPARAMS lpParams);
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleTranslateColor(OLE_COLOR clr, HPALETTE hpal,
-    COLORREF* lpcolorref);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleCreateFontIndirect(LPFONTDESC lpFontDesc, const IID & riid,
-    LPVOID * lplpvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleCreatePictureIndirect(LPPICTDESC lpPictDesc, const IID & riid,
-    BOOL fOwn, LPVOID * lplpvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleLoadPicture(LPSTREAM lpstream, LONG lSize, BOOL fRunmode,
-    const IID & riid, LPVOID * lplpvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleLoadPictureEx(LPSTREAM lpstream, LONG lSize, BOOL fRunmode,
-    const IID & riid, DWORD xSizeDesired, DWORD ySizeDesired, DWORD dwFlags,
-    LPVOID * lplpvObj);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleLoadPicturePath(  LPOLESTR  szURLorPath,
-				  LPUNKNOWN punkCaller,
-				  DWORD     dwReserved,
-				  OLE_COLOR clrReserved,
-				  const IID &    riid,
-				  LPVOID *  ppvRet );
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleLoadPictureFile(VARIANT varFileName,
-    LPDISPATCH* lplpdispPicture);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleLoadPictureFileEx(VARIANT varFileName,
-    DWORD xSizeDesired, DWORD ySizeDesired, DWORD dwFlags, LPDISPATCH* lplpdispPicture);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall OleSavePictureFile(LPDISPATCH lpdispPicture,
-    BSTR bstrFileName);
-
-extern "C" __declspec(dllimport) HCURSOR __stdcall OleIconToCursor(HINSTANCE hinstExe, HICON hIcon);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning (push)
-#pragma warning (disable: 4127)  
-#pragma warning (disable: 4571)  
-
-
-#pragma pack(push,8)
-namespace ATL
-{
-
-
-
-__declspec( noinline ) inline HRESULT AtlHresultFromLastError() throw()
-{
-	DWORD dwErr = ::GetLastError();
-	return ((HRESULT)(dwErr) <= 0 ? ((HRESULT)(dwErr)) : ((HRESULT) (((dwErr) & 0x0000FFFF) | (7 << 16) | 0x80000000)));
-}
-
-__declspec( noinline ) inline HRESULT AtlHresultFromWin32(     DWORD nError) throw()
-{
-	return( ((HRESULT)(nError) <= 0 ? ((HRESULT)(nError)) : ((HRESULT) (((nError) & 0x0000FFFF) | (7 << 16) | 0x80000000))) );
-}
-
-
-
-
-extern "C" __declspec(dllimport) IUnknown* __stdcall AtlComPtrAssign(IUnknown** pp, IUnknown* lp);
-extern "C" __declspec(dllimport) IUnknown* __stdcall AtlComQIPtrAssign(IUnknown** pp, IUnknown* lp, const IID & riid);
-
-
-
-
-union ClassesAllowedInStream 
-{
-	const CLSID *rgclsidAllowed;
-	HRESULT (*pfnClsidAllowed)(     const CLSID& clsid,      const IID & iidInterface,                  void** ppvObj);
-};
-
-
-inline HRESULT AtlInternalOleLoadFromStream(
-	     IStream* pStm, 
-	     const IID & iidInterface, 
-	                  void** ppvObj, 
-	     ClassesAllowedInStream rgclsidAllowed, 
-	     DWORD cclsidAllowed);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-template <class T>
-class _NoAddRefReleaseOnCComPtr : public T
-{
-	private:
-		virtual ULONG __stdcall AddRef()=0;
-		virtual ULONG __stdcall Release()=0;
-};
-
-inline  HRESULT AtlSetChildSite(     IUnknown* punkChild,        IUnknown* punkParent)
-{
-	if (punkChild == 0)
-		return ((HRESULT)0x80004003L);
-
-	HRESULT hr;
-	IObjectWithSite* pChildSite = 0;
-	hr = punkChild->QueryInterface(__uuidof(IObjectWithSite), (void**)&pChildSite);
-	if (((HRESULT)(hr) >= 0) && pChildSite != 0)
-	{
-		hr = pChildSite->SetSite(punkParent);
-		pChildSite->Release();
-	}
-	return hr;
-}
-
-
-
-
-template <class T>
-class CComPtrBase
-{
-protected:
-	CComPtrBase() throw()
-	{
-		p = 0;
-	}
-	CComPtrBase(     int nNull) throw()
-	{
-		(void) ((!!((nNull == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 138, 0, L"nNull == 0")) || (__debugbreak(), 0));
-		(void)nNull;
-		p = 0;
-	}
-	CComPtrBase(       T* lp) throw()
-	{
-		p = lp;
-		if (p != 0)
-			p->AddRef();
-	}
-public:
-	typedef T _PtrClass;
-	~CComPtrBase() throw()
-	{
-		if (p)
-			p->Release();
-	}
-	operator T*() const throw()
-	{
-		return p;
-	}
-	T& operator*() const
-	{
-		do { int __atl_condVal=!!(p!=0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 161, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-		return *p;
-	}
-	
-	
-	T** operator&() throw()
-	{
-		(void) ((!!((p==0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 168, 0, L"p==0")) || (__debugbreak(), 0));
-		return &p;
-	}
-	_NoAddRefReleaseOnCComPtr<T>* operator->() const throw()
-	{
-		(void) ((!!((p!=0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 173, 0, L"p!=0")) || (__debugbreak(), 0));
-		return (_NoAddRefReleaseOnCComPtr<T>*)p;
-	}
-	bool operator!() const throw()
-	{
-		return (p == 0);
-	}
-	bool operator<(       T* pT) const throw()
-	{
-		return p < pT;
-	}
-	bool operator!=(       T* pT) const
-	{
-		return !operator==(pT);
-	}
-	bool operator==(       T* pT) const throw()
-	{
-		return p == pT;
-	}
-
-	
-	void Release() throw()
-	{
-		T* pTemp = p;
-		if (pTemp)
-		{
-			p = 0;
-			pTemp->Release();
-		}
-	}
-	
-	bool IsEqualObject(       IUnknown* pOther) throw()
-	{
-		if (p == 0 && pOther == 0)
-			return true;	
-
-		if (p == 0 || pOther == 0)
-			return false;	
-
-		CComPtr<IUnknown> punk1;
-		CComPtr<IUnknown> punk2;
-		p->QueryInterface(__uuidof(IUnknown), (void**)&punk1);
-		pOther->QueryInterface(__uuidof(IUnknown), (void**)&punk2);
-		return punk1 == punk2;
-	}
-	
-	void Attach(       T* p2) throw()
-	{
-		if (p)
-			p->Release();
-		p = p2;
-	}
-	
-	T* Detach() throw()
-	{
-		T* pt = p;
-		p = 0;
-		return pt;
-	}
-	 HRESULT CopyTo(                  T** ppT) throw()
-	{
-		(void) ((!!((ppT != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 234, 0, L"ppT != 0")) || (__debugbreak(), 0));
-		if (ppT == 0)
-			return ((HRESULT)0x80004003L);
-		*ppT = p;
-		if (p)
-			p->AddRef();
-		return ((HRESULT)0x00000000L);
-	}
-	 HRESULT SetSite(       IUnknown* punkParent) throw()
-	{
-		return AtlSetChildSite(p, punkParent);
-	}
-	 HRESULT Advise(     IUnknown* pUnk,      const IID& iid,      LPDWORD pdw) throw()
-	{
-		return AtlAdvise(p, pUnk, iid, pdw);
-	}
-	 HRESULT CoCreateInstance(     const IID & rclsid,        LPUNKNOWN pUnkOuter = 0,      DWORD dwClsContext = (CLSCTX_INPROC_SERVER| CLSCTX_INPROC_HANDLER| CLSCTX_LOCAL_SERVER| CLSCTX_REMOTE_SERVER)) throw()
-	{
-		(void) ((!!((p == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 252, 0, L"p == 0")) || (__debugbreak(), 0));
-		return ::CoCreateInstance(rclsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&p);
-	}
-	 HRESULT CoCreateInstance(     LPCOLESTR szProgID,        LPUNKNOWN pUnkOuter = 0,      DWORD dwClsContext = (CLSCTX_INPROC_SERVER| CLSCTX_INPROC_HANDLER| CLSCTX_LOCAL_SERVER| CLSCTX_REMOTE_SERVER)) throw()
-	{
-		CLSID clsid;
-		HRESULT hr = CLSIDFromProgID(szProgID, &clsid);
-		(void) ((!!((p == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 259, 0, L"p == 0")) || (__debugbreak(), 0));
-		if (((HRESULT)(hr) >= 0))
-			hr = ::CoCreateInstance(clsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&p);
-		return hr;
-	}
-	template <class Q>
-	 HRESULT QueryInterface(                  Q** pp) const throw()
-	{
-		(void) ((!!((pp != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 267, 0, L"pp != 0")) || (__debugbreak(), 0));
-		return p->QueryInterface(__uuidof(Q), (void**)pp);
-	}
-	T* p;
-};
-
-template <class T>
-class CComPtr : public CComPtrBase<T>
-{
-public:
-	CComPtr() throw()
-	{
-	}
-	CComPtr(int nNull) throw() :
-		CComPtrBase<T>(nNull)
-	{
-	}
-	CComPtr(T* lp) throw() :
-		CComPtrBase<T>(lp)
-
-	{
-	}
-	CComPtr(     const CComPtr<T>& lp) throw() :
-		CComPtrBase<T>(lp.p)
-	{
-	}
-	T* operator=(       T* lp) throw()
-	{
-        if(*this!=lp)
-        {
-    		return static_cast<T*>(AtlComPtrAssign((IUnknown**)&p, lp));
-        }
-        return *this;
-	}
-	template <typename Q>
-	T* operator=(     const CComPtr<Q>& lp) throw()
-	{
-        if( !IsEqualObject(lp) )
-        {
-    		return static_cast<T*>(AtlComQIPtrAssign((IUnknown**)&p, lp, __uuidof(T)));
-        }
-        return *this;
-	}
-	T* operator=(     const CComPtr<T>& lp) throw()
-	{
-        if(*this!=lp)
-        {
-    		return static_cast<T*>(AtlComPtrAssign((IUnknown**)&p, lp));
-        }
-        return *this;
-	}
-};
-
-
-template <>
-class CComPtr<IDispatch> : public CComPtrBase<IDispatch>
-{
-public:
-	CComPtr() throw()
-	{
-	}
-	CComPtr(IDispatch* lp) throw() :
-		CComPtrBase<IDispatch>(lp)
-	{
-	}
-	CComPtr(const CComPtr<IDispatch>& lp) throw() :
-		CComPtrBase<IDispatch>(lp.p)
-	{
-	}
-	IDispatch* operator=(IDispatch* lp) throw()
-	{
-        if(*this!=lp)
-        {
-            return static_cast<IDispatch*>(AtlComPtrAssign((IUnknown**)&p, lp));
-        }
-        return *this;
-	}
-	IDispatch* operator=(const CComPtr<IDispatch>& lp) throw()
-	{
-        if(*this!=lp)
-        {
-    		return static_cast<IDispatch*>(AtlComPtrAssign((IUnknown**)&p, lp.p));
-        }
-        return *this;
-	}
-
-
-	 HRESULT GetPropertyByName(     LPCOLESTR lpsz,      VARIANT* pVar) throw()
-	{
-		(void) ((!!((p))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 356, 0, L"p")) || (__debugbreak(), 0));
-		(void) ((!!((pVar))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 357, 0, L"pVar")) || (__debugbreak(), 0));
-		DISPID dwDispID;
-		HRESULT hr = GetIDOfName(lpsz, &dwDispID);
-		if (((HRESULT)(hr) >= 0))
-			hr = GetProperty(dwDispID, pVar);
-		return hr;
-	}
-	 HRESULT GetProperty(     DISPID dwDispID,      VARIANT* pVar) throw()
-	{
-		return GetProperty(p, dwDispID, pVar);
-	}
-	 HRESULT PutPropertyByName(     LPCOLESTR lpsz,      VARIANT* pVar) throw()
-	{
-		(void) ((!!((p))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 370, 0, L"p")) || (__debugbreak(), 0));
-		(void) ((!!((pVar))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 371, 0, L"pVar")) || (__debugbreak(), 0));
-		DISPID dwDispID;
-		HRESULT hr = GetIDOfName(lpsz, &dwDispID);
-		if (((HRESULT)(hr) >= 0))
-			hr = PutProperty(dwDispID, pVar);
-		return hr;
-	}
-	 HRESULT PutProperty(     DISPID dwDispID,      VARIANT* pVar) throw()
-	{
-		return PutProperty(p, dwDispID, pVar);
-	}
-	 HRESULT GetIDOfName(     LPCOLESTR lpsz,      DISPID* pdispid) throw()
-	{
-		return p->GetIDsOfNames(GUID_NULL, const_cast<LPOLESTR*>(&lpsz), 1, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), pdispid);
-	}
-	
-	 HRESULT Invoke0(     DISPID dispid,        VARIANT* pvarRet = 0) throw()
-	{
-		DISPPARAMS dispparams = { 0, 0, 0, 0};
-		return p->Invoke(dispid, GUID_NULL, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0x1, &dispparams, pvarRet, 0, 0);
-	}
-	
-	 HRESULT Invoke0(     LPCOLESTR lpszName,        VARIANT* pvarRet = 0) throw()
-	{
-		HRESULT hr;
-		DISPID dispid;
-		hr = GetIDOfName(lpszName, &dispid);
-		if (((HRESULT)(hr) >= 0))
-			hr = Invoke0(dispid, pvarRet);
-		return hr;
-	}
-	
-	 HRESULT Invoke1(     DISPID dispid, VARIANT* pvarParam1,        VARIANT* pvarRet = 0) throw()
-	{
-		DISPPARAMS dispparams = { pvarParam1, 0, 1, 0};
-		return p->Invoke(dispid, GUID_NULL, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0x1, &dispparams, pvarRet, 0, 0);
-	}
-	
-	 HRESULT Invoke1(     LPCOLESTR lpszName, VARIANT* pvarParam1,        VARIANT* pvarRet = 0) throw()
-	{
-		HRESULT hr;
-		DISPID dispid;
-		hr = GetIDOfName(lpszName, &dispid);
-		if (((HRESULT)(hr) >= 0))
-			hr = Invoke1(dispid, pvarParam1, pvarRet);
-		return hr;
-	}
-	
-	 HRESULT Invoke2(     DISPID dispid,      VARIANT* pvarParam1,      VARIANT* pvarParam2,        VARIANT* pvarRet = 0) throw();
-	
-	 HRESULT Invoke2(     LPCOLESTR lpszName,      VARIANT* pvarParam1,      VARIANT* pvarParam2,        VARIANT* pvarRet = 0) throw()
-	{
-		HRESULT hr;
-		DISPID dispid;
-		hr = GetIDOfName(lpszName, &dispid);
-		if (((HRESULT)(hr) >= 0))
-			hr = Invoke2(dispid, pvarParam1, pvarParam2, pvarRet);
-		return hr;
-	}
-	
-	 HRESULT InvokeN(DISPID dispid, VARIANT* pvarParams, int nParams, VARIANT* pvarRet = 0) throw()
-	{
-		DISPPARAMS dispparams = { pvarParams, 0, nParams, 0};
-		return p->Invoke(dispid, GUID_NULL, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0x1, &dispparams, pvarRet, 0, 0);
-	}
-	
-	 HRESULT InvokeN(LPCOLESTR lpszName, VARIANT* pvarParams, int nParams, VARIANT* pvarRet = 0) throw()
-	{
-		HRESULT hr;
-		DISPID dispid;
-		hr = GetIDOfName(lpszName, &dispid);
-		if (((HRESULT)(hr) >= 0))
-			hr = InvokeN(dispid, pvarParams, nParams, pvarRet);
-		return hr;
-	}
-	static  HRESULT PutProperty(     IDispatch* p,      DISPID dwDispID,      VARIANT* pVar) throw()
-	{
-		(void) ((!!((p))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 448, 0, L"p")) || (__debugbreak(), 0));
-		(void) ((!!((pVar != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 449, 0, L"pVar != 0")) || (__debugbreak(), 0));
-		if (pVar == 0)
-			return ((HRESULT)0x80004003L);
-		
-		if(p == 0)
-			return ((HRESULT)0x80070057L);
-		
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 456)(atlTraceCOM, 2, L"CPropertyHelper::PutProperty\n");
-		DISPPARAMS dispparams = {0, 0, 1, 1};
-		dispparams.rgvarg = pVar;
-		DISPID dispidPut = ( -3 );
-		dispparams.rgdispidNamedArgs = &dispidPut;
-
-		if (pVar->vt == VT_UNKNOWN || pVar->vt == VT_DISPATCH || 
-			(pVar->vt & VT_ARRAY) || (pVar->vt & VT_BYREF))
-		{
-			HRESULT hr = p->Invoke(dwDispID, GUID_NULL,
-				(((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0x8,
-				&dispparams, 0, 0, 0);
-			if (((HRESULT)(hr) >= 0))
-				return hr;
-		}
-		return p->Invoke(dwDispID, GUID_NULL,
-				(((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0x4,
-				&dispparams, 0, 0, 0);
-	}
-	static  HRESULT GetProperty(     IDispatch* p,      DISPID dwDispID,      VARIANT* pVar) throw()
-	{
-		(void) ((!!((p))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 477, 0, L"p")) || (__debugbreak(), 0));
-		(void) ((!!((pVar != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 478, 0, L"pVar != 0")) || (__debugbreak(), 0));
-		if (pVar == 0)
-			return ((HRESULT)0x80004003L);
-		
-		if(p == 0)
-			return ((HRESULT)0x80070057L);
-			
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 485)(atlTraceCOM, 2, L"CPropertyHelper::GetProperty\n");
-		DISPPARAMS dispparamsNoArgs = {0, 0, 0, 0};
-		return p->Invoke(dwDispID, GUID_NULL,
-				(((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0x2,
-				&dispparamsNoArgs, pVar, 0, 0);
-	}
-};
-
-template <class T, const IID* piid = &__uuidof(T)>
-class CComQIPtr : public CComPtr<T>
-{
-public:
-	CComQIPtr() throw()
-	{
-	}
-	CComQIPtr(       T* lp) throw() :
-		CComPtr<T>(lp)
-	{
-	}
-	CComQIPtr(     const CComQIPtr<T,piid>& lp) throw() :
-		CComPtr<T>(lp.p)
-	{
-	}
-	CComQIPtr(       IUnknown* lp) throw()
-	{
-		if (lp != 0)
-			lp->QueryInterface(*piid, (void **)&p);
-	}
-	T* operator=(       T* lp) throw()
-	{
-        if(*this!=lp)
-        {
-		    return static_cast<T*>(AtlComPtrAssign((IUnknown**)&p, lp));
-        }
-        return *this;
-	}
-	T* operator=(     const CComQIPtr<T,piid>& lp) throw()
-	{
-        if(*this!=lp)
-        {
-    		return static_cast<T*>(AtlComPtrAssign((IUnknown**)&p, lp.p));
-        }
-        return *this;
-	}
-	T* operator=(       IUnknown* lp) throw()
-	{
-        if(*this!=lp)
-        {
-    		return static_cast<T*>(AtlComQIPtrAssign((IUnknown**)&p, lp, *piid));
-        }
-        return *this;
-	}
-};
-
-
-template<>
-class CComQIPtr<IUnknown, &IID_IUnknown> : public CComPtr<IUnknown>
-{
-public:
-	CComQIPtr() throw()
-	{
-	}
-	CComQIPtr(       IUnknown* lp) throw()
-	{
-		
-		if (lp != 0)
-			lp->QueryInterface(__uuidof(IUnknown), (void **)&p);
-	}
-	CComQIPtr(     const CComQIPtr<IUnknown,&IID_IUnknown>& lp) throw() :
-		CComPtr<IUnknown>(lp.p)
-	{
-	}
-	IUnknown* operator=(       IUnknown* lp) throw()
-	{
-        if(*this!=lp)
-        {
-		    
-		    return AtlComQIPtrAssign((IUnknown**)&p, lp, __uuidof(IUnknown));
-        }
-        return *this;
-	}
-
-	IUnknown* operator=(     const CComQIPtr<IUnknown,&IID_IUnknown>& lp) throw()
-	{
-        if(*this!=lp)
-        {
-    		return AtlComPtrAssign((IUnknown**)&p, lp.p);
-        }
-        return *this;
-	}
-};
-
-typedef CComQIPtr<IDispatch, &__uuidof(IDispatch)> CComDispatchDriver;
-
-
-
-
-
-
-
-
-
-class CComBSTR
-{
-public:
-	BSTR m_str;
-
-	CComBSTR() throw()
-	{
-		m_str = 0;
-	}
-
-	CComBSTR(     int nSize)
-	{
-		if (nSize == 0)
-			m_str = 0;
-		else
-		{
-			m_str = ::SysAllocStringLen(0, nSize);
-			if (!*this)
-            {
-				ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
-            }
-		}
-	}
-
-	CComBSTR(     int nSize,          LPCOLESTR sz)
-	{
-		if (nSize == 0)
-        {
-			m_str = 0;
-        }
-		else
-		{
-			m_str = ::SysAllocStringLen(sz, nSize);
-			if (!*this)
-            {
-				ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
-            }
-		}
-	}
-
-	CComBSTR(       LPCOLESTR pSrc)
-	{
-		if (pSrc == 0)
-        {
-			m_str = 0;
-        }
-		else
-		{
-			m_str = ::SysAllocString(pSrc);
-			if (!*this)
-            {
-				ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
-            }
-		}
-	}
-
-	CComBSTR(     const CComBSTR& src)
-	{
-		m_str = src.Copy();
-		if (!!src && !*this)
-        {
-			ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
-        }
-	}
-
-	CComBSTR(     const GUID & guid)
-	{
-		OLECHAR szGUID[64];
-		::StringFromGUID2(guid, szGUID, 64);
-		m_str = ::SysAllocString(szGUID);
-		if (!*this)
-        {
-			ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
-        }
-	}
-
-	CComBSTR& operator=(     const CComBSTR& src)
-	{
-		if (m_str != src.m_str)
-		{
-			::SysFreeString(m_str);
-			m_str = src.Copy();
-			if (!!src && !*this)
-            {
-				ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
-            }
-		}
-		return *this;
-	}
-
-	CComBSTR& operator=(       LPCOLESTR pSrc)
-	{
-		if (pSrc != m_str)
-		{
-			::SysFreeString(m_str);
-			if (pSrc != 0)
-			{
-				m_str = ::SysAllocString(pSrc);
-				if (!*this)
-                {
-					ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
-                }
-			}
-			else
-            {
-				m_str = 0;
-            }
-		}
-		return *this;
-	}
-
-	~CComBSTR() throw();
-
-	unsigned int Length() const throw()
-	{
-        return ::SysStringLen(m_str);
-	}
-
-	unsigned int ByteLength() const throw()
-	{
-        return ::SysStringByteLen(m_str);
-	}
-
-	operator BSTR() const throw()
-	{
-		return m_str;
-	}
-
-
-
-
-
-
-
-
-	BSTR* operator&() throw()
-	{
-
-
-
-
-
-
-
-
-
-		return &m_str;
-	}
-
-	BSTR Copy() const throw()
-	{
-		if (!*this)
-        {
-			return 0;
-        }
-		return ::SysAllocStringByteLen((char*)m_str, ::SysStringByteLen(m_str));
-	}
-
-	 HRESULT CopyTo(       BSTR* pbstr) const throw()
-	{
-		(void) ((!!((pbstr != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 747, 0, L"pbstr != 0")) || (__debugbreak(), 0));
-		if (pbstr == 0)
-        {
-			return ((HRESULT)0x80004003L);
-        }
-		*pbstr = Copy();
-#pragma warning(push)
-#pragma warning(disable:4068)
-#pragma prefast(push)
-#pragma prefast(disable:325, "We are checking allocation semantics here")
-		if ((*pbstr == 0) && (m_str != 0))
-        {
-			return ((HRESULT)0x8007000EL);
-        }
-#pragma prefast(pop)
-#pragma warning(pop)
-		return ((HRESULT)0x00000000L);
-	}
-
-	
-	 HRESULT CopyTo(       VARIANT *pvarDest) const throw()
-	{
-		(void) ((!!((pvarDest != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 769, 0, L"pvarDest != 0")) || (__debugbreak(), 0));
-		HRESULT hRes = ((HRESULT)0x80004003L);
-		if (pvarDest != 0)
-		{
-			pvarDest->vt = VT_BSTR;
-			pvarDest->bstrVal = Copy();
-#pragma warning(push)
-#pragma warning(disable:4068)
-#pragma prefast(push)
-#pragma prefast(disable:325, "We are checking allocation semantics here")
-			if (pvarDest->bstrVal == 0 && m_str != 0)
-            {
-				hRes = ((HRESULT)0x8007000EL);
-            }
-#pragma prefast(pop)
-#pragma warning(pop)
-			else
-            {
-				hRes = ((HRESULT)0x00000000L);
-            }
-		}
-		return hRes;
-	}
-
-	void Attach(       BSTR src) throw()
-	{
-		if (m_str != src)
-		{
-			::SysFreeString(m_str);
-			m_str = src;
-		}
-	}
-
-	BSTR Detach() throw()
-	{
-		BSTR s = m_str;
-		m_str = 0;
-		return s;
-	}
-
-	void Empty() throw()
-	{
-		::SysFreeString(m_str);
-		m_str = 0;
-	}
-
-	bool operator!() const throw()
-	{
-#pragma warning(push)
-#pragma warning(disable:4068)
-#pragma prefast(push)
-#pragma prefast(disable:325, "The semantics of this function are about allocation, not content")
-		return (m_str == 0);
-#pragma prefast(pop)
-#pragma warning(pop)
-	}
-
-	 HRESULT Append(     const CComBSTR& bstrSrc) throw()
-	{
-		return AppendBSTR(bstrSrc.m_str);
-	}
-
-	 HRESULT Append(       LPCOLESTR lpsz) throw()
-	{
-		return Append(lpsz, UINT(ocslen(lpsz)));
-	}
-
-	
-	
-	 HRESULT AppendBSTR(       BSTR p) throw()
-	{
-        if (::SysStringLen(p) == 0)
-        {
-			return ((HRESULT)0x00000000L);
-        }
-		BSTR bstrNew = 0;
-		HRESULT hr;
-		hr = VarBstrCat(m_str, p, &bstrNew);
-		if (((HRESULT)(hr) >= 0))
-		{
-			::SysFreeString(m_str);
-			m_str = bstrNew;
-		}
-		return hr;
-	}
-
-	 HRESULT Append(         LPCOLESTR lpsz,      int nLen) throw()
-	{
-#pragma warning(push)
-#pragma warning(disable:4068)
-#pragma prefast(push)
-#pragma prefast(disable:325, "The semantics of this function are about allocation, not content")
-		if (lpsz == 0 || (m_str != 0 && nLen == 0))
-#pragma prefast(pop)
-#pragma warning(pop)
-			return ((HRESULT)0x00000000L);
-		int n1 = Length();
-		if (n1+nLen < n1)
-			return ((HRESULT)0x8007000EL);
-		BSTR b;
-		b = ::SysAllocStringLen(0, n1+nLen);
-#pragma warning(push)
-#pragma warning(disable:4068)
-#pragma prefast(push)
-#pragma prefast(disable:325, "The semantics of this function are about allocation, not content")
-		if (b == 0)
-#pragma prefast(pop)
-#pragma warning(pop)
-			return ((HRESULT)0x8007000EL);
-		if(::SysStringLen(m_str) > 0)
-		{
-			Checked::memcpy_s(b, (n1+nLen)*sizeof(OLECHAR), m_str, n1*sizeof(OLECHAR));
-		}
-		Checked::memcpy_s(b+n1, nLen*sizeof(OLECHAR), lpsz, nLen*sizeof(OLECHAR));
-		b[n1+nLen] = 0;
-		SysFreeString(m_str);
-		m_str = b;
-		return ((HRESULT)0x00000000L);
-	}
-
-	 HRESULT Append(     char ch) throw()
-	{
-		OLECHAR chO = ch;
-
-		return( Append( &chO, 1 ) );
-	}
-
-	 HRESULT Append(     wchar_t ch) throw()
-	{
-		return( Append( &ch, 1 ) );
-	}
-
-	 HRESULT AppendBytes(         const char* lpsz,      int nLen) throw()
-	{
-		if (lpsz == 0 || nLen == 0)
-			return ((HRESULT)0x00000000L);
-		int n1 = ByteLength();
-		if (n1+nLen < n1)
-			return ((HRESULT)0x8007000EL);
-		BSTR b;
-		b = ::SysAllocStringByteLen(0, n1+nLen);
-		if (b == 0)
-        {
-			return ((HRESULT)0x8007000EL);
-        }
-		Checked::memcpy_s(b, n1+nLen, m_str, n1);
-		Checked::memcpy_s(((char*)b)+n1, nLen, lpsz, nLen);
-		*((OLECHAR*)(((char*)b)+n1+nLen)) = 0;
-		SysFreeString(m_str);
-		m_str = b;
-		return ((HRESULT)0x00000000L);
-	}
-
-	 HRESULT AssignBSTR(const BSTR bstrSrc) throw()
-	{
-		HRESULT hr = ((HRESULT)0x00000000L);
-		if (m_str != bstrSrc)
-		{
-			::SysFreeString(m_str);
-#pragma warning(push)
-#pragma warning(disable:4068)
-#pragma prefast(push)
-#pragma prefast(disable:325, "The semantics of this function are about allocation, not content")
-			if (bstrSrc != 0)
-#pragma prefast(pop)
-#pragma warning(pop)
-			{
-				m_str = ::SysAllocStringByteLen((char*)bstrSrc, ::SysStringByteLen(bstrSrc));
-				if (!*this)
-                {
-					hr = ((HRESULT)0x8007000EL);
-                }
-			}
-			else
-            {
-				m_str = 0;
-            }
-		}
-
-		return hr;
-	}
-
-	 HRESULT ToLower() throw()
-	{
-		if (::SysStringLen(m_str) > 0)
-		{
-
-			
-			CharLowerBuffW(m_str, Length());
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-		}
-		return ((HRESULT)0x00000000L);
-	}
-	 HRESULT ToUpper() throw()
-	{
-		if (::SysStringLen(m_str) > 0)
-		{
-
-			
-			CharUpperBuffW(m_str, Length());
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-		}
-		return ((HRESULT)0x00000000L);
-	}
-
-	bool LoadStringW(     HINSTANCE hInst,      UINT nID) throw()
-	{
-		::SysFreeString(m_str);
-		m_str = 0;
-		return LoadStringResource(hInst, nID, m_str);
-	}
-
-	bool LoadStringW(     UINT nID) throw()
-	{
-		::SysFreeString(m_str);
-		m_str = 0;
-		return LoadStringResource(nID, m_str);
-	}
-
-	CComBSTR& operator+=(     const CComBSTR& bstrSrc)
-	{
-		HRESULT hr;
-		hr = AppendBSTR(bstrSrc.m_str);
-		if (((HRESULT)(hr) < 0))
-			ATL::AtlThrowImpl(hr);
-		return *this;
-	}
-
-	CComBSTR& operator+=(       LPCOLESTR pszSrc)
-	{
-		HRESULT hr;
-		hr = Append(pszSrc);
-		if (((HRESULT)(hr) < 0))
-			ATL::AtlThrowImpl(hr);
-		return *this;
-	}
-
-	bool operator<(const CComBSTR& bstrSrc) const throw()
-	{
-		return VarBstrCmp(m_str, bstrSrc.m_str, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0) == static_cast<HRESULT>(0);
-	}
-	bool operator<(LPCOLESTR pszSrc) const
-	{
-		CComBSTR bstr2(pszSrc);
-		return operator<(bstr2);
-	}
-	bool operator<(LPOLESTR pszSrc) const
-	{
-		return operator<((LPCOLESTR)pszSrc);
-	}
-
-	bool operator>(const CComBSTR& bstrSrc) const throw()
-	{
-		return VarBstrCmp(m_str, bstrSrc.m_str, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0) == static_cast<HRESULT>(2);
-	}
-	bool operator>(LPCOLESTR pszSrc) const
-	{
-		CComBSTR bstr2(pszSrc);
-		return operator>(bstr2);
-	}
-	bool operator>(LPOLESTR pszSrc) const
-	{
-		return operator>((LPCOLESTR)pszSrc);
-	}
-	
-	bool operator!=(const CComBSTR& bstrSrc) const throw()
-	{
-		return !operator==(bstrSrc);
-	}
-	bool operator!=(LPCOLESTR pszSrc) const
-	{
-		return !operator==(pszSrc);
-	}
-	bool operator!=(int nNull) const throw()
-	{
-		return !operator==(nNull);
-	}
-	bool operator!=(LPOLESTR pszSrc) const
-	{
-		return operator!=((LPCOLESTR)pszSrc);
-	}
-
-	bool operator==(const CComBSTR& bstrSrc) const throw()
-	{
-		return VarBstrCmp(m_str, bstrSrc.m_str, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0) == static_cast<HRESULT>(1);
-	}
-	bool operator==(LPCOLESTR pszSrc) const
-	{
-		CComBSTR bstr2(pszSrc);
-		return operator==(bstr2);
-	}
-	bool operator==(LPOLESTR pszSrc) const
-	{
-		return operator==((LPCOLESTR)pszSrc);
-	}
-	
-	bool operator==(int nNull) const throw()
-	{
-		(void) ((!!((nNull == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1153, 0, L"nNull == 0")) || (__debugbreak(), 0));
-		(void)nNull;
-		return (!*this);
-	}
-
-	CComBSTR(       LPCSTR pSrc)
-	{
-		if (pSrc != 0)
-		{
-			m_str = A2WBSTR(pSrc);
-			if (!*this)
-            {
-				ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
-            }
-		}
-		else
-        {
-			m_str = 0;
-        }
-	}
-
-	CComBSTR(     int nSize,          LPCSTR sz)
-	{
-		if (nSize != 0 && sz == 0)
-		{
-			m_str = ::SysAllocStringLen(0, nSize);
-			if (!*this)
-            {
-				ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
-            }
-			return;
-		}
-
-		m_str = A2WBSTR(sz, nSize);
-		if (!*this && nSize != 0)
-        {
-			ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
-        }
-	}
-
-	 HRESULT Append(       LPCSTR lpsz) throw()
-	{
-		if (lpsz == 0)
-			return ((HRESULT)0x00000000L);
-
-		CComBSTR bstrTemp;
-		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{bstrTemp = lpsz;} catch(...) {} __pragma(warning(pop));
-		if (!bstrTemp)
-        {
-			return ((HRESULT)0x8007000EL);
-        }
-		return Append(bstrTemp);
-	}
-
-	CComBSTR& operator=(       LPCSTR pSrc)
-	{
-		::SysFreeString(m_str);
-		m_str = A2WBSTR(pSrc);
-		if (!*this && pSrc != 0)
-        {
-			ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
-        }
-		return *this;
-	}
-
-	bool operator<(       LPCSTR pszSrc) const
-	{
-		CComBSTR bstr2(pszSrc);
-		return operator<(bstr2);
-	}
-	bool operator>(       LPCSTR pszSrc) const
-	{
-		CComBSTR bstr2(pszSrc);
-		return operator>(bstr2);
-	}
-	bool operator!=(       LPCSTR pszSrc) const
-	{
-		return !operator==(pszSrc);
-	}
-	bool operator==(       LPCSTR pszSrc) const
-	{
-		CComBSTR bstr2(pszSrc);
-		return operator==(bstr2);
-	}
-
-	 HRESULT WriteToStream(     IStream* pStream) throw()
-	{
-		(void) ((!!((pStream != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1240, 0, L"pStream != 0")) || (__debugbreak(), 0));
-		if(pStream == 0)
-			return ((HRESULT)0x80070057L);
-			
-		ULONG cb;
-		ULONG cbStrLen = CComBSTR::GetStreamSize(m_str) - sizeof(ULONG);
-		HRESULT hr = pStream->Write((void*) &cbStrLen, sizeof(cbStrLen), &cb);
-		if (((HRESULT)(hr) < 0))
-			return hr;
-		return cbStrLen ? pStream->Write((void*) m_str, cbStrLen, &cb) : ((HRESULT)0x00000000L);
-	}
-
-	 HRESULT ReadFromStream(     IStream* pStream) throw()
-	{
-		(void) ((!!((pStream != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1254, 0, L"pStream != 0")) || (__debugbreak(), 0));
-		if(pStream == 0)
-		{
-			return ((HRESULT)0x80070057L);
-		}
-			
-		(void) ((!!((!*this))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1260, 0, L"!*this")) || (__debugbreak(), 0)); 
-		Empty();
-		
-		HRESULT hrSeek;
-		ULARGE_INTEGER nBegOffset;
-		{
-			LARGE_INTEGER nZeroOffset;
-			nZeroOffset.QuadPart = 0L;
-			hrSeek = pStream->Seek(nZeroOffset, STREAM_SEEK_CUR, &nBegOffset);
-		}
-		ULONG cbRead = 0;
-		ULONG cbStrLen = 0;
-		HRESULT hr = pStream->Read(reinterpret_cast<void*>(&cbStrLen), sizeof(cbStrLen), &cbRead);
-		if (((HRESULT)(hr) >= 0))
-		{
-			
-			if (sizeof(cbStrLen) != cbRead)
-			{
-				ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1278)(atlTraceCOM, 0, L"Input stream is corrupted.");
-				hr = ((HRESULT)0x80004005L);
-			}
-			
-			else if (cbStrLen == 0)
-			{				
-			}
-			
-			else if (cbStrLen < sizeof(OLECHAR))
-			{
-				ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1288)(atlTraceCOM, 0, L"Input stream is corrupted.");
-				hr = ((HRESULT)0x80004005L);
-			}
-			
-			else if (cbStrLen > 0x100000)
-			{
-				ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1294)(atlTraceCOM, 0, L"String exceeded the maximum allowed size see _ATL_STREAM_MAX_SIZE.");
-				hr = ((HRESULT)0x80070005L);
-			}
-			else 
-			{
-				
-				cbStrLen -= sizeof(OLECHAR);
-				m_str = ::SysAllocStringByteLen(0, cbStrLen);
-				if (!*this)
-				{
-					hr = ((HRESULT)0x8007000EL);
-				}
-				else
-				{
-					hr = pStream->Read(reinterpret_cast<void*>(m_str), cbStrLen, &cbRead);
-
-					if (((HRESULT)(hr) >= 0))
-					{
-						if (cbRead != cbStrLen)
-						{
-							ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1314)(atlTraceCOM, 0, L"Length of string data is different than expected.");
-							hr = ((HRESULT)0x80004005L);
-						}
-						else
-						{
-							OLECHAR ch;
-							hr = pStream->Read(reinterpret_cast<void*>(&ch), sizeof(OLECHAR), &cbRead);	
-
-							if (((HRESULT)(hr) >= 0))
-							{								
-								if (cbRead != sizeof(OLECHAR)) 
-								{
-									ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1326)(atlTraceCOM, 0, L"Cannot read NULL terminator from stream.");
-									hr = ((HRESULT)0x80004005L); 									
-								}
-								else
-								{
-									
-									(void) ((!!((ch == L'\0'))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1332, 0, L"ch == L'\\0'")) || (__debugbreak(), 0));
-								}
-							}
-						}
-					}			
-						
-					if (((HRESULT)(hr) < 0))
-					{
-						::SysFreeString(m_str);
-						m_str = 0;
-					}
-				}
-			}
-		}
-		
-		
-		if (((HRESULT)(hr) < 0) && ((HRESULT)(hrSeek) >= 0))
-		{
-			LARGE_INTEGER nOffset;
-			nOffset.QuadPart = static_cast<LONGLONG>(nBegOffset.QuadPart);
-			pStream->Seek(nOffset, STREAM_SEEK_SET, 0);				
-		}
-
-		return hr;
-	}
-
-	static bool LoadStringResource(     HINSTANCE hInstance,      UINT uID,                   BSTR& bstrText) throw()
-	{
-		const ATLSTRINGRESOURCEIMAGE* pImage;
-
-#pragma warning(push)
-#pragma warning(disable:4068)
-#pragma prefast(push)
-#pragma prefast(disable:325, "The semantics of this function are about allocation, not content")
-		(void) ((!!((bstrText == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1366, 0, L"bstrText == 0")) || (__debugbreak(), 0));
-#pragma prefast(pop)
-#pragma warning(pop)
-
-		pImage = AtlGetStringResourceImage(hInstance, uID);
-		if (pImage != 0)
-		{
-			bstrText = ::SysAllocStringLen(pImage->achString, pImage->nLength);
-		}
-#pragma warning(push)
-#pragma warning(disable:4068)
-#pragma prefast(push)
-#pragma prefast(disable:325, "The semantics of this function are about allocation, not content")
-		return (bstrText != 0) ? true : false;
-#pragma prefast(pop)
-#pragma warning(pop)
-	}
-
-	static bool LoadStringResource(     UINT uID,                   BSTR& bstrText) throw()
-	{
-		const ATLSTRINGRESOURCEIMAGE* pImage;
-
-#pragma warning(push)
-#pragma warning(disable:4068)
-#pragma prefast(push)
-#pragma prefast(disable:325, "The semantics of this function are about allocation, not content")
-		(void) ((!!((bstrText == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1392, 0, L"bstrText == 0")) || (__debugbreak(), 0));
-#pragma prefast(pop)
-#pragma warning(pop)
-
-		pImage = AtlGetStringResourceImage(uID);
-		if (pImage != 0)
-		{
-			bstrText = ::SysAllocStringLen(pImage->achString, pImage->nLength);
-		}
-
-#pragma warning(push)
-#pragma warning(disable:4068)
-#pragma prefast(push)
-#pragma prefast(disable:325, "The semantics of this function are about allocation, not content")
-		return (bstrText != 0) ? true : false;
-#pragma prefast(pop)
-#pragma warning(pop)
-	}
-
-	
-	 HRESULT BSTRToArray(              LPSAFEARRAY *ppArray) throw()
-	{
-		return VectorFromBstr(m_str, ppArray);
-	}
-
-	
-	 HRESULT ArrayToBSTR(     const SAFEARRAY *pSrc) throw()
-	{
-		::SysFreeString(m_str);
-		return BstrFromVector((LPSAFEARRAY)pSrc, &m_str);
-	}
-	static ULONG GetStreamSize(BSTR bstr)
-	{
-		ULONG ulSize=sizeof(ULONG);
-#pragma warning(push)
-#pragma warning(disable:4068)
-#pragma prefast(push)
-#pragma prefast(disable:325, "The semantics of this function are about allocation, not content")
-		if (bstr != 0)
-#pragma prefast(pop)
-#pragma warning(pop)
-		{
-			ulSize += SysStringByteLen(bstr) + sizeof(OLECHAR);
-		}
-		return ulSize;
-	}
-};
-
-inline CComBSTR::~CComBSTR() throw()
-	{
-		::SysFreeString(m_str);
-	}
-
-inline void SysFreeStringHelper(     CComBSTR& bstr)
-{
-	bstr.Empty();
-}
-
-inline void SysFreeStringHelper(BSTR bstr)
-{
-	::SysFreeString(bstr);	
-}
-
-inline  HRESULT SysAllocStringHelper(       CComBSTR& bstrDest,BSTR bstrSrc)
-{
-	bstrDest=bstrSrc;
-	return !bstrDest ? ((HRESULT)0x8007000EL) : ((HRESULT)0x00000000L);
-}
-
-inline  HRESULT SysAllocStringHelper(       BSTR& bstrDest,BSTR bstrSrc)
-{
-	bstrDest=::SysAllocString(bstrSrc);
-#pragma warning(push)
-#pragma warning(disable:4068)
-#pragma prefast(push)
-#pragma prefast(disable:325, "The semantics of this function are about allocation, not content")
-	return bstrDest==0 ? ((HRESULT)0x8007000EL) : ((HRESULT)0x00000000L);
-#pragma prefast(pop)
-#pragma warning(pop)
-}
-
-
-
-
-
-
-template <class T>
-class CAdapt
-{
-public:
-	CAdapt()
-	{
-	}
-	CAdapt(     const T& rSrc) :
-		m_T( rSrc )
-	{
-	}
-
-	CAdapt(     const CAdapt& rSrCA) :
-		m_T( rSrCA.m_T )
-	{
-	}
-
-	CAdapt& operator=(     const T& rSrc)
-	{
-		m_T = rSrc;
-		return *this;
-	}
-	bool operator<(     const T& rSrc) const
-	{
-		return m_T < rSrc;
-	}
-	bool operator==(     const T& rSrc) const
-	{
-		return m_T == rSrc;
-	}
-	operator T&()
-	{
-		return m_T;
-	}
-
-	operator const T&() const
-	{
-		return m_T;
-	}
-
-	T m_T;
-};
-
-
-
-
-
-
-
-
-template< typename T > 
-class CVarTypeInfo
-{
-
-
-};
-
-template<>
-class CVarTypeInfo< char >
-{
-public:
-	static const VARTYPE VT = VT_I1;
-	static char VARIANT::* const pmField;
-};
-
-__declspec( selectany ) char VARIANT::* const CVarTypeInfo< char >::pmField = &VARIANT::cVal;
-
-template<>
-class CVarTypeInfo< unsigned char >
-{
-public:
-	static const VARTYPE VT = VT_UI1;
-	static unsigned char VARIANT::* const pmField;
-};
-
-__declspec( selectany ) unsigned char VARIANT::* const CVarTypeInfo< unsigned char >::pmField = &VARIANT::bVal;
-
-template<>
-class CVarTypeInfo< char* >
-{
-public:
-	static const VARTYPE VT = VT_I1|VT_BYREF;
-	static char* VARIANT::* const pmField;
-};
-
-__declspec( selectany ) char* VARIANT::* const CVarTypeInfo< char* >::pmField = &VARIANT::pcVal;
-
-template<>
-class CVarTypeInfo< unsigned char* >
-{
-public:
-	static const VARTYPE VT = VT_UI1|VT_BYREF;
-	static unsigned char* VARIANT::* const pmField;
-};
-
-__declspec( selectany ) unsigned char* VARIANT::* const CVarTypeInfo< unsigned char* >::pmField = &VARIANT::pbVal;
-
-template<>
-class CVarTypeInfo< short >
-{
-public:
-	static const VARTYPE VT = VT_I2;
-	static short VARIANT::* const pmField;
-};
-
-__declspec( selectany ) short VARIANT::* const CVarTypeInfo< short >::pmField = &VARIANT::iVal;
-
-template<>
-class CVarTypeInfo< short* >
-{
-public:
-	static const VARTYPE VT = VT_I2|VT_BYREF;
-	static short* VARIANT::* const pmField;
-};
-
-__declspec( selectany ) short* VARIANT::* const CVarTypeInfo< short* >::pmField = &VARIANT::piVal;
-
-template<>
-class CVarTypeInfo< unsigned short >
-{
-public:
-	static const VARTYPE VT = VT_UI2;
-	static unsigned short VARIANT::* const pmField;
-};
-
-__declspec( selectany ) unsigned short VARIANT::* const CVarTypeInfo< unsigned short >::pmField = &VARIANT::uiVal;
-
-
-template<>
-class CVarTypeInfo< unsigned short* >
-{
-public:
-	static const VARTYPE VT = VT_UI2|VT_BYREF;
-	static unsigned short* VARIANT::* const pmField;
-};
-
-__declspec( selectany ) unsigned short* VARIANT::* const CVarTypeInfo< unsigned short* >::pmField = &VARIANT::puiVal;
-
-
-template<>
-class CVarTypeInfo< int >
-{
-public:
-	static const VARTYPE VT = VT_I4;
-	static int VARIANT::* const pmField;
-};
-
-__declspec( selectany ) int VARIANT::* const CVarTypeInfo< int >::pmField = &VARIANT::intVal;
-
-template<>
-class CVarTypeInfo< int* >
-{
-public:
-	static const VARTYPE VT = VT_I4|VT_BYREF;
-	static int* VARIANT::* const pmField;
-};
-
-__declspec( selectany ) int* VARIANT::* const CVarTypeInfo< int* >::pmField = &VARIANT::pintVal;
-
-template<>
-class CVarTypeInfo< unsigned int >
-{
-public:
-	static const VARTYPE VT = VT_UI4;
-	static unsigned int VARIANT::* const pmField;
-};
-
-__declspec( selectany ) unsigned int VARIANT::* const CVarTypeInfo< unsigned int >::pmField = &VARIANT::uintVal;
-
-template<>
-class CVarTypeInfo< unsigned int* >
-{
-public:
-	static const VARTYPE VT = VT_UI4|VT_BYREF;
-	static unsigned int* VARIANT::* const pmField;
-};
-
-__declspec( selectany ) unsigned int* VARIANT::* const CVarTypeInfo< unsigned int* >::pmField = &VARIANT::puintVal;
-
-template<>
-class CVarTypeInfo< long >
-{
-public:
-	static const VARTYPE VT = VT_I4;
-	static long VARIANT::* const pmField;
-};
-
-__declspec( selectany ) long VARIANT::* const CVarTypeInfo< long >::pmField = &VARIANT::lVal;
-
-template<>
-class CVarTypeInfo< long* >
-{
-public:
-	static const VARTYPE VT = VT_I4|VT_BYREF;
-	static long* VARIANT::* const pmField;
-};
-
-__declspec( selectany ) long* VARIANT::* const CVarTypeInfo< long* >::pmField = &VARIANT::plVal;
-
-template<>
-class CVarTypeInfo< unsigned long >
-{
-public:
-	static const VARTYPE VT = VT_UI4;
-	static unsigned long VARIANT::* const pmField;
-};
-
-__declspec( selectany ) unsigned long VARIANT::* const CVarTypeInfo< unsigned long >::pmField = &VARIANT::ulVal;
-
-template<>
-class CVarTypeInfo< unsigned long* >
-{
-public:
-	static const VARTYPE VT = VT_UI4|VT_BYREF;
-	static unsigned long* VARIANT::* const pmField;
-};
-
-__declspec( selectany ) unsigned long* VARIANT::* const CVarTypeInfo< unsigned long* >::pmField = &VARIANT::pulVal;
-
-template<>
-class CVarTypeInfo< __int64 >
-{
-public:
-	static const VARTYPE VT = VT_I8;
-	static __int64 VARIANT::* const pmField;
-};
-
-__declspec( selectany ) __int64 VARIANT::* const CVarTypeInfo< __int64 >::pmField = &VARIANT::llVal;
-
-template<>
-class CVarTypeInfo< __int64* >
-{
-public:
-	static const VARTYPE VT = VT_I8|VT_BYREF;
-	static __int64* VARIANT::* const pmField;
-};
-
-__declspec( selectany ) __int64* VARIANT::* const CVarTypeInfo< __int64* >::pmField = &VARIANT::pllVal;
-
-template<>
-class CVarTypeInfo< unsigned __int64 >
-{
-public:
-	static const VARTYPE VT = VT_UI8;
-	static unsigned __int64 VARIANT::* const pmField;
-};
-
-__declspec( selectany ) unsigned __int64 VARIANT::* const CVarTypeInfo< unsigned __int64 >::pmField = &VARIANT::ullVal;
-
-template<>
-class CVarTypeInfo< unsigned __int64* >
-{
-public:
-	static const VARTYPE VT = VT_UI8|VT_BYREF;
-	static unsigned __int64* VARIANT::* const pmField;
-};
-
-__declspec( selectany ) unsigned __int64* VARIANT::* const CVarTypeInfo< unsigned __int64* >::pmField = &VARIANT::pullVal;
-
-template<>
-class CVarTypeInfo< float >
-{
-public:
-	static const VARTYPE VT = VT_R4;
-	static float VARIANT::* const pmField;
-};
-
-__declspec( selectany ) float VARIANT::* const CVarTypeInfo< float >::pmField = &VARIANT::fltVal;
-
-template<>
-class CVarTypeInfo< float* >
-{
-public:
-	static const VARTYPE VT = VT_R4|VT_BYREF;
-	static float* VARIANT::* const pmField;
-};
-
-__declspec( selectany ) float* VARIANT::* const CVarTypeInfo< float* >::pmField = &VARIANT::pfltVal;
-
-template<>
-class CVarTypeInfo< double >
-{
-public:
-	static const VARTYPE VT = VT_R8;
-	static double VARIANT::* const pmField;
-};
-
-__declspec( selectany ) double VARIANT::* const CVarTypeInfo< double >::pmField = &VARIANT::dblVal;
-
-template<>
-class CVarTypeInfo< double* >
-{
-public:
-	static const VARTYPE VT = VT_R8|VT_BYREF;
-	static double* VARIANT::* const pmField;
-};
-
-__declspec( selectany ) double* VARIANT::* const CVarTypeInfo< double* >::pmField = &VARIANT::pdblVal;
-
-template<>
-class CVarTypeInfo< VARIANT >
-{
-public:
-	static const VARTYPE VT = VT_VARIANT;
-};
-
-template<>
-class CVarTypeInfo< BSTR >
-{
-public:
-	static const VARTYPE VT = VT_BSTR;
-	static BSTR VARIANT::* const pmField;
-};
-
-__declspec( selectany ) BSTR VARIANT::* const CVarTypeInfo< BSTR >::pmField = &VARIANT::bstrVal;
-
-template<>
-class CVarTypeInfo< BSTR* >
-{
-public:
-	static const VARTYPE VT = VT_BSTR|VT_BYREF;
-	static BSTR* VARIANT::* const pmField;
-};
-
-__declspec( selectany ) BSTR* VARIANT::* const CVarTypeInfo< BSTR* >::pmField = &VARIANT::pbstrVal;
-
-template<>
-class CVarTypeInfo< IUnknown* >
-{
-public:
-	static const VARTYPE VT = VT_UNKNOWN;
-	static IUnknown* VARIANT::* const pmField;
-};
-
-__declspec( selectany ) IUnknown* VARIANT::* const CVarTypeInfo< IUnknown* >::pmField = &VARIANT::punkVal;
-
-template<>
-class CVarTypeInfo< IUnknown** >
-{
-public:
-	static const VARTYPE VT = VT_UNKNOWN|VT_BYREF;
-	static IUnknown** VARIANT::* const pmField;
-};
-
-__declspec( selectany ) IUnknown** VARIANT::* const CVarTypeInfo< IUnknown** >::pmField = &VARIANT::ppunkVal;
-
-template<>
-class CVarTypeInfo< IDispatch* >
-{
-public:
-	static const VARTYPE VT = VT_DISPATCH;
-	static IDispatch* VARIANT::* const pmField;
-};
-
-__declspec( selectany ) IDispatch* VARIANT::* const CVarTypeInfo< IDispatch* >::pmField = &VARIANT::pdispVal;
-
-template<>
-class CVarTypeInfo< IDispatch** >
-{
-public:
-	static const VARTYPE VT = VT_DISPATCH|VT_BYREF;
-	static IDispatch** VARIANT::* const pmField;
-};
-
-__declspec( selectany ) IDispatch** VARIANT::* const CVarTypeInfo< IDispatch** >::pmField = &VARIANT::ppdispVal;
-
-template<>
-class CVarTypeInfo< CY >
-{
-public:
-	static const VARTYPE VT = VT_CY;
-	static CY VARIANT::* const pmField;
-};
-
-__declspec( selectany ) CY VARIANT::* const CVarTypeInfo< CY >::pmField = &VARIANT::cyVal;
-
-template<>
-class CVarTypeInfo< CY* >
-{
-public:
-	static const VARTYPE VT = VT_CY|VT_BYREF;
-	static CY* VARIANT::* const pmField;
-};
-
-__declspec( selectany ) CY* VARIANT::* const CVarTypeInfo< CY* >::pmField = &VARIANT::pcyVal;
-
-class CComVariant : public tagVARIANT
-{
-
-public:
-	CComVariant() throw()
-	{
-		::VariantInit(this);
-	}
-	~CComVariant() throw()
-	{
-		Clear();
-	}
-
-	CComVariant(     const VARIANT& varSrc)
-	{
-		vt = VT_EMPTY;
-		InternalCopy(&varSrc);
-	}
-
-	CComVariant(     const CComVariant& varSrc)
-	{
-		vt = VT_EMPTY;
-		InternalCopy(&varSrc);
-	}
-	CComVariant(     LPCOLESTR lpszSrc)
-	{
-		vt = VT_EMPTY;
-		*this = lpszSrc;
-	}
-
-	CComVariant(     LPCSTR lpszSrc)
-	{
-		vt = VT_EMPTY;
-		*this = lpszSrc;
-	}
-
-	CComVariant(     bool bSrc)
-	{
-		vt = VT_BOOL;
-		boolVal = bSrc ? VARIANT_BOOL( -1 ) : VARIANT_BOOL( 0 );
-	}
-
-	CComVariant(     int nSrc,      VARTYPE vtSrc = VT_I4) throw()
-	{
-		(void) ((!!((vtSrc == VT_I4 || vtSrc == VT_INT))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1908, 0, L"vtSrc == VT_I4 || vtSrc == VT_INT")) || (__debugbreak(), 0));
-		vt = vtSrc;
-		intVal = nSrc;
-	}
-	CComVariant(     BYTE nSrc) throw()
-	{
-		vt = VT_UI1;
-		bVal = nSrc;
-	}
-	CComVariant(     short nSrc) throw()
-	{
-		vt = VT_I2;
-		iVal = nSrc;
-	}
-	CComVariant(     long nSrc,      VARTYPE vtSrc = VT_I4) throw()
-	{
-		(void) ((!!((vtSrc == VT_I4 || vtSrc == VT_ERROR))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1924, 0, L"vtSrc == VT_I4 || vtSrc == VT_ERROR")) || (__debugbreak(), 0));
-		vt = vtSrc;
-		lVal = nSrc;
-	}
-	CComVariant(     float fltSrc) throw()
-	{
-		vt = VT_R4;
-		fltVal = fltSrc;
-	}
-	CComVariant(     double dblSrc,      VARTYPE vtSrc = VT_R8) throw()
-	{
-		(void) ((!!((vtSrc == VT_R8 || vtSrc == VT_DATE))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1935, 0, L"vtSrc == VT_R8 || vtSrc == VT_DATE")) || (__debugbreak(), 0));
-		vt = vtSrc;
-		dblVal = dblSrc;
-	}
-
-	CComVariant(     LONGLONG nSrc) throw()
-	{
-		vt = VT_I8;
-		llVal = nSrc;
-	}
-	CComVariant(     ULONGLONG nSrc) throw()
-	{
-		vt = VT_UI8;
-		ullVal = nSrc;
-	}
-
-	CComVariant(CY      cySrc) throw()
-	{
-		vt = VT_CY;
-		cyVal.Hi = cySrc.Hi;
-		cyVal.Lo = cySrc.Lo;
-	}
-	CComVariant(       IDispatch* pSrc) throw()
-	{
-		vt = VT_DISPATCH;
-		pdispVal = pSrc;
-		
-		if (pdispVal != 0)
-			pdispVal->AddRef();
-	}
-	CComVariant(       IUnknown* pSrc) throw()
-	{
-		vt = VT_UNKNOWN;
-		punkVal = pSrc;
-		
-		if (punkVal != 0)
-			punkVal->AddRef();
-	}
-	CComVariant(     char cSrc) throw()
-	{
-		vt = VT_I1;
-		cVal = cSrc;
-	}
-	CComVariant(     unsigned short nSrc) throw()
-	{
-		vt = VT_UI2;
-		uiVal = nSrc;
-	}
-	CComVariant(     unsigned long nSrc) throw()
-	{
-		vt = VT_UI4;
-		ulVal = nSrc;
-	}
-	CComVariant(     unsigned int nSrc,      VARTYPE vtSrc = VT_UI4) throw()
-	{
-		(void) ((!!((vtSrc == VT_UI4 || vtSrc == VT_UINT))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1990, 0, L"vtSrc == VT_UI4 || vtSrc == VT_UINT")) || (__debugbreak(), 0));
-		vt = vtSrc;
-		uintVal= nSrc;
-	}
-	CComVariant(     const CComBSTR& bstrSrc)
-	{
-		vt = VT_EMPTY;
-		*this = bstrSrc;
-	}
-	CComVariant(       const SAFEARRAY *pSrc)
-	{
-		LPSAFEARRAY pCopy;
-		if (pSrc != 0)
-		{
-			HRESULT hRes = ::SafeArrayCopy((LPSAFEARRAY)pSrc, &pCopy);
-			if (((HRESULT)(hRes) >= 0) && pCopy != 0)
-			{
-                ::ATL::AtlSafeArrayGetActualVartype((LPSAFEARRAY)pSrc, &vt);
-				vt |= VT_ARRAY;
-				parray = pCopy;
-			}
-			else
-			{
-				vt = VT_ERROR;
-				scode = hRes;
-
-				do { int __atl_condVal=!!(0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2016, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x8007000EL)); } while (0);
-
-			}
-		}
-		else
-		{
-			vt = VT_EMPTY;
-		}
-	}
-
-public:
-	CComVariant& operator=(     const CComVariant& varSrc)
-	{
-        if(this!=&varSrc)
-        {
-		    InternalCopy(&varSrc);
-        }
-		return *this;
-	}
-	CComVariant& operator=(     const VARIANT& varSrc)
-	{
-        if(static_cast<VARIANT *>(this)!=&varSrc)
-        {
-		    InternalCopy(&varSrc);
-        }
-		return *this;
-	}
-
-	CComVariant& operator=(     const CComBSTR& bstrSrc)
-	{
-		Clear();
-		vt = VT_BSTR;
-		bstrVal = bstrSrc.Copy();
-#pragma warning(push)
-#pragma warning(disable:4068)
-#pragma prefast(push)
-#pragma prefast(disable:325, "We are checking allocation semantics here")
-		if (bstrVal == 0 && bstrSrc.m_str != 0)
-		{
-			vt = VT_ERROR;
-			scode = ((HRESULT)0x8007000EL);
-
-			do { int __atl_condVal=!!(0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2058, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x8007000EL)); } while (0);
-
-		}
-#pragma prefast(pop)
-#pragma warning(pop)
-		return *this;
-	}
-
-	CComVariant& operator=(     LPCOLESTR lpszSrc)
-	{
-		Clear();
-		vt = VT_BSTR;
-		bstrVal = ::SysAllocString(lpszSrc);
-
-		if (bstrVal == 0 && lpszSrc != 0)
-		{
-			vt = VT_ERROR;
-			scode = ((HRESULT)0x8007000EL);
-
-			do { int __atl_condVal=!!(0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2077, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x8007000EL)); } while (0);
-
-
-		}
-		return *this;
-	}
-
-	CComVariant& operator=(     LPCSTR lpszSrc)
-	{
-		int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
-		Clear();
-		vt = VT_BSTR;
-		bstrVal = ::SysAllocString(((LPCWSTR)( ((_lpa_ex = lpszSrc) == 0) ? 0 : ( _convert_ex = (lstrlenA(_lpa_ex)+1), ((HRESULT)(::ATL::AtlMultiply(&_convert_ex, _convert_ex, static_cast<int>(sizeof(WCHAR)))) < 0) ? 0 : AtlA2WHelper( (LPWSTR)__pragma(warning(push)) __pragma(warning(disable:4616)) __pragma(warning(disable:6255)) ((_convert_ex <= 1024 && ATL::_ATL_SAFE_ALLOCA_IMPL::_AtlVerifyStackAvailable(_convert_ex) ) ? _alloca(_convert_ex) : _AtlSafeAllocaManager.Allocate(_convert_ex)) __pragma(warning(pop)), _lpa_ex, _convert_ex / sizeof(WCHAR), _acp_ex)))));
-
-		if (bstrVal == 0 && lpszSrc != 0)
-		{
-			vt = VT_ERROR;
-			scode = ((HRESULT)0x8007000EL);
-
-			do { int __atl_condVal=!!(0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2096, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x8007000EL)); } while (0);
-
-		}
-		return *this;
-	}
-
-	CComVariant& operator=(     bool bSrc)
-	{
-		if (vt != VT_BOOL)
-		{
-			Clear();
-			vt = VT_BOOL;
-		}
-		boolVal = bSrc ? VARIANT_BOOL( -1 ) : VARIANT_BOOL( 0 );
-		return *this;
-	}
-
-	CComVariant& operator=(     int nSrc) throw()
-	{
-		if (vt != VT_I4)
-		{
-			Clear();
-			vt = VT_I4;
-		}
-		intVal = nSrc;
-
-		return *this;
-	}
-
-	CComVariant& operator=(     BYTE nSrc) throw()
-	{
-		if (vt != VT_UI1)
-		{
-			Clear();
-			vt = VT_UI1;
-		}
-		bVal = nSrc;
-		return *this;
-	}
-
-	CComVariant& operator=(     short nSrc) throw()
-	{
-		if (vt != VT_I2)
-		{
-			Clear();
-			vt = VT_I2;
-		}
-		iVal = nSrc;
-		return *this;
-	}
-
-	CComVariant& operator=(     long nSrc) throw()
-	{
-		if (vt != VT_I4)
-		{
-			Clear();
-			vt = VT_I4;
-		}
-		lVal = nSrc;
-		return *this;
-	}
-
-	CComVariant& operator=(     float fltSrc) throw()
-	{
-		if (vt != VT_R4)
-		{
-			Clear();
-			vt = VT_R4;
-		}
-		fltVal = fltSrc;
-		return *this;
-	}
-
-	CComVariant& operator=(     double dblSrc) throw()
-	{
-		if (vt != VT_R8)
-		{
-			Clear();
-			vt = VT_R8;
-		}
-		dblVal = dblSrc;
-		return *this;
-	}
-
-	CComVariant& operator=(     CY cySrc) throw()
-	{
-		if (vt != VT_CY)
-		{
-			Clear();
-			vt = VT_CY;
-		}
-		cyVal.Hi = cySrc.Hi;
-		cyVal.Lo = cySrc.Lo;
-		return *this;
-	}
-
-	CComVariant& operator=(       IDispatch* pSrc) throw()
-	{
-		Clear();
-		vt = VT_DISPATCH;
-		pdispVal = pSrc;
-		
-		if (pdispVal != 0)
-			pdispVal->AddRef();
-		return *this;
-	}
-
-	CComVariant& operator=(       IUnknown* pSrc) throw()
-	{
-		Clear();
-		vt = VT_UNKNOWN;
-		punkVal = pSrc;
-
-		
-		if (punkVal != 0)
-			punkVal->AddRef();
-		return *this;
-	}
-
-	CComVariant& operator=(     char cSrc) throw()
-	{
-		if (vt != VT_I1)
-		{
-			Clear();
-			vt = VT_I1;
-		}
-		cVal = cSrc;
-		return *this;
-	}
-
-	CComVariant& operator=(     unsigned short nSrc) throw()
-	{
-		if (vt != VT_UI2)
-		{
-			Clear();
-			vt = VT_UI2;
-		}
-		uiVal = nSrc;
-		return *this;
-	}
-
-	CComVariant& operator=(     unsigned long nSrc) throw()
-	{
-		if (vt != VT_UI4)
-		{
-			Clear();
-			vt = VT_UI4;
-		}
-		ulVal = nSrc;
-		return *this;
-	}
-
-	CComVariant& operator=(     unsigned int nSrc) throw()
-	{
-		if (vt != VT_UI4)
-		{
-			Clear();
-			vt = VT_UI4;
-		}
-		uintVal= nSrc;
-		return *this;
-	}
-
-	CComVariant& operator=(       BYTE* pbSrc) throw()
-	{
-		if (vt != (VT_UI1|VT_BYREF))
-		{
-			Clear();
-			vt = VT_UI1|VT_BYREF;
-		}
-		pbVal = pbSrc;
-		return *this;
-	}
-
-	CComVariant& operator=(       short* pnSrc) throw()
-	{
-		if (vt != (VT_I2|VT_BYREF))
-		{
-			Clear();
-			vt = VT_I2|VT_BYREF;
-		}
-		piVal = pnSrc;
-		return *this;
-	}
-
-
-	CComVariant& operator=(       USHORT* pnSrc) throw()
-	{
-		if (vt != (VT_UI2|VT_BYREF))
-		{
-			Clear();
-			vt = VT_UI2|VT_BYREF;
-		}
-		puiVal = pnSrc;
-		return *this;
-	}
-
-
-	CComVariant& operator=(       int* pnSrc) throw()
-	{
-		if (vt != (VT_I4|VT_BYREF))
-		{
-			Clear();
-			vt = VT_I4|VT_BYREF;
-		}
-		pintVal = pnSrc;
-		return *this;
-	}
-
-	CComVariant& operator=(       UINT* pnSrc) throw()
-	{
-		if (vt != (VT_UI4|VT_BYREF))
-		{
-			Clear();
-			vt = VT_UI4|VT_BYREF;
-		}
-		puintVal = pnSrc;
-		return *this;
-	}
-
-	CComVariant& operator=(       long* pnSrc) throw()
-	{
-		if (vt != (VT_I4|VT_BYREF))
-		{
-			Clear();
-			vt = VT_I4|VT_BYREF;
-		}
-		plVal = pnSrc;
-		return *this;
-	}
-
-	CComVariant& operator=(       ULONG* pnSrc) throw()
-	{
-		if (vt != (VT_UI4|VT_BYREF))
-		{
-			Clear();
-			vt = VT_UI4|VT_BYREF;
-		}
-		pulVal = pnSrc;
-		return *this;
-	}
-
-
-	CComVariant& operator=(     LONGLONG nSrc) throw()
-	{
-		if (vt != VT_I8)
-		{
-			Clear();
-			vt = VT_I8;
-		}
-		llVal = nSrc;
-
-		return *this;
-	}
-
-	CComVariant& operator=(       LONGLONG* pnSrc) throw()
-	{
-		if (vt != (VT_I8|VT_BYREF))
-		{
-			Clear();
-			vt = VT_I8|VT_BYREF;
-		}
-		pllVal = pnSrc;
-		return *this;
-	}
-
-	CComVariant& operator=(     ULONGLONG nSrc) throw()
-	{
-		if (vt != VT_UI8)
-		{
-			Clear();
-			vt = VT_UI8;
-		}
-		ullVal = nSrc;
-
-		return *this;
-	}
-
-	CComVariant& operator=(       ULONGLONG* pnSrc) throw()
-	{
-		if (vt != (VT_UI8|VT_BYREF))
-		{
-			Clear();
-			vt = VT_UI8|VT_BYREF;
-		}
-		pullVal = pnSrc;
-		return *this;
-	}
-
-
-	CComVariant& operator=(       float* pfSrc) throw()
-	{
-		if (vt != (VT_R4|VT_BYREF))
-		{
-			Clear();
-			vt = VT_R4|VT_BYREF;
-		}
-		pfltVal = pfSrc;
-		return *this;
-	}
-
-	CComVariant& operator=(       double* pfSrc) throw()
-	{
-		if (vt != (VT_R8|VT_BYREF))
-		{
-			Clear();
-			vt = VT_R8|VT_BYREF;
-		}
-		pdblVal = pfSrc;
-		return *this;
-	}
-
-	CComVariant& operator=(       const SAFEARRAY *pSrc)
-	{
-		Clear();
-		LPSAFEARRAY pCopy;
-		if (pSrc != 0)
-		{
-			HRESULT hRes = ::SafeArrayCopy((LPSAFEARRAY)pSrc, &pCopy);
-			if (((HRESULT)(hRes) >= 0) && pCopy != 0)
-			{
-				::ATL::AtlSafeArrayGetActualVartype((LPSAFEARRAY)pSrc, &vt);
-				vt |= VT_ARRAY;
-				parray = pCopy;
-			}
-			else
-			{
-				vt = VT_ERROR;
-				scode = hRes;
-
-			do { int __atl_condVal=!!(0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2426, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x8007000EL)); } while (0);
-
-			}
-		}
-		return *this;
-	}
-
-
-public:
-	bool operator==(     const VARIANT& varSrc) const throw()
-	{
-		
-		if (vt == VT_NULL && varSrc.vt == VT_NULL)
-		{
-			return true;
-		}
-		
-		if (vt != varSrc.vt)
-		{
-			return false;
-		}
-		return VarCmp((VARIANT*)this, (VARIANT*)&varSrc, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0) == static_cast<HRESULT>(1);
-	}
-
-	bool operator!=(     const VARIANT& varSrc) const throw()
-	{
-		return !operator==(varSrc);
-	}
-
-	bool operator<(     const VARIANT& varSrc) const throw()
-	{
-		if (vt == VT_NULL && varSrc.vt == VT_NULL)
-			return false;
-		return VarCmp((VARIANT*)this, (VARIANT*)&varSrc, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0)== static_cast<HRESULT>(0);
-	}
-
-	bool operator>(     const VARIANT& varSrc) const throw()
-	{
-		if (vt == VT_NULL && varSrc.vt == VT_NULL)
-			return false;
-		return VarCmp((VARIANT*)this, (VARIANT*)&varSrc, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0)== static_cast<HRESULT>(2);
-	}
-
-
-public:
-	HRESULT Clear() { return ::VariantClear(this); }
-	HRESULT ClearToZero() 
-	{
-		HRESULT hr = ::VariantClear(this); 
-		if( ((HRESULT)(hr) < 0) )
-		{
-			return hr;
-		}
-		memset(this ,0 ,sizeof(tagVARIANT));
-		vt = VT_EMPTY;
-		return hr;
-	}
-	HRESULT Copy(     const VARIANT* pSrc) { return ::VariantCopy(this, const_cast<VARIANT*>(pSrc)); }
-	
-	HRESULT CopyTo(     BSTR *pstrDest) const
-	{
-		(void) ((!!((pstrDest != 0 && vt == VT_BSTR))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2487, 0, L"pstrDest != 0 && vt == VT_BSTR")) || (__debugbreak(), 0));
-		HRESULT hRes = ((HRESULT)0x80004003L);
-		if (pstrDest != 0 && vt == VT_BSTR)
-		{
-			*pstrDest = ::SysAllocStringByteLen((char*)bstrVal, ::SysStringByteLen(bstrVal));
-			if (*pstrDest == 0)
-				hRes = ((HRESULT)0x8007000EL);
-			else
-				hRes = ((HRESULT)0x00000000L);
-		}
-		else if (vt != VT_BSTR)
-			hRes = ((HRESULT)0x80020005L);
-		return hRes;
-	}
-	HRESULT Attach(     VARIANT* pSrc)
-	{
-		if(pSrc == 0)
-			return ((HRESULT)0x80070057L);
-			
-		
-		HRESULT hr = Clear();
-		if (!((HRESULT)(hr) < 0))
-		{
-			
-			Checked::memcpy_s(this, sizeof(CComVariant), pSrc, sizeof(VARIANT));
-			pSrc->vt = VT_EMPTY;
-			hr = ((HRESULT)0x00000000L);
-		}
-		return hr;
-	}
-
-	HRESULT Detach(     VARIANT* pDest)
-	{
-		(void) ((!!((pDest != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2520, 0, L"pDest != 0")) || (__debugbreak(), 0));
-		if(pDest == 0)
-			return ((HRESULT)0x80004003L);
-			
-		
-		HRESULT hr = ::VariantClear(pDest);
-		if (!((HRESULT)(hr) < 0))
-		{
-			
-			Checked::memcpy_s(pDest, sizeof(VARIANT), this, sizeof(VARIANT));
-			vt = VT_EMPTY;
-			hr = ((HRESULT)0x00000000L);
-		}
-		return hr;
-	}
-
-	HRESULT ChangeType(     VARTYPE vtNew,        const VARIANT* pSrc = 0)
-	{
-		VARIANT* pVar = const_cast<VARIANT*>(pSrc);
-		
-		if (pVar == 0)
-			pVar = this;
-		
-		return ::VariantChangeType(this, pVar, 0, vtNew);
-	}
-
-	template< typename T >
-	void SetByRef(      T* pT ) throw()
-	{
-		Clear();
-		vt = CVarTypeInfo< T >::VT|VT_BYREF;
-		byref = pT;
-	}
-
-	HRESULT WriteToStream(     IStream* pStream);
-	HRESULT WriteToStream(     IStream* pStream, VARTYPE vtWrite)
-	{
-		if (vtWrite != VT_EMPTY && vtWrite != vt)
-		{
-			CComVariant varConv;
-			HRESULT hr = varConv.ChangeType(vtWrite, this);
-			if (((HRESULT)(hr) < 0))
-			{
-				return hr;
-			}
-			return varConv.WriteToStream(pStream);
-		}
-		return WriteToStream(pStream);
-	}
-
-	HRESULT ReadFromStream(     IStream* pStream, VARTYPE vtExpected = VT_EMPTY);
-
-	HRESULT ReadFromStream(     IStream* pStream,      VARTYPE vtExpected,
-		     ClassesAllowedInStream rgclsidAllowed,      DWORD cclsidAllowed);
-
-	
-	ULONG GetSize() const;
-
-
-public:
-	HRESULT InternalClear()
-	{
-		HRESULT hr = Clear();
-		(void) ((!!((((HRESULT)(hr) >= 0)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2583, 0, L"((HRESULT)(hr) >= 0)")) || (__debugbreak(), 0));
-		if (((HRESULT)(hr) < 0))
-		{
-			vt = VT_ERROR;
-			scode = hr;
-
-			ATL::AtlThrowImpl(hr);
-
-		}
-		return hr;
-	}
-
-	void InternalCopy(     const VARIANT* pSrc)
-	{
-		HRESULT hr = Copy(pSrc);
-		if (((HRESULT)(hr) < 0))
-		{
-			vt = VT_ERROR;
-			scode = hr;
-
-			ATL::AtlThrowImpl(hr);
-
-		}
-	}
-};
-
-#pragma warning(push)
-#pragma warning(disable: 4702)
-inline HRESULT CComVariant::WriteToStream(     IStream* pStream)
-{
-	if(pStream == 0)
-		return ((HRESULT)0x80070057L);
-		
-	HRESULT hr = pStream->Write(&vt, sizeof(VARTYPE), 0);
-	if (((HRESULT)(hr) < 0))
-		return hr;
-
-	int cbWrite = 0;
-	switch (vt)
-	{
-	case VT_UNKNOWN:
-	case VT_DISPATCH:
-		{
-			CComPtr<IPersistStream> spStream;
-			if (punkVal != 0)
-			{
-				hr = punkVal->QueryInterface(__uuidof(IPersistStream), (void**)&spStream);
-				if (((HRESULT)(hr) < 0))
-				{
-					hr = punkVal->QueryInterface(__uuidof(IPersistStreamInit), (void**)&spStream);
-					if (((HRESULT)(hr) < 0))
-						return hr;
-				}
-			}
-			if (spStream != 0)
-				return OleSaveToStream(spStream, pStream);
-			return WriteClassStm(pStream, GUID_NULL);
-		}
-	case VT_UI1:
-	case VT_I1:
-		cbWrite = sizeof(BYTE);
-		break;
-	case VT_I2:
-	case VT_UI2:
-	case VT_BOOL:
-		cbWrite = sizeof(short);
-		break;
-	case VT_I4:
-	case VT_UI4:
-	case VT_R4:
-	case VT_INT:
-	case VT_UINT:
-	case VT_ERROR:
-		cbWrite = sizeof(long);
-		break;
-	case VT_I8:
-	case VT_UI8:
-		cbWrite = sizeof(LONGLONG);
-		break;
-	case VT_R8:
-	case VT_CY:
-	case VT_DATE:
-		cbWrite = sizeof(double);
-		break;
-	default:
-		break;
-	}
-	if (cbWrite != 0)
-		return pStream->Write((void*) &bVal, cbWrite, 0);
-
-	CComBSTR bstrWrite;
-	CComVariant varBSTR;
-	if (vt != VT_BSTR)
-	{
-		hr = VariantChangeType(&varBSTR, this, 0x01, VT_BSTR);
-		if (((HRESULT)(hr) < 0))
-			return hr;
-		bstrWrite.Attach(varBSTR.bstrVal);
-	}
-	else
-		bstrWrite.Attach(bstrVal);
-
-	hr = bstrWrite.WriteToStream(pStream);
-	bstrWrite.Detach();
-	return hr;
-}
-#pragma warning(pop)	
-
-inline HRESULT CComVariant::ReadFromStream(     IStream* pStream,      VARTYPE vtExpected  )
-{
-	ClassesAllowedInStream allowed;
-	allowed.rgclsidAllowed = 0;
-
-	return ReadFromStream(pStream, vtExpected, allowed, 0);
-}
-
-inline HRESULT CComVariant::ReadFromStream(     IStream* pStream,      VARTYPE vtExpected, 
-				     ClassesAllowedInStream rgclsidAllowed,      DWORD cclsidAllowed)
-{
-	(void) ((!!((pStream != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2702, 0, L"pStream != 0")) || (__debugbreak(), 0));
-	if(pStream == 0)
-		return ((HRESULT)0x80070057L);
-		
-	HRESULT hr;
-	hr = VariantClear(this);
-	if (((HRESULT)(hr) < 0))
-		return hr;
-	VARTYPE vtRead = VT_EMPTY;
-	ULONG cbRead = 0;
-	hr = pStream->Read(&vtRead, sizeof(VARTYPE), &cbRead);
-	if (hr == ((HRESULT)0x00000001L) || (cbRead != sizeof(VARTYPE) && hr == ((HRESULT)0x00000000L)))
-		hr = ((HRESULT)0x80004005L);
-	if (((HRESULT)(hr) < 0))
-		return hr;
-	if (vtExpected != VT_EMPTY && vtRead != vtExpected)
-		return ((HRESULT)0x80004005L);
-
-	vt = vtRead;
-	cbRead = 0;
-	switch (vtRead)
-	{
-	case VT_UNKNOWN:
-	case VT_DISPATCH:
-		{
-			punkVal = 0;
-
-
-
-
-
-
-
-			hr = AtlInternalOleLoadFromStream(pStream,
-				(vtRead == VT_UNKNOWN) ? __uuidof(IUnknown) : __uuidof(IDispatch),
-				(void**)&punkVal, rgclsidAllowed, cclsidAllowed);
-
-			
-			
-			if (hr == ((HRESULT)0x80040154L))
-				hr = ((HRESULT)0x00000000L);
-			return hr;
-		}
-	case VT_UI1:
-	case VT_I1:
-		cbRead = sizeof(BYTE);
-		break;
-	case VT_I2:
-	case VT_UI2:
-	case VT_BOOL:
-		cbRead = sizeof(short);
-		break;
-	case VT_I4:
-	case VT_UI4:
-	case VT_R4:
-	case VT_INT:
-	case VT_UINT:
-	case VT_ERROR:
-		cbRead = sizeof(long);
-		break;
-	case VT_I8:
-	case VT_UI8:
-		cbRead = sizeof(LONGLONG);
-		break;
-	case VT_R8:
-	case VT_CY:
-	case VT_DATE:
-		cbRead = sizeof(double);
-		break;
-	default:
-		break;
-	}
-	if (cbRead != 0)
-	{
-		hr = pStream->Read((void*) &bVal, cbRead, 0);
-		if (hr == ((HRESULT)0x00000001L))
-			hr = ((HRESULT)0x80004005L);
-		return hr;
-	}
-	CComBSTR bstrRead;
-
-	hr = bstrRead.ReadFromStream(pStream);
-	if (((HRESULT)(hr) < 0))
-	{
-		
-		
-		LARGE_INTEGER nOffset;
-		nOffset.QuadPart = -(static_cast<LONGLONG>(sizeof(VARTYPE)));
-		pStream->Seek(nOffset, STREAM_SEEK_CUR, 0);
-		vt = VT_EMPTY;
-		return hr;
-	}
-	vt = VT_BSTR;
-	bstrVal = bstrRead.Detach();
-	if (vtRead != VT_BSTR)
-		hr = ChangeType(vtRead);
-	return hr;
-}
-
-inline ULONG CComVariant::GetSize() const
-{
-	ULONG nSize = sizeof(VARTYPE);
-	HRESULT hr;
-
-	switch (vt)
-	{
-	case VT_UNKNOWN:
-	case VT_DISPATCH:
-		{
-			CComPtr<IPersistStream> spStream;
-			if (punkVal != 0)
-			{
-				hr = punkVal->QueryInterface(__uuidof(IPersistStream), (void**)&spStream);
-				if (((HRESULT)(hr) < 0))
-				{
-					hr = punkVal->QueryInterface(__uuidof(IPersistStreamInit), (void**)&spStream);
-					if (((HRESULT)(hr) < 0))
-						break;
-				}
-			}
-			if (spStream != 0)
-			{
-				ULARGE_INTEGER nPersistSize;
-				nPersistSize.QuadPart = 0;
-				spStream->GetSizeMax(&nPersistSize);
-				nSize += nPersistSize.LowPart + sizeof(CLSID);
-			}
-			else
-				nSize += sizeof(CLSID);
-		}
-		break;
-	case VT_UI1:
-	case VT_I1:
-		nSize += sizeof(BYTE);
-		break;
-	case VT_I2:
-	case VT_UI2:
-	case VT_BOOL:
-		nSize += sizeof(short);
-		break;
-	case VT_I4:
-	case VT_UI4:
-	case VT_R4:
-	case VT_INT:
-	case VT_UINT:
-	case VT_ERROR:
-		nSize += sizeof(long);
-		break;
-	case VT_I8:
-	case VT_UI8:
-		nSize += sizeof(LONGLONG);
-		break;
-	case VT_R8:
-	case VT_CY:
-	case VT_DATE:
-		nSize += sizeof(double);
-		break;
-	default:
-		break;
-	}
-	if (nSize == sizeof(VARTYPE))
-	{
-		VARTYPE vtTmp = vt;
-		BSTR        bstr = 0;
-		CComVariant varBSTR;
-		if (vtTmp != VT_BSTR)
-		{
-			hr = VariantChangeType(&varBSTR, const_cast<VARIANT*>((const VARIANT*)this), 0x01, VT_BSTR);
-			if (((HRESULT)(hr) >= 0))
-			{
-				bstr = varBSTR.bstrVal;
-				vtTmp = VT_BSTR;
-			}
-		} else
-		{
-			bstr = bstrVal;
-		}
-
-		if (vtTmp == VT_BSTR)
-		{
-			
-			nSize += CComBSTR::GetStreamSize(bstr);			
-		}
-	}
-	return nSize;
-}
-
-inline HRESULT CComPtr<IDispatch>::Invoke2(     DISPID dispid,      VARIANT* pvarParam1,      VARIANT* pvarParam2,        VARIANT* pvarRet) throw()
-{
-	if(pvarParam1 == 0 || pvarParam2 == 0)
-		return ((HRESULT)0x80070057L);
-			
-	CComVariant varArgs[2] = { *pvarParam2, *pvarParam1 };
-	DISPPARAMS dispparams = { &varArgs[0], 0, 2, 0};
-	return p->Invoke(dispid, GUID_NULL, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0x1, &dispparams, pvarRet, 0, 0);
-}
-
-
-inline HRESULT AtlInternalOleLoadFromStream(
-	     IStream* pStm, 
-	     const IID & iidInterface, 
-	                  void** ppvObj, 
-	     ClassesAllowedInStream rgclsidAllowed, 
-	     DWORD cclsidAllowed)
-{
-	do { (void) ((!!((pStm != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2907, 0, L"pStm != 0")) || (__debugbreak(), 0)); ; } while(0);
-	*ppvObj = 0;
-	CLSID clsid;
-
-	HRESULT hr = ReadClassStm(pStm, &clsid);
-
-	if (((HRESULT)(hr) < 0))
-	{
-		return hr;
-	}
-	
-	CComPtr<IUnknown> punkVal;
-
-	if (cclsidAllowed != 0)
-	{
-		do { (void) ((!!((rgclsidAllowed.rgclsidAllowed != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2922, 0, L"rgclsidAllowed.rgclsidAllowed != 0")) || (__debugbreak(), 0)); ; } while(0);
-		hr = ((HRESULT)0x80070005L);
-		
-		for(DWORD i = 0; i < cclsidAllowed; i++)
-		{
-			if (IsEqualGUID(clsid, rgclsidAllowed.rgclsidAllowed[i]))
-			{
-				hr = ((HRESULT)0x00000000L);
-				break;
-			}
-		}		
-	}
-	else if (rgclsidAllowed.pfnClsidAllowed != 0) 
-	{
-		hr = rgclsidAllowed.pfnClsidAllowed(clsid, iidInterface, reinterpret_cast<void**>(&punkVal));
-	}
-	
-	if (((HRESULT)(hr) < 0))
-	{
-		return hr;
-	}
-
-	if (punkVal == 0)
-	{
-		hr = CoCreateInstance(clsid, 0, (CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER|CLSCTX_REMOTE_SERVER) | CLSCTX_NO_CODE_DOWNLOAD, iidInterface, reinterpret_cast<void**>(&punkVal));
-		if (((HRESULT)(hr) < 0))
-		{
-			return hr;
-		}
-	}
-
-	CComPtr<IPersistStream> pPersistStm;
-	hr = punkVal->QueryInterface(&pPersistStm);
-	
-	if (((HRESULT)(hr) >= 0))
-	{
-		hr = pPersistStm->Load(pStm);
-		
-		if (((HRESULT)(hr) >= 0))
-		{
-			*ppvObj = punkVal.Detach();			
-		}
-	}
-
-	return hr;
-}
-
-
-}	
-#pragma pack(pop)
-
-#pragma warning (pop)	
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-#pragma warning( disable: 4049 )  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
- 
-
-
-
-typedef struct IEnumGUID IEnumGUID;
-
-
-
-
-
-typedef struct IEnumCATEGORYINFO IEnumCATEGORYINFO;
-
-
-
-
-
-typedef struct ICatRegister ICatRegister;
-
-
-
-
-
-typedef struct ICatInformation ICatInformation;
-
-
-
-
-
-
-
-extern "C"{
-
-
-void * __stdcall MIDL_user_allocate(size_t);
-void __stdcall MIDL_user_free( void * ); 
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma comment(lib,"uuid.lib")
-
-
-
-
-
-
-
-
-
-extern "C" const CLSID CLSID_StdComponentCategoriesMgr;
-
-
-
-typedef GUID CATID;
-
-typedef const GUID & REFCATID;
-
-
-
-
-
-
-
-
-
-
-
-extern "C" const CATID CATID_Insertable;
-extern "C" const CATID CATID_Control;
-extern "C" const CATID CATID_Programmable;
-extern "C" const CATID CATID_IsShortcut;
-extern "C" const CATID CATID_NeverShowExt;
-extern "C" const CATID CATID_DocObject;
-extern "C" const CATID CATID_Printable;
-extern "C" const CATID CATID_RequiresDataPathHost;
-extern "C" const CATID CATID_PersistsToMoniker;
-extern "C" const CATID CATID_PersistsToStorage;
-extern "C" const CATID CATID_PersistsToStreamInit;
-extern "C" const CATID CATID_PersistsToStream;
-extern "C" const CATID CATID_PersistsToMemory;
-extern "C" const CATID CATID_PersistsToFile;
-extern "C" const CATID CATID_PersistsToPropertyBag;
-extern "C" const CATID CATID_InternetAware;
-extern "C" const CATID CATID_DesignTimeUIActivatableControl;
-
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_comcat_0000_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_comcat_0000_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IEnumGUID *LPENUMGUID;
-
-
-extern "C" const IID IID_IEnumGUID;
-
-
-    
-    struct __declspec(uuid("0002E000-0000-0000-C000-000000000046")) __declspec(novtable)
-    IEnumGUID : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Next( 
-             ULONG celt,
-             GUID *rgelt,
-             ULONG *pceltFetched) = 0;
-        
-        virtual HRESULT __stdcall Skip( 
-             ULONG celt) = 0;
-        
-        virtual HRESULT __stdcall Reset( void) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IEnumGUID **ppenum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IEnumGUID_Next_Proxy( 
-    IEnumGUID * This,
-     ULONG celt,
-     GUID *rgelt,
-     ULONG *pceltFetched);
-
-
-void __stdcall IEnumGUID_Next_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumGUID_Skip_Proxy( 
-    IEnumGUID * This,
-     ULONG celt);
-
-
-void __stdcall IEnumGUID_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumGUID_Reset_Proxy( 
-    IEnumGUID * This);
-
-
-void __stdcall IEnumGUID_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumGUID_Clone_Proxy( 
-    IEnumGUID * This,
-     IEnumGUID **ppenum);
-
-
-void __stdcall IEnumGUID_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_comcat_0009_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_comcat_0009_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  IEnumCATEGORYINFO *LPENUMCATEGORYINFO;
-
-typedef struct tagCATEGORYINFO
-    {
-    CATID catid;
-    LCID lcid;
-    OLECHAR szDescription[ 128 ];
-    } 	CATEGORYINFO;
-
-typedef struct tagCATEGORYINFO *LPCATEGORYINFO;
-
-
-extern "C" const IID IID_IEnumCATEGORYINFO;
-
-
-    
-    struct __declspec(uuid("0002E011-0000-0000-C000-000000000046")) __declspec(novtable)
-    IEnumCATEGORYINFO : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall Next( 
-             ULONG celt,
-             CATEGORYINFO *rgelt,
-             ULONG *pceltFetched) = 0;
-        
-        virtual HRESULT __stdcall Skip( 
-             ULONG celt) = 0;
-        
-        virtual HRESULT __stdcall Reset( void) = 0;
-        
-        virtual HRESULT __stdcall Clone( 
-             IEnumCATEGORYINFO **ppenum) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IEnumCATEGORYINFO_Next_Proxy( 
-    IEnumCATEGORYINFO * This,
-     ULONG celt,
-     CATEGORYINFO *rgelt,
-     ULONG *pceltFetched);
-
-
-void __stdcall IEnumCATEGORYINFO_Next_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumCATEGORYINFO_Skip_Proxy( 
-    IEnumCATEGORYINFO * This,
-     ULONG celt);
-
-
-void __stdcall IEnumCATEGORYINFO_Skip_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumCATEGORYINFO_Reset_Proxy( 
-    IEnumCATEGORYINFO * This);
-
-
-void __stdcall IEnumCATEGORYINFO_Reset_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IEnumCATEGORYINFO_Clone_Proxy( 
-    IEnumCATEGORYINFO * This,
-     IEnumCATEGORYINFO **ppenum);
-
-
-void __stdcall IEnumCATEGORYINFO_Clone_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_comcat_0010_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_comcat_0010_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  ICatRegister *LPCATREGISTER;
-
-
-extern "C" const IID IID_ICatRegister;
-
-
-    
-    struct __declspec(uuid("0002E012-0000-0000-C000-000000000046")) __declspec(novtable)
-    ICatRegister : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall RegisterCategories( 
-             ULONG cCategories,
-             CATEGORYINFO rgCategoryInfo[  ]) = 0;
-        
-        virtual HRESULT __stdcall UnRegisterCategories( 
-             ULONG cCategories,
-             CATID rgcatid[  ]) = 0;
-        
-        virtual HRESULT __stdcall RegisterClassImplCategories( 
-             const IID & rclsid,
-             ULONG cCategories,
-             CATID rgcatid[  ]) = 0;
-        
-        virtual HRESULT __stdcall UnRegisterClassImplCategories( 
-             const IID & rclsid,
-             ULONG cCategories,
-             CATID rgcatid[  ]) = 0;
-        
-        virtual HRESULT __stdcall RegisterClassReqCategories( 
-             const IID & rclsid,
-             ULONG cCategories,
-             CATID rgcatid[  ]) = 0;
-        
-        virtual HRESULT __stdcall UnRegisterClassReqCategories( 
-             const IID & rclsid,
-             ULONG cCategories,
-             CATID rgcatid[  ]) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ICatRegister_RegisterCategories_Proxy( 
-    ICatRegister * This,
-     ULONG cCategories,
-     CATEGORYINFO rgCategoryInfo[  ]);
-
-
-void __stdcall ICatRegister_RegisterCategories_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICatRegister_UnRegisterCategories_Proxy( 
-    ICatRegister * This,
-     ULONG cCategories,
-     CATID rgcatid[  ]);
-
-
-void __stdcall ICatRegister_UnRegisterCategories_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICatRegister_RegisterClassImplCategories_Proxy( 
-    ICatRegister * This,
-     const IID & rclsid,
-     ULONG cCategories,
-     CATID rgcatid[  ]);
-
-
-void __stdcall ICatRegister_RegisterClassImplCategories_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICatRegister_UnRegisterClassImplCategories_Proxy( 
-    ICatRegister * This,
-     const IID & rclsid,
-     ULONG cCategories,
-     CATID rgcatid[  ]);
-
-
-void __stdcall ICatRegister_UnRegisterClassImplCategories_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICatRegister_RegisterClassReqCategories_Proxy( 
-    ICatRegister * This,
-     const IID & rclsid,
-     ULONG cCategories,
-     CATID rgcatid[  ]);
-
-
-void __stdcall ICatRegister_RegisterClassReqCategories_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICatRegister_UnRegisterClassReqCategories_Proxy( 
-    ICatRegister * This,
-     const IID & rclsid,
-     ULONG cCategories,
-     CATID rgcatid[  ]);
-
-
-void __stdcall ICatRegister_UnRegisterClassReqCategories_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_comcat_0011_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_comcat_0011_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-typedef  ICatInformation *LPCATINFORMATION;
-
-
-extern "C" const IID IID_ICatInformation;
-
-
-    
-    struct __declspec(uuid("0002E013-0000-0000-C000-000000000046")) __declspec(novtable)
-    ICatInformation : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall EnumCategories( 
-             LCID lcid,
-             IEnumCATEGORYINFO **ppenumCategoryInfo) = 0;
-        
-        virtual HRESULT __stdcall GetCategoryDesc( 
-             REFCATID rcatid,
-             LCID lcid,
-             LPWSTR *pszDesc) = 0;
-        
-        virtual  HRESULT __stdcall EnumClassesOfCategories( 
-             ULONG cImplemented,
-             CATID rgcatidImpl[  ],
-             ULONG cRequired,
-             CATID rgcatidReq[  ],
-             IEnumGUID **ppenumClsid) = 0;
-        
-        virtual  HRESULT __stdcall IsClassOfCategories( 
-             const IID & rclsid,
-             ULONG cImplemented,
-             CATID rgcatidImpl[  ],
-             ULONG cRequired,
-             CATID rgcatidReq[  ]) = 0;
-        
-        virtual HRESULT __stdcall EnumImplCategoriesOfClass( 
-             const IID & rclsid,
-             IEnumGUID **ppenumCatid) = 0;
-        
-        virtual HRESULT __stdcall EnumReqCategoriesOfClass( 
-             const IID & rclsid,
-             IEnumGUID **ppenumCatid) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall ICatInformation_EnumCategories_Proxy( 
-    ICatInformation * This,
-     LCID lcid,
-     IEnumCATEGORYINFO **ppenumCategoryInfo);
-
-
-void __stdcall ICatInformation_EnumCategories_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICatInformation_GetCategoryDesc_Proxy( 
-    ICatInformation * This,
-     REFCATID rcatid,
-     LCID lcid,
-     LPWSTR *pszDesc);
-
-
-void __stdcall ICatInformation_GetCategoryDesc_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ICatInformation_RemoteEnumClassesOfCategories_Proxy( 
-    ICatInformation * This,
-     ULONG cImplemented,
-     CATID rgcatidImpl[  ],
-     ULONG cRequired,
-     CATID rgcatidReq[  ],
-     IEnumGUID **ppenumClsid);
-
-
-void __stdcall ICatInformation_RemoteEnumClassesOfCategories_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall ICatInformation_RemoteIsClassOfCategories_Proxy( 
-    ICatInformation * This,
-     const IID & rclsid,
-     ULONG cImplemented,
-     CATID rgcatidImpl[  ],
-     ULONG cRequired,
-     CATID rgcatidReq[  ]);
-
-
-void __stdcall ICatInformation_RemoteIsClassOfCategories_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICatInformation_EnumImplCategoriesOfClass_Proxy( 
-    ICatInformation * This,
-     const IID & rclsid,
-     IEnumGUID **ppenumCatid);
-
-
-void __stdcall ICatInformation_EnumImplCategoriesOfClass_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall ICatInformation_EnumReqCategoriesOfClass_Proxy( 
-    ICatInformation * This,
-     const IID & rclsid,
-     IEnumGUID **ppenumCatid);
-
-
-void __stdcall ICatInformation_EnumReqCategoriesOfClass_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_comcat_0012_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_comcat_0012_v0_0_s_ifspec;
-
-
-
- HRESULT __stdcall ICatInformation_EnumClassesOfCategories_Proxy( 
-    ICatInformation * This,
-     ULONG cImplemented,
-     CATID rgcatidImpl[  ],
-     ULONG cRequired,
-     CATID rgcatidReq[  ],
-     IEnumGUID **ppenumClsid);
-
-
- HRESULT __stdcall ICatInformation_EnumClassesOfCategories_Stub( 
-    ICatInformation * This,
-     ULONG cImplemented,
-     CATID rgcatidImpl[  ],
-     ULONG cRequired,
-     CATID rgcatidReq[  ],
-     IEnumGUID **ppenumClsid);
-
- HRESULT __stdcall ICatInformation_IsClassOfCategories_Proxy( 
-    ICatInformation * This,
-     const IID & rclsid,
-     ULONG cImplemented,
-     CATID rgcatidImpl[  ],
-     ULONG cRequired,
-     CATID rgcatidReq[  ]);
-
-
- HRESULT __stdcall ICatInformation_IsClassOfCategories_Stub( 
-    ICatInformation * This,
-     const IID & rclsid,
-     ULONG cImplemented,
-     CATID rgcatidImpl[  ],
-     ULONG cRequired,
-     CATID rgcatidReq[  ]);
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning( disable: 4049 )  
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
- 
-
-
-
-typedef struct IRegistrarBase IRegistrarBase;
-
-
-
-
-
-typedef struct IRegistrar IRegistrar;
-
-
-
-
-
-typedef struct IDocHostUIHandlerDispatch IDocHostUIHandlerDispatch;
-
-
-
-
-
-typedef struct IAxWinHostWindow IAxWinHostWindow;
-
-
-
-
-
-typedef struct IAxWinHostWindowLic IAxWinHostWindowLic;
-
-
-
-
-
-typedef struct IAxWinAmbientDispatch IAxWinAmbientDispatch;
-
-
-
-
-
-typedef struct IAxWinAmbientDispatchEx IAxWinAmbientDispatchEx;
-
-
-
-
-
-typedef struct IInternalConnection IInternalConnection;
-
-
-
-
-
-typedef struct IAccessibleProxy IAccessibleProxy;
-
-
-
-
-
-typedef struct IAccessibleServer IAccessibleServer;
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-#pragma warning( disable: 4049 )  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
- 
-
-
-
-typedef struct IAccessible IAccessible;
-
-
-
-
-
-typedef struct IAccessibleHandler IAccessibleHandler;
-
-
-
-
-
-typedef struct IAccIdentity IAccIdentity;
-
-
-
-
-
-typedef struct IAccPropServer IAccPropServer;
-
-
-
-
-
-typedef struct IAccPropServices IAccPropServices;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef class CAccPropServices CAccPropServices;
-
-
-
-
-
-
-
-
-
-
-
-extern "C"{
-
-
-void * __stdcall MIDL_user_allocate(size_t);
-void __stdcall MIDL_user_free( void * ); 
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef LRESULT (__stdcall *LPFNLRESULTFROMOBJECT)(const IID & riid, WPARAM wParam, LPUNKNOWN punk);
-typedef HRESULT (__stdcall *LPFNOBJECTFROMLRESULT)(LRESULT lResult, const IID & riid, WPARAM wParam, void** ppvObject);
-typedef HRESULT (__stdcall *LPFNACCESSIBLEOBJECTFROMWINDOW)(HWND hwnd, DWORD dwId, const IID & riid, void** ppvObject);
-typedef HRESULT (__stdcall *LPFNACCESSIBLEOBJECTFROMPOINT)(POINT ptScreen, IAccessible** ppacc, VARIANT* pvarChild);
-typedef HRESULT (__stdcall *LPFNCREATESTDACCESSIBLEOBJECT)(HWND hwnd, LONG idObject, const IID & riid, void** ppvObject);
-typedef HRESULT (__stdcall *LPFNACCESSIBLECHILDREN)(IAccessible* paccContainer, LONG iChildStart,LONG cChildren,VARIANT* rgvarChildren,LONG* pcObtained);
-
-
-
-
-
-extern "C" const GUID  LIBID_Accessibility;
-extern "C" const GUID  IID_IAccessible;
-extern "C" const GUID  IID_IAccessibleHandler;
-extern "C" const GUID  IID_IAccIdentity;
-extern "C" const GUID  IID_IAccPropServer;
-extern "C" const GUID  IID_IAccPropServices;
-extern "C" const GUID  IID_IAccPropMgrInternal;
-extern "C" const GUID  CLSID_AccPropServices;
-extern "C" const GUID  IIS_IsOleaccProxy;
-
-
-
-
-
-extern "C" LRESULT __stdcall LresultFromObject(const IID & riid, WPARAM wParam, LPUNKNOWN punk);
-extern "C" HRESULT __stdcall          ObjectFromLresult(LRESULT lResult, const IID & riid, WPARAM wParam, void** ppvObject);
-extern "C" HRESULT __stdcall          WindowFromAccessibleObject(IAccessible*, HWND* phwnd);
-extern "C" HRESULT __stdcall          AccessibleObjectFromWindow(HWND hwnd, DWORD dwId, const IID & riid, void **ppvObject);
-extern "C" HRESULT __stdcall          AccessibleObjectFromEvent(HWND hwnd, DWORD dwId, DWORD dwChildId, IAccessible** ppacc, VARIANT* pvarChild);
-extern "C" HRESULT __stdcall          AccessibleObjectFromPoint(POINT ptScreen, IAccessible ** ppacc, VARIANT* pvarChild);
-extern "C" HRESULT __stdcall          AccessibleChildren (IAccessible* paccContainer, LONG iChildStart,LONG cChildren, VARIANT* rgvarChildren,LONG* pcObtained);
-
-extern "C" UINT __stdcall   GetRoleTextA(DWORD lRole, LPSTR lpszRole, UINT cchRoleMax);
-extern "C" UINT __stdcall   GetRoleTextW(DWORD lRole, LPWSTR lpszRole, UINT cchRoleMax);
-
-
-
-
-
-
-
-extern "C" UINT __stdcall   GetStateTextA(DWORD lStateBit, LPSTR lpszState, UINT cchState);
-extern "C" UINT __stdcall   GetStateTextW(DWORD lStateBit, LPWSTR lpszState, UINT cchState);
-
-
-
-
-
-
-extern "C" void __stdcall   GetOleaccVersionInfo(DWORD* pVer, DWORD* pBuild);
-
-extern "C" HRESULT __stdcall          CreateStdAccessibleObject(HWND hwnd, LONG idObject, const IID & riid, void** ppvObject);
-
-extern "C" HRESULT __stdcall          CreateStdAccessibleProxyA(HWND hwnd, LPCSTR pClassName, LONG idObject, const IID & riid, void** ppvObject);
-extern "C" HRESULT __stdcall          CreateStdAccessibleProxyW(HWND hwnd, LPCWSTR pClassName, LONG idObject, const IID & riid, void** ppvObject);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef struct tagMSAAMENUINFO {
-    DWORD   dwMSAASignature; 
-    DWORD   cchWText;        
-    LPWSTR  pszWText;        
-} MSAAMENUINFO, *LPMSAAMENUINFO;
-
-
-
-
-
-
-extern "C" const GUID  PROPID_ACC_NAME;
-extern "C" const GUID  PROPID_ACC_VALUE;
-extern "C" const GUID  PROPID_ACC_DESCRIPTION;
-extern "C" const GUID  PROPID_ACC_ROLE;
-extern "C" const GUID  PROPID_ACC_STATE;
-extern "C" const GUID  PROPID_ACC_HELP;
-extern "C" const GUID  PROPID_ACC_KEYBOARDSHORTCUT;
-extern "C" const GUID  PROPID_ACC_DEFAULTACTION;
-
-extern "C" const GUID  PROPID_ACC_HELPTOPIC;
-extern "C" const GUID  PROPID_ACC_FOCUS;
-extern "C" const GUID  PROPID_ACC_SELECTION;
-extern "C" const GUID  PROPID_ACC_PARENT;
-
-extern "C" const GUID  PROPID_ACC_NAV_UP;
-extern "C" const GUID  PROPID_ACC_NAV_DOWN;
-extern "C" const GUID  PROPID_ACC_NAV_LEFT;
-extern "C" const GUID  PROPID_ACC_NAV_RIGHT;
-extern "C" const GUID  PROPID_ACC_NAV_PREV;
-extern "C" const GUID  PROPID_ACC_NAV_NEXT;
-extern "C" const GUID  PROPID_ACC_NAV_FIRSTCHILD;
-extern "C" const GUID  PROPID_ACC_NAV_LASTCHILD;
-
-
-extern "C" const GUID  PROPID_ACC_ROLEMAP;
-extern "C" const GUID  PROPID_ACC_VALUEMAP;
-extern "C" const GUID  PROPID_ACC_STATEMAP;
-extern "C" const GUID  PROPID_ACC_DESCRIPTIONMAP;
-
-extern "C" const GUID  PROPID_ACC_DODEFAULTACTION;
-
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_oleacc_0000_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_oleacc_0000_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef  IAccessible *LPACCESSIBLE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" const IID IID_IAccessible;
-
-
-    
-    struct __declspec(uuid("618736e0-3c3d-11cf-810c-00aa00389b71")) __declspec(novtable)
-    IAccessible : public IDispatch
-    {
-    public:
-        virtual  HRESULT __stdcall get_accParent( 
-             IDispatch **ppdispParent) = 0;
-        
-        virtual  HRESULT __stdcall get_accChildCount( 
-             long *pcountChildren) = 0;
-        
-        virtual  HRESULT __stdcall get_accChild( 
-             VARIANT varChild,
-             IDispatch **ppdispChild) = 0;
-        
-        virtual  HRESULT __stdcall get_accName( 
-             VARIANT varChild,
-             BSTR *pszName) = 0;
-        
-        virtual  HRESULT __stdcall get_accValue( 
-             VARIANT varChild,
-             BSTR *pszValue) = 0;
-        
-        virtual  HRESULT __stdcall get_accDescription( 
-             VARIANT varChild,
-             BSTR *pszDescription) = 0;
-        
-        virtual  HRESULT __stdcall get_accRole( 
-             VARIANT varChild,
-             VARIANT *pvarRole) = 0;
-        
-        virtual  HRESULT __stdcall get_accState( 
-             VARIANT varChild,
-             VARIANT *pvarState) = 0;
-        
-        virtual  HRESULT __stdcall get_accHelp( 
-             VARIANT varChild,
-             BSTR *pszHelp) = 0;
-        
-        virtual  HRESULT __stdcall get_accHelpTopic( 
-             BSTR *pszHelpFile,
-             VARIANT varChild,
-             long *pidTopic) = 0;
-        
-        virtual  HRESULT __stdcall get_accKeyboardShortcut( 
-             VARIANT varChild,
-             BSTR *pszKeyboardShortcut) = 0;
-        
-        virtual  HRESULT __stdcall get_accFocus( 
-             VARIANT *pvarChild) = 0;
-        
-        virtual  HRESULT __stdcall get_accSelection( 
-             VARIANT *pvarChildren) = 0;
-        
-        virtual  HRESULT __stdcall get_accDefaultAction( 
-             VARIANT varChild,
-             BSTR *pszDefaultAction) = 0;
-        
-        virtual  HRESULT __stdcall accSelect( 
-             long flagsSelect,
-             VARIANT varChild) = 0;
-        
-        virtual  HRESULT __stdcall accLocation( 
-             long *pxLeft,
-             long *pyTop,
-             long *pcxWidth,
-             long *pcyHeight,
-             VARIANT varChild) = 0;
-        
-        virtual  HRESULT __stdcall accNavigate( 
-             long navDir,
-             VARIANT varStart,
-             VARIANT *pvarEndUpAt) = 0;
-        
-        virtual  HRESULT __stdcall accHitTest( 
-             long xLeft,
-             long yTop,
-             VARIANT *pvarChild) = 0;
-        
-        virtual  HRESULT __stdcall accDoDefaultAction( 
-             VARIANT varChild) = 0;
-        
-        virtual  HRESULT __stdcall put_accName( 
-             VARIANT varChild,
-             BSTR szName) = 0;
-        
-        virtual  HRESULT __stdcall put_accValue( 
-             VARIANT varChild,
-             BSTR szValue) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IAccessible_get_accParent_Proxy( 
-    IAccessible * This,
-     IDispatch **ppdispParent);
-
-
-void __stdcall IAccessible_get_accParent_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_get_accChildCount_Proxy( 
-    IAccessible * This,
-     long *pcountChildren);
-
-
-void __stdcall IAccessible_get_accChildCount_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_get_accChild_Proxy( 
-    IAccessible * This,
-     VARIANT varChild,
-     IDispatch **ppdispChild);
-
-
-void __stdcall IAccessible_get_accChild_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_get_accName_Proxy( 
-    IAccessible * This,
-     VARIANT varChild,
-     BSTR *pszName);
-
-
-void __stdcall IAccessible_get_accName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_get_accValue_Proxy( 
-    IAccessible * This,
-     VARIANT varChild,
-     BSTR *pszValue);
-
-
-void __stdcall IAccessible_get_accValue_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_get_accDescription_Proxy( 
-    IAccessible * This,
-     VARIANT varChild,
-     BSTR *pszDescription);
-
-
-void __stdcall IAccessible_get_accDescription_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_get_accRole_Proxy( 
-    IAccessible * This,
-     VARIANT varChild,
-     VARIANT *pvarRole);
-
-
-void __stdcall IAccessible_get_accRole_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_get_accState_Proxy( 
-    IAccessible * This,
-     VARIANT varChild,
-     VARIANT *pvarState);
-
-
-void __stdcall IAccessible_get_accState_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_get_accHelp_Proxy( 
-    IAccessible * This,
-     VARIANT varChild,
-     BSTR *pszHelp);
-
-
-void __stdcall IAccessible_get_accHelp_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_get_accHelpTopic_Proxy( 
-    IAccessible * This,
-     BSTR *pszHelpFile,
-     VARIANT varChild,
-     long *pidTopic);
-
-
-void __stdcall IAccessible_get_accHelpTopic_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_get_accKeyboardShortcut_Proxy( 
-    IAccessible * This,
-     VARIANT varChild,
-     BSTR *pszKeyboardShortcut);
-
-
-void __stdcall IAccessible_get_accKeyboardShortcut_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_get_accFocus_Proxy( 
-    IAccessible * This,
-     VARIANT *pvarChild);
-
-
-void __stdcall IAccessible_get_accFocus_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_get_accSelection_Proxy( 
-    IAccessible * This,
-     VARIANT *pvarChildren);
-
-
-void __stdcall IAccessible_get_accSelection_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_get_accDefaultAction_Proxy( 
-    IAccessible * This,
-     VARIANT varChild,
-     BSTR *pszDefaultAction);
-
-
-void __stdcall IAccessible_get_accDefaultAction_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_accSelect_Proxy( 
-    IAccessible * This,
-     long flagsSelect,
-     VARIANT varChild);
-
-
-void __stdcall IAccessible_accSelect_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_accLocation_Proxy( 
-    IAccessible * This,
-     long *pxLeft,
-     long *pyTop,
-     long *pcxWidth,
-     long *pcyHeight,
-     VARIANT varChild);
-
-
-void __stdcall IAccessible_accLocation_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_accNavigate_Proxy( 
-    IAccessible * This,
-     long navDir,
-     VARIANT varStart,
-     VARIANT *pvarEndUpAt);
-
-
-void __stdcall IAccessible_accNavigate_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_accHitTest_Proxy( 
-    IAccessible * This,
-     long xLeft,
-     long yTop,
-     VARIANT *pvarChild);
-
-
-void __stdcall IAccessible_accHitTest_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_accDoDefaultAction_Proxy( 
-    IAccessible * This,
-     VARIANT varChild);
-
-
-void __stdcall IAccessible_accDoDefaultAction_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_put_accName_Proxy( 
-    IAccessible * This,
-     VARIANT varChild,
-     BSTR szName);
-
-
-void __stdcall IAccessible_put_accName_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAccessible_put_accValue_Proxy( 
-    IAccessible * This,
-     VARIANT varChild,
-     BSTR szValue);
-
-
-void __stdcall IAccessible_put_accValue_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef  IAccessibleHandler *LPACCESSIBLEHANDLER;
-
-
-extern "C" const IID IID_IAccessibleHandler;
-
-
-    
-    struct __declspec(uuid("03022430-ABC4-11d0-BDE2-00AA001A1953")) __declspec(novtable)
-    IAccessibleHandler : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall AccessibleObjectFromID( 
-             long hwnd,
-             long lObjectID,
-             LPACCESSIBLE *pIAccessible) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IAccessibleHandler_AccessibleObjectFromID_Proxy( 
-    IAccessibleHandler * This,
-     long hwnd,
-     long lObjectID,
-     LPACCESSIBLE *pIAccessible);
-
-
-void __stdcall IAccessibleHandler_AccessibleObjectFromID_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-typedef 
-enum AnnoScope
-    {	ANNO_THIS	= 0,
-	ANNO_CONTAINER	= 1
-    } 	AnnoScope;
-
-typedef GUID MSAAPROPID;
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_oleacc_0116_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_oleacc_0116_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IAccIdentity;
-
-
-    
-    struct __declspec(uuid("7852b78d-1cfd-41c1-a615-9c0c85960b5f")) __declspec(novtable)
-    IAccIdentity : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetIdentityString( 
-             DWORD dwIDChild,
-             BYTE **ppIDString,
-             DWORD *pdwIDStringLen) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IAccIdentity_GetIdentityString_Proxy( 
-    IAccIdentity * This,
-     DWORD dwIDChild,
-     BYTE **ppIDString,
-     DWORD *pdwIDStringLen);
-
-
-void __stdcall IAccIdentity_GetIdentityString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IAccPropServer;
-
-
-    
-    struct __declspec(uuid("76c0dbbb-15e0-4e7b-b61b-20eeea2001e0")) __declspec(novtable)
-    IAccPropServer : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall GetPropValue( 
-             const BYTE *pIDString,
-             DWORD dwIDStringLen,
-             MSAAPROPID idProp,
-             VARIANT *pvarValue,
-             BOOL *pfHasProp) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IAccPropServer_GetPropValue_Proxy( 
-    IAccPropServer * This,
-     const BYTE *pIDString,
-     DWORD dwIDStringLen,
-     MSAAPROPID idProp,
-     VARIANT *pvarValue,
-     BOOL *pfHasProp);
-
-
-void __stdcall IAccPropServer_GetPropValue_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IAccPropServices;
-
-
-    
-    struct __declspec(uuid("6e26e776-04f0-495d-80e4-3330352e3169")) __declspec(novtable)
-    IAccPropServices : public IUnknown
-    {
-    public:
-        virtual HRESULT __stdcall SetPropValue( 
-             const BYTE *pIDString,
-             DWORD dwIDStringLen,
-             MSAAPROPID idProp,
-             VARIANT var) = 0;
-        
-        virtual HRESULT __stdcall SetPropServer( 
-             const BYTE *pIDString,
-             DWORD dwIDStringLen,
-             const MSAAPROPID *paProps,
-             int cProps,
-             IAccPropServer *pServer,
-             AnnoScope annoScope) = 0;
-        
-        virtual HRESULT __stdcall ClearProps( 
-             const BYTE *pIDString,
-             DWORD dwIDStringLen,
-             const MSAAPROPID *paProps,
-             int cProps) = 0;
-        
-        virtual HRESULT __stdcall SetHwndProp( 
-             HWND hwnd,
-             DWORD idObject,
-             DWORD idChild,
-             MSAAPROPID idProp,
-             VARIANT var) = 0;
-        
-        virtual HRESULT __stdcall SetHwndPropStr( 
-             HWND hwnd,
-             DWORD idObject,
-             DWORD idChild,
-             MSAAPROPID idProp,
-             LPCWSTR str) = 0;
-        
-        virtual HRESULT __stdcall SetHwndPropServer( 
-             HWND hwnd,
-             DWORD idObject,
-             DWORD idChild,
-             const MSAAPROPID *paProps,
-             int cProps,
-             IAccPropServer *pServer,
-             AnnoScope annoScope) = 0;
-        
-        virtual HRESULT __stdcall ClearHwndProps( 
-             HWND hwnd,
-             DWORD idObject,
-             DWORD idChild,
-             const MSAAPROPID *paProps,
-             int cProps) = 0;
-        
-        virtual HRESULT __stdcall ComposeHwndIdentityString( 
-             HWND hwnd,
-             DWORD idObject,
-             DWORD idChild,
-             BYTE **ppIDString,
-             DWORD *pdwIDStringLen) = 0;
-        
-        virtual HRESULT __stdcall DecomposeHwndIdentityString( 
-             const BYTE *pIDString,
-             DWORD dwIDStringLen,
-             HWND *phwnd,
-             DWORD *pidObject,
-             DWORD *pidChild) = 0;
-        
-        virtual HRESULT __stdcall SetHmenuProp( 
-             HMENU hmenu,
-             DWORD idChild,
-             MSAAPROPID idProp,
-             VARIANT var) = 0;
-        
-        virtual HRESULT __stdcall SetHmenuPropStr( 
-             HMENU hmenu,
-             DWORD idChild,
-             MSAAPROPID idProp,
-             LPCWSTR str) = 0;
-        
-        virtual HRESULT __stdcall SetHmenuPropServer( 
-             HMENU hmenu,
-             DWORD idChild,
-             const MSAAPROPID *paProps,
-             int cProps,
-             IAccPropServer *pServer,
-             AnnoScope annoScope) = 0;
-        
-        virtual HRESULT __stdcall ClearHmenuProps( 
-             HMENU hmenu,
-             DWORD idChild,
-             const MSAAPROPID *paProps,
-             int cProps) = 0;
-        
-        virtual HRESULT __stdcall ComposeHmenuIdentityString( 
-             HMENU hmenu,
-             DWORD idChild,
-             BYTE **ppIDString,
-             DWORD *pdwIDStringLen) = 0;
-        
-        virtual HRESULT __stdcall DecomposeHmenuIdentityString( 
-             const BYTE *pIDString,
-             DWORD dwIDStringLen,
-             HMENU *phmenu,
-             DWORD *pidChild) = 0;
-        
-    };
-    
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IAccPropServices_SetPropValue_Proxy( 
-    IAccPropServices * This,
-     const BYTE *pIDString,
-     DWORD dwIDStringLen,
-     MSAAPROPID idProp,
-     VARIANT var);
-
-
-void __stdcall IAccPropServices_SetPropValue_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAccPropServices_SetPropServer_Proxy( 
-    IAccPropServices * This,
-     const BYTE *pIDString,
-     DWORD dwIDStringLen,
-     const MSAAPROPID *paProps,
-     int cProps,
-     IAccPropServer *pServer,
-     AnnoScope annoScope);
-
-
-void __stdcall IAccPropServices_SetPropServer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAccPropServices_ClearProps_Proxy( 
-    IAccPropServices * This,
-     const BYTE *pIDString,
-     DWORD dwIDStringLen,
-     const MSAAPROPID *paProps,
-     int cProps);
-
-
-void __stdcall IAccPropServices_ClearProps_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAccPropServices_SetHwndProp_Proxy( 
-    IAccPropServices * This,
-     HWND hwnd,
-     DWORD idObject,
-     DWORD idChild,
-     MSAAPROPID idProp,
-     VARIANT var);
-
-
-void __stdcall IAccPropServices_SetHwndProp_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAccPropServices_SetHwndPropStr_Proxy( 
-    IAccPropServices * This,
-     HWND hwnd,
-     DWORD idObject,
-     DWORD idChild,
-     MSAAPROPID idProp,
-     LPCWSTR str);
-
-
-void __stdcall IAccPropServices_SetHwndPropStr_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAccPropServices_SetHwndPropServer_Proxy( 
-    IAccPropServices * This,
-     HWND hwnd,
-     DWORD idObject,
-     DWORD idChild,
-     const MSAAPROPID *paProps,
-     int cProps,
-     IAccPropServer *pServer,
-     AnnoScope annoScope);
-
-
-void __stdcall IAccPropServices_SetHwndPropServer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAccPropServices_ClearHwndProps_Proxy( 
-    IAccPropServices * This,
-     HWND hwnd,
-     DWORD idObject,
-     DWORD idChild,
-     const MSAAPROPID *paProps,
-     int cProps);
-
-
-void __stdcall IAccPropServices_ClearHwndProps_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAccPropServices_ComposeHwndIdentityString_Proxy( 
-    IAccPropServices * This,
-     HWND hwnd,
-     DWORD idObject,
-     DWORD idChild,
-     BYTE **ppIDString,
-     DWORD *pdwIDStringLen);
-
-
-void __stdcall IAccPropServices_ComposeHwndIdentityString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAccPropServices_DecomposeHwndIdentityString_Proxy( 
-    IAccPropServices * This,
-     const BYTE *pIDString,
-     DWORD dwIDStringLen,
-     HWND *phwnd,
-     DWORD *pidObject,
-     DWORD *pidChild);
-
-
-void __stdcall IAccPropServices_DecomposeHwndIdentityString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAccPropServices_SetHmenuProp_Proxy( 
-    IAccPropServices * This,
-     HMENU hmenu,
-     DWORD idChild,
-     MSAAPROPID idProp,
-     VARIANT var);
-
-
-void __stdcall IAccPropServices_SetHmenuProp_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAccPropServices_SetHmenuPropStr_Proxy( 
-    IAccPropServices * This,
-     HMENU hmenu,
-     DWORD idChild,
-     MSAAPROPID idProp,
-     LPCWSTR str);
-
-
-void __stdcall IAccPropServices_SetHmenuPropStr_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAccPropServices_SetHmenuPropServer_Proxy( 
-    IAccPropServices * This,
-     HMENU hmenu,
-     DWORD idChild,
-     const MSAAPROPID *paProps,
-     int cProps,
-     IAccPropServer *pServer,
-     AnnoScope annoScope);
-
-
-void __stdcall IAccPropServices_SetHmenuPropServer_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAccPropServices_ClearHmenuProps_Proxy( 
-    IAccPropServices * This,
-     HMENU hmenu,
-     DWORD idChild,
-     const MSAAPROPID *paProps,
-     int cProps);
-
-
-void __stdcall IAccPropServices_ClearHmenuProps_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAccPropServices_ComposeHmenuIdentityString_Proxy( 
-    IAccPropServices * This,
-     HMENU hmenu,
-     DWORD idChild,
-     BYTE **ppIDString,
-     DWORD *pdwIDStringLen);
-
-
-void __stdcall IAccPropServices_ComposeHmenuIdentityString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAccPropServices_DecomposeHmenuIdentityString_Proxy( 
-    IAccPropServices * This,
-     const BYTE *pIDString,
-     DWORD dwIDStringLen,
-     HMENU *phmenu,
-     DWORD *pidChild);
-
-
-void __stdcall IAccPropServices_DecomposeHmenuIdentityString_Stub(
-    IRpcStubBuffer *This,
-    IRpcChannelBuffer *_pRpcChannelBuffer,
-    PRPC_MESSAGE _pRpcMessage,
-    DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_oleacc_0119_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_oleacc_0119_v0_0_s_ifspec;
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-extern "C" const IID LIBID_Accessibility;
-
-extern "C" const CLSID CLSID_CAccPropServices;
-
-
-
-class __declspec(uuid("b5f8350b-0548-48b1-a6ee-88bd00b4a5e7"))
-CAccPropServices;
-
-
-
-
-
-unsigned long             __stdcall  BSTR_UserSize(     unsigned long *, unsigned long            , BSTR * ); 
-unsigned char * __stdcall  BSTR_UserMarshal(  unsigned long *, unsigned char *, BSTR * ); 
-unsigned char * __stdcall  BSTR_UserUnmarshal(unsigned long *, unsigned char *, BSTR * ); 
-void                      __stdcall  BSTR_UserFree(     unsigned long *, BSTR * ); 
-
-unsigned long             __stdcall  HMENU_UserSize(     unsigned long *, unsigned long            , HMENU * ); 
-unsigned char * __stdcall  HMENU_UserMarshal(  unsigned long *, unsigned char *, HMENU * ); 
-unsigned char * __stdcall  HMENU_UserUnmarshal(unsigned long *, unsigned char *, HMENU * ); 
-void                      __stdcall  HMENU_UserFree(     unsigned long *, HMENU * ); 
-
-unsigned long             __stdcall  HWND_UserSize(     unsigned long *, unsigned long            , HWND * ); 
-unsigned char * __stdcall  HWND_UserMarshal(  unsigned long *, unsigned char *, HWND * ); 
-unsigned char * __stdcall  HWND_UserUnmarshal(unsigned long *, unsigned char *, HWND * ); 
-void                      __stdcall  HWND_UserFree(     unsigned long *, HWND * ); 
-
-unsigned long             __stdcall  VARIANT_UserSize(     unsigned long *, unsigned long            , VARIANT * ); 
-unsigned char * __stdcall  VARIANT_UserMarshal(  unsigned long *, unsigned char *, VARIANT * ); 
-unsigned char * __stdcall  VARIANT_UserUnmarshal(unsigned long *, unsigned char *, VARIANT * ); 
-void                      __stdcall  VARIANT_UserFree(     unsigned long *, VARIANT * ); 
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-extern "C"{
-
-
-void * __stdcall MIDL_user_allocate(size_t);
-void __stdcall MIDL_user_free( void * ); 
-
-
- 
-
-extern "C" const CLSID CLSID_Registrar;
-
-
-extern RPC_IF_HANDLE __MIDL_itf_atliface_0000_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_atliface_0000_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IRegistrarBase;
-
-
-
-	struct __declspec(uuid("e21f8a85-b05d-4243-8183-c7cb405588f7")) __declspec(novtable)
-	IRegistrarBase : public IUnknown
-	{
-	public:
-		virtual HRESULT __stdcall AddReplacement( 
-			 LPCOLESTR key,
-			 LPCOLESTR item) = 0;
-
-		virtual HRESULT __stdcall ClearReplacements( void) = 0;
-
-	};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IRegistrarBase_AddReplacement_Proxy( 
-	IRegistrarBase * This,
-	 LPCOLESTR key,
-	 LPCOLESTR item);
-
-
-void __stdcall IRegistrarBase_AddReplacement_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRegistrarBase_ClearReplacements_Proxy( 
-	IRegistrarBase * This);
-
-
-void __stdcall IRegistrarBase_ClearReplacements_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IRegistrar;
-
-
-
-	struct __declspec(uuid("44EC053B-400F-11D0-9DCD-00A0C90391D3")) __declspec(novtable)
-	IRegistrar : public IRegistrarBase
-	{
-	public:
-		virtual HRESULT __stdcall ResourceRegisterSz( 
-			 LPCOLESTR resFileName,
-			 LPCOLESTR szID,
-			 LPCOLESTR szType) = 0;
-
-		virtual HRESULT __stdcall ResourceUnregisterSz( 
-			 LPCOLESTR resFileName,
-			 LPCOLESTR szID,
-			 LPCOLESTR szType) = 0;
-
-		virtual HRESULT __stdcall FileRegister( 
-			 LPCOLESTR fileName) = 0;
-
-		virtual HRESULT __stdcall FileUnregister( 
-			 LPCOLESTR fileName) = 0;
-
-		virtual HRESULT __stdcall StringRegister( 
-			 LPCOLESTR data) = 0;
-
-		virtual HRESULT __stdcall StringUnregister( 
-			 LPCOLESTR data) = 0;
-
-		virtual HRESULT __stdcall ResourceRegister( 
-			 LPCOLESTR resFileName,
-			 UINT nID,
-			 LPCOLESTR szType) = 0;
-
-		virtual HRESULT __stdcall ResourceUnregister( 
-			 LPCOLESTR resFileName,
-			 UINT nID,
-			 LPCOLESTR szType) = 0;
-
-	};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IRegistrar_ResourceRegisterSz_Proxy( 
-	IRegistrar * This,
-	 LPCOLESTR resFileName,
-	 LPCOLESTR szID,
-	 LPCOLESTR szType);
-
-
-void __stdcall IRegistrar_ResourceRegisterSz_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRegistrar_ResourceUnregisterSz_Proxy( 
-	IRegistrar * This,
-	 LPCOLESTR resFileName,
-	 LPCOLESTR szID,
-	 LPCOLESTR szType);
-
-
-void __stdcall IRegistrar_ResourceUnregisterSz_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRegistrar_FileRegister_Proxy( 
-	IRegistrar * This,
-	 LPCOLESTR fileName);
-
-
-void __stdcall IRegistrar_FileRegister_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRegistrar_FileUnregister_Proxy( 
-	IRegistrar * This,
-	 LPCOLESTR fileName);
-
-
-void __stdcall IRegistrar_FileUnregister_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRegistrar_StringRegister_Proxy( 
-	IRegistrar * This,
-	 LPCOLESTR data);
-
-
-void __stdcall IRegistrar_StringRegister_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRegistrar_StringUnregister_Proxy( 
-	IRegistrar * This,
-	 LPCOLESTR data);
-
-
-void __stdcall IRegistrar_StringUnregister_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRegistrar_ResourceRegister_Proxy( 
-	IRegistrar * This,
-	 LPCOLESTR resFileName,
-	 UINT nID,
-	 LPCOLESTR szType);
-
-
-void __stdcall IRegistrar_ResourceRegister_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRegistrar_ResourceUnregister_Proxy( 
-	IRegistrar * This,
-	 LPCOLESTR resFileName,
-	 UINT nID,
-	 LPCOLESTR szType);
-
-
-void __stdcall IRegistrar_ResourceUnregister_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-typedef 
-enum tagDOCHOSTUIDBLCLKDispatch
-	{	docHostUIDblClkDEFAULT	= 0,
-	docHostUIDblClkSHOWPROPERTIES	= 1,
-	docHostUIDblClkSHOWCODE	= 2
-	} 	DOCHOSTUIDBLCLKDispatch;
-
-typedef 
-enum tagDocHostUIFlagDispatch
-	{	docHostUIFlagDIALOG	= 1,
-	docHostUIFlagDISABLE_HELP_MENU	= 2,
-	docHostUIFlagNO3DBORDER	= 4,
-	docHostUIFlagSCROLL_NO	= 8,
-	docHostUIFlagDISABLE_SCRIPT_INACTIVE	= 16,
-	docHostUIFlagOPENNEWWIN	= 32,
-	docHostUIFlagDISABLE_OFFSCREEN	= 64,
-	docHostUIFlagFLAT_SCROLLBAR	= 128,
-	docHostUIFlagDIV_BLOCKDEFAULT	= 256,
-	docHostUIFlagACTIVATE_CLIENTHIT_ONLY	= 512
-	} 	DocHostUIFlagDispatch;
-
-
-extern "C" const IID IID_IDocHostUIHandlerDispatch;
-
-
-
-	struct __declspec(uuid("425B5AF0-65F1-11d1-9611-0000F81E0D0D")) __declspec(novtable)
-	IDocHostUIHandlerDispatch : public IDispatch
-	{
-	public:
-		virtual HRESULT __stdcall ShowContextMenu( 
-			 DWORD dwID,
-			 DWORD x,
-			 DWORD y,
-			 IUnknown *pcmdtReserved,
-			 IDispatch *pdispReserved,
-			 HRESULT *dwRetVal) = 0;
-
-		virtual HRESULT __stdcall GetHostInfo( 
-			 DWORD *pdwFlags,
-			 DWORD *pdwDoubleClick) = 0;
-
-		virtual HRESULT __stdcall ShowUI( 
-			 DWORD dwID,
-			 IUnknown *pActiveObject,
-			 IUnknown *pCommandTarget,
-			 IUnknown *pFrame,
-			 IUnknown *pDoc,
-			 HRESULT *dwRetVal) = 0;
-
-		virtual HRESULT __stdcall HideUI( void) = 0;
-
-		virtual HRESULT __stdcall UpdateUI( void) = 0;
-
-		virtual HRESULT __stdcall EnableModeless( 
-			 VARIANT_BOOL fEnable) = 0;
-
-		virtual HRESULT __stdcall OnDocWindowActivate( 
-			 VARIANT_BOOL fActivate) = 0;
-
-		virtual HRESULT __stdcall OnFrameWindowActivate( 
-			 VARIANT_BOOL fActivate) = 0;
-
-		virtual HRESULT __stdcall ResizeBorder( 
-			 long left,
-			 long top,
-			 long right,
-			 long bottom,
-			 IUnknown *pUIWindow,
-			 VARIANT_BOOL fFrameWindow) = 0;
-
-		virtual HRESULT __stdcall TranslateAcceleratorW( 
-			 DWORD_PTR hWnd,
-			 DWORD nMessage,
-			 DWORD_PTR wParam,
-			 DWORD_PTR lParam,
-			 BSTR bstrGuidCmdGroup,
-			 DWORD nCmdID,
-			 HRESULT *dwRetVal) = 0;
-
-		virtual HRESULT __stdcall GetOptionKeyPath( 
-			 BSTR *pbstrKey,
-			 DWORD dw) = 0;
-
-		virtual HRESULT __stdcall GetDropTarget( 
-			 IUnknown *pDropTarget,
-			 IUnknown **ppDropTarget) = 0;
-
-		virtual HRESULT __stdcall GetExternal( 
-			 IDispatch **ppDispatch) = 0;
-
-		virtual HRESULT __stdcall TranslateUrl( 
-			 DWORD dwTranslate,
-			 BSTR bstrURLIn,
-			 BSTR *pbstrURLOut) = 0;
-
-		virtual HRESULT __stdcall FilterDataObject( 
-			 IUnknown *pDO,
-			 IUnknown **ppDORet) = 0;
-
-	};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IDocHostUIHandlerDispatch_ShowContextMenu_Proxy( 
-	IDocHostUIHandlerDispatch * This,
-	 DWORD dwID,
-	 DWORD x,
-	 DWORD y,
-	 IUnknown *pcmdtReserved,
-	 IDispatch *pdispReserved,
-	 HRESULT *dwRetVal);
-
-
-void __stdcall IDocHostUIHandlerDispatch_ShowContextMenu_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDocHostUIHandlerDispatch_GetHostInfo_Proxy( 
-	IDocHostUIHandlerDispatch * This,
-	 DWORD *pdwFlags,
-	 DWORD *pdwDoubleClick);
-
-
-void __stdcall IDocHostUIHandlerDispatch_GetHostInfo_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDocHostUIHandlerDispatch_ShowUI_Proxy( 
-	IDocHostUIHandlerDispatch * This,
-	 DWORD dwID,
-	 IUnknown *pActiveObject,
-	 IUnknown *pCommandTarget,
-	 IUnknown *pFrame,
-	 IUnknown *pDoc,
-	 HRESULT *dwRetVal);
-
-
-void __stdcall IDocHostUIHandlerDispatch_ShowUI_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDocHostUIHandlerDispatch_HideUI_Proxy( 
-	IDocHostUIHandlerDispatch * This);
-
-
-void __stdcall IDocHostUIHandlerDispatch_HideUI_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDocHostUIHandlerDispatch_UpdateUI_Proxy( 
-	IDocHostUIHandlerDispatch * This);
-
-
-void __stdcall IDocHostUIHandlerDispatch_UpdateUI_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDocHostUIHandlerDispatch_EnableModeless_Proxy( 
-	IDocHostUIHandlerDispatch * This,
-	 VARIANT_BOOL fEnable);
-
-
-void __stdcall IDocHostUIHandlerDispatch_EnableModeless_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDocHostUIHandlerDispatch_OnDocWindowActivate_Proxy( 
-	IDocHostUIHandlerDispatch * This,
-	 VARIANT_BOOL fActivate);
-
-
-void __stdcall IDocHostUIHandlerDispatch_OnDocWindowActivate_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDocHostUIHandlerDispatch_OnFrameWindowActivate_Proxy( 
-	IDocHostUIHandlerDispatch * This,
-	 VARIANT_BOOL fActivate);
-
-
-void __stdcall IDocHostUIHandlerDispatch_OnFrameWindowActivate_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDocHostUIHandlerDispatch_ResizeBorder_Proxy( 
-	IDocHostUIHandlerDispatch * This,
-	 long left,
-	 long top,
-	 long right,
-	 long bottom,
-	 IUnknown *pUIWindow,
-	 VARIANT_BOOL fFrameWindow);
-
-
-void __stdcall IDocHostUIHandlerDispatch_ResizeBorder_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDocHostUIHandlerDispatch_TranslateAccelerator_Proxy( 
-	IDocHostUIHandlerDispatch * This,
-	 DWORD_PTR hWnd,
-	 DWORD nMessage,
-	 DWORD_PTR wParam,
-	 DWORD_PTR lParam,
-	 BSTR bstrGuidCmdGroup,
-	 DWORD nCmdID,
-	 HRESULT *dwRetVal);
-
-
-void __stdcall IDocHostUIHandlerDispatch_TranslateAccelerator_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDocHostUIHandlerDispatch_GetOptionKeyPath_Proxy( 
-	IDocHostUIHandlerDispatch * This,
-	 BSTR *pbstrKey,
-	 DWORD dw);
-
-
-void __stdcall IDocHostUIHandlerDispatch_GetOptionKeyPath_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDocHostUIHandlerDispatch_GetDropTarget_Proxy( 
-	IDocHostUIHandlerDispatch * This,
-	 IUnknown *pDropTarget,
-	 IUnknown **ppDropTarget);
-
-
-void __stdcall IDocHostUIHandlerDispatch_GetDropTarget_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDocHostUIHandlerDispatch_GetExternal_Proxy( 
-	IDocHostUIHandlerDispatch * This,
-	 IDispatch **ppDispatch);
-
-
-void __stdcall IDocHostUIHandlerDispatch_GetExternal_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDocHostUIHandlerDispatch_TranslateUrl_Proxy( 
-	IDocHostUIHandlerDispatch * This,
-	 DWORD dwTranslate,
-	 BSTR bstrURLIn,
-	 BSTR *pbstrURLOut);
-
-
-void __stdcall IDocHostUIHandlerDispatch_TranslateUrl_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IDocHostUIHandlerDispatch_FilterDataObject_Proxy( 
-	IDocHostUIHandlerDispatch * This,
-	 IUnknown *pDO,
-	 IUnknown **ppDORet);
-
-
-void __stdcall IDocHostUIHandlerDispatch_FilterDataObject_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IAxWinHostWindow;
-
-
-
-	struct __declspec(uuid("B6EA2050-048A-11d1-82B9-00C04FB9942E")) __declspec(novtable)
-	IAxWinHostWindow : public IUnknown
-	{
-	public:
-		virtual HRESULT __stdcall CreateControl( 
-			 LPCOLESTR lpTricsData,
-			 HWND hWnd,
-			 IStream *pStream) = 0;
-
-		virtual HRESULT __stdcall CreateControlEx( 
-			 LPCOLESTR lpTricsData,
-			 HWND hWnd,
-			 IStream *pStream,
-			 IUnknown **ppUnk,
-			 const IID & riidAdvise,
-			 IUnknown *punkAdvise) = 0;
-
-		virtual HRESULT __stdcall AttachControl( 
-			 IUnknown *pUnkControl,
-			 HWND hWnd) = 0;
-
-		virtual HRESULT __stdcall QueryControl( 
-			 const IID & riid,
-			 void **ppvObject) = 0;
-
-		virtual HRESULT __stdcall SetExternalDispatch( 
-			 IDispatch *pDisp) = 0;
-
-		virtual HRESULT __stdcall SetExternalUIHandler( 
-			 IDocHostUIHandlerDispatch *pDisp) = 0;
-
-	};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IAxWinHostWindow_CreateControl_Proxy( 
-	IAxWinHostWindow * This,
-	 LPCOLESTR lpTricsData,
-	 HWND hWnd,
-	 IStream *pStream);
-
-
-void __stdcall IAxWinHostWindow_CreateControl_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAxWinHostWindow_CreateControlEx_Proxy( 
-	IAxWinHostWindow * This,
-	 LPCOLESTR lpTricsData,
-	 HWND hWnd,
-	 IStream *pStream,
-	 IUnknown **ppUnk,
-	 const IID & riidAdvise,
-	 IUnknown *punkAdvise);
-
-
-void __stdcall IAxWinHostWindow_CreateControlEx_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAxWinHostWindow_AttachControl_Proxy( 
-	IAxWinHostWindow * This,
-	 IUnknown *pUnkControl,
-	 HWND hWnd);
-
-
-void __stdcall IAxWinHostWindow_AttachControl_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAxWinHostWindow_QueryControl_Proxy( 
-	IAxWinHostWindow * This,
-	 const IID & riid,
-	 void **ppvObject);
-
-
-void __stdcall IAxWinHostWindow_QueryControl_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAxWinHostWindow_SetExternalDispatch_Proxy( 
-	IAxWinHostWindow * This,
-	 IDispatch *pDisp);
-
-
-void __stdcall IAxWinHostWindow_SetExternalDispatch_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAxWinHostWindow_SetExternalUIHandler_Proxy( 
-	IAxWinHostWindow * This,
-	 IDocHostUIHandlerDispatch *pDisp);
-
-
-void __stdcall IAxWinHostWindow_SetExternalUIHandler_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IAxWinHostWindowLic;
-
-
-
-	struct __declspec(uuid("3935BDA8-4ED9-495c-8650-E01FC1E38A4B")) __declspec(novtable)
-	IAxWinHostWindowLic : public IAxWinHostWindow
-	{
-	public:
-		virtual HRESULT __stdcall CreateControlLic( 
-			 LPCOLESTR lpTricsData,
-			 HWND hWnd,
-			 IStream *pStream,
-			 BSTR bstrLic) = 0;
-
-		virtual HRESULT __stdcall CreateControlLicEx( 
-			 LPCOLESTR lpTricsData,
-			 HWND hWnd,
-			 IStream *pStream,
-			 IUnknown **ppUnk,
-			 const IID & riidAdvise,
-			 IUnknown *punkAdvise,
-			 BSTR bstrLic) = 0;
-
-	};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IAxWinHostWindowLic_CreateControlLic_Proxy( 
-	IAxWinHostWindowLic * This,
-	 LPCOLESTR lpTricsData,
-	 HWND hWnd,
-	 IStream *pStream,
-	 BSTR bstrLic);
-
-
-void __stdcall IAxWinHostWindowLic_CreateControlLic_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAxWinHostWindowLic_CreateControlLicEx_Proxy( 
-	IAxWinHostWindowLic * This,
-	 LPCOLESTR lpTricsData,
-	 HWND hWnd,
-	 IStream *pStream,
-	 IUnknown **ppUnk,
-	 const IID & riidAdvise,
-	 IUnknown *punkAdvise,
-	 BSTR bstrLic);
-
-
-void __stdcall IAxWinHostWindowLic_CreateControlLicEx_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IAxWinAmbientDispatch;
-
-
-
-	struct __declspec(uuid("B6EA2051-048A-11d1-82B9-00C04FB9942E")) __declspec(novtable)
-	IAxWinAmbientDispatch : public IDispatch
-	{
-	public:
-		virtual  HRESULT __stdcall put_AllowWindowlessActivation( 
-			 VARIANT_BOOL bCanWindowlessActivate) = 0;
-
-		virtual  HRESULT __stdcall get_AllowWindowlessActivation( 
-			 VARIANT_BOOL *pbCanWindowlessActivate) = 0;
-
-		virtual  HRESULT __stdcall put_BackColor( 
-			 OLE_COLOR clrBackground) = 0;
-
-		virtual  HRESULT __stdcall get_BackColor( 
-			 OLE_COLOR *pclrBackground) = 0;
-
-		virtual  HRESULT __stdcall put_ForeColor( 
-			 OLE_COLOR clrForeground) = 0;
-
-		virtual  HRESULT __stdcall get_ForeColor( 
-			 OLE_COLOR *pclrForeground) = 0;
-
-		virtual  HRESULT __stdcall put_LocaleID( 
-			 LCID lcidLocaleID) = 0;
-
-		virtual  HRESULT __stdcall get_LocaleID( 
-			 LCID *plcidLocaleID) = 0;
-
-		virtual  HRESULT __stdcall put_UserMode( 
-			 VARIANT_BOOL bUserMode) = 0;
-
-		virtual  HRESULT __stdcall get_UserMode( 
-			 VARIANT_BOOL *pbUserMode) = 0;
-
-		virtual  HRESULT __stdcall put_DisplayAsDefault( 
-			 VARIANT_BOOL bDisplayAsDefault) = 0;
-
-		virtual  HRESULT __stdcall get_DisplayAsDefault( 
-			 VARIANT_BOOL *pbDisplayAsDefault) = 0;
-
-		virtual  HRESULT __stdcall put_Font( 
-			 IFontDisp *pFont) = 0;
-
-		virtual  HRESULT __stdcall get_Font( 
-			 IFontDisp **pFont) = 0;
-
-		virtual  HRESULT __stdcall put_MessageReflect( 
-			 VARIANT_BOOL bMsgReflect) = 0;
-
-		virtual  HRESULT __stdcall get_MessageReflect( 
-			 VARIANT_BOOL *pbMsgReflect) = 0;
-
-		virtual  HRESULT __stdcall get_ShowGrabHandles( 
-			 VARIANT_BOOL *pbShowGrabHandles) = 0;
-
-		virtual  HRESULT __stdcall get_ShowHatching( 
-			 VARIANT_BOOL *pbShowHatching) = 0;
-
-		virtual  HRESULT __stdcall put_DocHostFlags( 
-			 DWORD dwDocHostFlags) = 0;
-
-		virtual  HRESULT __stdcall get_DocHostFlags( 
-			 DWORD *pdwDocHostFlags) = 0;
-
-		virtual  HRESULT __stdcall put_DocHostDoubleClickFlags( 
-			 DWORD dwDocHostDoubleClickFlags) = 0;
-
-		virtual  HRESULT __stdcall get_DocHostDoubleClickFlags( 
-			 DWORD *pdwDocHostDoubleClickFlags) = 0;
-
-		virtual  HRESULT __stdcall put_AllowContextMenu( 
-			 VARIANT_BOOL bAllowContextMenu) = 0;
-
-		virtual  HRESULT __stdcall get_AllowContextMenu( 
-			 VARIANT_BOOL *pbAllowContextMenu) = 0;
-
-		virtual  HRESULT __stdcall put_AllowShowUI( 
-			 VARIANT_BOOL bAllowShowUI) = 0;
-
-		virtual  HRESULT __stdcall get_AllowShowUI( 
-			 VARIANT_BOOL *pbAllowShowUI) = 0;
-
-		virtual  HRESULT __stdcall put_OptionKeyPath( 
-			 BSTR bstrOptionKeyPath) = 0;
-
-		virtual  HRESULT __stdcall get_OptionKeyPath( 
-			 BSTR *pbstrOptionKeyPath) = 0;
-
-	};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_put_AllowWindowlessActivation_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 VARIANT_BOOL bCanWindowlessActivate);
-
-
-void __stdcall IAxWinAmbientDispatch_put_AllowWindowlessActivation_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_get_AllowWindowlessActivation_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 VARIANT_BOOL *pbCanWindowlessActivate);
-
-
-void __stdcall IAxWinAmbientDispatch_get_AllowWindowlessActivation_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_put_BackColor_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 OLE_COLOR clrBackground);
-
-
-void __stdcall IAxWinAmbientDispatch_put_BackColor_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_get_BackColor_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 OLE_COLOR *pclrBackground);
-
-
-void __stdcall IAxWinAmbientDispatch_get_BackColor_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_put_ForeColor_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 OLE_COLOR clrForeground);
-
-
-void __stdcall IAxWinAmbientDispatch_put_ForeColor_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_get_ForeColor_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 OLE_COLOR *pclrForeground);
-
-
-void __stdcall IAxWinAmbientDispatch_get_ForeColor_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_put_LocaleID_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 LCID lcidLocaleID);
-
-
-void __stdcall IAxWinAmbientDispatch_put_LocaleID_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_get_LocaleID_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 LCID *plcidLocaleID);
-
-
-void __stdcall IAxWinAmbientDispatch_get_LocaleID_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_put_UserMode_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 VARIANT_BOOL bUserMode);
-
-
-void __stdcall IAxWinAmbientDispatch_put_UserMode_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_get_UserMode_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 VARIANT_BOOL *pbUserMode);
-
-
-void __stdcall IAxWinAmbientDispatch_get_UserMode_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_put_DisplayAsDefault_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 VARIANT_BOOL bDisplayAsDefault);
-
-
-void __stdcall IAxWinAmbientDispatch_put_DisplayAsDefault_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_get_DisplayAsDefault_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 VARIANT_BOOL *pbDisplayAsDefault);
-
-
-void __stdcall IAxWinAmbientDispatch_get_DisplayAsDefault_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_put_Font_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 IFontDisp *pFont);
-
-
-void __stdcall IAxWinAmbientDispatch_put_Font_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_get_Font_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 IFontDisp **pFont);
-
-
-void __stdcall IAxWinAmbientDispatch_get_Font_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_put_MessageReflect_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 VARIANT_BOOL bMsgReflect);
-
-
-void __stdcall IAxWinAmbientDispatch_put_MessageReflect_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_get_MessageReflect_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 VARIANT_BOOL *pbMsgReflect);
-
-
-void __stdcall IAxWinAmbientDispatch_get_MessageReflect_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_get_ShowGrabHandles_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 VARIANT_BOOL *pbShowGrabHandles);
-
-
-void __stdcall IAxWinAmbientDispatch_get_ShowGrabHandles_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_get_ShowHatching_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 VARIANT_BOOL *pbShowHatching);
-
-
-void __stdcall IAxWinAmbientDispatch_get_ShowHatching_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_put_DocHostFlags_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 DWORD dwDocHostFlags);
-
-
-void __stdcall IAxWinAmbientDispatch_put_DocHostFlags_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_get_DocHostFlags_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 DWORD *pdwDocHostFlags);
-
-
-void __stdcall IAxWinAmbientDispatch_get_DocHostFlags_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_put_DocHostDoubleClickFlags_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 DWORD dwDocHostDoubleClickFlags);
-
-
-void __stdcall IAxWinAmbientDispatch_put_DocHostDoubleClickFlags_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_get_DocHostDoubleClickFlags_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 DWORD *pdwDocHostDoubleClickFlags);
-
-
-void __stdcall IAxWinAmbientDispatch_get_DocHostDoubleClickFlags_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_put_AllowContextMenu_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 VARIANT_BOOL bAllowContextMenu);
-
-
-void __stdcall IAxWinAmbientDispatch_put_AllowContextMenu_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_get_AllowContextMenu_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 VARIANT_BOOL *pbAllowContextMenu);
-
-
-void __stdcall IAxWinAmbientDispatch_get_AllowContextMenu_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_put_AllowShowUI_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 VARIANT_BOOL bAllowShowUI);
-
-
-void __stdcall IAxWinAmbientDispatch_put_AllowShowUI_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_get_AllowShowUI_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 VARIANT_BOOL *pbAllowShowUI);
-
-
-void __stdcall IAxWinAmbientDispatch_get_AllowShowUI_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_put_OptionKeyPath_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 BSTR bstrOptionKeyPath);
-
-
-void __stdcall IAxWinAmbientDispatch_put_OptionKeyPath_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
- HRESULT __stdcall IAxWinAmbientDispatch_get_OptionKeyPath_Proxy( 
-	IAxWinAmbientDispatch * This,
-	 BSTR *pbstrOptionKeyPath);
-
-
-void __stdcall IAxWinAmbientDispatch_get_OptionKeyPath_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IAxWinAmbientDispatchEx;
-
-
-
-	struct __declspec(uuid("B2D0778B-AC99-4c58-A5C8-E7724E5316B5")) __declspec(novtable)
-	IAxWinAmbientDispatchEx : public IAxWinAmbientDispatch
-	{
-	public:
-		virtual  HRESULT __stdcall SetAmbientDispatch( 
-			 IDispatch *pDispatch) = 0;
-
-	};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HRESULT __stdcall IAxWinAmbientDispatchEx_SetAmbientDispatch_Proxy( 
-	IAxWinAmbientDispatchEx * This,
-	 IDispatch *pDispatch);
-
-
-void __stdcall IAxWinAmbientDispatchEx_SetAmbientDispatch_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IInternalConnection;
-
-
-
-	struct __declspec(uuid("72AD0770-6A9F-11d1-BCEC-0060088F444E")) __declspec(novtable)
-	IInternalConnection : public IUnknown
-	{
-	public:
-		virtual HRESULT __stdcall AddConnection( void) = 0;
-
-		virtual HRESULT __stdcall ReleaseConnection( void) = 0;
-
-	};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IInternalConnection_AddConnection_Proxy( 
-	IInternalConnection * This);
-
-
-void __stdcall IInternalConnection_AddConnection_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IInternalConnection_ReleaseConnection_Proxy( 
-	IInternalConnection * This);
-
-
-void __stdcall IInternalConnection_ReleaseConnection_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
- 
-
-
-#pragma pack(push,8)
-namespace ATL
-{
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) INT_PTR __stdcall AtlAxDialogBoxW(HINSTANCE hInstance, LPCWSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogProc, LPARAM dwInitParam);
-extern "C" __declspec(dllimport) INT_PTR __stdcall AtlAxDialogBoxA(HINSTANCE hInstance, LPCSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogProc, LPARAM dwInitParam);
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HWND __stdcall AtlAxCreateDialogW(HINSTANCE hInstance, LPCWSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogProc, LPARAM dwInitParam);
-extern "C" __declspec(dllimport) HWND __stdcall AtlAxCreateDialogA(HINSTANCE hInstance, LPCSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogProc, LPARAM dwInitParam);
-
-
-
-
-
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlAxCreateControl(LPCOLESTR lpszName, HWND hWnd, IStream* pStream, IUnknown** ppUnkContainer);
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlAxCreateControlEx(LPCOLESTR lpszName, HWND hWnd, IStream* pStream, 
-		IUnknown** ppUnkContainer, IUnknown** ppUnkControl, 
-		const IID & iidSink=GUID_NULL, IUnknown* punkSink=0);
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlAxCreateControlLic(LPCOLESTR lpszName, HWND hWnd, IStream* pStream, IUnknown** ppUnkContainer, BSTR bstrLic = 0);
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlAxCreateControlLicEx(LPCOLESTR lpszName, HWND hWnd, IStream* pStream, 
-		IUnknown** ppUnkContainer, IUnknown** ppUnkControl, 
-		const IID & iidSink=GUID_NULL, IUnknown* punkSink=0, BSTR bstrLic = 0);
-
-
-
-
-
-
-
-
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlAxAttachControl(IUnknown* pControl, HWND hWnd, IUnknown** ppUnkContainer);
-extern "C" __declspec(dllimport) BOOL __stdcall AtlAxWinInit();
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlAxGetHost(HWND h, IUnknown** pp);
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlAxGetControl(HWND h, IUnknown** pp);
-
-}; 
-#pragma pack(pop)
-
-extern RPC_IF_HANDLE __MIDL_itf_atliface_0257_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_atliface_0257_v0_0_s_ifspec;
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IAccessibleProxy;
-
-
-
-	struct __declspec(uuid("7A7D9DCF-B7A1-4019-9031-258268846980")) __declspec(novtable)
-	IAccessibleProxy : public IUnknown
-	{
-	public:
-		virtual HRESULT __stdcall SetServer( 
-			 IAccessible *pAccessible,
-			 IAccessibleServer *pServer) = 0;
-
-	};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IAccessibleProxy_SetServer_Proxy( 
-	IAccessibleProxy * This,
-	 IAccessible *pAccessible,
-	 IAccessibleServer *pServer);
-
-
-void __stdcall IAccessibleProxy_SetServer_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-
-
- 
-
-
-extern "C" const IID IID_IAccessibleServer;
-
-
-
-	struct __declspec(uuid("52C8FB5E-D779-4e77-AE9F-F611FA7E9D7A")) __declspec(novtable)
-	IAccessibleServer : public IUnknown
-	{
-	public:
-		virtual HRESULT __stdcall SetProxy( 
-			 IAccessibleProxy *pUnknown) = 0;
-
-		virtual HRESULT __stdcall GetHWND( 
-			 HWND *phWnd) = 0;
-
-		virtual HRESULT __stdcall GetEnumVariant( 
-			 IEnumVARIANT **ppEnumVariant) = 0;
-
-	};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-HRESULT __stdcall IAccessibleServer_SetProxy_Proxy( 
-	IAccessibleServer * This,
-	 IAccessibleProxy *pUnknown);
-
-
-void __stdcall IAccessibleServer_SetProxy_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAccessibleServer_GetHWND_Proxy( 
-	IAccessibleServer * This,
-	 HWND *phWnd);
-
-
-void __stdcall IAccessibleServer_GetHWND_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IAccessibleServer_GetEnumVariant_Proxy( 
-	IAccessibleServer * This,
-	 IEnumVARIANT **ppEnumVariant);
-
-
-void __stdcall IAccessibleServer_GetEnumVariant_Stub(
-	IRpcStubBuffer *This,
-	IRpcChannelBuffer *_pRpcChannelBuffer,
-	PRPC_MESSAGE _pRpcMessage,
-	DWORD *_pdwStubPhase);
-
-
-
-
-
-
-
-
-unsigned long             __stdcall  BSTR_UserSize(     unsigned long *, unsigned long            , BSTR * ); 
-unsigned char * __stdcall  BSTR_UserMarshal(  unsigned long *, unsigned char *, BSTR * ); 
-unsigned char * __stdcall  BSTR_UserUnmarshal(unsigned long *, unsigned char *, BSTR * ); 
-void                      __stdcall  BSTR_UserFree(     unsigned long *, BSTR * ); 
-
-unsigned long             __stdcall  HWND_UserSize(     unsigned long *, unsigned long            , HWND * ); 
-unsigned char * __stdcall  HWND_UserMarshal(  unsigned long *, unsigned char *, HWND * ); 
-unsigned char * __stdcall  HWND_UserUnmarshal(unsigned long *, unsigned char *, HWND * ); 
-void                      __stdcall  HWND_UserFree(     unsigned long *, HWND * ); 
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) uintptr_t __cdecl _beginthread (     void (__cdecl * _StartAddress) (void *),
-             unsigned _StackSize,        void * _ArgList);
-__declspec(dllimport) void __cdecl _endthread(void);
-__declspec(dllimport) uintptr_t __cdecl _beginthreadex(       void * _Security,      unsigned _StackSize,
-             unsigned (__stdcall * _StartAddress) (void *),        void * _ArgList, 
-             unsigned _InitFlag,        unsigned * _ThrdAddr);
-__declspec(dllimport) void __cdecl _endthreadex(     unsigned _Retval);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(dllimport) void __cdecl _cexit(void);
-__declspec(dllimport) void __cdecl _c_exit(void);
-__declspec(dllimport) int __cdecl _getpid(void);
-
-__declspec(dllimport) intptr_t __cdecl _cwait(       int * _TermStat,      intptr_t _ProcHandle,      int _Action);
-__declspec(dllimport) intptr_t __cdecl _execl(       const char * _Filename,        const char * _ArgList, ...);
-__declspec(dllimport) intptr_t __cdecl _execle(       const char * _Filename,        const char * _ArgList, ...);
-__declspec(dllimport) intptr_t __cdecl _execlp(       const char * _Filename,        const char * _ArgList, ...);
-__declspec(dllimport) intptr_t __cdecl _execlpe(       const char * _Filename,        const char * _ArgList, ...);
-__declspec(dllimport) intptr_t __cdecl _execv(       const char * _Filename,        const char * const * _ArgList);
-__declspec(dllimport) intptr_t __cdecl _execve(       const char * _Filename,        const char * const * _ArgList,          const char * const * _Env);
-__declspec(dllimport) intptr_t __cdecl _execvp(       const char * _Filename,        const char * const * _ArgList);
-__declspec(dllimport) intptr_t __cdecl _execvpe(       const char * _Filename,        const char * const * _ArgList,          const char * const * _Env);
-__declspec(dllimport) intptr_t __cdecl _spawnl(     int _Mode,        const char * _Filename,        const char * _ArgList, ...);
-__declspec(dllimport) intptr_t __cdecl _spawnle(     int _Mode,        const char * _Filename,        const char * _ArgList, ...);
-__declspec(dllimport) intptr_t __cdecl _spawnlp(     int _Mode,        const char * _Filename,        const char * _ArgList, ...);
-__declspec(dllimport) intptr_t __cdecl _spawnlpe(     int _Mode,        const char * _Filename,        const char * _ArgList, ...);
-__declspec(dllimport) intptr_t __cdecl _spawnv(     int _Mode,        const char * _Filename,        const char * const * _ArgList);
-__declspec(dllimport) intptr_t __cdecl _spawnve(     int _Mode,        const char * _Filename,        const char * const * _ArgList,
-                 const char * const * _Env);
-__declspec(dllimport) intptr_t __cdecl _spawnvp(     int _Mode,        const char * _Filename,        const char * const * _ArgList);
-__declspec(dllimport) intptr_t __cdecl _spawnvpe(     int _Mode,        const char * _Filename,        const char * const * _ArgList,
-                 const char * const * _Env);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-void __cdecl __security_init_cookie(void);
-
-void __fastcall __security_check_cookie(     uintptr_t _StackCookie);
-__declspec(noreturn) void __cdecl __report_gsfailure(void);
-
-
-
-
-
-extern uintptr_t __security_cookie;
-
-
-
-
-
-
-
-__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "LoadLibrary" " instead. See online help for details.")) intptr_t __cdecl _loaddll(       char * _Filename);
-__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "FreeLibrary" " instead. See online help for details.")) int __cdecl _unloaddll(     intptr_t _Handle);
-__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetProcAddress" " instead. See online help for details.")) int (__cdecl * __cdecl _getdllprocaddr(     intptr_t _Handle,          char * _ProcedureName,      intptr_t _Ordinal))(void);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_cwait" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl cwait(       int * _TermStat,      intptr_t _ProcHandle,      int _Action);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_execl" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl execl(       const char * _Filename,        const char * _ArgList, ...);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_execle" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl execle(       const char * _Filename,        const char * _ArgList, ...);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_execlp" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl execlp(       const char * _Filename,        const char * _ArgList, ...);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_execlpe" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl execlpe(       const char * _Filename,        const char * _ArgList, ...);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_execv" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl execv(       const char * _Filename,        const char * const * _ArgList);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_execve" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl execve(       const char * _Filename,        const char * const * _ArgList,          const char * const * _Env);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_execvp" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl execvp(       const char * _Filename,        const char * const * _ArgList);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_execvpe" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl execvpe(       const char * _Filename,        const char * const * _ArgList,          const char * const * _Env);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_spawnl" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl spawnl(     int,        const char * _Filename,        const char * _ArgList, ...);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_spawnle" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl spawnle(     int,        const char * _Filename,        const char * _ArgList, ...);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_spawnlp" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl spawnlp(     int,        const char * _Filename,        const char * _ArgList, ...);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_spawnlpe" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl spawnlpe(     int,        const char * _Filename,        const char * _ArgList, ...);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_spawnv" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl spawnv(     int,        const char * _Filename,        const char * const * _ArgList);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_spawnve" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl spawnve(     int,        const char * _Filename,        const char * const * _ArgList,
-                 const char * const * _Env);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_spawnvp" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl spawnvp(     int,        const char * _Filename,        const char * const * _ArgList);
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_spawnvpe" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl spawnvpe(     int,        const char * _Filename,        const char * const * _ArgList,
-                 const char * const * _Env);
-
-__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_getpid" ". See online help for details.")) __declspec(dllimport) int __cdecl getpid(void);
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-
-
-
-#pragma warning( disable: 4049 )  
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
- 
-
-
-
-
-
-extern "C"{
-
-
-void * __stdcall MIDL_user_allocate(size_t);
-void __stdcall MIDL_user_free( void * ); 
-
-
- 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,1)
-
-
-
-
-
-
-
-
-typedef struct _SHITEMID
-    {
-    USHORT cb;
-    BYTE abID[ 1 ];
-    } 	SHITEMID;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-typedef SHITEMID  *LPSHITEMID;
-
-typedef const SHITEMID  *LPCSHITEMID;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,1)
-
-
-
-
-
-
-
-
-typedef struct _ITEMIDLIST
-    {
-    SHITEMID mkid;
-    } 	ITEMIDLIST;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-typedef  BYTE_BLOB *wirePIDL;
-
-typedef  ITEMIDLIST  *LPITEMIDLIST;
-
-typedef  const ITEMIDLIST  *LPCITEMIDLIST;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef  
-enum tagSTRRET_TYPE
-    {	STRRET_WSTR	= 0,
-	STRRET_OFFSET	= 0x1,
-	STRRET_CSTR	= 0x2
-    } 	STRRET_TYPE;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,8)
-
-
-
-
-
-
-
-
-typedef struct _STRRET
-    {
-    UINT uType;
-     union 
-        {
-         LPWSTR pOleStr;
-         UINT uOffset;
-         char cStr[ 260 ];
-        } 	;
-    } 	STRRET;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-typedef STRRET *LPSTRRET;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,1)
-
-
-
-
-
-
-
-
-typedef struct _SHELLDETAILS
-    {
-    int fmt;
-    int cxChar;
-    STRRET str;
-    } 	SHELLDETAILS;
-
-typedef struct _SHELLDETAILS *LPSHELLDETAILS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-extern RPC_IF_HANDLE __MIDL_itf_shtypes_0000_v0_0_c_ifspec;
-extern RPC_IF_HANDLE __MIDL_itf_shtypes_0000_v0_0_s_ifspec;
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(push,8)
-
-
-
-
-
-
-
-
-
-
-
-extern "C" {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) LPSTR __stdcall    StrChrA(LPCSTR lpStart, WORD wMatch);
-extern "C" __declspec(dllimport) LPWSTR __stdcall   StrChrW(LPCWSTR lpStart, WCHAR wMatch);
-extern "C" __declspec(dllimport) LPSTR __stdcall    StrChrIA(LPCSTR lpStart, WORD wMatch);
-extern "C" __declspec(dllimport) LPWSTR __stdcall   StrChrIW(LPCWSTR lpStart, WCHAR wMatch);
-extern "C" __declspec(dllimport) int __stdcall      StrCmpNA(LPCSTR lpStr1, LPCSTR lpStr2, int nChar);
-extern "C" __declspec(dllimport) int __stdcall      StrCmpNW(LPCWSTR lpStr1, LPCWSTR lpStr2, int nChar);
-extern "C" __declspec(dllimport) int __stdcall      StrCmpNIA(LPCSTR lpStr1, LPCSTR lpStr2, int nChar);
-extern "C" __declspec(dllimport) int __stdcall      StrCmpNIW(LPCWSTR lpStr1, LPCWSTR lpStr2, int nChar);
-extern "C" __declspec(dllimport) int __stdcall      StrCSpnA(LPCSTR lpStr, LPCSTR lpSet);
-extern "C" __declspec(dllimport) int __stdcall      StrCSpnW(LPCWSTR lpStr, LPCWSTR lpSet);
-extern "C" __declspec(dllimport) int __stdcall      StrCSpnIA(LPCSTR lpStr, LPCSTR lpSet);
-extern "C" __declspec(dllimport) int __stdcall      StrCSpnIW(LPCWSTR lpStr, LPCWSTR lpSet);
-extern "C" __declspec(dllimport) LPSTR __stdcall    StrDupA(LPCSTR lpSrch);
-extern "C" __declspec(dllimport) LPWSTR __stdcall   StrDupW(LPCWSTR lpSrch);
-extern "C" __declspec(dllimport) LPSTR __stdcall    StrFormatByteSizeA(DWORD dw, LPSTR szBuf, UINT uiBufSize);
-extern "C" __declspec(dllimport) LPSTR __stdcall    StrFormatByteSize64A(LONGLONG qdw, LPSTR szBuf, UINT uiBufSize);
-extern "C" __declspec(dllimport) LPWSTR __stdcall   StrFormatByteSizeW(LONGLONG qdw, LPWSTR szBuf, UINT uiBufSize);
-extern "C" __declspec(dllimport) LPWSTR __stdcall   StrFormatKBSizeW(LONGLONG qdw, LPWSTR szBuf, UINT uiBufSize);
-extern "C" __declspec(dllimport) LPSTR __stdcall    StrFormatKBSizeA(LONGLONG qdw, LPSTR szBuf, UINT uiBufSize);
-extern "C" __declspec(dllimport) int __stdcall      StrFromTimeIntervalA(LPSTR pszOut, UINT cchMax, DWORD dwTimeMS, int digits);
-extern "C" __declspec(dllimport) int __stdcall      StrFromTimeIntervalW(LPWSTR pszOut, UINT cchMax, DWORD dwTimeMS, int digits);
-extern "C" __declspec(dllimport) BOOL __stdcall     StrIsIntlEqualA(BOOL fCaseSens, LPCSTR lpString1, LPCSTR lpString2, int nChar);
-extern "C" __declspec(dllimport) BOOL __stdcall     StrIsIntlEqualW(BOOL fCaseSens, LPCWSTR lpString1, LPCWSTR lpString2, int nChar);
-extern "C" __declspec(dllimport) LPSTR __stdcall    StrNCatA(LPSTR psz1, LPCSTR psz2, int cchMax);
-extern "C" __declspec(dllimport) LPWSTR __stdcall   StrNCatW(LPWSTR psz1, LPCWSTR psz2, int cchMax);
-extern "C" __declspec(dllimport) LPSTR __stdcall    StrPBrkA(LPCSTR psz, LPCSTR pszSet);
-extern "C" __declspec(dllimport) LPWSTR __stdcall   StrPBrkW(LPCWSTR psz, LPCWSTR pszSet);
-extern "C" __declspec(dllimport) LPSTR __stdcall    StrRChrA(LPCSTR lpStart, LPCSTR lpEnd, WORD wMatch);
-extern "C" __declspec(dllimport) LPWSTR __stdcall   StrRChrW(LPCWSTR lpStart, LPCWSTR lpEnd, WCHAR wMatch);
-extern "C" __declspec(dllimport) LPSTR __stdcall    StrRChrIA(LPCSTR lpStart, LPCSTR lpEnd, WORD wMatch);
-extern "C" __declspec(dllimport) LPWSTR __stdcall   StrRChrIW(LPCWSTR lpStart, LPCWSTR lpEnd, WCHAR wMatch);
-extern "C" __declspec(dllimport) LPSTR __stdcall    StrRStrIA(LPCSTR lpSource, LPCSTR lpLast, LPCSTR lpSrch);
-extern "C" __declspec(dllimport) LPWSTR __stdcall   StrRStrIW(LPCWSTR lpSource, LPCWSTR lpLast, LPCWSTR lpSrch);
-extern "C" __declspec(dllimport) int __stdcall      StrSpnA(LPCSTR psz, LPCSTR pszSet);
-extern "C" __declspec(dllimport) int __stdcall      StrSpnW(LPCWSTR psz, LPCWSTR pszSet);
-extern "C" __declspec(dllimport) LPSTR __stdcall    StrStrA(LPCSTR lpFirst, LPCSTR lpSrch);
-extern "C" __declspec(dllimport) LPWSTR __stdcall   StrStrW(LPCWSTR lpFirst, LPCWSTR lpSrch);
-extern "C" __declspec(dllimport) LPSTR __stdcall    StrStrIA(LPCSTR lpFirst, LPCSTR lpSrch);
-extern "C" __declspec(dllimport) LPWSTR __stdcall   StrStrIW(LPCWSTR lpFirst, LPCWSTR lpSrch);
-extern "C" __declspec(dllimport) int __stdcall      StrToIntA(LPCSTR lpSrc);
-extern "C" __declspec(dllimport) int __stdcall      StrToIntW(LPCWSTR lpSrc);
-extern "C" __declspec(dllimport) BOOL __stdcall     StrToIntExA(LPCSTR pszString, DWORD dwFlags, int * piRet);
-extern "C" __declspec(dllimport) BOOL __stdcall     StrToIntExW(LPCWSTR pszString, DWORD dwFlags, int * piRet);
-
-extern "C" __declspec(dllimport) BOOL __stdcall     StrToInt64ExA(LPCSTR pszString, DWORD dwFlags, LONGLONG * pllRet);
-extern "C" __declspec(dllimport) BOOL __stdcall     StrToInt64ExW(LPCWSTR pszString, DWORD dwFlags, LONGLONG * pllRet);
-
-extern "C" __declspec(dllimport) BOOL __stdcall     StrTrimA(LPSTR psz, LPCSTR pszTrimChars);
-extern "C" __declspec(dllimport) BOOL __stdcall     StrTrimW(LPWSTR psz, LPCWSTR pszTrimChars);
-
-extern "C" __declspec(dllimport) LPWSTR __stdcall   StrCatW(LPWSTR psz1, LPCWSTR psz2);
-extern "C" __declspec(dllimport) int __stdcall      StrCmpW(LPCWSTR psz1, LPCWSTR psz2);
-extern "C" __declspec(dllimport) int __stdcall      StrCmpIW(LPCWSTR psz1, LPCWSTR psz2);
-extern "C" __declspec(dllimport) LPWSTR __stdcall   StrCpyW(LPWSTR psz1, LPCWSTR psz2);
-extern "C" __declspec(dllimport) LPWSTR __stdcall   StrCpyNW(LPWSTR psz1, LPCWSTR psz2, int cchMax);
-
-extern "C" __declspec(dllimport) LPWSTR __stdcall   StrCatBuffW(LPWSTR pszDest, LPCWSTR pszSrc, int cchDestBuffSize);
-extern "C" __declspec(dllimport) LPSTR __stdcall    StrCatBuffA(LPSTR pszDest, LPCSTR pszSrc, int cchDestBuffSize);
-
-extern "C" __declspec(dllimport) BOOL __stdcall     ChrCmpIA(WORD w1, WORD w2);
-extern "C" __declspec(dllimport) BOOL __stdcall     ChrCmpIW(WCHAR w1, WCHAR w2);
-
-extern "C" __declspec(dllimport) int __stdcall      wvnsprintfA(LPSTR lpOut, int cchLimitIn, LPCSTR lpFmt, va_list arglist);
-extern "C" __declspec(dllimport) int __stdcall      wvnsprintfW(LPWSTR lpOut, int cchLimitIn, LPCWSTR lpFmt, va_list arglist);
-extern "C" __declspec(dllimport) int __cdecl     wnsprintfA(LPSTR lpOut, int cchLimitIn, LPCSTR lpFmt, ...);
-extern "C" __declspec(dllimport) int __cdecl     wnsprintfW(LPWSTR lpOut, int cchLimitIn, LPCWSTR lpFmt, ...);
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall StrRetToStrA(STRRET *pstr, LPCITEMIDLIST pidl, LPSTR *ppsz);
-extern "C" __declspec(dllimport) HRESULT __stdcall StrRetToStrW(STRRET *pstr, LPCITEMIDLIST pidl, LPWSTR *ppsz);
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall StrRetToBufA(STRRET *pstr, LPCITEMIDLIST pidl, LPSTR pszBuf, UINT cchBuf);
-extern "C" __declspec(dllimport) HRESULT __stdcall StrRetToBufW(STRRET *pstr, LPCITEMIDLIST pidl, LPWSTR pszBuf, UINT cchBuf);
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall StrRetToBSTR(STRRET *pstr, LPCITEMIDLIST pidl, BSTR *pbstr);
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall SHStrDupA(LPCSTR psz, WCHAR **ppwsz);
-extern "C" __declspec(dllimport) HRESULT __stdcall SHStrDupW(LPCWSTR psz, WCHAR **ppwsz);
-
-
-
-
-
-
-extern "C" __declspec(dllimport) int __stdcall StrCmpLogicalW(LPCWSTR psz1, LPCWSTR psz2);
-extern "C" __declspec(dllimport) DWORD __stdcall StrCatChainW(LPWSTR pszDst, DWORD cchDst, DWORD ichAt, LPCWSTR pszSrc);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall SHLoadIndirectString(LPCWSTR pszSource, LPWSTR pszOutBuf, UINT cchOutBuf, void **ppvReserved);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     IntlStrEqWorkerA(BOOL fCaseSens, LPCSTR lpString1, LPCSTR lpString2, int nChar);
-extern "C" __declspec(dllimport) BOOL __stdcall     IntlStrEqWorkerW(BOOL fCaseSens, LPCWSTR lpString1, LPCWSTR lpString2, int nChar);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) LPSTR __stdcall  PathAddBackslashA(LPSTR pszPath);
-extern "C" __declspec(dllimport) LPWSTR __stdcall  PathAddBackslashW(LPWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathAddExtensionA(LPSTR pszPath, LPCSTR pszExt);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathAddExtensionW(LPWSTR pszPath, LPCWSTR pszExt);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathAppendA(LPSTR pszPath, LPCSTR pMore);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathAppendW(LPWSTR pszPath, LPCWSTR pMore);
-extern "C" __declspec(dllimport) LPSTR __stdcall  PathBuildRootA(LPSTR pszRoot, int iDrive);
-extern "C" __declspec(dllimport) LPWSTR __stdcall  PathBuildRootW(LPWSTR pszRoot, int iDrive);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathCanonicalizeA(LPSTR pszBuf, LPCSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathCanonicalizeW(LPWSTR pszBuf, LPCWSTR pszPath);
-extern "C" __declspec(dllimport) LPSTR __stdcall  PathCombineA(LPSTR pszDest, LPCSTR pszDir, LPCSTR pszFile);
-extern "C" __declspec(dllimport) LPWSTR __stdcall  PathCombineW(LPWSTR pszDest, LPCWSTR pszDir, LPCWSTR pszFile);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathCompactPathA(HDC hDC, LPSTR pszPath, UINT dx);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathCompactPathW(HDC hDC, LPWSTR pszPath, UINT dx);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathCompactPathExA(LPSTR pszOut, LPCSTR pszSrc, UINT cchMax, DWORD dwFlags);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathCompactPathExW(LPWSTR pszOut, LPCWSTR pszSrc, UINT cchMax, DWORD dwFlags);
-extern "C" __declspec(dllimport) int __stdcall      PathCommonPrefixA(LPCSTR pszFile1, LPCSTR pszFile2, LPSTR achPath);
-extern "C" __declspec(dllimport) int __stdcall      PathCommonPrefixW(LPCWSTR pszFile1, LPCWSTR pszFile2, LPWSTR achPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathFileExistsA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathFileExistsW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) LPSTR __stdcall  PathFindExtensionA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) LPWSTR __stdcall  PathFindExtensionW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) LPSTR __stdcall  PathFindFileNameA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) LPWSTR __stdcall  PathFindFileNameW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) LPSTR __stdcall  PathFindNextComponentA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) LPWSTR __stdcall  PathFindNextComponentW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathFindOnPathA(LPSTR pszPath, LPCSTR * ppszOtherDirs);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathFindOnPathW(LPWSTR pszPath, LPCWSTR * ppszOtherDirs);
-extern "C" __declspec(dllimport) LPSTR __stdcall  PathGetArgsA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) LPWSTR __stdcall  PathGetArgsW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) LPCSTR __stdcall PathFindSuffixArrayA(LPCSTR pszPath, const LPCSTR *apszSuffix, int iArraySize);
-extern "C" __declspec(dllimport) LPCWSTR __stdcall PathFindSuffixArrayW(LPCWSTR pszPath, const LPCWSTR *apszSuffix, int iArraySize);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsLFNFileSpecA(LPCSTR lpName);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsLFNFileSpecW(LPCWSTR lpName);
-
-
-
-
-
-
-extern "C" __declspec(dllimport) UINT __stdcall     PathGetCharTypeA(UCHAR ch);
-extern "C" __declspec(dllimport) UINT __stdcall     PathGetCharTypeW(WCHAR ch);
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) int __stdcall      PathGetDriveNumberA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) int __stdcall      PathGetDriveNumberW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsDirectoryA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsDirectoryW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsDirectoryEmptyA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsDirectoryEmptyW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsFileSpecA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsFileSpecW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsPrefixA(LPCSTR pszPrefix, LPCSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsPrefixW(LPCWSTR pszPrefix, LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsRelativeA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsRelativeW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsRootA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsRootW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsSameRootA(LPCSTR pszPath1, LPCSTR pszPath2);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsSameRootW(LPCWSTR pszPath1, LPCWSTR pszPath2);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsUNCA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsUNCW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsNetworkPathA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsNetworkPathW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsUNCServerA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsUNCServerW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsUNCServerShareA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsUNCServerShareW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsContentTypeA(LPCSTR pszPath, LPCSTR pszContentType);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsContentTypeW(LPCWSTR pszPath, LPCWSTR pszContentType);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsURLA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsURLW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathMakePrettyA(LPSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathMakePrettyW(LPWSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathMatchSpecA(LPCSTR pszFile, LPCSTR pszSpec);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathMatchSpecW(LPCWSTR pszFile, LPCWSTR pszSpec);
-extern "C" __declspec(dllimport) int __stdcall      PathParseIconLocationA(LPSTR pszIconFile);
-extern "C" __declspec(dllimport) int __stdcall      PathParseIconLocationW(LPWSTR pszIconFile);
-extern "C" __declspec(dllimport) void __stdcall     PathQuoteSpacesA(LPSTR lpsz);
-extern "C" __declspec(dllimport) void __stdcall     PathQuoteSpacesW(LPWSTR lpsz);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathRelativePathToA(LPSTR pszPath, LPCSTR pszFrom, DWORD dwAttrFrom, LPCSTR pszTo, DWORD dwAttrTo);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathRelativePathToW(LPWSTR pszPath, LPCWSTR pszFrom, DWORD dwAttrFrom, LPCWSTR pszTo, DWORD dwAttrTo);
-extern "C" __declspec(dllimport) void __stdcall     PathRemoveArgsA(LPSTR pszPath);
-extern "C" __declspec(dllimport) void __stdcall     PathRemoveArgsW(LPWSTR pszPath);
-extern "C" __declspec(dllimport) LPSTR __stdcall  PathRemoveBackslashA(LPSTR pszPath);
-extern "C" __declspec(dllimport) LPWSTR __stdcall  PathRemoveBackslashW(LPWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) void __stdcall     PathRemoveBlanksA(LPSTR pszPath);
-extern "C" __declspec(dllimport) void __stdcall     PathRemoveBlanksW(LPWSTR pszPath);
-extern "C" __declspec(dllimport) void __stdcall     PathRemoveExtensionA(LPSTR pszPath);
-extern "C" __declspec(dllimport) void __stdcall     PathRemoveExtensionW(LPWSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathRemoveFileSpecA(LPSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathRemoveFileSpecW(LPWSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathRenameExtensionA(LPSTR pszPath, LPCSTR pszExt);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathRenameExtensionW(LPWSTR pszPath, LPCWSTR pszExt);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathSearchAndQualifyA(LPCSTR pszPath, LPSTR pszBuf, UINT cchBuf);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathSearchAndQualifyW(LPCWSTR pszPath, LPWSTR pszBuf, UINT cchBuf);
-extern "C" __declspec(dllimport) void __stdcall     PathSetDlgItemPathA(HWND hDlg, int id, LPCSTR pszPath);
-extern "C" __declspec(dllimport) void __stdcall     PathSetDlgItemPathW(HWND hDlg, int id, LPCWSTR pszPath);
-extern "C" __declspec(dllimport) LPSTR __stdcall  PathSkipRootA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) LPWSTR __stdcall  PathSkipRootW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) void __stdcall     PathStripPathA(LPSTR pszPath);
-extern "C" __declspec(dllimport) void __stdcall     PathStripPathW(LPWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathStripToRootA(LPSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathStripToRootW(LPWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) void __stdcall     PathUnquoteSpacesA(LPSTR lpsz);
-extern "C" __declspec(dllimport) void __stdcall     PathUnquoteSpacesW(LPWSTR lpsz);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathMakeSystemFolderA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathMakeSystemFolderW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathUnmakeSystemFolderA(LPCSTR pszPath);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathUnmakeSystemFolderW(LPCWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsSystemFolderA(LPCSTR pszPath, DWORD dwAttrb);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathIsSystemFolderW(LPCWSTR pszPath, DWORD dwAttrb);
-
-
-
-
-
-extern "C" __declspec(dllimport) void __stdcall     PathUndecorateA(LPSTR pszPath);
-extern "C" __declspec(dllimport) void __stdcall     PathUndecorateW(LPWSTR pszPath);
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall     PathUnExpandEnvStringsA(LPCSTR pszPath, LPSTR pszBuf, UINT cchBuf);
-extern "C" __declspec(dllimport) BOOL __stdcall     PathUnExpandEnvStringsW(LPCWSTR pszPath, LPWSTR pszBuf, UINT cchBuf);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum {
-    URL_SCHEME_INVALID     = -1,
-    URL_SCHEME_UNKNOWN     =  0,
-    URL_SCHEME_FTP,
-    URL_SCHEME_HTTP,
-    URL_SCHEME_GOPHER,
-    URL_SCHEME_MAILTO,
-    URL_SCHEME_NEWS,
-    URL_SCHEME_NNTP,
-    URL_SCHEME_TELNET,
-    URL_SCHEME_WAIS,
-    URL_SCHEME_FILE,
-    URL_SCHEME_MK,
-    URL_SCHEME_HTTPS,
-    URL_SCHEME_SHELL,
-    URL_SCHEME_SNEWS,
-    URL_SCHEME_LOCAL,
-    URL_SCHEME_JAVASCRIPT,
-    URL_SCHEME_VBSCRIPT,
-    URL_SCHEME_ABOUT,
-    URL_SCHEME_RES,
-    URL_SCHEME_MSSHELLROOTED,
-    URL_SCHEME_MSSHELLIDLIST,
-    URL_SCHEME_MSHELP,
-    URL_SCHEME_MAXVALUE
-} URL_SCHEME;
-
-typedef enum {
-    URL_PART_NONE       = 0,
-    URL_PART_SCHEME     = 1,
-    URL_PART_HOSTNAME,
-    URL_PART_USERNAME,
-    URL_PART_PASSWORD,
-    URL_PART_PORT,
-    URL_PART_QUERY,
-} URL_PART;
-
-typedef enum {
-    URLIS_URL,
-    URLIS_OPAQUE,
-    URLIS_NOHISTORY,
-    URLIS_FILEURL,
-    URLIS_APPLIABLE,
-    URLIS_DIRECTORY,
-    URLIS_HASQUERY,
-} URLIS;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) int __stdcall          UrlCompareA(LPCSTR psz1, LPCSTR psz2, BOOL fIgnoreSlash);
-extern "C" __declspec(dllimport) int __stdcall          UrlCompareW(LPCWSTR psz1, LPCWSTR psz2, BOOL fIgnoreSlash);
-extern "C" __declspec(dllimport) HRESULT __stdcall                UrlCombineA(LPCSTR pszBase, LPCSTR pszRelative, LPSTR pszCombined, LPDWORD pcchCombined, DWORD dwFlags);
-extern "C" __declspec(dllimport) HRESULT __stdcall                UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative, LPWSTR pszCombined, LPDWORD pcchCombined, DWORD dwFlags);
-extern "C" __declspec(dllimport) HRESULT __stdcall                UrlCanonicalizeA(LPCSTR pszUrl, LPSTR pszCanonicalized, LPDWORD pcchCanonicalized, DWORD dwFlags);
-extern "C" __declspec(dllimport) HRESULT __stdcall                UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized, LPDWORD pcchCanonicalized, DWORD dwFlags);
-extern "C" __declspec(dllimport) BOOL __stdcall         UrlIsOpaqueA(LPCSTR pszURL);
-extern "C" __declspec(dllimport) BOOL __stdcall         UrlIsOpaqueW(LPCWSTR pszURL);
-extern "C" __declspec(dllimport) BOOL __stdcall         UrlIsNoHistoryA(LPCSTR pszURL);
-extern "C" __declspec(dllimport) BOOL __stdcall         UrlIsNoHistoryW(LPCWSTR pszURL);
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall         UrlIsA(LPCSTR pszUrl, URLIS UrlIs);
-extern "C" __declspec(dllimport) BOOL __stdcall         UrlIsW(LPCWSTR pszUrl, URLIS UrlIs);
-extern "C" __declspec(dllimport) LPCSTR __stdcall       UrlGetLocationA(LPCSTR psz1);
-extern "C" __declspec(dllimport) LPCWSTR __stdcall      UrlGetLocationW(LPCWSTR psz1);
-extern "C" __declspec(dllimport) HRESULT __stdcall                UrlUnescapeA(LPSTR pszUrl, LPSTR pszUnescaped, LPDWORD pcchUnescaped, DWORD dwFlags);
-extern "C" __declspec(dllimport) HRESULT __stdcall                UrlUnescapeW(LPWSTR pszUrl, LPWSTR pszUnescaped, LPDWORD pcchUnescaped, DWORD dwFlags);
-extern "C" __declspec(dllimport) HRESULT __stdcall                UrlEscapeA(LPCSTR pszUrl, LPSTR pszEscaped, LPDWORD pcchEscaped, DWORD dwFlags);
-extern "C" __declspec(dllimport) HRESULT __stdcall                UrlEscapeW(LPCWSTR pszUrl, LPWSTR pszEscaped, LPDWORD pcchEscaped, DWORD dwFlags);
-extern "C" __declspec(dllimport) HRESULT __stdcall                UrlCreateFromPathA(LPCSTR pszPath, LPSTR pszUrl, LPDWORD pcchUrl, DWORD dwFlags);
-extern "C" __declspec(dllimport) HRESULT __stdcall                UrlCreateFromPathW(LPCWSTR pszPath, LPWSTR pszUrl, LPDWORD pcchUrl, DWORD dwFlags);
-extern "C" __declspec(dllimport) HRESULT __stdcall                PathCreateFromUrlA(LPCSTR pszUrl, LPSTR pszPath, LPDWORD pcchPath, DWORD dwFlags);
-extern "C" __declspec(dllimport) HRESULT __stdcall                PathCreateFromUrlW(LPCWSTR pszUrl, LPWSTR pszPath, LPDWORD pcchPath, DWORD dwFlags);
-extern "C" __declspec(dllimport) HRESULT __stdcall                UrlHashA(LPCSTR pszUrl, LPBYTE pbHash, DWORD cbHash);
-extern "C" __declspec(dllimport) HRESULT __stdcall                UrlHashW(LPCWSTR pszUrl, LPBYTE pbHash, DWORD cbHash);
-extern "C" __declspec(dllimport) HRESULT __stdcall                UrlGetPartW(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut, DWORD dwPart, DWORD dwFlags);
-extern "C" __declspec(dllimport) HRESULT __stdcall                UrlGetPartA(LPCSTR pszIn, LPSTR pszOut, LPDWORD pcchOut, DWORD dwPart, DWORD dwFlags);
-extern "C" __declspec(dllimport) HRESULT __stdcall                UrlApplySchemeA(LPCSTR pszIn, LPSTR pszOut, LPDWORD pcchOut, DWORD dwFlags);
-extern "C" __declspec(dllimport) HRESULT __stdcall                UrlApplySchemeW(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut, DWORD dwFlags);
-extern "C" __declspec(dllimport) HRESULT __stdcall                HashData(LPBYTE pbData, DWORD cbData, LPBYTE pbHash, DWORD cbHash);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) DWORD __stdcall    SHDeleteEmptyKeyA(HKEY hkey, LPCSTR pszSubKey);
-extern "C" __declspec(dllimport) DWORD __stdcall    SHDeleteEmptyKeyW(HKEY hkey, LPCWSTR pszSubKey);
-
-
-
-
-
-extern "C" __declspec(dllimport) DWORD __stdcall    SHDeleteKeyA(HKEY hkey, LPCSTR pszSubKey);
-extern "C" __declspec(dllimport) DWORD __stdcall    SHDeleteKeyW(HKEY hkey, LPCWSTR pszSubKey);
-
-
-
-
-
-extern "C" __declspec(dllimport) HKEY __stdcall     SHRegDuplicateHKey(HKEY hkey);
-
-
-
-
-
-extern "C" __declspec(dllimport) DWORD __stdcall    SHDeleteValueA(HKEY hkey, LPCSTR pszSubKey, LPCSTR pszValue);
-extern "C" __declspec(dllimport) DWORD __stdcall    SHDeleteValueW(HKEY hkey, LPCWSTR pszSubKey, LPCWSTR pszValue);
-
-
-
-
-
-extern "C" __declspec(dllimport) DWORD __stdcall    SHGetValueA(HKEY hkey, LPCSTR pszSubKey, LPCSTR pszValue, DWORD *pdwType, void *pvData, DWORD *pcbData);
-extern "C" __declspec(dllimport) DWORD __stdcall    SHGetValueW(HKEY hkey, LPCWSTR pszSubKey, LPCWSTR pszValue, DWORD *pdwType, void *pvData, DWORD *pcbData);
-
-
-
-
-
-extern "C" __declspec(dllimport) DWORD __stdcall    SHSetValueA(HKEY hkey, LPCSTR pszSubKey, LPCSTR pszValue, DWORD dwType, LPCVOID pvData, DWORD cbData);
-extern "C" __declspec(dllimport) DWORD __stdcall    SHSetValueW(HKEY hkey, LPCWSTR pszSubKey, LPCWSTR pszValue, DWORD dwType, LPCVOID pvData, DWORD cbData);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) DWORD __stdcall    SHQueryValueExA(HKEY hkey, LPCSTR pszValue, DWORD *pdwReserved, DWORD *pdwType, void *pvData, DWORD *pcbData);
-extern "C" __declspec(dllimport) DWORD __stdcall    SHQueryValueExW(HKEY hkey, LPCWSTR pszValue, DWORD *pdwReserved, DWORD *pdwType, void *pvData, DWORD *pcbData);
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) LONG __stdcall     SHEnumKeyExA(HKEY hkey, DWORD dwIndex, LPSTR pszName, LPDWORD pcchName);
-extern "C" __declspec(dllimport) LONG __stdcall     SHEnumKeyExW(HKEY hkey, DWORD dwIndex, LPWSTR pszName, LPDWORD pcchName);
-extern "C" __declspec(dllimport) LONG __stdcall     SHEnumValueA(HKEY hkey, DWORD dwIndex, LPSTR pszValueName, LPDWORD pcchValueName, LPDWORD pdwType, void *pvData, LPDWORD pcbData);
-extern "C" __declspec(dllimport) LONG __stdcall     SHEnumValueW(HKEY hkey, DWORD dwIndex, LPWSTR pszValueName, LPDWORD pcchValueName, LPDWORD pdwType, void *pvData, LPDWORD pcbData);
-extern "C" __declspec(dllimport) LONG __stdcall     SHQueryInfoKeyA(HKEY hkey, LPDWORD pcSubKeys, LPDWORD pcchMaxSubKeyLen, LPDWORD pcValues, LPDWORD pcchMaxValueNameLen);
-extern "C" __declspec(dllimport) LONG __stdcall     SHQueryInfoKeyW(HKEY hkey, LPDWORD pcSubKeys, LPDWORD pcchMaxSubKeyLen, LPDWORD pcValues, LPDWORD pcchMaxValueNameLen);
-
-
-extern "C" __declspec(dllimport) DWORD __stdcall     SHCopyKeyA(HKEY hkeySrc, LPCSTR   szSrcSubKey, HKEY hkeyDest, DWORD fReserved);
-extern "C" __declspec(dllimport) DWORD __stdcall     SHCopyKeyW(HKEY hkeySrc, LPCWSTR wszSrcSubKey, HKEY hkeyDest, DWORD fReserved);
-
-
-
-extern "C" __declspec(dllimport) DWORD __stdcall    SHRegGetPathA(HKEY hKey, LPCSTR pcszSubKey, LPCSTR pcszValue, LPSTR pszPath, DWORD dwFlags);
-extern "C" __declspec(dllimport) DWORD __stdcall    SHRegGetPathW(HKEY hKey, LPCWSTR pcszSubKey, LPCWSTR pcszValue, LPWSTR pszPath, DWORD dwFlags);
-extern "C" __declspec(dllimport) DWORD __stdcall    SHRegSetPathA(HKEY hKey, LPCSTR pcszSubKey, LPCSTR pcszValue, LPCSTR pcszPath, DWORD dwFlags);
-extern "C" __declspec(dllimport) DWORD __stdcall    SHRegSetPathW(HKEY hKey, LPCWSTR pcszSubKey, LPCWSTR pcszValue, LPCWSTR pcszPath, DWORD dwFlags);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef enum
-{
-    SHREGDEL_DEFAULT = 0x00000000,       
-    SHREGDEL_HKCU    = 0x00000001,       
-    SHREGDEL_HKLM    = 0x00000010,       
-    SHREGDEL_BOTH    = 0x00000011,       
-} SHREGDEL_FLAGS;
-
-typedef enum
-{
-    SHREGENUM_DEFAULT = 0x00000000,       
-    SHREGENUM_HKCU    = 0x00000001,       
-    SHREGENUM_HKLM    = 0x00000010,       
-    SHREGENUM_BOTH    = 0x00000011,       
-                                          
-} SHREGENUM_FLAGS;
-
-
-
-
-
-
-
-typedef HANDLE HUSKEY;  
-typedef HUSKEY *PHUSKEY;
-
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegCreateUSKeyA(LPCSTR pszPath, REGSAM samDesired, HUSKEY hRelativeUSKey, PHUSKEY phNewUSKey, DWORD dwFlags);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegCreateUSKeyW(LPCWSTR pwzPath, REGSAM samDesired, HUSKEY hRelativeUSKey, PHUSKEY phNewUSKey, DWORD dwFlags);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegOpenUSKeyA(LPCSTR pszPath, REGSAM samDesired, HUSKEY hRelativeUSKey, PHUSKEY phNewUSKey, BOOL fIgnoreHKCU);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegOpenUSKeyW(LPCWSTR pwzPath, REGSAM samDesired, HUSKEY hRelativeUSKey, PHUSKEY phNewUSKey, BOOL fIgnoreHKCU);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegQueryUSValueA(HUSKEY hUSKey, LPCSTR pszValue, LPDWORD pdwType, void *pvData, LPDWORD pcbData, BOOL fIgnoreHKCU, void *pvDefaultData, DWORD dwDefaultDataSize);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegQueryUSValueW(HUSKEY hUSKey, LPCWSTR pwzValue, LPDWORD pdwType, void *pvData, LPDWORD pcbData, BOOL fIgnoreHKCU, void *pvDefaultData, DWORD dwDefaultDataSize);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegWriteUSValueA(HUSKEY hUSKey, LPCSTR pszValue, DWORD dwType, const void *pvData, DWORD cbData, DWORD dwFlags);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegWriteUSValueW(HUSKEY hUSKey, LPCWSTR pwzValue, DWORD dwType, const void *pvData, DWORD cbData, DWORD dwFlags);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegDeleteUSValueA(HUSKEY hUSKey, LPCSTR pszValue, SHREGDEL_FLAGS delRegFlags);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegDeleteEmptyUSKeyW(HUSKEY hUSKey, LPCWSTR pwzSubKey, SHREGDEL_FLAGS delRegFlags);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegDeleteEmptyUSKeyA(HUSKEY hUSKey, LPCSTR pszSubKey, SHREGDEL_FLAGS delRegFlags);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegDeleteUSValueW(HUSKEY hUSKey, LPCWSTR pwzValue, SHREGDEL_FLAGS delRegFlags);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegEnumUSKeyA(HUSKEY hUSKey, DWORD dwIndex, LPSTR pszName, LPDWORD pcchName, SHREGENUM_FLAGS enumRegFlags);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegEnumUSKeyW(HUSKEY hUSKey, DWORD dwIndex, LPWSTR pwzName, LPDWORD pcchName, SHREGENUM_FLAGS enumRegFlags);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegEnumUSValueA(HUSKEY hUSkey, DWORD dwIndex, LPSTR pszValueName, LPDWORD pcchValueName, LPDWORD pdwType, void *pvData, LPDWORD pcbData, SHREGENUM_FLAGS enumRegFlags);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegEnumUSValueW(HUSKEY hUSkey, DWORD dwIndex, LPWSTR pszValueName, LPDWORD pcchValueName, LPDWORD pdwType, void *pvData, LPDWORD pcbData, SHREGENUM_FLAGS enumRegFlags);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegQueryInfoUSKeyA(HUSKEY hUSKey, LPDWORD pcSubKeys, LPDWORD pcchMaxSubKeyLen, LPDWORD pcValues, LPDWORD pcchMaxValueNameLen, SHREGENUM_FLAGS enumRegFlags);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegQueryInfoUSKeyW(HUSKEY hUSKey, LPDWORD pcSubKeys, LPDWORD pcchMaxSubKeyLen, LPDWORD pcValues, LPDWORD pcchMaxValueNameLen, SHREGENUM_FLAGS enumRegFlags);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegCloseUSKey(HUSKEY hUSKey);
-
-
-
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegGetUSValueA(LPCSTR pszSubKey, LPCSTR pszValue, LPDWORD pdwType, void * pvData, LPDWORD pcbData, BOOL fIgnoreHKCU, void *pvDefaultData, DWORD dwDefaultDataSize);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegGetUSValueW(LPCWSTR pwzSubKey, LPCWSTR pwzValue, LPDWORD pdwType, void * pvData, LPDWORD pcbData, BOOL fIgnoreHKCU, void *pvDefaultData, DWORD dwDefaultDataSize);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegSetUSValueA(LPCSTR pszSubKey, LPCSTR pszValue, DWORD dwType, const void *pvData, DWORD cbData, DWORD dwFlags);
-extern "C" __declspec(dllimport) LONG __stdcall        SHRegSetUSValueW(LPCWSTR pwzSubKey, LPCWSTR pwzValue, DWORD dwType, const void *pvData, DWORD cbData, DWORD dwFlags);
-extern "C" __declspec(dllimport) int __stdcall         SHRegGetIntW(HKEY hk, LPCWSTR pwzKey, int iDefault);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall SHRegGetBoolUSValueA(LPCSTR pszSubKey, LPCSTR pszValue, BOOL fIgnoreHKCU, BOOL fDefault);
-extern "C" __declspec(dllimport) BOOL __stdcall SHRegGetBoolUSValueW(LPCWSTR pszSubKey, LPCWSTR pszValue, BOOL fIgnoreHKCU, BOOL fDefault);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-enum {
-    ASSOCF_INIT_NOREMAPCLSID           = 0x00000001,  
-    ASSOCF_INIT_BYEXENAME              = 0x00000002,  
-    ASSOCF_OPEN_BYEXENAME              = 0x00000002,  
-    ASSOCF_INIT_DEFAULTTOSTAR          = 0x00000004,  
-    ASSOCF_INIT_DEFAULTTOFOLDER        = 0x00000008,  
-    ASSOCF_NOUSERSETTINGS              = 0x00000010,  
-    ASSOCF_NOTRUNCATE                  = 0x00000020,  
-    ASSOCF_VERIFY                      = 0x00000040,  
-    ASSOCF_REMAPRUNDLL                 = 0x00000080,  
-    ASSOCF_NOFIXUPS                    = 0x00000100,  
-    ASSOCF_IGNOREBASECLASS             = 0x00000200,  
-};
-
-typedef DWORD ASSOCF;
-
-
-typedef enum {
-    ASSOCSTR_COMMAND      = 1,  
-    ASSOCSTR_EXECUTABLE,        
-    ASSOCSTR_FRIENDLYDOCNAME,   
-    ASSOCSTR_FRIENDLYAPPNAME,   
-    ASSOCSTR_NOOPEN,            
-    ASSOCSTR_SHELLNEWVALUE,     
-    ASSOCSTR_DDECOMMAND,        
-    ASSOCSTR_DDEIFEXEC,         
-    ASSOCSTR_DDEAPPLICATION,    
-    ASSOCSTR_DDETOPIC,          
-    ASSOCSTR_INFOTIP,           
-    ASSOCSTR_QUICKTIP,          
-    ASSOCSTR_TILEINFO,          
-    ASSOCSTR_CONTENTTYPE,       
-    ASSOCSTR_DEFAULTICON,       
-    ASSOCSTR_SHELLEXTENSION,    
-    ASSOCSTR_MAX                
-} ASSOCSTR;
-
-typedef enum {
-    ASSOCKEY_SHELLEXECCLASS = 1,  
-    ASSOCKEY_APP,                 
-    ASSOCKEY_CLASS,               
-    ASSOCKEY_BASECLASS,           
-    ASSOCKEY_MAX                  
-} ASSOCKEY;
-
-typedef enum {
-    ASSOCDATA_MSIDESCRIPTOR = 1,  
-    ASSOCDATA_NOACTIVATEHANDLER,  
-    ASSOCDATA_QUERYCLASSSTORE,    
-    ASSOCDATA_HASPERUSERASSOC,    
-    ASSOCDATA_EDITFLAGS,          
-    ASSOCDATA_VALUE,              
-    ASSOCDATA_MAX
-} ASSOCDATA;
-
-typedef enum {
-    ASSOCENUM_NONE
-} ASSOCENUM;
-
-
-
-
-struct __declspec(novtable) IQueryAssociations : public IUnknown
-{
-    
-    virtual HRESULT __stdcall QueryInterface( const IID & riid, void **ppv) = 0;
-    virtual ULONG __stdcall AddRef ( void ) = 0;
-    virtual ULONG __stdcall Release ( void ) = 0;
-
-    
-    virtual HRESULT __stdcall Init( ASSOCF flags, LPCWSTR pszAssoc, HKEY hkProgid, HWND hwnd) = 0;
-    virtual HRESULT __stdcall GetString( ASSOCF flags, ASSOCSTR str, LPCWSTR pszExtra, LPWSTR pszOut, DWORD *pcchOut) = 0;
-    virtual HRESULT __stdcall GetKey( ASSOCF flags, ASSOCKEY key, LPCWSTR pszExtra, HKEY *phkeyOut) = 0;
-    virtual HRESULT __stdcall GetData( ASSOCF flags, ASSOCDATA data, LPCWSTR pszExtra, LPVOID pvOut, DWORD *pcbOut) = 0;
-    virtual HRESULT __stdcall GetEnum( ASSOCF flags, ASSOCENUM assocenum, LPCWSTR pszExtra, const IID & riid, LPVOID *ppvOut) = 0;
-};
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall AssocCreate(CLSID clsid, const IID & riid, LPVOID *ppv);
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall AssocQueryStringA(ASSOCF flags, ASSOCSTR str, LPCSTR pszAssoc, LPCSTR pszExtra, LPSTR pszOut, DWORD *pcchOut);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall AssocQueryStringW(ASSOCF flags, ASSOCSTR str, LPCWSTR pszAssoc, LPCWSTR pszExtra, LPWSTR pszOut, DWORD *pcchOut);
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall AssocQueryStringByKeyA(ASSOCF flags, ASSOCSTR str, HKEY hkAssoc, LPCSTR pszExtra, LPSTR pszOut, DWORD *pcchOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall AssocQueryStringByKeyW(ASSOCF flags, ASSOCSTR str, HKEY hkAssoc, LPCWSTR pszExtra, LPWSTR pszOut, DWORD *pcchOut);
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall AssocQueryKeyA(ASSOCF flags, ASSOCKEY key, LPCSTR pszAssoc, LPCSTR pszExtra, HKEY *phkeyOut);
-extern "C" __declspec(dllimport) HRESULT __stdcall AssocQueryKeyW(ASSOCF flags, ASSOCKEY key, LPCWSTR pszAssoc, LPCWSTR pszExtra, HKEY *phkeyOut);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) struct IStream * __stdcall SHOpenRegStreamA(HKEY hkey, LPCSTR pszSubkey, LPCSTR pszValue, DWORD grfMode);
-extern "C" __declspec(dllimport) struct IStream * __stdcall SHOpenRegStreamW(HKEY hkey, LPCWSTR pszSubkey, LPCWSTR pszValue, DWORD grfMode);
-
-
-
-
-
-extern "C" __declspec(dllimport) struct IStream * __stdcall SHOpenRegStream2A(HKEY hkey, LPCSTR pszSubkey, LPCSTR pszValue, DWORD grfMode);
-extern "C" __declspec(dllimport) struct IStream * __stdcall SHOpenRegStream2W(HKEY hkey, LPCWSTR pszSubkey, LPCWSTR pszValue, DWORD grfMode);
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall SHCreateStreamOnFileA(LPCSTR pszFile, DWORD grfMode, struct IStream **ppstm);
-extern "C" __declspec(dllimport) HRESULT __stdcall SHCreateStreamOnFileW(LPCWSTR pszFile, DWORD grfMode, struct IStream **ppstm);
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall SHCreateStreamOnFileEx(LPCWSTR pszFile, DWORD grfMode, DWORD dwAttributes, BOOL fCreate, struct IStream * pstmTemplate, struct IStream **ppstm);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall SHAutoComplete(HWND hwndEdit, DWORD dwFlags);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall SHSetThreadRef(IUnknown *punk);
-extern "C" __declspec(dllimport) HRESULT __stdcall SHGetThreadRef(IUnknown **ppunk);
-
-extern "C" __declspec(dllimport) BOOL __stdcall SHSkipJunction(struct IBindCtx* pbc, const CLSID *pclsid);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) BOOL __stdcall SHCreateThread(LPTHREAD_START_ROUTINE pfnThreadProc, void *pData, DWORD dwFlags, LPTHREAD_START_ROUTINE pfnCallback);
-
-extern "C" __declspec(dllimport) HRESULT __stdcall SHReleaseThreadRef(); 
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HPALETTE __stdcall SHCreateShellPalette(HDC hdc);
-
-
-
-extern "C" __declspec(dllimport) void __stdcall     ColorRGBToHLS(COLORREF clrRGB, WORD* pwHue, WORD* pwLuminance, WORD* pwSaturation);
-extern "C" __declspec(dllimport) COLORREF __stdcall ColorHLSToRGB(WORD wHue, WORD wLuminance, WORD wSaturation);
-extern "C" __declspec(dllimport) COLORREF __stdcall ColorAdjustLuma(COLORREF clrRGB, int n, BOOL fScale);
-
-
-
-
-
-
-
-
-
-
-
-typedef struct _DLLVERSIONINFO
-{
-    DWORD cbSize;
-    DWORD dwMajorVersion;                   
-    DWORD dwMinorVersion;                   
-    DWORD dwBuildNumber;                    
-    DWORD dwPlatformID;                     
-} DLLVERSIONINFO;
-
-
-
-
-
-
-
-typedef struct _DLLVERSIONINFO2
-{
-    DLLVERSIONINFO info1;
-    DWORD dwFlags;                          
-    ULONGLONG ullVersion;                   
-                                            
-                                            
-                                            
-                                            
-} DLLVERSIONINFO2;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-typedef HRESULT (__stdcall* DLLGETVERSIONPROC)(DLLVERSIONINFO *);
-
-
-extern "C" HRESULT __stdcall DllInstall(BOOL bInstall, LPCWSTR pszCmdLine);
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning(disable:4103)
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma pack(push, 8)
-
-
-
-
-	#pragma comment(lib, "atl.lib")
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    #pragma comment(linker,"/manifestdependency:\"type='win32' "        \
-        "name='" "Microsoft.VC80" ".ATL' "              \
-        "version='" "8.0.50727.4053" "' "                          \
-        "processorArchitecture='x86' "                                  \
-        "publicKeyToken='" "1fc8b3b9a1e18e3b" "'\"")
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-	#pragma comment(lib, "atlsd.lib")
-
-
-
-
-
-
-
-
-
-
-	
-
-
-
-
-
-
-		
-			#pragma comment(linker, "/include:__forceAtlDllManifest")
-		
-
-
-	
-
-
-extern "C" const __declspec(selectany) GUID LIBID_ATLLib = 					 {0x44EC0535,0x400F,0x11D0,{0x9D,0xCD,0x00,0xA0,0xC9,0x03,0x91,0xD3}};
-extern "C" const __declspec(selectany) CLSID CLSID_Registrar = 				 {0x44EC053A,0x400F,0x11D0,{0x9D,0xCD,0x00,0xA0,0xC9,0x03,0x91,0xD3}};
-extern "C" const __declspec(selectany) IID IID_IRegistrar = 				 {0x44EC053B,0x400F,0x11D0,{0x9D,0xCD,0x00,0xA0,0xC9,0x03,0x91,0xD3}};
-extern "C" const __declspec(selectany) IID IID_IAxWinHostWindow = 			 {0xb6ea2050,0x048a,0x11d1,{0x82,0xb9,0x00,0xc0,0x4f,0xb9,0x94,0x2e}};
-extern "C" const __declspec(selectany) IID IID_IAxWinAmbientDispatch = 		 {0xb6ea2051,0x048a,0x11d1,{0x82,0xb9,0x00,0xc0,0x4f,0xb9,0x94,0x2e}};
-extern "C" const __declspec(selectany) IID IID_IInternalConnection = 		 {0x72AD0770,0x6A9F,0x11d1,{0xBC,0xEC,0x00,0x60,0x08,0x8F,0x44,0x4E}};
-extern "C" const __declspec(selectany) IID IID_IDocHostUIHandlerDispatch = 	 {0x425B5AF0,0x65F1,0x11d1,{0x96,0x11,0x00,0x00,0xF8,0x1E,0x0D,0x0D}};
-extern "C" const __declspec(selectany) IID IID_IAxWinHostWindowLic = 		 {0x3935BDA8,0x4ED9,0x495c,{0x86,0x50,0xE0,0x1F,0xC1,0xE3,0x8A,0x4B}};
-extern "C" const __declspec(selectany) IID IID_IAxWinAmbientDispatchEx = 	 {0xB2D0778B,0xAC99,0x4c58,{0xA5,0xC8,0xE7,0x72,0x4E,0x53,0x16,0xB5}};
-
-
-
-extern "C" IMAGE_DOS_HEADER __ImageBase;
-
-
-
-
-
-
-
-
- 
-namespace ATL
-{
-
-struct _ATL_CATMAP_ENTRY
-{
-   int iType;
-   const CATID* pcatid;
-};
-
-
-
-
-
-typedef HRESULT (__stdcall _ATL_CREATORFUNC)(void* pv, const IID & riid, LPVOID* ppv);
-typedef HRESULT (__stdcall _ATL_CREATORARGFUNC)(void* pv, const IID & riid, LPVOID* ppv, DWORD_PTR dw);
-typedef HRESULT (__stdcall _ATL_MODULEFUNC)(DWORD_PTR dw);
-typedef LPCTSTR (__stdcall _ATL_DESCRIPTIONFUNC)();
-typedef const struct _ATL_CATMAP_ENTRY* (_ATL_CATMAPFUNC)();
-typedef void (__stdcall _ATL_TERMFUNC)(DWORD_PTR dw);
-
-struct _ATL_TERMFUNC_ELEM
-{
-	_ATL_TERMFUNC* pFunc;
-	DWORD_PTR dw;
-	_ATL_TERMFUNC_ELEM* pNext;
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct _ATL_OBJMAP_ENTRY30 
-{
-	const CLSID* pclsid;
-	HRESULT (__stdcall *pfnUpdateRegistry)(BOOL bRegister);
-	_ATL_CREATORFUNC* pfnGetClassObject;
-	_ATL_CREATORFUNC* pfnCreateInstance;
-	IUnknown* pCF;
-	DWORD dwRegister;
-	_ATL_DESCRIPTIONFUNC* pfnGetObjectDescription;
-	_ATL_CATMAPFUNC* pfnGetCategoryMap;
-	HRESULT __stdcall RevokeClassObject()
-	{
-		if (dwRegister == 0)
-			return ((HRESULT)0x00000000L);
-		return CoRevokeClassObject(dwRegister);
-	}
-	HRESULT __stdcall RegisterClassObject(DWORD dwClsContext, DWORD dwFlags)
-	{
-		IUnknown* p = 0;
-		if (pfnGetClassObject == 0)
-			return ((HRESULT)0x00000000L);
-		HRESULT hRes = pfnGetClassObject(pfnCreateInstance, __uuidof(IUnknown), (LPVOID*) &p);
-		if (((HRESULT)(hRes) >= 0))
-			hRes = CoRegisterClassObject(*pclsid, p, dwClsContext, dwFlags, &dwRegister);
-		if (p != 0)
-			p->Release();
-		return hRes;
-	}
-
-	void (__stdcall *pfnObjectMain)(bool bStarting);
-};
-
-typedef _ATL_OBJMAP_ENTRY30 _ATL_OBJMAP_ENTRY;
-
-
-
-
-
-#pragma section("ATL$__a", read, shared)
-#pragma section("ATL$__z", read, shared)
-#pragma section("ATL$__m", read, shared)
-extern "C"
-{
-__declspec(selectany) __declspec(allocate("ATL$__a")) _ATL_OBJMAP_ENTRY* __pobjMapEntryFirst = 0;
-__declspec(selectany) __declspec(allocate("ATL$__z")) _ATL_OBJMAP_ENTRY* __pobjMapEntryLast = 0;
-}
-
-
-#pragma comment(linker, "/merge:ATL=.rdata")
-
-
-
-
-
-
-
-
-
-
-
-
-struct _ATL_REGMAP_ENTRY
-{
-	LPCOLESTR     szKey;
-	LPCOLESTR     szData;
-};
-
-struct _AtlCreateWndData
-{
-	void* m_pThis;
-	DWORD m_dwThreadID;
-	_AtlCreateWndData* m_pNext;
-};
-
-
-
-typedef HRESULT (*_ATL_PERFREGFUNC)(HINSTANCE hDllInstance);
-typedef HRESULT (*_ATL_PERFUNREGFUNC)();
-__declspec(selectany) _ATL_PERFREGFUNC _pPerfRegFunc = 0;
-__declspec(selectany) _ATL_PERFUNREGFUNC _pPerfUnRegFunc = 0;
-
-
-
-
-template< class TLock >
-class CComCritSecLock
-{
-public:
-	CComCritSecLock( TLock& cs, bool bInitialLock = true );
-	~CComCritSecLock() throw();
-
-	HRESULT Lock() throw();
-	void Unlock() throw();
-
-
-private:
-	TLock& m_cs;
-	bool m_bLocked;
-
-
-	CComCritSecLock( const CComCritSecLock& ) throw();
-	CComCritSecLock& operator=( const CComCritSecLock& ) throw();
-};
-
-template< class TLock >
-inline CComCritSecLock< TLock >::CComCritSecLock( TLock& cs, bool bInitialLock ) :
-	m_cs( cs ),
-	m_bLocked( false )
-{
-	if( bInitialLock )
-	{
-		HRESULT hr;
-
-		hr = Lock();
-		if( ((HRESULT)(hr) < 0) )
-		{
-			ATL::AtlThrowImpl( hr );
-		}
-	}
-}
-
-template< class TLock >
-inline CComCritSecLock< TLock >::~CComCritSecLock() throw()
-{
-	if( m_bLocked )
-	{
-		Unlock();
-	}
-}
-
-template< class TLock >
-inline HRESULT CComCritSecLock< TLock >::Lock() throw()
-{
-	HRESULT hr;
-
-	(void) ((!!((!m_bLocked))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 342, 0, L"!m_bLocked")) || (__debugbreak(), 0));
-	hr = m_cs.Lock();
-	if( ((HRESULT)(hr) < 0) )
-	{
-		return( hr );
-	}
-	m_bLocked = true;
-
-	return( ((HRESULT)0x00000000L) );
-}
-
-template< class TLock >
-inline void CComCritSecLock< TLock >::Unlock() throw()
-{
-	do { (void) ((!!((m_bLocked))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 356, 0, L"m_bLocked")) || (__debugbreak(), 0)); ; } while(0);
-	m_cs.Unlock();
-	m_bLocked = false;
-}
-
-class CComMultiThreadModelNoCS
-{
-public:
-	static ULONG __stdcall Increment(LPLONG p) throw() {return InterlockedIncrement(p);}
-	static ULONG __stdcall Decrement(LPLONG p) throw() {return InterlockedDecrement(p);}
-	typedef CComFakeCriticalSection AutoCriticalSection;
-	typedef CComFakeCriticalSection AutoDeleteCriticalSection;
-	typedef CComFakeCriticalSection CriticalSection;
-	typedef CComMultiThreadModelNoCS ThreadModelNoCS;
-};
-
-class CComMultiThreadModel
-{
-public:
-	static ULONG __stdcall Increment(LPLONG p) throw() {return InterlockedIncrement(p);}
-	static ULONG __stdcall Decrement(LPLONG p) throw() {return InterlockedDecrement(p);}
-	typedef CComAutoCriticalSection AutoCriticalSection;
-	typedef CComAutoDeleteCriticalSection AutoDeleteCriticalSection;
-	typedef CComCriticalSection CriticalSection;
-	typedef CComMultiThreadModelNoCS ThreadModelNoCS;
-};
-
-class CComSingleThreadModel
-{
-public:
-	static ULONG __stdcall Increment(LPLONG p) throw() {return ++(*p);}
-	static ULONG __stdcall Decrement(LPLONG p) throw() {return --(*p);}
-	typedef CComFakeCriticalSection AutoCriticalSection;
-	typedef CComFakeCriticalSection AutoDeleteCriticalSection;
-	typedef CComFakeCriticalSection CriticalSection;
-	typedef CComSingleThreadModel ThreadModelNoCS;
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-	typedef CComSingleThreadModel CComObjectThreadModel;
-	typedef CComMultiThreadModel CComGlobalsThreadModel;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct _ATL_COM_MODULE70
-{
-	UINT cbSize;
-	HINSTANCE m_hInstTypeLib;
-	_ATL_OBJMAP_ENTRY** m_ppAutoObjMapFirst;
-	_ATL_OBJMAP_ENTRY** m_ppAutoObjMapLast;
-	CComCriticalSection m_csObjMap;
-};
-typedef _ATL_COM_MODULE70 _ATL_COM_MODULE;
-
-
-
-struct _ATL_WIN_MODULE70
-{
-	UINT cbSize;
-	CComCriticalSection m_csWindowCreate;
-	_AtlCreateWndData* m_pCreateWndList;
-	CSimpleArray<ATOM> m_rgWindowClassAtoms;
-};
-typedef _ATL_WIN_MODULE70 _ATL_WIN_MODULE;
-
-
-struct _ATL_MODULE70
-{
-	UINT cbSize;
-	LONG m_nLockCnt;
-	_ATL_TERMFUNC_ELEM* m_pTermFuncs;
-	CComCriticalSection m_csStaticDataInitAndTypeInfo;
-};
-typedef _ATL_MODULE70 _ATL_MODULE;
-
-
-
-
-
-
-struct _ATL_INTMAP_ENTRY
-{
-	const IID* piid;       
-	DWORD_PTR dw;
-	_ATL_CREATORARGFUNC* pFunc; 
-};
-
-
-
-
-
-
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlInternalQueryInterface(void* pThis,
-	const _ATL_INTMAP_ENTRY* pEntries, const IID & iid, void** ppvObject);
-
-
-
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlFreeMarshalStream(IStream* pStream);
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlMarshalPtrInProc(IUnknown* pUnk, const IID& iid, IStream** ppStream);
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlUnmarshalPtr(IStream* pStream, const IID& iid, IUnknown** ppUnk);
-
-extern "C" __declspec(dllimport) BOOL __stdcall AtlWaitWithMessageLoop(HANDLE hEvent);
-
-
-
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlAdvise(IUnknown* pUnkCP, IUnknown* pUnk, const IID& iid, LPDWORD pdw);
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlUnadvise(IUnknown* pUnkCP, const IID& iid, DWORD dw);
-
-
-
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlSetErrorInfo(const CLSID& clsid, LPCOLESTR lpszDesc,
-	DWORD dwHelpID, LPCOLESTR lpszHelpFile, const IID& iid, HRESULT hRes,
-	HINSTANCE hInst);
-
-
-
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlComModuleRegisterClassObjects(_ATL_COM_MODULE* pComModule, DWORD dwClsContext, DWORD dwFlags);
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlComModuleRevokeClassObjects(_ATL_COM_MODULE* pComModule);
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlComModuleGetClassObject(_ATL_COM_MODULE* pComModule, const IID & rclsid, const IID & riid, LPVOID* ppv);
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlComModuleRegisterServer(_ATL_COM_MODULE* pComModule, BOOL bRegTypeLib, const CLSID* pCLSID = 0);
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlComModuleUnregisterServer(_ATL_COM_MODULE* pComModule, BOOL bUnRegTypeLib, const CLSID* pCLSID = 0);
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlRegisterClassCategoriesHelper( const IID & clsid, const struct _ATL_CATMAP_ENTRY* pCatMap, BOOL bRegister );
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlUpdateRegistryFromResourceD(HINSTANCE hInst, LPCOLESTR lpszRes,
-	BOOL bRegister, struct _ATL_REGMAP_ENTRY* pMapEntries, IRegistrar* pReg = 0);
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlRegisterTypeLib(HINSTANCE hInstTypeLib, LPCOLESTR lpszIndex);
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlUnRegisterTypeLib(HINSTANCE hInstTypeLib, LPCOLESTR lpszIndex);
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlLoadTypeLib(HINSTANCE hInstTypeLib, LPCOLESTR lpszIndex, BSTR* pbstrPath, ITypeLib** ppTypeLib);
-
-extern "C" __declspec(dllimport) DWORD __stdcall AtlGetVersion(void* pReserved);
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlModuleAddTermFunc(_ATL_MODULE* pModule, _ATL_TERMFUNC* pFunc, DWORD_PTR dw);
-extern "C" __declspec(dllimport) void __stdcall AtlCallTermFunc(_ATL_MODULE* pModule);
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlWinModuleInit(_ATL_WIN_MODULE* pWinModule);
-extern "C" inline HRESULT __stdcall AtlWinModuleTerm(_ATL_WIN_MODULE* pWinModule, HINSTANCE hInst);
-
-extern "C" __declspec(dllimport) void __stdcall AtlWinModuleAddCreateWndData(_ATL_WIN_MODULE* pWinModule, _AtlCreateWndData* pData, void* pObject);
-extern "C" __declspec(dllimport) void* __stdcall AtlWinModuleExtractCreateWndData(_ATL_WIN_MODULE* pWinModule);
-
-
-
-
-
-
-
-
-extern "C" __declspec(dllimport) HRESULT __stdcall AtlCreateRegistrar(IRegistrar** ppReg);
-
-
-
-
-
-inline BOOL __stdcall InlineIsEqualUnknown(const GUID & rguid1)
-{
-   return (
-	  ((PLONG) &rguid1)[0] == 0 &&
-	  ((PLONG) &rguid1)[1] == 0 &&
-
-
-
-
-	  ((PLONG) &rguid1)[2] == 0x000000C0 &&
-	  ((PLONG) &rguid1)[3] == 0x46000000);
-
-}
-
-
-
-template <class T>
-LPCTSTR AtlDebugGetClassName(T*)
-{
-
-	const _ATL_INTMAP_ENTRY* pEntries = T::_GetEntries();
-	return (LPCTSTR)pEntries[-1].dw;
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma comment(lib, "kernel32.lib")
-#pragma comment(lib, "user32.lib")
-#pragma comment(lib, "advapi32.lib")
-#pragma comment(lib, "ole32.lib")
-#pragma comment(lib, "shell32.lib")
-#pragma comment(lib, "oleaut32.lib")
-#pragma comment(lib, "uuid.lib")
-#pragma comment(lib, "shlwapi.lib")
-
-
-template< typename T >
-class CAutoVectorPtr
-{
-public:
-	CAutoVectorPtr() throw() :
-		m_p( 0 )
-	{
-	}
-	CAutoVectorPtr( CAutoVectorPtr< T >& p ) throw()
-	{
-		m_p = p.Detach();  
-	}
-	explicit CAutoVectorPtr( T* p ) throw() :
-		m_p( p )
-	{
-	}
-	~CAutoVectorPtr() throw()
-	{
-		Free();
-	}
-
-	operator T*() const throw()
-	{
-		return( m_p );
-	}
-
-	CAutoVectorPtr< T >& operator=( CAutoVectorPtr< T >& p ) throw()
-	{
-        if(*this==p)
-        {
-            if(this!=&p)
-            {
-                
-                
-                
-                (void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 634, 0, L"0")) || (__debugbreak(), 0));
-
-                
-                
-                p.Detach();
-            }
-            else
-            {
-                
-                
-
-                
-            }
-        }
-        else
-        {
-		    Free();
-		    Attach( p.Detach() );  
-        }
-		return( *this );
-	}
-
-    
-    bool operator!=(CAutoVectorPtr<T>& p) const
-    {
-        return !operator==(p);
-    }
-
-    bool operator==(CAutoVectorPtr<T>& p) const
-    {
-        return m_p==p.m_p;
-    }
-
-	
-	bool Allocate( size_t nElements ) throw()
-	{
-		do { (void) ((!!((m_p == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 670, 0, L"m_p == 0")) || (__debugbreak(), 0)); ; } while(0);
-		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{m_p = new T[nElements];} catch(...) {} __pragma(warning(pop));
-		if( m_p == 0 )
-		{
-			return( false );
-		}
-
-		return( true );
-	}
-	
-	void Attach( T* p ) throw()
-	{
-		do { (void) ((!!((m_p == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 682, 0, L"m_p == 0")) || (__debugbreak(), 0)); ; } while(0);
-		m_p = p;
-	}
-	
-	T* Detach() throw()
-	{
-		T* p;
-
-		p = m_p;
-		m_p = 0;
-
-		return( p );
-	}
-	
-	void Free() throw()
-	{
-		delete[] m_p;
-		m_p = 0;
-	}
-
-public:
-	T* m_p;
-};
-
-template< typename T >
-class CAutoPtr
-{
-public:
-	CAutoPtr() throw() :
-		m_p( 0 )
-	{
-	}
-	template< typename TSrc >
-	CAutoPtr( CAutoPtr< TSrc >& p ) throw()
-	{
-		m_p = p.Detach();  
-	}
-	CAutoPtr( CAutoPtr< T >& p ) throw()
-	{
-		m_p = p.Detach();  
-	}
-	explicit CAutoPtr( T* p ) throw() :
-		m_p( p )
-	{
-	}
-	~CAutoPtr() throw()
-	{
-		Free();
-	}
-
-	
-	template< typename TSrc >
-	CAutoPtr< T >& operator=( CAutoPtr< TSrc >& p ) throw()
-	{
-        if(m_p==p.m_p)
-        {
-            
-            
-            (void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 740, 0, L"0")) || (__debugbreak(), 0));
-        }
-        else
-        {
-		    Free();
-		    Attach( p.Detach() );  
-        }
-		return( *this );
-	}
-	CAutoPtr< T >& operator=( CAutoPtr< T >& p ) throw()
-	{
-        if(*this==p)
-        {
-            if(this!=&p)
-            {
-                
-                
-                
-
-
-
-
-                
-                
-                p.Detach();
-            }
-            else
-            {
-                
-                
-
-                
-            }
-        }
-        else
-        {
-		    Free();
-		    Attach( p.Detach() );  
-        }
-		return( *this );
-	}
-
-    
-    bool operator!=(CAutoPtr<T>& p) const
-    {
-        return !operator==(p);
-    }
-
-    bool operator==(CAutoPtr<T>& p) const
-    {
-        return m_p==p.m_p;
-    }
-
-	operator T*() const throw()
-	{
-		return( m_p );
-	}
-	T* operator->() const throw()
-	{
-		do { (void) ((!!((m_p != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 799, 0, L"m_p != 0")) || (__debugbreak(), 0)); ; } while(0);
-		return( m_p );
-	}
-
-	
-	void Attach( T* p ) throw()
-	{
-		do { (void) ((!!((m_p == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 806, 0, L"m_p == 0")) || (__debugbreak(), 0)); ; } while(0);
-		m_p = p;
-	}
-	
-	T* Detach() throw()
-	{
-		T* p;
-
-		p = m_p;
-		m_p = 0;
-
-		return( p );
-	}
-	
-	void Free() throw()
-	{
-		delete m_p;
-		m_p = 0;
-	}
-
-public:
-	T* m_p;
-};
-
-
-template< typename T >
-class CAutoStackPtr
-{
-public:
-	CAutoStackPtr() throw() :
-		m_p( 0 )
-	{
-	}
-	template< typename TSrc >
-	CAutoStackPtr( CAutoStackPtr< TSrc >& p ) throw()
-	{
-		m_p = p.Detach();  
-	}
-	CAutoStackPtr( CAutoStackPtr< T >& p ) throw()
-	{
-		m_p = p.Detach();  
-	}
-	explicit CAutoStackPtr( T* p ) throw() :
-		m_p( p )
-	{
-	}
-	~CAutoStackPtr() throw()
-	{
-		Free();
-	}
-
-	
-	template< typename TSrc >
-	CAutoStackPtr< T >& operator=( CAutoStackPtr< TSrc >& p ) throw()
-	{
-		if(m_p==p.m_p)
-		{
-			
-			
-			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 865, 0, L"0")) || (__debugbreak(), 0));
-		}
-		else
-		{
-			Free();
-			Attach( p.Detach() );  
-		}
-		return( *this );
-	}
-	CAutoStackPtr< T >& operator=( CAutoStackPtr< T >& p ) throw()
-	{
-        if(*this==p)
-        {
-            if(this!=&p)
-            {
-                
-                
-                
-                (void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 883, 0, L"0")) || (__debugbreak(), 0));
-
-                
-                
-                p.Detach();
-            }
-            else
-            {
-                
-                
-
-                
-            }
-        }
-        else
-        {
-		    Free();
-		    Attach( p.Detach() );  
-        }
-		return( *this );
-	}
-
-    
-    bool operator!=(CAutoStackPtr<T>& p) const
-    {
-        return !operator==(p);
-    }
-
-    bool operator==(CAutoStackPtr<T>& p) const
-    {
-        return m_p==p.m_p;
-    }
-
-	operator T*() const throw()
-	{
-		return( m_p );
-	}
-	T* operator->() const throw()
-	{
-		do { (void) ((!!((m_p != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 922, 0, L"m_p != 0")) || (__debugbreak(), 0)); ; } while(0);
-		return( m_p );
-	}
-
-	
-	void Attach( T* p ) throw()
-	{
-		do { (void) ((!!((m_p == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 929, 0, L"m_p == 0")) || (__debugbreak(), 0)); ; } while(0);
-		m_p = p;
-	}
-	
-	T* Detach() throw()
-	{
-		T* p;
-
-		p = m_p;
-		m_p = 0;
-
-		return( p );
-	}
-	
-	void Free() throw()
-	{
-		
-
-
-
-
-
-		_freea(m_p);
-		m_p = 0;
-	}
-
-public:
-	T* m_p;
-};
-
-
-template< class Dest, class Src >
-Dest* static_cast_auto( const CAutoPtr< Src >& pSrc ) throw()
-{
-	return( static_cast< Dest* >( static_cast< Src* >( pSrc ) ) );
-}
-
-
-class CComAllocator 
-{
-public:
-	static void* Reallocate(void* p, size_t nBytes) throw()
-	{
-
-
-
-
-
-
-		return ::CoTaskMemRealloc(p, ULONG(nBytes));
-	}
-	static void* Allocate(size_t nBytes) throw()
-	{
-
-
-
-
-
-
-		return ::CoTaskMemAlloc(ULONG(nBytes));
-	}
-	static void Free(void* p) throw()
-	{
-		::CoTaskMemFree(p);
-	}
-};
-
-template <typename T>
-class CComHeapPtr :
-	public CHeapPtr<T, CComAllocator>
-{
-public:
-	CComHeapPtr() throw()
-	{
-	}
-
-	explicit CComHeapPtr(T* pData) throw() :
-		CHeapPtr<T, CComAllocator>(pData)
-	{
-	}
-};
-
-template <class T, class Reallocator>
-T* AtlSafeRealloc(T* pT, size_t cEls) throw()
-{
-	T* pTemp;
-
-	size_t nBytes=0;
-	if(((HRESULT)(::ATL::AtlMultiply(&nBytes, cEls, sizeof(T))) < 0))
-	{
-		return 0;
-	}
-	pTemp = static_cast<T*>(Reallocator::Reallocate(pT, nBytes));
-	if (pTemp == 0)
-	{
-		Reallocator::Free(pT);
-		return 0;
-	}
-	pT = pTemp;
-	return pTemp;
-}
-
-class CHandle
-{
-public:
-	CHandle() throw();
-	CHandle( CHandle& h ) throw();
-	explicit CHandle( HANDLE h ) throw();
-	~CHandle() throw();
-
-	CHandle& operator=( CHandle& h ) throw();
-
-	operator HANDLE() const throw();
-
-	
-	void Attach( HANDLE h ) throw();
-	
-	HANDLE Detach() throw();
-
-	
-	void Close() throw();
-
-public:
-	HANDLE m_h;
-};
-
-inline CHandle::CHandle() throw() :
-	m_h( 0 )
-{
-}
-
-inline CHandle::CHandle( CHandle& h ) throw() :
-	m_h( 0 )
-{
-	Attach( h.Detach() );
-}
-
-inline CHandle::CHandle( HANDLE h ) throw() :
-	m_h( h )
-{
-}
-
-inline CHandle::~CHandle() throw()
-{
-	if( m_h != 0 )
-	{
-		Close();
-	}
-}
-
-inline CHandle& CHandle::operator=( CHandle& h ) throw()
-{
-	if( this != &h )
-	{
-		if( m_h != 0 )
-		{
-			Close();
-		}
-		Attach( h.Detach() );
-	}
-
-	return( *this );
-}
-
-inline CHandle::operator HANDLE() const throw()
-{
-	return( m_h );
-}
-
-inline void CHandle::Attach( HANDLE h ) throw()
-{
-	do { (void) ((!!((m_h == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 1100, 0, L"m_h == 0")) || (__debugbreak(), 0)); ; } while(0);
-	m_h = h;  
-}
-
-inline HANDLE CHandle::Detach() throw()
-{
-	HANDLE h;
-
-	h = m_h;  
-	m_h = 0;
-
-	return( h );
-}
-
-inline void CHandle::Close() throw()
-{
-	if( m_h != 0 )
-	{
-		::CloseHandle( m_h );
-		m_h = 0;
-	}
-}
-
-class CCritSecLock
-{
-public:
-	CCritSecLock( CRITICAL_SECTION& cs, bool bInitialLock = true );
-	~CCritSecLock() throw();
-
-	void Lock();
-	void Unlock() throw();
-
-
-private:
-	CRITICAL_SECTION& m_cs;
-	bool m_bLocked;
-
-
-	CCritSecLock( const CCritSecLock& ) throw();
-	CCritSecLock& operator=( const CCritSecLock& ) throw();
-};
-
-inline CCritSecLock::CCritSecLock( CRITICAL_SECTION& cs, bool bInitialLock ) :
-	m_cs( cs ),
-	m_bLocked( false )
-{
-	if( bInitialLock )
-	{
-		Lock();
-	}
-}
-
-inline CCritSecLock::~CCritSecLock() throw()
-{
-	if( m_bLocked )
-	{
-		Unlock();
-	}
-}
-
-inline void CCritSecLock::Lock()
-{
-	(void) ((!!((!m_bLocked))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 1162, 0, L"!m_bLocked")) || (__debugbreak(), 0));
-	__try
-	{
-		::EnterCriticalSection( &m_cs );
-	}
-	__except( ((DWORD )0xC0000017L) == _exception_code() )
-	{
-		ATL::AtlThrowImpl( ((HRESULT)0x8007000EL) );
-	}
-	m_bLocked = true;
-}
-
-inline void CCritSecLock::Unlock() throw()
-{
-	do { (void) ((!!((m_bLocked))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 1176, 0, L"m_bLocked")) || (__debugbreak(), 0)); ; } while(0);
-	::LeaveCriticalSection( &m_cs );
-	m_bLocked = false;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-class CAtlComModule : public _ATL_COM_MODULE
-{
-public:
-
-	CAtlComModule() throw()
-	{
-        cbSize = 0;
-
-		m_hInstTypeLib = reinterpret_cast<HINSTANCE>(&__ImageBase);
-
-		m_ppAutoObjMapFirst = &__pobjMapEntryFirst + 1;
-		m_ppAutoObjMapLast = &__pobjMapEntryLast;
-
-		if (((HRESULT)(m_csObjMap.Init()) < 0))
-		{
-			ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 2302)(atlTraceCOM, 0, L"ERROR : Unable to initialize critical section in CAtlComModule\n");
-			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 2303, 0, L"0")) || (__debugbreak(), 0));
-			CAtlBaseModule::m_bInitFailed = true;
-			return;
-		}
-		
-        cbSize = sizeof(_ATL_COM_MODULE);
-	}
-
-	~CAtlComModule()
-	{
-		Term();
-	}
-
-	
-	void Term()
-	{
-		if (cbSize == 0)
-			return;
-
-		for (_ATL_OBJMAP_ENTRY** ppEntry = m_ppAutoObjMapFirst; ppEntry < m_ppAutoObjMapLast; ppEntry++)
-		{
-			if (*ppEntry != 0)
-			{
-				_ATL_OBJMAP_ENTRY* pEntry = *ppEntry;
-				if (pEntry->pCF != 0)
-					pEntry->pCF->Release();
-				pEntry->pCF = 0;
-			}
-		}
-		m_csObjMap.Term();
-		
-		
-		
-		cbSize = 0;
-	}
-
-	
-	HRESULT RegisterTypeLib()
-	{
-		return AtlRegisterTypeLib(m_hInstTypeLib, 0);
-	}
-	HRESULT RegisterTypeLib(LPCTSTR lpszIndex)
-	{
-		int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
-		LPCOLESTR pwszTemp = 0;
-		if( lpszIndex != 0 )
-		{
-			pwszTemp = T2COLE_EX(lpszIndex, 1024);
-
-
-
-
-		}
-		return AtlRegisterTypeLib(m_hInstTypeLib, pwszTemp);
-	}
-	HRESULT UnRegisterTypeLib()
-	{
-		return AtlUnRegisterTypeLib(m_hInstTypeLib, 0);
-	}
-	HRESULT UnRegisterTypeLib(LPCTSTR lpszIndex)
-	{
-		int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
-		LPCOLESTR pwszTemp = 0;
-		if( lpszIndex != 0 )
-		{
-			pwszTemp = T2COLE_EX(lpszIndex, 1024);
-
-
-
-
-		}
-		return AtlUnRegisterTypeLib(m_hInstTypeLib, pwszTemp);
-	}
-
-	
-	
-	
-	HRESULT RegisterServer(BOOL bRegTypeLib = 0, const CLSID* pCLSID = 0)
-	{
-		return AtlComModuleRegisterServer(this, bRegTypeLib, pCLSID);
-	}
-
-	
-	
-	
-	HRESULT UnregisterServer(BOOL bRegTypeLib = 0, const CLSID* pCLSID = 0)
-	{
-		return AtlComModuleUnregisterServer(this, bRegTypeLib, pCLSID);
-	}
-
-	
-
-	
-	void ExecuteObjectMain(bool bStarting)
-	{
-		for (_ATL_OBJMAP_ENTRY** ppEntry = m_ppAutoObjMapFirst; ppEntry < m_ppAutoObjMapLast; ppEntry++)
-		{
-			if (*ppEntry != 0)
-				(*ppEntry)->pfnObjectMain(bStarting);
-		}
-	}	
-};
-
-extern CAtlComModule _AtlComModule;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-class CAtlWinModule : public _ATL_WIN_MODULE
-{
-public:
-	CAtlWinModule()
-	{
-		cbSize = sizeof(_ATL_WIN_MODULE);
-		HRESULT hr = AtlWinModuleInit(this);
-		if (((HRESULT)(hr) < 0))
-		{
-			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 2629, 0, L"0")) || (__debugbreak(), 0));
-			CAtlBaseModule::m_bInitFailed = true;
-			cbSize = 0;
-			return;
-		}
-	}
-
-	~CAtlWinModule()
-	{
-		Term();
-	}
-
-	void Term()
-	{
-        AtlWinModuleTerm(this, _AtlBaseModule.GetModuleInstance());
-	}
-
-	void AddCreateWndData(_AtlCreateWndData* pData, void* pObject)
-	{
-		AtlWinModuleAddCreateWndData(this, pData, pObject);
-	}
-
-	void* ExtractCreateWndData()
-	{
-		return AtlWinModuleExtractCreateWndData(this);
-	}
-};
-
-extern CAtlWinModule _AtlWinModule;
-
-class CAtlModule;
-__declspec(selectany) CAtlModule* _pAtlModule = 0;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-class __declspec(novtable) CAtlModule : public _ATL_MODULE
-{
-public :
-	static GUID m_libid;
-	IGlobalInterfaceTable* m_pGIT;
-
-	CAtlModule() throw()
-	{
-		
-		
-		(void) ((!!((_pAtlModule == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 2706, 0, L"_pAtlModule == 0")) || (__debugbreak(), 0));
-		cbSize = 0;
-		m_pTermFuncs = 0;
-
-		m_nLockCnt = 0;
-		_pAtlModule = this;
-		m_pGIT = 0;
-
-		if (((HRESULT)(m_csStaticDataInitAndTypeInfo.Init()) < 0))
-		{
-			ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 2716)(atlTraceGeneral, 0, L"ERROR : Unable to initialize critical section in CAtlModule\n");
-			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 2717, 0, L"0")) || (__debugbreak(), 0));
-			CAtlBaseModule::m_bInitFailed = true;
-			return;
-		}
-
-		
-		cbSize = sizeof(_ATL_MODULE);
-	}
-
-	void Term() throw()
-	{
-		
-		if (cbSize == 0)
-			return;
-
-		
-		if (m_pTermFuncs != 0)
-		{
-			AtlCallTermFunc(this);
-			m_pTermFuncs = 0;
-		}
-
-		if (m_pGIT != 0)
-			m_pGIT->Release();
-
-		m_csStaticDataInitAndTypeInfo.Term();
-
-		cbSize = 0;
-	}
-
-	virtual ~CAtlModule() throw()
-	{
-		Term();
-	}
-
-	virtual LONG Lock() throw()
-	{
-		return CComGlobalsThreadModel::Increment(&m_nLockCnt);
-	}
-
-	virtual LONG Unlock() throw()
-	{
-		return CComGlobalsThreadModel::Decrement(&m_nLockCnt);
-	}
-
-	virtual LONG GetLockCount() throw()
-	{
-		return m_nLockCnt;
-	}
-
-	HRESULT AddTermFunc(_ATL_TERMFUNC* pFunc, DWORD_PTR dw) throw()
-	{
-		return AtlModuleAddTermFunc(this, pFunc, dw);
-	}
-
-	virtual HRESULT GetGITPtr(IGlobalInterfaceTable** ppGIT) throw()
-	{
-		(void) ((!!((ppGIT != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 2774, 0, L"ppGIT != 0")) || (__debugbreak(), 0));
-
-		if (ppGIT == 0)
-			return ((HRESULT)0x80004003L);
-
-		HRESULT hr = ((HRESULT)0x00000000L);
-		if (m_pGIT == 0)
-		{
-			hr = ::CoCreateInstance(CLSID_StdGlobalInterfaceTable, 0, CLSCTX_INPROC_SERVER,
-				__uuidof(IGlobalInterfaceTable), (void**)&m_pGIT);
-		}
-
-		if (((HRESULT)(hr) >= 0))
-		{
-			do { (void) ((!!((m_pGIT != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 2788, 0, L"m_pGIT != 0")) || (__debugbreak(), 0)); ; } while(0);
-			*ppGIT = m_pGIT;
-			m_pGIT->AddRef();
-		}
-		return hr;
-	}
-
-	virtual HRESULT AddCommonRGSReplacements(IRegistrarBase* ) throw() = 0;
-
-	
-
-
-
-
-
-
-
-	HRESULT __stdcall UpdateRegistryFromResourceD(LPCTSTR lpszRes, BOOL bRegister,
-		struct _ATL_REGMAP_ENTRY* pMapEntries = 0) throw()
-	{
-		if(lpszRes == 0)
-			return ((HRESULT)0x80070057L);
-		
-		int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
-		LPCOLESTR pwszTemp = T2COLE_EX(lpszRes, 1024);
-
-		if(pwszTemp == 0) 
-			return ((HRESULT)0x8007000EL);
-
-		return UpdateRegistryFromResourceDHelper(pwszTemp, bRegister, pMapEntries);
-	}
-	HRESULT __stdcall UpdateRegistryFromResourceD(UINT nResID, BOOL bRegister,
-		struct _ATL_REGMAP_ENTRY* pMapEntries = 0) throw()
-	{
-		return UpdateRegistryFromResourceDHelper((LPCOLESTR)((LPWSTR)((ULONG_PTR)((WORD)(nResID)))), bRegister, pMapEntries);
-	}
-
-
-	
-
-	inline HRESULT __stdcall UpdateRegistryFromResourceDHelper(LPCOLESTR lpszRes, BOOL bRegister,
-		struct _ATL_REGMAP_ENTRY* pMapEntries = 0) throw()
-	{
-		CComPtr<IRegistrar> spRegistrar;
-		HRESULT hr = AtlCreateRegistrar(&spRegistrar);
-		if (((HRESULT)(hr) < 0))
-			return hr;
-
-		if (0 != pMapEntries)
-		{
-			while (0 != pMapEntries->szKey)
-			{
-				(void) ((!!((0 != pMapEntries->szData))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 2840, 0, L"0 != pMapEntries->szData")) || (__debugbreak(), 0));
-				spRegistrar->AddReplacement(pMapEntries->szKey, pMapEntries->szData);
-				pMapEntries++;
-			}
-		}
-
-		hr = AddCommonRGSReplacements(spRegistrar);
-		if (((HRESULT)(hr) < 0))
-			return hr;
-
-		return AtlUpdateRegistryFromResourceD(_AtlBaseModule.GetModuleInstance(), lpszRes, bRegister,
-			0, spRegistrar);
-	}
-
-
-	static void EscapeSingleQuote(       LPOLESTR lpDest,     size_t destSizeInChars,        LPCOLESTR lp) throw()
-	{	
-		if (destSizeInChars == 0)
-		{
-			return;
-		}
-		UINT i = 0;
-		
-		for (i=0; i < destSizeInChars-1 && *lp; i++)		
-		{
-			*lpDest++ = *lp;
-			
-			if (*lp == '\'' && ++i < destSizeInChars-1) 
-				*lpDest++ = *lp;
-			lp++;
-		}
-		*lpDest = 0;
-	}
-
-	__declspec( deprecated("CAtlModule::EscapeSingleQuote(dest, src) is unsafe. Instead, use CAtlModule::EscapeSingleQuote(dest, size, src)") )
-	static void EscapeSingleQuote(LPOLESTR lpDest, LPCOLESTR lp) throw()
-	{
-		EscapeSingleQuote(lpDest, 0xffffffff/sizeof(OLECHAR), lp);
-	}
-
-	
-	static LPCTSTR FindOneOf(LPCTSTR p1, LPCTSTR p2) throw()
-	{
-		while (p1 != 0 && *p1 != 0)
-		{
-			LPCTSTR p = p2;
-			while (p != 0 && *p != 0)
-			{
-				if (*p1 == *p)
-					return CharNextW(p1);
-				p = CharNextW(p);
-			}
-			p1 = CharNextW(p1);
-		}
-		return 0;
-	}
-#pragma warning(push)
-#pragma warning(disable : 4302)	
-
-	static int WordCmpI(LPCTSTR psz1, LPCTSTR psz2) throw()
-	{
-		TCHAR c1 = (TCHAR)CharUpperW((LPTSTR)*psz1);
-		TCHAR c2 = (TCHAR)CharUpperW((LPTSTR)*psz2);
-		while (c1 != 0 && c1 == c2 && c1 != ' ' && c1 != '\t')
-		{
-			psz1 = CharNextW(psz1);
-			psz2 = CharNextW(psz2);
-			c1 = (TCHAR)CharUpperW((LPTSTR)*psz1);
-			c2 = (TCHAR)CharUpperW((LPTSTR)*psz2);
-		}
-		if ((c1 == 0 || c1 == ' ' || c1 == '\t') && (c2 == 0 || c2 == ' ' || c2 == '\t'))
-			return 0;
-
-		return (c1 < c2) ? -1 : 1;
-	}
-
-#pragma warning (pop)	
-};
-
-__declspec(selectany) GUID CAtlModule::m_libid = {0x0, 0x0, 0x0, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} };
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-inline HRESULT AtlGetGITPtr(IGlobalInterfaceTable** ppGIT) throw()
-{
-	if (ppGIT == 0)
-		return ((HRESULT)0x80004003L);
-
-	if (_pAtlModule == 0)
-	{
-		return CoCreateInstance(CLSID_StdGlobalInterfaceTable, 0, CLSCTX_INPROC_SERVER,
-			__uuidof(IGlobalInterfaceTable), (void**)ppGIT);
-	}
-	else
-	{
-		return _pAtlModule->GetGITPtr(ppGIT);
-	}
-}
-
-template <class T>
-class __declspec(novtable) CAtlModuleT : public CAtlModule
-{
-public :
-	CAtlModuleT() throw()
-	{
-		T::InitLibId();
-	}
-
-	static void InitLibId() throw()
-	{
-	}
-
-	HRESULT RegisterServer(BOOL bRegTypeLib = 0, const CLSID* pCLSID = 0) throw()
-	{
-		(pCLSID);
-		(bRegTypeLib);
-
-		HRESULT hr = ((HRESULT)0x00000000L);
-
-
-
-		hr = _AtlComModule.RegisterServer(bRegTypeLib, pCLSID);
-
-
-
-
-
-
-		if (((HRESULT)(hr) >= 0) && _pPerfRegFunc != 0)
-			hr = (*_pPerfRegFunc)(_AtlBaseModule.m_hInst);
-
-
-
-		return hr;
-	}
-
-	HRESULT UnregisterServer(BOOL bUnRegTypeLib, const CLSID* pCLSID = 0) throw()
-	{
-		(bUnRegTypeLib);
-		(pCLSID);
-
-		HRESULT hr = ((HRESULT)0x00000000L);
-
-
-
-		if (_pPerfUnRegFunc != 0)
-			hr = (*_pPerfUnRegFunc)();
-
-
-
-
-
-		if (((HRESULT)(hr) >= 0))
-			hr = _AtlComModule.UnregisterServer(bUnRegTypeLib, pCLSID);
-
-
-
-		return hr;
-
-	}
-
-	static HRESULT __stdcall UpdateRegistryAppId(BOOL ) throw()
-	{
-		return ((HRESULT)0x00000000L);
-	}
-	HRESULT RegisterAppId() throw()
-	{
-		return T::UpdateRegistryAppId(1);
-	}
-
-	HRESULT UnregisterAppId() throw()
-	{
-		return T::UpdateRegistryAppId(0);
-	}
-
-	virtual HRESULT AddCommonRGSReplacements(IRegistrarBase* pRegistrar) throw()
-	{
-		return pRegistrar->AddReplacement(L"APPID", T::GetAppId());
-	}
-	static LPCOLESTR GetAppId() throw()
-	{
-		return L"";
-	}
-};
-
-
-
-
-
-
-
-
-
-
-
-
-template <class T>
-class __declspec(novtable) CAtlDllModuleT : public CAtlModuleT<T>
-{
-public :
-	CAtlDllModuleT() throw()
-	{
-		_AtlComModule.ExecuteObjectMain(true);
-
-
-
-
-
-
-
-
-
-	}
-
-	~CAtlDllModuleT() throw()
-	{
-
-
-
-
-
-
-
-
-		_AtlComModule.ExecuteObjectMain(false);
-	}
-
-    BOOL __stdcall DllMain(DWORD dwReason, LPVOID lpReserved) throw();
-
-	BOOL __stdcall _DllMain(DWORD dwReason, LPVOID ) throw()
-	{
-		if (dwReason == 1)
-		{
-			if (CAtlBaseModule::m_bInitFailed)
-			{
-				(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 3098, 0, L"0")) || (__debugbreak(), 0));
-				return 0;
-			}
-
-
-
-
-		}
-
-		else if (dwReason == 0)
-		{
-			
-			_AtlWinModule.Term();		
-		}
-
-		return 1;    
-	}
-
-	HRESULT DllCanUnloadNow() throw()
-	{
-		T* pT = static_cast<T*>(this);
-		return (pT->GetLockCount()==0) ? ((HRESULT)0x00000000L) : ((HRESULT)0x00000001L);
-	}
-
-	HRESULT DllGetClassObject(const IID & rclsid, const IID & riid, LPVOID* ppv) throw()
-	{
-		T* pT = static_cast<T*>(this);
-		return pT->GetClassObject(rclsid, riid, ppv);
-	}
-
-	HRESULT DllRegisterServer(BOOL bRegTypeLib = 1) throw()
-	{
-		LCID lcid = GetThreadLocale();
-		SetThreadLocale((((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x02)) << 10) | (WORD )(0x00))))))))));
-		
-		T* pT = static_cast<T*>(this);
-		HRESULT hr = pT->RegisterAppId();
-		if (((HRESULT)(hr) >= 0))
-			hr = pT->RegisterServer(bRegTypeLib);
-		SetThreadLocale(lcid);
-		return hr;
-	}
-
-	HRESULT DllUnregisterServer(BOOL bUnRegTypeLib = 1) throw()
-	{
-		LCID lcid = GetThreadLocale();
-		SetThreadLocale((((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x02)) << 10) | (WORD )(0x00))))))))));
-		T* pT = static_cast<T*>(this);
-		HRESULT hr = pT->UnregisterServer(bUnRegTypeLib);
-		if (((HRESULT)(hr) >= 0))
-			hr = pT->UnregisterAppId();
-		SetThreadLocale(lcid);
-		return hr;
-	}
-
-	
-	HRESULT GetClassObject(const IID & rclsid, const IID & riid, LPVOID* ppv) throw()
-	{
-
-
-		(void) ((!!((ppv != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 3158, 0, L"ppv != 0")) || (__debugbreak(), 0));
-
-
-		return AtlComModuleGetClassObject(&_AtlComModule, rclsid, riid, ppv);
-	}
-};
-
-#pragma managed(push, off)
-
-template <class T>
-inline BOOL __stdcall CAtlDllModuleT<T>::DllMain(DWORD dwReason, LPVOID lpReserved) throw()
-{
-
-
-
-
-
-
-
-
-
-
-
-
-    return _DllMain(dwReason, lpReserved);
-
-}
-
-#pragma managed(pop)
-
-
-
-
-template <class T>
-class __declspec(novtable) CAtlExeModuleT : public CAtlModuleT<T>
-{
-public :
-
-
-	DWORD m_dwMainThreadID;
-	HANDLE m_hEventShutdown;
-	DWORD m_dwTimeOut;
-	DWORD m_dwPause;
-	bool m_bDelayShutdown;
-	bool m_bActivity;
-	bool m_bComInitialized;    
-
-
-
-	CAtlExeModuleT() throw()
-
-
-
-		: m_dwMainThreadID(::GetCurrentThreadId()),
-		m_dwTimeOut(5000),
-		m_dwPause(1000),
-		m_hEventShutdown(0),
-		m_bDelayShutdown(true),
-		m_bComInitialized(false)
-
-
-
-	{
-
-		HRESULT hr = T::InitializeCom();
-		if (((HRESULT)(hr) < 0))
-		{
-			
-			
-			if (hr != ((HRESULT)0x80010106L) || GetModuleHandleW(L"Mscoree.dll") == 0)
-			{
-				(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 3229, 0, L"0")) || (__debugbreak(), 0));
-				CAtlBaseModule::m_bInitFailed =	 true;
-				return;
-			}
-		}
-		else
-		{
-			m_bComInitialized = true;
-		}
-
-
-		_AtlComModule.ExecuteObjectMain(true);
-
-
-
-	}
-
-	~CAtlExeModuleT() throw()
-	{
-
-
-		_AtlComModule.ExecuteObjectMain(false);
-
-
-
-		
-		Term();
-
-
-
-		
-		_AtlComModule.Term();
-
-		if (m_bComInitialized)
-			T::UninitializeCom();
-
-	}
-
-	static HRESULT InitializeCom() throw()
-	{
-
-
-
-
-		return CoInitialize(0);
-
-	}
-
-	static void UninitializeCom() throw()
-	{
-		CoUninitialize();
-	}
-
-	LONG Unlock() throw()
-	{
-		LONG lRet = CComGlobalsThreadModel::Decrement(&m_nLockCnt);
-
-
-
-		if (lRet == 0)
-		{
-			if (m_bDelayShutdown)
-			{
-				m_bActivity = true;
-				::SetEvent(m_hEventShutdown); 
-			}
-			else
-			{
-				::PostThreadMessageW(m_dwMainThreadID, 0x0012, 0, 0);
-			}
-		}
-
-
-
-		return lRet;
-	}
-
-
-	void MonitorShutdown() throw()
-	{
-		while (1)
-		{
-			::WaitForSingleObject(m_hEventShutdown, 0xFFFFFFFF);
-			DWORD dwWait = 0;
-			do
-			{
-				m_bActivity = false;
-				dwWait = ::WaitForSingleObject(m_hEventShutdown, m_dwTimeOut);
-			} while (dwWait == ((((DWORD )0x00000000L) ) + 0 ));
-			
-			if (!m_bActivity && m_nLockCnt == 0) 
-			{
-
-
-
-
-					break;
-			}
-		}
-		::CloseHandle(m_hEventShutdown);
-		::PostThreadMessageW(m_dwMainThreadID, 0x0012, 0, 0);
-	}
-
-	HANDLE StartMonitor() throw()
-	{
-		m_hEventShutdown = ::CreateEventW(0, false, false, 0);
-		if (m_hEventShutdown == 0)
-        {
-			return 0;
-        }
-		DWORD dwThreadID;
-		HANDLE hThread = ::CreateThread(0, 0, MonitorProc, this, 0, &dwThreadID);
-        if(hThread==0)
-        {
-    		::CloseHandle(m_hEventShutdown);
-        }
-		return hThread;
-	}
-
-	static DWORD __stdcall MonitorProc(void* pv) throw()
-	{
-		CAtlExeModuleT<T>* p = static_cast<CAtlExeModuleT<T>*>(pv);
-		p->MonitorShutdown();
-		return 0;
-	}
-
-
-	int WinMain(int nShowCmd) throw()
-	{
-		if (CAtlBaseModule::m_bInitFailed)
-		{
-			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 3360, 0, L"0")) || (__debugbreak(), 0));
-			return -1;
-		}
-		T* pT = static_cast<T*>(this);
-		HRESULT hr = ((HRESULT)0x00000000L);
-
-		LPTSTR lpCmdLine = GetCommandLineW(); 
-		if (pT->ParseCommandLine(lpCmdLine, &hr) == true)
-			hr = pT->Run(nShowCmd);
-
-
-		
-		_AtlWinModule.Term();		
-
-		return hr;
-	}
-
-	
-	
-
-	
-	bool ParseCommandLine(LPCTSTR lpCmdLine, HRESULT* pnRetCode) throw()
-	{
-		*pnRetCode = ((HRESULT)0x00000000L);
-
-		TCHAR szTokens[] = L"-/";
-
-		T* pT = static_cast<T*>(this);
-		LPCTSTR lpszToken = FindOneOf(lpCmdLine, szTokens);
-		while (lpszToken != 0)
-		{
-			if (WordCmpI(lpszToken, L"UnregServer")==0)
-			{
-				*pnRetCode = pT->UnregisterServer(1);
-				if (((HRESULT)(*pnRetCode) >= 0))
-					*pnRetCode = pT->UnregisterAppId();
-				return false;
-			}
-
-			
-			if (WordCmpI(lpszToken, L"RegServer")==0)
-			{
-				*pnRetCode = pT->RegisterAppId();
-				if (((HRESULT)(*pnRetCode) >= 0))
-					*pnRetCode = pT->RegisterServer(1);
-				return false;
-			}
-
-			lpszToken = FindOneOf(lpszToken, szTokens);
-		}
-
-		return true;
-	}
-
-	HRESULT PreMessageLoop(int ) throw()
-	{
-		HRESULT hr = ((HRESULT)0x00000000L);
-		T* pT = static_cast<T*>(this);
-		pT;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-		hr = pT->RegisterClassObjects(CLSCTX_LOCAL_SERVER, 
-			REGCLS_MULTIPLEUSE);
-		if (hr == ((HRESULT)0x00000000L))
-		{
-			if (m_bDelayShutdown && !pT->StartMonitor())
-			{
-				hr = ((HRESULT)0x80004005L);
-			}
-		}
-		else
-		{
-			m_bDelayShutdown = false;
-		}
-
-
-
-
-
-
-		(void) ((!!((((HRESULT)(hr) >= 0)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 3485, 0, L"((HRESULT)(hr) >= 0)")) || (__debugbreak(), 0));
-		return hr;
-	}
-
-	HRESULT PostMessageLoop() throw()
-	{
-		HRESULT hr = ((HRESULT)0x00000000L);
-
-
-
-		T* pT = static_cast<T*>(this);
-		hr = pT->RevokeClassObjects();
-		if (m_bDelayShutdown)
-			Sleep(m_dwPause); 
-
-
-
-		return hr;
-	}
-
-	void RunMessageLoop() throw()
-	{
-		MSG msg;
-		while (GetMessageW(&msg, 0, 0, 0) > 0)
-		{
-			TranslateMessage(&msg);
-			DispatchMessageW(&msg);
-		}
-	}
-
-	HRESULT Run(int nShowCmd = 0) throw()
-	{
-		HRESULT hr = ((HRESULT)0x00000000L);
-
-		T* pT = static_cast<T*>(this);
-		hr = pT->PreMessageLoop(nShowCmd);
-
-		
-		if (hr == ((HRESULT)0x00000000L))
-		{
-			pT->RunMessageLoop();
-		}
-
-		
-		if (((HRESULT)(hr) >= 0))
-		{
-			hr = pT->PostMessageLoop();
-		}
-
-		(void) ((!!((((HRESULT)(hr) >= 0)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 3534, 0, L"((HRESULT)(hr) >= 0)")) || (__debugbreak(), 0));
-		return hr;
-	}
-
-	
-	HRESULT RegisterClassObjects(DWORD dwClsContext, DWORD dwFlags) throw()
-	{
-		return AtlComModuleRegisterClassObjects(&_AtlComModule, dwClsContext, dwFlags);
-	}
-	HRESULT RevokeClassObjects() throw()
-	{
-		return AtlComModuleRevokeClassObjects(&_AtlComModule);
-	}
-};
-
-
-template <class T, UINT nServiceNameID>
-class __declspec(novtable) CAtlServiceModuleT : public CAtlExeModuleT<T>
-{
-public :
-
-	CAtlServiceModuleT() throw()
-	{
-		m_bService = 1;
-		LoadStringW(_AtlBaseModule.GetModuleInstance(), nServiceNameID, m_szServiceName, sizeof(m_szServiceName) / sizeof(TCHAR));
-
-		
-		m_hServiceStatus = 0;
-		m_status.dwServiceType = 0x00000010;
-		m_status.dwCurrentState = 0x00000001;
-		m_status.dwControlsAccepted = 0x00000001;
-		m_status.dwWin32ExitCode = 0;
-		m_status.dwServiceSpecificExitCode = 0;
-		m_status.dwCheckPoint = 0;
-		m_status.dwWaitHint = 0;
-	}
-
-	int WinMain(int nShowCmd) throw()
-	{
-		if (CAtlBaseModule::m_bInitFailed)
-		{
-			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 3575, 0, L"0")) || (__debugbreak(), 0));
-			return -1;
-		}
-
-		T* pT = static_cast<T*>(this);
-		HRESULT hr = ((HRESULT)0x00000000L);
-
-		LPTSTR lpCmdLine = GetCommandLineW(); 
-		if (pT->ParseCommandLine(lpCmdLine, &hr) == true)
-			hr = pT->Start(nShowCmd);
-
-
-		
-		_AtlWinModule.Term();		
-
-		return hr;
-	}
-
-	HRESULT Start(int nShowCmd) throw()
-	{
-		T* pT = static_cast<T*>(this);
-		
-		CRegKey keyAppID;
-		LONG lRes = keyAppID.Open((( HKEY ) (ULONG_PTR)((LONG)0x80000000) ), L"AppID", ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))));
-		if (lRes != 0L)
-		{
-			m_status.dwWin32ExitCode = lRes;
-			return m_status.dwWin32ExitCode;
-		}
-
-		CRegKey key;
-		lRes = key.Open(keyAppID, pT->GetAppIdT(), ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))));
-		if (lRes != 0L)
-		{
-			m_status.dwWin32ExitCode = lRes;
-			return m_status.dwWin32ExitCode;
-		}
-
-		TCHAR szValue[260];
-		DWORD dwLen = 260;
-		lRes = key.QueryStringValue(L"LocalService", szValue, &dwLen);
-
-		m_bService = 0;
-		if (lRes == 0L)
-			m_bService = 1;
-
-		if (m_bService)
-		{
-			SERVICE_TABLE_ENTRY st[] =
-			{
-				{ m_szServiceName, _ServiceMain },
-				{ 0, 0 }
-			};
-			if (::StartServiceCtrlDispatcherW(st) == 0)
-				m_status.dwWin32ExitCode = GetLastError();
-			return m_status.dwWin32ExitCode;
-		}
-		
-		
-		m_status.dwWin32ExitCode = pT->Run(nShowCmd);
-		return m_status.dwWin32ExitCode;
-	}
-
-	inline HRESULT RegisterAppId(bool bService = false) throw()
-	{
-		if (!Uninstall())
-			return ((HRESULT)0x80004005L);
-
-		HRESULT hr = T::UpdateRegistryAppId(1);
-		if (((HRESULT)(hr) < 0))
-			return hr;
-
-		CRegKey keyAppID;
-		LONG lRes = keyAppID.Open((( HKEY ) (ULONG_PTR)((LONG)0x80000000) ), L"AppID", ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))));
-		if (lRes != 0L)
-			return AtlHresultFromWin32(lRes);
-
-		CRegKey key;
-
-		lRes = key.Create(keyAppID, T::GetAppIdT());
-		if (lRes != 0L)
-			return AtlHresultFromWin32(lRes);
-
-		key.DeleteValue(L"LocalService");
-
-		if (!bService)
-			return ((HRESULT)0x00000000L);
-
-		key.SetStringValue(L"LocalService", m_szServiceName);
-
-		
-		if (!Install())
-			return ((HRESULT)0x80004005L);
-		return ((HRESULT)0x00000000L);
-	}
-
-	HRESULT UnregisterAppId() throw()
-	{
-		if (!Uninstall())
-			return ((HRESULT)0x80004005L);
-		
-		CRegKey keyAppID;
-		LONG lRes = keyAppID.Open((( HKEY ) (ULONG_PTR)((LONG)0x80000000) ), L"AppID", ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))));
-		if (lRes != 0L)
-			return AtlHresultFromWin32(lRes);
-
-		CRegKey key;
-		lRes = key.Open(keyAppID, T::GetAppIdT(), ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))));
-		if (lRes != 0L)
-			return AtlHresultFromWin32(lRes);
-		key.DeleteValue(L"LocalService");
-
-		return T::UpdateRegistryAppId(0);
-	}
-
-	
-	bool ParseCommandLine(LPCTSTR lpCmdLine, HRESULT* pnRetCode) throw()
-	{
-		if (!CAtlExeModuleT<T>::ParseCommandLine(lpCmdLine, pnRetCode))
-			return false;
-
-		TCHAR szTokens[] = L"-/";
-		*pnRetCode = ((HRESULT)0x00000000L);
-
-		T* pT = static_cast<T*>(this);
-		LPCTSTR lpszToken = FindOneOf(lpCmdLine, szTokens);
-		while (lpszToken != 0)
-		{
-			if (WordCmpI(lpszToken, L"Service")==0)
-			{
-				*pnRetCode = pT->RegisterAppId(true);
-				if (((HRESULT)(*pnRetCode) >= 0))
-					*pnRetCode = pT->RegisterServer(1);
-				return false;
-			}
-			lpszToken = FindOneOf(lpszToken, szTokens);
-		}
-		return true;
-	}
-
-	void ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv) throw()
-	{
-		lpszArgv;
-		dwArgc;
-		
-		m_status.dwCurrentState = 0x00000002;
-		m_hServiceStatus = RegisterServiceCtrlHandlerW(m_szServiceName, _Handler);
-		if (m_hServiceStatus == 0)
-		{
-			LogEvent(L"Handler not installed");
-			return;
-		}
-		SetServiceStatus(0x00000002);
-
-		m_status.dwWin32ExitCode = ((HRESULT)0x00000000L);
-		m_status.dwCheckPoint = 0;
-		m_status.dwWaitHint = 0;
-
-		T* pT = static_cast<T*>(this);
-
-
-		HRESULT hr = ((HRESULT)0x80004005L);
-		hr = T::InitializeCom();
-		if (((HRESULT)(hr) < 0))
-		{
-			
-			
-			if (hr != ((HRESULT)0x80010106L) || GetModuleHandleW(L"Mscoree.dll") == 0)
-			{
-				return;
-			}
-		}
-		else
-		{
-			m_bComInitialized = true;
-		}
-
-		m_bDelayShutdown = false;
-
-		
-		m_status.dwWin32ExitCode = pT->Run(0);
-
-
-		if (m_bService && m_bComInitialized)
-			T::UninitializeCom();
-
-
-		SetServiceStatus(0x00000001);
-		LogEvent(L"Service stopped");
-	}
-
-	HRESULT Run(int nShowCmd = 0) throw()
-	{
-		HRESULT hr = ((HRESULT)0x00000000L);
-		T* pT = static_cast<T*>(this);
-
-		hr = pT->PreMessageLoop(nShowCmd);
-
-		if (hr == ((HRESULT)0x00000000L))
-		{
-			if (m_bService)
-			{
-				LogEvent(L"Service started");
-				SetServiceStatus(0x00000004);
-			}
-
-			pT->RunMessageLoop();
-		}
-
-		if (((HRESULT)(hr) >= 0))
-		{
-			hr = pT->PostMessageLoop();
-		}
-
-		return hr;
-	}
-
-	HRESULT PreMessageLoop(int nShowCmd) throw()
-	{
-		HRESULT hr = ((HRESULT)0x00000000L);
-		if (m_bService)
-		{
-			m_dwThreadID = GetCurrentThreadId();
-
-			T* pT = static_cast<T*>(this);
-			hr = pT->InitializeSecurity();
-
-			if (((HRESULT)(hr) < 0))
-				return hr;
-		}
-
-		hr = CAtlExeModuleT<T>::PreMessageLoop(nShowCmd);
-		if (((HRESULT)(hr) < 0))
-			return hr;
-
-		return hr;
-	}
-
-	void OnStop() throw()
-	{
-		SetServiceStatus(0x00000003);
-		PostThreadMessageW(m_dwThreadID, 0x0012, 0, 0);
-	}
-
-	void OnPause() throw()
-	{
-	}
-
-	void OnContinue() throw()
-	{
-	}
-
-	void OnInterrogate() throw()
-	{
-	}
-
-	void OnShutdown() throw()
-	{
-	}
-
-	void OnUnknownRequest(DWORD ) throw()
-	{
-		LogEvent(L"Bad service request");	
-	}
-
-	void Handler(DWORD dwOpcode) throw()
-	{
-		T* pT = static_cast<T*>(this);
-
-		switch (dwOpcode)
-		{
-		case 0x00000001:
-			pT->OnStop();
-			break;
-		case 0x00000002:
-			pT->OnPause();
-			break;
-		case 0x00000003:
-			pT->OnContinue();
-			break;
-		case 0x00000004:
-			pT->OnInterrogate();
-			break;
-		case 0x00000005:
-			pT->OnShutdown();
-			break;
-		default:
-			pT->OnUnknownRequest(dwOpcode);
-		}
-	}
-
-	BOOL IsInstalled() throw()
-	{
-		BOOL bResult = 0;
-
-		SC_HANDLE hSCM = ::OpenSCManagerW(0, 0, ((0x000F0000L) | 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020));
-
-		if (hSCM != 0)
-		{
-			SC_HANDLE hService = ::OpenServiceW(hSCM, m_szServiceName, 0x0001);
-			if (hService != 0)
-			{
-				bResult = 1;
-				::CloseServiceHandle(hService);
-			}
-			::CloseServiceHandle(hSCM);
-		}
-		return bResult;
-	}
-	BOOL Install() throw()
-	{
-		if (IsInstalled())
-			return 1;
-
-		
-		TCHAR szFilePath[260 + 2];
-		DWORD dwFLen = ::GetModuleFileNameW(0, szFilePath + 1, 260);
-		if( dwFLen == 0 || dwFLen == 260 )
-			return 0;
-
-		
-		szFilePath[0] = L'\"';
-		szFilePath[dwFLen + 1] = L'\"';
-		szFilePath[dwFLen + 2] = 0;
-        
-		SC_HANDLE hSCM = ::OpenSCManagerW(0, 0, ((0x000F0000L) | 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020));
-		if (hSCM == 0)
-		{
-			TCHAR szBuf[1024];
-			if (AtlLoadString((0xD800 + 10), szBuf, 1024) == 0)
-
-				Checked::wcscpy_s(szBuf, sizeof(*__countof_helper(szBuf)), L"Could not open Service Manager");
-
-
-
-			MessageBoxW(0, szBuf, m_szServiceName, 0x00000000L);
-			return 0;
-		}
-
-		SC_HANDLE hService = ::CreateServiceW(
-			hSCM, m_szServiceName, m_szServiceName,
-			((0x000F0000L) | 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 | 0x0100), 0x00000010,
-			0x00000003, 0x00000001,
-			szFilePath, 0, 0, L"RPCSS\0", 0, 0);
-
-		if (hService == 0)
-		{
-			::CloseServiceHandle(hSCM);
-			TCHAR szBuf[1024];
-			if (AtlLoadString((0xD800 + 11), szBuf, 1024) == 0)
-
-				Checked::wcscpy_s(szBuf, sizeof(*__countof_helper(szBuf)), L"Could not start service");
-
-
-
-			MessageBoxW(0, szBuf, m_szServiceName, 0x00000000L);
-			return 0;
-		}
-
-		::CloseServiceHandle(hService);
-		::CloseServiceHandle(hSCM);
-		return 1;
-	}
-
-	BOOL Uninstall() throw()
-	{
-		if (!IsInstalled())
-			return 1;
-
-		SC_HANDLE hSCM = ::OpenSCManagerW(0, 0, ((0x000F0000L) | 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020));
-
-		if (hSCM == 0)
-		{
-			TCHAR szBuf[1024];
-			if (AtlLoadString((0xD800 + 10), szBuf, 1024) == 0)
-
-				Checked::wcscpy_s(szBuf, sizeof(*__countof_helper(szBuf)), L"Could not open Service Manager");
-
-
-
-			MessageBoxW(0, szBuf, m_szServiceName, 0x00000000L);
-			return 0;
-		}
-
-		SC_HANDLE hService = ::OpenServiceW(hSCM, m_szServiceName, 0x0020 | (0x00010000L));
-
-		if (hService == 0)
-		{
-			::CloseServiceHandle(hSCM);
-			TCHAR szBuf[1024];
-			if (AtlLoadString((0xD800 + 12), szBuf, 1024) == 0)
-
-				Checked::wcscpy_s(szBuf, sizeof(*__countof_helper(szBuf)), L"Could not open service");
-
-
-
-			MessageBoxW(0, szBuf, m_szServiceName, 0x00000000L);
-			return 0;
-		}
-		SERVICE_STATUS status;
-		BOOL bRet = ::ControlService(hService, 0x00000001, &status);
-		if (!bRet)
-		{
-			DWORD dwError = GetLastError();
-			if (!((dwError == 1062L) ||  (dwError == 1061L && status.dwCurrentState == 0x00000003)))
-			{
-				TCHAR szBuf[1024];
-				if (AtlLoadString((0xD800 + 14), szBuf, 1024) == 0)
-
-					Checked::wcscpy_s(szBuf, sizeof(*__countof_helper(szBuf)), L"Could not stop service");
-
-
-
-				MessageBoxW(0, szBuf, m_szServiceName, 0x00000000L);
-			}
-		}
-
-
-		BOOL bDelete = ::DeleteService(hService);
-		::CloseServiceHandle(hService);
-		::CloseServiceHandle(hSCM);
-
-		if (bDelete)
-			return 1;
-
-		TCHAR szBuf[1024];
-		if (AtlLoadString((0xD800 + 13), szBuf, 1024) == 0)
-
-			Checked::wcscpy_s(szBuf, sizeof(*__countof_helper(szBuf)), L"Could not delete service");
-
-
-
-		MessageBoxW(0, szBuf, m_szServiceName, 0x00000000L);
-		return 0;
-	}
-
-	LONG Unlock() throw()
-	{
-		LONG lRet;
-		if (m_bService)
-		{
-			
-			
-			lRet = CAtlModuleT<T>::Unlock();
-		}
-		else
-		{
-			
-			lRet = CAtlExeModuleT<T>::Unlock();
-		}
-		return lRet;
-	}
-
-	void LogEventEx(int id, LPCTSTR pszMessage=0, WORD type = 0x0004) throw()
-	{
-		HANDLE hEventSource;
-		if (m_szServiceName)
-		{
-			
-			hEventSource = RegisterEventSourceW(0, m_szServiceName);
-			if (hEventSource != 0)
-			{
-				
-				ReportEventW(hEventSource, 
-							type,
-							(WORD)0,
-							id,
-							0,
-							(WORD)(pszMessage != 0 ? 1 : 0),
-							0,
-							pszMessage != 0 ? &pszMessage : 0,
-							0);
-				DeregisterEventSource(hEventSource);
-			}
-		}
-	}
-
-#pragma warning(push)
-#pragma warning(disable : 4793)
-	void __cdecl LogEvent(LPCTSTR pszFormat, ...) throw()
-	{
-		const int LOG_EVENT_MSG_SIZE = 256;
-		
-		TCHAR chMsg[LOG_EVENT_MSG_SIZE];
-		HANDLE hEventSource;
-		LPTSTR lpszStrings[1];
-		va_list pArg;
-		
-		( pArg = (va_list)( &reinterpret_cast<const char &>(pszFormat) ) + ( (sizeof(pszFormat) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
-
-		_vsnwprintf_s(chMsg, LOG_EVENT_MSG_SIZE, LOG_EVENT_MSG_SIZE-1, pszFormat, pArg);
-
-
-
-		( pArg = (va_list)0 );
-
-		chMsg[LOG_EVENT_MSG_SIZE - 1] = 0;
-		
-		lpszStrings[0] = chMsg;
-
-		if (!m_bService)
-		{
-			
-			
-			_putws(chMsg);
-		}
-
-		
-		hEventSource = RegisterEventSourceW(0, m_szServiceName);
-		if (hEventSource != 0)
-		{
-			
-			ReportEventW(hEventSource, 0x0004, 0, 0, 0, 1, 0, (LPCTSTR*) &lpszStrings[0], 0);
-			DeregisterEventSource(hEventSource);
-		}
-	}
-#pragma warning(pop)
-
-	void SetServiceStatus(DWORD dwState) throw()
-	{
-		m_status.dwCurrentState = dwState;
-		::SetServiceStatus(m_hServiceStatus, &m_status);
-	}
-
-
-protected:
-	static void __stdcall _ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv) throw()
-	{
-		((T*)_pAtlModule)->ServiceMain(dwArgc, lpszArgv);
-	}
-	static void __stdcall _Handler(DWORD dwOpcode) throw()
-	{
-		((T*)_pAtlModule)->Handler(dwOpcode); 
-	}
-
-
-public:
-	TCHAR m_szServiceName[256];
-	SERVICE_STATUS_HANDLE m_hServiceStatus;
-	SERVICE_STATUS m_status;
-	BOOL m_bService;
-	DWORD m_dwThreadID;
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-class CComModule;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-__declspec(selectany) CComModule* _pModule = 0;
-class CComModule : public CAtlModuleT<CComModule>
-{
-public :
-
-	CComModule()
-	{
-		
-		
-		(void) ((!!((_pModule == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4232, 0, L"_pModule == 0")) || (__debugbreak(), 0));
-		_pModule = this;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-	}
-
-	~CComModule()
-	{
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-	}
-
-	__declspec(property(get = get_m_hInst)) HINSTANCE m_hInst;
-	HINSTANCE& get_m_hInst() const throw()
-	{
-		return _AtlBaseModule.m_hInst;
-	}
-
-	__declspec(property(get = get_m_hInstResource, put = put_m_hInstResource)) HINSTANCE m_hInstResource;
-	HINSTANCE& get_m_hInstResource() const throw()
-	{
-		return _AtlBaseModule.m_hInstResource;
-	}
-	void put_m_hInstResource(HINSTANCE h) throw()
-	{
-		_AtlBaseModule.SetResourceInstance(h);
-	}
-	HINSTANCE SetResourceInstance(HINSTANCE h) throw()
-	{
-		return _AtlBaseModule.SetResourceInstance(h);
-	}
-
-	HINSTANCE GetModuleInstance() throw()
-	{
-		return _AtlBaseModule.m_hInst;
-	}
-	HINSTANCE GetResourceInstance() throw()
-	{
-		return _AtlBaseModule.m_hInstResource;
-	}
-
-	__declspec(property(get = get_m_hInstTypeLib, put = put_m_hInstTypeLib)) HINSTANCE m_hInstTypeLib;
-	HINSTANCE& get_m_hInstTypeLib() const throw()
-	{
-		return _AtlComModule.m_hInstTypeLib;
-	}
-	void put_m_hInstTypeLib(HINSTANCE h) throw()
-	{
-		_AtlComModule.m_hInstTypeLib = h;
-	}
-
-	HINSTANCE GetTypeLibInstance() const throw()
-	{
-		return _AtlComModule.m_hInstTypeLib;
-	}
-
-	
-	_ATL_OBJMAP_ENTRY* m_pObjMap;
-
-	__declspec(property(get  = get_m_csWindowCreate)) CRITICAL_SECTION m_csWindowCreate;
-	CRITICAL_SECTION& get_m_csWindowCreate() throw();
-
-	__declspec(property(get  = get_m_csObjMap)) CRITICAL_SECTION m_csObjMap;
-	CRITICAL_SECTION& get_m_csObjMap() throw();
-
-	__declspec(property(get  = get_m_csStaticDataInit)) CRITICAL_SECTION m_csTypeInfoHolder;
-	__declspec(property(get  = get_m_csStaticDataInit)) CRITICAL_SECTION m_csStaticDataInit;
-	CRITICAL_SECTION& get_m_csStaticDataInit() throw();
-	void EnterStaticDataCriticalSection() throw()
-	{
-		EnterCriticalSection(&m_csStaticDataInit);
-	}
-
-	void LeaveStaticDataCriticalSection() throw()
-	{
-		LeaveCriticalSection(&m_csStaticDataInit);
-	}
-
-	__declspec(property(get  = get_dwAtlBuildVer)) DWORD dwAtlBuildVer;
-	DWORD& get_dwAtlBuildVer() throw()
-	{
-		return _AtlBaseModule.dwAtlBuildVer;
-	}
-
-	__declspec(property(get  = get_m_pCreateWndList, put = put_m_pCreateWndList)) _AtlCreateWndData* m_pCreateWndList;
-	_AtlCreateWndData*& get_m_pCreateWndList() throw();
-	void put_m_pCreateWndList(_AtlCreateWndData* p) throw();
-
-	__declspec(property(get  = get_pguidVer)) const GUID* pguidVer;
-	const GUID*& get_pguidVer() throw()
-	{
-		return _AtlBaseModule.pguidVer;
-	}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-	HRESULT Init(_ATL_OBJMAP_ENTRY* p, HINSTANCE h, const GUID* plibid = 0) throw();
-	void Term() throw();
-
-	HRESULT GetClassObject(const IID & rclsid, const IID & riid, LPVOID* ppv) throw();
-	
-	HRESULT RegisterClassObjects(DWORD dwClsContext, DWORD dwFlags) throw();
-	HRESULT RevokeClassObjects() throw();
-	
-	HRESULT RegisterTypeLib() throw();
-	HRESULT RegisterTypeLib(LPCTSTR lpszIndex) throw();
-	HRESULT UnRegisterTypeLib() throw();
-	HRESULT UnRegisterTypeLib(LPCTSTR lpszIndex) throw();
-	HRESULT RegisterServer(BOOL bRegTypeLib = 0, const CLSID* pCLSID = 0) throw();
-	HRESULT UnregisterServer(BOOL bUnRegTypeLib, const CLSID* pCLSID = 0) throw();
-	HRESULT UnregisterServer(const CLSID* pCLSID = 0) throw();
-
-	void AddCreateWndData(_AtlCreateWndData* pData, void* pObject) throw()
-	{
-		_AtlWinModule.AddCreateWndData(pData, pObject);
-	}
-
-	void* ExtractCreateWndData() throw()
-	{
-		return _AtlWinModule.ExtractCreateWndData();
-	}
-
-	
-	HRESULT CreateInstance(void* , const IID & , void** ) throw()	
-	{
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4400, 0, L"0")) || (__debugbreak(), 0));
-		do { ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4401)(ATL::atlTraceNotImpl, 0, L"ATL: %s not implemented.\n", L"CComModule::CreateInstance"); return ((HRESULT)0x80004001L); } while(0);
-	}
-
-	HRESULT RegisterAppId(LPCTSTR pAppId);
-	HRESULT UnregisterAppId(LPCTSTR pAppId);
-
-	
-	virtual HRESULT __stdcall UpdateRegistryFromResourceD(LPCTSTR lpszRes, BOOL bRegister,
-		struct _ATL_REGMAP_ENTRY* pMapEntries = 0) throw()
-	{
-
-
-
-
-
-
-		return CAtlModuleT<CComModule>::UpdateRegistryFromResourceD(lpszRes, bRegister, pMapEntries);		
-
-	}
-	virtual HRESULT __stdcall UpdateRegistryFromResourceD(UINT nResID, BOOL bRegister,
-		struct _ATL_REGMAP_ENTRY* pMapEntries = 0) throw()
-	{
-
-
-
-
-
-
-		return CAtlModuleT<CComModule>::UpdateRegistryFromResourceD(nResID, bRegister, pMapEntries);
-
-	}
-
-
-	
-	virtual HRESULT __stdcall UpdateRegistryFromResourceS(LPCTSTR lpszRes, BOOL bRegister,
-		struct _ATL_REGMAP_ENTRY* pMapEntries = 0) throw()
-	{
-
-
-
-		(lpszRes);
-		(bRegister);
-		(pMapEntries);
-		return ((HRESULT)0x80004005L);
-
-	}
-	virtual HRESULT __stdcall UpdateRegistryFromResourceS(UINT nResID, BOOL bRegister,
-		struct _ATL_REGMAP_ENTRY* pMapEntries = 0) throw()
-	{
-
-
-
-		(nResID);
-		(bRegister);
-		(pMapEntries);
-		return ((HRESULT)0x80004005L);
-
-	}
-
-
-	
-
-	__declspec( deprecated("CComModule::RegisterProgID is no longer recommended. Instead, use an RGS file for registration.") )
-	static HRESULT RegisterProgID(LPCTSTR lpszCLSID, LPCTSTR lpszProgID, LPCTSTR lpszUserDesc);
-	
-	__declspec( deprecated("CComModule::UpdateRegistryClass is no longer recommended. Instead, use an RGS file for registration.") )
-	HRESULT __stdcall UpdateRegistryClass(const CLSID& clsid, LPCTSTR lpszProgID, LPCTSTR lpszVerIndProgID, UINT nDescID, DWORD dwFlags, BOOL bRegister);
-	__declspec( deprecated("CComModule::UpdateRegistryClass is no longer recommended. Instead, use an RGS file for registration.") )
-	HRESULT __stdcall UpdateRegistryClass(const CLSID& clsid, LPCTSTR lpszProgID, LPCTSTR lpszVerIndProgID, LPCTSTR szDesc, DWORD dwFlags, BOOL bRegister);
-	__declspec( deprecated("CComModule::RegisterClassHelper is no longer recommended. Instead, use an RGS file for registration.") )
-	HRESULT __stdcall RegisterClassHelper(const CLSID& clsid, LPCTSTR lpszProgID, LPCTSTR lpszVerIndProgID, LPCTSTR szDesc, DWORD dwFlags);
-	__declspec( deprecated("CComModule::UnregisterClassHelper is no longer recommended. Instead, use an RGS file for registration.") )
-	HRESULT __stdcall UnregisterClassHelper(const CLSID& clsid, LPCTSTR lpszProgID, LPCTSTR lpszVerIndProgID);
-
-    BOOL __stdcall DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID , _ATL_OBJMAP_ENTRY* pObjMap, const GUID* pLibID);
-
-	BOOL __stdcall _DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID , _ATL_OBJMAP_ENTRY* pObjMap, const GUID* pLibID)
-	{
-		if (dwReason == 1)
-		{
-			if (CAtlBaseModule::m_bInitFailed)
-			{
-				(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4483, 0, L"0")) || (__debugbreak(), 0));
-				return 0;
-			}
-
-			if (((HRESULT)(Init(pObjMap, hInstance, pLibID)) < 0))
-			{
-				Term();
-				return 0;
-			}
-
-
-
-		}
-		else if (dwReason == 0)
-			Term();
-		return 1;    
-	}
-
-	HRESULT DllCanUnloadNow()  throw()
-	{
-		return (GetLockCount()==0) ? ((HRESULT)0x00000000L) : ((HRESULT)0x00000001L);
-	}
-	HRESULT DllGetClassObject(const IID & rclsid, const IID & riid, LPVOID* ppv)  throw()
-	{
-		return GetClassObject(rclsid, riid, ppv);
-	}
-
-	HRESULT DllRegisterServer(BOOL bRegTypeLib = 1)  throw()
-	{
-		
-		return RegisterServer(bRegTypeLib);
-	}
-
-	HRESULT DllUnregisterServer(BOOL bUnRegTypeLib = 1)  throw()
-	{
-		return UnregisterServer(bUnRegTypeLib);
-	}
-
-};
-
-#pragma managed(push, off)
-inline BOOL __stdcall CComModule::DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved, _ATL_OBJMAP_ENTRY* pObjMap, const GUID* pLibID)
-{
-
-
-
-
-
-
-
-
-
-
-
-
-
-    return _DllMain(hInstance, dwReason, lpReserved, pObjMap, pLibID);
-
-}
-#pragma managed(pop)
-
-
-
-
-
-
-
-
-
-
-
-class CRTThreadTraits
-{
-public:
-	static HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpsa, DWORD dwStackSize, LPTHREAD_START_ROUTINE pfnThreadProc, void *pvParam, DWORD dwCreationFlags, DWORD *pdwThreadId) throw()
-	{
-		(void) ((!!((sizeof(DWORD) == sizeof(unsigned int)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4559, 0, L"sizeof(DWORD) == sizeof(unsigned int)")) || (__debugbreak(), 0)); 
-
-		
-		return (HANDLE) _beginthreadex(lpsa, dwStackSize, (unsigned int (__stdcall *)(void *)) pfnThreadProc, pvParam, dwCreationFlags, (unsigned int *) pdwThreadId);
-	}
-};
-
-
-
-
-
-
-
-class Win32ThreadTraits
-{
-public:
-	static HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpsa, DWORD dwStackSize, LPTHREAD_START_ROUTINE pfnThreadProc, void *pvParam, DWORD dwCreationFlags, DWORD *pdwThreadId) throw()
-	{
-		return ::CreateThread(lpsa, dwStackSize, pfnThreadProc, pvParam, dwCreationFlags, pdwThreadId);
-	}
-};
-
-
-	typedef CRTThreadTraits DefaultThreadTraits;
-
-
-
-
-template <typename T>
-HANDLE CreateThreadT(LPSECURITY_ATTRIBUTES lpsa, DWORD dwStackSize, DWORD (__stdcall * pfn)(T *pparam), 
-					 T *pparam, DWORD dwCreationFlags, LPDWORD pdw)
-{
-	return DefaultThreadTraits::CreateThread(lpsa, 
-		dwStackSize, 
-		(LPTHREAD_START_ROUTINE)pfn, 
-		pparam, 
-		dwCreationFlags, 
-		pdw);
-}
-
-template <typename T>
-HANDLE AtlCreateThread(DWORD (__stdcall* pfn)(T *pparam), T *pparam)
-{
-	return CreateThreadT(0, 0, pfn, pparam, 0, 0);
-}
-
-
-
-
-class _AtlAptCreateObjData
-{
-public:
-	_ATL_CREATORFUNC* pfnCreateInstance;
-	const IID* piid;
-	HANDLE hEvent;
-	LPSTREAM pStream;
-	HRESULT hRes;
-};
-
-class CComApartment
-{
-public:
-	CComApartment()
-	{
-		m_nLockCnt = 0;
-		m_hThread = 0;
-	}
-	static UINT ATL_CREATE_OBJECT;
-	static DWORD __stdcall _Apartment(     void* pv)
-	{
-		do { int __atl_condVal=!!(pv != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4629, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-		return ((CComApartment*)pv)->Apartment();
-	}
-	DWORD Apartment()
-	{
-		CoInitialize(0);
-		MSG msg;
-		while(GetMessageW(&msg, 0, 0, 0) > 0)
-		{
-			if (msg.message == ATL_CREATE_OBJECT)
-			{
-				_AtlAptCreateObjData* pdata = (_AtlAptCreateObjData*)msg.lParam;
-				IUnknown* pUnk = 0;
-				pdata->hRes = pdata->pfnCreateInstance(0, __uuidof(IUnknown), (void**)&pUnk);
-				if (((HRESULT)(pdata->hRes) >= 0))
-					pdata->hRes = CoMarshalInterThreadInterfaceInStream(*pdata->piid, pUnk, &pdata->pStream);
-				if (((HRESULT)(pdata->hRes) >= 0))
-				{
-					pUnk->Release();
-					ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4648)(atlTraceCOM, 2, L"Object created on thread = %d\n", GetCurrentThreadId());
-				}
-
-				else
-				{
-					ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4653)(atlTraceCOM, 2, L"Failed to create Object on thread = %d\n", GetCurrentThreadId());
-				}
-
-				SetEvent(pdata->hEvent);
-			}
-			DispatchMessageW(&msg);
-		}
-		CoUninitialize();
-
-		return 0;
-	}
-	LONG Lock() {return CComGlobalsThreadModel::Increment(&m_nLockCnt);}
-	LONG Unlock(){return CComGlobalsThreadModel::Decrement(&m_nLockCnt);
-	}
-	LONG GetLockCount() {return m_nLockCnt;}
-
-	DWORD m_dwThreadID;
-	HANDLE m_hThread;
-	LONG m_nLockCnt;
-};
-
-__declspec(selectany) UINT CComApartment::ATL_CREATE_OBJECT = 0;
-
-class CComSimpleThreadAllocator
-{
-public:
-	CComSimpleThreadAllocator()
-	{
-		m_nThread = 0;
-	}
-	int GetThread(CComApartment* , int nThreads)
-	{
-		if (++m_nThread == nThreads)
-			m_nThread = 0;
-		return m_nThread;
-	}
-	int m_nThread;
-};
-
-__interface IAtlAutoThreadModule
-{
-	virtual HRESULT CreateInstance(void* pfnCreateInstance, const IID & riid, void** ppvObj);
-};
-
-__declspec(selectany) IAtlAutoThreadModule* _pAtlAutoThreadModule;
-
-template <class T, class ThreadAllocator = CComSimpleThreadAllocator, DWORD dwWait = 0xFFFFFFFF>
-class __declspec(novtable) CAtlAutoThreadModuleT : public IAtlAutoThreadModule
-{
-
-
-
-public:
-	CAtlAutoThreadModuleT(int nThreads = T::GetDefaultThreads())
-	{
-		(void) ((!!((_pAtlAutoThreadModule == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4708, 0, L"_pAtlAutoThreadModule == 0")) || (__debugbreak(), 0));
-		_pAtlAutoThreadModule = this;
-		m_pApartments = 0;
-		m_nThreads= 0;
-
-		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{m_pApartments = new CComApartment[nThreads];} catch(...) {} __pragma(warning(pop));
-		(void) ((!!((m_pApartments != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4714, 0, L"m_pApartments != 0")) || (__debugbreak(), 0));
-		if(m_pApartments == 0)
-		{
-			CAtlBaseModule::m_bInitFailed = true;
-			do { int __atl_condVal=!!(0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4718, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-		}
-
-		memset(m_pApartments, 0, sizeof(CComApartment) * nThreads);
-
-		m_nThreads = nThreads;
-		for (int i = 0; i < nThreads; i++)
-		{
-
-
-			typedef unsigned ( __stdcall *pfnThread )( void * );
-			errno_t save_errno = Checked::get_errno();
-			Checked::set_errno(0);
-			m_pApartments[i].m_hThread = (HANDLE)_beginthreadex(0, 0, (pfnThread)CComApartment::_Apartment, &m_pApartments[i], 0, (UINT*)&m_pApartments[i].m_dwThreadID);
-			if (m_pApartments[i].m_hThread == 0)
-			{
-				HRESULT hr = ((HRESULT)0x80004005L);
-				
-				switch (Checked::get_errno())
-				{
-				case 11:
-					hr = ((HRESULT)(155L) <= 0 ? ((HRESULT)(155L)) : ((HRESULT) (((155L) & 0x0000FFFF) | (7 << 16) | 0x80000000)));
-					break;
-				case 22:
-					hr = ((HRESULT)0x80070057L);
-					break;
-				}
-				(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4745, 0, L"0")) || (__debugbreak(), 0));
-				CAtlBaseModule::m_bInitFailed = true;
-				break;
-			}
-			Checked::set_errno(save_errno);
-
-
-
-
-
-
-
-
-
-
-
-
-
-		}
-		if (!CAtlBaseModule::m_bInitFailed)
-			CComApartment::ATL_CREATE_OBJECT = RegisterWindowMessageW(L"ATL_CREATE_OBJECT");
-	}
-
-	virtual ~CAtlAutoThreadModuleT()
-	{
-		if (m_pApartments == 0)
-			return;
-
-		DWORD dwCurrentThreadId = GetCurrentThreadId();
-		int nCurrentThread = -1;
-		for (int i=0; i < m_nThreads; i++)
-		{
-			if (m_pApartments[i].m_hThread == 0)
-				continue;
-			if (m_pApartments[i].m_dwThreadID == dwCurrentThreadId)
-			{
-				nCurrentThread = i;
-				continue;
-			}
-			while (::PostThreadMessageW(m_pApartments[i].m_dwThreadID, 0x0012, 0, 0) == 0)
-			{
-				if (GetLastError() == 1444L)
-				{
-					(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4788, 0, L"0")) || (__debugbreak(), 0));
-					break;
-				}
-				::Sleep(100);
-			}
-			::WaitForSingleObject(m_pApartments[i].m_hThread, dwWait);
-			CloseHandle(m_pApartments[i].m_hThread);
-		}
-		if (nCurrentThread != -1)
-			CloseHandle(m_pApartments[nCurrentThread].m_hThread);
-
-		delete [] m_pApartments;
-		m_pApartments = 0;
-	}
-
-	HRESULT CreateInstance(void* pfnCreateInstance, const IID & riid, void** ppvObj)
-	{
-		(void) ((!!((ppvObj != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4805, 0, L"ppvObj != 0")) || (__debugbreak(), 0));
-		if (ppvObj == 0)
-			return ((HRESULT)0x80004003L);
-		*ppvObj = 0;
-
-		_ATL_CREATORFUNC* pFunc = (_ATL_CREATORFUNC*) pfnCreateInstance;
-		_AtlAptCreateObjData data;
-		data.pfnCreateInstance = pFunc;
-		data.piid = &riid;
-		data.hEvent = CreateEventW(0, 0, 0, 0);
-		data.hRes = ((HRESULT)0x00000000L);
-		int nThread = m_Allocator.GetThread(m_pApartments, m_nThreads);
-		int nIterations = 0;
-		while(::PostThreadMessageW(m_pApartments[nThread].m_dwThreadID, CComApartment::ATL_CREATE_OBJECT, 0, (LPARAM)&data) == 0 && ++nIterations < 100)
-		{
-			Sleep(100);
-		}
-		if (nIterations < 100)
-		{
-			AtlWaitWithMessageLoop(data.hEvent);
-		}
-		else
-		{
-			data.hRes = AtlHresultFromLastError();
-		}
-		CloseHandle(data.hEvent);
-		if (((HRESULT)(data.hRes) >= 0))
-			data.hRes = CoGetInterfaceAndReleaseStream(data.pStream, riid, ppvObj);
-		return data.hRes;
-	}
-	DWORD dwThreadID;
-	int m_nThreads;
-	CComApartment* m_pApartments;
-	ThreadAllocator m_Allocator;
-	static int GetDefaultThreads()
-	{
-		SYSTEM_INFO si;
-		GetSystemInfo(&si);
-		return si.dwNumberOfProcessors * 4;
-	}
-};
-
-class CAtlAutoThreadModule : public CAtlAutoThreadModuleT<CAtlAutoThreadModule>
-{
-public :
-};
-
-
-
-template <class ThreadAllocator = CComSimpleThreadAllocator, DWORD dwWait = 0xFFFFFFFF>
-class CComAutoThreadModule : 
-	public CComModule,
-	public CAtlAutoThreadModuleT<CComAutoThreadModule<ThreadAllocator,dwWait>, ThreadAllocator, dwWait>
-{
-public:
-	CComAutoThreadModule(int nThreads = GetDefaultThreads()) :
-		CAtlAutoThreadModuleT<CComAutoThreadModule<ThreadAllocator,dwWait>, ThreadAllocator, dwWait>(nThreads)
-	{
-	}
-	HRESULT Init(_ATL_OBJMAP_ENTRY* p, HINSTANCE h, const GUID* plibid = 0, int nThreads = GetDefaultThreads())
-	{
-		nThreads;
-		(void) ((!!((nThreads == GetDefaultThreads() && L"Set number of threads through the constructor"))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4867, 0, L"nThreads == GetDefaultThreads() && L\"Set number of threads through the constructor\"")) || (__debugbreak(), 0));
-		return CComModule::Init(p, h, plibid);
-	}
-};
-
-
-
-
-class Win32WaitTraits
-{
-public:
-	static DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwTimeout)
-	{
-		return ::WaitForSingleObject(hHandle, dwTimeout);
-	}
-};
-
-typedef Win32WaitTraits DefaultWaitTraits;
-
-
-
-
-template <class T>
-class CComGITPtr
-{
-public:
-	CComGITPtr() throw()
-	{
-		m_dwCookie = 0;
-	}
-	CComGITPtr(T* p)
-	{
-		m_dwCookie = 0;
-		HRESULT hr = Attach(p);
-
-		if (((HRESULT)(hr) < 0))
-			ATL::AtlThrowImpl(hr);
-	}
-	CComGITPtr(const CComGITPtr& git)
-	{
-		m_dwCookie = 0;
-		CComPtr<T> spT;
-
-		HRESULT hr = git.CopyTo(&spT);
-		if (((HRESULT)(hr) >= 0))
-			hr = Attach(spT);
-
-		if (((HRESULT)(hr) < 0))
-			ATL::AtlThrowImpl(hr);
-	}
-	explicit CComGITPtr(DWORD dwCookie) throw()
-	{
-		do { (void) ((!!((dwCookie != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4919, 0, L"dwCookie != 0")) || (__debugbreak(), 0)); ; } while(0);		
-		m_dwCookie = dwCookie;
-
-
-		CComPtr<T> spT;
-		HRESULT hr = CopyTo(&spT);
-		(void) ((!!((((HRESULT)(hr) >= 0)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4925, 0, L"((HRESULT)(hr) >= 0)")) || (__debugbreak(), 0));
-
-	}
-
-	~CComGITPtr() throw()
-	{
-		Revoke();
-	}
-	CComGITPtr<T>& operator=(const CComGITPtr<T>& git)
-	{
-        if(*this!=git)
-        {
-		    CComPtr<T> spT;
-
-		    HRESULT hr = git.CopyTo(&spT);
-		    if (((HRESULT)(hr) >= 0))
-            {
-			    hr = Attach(spT);
-            }
-
-		    if (((HRESULT)(hr) < 0))
-            {
-			    ATL::AtlThrowImpl(hr);
-            }
-        }
-		return *this;
-	}
-	CComGITPtr<T>& operator=(T* p)
-	{
-		HRESULT hr = Attach(p);
-		if (((HRESULT)(hr) < 0))
-			ATL::AtlThrowImpl(hr);
-		return *this;
-	}
-	CComGITPtr<T>& operator=(DWORD dwCookie)
-	{
-        if(*this!=dwCookie)
-        {
-		    HRESULT hr = Attach(dwCookie);
-		    if (((HRESULT)(hr) < 0))
-            {
-			    ATL::AtlThrowImpl(hr);
-            }
-
-		    m_dwCookie = dwCookie;
-
-
-		    CComPtr<T> spT;
-		    hr = CopyTo(&spT);
-		    (void) ((!!((((HRESULT)(hr) >= 0)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4974, 0, L"((HRESULT)(hr) >= 0)")) || (__debugbreak(), 0));
-
-        }
-		return *this;
-	}
-
-    
-    bool operator!=(CComGITPtr<T>& git) const
-    {
-        return !operator==(git);
-    }
-
-    bool operator!=(DWORD dwCookie) const
-    {
-        return !operator==(dwCookie);
-    }
-
-    bool operator==(CComGITPtr<T>& git) const
-    {
-        return m_dwCookie==git.GetCookie();
-    }
-
-    bool operator==(DWORD dwCookie) const
-    {
-        return m_dwCookie==dwCookie;
-    }
-
-	
-	operator DWORD() const
-	{
-		return m_dwCookie;
-	}
-	
-	DWORD GetCookie() const
-	{
-		return m_dwCookie;
-	}
-	
-	HRESULT Attach(T* p) throw()
-	{
-		CComPtr<IGlobalInterfaceTable> spGIT;
-		HRESULT hr = ((HRESULT)0x80004005L);
-		hr = AtlGetGITPtr(&spGIT);
-		(void) ((!!((spGIT != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5017, 0, L"spGIT != 0")) || (__debugbreak(), 0));
-		(void) ((!!((((HRESULT)(hr) >= 0)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5018, 0, L"((HRESULT)(hr) >= 0)")) || (__debugbreak(), 0));
-		if (((HRESULT)(hr) < 0))
-			return hr;
-
-		if (m_dwCookie != 0)
-			hr = spGIT->RevokeInterfaceFromGlobal(m_dwCookie);
-		if (((HRESULT)(hr) < 0))
-			return hr;
-
-		return spGIT->RegisterInterfaceInGlobal(p, __uuidof(T), &m_dwCookie);
-	}
-
-	HRESULT Attach(DWORD dwCookie) throw()
-	{
-		(void) ((!!((dwCookie != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5032, 0, L"dwCookie != 0")) || (__debugbreak(), 0));
-		HRESULT hr = Revoke();
-		if (((HRESULT)(hr) < 0))
-			return hr;
-		m_dwCookie = dwCookie;
-		return ((HRESULT)0x00000000L);
-	}
-
-	
-	DWORD Detach() throw()
-	{
-		DWORD dwCookie = m_dwCookie;
-		m_dwCookie = 0;
-		return dwCookie;
-	}
-
-	
-	HRESULT Revoke() throw()
-	{
-		HRESULT hr = ((HRESULT)0x00000000L);
-		if (m_dwCookie != 0)
-		{
-			CComPtr<IGlobalInterfaceTable> spGIT;
-			HRESULT hr = ((HRESULT)0x80004005L);
-			hr = AtlGetGITPtr(&spGIT);
-
-			(void) ((!!((spGIT != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5058, 0, L"spGIT != 0")) || (__debugbreak(), 0));
-			(void) ((!!((((HRESULT)(hr) >= 0)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5059, 0, L"((HRESULT)(hr) >= 0)")) || (__debugbreak(), 0));
-			if (((HRESULT)(hr) < 0))
-				return hr;
-
-			hr = spGIT->RevokeInterfaceFromGlobal(m_dwCookie);
-			if (((HRESULT)(hr) >= 0))
-				m_dwCookie = 0;
-		}
-		return hr;
-	}
-	
-	
-	HRESULT CopyTo(T** pp) const throw()
-	{
-		CComPtr<IGlobalInterfaceTable> spGIT;
-		HRESULT hr = ((HRESULT)0x80004005L);
-		hr = AtlGetGITPtr(&spGIT);
-
-		(void) ((!!((spGIT != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5077, 0, L"spGIT != 0")) || (__debugbreak(), 0));
-		(void) ((!!((((HRESULT)(hr) >= 0)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5078, 0, L"((HRESULT)(hr) >= 0)")) || (__debugbreak(), 0));
-		if (((HRESULT)(hr) < 0))
-			return hr;
-
-		do { (void) ((!!((m_dwCookie!=0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5082, 0, L"m_dwCookie!=0")) || (__debugbreak(), 0)); ; } while(0);
-		return spGIT->GetInterfaceFromGlobal(m_dwCookie, __uuidof(T), (void**)pp);
-	}
-	DWORD m_dwCookie;
-};
-
-
-
-
-class CRegKey
-{
-public:
-	CRegKey() throw();
-	CRegKey( CRegKey& key ) throw();
-	explicit CRegKey(HKEY hKey) throw();
-	~CRegKey() throw();
-
-	CRegKey& operator=( CRegKey& key ) throw();
-
-
-public:
-	operator HKEY() const throw();
-	HKEY m_hKey;
-
-
-public:
-	__declspec( deprecated("CRegKey::SetValue(DWORD, TCHAR *valueName) has been superseded by CRegKey::SetDWORDValue") )
-	LONG SetValue(DWORD dwValue, LPCTSTR lpszValueName);
-	__declspec( deprecated("CRegKey::SetValue(TCHAR *value, TCHAR *valueName) has been superseded by CRegKey::SetStringValue and CRegKey::SetMultiStringValue") )
-	LONG SetValue(LPCTSTR lpszValue, LPCTSTR lpszValueName = 0, bool bMulti = false, int nValueLen = -1);
-	LONG SetValue(LPCTSTR pszValueName, DWORD dwType, const void* pValue, ULONG nBytes) throw();
-	LONG SetGUIDValue(LPCTSTR pszValueName, const GUID & guidValue) throw();
-	LONG SetBinaryValue(LPCTSTR pszValueName, const void* pValue, ULONG nBytes) throw();
-	LONG SetDWORDValue(LPCTSTR pszValueName, DWORD dwValue) throw();
-	LONG SetQWORDValue(LPCTSTR pszValueName, ULONGLONG qwValue) throw();
-	LONG SetStringValue(LPCTSTR pszValueName, LPCTSTR pszValue, DWORD dwType = ( 1 )) throw();
-	LONG SetMultiStringValue(LPCTSTR pszValueName, LPCTSTR pszValue) throw();
-
-	__declspec( deprecated("CRegKey::QueryValue(DWORD, TCHAR *valueName) has been superseded by CRegKey::QueryDWORDValue") )
-	LONG QueryValue(     DWORD& dwValue,          LPCTSTR lpszValueName);
-	__declspec( deprecated("CRegKey::QueryValue(TCHAR *value, TCHAR *valueName) has been superseded by CRegKey::QueryStringValue and CRegKey::QueryMultiStringValue") )
-	LONG QueryValue(           LPTSTR szValue,          LPCTSTR lpszValueName,      DWORD* pdwCount);
-	LONG QueryValue(         LPCTSTR pszValueName, DWORD* pdwType, void* pData, ULONG* pnBytes) throw();
-	LONG QueryGUIDValue(         LPCTSTR pszValueName, GUID& guidValue) throw();
-	LONG QueryBinaryValue(         LPCTSTR pszValueName, void* pValue, ULONG* pnBytes) throw();
-	LONG QueryDWORDValue(         LPCTSTR pszValueName, DWORD& dwValue) throw();
-	LONG QueryQWORDValue(         LPCTSTR pszValueName, ULONGLONG& qwValue) throw();
-	LONG QueryStringValue(         LPCTSTR pszValueName,                 LPTSTR pszValue,      ULONG* pnChars) throw();
-	LONG QueryMultiStringValue(         LPCTSTR pszValueName,                 LPTSTR pszValue,      ULONG* pnChars) throw();
-
-	
-	LONG GetKeySecurity(SECURITY_INFORMATION si, PSECURITY_DESCRIPTOR psd, LPDWORD pnBytes) throw();
-	
-	LONG SetKeySecurity(SECURITY_INFORMATION si, PSECURITY_DESCRIPTOR psd) throw();
-
-	LONG SetKeyValue(LPCTSTR lpszKeyName, LPCTSTR lpszValue, LPCTSTR lpszValueName = 0) throw();
-	static LONG __stdcall SetValue(HKEY hKeyParent, LPCTSTR lpszKeyName,
-		LPCTSTR lpszValue, LPCTSTR lpszValueName = 0);
-
-	
-	LONG Create(     HKEY hKeyParent,        LPCTSTR lpszKeyName,
-		       LPTSTR lpszClass = ( 0 ),      DWORD dwOptions = (0x00000000L),
-		     REGSAM samDesired = ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))) | ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))),
-		       LPSECURITY_ATTRIBUTES lpSecAttr = 0,
-		       LPDWORD lpdwDisposition = 0) throw();
-	
-	LONG Open(HKEY hKeyParent, LPCTSTR lpszKeyName,
-		REGSAM samDesired = ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))) | ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L)))) throw();
-	
-	LONG Close() throw();
-	
-	LONG Flush() throw();
-
-	
-	HKEY Detach() throw();
-	
-	void Attach(HKEY hKey) throw();
-
-	
-	LONG EnumKey(     DWORD iIndex,          LPTSTR pszName,      LPDWORD pnNameLength,        FILETIME* pftLastWriteTime = 0) throw();
-	LONG NotifyChangeKeyValue(BOOL bWatchSubtree, DWORD dwNotifyFilter, HANDLE hEvent, BOOL bAsync = 1) throw();
-
-	LONG DeleteSubKey(LPCTSTR lpszSubKey) throw();
-	LONG RecurseDeleteKey(LPCTSTR lpszKey) throw();
-	LONG DeleteValue(LPCTSTR lpszValue) throw();
-};
-
-inline CRegKey::CRegKey() throw() : 
-	m_hKey( 0 )
-{
-}
-
-inline CRegKey::CRegKey( CRegKey& key ) throw() :
-	m_hKey( 0 )
-{
-	Attach( key.Detach() );
-}
-
-inline CRegKey::CRegKey(HKEY hKey) throw() :
-	m_hKey(hKey)
-{
-}
-
-inline CRegKey::~CRegKey() throw()
-{Close();}
-
-inline CRegKey& CRegKey::operator=( CRegKey& key ) throw()
-{
-    if(m_hKey!=key.m_hKey)
-    {
-	    Close();
-	    Attach( key.Detach() );
-    }
-	return( *this );
-}
-
-inline CRegKey::operator HKEY() const throw()
-{return m_hKey;}
-
-inline HKEY CRegKey::Detach() throw()
-{
-	HKEY hKey = m_hKey;
-	m_hKey = 0;
-	return hKey;
-}
-
-inline void CRegKey::Attach(HKEY hKey) throw()
-{
-	do { (void) ((!!((m_hKey == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5210, 0, L"m_hKey == 0")) || (__debugbreak(), 0)); ; } while(0);
-	m_hKey = hKey;
-}
-
-inline LONG CRegKey::DeleteSubKey(LPCTSTR lpszSubKey) throw()
-{
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5216, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-	return RegDeleteKeyW(m_hKey, lpszSubKey);
-}
-
-inline LONG CRegKey::DeleteValue(LPCTSTR lpszValue) throw()
-{
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5222, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-	return RegDeleteValueW(m_hKey, (LPTSTR)lpszValue);
-}
-
-inline LONG CRegKey::Close() throw()
-{
-	LONG lRes = 0L;
-	if (m_hKey != 0)
-	{
-		lRes = RegCloseKey(m_hKey);
-		m_hKey = 0;
-	}
-	return lRes;
-}
-
-inline LONG CRegKey::Flush() throw()
-{
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5239, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-
-	return ::RegFlushKey(m_hKey);
-}
-
-inline LONG CRegKey::EnumKey(     DWORD iIndex,          LPTSTR pszName,      LPDWORD pnNameLength,        FILETIME* pftLastWriteTime) throw()
-{
-	FILETIME ftLastWriteTime;
-
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5248, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-	if (pftLastWriteTime == 0)
-	{
-		pftLastWriteTime = &ftLastWriteTime;
-	}
-
-	return ::RegEnumKeyExW(m_hKey, iIndex, pszName, pnNameLength, 0, 0, 0, pftLastWriteTime);
-}
-
-inline LONG CRegKey::NotifyChangeKeyValue(BOOL bWatchSubtree, DWORD dwNotifyFilter, HANDLE hEvent, BOOL bAsync) throw()
-{
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5259, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-	(void) ((!!(((hEvent != 0) || !bAsync))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5260, 0, L"(hEvent != 0) || !bAsync")) || (__debugbreak(), 0));
-
-	return ::RegNotifyChangeKeyValue(m_hKey, bWatchSubtree, dwNotifyFilter, hEvent, bAsync);
-}
-
-inline LONG CRegKey::Create(     HKEY hKeyParent,        LPCTSTR lpszKeyName,
-	       LPTSTR lpszClass,      DWORD dwOptions,      REGSAM samDesired,
-	       LPSECURITY_ATTRIBUTES lpSecAttr,        LPDWORD lpdwDisposition) throw()
-{
-	(void) ((!!((hKeyParent != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5269, 0, L"hKeyParent != 0")) || (__debugbreak(), 0));
-	DWORD dw;
-	HKEY hKey = 0;
-	LONG lRes = RegCreateKeyExW(hKeyParent, lpszKeyName, 0,
-		lpszClass, dwOptions, samDesired, lpSecAttr, &hKey, &dw);
-	if (lpdwDisposition != 0)
-		*lpdwDisposition = dw;
-	if (lRes == 0L)
-	{
-		lRes = Close();
-		m_hKey = hKey;
-	}
-	return lRes;
-}
-
-inline LONG CRegKey::Open(HKEY hKeyParent, LPCTSTR lpszKeyName, REGSAM samDesired) throw()
-{
-	(void) ((!!((hKeyParent != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5286, 0, L"hKeyParent != 0")) || (__debugbreak(), 0));
-	HKEY hKey = 0;
-	LONG lRes = RegOpenKeyExW(hKeyParent, lpszKeyName, 0, samDesired, &hKey);
-	if (lRes == 0L)
-	{
-		lRes = Close();
-		(void) ((!!((lRes == 0L))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5292, 0, L"lRes == 0L")) || (__debugbreak(), 0));
-		m_hKey = hKey;
-	}
-	return lRes;
-}
-
-#pragma warning(push)
-#pragma warning(disable: 4996)
-inline LONG CRegKey::QueryValue(DWORD& dwValue, LPCTSTR lpszValueName)
-{
-	DWORD dwType = 0;
-	DWORD dwCount = sizeof(DWORD);
-	LONG lRes = RegQueryValueExW(m_hKey, lpszValueName, 0, &dwType,
-		(LPBYTE)&dwValue, &dwCount);
-	(void) ((!!(((lRes!=0L) || (dwType == ( 4 ))))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5306, 0, L"(lRes!=0L) || (dwType == ( 4 ))")) || (__debugbreak(), 0));
-	(void) ((!!(((lRes!=0L) || (dwCount == sizeof(DWORD))))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5307, 0, L"(lRes!=0L) || (dwCount == sizeof(DWORD))")) || (__debugbreak(), 0));
-	if (dwType != ( 4 ))
-		return 13L;
-	return lRes;
-}
-
-#pragma warning(disable: 6053)
-inline LONG CRegKey::QueryValue(           LPTSTR pszValue,          LPCTSTR lpszValueName,      DWORD* pdwCount)
-{
-	do { int __atl_condVal=!!(pdwCount != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5316, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-	DWORD dwType = 0;
-	LONG lRes = RegQueryValueExW(m_hKey, lpszValueName, 0, &dwType, (LPBYTE)pszValue, pdwCount);
-	(void) ((!!(((lRes!=0L) || (dwType == ( 1 )) || (dwType == ( 7 )) || (dwType == ( 2 ))))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5320, 0, L"(lRes!=0L) || (dwType == ( 1 )) || (dwType == ( 7 )) || (dwType == ( 2 ))")) || (__debugbreak(), 0));
-	if (pszValue != 0)
-	{
-		if(*pdwCount>0)
-		{
-			switch(dwType)
-			{
-				case ( 1 ):
-				case ( 2 ):
-					if ((*pdwCount) % sizeof(TCHAR) != 0 || pszValue[(*pdwCount) / sizeof(TCHAR) - 1] != 0)
-					{
-						pszValue[0]=L'\0';
-		 				return 13L;
-					}
-					break;
-				case ( 7 ):
-					if ((*pdwCount) % sizeof(TCHAR) != 0 || (*pdwCount) / sizeof(TCHAR) < 1 || pszValue[(*pdwCount) / sizeof(TCHAR) -1] != 0 || (((*pdwCount) / sizeof(TCHAR))>1 && pszValue[(*pdwCount) / sizeof(TCHAR) - 2] != 0) )
-					{
-						pszValue[0]=L'\0';
-						return 13L;
-					}
-					break;
-				default:
-					
-					pszValue[0]=L'\0';
-					return 13L;
-			}
-		}
-		else
-		{
-			
-			
-			pszValue[0]=L'\0';
-		}
-	}
-	return lRes;
-}
-#pragma warning(pop)	
-
-inline LONG CRegKey::QueryValue(LPCTSTR pszValueName, DWORD* pdwType, void* pData, ULONG* pnBytes) throw()
-{
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5361, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-
-	return( ::RegQueryValueExW(m_hKey, pszValueName, 0, pdwType, static_cast< LPBYTE >( pData ), pnBytes) );
-}
-
-inline LONG CRegKey::QueryDWORDValue(LPCTSTR pszValueName, DWORD& dwValue) throw()
-{
-	LONG lRes;
-	ULONG nBytes;
-	DWORD dwType;
-
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5372, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-
-	nBytes = sizeof(DWORD);
-	lRes = ::RegQueryValueExW(m_hKey, pszValueName, 0, &dwType, reinterpret_cast<LPBYTE>(&dwValue),
-		&nBytes);
-	if (lRes != 0L)
-		return lRes;
-	if (dwType != ( 4 ))
-		return 13L;
-
-	return 0L;
-}
-inline LONG CRegKey::QueryQWORDValue(LPCTSTR pszValueName, ULONGLONG& qwValue) throw()
-{
-	LONG lRes;
-	ULONG nBytes;
-	DWORD dwType;
-
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5390, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-
-	nBytes = sizeof(ULONGLONG);
-	lRes = ::RegQueryValueExW(m_hKey, pszValueName, 0, &dwType, reinterpret_cast<LPBYTE>(&qwValue),
-		&nBytes);
-	if (lRes != 0L)
-		return lRes;
-	if (dwType != ( 11 ))
-		return 13L;
-
-	return 0L;
-}
-
-inline LONG CRegKey::QueryBinaryValue(LPCTSTR pszValueName, void* pValue, ULONG* pnBytes) throw()
-{
-	LONG lRes;
-	DWORD dwType;
-
-	(void) ((!!((pnBytes != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5408, 0, L"pnBytes != 0")) || (__debugbreak(), 0));
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5409, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-
-	lRes = ::RegQueryValueExW(m_hKey, pszValueName, 0, &dwType, reinterpret_cast<LPBYTE>(pValue),
-		pnBytes);
-	if (lRes != 0L)
-		return lRes;
-	if (dwType != ( 3 ))
-		return 13L;
-
-	return 0L;
-}
-
-#pragma warning(push)
-#pragma warning(disable: 6053)
-
-inline LONG CRegKey::QueryStringValue(LPCTSTR pszValueName, LPTSTR pszValue, ULONG* pnChars) throw()
-{
-	LONG lRes;
-	DWORD dwType;
-	ULONG nBytes;
-
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5430, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-	(void) ((!!((pnChars != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5431, 0, L"pnChars != 0")) || (__debugbreak(), 0));
-
-	nBytes = (*pnChars)*sizeof(TCHAR);
-	*pnChars = 0;
-	lRes = ::RegQueryValueExW(m_hKey, pszValueName, 0, &dwType, reinterpret_cast<LPBYTE>(pszValue),
-		&nBytes);
-	
-	if (lRes != 0L)
-	{
-		return lRes;
-	}
-
-	if(dwType != ( 1 ) && dwType != ( 2 ))
-	{
-		return 13L;
-	}
-
-	if (pszValue != 0)
-	{
-		if(nBytes!=0)
-		{
-			if ((nBytes % sizeof(TCHAR) != 0) || (pszValue[nBytes / sizeof(TCHAR) -1] != 0))
-			{
- 				return 13L;
-            }
-        }
-        else
-        {
-            pszValue[0]=L'\0';
-        }
-    }
-
- 	*pnChars = nBytes/sizeof(TCHAR);
-	
-	return 0L;
-}
-#pragma warning(pop)
-
-#pragma warning(push)
-#pragma warning(disable: 6053)
-
-inline LONG CRegKey::QueryMultiStringValue(LPCTSTR pszValueName, LPTSTR pszValue, ULONG* pnChars) throw()
-{
-	LONG lRes;
-	DWORD dwType;
-	ULONG nBytes;
-
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5478, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-	(void) ((!!((pnChars != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5479, 0, L"pnChars != 0")) || (__debugbreak(), 0));
-
-	if (pszValue != 0 && *pnChars < 2)
-		return 122L;
-		
-	nBytes = (*pnChars)*sizeof(TCHAR);
-	*pnChars = 0;
-	
-	lRes = ::RegQueryValueExW(m_hKey, pszValueName, 0, &dwType, reinterpret_cast<LPBYTE>(pszValue),
-		&nBytes);
-	if (lRes != 0L)
-		return lRes;
-	if (dwType != ( 7 ))
-		return 13L;
-	if (pszValue != 0 && (nBytes % sizeof(TCHAR) != 0 || nBytes / sizeof(TCHAR) < 1 || pszValue[nBytes / sizeof(TCHAR) -1] != 0 || ((nBytes/sizeof(TCHAR))>1 && pszValue[nBytes / sizeof(TCHAR) - 2] != 0)))
-		return 13L;
-
-	*pnChars = nBytes/sizeof(TCHAR);
-
-	return 0L;
-}
-#pragma warning(pop)
-
-inline LONG CRegKey::QueryGUIDValue(LPCTSTR pszValueName, GUID& guidValue) throw()
-{
-	TCHAR szGUID[64];
-	LONG lRes;
-	ULONG nCount;
-	HRESULT hr;
-
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5509, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-
-	guidValue = GUID_NULL;
-
-	nCount = 64;
-	lRes = QueryStringValue(pszValueName, szGUID, &nCount);
-
-	if (lRes != 0L)
-		return lRes;
-
-	if(szGUID[0] != L'{')
-		return 13L;
-
-	int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
-	LPOLESTR lpstr = T2OLE_EX(szGUID, 1024);
-
-
-
-
-		
-	hr = ::CLSIDFromString(lpstr, &guidValue);
-	if (((HRESULT)(hr) < 0))
-		return 13L;
-
-	return 0L;
-}
-
-inline LONG __stdcall CRegKey::SetValue(HKEY hKeyParent, LPCTSTR lpszKeyName, LPCTSTR lpszValue, LPCTSTR lpszValueName)
-{
-	(void) ((!!((lpszValue != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5538, 0, L"lpszValue != 0")) || (__debugbreak(), 0));
-	CRegKey key;
-	LONG lRes = key.Create(hKeyParent, lpszKeyName);
-	if (lRes == 0L)
-		lRes = key.SetStringValue(lpszValueName, lpszValue);
-	return lRes;
-}
-
-inline LONG CRegKey::SetKeyValue(LPCTSTR lpszKeyName, LPCTSTR lpszValue, LPCTSTR lpszValueName) throw()
-{
-	(void) ((!!((lpszValue != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5548, 0, L"lpszValue != 0")) || (__debugbreak(), 0));
-	CRegKey key;
-	LONG lRes = key.Create(m_hKey, lpszKeyName);
-	if (lRes == 0L)
-		lRes = key.SetStringValue(lpszValueName, lpszValue);
-	return lRes;
-}
-
-#pragma warning(push)
-#pragma warning(disable: 4996)
-inline LONG CRegKey::SetValue(DWORD dwValue, LPCTSTR pszValueName)
-{
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5560, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-	return SetDWORDValue(pszValueName, dwValue);
-}
-
-inline LONG CRegKey::SetValue(LPCTSTR lpszValue, LPCTSTR lpszValueName, bool bMulti, int nValueLen)
-{
-	do { int __atl_condVal=!!(lpszValue != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5566, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5567, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-
-	if (bMulti && nValueLen == -1)
-		return 87L;
-
-	if (nValueLen == -1)
-		nValueLen = lstrlenW(lpszValue) + 1;
-
-	DWORD dwType = bMulti ? ( 7 ) : ( 1 );
-
-	return ::RegSetValueExW(m_hKey, lpszValueName, 0, dwType,
-		reinterpret_cast<const BYTE*>(lpszValue), nValueLen*sizeof(TCHAR));
-}
-#pragma warning(pop)
-
-inline LONG CRegKey::SetValue(LPCTSTR pszValueName, DWORD dwType, const void* pValue, ULONG nBytes) throw()
-{
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5584, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-	return ::RegSetValueExW(m_hKey, pszValueName, 0, dwType, static_cast<const BYTE*>(pValue), nBytes);
-}
-
-inline LONG CRegKey::SetBinaryValue(LPCTSTR pszValueName, const void* pData, ULONG nBytes) throw()
-{
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5590, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-	return ::RegSetValueExW(m_hKey, pszValueName, 0, ( 3 ), reinterpret_cast<const BYTE*>(pData), nBytes);
-}
-
-inline LONG CRegKey::SetDWORDValue(LPCTSTR pszValueName, DWORD dwValue) throw()
-{
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5596, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-	return ::RegSetValueExW(m_hKey, pszValueName, 0, ( 4 ), reinterpret_cast<const BYTE*>(&dwValue), sizeof(DWORD));
-}
-
-inline LONG CRegKey::SetQWORDValue(LPCTSTR pszValueName, ULONGLONG qwValue) throw()
-{
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5602, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-	return ::RegSetValueExW(m_hKey, pszValueName, 0, ( 11 ), reinterpret_cast<const BYTE*>(&qwValue), sizeof(ULONGLONG));
-}
-
-inline LONG CRegKey::SetStringValue(         LPCTSTR pszValueName,        LPCTSTR pszValue,      DWORD dwType) throw()
-{
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5608, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-	do { int __atl_condVal=!!(pszValue != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5609, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-	(void) ((!!(((dwType == ( 1 )) || (dwType == ( 2 ))))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5610, 0, L"(dwType == ( 1 )) || (dwType == ( 2 ))")) || (__debugbreak(), 0));
-
-	return ::RegSetValueExW(m_hKey, pszValueName, 0, dwType, reinterpret_cast<const BYTE*>(pszValue), (lstrlenW(pszValue)+1)*sizeof(TCHAR));
-}
-
-inline LONG CRegKey::SetMultiStringValue(LPCTSTR pszValueName, LPCTSTR pszValue) throw()
-{
-	LPCTSTR pszTemp;
-	ULONG nBytes;
-	ULONG nLength;
-
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5621, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-	do { int __atl_condVal=!!(pszValue != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5622, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-
-	
-	
-	
-	nBytes = 0;
-	pszTemp = pszValue;
-	do
-	{
-		nLength = lstrlenW(pszTemp)+1;
-		pszTemp += nLength;
-		nBytes += nLength*sizeof(TCHAR);
-	} while (nLength != 1);
-
-	return ::RegSetValueExW(m_hKey, pszValueName, 0, ( 7 ), reinterpret_cast<const BYTE*>(pszValue),
-		nBytes);
-}
-
-inline LONG CRegKey::SetGUIDValue(LPCTSTR pszValueName, const GUID & guidValue) throw()
-{
-	OLECHAR szGUID[64];
-
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5644, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-
-	::StringFromGUID2(guidValue, szGUID, 64);
-
-	int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
-	LPCTSTR lpstr = OLE2CT_EX(szGUID, 1024);
-
-
-
-
-	return SetStringValue(pszValueName, lpstr);
-}
-
-inline LONG CRegKey::GetKeySecurity(SECURITY_INFORMATION si, PSECURITY_DESCRIPTOR psd, LPDWORD pnBytes) throw()
-{
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5659, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-	(void) ((!!((pnBytes != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5660, 0, L"pnBytes != 0")) || (__debugbreak(), 0));
-
-	return ::RegGetKeySecurity(m_hKey, si, psd, pnBytes);
-}
-
-inline LONG CRegKey::SetKeySecurity(SECURITY_INFORMATION si, PSECURITY_DESCRIPTOR psd) throw()
-{
-	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5667, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
-	(void) ((!!((psd != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5668, 0, L"psd != 0")) || (__debugbreak(), 0));
-
-	return ::RegSetKeySecurity(m_hKey, si, psd);
-}
-
-inline LONG CRegKey::RecurseDeleteKey(LPCTSTR lpszKey) throw()
-{
-	CRegKey key;
-	LONG lRes = key.Open(m_hKey, lpszKey, ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))) | ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))));
-	if (lRes != 0L)
-	{
-		if (lRes != 2L && lRes != 3L)
-		{
-			ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5681)(atlTraceCOM, 0, L"CRegKey::RecurseDeleteKey : Failed to Open Key %s(Error = %d)\n", lpszKey, lRes);
-		}
-		return lRes;
-	}
-	FILETIME time;
-	DWORD dwSize = 256;
-	TCHAR szBuffer[256];
-	while (RegEnumKeyExW(key.m_hKey, 0, szBuffer, &dwSize, 0, 0, 0,
-		&time)==0L)
-	{
-		lRes = key.RecurseDeleteKey(szBuffer);
-		if (lRes != 0L)
-			return lRes;
-		dwSize = 256;
-	}
-	key.Close();
-	return DeleteSubKey(lpszKey);
-}
-
-
-
-inline HRESULT CComModule::RegisterProgID(LPCTSTR lpszCLSID, LPCTSTR lpszProgID, LPCTSTR lpszUserDesc)
-{
-	CRegKey keyProgID;
-	LONG lRes = keyProgID.Create((( HKEY ) (ULONG_PTR)((LONG)0x80000000) ), lpszProgID, ( 0 ), (0x00000000L), (0x0002));
-	if (lRes == 0L)
-	{
-		lRes = keyProgID.SetStringValue(0, lpszUserDesc);
-		if (lRes == 0L)
-		{
-			lRes = keyProgID.SetKeyValue(L"CLSID", lpszCLSID);
-			if (lRes == 0L)
-				return ((HRESULT)0x00000000L);
-		}
-	}
-	return AtlHresultFromWin32(lRes);
-}
-
-inline HRESULT CComModule::RegisterAppId(LPCTSTR pAppId)
-{
-	CRegKey keyAppID;
-	HRESULT hr = ((HRESULT)0x00000000L);
-	LONG lRet;
-
-	if ( (lRet = keyAppID.Open((( HKEY ) (ULONG_PTR)((LONG)0x80000000) ), L"AppID", ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))))) == 0L)
-	{
-		TCHAR szModule1[260];
-		TCHAR szModule2[260];
-		TCHAR* pszFileName;
-
-		DWORD dwFLen = ::GetModuleFileNameW(GetModuleInstance(), szModule1, 260);
-		if ( dwFLen != 0 && dwFLen != 260 )
-		{
-			if (::GetFullPathNameW(szModule1, 260, szModule2, &pszFileName) != 0)
-			{
-				CRegKey keyAppIDEXE;
-				if ( (lRet = keyAppIDEXE.Create(keyAppID, pszFileName, ( 0 ), (0x00000000L), ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))) | ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))))) == 0L)
-				{
-					lRet = keyAppIDEXE.SetStringValue(L"AppID", pAppId);
-					if (lRet != 0L) 
-					{
-						ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5742)(atlTraceCOM, 0, L"CComModule::RegisterAppId : Failed to set app id string value\n");
-						hr = AtlHresultFromWin32(lRet);
-						return hr;
-					}
-				}
-				else
-				{
-					ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5749)(atlTraceCOM, 0, L"CComModule::RegisterAppId : Failed to create file name key\n");
-					hr = AtlHresultFromWin32(lRet);
-					return hr;
-				}
-				if ( (lRet = keyAppIDEXE.Create(keyAppID, pAppId, ( 0 ), (0x00000000L), ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))) | ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))))) == 0L)
-				{	
-					lRet = keyAppIDEXE.SetStringValue(0, pszFileName);
-					if (lRet != 0L)
-					{
-						ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5758)(atlTraceCOM, 0, L"CComModule::RegisterAppId : Failed to set file name string value\n");
-						hr = AtlHresultFromWin32(lRet);
-						return hr;
-					}
-				}
-				else
-				{
-					ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5765)(atlTraceCOM, 0, L"CComModule::RegisterAppId : Failed to create app id key\n");
-					hr = AtlHresultFromWin32(lRet);
-					return hr;
-				}
-			}
-			else
-			{
-				ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5772)(atlTraceCOM, 0, L"CComModule::RegisterAppId : Failed to get full path name for file %s\n", szModule1);
-				hr = AtlHresultFromLastError();
-			}
-		}
-		else
-		{
-			ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5778)(atlTraceCOM, 0, L"CComModule::RegisterAppId : Failed to get module name\n");
-			if( dwFLen == 0 )
-				hr = AtlHresultFromLastError();
-			else if( dwFLen == 260 )
-				hr =  ((HRESULT)(122L) <= 0 ? ((HRESULT)(122L)) : ((HRESULT) (((122L) & 0x0000FFFF) | (7 << 16) | 0x80000000)));
-		}
-	}
-	else
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5787)(atlTraceCOM, 0, L"CComModule::RegisterAppId : Failed to open registry key\n");
-		hr = AtlHresultFromWin32(lRet);
-	}
-	return hr;
-}
-
-inline HRESULT CComModule::UnregisterAppId(LPCTSTR pAppId)
-{
-	CRegKey keyAppID;
-	HRESULT hr = ((HRESULT)0x00000000L);
-	LONG lRet = keyAppID.Open((( HKEY ) (ULONG_PTR)((LONG)0x80000000) ), L"AppID", ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))) | ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))));
-
-	if (lRet == 0L)
-	{
-		TCHAR szModule1[260];
-		TCHAR szModule2[260];
-		TCHAR* pszFileName;
-
-		DWORD dwFLen = ::GetModuleFileNameW(GetModuleInstance(), szModule1, 260);
-		if ( dwFLen != 0 && dwFLen != 260 )
-		{
-			if (::GetFullPathNameW(szModule1, 260, szModule2, &pszFileName) != 0)
-			{
-				if ((lRet = keyAppID.RecurseDeleteKey(pAppId)) != 0L)
-				{
-					if (lRet != 2L) 
-						hr = AtlHresultFromWin32(lRet);
-				}
-				if ((lRet = keyAppID.RecurseDeleteKey(pszFileName)) != 0L)
-				{
-					if (lRet != 2L) 
-						hr = AtlHresultFromWin32(lRet);
-				}
-			}
-			else
-			{
-				ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5823)(atlTraceCOM, 0, L"CComModule::UnregisterAppId : Failed to get full path name for file %s\n", szModule1);
-				hr = AtlHresultFromLastError();
-			}
-		}
-		else
-		{
-			ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5829)(atlTraceCOM, 0, L"CComModule::UnregisterAppId : Failed to get module name\n");
-			if( dwFLen == 0 )
-				hr = AtlHresultFromLastError();
-			else if( dwFLen == 260 )
-				hr = ((HRESULT)(122L) <= 0 ? ((HRESULT)(122L)) : ((HRESULT) (((122L) & 0x0000FFFF) | (7 << 16) | 0x80000000)));
-		}
-	}
-	else
-	{
-		if (lRet != 2L && lRet != 3L)
-		{
-			ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5840)(atlTraceCOM, 0, L"CComModule::UnregisterAppId : Failed to open registry key\n");
-			hr = AtlHresultFromWin32(lRet);
-		}
-	}
-	return hr;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma warning( push )
-#pragma warning( disable: 4996 )  
-
-inline HRESULT __stdcall CComModule::UpdateRegistryClass(const CLSID& clsid, LPCTSTR lpszProgID,
-	LPCTSTR lpszVerIndProgID, UINT nDescID, DWORD dwFlags, BOOL bRegister)
-{
-	if (bRegister)
-	{
-		TCHAR szDesc[256];
-		LoadStringW(m_hInst, nDescID, szDesc, 256);
-		return RegisterClassHelper(clsid, lpszProgID, lpszVerIndProgID, szDesc, dwFlags);
-	}
-	return UnregisterClassHelper(clsid, lpszProgID, lpszVerIndProgID);
-}
-
-inline HRESULT __stdcall CComModule::UpdateRegistryClass(const CLSID& clsid, LPCTSTR lpszProgID,
-	LPCTSTR lpszVerIndProgID, LPCTSTR szDesc, DWORD dwFlags, BOOL bRegister)
-{
-	if (bRegister)
-		return RegisterClassHelper(clsid, lpszProgID, lpszVerIndProgID, szDesc, dwFlags);
-	return UnregisterClassHelper(clsid, lpszProgID, lpszVerIndProgID);
-}
-
-inline HRESULT __stdcall CComModule::RegisterClassHelper(const CLSID& clsid, LPCTSTR lpszProgID,
-	LPCTSTR lpszVerIndProgID, LPCTSTR szDesc, DWORD dwFlags)
-{
-	static const TCHAR szProgID[] = L"ProgID";
-	static const TCHAR szVIProgID[] = L"VersionIndependentProgID";
-	static const TCHAR szLS32[] = L"LocalServer32";
-	static const TCHAR szIPS32[] = L"InprocServer32";
-	static const TCHAR szThreadingModel[] = L"ThreadingModel";
-	static const TCHAR szAUTPRX32[] = L"AUTPRX32.DLL";
-	static const TCHAR szApartment[] = L"Apartment";
-	static const TCHAR szBoth[] = L"both";
-	int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
-	TCHAR szModule[260 + 2];
-
-	do { int __atl_condVal=!!(lpszProgID && lpszVerIndProgID || !lpszProgID && !lpszVerIndProgID); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 6062, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-
-	if (!szDesc)
-	{
-		szDesc = L"";
-	}
-
-	
-	
-	
-	
-	
-	
-	
-	DWORD dwLen = GetModuleFileNameW(m_hInst, szModule + 1, 260);
-	if (dwLen == 0)
-	{
-		return AtlHresultFromLastError();
-	}
-	else if( dwLen == 260 )
-	{
-		return ((HRESULT)(122L) <= 0 ? ((HRESULT)(122L)) : ((HRESULT) (((122L) & 0x0000FFFF) | (7 << 16) | 0x80000000)));
-	}
-
-	LPOLESTR lpOleStr;
-	HRESULT hRes = StringFromCLSID(clsid, &lpOleStr);
-	if (((HRESULT)(hRes) < 0))
-		return hRes;
-
-	LPTSTR lpszCLSID = OLE2T_EX(lpOleStr, 1024);
-
-
-
-
-
-
-
-
-	hRes = lpszProgID ? RegisterProgID(lpszCLSID, lpszProgID, szDesc) : ((HRESULT)0x00000000L);
-	if (hRes == ((HRESULT)0x00000000L))
-		hRes = lpszVerIndProgID ? RegisterProgID(lpszCLSID, lpszVerIndProgID, szDesc) : ((HRESULT)0x00000000L);
-	LONG lRes = 0L;
-	if (hRes == ((HRESULT)0x00000000L))
-	{
-		CRegKey key;
-		lRes = key.Open((( HKEY ) (ULONG_PTR)((LONG)0x80000000) ), L"CLSID", ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))) | ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))));
-		if (lRes == 0L)
-		{
-			lRes = key.Create(key, lpszCLSID, ( 0 ), (0x00000000L), ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))) | ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))));
-			if (lRes == 0L)
-			{
-				lRes = key.SetStringValue(0, szDesc);
-				if (lRes == 0L)
-				{
-					lRes = lpszProgID ? key.SetKeyValue(szProgID, lpszProgID) : 0L;
-					if (lRes == 0L)
-					{
-						lRes = lpszVerIndProgID ? key.SetKeyValue(szVIProgID, lpszVerIndProgID) : 0L;
-						if (lRes == 0L)
-						{
-							if ((m_hInst == 0) || (m_hInst == GetModuleHandleW(0))) 
-							{
-								
-								
-								
-								szModule[0] = L'\"';
-								szModule[dwLen + 1] = L'\"';
-								szModule[dwLen + 2] = 0;
-
-								lRes = key.SetKeyValue(szLS32, szModule);
-							}
-							else
-							{
-								lRes = key.SetKeyValue(szIPS32, (dwFlags & 0x4) ? szAUTPRX32 : szModule + 1);
-								if (lRes == 0L)
-								{
-									LPCTSTR lpszModel = (dwFlags & 0x2) ? szBoth :
-										(dwFlags & 0x1) ? szApartment : 0;
-									if (lpszModel != 0)
-										lRes = key.SetKeyValue(szIPS32, lpszModel, szThreadingModel);
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-	CoTaskMemFree(lpOleStr);
-	if (lRes != 0L)
-		hRes = AtlHresultFromWin32(lRes);
-	return hRes;
-}
-
-inline HRESULT __stdcall CComModule::UnregisterClassHelper(const CLSID& clsid, LPCTSTR lpszProgID,
-	LPCTSTR lpszVerIndProgID)
-{
-	int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
-	CRegKey key;
-	LONG lRet;
-
-	key.Attach((( HKEY ) (ULONG_PTR)((LONG)0x80000000) ));
-	if (lpszProgID != 0 && lpszProgID[0]!=L'\0')
-	{
-		lRet = key.RecurseDeleteKey(lpszProgID);
-		if (lRet != 0L && lRet != 2L && lRet != 3L)
-		{
-			ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 6169)(atlTraceCOM, 0, L"Failed to Unregister ProgID : %s\n", lpszProgID);
-			key.Detach();
-			return AtlHresultFromWin32(lRet);
-		}
-	}
-	if (lpszVerIndProgID != 0 && lpszVerIndProgID[0]!=L'\0')
-	{
-		lRet = key.RecurseDeleteKey(lpszVerIndProgID);
-		if (lRet != 0L && lRet != 2L && lRet != 3L)
-		{
-			ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 6179)(atlTraceCOM, 0, L"Failed to Unregister Version Independent ProgID : %s\n", lpszVerIndProgID);
-			key.Detach();
-			return AtlHresultFromWin32(lRet);
-		}
-	}
-	LPOLESTR lpOleStr;
-	HRESULT hr = StringFromCLSID(clsid, &lpOleStr);
-	if (((HRESULT)(hr) >= 0))
-	{
-		LPTSTR lpsz = OLE2T_EX(lpOleStr, 1024);
-
-
-
-
-
-
-
-
-		lRet = key.Open(key, L"CLSID", ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))) | ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))));
-		if (lRet == 0L)
-			lRet = key.RecurseDeleteKey(lpsz);
-		if (lRet != 0L && lRet != 2L && lRet != 3L)
-		{
-			ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 6202)(atlTraceCOM, 0, L"Failed to delete CLSID : %s\n", lpsz);
-			hr = AtlHresultFromWin32(lRet);
-		}
-		CoTaskMemFree(lpOleStr);
-	}
-	else
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 6209)(atlTraceCOM, 0, L"Failed to delete CLSID : {%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
-			clsid.Data1, 
-			clsid.Data2, 
-			clsid.Data3, 
-			clsid.Data4[0],
-			clsid.Data4[1],
-			clsid.Data4[2],
-			clsid.Data4[3],
-			clsid.Data4[4],
-			clsid.Data4[5],
-			clsid.Data4[6],
-			clsid.Data4[7]
-			);
-	}
-	key.Detach();
-	return hr;
-}
-
-#pragma warning( pop ) 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-
-
-
-
-
-
-
-}; 
- 
- 
-
-
-
-
-
-
-
-
-
- 
-namespace ATL
-{
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- extern "C" inline HRESULT __stdcall
-AtlWinModuleTerm(_ATL_WIN_MODULE* pWinModule, HINSTANCE hInst)
-{
-	if (pWinModule == 0)
-		return ((HRESULT)0x80070057L);
-	if (pWinModule->cbSize == 0)
-		return ((HRESULT)0x00000000L);
-	if (pWinModule->cbSize != sizeof(_ATL_WIN_MODULE))
-		return ((HRESULT)0x80070057L);
-
-	for (int i = 0; i < pWinModule->m_rgWindowClassAtoms.GetSize(); i++)
-		UnregisterClassW((LPCTSTR)pWinModule->m_rgWindowClassAtoms[i], hInst);
-	pWinModule->m_rgWindowClassAtoms.RemoveAll();
-	pWinModule->m_csWindowCreate.Term();
-	pWinModule->cbSize = 0;
-	return ((HRESULT)0x00000000L);
-}
-
-
-
-
-
-
-#pragma warning(push)
-#pragma warning(disable : 4191)	
-
-inline HRESULT AtlGetDllVersion(HINSTANCE hInstDLL, DLLVERSIONINFO* pDllVersionInfo)
-{
-	do { int __atl_condVal=!!(pDllVersionInfo != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 6761, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-
-	
-	DLLGETVERSIONPROC pfnDllGetVersion = (DLLGETVERSIONPROC)::GetProcAddress(hInstDLL, "DllGetVersion");
-
-	if(pfnDllGetVersion == 0)
-	{
-		return ((HRESULT)0x80004001L);
-	}
-
-	return (*pfnDllGetVersion)(pDllVersionInfo);
-}
-
-#pragma warning(pop)
-
-inline HRESULT AtlGetDllVersion(LPCTSTR lpstrDllName, DLLVERSIONINFO* pDllVersionInfo)
-{
-	HINSTANCE hInstDLL = ::LoadLibraryW(lpstrDllName);
-	if(hInstDLL == 0)
-	{
-		return AtlHresultFromLastError();
-	}
-	HRESULT hRet = AtlGetDllVersion(hInstDLL, pDllVersionInfo);
-	::FreeLibrary(hInstDLL);
-	return hRet;
-}
-
-
-
-
-
-
-
-inline HRESULT AtlGetCommCtrlVersion(LPDWORD pdwMajor, LPDWORD pdwMinor)
-{
-	do { int __atl_condVal=!!(( pdwMajor != 0 ) && ( pdwMinor != 0 )); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 6796, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-
-	DLLVERSIONINFO dvi;
-	memset(&dvi, 0, sizeof(dvi));
-	dvi.cbSize = sizeof(dvi);
-
-	HRESULT hRet = AtlGetDllVersion(L"comctl32.dll", &dvi);
-
-	if(((HRESULT)(hRet) >= 0))
-	{
-		*pdwMajor = dvi.dwMajorVersion;
-		*pdwMinor = dvi.dwMinorVersion;
-	}
-	else if(hRet == ((HRESULT)0x80004001L))
-	{
-		
-		
-		*pdwMajor = 4;
-		*pdwMinor = 0;
-		hRet = ((HRESULT)0x00000000L);
-	}
-
-	return hRet;
-}
-
-
-
-
-
-
-
-inline HRESULT AtlGetShellVersion(LPDWORD pdwMajor, LPDWORD pdwMinor)
-{
-	do { int __atl_condVal=!!(( pdwMajor != 0) && ( pdwMinor != 0 )); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 6829, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-
-	DLLVERSIONINFO dvi;
-	memset(&dvi, 0, sizeof(dvi));
-	dvi.cbSize = sizeof(dvi);
-	HRESULT hRet = AtlGetDllVersion(L"shell32.dll", &dvi);
-
-	if(((HRESULT)(hRet) >= 0))
-	{
-		*pdwMajor = dvi.dwMajorVersion;
-		*pdwMinor = dvi.dwMinorVersion;
-	}
-	else if(hRet == ((HRESULT)0x80004001L))
-	{
-		
-		
-		*pdwMajor = 4;
-		*pdwMinor = 0;
-		hRet = ((HRESULT)0x00000000L);
-	}
-
-	return hRet;
-}
-
-inline __declspec( deprecated("AtlModuleRegisterClassObjects has been replaced by AtlComModuleRegisterClassObjects") )
-HRESULT AtlModuleRegisterClassObjects(_ATL_MODULE* , DWORD dwClsContext, DWORD dwFlags)
-{
-	return AtlComModuleRegisterClassObjects(&_AtlComModule, dwClsContext, dwFlags);
-}
-
-inline __declspec( deprecated("AtlModuleRevokeClassObjects has been replaced by AtlComModuleRevokeClassObjects") ) 
-HRESULT AtlModuleRevokeClassObjects(_ATL_MODULE* )
-{
-	return AtlComModuleRevokeClassObjects(&_AtlComModule);
-}
-
-inline __declspec( deprecated("AtlModuleGetClassObject has been replaced by AtlComModuleGetClassObject") ) 
-HRESULT AtlModuleGetClassObject(_ATL_MODULE* , const IID & rclsid, const IID & riid, LPVOID* ppv)
-{
-
-	(void) ((!!((ppv != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 6869, 0, L"ppv != 0")) || (__debugbreak(), 0));
-
-
-	return AtlComModuleGetClassObject(&_AtlComModule, rclsid, riid, ppv);
-}
-
-inline __declspec( deprecated("AtlModuleRegisterServer has been replaced by AtlComModuleRegisterServer") ) 
-HRESULT AtlModuleRegisterServer(_ATL_MODULE* , BOOL bRegTypeLib, const CLSID* pCLSID = 0)
-{
-	return AtlComModuleRegisterServer(&_AtlComModule, bRegTypeLib, pCLSID);
-}
-
-inline __declspec( deprecated("AtlModuleUnregisterServer has been replaced by AtlComModuleUnregisterServer") ) 
-HRESULT AtlModuleUnregisterServer(_ATL_MODULE* , const CLSID* pCLSID = 0)
-{
-	return AtlComModuleUnregisterServer(&_AtlComModule, 0, pCLSID);
-}
-
-inline __declspec( deprecated("AtlModuleUnregisterServerEx has been replaced by AtlComModuleUnregisterServer") ) 
-HRESULT AtlModuleUnregisterServerEx(_ATL_MODULE* , BOOL bUnRegTypeLib, const CLSID* pCLSID = 0)
-{
-	return AtlComModuleUnregisterServer(&_AtlComModule, bUnRegTypeLib, pCLSID);
-}
-
-inline __declspec( deprecated("AtlModuleUpdateRegistryFromResourceD has been replaced by AtlUpdateRegistryFromResourceD") ) 
-HRESULT AtlModuleUpdateRegistryFromResourceD(_ATL_MODULE* , LPCOLESTR lpszRes,
-	BOOL bRegister, struct _ATL_REGMAP_ENTRY* pMapEntries, IRegistrar* pReg = 0)
-{
-	return AtlUpdateRegistryFromResourceD(_AtlBaseModule.GetModuleInstance(), lpszRes, bRegister, pMapEntries, pReg);
-}
-
-inline __declspec( deprecated("AtlModuleRegisterTypeLib has been replaced by AtlRegisterTypeLib") ) 
-HRESULT AtlModuleRegisterTypeLib(_ATL_MODULE* , LPCOLESTR lpszIndex)
-{
-	return AtlRegisterTypeLib(_AtlComModule.m_hInstTypeLib, lpszIndex);
-}
-
-inline __declspec( deprecated("AtlModuleUnRegisterTypeLib has been replaced by AtlUnRegisterTypeLib") ) 
-HRESULT AtlModuleUnRegisterTypeLib(_ATL_MODULE* , LPCOLESTR lpszIndex)
-{
-	return AtlUnRegisterTypeLib(_AtlComModule.m_hInstTypeLib, lpszIndex);
-}
-
-inline __declspec( deprecated("AtlModuleLoadTypeLib has been replaced by AtlLoadTypeLib") ) 
-HRESULT AtlModuleLoadTypeLib(_ATL_MODULE* , LPCOLESTR lpszIndex, BSTR* pbstrPath, ITypeLib** ppTypeLib)
-{
-	return AtlLoadTypeLib(_AtlComModule.m_hInstTypeLib, lpszIndex, pbstrPath, ppTypeLib);
-}
-
-inline __declspec( deprecated("AtlModuleInit is no longer required") ) 
-HRESULT AtlModuleInit(_ATL_MODULE* , _ATL_OBJMAP_ENTRY* , HINSTANCE )
-{
-	return ((HRESULT)0x00000000L);
-}
-
-inline __declspec( deprecated("AtlModuleTerm is no longer required") ) 
-HRESULT AtlModuleTerm(_ATL_MODULE* )
-{
-	return ((HRESULT)0x00000000L);
-}
-
-inline __declspec( deprecated("AtlModuleAddCreateWndData has been replaced by AtlWinModuleAddCreateWndData") ) 
-void AtlModuleAddCreateWndData(_ATL_MODULE* , _AtlCreateWndData* pData, void* pObject)
-{
-	AtlWinModuleAddCreateWndData(&_AtlWinModule, pData, pObject);
-}
-
-inline __declspec( deprecated("AtlModuleExtractCreateWndData has been replaced by AtlWinModuleExtractCreateWndData") ) 
-void* AtlModuleExtractCreateWndData(_ATL_MODULE* )
-{
-	return AtlWinModuleExtractCreateWndData(&_AtlWinModule);
-}
-
-
-
-inline CRITICAL_SECTION& CComModule::get_m_csWindowCreate() throw()
-{
-	return _AtlWinModule.m_csWindowCreate.m_sec;
-}
-
-inline CRITICAL_SECTION& CComModule::get_m_csObjMap() throw()
-{
-	return _AtlComModule.m_csObjMap.m_sec;
-}
-
-inline CRITICAL_SECTION& CComModule::get_m_csStaticDataInit() throw()
-{
-	return m_csStaticDataInitAndTypeInfo.m_sec;
-}
-
-inline _AtlCreateWndData*& CComModule::get_m_pCreateWndList()  throw()
-{
-	return _AtlWinModule.m_pCreateWndList;
-}
-inline void CComModule::put_m_pCreateWndList(_AtlCreateWndData* p) throw()
-{
-	_AtlWinModule.m_pCreateWndList = p;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-inline HRESULT CComModule::Init(_ATL_OBJMAP_ENTRY* p, HINSTANCE , const GUID* plibid) throw()
-{
-	if (plibid != 0)
-		m_libid = *plibid;
-
-	_ATL_OBJMAP_ENTRY* pEntry;
-	if (p != (_ATL_OBJMAP_ENTRY*)-1)
-	{
-		m_pObjMap = p;
-		if (m_pObjMap != 0)
-		{
-			pEntry = m_pObjMap;
-			while (pEntry->pclsid != 0)
-			{
-				pEntry->pfnObjectMain(true); 
-				pEntry++;
-			}
-		}
-	}
-	for (_ATL_OBJMAP_ENTRY** ppEntry = _AtlComModule.m_ppAutoObjMapFirst; ppEntry < _AtlComModule.m_ppAutoObjMapLast; ppEntry++)
-	{
-		if (*ppEntry != 0)
-			(*ppEntry)->pfnObjectMain(true); 
-	}
-	return ((HRESULT)0x00000000L);
-}
-
-inline void CComModule::Term() throw()
-{
-	_ATL_OBJMAP_ENTRY* pEntry;
-	if (m_pObjMap != 0)
-	{
-		pEntry = m_pObjMap;
-		while (pEntry->pclsid != 0)
-		{
-			if (pEntry->pCF != 0)
-				pEntry->pCF->Release();
-			pEntry->pCF = 0;
-			pEntry->pfnObjectMain(false); 
-			pEntry++;
-		}
-	}
-
-	for (_ATL_OBJMAP_ENTRY** ppEntry = _AtlComModule.m_ppAutoObjMapFirst; ppEntry < _AtlComModule.m_ppAutoObjMapLast; ppEntry++)
-	{
-		if (*ppEntry != 0)
-			(*ppEntry)->pfnObjectMain(false); 
-	}
-
-	
-	_AtlWinModule.Term();		
-
-
-	CAtlModuleT<CComModule>::Term();
-}
-
-inline HRESULT CComModule::GetClassObject(const IID & rclsid, const IID & riid, LPVOID* ppv) throw()
-{
-	if (ppv == 0)
-		return ((HRESULT)0x80004003L);
-	HRESULT hr = ((HRESULT)0x00000000L);
-	_ATL_OBJMAP_ENTRY* pEntry;
-	if (m_pObjMap != 0)
-	{
-		pEntry = m_pObjMap;
-		while (pEntry->pclsid != 0)
-		{
-			if ((pEntry->pfnGetClassObject != 0) && InlineIsEqualGUID(rclsid, *pEntry->pclsid))
-			{
-				if (pEntry->pCF == 0)
-				{
-					CComCritSecLock<CComCriticalSection> lock(_AtlComModule.m_csObjMap, false);
-					hr = lock.Lock();
-					if (((HRESULT)(hr) < 0))
-					{
-						ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 7088)(atlTraceCOM, 0, L"ERROR : Unable to lock critical section in CComModule::GetClassObject\n");
-						(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 7089, 0, L"0")) || (__debugbreak(), 0));
-						break;
-					}
-					if (pEntry->pCF == 0)
-						hr = pEntry->pfnGetClassObject(pEntry->pfnCreateInstance, __uuidof(IUnknown), (LPVOID*)&pEntry->pCF);
-				}
-				if (pEntry->pCF != 0)
-					hr = pEntry->pCF->QueryInterface(riid, ppv);
-				break;
-			}
-			pEntry++;
-		}
-	}
-	if (*ppv == 0 && hr == ((HRESULT)0x00000000L))
-		hr = AtlComModuleGetClassObject(&_AtlComModule, rclsid, riid, ppv);
-	return hr;
-}
-
-
-inline HRESULT CComModule::RegisterClassObjects(DWORD dwClsContext, DWORD dwFlags) throw()
-{
-	HRESULT hr = ((HRESULT)0x00000000L);
-	_ATL_OBJMAP_ENTRY* pEntry;
-	if (m_pObjMap != 0)
-	{
-		pEntry = m_pObjMap;
-		while (pEntry->pclsid != 0 && hr == ((HRESULT)0x00000000L))
-		{
-			hr = pEntry->RegisterClassObject(dwClsContext, dwFlags);
-			pEntry++;
-		}
-	}
-	if (hr == ((HRESULT)0x00000000L))
-		hr = AtlComModuleRegisterClassObjects(&_AtlComModule, dwClsContext, dwFlags);
-	return hr;
-}
-inline HRESULT CComModule::RevokeClassObjects() throw()
-{
-	HRESULT hr = ((HRESULT)0x00000000L);
-	_ATL_OBJMAP_ENTRY* pEntry;
-	if (m_pObjMap != 0)
-	{
-		pEntry = m_pObjMap;
-		while (pEntry->pclsid != 0 && hr == ((HRESULT)0x00000000L))
-		{
-			hr = pEntry->RevokeClassObject();
-			pEntry++;
-		}
-	}
-	if (hr == ((HRESULT)0x00000000L))
-		hr = AtlComModuleRevokeClassObjects(&_AtlComModule);
-	return hr;
-}
-
-
-inline HRESULT CComModule::RegisterTypeLib() throw()
-{
-	return _AtlComModule.RegisterTypeLib();
-}
-inline HRESULT CComModule::RegisterTypeLib(LPCTSTR lpszIndex) throw()
-{
-	return _AtlComModule.RegisterTypeLib(lpszIndex);
-}
-inline HRESULT CComModule::UnRegisterTypeLib() throw()
-{
-	return _AtlComModule.UnRegisterTypeLib();
-}
-inline HRESULT CComModule::UnRegisterTypeLib(LPCTSTR lpszIndex) throw()
-{
-	return _AtlComModule.UnRegisterTypeLib(lpszIndex);
-}
-
-inline HRESULT CComModule::RegisterServer(BOOL bRegTypeLib , const CLSID* pCLSID ) throw()
-{
-	HRESULT hr = ((HRESULT)0x00000000L);
-	_ATL_OBJMAP_ENTRY* pEntry = m_pObjMap;
-	if (pEntry != 0)
-	{
-		for (;pEntry->pclsid != 0; pEntry++)
-		{
-			if (pCLSID != 0)
-			{
-				if (!IsEqualGUID(*pCLSID, *pEntry->pclsid))
-					continue;
-			}
-			hr = pEntry->pfnUpdateRegistry(1);
-			if (((HRESULT)(hr) < 0))
-				break;
-			hr = AtlRegisterClassCategoriesHelper( *pEntry->pclsid,
-				pEntry->pfnGetCategoryMap(), 1 );
-			if (((HRESULT)(hr) < 0))
-				break;
-		}
-	}
-	if (((HRESULT)(hr) >= 0))
-		hr = CAtlModuleT<CComModule>::RegisterServer(bRegTypeLib, pCLSID);
-	return hr;
-}
-
-inline HRESULT CComModule::UnregisterServer(BOOL bUnRegTypeLib, const CLSID* pCLSID ) throw()
-{
-	HRESULT hr = ((HRESULT)0x00000000L);	
-	_ATL_OBJMAP_ENTRY* pEntry = m_pObjMap;
-	if (pEntry != 0)
-	{
-		for (;pEntry->pclsid != 0; pEntry++)
-		{
-			if (pCLSID != 0)
-			{
-				if (!IsEqualGUID(*pCLSID, *pEntry->pclsid))
-					continue;
-			}
-			hr = AtlRegisterClassCategoriesHelper( *pEntry->pclsid,
-				pEntry->pfnGetCategoryMap(), 0 );
-			if (((HRESULT)(hr) < 0))
-				break;
-			hr = pEntry->pfnUpdateRegistry(0); 
-			if (((HRESULT)(hr) < 0))
-				break;
-		}
-	}
-	if (((HRESULT)(hr) >= 0))
-		hr = CAtlModuleT<CComModule>::UnregisterServer(bUnRegTypeLib, pCLSID);
-	return hr;
-}
-
-inline HRESULT CComModule::UnregisterServer(const CLSID* pCLSID ) throw()
-{
-	return UnregisterServer(0, pCLSID);
-}
-
-
-
-}	
- 
-
-#pragma warning( pop )
-
-
-
-
-
-
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-#pragma warning (push)
-#pragma warning(disable: 4702) 
-#pragma warning(disable: 4355) 
-#pragma warning(disable: 4511) 
-#pragma warning(disable: 4512) 
-#pragma warning(disable : 4668)	
-#pragma warning(disable : 4820)	
-#pragma warning(disable : 4571) 
-
-
-
-
-
-#pragma warning(disable: 4127) 
-#pragma warning(disable: 4786) 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma once
-
-
-
-
-
-
- 
-
- 
-namespace ATL
-{
-
-
-
-
-
-PVOID __stdcall __AllocStdCallThunk(void);
-void  __stdcall __FreeStdCallThunk(PVOID);
-
-#pragma pack(push,1)
-struct _stdcallthunk
-{
-	DWORD   m_mov;          
-	DWORD   m_this;         
-	BYTE    m_jmp;          
-	DWORD   m_relproc;      
-	BOOL Init(DWORD_PTR proc, void* pThis)
-	{
-		m_mov = 0x042444C7;  
-		m_this = ((ULONG)(ULONG_PTR) (pThis) );
-		m_jmp = 0xe9;
-		m_relproc = DWORD((INT_PTR)proc - ((INT_PTR)this+sizeof(_stdcallthunk)));
-		
-		
-		FlushInstructionCache(GetCurrentProcess(), this, sizeof(_stdcallthunk));
-		return 1;
-	}
-	
-	void* GetCodeAddress()
-	{
-		return this;
-	}
-	void* operator new(size_t)
-	{
-        return __AllocStdCallThunk();
-    }
-    void operator delete(void* pThunk)
-    {
-        __FreeStdCallThunk(pThunk);
-    }
-};
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 
-#pragma pack(push,8)
-class CDynamicStdCallThunk
-{
-public:
-	_stdcallthunk *pThunk;
-
-	CDynamicStdCallThunk()
-	{
-		pThunk = 0;
-	}
-
-	~CDynamicStdCallThunk()
-	{
-		if (pThunk)
-		{
-			delete pThunk;
-		}
-	}
-
-	BOOL Init(DWORD_PTR proc, void *pThis)
-	{
-		if (pThunk == 0) 
-		{
-			pThunk = new _stdcallthunk;
-			if (pThunk == 0)
-			{
-				return 0;
-			}
-		}
-		return pThunk->Init(proc, pThis);
-	}
-	
-
-	void* GetCodeAddress()
-	{
-		return pThunk->GetCodeAddress();
-	}
-};
-
-#pragma pack(pop)
-typedef CDynamicStdCallThunk CStdCallThunk;
-
-
-
-
-}   
- 
-
-
-
-
-
-#pragma pack(push, 8)
-
-extern "C" const IID IID_ITargetFrame;
-
-
-
-#pragma pack(push, 8)
-namespace ATL
-{
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-inline HRESULT __stdcall AtlReportError(const CLSID& clsid, UINT nID, const IID& iid = GUID_NULL,
-	HRESULT hRes = 0, HINSTANCE hInst = _AtlBaseModule.GetResourceInstance())
-{
-	return AtlSetErrorInfo(clsid, (LPCOLESTR)((LPWSTR)((ULONG_PTR)((WORD)(nID)))), 0, 0, iid, hRes, hInst);
-}
-
-inline HRESULT __stdcall AtlReportError(const CLSID& clsid, UINT nID, DWORD dwHelpID,
-	LPCOLESTR lpszHelpFile, const IID& iid = GUID_NULL, HRESULT hRes = 0, 
-	HINSTANCE hInst = _AtlBaseModule.GetResourceInstance())
-{
-	return AtlSetErrorInfo(clsid, (LPCOLESTR)((LPWSTR)((ULONG_PTR)((WORD)(nID)))), dwHelpID,
-		lpszHelpFile, iid, hRes, hInst);
-}
-
-inline HRESULT __stdcall AtlReportError(const CLSID& clsid, LPCSTR lpszDesc,
-	DWORD dwHelpID, LPCSTR lpszHelpFile, const IID& iid = GUID_NULL, HRESULT hRes = 0)
-{
-	(void) ((!!((lpszDesc != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 93, 0, L"lpszDesc != 0")) || (__debugbreak(), 0));
-	if (lpszDesc == 0)
-		return ((HRESULT)0x80004003L);
-	int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
-	LPCOLESTR pwszDesc = ((LPCWSTR)( ((_lpa_ex = lpszDesc) == 0) ? 0 : ( _convert_ex = (lstrlenA(_lpa_ex)+1), ((HRESULT)(::ATL::AtlMultiply(&_convert_ex, _convert_ex, static_cast<int>(sizeof(WCHAR)))) < 0) ? 0 : AtlA2WHelper( (LPWSTR)__pragma(warning(push)) __pragma(warning(disable:4616)) __pragma(warning(disable:6255)) ((_convert_ex <= 1024 && ATL::_ATL_SAFE_ALLOCA_IMPL::_AtlVerifyStackAvailable(_convert_ex) ) ? _alloca(_convert_ex) : _AtlSafeAllocaManager.Allocate(_convert_ex)) __pragma(warning(pop)), _lpa_ex, _convert_ex / sizeof(WCHAR), _acp_ex))));
-	if(pwszDesc == 0)
-		return ((HRESULT)0x8007000EL);
-	
-	LPCWSTR pwzHelpFile = 0;
-	if(lpszHelpFile != 0)
-	{
-		pwzHelpFile = ((LPCWSTR)( ((_lpa_ex = lpszHelpFile) == 0) ? 0 : ( _convert_ex = (lstrlenA(_lpa_ex)+1), ((HRESULT)(::ATL::AtlMultiply(&_convert_ex, _convert_ex, static_cast<int>(sizeof(WCHAR)))) < 0) ? 0 : AtlA2WHelper( (LPWSTR)__pragma(warning(push)) __pragma(warning(disable:4616)) __pragma(warning(disable:6255)) ((_convert_ex <= 1024 && ATL::_ATL_SAFE_ALLOCA_IMPL::_AtlVerifyStackAvailable(_convert_ex) ) ? _alloca(_convert_ex) : _AtlSafeAllocaManager.Allocate(_convert_ex)) __pragma(warning(pop)), _lpa_ex, _convert_ex / sizeof(WCHAR), _acp_ex))));
-		if(pwzHelpFile == 0)
-			return ((HRESULT)0x8007000EL);
-	}
-		
-	return AtlSetErrorInfo(clsid, pwszDesc, dwHelpID, pwzHelpFile, iid, hRes, 0);
-}
-
-inline HRESULT __stdcall AtlReportError(const CLSID& clsid, LPCSTR lpszDesc,
-	const IID& iid = GUID_NULL, HRESULT hRes = 0)
-{
-	return AtlReportError(clsid, lpszDesc, 0, 0, iid, hRes);
-}
-
-inline HRESULT __stdcall AtlReportError(const CLSID& clsid, LPCOLESTR lpszDesc,
-	const IID& iid = GUID_NULL, HRESULT hRes = 0)
-{
-	return AtlSetErrorInfo(clsid, lpszDesc, 0, 0, iid, hRes, 0);
-}
-
-inline HRESULT __stdcall AtlReportError(const CLSID& clsid, LPCOLESTR lpszDesc, DWORD dwHelpID,
-	LPCOLESTR lpszHelpFile, const IID& iid = GUID_NULL, HRESULT hRes = 0)
-{
-	return AtlSetErrorInfo(clsid, lpszDesc, dwHelpID, lpszHelpFile, iid, hRes, 0);
-}
-
-
-
-inline bool AtlGetApartmentType(DWORD* pApartmentType)
-{
-	HRESULT hr = CoInitialize(0);
- 	if (((HRESULT)(hr) >= 0))
-		CoUninitialize();
-
-	if (hr == ((HRESULT)0x00000001L))
-	{
-		*pApartmentType = COINIT_APARTMENTTHREADED;
-		return true;
-	}
-
-	else
-	if (hr == ((HRESULT)0x80010106L))
-	{	
-		*pApartmentType = COINIT_MULTITHREADED;
-		return true;
-	}
-
-	return false;
-}
-
-
-
-
-class CComTypeAttr
-{
-
-public:
-   CComTypeAttr( ITypeInfo* pTypeInfo ) throw() :
-	  m_pTypeAttr( 0 ),
-	  m_pTypeInfo( pTypeInfo )
-   {
-   }
-   ~CComTypeAttr() throw()
-   {
-	  Release();
-   }
-
-
-public:
-   TYPEATTR* operator->() throw()
-   {
-	  do { (void) ((!!((m_pTypeAttr != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 175, 0, L"m_pTypeAttr != 0")) || (__debugbreak(), 0)); ; } while(0);
-
-	  return m_pTypeAttr;
-   }
-   TYPEATTR** operator&() throw()
-   {
-	  do { (void) ((!!((m_pTypeAttr == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 181, 0, L"m_pTypeAttr == 0")) || (__debugbreak(), 0)); ; } while(0);
-
-	  return &m_pTypeAttr;
-   }
-
-   operator const TYPEATTR*() const throw()
-   {
-	  return m_pTypeAttr;
-   }
-
-
-public:
-   void Release() throw()
-   {
-	  if( m_pTypeAttr != 0 )
-	  {
-		 do { (void) ((!!((m_pTypeInfo != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 197, 0, L"m_pTypeInfo != 0")) || (__debugbreak(), 0)); ; } while(0);
-		 m_pTypeInfo->ReleaseTypeAttr( m_pTypeAttr );
-		 m_pTypeAttr = 0;
-	  }
-   }
-
-public:
-   TYPEATTR* m_pTypeAttr;
-   CComPtr< ITypeInfo > m_pTypeInfo;
-};
-
-
-
-
-
-class CComVarDesc
-{
-
-public:
-   CComVarDesc( ITypeInfo* pTypeInfo ) throw() :
-	  m_pVarDesc( 0 ),
-	  m_pTypeInfo( pTypeInfo )
-   {
-   }
-   ~CComVarDesc() throw()
-   {
-	  Release();
-   }
-
-
-public:
-   VARDESC* operator->() throw()
-   {
-	  do { (void) ((!!((m_pVarDesc != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 230, 0, L"m_pVarDesc != 0")) || (__debugbreak(), 0)); ; } while(0);
-
-	  return m_pVarDesc;
-   }
-   VARDESC** operator&() throw()
-   {
-	  do { (void) ((!!((m_pVarDesc == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 236, 0, L"m_pVarDesc == 0")) || (__debugbreak(), 0)); ; } while(0);
-
-	  return &m_pVarDesc;
-   }
-
-   operator const VARDESC*() const throw()
-   {
-	  return m_pVarDesc;
-   }
-
-
-public:
-   void Release() throw()
-   {
-	  if( m_pVarDesc != 0 )
-	  {
-		 do { (void) ((!!((m_pTypeInfo != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 252, 0, L"m_pTypeInfo != 0")) || (__debugbreak(), 0)); ; } while(0);
-		 m_pTypeInfo->ReleaseVarDesc( m_pVarDesc );
-		 m_pVarDesc = 0;
-	  }
-   }
-
-public:
-   VARDESC* m_pVarDesc;
-   CComPtr< ITypeInfo > m_pTypeInfo;
-};
-
-
-
-
-
-class CComFuncDesc
-{
-
-public:
-   CComFuncDesc( ITypeInfo* pTypeInfo ) throw() :
-	  m_pFuncDesc( 0 ),
-	  m_pTypeInfo( pTypeInfo )
-   {
-   }
-   ~CComFuncDesc() throw()
-   {
-	  Release();
-   }
-
-
-public:
-   FUNCDESC* operator->() throw()
-   {
-	  do { (void) ((!!((m_pFuncDesc != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 285, 0, L"m_pFuncDesc != 0")) || (__debugbreak(), 0)); ; } while(0);
-
-	  return m_pFuncDesc;
-   }
-   FUNCDESC** operator&() throw()
-   {
-	  do { (void) ((!!((m_pFuncDesc == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 291, 0, L"m_pFuncDesc == 0")) || (__debugbreak(), 0)); ; } while(0);
-
-	  return &m_pFuncDesc;
-   }
-
-   operator const FUNCDESC*() const throw()
-   {
-	  return m_pFuncDesc;
-   }
-
-
-public:
-   void Release() throw()
-   {
-	  if( m_pFuncDesc != 0 )
-	  {
-		 do { (void) ((!!((m_pTypeInfo != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 307, 0, L"m_pTypeInfo != 0")) || (__debugbreak(), 0)); ; } while(0);
-		 m_pTypeInfo->ReleaseFuncDesc( m_pFuncDesc );
-		 m_pFuncDesc = 0;
-	  }
-   }
-
-public:
-   FUNCDESC* m_pFuncDesc;
-   CComPtr< ITypeInfo > m_pTypeInfo;
-};
-
-
-
-
-
-class CComExcepInfo :
-   public EXCEPINFO
-{
-
-public:
-   CComExcepInfo()
-   {
-	  memset( this, 0, sizeof( *this ) );
-   }
-   ~CComExcepInfo()
-   {
-	  Clear();
-   }
-
-
-public:
-   void Clear()
-   {
-      ::SysFreeString(bstrSource);
-      ::SysFreeString(bstrDescription);
-      ::SysFreeString(bstrHelpFile);
-
-	  memset(this, 0, sizeof(*this));
-   }
-};
-
-
-
-
-template <class T>
-class __declspec(novtable) IPersistImpl : public IPersist
-{
-public:
-	virtual HRESULT __stdcall GetClassID(CLSID *pClassID)
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 357)(atlTraceCOM, 2, L"IPersistImpl::GetClassID\n");
-		if (pClassID == 0)
-			return ((HRESULT)0x80004005L);
-		*pClassID = T::GetObjectCLSID();
-		return ((HRESULT)0x00000000L);
-	}
-};
-
-
-
-class CFakeFirePropNotifyEvent
-{
-public:
-	static HRESULT FireOnRequestEdit(IUnknown* , DISPID )
-	{
-		return ((HRESULT)0x00000000L);
-	}
-	static HRESULT FireOnChanged(IUnknown* , DISPID )
-	{
-		return ((HRESULT)0x00000000L);
-	}
-};
-typedef CFakeFirePropNotifyEvent _ATL_PROP_NOTIFY_EVENT_CLASS;
-
-
-
-
-
-struct ATL_PROPVALMAP_ENTRY
-{
-	DISPID dispid;
-	VARIANT val;
-	LPCOLESTR szDesc;
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-struct ATL_PROPMAP_ENTRY
-{
-	LPCOLESTR szDesc;
-	DISPID dispid;
-	const CLSID* pclsidPropPage;
-	const IID* piidDispatch;
-	DWORD dwOffsetData;
-	DWORD dwSizeData;
-	VARTYPE vt;
-
-
-
-
-};
-
-
-template<VARTYPE V>
-struct AtlExpectedDispatchOrUnknown 
-{
-	
-	typedef int _assert[V == VT_DISPATCH || V == VT_UNKNOWN ? 1 : -1];
-
-	static const VARTYPE value = V;	
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#pragma deprecated(PROP_ENTRY, PROP_ENTRY_EX)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlIPersistStreamInit_Load(LPSTREAM pStm, ATL_PROPMAP_ENTRY* pMap, void* pThis, IUnknown* pUnk);
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlIPersistStreamInit_Save(LPSTREAM pStm, BOOL fClearDirty, ATL_PROPMAP_ENTRY* pMap, void* pThis, IUnknown* pUnk);
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlIPersistPropertyBag_Load(LPPROPERTYBAG pPropBag, LPERRORLOG pErrorLog, ATL_PROPMAP_ENTRY* pMap, void* pThis, IUnknown* pUnk);
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlIPersistPropertyBag_Save(LPPROPERTYBAG pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties, ATL_PROPMAP_ENTRY* pMap, void* pThis, IUnknown* pUnk);
-
-
-
-template <class T>
-class __declspec(novtable) IPersistStreamInitImpl : public IPersistStreamInit
-{
-public:
-	
-	virtual HRESULT __stdcall GetClassID(CLSID *pClassID)
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 576)(atlTraceCOM, 2, L"IPersistStreamInitImpl::GetClassID\n");
-		if (pClassID == 0)
-			return ((HRESULT)0x80004003L);
-		*pClassID = T::GetObjectCLSID();
-		return ((HRESULT)0x00000000L);
-	}
-
-	
-	virtual HRESULT __stdcall IsDirty()
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 586)(atlTraceCOM, 2, L"IPersistStreamInitImpl::IsDirty\n");
-		T* pT = static_cast<T*>(this);
-		return (pT->m_bRequiresSave) ? ((HRESULT)0x00000000L) : ((HRESULT)0x00000001L);
-	}
-	virtual HRESULT __stdcall Load(LPSTREAM pStm)
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 592)(atlTraceCOM, 2, L"IPersistStreamInitImpl::Load\n");
-
-		T* pT = static_cast<T*>(this);
-		return pT->IPersistStreamInit_Load(pStm, T::GetPropertyMap());
-	}
-	virtual HRESULT __stdcall Save(LPSTREAM pStm, BOOL fClearDirty)
-	{
-		T* pT = static_cast<T*>(this);
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 600)(atlTraceCOM, 2, L"IPersistStreamInitImpl::Save\n");
-		return pT->IPersistStreamInit_Save(pStm, fClearDirty, T::GetPropertyMap());
-	}
-	virtual HRESULT __stdcall GetSizeMax(ULARGE_INTEGER* pcbSize)
-	{
-		HRESULT hr = ((HRESULT)0x00000000L);
-		T* pT = static_cast<T*>(this);
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 607)(atlTraceCOM, 2, L"IPersistStreamInitImpl::GetSizeMax\n");
-
-		if (pcbSize == 0)
-			return ((HRESULT)0x80004003L);
-
-		ATL_PROPMAP_ENTRY* pMap = T::GetPropertyMap();
-		do { int __atl_condVal=!!(pMap != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 613, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) return ((HRESULT)0x80004005L); } while (0);
-
-		
-		ULARGE_INTEGER nSize;
-		nSize.HighPart = 0;
-		nSize.LowPart = sizeof(DWORD);
-
-		CComPtr<IDispatch> pDispatch;
-		const IID* piidOld = 0;
-		for (int i = 0; pMap[i].pclsidPropPage != 0; i++)
-		{
-			if (pMap[i].szDesc == 0)
-				continue;
-
-			
-			if (pMap[i].dwSizeData != 0)
-			{
-				ULONG ulSize=0;				
-				
-				if (pMap[i].vt == VT_BSTR)
-				{
-					void* pData = (void*) (pMap[i].dwOffsetData + (DWORD_PTR)pT);
-					do { int __atl_condVal=!!(pData >= (void*)(DWORD_PTR)pMap[i].dwOffsetData && pData >= (void*)(DWORD_PTR)pT); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 636, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) return ((HRESULT)0x80004005L); } while (0);
-					BSTR bstr=*reinterpret_cast<BSTR*>(pData);
-					ulSize=CComBSTR::GetStreamSize(bstr);
-				} else
-				{
-					ulSize = pMap[i].dwSizeData;
-				}
-				nSize.QuadPart += ulSize;
-				continue;
-			}
-
-			CComVariant var;
-			if (pMap[i].piidDispatch != piidOld)
-			{
-				pDispatch.Release();
-				do { int __atl_condVal=!!(pMap[i].piidDispatch); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 651, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) return ((HRESULT)0x80004005L); } while (0);
-				if (((HRESULT)(pT->GetUnknown()->QueryInterface(*pMap[i].piidDispatch, (void**)&pDispatch)) < 0))
-				{
-					ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 654)(atlTraceCOM, 0, L"Failed to get a dispatch pointer for property #%i\n", i);
-					hr = ((HRESULT)0x80004005L);
-					break;
-				}
-				piidOld = pMap[i].piidDispatch;
-			}
-
-			if (((HRESULT)(pDispatch.GetProperty(pMap[i].dispid, &var)) < 0))
-			{
-				ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 663)(atlTraceCOM, 0, L"Invoked failed on DISPID %x\n", pMap[i].dispid);
-				hr = ((HRESULT)0x80004005L);
-				break;
-			}
-			nSize.QuadPart += var.GetSize();
-		}
-		*pcbSize = nSize;
-		return hr;
-	}
-
-	
-	virtual HRESULT __stdcall InitNew()
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 676)(atlTraceCOM, 2, L"IPersistStreamInitImpl::InitNew\n");
-		T* pT = static_cast<T*>(this);
-		pT->m_bRequiresSave = 1;
-		return ((HRESULT)0x00000000L);
-	}
-
-	HRESULT IPersistStreamInit_Load(LPSTREAM pStm, ATL_PROPMAP_ENTRY* pMap)
-	{
-		T* pT = static_cast<T*>(this);
-		HRESULT hr = AtlIPersistStreamInit_Load(pStm, pMap, pT, pT->GetUnknown());
-		if (((HRESULT)(hr) >= 0))
-			pT->m_bRequiresSave = 0;
-		return hr;
-
-	}
-	HRESULT IPersistStreamInit_Save(LPSTREAM pStm, BOOL fClearDirty, ATL_PROPMAP_ENTRY* pMap)
-	{
-		T* pT = static_cast<T*>(this);
-		HRESULT hr;
-		hr = AtlIPersistStreamInit_Save(pStm, fClearDirty, pMap, pT, pT->GetUnknown());
-		if (fClearDirty && ((HRESULT)(hr) >= 0))
-		{
-			pT->m_bRequiresSave=0;
-		}
-		return hr;
-
-	}
-};
-
-
-
-template <class T>
-class __declspec(novtable) IPersistStorageImpl : public IPersistStorage
-{
-public:
-	
-	virtual HRESULT __stdcall GetClassID(CLSID *pClassID)
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 714)(atlTraceCOM, 2, L"IPersistStorageImpl::GetClassID\n");
-		if (pClassID == 0)
-			return ((HRESULT)0x80004003L);
-		*pClassID = T::GetObjectCLSID();
-		return ((HRESULT)0x00000000L);
-	}
-
-	
-	virtual HRESULT __stdcall IsDirty(void)
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 724)(atlTraceCOM, 2, L"IPersistStorageImpl::IsDirty\n");
-		CComPtr<IPersistStreamInit> p;
-		p.p = IPSI_GetIPersistStreamInit();
-		return (p != 0) ? p->IsDirty() : ((HRESULT)0x80004005L);
-	}
-	virtual HRESULT __stdcall InitNew(IStorage*)
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 731)(atlTraceCOM, 2, L"IPersistStorageImpl::InitNew\n");
-		CComPtr<IPersistStreamInit> p;
-		p.p = IPSI_GetIPersistStreamInit();
-		return (p != 0) ? p->InitNew() : ((HRESULT)0x80004005L);
-	}
-	virtual HRESULT __stdcall Load(IStorage* pStorage)
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 738)(atlTraceCOM, 2, L"IPersistStorageImpl::Load\n");
-		if (pStorage == 0)
-			return ((HRESULT)0x80070057L);
-		CComPtr<IPersistStreamInit> p;
-		p.p = IPSI_GetIPersistStreamInit();
-		HRESULT hr = ((HRESULT)0x80004005L);
-		if (p != 0)
-		{
-			CComPtr<IStream> spStream;
-			hr = pStorage->OpenStream(L"Contents", 0,
-				0x00000000L | 0x00000010L, 0, &spStream);
-			if (((HRESULT)(hr) >= 0))
-				hr = p->Load(spStream);
-		}
-		return hr;
-	}
-	virtual HRESULT __stdcall Save(IStorage* pStorage, BOOL fSameAsLoad)
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 756)(atlTraceCOM, 2, L"IPersistStorageImpl::Save\n");
-		if (pStorage == 0)
-			return ((HRESULT)0x80070057L);
-		CComPtr<IPersistStreamInit> p;
-		p.p = IPSI_GetIPersistStreamInit();
-		HRESULT hr = ((HRESULT)0x80004005L);
-		if (p != 0)
-		{
-			CComPtr<IStream> spStream;
-			static LPCOLESTR vszContents = L"Contents";
-			hr = pStorage->CreateStream(vszContents,
-				0x00000002L | 0x00000010L | 0x00001000L,
-				0, 0, &spStream);
-			if (((HRESULT)(hr) >= 0))
-				hr = p->Save(spStream, fSameAsLoad);
-		}
-		return hr;
-	}
-	virtual HRESULT __stdcall SaveCompleted(IStorage* )
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 776)(atlTraceCOM, 2, L"IPersistStorageImpl::SaveCompleted\n");
-		return ((HRESULT)0x00000000L);
-	}
-	virtual HRESULT __stdcall HandsOffStorage(void)
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 781)(atlTraceCOM, 2, L"IPersistStorageImpl::HandsOffStorage\n");
-		return ((HRESULT)0x00000000L);
-	}
-private:
-	IPersistStreamInit* IPSI_GetIPersistStreamInit();
-};
-
-template <class T>
-IPersistStreamInit* IPersistStorageImpl<T>::IPSI_GetIPersistStreamInit()
-{
-	T* pT = static_cast<T*>(this);
-	IPersistStreamInit* p;
-	if (((HRESULT)(pT->GetUnknown()->QueryInterface(__uuidof(IPersistStreamInit), (void**)&p)) < 0))
-		pT->_InternalQueryInterface(__uuidof(IPersistStreamInit), (void**)&p);
-	return p;
-}
-
-
-
-
-template <class T>
-class __declspec(novtable) IPersistPropertyBagImpl : public IPersistPropertyBag
-{
-public:
-	
-	virtual HRESULT __stdcall GetClassID(CLSID *pClassID)
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 808)(atlTraceCOM, 2, L"IPersistPropertyBagImpl::GetClassID\n");
-		if (pClassID == 0)
-			return ((HRESULT)0x80004003L);
-		*pClassID = T::GetObjectCLSID();
-		return ((HRESULT)0x00000000L);
-	}
-
-	
-	
-	virtual HRESULT __stdcall InitNew()
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 819)(atlTraceCOM, 2, L"IPersistPropertyBagImpl::InitNew\n");
-		T* pT = static_cast<T*>(this);
-		pT->m_bRequiresSave = 1;
-		return ((HRESULT)0x00000000L);
-	}
-	virtual HRESULT __stdcall Load(LPPROPERTYBAG pPropBag, LPERRORLOG pErrorLog)
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 826)(atlTraceCOM, 2, L"IPersistPropertyBagImpl::Load\n");
-		T* pT = static_cast<T*>(this);
-		ATL_PROPMAP_ENTRY* pMap = T::GetPropertyMap();
-		(void) ((!!((pMap != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 829, 0, L"pMap != 0")) || (__debugbreak(), 0));
-		return pT->IPersistPropertyBag_Load(pPropBag, pErrorLog, pMap);
-	}
-	virtual HRESULT __stdcall Save(LPPROPERTYBAG pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties)
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 834)(atlTraceCOM, 2, L"IPersistPropertyBagImpl::Save\n");
-		T* pT = static_cast<T*>(this);
-		ATL_PROPMAP_ENTRY* pMap = T::GetPropertyMap();
-		(void) ((!!((pMap != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 837, 0, L"pMap != 0")) || (__debugbreak(), 0));
-		return pT->IPersistPropertyBag_Save(pPropBag, fClearDirty, fSaveAllProperties, pMap);
-	}
-	HRESULT IPersistPropertyBag_Load(LPPROPERTYBAG pPropBag, LPERRORLOG pErrorLog, ATL_PROPMAP_ENTRY* pMap)
-	{
-		T* pT = static_cast<T*>(this);
-		HRESULT hr = AtlIPersistPropertyBag_Load(pPropBag, pErrorLog, pMap, pT, pT->GetUnknown());
-		if (((HRESULT)(hr) >= 0))
-			pT->m_bRequiresSave = 0;
-		return hr;
-	}
-	HRESULT IPersistPropertyBag_Save(LPPROPERTYBAG pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties, ATL_PROPMAP_ENTRY* pMap)
-	{
-		T* pT = static_cast<T*>(this);
-		HRESULT hr;
-		hr = AtlIPersistPropertyBag_Save(pPropBag, fClearDirty, fSaveAllProperties, pMap, pT, pT->GetUnknown());
-		if (fClearDirty && ((HRESULT)(hr) >= 0))
-		{
-			pT->m_bRequiresSave=0;
-		}
-		return hr;
-
-	}
-};
-
-
-
-__declspec( deprecated("CSecurityDescriptor has been replaced by CSID") ) class CSecurityDescriptor
-{
-public:
-	CSecurityDescriptor();
-	~CSecurityDescriptor();
-
-public:
-	HRESULT Attach(PSECURITY_DESCRIPTOR pSelfRelativeSD);
-	HRESULT AttachObject(HANDLE hObject);
-	HRESULT Initialize();
-	HRESULT InitializeFromProcessToken(BOOL bDefaulted = 0);
-	HRESULT InitializeFromThreadToken(BOOL bDefaulted = 0, BOOL bRevertToProcessToken = 1);
-	HRESULT SetOwner(PSID pOwnerSid, BOOL bDefaulted = 0);
-	HRESULT SetGroup(PSID pGroupSid, BOOL bDefaulted = 0);
-	HRESULT Allow(LPCTSTR pszPrincipal, DWORD dwAccessMask);
-	HRESULT Deny(LPCTSTR pszPrincipal, DWORD dwAccessMask);
-	HRESULT Revoke(LPCTSTR pszPrincipal);
-	HRESULT Allow(PSID pSid, DWORD dwAccessMask);
-	HRESULT Deny(PSID pSid, DWORD dwAccessMask);
-	HRESULT Revoke(PSID pSid);
-
-	
-	
-	static HRESULT SetPrivilege(LPCTSTR Privilege, BOOL bEnable = 1, HANDLE hToken = 0);
-	static HRESULT GetTokenSids(HANDLE hToken, PSID* ppUserSid, PSID* ppGroupSid);
-	static HRESULT GetProcessSids(PSID* ppUserSid, PSID* ppGroupSid = 0);
-	static HRESULT GetThreadSids(PSID* ppUserSid, PSID* ppGroupSid = 0, BOOL bOpenAsSelf = 0);
-	static HRESULT CopyACL(PACL pDest, PACL pSrc);
-	static HRESULT GetCurrentUserSID(PSID *ppSid);
-	static HRESULT GetPrincipalSID(LPCTSTR pszPrincipal, PSID *ppSid);
-	static HRESULT AddAccessAllowedACEToACL(PACL *Acl, PSID pSid, DWORD dwAccessMask);
-	static HRESULT AddAccessDeniedACEToACL(PACL *Acl, PSID pSid, DWORD dwAccessMask);
-	static HRESULT RemovePrincipalFromACL(PACL Acl, PSID pSid);
-	static HRESULT CloneSID(PSID *ppSIDDest, PSID pSIDSrc)
-	{
-		HRESULT hr = ((HRESULT)0x00000000L);
-		if (ppSIDDest == 0)
-			return ((HRESULT)0x80004003L);
-
-		if (*ppSIDDest != 0)
-			return ((HRESULT)0x80070057L);
-		*ppSIDDest = 0;
-			
-		if (!IsValidSid(pSIDSrc))
-			return ((HRESULT)0x80070057L);
-
-		DWORD dwSize = GetLengthSid(pSIDSrc);
-
-		*ppSIDDest = (PSID) malloc(dwSize);
-		if (*ppSIDDest == 0)
-			return ((HRESULT)0x8007000EL);
-		if (!CopySid(dwSize, *ppSIDDest, pSIDSrc))
-		{
-			hr = AtlHresultFromLastError();
-			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 918, 0, L"0")) || (__debugbreak(), 0));
-			free(*ppSIDDest);
-			*ppSIDDest = 0;
-		}
-		return hr;
-	}
-	operator PSECURITY_DESCRIPTOR()
-	{
-		return m_pSD;
-	}
-
-public:
-	PSECURITY_DESCRIPTOR m_pSD;
-	PSID m_pOwner;
-	PSID m_pGroup;
-	PACL m_pDACL;
-	PACL m_pSACL;
-};
-
-inline CSecurityDescriptor::CSecurityDescriptor()
-{
-	m_pSD = 0;
-	m_pOwner = 0;
-	m_pGroup = 0;
-	m_pDACL = 0;
-	m_pSACL= 0;
-}
-
-inline CSecurityDescriptor::~CSecurityDescriptor()
-{
-	delete m_pSD;
-	free(m_pOwner);
-	free(m_pGroup);
-	free(m_pDACL);
-	free(m_pSACL);
-}
-
-inline HRESULT CSecurityDescriptor::Initialize()
-{
-	delete m_pSD;
-	m_pSD = 0;
-
-	free(m_pOwner);
-	m_pOwner = 0;
-
-	free(m_pGroup);
-	m_pGroup = 0;
-
-	free(m_pDACL);
-	m_pDACL = 0;
-
-	free(m_pSACL);
-	m_pSACL = 0;
-
-	__pragma(warning(push)) __pragma(warning(disable: 4571)) try{m_pSD = new SECURITY_DESCRIPTOR;} catch(...) {} __pragma(warning(pop));
-	if (m_pSD != 0)
-	{
-		if (InitializeSecurityDescriptor(m_pSD, (1)))
-			return ((HRESULT)0x00000000L);
-
-		HRESULT hr = AtlHresultFromLastError();
-		delete m_pSD;
-		m_pSD = 0;
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 981, 0, L"0")) || (__debugbreak(), 0));
-		return hr;
-	}
-
-	return ((HRESULT)0x8007000EL);
-}
-
-inline HRESULT CSecurityDescriptor::InitializeFromProcessToken(BOOL bDefaulted)
-{
-	HRESULT hr = Initialize();
-	if (((HRESULT)(hr) >= 0))
-	{
-		PSID pUserSid = 0;
-		PSID pGroupSid = 0;
-		hr = GetProcessSids(&pUserSid, &pGroupSid);
-		if (((HRESULT)(hr) >= 0))
-		{
-			hr = SetOwner(pUserSid, bDefaulted);
-			if (((HRESULT)(hr) >= 0))
-			{
-				hr = SetGroup(pGroupSid, bDefaulted);
-			}			
-			free(pUserSid);
-			free(pGroupSid);
-			
-			if (((HRESULT)(hr) < 0))
-				Initialize();
-		}
-	}
-	return hr;
-}
-
-inline HRESULT CSecurityDescriptor::InitializeFromThreadToken(BOOL bDefaulted, BOOL bRevertToProcessToken)
-{
-	HRESULT hr = Initialize();
-	if (((HRESULT)(hr) >= 0))
-	{
-		PSID pUserSid = 0;
-		PSID pGroupSid = 0;
-	
-		hr = GetThreadSids(&pUserSid, &pGroupSid);
-		if (((hr) & 0xFFFF) == 1008L && bRevertToProcessToken)
-			hr = GetProcessSids(&pUserSid, &pGroupSid);
-		if (((HRESULT)(hr) >= 0))
-		{
-			hr = SetOwner(pUserSid, bDefaulted);
-			if (((HRESULT)(hr) >= 0))
-				hr = SetGroup(pGroupSid, bDefaulted);
-			free(pUserSid);
-			free(pGroupSid);
-			
-			if (((HRESULT)(hr) < 0))
-				Initialize();
-		}
-	}
-	return hr;
-}
-
-inline HRESULT CSecurityDescriptor::SetOwner(PSID pOwnerSid, BOOL bDefaulted)
-{
-	do { (void) ((!!((m_pSD))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1041, 0, L"m_pSD")) || (__debugbreak(), 0)); ; } while(0);
-	HRESULT hr = ((HRESULT)0x00000000L);
-
-	
-	if (SetSecurityDescriptorOwner(m_pSD, 0, bDefaulted))
-	{
-		free(m_pOwner);
-		m_pOwner = 0;
-
-		
-		if (pOwnerSid == 0)
-			return ((HRESULT)0x00000000L);
-
-		
-		hr = CloneSID(&m_pOwner, pOwnerSid);
-		if (((HRESULT)(hr) >= 0))
-		{
-			(void) ((!!((IsValidSid(m_pOwner)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1058, 0, L"IsValidSid(m_pOwner)")) || (__debugbreak(), 0));
-
-			if (!SetSecurityDescriptorOwner(m_pSD, m_pOwner, bDefaulted))
-			{
-				hr = AtlHresultFromLastError();
-				(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1063, 0, L"0")) || (__debugbreak(), 0));
-				free(m_pOwner);
-				m_pOwner = 0;
-			}
-		}
-	}
-	else
-	{
-		hr = AtlHresultFromLastError();
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1072, 0, L"0")) || (__debugbreak(), 0));
-	}
-
-	return hr;
-}
-
-inline HRESULT CSecurityDescriptor::SetGroup(PSID pGroupSid, BOOL bDefaulted)
-{
-	do { (void) ((!!((m_pSD))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1080, 0, L"m_pSD")) || (__debugbreak(), 0)); ; } while(0);
-	HRESULT hr = ((HRESULT)0x00000000L);
-
-	
-	if (SetSecurityDescriptorGroup(m_pSD, 0, bDefaulted))
-	{
-		free(m_pGroup);
-		m_pGroup = 0;
-
-		
-		if (pGroupSid == 0)
-			return ((HRESULT)0x00000000L);
-
-		
-		hr = CloneSID(&m_pGroup, pGroupSid);
-		if (((HRESULT)(hr) >= 0))
-		{
-			(void) ((!!((IsValidSid(m_pGroup)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1097, 0, L"IsValidSid(m_pGroup)")) || (__debugbreak(), 0));
-
-			if (!SetSecurityDescriptorGroup(m_pSD, m_pGroup, bDefaulted))
-			{
-				hr = AtlHresultFromLastError();
-				(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1102, 0, L"0")) || (__debugbreak(), 0));
-				free(m_pGroup);
-				m_pGroup = 0;
-			}
-		}
-	}
-	else
-	{
-		hr = AtlHresultFromLastError();
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1111, 0, L"0")) || (__debugbreak(), 0));
-	}
-
-	return hr;
-}
-
-inline HRESULT CSecurityDescriptor::Allow(LPCTSTR pszPrincipal, DWORD dwAccessMask)
-{
-	PSID pSid;
-	HRESULT hr = GetPrincipalSID(pszPrincipal, &pSid);
-	if (((HRESULT)(hr) >= 0))
-	{
-		hr = Allow(pSid, dwAccessMask);
-		free(pSid);
-	}
-	return hr;
-}
-
-inline HRESULT CSecurityDescriptor::Deny(LPCTSTR pszPrincipal, DWORD dwAccessMask)
-{
-	PSID pSid;
-	HRESULT hr = GetPrincipalSID(pszPrincipal, &pSid);
-	if (((HRESULT)(hr) >= 0))
-	{
-		hr = Deny(pSid, dwAccessMask);
-		free(pSid);
-	}
-	return hr;
-}
-
-inline HRESULT CSecurityDescriptor::Revoke(LPCTSTR pszPrincipal)
-{
-	PSID pSid;
-	HRESULT hr = GetPrincipalSID(pszPrincipal, &pSid);
-	if (((HRESULT)(hr) >= 0))
-	{
-		hr = Revoke(pSid);
-		free(pSid);
-	}
-	return hr;
-}
-
-inline HRESULT CSecurityDescriptor::Allow(PSID pSid, DWORD dwAccessMask)
-{
-	HRESULT hr = AddAccessAllowedACEToACL(&m_pDACL, pSid, dwAccessMask);
-	if (((HRESULT)(hr) >= 0))
-	{
-		if (!SetSecurityDescriptorDacl(m_pSD, 1, m_pDACL, 0))
-			hr = AtlHresultFromLastError();
-	}
-	return hr;
-}
-
-inline HRESULT CSecurityDescriptor::Deny(PSID pSid, DWORD dwAccessMask)
-{
-	HRESULT hr = AddAccessDeniedACEToACL(&m_pDACL, pSid, dwAccessMask);
-	if (((HRESULT)(hr) >= 0))
-	{
-		if (!SetSecurityDescriptorDacl(m_pSD, 1, m_pDACL, 0))
-			hr = AtlHresultFromLastError();
-	}
-	return hr;
-}
-
-inline HRESULT CSecurityDescriptor::Revoke(PSID pSid)
-{
-	HRESULT hr = RemovePrincipalFromACL(m_pDACL, pSid);
-	if (((HRESULT)(hr) >= 0))
-	{
-		if (!SetSecurityDescriptorDacl(m_pSD, 1, m_pDACL, 0))
-			hr = AtlHresultFromLastError();
-	}
-	return hr;
-}
-
-inline HRESULT CSecurityDescriptor::GetProcessSids(PSID* ppUserSid, PSID* ppGroupSid)
-{
-	HRESULT hr = ((HRESULT)0x00000000L);
-	HANDLE hToken = 0;
-	if (ppUserSid)
-		*ppUserSid = 0;
-	if (ppGroupSid)
-		*ppGroupSid = 0;
-	if (OpenProcessToken(GetCurrentProcess(), (0x0008), &hToken))
-	{
-		hr = GetTokenSids(hToken, ppUserSid, ppGroupSid);
-		CloseHandle(hToken);
-	}
-	else
-	{
-		
-		hr = AtlHresultFromLastError();
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1203, 0, L"0")) || (__debugbreak(), 0));
-	}
-
-	return hr;
-}
-
-inline HRESULT CSecurityDescriptor::GetThreadSids(PSID* ppUserSid, PSID* ppGroupSid, BOOL bOpenAsSelf)
-{
-	HRESULT hr = ((HRESULT)0x00000000L);
-	HANDLE hToken = 0;
-	if (ppUserSid)
-		*ppUserSid = 0;
-	if (ppGroupSid)
-		*ppGroupSid = 0;
-	if(OpenThreadToken(GetCurrentThread(), (0x0008), bOpenAsSelf, &hToken))
-	{
-		hr = GetTokenSids(hToken, ppUserSid, ppGroupSid);
-		CloseHandle(hToken);
-	} 
-	else
-		
-		hr = AtlHresultFromLastError();
-
-	return hr;
-}
-
-inline HRESULT CSecurityDescriptor::GetTokenSids(HANDLE hToken, PSID* ppUserSid, PSID* ppGroupSid)
-{
-	DWORD dwSize = 0;
-	HRESULT hr = ((HRESULT)0x00000000L);
-	if (ppUserSid != 0)
-		*ppUserSid = 0;
-	if (ppGroupSid != 0)
-		*ppGroupSid = 0;
-
-	if (ppUserSid != 0)
-	{
-		PTOKEN_USER ptkUser = 0;
-
-		
-		GetTokenInformation(hToken, TokenUser, 0, 0, &dwSize);
-		
-		DWORD dwError = GetLastError();
-		if (dwError == 122L)
-		{
-			ptkUser = (TOKEN_USER*) malloc(dwSize);
-			if (ptkUser != 0)
-			{
-				
-				if (GetTokenInformation(hToken, TokenUser, ptkUser, dwSize, &dwSize))
-				{
-					
-					hr = CloneSID(ppUserSid, ptkUser->User.Sid);
-
-
-					if (((HRESULT)(hr) >= 0))
-					{
-						(void) ((!!((IsValidSid(*ppUserSid)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1260, 0, L"IsValidSid(*ppUserSid)")) || (__debugbreak(), 0));
-					}
-
-				}
-				else
-					
-					hr = AtlHresultFromLastError();
-
-				free(ptkUser);
-				ptkUser = 0;
-			}
-			else
-				hr = ((HRESULT)0x8007000EL);
-		}
-		else
-		{
-			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1276, 0, L"0")) || (__debugbreak(), 0));
-			hr = AtlHresultFromWin32(dwError);
-		}
-	}
-	if (((HRESULT)(hr) >= 0) && ppGroupSid != 0)
-	{
-		PTOKEN_PRIMARY_GROUP ptkGroup = 0;
-
-		
-		GetTokenInformation(hToken, TokenPrimaryGroup, 0, 0, &dwSize);
-		DWORD dwError = GetLastError();
-		
-		if (dwError == 122L)
-		{
-			ptkGroup = (TOKEN_PRIMARY_GROUP*) malloc(dwSize);
-			if (ptkGroup != 0)
-			{
-				
-				if (GetTokenInformation(hToken, TokenPrimaryGroup, ptkGroup, dwSize, &dwSize))
-				{
-					
-					hr = CloneSID(ppGroupSid, ptkGroup->PrimaryGroup);
-
-
-					if (((HRESULT)(hr) >= 0))
-					{
-						(void) ((!!((IsValidSid(*ppGroupSid)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1302, 0, L"IsValidSid(*ppGroupSid)")) || (__debugbreak(), 0));
-					}
-
-				}
-				else
-					
-					hr = AtlHresultFromLastError();
-
-				free(ptkGroup);
-				ptkGroup = 0;
-			}
-			else
-				hr = ((HRESULT)0x8007000EL);
-		}
-		else
-			hr = AtlHresultFromWin32(dwError);
-	}
-	if (((HRESULT)(hr) < 0))
-	{
-		if (ppUserSid != 0)
-		{
-			free (*ppUserSid);
-			*ppUserSid = 0;
-		}
-		if (ppGroupSid != 0)
-		{
-			free (*ppGroupSid);
-			*ppGroupSid = 0;
-		}
-	}
-
-	return hr;
-}
-
-
-inline HRESULT CSecurityDescriptor::GetCurrentUserSID(PSID *ppSid)
-{
-	if (ppSid == 0)
-		return ((HRESULT)0x80004003L);
-	*ppSid = 0;
-
-	HANDLE tkHandle;
-	HRESULT hr = ((HRESULT)0x00000000L);
-
-	if (OpenProcessToken(GetCurrentProcess(), (0x0008), &tkHandle))
-	{
-		TOKEN_USER *tkUser = 0;
-		DWORD tkSize;
-
-		
-		GetTokenInformation(tkHandle, TokenUser, 0, 0, &tkSize);
-		DWORD dwError = GetLastError();
-		
-		if (dwError == 122L)
-		{
-			tkUser = (TOKEN_USER *) malloc(tkSize);
-			if (tkUser != 0)
-			{
-				
-				if (GetTokenInformation(tkHandle, TokenUser, tkUser, tkSize, &tkSize))
-				{
-					hr = CloneSID(ppSid, tkUser->User.Sid);
-
-
-					if (((HRESULT)(hr) >= 0))
-					{
-						(void) ((!!((IsValidSid(*ppSid)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1368, 0, L"IsValidSid(*ppSid)")) || (__debugbreak(), 0));
-					}
-
-				}
-				else
-					hr = AtlHresultFromLastError();
-
-				free (tkUser);
-				tkUser = 0;
-			}
-			else
-				hr = ((HRESULT)0x8007000EL);
-		}
-		else
-		{
-			hr = AtlHresultFromWin32(dwError);
-			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1384, 0, L"0")) || (__debugbreak(), 0));
-		}
-		CloseHandle(tkHandle);
-	}
-	else
-		hr = AtlHresultFromLastError();
-
-	return hr;
-}
-
-
-inline HRESULT CSecurityDescriptor::GetPrincipalSID(LPCTSTR pszPrincipal, PSID *ppSid)
-{
-	if (ppSid == 0)
-		return ((HRESULT)0x80004003L);
-	if (pszPrincipal == 0)
-		return ((HRESULT)0x80070057L);
-	*ppSid = 0;
-
-	HRESULT hr;
-	LPTSTR pszRefDomain = 0;
-	DWORD dwDomainSize = 0;
-	DWORD dwSidSize = 0;
-	SID_NAME_USE snu;
-	DWORD dwError;
-
-	
-	LookupAccountNameW(0, pszPrincipal, 0, &dwSidSize, 0, &dwDomainSize, &snu);
-
-	dwError = GetLastError();
-	if (dwError == 122L)
-	{
-		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{pszRefDomain = new TCHAR[dwDomainSize];} catch(...) {} __pragma(warning(pop));
-		if (pszRefDomain != 0)
-		{
-			*ppSid = (PSID) malloc(dwSidSize);
-			if (*ppSid != 0)
-			{
-				if (LookupAccountNameW(0, pszPrincipal, *ppSid, &dwSidSize, pszRefDomain, &dwDomainSize, &snu))
-				{
-					hr = ((HRESULT)0x00000000L);
-				}
-				else
-				{
-					hr = AtlHresultFromLastError();
-					free(*ppSid);
-					*ppSid = 0;
-				}
-			}
-			else
-				hr = ((HRESULT)0x8007000EL);
-			delete[] pszRefDomain;
-		}
-		else
-			hr = ((HRESULT)0x8007000EL);
-	}
-	else
-		hr = AtlHresultFromWin32(dwError);
-
-	return hr;
-}
-
-inline HRESULT CSecurityDescriptor::Attach(PSECURITY_DESCRIPTOR pSelfRelativeSD)
-{
-	PACL    pDACL = 0;
-	PACL    pSACL = 0;
-	BOOL    bDACLPresent, bSACLPresent;
-	BOOL    bDefaulted;
-	HRESULT hr;
-	PSID    pUserSid;
-	PSID    pGroupSid;
-	
-	if (pSelfRelativeSD == 0 || !IsValidSecurityDescriptor(pSelfRelativeSD))
-		return ((HRESULT)0x80070057L);
-	
-	hr = Initialize();
-	if(((HRESULT)(hr) < 0))
-		return hr;
-
-	
-	if (GetSecurityDescriptorDacl(pSelfRelativeSD, &bDACLPresent, &pDACL, &bDefaulted))
-	{
-		if (bDACLPresent)
-		{
-			
-			do { int __atl_condVal=!!(pDACL != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1469, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) return ((HRESULT)0x80004005L); } while (0);
-			
-			m_pDACL = (PACL) malloc(pDACL->AclSize);
-			if (m_pDACL != 0)
-			{
-				
-				if (InitializeAcl(m_pDACL, pDACL->AclSize, (2)))
-				{
-					
-					hr = CopyACL(m_pDACL, pDACL);
-					if (((HRESULT)(hr) >= 0) && !IsValidAcl(m_pDACL))
-						hr = ((HRESULT)0x80004005L);
-				}
-				else
-					hr = AtlHresultFromLastError();
-			}
-			else
-				hr = ((HRESULT)0x8007000EL);
-		}
-		
-		if (((HRESULT)(hr) >= 0) && !SetSecurityDescriptorDacl(m_pSD, bDACLPresent, m_pDACL, bDefaulted))
-			hr = AtlHresultFromLastError();
-	}
-	else
-		hr = AtlHresultFromLastError();
-
-	
-	if (((HRESULT)(hr) >= 0) && GetSecurityDescriptorSacl(pSelfRelativeSD, &bSACLPresent, &pSACL, &bDefaulted))
-	{
-		if (bSACLPresent)
-		{
-			
-			do { int __atl_condVal=!!(pSACL != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1501, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) return ((HRESULT)0x80004005L); } while (0);
-			
-			m_pSACL = (PACL) malloc(pSACL->AclSize);
-			if (m_pSACL != 0)
-			{
-				
-				if (InitializeAcl(m_pSACL, pSACL->AclSize, (2)))
-				{
-					
-					hr = CopyACL(m_pSACL, pSACL);
-					if (((HRESULT)(hr) >= 0) && !IsValidAcl(m_pSACL))
-						hr = ((HRESULT)0x80004005L);
-				}
-				else
-					hr = AtlHresultFromLastError();
-			}
-			else
-				hr = ((HRESULT)0x8007000EL);
-		}
-		
-		if (((HRESULT)(hr) >= 0) && !SetSecurityDescriptorSacl(m_pSD, bSACLPresent, m_pSACL, bDefaulted))
-			hr = AtlHresultFromLastError();
-	}
-	else if (((HRESULT)(hr) >= 0))
-		hr = AtlHresultFromLastError();
-	
-	if (((HRESULT)(hr) >= 0))
-	{
-		if (GetSecurityDescriptorOwner(pSelfRelativeSD, &pUserSid, &bDefaulted))
-		{
-			if (((HRESULT)(hr = SetOwner(pUserSid, bDefaulted)) >= 0))
-			{
-				if (GetSecurityDescriptorGroup(pSelfRelativeSD, &pGroupSid, &bDefaulted))
-				{
-					if (((HRESULT)(hr = SetGroup(pGroupSid, bDefaulted)) >= 0))
-					{
-						if (!IsValidSecurityDescriptor(m_pSD))
-							hr = ((HRESULT)0x80004005L);
-					}
-				}
-				else
-					hr = AtlHresultFromLastError();
-			}
-		}
-		else
-			hr = AtlHresultFromLastError();
-	}
-
-	if (((HRESULT)(hr) < 0))
-	{
-		free(m_pDACL);
-		m_pDACL = 0;
-
-		free(m_pSACL);
-		m_pSACL = 0;
-
-		delete m_pSD;
-	 	m_pSD = 0;
-	}
-
-	return hr;
-}
-
-inline HRESULT CSecurityDescriptor::AttachObject(HANDLE hObject)
-{
-	HRESULT hr;
-	DWORD dwError;
-	DWORD dwSize = 0;
-	PSECURITY_DESCRIPTOR pSD = 0;
-
-#pragma warning(push)
-#pragma warning(disable: 6309 6387)
-	
-	GetKernelObjectSecurity(hObject, (0x00000001L) | (0x00000002L) | (0x00000004L), 0, 0, &dwSize);
-#pragma warning(pop)
-
-	dwError = GetLastError();
-	if (dwError != 122L)
-		return AtlHresultFromWin32(dwError);
-
-	pSD = (PSECURITY_DESCRIPTOR) malloc(dwSize);
-	if (pSD != 0)
-	{
-		if (GetKernelObjectSecurity(hObject, (0x00000001L) | (0x00000002L) |
-			(0x00000004L), pSD, dwSize, &dwSize))
-
-			hr = Attach(pSD);
-		else
-			hr = AtlHresultFromLastError();
-		free(pSD);
-	}
-	else
-		hr = ((HRESULT)0x8007000EL);
-
-	return hr;
-}
-
-
-inline HRESULT CSecurityDescriptor::CopyACL(PACL pDest, PACL pSrc)
-{
-	ACL_SIZE_INFORMATION aclSizeInfo;
-	LPVOID pAce;
-	ACE_HEADER *aceHeader;
-
-	if (pDest == 0)
-		return ((HRESULT)0x80004003L);
-
-	if (pSrc == 0)
-		return ((HRESULT)0x00000000L);
-
-	if (!GetAclInformation(pSrc, (LPVOID) &aclSizeInfo, sizeof(ACL_SIZE_INFORMATION), AclSizeInformation))
-		return AtlHresultFromLastError();
-
-	
-	for (UINT i = 0; i < aclSizeInfo.AceCount; i++)
-	{
-		if (!GetAce(pSrc, i, &pAce))
-			return AtlHresultFromLastError();
-
-		aceHeader = (ACE_HEADER *) pAce;
-
-		if (!AddAce(pDest, (2), 0xffffffff, pAce, aceHeader->AceSize))
-			return AtlHresultFromLastError();
-	}
-
-	return ((HRESULT)0x00000000L);
-}
-
-inline HRESULT CSecurityDescriptor::AddAccessDeniedACEToACL(PACL *ppAcl, PSID pSid, DWORD dwAccessMask)
-{
-	ACL_SIZE_INFORMATION aclSizeInfo;
-	int aclSize;
-	PACL oldACL, newACL = 0;
-	HRESULT hr = ((HRESULT)0x00000000L);
-
-	if (ppAcl == 0)
-		return ((HRESULT)0x80004003L);
-
-	oldACL = *ppAcl;
-	
-	if (pSid == 0 || !IsValidSid(pSid))
-		return ((HRESULT)0x80070057L);
-
-	aclSizeInfo.AclBytesInUse = 0;
-	if (*ppAcl != 0 && !GetAclInformation(oldACL, (LPVOID) &aclSizeInfo, sizeof(ACL_SIZE_INFORMATION), AclSizeInformation))
-		hr = AtlHresultFromLastError();
-
-	if (((HRESULT)(hr) >= 0))
-	{
-		aclSize = aclSizeInfo.AclBytesInUse + sizeof(ACL) + sizeof(ACCESS_DENIED_ACE) + GetLengthSid(pSid) - sizeof(DWORD);
-		newACL = (PACL) malloc(aclSize);
-		if (newACL != 0)
-		{
-			if (InitializeAcl(newACL, aclSize, (2)))
-			{
-				
-				if (AddAccessDeniedAce(newACL, (2), dwAccessMask, pSid))
-				{
-					
-					hr = CopyACL(newACL, oldACL);
-					if (((HRESULT)(hr) >= 0))
-					{
-						*ppAcl = newACL;
-						free(oldACL);
-					}
-				}
-				else
-					hr = AtlHresultFromLastError();
-			}
-			else
-				hr = AtlHresultFromLastError();
-
-			if (((HRESULT)(hr) < 0))
-				free(newACL);
-		}
-		else
-			hr = ((HRESULT)0x8007000EL);
-	}
-	return hr;
-}
-
-
-inline HRESULT CSecurityDescriptor::AddAccessAllowedACEToACL(PACL *ppAcl, PSID pSid, DWORD dwAccessMask)
-{
-	ACL_SIZE_INFORMATION aclSizeInfo;
-	int aclSize;
-	HRESULT hr = ((HRESULT)0x00000000L);
-	PACL oldACL, newACL = 0;
-
-	if (ppAcl == 0)
-		return ((HRESULT)0x80004003L);
-
-	oldACL = *ppAcl;
-	
-	if (pSid == 0 || !IsValidSid(pSid))
-		return ((HRESULT)0x80070057L);
-
-	aclSizeInfo.AclBytesInUse = 0;
-	if (*ppAcl != 0 && !GetAclInformation(oldACL, (LPVOID) &aclSizeInfo, (DWORD) sizeof(ACL_SIZE_INFORMATION), AclSizeInformation))
-		hr = AtlHresultFromLastError();
-
-	if (((HRESULT)(hr) >= 0))
-	{
-		aclSize = aclSizeInfo.AclBytesInUse + sizeof(ACL) + sizeof(ACCESS_ALLOWED_ACE) + GetLengthSid(pSid) - sizeof(DWORD);
-		newACL = (PACL) malloc(aclSize);
-		if (newACL != 0)
-		{
-			if (InitializeAcl(newACL, aclSize, (2)))
-			{
-				
-				hr = CopyACL(newACL, oldACL);
-				if (((HRESULT)(hr) >= 0))
-				{
-					
-					if (AddAccessAllowedAce(newACL, (2), dwAccessMask, pSid))
-					{
-						*ppAcl = newACL;
-						free(oldACL);
-					}
-					else
-						hr = AtlHresultFromLastError();
-				}
-			}
-			else
-				hr = AtlHresultFromLastError();
-
-			if (((HRESULT)(hr) < 0))
-				free(newACL);
-		}
-		else
-			hr = ((HRESULT)0x8007000EL);
-	}
-	return hr;
-}
-
-inline HRESULT CSecurityDescriptor::RemovePrincipalFromACL(PACL pAcl, PSID principalSID)
-{
-	if (pAcl == 0 || principalSID == 0 || !IsValidSid(principalSID))
-		return ((HRESULT)0x80070057L);
-
-	HRESULT hr = ((HRESULT)0x00000000L);
-	ACL_SIZE_INFORMATION aclSizeInfo;
-	if (!GetAclInformation(pAcl, (LPVOID) &aclSizeInfo, (DWORD) sizeof(ACL_SIZE_INFORMATION), AclSizeInformation))
-	{
-		hr = AtlHresultFromLastError();
-		aclSizeInfo.AceCount = 0;
-	}
-		
-	for (ULONG i = aclSizeInfo.AceCount; i > 0; i--)
-	{
-		ULONG uIndex = i - 1;
-		LPVOID ace;	
-		if (!GetAce(pAcl, uIndex, &ace))
-		{
-			hr = AtlHresultFromLastError();
-			break;
-		}
-
-		ACE_HEADER *aceHeader = (ACE_HEADER *) ace;
-
-		if (aceHeader->AceType == (0x0))
-		{
-			ACCESS_ALLOWED_ACE *accessAllowedAce = (ACCESS_ALLOWED_ACE *) ace;
-			if (EqualSid(principalSID, (PSID) &accessAllowedAce->SidStart))
-			{
-				DeleteAce(pAcl, uIndex);
-			}
-		} 
-		else if (aceHeader->AceType == (0x1))
-		{
-			ACCESS_DENIED_ACE *accessDeniedAce = (ACCESS_DENIED_ACE *) ace;
-			if (EqualSid(principalSID, (PSID) &accessDeniedAce->SidStart))
-			{
-				DeleteAce(pAcl, uIndex);
-			}
-		} 
-		else if (aceHeader->AceType == (0x2))
-		{
-			SYSTEM_AUDIT_ACE *systemAuditAce = (SYSTEM_AUDIT_ACE *) ace;
-			if (EqualSid(principalSID, (PSID) &systemAuditAce->SidStart))
-			{
-				DeleteAce(pAcl, uIndex);
-			}
-		}
-	}
-	return hr;
-}
-
-inline HRESULT CSecurityDescriptor::SetPrivilege(LPCTSTR privilege, BOOL bEnable, HANDLE hToken)
-{
-	TOKEN_PRIVILEGES tpPrevious;
-	TOKEN_PRIVILEGES tp;
-	DWORD  cbPrevious = sizeof(TOKEN_PRIVILEGES);
-	LUID   luid;
-	HANDLE hTokenUsed;
-
-	if (!LookupPrivilegeValueW(0, privilege, &luid ))
-		goto _Error;
-
-	
-	if (hToken != 0)
-		hTokenUsed = hToken;
-	else
-		if (!OpenProcessToken(GetCurrentProcess(), (0x0020) | (0x0008), &hTokenUsed))
-			goto _Error;
-
-	tp.PrivilegeCount = 1;
-	tp.Privileges[0].Luid = luid;
-	tp.Privileges[0].Attributes = 0;
-
-	memset(&tpPrevious, 0, sizeof(tpPrevious));
-
-	if (!AdjustTokenPrivileges(hTokenUsed, 0, &tp, sizeof(TOKEN_PRIVILEGES), &tpPrevious, &cbPrevious))
-		goto _Error_CloseHandle;
-
-	tpPrevious.PrivilegeCount = 1;
-	tpPrevious.Privileges[0].Luid = luid;
-
-	if (bEnable)
-		tpPrevious.Privileges[0].Attributes |= (0x00000002L);
-	else
-		tpPrevious.Privileges[0].Attributes &= ~(0x00000002L);
-
-	if (!AdjustTokenPrivileges(hTokenUsed, 0, &tpPrevious, cbPrevious, 0, 0))
-		goto _Error_CloseHandle;
-
-	if(hToken == 0)
-		CloseHandle(hTokenUsed);
-
-	return ((HRESULT)0x00000000L);
-
-	HRESULT hr;
-
-_Error:
-	hr = AtlHresultFromLastError();
-	return hr;
-
-_Error_CloseHandle:
-	hr = AtlHresultFromLastError();
-	if (hToken == 0)
-		CloseHandle(hTokenUsed);
-	return hr;
-}
-
-
-
-
-
-
-
-
-template <class T1>
-class CComCreator
-{
-public:
-	static HRESULT __stdcall CreateInstance(void* pv, const IID & riid, LPVOID* ppv)
-	{
-		(void) ((!!((ppv != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1858, 0, L"ppv != 0")) || (__debugbreak(), 0));
-		if (ppv == 0)
-			return ((HRESULT)0x80004003L);
-		*ppv = 0;
-
-		HRESULT hRes = ((HRESULT)0x8007000EL);
-		T1* p = 0;
-#pragma warning(push)
-#pragma warning(disable: 6014)
-		
-		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{p = new T1(pv);} catch(...) {} __pragma(warning(pop))
-#pragma warning(pop)
-		if (p != 0)
-		{
-			p->SetVoid(pv);
-			p->InternalFinalConstructAddRef();
-			hRes = p->_AtlInitialConstruct();
-			if (((HRESULT)(hRes) >= 0))
-				hRes = p->FinalConstruct();
-			if (((HRESULT)(hRes) >= 0))
-				hRes = p->_AtlFinalConstruct();
-			p->InternalFinalConstructRelease();
-			if (hRes == ((HRESULT)0x00000000L))
-				hRes = p->QueryInterface(riid, ppv);
-			if (hRes != ((HRESULT)0x00000000L))
-				delete p;
-		}
-		return hRes;
-	}
-};
-
-template <class T1>
-class CComInternalCreator
-{
-public:
-	static HRESULT __stdcall CreateInstance(void* pv, const IID & riid, LPVOID* ppv)
-	{
-		(void) ((!!((ppv != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1895, 0, L"ppv != 0")) || (__debugbreak(), 0));
-		if (ppv == 0)
-			return ((HRESULT)0x80004003L);
-		*ppv = 0;
-
-		HRESULT hRes = ((HRESULT)0x8007000EL);
-		T1* p = 0;
-#pragma warning(push)
-#pragma warning(disable: 6014)
-		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{p = new T1(pv);} catch(...) {} __pragma(warning(pop))
-#pragma warning(pop)
-		if (p != 0)
-		{
-			p->SetVoid(pv);
-			p->InternalFinalConstructAddRef();
-			hRes = p->_AtlInitialConstruct();
-			if (((HRESULT)(hRes) >= 0))
-				hRes = p->FinalConstruct();
-			if (((HRESULT)(hRes) >= 0))
-				hRes = p->_AtlFinalConstruct();
-			p->InternalFinalConstructRelease();
-			if (hRes == ((HRESULT)0x00000000L))
-				hRes = p->_InternalQueryInterface(riid, ppv);
-			if (hRes != ((HRESULT)0x00000000L))
-				delete p;
-		}
-		return hRes;
-	}
-};
-
-template <HRESULT hr>
-class CComFailCreator
-{
-public:
-	static HRESULT __stdcall CreateInstance(void*, const IID &, LPVOID* ppv)
-	{
-		if (ppv == 0)
-			return ((HRESULT)0x80004003L);
-		*ppv = 0;
-
-		return hr;
-	}
-};
-
-template <class T1, class T2>
-class CComCreator2
-{
-public:
-	static HRESULT __stdcall CreateInstance(void* pv, const IID & riid, LPVOID* ppv)
-	{
-		(void) ((!!((ppv != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1945, 0, L"ppv != 0")) || (__debugbreak(), 0));
-
-		return (pv == 0) ? 
-			T1::CreateInstance(0, riid, ppv) : 
-			T2::CreateInstance(pv, riid, ppv);
-	}
-};
-
-
-
-
-
-
-
-
-
-
-struct _ATL_CREATORDATA
-{
-	_ATL_CREATORFUNC* pFunc;
-};
-
-template <class Creator>
-class _CComCreatorData
-{
-public:
-	static _ATL_CREATORDATA data;
-};
-
-template <class Creator>
-_ATL_CREATORDATA _CComCreatorData<Creator>::data = {Creator::CreateInstance};
-
-struct _ATL_CACHEDATA
-{
-	DWORD dwOffsetVar;
-	_ATL_CREATORFUNC* pFunc;
-};
-
-template <class Creator, DWORD dwVar>
-class _CComCacheData
-{
-public:
-	static _ATL_CACHEDATA data;
-};
-
-template <class Creator, DWORD dwVar>
-_ATL_CACHEDATA _CComCacheData<Creator, dwVar>::data = {dwVar, Creator::CreateInstance};
-
-struct _ATL_CHAINDATA
-{
-	DWORD_PTR dwOffset;
-	const _ATL_INTMAP_ENTRY* (__stdcall *pFunc)();
-};
-
-template <class base, class derived>
-class _CComChainData
-{
-public:
-	static _ATL_CHAINDATA data;
-};
-
-template <class base, class derived>
-_ATL_CHAINDATA _CComChainData<base, derived>::data =
-	{((DWORD_PTR)(static_cast<base*>((derived*)8))-8), base::_GetEntries};
-
-template <class T, const CLSID* pclsid>
-class CComAggregateCreator
-{
-public:
-	static HRESULT __stdcall CreateInstance(void* pv, const IID &, LPVOID* ppv) throw()
-	{
-		
-		(void) ((!!((ppv != 0 && *ppv == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2017, 0, L"ppv != 0 && *ppv == 0")) || (__debugbreak(), 0));
-
-		(void) ((!!((pv != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2019, 0, L"pv != 0")) || (__debugbreak(), 0));
-		if (pv == 0)
-			return ((HRESULT)0x80070057L);
-
-		T* p = (T*) pv;
-		
-		
-		
-		return CoCreateInstance(*pclsid, p->GetControllingUnknown(), (CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER), __uuidof(IUnknown), ppv);
-	}
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-class CComObjectRootBase
-{
-public:
-	CComObjectRootBase()
-	{
-		m_dwRef = 0L;
-	}
-	~CComObjectRootBase()
-	{
-	}
-	HRESULT FinalConstruct()
-	{
-		return ((HRESULT)0x00000000L);
-	}
-	
-	HRESULT _AtlFinalConstruct()
-	{
-		return ((HRESULT)0x00000000L);
-	}
-	void FinalRelease() {}
-	void _AtlFinalRelease() {}		
-
-	void _HRPass(HRESULT hr)		
-	{
-		(hr);
-	}
-
-	void _HRFail(HRESULT hr)		
-	{
-		(hr);
-	}
-
-
-	
-	static void __stdcall ObjectMain(bool );
-
-	static const struct _ATL_CATMAP_ENTRY* GetCategoryMap() {return 0;};
-	static HRESULT __stdcall InternalQueryInterface(void* pThis,
-		const _ATL_INTMAP_ENTRY* pEntries, const IID & iid, void** ppvObject)
-	{
-		
-
-		(void) ((!!((ppvObject != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2286, 0, L"ppvObject != 0")) || (__debugbreak(), 0));
-
-		(void) ((!!((pThis != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2288, 0, L"pThis != 0")) || (__debugbreak(), 0));
-		
-		(void) ((!!((pEntries->pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2290, 0, L"pEntries->pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)")) || (__debugbreak(), 0));
-	
-
-
-		HRESULT hRes = AtlInternalQueryInterface(pThis, pEntries, iid, ppvObject);
-	
-
-
-		return hRes;
-	}
-
-
-	ULONG OuterAddRef()
-	{
-		return m_pOuterUnknown->AddRef();
-	}
-	ULONG OuterRelease()
-	{
-		return m_pOuterUnknown->Release();
-	}
-	HRESULT OuterQueryInterface(const IID & iid, void ** ppvObject)
-	{
-		return m_pOuterUnknown->QueryInterface(iid, ppvObject);
-	}
-
-	void SetVoid(void*) {}
-	void InternalFinalConstructAddRef() {}
-	void InternalFinalConstructRelease()
-	{
-		do { (void) ((!!((m_dwRef == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2319, 0, L"m_dwRef == 0")) || (__debugbreak(), 0)); ; } while(0);
-	}
-	
-	
-
-
-	static HRESULT __stdcall _Break(void* , const IID & iid, void** , DWORD_PTR )
-	{
-		(iid);
-		((HRESULT)0x00000000L);
-		DebugBreak();
-		return ((HRESULT)0x00000001L);
-	}
-	static HRESULT __stdcall _NoInterface(void* , const IID & , void** , DWORD_PTR )
-	{
-		return ((HRESULT)0x80004002L);
-	}
-	static HRESULT __stdcall _Creator(void* pv, const IID & iid, void** ppvObject, DWORD_PTR dw)
-	{
-		_ATL_CREATORDATA* pcd = (_ATL_CREATORDATA*)dw;
-		return pcd->pFunc(pv, iid, ppvObject);
-	}
-	static HRESULT __stdcall _Delegate(void* pv, const IID & iid, void** ppvObject, DWORD_PTR dw)
-	{
-		HRESULT hRes = ((HRESULT)0x80004002L);
-		IUnknown* p = *(IUnknown**)((DWORD_PTR)pv + dw);
-		if (p != 0)
-			hRes = p->QueryInterface(iid, ppvObject);
-		return hRes;
-	}
-	static HRESULT __stdcall _Chain(void* pv, const IID & iid, void** ppvObject, DWORD_PTR dw)
-	{
-		_ATL_CHAINDATA* pcd = (_ATL_CHAINDATA*)dw;
-		void* p = (void*)((DWORD_PTR)pv + pcd->dwOffset);
-		return InternalQueryInterface(p, pcd->pFunc(), iid, ppvObject);
-	}
-	static HRESULT __stdcall _ChainAttr(void* pv, const IID & iid, void** ppvObject, DWORD_PTR dw)
-	{
-		const _ATL_INTMAP_ENTRY* (__stdcall *pFunc)() = (const _ATL_INTMAP_ENTRY* (__stdcall *)())dw;
-		const _ATL_INTMAP_ENTRY *pEntries = pFunc();
-		if (pEntries == 0)
-			return ((HRESULT)0x00000000L);
-		return InternalQueryInterface(pv, pEntries, iid, ppvObject);
-	}
-	static HRESULT __stdcall _Cache(void* pv, const IID & iid, void** ppvObject, DWORD_PTR dw)
-	{
-		HRESULT hRes = ((HRESULT)0x80004002L);
-		_ATL_CACHEDATA* pcd = (_ATL_CACHEDATA*)dw;
-		IUnknown** pp = (IUnknown**)((DWORD_PTR)pv + pcd->dwOffsetVar);
-		if (*pp == 0)
-			hRes = pcd->pFunc(pv, __uuidof(IUnknown), (void**)pp);
-		if (*pp != 0)
-			hRes = (*pp)->QueryInterface(iid, ppvObject);
-		return hRes;
-	}
-
-	union
-	{
-		long m_dwRef;
-		IUnknown* m_pOuterUnknown;
-	};
-};
-
-#pragma managed(push, off)
-inline void __stdcall CComObjectRootBase::ObjectMain(bool )
-{
-}
-#pragma managed(pop)
-
-
-
-template <class ThreadModel>
-class CComObjectRootEx;
-
-template <class ThreadModel>
-class CComObjectLockT
-{
-public:
-	CComObjectLockT(CComObjectRootEx<ThreadModel>* p)
-	{
-		if (p)
-			p->Lock();
-		m_p = p;
-	}
-
-	~CComObjectLockT()
-	{
-		if (m_p)
-			m_p->Unlock();
-	}
-	CComObjectRootEx<ThreadModel>* m_p;
-};
-
-template <> class CComObjectLockT<CComSingleThreadModel>;
-
-template <class ThreadModel>
-class CComObjectRootEx : public CComObjectRootBase
-{
-public:
-	typedef ThreadModel _ThreadModel;
-	typedef typename _ThreadModel::AutoCriticalSection _CritSec;
-	typedef typename _ThreadModel::AutoDeleteCriticalSection _AutoDelCritSec;
-	typedef CComObjectLockT<_ThreadModel> ObjectLock;
-
-	~CComObjectRootEx() {}
-
-	ULONG InternalAddRef()
-	{
-		do { (void) ((!!((m_dwRef != -1L))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2427, 0, L"m_dwRef != -1L")) || (__debugbreak(), 0)); ; } while(0);
-		return _ThreadModel::Increment(&m_dwRef);
-	}
-	ULONG InternalRelease()
-	{
-
-		LONG nRef = _ThreadModel::Decrement(&m_dwRef);
-		if (nRef < -(2147483647L / 2))
-		{
-			(void) ((!!((0 && L"Release called on a pointer that has already been released"))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2436, 0, L"0 && L\"Release called on a pointer that has already been released\"")) || (__debugbreak(), 0));
-		}
-		return nRef;
-
-
-
-	}
-
-	HRESULT _AtlInitialConstruct()
-	{
-		return m_critsec.Init();
-	}
-	void Lock() {m_critsec.Lock();}
-	void Unlock() {m_critsec.Unlock();}
-private:
-	_AutoDelCritSec m_critsec;
-};
-
-template <>
-class CComObjectRootEx<CComSingleThreadModel> : public CComObjectRootBase
-{
-public:
-	typedef CComSingleThreadModel _ThreadModel;
-	typedef _ThreadModel::AutoCriticalSection _CritSec;
-	typedef _ThreadModel::AutoDeleteCriticalSection _AutoDelCritSec;
-	typedef CComObjectLockT<_ThreadModel> ObjectLock;
-
-	~CComObjectRootEx() {}
-
-	ULONG InternalAddRef()
-	{
-		do { (void) ((!!((m_dwRef != -1L))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2467, 0, L"m_dwRef != -1L")) || (__debugbreak(), 0)); ; } while(0);
-		return _ThreadModel::Increment(&m_dwRef);
-	}
-	ULONG InternalRelease()
-	{
-
-		long nRef = _ThreadModel::Decrement(&m_dwRef);
-		if (nRef < -(2147483647L / 2))
-		{
-			(void) ((!!((0 && L"Release called on a pointer that has already been released"))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2476, 0, L"0 && L\"Release called on a pointer that has already been released\"")) || (__debugbreak(), 0));
-		}
-		return nRef;
-
-
-
-	}
-
-	HRESULT _AtlInitialConstruct()
-	{
-		return ((HRESULT)0x00000000L);
-	}
-
-	void Lock() {}
-	void Unlock() {}
-};
-
-template <>
-class CComObjectLockT<CComSingleThreadModel>
-{
-public:
-	CComObjectLockT(CComObjectRootEx<CComSingleThreadModel>*) {}
-	~CComObjectLockT() {}
-};
-
-typedef CComObjectRootEx<CComObjectThreadModel> CComObjectRoot;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-template<class Base> class CComObject; 
-
-template <class Owner, class ThreadModel = CComObjectThreadModel>
-class CComTearOffObjectBase : public CComObjectRootEx<ThreadModel>
-{
-public:
-	typedef Owner _OwnerClass;
-	Owner* m_pOwner;
-	CComTearOffObjectBase() {m_pOwner = 0;}
-};
-
-
-
-template <class Base>
-class CComObject : public Base
-{
-public:
-	typedef Base _BaseClass;
-	CComObject(void* = 0) throw()
-	{
-		_pAtlModule->Lock();
-	}
-	
-	
-	virtual ~CComObject() throw()
-	{
-		m_dwRef = -(2147483647L/2);
-		FinalRelease();
-
-
-
-		_pAtlModule->Unlock();
-	}
-	
-	
-	virtual ULONG __stdcall AddRef() {return InternalAddRef();}
-	virtual ULONG __stdcall Release()
-	{
-		ULONG l = InternalRelease();
-		if (l == 0)
-			delete this;
-		return l;
-	}
-	
-	virtual HRESULT __stdcall QueryInterface(const IID & iid, void ** ppvObject) throw()
-	{return _InternalQueryInterface(iid, ppvObject);}
-	template <class Q>
-	HRESULT __stdcall QueryInterface(Q** pp) throw()
-	{
-		return QueryInterface(__uuidof(Q), (void**)pp);
-	}
-
-	static HRESULT __stdcall CreateInstance(CComObject<Base>** pp) throw();
-};
-
-template <class Base>
-HRESULT __stdcall CComObject<Base>::CreateInstance(CComObject<Base>** pp) throw()
-{
-	(void) ((!!((pp != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2674, 0, L"pp != 0")) || (__debugbreak(), 0));
-	if (pp == 0)
-		return ((HRESULT)0x80004003L);
-	*pp = 0;
-
-	HRESULT hRes = ((HRESULT)0x8007000EL);
-	CComObject<Base>* p = 0;
-	__pragma(warning(push)) __pragma(warning(disable: 4571)) try{p = new CComObject<Base>();} catch(...) {} __pragma(warning(pop))
-	if (p != 0)
-	{
-		p->SetVoid(0);
-		p->InternalFinalConstructAddRef();
-		hRes = p->_AtlInitialConstruct();
-		if (((HRESULT)(hRes) >= 0))
-			hRes = p->FinalConstruct();
-		if (((HRESULT)(hRes) >= 0))
-			hRes = p->_AtlFinalConstruct();
-		p->InternalFinalConstructRelease();
-		if (hRes != ((HRESULT)0x00000000L))
-		{
-			delete p;
-			p = 0;
-		}
-	}
-	*pp = p;
-	return hRes;
-}
-
-
-
-
-
-template <class Base>
-class CComObjectCached : public Base
-{
-public:
-	typedef Base _BaseClass;
-	CComObjectCached(void* = 0){}
-	
-	
-	
-	 ~CComObjectCached()
-	{
-		m_dwRef = -(2147483647L/2);
-		FinalRelease();
-
-
-
-	}
-	
-	
-	virtual ULONG __stdcall AddRef() throw()
-	{
-		ULONG l = InternalAddRef();
-		if (l == 2)
-			_pAtlModule->Lock();
-		return l;
-	}
-	virtual ULONG __stdcall Release() throw()
-	{
-		ULONG l = InternalRelease();
-		if (l == 0)
-			delete this;
-		else if (l == 1)
-			_pAtlModule->Unlock();
-		return l;
-	}
-	
-	virtual HRESULT __stdcall QueryInterface(const IID & iid, void ** ppvObject) throw()
-	{return _InternalQueryInterface(iid, ppvObject);}
-	static HRESULT __stdcall CreateInstance(CComObjectCached<Base>** pp) throw();
-};
-
-template <class Base>
-HRESULT __stdcall CComObjectCached<Base>::CreateInstance(CComObjectCached<Base>** pp) throw()
-{
-	(void) ((!!((pp != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2750, 0, L"pp != 0")) || (__debugbreak(), 0));
-	if (pp == 0)
-		return ((HRESULT)0x80004003L);
-	*pp = 0;
-
-	HRESULT hRes = ((HRESULT)0x8007000EL);
-	CComObjectCached<Base>* p = 0;
-	__pragma(warning(push)) __pragma(warning(disable: 4571)) try{p = new CComObjectCached<Base>();} catch(...) {} __pragma(warning(pop))
-	if (p != 0)
-	{
-		p->SetVoid(0);
-		p->InternalFinalConstructAddRef();
-		hRes = p->_AtlInitialConstruct();
-		if (((HRESULT)(hRes) >= 0))
-			hRes = p->FinalConstruct();
-		if (((HRESULT)(hRes) >= 0))
-			hRes = p->_AtlFinalConstruct();
-		p->InternalFinalConstructRelease();
-		if (hRes != ((HRESULT)0x00000000L))
-		{
-			delete p;
-			p = 0;
-		}
-	}
-	*pp = p;
-	return hRes;
-}
-
-
-
-
-template <class Base>
-class CComObjectNoLock : public Base
-{
-public:
-	typedef Base _BaseClass;
-	CComObjectNoLock(void* = 0){}
-	
-	
-
-	
-	 ~CComObjectNoLock()
-	{
-		m_dwRef = -(2147483647L/2);
-		FinalRelease();
-
-
-
-	}
-
-	
-	
-	virtual ULONG __stdcall AddRef() throw() {return InternalAddRef();}
-	virtual ULONG __stdcall Release() throw()
-	{
-		ULONG l = InternalRelease();
-		if (l == 0)
-			delete this;
-		return l;
-	}
-	
-	virtual HRESULT __stdcall QueryInterface(const IID & iid, void ** ppvObject) throw()
-	{return _InternalQueryInterface(iid, ppvObject);}
-};
-
-
-
-
-template <class Base>
-class CComObjectGlobal : public Base
-{
-public:
-	typedef Base _BaseClass;
-	CComObjectGlobal(void* = 0)
-	{
-		m_hResFinalConstruct = ((HRESULT)0x00000000L);
-		__if_exists(FinalConstruct)
-		{
-			__if_exists(InternalFinalConstructAddRef)
-			{
-				InternalFinalConstructAddRef();
-			}
-			m_hResFinalConstruct = _AtlInitialConstruct();
-			if (((HRESULT)(m_hResFinalConstruct) >= 0))
-				m_hResFinalConstruct = FinalConstruct();
-			__if_exists(InternalFinalConstructRelease)
-			{
-				InternalFinalConstructRelease();
-			}
-		}
-	}
-	virtual ~CComObjectGlobal()
-	{
-		__if_exists(FinalRelease)
-		{
-			FinalRelease();
-		}
-
-
-
-	}
-
-	virtual ULONG __stdcall AddRef() throw()
-	{
-		return _pAtlModule->Lock();
-	}
-	virtual ULONG __stdcall Release() throw()
-	{
-		return _pAtlModule->Unlock();
-	}
-	virtual HRESULT __stdcall QueryInterface(const IID & iid, void ** ppvObject) throw()
-	{
-		return _InternalQueryInterface(iid, ppvObject);
-	}
-	HRESULT m_hResFinalConstruct;
-};
-
-
-
-template <class Base>
-class CComObjectStack : public Base
-{
-public:
-	typedef Base _BaseClass;
-	CComObjectStack(void* = 0)
-	{
-		m_hResFinalConstruct = _AtlInitialConstruct();
-		if (((HRESULT)(m_hResFinalConstruct) >= 0))
-			m_hResFinalConstruct = FinalConstruct();
-	}
-	virtual ~CComObjectStack()
-	{
-		FinalRelease();
-
-
-
-	}
-
-
-	virtual ULONG __stdcall AddRef() throw() {(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2889, 0, L"0")) || (__debugbreak(), 0));return 0;}
-	virtual ULONG __stdcall Release() throw() {(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2890, 0, L"0")) || (__debugbreak(), 0));return 0;}
-	virtual HRESULT __stdcall QueryInterface(const IID &, void**) throw()
-	{(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2892, 0, L"0")) || (__debugbreak(), 0));return ((HRESULT)0x80004002L);}
-	HRESULT m_hResFinalConstruct;
-};
-
-
-template <class Base>
-class CComObjectStackEx : public Base
-{
-public:
-	typedef Base _BaseClass;
-
-	CComObjectStackEx(void* = 0) 
-	{ 
-
-		m_dwRef = 0;
-
-		m_hResFinalConstruct = _AtlInitialConstruct();
-		if (((HRESULT)(m_hResFinalConstruct) >= 0))
-			m_hResFinalConstruct = FinalConstruct(); 
-	}
-
-	virtual ~CComObjectStackEx()
-	{
-		
-		
-		
-		
-		
-		
-		do { (void) ((!!((m_dwRef == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2921, 0, L"m_dwRef == 0")) || (__debugbreak(), 0)); ; } while(0);
-		FinalRelease();
-
-
-
-	}
-
-	virtual ULONG __stdcall AddRef() throw()
-	{
-
-		return InternalAddRef();
-
-
-
-	}
-
-	virtual ULONG __stdcall Release() throw()
-	{
-
-		return InternalRelease();
-
-
-
-	}
-
-	virtual HRESULT __stdcall QueryInterface(const IID & iid, void ** ppvObject) throw()
-	{
-		return _InternalQueryInterface(iid, ppvObject);
-	}
-
-	HRESULT m_hResFinalConstruct;
-};
-
-template <class Base> 
-class CComContainedObject : public Base
-{
-public:
-	typedef Base _BaseClass;
-	CComContainedObject(void* pv) {m_pOuterUnknown = (IUnknown*)pv;}
-
-
-
-
-
-
-
-
-	virtual ULONG __stdcall AddRef() throw() {return OuterAddRef();}
-	virtual ULONG __stdcall Release() throw() {return OuterRelease();}
-	virtual HRESULT __stdcall QueryInterface(const IID & iid, void ** ppvObject) throw()
-	{
-		return OuterQueryInterface(iid, ppvObject);
-	}
-	template <class Q>
-	HRESULT __stdcall QueryInterface(Q** pp)
-	{
-		return QueryInterface(__uuidof(Q), (void**)pp);
-	}
-	
-	
-	IUnknown* GetControllingUnknown() throw()
-	{
-
-
-
-
-
-		return m_pOuterUnknown;
-
-	}
-};
-
-
-
-template <class contained>
-class CComAggObject :
-	public IUnknown,
-	public CComObjectRootEx< typename contained::_ThreadModel::ThreadModelNoCS >
-{
-public:
-	typedef contained _BaseClass;
-	CComAggObject(void* pv) : m_contained(pv)
-	{
-		_pAtlModule->Lock();
-	}
-	HRESULT _AtlInitialConstruct()
-	{
-		HRESULT hr = m_contained._AtlInitialConstruct();
-		if (((HRESULT)(hr) >= 0))
-		{
-			hr = CComObjectRootEx< typename contained::_ThreadModel::ThreadModelNoCS >::_AtlInitialConstruct();
-		}
-		return hr;
-	}
-	
-	
-	HRESULT FinalConstruct()
-	{
-		CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>::FinalConstruct();
-		return m_contained.FinalConstruct();
-	}
-	void FinalRelease()
-	{
-		CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>::FinalRelease();
-		m_contained.FinalRelease();
-	}
-	
-	
-	virtual ~CComAggObject()
-	{
-		m_dwRef = -(2147483647L/2);
-		FinalRelease();
-
-
-
-		_pAtlModule->Unlock();
-	}
-
-	virtual ULONG __stdcall AddRef() {return InternalAddRef();}
-	virtual ULONG __stdcall Release()
-	{
-		ULONG l = InternalRelease();
-		if (l == 0)
-			delete this;
-		return l;
-	}
-	virtual HRESULT __stdcall QueryInterface(const IID & iid, void ** ppvObject)
-	{
-		(void) ((!!((ppvObject != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3049, 0, L"ppvObject != 0")) || (__debugbreak(), 0));
-		if (ppvObject == 0)
-			return ((HRESULT)0x80004003L);
-		*ppvObject = 0;
-
-		HRESULT hRes = ((HRESULT)0x00000000L);
-		if (InlineIsEqualUnknown(iid))
-		{
-			*ppvObject = (void*)(IUnknown*)this;
-			AddRef();
-
-
-
-		}
-		else
-			hRes = m_contained._InternalQueryInterface(iid, ppvObject);
-		return hRes;
-	}
-	template <class Q>
-	HRESULT __stdcall QueryInterface(Q** pp)
-	{
-		return QueryInterface(__uuidof(Q), (void**)pp);
-	}
-	static HRESULT __stdcall CreateInstance(LPUNKNOWN pUnkOuter, CComAggObject<contained>** pp)
-	{
-		(void) ((!!((pp != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3074, 0, L"pp != 0")) || (__debugbreak(), 0));
-		if (pp == 0)
-			return ((HRESULT)0x80004003L);
-		*pp = 0;
-
-		HRESULT hRes = ((HRESULT)0x8007000EL);
-		CComAggObject<contained>* p = 0;
-		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{p = new CComAggObject<contained>(pUnkOuter);} catch(...) {} __pragma(warning(pop))
-		if (p != 0)
-		{
-			p->SetVoid(0);
-			p->InternalFinalConstructAddRef();
-			hRes = p->_AtlInitialConstruct();
-			if (((HRESULT)(hRes) >= 0))
-				hRes = p->FinalConstruct();
-			if (((HRESULT)(hRes) >= 0))
-				hRes = p->_AtlFinalConstruct();
-			p->InternalFinalConstructRelease();
-			if (hRes != ((HRESULT)0x00000000L))
-			{
-				delete p;
-				p = 0;
-			}
-		}
-		*pp = p;
-		return hRes;
-	}
-
-	CComContainedObject<contained> m_contained;
-};
-
-
-
-
-template <class contained>
-class CComPolyObject :
-	public IUnknown,
-	public CComObjectRootEx< typename contained::_ThreadModel::ThreadModelNoCS >
-{
-public:
-	typedef contained _BaseClass;
-	CComPolyObject(void* pv) : m_contained(pv ? pv : this)
-	{
-		_pAtlModule->Lock();
-	}
-	HRESULT _AtlInitialConstruct()
-	{
-		HRESULT hr = m_contained._AtlInitialConstruct();
-		if (((HRESULT)(hr) >= 0))
-		{
-			hr = CComObjectRootEx< typename contained::_ThreadModel::ThreadModelNoCS >::_AtlInitialConstruct();
-		}
-		return hr;
-	}
-	
-	
-	HRESULT FinalConstruct()
-	{
-		InternalAddRef();
-		CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>::FinalConstruct();
-		HRESULT hr = m_contained.FinalConstruct();
-		InternalRelease();
-		return hr;
-	}
-	void FinalRelease()
-	{
-		CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>::FinalRelease();
-		m_contained.FinalRelease();
-	}
-	
-	
-	virtual ~CComPolyObject()
-	{
-		m_dwRef = -(2147483647L/2);
-		FinalRelease();
-
-
-
-		_pAtlModule->Unlock();
-	}
-
-	virtual ULONG __stdcall AddRef() {return InternalAddRef();}
-	virtual ULONG __stdcall Release()
-	{
-		ULONG l = InternalRelease();
-		if (l == 0)
-			delete this;
-		return l;
-	}
-	virtual HRESULT __stdcall QueryInterface(const IID & iid, void ** ppvObject)
-	{
-
-		(void) ((!!((ppvObject != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3166, 0, L"ppvObject != 0")) || (__debugbreak(), 0));
-
-		if (ppvObject == 0)
-			return ((HRESULT)0x80004003L);
-		*ppvObject = 0;
-
-		HRESULT hRes = ((HRESULT)0x00000000L);
-		if (InlineIsEqualUnknown(iid))
-		{
-			*ppvObject = (void*)(IUnknown*)this;
-			AddRef();
-
-
-
-		}
-		else
-			hRes = m_contained._InternalQueryInterface(iid, ppvObject);
-		return hRes;
-	}
-	template <class Q>
-	HRESULT __stdcall QueryInterface(Q** pp)
-	{
-		return QueryInterface(__uuidof(Q), (void**)pp);
-	}
-	static HRESULT __stdcall CreateInstance(LPUNKNOWN pUnkOuter, CComPolyObject<contained>** pp)
-	{
-		(void) ((!!((pp != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3192, 0, L"pp != 0")) || (__debugbreak(), 0));
-		if (pp == 0)
-			return ((HRESULT)0x80004003L);
-		*pp = 0;
-
-
-		HRESULT hRes = ((HRESULT)0x8007000EL);
-		CComPolyObject<contained>* p = 0;
-		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{p = new CComPolyObject<contained>(pUnkOuter);} catch(...) {} __pragma(warning(pop))
-		if (p != 0)
-		{
-			p->SetVoid(0);
-			p->InternalFinalConstructAddRef();
-			hRes = p->_AtlInitialConstruct();
-			if (((HRESULT)(hRes) >= 0))
-				hRes = p->FinalConstruct();
-			if (((HRESULT)(hRes) >= 0))
-				hRes = p->_AtlFinalConstruct();
-			p->InternalFinalConstructRelease();
-			if (hRes != ((HRESULT)0x00000000L))
-			{
-				delete p;
-				p = 0;
-			}
-		}
-		*pp = p;
-		return hRes;
-	}
-
-	CComContainedObject<contained> m_contained;
-};
-
-template <class Base>
-class CComTearOffObject : public Base
-{
-public:
-	CComTearOffObject(void* pv)
-	{
-		do { (void) ((!!((m_pOwner == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3230, 0, L"m_pOwner == 0")) || (__debugbreak(), 0)); ; } while(0);
-		m_pOwner = reinterpret_cast<Base::_OwnerClass*>(pv);
-		m_pOwner->AddRef();
-	}
-	
-	
-	~CComTearOffObject()
-	{
-		m_dwRef = -(2147483647L/2);
-		FinalRelease();
-
-
-
-		m_pOwner->Release();
-	}
-
-	virtual ULONG __stdcall AddRef() throw() {return InternalAddRef();}
-	virtual ULONG __stdcall Release() throw()
-	{
-		ULONG l = InternalRelease();
-		if (l == 0)
-			delete this;
-		return l;
-	}
-	virtual HRESULT __stdcall QueryInterface(const IID & iid, void ** ppvObject) throw()
-	{
-		return m_pOwner->QueryInterface(iid, ppvObject);
-	}
-};
-
-template <class contained>
-class CComCachedTearOffObject :
-	public IUnknown,
-	public CComObjectRootEx<typename contained::_ThreadModel::ThreadModelNoCS>
-{
-public:
-	typedef contained _BaseClass;
-	CComCachedTearOffObject(void* pv) :
-		m_contained(((contained::_OwnerClass*)pv)->GetControllingUnknown())
-	{
-		do { (void) ((!!((m_contained.m_pOwner == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3270, 0, L"m_contained.m_pOwner == 0")) || (__debugbreak(), 0)); ; } while(0);
-		m_contained.m_pOwner = reinterpret_cast<contained::_OwnerClass*>(pv);
-	}
-	HRESULT _AtlInitialConstruct()
-	{
-		HRESULT hr = m_contained._AtlInitialConstruct();
-		if (((HRESULT)(hr) >= 0))
-		{
-			hr = CComObjectRootEx< typename contained::_ThreadModel::ThreadModelNoCS >::_AtlInitialConstruct();
-		}
-		return hr;
-	}
-	
-	
-	HRESULT FinalConstruct()
-	{
-		CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>::FinalConstruct();
-		return m_contained.FinalConstruct();
-	}
-	void FinalRelease()
-	{
-		CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>::FinalRelease();
-		m_contained.FinalRelease();
-	}
-	
-	
-	~CComCachedTearOffObject()
-	{
-		m_dwRef = -(2147483647L/2);
-		FinalRelease();
-
-
-
-	}
-
-
-	virtual ULONG __stdcall AddRef() {return InternalAddRef();}
-	virtual ULONG __stdcall Release()
-	{
-		ULONG l = InternalRelease();
-		if (l == 0)
-			delete this;
-		return l;
-	}
-	virtual HRESULT __stdcall QueryInterface(const IID & iid, void ** ppvObject)
-	{
-		(void) ((!!((ppvObject != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3316, 0, L"ppvObject != 0")) || (__debugbreak(), 0));
-		if (ppvObject == 0)
-			return ((HRESULT)0x80004003L);
-		*ppvObject = 0;
-
-		HRESULT hRes = ((HRESULT)0x00000000L);
-		if (InlineIsEqualUnknown(iid))
-		{
-			*ppvObject = (void*)(IUnknown*)this;
-			AddRef();
-
-
-
-		}
-		else
-			hRes = m_contained._InternalQueryInterface(iid, ppvObject);
-		return hRes;
-	}
-	CComContainedObject<contained> m_contained;
-};
-
-
-class CComClassFactory :
-	public IClassFactory,
-	public CComObjectRootEx<CComGlobalsThreadModel>
-{
-public:
-	public: typedef CComClassFactory _ComMapClass; static HRESULT __stdcall _Cache(void* pv, const IID & iid, void** ppvObject, DWORD_PTR dw) throw() { _ComMapClass* p = (_ComMapClass*)pv; p->Lock(); HRESULT hRes = ((HRESULT)0x80004005L); __try { hRes = ATL::CComObjectRootBase::_Cache(pv, iid, ppvObject, dw); } __finally { p->Unlock(); } return hRes; } IUnknown* _GetRawUnknown() throw() { (void) ((!!((_GetEntries()[0].pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3343, 0, L"_GetEntries()[0].pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)")) || (__debugbreak(), 0)); return (IUnknown*)((INT_PTR)this+_GetEntries()->dw); } IUnknown* GetUnknown() throw() {return _GetRawUnknown();} HRESULT _InternalQueryInterface(const IID & iid, void** ppvObject) throw() { return InternalQueryInterface(this, _GetEntries(), iid, ppvObject); } const static ATL::_ATL_INTMAP_ENTRY* __stdcall _GetEntries() throw() { static const ATL::_ATL_INTMAP_ENTRY _entries[] = { {0, (DWORD_PTR)L"CComClassFactory", (ATL::_ATL_CREATORARGFUNC*)0},
-		{&__uuidof(IClassFactory), ((DWORD_PTR)(static_cast<IClassFactory*>((_ComMapClass*)8))-8), ((ATL::_ATL_CREATORARGFUNC*)1)},
-	__if_exists(_GetAttrEntries) {{0, (DWORD_PTR)_GetAttrEntries, _ChainAttr }, } {0, 0, 0}}; return &_entries[1];} virtual ULONG __stdcall AddRef( void) throw() = 0; virtual ULONG __stdcall Release( void) throw() = 0; virtual HRESULT __stdcall QueryInterface(const IID &, void**) throw() = 0;
-
-	
-	 ~CComClassFactory()
-	{
-	}
-	
-	
-	virtual HRESULT __stdcall CreateInstance(LPUNKNOWN pUnkOuter, const IID & riid, void** ppvObj)
-	{
-		do { (void) ((!!((m_pfnCreateInstance != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3355, 0, L"m_pfnCreateInstance != 0")) || (__debugbreak(), 0)); ; } while(0);
-		HRESULT hRes = ((HRESULT)0x80004003L);
-		if (ppvObj != 0)
-		{
-			*ppvObj = 0;
-			
-
-			if ((pUnkOuter != 0) && !InlineIsEqualUnknown(riid))
-			{
-				ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3364)(atlTraceCOM, 0, L"CComClassFactory: asked for non IUnknown interface while creating an aggregated object");
-				hRes = ((HRESULT)0x80040110L);
-			}
-			else
-				hRes = m_pfnCreateInstance(pUnkOuter, riid, ppvObj);
-		}
-		return hRes;
-	}
-
-	virtual HRESULT __stdcall LockServer(BOOL fLock)
-	{
-		if (fLock)
-			_pAtlModule->Lock();
-		else
-			_pAtlModule->Unlock();
-		return ((HRESULT)0x00000000L);
-	}
-	
-	void SetVoid(void* pv)
-	{
-		m_pfnCreateInstance = (_ATL_CREATORFUNC*)pv;
-	}
-	_ATL_CREATORFUNC* m_pfnCreateInstance;
-};
-
-template <class license>
-class CComClassFactory2 : 
-	public IClassFactory2,
-	public CComObjectRootEx<CComGlobalsThreadModel>,
-	public license
-{
-public:
-	typedef license _LicenseClass;
-	typedef CComClassFactory2<license> _ComMapClass;
-public: typedef CComClassFactory2<license> _ComMapClass; static HRESULT __stdcall _Cache(void* pv, const IID & iid, void** ppvObject, DWORD_PTR dw) throw() { _ComMapClass* p = (_ComMapClass*)pv; p->Lock(); HRESULT hRes = ((HRESULT)0x80004005L); __try { hRes = ATL::CComObjectRootBase::_Cache(pv, iid, ppvObject, dw); } __finally { p->Unlock(); } return hRes; } IUnknown* _GetRawUnknown() throw() { (void) ((!!((_GetEntries()[0].pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3398, 0, L"_GetEntries()[0].pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)")) || (__debugbreak(), 0)); return (IUnknown*)((INT_PTR)this+_GetEntries()->dw); } IUnknown* GetUnknown() throw() {return _GetRawUnknown();} HRESULT _InternalQueryInterface(const IID & iid, void** ppvObject) throw() { return InternalQueryInterface(this, _GetEntries(), iid, ppvObject); } const static ATL::_ATL_INTMAP_ENTRY* __stdcall _GetEntries() throw() { static const ATL::_ATL_INTMAP_ENTRY _entries[] = { {0, (DWORD_PTR)L"CComClassFactory2<license>", (ATL::_ATL_CREATORARGFUNC*)0},
-	{&__uuidof(IClassFactory), ((DWORD_PTR)(static_cast<IClassFactory*>((_ComMapClass*)8))-8), ((ATL::_ATL_CREATORARGFUNC*)1)},
-	{&__uuidof(IClassFactory2), ((DWORD_PTR)(static_cast<IClassFactory2*>((_ComMapClass*)8))-8), ((ATL::_ATL_CREATORARGFUNC*)1)},
-__if_exists(_GetAttrEntries) {{0, (DWORD_PTR)_GetAttrEntries, _ChainAttr }, } {0, 0, 0}}; return &_entries[1];} virtual ULONG __stdcall AddRef( void) throw() = 0; virtual ULONG __stdcall Release( void) throw() = 0; virtual HRESULT __stdcall QueryInterface(const IID &, void**) throw() = 0;
-	
-	virtual HRESULT __stdcall LockServer(BOOL fLock)
-	{
-		if (fLock)
-			_pAtlModule->Lock();
-		else
-			_pAtlModule->Unlock();
-		return ((HRESULT)0x00000000L);
-	}
-	virtual HRESULT __stdcall CreateInstance(LPUNKNOWN pUnkOuter,
-		const IID & riid, void** ppvObj)
-	{
-		do { (void) ((!!((m_pfnCreateInstance != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3414, 0, L"m_pfnCreateInstance != 0")) || (__debugbreak(), 0)); ; } while(0);
-		if (ppvObj == 0)
-			return ((HRESULT)0x80004003L);
-		*ppvObj = 0;
-		if (!IsLicenseValid())
-			return ((HRESULT)0x80040112L);
-
-		if ((pUnkOuter != 0) && !InlineIsEqualUnknown(riid))
-			return ((HRESULT)0x80040110L);
-		else
-			return m_pfnCreateInstance(pUnkOuter, riid, ppvObj);
-	}
-	
-	virtual HRESULT __stdcall CreateInstanceLic(IUnknown* pUnkOuter, 
-	  IUnknown* , const IID & riid, BSTR bstrKey, 
-	  void** ppvObject)
-	{
-		do { (void) ((!!((m_pfnCreateInstance != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3431, 0, L"m_pfnCreateInstance != 0")) || (__debugbreak(), 0)); ; } while(0);
-		if (ppvObject == 0)
-			return ((HRESULT)0x80004003L);
-		*ppvObject = 0;
-		if ( ((bstrKey != 0) && !VerifyLicenseKey(bstrKey)) ||
-			 ((bstrKey == 0) && !IsLicenseValid()) )
-			return ((HRESULT)0x80040112L);
-		if ((pUnkOuter != 0) && !InlineIsEqualUnknown(riid))
-			return ((HRESULT)0x80040110L);
-		else
-			return m_pfnCreateInstance(pUnkOuter, riid, ppvObject);
-	}
-	virtual HRESULT __stdcall RequestLicKey(DWORD dwReserved, BSTR* pbstrKey)
-	{
-		if (pbstrKey == 0)
-			return ((HRESULT)0x80004003L);
-		*pbstrKey = 0;
-
-		if (!IsLicenseValid())
-			return ((HRESULT)0x80040112L);
-		return GetLicenseKey(dwReserved,pbstrKey) ? ((HRESULT)0x00000000L) : ((HRESULT)0x80004005L);
-	}
-	virtual HRESULT __stdcall GetLicInfo(LICINFO* pLicInfo)
-	{
-		if (pLicInfo == 0)
-			return ((HRESULT)0x80004003L);
-		pLicInfo->cbLicInfo = sizeof(LICINFO);
-		pLicInfo->fLicVerified = IsLicenseValid();
-		BSTR bstr = 0;
-		pLicInfo->fRuntimeKeyAvail = GetLicenseKey(0,&bstr);
-		::SysFreeString(bstr);
-		return ((HRESULT)0x00000000L);
-	}
-	void SetVoid(void* pv)
-	{
-		m_pfnCreateInstance = (_ATL_CREATORFUNC*)pv;
-	}
-	_ATL_CREATORFUNC* m_pfnCreateInstance;
-};
-
-
-
-class CComClassFactoryAutoThread :
-	public IClassFactory,
-	public CComObjectRootEx<CComGlobalsThreadModel>
-{
-public:
-	public: typedef CComClassFactoryAutoThread _ComMapClass; static HRESULT __stdcall _Cache(void* pv, const IID & iid, void** ppvObject, DWORD_PTR dw) throw() { _ComMapClass* p = (_ComMapClass*)pv; p->Lock(); HRESULT hRes = ((HRESULT)0x80004005L); __try { hRes = ATL::CComObjectRootBase::_Cache(pv, iid, ppvObject, dw); } __finally { p->Unlock(); } return hRes; } IUnknown* _GetRawUnknown() throw() { (void) ((!!((_GetEntries()[0].pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3478, 0, L"_GetEntries()[0].pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)")) || (__debugbreak(), 0)); return (IUnknown*)((INT_PTR)this+_GetEntries()->dw); } IUnknown* GetUnknown() throw() {return _GetRawUnknown();} HRESULT _InternalQueryInterface(const IID & iid, void** ppvObject) throw() { return InternalQueryInterface(this, _GetEntries(), iid, ppvObject); } const static ATL::_ATL_INTMAP_ENTRY* __stdcall _GetEntries() throw() { static const ATL::_ATL_INTMAP_ENTRY _entries[] = { {0, (DWORD_PTR)L"CComClassFactoryAutoThread", (ATL::_ATL_CREATORARGFUNC*)0},
-		{&__uuidof(IClassFactory), ((DWORD_PTR)(static_cast<IClassFactory*>((_ComMapClass*)8))-8), ((ATL::_ATL_CREATORARGFUNC*)1)},
-	__if_exists(_GetAttrEntries) {{0, (DWORD_PTR)_GetAttrEntries, _ChainAttr }, } {0, 0, 0}}; return &_entries[1];} virtual ULONG __stdcall AddRef( void) throw() = 0; virtual ULONG __stdcall Release( void) throw() = 0; virtual HRESULT __stdcall QueryInterface(const IID &, void**) throw() = 0;
-
-	
-	 ~CComClassFactoryAutoThread()
-	{
-	}
-	
-	
-	void SetVoid(void* pv)
-	{
-		m_pfnCreateInstance = (_ATL_CREATORFUNC*)pv;
-	}
-	HRESULT __stdcall CreateInstance(LPUNKNOWN pUnkOuter,
-		const IID & riid, void** ppvObj)
-	{
-		do { (void) ((!!((m_pfnCreateInstance != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3495, 0, L"m_pfnCreateInstance != 0")) || (__debugbreak(), 0)); ; } while(0);
-		HRESULT hRes = ((HRESULT)0x80004003L);
-		if (ppvObj != 0)
-		{
-			*ppvObj = 0;
-			
-			(void) ((!!((pUnkOuter == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3501, 0, L"pUnkOuter == 0")) || (__debugbreak(), 0));
-			if (pUnkOuter != 0)
-				hRes = ((HRESULT)0x80040110L);
-			else
-			{
-				(void) ((!!((_pAtlAutoThreadModule && L"Global instance of CAtlAutoThreadModule not declared"))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3506, 0, L"_pAtlAutoThreadModule && L\"Global instance of CAtlAutoThreadModule not declared\"")) || (__debugbreak(), 0));
-				if (_pAtlAutoThreadModule == 0)
-					return ((HRESULT)0x80004005L);
-
-				hRes = _pAtlAutoThreadModule->CreateInstance(m_pfnCreateInstance, riid, ppvObj);
-			}
-		}
-		return hRes;
-	}
-	HRESULT __stdcall LockServer(BOOL fLock)
-	{
-		if (fLock)
-			_pAtlModule->Lock();
-		else
-			_pAtlModule->Unlock();
-		return ((HRESULT)0x00000000L);
-	}
-	_ATL_CREATORFUNC* m_pfnCreateInstance;
-};
-
-
-
-
-template <class T>
-class CComClassFactorySingleton : public CComClassFactory
-{
-public:
-	CComClassFactorySingleton() : m_hrCreate(((HRESULT)0x00000000L))
-	{
-	}
-	
-	 ~CComClassFactorySingleton()
-	{
-	}
-	
-	virtual HRESULT __stdcall CreateInstance(LPUNKNOWN pUnkOuter, const IID & riid, void** ppvObj)
-	{
-		HRESULT hRes = ((HRESULT)0x80004003L);
-		if (ppvObj != 0)
-		{
-			*ppvObj = 0;
-			
-			(void) ((!!((pUnkOuter == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3548, 0, L"pUnkOuter == 0")) || (__debugbreak(), 0));
-			if (pUnkOuter != 0)
-				hRes = ((HRESULT)0x80040110L);
-			else
-			{
-				if (m_hrCreate == ((HRESULT)0x00000000L) && m_spObj == 0)
-				{
-					__try
-					{
-						Lock();
-						
-						if (m_hrCreate == ((HRESULT)0x00000000L) && m_spObj == 0)
-						{
-							CComObjectCached<T> *p;
-							m_hrCreate = CComObjectCached<T>::CreateInstance(&p);
-							if (((HRESULT)(m_hrCreate) >= 0))
-							{
-								m_hrCreate = p->QueryInterface(IID_IUnknown, (void**)&m_spObj);
-								if (((HRESULT)(m_hrCreate) < 0))
-								{
-									delete p;
-								}
-							}
-						}
-					}
-					__finally
-					{
-						Unlock();
-					}
-				}
-				if (m_hrCreate == ((HRESULT)0x00000000L))
-				{
-					hRes = m_spObj->QueryInterface(riid, ppvObj);
-				}
-				else
-				{
-					hRes = m_hrCreate;
-				}
-			}
-		}
-		return hRes;
-	}
-	HRESULT m_hrCreate;
-	CComPtr<IUnknown> m_spObj;
-};
-
-
-template <class T, const CLSID* pclsid = &GUID_NULL>
-class CComCoClass
-{
-public:
-	typedef ATL::CComCreator< ATL::CComObjectCached< ATL::CComClassFactory > > _ClassFactoryCreatorClass;
-	public: typedef ATL::CComCreator2< ATL::CComCreator< ATL::CComObject< T > >, ATL::CComCreator< ATL::CComAggObject< T > > > _CreatorClass;
-	typedef T _CoClass;
-	static const CLSID& __stdcall GetObjectCLSID() {return *pclsid;}
-	static LPCTSTR __stdcall GetObjectDescription() {return 0;}
-	static HRESULT __stdcall Error(LPCOLESTR lpszDesc,
-		const IID& iid = GUID_NULL, HRESULT hRes = 0)
-	{
-		return AtlReportError(GetObjectCLSID(), lpszDesc, iid, hRes);
-	}
-	static HRESULT __stdcall Error(LPCOLESTR lpszDesc, DWORD dwHelpID,
-		LPCOLESTR lpszHelpFile, const IID& iid = GUID_NULL, HRESULT hRes = 0)
-	{
-		return AtlReportError(GetObjectCLSID(), lpszDesc, dwHelpID, lpszHelpFile,
-			iid, hRes);
-	}
-	static HRESULT __stdcall Error(UINT nID, const IID& iid = GUID_NULL,
-		HRESULT hRes = 0, HINSTANCE hInst = _AtlBaseModule.GetResourceInstance())
-	{
-		return AtlReportError(GetObjectCLSID(), nID, iid, hRes, hInst);
-	}
-	static HRESULT __stdcall Error(UINT nID, DWORD dwHelpID,
-		LPCOLESTR lpszHelpFile, const IID& iid = GUID_NULL,
-		HRESULT hRes = 0, HINSTANCE hInst = _AtlBaseModule.GetResourceInstance())
-	{
-		return AtlReportError(GetObjectCLSID(), nID, dwHelpID, lpszHelpFile,
-			iid, hRes, hInst);
-	}
-	static HRESULT __stdcall Error(LPCSTR lpszDesc,
-		const IID& iid = GUID_NULL, HRESULT hRes = 0)
-	{
-		return AtlReportError(GetObjectCLSID(), lpszDesc, iid, hRes);
-	}
-	static HRESULT __stdcall Error(LPCSTR lpszDesc, DWORD dwHelpID,
-		LPCSTR lpszHelpFile, const IID& iid = GUID_NULL, HRESULT hRes = 0)
-	{
-		return AtlReportError(GetObjectCLSID(), lpszDesc, dwHelpID,
-			lpszHelpFile, iid, hRes);
-	}
-	template <class Q>
-	static HRESULT CreateInstance(IUnknown* punkOuter, Q** pp)
-	{
-		return T::_CreatorClass::CreateInstance(punkOuter, __uuidof(Q), (void**) pp);
-	}
-	template <class Q>
-	static HRESULT CreateInstance(Q** pp)
-	{
-		return T::_CreatorClass::CreateInstance(0, __uuidof(Q), (void**) pp);
-	}
-};
-
-
-
-class CComTypeInfoHolder
-{
-
-public:
-	const GUID* m_pguid;
-	const GUID* m_plibid;
-	WORD m_wMajor;
-	WORD m_wMinor;
-
-	ITypeInfo* m_pInfo;
-	long m_dwRef;
-	struct stringdispid
-	{
-		CComBSTR bstr;
-		int nLen;
-		DISPID id;
-		stringdispid() : nLen(0), id(( -1 )){}
-	};
-	stringdispid* m_pMap;
-	int m_nCount;
-
-public:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-	HRESULT GetTI(LCID lcid, ITypeInfo** ppInfo)
-	{
-		(void) ((!!((ppInfo != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3694, 0, L"ppInfo != 0")) || (__debugbreak(), 0));
-		if (ppInfo == 0)
-			return ((HRESULT)0x80004003L);
-
-		HRESULT hr = ((HRESULT)0x00000000L);
-		if (m_pInfo == 0)
-			hr = GetTI(lcid);
-		*ppInfo = m_pInfo;
-		if (m_pInfo != 0)
-		{
-			m_pInfo->AddRef();
-			hr = ((HRESULT)0x00000000L);
-		}
-		return hr;
-	}
-	HRESULT GetTI(LCID lcid);
-	HRESULT EnsureTI(LCID lcid)
-	{
-		HRESULT hr = ((HRESULT)0x00000000L);
-		if (m_pInfo == 0 || m_pMap == 0)
-			hr = GetTI(lcid);
-		return hr;
-	}
-
-	
-	
-	static void __stdcall Cleanup(DWORD_PTR dw);
-
-	HRESULT GetTypeInfo(UINT , LCID lcid, ITypeInfo** pptinfo)
-	{
-		return GetTI(lcid, pptinfo);
-	}
-	HRESULT GetIDsOfNames(const IID & , LPOLESTR* rgszNames, UINT cNames,
-		LCID lcid, DISPID* rgdispid)
-	{
-		HRESULT hRes = EnsureTI(lcid);
-		if (m_pInfo != 0)
-		{
-			hRes = ((HRESULT)0x80004005L);
-			
-			
-			
-			if (m_pMap != 0 && cNames == 1)
-			{
-				int n = int( ocslen(rgszNames[0]) );
-				for (int j=m_nCount-1; j>=0; j--)
-				{
-					if ((n == m_pMap[j].nLen) &&
-						(memcmp(m_pMap[j].bstr, rgszNames[0], m_pMap[j].nLen * sizeof(OLECHAR)) == 0))
-					{
-						rgdispid[0] = m_pMap[j].id;
-						hRes = ((HRESULT)0x00000000L);
-						break;
-					}
-				}
-			}
-			
-			
-			if (((HRESULT)(hRes) < 0))
-			{
-				hRes = m_pInfo->GetIDsOfNames(rgszNames, cNames, rgdispid);
-			}
-		}
-		return hRes;
-	}
-
-	HRESULT Invoke(IDispatch* p, DISPID dispidMember, const IID & ,
-		LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult,
-		EXCEPINFO* pexcepinfo, UINT* puArgErr)
-	{
-		HRESULT hRes = EnsureTI(lcid);
-		if (m_pInfo != 0)
-			hRes = m_pInfo->Invoke(p, dispidMember, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
-		return hRes;
-	}
-	 HRESULT LoadNameCache(ITypeInfo* pTypeInfo)
-	{
-		TYPEATTR* pta;
-		HRESULT hr = pTypeInfo->GetTypeAttr(&pta);
-		if (((HRESULT)(hr) >= 0))
-		{
-			stringdispid* pMap = 0;
-			m_nCount = pta->cFuncs;
-			m_pMap = 0;
-			if (m_nCount != 0)
-			{
-				__pragma(warning(push)) __pragma(warning(disable: 4571)) try{pMap = new stringdispid[m_nCount];} catch(...) {} __pragma(warning(pop));
-				if (pMap == 0)
-				{
-					pTypeInfo->ReleaseTypeAttr(pta);
-					return ((HRESULT)0x8007000EL);
-				}
-			}
-			for (int i=0; i<m_nCount; i++)
-			{
-				FUNCDESC* pfd;
-				if (((HRESULT)(pTypeInfo->GetFuncDesc(i, &pfd)) >= 0))
-				{
-					CComBSTR bstrName;
-					if (((HRESULT)(pTypeInfo->GetDocumentation(pfd->memid, &bstrName, 0, 0, 0)) >= 0))
-					{
-						pMap[i].bstr.Attach(bstrName.Detach());
-						pMap[i].nLen = SysStringLen(pMap[i].bstr);
-						pMap[i].id = pfd->memid;
-					}
-					pTypeInfo->ReleaseFuncDesc(pfd);
-				}
-			}
-			m_pMap = pMap;
-			pTypeInfo->ReleaseTypeAttr(pta);
-		}
-		return ((HRESULT)0x00000000L);
-	}
-};
-
-    inline void __stdcall CComTypeInfoHolder::Cleanup(DWORD_PTR dw)
-	{
-		(void) ((!!((dw != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3811, 0, L"dw != 0")) || (__debugbreak(), 0));
-		if (dw == 0)
-			return;
-			
-		CComTypeInfoHolder* p = (CComTypeInfoHolder*) dw;
-		if (p->m_pInfo != 0)
-			p->m_pInfo->Release();
-		p->m_pInfo = 0;
-		delete [] p->m_pMap;
-		p->m_pMap = 0;
-	}
-
-inline HRESULT CComTypeInfoHolder::GetTI(LCID lcid)
-{
-	
-	do { (void) ((!!((m_plibid != 0 && m_pguid != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3826, 0, L"m_plibid != 0 && m_pguid != 0")) || (__debugbreak(), 0)); ; } while(0);
-
-	if (m_pInfo != 0 && m_pMap != 0)
-		return ((HRESULT)0x00000000L);
-
-	CComCritSecLock<CComCriticalSection> lock(_pAtlModule->m_csStaticDataInitAndTypeInfo, false);
-	HRESULT hRes = lock.Lock();
-	if (((HRESULT)(hRes) < 0))
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3835)(atlTraceCOM, 0, L"ERROR : Unable to lock critical section in CComTypeInfoHolder::GetTI\n");
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3836, 0, L"0")) || (__debugbreak(), 0));
-		return hRes;
-	}
-	hRes = ((HRESULT)0x80004005L);
-	if (m_pInfo == 0)
-	{
-		ITypeLib* pTypeLib = 0;
-		if (InlineIsEqualGUID(CAtlModule::m_libid, *m_plibid) && m_wMajor == 0xFFFF && m_wMinor == 0xFFFF)
-		{
-			TCHAR szFilePath[260];
-			DWORD dwFLen = ::GetModuleFileNameW(_AtlBaseModule.GetModuleInstance(), szFilePath, 260);
-			if( dwFLen != 0 && dwFLen != 260 )
-			{
-				int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
-				LPOLESTR pszFile = T2OLE_EX(szFilePath, 1024);
-
-
-
-
-				hRes = LoadTypeLib(pszFile, &pTypeLib);
-			}
-		}
-		else
-		{
-			do { (void) ((!!((!InlineIsEqualGUID(*m_plibid, GUID_NULL) && "Module LIBID not initialized. See DECLARE_LIBID documentation."))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3860, 0, L"!InlineIsEqualGUID(*m_plibid, GUID_NULL) && \"Module LIBID not initialized. See DECLARE_LIBID documentation.\"")) || (__debugbreak(), 0)); ; } while(0);
-			hRes = LoadRegTypeLib(*m_plibid, m_wMajor, m_wMinor, lcid, &pTypeLib);
-
-			if (((HRESULT)(hRes) >= 0))
-			{
-				
-				
-				
-				
-				
-				
-				
-				
-				
-				TCHAR szFilePath[260];
-				DWORD dwFLen = ::GetModuleFileNameW(_AtlBaseModule.GetModuleInstance(), szFilePath, 260);
-				if( dwFLen != 0 && dwFLen != 260 )
-				{
-					int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
-					CComPtr<ITypeLib> spTypeLibModule;
-					HRESULT hRes2 = ((HRESULT)0x00000000L);
-					LPOLESTR pszFile = T2OLE_EX(szFilePath, 1024);
-					if (pszFile == 0)
-						hRes2 = ((HRESULT)0x8007000EL);
-					else
-						hRes2 = LoadTypeLib(pszFile, &spTypeLibModule);
-					if (((HRESULT)(hRes2) >= 0))
-					{
-						TLIBATTR* pLibAttr;
-						hRes2 = spTypeLibModule->GetLibAttr(&pLibAttr);
-						if (((HRESULT)(hRes2) >= 0))
-						{
-							if (InlineIsEqualGUID(pLibAttr->guid, *m_plibid) &&
-								(pLibAttr->wMajorVerNum != m_wMajor ||
-								pLibAttr->wMinorVerNum != m_wMinor))
-							{
-								ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3896)(atlTraceCOM, 0, L"Warning : CComTypeInfoHolder::GetTI : Loaded typelib does not match the typelib in the module : %s\n", szFilePath);
-								ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3897)(atlTraceCOM, 0, L"\tSee IDispatchImpl overview help topic for more information\n", szFilePath);							
-							}
-							spTypeLibModule->ReleaseTLibAttr(pLibAttr);
-						}
-					}
-				}
-			}
-			else
-			{
-				ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3906)(atlTraceCOM, 0, L"ERROR : Unable to load Typelibrary. (HRESULT = 0x%x)\n", hRes);
-				ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3907)(atlTraceCOM, 0, L"\tVerify TypelibID and major version specified with\n");
-				ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3908)(atlTraceCOM, 0, L"\tIDispatchImpl, CStockPropImpl, IProvideClassInfoImpl or IProvideCLassInfo2Impl\n");
-			}
-
-		}
-		if (((HRESULT)(hRes) >= 0))
-		{
-			CComPtr<ITypeInfo> spTypeInfo;
-			hRes = pTypeLib->GetTypeInfoOfGuid(*m_pguid, &spTypeInfo);
-			if (((HRESULT)(hRes) >= 0))
-			{
-				CComPtr<ITypeInfo> spInfo(spTypeInfo);
-				CComPtr<ITypeInfo2> spTypeInfo2;
-				if (((HRESULT)(spTypeInfo->QueryInterface(&spTypeInfo2)) >= 0))
-					spInfo = spTypeInfo2;
-
-				m_pInfo = spInfo.Detach();
-
-				_pAtlModule->AddTermFunc(Cleanup, (DWORD_PTR)this);
-
-			}
-			pTypeLib->Release();
-		}
-	}
-	else
-	{
-		
-		hRes = ((HRESULT)0x00000000L);
-	}
-
-	if (m_pInfo != 0 && m_pMap == 0)
-	{
-		hRes=LoadNameCache(m_pInfo);
-	}
-
-	return hRes;
-}
-
-
-
-
-
-template <class T>
-class __declspec(novtable) IObjectWithSiteImpl : public IObjectWithSite
-{
-public:
-	virtual ~IObjectWithSiteImpl()
-	{
-	}
-	
-	virtual HRESULT __stdcall SetSite(IUnknown *pUnkSite)
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3959)(atlTraceCOM, 2, L"IObjectWithSiteImpl::SetSite\n");
-		T* pT = static_cast<T*>(this);
-		pT->m_spUnkSite = pUnkSite;
-		return ((HRESULT)0x00000000L);
-	}
-	virtual HRESULT __stdcall GetSite(const IID & riid, void **ppvSite)
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3966)(atlTraceCOM, 2, L"IObjectWithSiteImpl::GetSite\n");
-		T* pT = static_cast<T*>(this);
-		(void) ((!!((ppvSite))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3968, 0, L"ppvSite")) || (__debugbreak(), 0));
-		HRESULT hRes = ((HRESULT)0x80004003L);
-		if (ppvSite != 0)
-		{
-			if (pT->m_spUnkSite)
-				hRes = pT->m_spUnkSite->QueryInterface(riid, ppvSite);
-			else
-			{
-				*ppvSite = 0;
-				hRes = ((HRESULT)0x80004005L);
-			}
-		}
-		return hRes;
-	}
-
-	HRESULT SetChildSite(IUnknown* punkChild)
-	{
-		if (punkChild == 0)
-			return ((HRESULT)0x80004003L);
-
-		HRESULT hr;
-		CComPtr<IObjectWithSite> spChildSite;
-		hr = punkChild->QueryInterface(__uuidof(IObjectWithSite), (void**)&spChildSite);
-		if (((HRESULT)(hr) >= 0))
-			hr = spChildSite->SetSite((IUnknown*)this);
-
-		return hr;
-	}
-
-	static HRESULT SetChildSite(IUnknown* punkChild, IUnknown* punkParent)
-	{
-		return AtlSetChildSite(punkChild, punkParent);
-	}
-
-	CComPtr<IUnknown> m_spUnkSite;
-};
-
-
-
-
-template <class T>
-class __declspec(novtable) IServiceProviderImpl : public IServiceProvider
-{
-public:
-	virtual HRESULT __stdcall QueryService(const GUID & guidService, const IID & riid, void** ppvObject)
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4014)(atlTraceCOM, 2, L"IServiceProviderImpl::QueryService\n");
-
-		T* pT = static_cast<T*>(this);
-		return pT->_InternalQueryService(guidService, riid, ppvObject);
-	}
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C" HRESULT __declspec(dllimport) __stdcall AtlGetObjectSourceInterface(IUnknown* punkObj, GUID* plibid, IID* piid, unsigned short* pdwMajor, unsigned short* pdwMinor);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-extern "C"
-{
-void __stdcall CComStdCallThunkHelper();
-}
-
-template <class T>
-class CComStdCallThunk
-{
-public:
-	typedef void (__stdcall T::*TMFP)();
-	void *pVTable;								
-	void *pThis;								
-	TMFP pfn;									
-	void (__stdcall *pfnHelper)();				
-												
-
-	void Init(TMFP pf, void *p)
-	{
-		pfnHelper = CComStdCallThunkHelper;
-		pVTable = &pfnHelper;
-		pThis = p;
-		pfn = pf;
-	}
-};
-
-
-
-
-
-
-
-
-struct _ATL_FUNC_INFO
-{
-	CALLCONV cc;
-	VARTYPE vtReturn;
-	SHORT nParams;
-	VARTYPE pVarTypes[8];
-};
-
-class __declspec(novtable) _IDispEvent
-{
-public:
-	_IDispEvent() : m_libid(GUID_NULL), m_iid(GUID_NULL), m_wMajorVerNum(0), m_wMinorVerNum(0), m_dwEventCookie(0xFEFEFEFE) { }
-	
-	virtual HRESULT __stdcall _LocDEQueryInterface(const IID & riid, void ** ppvObject) = 0;
-	virtual ULONG __stdcall AddRef(void) = 0;
-	virtual ULONG __stdcall Release(void) = 0;
-	GUID m_libid; 
-	IID m_iid; 
-	unsigned short m_wMajorVerNum;    
-	unsigned short m_wMinorVerNum;    
-	DWORD m_dwEventCookie;
-	HRESULT DispEventAdvise(IUnknown* pUnk, const IID* piid)
-	{
-		do { int __atl_condVal=!!(m_dwEventCookie == 0xFEFEFEFE); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4127, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-		return AtlAdvise(pUnk, (IUnknown*)this, *piid, &m_dwEventCookie);
-	}
-	HRESULT DispEventUnadvise(IUnknown* pUnk, const IID* piid)
-	{
-		HRESULT hr = AtlUnadvise(pUnk, *piid, m_dwEventCookie);
-		m_dwEventCookie = 0xFEFEFEFE;
-		return hr;
-	}
-	
-	HRESULT Advise(IUnknown *punk) 
-	{ 
-		HRESULT hr = AtlGetObjectSourceInterface(punk, &m_libid, &m_iid, &m_wMajorVerNum, &m_wMinorVerNum);
-		if (((HRESULT)(hr) < 0))
-			return hr;
-		return DispEventAdvise(punk, &m_iid);
-	}
-	HRESULT Unadvise(IUnknown *punk) 
-	{ 
-		HRESULT hr = AtlGetObjectSourceInterface(punk, &m_libid, &m_iid, &m_wMajorVerNum, &m_wMinorVerNum);
-		if (((HRESULT)(hr) < 0))
-			return hr;
-		return DispEventUnadvise(punk, &m_iid);
-	}
-};
-
-template <UINT nID, const IID* piid>
-class __declspec(novtable) _IDispEventLocator : public _IDispEvent
-{
-public:
-};
-
-template <UINT nID, class T, const IID* pdiid>
-class __declspec(novtable) IDispEventSimpleImpl : public _IDispEventLocator<nID, pdiid>
-{
-public:
-	virtual HRESULT __stdcall _LocDEQueryInterface(const IID & riid, void ** ppvObject)
-	{
-		(void) ((!!((ppvObject != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4165, 0, L"ppvObject != 0")) || (__debugbreak(), 0));
-		if (ppvObject == 0)
-			return ((HRESULT)0x80004003L);
-		*ppvObject = 0;
-
-		if (InlineIsEqualGUID(riid, GUID_NULL))
-			return ((HRESULT)0x80004002L);
-
-		if (InlineIsEqualGUID(riid, *pdiid) || 
-			InlineIsEqualUnknown(riid) ||
-			InlineIsEqualGUID(riid, __uuidof(IDispatch)) ||
-			InlineIsEqualGUID(riid, m_iid))
-		{
-			*ppvObject = this;
-			AddRef();
-
-
-
-			return ((HRESULT)0x00000000L);
-		}
-		else
-			return ((HRESULT)0x80004002L);
-	}
-
-	
-	virtual ULONG __stdcall AddRef()
-	{
-		return 1;
-	}
-	virtual ULONG __stdcall Release()
-	{
-		return 1;
-	}
-
-	virtual HRESULT __stdcall GetTypeInfoCount(UINT* )
-	{do { ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4200)(ATL::atlTraceNotImpl, 0, L"ATL: %s not implemented.\n", L"IDispEventSimpleImpl::GetTypeInfoCount"); return ((HRESULT)0x80004001L); } while(0);}
-
-	virtual HRESULT __stdcall GetTypeInfo(UINT , LCID , ITypeInfo** )
-	{do { ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4203)(ATL::atlTraceNotImpl, 0, L"ATL: %s not implemented.\n", L"IDispEventSimpleImpl::GetTypeInfo"); return ((HRESULT)0x80004001L); } while(0);}
-
-	virtual HRESULT __stdcall GetIDsOfNames(const IID & , LPOLESTR* , UINT ,
-		LCID , DISPID* )
-	{do { ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4207)(ATL::atlTraceNotImpl, 0, L"ATL: %s not implemented.\n", L"IDispEventSimpleImpl::GetIDsOfNames"); return ((HRESULT)0x80004001L); } while(0);}
-
-	virtual HRESULT __stdcall Invoke(DISPID dispidMember, const IID & ,
-		LCID lcid, WORD , DISPPARAMS* pdispparams, VARIANT* pvarResult,
-		EXCEPINFO* , UINT* )
-	{
-		const _ATL_EVENT_ENTRY<T>* pMap = T::_GetSinkMap();
-		const _ATL_EVENT_ENTRY<T>* pFound = 0;
-		while (pMap->piid != 0)
-		{
-			if ((pMap->nControlID == nID) && (pMap->dispid == dispidMember) && 
-				(IsEqualGUID(*(pMap->piid), *pdiid)))
-			{
-				pFound = pMap;
-				break;
-			}
-			pMap++;
-		}
-		if (pFound == 0)
-			return ((HRESULT)0x00000000L);
-
-
-		_ATL_FUNC_INFO info;
-		_ATL_FUNC_INFO* pInfo;
-		if (pFound->pInfo != 0)
-			pInfo = pFound->pInfo;
-		else
-		{
-			pInfo = &info;
-			HRESULT hr = GetFuncInfoFromId(*pdiid, dispidMember, lcid, info);
-			if (((HRESULT)(hr) < 0))
-				return ((HRESULT)0x00000000L);
-		}
-		return InvokeFromFuncInfo(pFound->pfn, *pInfo, pdispparams, pvarResult);
-	}
-
-	
-	HRESULT InvokeFromFuncInfo(void (__stdcall T::*pEvent)(), _ATL_FUNC_INFO& info, DISPPARAMS* pdispparams, VARIANT* pvarResult)
-	{
-		(void) ((!!((pdispparams->cArgs == (UINT)info.nParams))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4246, 0, L"pdispparams->cArgs == (UINT)info.nParams")) || (__debugbreak(), 0));
-
-		T* pT = static_cast<T*>(this);
-
-		
-		
-		
-		(void) ((!!((info.nParams <= 8))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4253, 0, L"info.nParams <= 8")) || (__debugbreak(), 0));
-		if (info.nParams > 8)
-		{
-			return ((HRESULT)0x80004005L);
-		}
-		VARIANTARG* rgVarArgs[8];
-		VARIANTARG** pVarArgs = info.nParams ? rgVarArgs : 0;
-
-		UINT nIndex = 0;
-
-
-		for (nIndex; nIndex < pdispparams->cNamedArgs; nIndex++)
-			pVarArgs[pdispparams->rgdispidNamedArgs[nIndex]] = &pdispparams->rgvarg[nIndex];
-
-
-		for (; nIndex < pdispparams->cArgs; nIndex++)
-			pVarArgs[info.nParams-nIndex-1] = &pdispparams->rgvarg[nIndex];
-
-		CComStdCallThunk<T> thunk;
-		thunk.Init(pEvent, pT);
-
-		CComVariant tmpResult;
-		if (pvarResult == 0)
-			pvarResult = &tmpResult;
-
-		HRESULT hr = DispCallFunc(
-			&thunk,
-			0,
-			info.cc,
-			info.vtReturn,
-			info.nParams,
-			info.pVarTypes,
-			pVarArgs,
-			pvarResult);
-		(void) ((!!((((HRESULT)(hr) >= 0)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4287, 0, L"((HRESULT)(hr) >= 0)")) || (__debugbreak(), 0));
-		return hr;
-	}
-
-	
-	virtual HRESULT GetFuncInfoFromId(const IID& , DISPID , LCID , _ATL_FUNC_INFO& )
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4294)(L"TODO: Classes using IDispEventSimpleImpl should override this method\n");
-		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4295, 0, L"0")) || (__debugbreak(), 0));
-		do { ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4296)(ATL::atlTraceNotImpl, 0, L"ATL: %s not implemented.\n", L"IDispEventSimpleImpl::GetFuncInfoFromId"); return ((HRESULT)0x80004001L); } while(0);
-	}
-	
-	HRESULT DispEventAdvise(IUnknown* pUnk, const IID* piid)
-	{
-		do { int __atl_condVal=!!(m_dwEventCookie == 0xFEFEFEFE); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4301, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);		
-		return AtlAdvise(pUnk, (IUnknown*)this, *piid, &m_dwEventCookie);
-	}
-	HRESULT DispEventUnadvise(IUnknown* pUnk, const IID* piid)
-	{
-		HRESULT hr = AtlUnadvise(pUnk, *piid, m_dwEventCookie);
-		m_dwEventCookie = 0xFEFEFEFE;
-		return hr;
-	}
-	HRESULT DispEventAdvise(IUnknown* pUnk)
-	{
-		return _IDispEvent::DispEventAdvise(pUnk, pdiid);
-	}
-	HRESULT DispEventUnadvise(IUnknown* pUnk)
-	{
-		return _IDispEvent::DispEventUnadvise(pUnk, pdiid);
-	}
-};
-
-
-template <class T>
-inline HRESULT AtlAdviseSinkMap(T* pT, bool bAdvise)
-{
-	(void) ((!!((::IsWindow(pT->m_hWnd)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4324, 0, L"::IsWindow(pT->m_hWnd)")) || (__debugbreak(), 0));
-	const _ATL_EVENT_ENTRY<T>* pEntries = T::_GetSinkMap();
-	if (pEntries == 0)
-		return ((HRESULT)0x00000000L);
-	HRESULT hr = ((HRESULT)0x00000000L);
-	while (pEntries->piid != 0)
-	{
-		_IDispEvent* pDE = (_IDispEvent*)((DWORD_PTR)pT+pEntries->nOffset);
-		bool bNotAdvised = pDE->m_dwEventCookie == 0xFEFEFEFE;
-		if (bAdvise ^ bNotAdvised)
-		{
-			pEntries++;
-			continue;
-		}
-		hr = ((HRESULT)0x80004005L);
-		HWND h = pT->GetDlgItem(pEntries->nControlID);
-		(void) ((!!((h != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4340, 0, L"h != 0")) || (__debugbreak(), 0));
-		if (h != 0)
-		{
-			CComPtr<IUnknown> spUnk;
-			AtlAxGetControl(h, &spUnk);
-			(void) ((!!((spUnk != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4345, 0, L"spUnk != 0")) || (__debugbreak(), 0));
-			if (spUnk != 0)
-			{
-				if (bAdvise)
-				{
-					if (!InlineIsEqualGUID(GUID_NULL, *pEntries->piid))
-						hr = pDE->DispEventAdvise(spUnk, pEntries->piid);
-					else
-					{
-						hr = AtlGetObjectSourceInterface(spUnk, &pDE->m_libid, &pDE->m_iid, &pDE->m_wMajorVerNum, &pDE->m_wMinorVerNum);
-						if (((HRESULT)(hr) < 0))
-							return hr;
-						hr = pDE->DispEventAdvise(spUnk, &pDE->m_iid);
-					}
-				}
-				else
-				{
-					if (!InlineIsEqualGUID(GUID_NULL, *pEntries->piid))
-						hr = pDE->DispEventUnadvise(spUnk, pEntries->piid);
-					else
-						hr = pDE->DispEventUnadvise(spUnk, &pDE->m_iid);
-				}
-				(void) ((!!((hr == ((HRESULT)0x00000000L)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4367, 0, L"hr == ((HRESULT)0x00000000L)")) || (__debugbreak(), 0));
-			}
-		}
-		if (((HRESULT)(hr) < 0))
-			break;
-		pEntries++;
-	}
-	return hr;
-}
-
-#pragma warning(push)
-#pragma warning(disable: 4061) 
-inline VARTYPE AtlGetUserDefinedType(ITypeInfo *pTI, HREFTYPE hrt)
-{
-	do { int __atl_condVal=!!(pTI != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4381, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80070057L)); } while (0);
-
-	CComPtr<ITypeInfo> spTypeInfo;
-	VARTYPE vt = VT_USERDEFINED;
-	HRESULT hr = ((HRESULT)0x80004005L);
-	hr = pTI->GetRefTypeInfo(hrt, &spTypeInfo);
-	if(((HRESULT)(hr) < 0))
-		return vt;
-	TYPEATTR *pta = 0;
-
-	hr = spTypeInfo->GetTypeAttr(&pta);
-	if(((HRESULT)(hr) >= 0) && pta && (pta->typekind == TKIND_ALIAS || pta->typekind == TKIND_ENUM))
-	{
-		if (pta->tdescAlias.vt == VT_USERDEFINED)
-			vt = AtlGetUserDefinedType(spTypeInfo, pta->tdescAlias.hreftype);
-		else
-		{
-			switch (pta->typekind)
-			{
-			case TKIND_ENUM :
-				vt = VT_I4;
-				break;
-			case TKIND_INTERFACE :
-				vt = VT_UNKNOWN;
-				break;
-			case TKIND_DISPATCH :
-				vt = VT_DISPATCH;
-				break;
-			default:
-				vt = pta->tdescAlias.vt;
-			}
-		}				
-	}
-
-	if(pta)
-		spTypeInfo->ReleaseTypeAttr(pta);
-	return vt;
-
-}
-#pragma warning(pop)
-
-inline HRESULT AtlGetFuncInfoFromId(ITypeInfo* pTypeInfo, const IID& , DISPID dispidMember, LCID , _ATL_FUNC_INFO& info)
-{
-	if (pTypeInfo == 0)
-		return ((HRESULT)0x80070057L);
-
-	HRESULT hr = ((HRESULT)0x00000000L);
-	FUNCDESC* pFuncDesc = 0;
-	TYPEATTR* pAttr;
-	hr = pTypeInfo->GetTypeAttr(&pAttr);
-	if (((HRESULT)(hr) < 0))
-		return hr;
-	int i;
-	for (i=0;i<pAttr->cFuncs;i++)
-	{
-		hr = pTypeInfo->GetFuncDesc(i, &pFuncDesc);
-		if (((HRESULT)(hr) < 0))
-			return hr;
-		if (pFuncDesc->memid == dispidMember)
-			break;
-		pTypeInfo->ReleaseFuncDesc(pFuncDesc);
-		pFuncDesc = 0;
-	}
-	pTypeInfo->ReleaseTypeAttr(pAttr);
-	if (pFuncDesc == 0)
-		return ((HRESULT)0x80004005L);
-
-	
-	
-	(void) ((!!((pFuncDesc->cParams <= 8))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4450, 0, L"pFuncDesc->cParams <= 8")) || (__debugbreak(), 0));
-	if (pFuncDesc->cParams > 8)
-		return ((HRESULT)0x80004005L);
-
-	for (i = 0; i < pFuncDesc->cParams; i++)
-	{
-		info.pVarTypes[i] = pFuncDesc->lprgelemdescParam[i].tdesc.vt;
-		if (info.pVarTypes[i] == VT_PTR)
-			info.pVarTypes[i] = (VARTYPE)(pFuncDesc->lprgelemdescParam[i].tdesc.lptdesc->vt | VT_BYREF);
-		if (info.pVarTypes[i] == VT_USERDEFINED)
-			info.pVarTypes[i] = AtlGetUserDefinedType(pTypeInfo, pFuncDesc->lprgelemdescParam[i].tdesc.hreftype);
-	}
-
-	VARTYPE vtReturn = pFuncDesc->elemdescFunc.tdesc.vt;
-	switch(vtReturn)
-	{
-	case VT_INT:
-		vtReturn = VT_I4;
-		break;
-	case VT_UINT:
-		vtReturn = VT_UI4;
-		break;
-	case VT_VOID:
-		vtReturn = VT_EMPTY; 
-		break;
-	case VT_HRESULT:
-		vtReturn = VT_ERROR;
-		break;
-	}
-	info.vtReturn = vtReturn;
-	info.cc = pFuncDesc->callconv;
-	info.nParams = pFuncDesc->cParams;
-	pTypeInfo->ReleaseFuncDesc(pFuncDesc);
-	return ((HRESULT)0x00000000L);
-}
-
-template <UINT nID, class T, const IID* pdiid = &GUID_NULL, const GUID* plibid = &GUID_NULL, 
-	WORD wMajor = 0, WORD wMinor = 0, class tihclass = CComTypeInfoHolder>
-class __declspec(novtable) IDispEventImpl : public IDispEventSimpleImpl<nID, T, pdiid>
-{
-public:
-	typedef tihclass _tihclass;
-
-	IDispEventImpl()
-	{
-		m_libid = *plibid;
-		m_iid = *pdiid;
-		m_wMajorVerNum = wMajor;
-		m_wMinorVerNum = wMinor;
-	}
-
-	virtual HRESULT __stdcall GetTypeInfoCount(UINT* pctinfo)
-	{ 
-		if (pctinfo == 0) 
-			return ((HRESULT)0x80004003L); 
-		*pctinfo = 1; 
-		return ((HRESULT)0x00000000L);
-	}
-
-	virtual HRESULT __stdcall GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo)
-	{return _tih.GetTypeInfo(itinfo, lcid, pptinfo);}
-
-	virtual HRESULT __stdcall GetIDsOfNames(const IID & riid, LPOLESTR* rgszNames, UINT cNames,
-		LCID lcid, DISPID* rgdispid)
-	{return _tih.GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid);}
-
-	
-		HRESULT GetFuncInfoFromId(const IID& iid, DISPID dispidMember, LCID lcid, _ATL_FUNC_INFO& info)
-	{
-		CComPtr<ITypeInfo> spTypeInfo;
-	 
-		if (InlineIsEqualGUID(*_tih.m_plibid, GUID_NULL))
-		{
-			m_InnerLibid = m_libid; 
-			m_InnerIid = m_iid;
-			_tih.m_plibid = &m_InnerLibid;
-			_tih.m_pguid = &m_InnerIid;
-			_tih.m_wMajor = m_wMajorVerNum;
-			_tih.m_wMinor = m_wMinorVerNum;
-
-		}
-		HRESULT hr = _tih.GetTI(lcid, &spTypeInfo);
-		if (((HRESULT)(hr) < 0))
-			return hr;
-		return AtlGetFuncInfoFromId(spTypeInfo, iid, dispidMember, lcid, info);
-	}
-	VARTYPE GetUserDefinedType(ITypeInfo *pTI, HREFTYPE hrt)
-	{
-		return AtlGetUserDefinedType(pTI, hrt);
-	}
-protected:
-	static _tihclass _tih;
-	static GUID	m_InnerLibid; 
-	static IID m_InnerIid; 
-	static HRESULT GetTI(LCID lcid, ITypeInfo** ppInfo)
-	{return _tih.GetTI(lcid, ppInfo);}
-};
- 
-template <UINT nID, class T, const IID* piid, const GUID* plibid, WORD wMajor, WORD wMinor, class tihclass>
-typename IDispEventImpl<nID, T, piid, plibid, wMajor, wMinor, tihclass>::_tihclass
-IDispEventImpl<nID, T, piid, plibid, wMajor, wMinor, tihclass>::_tih =
-	{piid, plibid, wMajor, wMinor, 0, 0, 0, 0};
- 
-template <UINT nID, class T, const IID* piid, const GUID* plibid, WORD wMajor, WORD wMinor, class tihclass>
-GUID  IDispEventImpl<nID, T, piid, plibid, wMajor, wMinor, tihclass>::m_InnerLibid=GUID_NULL; 
-
-template <UINT nID, class T, const IID* piid, const GUID* plibid, WORD wMajor, WORD wMinor, class tihclass>
-IID  IDispEventImpl<nID, T, piid, plibid, wMajor, wMinor, tihclass>::m_InnerIid=GUID_NULL;
-
-template <class T>
-struct _ATL_EVENT_ENTRY
-{
-	UINT nControlID;			
-	const IID* piid;			
-	int nOffset;				
-	DISPID dispid;				
-	void (__stdcall T::*pfn)();	
-	_ATL_FUNC_INFO* pInfo;
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-template <class T, const IID* piid = &__uuidof(T), const GUID* plibid = &CAtlModule::m_libid, WORD wMajor = 1,
-WORD wMinor = 0, class tihclass = CComTypeInfoHolder>
-class __declspec(novtable) IDispatchImpl : public T
-{
-public:
-	typedef tihclass _tihclass;
-
-	virtual HRESULT __stdcall GetTypeInfoCount(UINT* pctinfo)
-	{
-		if (pctinfo == 0) 
-			return ((HRESULT)0x80004003L); 
-		*pctinfo = 1;
-		return ((HRESULT)0x00000000L);
-	}
-	virtual HRESULT __stdcall GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo)
-	{
-		return _tih.GetTypeInfo(itinfo, lcid, pptinfo);
-	}
-	virtual HRESULT __stdcall GetIDsOfNames(const IID & riid, LPOLESTR* rgszNames, UINT cNames,
-		LCID lcid, DISPID* rgdispid)
-	{
-		return _tih.GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid);
-	}
-	virtual HRESULT __stdcall Invoke(DISPID dispidMember, const IID & riid,
-		LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult,
-		EXCEPINFO* pexcepinfo, UINT* puArgErr)
-	{
-		return _tih.Invoke((IDispatch*)this, dispidMember, riid, lcid,
-		wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
-	}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-protected:
-	static _tihclass _tih;
-	static HRESULT GetTI(LCID lcid, ITypeInfo** ppInfo)
-	{
-		return _tih.GetTI(lcid, ppInfo);
-	}
-
-
-
-};
-
-
-
-template <class T, const IID* piid, const GUID* plibid, WORD wMajor, WORD wMinor, class tihclass>
-typename IDispatchImpl<T, piid, plibid, wMajor, wMinor, tihclass>::_tihclass
-IDispatchImpl<T, piid, plibid, wMajor, wMinor, tihclass>::_tih =
-{piid, plibid, wMajor, wMinor, 0, 0, 0, 0};
-
-
-
-
-
-template <const CLSID* pcoclsid, const GUID* plibid = &CAtlModule::m_libid,
-WORD wMajor = 1, WORD wMinor = 0, class tihclass = CComTypeInfoHolder>
-class __declspec(novtable) IProvideClassInfoImpl : public IProvideClassInfo
-{
-public:
-	typedef tihclass _tihclass;
-
-	virtual HRESULT __stdcall GetClassInfoW(ITypeInfo** pptinfo)
-	{
-		return _tih.GetTypeInfo(0, 0x00, pptinfo);
-	}
-
-protected:
-	static _tihclass _tih;
-};
-
-template <const CLSID* pcoclsid, const GUID* plibid, WORD wMajor, WORD wMinor, class tihclass>
-typename IProvideClassInfoImpl<pcoclsid, plibid, wMajor, wMinor, tihclass>::_tihclass
-IProvideClassInfoImpl<pcoclsid, plibid, wMajor, wMinor, tihclass>::_tih =
-{pcoclsid,plibid, wMajor, wMinor, 0, 0, 0, 0};
-
-
-
-template <const CLSID* pcoclsid, const IID* psrcid, const GUID* plibid = &CAtlModule::m_libid,
-WORD wMajor = 1, WORD wMinor = 0, class tihclass = CComTypeInfoHolder>
-class __declspec(novtable) IProvideClassInfo2Impl : public IProvideClassInfo2
-{
-public:
-	typedef tihclass _tihclass;
-
-	virtual HRESULT __stdcall GetClassInfoW(ITypeInfo** pptinfo)
-	{
-		return _tih.GetTypeInfo(0, 0x00, pptinfo);
-	}
-	virtual HRESULT __stdcall GetGUID(DWORD dwGuidKind, GUID* pGUID)
-	{
-		if (pGUID == 0)
-		{
-			return ((HRESULT)0x80004003L);
-		}
-		*pGUID = GUID_NULL;
-		if(dwGuidKind!=GUIDKIND_DEFAULT_SOURCE_DISP_IID)
-		{
-			return ((HRESULT)0x80070057L);
-		}
-		if (psrcid != 0)
-		{
-			*pGUID = *psrcid;
-			return ((HRESULT)0x00000000L);
-		}
-		return ((HRESULT)0x80004005L);
-	}
-
-protected:
-	static _tihclass _tih;
-};
-
-
-template <const CLSID* pcoclsid, const IID* psrcid, const GUID* plibid, WORD wMajor, WORD wMinor, class tihclass>
-typename IProvideClassInfo2Impl<pcoclsid, psrcid, plibid, wMajor, wMinor, tihclass>::_tihclass
-IProvideClassInfo2Impl<pcoclsid, psrcid, plibid, wMajor, wMinor, tihclass>::_tih =
-{pcoclsid,plibid, wMajor, wMinor, 0, 0, 0, 0};
-
-
-
-
-
-template <const IID* piid>
-class __declspec(novtable) ISupportErrorInfoImpl : public ISupportErrorInfo
-{
-public:
-	virtual HRESULT __stdcall InterfaceSupportsErrorInfo(const IID & riid)
-	{
-		return (InlineIsEqualGUID(riid,*piid)) ? ((HRESULT)0x00000000L) : ((HRESULT)0x00000001L);
-	}
-};
-
-
-
-
-
-
-
-
-
-template <class T>
-class _Copy
-{
-public:
-	static HRESULT copy(T* p1, const T* p2) { Checked::memcpy_s(p1, sizeof(T), p2, sizeof(T)); return ((HRESULT)0x00000000L);}
-	static void init(T*) {}
-	static void destroy(T*) {}
-};
-
-template<>
-class _Copy<VARIANT>
-{
-public:
-	static HRESULT copy(VARIANT* p1, const VARIANT* p2) {p1->vt = VT_EMPTY; return VariantCopy(p1, const_cast<VARIANT*>(p2));}
-	static void init(VARIANT* p) {p->vt = VT_EMPTY;}
-	static void destroy(VARIANT* p) {VariantClear(p);}
-};
-
-template<>
-class _Copy<LPOLESTR>
-{
-public:
-	static HRESULT copy(LPOLESTR* p1, const LPOLESTR* p2)
-	{
-		do { int __atl_condVal=!!(p1 != 0 && p2 != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4775, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-		HRESULT hr = ((HRESULT)0x00000000L);
-		ULONG len = ocslen(*p2)+1;
-		(*p1) = (LPOLESTR)::ATL::AtlCoTaskMemCAlloc(len, static_cast<ULONG>(sizeof(OLECHAR)));
-		if (*p1 == 0)
-		{
-			hr = ((HRESULT)0x8007000EL);
-		}
-		else
-		{
-			if(!ocscpy_s(*p1, len, *p2))
-			{
-				hr = ((HRESULT)0x80004005L);
-			}
-		}
-		return hr;
-	}
-	static void init(LPOLESTR* p) {*p = 0;}
-	static void destroy(LPOLESTR* p) { CoTaskMemFree(*p);}
-};
-
-template<>
-class _Copy<OLEVERB>
-{
-public:
-	static HRESULT copy(OLEVERB* p1, const OLEVERB* p2)
-	{
-		do { int __atl_condVal=!!(p1 != 0 && p2 != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4802, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-		HRESULT hr = ((HRESULT)0x00000000L);
-		*p1 = *p2;
-		if (p2->lpszVerbName == 0)
-		{
-			return ((HRESULT)0x00000000L);
-		}
-
-		ULONG len = ocslen(p2->lpszVerbName)+1;
-		p1->lpszVerbName = (LPOLESTR)::ATL::AtlCoTaskMemCAlloc(len, static_cast<ULONG>(sizeof(OLECHAR)));
-		if (p1->lpszVerbName == 0)
-		{
-			hr = ((HRESULT)0x8007000EL);
-		}
-		else
-		{
-			if(!ocscpy_s(p1->lpszVerbName, len, p2->lpszVerbName))
-			{
-				hr = ((HRESULT)0x80004005L);
-			}
-		}
-		return hr;
-	}
-	static void init(OLEVERB* p) { p->lpszVerbName = 0;}
-	static void destroy(OLEVERB* p) { if (p->lpszVerbName) CoTaskMemFree(p->lpszVerbName);}
-};
-
-template<>
-class _Copy<CONNECTDATA>
-{
-public:
-	static HRESULT copy(CONNECTDATA* p1, const CONNECTDATA* p2)
-	{
-		do { int __atl_condVal=!!(p1 != 0 && p2 != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4835, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-		*p1 = *p2;
-		if (p1->pUnk)
-			p1->pUnk->AddRef();
-		return ((HRESULT)0x00000000L);
-	}
-	static void init(CONNECTDATA* ) {}
-	static void destroy(CONNECTDATA* p) {if (p->pUnk) p->pUnk->Release();}
-};
-
-template <class T>
-class _CopyInterface
-{
-public:
-	static HRESULT copy(T* * p1, T * const * p2)
-	{
-		do { int __atl_condVal=!!(p1 != 0 && p2 != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4851, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
-		*p1 = *p2;
-		if (*p1)
-			(*p1)->AddRef();
-		return ((HRESULT)0x00000000L);
-	}
-	static void init(T** ) {}
-	static void destroy(T** p) {if (*p) (*p)->Release();}
-};
-
-template<class T>
-class __declspec(novtable) CComIEnum : public IUnknown
-{
-public:
-	virtual HRESULT __stdcall Next(ULONG celt, T* rgelt, ULONG* pceltFetched) = 0;
-	virtual HRESULT __stdcall Skip(ULONG celt) = 0;
-	virtual HRESULT __stdcall Reset(void) = 0;
-	virtual HRESULT __stdcall Clone(CComIEnum<T>** ppEnum) = 0;
-};
-
-
-enum CComEnumFlags
-{
-	
-	AtlFlagNoCopy = 0,
-	AtlFlagTakeOwnership = 2,
-	AtlFlagCopy = 3 
-};
-
-template <class Base, const IID* piid, class T, class Copy>
-class __declspec(novtable) CComEnumImpl : public Base
-{
-public:
-	CComEnumImpl() {m_begin = m_end = m_iter = 0; m_dwFlags = 0;}
-	virtual ~CComEnumImpl();
-	virtual HRESULT __stdcall Next(ULONG celt, T* rgelt, ULONG* pceltFetched);
-	virtual HRESULT __stdcall Skip(ULONG celt);
-	virtual HRESULT __stdcall Reset(void){m_iter = m_begin;return ((HRESULT)0x00000000L);}
-	virtual HRESULT __stdcall Clone(Base** ppEnum);
-	HRESULT Init(T* begin, T* end, IUnknown* pUnk,
-		CComEnumFlags flags = AtlFlagNoCopy);
-	CComPtr<IUnknown> m_spUnk;
-	T* m_begin;
-	T* m_end;
-	T* m_iter;
-	DWORD m_dwFlags;
-protected:
-	enum FlagBits
-	{
-		BitCopy=1,
-		BitOwn=2
-	};
-};
-
-template <class Base, const IID* piid, class T, class Copy>
-CComEnumImpl<Base, piid, T, Copy>::~CComEnumImpl()
-{
-	if (m_dwFlags & BitOwn)
-	{
-		for (T* p = m_begin; p != m_end; p++)
-			Copy::destroy(p);
-		delete [] m_begin;
-	}
-}
-
-template <class Base, const IID* piid, class T, class Copy>
-HRESULT __stdcall CComEnumImpl<Base, piid, T, Copy>::Next(ULONG celt, T* rgelt,
-	ULONG* pceltFetched)
-{
-	if (pceltFetched != 0)
-		*pceltFetched = 0;
-	if (celt == 0)
-		return ((HRESULT)0x80070057L);
-	if (rgelt == 0 || (celt != 1 && pceltFetched == 0))
-		return ((HRESULT)0x80004003L);
-	if (m_begin == 0 || m_end == 0 || m_iter == 0)
-		return ((HRESULT)0x80004005L);
-	ULONG nRem = (ULONG)(m_end - m_iter);
-	HRESULT hRes = ((HRESULT)0x00000000L);
-	if (nRem < celt)
-		hRes = ((HRESULT)0x00000001L);
-	ULONG nMin = celt < nRem ? celt : nRem ;
-	if (pceltFetched != 0)
-		*pceltFetched = nMin;
-	T* pelt = rgelt;
-	while(nMin--)
-	{
-		HRESULT hr = Copy::copy(pelt, m_iter);
-		if (((HRESULT)(hr) < 0))
-		{
-			while (rgelt < pelt)
-				Copy::destroy(rgelt++);
-			if (pceltFetched != 0)
-				*pceltFetched = 0;
-			return hr;
-		}
-		pelt++;
-		m_iter++;
-	}
-	return hRes;
-}
-
-template <class Base, const IID* piid, class T, class Copy>
-HRESULT __stdcall CComEnumImpl<Base, piid, T, Copy>::Skip(ULONG celt)
-{
-	if (celt == 0)
-		return ((HRESULT)0x80070057L);
-
-	ULONG nRem = ULONG(m_end - m_iter);
-	ULONG nSkip = (celt > nRem) ? nRem : celt;
-	m_iter += nSkip;
-	return (celt == nSkip) ? ((HRESULT)0x00000000L) : ((HRESULT)0x00000001L);
-}
-
-template <class Base, const IID* piid, class T, class Copy>
-HRESULT __stdcall CComEnumImpl<Base, piid, T, Copy>::Clone(Base** ppEnum)
-{
-	typedef CComObject<CComEnum<Base, piid, T, Copy> > _class;
-	HRESULT hRes = ((HRESULT)0x80004003L);
-	if (ppEnum != 0)
-	{
-		*ppEnum = 0;
-		_class* p;
-		hRes = _class::CreateInstance(&p);
-		if (((HRESULT)(hRes) >= 0))
-		{
-			
-			hRes = p->Init(m_begin, m_end, (m_dwFlags & BitOwn) ? this : m_spUnk);
-			if (((HRESULT)(hRes) >= 0))
-			{
-				p->m_iter = m_iter;
-				hRes = p->_InternalQueryInterface(*piid, (void**)ppEnum);
-			}
-			if (((HRESULT)(hRes) < 0))
-				delete p;
-		}
-	}
-	return hRes;
-}
-
-template <class Base, const IID* piid, class T, class Copy>
-HRESULT CComEnumImpl<Base, piid, T, Copy>::Init(T* begin, T* end, IUnknown* pUnk,
-	CComEnumFlags flags)
-{
-	if (flags == AtlFlagCopy)
-	{
-		do { (void) ((!!((m_begin == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4997, 0, L"m_begin == 0")) || (__debugbreak(), 0)); ; } while(0); 
-		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{m_begin = new T[end-begin];} catch(...) {} __pragma(warning(pop))
-		m_iter = m_begin;
-		if (m_begin == 0)
-			return ((HRESULT)0x8007000EL);
-		for (T* i=begin; i != end; i++)
-		{
-			Copy::init(m_iter);
-			HRESULT hr = Copy::copy(m_iter, i);
-			if (((HRESULT)(hr) < 0))
-			{
-				T* p = m_begin;
-				while (p < m_iter)
-					Copy::destroy(p++);
-				delete [] m_begin;
-				m_begin = m_end = m_iter = 0;
-				return hr;
-			}
-			m_iter++;
-		}
-		m_end = m_begin + (end-begin);
-	}
-	else
-	{
-		m_begin = begin;
-		m_end = end;
-	}
-	m_spUnk = pUnk;
-	m_iter = m_begin;
-	m_dwFlags = flags;
-	return ((HRESULT)0x00000000L);
-}
-
-template <class Base, const IID* piid, class T, class Copy, class ThreadModel = CComObjectThreadModel>
-class __declspec(novtable) CComEnum :
-	public CComEnumImpl<Base, piid, T, Copy>,
-	public CComObjectRootEx< ThreadModel >
-{
-public:
-	typedef CComEnum<Base, piid, T, Copy > _CComEnum;
-	typedef CComEnumImpl<Base, piid, T, Copy > _CComEnumBase;
-	public: typedef _CComEnum _ComMapClass; static HRESULT __stdcall _Cache(void* pv, const IID & iid, void** ppvObject, DWORD_PTR dw) throw() { _ComMapClass* p = (_ComMapClass*)pv; p->Lock(); HRESULT hRes = ((HRESULT)0x80004005L); __try { hRes = ATL::CComObjectRootBase::_Cache(pv, iid, ppvObject, dw); } __finally { p->Unlock(); } return hRes; } IUnknown* _GetRawUnknown() throw() { (void) ((!!((_GetEntries()[0].pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5038, 0, L"_GetEntries()[0].pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)")) || (__debugbreak(), 0)); return (IUnknown*)((INT_PTR)this+_GetEntries()->dw); } IUnknown* GetUnknown() throw() {return _GetRawUnknown();} HRESULT _InternalQueryInterface(const IID & iid, void** ppvObject) throw() { return InternalQueryInterface(this, _GetEntries(), iid, ppvObject); } const static ATL::_ATL_INTMAP_ENTRY* __stdcall _GetEntries() throw() { static const ATL::_ATL_INTMAP_ENTRY _entries[] = { {0, (DWORD_PTR)L"_CComEnum", (ATL::_ATL_CREATORARGFUNC*)0},
-		{&*piid, ((DWORD_PTR)(static_cast<_CComEnumBase*>((_ComMapClass*)8))-8), ((ATL::_ATL_CREATORARGFUNC*)1)},
-	__if_exists(_GetAttrEntries) {{0, (DWORD_PTR)_GetAttrEntries, _ChainAttr }, } {0, 0, 0}}; return &_entries[1];} virtual ULONG __stdcall AddRef( void) throw() = 0; virtual ULONG __stdcall Release( void) throw() = 0; virtual HRESULT __stdcall QueryInterface(const IID &, void**) throw() = 0;
-};
-
-template <class Base, const IID* piid, class T, class Copy, class CollType>
-class __declspec(novtable) IEnumOnSTLImpl : public Base
-{
-public:
-	HRESULT Init(IUnknown *pUnkForRelease, CollType& collection)
-	{
-		m_spUnk = pUnkForRelease;
-		m_pcollection = &collection;
-		m_iter = m_pcollection->begin();
-		return ((HRESULT)0x00000000L);
-	}
-	virtual HRESULT __stdcall Next(ULONG celt, T* rgelt, ULONG* pceltFetched);
-	virtual HRESULT __stdcall Skip(ULONG celt);
-	virtual HRESULT __stdcall Reset(void)
-	{
-		if (m_pcollection == 0)
-			return ((HRESULT)0x80004005L);
-		m_iter = m_pcollection->begin();
-		return ((HRESULT)0x00000000L);
-	}
-	virtual HRESULT __stdcall Clone(Base** ppEnum);
-
-	CComPtr<IUnknown> m_spUnk;
-	CollType* m_pcollection;
-	typename CollType::const_iterator m_iter;
-};
-
-template <class Base, const IID* piid, class T, class Copy, class CollType>
-HRESULT __stdcall IEnumOnSTLImpl<Base, piid, T, Copy, CollType>::Next(ULONG celt, T* rgelt,
-	ULONG* pceltFetched)
-{
-	if (rgelt == 0 || (celt != 1 && pceltFetched == 0))
-		return ((HRESULT)0x80004003L);
-	if (pceltFetched != 0)
-		*pceltFetched = 0;
-	if (m_pcollection == 0)
-		return ((HRESULT)0x80004005L);
-
-	ULONG nActual = 0;
-	HRESULT hr = ((HRESULT)0x00000000L);
-	T* pelt = rgelt;
-	while (((HRESULT)(hr) >= 0) && m_iter != m_pcollection->end() && nActual < celt)
-	{
-		hr = Copy::copy(pelt, &*m_iter);
-		if (((HRESULT)(hr) < 0))
-		{
-			while (rgelt < pelt)
-				Copy::destroy(rgelt++);
-			nActual = 0;
-		}
-		else
-		{
-			pelt++;
-			m_iter++;
-			nActual++;
-		}
-	}
-	if (((HRESULT)(hr) >= 0))
-	{
-		if (pceltFetched)
-			*pceltFetched = nActual;
-		if (nActual < celt)
-			hr = ((HRESULT)0x00000001L);
-	}
-	return hr;
-}
-
-template <class Base, const IID* piid, class T, class Copy, class CollType>
-HRESULT __stdcall IEnumOnSTLImpl<Base, piid, T, Copy, CollType>::Skip(ULONG celt)
-{
-	HRESULT hr = ((HRESULT)0x00000000L);
-	while (celt--)
-	{
-		if (m_iter != m_pcollection->end())
-			m_iter++;
-		else
-		{
-			hr = ((HRESULT)0x00000001L);
-			break;
-		}
-	}
-	return hr;
-}
-
-template <class Base, const IID* piid, class T, class Copy, class CollType>
-HRESULT __stdcall IEnumOnSTLImpl<Base, piid, T, Copy, CollType>::Clone(Base** ppEnum)
-{
-	typedef CComObject<CComEnumOnSTL<Base, piid, T, Copy, CollType> > _class;
-	HRESULT hRes = ((HRESULT)0x80004003L);
-	if (ppEnum != 0)
-	{
-		*ppEnum = 0;
-		_class* p;
-		hRes = _class::CreateInstance(&p);
-		if (((HRESULT)(hRes) >= 0))
-		{
-			hRes = p->Init(m_spUnk, *m_pcollection);
-			if (((HRESULT)(hRes) >= 0))
-			{
-				p->m_iter = m_iter;
-				hRes = p->_InternalQueryInterface(*piid, (void**)ppEnum);
-			}
-			if (((HRESULT)(hRes) < 0))
-				delete p;
-		}
-	}
-	return hRes;
-}
-
-template <class Base, const IID* piid, class T, class Copy, class CollType, class ThreadModel = CComObjectThreadModel>
-class __declspec(novtable) CComEnumOnSTL :
-	public IEnumOnSTLImpl<Base, piid, T, Copy, CollType>,
-	public CComObjectRootEx< ThreadModel >
-{
-public:
-	typedef CComEnumOnSTL<Base, piid, T, Copy, CollType, ThreadModel > _CComEnum;
-	typedef IEnumOnSTLImpl<Base, piid, T, Copy, CollType > _CComEnumBase;
-	public: typedef _CComEnum _ComMapClass; static HRESULT __stdcall _Cache(void* pv, const IID & iid, void** ppvObject, DWORD_PTR dw) throw() { _ComMapClass* p = (_ComMapClass*)pv; p->Lock(); HRESULT hRes = ((HRESULT)0x80004005L); __try { hRes = ATL::CComObjectRootBase::_Cache(pv, iid, ppvObject, dw); } __finally { p->Unlock(); } return hRes; } IUnknown* _GetRawUnknown() throw() { (void) ((!!((_GetEntries()[0].pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5160, 0, L"_GetEntries()[0].pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)")) || (__debugbreak(), 0)); return (IUnknown*)((INT_PTR)this+_GetEntries()->dw); } IUnknown* GetUnknown() throw() {return _GetRawUnknown();} HRESULT _InternalQueryInterface(const IID & iid, void** ppvObject) throw() { return InternalQueryInterface(this, _GetEntries(), iid, ppvObject); } const static ATL::_ATL_INTMAP_ENTRY* __stdcall _GetEntries() throw() { static const ATL::_ATL_INTMAP_ENTRY _entries[] = { {0, (DWORD_PTR)L"_CComEnum", (ATL::_ATL_CREATORARGFUNC*)0},
-		{&*piid, ((DWORD_PTR)(static_cast<_CComEnumBase*>((_ComMapClass*)8))-8), ((ATL::_ATL_CREATORARGFUNC*)1)},
-	__if_exists(_GetAttrEntries) {{0, (DWORD_PTR)_GetAttrEntries, _ChainAttr }, } {0, 0, 0}}; return &_entries[1];} virtual ULONG __stdcall AddRef( void) throw() = 0; virtual ULONG __stdcall Release( void) throw() = 0; virtual HRESULT __stdcall QueryInterface(const IID &, void**) throw() = 0;
-};
-
-template <class T, class CollType, class ItemType, class CopyItem, class EnumType>
-class ICollectionOnSTLImpl : public T
-{
-public:
-	virtual HRESULT __stdcall get_Count(long* pcount)
-	{
-		if (pcount == 0)
-			return ((HRESULT)0x80004003L);
-		do { (void) ((!!((m_coll.size()<=2147483647L))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5173, 0, L"m_coll.size()<=2147483647L")) || (__debugbreak(), 0)); ; } while(0);
-
-		*pcount = (long)m_coll.size();
-
-		return ((HRESULT)0x00000000L);
-	}
-	virtual HRESULT __stdcall get_Item(long Index, ItemType* pvar)
-	{
-		
-		if (pvar == 0)
-			return ((HRESULT)0x80004003L);
-		if (Index < 1)
-			return ((HRESULT)0x80070057L);
-		HRESULT hr = ((HRESULT)0x80004005L);
-		Index--;
-		CollType::const_iterator iter = m_coll.begin();
-		while (iter != m_coll.end() && Index > 0)
-		{
-			iter++;
-			Index--;
-		}
-		if (iter != m_coll.end())
-			hr = CopyItem::copy(pvar, &*iter);
-		return hr;
-	}
-	virtual HRESULT __stdcall get__NewEnum(IUnknown** ppUnk)
-	{
-		if (ppUnk == 0)
-			return ((HRESULT)0x80004003L);
-		*ppUnk = 0;
-		HRESULT hRes = ((HRESULT)0x00000000L);
-		CComObject<EnumType>* p;
-		hRes = CComObject<EnumType>::CreateInstance(&p);
-		if (((HRESULT)(hRes) >= 0))
-		{
-			hRes = p->Init(this, m_coll);
-			if (hRes == ((HRESULT)0x00000000L))
-				hRes = p->QueryInterface(__uuidof(IUnknown), (void**)ppUnk);
-		}
-		if (hRes != ((HRESULT)0x00000000L))
-			delete p;
-		return hRes;
-	}
-	CollType m_coll;
-};
-
-
-
-template <class T>
-class __declspec(novtable) ISpecifyPropertyPagesImpl : public ISpecifyPropertyPages
-{
-public:
-	
-	
-	virtual HRESULT __stdcall GetPages(CAUUID* pPages)
-	{
-		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5229)(atlTraceCOM, 2, L"ISpecifyPropertyPagesImpl::GetPages\n");
-		ATL_PROPMAP_ENTRY* pMap = T::GetPropertyMap();
-		return GetPagesHelper(pPages, pMap);
-	}
-protected:
-	HRESULT GetPagesHelper(CAUUID* pPages, ATL_PROPMAP_ENTRY* pMap)
-	{
-		if (pPages == 0)
-			return ((HRESULT)0x80004003L);
-		(void) ((!!((pMap != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5238, 0, L"pMap != 0")) || (__debugbreak(), 0));
-		if (pMap == 0)
-			return ((HRESULT)0x80004003L);
-
-		int nCnt = 0;
-		int i;
-		
-		for (i = 0; pMap[i].pclsidPropPage != 0; i++)
-		{
-			
-			if (pMap[i].vt == 0)
-			{
-				
-				if (!InlineIsEqualGUID(*pMap[i].pclsidPropPage, GUID_NULL))
-					nCnt++;
-			}
-		}
-		pPages->pElems = (GUID*) ::ATL::AtlCoTaskMemCAlloc(nCnt, static_cast<ULONG>(sizeof(CLSID)));
-		if (pPages->pElems == 0)
-			return ((HRESULT)0x8007000EL);
-		
-		nCnt = 0;
-		for (i = 0; pMap[i].pclsidPropPage != 0; i++)
-		{
-			
-			if (pMap[i].vt == 0)
-			{
-				
-				if (!InlineIsEqualGUID(*pMap[i].pclsidPropPage, GUID_NULL))
-				{
-					BOOL bFound = 0;
-					
-					
-					for (int j=0; j<nCnt; j++)
-					{
-						if (InlineIsEqualGUID(*(pMap[i].pclsidPropPage), pPages->pElems[j]))
-						{
-							
-							bFound = 1;
-							break;
-						}
-					}
-					
-					if (!bFound)
-						pPages->pElems[nCnt++] = *pMap[i].pclsidPropPage;
-				}
-			}
-		}
-		pPages->cElems = nCnt;
-		return ((HRESULT)0x00000000L);
-	}
-
-};
-
-
-
-
-
-struct _ATL_CONNMAP_ENTRY
-{
-	DWORD_PTR dwOffset;
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-template <unsigned int nMaxSize>
-class CComUnkArray
-{
-public:
-	CComUnkArray()
-	{
-		memset(m_arr, 0, sizeof(IUnknown*)*nMaxSize);
-	}
-	DWORD Add(IUnknown* pUnk);
-	BOOL Remove(DWORD dwCookie);
-	
-	
-	DWORD __stdcall GetCookie(IUnknown** ppFind)
-	{
-		(void) ((!!((ppFind && *ppFind))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5370, 0, L"ppFind && *ppFind")) || (__debugbreak(), 0));
-		if (ppFind && *ppFind)
-		{
-			
-			for (DWORD dwCookie = 0; dwCookie < nMaxSize; dwCookie++)
-			{
-				if (m_arr[dwCookie] == *ppFind)
-					return dwCookie+1; 
-			}
-		}
-		return 0;
-	}
-	IUnknown* __stdcall GetUnknown(DWORD dwCookie)
-	{
-		(void) ((!!((dwCookie != 0 && dwCookie <= nMaxSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5384, 0, L"dwCookie != 0 && dwCookie <= nMaxSize")) || (__debugbreak(), 0));
-		if (dwCookie != 0 && dwCookie <= nMaxSize)
-			return m_arr[dwCookie-1]; 
-		else
-			return 0;
-	}
-	IUnknown** begin()
-	{
-		return &m_arr[0];
-	}
-	IUnknown** end()
-	{
-		return &m_arr[nMaxSize];
-	}
-protected:
-	IUnknown* m_arr[nMaxSize];
-};
-
-template <unsigned int nMaxSize>
-inline DWORD CComUnkArray<nMaxSize>::Add(IUnknown* pUnk)
-{
-	DWORD dwCookie = 1;
-	for (IUnknown** pp = begin(); pp < end(); pp++)
-	{
-		if (*pp == 0)
-		{
-			*pp = pUnk;
-			return dwCookie;
-		}
-		dwCookie++;
-	}
-	
-	(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5416, 0, L"0")) || (__debugbreak(), 0));
-	return 0;
-}
-
-template <unsigned int nMaxSize>
-inline BOOL CComUnkArray<nMaxSize>::Remove(DWORD dwCookie)
-{
-	(void) ((!!((dwCookie != 0 && dwCookie <= nMaxSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5423, 0, L"dwCookie != 0 && dwCookie <= nMaxSize")) || (__debugbreak(), 0));
-	if (dwCookie != 0 && dwCookie <= nMaxSize && m_arr[dwCookie-1] != 0)
-	{
-		m_arr[dwCookie-1] = 0;
-		return 1;
-	}
-	else
-		return 0;
-}
-
-template<>
-class CComUnkArray<1>
-{
-public:
-	CComUnkArray()
-	{
-		m_arr[0] = 0;
-	}
-	DWORD Add(IUnknown* pUnk)
-	{
-		if (m_arr[0] != 0)
-		{
-			
-			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5446, 0, L"0")) || (__debugbreak(), 0));
-			return 0;
-		}
-		m_arr[0] = pUnk;
-		return 1;
-	}
-	BOOL Remove(DWORD dwCookie)
-	{
-		(void) ((!!((dwCookie == 1))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5454, 0, L"dwCookie == 1")) || (__debugbreak(), 0));
-		if (dwCookie == 1 && m_arr[0] != 0)
-		{
-			m_arr[0] = 0;
-			return 1;
-		}
-		else
-			return 0;
-	}
-	DWORD __stdcall GetCookie(IUnknown** )
-	{
-		return 1;
-	}
-	IUnknown* __stdcall GetUnknown(DWORD dwCookie)
-	{
-		(void) ((!!((dwCookie == 1))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5469, 0, L"dwCookie == 1")) || (__debugbreak(), 0));
-		if (dwCookie == 1)
-			return m_arr[0];
-		else 
-			return 0;
-	}
-	IUnknown** begin()
-	{
-		return &m_arr[0];
-	}
-	IUnknown** end()
-	{
-		return (&m_arr[0])+1;
-	}
-protected:
-	IUnknown* m_arr[1];
-};
-
-class CComDynamicUnkArray
-{
-public:
-	CComDynamicUnkArray()
-	{
-		m_nSize = 0;
-		m_ppUnk = 0;
-	}
-
-	~CComDynamicUnkArray()
-	{
-		if (m_nSize > 0)
-			free(m_ppUnk);
-	}
-	DWORD Add(IUnknown* pUnk);
-	BOOL Remove(DWORD dwCookie);
-	
-	
-	DWORD __stdcall GetCookie(IUnknown** ppFind)
-	{
-		(void) ((!!((ppFind && *ppFind))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5507, 0, L"ppFind && *ppFind")) || (__debugbreak(), 0));
-		if (ppFind && *ppFind)
-		{
-			IUnknown** ppUnk = 0;
-			DWORD dwCookie = 1;
-			
-			for (ppUnk = begin(); ppUnk < end(); ppUnk++)
-			{
-				if (*ppUnk == *ppFind)
-					return dwCookie; 
-				dwCookie++;
-			}
-		}
-		return 0;
-	}
-	IUnknown* __stdcall GetUnknown(DWORD dwCookie)
-	{
-
-		(void) ((!!((dwCookie != 0 && dwCookie <= (DWORD)m_nSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5525, 0, L"dwCookie != 0 && dwCookie <= (DWORD)m_nSize")) || (__debugbreak(), 0));
-
-		if (dwCookie != 0 && dwCookie <= (DWORD)m_nSize)
-			return GetAt(dwCookie-1); 
-		else
-			return 0;
-	}
-	IUnknown** begin()
-	{
-		return m_ppUnk;
-	}
-	IUnknown** end()
-	{
-		return &m_ppUnk[m_nSize];
-	}
-
-	IUnknown* GetAt(int nIndex)
-	{
-		(void) ((!!((nIndex >= 0 && nIndex < m_nSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5543, 0, L"nIndex >= 0 && nIndex < m_nSize")) || (__debugbreak(), 0));
-		if (nIndex >= 0 && nIndex < m_nSize)
-			return m_ppUnk[nIndex];
-		else
-			return 0;
-
-	}
-	int GetSize() const
-	{
-		return m_nSize;
-	}
-	void clear()
-	{
-		if (m_nSize > 0)
-		{
-			free(m_ppUnk);
-			m_ppUnk = 0;
-		}
-		m_nSize = 0;
-	}
-protected:
-	IUnknown** m_ppUnk;
-	int m_nSize;
-};
-
-inline DWORD CComDynamicUnkArray::Add(IUnknown* pUnk)
-{
-	IUnknown** pp = 0;
-	if (m_nSize == 0)
-	{
-		
-		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{pp = (IUnknown**)calloc(sizeof(IUnknown*),4);} catch(...) {} __pragma(warning(pop));
-		if (pp == 0)
-			return 0;
-		memset(pp, 0, sizeof(IUnknown*)*4);
-		m_ppUnk = pp;
-		m_nSize = 4;
-	}
-	
-	DWORD dwCookie = 1;
-	for (pp = begin(); pp < end(); pp++)
-	{
-		if (*pp == 0)
-		{
-			*pp = pUnk;
-			return dwCookie; 
-		}
-		dwCookie++;
-	}
-	
-	
-	int nAlloc = m_nSize*2;
-	pp = (IUnknown**)_recalloc(m_ppUnk, sizeof(IUnknown*),nAlloc);
-	if (pp == 0)
-		return 0;
-	m_ppUnk = pp;
-	memset(&m_ppUnk[m_nSize], 0, sizeof(IUnknown*)*m_nSize);
-	m_ppUnk[m_nSize] = pUnk;
-	dwCookie = m_nSize+1;
-	m_nSize = nAlloc;
-	return dwCookie; 
-}
-
-inline BOOL CComDynamicUnkArray::Remove(DWORD dwCookie)
-{
-	DWORD idx = dwCookie -1;
-
-	(void) ((!!((idx < dwCookie && idx < (DWORD)m_nSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5610, 0, L"idx < dwCookie && idx < (DWORD)m_nSize")) || (__debugbreak(), 0));
-
-	if (idx < dwCookie && idx < (DWORD)m_nSize)
-	{
-		
-		if (m_ppUnk[idx] == 0)
-			return 0;
-		m_ppUnk[idx] = 0;
-		return 1;
-	}
-	else
-		return 0;
-}
-
-template <const IID* piid>
-class __declspec(novtable) _ICPLocator
-{
-public:
-	
-	virtual HRESULT __stdcall _LocCPQueryInterface(const IID & riid, void ** ppvObject) = 0;
-	virtual ULONG __stdcall AddRef(void) = 0;
-	virtual ULONG __stdcall Release(void) = 0;
-};
-
-template <class T, const IID* piid, class CDV = CComDynamicUnkArray >
-class __declspec(novtable) IConnectionPointImpl : public _ICPLocator<piid>
-{
-	typedef CComEnum<IEnumConnections, &__uuidof(IEnumConnections), CONNECTDATA,
-		_Copy<CONNECTDATA> > CComEnumConnections;
-	typedef CDV _CDV;
-public:
-	~IConnectionPointImpl();
-	virtual HRESULT __stdcall _LocCPQueryInterface(const IID & riid, void ** ppvObject)
-	{
-
-		(void) ((!!((ppvObject != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5645, 0, L"ppvObject != 0")) || (__debugbreak(), 0));
-
-		if (ppvObject == 0)
-			return ((HRESULT)0x80004003L);
-		*ppvObject = 0;
-
-		if (InlineIsEqualGUID(riid, __uuidof(IConnectionPoint)) || InlineIsEqualUnknown(riid))
-		{
-			*ppvObject = this;
-			AddRef();
-
-
-
-			return ((HRESULT)0x00000000L);
-		}
-		else
-			return ((HRESULT)0x80004002L);
-	}
-
-	virtual HRESULT __stdcall GetConnectionInterface(IID* piid2)
-	{
-		if (piid2 == 0)
-			return ((HRESULT)0x80004003L);
-		*piid2 = *piid;
-		return ((HRESULT)0x00000000L);
-	}
-	virtual HRESULT __stdcall GetConnectionPointContainer(IConnectionPointContainer** ppCPC)
-	{
-		T* pT = static_cast<T*>(this);
-		
-		return pT->QueryInterface(__uuidof(IConnectionPointContainer), (void**)ppCPC);
-	}
-	virtual HRESULT __stdcall Advise(IUnknown* pUnkSink, DWORD* pdwCookie);
-	virtual HRESULT __stdcall Unadvise(DWORD dwCookie);
-	virtual HRESULT __stdcall EnumConnections(IEnumConnections** ppEnum);
-	CDV m_vec;
-};
-
-template <class T, const IID* piid, class CDV>
-IConnectionPointImpl<T, piid, CDV>::~IConnectionPointImpl()
-{
-	IUnknown** pp = m_vec.begin();
-	while (pp < m_vec.end())
-	{
-		if (*pp != 0)
-			(*pp)->Release();
-		pp++;
-	}
-}
-
-template <class T, const IID* piid, class CDV>
-HRESULT __stdcall IConnectionPointImpl<T, piid, CDV>::Advise(IUnknown* pUnkSink,
-	DWORD* pdwCookie)
-{
-	T* pT = static_cast<T*>(this);
-	IUnknown* p;
-	HRESULT hRes = ((HRESULT)0x00000000L);
-	if (pdwCookie != 0)
-		*pdwCookie = 0;
-	if (pUnkSink == 0 || pdwCookie == 0)
-		return ((HRESULT)0x80004003L);
-	IID iid;
-	GetConnectionInterface(&iid);
-	hRes = pUnkSink->QueryInterface(iid, (void**)&p);
-	if (((HRESULT)(hRes) >= 0))
-	{
-		pT->Lock();
-		*pdwCookie = m_vec.Add(p);
-		hRes = (*pdwCookie != 0) ? ((HRESULT)0x00000000L) : (((SCODE) (((unsigned long)(1)<<31) | ((unsigned long)(4)<<16) | ((unsigned long)(0x0200))) )+1);
-		pT->Unlock();
-		if (hRes != ((HRESULT)0x00000000L))
-			p->Release();
-	}
-	else if (hRes == ((HRESULT)0x80004002L))
-		hRes = (((SCODE) (((unsigned long)(1)<<31) | ((unsigned long)(4)<<16) | ((unsigned long)(0x0200))) )+2);
-	if (((HRESULT)(hRes) < 0))
-		*pdwCookie = 0;
-	return hRes;
-}
-
-template <class T, const IID* piid, class CDV>
-HRESULT __stdcall IConnectionPointImpl<T, piid, CDV>::Unadvise(DWORD dwCookie)
-{
-	T* pT = static_cast<T*>(this);
-	pT->Lock();
-	IUnknown* p = m_vec.GetUnknown(dwCookie);
-	HRESULT hRes = m_vec.Remove(dwCookie) ? ((HRESULT)0x00000000L) : (((SCODE) (((unsigned long)(1)<<31) | ((unsigned long)(4)<<16) | ((unsigned long)(0x0200))) )+0);
-	pT->Unlock();
-	if (hRes == ((HRESULT)0x00000000L) && p != 0)
-		p->Release();
-	return hRes;
-}
-
-#pragma warning(push)
-#pragma warning(disable: 6014 6211)
-template <class T, const IID* piid, class CDV>
-HRESULT __stdcall IConnectionPointImpl<T, piid, CDV>::EnumConnections(
-	IEnumConnections** ppEnum)
-{
-	if (ppEnum == 0)
-		return ((HRESULT)0x80004003L);
-	*ppEnum = 0;
-	CComObject<CComEnumConnections>* pEnum = 0;
-	__pragma(warning(push)) __pragma(warning(disable: 4571)) try{pEnum = new CComObject<CComEnumConnections>;} catch(...) {} __pragma(warning(pop))
-	if (pEnum == 0)
-		return ((HRESULT)0x8007000EL);
-	T* pT = static_cast<T*>(this);
-	pT->Lock();
-	CONNECTDATA* pcd = 0;
-	__pragma(warning(push)) __pragma(warning(disable: 4571)) try{pcd = new CONNECTDATA[m_vec.end()-m_vec.begin()];} catch(...) {} __pragma(warning(pop))
-	if (pcd == 0)
-	{
-		delete pEnum;
-		pT->Unlock();
-		return ((HRESULT)0x8007000EL);
-	}
-	CONNECTDATA* pend = pcd;
-	
-	for (IUnknown** pp = m_vec.begin();pp<m_vec.end();pp++)
-	{
-		if (*pp != 0)
-		{
-			(*pp)->AddRef();
-			pend->pUnk = *pp;
-			pend->dwCookie = m_vec.GetCookie(pp);
-			pend++;
-		}
-	}
-	
-	pEnum->Init(pcd, pend, 0, AtlFlagTakeOwnership);
-	pT->Unlock();
-	HRESULT hRes = pEnum->_InternalQueryInterface(__uuidof(IEnumConnections), (void**)ppEnum);
-	if (((HRESULT)(hRes) < 0))
-		delete pEnum;
-	return hRes;
-}
-#pragma warning(pop)
-
-
-
-
-template <class T>
-class __declspec(novtable) IConnectionPointContainerImpl : public IConnectionPointContainer
-{
-	typedef CComEnum<IEnumConnectionPoints,
-		&__uuidof(IEnumConnectionPoints), IConnectionPoint*,
-		_CopyInterface<IConnectionPoint> >
-		CComEnumConnectionPoints;
-public:
-#pragma warning(push)
-#pragma warning(disable: 6014 6211)
-	virtual HRESULT __stdcall EnumConnectionPoints(IEnumConnectionPoints** ppEnum)
-	{
-		if (ppEnum == 0)
-			return ((HRESULT)0x80004003L);
-		*ppEnum = 0;
-		CComEnumConnectionPoints* pEnum = 0;
-		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{pEnum = new CComObject<CComEnumConnectionPoints>;} catch(...) {} __pragma(warning(pop))
-		if (pEnum == 0)
-			return ((HRESULT)0x8007000EL);
-
-		int nCPCount;
-		const _ATL_CONNMAP_ENTRY* pEntry = T::GetConnMap(&nCPCount);
-
-		
-		ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
-		if ((nCPCount < 0) || (nCPCount > (2147483647 / sizeof(IConnectionPoint*))))
-			return ((HRESULT)0x8007000EL);
-		size_t nBytes=0;
-		HRESULT hr=((HRESULT)0x00000000L);
-		if( ((HRESULT)(hr=::ATL::AtlMultiply(&nBytes, sizeof(IConnectionPoint*), static_cast<size_t>(nCPCount))) < 0))
-		{
-			return hr;
-		}
-		IConnectionPoint** ppCP = (IConnectionPoint**)__pragma(warning(push)) __pragma(warning(disable:4616)) __pragma(warning(disable:6255)) ((nBytes <= 1024 && ATL::_ATL_SAFE_ALLOCA_IMPL::_AtlVerifyStackAvailable(nBytes) ) ? _alloca(nBytes) : _AtlSafeAllocaManager.Allocate(nBytes)) __pragma(warning(pop));
-		if (ppCP == 0)
-		{
-			delete pEnum;
-			return ((HRESULT)0x8007000EL);
-		}
-
-		int i = 0;
-		while (pEntry->dwOffset != (DWORD_PTR)-1)
-		{
-			if (pEntry->dwOffset == (DWORD_PTR)-2)
-			{
-				pEntry++;
-				const _ATL_CONNMAP_ENTRY* (*pFunc)(int*) =  (const _ATL_CONNMAP_ENTRY* (*)(int*))(pEntry->dwOffset);
-				pEntry = pFunc(0);
-				continue;
-			}
-			ppCP[i++] = (IConnectionPoint*)((INT_PTR)this+pEntry->dwOffset);
-			pEntry++;
-		}
-
-		
-		HRESULT hRes = pEnum->Init((IConnectionPoint**)&ppCP[0],
-			(IConnectionPoint**)&ppCP[nCPCount],
-			reinterpret_cast<IConnectionPointContainer*>(this), AtlFlagCopy);
-		if (((HRESULT)(hRes) < 0))
-		{
-			delete pEnum;
-			return hRes;
-		}
-		hRes = pEnum->QueryInterface(__uuidof(IEnumConnectionPoints), (void**)ppEnum);
-		if (((HRESULT)(hRes) < 0))
-			delete pEnum;
-		return hRes;
-	}
-#pragma warning(pop)
-
-	virtual HRESULT __stdcall FindConnectionPoint(const IID & riid, IConnectionPoint** ppCP)
-	{
-		if (ppCP == 0)
-			return ((HRESULT)0x80004003L);
-		*ppCP = 0;
-		HRESULT hRes = (((SCODE) (((unsigned long)(1)<<31) | ((unsigned long)(4)<<16) | ((unsigned long)(0x0200))) )+0);
-		const _ATL_CONNMAP_ENTRY* pEntry = T::GetConnMap(0);
-		IID iid;
-		while (pEntry->dwOffset != (DWORD_PTR)-1)
-		{
-			if (pEntry->dwOffset == (DWORD_PTR)-2)
-			{
-				pEntry++;
-				const _ATL_CONNMAP_ENTRY* (*pFunc)(int*) =  (const _ATL_CONNMAP_ENTRY* (*)(int*))(pEntry->dwOffset);
-				pEntry = pFunc(0);
-				continue;
-			}
-			IConnectionPoint* pCP =
-				(IConnectionPoint*)((INT_PTR)this+pEntry->dwOffset);
-			if (((HRESULT)(pCP->GetConnectionInterface(&iid)) >= 0) &&
-				InlineIsEqualGUID(riid, iid))
-			{
-				*ppCP = pCP;
-				pCP->AddRef();
-				hRes = ((HRESULT)0x00000000L);
-				break;
-			}
-			pEntry++;
-		}
-		return hRes;
-	}
-};
-
-
-
-
-
-
-
-
-
-
-
-template <class T> 
-class IExternalConnectionImpl : public IExternalConnection
-{
-public:
-	IExternalConnectionImpl(void) : m_nStrongLocks(0) {}
-	DWORD __stdcall AddConnection(DWORD extconn, DWORD )
-	{
-		DWORD dw = 0;
-		if (extconn & EXTCONN_STRONG)
-		{
-			dw = T::_ThreadModel::Increment(&m_nStrongLocks);
-			static_cast<T*>(this)->OnAddConnection(dw == 1);
-		}
-		return dw;
-	}
-	DWORD __stdcall ReleaseConnection(DWORD extconn, DWORD , BOOL bLastUnlockReleases)
-	{
-		DWORD dw = 0;
-		if (extconn & EXTCONN_STRONG)
-		{
-			dw = T::_ThreadModel::Decrement(&m_nStrongLocks);
-			static_cast<T*>(this)->OnReleaseConnection(dw == 0, !!bLastUnlockReleases);
-		}
-		return dw;
-	}
-
-	
-	bool DoIHaveAStub() { return m_nStrongLocks != 0; }
-	LONG GetStrongConnectionCount() { return m_nStrongLocks; }
-	
-	void OnAddConnection(bool bThisIsFirstLock) {}
-	void OnReleaseConnection(bool bThisIsLastUnlock, bool bLastUnlockReleases)
-	{
-		if (bThisIsLastUnlock && bLastUnlockReleases)
-			CoDisconnectObject(static_cast<T*>(this)->GetUnknown(), 0);
-	}
-	
-	LONG m_nStrongLocks;
-};
-
-#pragma pack(pop)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}	
-#pragma pack(pop)
-
-
-
-
-
-
-#pragma warning (pop)
-
-
-
-
-
-
-
-
-using namespace ATL;
-
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/IECrossfireInstaller.vdproj b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/IECrossfireInstaller.vdproj
deleted file mode 100644
index 5467fd1..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/IECrossfireInstaller.vdproj
+++ /dev/null
@@ -1,3907 +0,0 @@
-﻿"DeployProject"
-{
-"VSVersion" = "3:800"
-"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}"
-"IsWebType" = "8:FALSE"
-"ProjectName" = "8:IECrossfireInstaller"
-"LanguageId" = "3:1033"
-"CodePage" = "3:1252"
-"UILanguageId" = "3:1033"
-"SccProjectName" = "8:"
-"SccLocalPath" = "8:"
-"SccAuxPath" = "8:"
-"SccProvider" = "8:"
-    "Hierarchy"
-    {
-        "Entry"
-        {
-        "MsmKey" = "8:_08B68589E44940F8B6D40CA08C892114"
-        "OwnerKey" = "8:_UNDEFINED"
-        "MsmSig" = "8:_UNDEFINED"
-        }
-        "Entry"
-        {
-        "MsmKey" = "8:_0C04D36F65A14D88BE7C0F4AD05A2393"
-        "OwnerKey" = "8:_68B2C602B4B448ADBFC58961A342D06B"
-        "MsmSig" = "8:_UNDEFINED"
-        }
-        "Entry"
-        {
-        "MsmKey" = "8:_0C04D36F65A14D88BE7C0F4AD05A2393"
-        "OwnerKey" = "8:_A558BCE26AC6426C9ABA48959A6EB3C6"
-        "MsmSig" = "8:_UNDEFINED"
-        }
-        "Entry"
-        {
-        "MsmKey" = "8:_6802CADBA51445E0826BEBAEA44DA6C0"
-        "OwnerKey" = "8:_68B2C602B4B448ADBFC58961A342D06B"
-        "MsmSig" = "8:_UNDEFINED"
-        }
-        "Entry"
-        {
-        "MsmKey" = "8:_6802CADBA51445E0826BEBAEA44DA6C0"
-        "OwnerKey" = "8:_A558BCE26AC6426C9ABA48959A6EB3C6"
-        "MsmSig" = "8:_UNDEFINED"
-        }
-        "Entry"
-        {
-        "MsmKey" = "8:_68B2C602B4B448ADBFC58961A342D06B"
-        "OwnerKey" = "8:_UNDEFINED"
-        "MsmSig" = "8:_UNDEFINED"
-        }
-        "Entry"
-        {
-        "MsmKey" = "8:_A558BCE26AC6426C9ABA48959A6EB3C6"
-        "OwnerKey" = "8:_UNDEFINED"
-        "MsmSig" = "8:_UNDEFINED"
-        }
-        "Entry"
-        {
-        "MsmKey" = "8:_C3E67FD0862F4535B94CCB13D4B57844"
-        "OwnerKey" = "8:_UNDEFINED"
-        "MsmSig" = "8:_UNDEFINED"
-        }
-    }
-    "Configurations"
-    {
-        "Debug"
-        {
-        "DisplayName" = "8:Debug"
-        "IsDebugOnly" = "11:TRUE"
-        "IsReleaseOnly" = "11:FALSE"
-        "OutputFilename" = "8:Debug\\IECrossfireInstaller.msi"
-        "PackageFilesAs" = "3:2"
-        "PackageFileSize" = "3:-2147483648"
-        "CabType" = "3:1"
-        "Compression" = "3:2"
-        "SignOutput" = "11:FALSE"
-        "CertificateFile" = "8:"
-        "PrivateKeyFile" = "8:"
-        "TimeStampServer" = "8:"
-        "InstallerBootstrapper" = "3:2"
-            "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}"
-            {
-            "Enabled" = "11:TRUE"
-            "PromptEnabled" = "11:TRUE"
-            "PrerequisitesLocation" = "2:1"
-            "Url" = "8:"
-            "ComponentsUrl" = "8:"
-                "Items"
-                {
-                    "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Net.Framework.2.0"
-                    {
-                    "Name" = "8:Microsoft .NET Framework 2.0"
-                    "ProductCode" = "8:Microsoft.Net.Framework.2.0"
-                    }
-                }
-            }
-        }
-        "Release"
-        {
-        "DisplayName" = "8:Release"
-        "IsDebugOnly" = "11:FALSE"
-        "IsReleaseOnly" = "11:TRUE"
-        "OutputFilename" = "8:Release\\IECrossfireInstaller.msi"
-        "PackageFilesAs" = "3:2"
-        "PackageFileSize" = "3:-2147483648"
-        "CabType" = "3:1"
-        "Compression" = "3:2"
-        "SignOutput" = "11:FALSE"
-        "CertificateFile" = "8:"
-        "PrivateKeyFile" = "8:"
-        "TimeStampServer" = "8:"
-        "InstallerBootstrapper" = "3:2"
-            "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}"
-            {
-            "Enabled" = "11:TRUE"
-            "PromptEnabled" = "11:TRUE"
-            "PrerequisitesLocation" = "2:1"
-            "Url" = "8:"
-            "ComponentsUrl" = "8:"
-                "Items"
-                {
-                    "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Net.Framework.2.0"
-                    {
-                    "Name" = "8:Microsoft .NET Framework 2.0"
-                    "ProductCode" = "8:Microsoft.Net.Framework.2.0"
-                    }
-                }
-            }
-        }
-    }
-    "Deployable"
-    {
-        "CustomAction"
-        {
-        }
-        "DefaultFeature"
-        {
-        "Name" = "8:DefaultFeature"
-        "Title" = "8:"
-        "Description" = "8:"
-        }
-        "ExternalPersistence"
-        {
-            "LaunchCondition"
-            {
-            }
-        }
-        "File"
-        {
-            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_08B68589E44940F8B6D40CA08C892114"
-            {
-            "SourcePath" = "8:IECrossfireServerGray.ico"
-            "TargetName" = "8:IECrossfireServerGray.ico"
-            "Tag" = "8:"
-            "Folder" = "8:_F79B3187A2A440AF924ED0481F6F9DA5"
-            "Condition" = "8:"
-            "Transitive" = "11:FALSE"
-            "Vital" = "11:TRUE"
-            "ReadOnly" = "11:FALSE"
-            "Hidden" = "11:FALSE"
-            "System" = "11:FALSE"
-            "Permanent" = "11:FALSE"
-            "SharedLegacy" = "11:FALSE"
-            "PackageAs" = "3:1"
-            "Register" = "3:1"
-            "Exclude" = "11:FALSE"
-            "IsDependency" = "11:FALSE"
-            "IsolateTo" = "8:"
-            }
-            "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_C3E67FD0862F4535B94CCB13D4B57844"
-            {
-            "SourcePath" = "8:IECrossfireServer.ico"
-            "TargetName" = "8:IECrossfireServer.ico"
-            "Tag" = "8:"
-            "Folder" = "8:_F79B3187A2A440AF924ED0481F6F9DA5"
-            "Condition" = "8:"
-            "Transitive" = "11:FALSE"
-            "Vital" = "11:TRUE"
-            "ReadOnly" = "11:FALSE"
-            "Hidden" = "11:FALSE"
-            "System" = "11:FALSE"
-            "Permanent" = "11:FALSE"
-            "SharedLegacy" = "11:FALSE"
-            "PackageAs" = "3:1"
-            "Register" = "3:1"
-            "Exclude" = "11:FALSE"
-            "IsDependency" = "11:FALSE"
-            "IsolateTo" = "8:"
-            }
-        }
-        "FileType"
-        {
-        }
-        "Folder"
-        {
-            "{1525181F-901A-416C-8A58-119130FE478E}:_2B99896331BC47A2B7D2ED9E4C943C77"
-            {
-            "Name" = "8:#1919"
-            "AlwaysCreate" = "11:FALSE"
-            "Condition" = "8:"
-            "Transitive" = "11:FALSE"
-            "Property" = "8:ProgramMenuFolder"
-                "Folders"
-                {
-                }
-            }
-            "{1525181F-901A-416C-8A58-119130FE478E}:_542E65342D844830AF64585A006FF418"
-            {
-            "Name" = "8:#1916"
-            "AlwaysCreate" = "11:FALSE"
-            "Condition" = "8:"
-            "Transitive" = "11:FALSE"
-            "Property" = "8:DesktopFolder"
-                "Folders"
-                {
-                }
-            }
-            "{3C67513D-01DD-4637-8A68-80971EB9504F}:_F79B3187A2A440AF924ED0481F6F9DA5"
-            {
-            "DefaultLocation" = "8:[ProgramFilesFolder][Manufacturer]\\[ProductName]"
-            "Name" = "8:#1925"
-            "AlwaysCreate" = "11:FALSE"
-            "Condition" = "8:"
-            "Transitive" = "11:FALSE"
-            "Property" = "8:TARGETDIR"
-                "Folders"
-                {
-                }
-            }
-        }
-        "LaunchCondition"
-        {
-        }
-        "Locator"
-        {
-        }
-        "MsiBootstrapper"
-        {
-        "LangId" = "3:1033"
-        "RequiresElevation" = "11:FALSE"
-        }
-        "Product"
-        {
-        "Name" = "8:Microsoft Visual Studio"
-        "ProductName" = "8:Crossfire Server for Internet Explorer"
-        "ProductCode" = "8:{8454AEA7-EC58-4709-BFED-85CCB406E206}"
-        "PackageCode" = "8:{A314CFEF-5F02-42F0-99B7-3FAFE478148F}"
-        "UpgradeCode" = "8:{DC2603D4-1885-4F24-B9B6-5EB74FF9D579}"
-        "AspNetVersion" = "8:4.0.30319.0"
-        "RestartWWWService" = "11:FALSE"
-        "RemovePreviousVersions" = "11:TRUE"
-        "DetectNewerInstalledVersion" = "11:TRUE"
-        "InstallAllUsers" = "11:FALSE"
-        "ProductVersion" = "8:1.0.0"
-        "Manufacturer" = "8:Eclipse Foundation"
-        "ARPHELPTELEPHONE" = "8:"
-        "ARPHELPLINK" = "8:"
-        "Title" = "8:Installer for Crossfire Server for Internet Explorer"
-        "Subject" = "8:"
-        "ARPCONTACT" = "8:"
-        "Keywords" = "8:"
-        "ARPCOMMENTS" = "8:Crossfire Server for Internet Explorer"
-        "ARPURLINFOABOUT" = "8:http://www.eclipse.org"
-        "ARPPRODUCTICON" = "8:"
-        "ARPIconIndex" = "3:0"
-        "SearchPath" = "8:"
-        "UseSystemSearchPath" = "11:TRUE"
-        "TargetPlatform" = "3:0"
-        "PreBuildEvent" = "8:"
-        "PostBuildEvent" = "8:"
-        "RunPostBuildEvent" = "3:0"
-        }
-        "Registry"
-        {
-            "HKLM"
-            {
-                "Keys"
-                {
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_DAD57E19B4D94837BEC24C47E0780FE2"
-                    {
-                    "Name" = "8:Software"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:FALSE"
-                    "DeleteAtUninstall" = "11:FALSE"
-                    "Transitive" = "11:FALSE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_E015CE8158BC49CA9EEC2877191F8823"
-                            {
-                            "Name" = "8:Microsoft"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:FALSE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_315AD8477CBB4333BCBC6888B9382F9D"
-                                    {
-                                    "Name" = "8:Windows"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:FALSE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_8D04DC5B33BA47BAA5F0C652EEDB18BC"
-                                            {
-                                            "Name" = "8:CurrentVersion"
-                                            "Condition" = "8:"
-                                            "AlwaysCreate" = "11:FALSE"
-                                            "DeleteAtUninstall" = "11:FALSE"
-                                            "Transitive" = "11:FALSE"
-                                                "Keys"
-                                                {
-                                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_49C46435279940B089A85048E755107F"
-                                                    {
-                                                    "Name" = "8:Explorer"
-                                                    "Condition" = "8:"
-                                                    "AlwaysCreate" = "11:FALSE"
-                                                    "DeleteAtUninstall" = "11:FALSE"
-                                                    "Transitive" = "11:FALSE"
-                                                        "Keys"
-                                                        {
-                                                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_E61E30E047AF477EA9831CF56DF514D1"
-                                                            {
-                                                            "Name" = "8:Browser Helper Objects"
-                                                            "Condition" = "8:"
-                                                            "AlwaysCreate" = "11:FALSE"
-                                                            "DeleteAtUninstall" = "11:FALSE"
-                                                            "Transitive" = "11:FALSE"
-                                                                "Keys"
-                                                                {
-                                                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_F5061C6500A04536B95A16845C74CEF2"
-                                                                    {
-                                                                    "Name" = "8:{E8779887-5AF1-4071-B4D4-6135157F142C}"
-                                                                    "Condition" = "8:"
-                                                                    "AlwaysCreate" = "11:TRUE"
-                                                                    "DeleteAtUninstall" = "11:TRUE"
-                                                                    "Transitive" = "11:FALSE"
-                                                                        "Keys"
-                                                                        {
-                                                                        }
-                                                                        "Values"
-                                                                        {
-                                                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_5DD16C450E4347F591BA8D691DCED3B8"
-                                                                            {
-                                                                            "Name" = "8:NoExplorer"
-                                                                            "Condition" = "8:"
-                                                                            "Transitive" = "11:FALSE"
-                                                                            "ValueTypes" = "3:3"
-                                                                            "Value" = "3:1"
-                                                                            }
-                                                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_AAA485390EAB4AA8A48ACA6BC11222ED"
-                                                                            {
-                                                                            "Name" = "8:"
-                                                                            "Condition" = "8:"
-                                                                            "Transitive" = "11:FALSE"
-                                                                            "ValueTypes" = "3:1"
-                                                                            "Value" = "8:IECrossfireBHO Class"
-                                                                            }
-                                                                        }
-                                                                    }
-                                                                }
-                                                                "Values"
-                                                                {
-                                                                }
-                                                            }
-                                                        }
-                                                        "Values"
-                                                        {
-                                                        }
-                                                    }
-                                                }
-                                                "Values"
-                                                {
-                                                }
-                                            }
-                                        }
-                                        "Values"
-                                        {
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_D7792EB7943E479BB2CEC1FDAF5BC775"
-                                    {
-                                    "Name" = "8:Internet Explorer"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:FALSE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_EFBD8933842748E8B8571446AFE1750E"
-                                            {
-                                            "Name" = "8:Extensions"
-                                            "Condition" = "8:"
-                                            "AlwaysCreate" = "11:FALSE"
-                                            "DeleteAtUninstall" = "11:FALSE"
-                                            "Transitive" = "11:FALSE"
-                                                "Keys"
-                                                {
-                                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_029DE52FFF634B2D8AA598218D378247"
-                                                    {
-                                                    "Name" = "8:{E29302FD-539F-44a8-B457-D2DE7C65C7AE}"
-                                                    "Condition" = "8:"
-                                                    "AlwaysCreate" = "11:TRUE"
-                                                    "DeleteAtUninstall" = "11:TRUE"
-                                                    "Transitive" = "11:FALSE"
-                                                        "Keys"
-                                                        {
-                                                        }
-                                                        "Values"
-                                                        {
-                                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_3150B8E0C8C342A9B7E270418F1FD2E4"
-                                                            {
-                                                            "Name" = "8:BandCLSID"
-                                                            "Condition" = "8:"
-                                                            "Transitive" = "11:FALSE"
-                                                            "ValueTypes" = "3:1"
-                                                            "Value" = "8:{34EF57F8-9295-483E-B656-4EE154B0B3A5}"
-                                                            }
-                                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_32B490DE03604FAD8E73FD83DE696F3F"
-                                                            {
-                                                            "Name" = "8:HotIcon"
-                                                            "Condition" = "8:"
-                                                            "Transitive" = "11:FALSE"
-                                                            "ValueTypes" = "3:1"
-                                                            "Value" = "8:\"[TARGETDIR]IECrossfireServer.ico\""
-                                                            }
-                                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_3E4A829B157C4BF28F7E1C16C92E48EA"
-                                                            {
-                                                            "Name" = "8:Icon"
-                                                            "Condition" = "8:"
-                                                            "Transitive" = "11:FALSE"
-                                                            "ValueTypes" = "3:1"
-                                                            "Value" = "8:\"[TARGETDIR]IECrossfireServer.ico\""
-                                                            }
-                                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_8CE8ADBA6DB64E569C66886024E48551"
-                                                            {
-                                                            "Name" = "8:ButtonText"
-                                                            "Condition" = "8:"
-                                                            "Transitive" = "11:FALSE"
-                                                            "ValueTypes" = "3:1"
-                                                            "Value" = "8:Show/Hide Crossfire Server Panel"
-                                                            }
-                                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_C6512E4667BD4EC7BB9B9E266B1F1361"
-                                                            {
-                                                            "Name" = "8:CLSID"
-                                                            "Condition" = "8:"
-                                                            "Transitive" = "11:FALSE"
-                                                            "ValueTypes" = "3:1"
-                                                            "Value" = "8:{E0DD6CAB-2D10-11D2-8F1A-0000F87ABD16}"
-                                                            }
-                                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_F6B91120C40D44D799EE40A98968F240"
-                                                            {
-                                                            "Name" = "8:Default Visible"
-                                                            "Condition" = "8:"
-                                                            "Transitive" = "11:FALSE"
-                                                            "ValueTypes" = "3:1"
-                                                            "Value" = "8:Yes"
-                                                            }
-                                                        }
-                                                    }
-                                                }
-                                                "Values"
-                                                {
-                                                }
-                                            }
-                                        }
-                                        "Values"
-                                        {
-                                        }
-                                    }
-                                }
-                                "Values"
-                                {
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                        }
-                    }
-                }
-            }
-            "HKCU"
-            {
-                "Keys"
-                {
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_E858098B1B9147569EDBB0F4EC74444D"
-                    {
-                    "Name" = "8:Software"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:FALSE"
-                    "DeleteAtUninstall" = "11:FALSE"
-                    "Transitive" = "11:FALSE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_2F3AEF3F794C4C67A61D12DF97E1759A"
-                            {
-                            "Name" = "8:Microsoft"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:FALSE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_AE9DEA889E9F4AE195EB5294AE73D097"
-                                    {
-                                    "Name" = "8:Windows"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:FALSE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_50B7C19E6D834C378F963ED202DA1131"
-                                            {
-                                            "Name" = "8:CurrentVersion"
-                                            "Condition" = "8:"
-                                            "AlwaysCreate" = "11:FALSE"
-                                            "DeleteAtUninstall" = "11:FALSE"
-                                            "Transitive" = "11:FALSE"
-                                                "Keys"
-                                                {
-                                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_97190513B53C4B7AAB9E49FB208835BE"
-                                                    {
-                                                    "Name" = "8:Explorer"
-                                                    "Condition" = "8:"
-                                                    "AlwaysCreate" = "11:FALSE"
-                                                    "DeleteAtUninstall" = "11:FALSE"
-                                                    "Transitive" = "11:FALSE"
-                                                        "Keys"
-                                                        {
-                                                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_0D55B0F7937A49488B230E65E9FD5E07"
-                                                            {
-                                                            "Name" = "8:Discardable"
-                                                            "Condition" = "8:"
-                                                            "AlwaysCreate" = "11:FALSE"
-                                                            "DeleteAtUninstall" = "11:FALSE"
-                                                            "Transitive" = "11:FALSE"
-                                                                "Keys"
-                                                                {
-                                                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_E6E1AAF4D20544D6847892A15C4E00CC"
-                                                                    {
-                                                                    "Name" = "8:PostSetup"
-                                                                    "Condition" = "8:"
-                                                                    "AlwaysCreate" = "11:FALSE"
-                                                                    "DeleteAtUninstall" = "11:FALSE"
-                                                                    "Transitive" = "11:FALSE"
-                                                                        "Keys"
-                                                                        {
-                                                                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_1DB1B6C8A6364AD48CC5AC68F8D7E25F"
-                                                                            {
-                                                                            "Name" = "8:Component Categories"
-                                                                            "Condition" = "8:"
-                                                                            "AlwaysCreate" = "11:FALSE"
-                                                                            "DeleteAtUninstall" = "11:FALSE"
-                                                                            "Transitive" = "11:FALSE"
-                                                                                "Keys"
-                                                                                {
-                                                                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_C4F0A50511CD4E92AC51E713136DBB2E"
-                                                                                    {
-                                                                                    "Name" = "8:{00021494-0000-0000-C000-000000000046}"
-                                                                                    "Condition" = "8:"
-                                                                                    "AlwaysCreate" = "11:TRUE"
-                                                                                    "DeleteAtUninstall" = "11:FALSE"
-                                                                                    "Transitive" = "11:FALSE"
-                                                                                        "Keys"
-                                                                                        {
-                                                                                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_EFFC1C1D1D3C4B4ABB1121E2223C91F4"
-                                                                                            {
-                                                                                            "Name" = "8:Enum"
-                                                                                            "Condition" = "8:"
-                                                                                            "AlwaysCreate" = "11:TRUE"
-                                                                                            "DeleteAtUninstall" = "11:TRUE"
-                                                                                            "Transitive" = "11:FALSE"
-                                                                                                "Keys"
-                                                                                                {
-                                                                                                }
-                                                                                                "Values"
-                                                                                                {
-                                                                                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_2ADC357EAEF840E688E8CBD2E558E426"
-                                                                                                    {
-                                                                                                    "Name" = "8:Implementing"
-                                                                                                    "Condition" = "8:"
-                                                                                                    "Transitive" = "11:FALSE"
-                                                                                                    "ValueTypes" = "3:1"
-                                                                                                    "Value" = "8:"
-                                                                                                    }
-                                                                                                }
-                                                                                            }
-                                                                                        }
-                                                                                        "Values"
-                                                                                        {
-                                                                                        }
-                                                                                    }
-                                                                                }
-                                                                                "Values"
-                                                                                {
-                                                                                }
-                                                                            }
-                                                                        }
-                                                                        "Values"
-                                                                        {
-                                                                        }
-                                                                    }
-                                                                }
-                                                                "Values"
-                                                                {
-                                                                }
-                                                            }
-                                                        }
-                                                        "Values"
-                                                        {
-                                                        }
-                                                    }
-                                                }
-                                                "Values"
-                                                {
-                                                }
-                                            }
-                                        }
-                                        "Values"
-                                        {
-                                        }
-                                    }
-                                }
-                                "Values"
-                                {
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                        }
-                    }
-                }
-            }
-            "HKCR"
-            {
-                "Keys"
-                {
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_032C027743C84BD1AD96D8A81D6FCA8D"
-                    {
-                    "Name" = "8:IECrossfireServer.IEDebugger.1"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:TRUE"
-                    "DeleteAtUninstall" = "11:TRUE"
-                    "Transitive" = "11:FALSE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_F6923631966F48B9AC2A9AFA67469371"
-                            {
-                            "Name" = "8:CLSID"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_3642AA9787644AE49E976F940F0E3C1D"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{B63BD92F-6C66-4AB2-A243-D5AFCCF4B587}"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_16380981ACEA46229F522133AB0EE67C"
-                            {
-                            "Name" = "8:"
-                            "Condition" = "8:"
-                            "Transitive" = "11:FALSE"
-                            "ValueTypes" = "3:1"
-                            "Value" = "8:IEDebugger Class"
-                            }
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_1B40BB5E02124FF9B6F955FBB96A8D50"
-                    {
-                    "Name" = "8:IECrossfireExtension.IECrossfireBHO.1"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:TRUE"
-                    "DeleteAtUninstall" = "11:TRUE"
-                    "Transitive" = "11:FALSE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_18F7A680CA16491A8064827E25FB02C9"
-                            {
-                            "Name" = "8:CLSID"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_677A45EB24774D4BB4CB205925DFB276"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{E8779887-5AF1-4071-B4D4-6135157F142C}"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_7867E4C0E8194250B1C5A36E252C1B33"
-                            {
-                            "Name" = "8:"
-                            "Condition" = "8:"
-                            "Transitive" = "11:FALSE"
-                            "ValueTypes" = "3:1"
-                            "Value" = "8:IECrossfireBHO Class"
-                            }
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_201BA65CA2D04E84BBA80B1AB07918D4"
-                    {
-                    "Name" = "8:Interface"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:FALSE"
-                    "DeleteAtUninstall" = "11:FALSE"
-                    "Transitive" = "11:FALSE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_586ACAD3A1594C87ACD7416296E90DFC"
-                            {
-                            "Name" = "8:{201244D7-94C6-4FB0-9948-2634523A475B}"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:TRUE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_3F942CAFDD9D4A888FCBE34387368FF5"
-                                    {
-                                    "Name" = "8:ProxyStubClsid"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_2223B9C734BB4A36BEF4CB186A2A3591"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{00020424-0000-0000-C000-000000000046}"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_8F3B48039E53497A92F246F8F1179CFB"
-                                    {
-                                    "Name" = "8:ProxyStubClsid32"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_AB2F40363E024BEC983CCCB32D7567FA"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{00020424-0000-0000-C000-000000000046}"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_E8A1825CB55B427E84178B6B120C0806"
-                                    {
-                                    "Name" = "8:TypeLib"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_9E8314CF080A4BF3AD160772324366CC"
-                                            {
-                                            "Name" = "8:Version"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:1.0"
-                                            }
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_D7ECCF6A14A944C58FAA444DED9B87A2"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}"
-                                            }
-                                        }
-                                    }
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_7CB92D303947478EABBF9D8E073A84ED"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:IIECrossfireBHO"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_69F8C77F401D4CF58256BE7BD57F3741"
-                            {
-                            "Name" = "8:{031DB015-B1BE-4D39-84D2-D7F96D2ACBFE}"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:TRUE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_14A187CB0EF34A30AAABEC3814BC45E7"
-                                    {
-                                    "Name" = "8:TypeLib"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_666E886651754ABEAD71A6678A677CFF"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}"
-                                            }
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_F455E0ABAC8542CD8969ED4D3A95E39B"
-                                            {
-                                            "Name" = "8:Version"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:1.0"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_C316A5011DAA408BB57E52E288127322"
-                                    {
-                                    "Name" = "8:ProxyStubClsid32"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_E690399F120A48B3872778A8E04DF89A"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{00020424-0000-0000-C000-000000000046}"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_F42FE6E4046A4226823CF1AF1E833CD3"
-                                    {
-                                    "Name" = "8:ProxyStubClsid"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_4F7BE565007D4FC6920C17E8188830B0"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{00020424-0000-0000-C000-000000000046}"
-                                            }
-                                        }
-                                    }
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_82736A1D9B7C4091B96DA58692F3A215"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:ICrossfireServer"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_89543F6C86D5492D9131A7300AB39A4C"
-                            {
-                            "Name" = "8:{E4121804-5350-4DDD-BE57-9C5B2A13EA29}"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:FALSE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_910A4618535145FFA865DC6F399E7914"
-                                    {
-                                    "Name" = "8:TypeLib"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:FALSE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_7434CB194D544D45BA1B9239D2245670"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}"
-                                            }
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_7E8A48C0CE254FFF920922FB38B78966"
-                                            {
-                                            "Name" = "8:Version"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:1.0"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_B7170CC5D76143F69030E4D91BD7BAF2"
-                                    {
-                                    "Name" = "8:ProxyStubClsid"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:FALSE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_826C8BEEE3864EC9A9A5BE4F92C82C27"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{00020424-0000-0000-C000-000000000046}"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_FF825DF4C75A465F9C545783FF320D6D"
-                                    {
-                                    "Name" = "8:ProxyStubClsid32"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:FALSE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_D1ECEA64B21649698E8E25890FB24842"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{00020424-0000-0000-C000-000000000046}"
-                                            }
-                                        }
-                                    }
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_7FE5E781251E419AA5B9BFB7F4401263"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:IBrowserContext"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_CB5D4686903A45D599D3B00F95A695BC"
-                            {
-                            "Name" = "8:{F48260BB-C061-4410-9CE1-4C5C7602690E}"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:TRUE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_21BBEDAE31E943E698C8C45DA043ACF7"
-                                    {
-                                    "Name" = "8:TypeLib"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_58B3B11A66DD47929A68B223F6B26217"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}"
-                                            }
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_6D4D7E96CF374E618A3F0F087BAF1869"
-                                            {
-                                            "Name" = "8:Version"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:1.0"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_3C40A9300C924465A845622F699B9323"
-                                    {
-                                    "Name" = "8:ProxyStubClsid32"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_2D06E6FDB72C4C0B998046E21BB0388F"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{00020424-0000-0000-C000-000000000046}"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_58B8704566E541F49CDAD7753EE275FF"
-                                    {
-                                    "Name" = "8:ProxyStubClsid"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_558F2CA7E27B4E75A7D97578534E5303"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{00020424-0000-0000-C000-000000000046}"
-                                            }
-                                        }
-                                    }
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_41DC2F33923E43BC8EC6F1D28CA5DE1A"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:ICrossfireServerClass"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_F7E064D187904527A1ABDB34EF0AEBD1"
-                            {
-                            "Name" = "8:{31DC44C3-7C98-4737-8D62-0E78FCCC503D}"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:FALSE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_2D3F710A45A1434F93A92412A702472A"
-                                    {
-                                    "Name" = "8:ProxyStubClsid32"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:FALSE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_340155EB426647BD98AA10A123DC345E"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{00020424-0000-0000-C000-000000000046}"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_556A0DE2229E473699BE51B5745373F2"
-                                    {
-                                    "Name" = "8:ProxyStubClsid"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:FALSE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_0C6C99C3E52849CB9A64E0B2B4964173"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{00020424-0000-0000-C000-000000000046}"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_9285E9BFC18F4622B37D37EA44AFAD0D"
-                                    {
-                                    "Name" = "8:TypeLib"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:FALSE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_57BF5E56729C4ABDAF9927D8314D1661"
-                                            {
-                                            "Name" = "8:Version"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:1.0"
-                                            }
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_B55872EF6DF54498B908ED6C6CAF878D"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}"
-                                            }
-                                        }
-                                    }
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_40E1972E828F460A85C2A7C390B9B354"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:IJSEvalCallback2"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_2D25E30548D542F4B33AE6F44BABCBD1"
-                    {
-                    "Name" = "8:IECrossfireServer.BrowserContext.1"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:TRUE"
-                    "DeleteAtUninstall" = "11:TRUE"
-                    "Transitive" = "11:FALSE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_A4755051F9B94879AD6361D3A1308374"
-                            {
-                            "Name" = "8:CLSID"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_5F293AAD63564BCBBC9DA0535905DD42"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{2FA65B09-5063-45FA-91F9-50EB7F4AF2C6}"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_6EECB0140A9A4EA2B47F3FD58857401D"
-                            {
-                            "Name" = "8:"
-                            "Condition" = "8:"
-                            "Transitive" = "11:FALSE"
-                            "ValueTypes" = "3:1"
-                            "Value" = "8:BrowserContext Class"
-                            }
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_38003254C8CB4ED4AE5E87F366DE40CC"
-                    {
-                    "Name" = "8:IECrossfireServer.JSEvalCallback.1"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:TRUE"
-                    "DeleteAtUninstall" = "11:TRUE"
-                    "Transitive" = "11:FALSE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_45BB10C8BC1B4D50A875CE0651226460"
-                            {
-                            "Name" = "8:CLSID"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_A6DA5E07BBE645098CEFA45FBDE68330"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{4EC15DD3-9E2F-43A7-A686-3FA90E22ABB7}"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_AF3B2A5FB2F84F30B14A80A13B09D155"
-                            {
-                            "Name" = "8:"
-                            "Condition" = "8:"
-                            "Transitive" = "11:FALSE"
-                            "ValueTypes" = "3:1"
-                            "Value" = "8:JSEvalCallback Class"
-                            }
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_3A0001E14F77457785324A1075F632C9"
-                    {
-                    "Name" = "8:AppID"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:FALSE"
-                    "DeleteAtUninstall" = "11:FALSE"
-                    "Transitive" = "11:FALSE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_8C597E49BD764B57871896D532789B4F"
-                            {
-                            "Name" = "8:IECrossfireServer.EXE"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:TRUE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_C5D5F21E1A0B40BD917C309BA53D4C17"
-                                    {
-                                    "Name" = "8:AppID"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{1B6AA6D6-25AC-4994-9431-AC0DFC85654D}"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_9D815AE40851488D933CAB2C97552870"
-                            {
-                            "Name" = "8:IECrossfireExtension.DLL"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:TRUE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_DBD499F663D54BCBBF87F0574AB49082"
-                                    {
-                                    "Name" = "8:AppID"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{95F1ADFB-5440-462c-BAA3-9C068F1B1450}"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_B738DD8B0C3C463B81F1406E380A4F59"
-                            {
-                            "Name" = "8:{1B6AA6D6-25AC-4994-9431-AC0DFC85654D}"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:TRUE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_97E56B48558E427F96BC5D3CA6EBCF89"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:IECrossfireServer"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_DAB88FE1790C498BAFDF54934FC0D426"
-                            {
-                            "Name" = "8:{95F1ADFB-5440-462c-BAA3-9C068F1B1450}"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:TRUE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_A5AB7052E33F4D9E80E1A965AB105BF8"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:IECrossfireExtension"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_435131B7C7864453A3B2156B121EBF44"
-                    {
-                    "Name" = "8:IECrossfireServer.CrossfireServerClass"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:TRUE"
-                    "DeleteAtUninstall" = "11:TRUE"
-                    "Transitive" = "11:FALSE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_ACA905BC774247AB9B28A80AB2BB829A"
-                            {
-                            "Name" = "8:CLSID"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_4E073EBBC6DA431AA0196B77663A839C"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{7C3C5D7A-AF4D-4F32-A3C9-462BFBAFDC25}"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_FCDF0E884414407A804EA28A1D8DDE8F"
-                            {
-                            "Name" = "8:CurVer"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_387AC8239F894A439A928F48C48F1A9A"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:IECrossfireServer.CrossfireServerClass.1"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_1B2CEEFA6D2C4ED48E43882AB863032D"
-                            {
-                            "Name" = "8:"
-                            "Condition" = "8:"
-                            "Transitive" = "11:FALSE"
-                            "ValueTypes" = "3:1"
-                            "Value" = "8:CrossfireServerClass Class"
-                            }
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_4DBD5710896B42C6AD40813839348AA9"
-                    {
-                    "Name" = "8:TypeLib"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:FALSE"
-                    "DeleteAtUninstall" = "11:FALSE"
-                    "Transitive" = "11:FALSE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_E1E9244ED8E248A7B646818FD25DAFE1"
-                            {
-                            "Name" = "8:{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:FALSE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_10E18DDC7BDA4F0EB8B3AF65D13FD904"
-                                    {
-                                    "Name" = "8:1.0"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:FALSE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_01A2D6B4825E455EB6C299D147D16760"
-                                            {
-                                            "Name" = "8:0"
-                                            "Condition" = "8:"
-                                            "AlwaysCreate" = "11:FALSE"
-                                            "DeleteAtUninstall" = "11:FALSE"
-                                            "Transitive" = "11:FALSE"
-                                                "Keys"
-                                                {
-                                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_8E23A73E574A4BC9B41F095BBD84FEB8"
-                                                    {
-                                                    "Name" = "8:win32"
-                                                    "Condition" = "8:"
-                                                    "AlwaysCreate" = "11:FALSE"
-                                                    "DeleteAtUninstall" = "11:FALSE"
-                                                    "Transitive" = "11:FALSE"
-                                                        "Keys"
-                                                        {
-                                                        }
-                                                        "Values"
-                                                        {
-                                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_56F3CC3492694A6DACED48A48384BF8E"
-                                                            {
-                                                            "Name" = "8:"
-                                                            "Condition" = "8:"
-                                                            "Transitive" = "11:FALSE"
-                                                            "ValueTypes" = "3:1"
-                                                            "Value" = "8:[TARGETDIR]IECrossfireExtension.dll"
-                                                            }
-                                                        }
-                                                    }
-                                                }
-                                                "Values"
-                                                {
-                                                }
-                                            }
-                                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_944452F0FE714EB880EDBA6C65CD412C"
-                                            {
-                                            "Name" = "8:HELPDIR"
-                                            "Condition" = "8:"
-                                            "AlwaysCreate" = "11:FALSE"
-                                            "DeleteAtUninstall" = "11:FALSE"
-                                            "Transitive" = "11:FALSE"
-                                                "Keys"
-                                                {
-                                                }
-                                                "Values"
-                                                {
-                                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_E03A865A7DF14A0F80574FC790ABB677"
-                                                    {
-                                                    "Name" = "8:"
-                                                    "Condition" = "8:"
-                                                    "Transitive" = "11:FALSE"
-                                                    "ValueTypes" = "3:1"
-                                                    "Value" = "8:"
-                                                    }
-                                                }
-                                            }
-                                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_BCF40615466D466D8EE618167D64ACAA"
-                                            {
-                                            "Name" = "8:FLAGS"
-                                            "Condition" = "8:"
-                                            "AlwaysCreate" = "11:FALSE"
-                                            "DeleteAtUninstall" = "11:FALSE"
-                                            "Transitive" = "11:FALSE"
-                                                "Keys"
-                                                {
-                                                }
-                                                "Values"
-                                                {
-                                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_4DC6FB535C764BE8826AD1B03A51CFB6"
-                                                    {
-                                                    "Name" = "8:"
-                                                    "Condition" = "8:"
-                                                    "Transitive" = "11:FALSE"
-                                                    "ValueTypes" = "3:1"
-                                                    "Value" = "8:0"
-                                                    }
-                                                }
-                                            }
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_191A3CC7B04C4FF3ADC9AD697DAF205A"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:IECrossfireExtension 1.0 Type Library"
-                                            }
-                                        }
-                                    }
-                                }
-                                "Values"
-                                {
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_529DF02296EB412E999A4FF767FA88D7"
-                    {
-                    "Name" = "8:IECrossfireServer.CrossfireServer"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:TRUE"
-                    "DeleteAtUninstall" = "11:TRUE"
-                    "Transitive" = "11:FALSE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_4D6C36184DB440DCA6DEE15F79103F06"
-                            {
-                            "Name" = "8:CurVer"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_7FBC4B2CE01C4DB3A25F58344A0A82A4"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:IECrossfireServer.CrossfireServer.1"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_DADD0BAFEB3046B694230EBEEADE32F9"
-                            {
-                            "Name" = "8:CLSID"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_757265130B374C9488D84CE3772B0D11"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{47836AF4-3E0C-4995-8029-FF931C5A43FC}"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_5531174EBB4D4E2A8035BEB2361EBFA9"
-                            {
-                            "Name" = "8:"
-                            "Condition" = "8:"
-                            "Transitive" = "11:FALSE"
-                            "ValueTypes" = "3:1"
-                            "Value" = "8:CrossfireServer Class"
-                            }
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_83ACD655F8154369B627E99E631C0A4D"
-                    {
-                    "Name" = "8:IECrossfireServer.JSEvalCallback"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:TRUE"
-                    "DeleteAtUninstall" = "11:TRUE"
-                    "Transitive" = "11:FALSE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_74B4BD3F62174A3C8A13E1A839EF4CC7"
-                            {
-                            "Name" = "8:CurVer"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_2750135FD2284B178177C21EFDB90375"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:IECrossfireServer.JSEvalCallback.1"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_D7BFC80626BE44E2BA0655DE1CA9EBBB"
-                            {
-                            "Name" = "8:CLSID"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_3F8F6D5A101841AC92FE28CBD1FE23D4"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{4EC15DD3-9E2F-43A7-A686-3FA90E22ABB7}"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_06E13A0FF629482888AC5C70A9776BA6"
-                            {
-                            "Name" = "8:"
-                            "Condition" = "8:"
-                            "Transitive" = "11:FALSE"
-                            "ValueTypes" = "3:1"
-                            "Value" = "8:JSEvalCallback Class"
-                            }
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_86C56E9F48C04E8BB4DF5D08AABF908E"
-                    {
-                    "Name" = "8:IECrossfireServer.PendingBreakpoint"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:TRUE"
-                    "DeleteAtUninstall" = "11:TRUE"
-                    "Transitive" = "11:FALSE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_9DC841FA63A74F71BF1BF15EC5BFDB4D"
-                            {
-                            "Name" = "8:CurVer"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_DAB080C6ECBA446BBF6101639A8CFCB4"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:IECrossfireServer.PendingBreakpoint.1"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_F8D91A61C79649C5B5CFA1EC7AB27D53"
-                            {
-                            "Name" = "8:CLSID"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_A57BA27E0EE44032BFB4AB3C4526E27F"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{88E7C480-7B7A-47C5-8329-CE1FDF415527}"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_A7B4878C249541E58FD74135F2052A8E"
-                            {
-                            "Name" = "8:"
-                            "Condition" = "8:"
-                            "Transitive" = "11:FALSE"
-                            "ValueTypes" = "3:1"
-                            "Value" = "8:PendingBreakpoint Class"
-                            }
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_8960DC4205BE4176AFDF0FC8C925A61F"
-                    {
-                    "Name" = "8:IECrossfireExtension.ExplorerBar.1"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:TRUE"
-                    "DeleteAtUninstall" = "11:TRUE"
-                    "Transitive" = "11:FALSE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_78AC67DBD4E74F26AB8C0AD3BBE438F6"
-                            {
-                            "Name" = "8:CLSID"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_561C7A44927E4210ABF83AFBBDDA66C2"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{34EF57F8-9295-483E-B656-4EE154B0B3A5}"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_8E01A0423B694523BB58138B59E6A8AD"
-                            {
-                            "Name" = "8:"
-                            "Condition" = "8:"
-                            "Transitive" = "11:FALSE"
-                            "ValueTypes" = "3:1"
-                            "Value" = "8:ExplorerBar Class"
-                            }
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_A05AF1F3CE414E8EB045203FD6083127"
-                    {
-                    "Name" = "8:IECrossfireExtension.IECrossfireBHO"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:TRUE"
-                    "DeleteAtUninstall" = "11:TRUE"
-                    "Transitive" = "11:FALSE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_9FA71E4D5DE34DAD9F570EAF455ED0DB"
-                            {
-                            "Name" = "8:CurVer"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_0C2CBA7ABE8D45A3B066973B117FC480"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:IECrossfireExtension.IECrossfireBHO.1"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_D336456A386240B9A9C7DEA8D1599F08"
-                            {
-                            "Name" = "8:CLSID"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_E07F0A58052247F48DD3376D0C722A9E"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{E8779887-5AF1-4071-B4D4-6135157F142C}"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_3B62D1B47E014B258923D69092C54D7C"
-                            {
-                            "Name" = "8:"
-                            "Condition" = "8:"
-                            "Transitive" = "11:FALSE"
-                            "ValueTypes" = "3:1"
-                            "Value" = "8:IECrossfireBHO Class"
-                            }
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_AC1D202289004B97AD0C60F99AB421F0"
-                    {
-                    "Name" = "8:IECrossfireServer.CrossfireServer.1"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:TRUE"
-                    "DeleteAtUninstall" = "11:TRUE"
-                    "Transitive" = "11:FALSE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_2E3DED797B0540E9AA2C0C0992FFE8B5"
-                            {
-                            "Name" = "8:CLSID"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_5087D77413B445CD9A0B9C88C179D86B"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{47836AF4-3E0C-4995-8029-FF931C5A43FC}"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_C8F7BAD6F92A4F7080E5EE05FF2113D2"
-                            {
-                            "Name" = "8:"
-                            "Condition" = "8:"
-                            "Transitive" = "11:FALSE"
-                            "ValueTypes" = "3:1"
-                            "Value" = "8:CrossfireServer Class"
-                            }
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_C4C8A656186E4FF09119160B0E7F558A"
-                    {
-                    "Name" = "8:CLSID"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:FALSE"
-                    "DeleteAtUninstall" = "11:FALSE"
-                    "Transitive" = "11:FALSE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_148973BAFDA646AD978B7F48BC23F076"
-                            {
-                            "Name" = "8:{34EF57F8-9295-483E-B656-4EE154B0B3A5}"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:TRUE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_674E61BFA8224C96AF11A77291ECD44F"
-                                    {
-                                    "Name" = "8:VersionIndependentProgID"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_2C1CEA400BA9465896B06541C124C6F0"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:IECrossfireExtension.ExplorerBar"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_CDA3869C920848A99A73F553EE97043B"
-                                    {
-                                    "Name" = "8:InProcServer32"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_5DBF7243F6B340FB80BA132FF92BBDD7"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:\"[TARGETDIR]IECrossfireExtension.dll\""
-                                            }
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_8D0049393DD84C69B3AED852B6A6888C"
-                                            {
-                                            "Name" = "8:ThreadingModel"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:Apartment"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_D0BE4C6074704E7AAAEBB3BD424F6B35"
-                                    {
-                                    "Name" = "8:ProgID"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_47A95C86274B4480B4292893B1FAE346"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:IECrossfireExtension.ExplorerBar.1"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_E65FEDA5DFEA48E1A69FB87F2D6F1D31"
-                                    {
-                                    "Name" = "8:TypeLib"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_CA571F541C8A48D9ABEF8552D19AF384"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_EA4C8E2970E246A4816B023EFE4A8CE9"
-                                    {
-                                    "Name" = "8:Implemented Categories"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_34578DA9CB174A679F04813CFFB3BB4F"
-                                            {
-                                            "Name" = "8:{00021494-0000-0000-C000-000000000046}"
-                                            "Condition" = "8:"
-                                            "AlwaysCreate" = "11:TRUE"
-                                            "DeleteAtUninstall" = "11:FALSE"
-                                            "Transitive" = "11:FALSE"
-                                                "Keys"
-                                                {
-                                                }
-                                                "Values"
-                                                {
-                                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_1BCB524A0FC046FB8B12AD4AB4849B40"
-                                                    {
-                                                    "Name" = "8:"
-                                                    "Condition" = "8:"
-                                                    "Transitive" = "11:FALSE"
-                                                    "ValueTypes" = "3:1"
-                                                    "Value" = "8:"
-                                                    }
-                                                }
-                                            }
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_A5953A6E3B914DF38BDF3080C5E7EB70"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:"
-                                            }
-                                        }
-                                    }
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_6213E46F1B914A1E95F1CFA63FA1B495"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:Crossfire Server Panel"
-                                    }
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_A0FFC2D61F2D46ED9BEB77E61BC510A3"
-                                    {
-                                    "Name" = "8:AppID"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{95F1ADFB-5440-462c-BAA3-9C068F1B1450}"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_2189685375BB4906B9EDD07522F45C93"
-                            {
-                            "Name" = "8:{E8779887-5AF1-4071-B4D4-6135157F142C}"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:TRUE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_29D2515DF67F4AAEB9B625A996D1BBF5"
-                                    {
-                                    "Name" = "8:ProgID"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_5D7424E813B246ABB975203C59AAE93E"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:IECrossfireExtension.IECrossfireBHO.1"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_3E29680E7B1F4D13879221993539367F"
-                                    {
-                                    "Name" = "8:VersionIndependentProgID"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_93E6B19383134D2D8BE8A5667D49C3D4"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:IECrossfireExtension.IECrossfireBHO"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_98E1EBDD2DF34A3DB17242CC264940E2"
-                                    {
-                                    "Name" = "8:TypeLib"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_17F246F05C8246208876894BD173E40E"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{3FE86E35-0025-45C7-A841-E10AFE660A7F}"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_E871087D818A40BEA65E10E886555449"
-                                    {
-                                    "Name" = "8:InprocServer32"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_ABB5045D832E4DF1BAE3C399CD87EE7A"
-                                            {
-                                            "Name" = "8:ThreadingModel"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:Apartment"
-                                            }
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_CD4CF6476714454E826CFF89017924C9"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:\"[TARGETDIR]IECrossfireExtension.dll\""
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_EE4B1D30809140E5A880B836B6F55E35"
-                                    {
-                                    "Name" = "8:Programmable"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_ADF6497B9A2547CBBD130083FF18EDA4"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:"
-                                            }
-                                        }
-                                    }
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_2CBA68ED52344E278012A8639D2FA855"
-                                    {
-                                    "Name" = "8:AppID"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:"
-                                    }
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_F063353B630D41D799D694138C168263"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:IECrossfireBHO Class"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_31FE7680CCAD496880BA404E46BC9342"
-                            {
-                            "Name" = "8:{2FA65B09-5063-45FA-91F9-50EB7F4AF2C6}"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:TRUE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_197AD18B2A564CD6A8ECB3E268B0E963"
-                                    {
-                                    "Name" = "8:LocalServer32"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_5ABF12C6BE6C4EB2AEAA812956621F09"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:\"[TARGETDIR]IECrossfireServer.exe\""
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_45BC9F0647A64FB8A3F2E14880C1541E"
-                                    {
-                                    "Name" = "8:TypeLib"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_60FF0374CD404B9280D596038401FE03"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_78D0DCE7F1C042A5A0E9AB4E61D9C69A"
-                                    {
-                                    "Name" = "8:VersionIndependentProgID"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_FC3EAF39D5B44ACAA9502C5774C52B20"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:IECrossfireServer.BrowserContext"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_D6F8F18B650241BDB24C1F70C6C10C54"
-                                    {
-                                    "Name" = "8:ProgID"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_199676408CE241C1AA90E264D359BE87"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:IECrossfireServer.BrowserContext.1"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_E5259319E3E74B829935D115549B31CD"
-                                    {
-                                    "Name" = "8:Programmable"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                        }
-                                    }
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_1210728149C24013ABF07FD109B51E00"
-                                    {
-                                    "Name" = "8:AppID"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{1B6AA6D6-25AC-4994-9431-AC0DFC85654D}"
-                                    }
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_5ACB84076E6241F08A14BEFE091D1D63"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:BrowserContext Class"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_5447D14FBC01477CBF32404CB6285437"
-                            {
-                            "Name" = "8:{88E7C480-7B7A-47C5-8329-CE1FDF415527}"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:TRUE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_117E8AFCE9E34F9A95174EA7AE803064"
-                                    {
-                                    "Name" = "8:TypeLib"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_A40708D46C3142968865DFB012646256"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_18D7DC3C4D314539A34548AE6D0003D9"
-                                    {
-                                    "Name" = "8:LocalServer32"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_F895170364C849E3BE709AA237576985"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:\"[TARGETDIR]IECrossfireServer.exe\""
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_31A4D968065D43F9B0A0C7B79129FED5"
-                                    {
-                                    "Name" = "8:ProgID"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_493D147B7E0E4F6D9752290B1547D846"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:IECrossfireServer.PendingBreakpoint.1"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_6B41532634F14B0E84F5C0B424AA792B"
-                                    {
-                                    "Name" = "8:Programmable"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_AFBD8B5BE39E4CE4BAF02AA05AF7CD33"
-                                    {
-                                    "Name" = "8:VersionIndependentProgID"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_36D87C6857A94E12B4B81813B9FCA56C"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:IECrossfireServer.PendingBreakpoint"
-                                            }
-                                        }
-                                    }
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_9947B5CC790D4F16AAF2DB140EEDA4F1"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:PendingBreakpoint Class"
-                                    }
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_FA3FDC633E034249BF0AB4E9823A325F"
-                                    {
-                                    "Name" = "8:AppID"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{1B6AA6D6-25AC-4994-9431-AC0DFC85654D}"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_8493B1EC5C4A436CBFD65942FB5102E7"
-                            {
-                            "Name" = "8:{7C3C5D7A-AF4D-4F32-A3C9-462BFBAFDC25}"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:TRUE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_0CCC8CFA6FB44629A2C37F772CCABB47"
-                                    {
-                                    "Name" = "8:TypeLib"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_3A04ECDEE1FB4036BE36713B81911FD7"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_69A60A49A87E493BBDFE42D51BCB1F1A"
-                                    {
-                                    "Name" = "8:LocalServer32"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_8B0DF96E2EFC4BB19DC738049C902C24"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:\"[TARGETDIR]IECrossfireServer.exe\""
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_98C20FCBD4C24FB6B5C846EDE3741708"
-                                    {
-                                    "Name" = "8:ProgID"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_D2B52805930048C183B3CADEF6DCA1D3"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:IECrossfireServer.CrossfireServer.1"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_B80CDE0101CF436B9B198FC5FF241AE4"
-                                    {
-                                    "Name" = "8:VersionIndependentProgID"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_786796B507774648B281563B5A0B8E2F"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:IECrossfireServer.CrossfireServer"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_FA9701837CB04BB7943D855A9A5CCF03"
-                                    {
-                                    "Name" = "8:Programmable"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                        }
-                                    }
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_ACDC8F134FDE4142BD25F0A7AE0BB7EE"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:CrossfireServerClass Class"
-                                    }
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_FF96B7E67B1744E4BD6E1E70716FF87A"
-                                    {
-                                    "Name" = "8:AppID"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{1B6AA6D6-25AC-4994-9431-AC0DFC85654D}"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_BD043FDE5D2A42979AAF59672F48E60E"
-                            {
-                            "Name" = "8:{4EC15DD3-9E2F-43A7-A686-3FA90E22ABB7}"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:TRUE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_00D241A240234703890E7A841E572210"
-                                    {
-                                    "Name" = "8:VersionIndependentProgID"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_B86A5208CF7A478AACC5D1DAEB5845C2"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:IECrossfireServer.JSEvalCallback"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_4712AC4E83904A7BA927E6338F16A36B"
-                                    {
-                                    "Name" = "8:LocalServer32"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_34F2240F979846DEB84DE7B25FF8EF87"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:\"[TARGETDIR]IECrossfireServer.exe\""
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_538132D821DE498FAC092D7B615529B9"
-                                    {
-                                    "Name" = "8:TypeLib"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_4E6C9E5861B64D1FA7BAE98A2C239256"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_921FA0CC8E63402C8996E79C819D3ABF"
-                                    {
-                                    "Name" = "8:ProgID"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_AF5C5A2649C74F079D826795879CDD62"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:IECrossfireServer.JSEvalCallback.1"
-                                            }
-                                        }
-                                    }
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_5D327EBF408E42B5B1F6C93BD8513DF8"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:JSEvalCallback Class"
-                                    }
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_A6DD64D21B91424B901C9D8A9BF5BCA2"
-                                    {
-                                    "Name" = "8:AppID"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{1B6AA6D6-25AC-4994-9431-AC0DFC85654D}"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_DFCF0F4E58914515BEB6C55DA50484B9"
-                            {
-                            "Name" = "8:{47836AF4-3E0C-4995-8029-FF931C5A43FC}"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:TRUE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_AF4E813CA86E436CB889952393707738"
-                                    {
-                                    "Name" = "8:LocalServer32"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_809B9CA8B38840859F207535B9B76746"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:\"[TARGETDIR]IECrossfireServer.exe\""
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_BA03A9916DBE4CBAA4343D5657B686A4"
-                                    {
-                                    "Name" = "8:Programmable"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_BA8FE23FFD2F4EDD898196521266F8CB"
-                                    {
-                                    "Name" = "8:ProgID"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_05DB65BE480C41418D76B744CE130902"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:IECrossfireServer.CrossfireServer.1"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_E6C80DC2868E468A9366A450E5C84E64"
-                                    {
-                                    "Name" = "8:TypeLib"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_4DA8B5F4EDCC429F8AA3F9AE2FECA5F2"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_F9B06D0FC3E64D749B438E271E15B364"
-                                    {
-                                    "Name" = "8:VersionIndependentProgID"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_296BEEA7DB5447C5AA3FF9C5D4F5C5A6"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:IECrossfireServer.CrossfireServer"
-                                            }
-                                        }
-                                    }
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_2FB7D3E090994B0BA8A016984A40C750"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:CrossfireServer Class"
-                                    }
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_6AA994D634F94D26BDF118B1D44D32A7"
-                                    {
-                                    "Name" = "8:AppID"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{1B6AA6D6-25AC-4994-9431-AC0DFC85654D}"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_E0B108A6542C40D0988D5C05CCEEEA26"
-                            {
-                            "Name" = "8:{B63BD92F-6C66-4AB2-A243-D5AFCCF4B587}"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:TRUE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_294F1D32FB6147B4A66051FAD175694B"
-                                    {
-                                    "Name" = "8:ProgID"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_9A695589D9CE4F87B925FA00F4101A42"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:IECrossfireServer.IEDebugger.1"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_6303304E0B6D4111A87820A954FDBEAE"
-                                    {
-                                    "Name" = "8:LocalServer32"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_A83BD51883884469AC761DB66289590C"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:\"[TARGETDIR]IECrossfireServer.exe\""
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_67A637C1B5574692A66B8248FD9D1CE4"
-                                    {
-                                    "Name" = "8:VersionIndependentProgID"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_BE5E78C8B51C466FB7D4ACF45E34E0EE"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:IECrossfireServer.IEDebugger"
-                                            }
-                                        }
-                                    }
-                                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_DA68A690366F419A8A26888C7414B145"
-                                    {
-                                    "Name" = "8:TypeLib"
-                                    "Condition" = "8:"
-                                    "AlwaysCreate" = "11:TRUE"
-                                    "DeleteAtUninstall" = "11:FALSE"
-                                    "Transitive" = "11:FALSE"
-                                        "Keys"
-                                        {
-                                        }
-                                        "Values"
-                                        {
-                                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_10A75B126CE640558A00C40361240B97"
-                                            {
-                                            "Name" = "8:"
-                                            "Condition" = "8:"
-                                            "Transitive" = "11:FALSE"
-                                            "ValueTypes" = "3:1"
-                                            "Value" = "8:{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}"
-                                            }
-                                        }
-                                    }
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_5CDC11CDB2FB46FE8B2ABD1733474AEC"
-                                    {
-                                    "Name" = "8:AppID"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{1B6AA6D6-25AC-4994-9431-AC0DFC85654D}"
-                                    }
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_B1FF2180AFDE42D7BC534F06FE0EB03F"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:IEDebugger Class"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_C9BBCB11A5F6451E81946BC374538D1A"
-                    {
-                    "Name" = "8:IECrossfireServer.PendingBreakpoint.1"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:TRUE"
-                    "DeleteAtUninstall" = "11:TRUE"
-                    "Transitive" = "11:FALSE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_6B7C8F9FBF484209A8F72D3827C6EB3A"
-                            {
-                            "Name" = "8:CLSID"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_E22C07399B164639970B05D97A00CBD6"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{88E7C480-7B7A-47C5-8329-CE1FDF415527}"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_EC0BFBC59FD74795B16CA8AA9FBFD8C0"
-                            {
-                            "Name" = "8:"
-                            "Condition" = "8:"
-                            "Transitive" = "11:FALSE"
-                            "ValueTypes" = "3:1"
-                            "Value" = "8:PendingBreakpoint Class"
-                            }
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_CFB1227E060E4123B7A056491E8A13AC"
-                    {
-                    "Name" = "8:IECrossfireExtension.ExplorerBar"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:TRUE"
-                    "DeleteAtUninstall" = "11:TRUE"
-                    "Transitive" = "11:FALSE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_D7C3E2CC05624B2B854D0399CEF5FF9D"
-                            {
-                            "Name" = "8:CLSID"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_84ED5A18D4EB4E1BA8F1AA552DBA429A"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{34EF57F8-9295-483E-B656-4EE154B0B3A5}"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_FFFB345DD32A43C59DC80B495EAF70F2"
-                            {
-                            "Name" = "8:CurVer"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_47631623514341C2A3B829890F4B45CB"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:IECrossfireExtension.ExplorerBar.1"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_7A179D2A9ED84F678B4CDDCE674DC813"
-                            {
-                            "Name" = "8:"
-                            "Condition" = "8:"
-                            "Transitive" = "11:FALSE"
-                            "ValueTypes" = "3:1"
-                            "Value" = "8:ExplorerBar Class"
-                            }
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_D5D43D7527814005AF04D5123AE1DADC"
-                    {
-                    "Name" = "8:IECrossfireServer.CrossfireServerClass.1"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:TRUE"
-                    "DeleteAtUninstall" = "11:TRUE"
-                    "Transitive" = "11:FALSE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_AB8139DF46764224A4B27B4FB3772902"
-                            {
-                            "Name" = "8:CLSID"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_02BD6CF55FBA451697FE25910785FF7F"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{7C3C5D7A-AF4D-4F32-A3C9-462BFBAFDC25}"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_21710665B9254B099F4D45AB8F0044FA"
-                            {
-                            "Name" = "8:"
-                            "Condition" = "8:"
-                            "Transitive" = "11:FALSE"
-                            "ValueTypes" = "3:1"
-                            "Value" = "8:CrossfireServerClass Class"
-                            }
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_D6B79D15D35C4F6B8E85A1BE0CE099D9"
-                    {
-                    "Name" = "8:IECrossfireServer.BrowserContext"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:TRUE"
-                    "DeleteAtUninstall" = "11:TRUE"
-                    "Transitive" = "11:FALSE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_2F787B1D9DFD40A3AD84C50BEE9DA734"
-                            {
-                            "Name" = "8:CurVer"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_C68E68F33B4E4355A233450B7BDABD19"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:IECrossfireServer.IBrowserContext.1"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_5B6862B0D817480A9BF9D232525B3BBD"
-                            {
-                            "Name" = "8:CLSID"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_B9BD386B695A4F5AB8D855D111CE4398"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{2FA65B09-5063-45FA-91F9-50EB7F4AF2C6}"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_13994CAB3E484AB79A7D86033662E28F"
-                            {
-                            "Name" = "8:"
-                            "Condition" = "8:"
-                            "Transitive" = "11:FALSE"
-                            "ValueTypes" = "3:1"
-                            "Value" = "8:BrowserContext Class"
-                            }
-                        }
-                    }
-                    "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_DDE8E336BE8745C393882C835283FD46"
-                    {
-                    "Name" = "8:IECrossfireServer.IEDebugger"
-                    "Condition" = "8:"
-                    "AlwaysCreate" = "11:TRUE"
-                    "DeleteAtUninstall" = "11:TRUE"
-                    "Transitive" = "11:FALSE"
-                        "Keys"
-                        {
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_49C42D3E92F04AF5840CC4EDEF35F12D"
-                            {
-                            "Name" = "8:CLSID"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_673777D75211427FA3801998CD5FD772"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:{B63BD92F-6C66-4AB2-A243-D5AFCCF4B587}"
-                                    }
-                                }
-                            }
-                            "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_A8BDC4165EA9482AAB1C952DB1C02DE5"
-                            {
-                            "Name" = "8:CurVer"
-                            "Condition" = "8:"
-                            "AlwaysCreate" = "11:TRUE"
-                            "DeleteAtUninstall" = "11:FALSE"
-                            "Transitive" = "11:FALSE"
-                                "Keys"
-                                {
-                                }
-                                "Values"
-                                {
-                                    "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_484B701FC98D4977A99F0DAF3FE75F2F"
-                                    {
-                                    "Name" = "8:"
-                                    "Condition" = "8:"
-                                    "Transitive" = "11:FALSE"
-                                    "ValueTypes" = "3:1"
-                                    "Value" = "8:IECrossfireServer.IEDebugger.1"
-                                    }
-                                }
-                            }
-                        }
-                        "Values"
-                        {
-                            "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_CD761FA04CBD44BCADF8C8AD3625D690"
-                            {
-                            "Name" = "8:"
-                            "Condition" = "8:"
-                            "Transitive" = "11:FALSE"
-                            "ValueTypes" = "3:1"
-                            "Value" = "8:IEDebugger Class"
-                            }
-                        }
-                    }
-                }
-            }
-            "HKU"
-            {
-                "Keys"
-                {
-                }
-            }
-            "HKPU"
-            {
-                "Keys"
-                {
-                }
-            }
-        }
-        "Sequences"
-        {
-        }
-        "Shortcut"
-        {
-        }
-        "UserInterface"
-        {
-            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_141F29B7D3194AD58D4FE853AF7B3FE6"
-            {
-            "Name" = "8:#1902"
-            "Sequence" = "3:2"
-            "Attributes" = "3:3"
-                "Dialogs"
-                {
-                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_05C032DEA994412DA349D66CCEEFF116"
-                    {
-                    "Sequence" = "3:100"
-                    "DisplayName" = "8:Finished"
-                    "UseDynamicProperties" = "11:TRUE"
-                    "IsDependency" = "11:FALSE"
-                    "SourcePath" = "8:<VsdDialogDir>\\VsdAdminFinishedDlg.wid"
-                        "Properties"
-                        {
-                            "BannerBitmap"
-                            {
-                            "Name" = "8:BannerBitmap"
-                            "DisplayName" = "8:#1001"
-                            "Description" = "8:#1101"
-                            "Type" = "3:8"
-                            "ContextData" = "8:Bitmap"
-                            "Attributes" = "3:4"
-                            "Setting" = "3:1"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                        }
-                    }
-                }
-            }
-            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_467DA7C5045B4D0F9879613BDBDA2EB4"
-            {
-            "Name" = "8:#1902"
-            "Sequence" = "3:1"
-            "Attributes" = "3:3"
-                "Dialogs"
-                {
-                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_5DD72B82A55A4F6D9DDB6E2984AAABE3"
-                    {
-                    "Sequence" = "3:100"
-                    "DisplayName" = "8:Finished"
-                    "UseDynamicProperties" = "11:TRUE"
-                    "IsDependency" = "11:FALSE"
-                    "SourcePath" = "8:<VsdDialogDir>\\VsdFinishedDlg.wid"
-                        "Properties"
-                        {
-                            "BannerBitmap"
-                            {
-                            "Name" = "8:BannerBitmap"
-                            "DisplayName" = "8:#1001"
-                            "Description" = "8:#1101"
-                            "Type" = "3:8"
-                            "ContextData" = "8:Bitmap"
-                            "Attributes" = "3:4"
-                            "Setting" = "3:1"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                            "UpdateText"
-                            {
-                            "Name" = "8:UpdateText"
-                            "DisplayName" = "8:#1058"
-                            "Description" = "8:#1158"
-                            "Type" = "3:15"
-                            "ContextData" = "8:"
-                            "Attributes" = "3:0"
-                            "Setting" = "3:1"
-                            "Value" = "8:#1258"
-                            "DefaultValue" = "8:#1258"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                        }
-                    }
-                }
-            }
-            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_5681E9F1FE4C4C43AEA755A81B3B9E7C"
-            {
-            "Name" = "8:#1900"
-            "Sequence" = "3:2"
-            "Attributes" = "3:1"
-                "Dialogs"
-                {
-                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_3738443BB8D64900810C574693BB6BBF"
-                    {
-                    "Sequence" = "3:100"
-                    "DisplayName" = "8:Welcome"
-                    "UseDynamicProperties" = "11:TRUE"
-                    "IsDependency" = "11:FALSE"
-                    "SourcePath" = "8:<VsdDialogDir>\\VsdAdminWelcomeDlg.wid"
-                        "Properties"
-                        {
-                            "BannerBitmap"
-                            {
-                            "Name" = "8:BannerBitmap"
-                            "DisplayName" = "8:#1001"
-                            "Description" = "8:#1101"
-                            "Type" = "3:8"
-                            "ContextData" = "8:Bitmap"
-                            "Attributes" = "3:4"
-                            "Setting" = "3:1"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                            "CopyrightWarning"
-                            {
-                            "Name" = "8:CopyrightWarning"
-                            "DisplayName" = "8:#1002"
-                            "Description" = "8:#1102"
-                            "Type" = "3:3"
-                            "ContextData" = "8:"
-                            "Attributes" = "3:0"
-                            "Setting" = "3:2"
-                            "Value" = "8:(c) Copyright Eclipse contributors and others, 2011.  All rights reserved.  Eclipse is a trademark of the Eclipse Foundation, Inc.  Internet Explorer is a registered trademark of Microsoft Corporation."
-                            "DefaultValue" = "8:#1202"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                            "Welcome"
-                            {
-                            "Name" = "8:Welcome"
-                            "DisplayName" = "8:#1003"
-                            "Description" = "8:#1103"
-                            "Type" = "3:3"
-                            "ContextData" = "8:"
-                            "Attributes" = "3:0"
-                            "Setting" = "3:2"
-                            "Value" = "8:The installer will guide you through the steps required to install Crossfire Server for Internet Explorer on your computer."
-                            "DefaultValue" = "8:#1203"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                        }
-                    }
-                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_E3135651702942C19F60B823A2F3E308"
-                    {
-                    "Sequence" = "3:300"
-                    "DisplayName" = "8:Confirm Installation"
-                    "UseDynamicProperties" = "11:TRUE"
-                    "IsDependency" = "11:FALSE"
-                    "SourcePath" = "8:<VsdDialogDir>\\VsdAdminConfirmDlg.wid"
-                        "Properties"
-                        {
-                            "BannerBitmap"
-                            {
-                            "Name" = "8:BannerBitmap"
-                            "DisplayName" = "8:#1001"
-                            "Description" = "8:#1101"
-                            "Type" = "3:8"
-                            "ContextData" = "8:Bitmap"
-                            "Attributes" = "3:4"
-                            "Setting" = "3:1"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                        }
-                    }
-                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_FECC155F4BEC4D4E8A58D25F7EB40A34"
-                    {
-                    "Sequence" = "3:200"
-                    "DisplayName" = "8:Installation Folder"
-                    "UseDynamicProperties" = "11:TRUE"
-                    "IsDependency" = "11:FALSE"
-                    "SourcePath" = "8:<VsdDialogDir>\\VsdAdminFolderDlg.wid"
-                        "Properties"
-                        {
-                            "BannerBitmap"
-                            {
-                            "Name" = "8:BannerBitmap"
-                            "DisplayName" = "8:#1001"
-                            "Description" = "8:#1101"
-                            "Type" = "3:8"
-                            "ContextData" = "8:Bitmap"
-                            "Attributes" = "3:4"
-                            "Setting" = "3:1"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                        }
-                    }
-                }
-            }
-            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_855DFCB9ED424E1AB299D900E829858A"
-            {
-            "Name" = "8:#1900"
-            "Sequence" = "3:1"
-            "Attributes" = "3:1"
-                "Dialogs"
-                {
-                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_68352804719046BB8792DBF3748067E5"
-                    {
-                    "Sequence" = "3:100"
-                    "DisplayName" = "8:Welcome"
-                    "UseDynamicProperties" = "11:TRUE"
-                    "IsDependency" = "11:FALSE"
-                    "SourcePath" = "8:<VsdDialogDir>\\VsdWelcomeDlg.wid"
-                        "Properties"
-                        {
-                            "BannerBitmap"
-                            {
-                            "Name" = "8:BannerBitmap"
-                            "DisplayName" = "8:#1001"
-                            "Description" = "8:#1101"
-                            "Type" = "3:8"
-                            "ContextData" = "8:Bitmap"
-                            "Attributes" = "3:4"
-                            "Setting" = "3:1"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                            "CopyrightWarning"
-                            {
-                            "Name" = "8:CopyrightWarning"
-                            "DisplayName" = "8:#1002"
-                            "Description" = "8:#1102"
-                            "Type" = "3:3"
-                            "ContextData" = "8:"
-                            "Attributes" = "3:0"
-                            "Setting" = "3:2"
-                            "Value" = "8:(c) Copyright Eclipse contributors and others, 2011.  All rights reserved.  Eclipse is a trademark of the Eclipse Foundation, Inc.  Internet Explorer is a registered trademark of Microsoft Corporation."
-                            "DefaultValue" = "8:#1202"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                            "Welcome"
-                            {
-                            "Name" = "8:Welcome"
-                            "DisplayName" = "8:#1003"
-                            "Description" = "8:#1103"
-                            "Type" = "3:3"
-                            "ContextData" = "8:"
-                            "Attributes" = "3:0"
-                            "Setting" = "3:2"
-                            "Value" = "8:The installer will guide you through the steps required to install Crossfire Server for Internet Explorer on your computer."
-                            "DefaultValue" = "8:#1203"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                        }
-                    }
-                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_EB0547A750B948FFB622DA67A20BFCC0"
-                    {
-                    "Sequence" = "3:300"
-                    "DisplayName" = "8:Confirm Installation"
-                    "UseDynamicProperties" = "11:TRUE"
-                    "IsDependency" = "11:FALSE"
-                    "SourcePath" = "8:<VsdDialogDir>\\VsdConfirmDlg.wid"
-                        "Properties"
-                        {
-                            "BannerBitmap"
-                            {
-                            "Name" = "8:BannerBitmap"
-                            "DisplayName" = "8:#1001"
-                            "Description" = "8:#1101"
-                            "Type" = "3:8"
-                            "ContextData" = "8:Bitmap"
-                            "Attributes" = "3:4"
-                            "Setting" = "3:1"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                        }
-                    }
-                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_EE2AF07CF21E42A59E4C0C834C8F12E8"
-                    {
-                    "Sequence" = "3:200"
-                    "DisplayName" = "8:Installation Folder"
-                    "UseDynamicProperties" = "11:TRUE"
-                    "IsDependency" = "11:FALSE"
-                    "SourcePath" = "8:<VsdDialogDir>\\VsdFolderDlg.wid"
-                        "Properties"
-                        {
-                            "BannerBitmap"
-                            {
-                            "Name" = "8:BannerBitmap"
-                            "DisplayName" = "8:#1001"
-                            "Description" = "8:#1101"
-                            "Type" = "3:8"
-                            "ContextData" = "8:Bitmap"
-                            "Attributes" = "3:4"
-                            "Setting" = "3:1"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                            "InstallAllUsersVisible"
-                            {
-                            "Name" = "8:InstallAllUsersVisible"
-                            "DisplayName" = "8:#1059"
-                            "Description" = "8:#1159"
-                            "Type" = "3:5"
-                            "ContextData" = "8:1;True=1;False=0"
-                            "Attributes" = "3:0"
-                            "Setting" = "3:0"
-                            "Value" = "3:1"
-                            "DefaultValue" = "3:1"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                        }
-                    }
-                }
-            }
-            "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_B8CA9A4581ED49FA9AB65AF682B73E84"
-            {
-            "UseDynamicProperties" = "11:FALSE"
-            "IsDependency" = "11:FALSE"
-            "SourcePath" = "8:<VsdDialogDir>\\VsdUserInterface.wim"
-            }
-            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_BF98141759964ECE9D4455465F90995E"
-            {
-            "Name" = "8:#1901"
-            "Sequence" = "3:1"
-            "Attributes" = "3:2"
-                "Dialogs"
-                {
-                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_B29833B9E6604479B045E19D92964B44"
-                    {
-                    "Sequence" = "3:100"
-                    "DisplayName" = "8:Progress"
-                    "UseDynamicProperties" = "11:TRUE"
-                    "IsDependency" = "11:FALSE"
-                    "SourcePath" = "8:<VsdDialogDir>\\VsdProgressDlg.wid"
-                        "Properties"
-                        {
-                            "BannerBitmap"
-                            {
-                            "Name" = "8:BannerBitmap"
-                            "DisplayName" = "8:#1001"
-                            "Description" = "8:#1101"
-                            "Type" = "3:8"
-                            "ContextData" = "8:Bitmap"
-                            "Attributes" = "3:4"
-                            "Setting" = "3:1"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                            "ShowProgress"
-                            {
-                            "Name" = "8:ShowProgress"
-                            "DisplayName" = "8:#1009"
-                            "Description" = "8:#1109"
-                            "Type" = "3:5"
-                            "ContextData" = "8:1;True=1;False=0"
-                            "Attributes" = "3:0"
-                            "Setting" = "3:0"
-                            "Value" = "3:1"
-                            "DefaultValue" = "3:1"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                        }
-                    }
-                }
-            }
-            "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_C663B24DF9944D95B7303B0209C0BA01"
-            {
-            "UseDynamicProperties" = "11:FALSE"
-            "IsDependency" = "11:FALSE"
-            "SourcePath" = "8:<VsdDialogDir>\\VsdBasicDialogs.wim"
-            }
-            "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_F6A3BC8A25314E15A8F9D1CD084AE407"
-            {
-            "Name" = "8:#1901"
-            "Sequence" = "3:2"
-            "Attributes" = "3:2"
-                "Dialogs"
-                {
-                    "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_6E55C6AE6F544E5591EB64DD13882CEC"
-                    {
-                    "Sequence" = "3:100"
-                    "DisplayName" = "8:Progress"
-                    "UseDynamicProperties" = "11:TRUE"
-                    "IsDependency" = "11:FALSE"
-                    "SourcePath" = "8:<VsdDialogDir>\\VsdAdminProgressDlg.wid"
-                        "Properties"
-                        {
-                            "BannerBitmap"
-                            {
-                            "Name" = "8:BannerBitmap"
-                            "DisplayName" = "8:#1001"
-                            "Description" = "8:#1101"
-                            "Type" = "3:8"
-                            "ContextData" = "8:Bitmap"
-                            "Attributes" = "3:4"
-                            "Setting" = "3:1"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                            "ShowProgress"
-                            {
-                            "Name" = "8:ShowProgress"
-                            "DisplayName" = "8:#1009"
-                            "Description" = "8:#1109"
-                            "Type" = "3:5"
-                            "ContextData" = "8:1;True=1;False=0"
-                            "Attributes" = "3:0"
-                            "Setting" = "3:0"
-                            "Value" = "3:1"
-                            "DefaultValue" = "3:1"
-                            "UsePlugInResources" = "11:TRUE"
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        "MergeModule"
-        {
-            "{CEE29DC0-9FBA-4B99-8D47-5BC643D9B626}:_0C04D36F65A14D88BE7C0F4AD05A2393"
-            {
-            "UseDynamicProperties" = "11:TRUE"
-            "IsDependency" = "11:TRUE"
-            "SourcePath" = "8:Microsoft_VC100_CRT_x86.msm"
-                "Properties"
-                {
-                }
-            "LanguageId" = "3:0"
-            "Exclude" = "11:FALSE"
-            "Folder" = "8:"
-            "Feature" = "8:"
-            "IsolateTo" = "8:"
-            }
-            "{CEE29DC0-9FBA-4B99-8D47-5BC643D9B626}:_6802CADBA51445E0826BEBAEA44DA6C0"
-            {
-            "UseDynamicProperties" = "11:TRUE"
-            "IsDependency" = "11:TRUE"
-            "SourcePath" = "8:Microsoft_VC100_ATL_x86.msm"
-                "Properties"
-                {
-                }
-            "LanguageId" = "3:0"
-            "Exclude" = "11:FALSE"
-            "Folder" = "8:"
-            "Feature" = "8:"
-            "IsolateTo" = "8:"
-            }
-        }
-        "ProjectOutput"
-        {
-            "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_24252B77991741A9A63D0FB2317BF5E2"
-            {
-            "SourcePath" = "8:"
-            "TargetName" = "8:"
-            "Tag" = "8:"
-            "Folder" = "8:_F79B3187A2A440AF924ED0481F6F9DA5"
-            "Condition" = "8:"
-            "Transitive" = "11:FALSE"
-            "Vital" = "11:TRUE"
-            "ReadOnly" = "11:FALSE"
-            "Hidden" = "11:FALSE"
-            "System" = "11:FALSE"
-            "Permanent" = "11:FALSE"
-            "SharedLegacy" = "11:FALSE"
-            "PackageAs" = "3:1"
-            "Register" = "3:1"
-            "Exclude" = "11:FALSE"
-            "IsDependency" = "11:FALSE"
-            "IsolateTo" = "8:"
-            "ProjectOutputGroupRegister" = "3:1"
-            "OutputConfiguration" = "8:"
-            "OutputGroupCanonicalName" = "8:Symbols"
-            "OutputProjectGuid" = "8:{EFAC86C6-2F6E-4657-A971-632DE21EFF9F}"
-            "ShowKeyOutput" = "11:TRUE"
-                "ExcludeFilters"
-                {
-                }
-            }
-            "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_68B2C602B4B448ADBFC58961A342D06B"
-            {
-            "SourcePath" = "8:..\\IECrossfireServer\\Release\\IECrossfireServer.exe"
-            "TargetName" = "8:"
-            "Tag" = "8:"
-            "Folder" = "8:_F79B3187A2A440AF924ED0481F6F9DA5"
-            "Condition" = "8:"
-            "Transitive" = "11:FALSE"
-            "Vital" = "11:TRUE"
-            "ReadOnly" = "11:FALSE"
-            "Hidden" = "11:FALSE"
-            "System" = "11:FALSE"
-            "Permanent" = "11:FALSE"
-            "SharedLegacy" = "11:FALSE"
-            "PackageAs" = "3:1"
-            "Register" = "3:1"
-            "Exclude" = "11:FALSE"
-            "IsDependency" = "11:FALSE"
-            "IsolateTo" = "8:"
-            "ProjectOutputGroupRegister" = "3:1"
-            "OutputConfiguration" = "8:"
-            "OutputGroupCanonicalName" = "8:Built"
-            "OutputProjectGuid" = "8:{2B73B89A-A1B4-479B-8751-A25B9036A9AF}"
-            "ShowKeyOutput" = "11:TRUE"
-                "ExcludeFilters"
-                {
-                }
-            }
-            "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_A558BCE26AC6426C9ABA48959A6EB3C6"
-            {
-            "SourcePath" = "8:..\\IECrossfireExtension\\Release\\IECrossfireExtension.dll"
-            "TargetName" = "8:"
-            "Tag" = "8:"
-            "Folder" = "8:_F79B3187A2A440AF924ED0481F6F9DA5"
-            "Condition" = "8:"
-            "Transitive" = "11:FALSE"
-            "Vital" = "11:TRUE"
-            "ReadOnly" = "11:FALSE"
-            "Hidden" = "11:FALSE"
-            "System" = "11:FALSE"
-            "Permanent" = "11:FALSE"
-            "SharedLegacy" = "11:FALSE"
-            "PackageAs" = "3:1"
-            "Register" = "3:1"
-            "Exclude" = "11:FALSE"
-            "IsDependency" = "11:FALSE"
-            "IsolateTo" = "8:"
-            "ProjectOutputGroupRegister" = "3:1"
-            "OutputConfiguration" = "8:"
-            "OutputGroupCanonicalName" = "8:Built"
-            "OutputProjectGuid" = "8:{EFAC86C6-2F6E-4657-A971-632DE21EFF9F}"
-            "ShowKeyOutput" = "11:TRUE"
-                "ExcludeFilters"
-                {
-                }
-            }
-            "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_C40F9610AA3C4AF091A726CAA04C53F2"
-            {
-            "SourcePath" = "8:"
-            "TargetName" = "8:"
-            "Tag" = "8:"
-            "Folder" = "8:_F79B3187A2A440AF924ED0481F6F9DA5"
-            "Condition" = "8:"
-            "Transitive" = "11:FALSE"
-            "Vital" = "11:TRUE"
-            "ReadOnly" = "11:FALSE"
-            "Hidden" = "11:FALSE"
-            "System" = "11:FALSE"
-            "Permanent" = "11:FALSE"
-            "SharedLegacy" = "11:FALSE"
-            "PackageAs" = "3:1"
-            "Register" = "3:1"
-            "Exclude" = "11:FALSE"
-            "IsDependency" = "11:FALSE"
-            "IsolateTo" = "8:"
-            "ProjectOutputGroupRegister" = "3:1"
-            "OutputConfiguration" = "8:"
-            "OutputGroupCanonicalName" = "8:Symbols"
-            "OutputProjectGuid" = "8:{2B73B89A-A1B4-479B-8751-A25B9036A9AF}"
-            "ShowKeyOutput" = "11:TRUE"
-                "ExcludeFilters"
-                {
-                }
-            }
-        }
-    }
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/IECrossfireServer.ico b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/IECrossfireServer.ico
deleted file mode 100644
index 611d412..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/IECrossfireServer.ico
+++ /dev/null
Binary files differ
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/IECrossfireServerGray.ico b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/IECrossfireServerGray.ico
deleted file mode 100644
index 2a52d80..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/IECrossfireServerGray.ico
+++ /dev/null
Binary files differ
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/Release/IECrossfireInstaller.msi b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/Release/IECrossfireInstaller.msi
deleted file mode 100644
index e3749bc..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/Release/IECrossfireInstaller.msi
+++ /dev/null
Binary files differ
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/Release/setup.exe b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/Release/setup.exe
deleted file mode 100644
index 57b6013..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/Release/setup.exe
+++ /dev/null
Binary files differ
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/BrowserContext.rgs b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/BrowserContext.rgs
deleted file mode 100644
index b03c213..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/BrowserContext.rgs
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-HKCR {
-	IECrossfireServer.BrowserContext.1 = s 'BrowserContext Class' {
-		CLSID = s '{2FA65B09-5063-45FA-91F9-50EB7F4AF2C6}'
-	}
-	IECrossfireServer.BrowserContext = s 'BrowserContext Class' {
-		CLSID = s '{2FA65B09-5063-45FA-91F9-50EB7F4AF2C6}'
-		CurVer = s 'IECrossfireServer.IBrowserContext.1'
-	}
-	NoRemove CLSID {
-		ForceRemove {2FA65B09-5063-45FA-91F9-50EB7F4AF2C6} = s 'BrowserContext Class' {
-			ProgID = s 'IECrossfireServer.BrowserContext.1'
-			VersionIndependentProgID = s 'IECrossfireServer.BrowserContext'
-			ForceRemove 'Programmable'
-			LocalServer32 = s '%MODULE%'
-			val AppID = s '%APPID%'
-			'TypeLib' = s '{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}'
-		}
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireBPManager.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireBPManager.cpp
deleted file mode 100644
index f6a828b..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireBPManager.cpp
+++ /dev/null
@@ -1,425 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "StdAfx.h"
-#include "CrossfireBPManager.h"
-
-const wchar_t* CrossfireBPManager::KEY_BREAKPOINTS = L"breakpoints";
-
-CrossfireBPManager::CrossfireBPManager() {
-	m_breakpoints = new std::map<unsigned int, CrossfireBreakpoint*>;
-}
-
-CrossfireBPManager::~CrossfireBPManager() {
-	std::map<unsigned int,CrossfireBreakpoint*>::iterator iterator = m_breakpoints->begin();
-	while (iterator != m_breakpoints->end()) {
-		delete iterator->second;
-		iterator++;
-	}
-	delete m_breakpoints;
-}
-
-/* IBreakpointTarget */
-
-bool CrossfireBPManager::breakpointAttributeChanged(unsigned int handle, wchar_t* name, Value* value) {
-	/* no further action required since this object just stores the breakpoint data */
-	return true;
-}
-
-bool CrossfireBPManager::deleteBreakpoint(unsigned int handle) {
-	std::map<unsigned int, CrossfireBreakpoint*>::iterator iterator = m_breakpoints->find(handle);
-	if (iterator == m_breakpoints->end()) {
-		return false;
-	}
-
-	delete iterator->second;
-	m_breakpoints->erase(iterator);
-	return true;
-}
-
-CrossfireBreakpoint* CrossfireBPManager::getBreakpoint(unsigned int handle) {
-	std::map<unsigned int, CrossfireBreakpoint*>::iterator iterator = m_breakpoints->find(handle);
-	if (iterator == m_breakpoints->end()) {
-		Logger::error("CrossfireBPManager.getBreakpoint(): unknown breakpoint handle", handle);
-		return NULL;
-	}
-
-	return iterator->second;
-}
-
-void CrossfireBPManager::getBreakpoints(CrossfireBreakpoint*** ___values) {
-	size_t size = m_breakpoints->size();
-	CrossfireBreakpoint** breakpoints = new CrossfireBreakpoint*[size + 1];
-
-	std::map<unsigned int, CrossfireBreakpoint*>::iterator it = m_breakpoints->begin();
-	int index = 0;
-	while (it != m_breakpoints->end()) {
-		it->second->clone(&breakpoints[index++]);
-		it++;
-	}
-	breakpoints[index] = NULL;
-
-	*___values = breakpoints;
-}
-
-bool CrossfireBPManager::setBreakpoint(CrossfireBreakpoint *breakpoint) {
-	CrossfireLineBreakpoint* lineBp = (CrossfireLineBreakpoint*)breakpoint;
-	CrossfireLineBreakpoint* copy = NULL;
-	lineBp->clone((CrossfireBreakpoint**)&copy);
-	unsigned int handle = lineBp->getHandle();
-
-	/* if a breakpoint with a duplicate handle exists then replace it with the new breakpoint */
-	std::map<unsigned int, CrossfireBreakpoint*>::iterator iterator = m_breakpoints->find(handle);
-	if (iterator != m_breakpoints->end()) {
-		delete iterator->second;
-		m_breakpoints->erase(iterator);
-	}
-
-	m_breakpoints->insert(std::pair<unsigned int, CrossfireBreakpoint*>(handle, copy));
-	return true;
-}
-
-/* CrossfireBPManager */
-
-int CrossfireBPManager::commandChangeBreakpoints(Value* arguments, IBreakpointTarget** targets, Value** _responseBody, wchar_t** _message) {
-	*_responseBody = NULL;
-
-	Value* value_handles = arguments->getObjectValue(CrossfireBreakpoint::KEY_HANDLES);
-	if (!value_handles || value_handles->getType() != TYPE_ARRAY) {
-		*_message = _wcsdup(L"'changeBreakpoints' command does not have a valid 'handles' value");
-		return CODE_INVALID_ARGUMENT;
-	}
-
-	Value* value_attributes = arguments->getObjectValue(CrossfireBreakpoint::KEY_ATTRIBUTES);
-	if (!value_attributes || value_attributes->getType() != TYPE_OBJECT) {
-		*_message = _wcsdup(L"'changeBreakpoints' command does not have a valid 'attributes' value");
-		return CODE_INVALID_ARGUMENT;
-	}
-
-	int code = CODE_OK;
-	Value** handles = NULL;
-	value_handles->getArrayValues(&handles);
-	int handlesIndex = 0;
-	Value* value_handle = handles[handlesIndex++];
-	while (value_handle) {
-		if (value_handle->getType() != TYPE_NUMBER || value_handle->getNumberValue() < 1) {
-			*_message = _wcsdup(L"'changeBreakpoints' command specifies an invalid handle value");
-			code = CODE_INVALID_ARGUMENT;
-			break;
-		}
-
-		/* ensure that the handle is valid */
-		unsigned int handle = (unsigned int)value_handle->getNumberValue();
-		CrossfireBreakpoint* breakpoint = getBreakpoint(handle);
-		if (!breakpoint) {
-			*_message = _wcsdup(L"'changeBreakpoints' command specifies an unknown breakpoint handle");
-			code = CODE_COMMAND_FAILED;
-			break;
-		}
-
-		/* ensure that all attributes can be applied to the current breakpoint */
-		if (!breakpoint->attributesValueIsValid(value_attributes)) {
-			*_message = _wcsdup(L"'changeBreakpoints' command specifies an invalid breakpoint attribute");
-			code = CODE_COMMAND_FAILED;
-			break;
-		}
-
-		value_handle = handles[handlesIndex++];
-	}
-
-	if (code != CODE_OK) {
-		delete[] handles;
-		return code;
-	}
-
-	/* the request is valid, so now perform the changes */
-
-	handlesIndex = 0;
-	value_handle = handles[handlesIndex++];
-	while (value_handle) {
-		unsigned int handle = (unsigned int)value_handle->getNumberValue();
-		CrossfireBreakpoint* breakpoint = getBreakpoint(handle);
-		breakpoint->setAttributesFromValue(value_attributes);
-
-		/* it's valid for the breakpoint to not be set in some (or even all) of the targets */
-		if (targets) {
-			int targetsIndex = 0;
-			IBreakpointTarget* target = targets[targetsIndex++];
-			while (target != NULL) {
-				CrossfireBreakpoint* breakpoint = target->getBreakpoint(handle);
-				if (breakpoint) {
-					breakpoint->setAttributesFromValue(value_attributes);
-				}
-				target = targets[targetsIndex++];
-			}
-		}
-
-		value_handle = handles[handlesIndex++];
-	}
-	delete[] handles;
-
-	Value* result = new Value();
-	result->setType(TYPE_OBJECT);
-	*_responseBody = result;
-	return CODE_OK;
-}
-
-int CrossfireBPManager::commandDeleteBreakpoints(Value* arguments, IBreakpointTarget** targets, Value** _responseBody, wchar_t** _message) {
-	*_responseBody = NULL;
-
-	Value* value_handles = arguments->getObjectValue(CrossfireBreakpoint::KEY_HANDLES);
-	if (!value_handles || value_handles->getType() != TYPE_ARRAY) {
-		*_message = _wcsdup(L"'deleteBreakpoints' command does not have a valid 'handles' value");
-		return CODE_INVALID_ARGUMENT;
-	}
-
-	Value** handles = NULL;
-	value_handles->getArrayValues(&handles);
-	int index = 0;
-	Value* value_current = handles[index++];
-	while (value_current) {
-		if (value_current->getType() != TYPE_NUMBER || (unsigned int)value_current->getNumberValue() < 1) {
-			*_message = _wcsdup(L"'deleteBreakpoints' command specifies an invalid handle value");
-			delete[] handles;
-			return CODE_INVALID_ARGUMENT;
-		}
-
-		unsigned int handle = (unsigned int)value_current->getNumberValue();
-
-		/* look up the breakpoint in the local breakpoints table to ensure that the handle is valid */
-		std::map<unsigned int, CrossfireBreakpoint*>::iterator iterator = m_breakpoints->find(handle);
-		if (iterator == m_breakpoints->end()) {
-			*_message = _wcsdup(L"'deleteBreakpoints' command specifies an unknown breakpoint handle");
-			delete[] handles;
-			return CODE_COMMAND_FAILED;
-		}
-		value_current = handles[index++];
-	}
-
-	/* the request is valid, so now perform the deletions */
-
-	index = 0;
-	value_current = handles[index++];
-	while (value_current) {
-		unsigned int handle = (unsigned int)value_current->getNumberValue();
-		deleteBreakpoint(handle); /* delete from the global table */
-
-		/*
-		 * It's valid for the breakpoint to not be set in some (or even all) of the targets,
-		 * so a false result value for the deleteBreakpoint() call does not indicate a problem.
-		 */
-		if (targets) {
-			int targetsIndex = 0;
-			IBreakpointTarget* current = targets[targetsIndex++];
-			while (current != NULL) {
-				current->deleteBreakpoint(handle);
-				current = targets[targetsIndex++];
-			}
-		}
-		value_current = handles[index++];
-	}
-	delete[] handles;
-
-	Value* result = new Value();
-	result->setType(TYPE_OBJECT);
-	*_responseBody = result;
-	return CODE_OK;
-}
-
-int CrossfireBPManager::commandGetBreakpoints(Value* arguments, IBreakpointTarget* target, Value** _responseBody, wchar_t** _message) {
-	CrossfireBreakpoint** breakpoints = NULL;
-	Value* value_handles = arguments->getObjectValue(CrossfireBreakpoint::KEY_HANDLES);
-	if (value_handles) {
-		if (value_handles->getType() != TYPE_ARRAY) {
-			*_message = _wcsdup(L"'getBreakpoints' command has an invalid 'handles' value");
-			return CODE_INVALID_ARGUMENT;
-		}
-		std::vector<CrossfireBreakpoint*> breakpointsCollection;
-		Value** handles = NULL;
-		value_handles->getArrayValues(&handles);
-		int index = 0;
-		Value* value_current = handles[index++];
-		while (value_current) {
-			if (value_current->getType() == TYPE_NUMBER && value_current->getNumberValue() > 0) {
-				unsigned int handle = (unsigned int)value_current->getNumberValue();
-				CrossfireBreakpoint* breakpoint = target->getBreakpoint(handle);
-				if (breakpoint) {
-					breakpointsCollection.push_back(breakpoint);
-				}
-			}
-			value_current = handles[index++];
-		}
-		delete[] handles;
-
-		int length = breakpointsCollection.size();
-		breakpoints = new CrossfireBreakpoint*[length + 1];
-		for (int i = 0; i < length; i++) {
-			breakpoints[i] = breakpointsCollection.at(i);
-		}
-		breakpoints[length] = NULL;
-	} else {
-		target->getBreakpoints(&breakpoints);
-	}
-
-	Value breakpointsArray;
-	breakpointsArray.setType(TYPE_ARRAY);
-	int index = 0;
-	while (breakpoints[index]) {
-		CrossfireBreakpoint* current = breakpoints[index];
-		Value* value_breakpoint = NULL;
-		if (current->toValueObject(&value_breakpoint)) {
-			breakpointsArray.addArrayValue(value_breakpoint);
-			delete value_breakpoint;
-		}
-		delete current;
-		index++;
-	}
-	delete[] breakpoints;
-
-	Value* result = new Value();
-	result->addObjectValue(KEY_BREAKPOINTS, &breakpointsArray);
-	*_responseBody = result;
-	return CODE_OK;
-}
-
-int CrossfireBPManager::commandSetBreakpoints(Value* arguments, IBreakpointTarget** targets, Value** _responseBody, wchar_t** _message) {
-	*_responseBody = NULL;
-
-	Value* value_breakpoints = arguments->getObjectValue(KEY_BREAKPOINTS);
-	if (!value_breakpoints || value_breakpoints->getType() != TYPE_ARRAY) {
-		*_message = _wcsdup(L"'setBreakpoints' command does not have a valid 'breakpoints' value");
-		return CODE_INVALID_ARGUMENT;
-	}
-
-	std::vector<CrossfireBreakpoint*> bpObjects;
-
-	Value** breakpoints = NULL;
-	value_breakpoints->getArrayValues(&breakpoints);
-	int index = 0;
-	Value* current = breakpoints[index++];
-	int code = CODE_OK;
-	while (current) {
-		CrossfireBreakpoint* breakpoint = NULL;
-		code = createBreakpoint(current, &breakpoint, _message);
-		if (code != CODE_OK) {
-			break;
-		}
-		bpObjects.push_back(breakpoint);
-		current = breakpoints[index++];
-	}
-	delete[] breakpoints;
-
-	if (code == CODE_OK) {
-		Value value_array;
-		value_array.setType(TYPE_ARRAY);
-
-		std::vector<CrossfireBreakpoint*>::iterator iterator = bpObjects.begin();
-		while (iterator != bpObjects.end()) {
-			CrossfireBreakpoint* breakpoint = *iterator;
-
-			/* search registered breakpoints for a duplicate */
-			std::map<unsigned int,CrossfireBreakpoint*>::iterator iterator2 = m_breakpoints->begin();
-			while (iterator2 != m_breakpoints->end()) {
-				CrossfireBreakpoint* current = iterator2->second;
-				if (current->matchesLocation(breakpoint)) {
-					breakpoint->setHandle(current->getHandle());
-					break;
-				}
-				iterator2++;
-			}
-			breakpoint->setTarget(this);
-			setBreakpoint(breakpoint);
-			if (targets) {
-				int index = 0;
-				IBreakpointTarget* current = targets[index++];
-				while (current != NULL) {
-					breakpoint->setTarget(current);
-					current->setBreakpoint(breakpoint);
-					current = targets[index++];
-				}
-			}
-
-			Value* value_breakpoint = NULL;
-			breakpoint->toValueObject(&value_breakpoint);
-			value_array.addArrayValue(value_breakpoint);
-			delete value_breakpoint;
-			delete *iterator;
-			iterator++;
-		}
-
-		Value* result = new Value();
-		result->addObjectValue(KEY_BREAKPOINTS, &value_array);
-		*_responseBody = result;
-	}
-
-	return code;
-}
-
-int CrossfireBPManager::createBreakpoint(Value* arguments, CrossfireBreakpoint** _result, wchar_t** _message) {
-	*_result = NULL;
-
-	Value* value_type = arguments->getObjectValue(CrossfireBreakpoint::KEY_TYPE);
-	if (!value_type || value_type->getType() != TYPE_STRING) {
-		*_message = _wcsdup(L"breakpoint creation arguments do not have a valid 'type' value");
-		return CODE_INVALID_ARGUMENT;
-	}
-
-	Value* value_attributes = arguments->getObjectValue(CrossfireBreakpoint::KEY_ATTRIBUTES);
-	if (value_attributes && value_attributes->getType() != TYPE_OBJECT) {
-		*_message = _wcsdup(L"breakpoint creation arguments have an invalid 'attributes' value");
-		return CODE_INVALID_ARGUMENT;
-	}
-
-	Value* value_location = arguments->getObjectValue(CrossfireBreakpoint::KEY_LOCATION);
-	if (!value_location || value_location->getType() != TYPE_OBJECT) {
-		*_message = _wcsdup(L"breakpoint creation arguments do not have a valid 'location' value");
-		return CODE_INVALID_ARGUMENT;
-	}
-
-	CrossfireBreakpoint* breakpoint = NULL;
-	wchar_t* type = (wchar_t*)value_type->getStringValue()->c_str();
-	if (CrossfireLineBreakpoint::CanHandleBPType(type)) {
-		breakpoint = new CrossfireLineBreakpoint();
-	} else {
-		*_message = _wcsdup(L"breakpoint creation arguments specify an unknown 'type' value");
-		return CODE_COMMAND_FAILED;
-	}
-
-	if (value_attributes) {
-		if (!breakpoint->attributesValueIsValid(value_attributes)) {
-			*_message = _wcsdup(L"breakpoint creation arguments specify an invalid attribute name or value");
-			delete breakpoint;
-			return CODE_COMMAND_FAILED;
-		}
-		breakpoint->setAttributesFromValue(value_attributes);
-	}
-
-	if (!breakpoint->setLocationFromValue(value_location)) {
-		*_message = _wcsdup(L"breakpoint creation arguments do not validly specify a location");
-		delete breakpoint;
-		return CODE_COMMAND_FAILED;
-	}
-
-	*_result = breakpoint;
-	return CODE_OK;
-}
-
-void CrossfireBPManager::setBreakpointsForScript(URL* url, IBreakpointTarget* target) {
-	std::map<unsigned int,CrossfireBreakpoint*>::iterator iterator = m_breakpoints->begin();
-	while (iterator != m_breakpoints->end()) {
-		CrossfireBreakpoint* breakpoint = iterator->second;
-		if (breakpoint->appliesToUrl(url)) {
-			target->setBreakpoint(breakpoint);
-		}
-		iterator++;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireBPManager.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireBPManager.h
deleted file mode 100644
index d10e45d..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireBPManager.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include <map>
-
-#include "CrossfireLineBreakpoint.h"
-#include "CrossfireResponse.h"
-#include "IBreakpointTarget.h"
-#include "Logger.h"
-#include "Value.h"
-
-class CrossfireBPManager : IBreakpointTarget {
-
-public:
-	CrossfireBPManager();
-	virtual ~CrossfireBPManager();
-
-	int commandChangeBreakpoints(Value* arguments, IBreakpointTarget** targets, Value** _responseBody, wchar_t** _message);
-	int commandDeleteBreakpoints(Value* arguments, IBreakpointTarget** targets, Value** _responseBody, wchar_t** _message);
-	int commandGetBreakpoints(Value* arguments, IBreakpointTarget* target, Value** _responseBody, wchar_t** _message);
-	int commandSetBreakpoints(Value* arguments, IBreakpointTarget** targets, Value** _responseBody, wchar_t** _message);
-	void setBreakpointsForScript(URL* url, IBreakpointTarget* target);
-
-	/* IBreakpointTarget methods */
-	bool breakpointAttributeChanged(unsigned int handle, wchar_t* name, Value* value);
-	bool deleteBreakpoint(unsigned int handle);
-	CrossfireBreakpoint* getBreakpoint(unsigned int handle);
-	void getBreakpoints(CrossfireBreakpoint*** ___values);
-	bool setBreakpoint(CrossfireBreakpoint* breakpoint);
-
-private:
-	int createBreakpoint(Value* arguments, CrossfireBreakpoint** _result, wchar_t** _message);
-
-	std::map<unsigned int, CrossfireBreakpoint*>* m_breakpoints;
-
-	static const wchar_t* KEY_BREAKPOINTS;
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireBreakpoint.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireBreakpoint.cpp
deleted file mode 100644
index 603c52e..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireBreakpoint.cpp
+++ /dev/null
@@ -1,188 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "StdAfx.h"
-#include "CrossfireBreakpoint.h"
-
-/* initialize constants */
-const wchar_t* CrossfireBreakpoint::KEY_ATTRIBUTES = L"attributes";
-const wchar_t* CrossfireBreakpoint::KEY_CONTEXTID = L"contextId";
-const wchar_t* CrossfireBreakpoint::KEY_HANDLE = L"handle";
-const wchar_t* CrossfireBreakpoint::KEY_HANDLES = L"handles";
-const wchar_t* CrossfireBreakpoint::KEY_LOCATION = L"location";
-const wchar_t* CrossfireBreakpoint::KEY_TYPE = L"type";
-
-CrossfireBreakpoint::CrossfireBreakpoint() {
-	static unsigned int s_nextBreakpointHandle = 1;
-	m_attributes = new std::map<std::wstring, Value*>;
-	m_contextId = NULL;
-	m_handle = s_nextBreakpointHandle++;
-	m_target = NULL;
-}
-
-CrossfireBreakpoint::CrossfireBreakpoint(unsigned int handle) {
-	m_attributes = new std::map<std::wstring, Value*>;
-	m_contextId = NULL;
-	m_handle = handle;
-	m_target = NULL;
-}
-
-CrossfireBreakpoint::~CrossfireBreakpoint() {
-	std::map<std::wstring, Value*>::iterator iterator = m_attributes->begin();
-	while (iterator != m_attributes->end()) {
-		delete iterator->second;
-		iterator++;
-	}
-	delete m_attributes;
-	if (m_contextId) {
-		delete m_contextId;
-	}
-}
-
-bool CrossfireBreakpoint::appliesToUrl(URL* url) {
-	return true;
-}
-
-bool CrossfireBreakpoint::attributesValueIsValid(Value* attributes) {
-	if (attributes->getType() != TYPE_OBJECT) {
-		return false;
-	}
-
-	std::wstring** keys = NULL;
-	Value** values = NULL;
-	attributes->getObjectValues(&keys, &values);
-	bool success = true;
-	int index = 0;
-	std::wstring* currentKey = keys[index];
-	while (currentKey) {
-		Value* currentValue = values[index];
-		if (!attributeIsValid((wchar_t*)currentKey->c_str(), currentValue)) {
-			success = false;
-			break;
-		}
-		currentKey = keys[++index];
-	}
-
-	delete[] keys;
-	delete[] values;
-	return success;
-}
-
-void CrossfireBreakpoint::breakpointHit() {
-}
-
-Value* CrossfireBreakpoint::getAttribute(wchar_t* name) {
-	std::map<std::wstring, Value*>::iterator iterator = m_attributes->find(std::wstring(name));
-	if (iterator == m_attributes->end()) {
-		return NULL;
-	}
-	return iterator->second;
-}
-
-const std::wstring* CrossfireBreakpoint::getContextId() {
-	return m_contextId;
-}
-
-unsigned int CrossfireBreakpoint::getHandle() {
-	return m_handle;
-}
-
-IBreakpointTarget* CrossfireBreakpoint::getTarget() {
-	return m_target;
-}
-
-void CrossfireBreakpoint::setAttribute(wchar_t* name, Value* value) {
-	std::map<std::wstring, Value*>::iterator iterator = m_attributes->find(std::wstring(name));
-	if (iterator != m_attributes->end()) {
-		if (iterator->second->equals(value)) {
-			return;
-		}
-		delete iterator->second;
-		m_attributes->erase(iterator);
-	}
-
-	if (value->getType() == TYPE_NULL) {
-		/* a null value indicates that the attribute value should be cleared */
-		return;
-	}
-
-	Value* valueCopy = NULL;
-	value->clone(&valueCopy);
-	m_attributes->insert(std::pair<std::wstring, Value*>(std::wstring(name), valueCopy));
-	if (m_target) {
-		m_target->breakpointAttributeChanged(m_handle, name, value);
-	}
-}
-
-void CrossfireBreakpoint::setAttributesFromValue(Value* value) {
-	std::wstring** objectKeys = NULL;
-	Value** objectValues = NULL;
-	value->getObjectValues(&objectKeys, &objectValues);
-	int index = 0;
-	std::wstring* currentKey = objectKeys[index];
-	while (currentKey) {
-		setAttribute((wchar_t*)currentKey->c_str(), objectValues[index]);
-		currentKey = objectKeys[++index];
-	}
-
-	delete[] objectKeys;
-	delete[] objectValues;
-}
-
-void CrossfireBreakpoint::setContextId(std::wstring* value) {
-	if (m_contextId) {
-		delete m_contextId;
-		m_contextId = NULL;
-	}
-	if (value) {
-		m_contextId = new std::wstring;
-		m_contextId->assign(*value);
-	}
-}
-
-void CrossfireBreakpoint::setHandle(unsigned int value) {
-	m_handle = value;
-}
-
-void CrossfireBreakpoint::setTarget(IBreakpointTarget* value) {
-	m_target = value;
-}
-
-bool CrossfireBreakpoint::toValueObject(Value** _value) {
-	Value value_null;
-	value_null.setType(TYPE_NULL);
-
-	Value* result = new Value();
-	result->addObjectValue(KEY_HANDLE, &Value((double)m_handle));
-	result->addObjectValue(KEY_TYPE, &Value(getTypeString()));
-	result->addObjectValue(KEY_CONTEXTID, m_contextId ? &Value(m_contextId) : &value_null);
-
-	Value value_attributes;
-	value_attributes.setType(TYPE_OBJECT);
-	std::map<std::wstring, Value*>::iterator iterator = m_attributes->begin();
-	while (iterator != m_attributes->end()) {
-		value_attributes.addObjectValue((std::wstring*)&iterator->first, iterator->second);
-		iterator++;
-	}
-	result->addObjectValue(KEY_ATTRIBUTES, &value_attributes);
-
-	Value* value_location = NULL;
-	if (!getLocationAsValue(&value_location)) {
-		delete result;
-		return false;
-	}
-	result->addObjectValue(KEY_LOCATION, value_location);
-	delete value_location;
-
-	*_value = result;
-	return true;
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireBreakpoint.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireBreakpoint.h
deleted file mode 100644
index e18a41f..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireBreakpoint.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include <map>
-
-#include "Logger.h"
-#include "URL.h"
-class CrossfireBreakpoint; // forward declaration
-#include "IBreakpointTarget.h"
-
-class CrossfireBreakpoint {
-
-public:
-	virtual ~CrossfireBreakpoint();
-	virtual bool appliesToUrl(URL* url); // TODO needed?
-	virtual bool attributesValueIsValid(Value* attributes);
-	virtual void breakpointHit();
-	virtual void clone(CrossfireBreakpoint** _value) = 0;
-	virtual const std::wstring* getContextId();
-	virtual unsigned int getHandle();
-	virtual IBreakpointTarget* getTarget();
-	virtual int getType() = 0;
-	virtual bool matchesLocation(CrossfireBreakpoint* breakpoint) = 0;
-	virtual void setAttributesFromValue(Value* value);
-	virtual void setContextId(std::wstring* value);
-	virtual void setHandle(unsigned int value);
-	virtual bool setLocationFromValue(Value* value) = 0;
-	virtual void setTarget(IBreakpointTarget* value);
-	virtual bool toValueObject(Value** _value);
-
-	static const int BPTYPE_LINE = 1;
-	static const wchar_t* KEY_ATTRIBUTES;
-	static const wchar_t* KEY_CONTEXTID;
-	static const wchar_t* KEY_HANDLE;
-	static const wchar_t* KEY_HANDLES;
-	static const wchar_t* KEY_LOCATION;
-	static const wchar_t* KEY_TYPE;
-
-protected:
-	CrossfireBreakpoint();
-	CrossfireBreakpoint(unsigned int handle);
-	virtual bool attributeIsValid(wchar_t* name, Value* value) = 0;
-	virtual Value* getAttribute(wchar_t* name);
-	virtual bool getLocationAsValue(Value** _value) = 0;
-	virtual const wchar_t* getTypeString() = 0;
-	virtual void setAttribute(wchar_t* name, Value* value);
-
-	unsigned int m_handle;
-
-private:
-	std::map<std::wstring, Value*>* m_attributes;
-	std::wstring* m_contextId;
-	IBreakpointTarget* m_target;
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireContext.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireContext.cpp
deleted file mode 100644
index dbe025b..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireContext.cpp
+++ /dev/null
@@ -1,2245 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "StdAfx.h"
-#include "CrossfireContext.h"
-
-#include "JSONParser.h"
-
-/* initialize constants */
-const wchar_t* CrossfireContext::ABOUT_BLANK = L"about:blank";
-const wchar_t* CrossfireContext::ID_PREAMBLE = L"xfIE::";
-const wchar_t* CrossfireContext::NUMBER_NaN = L"NaN";
-const wchar_t* CrossfireContext::NUMBER_INFINITY = L"Infinity";
-const wchar_t* CrossfireContext::NUMBER_NEGATIVEINFINITY = L"-Infinity";
-const wchar_t* CrossfireContext::PDM_DLL = L"pdm.dll";
-const wchar_t* CrossfireContext::SCHEME_SCRIPT = L"script://";
-const wchar_t* CrossfireContext::VALUE_NaN = L"NaN";
-const wchar_t* CrossfireContext::VALUE_INFINITY = L"Infinity";
-const wchar_t* CrossfireContext::VALUE_NEGATIVEINFINITY = L"-Infinity";
-
-/* command: backtrace */
-const wchar_t* CrossfireContext::COMMAND_BACKTRACE = L"backtrace";
-const wchar_t* CrossfireContext::KEY_FRAMES = L"frames";
-const wchar_t* CrossfireContext::KEY_FROMFRAME = L"fromFrame";
-const wchar_t* CrossfireContext::KEY_TOFRAME = L"toFrame";
-const wchar_t* CrossfireContext::KEY_TOTALFRAMES = L"totalFrames";
-
-/* command: continue */
-const wchar_t* CrossfireContext::COMMAND_CONTINUE = L"continue";
-
-/* command: evaluate */
-const wchar_t* CrossfireContext::COMMAND_EVALUATE = L"evaluate";
-const wchar_t* CrossfireContext::KEY_EXPRESSION = L"expression";
-const wchar_t* CrossfireContext::KEY_RESULT = L"result";
-
-/* command: frame */
-const wchar_t* CrossfireContext::COMMAND_FRAME = L"frame";
-const wchar_t* CrossfireContext::KEY_FRAME = L"frame";
-const wchar_t* CrossfireContext::KEY_INDEX = L"index";
-
-/* command: inspect */
-const wchar_t* CrossfireContext::COMMAND_INSPECT = L"inspect";
-
-/* command: lookup */
-const wchar_t* CrossfireContext::COMMAND_LOOKUP = L"lookup";
-const wchar_t* CrossfireContext::KEY_HANDLES = L"handles";
-const wchar_t* CrossfireContext::KEY_VALUES = L"values";
-
-/* command: scopes */
-const wchar_t* CrossfireContext::COMMAND_SCOPES = L"scopes";
-const wchar_t* CrossfireContext::KEY_FROMSCOPE = L"fromScope";
-const wchar_t* CrossfireContext::KEY_SCOPES = L"scopes";
-const wchar_t* CrossfireContext::KEY_TOSCOPE = L"toScope";
-const wchar_t* CrossfireContext::KEY_TOTALSCOPECOUNT = L"totalScopeCount";
-
-/* command: scripts */
-const wchar_t* CrossfireContext::COMMAND_SCRIPTS = L"scripts";
-const wchar_t* CrossfireContext::KEY_SCRIPTS = L"scripts";
-const wchar_t* CrossfireContext::KEY_URLS = L"urls";
-
-/* command: suspend */
-const wchar_t* CrossfireContext::COMMAND_SUSPEND = L"suspend";
-const wchar_t* CrossfireContext::KEY_STEPACTION = L"stepAction";
-const wchar_t* CrossfireContext::VALUE_IN = L"in";
-const wchar_t* CrossfireContext::VALUE_NEXT = L"next";
-const wchar_t* CrossfireContext::VALUE_OUT = L"out";
-
-/* event: onBreak */
-const wchar_t* CrossfireContext::EVENT_ONBREAK = L"onBreak";
-const wchar_t* CrossfireContext::KEY_CAUSE = L"cause";
-const wchar_t* CrossfireContext::KEY_MESSAGE = L"message";
-const wchar_t* CrossfireContext::KEY_TITLE = L"title";
-
-/* event: onResume */
-const wchar_t* CrossfireContext::EVENT_ONRESUME = L"onResume";
-
-/* event: onScript */
-const wchar_t* CrossfireContext::EVENT_ONSCRIPT = L"onScript";
-const wchar_t* CrossfireContext::KEY_SCRIPT = L"script";
-
-/* event: onToggleBreakpoint */
-const wchar_t* CrossfireContext::EVENT_ONTOGGLEBREAKPOINT = L"onToggleBreakpoint";
-const wchar_t* CrossfireContext::KEY_SET = L"set";
-
-/* shared */
-const wchar_t* CrossfireContext::KEY_BREAKPOINT = L"breakpoint";
-const wchar_t* CrossfireContext::KEY_CONTEXTID = L"contextId";
-const wchar_t* CrossfireContext::KEY_FRAMEINDEX = L"frameIndex";
-const wchar_t* CrossfireContext::KEY_HANDLE = L"handle";
-const wchar_t* CrossfireContext::KEY_LOCATION = L"location";
-const wchar_t* CrossfireContext::KEY_INCLUDESCOPES = L"includeScopes";
-const wchar_t* CrossfireContext::KEY_INCLUDESOURCE = L"includeSource";
-const wchar_t* CrossfireContext::KEY_LINE = L"line";
-const wchar_t* CrossfireContext::KEY_TYPE = L"type";
-const wchar_t* CrossfireContext::KEY_URL = L"url";
-
-/* breakpoint objects */
-const wchar_t* CrossfireContext::BPTYPE_LINE = L"line";
-
-/* frame objects */
-const wchar_t* CrossfireContext::KEY_FUNCTIONNAME = L"functionName";
-
-/* object objects */
-const wchar_t* CrossfireContext::JSVALUE_BOOLEAN = L"Boolean";
-const wchar_t* CrossfireContext::JSVALUE_FUNCTION = L"\"function\"";
-const wchar_t* CrossfireContext::JSVALUE_NUMBER = L"Number";
-const wchar_t* CrossfireContext::JSVALUE_NULL = L"Null";
-const wchar_t* CrossfireContext::JSVALUE_STRING = L"String";
-const wchar_t* CrossfireContext::JSVALUE_TRUE = L"true";
-const wchar_t* CrossfireContext::JSVALUE_UNDEFINED = L"Undefined";
-const wchar_t* CrossfireContext::KEY_LOCALS = L"locals";
-const wchar_t* CrossfireContext::KEY_THIS = L"this";
-const wchar_t* CrossfireContext::KEY_VALUE = L"value";
-const wchar_t* CrossfireContext::VALUE_BOOLEAN = L"boolean";
-const wchar_t* CrossfireContext::VALUE_FUNCTION = L"function";
-const wchar_t* CrossfireContext::VALUE_NUMBER = L"number";
-const wchar_t* CrossfireContext::VALUE_OBJECT = L"object";
-const wchar_t* CrossfireContext::VALUE_STRING = L"string";
-const wchar_t* CrossfireContext::VALUE_UNDEFINED = L"undefined";
-
-/* script objects */
-const wchar_t* CrossfireContext::KEY_COLUMNOFFSET = L"columnOffset";
-const wchar_t* CrossfireContext::KEY_LINECOUNT = L"lineCount";
-const wchar_t* CrossfireContext::KEY_LINEOFFSET = L"lineOffset";
-const wchar_t* CrossfireContext::KEY_SOURCE = L"source";
-const wchar_t* CrossfireContext::KEY_SOURCELENGTH = L"sourceLength";
-const wchar_t* CrossfireContext::VALUE_EVALCODE = L"eval code";
-const wchar_t* CrossfireContext::VALUE_EVALLEVEL = L"eval-level";
-const wchar_t* CrossfireContext::VALUE_TOPLEVEL = L"top-level";
-
-
-CrossfireContext::CrossfireContext(DWORD processId, DWORD threadId, wchar_t* url, CrossfireServer* server) {
-	static int s_counter = 0;
-	m_processId = processId;
-	m_threadId = threadId;
-	std::wstringstream stream;
-	stream << ID_PREAMBLE;
-	stream << m_processId;
-	stream << "-";
-	stream << s_counter++;
-	m_name = _wcsdup((wchar_t*)stream.str().c_str());
-
-	CComObject<IEDebugger>* result = NULL;
-	HRESULT hr = CComObject<IEDebugger>::CreateInstance(&result);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext(): CoCreateInstance(IIEDebugger) failed", hr);
-		return;
-	}
-	m_asyncEvals = new std::vector<JSEvalCallback*>;
-	m_debugger = result;
-	m_debugger->AddRef(); /* CComObject::CreateInstance gives initial ref count of 0 */
-	m_breakpoints = new std::map<unsigned int, CrossfireBreakpoint*>;
-	m_cpcApplicationNodeEvents = 0;
-	m_server = server;
-	m_debugApplicationThread = NULL;
-	m_debuggerHooked = false;
-	m_lastInitializedScriptNode = NULL;
-	m_nextObjectHandle = 1;
-	m_objects = new std::map<unsigned int, JSObject*>;
-	m_pendingScriptLoads = new std::map<IDebugApplicationNode*, PendingScriptLoad*>;
-	m_running = true;
-	m_scriptNodes = NULL;
-	m_url = _wcsdup(url);
-	hookDebugger();
-}
-
-CrossfireContext::~CrossfireContext() {
-	if (m_asyncEvals) {
-		std::vector<JSEvalCallback*>::iterator iterator = m_asyncEvals->begin();
-		while (iterator != m_asyncEvals->end()) {
-			delete *iterator;
-			iterator++;
-		}
-		delete m_asyncEvals;
-	}
-
-	if (m_breakpoints) {
-		std::map<unsigned int, CrossfireBreakpoint*>::iterator iterator = m_breakpoints->begin();
-		while (iterator != m_breakpoints->end()) {
-			delete iterator->second;
-			iterator++;
-		}
-		delete m_breakpoints;
-	}
-
-	if (m_lastInitializedScriptNode) {
-		m_lastInitializedScriptNode->Release();
-	}
-
-	if (m_pendingScriptLoads) {
-		std::map<IDebugApplicationNode*, PendingScriptLoad*>::iterator iterator = m_pendingScriptLoads->begin();
-		while (iterator != m_pendingScriptLoads->end()) {
-			iterator->first->Release();
-			iterator->second->Release();
-			iterator++;
-		}
-		delete m_pendingScriptLoads;
-	}
-
-	if (m_scriptNodes) {
-		std::map<std::wstring, IDebugApplicationNode*>::iterator iterator = m_scriptNodes->begin();
-		while (iterator != m_scriptNodes->end()) {
-			iterator->second->Release();
-			iterator++;
-		}
-		delete m_scriptNodes;
-	}
-
-	if (m_cpcApplicationNodeEvents) {
-		CComPtr<IRemoteDebugApplication> debugApplication = NULL;
-		if (!getDebugApplication(&debugApplication)) {
-			Logger::error("~CrossfireContext(): cannot Unadvise() the root node");
-		} else {
-			CComPtr<IDebugApplicationNode> rootNode = NULL;
-			HRESULT hr = debugApplication->GetRootNode(&rootNode);
-			if (FAILED(hr)) {
-				Logger::error("~CrossfireContext(): GetRootNode() failed", hr);
-			} else {
-				CComPtr<IConnectionPointContainer> connectionPointContainer = NULL;
-				hr = rootNode->QueryInterface(IID_IConnectionPointContainer, (void**)&connectionPointContainer);
-				if (FAILED(hr)) {
-					Logger::error("~CrossfireContext(): QI(IConnectionPointContainer) failed", hr);
-				} else {
-					CComPtr<IConnectionPoint> connectionPoint = NULL;
-					hr = connectionPointContainer->FindConnectionPoint(IID_IDebugApplicationNodeEvents, &connectionPoint);
-					if (FAILED(hr)) {
-						Logger::error("~CrossfireContext(): FindConnectionPoint() failed", hr);
-					} else {
-						hr = connectionPoint->Unadvise(m_cpcApplicationNodeEvents);
-						if (FAILED(hr)) {
-							Logger::error("~CrossfireContext(): Unadvise() failed", hr);
-						}
-					}
-				}
-			}
-		}
-	}
-
-	if (m_name) {
-		free(m_name);
-	}
-	if (m_url) {
-		free(m_url);
-	}
-	if (m_objects) {
-		clearObjects();
-		delete m_objects;
-	}
-	if (m_debuggerHooked) {
-		unhookDebugger();
-	}
-	if (m_debugger) {
-		m_debugger->Release();
-	}
-	if (m_debugApplicationThread) {
-		m_debugApplicationThread->Release();
-	}
-}
-
-/* IBreakpointTarget */
-
-bool CrossfireContext::breakpointAttributeChanged(unsigned int handle, wchar_t* name, Value* value) {
-	std::map<unsigned int, CrossfireBreakpoint*>::iterator iterator = m_breakpoints->find(handle);
-	if (iterator == m_breakpoints->end()) {
-		Logger::error("CrossfireContext.breakpointAttributeChanged(): unknown breakpoint handle", handle);
-		return false;
-	}
-	CrossfireBreakpoint* breakpoint = iterator->second;
-
-	if (wcscmp(name, CrossfireLineBreakpoint::ATTRIBUTE_ENABLED) == 0) {
-		return setBreakpointEnabled((CrossfireLineBreakpoint*)breakpoint, value->getBooleanValue());
-	}
-	if (wcscmp(name, CrossfireLineBreakpoint::ATTRIBUTE_CONDITION) == 0) {
-		((CrossfireLineBreakpoint*)breakpoint)->setCondition(value->getStringValue());
-		return true;
-	}
-	if (wcscmp(name, CrossfireLineBreakpoint::ATTRIBUTE_HITCOUNT) == 0) {
-		((CrossfireLineBreakpoint*)breakpoint)->setHitCount((unsigned int)value->getNumberValue());
-		return true;
-	}
-
-	/* receiver does not do anything for any other breakpoint attributes, so just answer success */
-	return true;
-}
-
-bool CrossfireContext::setBreakpointEnabled(CrossfireBreakpoint* breakpoint, bool enabled) {
-	CrossfireLineBreakpoint* lineBp = (CrossfireLineBreakpoint*)breakpoint;
-	IDebugApplicationNode* node = getScriptNode((URL*)lineBp->getUrl());
-	if (!node) {
-		Logger::error("CrossfireContext.setBreakpointEnabled(): unknown target url");
-		return false;
-	}
-
-	CComPtr<IDebugDocument> document = NULL;
-	HRESULT hr = node->GetDocument(&document);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.setBreakpointEnabled(): GetDocument() failed", hr);
-		return false;
-	}
-
-	CComPtr<IDebugDocumentText> documentText = NULL;
-	hr = document->QueryInterface(IID_IDebugDocumentText, (void**)&documentText);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.setBreakpointEnabled(): QI(IDebugDocumentText) failed", hr);
-		return false;
-	}
-
-	ULONG characterPosition = 0;
-	hr = documentText->GetPositionOfLine(lineBp->getLine() - 1, &characterPosition);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.setBreakpointEnabled(): GetPositionOfLine() failed [1]", hr);
-		return false;
-	}
-
-	CComPtr<IDebugDocumentContext> documentContext = NULL;
-	hr = documentText->GetContextOfPosition(characterPosition, 1, &documentContext);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.setBreakpointEnabled(): GetContextOfPosition() failed", hr);
-		return false;
-	}
-
-	CComPtr<IEnumDebugCodeContexts> codeContexts = NULL;
-	hr = documentContext->EnumCodeContexts(&codeContexts);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.setBreakpointEnabled(): EnumCodeContexts() failed", hr);
-		return false;
-	}
-
-	ULONG fetched = 0;
-	IDebugCodeContext* codeContext = NULL;
-	hr = codeContexts->Next(1, &codeContext, &fetched);
-	if (FAILED(hr) || fetched == 0) {
-		Logger::error("CrossfireContext.setBreakpointEnabled(): Next() failed", hr);
-		return false;
-	}
-
-	/*
-	 * Feature of JScript9.  A distinct breakpoint is created for each breakpoint that
-	 * is set at a given location.  As a result, setting multiple breakpoints at a location
-	 * can cause multiple breaks to occur when the location is hit.  To ensure that a
-	 * location never has more than one breakpoint, delete the breakpoint (if any) at the
-	 * location before setting the new breakpoint.
-	 */
-	codeContext->SetBreakPoint(BREAKPOINT_DELETED);
-
-	hr = codeContext->SetBreakPoint(enabled ? BREAKPOINT_ENABLED : BREAKPOINT_DISABLED);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.setBreakpointEnabled(): SetBreakPoint() failed", hr);
-		return false;
-	}
-
-	lineBp->setEnabled(enabled);
-	return true;
-}
-
-bool CrossfireContext::deleteBreakpoint(unsigned int handle) {
-	std::map<unsigned int, CrossfireBreakpoint*>::iterator iterator = m_breakpoints->find(handle);
-	if (iterator == m_breakpoints->end()) {
-		Logger::error("CrossfireContext.deleteBreakpoint(): unknown breakpoint handle", handle);
-		return false;
-	}
-	CrossfireLineBreakpoint* breakpoint = (CrossfireLineBreakpoint*)iterator->second;
-
-	IDebugApplicationNode* node = getScriptNode((URL*)breakpoint->getUrl());
-	if (!node) {
-		Logger::error("CrossfireContext.deleteBreakpoint(): unknown target url");
-		return false;
-	}
-
-	CComPtr<IDebugDocument> document = NULL;
-	HRESULT hr = node->GetDocument(&document);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.deleteBreakpoint(): GetDocument() failed", hr);
-		return false;
-	}
-
-	CComPtr<IDebugDocumentText> documentText = NULL;
-	hr = document->QueryInterface(IID_IDebugDocumentText,(void**)&documentText);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.deleteBreakpoint(): QI(IDebugDocumentText) failed", hr);
-		return false;
-	}
-
-	ULONG characterPosition = 0;
-	hr = documentText->GetPositionOfLine(breakpoint->getLine() - 1, &characterPosition);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.deleteBreakpoint(): GetPositionOfLine() failed [1]", hr);
-		return false;
-	}
-
-	CComPtr<IDebugDocumentContext> documentContext = NULL;
-	hr = documentText->GetContextOfPosition(characterPosition, 1, &documentContext);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.deleteBreakpoint(): GetContextOfPosition() failed", hr);
-		return false;
-	}
-
-	CComPtr<IEnumDebugCodeContexts> codeContexts = NULL;
-	hr = documentContext->EnumCodeContexts(&codeContexts);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.deleteBreakpoint(): EnumCodeContexts() failed", hr);
-		return false;
-	}
-
-	ULONG fetched = 0;
-	IDebugCodeContext* codeContext = NULL;
-	hr = codeContexts->Next(1, &codeContext, &fetched);
-	if (FAILED(hr) || fetched == 0) {
-		Logger::error("CrossfireContext.deleteBreakpoint(): Next() failed", hr);
-		return false;
-	}
-
-	hr = codeContext->SetBreakPoint(BREAKPOINT_DELETED);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.deleteBreakpoint(): SetBreakPoint() failed", hr);
-		return false;
-	}
-
-	CrossfireEvent toggleEvent;
-	toggleEvent.setName(EVENT_ONTOGGLEBREAKPOINT);
-	Value body;
-	body.addObjectValue(KEY_SET, &Value(false));
-	Value* value_breakpoint = NULL;
-	breakpoint->toValueObject(&value_breakpoint);
-	body.addObjectValue(KEY_BREAKPOINT, value_breakpoint);
-	delete value_breakpoint;
-	toggleEvent.setBody(&body);
-	sendEvent(&toggleEvent);
-
-	delete iterator->second;
-	m_breakpoints->erase(iterator);
-	return true;
-}
-
-CrossfireBreakpoint* CrossfireContext::getBreakpoint(unsigned int handle) {
-	std::map<unsigned int, CrossfireBreakpoint*>::iterator iterator = m_breakpoints->find(handle);
-	if (iterator == m_breakpoints->end()) {
-		Logger::error("CrossfireContext.getBreakpoint(): unknown breakpoint handle", handle);
-		return false;
-	}
-	return iterator->second;
-}
-
-void CrossfireContext::getBreakpoints(CrossfireBreakpoint*** ___values) {
-	size_t size = m_breakpoints->size();
-	CrossfireBreakpoint** breakpoints = new CrossfireBreakpoint*[size + 1];
-
-	std::map<unsigned int, CrossfireBreakpoint*>::iterator it = m_breakpoints->begin();
-	int index = 0;
-	while (it != m_breakpoints->end()) {
-		it->second->clone(&breakpoints[index++]);
-		it++;
-	}
-	breakpoints[index] = NULL;
-
-	*___values = breakpoints;
-}
-
-bool CrossfireContext::setBreakpoint(CrossfireBreakpoint *breakpoint) {
-	// TODO uncomment the following once Refreshes cause new contexts to be created
-
-//	unsigned int handle = breakpoint->getHandle();
-//	std::map<unsigned int, CrossfireBreakpoint*>::iterator iterator = m_breakpoints->find(handle);
-//	if (iterator != m_breakpoints->end()) {
-//		/* this breakpoint is already set on this context */
-//		return true;
-//	}
-
-	CrossfireLineBreakpoint* lineBp = (CrossfireLineBreakpoint*)breakpoint;
-	IDebugApplicationNode* node = NULL;
-	if (m_currentScriptNode) {
-		node = m_currentScriptNode;
-	} else {
-		node = getScriptNode((URL*)lineBp->getUrl());
-		if (!node) {
-			Logger::error("CrossfireContext.setBreakpoint(): unknown target url");
-			return false;
-		}
-	}
-
-	CComPtr<IDebugDocument> document = NULL;
-	HRESULT hr = node->GetDocument(&document);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.setBreakpoint(): GetDocument() failed", hr);
-		return false;
-	}
-
-	CComPtr<IDebugDocumentText> documentText = NULL;
-	hr = document->QueryInterface(IID_IDebugDocumentText, (void**)&documentText);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.setBreakpoint(): QI(IDebugDocumentText) failed", hr);
-		return false;
-	}
-
-	ULONG characterPosition = 0;
-	hr = documentText->GetPositionOfLine(lineBp->getLine() - 1, &characterPosition);
-	if (FAILED(hr)) {
-		/*
-		 * In this context E_INVALIDARG failures are often caused by the target document
-		 * not being adequately loaded yet.  If this happens then a subsequent attempt
-		 * to set the breakpoint should be made once its source has loaded.
-		 */
-		if (hr != E_INVALIDARG) {
-			Logger::error("CrossfireContext.setBreakpoint(): GetPositionOfLine() failed [1]", hr);
-		}
-		return false;
-	}
-
-	CComPtr<IDebugDocumentContext> documentContext = NULL;
-	hr = documentText->GetContextOfPosition(characterPosition, 1, &documentContext);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.setBreakpoint(): GetContextOfPosition() failed", hr);
-		return false;
-	}
-
-	CComPtr<IEnumDebugCodeContexts> codeContexts = NULL;
-	hr = documentContext->EnumCodeContexts(&codeContexts);
-	if (FAILED(hr)) {
-		/*
-		 * In this context E_INVALIDARG failures are often caused by the target document
-		 * not being adequately loaded yet.  If this happens then a subsequent attempt
-		 * to set the breakpoint should be made once its source has loaded.
-		 */
-		if (hr != E_INVALIDARG) {
-			Logger::error("CrossfireContext.setBreakpoint(): EnumCodeContexts() failed", hr);
-		}
-		return false;
-	}
-
-	ULONG fetched = 0;
-	CComPtr<IDebugCodeContext> codeContext = NULL;
-	hr = codeContexts->Next(1, &codeContext, &fetched);
-	if (FAILED(hr) || fetched == 0) {
-		Logger::error("CrossfireContext.setBreakpoint(): Next() failed", hr);
-		return false;
-	}
-
-	/*
-	 * Feature of JScript9.  A distinct breakpoint is created for each breakpoint that
-	 * is set at a given location.  As a result, setting multiple breakpoints at a location
-	 * causes multiple breaks to occur when the location is hit.  To ensure that a
-	 * location never has more than one breakpoint, delete the breakpoint (if any) at the
-	 * location before setting the new breakpoint.
-	 */
-	codeContext->SetBreakPoint(BREAKPOINT_DELETED);
-
-	hr = codeContext->SetBreakPoint(lineBp->isEnabled() ? BREAKPOINT_ENABLED : BREAKPOINT_DISABLED);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.setBreakpoint(): SetBreakPoint() failed", hr);
-		return false;
-	}
-
-	/* Determine the line number the breakpoint was set on (it may not match the requested line number) */
-
-	CComPtr<IDebugDocumentContext> bpDocumentContext = NULL;
-	hr = codeContext->GetDocumentContext(&bpDocumentContext);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.setBreakpoint(): GetDocumentContext() failed", hr);
-		return false;
-	}
-
-	characterPosition = 0;
-	ULONG numChars = 0;
-	hr = documentText->GetPositionOfContext(bpDocumentContext, &characterPosition, &numChars);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.setBreakpoint(): GetPositionOfContext() failed", hr);
-		return false;
-	}
-
-	ULONG bpLineNumber = 0;
-	ULONG offset = 0;
-	hr = documentText->GetLineOfPosition(characterPosition, &bpLineNumber, &offset);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.setBreakpoint(): GetLineOfPosition() failed", hr);
-		return false;
-	}
-
-	/* if a breakpoint with a duplicate handle exists then replace it with the new breakpoint */
-	unsigned int handle = lineBp->getHandle();
-	std::map<unsigned int, CrossfireBreakpoint*>::iterator iterator = m_breakpoints->find(handle);
-	if (iterator != m_breakpoints->end()) {
-		delete iterator->second;
-		m_breakpoints->erase(iterator);
-	}
-
-	CrossfireLineBreakpoint* copy = NULL;
-	lineBp->clone((CrossfireBreakpoint**)&copy);
-	copy->setLine(bpLineNumber + 1);
-	copy->setContextId(&std::wstring(m_name));
-	m_breakpoints->insert(std::pair<unsigned int, CrossfireBreakpoint*>(handle, copy));
-
-	CrossfireEvent toggleEvent;
-	toggleEvent.setName(EVENT_ONTOGGLEBREAKPOINT);
-	Value body;
-	body.addObjectValue(KEY_SET, &Value(true));
-	Value* value_breakpoint = NULL;
-	copy->toValueObject(&value_breakpoint);
-	body.addObjectValue(KEY_BREAKPOINT, value_breakpoint);
-	delete value_breakpoint;
-	toggleEvent.setBody(&body);
-	sendEvent(&toggleEvent);
-	return true;
-}
-
-void CrossfireContext::clearObjects() {
-	std::map<unsigned int, JSObject*>::iterator iterator = m_objects->begin();
-	while (iterator != m_objects->end()) {
-		JSObject* jsObject = iterator->second;
-		jsObject->debugProperty->Release();
-		jsObject->stackFrame->Release();
-		delete jsObject;
-		iterator++;
-	}
-	m_objects->clear();
-}
-
-/* IJSEvalHandler methods */
-
-void CrossfireContext::evalComplete(IDebugProperty* value, void* data) {
-	/*
-	 * Currently only breakpoint conditions are evaluated asynchronously, so it's assumed
-	 * that data is a breakpoint.  If more asynchronous evaluations are introduced in the
-	 * future then a new class implementing IJSEvalHandler should be created for handling
-	 * breakpoint condition evals.
-	 */
-
-	bool resume = false;
-	DebugPropertyInfo propertyInfo;
-	HRESULT hr = value->GetPropertyInfo(DBGPROP_INFO_ATTRIBUTES | DBGPROP_INFO_TYPE | DBGPROP_INFO_VALUE, 10, &propertyInfo);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.evalComplete(): GetPropertyInfo() failed", hr);
-		resume = true;
-	} else {
-		BSTR type = propertyInfo.m_bstrType;
-		if (wcscmp(type, JSVALUE_BOOLEAN) != 0) {
-			resume = true;
-		} else {
-			BSTR stringValue = propertyInfo.m_bstrValue;
-			if (wcscmp(stringValue, JSVALUE_TRUE) != 0) {
-				resume = true;
-			}
-		}
-	}
-
-	if (resume && resumeFromBreak(BREAKRESUMEACTION_CONTINUE)) {
-		return;
-	}
-
-	CrossfireLineBreakpoint* breakpoint = (CrossfireLineBreakpoint*)data;
-	CrossfireEvent onBreakEvent;
-	onBreakEvent.setName(EVENT_ONBREAK);
-	Value value_body;
-	Value location;
-	location.addObjectValue(KEY_LINE, &Value((double)breakpoint->getLine()));
-	location.addObjectValue(KEY_URL, &Value(((URL*)breakpoint->getUrl())->getString()));
-	value_body.addObjectValue(KEY_LOCATION, &location);
-	Value cause;
-	cause.addObjectValue(KEY_TITLE, &Value(L"breakpoint"));
-	value_body.addObjectValue(KEY_CAUSE, &cause);
-	onBreakEvent.setBody(&value_body);
-	sendEvent(&onBreakEvent);
-}
-
-/* CrossfireContext */
-
-void CrossfireContext::breakpointHit(IRemoteDebugApplicationThread *pDebugAppThread, BREAKREASON br, IActiveScriptErrorDebug *pScriptErrorDebug) {
-	m_running = false;
-
-	/*
-	 * IE has just entered a suspended state.  If any of the steps preceeding the
-	 * sending of the onBreak event fail then a resume (step out) must be done so
-	 * that the server is not left in a suspended state without the client's knowledge.
-	 */
-	CComPtr<IEnumDebugStackFrames> stackFrames = NULL;
-	HRESULT hr = pDebugAppThread->EnumStackFrames(&stackFrames);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.breakpointHit(): EnumStackFrames() failed", hr);
-		resumeFromBreak(BREAKRESUMEACTION_STEP_OUT);
-		return;
-	}
-
-	DebugStackFrameDescriptor stackFrameDescriptor;
-	ULONG numFetched = 0;
-	hr = stackFrames->Next(1, &stackFrameDescriptor, &numFetched);
-	if (FAILED(hr) || numFetched != 1) {
-		Logger::error("CrossfireContext.breakpointHit(): EnumStackFrames->Next() failed", hr);
-		resumeFromBreak(BREAKRESUMEACTION_STEP_OUT);
-		return;
-	}
-
-	IDebugStackFrame* frame = stackFrameDescriptor.pdsf;
-	CComPtr<IDebugCodeContext> codeContext = NULL;
-	hr = frame->GetCodeContext(&codeContext);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.breakpointHit(): GetCodeContext() failed", hr);
-		resumeFromBreak(BREAKRESUMEACTION_STEP_OUT);
-		return;
-	}
-
-	CComPtr<IDebugDocumentContext> documentContext = NULL;
-	hr = codeContext->GetDocumentContext(&documentContext);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.breakpointHit(): GetDocumentContext() failed", hr);
-		resumeFromBreak(BREAKRESUMEACTION_STEP_OUT);
-		return;
-	}
-
-	CComPtr<IDebugDocument> document = NULL;
-	hr = documentContext->GetDocument(&document);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.breakpointHit(): GetDocument() failed", hr);
-		resumeFromBreak(BREAKRESUMEACTION_STEP_OUT);
-		return;
-	}
-
-	CComPtr<IDebugDocumentText> documentText = NULL;
-	hr = document->QueryInterface(IID_IDebugDocumentText, (void**)&documentText);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.breakpointHit(): QueryInterface() failed", hr);
-		resumeFromBreak(BREAKRESUMEACTION_STEP_OUT);
-		return;
-	}
-
-	ULONG position, numChars;
-	hr = documentText->GetPositionOfContext(documentContext, &position, &numChars);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.breakpointHit(): GetPositionOfContext() failed", hr);
-		resumeFromBreak(BREAKRESUMEACTION_STEP_OUT);
-		return;
-	}
-
-	ULONG lineNumber, column;
-	hr = documentText->GetLineOfPosition(position, &lineNumber, &column);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.breakpointHit(): GetLineOfContext() failed", hr);
-		resumeFromBreak(BREAKRESUMEACTION_STEP_OUT);
-		return;
-	}
-	lineNumber++;
-
-	CComBSTR bstrUrl;
-	hr = document->GetName(DOCUMENTNAMETYPE_TITLE, &bstrUrl);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.breakpointHit(): GetName() failed", hr);
-		resumeFromBreak(BREAKRESUMEACTION_STEP_OUT);
-		return;
-	}
-	URL url(bstrUrl);
-
-	/*
-	 * If the cause of the break is a breakpoint then locate the breakpoint and
-	 * determine whether the onBreak event should be sent (eg.- does the breakpoint
-	 * have a hit count to respect, a condition to evaluate, etc.).
-	 */
-	if (br == BREAKREASON_BREAKPOINT) {
-		CrossfireBreakpoint* breakpoint = NULL;
-		std::map<unsigned int, CrossfireBreakpoint*>::iterator iterator = m_breakpoints->begin();
-		while (iterator != m_breakpoints->end()) {
-			CrossfireBreakpoint* current = iterator->second;
-			if (current->getType() == CrossfireLineBreakpoint::BPTYPE_LINE) {
-				CrossfireLineBreakpoint* lineBp = (CrossfireLineBreakpoint*)current;
-				if (lineBp->getLine() == lineNumber && ((URL*)lineBp->getUrl())->isEqual(&url)) {
-					lineBp->breakpointHit();
-					if (!lineBp->matchesHitCount() && resumeFromBreak(BREAKRESUMEACTION_CONTINUE)) {
-						return;
-					}
-					const std::wstring* conditionString = lineBp->getCondition();
-					if (conditionString) {
-						wchar_t* condition = (wchar_t*)conditionString->c_str();
-						if (evaluateAsync(frame, condition, DEBUG_TEXT_RETURNVALUE | DEBUG_TEXT_NOSIDEEFFECTS, this, lineBp)) {
-							return;
-						}
-					}
-					break;
-				}
-			}
-			iterator++;
-		}
-	}
-
-	CrossfireEvent onBreakEvent;
-	onBreakEvent.setName(EVENT_ONBREAK);
-	Value body;
-	Value location;
-	location.addObjectValue(KEY_LINE, &Value((double)lineNumber));
-	location.addObjectValue(KEY_URL, &Value(url.getString()));
-	body.addObjectValue(KEY_LOCATION, &location);
-	Value cause;
-	switch (br) {
-		case BREAKREASON_ERROR: {
-			cause.addObjectValue(KEY_TITLE, &Value(L"error"));
-			EXCEPINFO excepInfo;
-			HRESULT hr = pScriptErrorDebug->GetExceptionInfo(&excepInfo);
-			if (FAILED(hr)) {
-				Logger::error("IEDebugger::onHandleBreakPoint(): GetExceptionInfo() failed", hr);
-			} else {
-				if (excepInfo.bstrDescription) {
-					cause.addObjectValue(KEY_MESSAGE, &Value(excepInfo.bstrDescription));
-				}
-			}
-			break;
-		}
-		case BREAKREASON_DEBUGGER_HALT: {
-			cause.addObjectValue(KEY_TITLE, &Value(L"suspend"));
-			break;
-		}
-		case BREAKREASON_STEP: {
-			cause.addObjectValue(KEY_TITLE, &Value(L"step"));
-			break;
-		}
-		case BREAKREASON_BREAKPOINT: {
-			cause.addObjectValue(KEY_TITLE, &Value(L"breakpoint"));
-			break;
-		}
-		default: {
-			cause.addObjectValue(KEY_TITLE, &Value(L"suspend"));
-			break;
-		}
-	}
-	body.addObjectValue(KEY_CAUSE, &cause);
-	onBreakEvent.setBody(&body);
-	sendEvent(&onBreakEvent);
-}
-
-bool CrossfireContext::createValueForFrame(IDebugStackFrame* stackFrame, unsigned int frameIndex, bool includeScopes, Value** _value) {
-	*_value = NULL;
-
-	CComBSTR description = NULL;
-	HRESULT hr = stackFrame->GetDescriptionString(true, &description);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.createValueForFrame(): GetDescriptionString() failed", hr);
-		return false;
-	}
-
-	ULONG lineNumber = 0, column;
-	Value* locals = NULL;
-
-	CComPtr<IDebugCodeContext> codeContext = NULL;
-	hr = stackFrame->GetCodeContext(&codeContext);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.createValueForFrame(): GetCodeContext() failed", hr);
-		return false;
-	}
-
-	CComPtr<IDebugDocumentContext> documentContext = NULL;
-	hr = codeContext->GetDocumentContext(&documentContext);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.createValueForFrame(): GetDocumentContext() failed", hr);
-		return false;
-	}
-
-	CComPtr<IDebugDocument> document = NULL;
-	hr = documentContext->GetDocument(&document);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.createValueForFrame(): GetDocument() failed", hr);
-		return false;
-	}
-
-	CComPtr<IDebugDocumentText> documentText = NULL;
-	hr = document->QueryInterface(IID_IDebugDocumentText, (void**)&documentText);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.createValueForFrame(): QI(IDebugDocumentText) failed", hr);
-		return false;
-	}
-
-	ULONG position, numChars;
-	hr = documentText->GetPositionOfContext(documentContext, &position, &numChars);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.createValueForFrame(): GetPositionOfContext() failed", hr);
-		return false;
-	}
-
-	hr = documentText->GetLineOfPosition(position, &lineNumber, &column);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.createValueForFrame(): GetLineOfPosition() failed", hr);
-		return false;
-	}
-
-	/* get the locals */
-
-	CComPtr<IDebugProperty> debugProperty = NULL;
-	hr = stackFrame->GetDebugProperty(&debugProperty);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.createValueForFrame(): GetDebugProperty() failed", hr);
-		return false;
-	}
-
-	// TODO this frameObject is currently created temporarily, but to
-	// get the full benefit of handle reuse it should be stored and
-	// reused for cases where the frame command is invoked on the same
-	// frame multiple times
-	JSObject* newObject = new JSObject();
-	newObject->debugProperty = debugProperty;
-	//newObject->debugProperty->AddRef();
-	newObject->stackFrame = stackFrame;
-	//newObject->stackFrame->AddRef();
-	if (!createValueForObject(newObject, true, &locals)) {
-		delete newObject;
-		return false;
-	}
-	delete newObject;
-
-	/* get "this" */
-
-	Value* value_this = NULL;
-	CComPtr<IDebugProperty> debugProperty2 = NULL;
-	if (evaluate(stackFrame, L"this", DEBUG_TEXT_RETURNVALUE, &debugProperty2)) {
-		// TODO this thisObject is currently created temporarily, but to
-		// get the full benefit of handle reuse it should be stored and
-		// reused for cases where the frame command is invoked on the same
-		// frame multiple times
-		JSObject* newObject = new JSObject();
-		newObject->debugProperty = debugProperty2;
-		//newObject->debugProperty->AddRef();
-		newObject->stackFrame = stackFrame;
-		//newObject->stackFrame->AddRef();
-		createValueForObject(newObject, true, &value_this); /* proceed even if fails */
-		delete newObject;
-	}
-
-	if (value_this) {
-		locals->addObjectValue(KEY_THIS, value_this);
-		delete value_this;
-	} else {
-		/* create an empty "this" value */
-		Value value_thisChildren;
-		value_thisChildren.setType(TYPE_OBJECT);
-		Value value_this2;
-		value_this2.addObjectValue(KEY_TYPE, &Value(VALUE_OBJECT));
-		value_this2.addObjectValue(KEY_VALUE, &value_thisChildren);
-		locals->addObjectValue(KEY_THIS, &value_this2);
-	}
-
-	URL url;
-	CComBSTR bstrUrl = NULL;
-	hr = document->GetName(DOCUMENTNAMETYPE_URL, &bstrUrl);
-	if (SUCCEEDED(hr)) {
-		url.setString(bstrUrl);
-	} else {
-		/*
-		 * Failure to get the URL indicates that the node represents something like a JScript
-		 * block or eval code.  For these cases get the node's title instead and prepend a
-		 * scheme to make it url-like.
-		 */
-		hr = document->GetName(DOCUMENTNAMETYPE_TITLE, &bstrUrl);
-		if (FAILED(hr)) {
-			Logger::error("CrossfireContext.createValueForFrame(): GetName() failed", hr);
-			return false;
-		}
-
-		int length = wcslen(SCHEME_SCRIPT) + wcslen(bstrUrl.m_str) + 1;
-		wchar_t* string = new wchar_t[length];
-		ZeroMemory(string, length * sizeof(wchar_t));
-		wcscat_s(string, length, SCHEME_SCRIPT);
-		wcscat_s(string, length, bstrUrl.m_str);
-		url.setString(string);
-		delete[] string;
-	}
-
-	if (!locals) {
-		locals = new Value();
-		locals->setType(TYPE_OBJECT);
-	}
-
-	Value* result = new Value();
-	result->addObjectValue(KEY_FUNCTIONNAME, &Value(description));
-	result->addObjectValue(KEY_INDEX, &Value((double)frameIndex));
-	result->addObjectValue(KEY_LINE, &Value((double)lineNumber + 1));
-	result->addObjectValue(KEY_LOCALS, locals);
-	result->addObjectValue(KEY_URL, &Value(url.getString()));
-	// TODO includeScopes
-	delete locals;
-
-	*_value = result;
-	return true;
-}
-
-bool CrossfireContext::createValueForObject(JSObject* object, bool resolveChildObjects, Value** _value) {
-	*_value = NULL;
-
-	DebugPropertyInfo propertyInfo;
-	IDebugProperty* debugProperty = object->debugProperty;
-	HRESULT hr = debugProperty->GetPropertyInfo(DBGPROP_INFO_NAME | DBGPROP_INFO_FULLNAME | DBGPROP_INFO_TYPE | DBGPROP_INFO_VALUE | DBGPROP_INFO_ATTRIBUTES | DBGPROP_INFO_DEBUGPROP, 10, &propertyInfo);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.createValueForObject(): GetPropertyInfo() failed", hr);
-		return false;
-	}
-
-	BSTR type = propertyInfo.m_bstrType;
-	Value result;
-	if (wcscmp(type, JSVALUE_NULL) == 0) {
-		result.setType(TYPE_NULL);
-	} else if (wcscmp(type, JSVALUE_UNDEFINED) == 0) {
-		result.setValue(VALUE_UNDEFINED);
-	} else {
-		BSTR stringValue = propertyInfo.m_bstrValue;
-		if (wcscmp(type, JSVALUE_NUMBER) == 0) {
-			wchar_t* endPtr = 0;
-			result.addObjectValue(KEY_TYPE, &Value(VALUE_NUMBER));
-			if (wcscmp(stringValue, NUMBER_NaN) == 0) {
-				result.addObjectValue(KEY_VALUE, &Value(VALUE_NaN));
-			} else if (wcscmp(stringValue, NUMBER_INFINITY) == 0) {
-				result.addObjectValue(KEY_VALUE, &Value(VALUE_INFINITY));
-			} else if (wcscmp(stringValue, NUMBER_NEGATIVEINFINITY) == 0) {
-				result.addObjectValue(KEY_VALUE, &Value(VALUE_NEGATIVEINFINITY));
-			} else {
-				double value = wcstod(stringValue, &endPtr);
-				result.addObjectValue(KEY_VALUE, &Value(value));
-			}
-		} else if (wcscmp(type, JSVALUE_BOOLEAN) == 0) {
-			result.addObjectValue(KEY_TYPE, &Value(VALUE_BOOLEAN));
-			if (wcscmp(stringValue, JSVALUE_TRUE) == 0) {
-				result.addObjectValue(KEY_VALUE, &Value(true));
-			} else {
-				result.addObjectValue(KEY_VALUE, &Value(false));
-			}
-		} else if (wcscmp(type, JSVALUE_STRING) == 0) {
-			std::wstring string(stringValue);
-			string = string.substr(1, string.length() - 2);
-			result.addObjectValue(KEY_TYPE, &Value(VALUE_STRING));
-			result.addObjectValue(KEY_VALUE, &Value(&string));
-		} else if ((propertyInfo.m_dwAttrib & DBGPROP_ATTRIB_VALUE_IS_INVALID) != 0) {
-			// TODO error object, should fail?
-		} else if ((propertyInfo.m_dwAttrib & DBGPROP_ATTRIB_VALUE_IS_EXPANDABLE) == 0) {
-			/* object is a function */
-			result.addObjectValue(KEY_TYPE, &Value(VALUE_FUNCTION));
-			if (resolveChildObjects) {
-				// TODO
-				Value value_empty;
-				value_empty.setType(TYPE_OBJECT);
-				result.addObjectValue(KEY_VALUE, &value_empty);
-			}
-		} else {
-			if (!resolveChildObjects) {
-				result.addObjectValue(KEY_TYPE, &Value(VALUE_OBJECT));
-			} else {
-				CComPtr<IEnumDebugPropertyInfo> enumPropertyInfo = NULL;
-				HRESULT hr = debugProperty->EnumMembers(
-					DBGPROP_INFO_NAME | DBGPROP_INFO_FULLNAME | DBGPROP_INFO_TYPE | DBGPROP_INFO_VALUE | DBGPROP_INFO_ATTRIBUTES | DBGPROP_INFO_DEBUGPROP,
-					10,
-					IID_IDebugPropertyEnumType_LocalsPlusArgs,
-					&enumPropertyInfo);
-				if (FAILED(hr)) {
-					Logger::error("CrossfireContext.createValueForObject(): EnumMembers() failed", hr);
-					return false;
-				}
-
-				/*
-				 * Bug in JScript9.  For some reason the enumPropertyInfo->Next() invocation below fails
-				 * when it is the first invocation on a debug property info enum from a stack frame.
-				 * The workaround is to warm up the enumeration by first getting its count.
-				 */
-				ULONG count = 0;
-				enumPropertyInfo->GetCount(&count);
-
-				Value children;
-				children.setType(TYPE_OBJECT);
-				ULONG fetched;
-				do {
-					DebugPropertyInfo propertyInfo;
-					hr = enumPropertyInfo->Next(1, &propertyInfo, &fetched);
-					if (SUCCEEDED(hr) && fetched) {
-						Value* value_child = NULL;
-						IDebugStackFrame* stackFrame = object->stackFrame;
-						JSObject childObject;
-						childObject.debugProperty = propertyInfo.m_pDebugProp;
-						childObject.stackFrame = stackFrame;
-						if (createValueForObject(&childObject, false, &value_child)) {
-							if (value_child->getType() == TYPE_OBJECT) {
-								Value* value_type = value_child->getObjectValue(KEY_TYPE);
-								const wchar_t* type = value_type->getStringValue()->c_str();
-								if (wcscmp(type, VALUE_OBJECT) == 0 || (wcscmp(type, VALUE_FUNCTION) == 0)) {
-									std::map<std::wstring, unsigned int> objects = object->children;
-									std::map<std::wstring, unsigned int>::iterator iterator = objects.find(propertyInfo.m_bstrName);
-									Value value_handle;
-									if (iterator != objects.end()) {
-										value_handle.setValue((double)iterator->second);
-									} else {
-										value_handle.setValue((double)m_nextObjectHandle);
-										JSObject* newObject = new JSObject();
-										newObject->debugProperty = propertyInfo.m_pDebugProp;
-										newObject->debugProperty->AddRef();
-										newObject->isObject = wcscmp(type, VALUE_OBJECT) == 0;
-										newObject->stackFrame = stackFrame;
-										newObject->stackFrame->AddRef();
-										m_objects->insert(std::pair<unsigned int, JSObject*>(m_nextObjectHandle++, newObject));
-									}
-									value_child->addObjectValue(KEY_HANDLE, &value_handle);
-								}
-							}
-							children.addObjectValue(propertyInfo.m_bstrName, value_child);
-							delete value_child;
-						}
-					}
-				} while (fetched);
-				result.addObjectValue(KEY_TYPE, &Value(VALUE_OBJECT));
-				result.addObjectValue(KEY_VALUE, &children);
-			}
-		}
-	}
-
-	Value* copy = NULL;
-	result.clone(&copy);
-	*_value = copy;
-	return true;
-}
-
-bool CrossfireContext::createValueForScript(IDebugApplicationNode* node, bool includeSource, bool failIfEmpty, Value** _value) {
-	*_value = NULL;
-
-	CComPtr<IDebugDocument> document = NULL;
-	HRESULT hr = node->GetDocument(&document);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.createValueForScript(): GetDocument() failed", hr);
-		return false;
-	}
-
-	CComPtr<IDebugDocumentText> documentText = NULL;
-	hr = document->QueryInterface(IID_IDebugDocumentText, (void**)&documentText);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.createValueForScript(): QI(IDebugDocumentText) failed", hr);
-		return false;
-	}
-
-	ULONG numLines = 0;
-	ULONG numChars = 0;
-	hr = documentText->GetSize(&numLines, &numChars);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.createValueForScript(): GetSize() failed", hr);
-		return false;
-	}
-	if (failIfEmpty && numChars == 0) {
-		return false;
-	}
-
-	URL* url = NULL;
-	if (!getScriptUrl(node, &url)) {
-		Logger::error("CrossfireContext.createValueForScript(): unknown script");
-		return false;
-	}
-
-	Value* result = new Value();
-	result->addObjectValue(KEY_URL, &Value(url->getString()));
-	result->addObjectValue(KEY_LINEOFFSET, &Value((double)0)); // TODO right?
-	result->addObjectValue(KEY_COLUMNOFFSET, &Value((double)0));
-	result->addObjectValue(KEY_SOURCELENGTH, &Value((double)numChars));
-	result->addObjectValue(KEY_LINECOUNT, &Value((double)numLines));
-	if (wcsstr(url->getString(), VALUE_EVALCODE)) {
-		result->addObjectValue(KEY_TYPE, &Value(VALUE_EVALLEVEL)); // TODO right?
-	} else {
-		result->addObjectValue(KEY_TYPE, &Value(VALUE_TOPLEVEL)); // TODO right?
-	}
-	delete url;
-
-	if (includeSource) {
-		wchar_t* sourceChars = new wchar_t[numChars + 1];
-		ULONG charsRead = 0;
-		hr = documentText->GetText(0, sourceChars, NULL, &charsRead, numChars);
-		if (FAILED(hr)) {
-			Logger::error("CrossfireContext.createValueForScript(): GetText()[2] failed", hr);
-			return false;
-		}
-		sourceChars[numChars] = NULL;
-		result->addObjectValue(KEY_SOURCE, &Value(sourceChars));
-		delete[] sourceChars;
-	}
-
-	*_value = result;
-	return true;
-}
-
-bool CrossfireContext::evaluate(IDebugStackFrame* stackFrame, wchar_t* expression, int flags, IDebugProperty** _result) {
-	*_result = NULL;
-
-	CComPtr<IDebugExpressionContext> expressionContext = NULL;
-	HRESULT hr = stackFrame->QueryInterface(IID_IDebugExpressionContext, (void**)&expressionContext);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.evaluate(): QI(IDebugExpressionContext) failed", hr);
-		return false;
-	}
-
-	CComPtr<IDebugExpression> parsedExpression = NULL;
-	hr = expressionContext->ParseLanguageText(
-		expression,
-		10,
-		L"",
-		flags,
-		&parsedExpression);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.evaluate(): ParseLanguageText() failed", hr);
-		return false;
-	}
-
-	hr = parsedExpression->Start(NULL);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.evaluate(): Start() failed", hr);
-		return false;
-	}
-
-	int ms = 0;
-	while (ms < 3000) {
-		if (parsedExpression->QueryIsComplete() == S_OK) {
-			break;
-		}
-		ms += 10;
-		::Sleep(10);
-	}
-	if (2000 <= ms) {
-		parsedExpression->Abort();
-		Logger::error("CrossfireContext.evaluate(): Evaluation took too long");
-		return false;
-	}
-
-	HRESULT evalResult;
-	hr = parsedExpression->GetResultAsDebugProperty(&evalResult, _result);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.evaluate(): GetResultAsDebugProperty() failed", hr);
-		return false;
-	}
-	if (FAILED(evalResult)) {
-		Logger::error("CrossfireContext.evaluate(): evaluation of GetResultAsDebugProperty() failed", evalResult);
-		return false;
-	}
-
-	return true;
-}
-
-bool CrossfireContext::evaluateAsync(IDebugStackFrame* stackFrame, wchar_t* expression, int flags, IJSEvalHandler* handler, void* data) {
-	CComPtr<IDebugExpressionContext> expressionContext = NULL;
-	HRESULT hr = stackFrame->QueryInterface(IID_IDebugExpressionContext, (void**)&expressionContext);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.evaluateAsync(): QI(IDebugExpressionContext) failed", hr);
-		return false;
-	}
-
-	CComPtr<IDebugExpression> parsedExpression = NULL;
-	hr = expressionContext->ParseLanguageText(
-		expression,
-		10,
-		L"",
-		flags,
-		&parsedExpression);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.evaluateAsync(): ParseLanguageText() failed", hr);
-		return false;
-	}
-
-	CComObject<JSEvalCallback>* listener = NULL;
-	hr = CComObject<JSEvalCallback>::CreateInstance(&listener);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.evaluateAsync(): CreateInstance() failed", hr);
-		return false;
-	}
-
-	listener->AddRef(); /* CComObject::CreateInstance gives initial ref count of 0 */
-	m_asyncEvals->push_back(listener);
-	listener->start(parsedExpression, handler, data);
-	return true;
-}
-
-bool CrossfireContext::getDebugApplication(IRemoteDebugApplication** _value) {
-	*_value = NULL;
-
-	CComPtr<IRemoteDebugApplicationThread> thread = NULL;
-	if (!getDebugApplicationThread(&thread)) {
-		return false;
-	}
-
-	HRESULT hr = thread->GetApplication(_value);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.getDebugApplication: GetApplication() failed", hr);
-		return false;
-	}
-
-	return true;
-}
-
-bool CrossfireContext::getDebugApplicationThread(IRemoteDebugApplicationThread** _value) {
-	*_value = NULL;
-
-	if (m_debugApplicationThread) {
-		m_debugApplicationThread->AddRef();
-		*_value = m_debugApplicationThread;
-		return true;
-	}
-
-	CComPtr<IMachineDebugManager> mdm;
-	HRESULT hr = mdm.CoCreateInstance(CLSID_MachineDebugManager, NULL, CLSCTX_ALL);
- 	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.getDebugApplicationThread(): CoCreateInstance(CLSID_MachineDebugManager) failed", hr);
- 		return false;
- 	}
-
-	CComPtr<IEnumRemoteDebugApplications> applications;
-	hr = mdm->EnumApplications(&applications);
- 	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.getDebugApplicationThread(): EnumApplications() failed", hr);
- 		return false;
- 	}
-
-	int failCounter = 0;
-//Logger::log("CrossfireContext.getDebugApplicationThread(): starting loop, looking for", (int)m_threadId);
-	ULONG fetchedApps = 0;
-	do {
-		CComPtr<IRemoteDebugApplication> currentApplication;
-		hr = applications->Next(1, &currentApplication, &fetchedApps);
-		if (FAILED(hr)) {
-			fetchedApps = 1; /* continue to try to enum more applications */
-			failCounter++;
-//			Logger::log("CrossfireContext.getDebugApplicationThread(): Next()[1] failed, keep trying", hr);
-		} else if (fetchedApps) {
-			CComPtr<IEnumRemoteDebugApplicationThreads> threads;
-			hr = currentApplication->EnumThreads(&threads);
-//if (FAILED(hr)) {
-//	Logger::log("CrossfireContext.getDebugApplicationThread(): EnumThreads() failed, keep trying");
-//}
-			if (SUCCEEDED(hr)) {
-				ULONG fetchedThreads = 0;
-				do {
-					CComPtr<IRemoteDebugApplicationThread> currentThread;
-					hr = threads->Next(1, &currentThread, &fetchedThreads);
-					if (FAILED(hr)) {
-						fetchedThreads = 1; /* continue to try to enum more threads */
-//Logger::log("CrossfireContext.getDebugApplicationThread(): Next()[2] failed, keep trying");
-					} else if (fetchedThreads) {
-						DWORD currentThreadId;
-						hr = currentThread->GetSystemThreadId(&currentThreadId);
-						if (FAILED(hr)) {
-							Logger::error("CrossfireContext.getDebugApplicationThread(): GetSystemThreadId() failed", hr);
-						} else if (m_threadId == currentThreadId) {
-							m_debugApplicationThread = currentThread;
-							m_debugApplicationThread->AddRef();
-							break;
-						}
-//else {
-//	Logger::log("CrossfireContext.getDebugApplicationThread(): they didn't match, got", (int)currentThreadId);
-//}
-					}
-				} while (fetchedThreads);
-			}
-		}
-	} while (!m_debugApplicationThread && fetchedApps && failCounter < 20);
-
-	if (!m_debugApplicationThread) {
-		Logger::log("CrossfireContext.getDebugApplicationThread() did not find the thread");
-		return false;
-	}
-
-	m_debugApplicationThread->AddRef();
-	*_value = m_debugApplicationThread;
-	return true;
-}
-
-IDebugApplicationNode* CrossfireContext::getLastInitializedScriptNode() {
-	return m_lastInitializedScriptNode;
-}
-
-wchar_t* CrossfireContext::getName() {
-	return m_name;
-}
-
-DWORD CrossfireContext::getProcessId() {
-	return m_processId;
-}
-
-bool CrossfireContext::getScriptUrl(IDebugApplicationNode* node, URL** _value) {
-	*_value = NULL;
-
-	if (!m_scriptNodes) {
-		return false;
-	}
-
-	std::map<std::wstring, IDebugApplicationNode*>::iterator iterator = m_scriptNodes->begin();
-	while (iterator != m_scriptNodes->end()) {
-		if (iterator->second == node) {
-			*_value = new URL((wchar_t*)iterator->first.c_str());
-			return true;
-		}
-		iterator++;
-	}
-	return false;
-}
-
-IDebugApplicationNode* CrossfireContext::getScriptNode(URL* url) {
-	if (!m_scriptNodes) {
-		return NULL;
-	}
-
-	std::wstring string(url->getString());
-	std::map<std::wstring, IDebugApplicationNode*>::iterator iterator = m_scriptNodes->find(string);
-	if (iterator == m_scriptNodes->end()) {
-		return NULL;
-	}
-
-	return iterator->second;
-}
-
-wchar_t* CrossfireContext::getUrl() {
-	return m_url;
-}
-
-bool CrossfireContext::hookDebugger() {
-	if (m_debuggerHooked) {
-		return true;
-	}
-
-	CComPtr<IRemoteDebugApplication> application = NULL;
-	if (!getDebugApplication(&application)) {
-		return false;
-	}
-
-	CComPtr<IApplicationDebugger> currentDebugger = NULL;
-	HRESULT hr = application->GetDebugger(&currentDebugger);
-	if (SUCCEEDED(hr) && currentDebugger) {
-		Logger::log("CrossfireContext.hookDebugger(): the application already has a debugger");
-		return false;
-	}
-
-	IEDebugger* ieDebugger = static_cast<IEDebugger*>(m_debugger);
-	ieDebugger->setContext(this);
-	hr = application->ConnectDebugger(ieDebugger);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.hookDebugger(): ConnectDebugger() failed", hr);
-		ieDebugger->setContext(NULL);
-		return false;
-	}
-
-	Logger::log("CrossfireContext.hookDebugger(): debugger successfully hooked");
-	m_debuggerHooked = true;
-	return true;
-}
-
-void CrossfireContext::installBreakpoints(std::vector<Value*>* breakpoints) {
-	std::vector<Value*>::iterator iterator = breakpoints->begin();
-	while (iterator != breakpoints->end()) {
-		Value* current = *iterator;
-		std::wstring* type = current->getObjectValue(KEY_TYPE)->getStringValue();
-		if (type->compare(std::wstring(BPTYPE_LINE)) == 0) {
-			Value* value_location = current->getObjectValue(KEY_LOCATION);
-			Value* value_url = value_location->getObjectValue(KEY_LINE);
-			if (value_url && value_url->getType() == TYPE_STRING) {
-
-			}
-		}
-		iterator++;
-	}
-}
-
-bool CrossfireContext::performRequest(CrossfireRequest* request) {
-	if (!m_debuggerHooked) {
-		hookDebugger();
-	}
-	wchar_t* command = request->getName();
-	Value* arguments = request->getArguments();
-	Value* responseBody = NULL;
-	wchar_t* message = NULL;
-	int code = CODE_OK;
-
-	if (wcscmp(command, COMMAND_BACKTRACE) == 0) {
-		code = commandBacktrace(arguments, &responseBody, &message);
-	} else if (wcscmp(command, COMMAND_CONTINUE) == 0) {
-		code = commandContinue(arguments, &responseBody, &message);
-	} else if (wcscmp(command, COMMAND_EVALUATE) == 0) {
-		code = commandEvaluate(arguments, &responseBody, &message);
-	} else if (wcscmp(command, COMMAND_FRAME) == 0) {
-		code = commandFrame(arguments, &responseBody, &message);
-	} else if (wcscmp(command, COMMAND_LOOKUP) == 0) {
-		code = commandLookup(arguments, &responseBody, &message);
-	} else if (wcscmp(command, COMMAND_SCRIPTS) == 0) {
-		code = commandScripts(arguments, &responseBody, &message);
-	} else if (wcscmp(command, COMMAND_SCOPES) == 0) {
-		code = commandScopes(arguments, &responseBody, &message);
-	} else if (wcscmp(command, COMMAND_SUSPEND) == 0) {
-		code = commandSuspend(arguments, &responseBody, &message);
-	} else if (wcscmp(command, COMMAND_INSPECT) == 0) {
-		code = CODE_COMMAND_NOT_IMPLEMENTED;
-	} else {
-		return false;	/* command not handled */
-	}
-
-	CrossfireResponse response;
-	response.setContextId(&std::wstring(m_name));
-	response.setName(command);
-	response.setRequestSeq(request->getSeq());
-	response.setRunning(m_running);
-	response.setCode(code);
-	response.setMessage(message);
-	if (message) {
-		free(message);
-	}
-	if (code == CODE_OK) {
-		response.setBody(responseBody);
-	} else {
-		Value emptyBody;
-		emptyBody.setType(TYPE_OBJECT);
-		response.setBody(&emptyBody);
-	}
-	if (responseBody) {
-		delete responseBody;
-	}
-	m_server->sendResponse(&response);
-	return true;
-}
-
-bool CrossfireContext::registerScript(IDebugApplicationNode* applicationNode, bool recurse) {
-	CComBSTR value = NULL;
-	wchar_t* id = NULL;
-	URL url;
-	HRESULT hr = applicationNode->GetName(DOCUMENTNAMETYPE_URL, &value);
-	if (SUCCEEDED(hr)) {
-		/* don't register about:blank as a script */
-		if (wcscmp(value.m_str, ABOUT_BLANK) == 0) {
-			return false;
-		}
-		url.setString(value.m_str);
-	} else {
-		/*
-		 * Failure to get the URL indicates that the node represents something like a JScript
-		 * block or eval code.  For these cases get the node's title instead and prepend a
-		 * scheme to make it url-like.
-		 */
-		hr = applicationNode->GetName(DOCUMENTNAMETYPE_TITLE, &value);
-		if (FAILED(hr)) {
-			Logger::error("CrossfireContext.registerScript(): GetName() failed", hr);
-			return false;
-		}
-		int length = wcslen(SCHEME_SCRIPT) + wcslen(value.m_str) + 2;
-		wchar_t* string = new wchar_t[length];
-		ZeroMemory(string, length * sizeof(wchar_t));
-		wcscat_s(string, length, SCHEME_SCRIPT);
-		wcscat_s(string, length, value.m_str);
-		wcscat_s(string, length, L"/");
-		url.setString(string);
-		delete[] string;
-	}
-
-	if (!url.isValid()) {
-		return false;
-	}
-
-	if (!m_scriptNodes) {
-		m_scriptNodes = new std::map<std::wstring, IDebugApplicationNode*>;
-	}
-
-	/*
-	 * There could be another script with the same id already registered for id's that
-	 * are not urls.  In this case append a qualifier to the id to make it unique.
-	 */
-	int qualifierIndex = 1;
-	std::wstring key(url.getString());
-	applicationNode->AddRef();
-	while (true) {
-		if (m_scriptNodes->insert(std::pair<std::wstring, IDebugApplicationNode*>(key, applicationNode)).second) {
-			/* script was successfully inserted */
-			break;
-		}
-		key.assign(url.getString());
-		wchar_t qualifierString[4];
-		_ltow_s(qualifierIndex++, qualifierString, 4, 10); /* trailing linebreak */
-		key += qualifierString;
-	}
-	
-	if (recurse) {
-		CComPtr<IEnumDebugApplicationNodes> nodes = NULL;
-		hr = applicationNode->EnumChildren(&nodes);
-		if (FAILED(hr)) {
-			Logger::error("CrossfireContext.registerScript(): EnumChildren() failed", hr);
-		} else {
-			IDebugApplicationNode* current = NULL;
-			ULONG count = 0;
-			hr = nodes->Next(1, &current, &count);
-			while (SUCCEEDED(hr) && count) {
-				registerScript(current, true);
-				current->Release();
-				hr = nodes->Next(1, &current, &count);
-			}
-		}
-	}
-
-	return true;
-}
-
-bool CrossfireContext::resumeFromBreak(BREAKRESUMEACTION action) {
-	CComPtr<IRemoteDebugApplicationThread> thread = NULL;
-	HRESULT hr = getDebugApplicationThread(&thread);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.resumeFromBreak(): getDebugApplicationThread() failed", hr);
-		return false;
-	}
-	CComPtr<IRemoteDebugApplication> application = NULL;
-	hr = thread->GetApplication(&application);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.resumeFromBreak(): GetApplication() failed", hr);
-		return false;
-	}
-	hr = application->ResumeFromBreakPoint(thread, action, ERRORRESUMEACTION_SkipErrorStatement);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.resumeFromBreak(): ResumeFromBreakPoint() failed", hr);
-		return false;
-	}
-	return true;
-}
-
-bool CrossfireContext::scriptInitialized(IDebugApplicationNode *applicationNode, bool isFromAnotherContext) {
-	/*
-	 * When navigating from one page to another, the first script node for the new
-	 * page is initialized while the context for the old page is still active, and
-	 * therefore becomes registered in the wrong context.  The CrossfireServer works
-	 * around this by re-initializing the script node in the new context where it
-	 * belongs.  This workaround is aided here by keeping a reference to the last
-	 * script node that has been initialized from the document tree (but not from
-	 * another context) in case it needs to be accessible to the CrossfireServer for
-	 * re-initialization in a new context.
-	 */
-	if (m_lastInitializedScriptNode) {
-		m_lastInitializedScriptNode->Release();
-		m_lastInitializedScriptNode = NULL;
-	}
-	if (!isFromAnotherContext) {
-		m_lastInitializedScriptNode = applicationNode;
-		m_lastInitializedScriptNode->AddRef();
-	}
-
-	registerScript(applicationNode, false);
-	scriptLoaded(applicationNode, true);
-
-	/*
-	* Script loading is typically not complete when a script node is initialized, and
-	* there is no way to determine whether it is complete, so create a listener that
-	* will repeatedly invoke #scriptLoaded() as loading of the script progresses.
-	*
-	* This is not done for scripts from another context that are being re-initialized
-	* here because such scripts are advised when this context's debugger is created.
-	*/
-	if (!isFromAnotherContext) {
-		CComObject<PendingScriptLoad>* pendingScriptLoad = NULL;
-		HRESULT hr = CComObject<PendingScriptLoad>::CreateInstance(&pendingScriptLoad);
-		if (FAILED(hr)) {
-			Logger::error("CrossfireContext.scriptInitialized(): CreateInstance(CLSID_PendingScriptLoad) failed [1]", hr);
-			return false;
-		}
-
-		if (pendingScriptLoad->attach(applicationNode, this)) {
-			applicationNode->AddRef();
-			pendingScriptLoad->AddRef(); /* CComObject::CreateInstance gives initial ref count of 0 */
-			m_pendingScriptLoads->insert(std::pair<IDebugApplicationNode*, PendingScriptLoad*>(applicationNode, pendingScriptLoad));
-		}
-	}
-
-	return true;
-}
-
-void CrossfireContext::scriptLoaded(IDebugApplicationNode *applicationNode, bool sendScriptLoadEvent) {
-	/* set the script's breakpoints if possible */
-	URL* url = NULL;
-	if (!getScriptUrl(applicationNode, &url)) {
-		Logger::error("CrossfireContext.scriptLoaded(): unknown script");
-		return;
-	}
-	/*
-	 * Incoming IBreakpointTarget method invocations should always be for this
-	 * application node, so store it temporarily so that it's easily accessible,
-	 * rather than repeatedly looking it up for each IBreakpointTarget invocation.
-	 */
-	CrossfireBPManager* bpManager = m_server->getBreakpointManager();
-	m_currentScriptNode = applicationNode;
-	bpManager->setBreakpointsForScript(url, this);
-	m_currentScriptNode = NULL;
-	delete url;
-
-	if (!sendScriptLoadEvent) {
-		return;
-	}
-
-	Value* script = NULL;
-	if (!createValueForScript(applicationNode, false, true, &script)) {
-		/* the script's content has probably not loaded yet */
-		return;
-	}
-
-	CrossfireEvent onScriptEvent;
-	onScriptEvent.setName(EVENT_ONSCRIPT);
-	Value body;
-	body.addObjectValue(KEY_SCRIPT, script);
-	delete script;
-	onScriptEvent.setBody(&body);
-	sendEvent(&onScriptEvent);
-}
-
-void CrossfireContext::sendEvent(CrossfireEvent* eventObj) {
-	eventObj->setContextId(&std::wstring(m_name));
-	m_server->sendEvent(eventObj);
-}
-
-bool CrossfireContext::unhookDebugger() {
-	if (!m_debuggerHooked) {
-		return true;
-	}
-
-	CComPtr<IRemoteDebugApplication> application = NULL;
-	if (!getDebugApplication(&application)) {
-		return false;
-	}
-	HRESULT hr = application->DisconnectDebugger();
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.unhookDebugger(): DisconnectDebugger() failed", hr);
-	}
-
-	static_cast<IEDebugger*>(m_debugger)->setContext(NULL);
-	return SUCCEEDED(hr);
-}
-
-/* commands */
-
-int CrossfireContext::commandBacktrace(Value* arguments, Value** _responseBody, wchar_t** _message) {
-	if (m_running) {
-		*_message = _wcsdup(L"'backtrace' request is only valid when execution is suspended");
-		return CODE_INVALID_STATE;
-	}
-
-	unsigned int fromFrame = 0;
-	Value* value_fromFrame = arguments->getObjectValue(KEY_FROMFRAME);
-	if (value_fromFrame) {
-		if (value_fromFrame->getType() != TYPE_NUMBER || (unsigned int)value_fromFrame->getNumberValue() < 0) {
-			*_message = _wcsdup(L"'backtrace' command has an invalid 'fromFrame' value");
-			return CODE_INVALID_ARGUMENT;
-		}
-		fromFrame = (unsigned int)value_fromFrame->getNumberValue();
-	}
-
-	unsigned int toFrame = 99;
-	Value* value_toFrame = arguments->getObjectValue(KEY_TOFRAME);
-	if (value_toFrame) {
-		if (value_toFrame->getType() != TYPE_NUMBER || (unsigned int)value_toFrame->getNumberValue() < 0) {
-			*_message = _wcsdup(L"'backtrace' command has an invalid 'toFrame' value");
-			return CODE_INVALID_ARGUMENT;
-		}
-		toFrame = (unsigned int)value_toFrame->getNumberValue();
-		if (toFrame < fromFrame) {
-			*_message = _wcsdup(L"'backtrace' command has 'toFrame' value < 'fromFrame' value");
-			return CODE_INVALID_ARGUMENT;
-		}
-	}
-
-	bool includeScopes = true;
-	Value* value_includeScopes = arguments->getObjectValue(KEY_INCLUDESCOPES);
-	if (value_includeScopes) {
-		if (value_includeScopes->getType() != TYPE_BOOLEAN) {
-			*_message = _wcsdup(L"'backtrace' command has an invalid 'includeScopes' value");
-			return CODE_INVALID_ARGUMENT;
-		}
-		includeScopes = value_includeScopes->getBooleanValue();
-	}
-
-	CComPtr<IRemoteDebugApplicationThread> applicationThread = NULL;
-	if (!getDebugApplicationThread(&applicationThread)) {
-		return CODE_UNEXPECTED_EXCEPTION;
-	}
-
-	CComPtr<IEnumDebugStackFrames> stackFrames = NULL;
-	HRESULT hr = applicationThread->EnumStackFrames(&stackFrames);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.commandBacktrace(): EnumStackFrames() failed", hr);
-		return CODE_UNEXPECTED_EXCEPTION;
-	}
-
-	if (fromFrame > 0) {
-		HRESULT hr = stackFrames->Skip(fromFrame);
-		if (FAILED(hr)) {
-			Logger::error("CrossfireContext.commandBacktrace(): Skip() failed", hr);
-			return CODE_COMMAND_FAILED;
-		}
-	}
-
-	/* count the available frames, and adjust toFrame accordingly if needed */
-
-	Value framesArray;
-	framesArray.setType(TYPE_ARRAY);
-	unsigned int index = 0;
-	for (index = fromFrame; index <= toFrame; index++) {
-		ULONG fetched = 0;
-		DebugStackFrameDescriptor stackFrameDescriptor;
-		hr = stackFrames->Next(1, &stackFrameDescriptor, &fetched);
-		if (FAILED(hr) || fetched == 0) {
-			/*
-			 * Have enumerated past the last stack frame, which is expected
-			 * to happen if the toFrame value is not specified or is too large.
-			 */
-			break;
-		}
-
-		Value* frame = NULL;
-		if (!createValueForFrame(stackFrameDescriptor.pdsf, index, includeScopes, &frame)) {
-			/* Attempting to access a frame without available information, break */
-			break;
-		}
-
-		framesArray.addArrayValue(frame);
-		delete frame;
-	}
-
-	/* index now points to one frame beyond the last frame to be returned */
-
-	int totalFrameCount = index;
-
-	/*
-	 * If the frame with index toFrame was reached successfully then continue on to
-	 * count any remaining frames in order to determine totalFrameCount.
-	 */
-	if (toFrame < index) {
-		while (true) {
-			ULONG fetched = 0;
-			DebugStackFrameDescriptor stackFrameDescriptor;
-			hr = stackFrames->Next(1, &stackFrameDescriptor, &fetched);
-			if (FAILED(hr) || fetched == 0) {
-				break;
-			}
-			totalFrameCount++;
-		}
-	}
-
-	Value* result = new Value();
-	result->addObjectValue(KEY_FRAMES, &framesArray);
-	result->addObjectValue(KEY_FROMFRAME, &Value((double)fromFrame));
-	result->addObjectValue(KEY_TOFRAME, &Value((double)index - 1));
-	result->addObjectValue(KEY_TOTALFRAMES, &Value((double)totalFrameCount));
-	*_responseBody = result;
-	return CODE_OK;
-}
-
-int CrossfireContext::commandContinue(Value* arguments, Value** _responseBody, wchar_t** _message) {
-	if (m_running) {
-		*_message = _wcsdup(L"'continue' request is only valid when execution is suspended");
-		return CODE_INVALID_STATE;
-	}
-
-	BREAKRESUMEACTION action;
-	Value* value_action = NULL;
-	if (arguments) {
-		value_action = arguments->getObjectValue(KEY_STEPACTION);
-	}
-	if (!value_action) {
-		action = BREAKRESUMEACTION_CONTINUE;
-	} else {
-		if (value_action->getType() != TYPE_STRING) {
-			*_message = _wcsdup(L"'continue' command has invalid 'stepaction' value");
-			return CODE_INVALID_ARGUMENT;
-		}
-		std::wstring* actionString = value_action->getStringValue();
-		if (actionString->compare(VALUE_IN) == 0) {
-			action = BREAKRESUMEACTION_STEP_INTO;
-		} else if (actionString->compare(VALUE_NEXT) == 0) {
-			action = BREAKRESUMEACTION_STEP_OVER;
-		} else if (actionString->compare(VALUE_OUT) == 0) {
-			action = BREAKRESUMEACTION_STEP_OUT;
-		} else {
-			*_message = _wcsdup(L"'continue' command has invalid 'stepaction' value");
-			return CODE_INVALID_ARGUMENT;
-		}
-	}
-
-	CComPtr<IRemoteDebugApplicationThread> applicationThread = NULL;
-	if (!getDebugApplicationThread(&applicationThread)) {
-		return CODE_UNEXPECTED_EXCEPTION;
-	}
-	CComPtr<IRemoteDebugApplication> application = NULL;
-	HRESULT hr = applicationThread->GetApplication(&application);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.commandContinue(): GetApplication() failed", hr);
-		return CODE_UNEXPECTED_EXCEPTION;
-	}
-
-	hr = application->ResumeFromBreakPoint(applicationThread, action, ERRORRESUMEACTION_SkipErrorStatement);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.commandContinue(): ResumeFromBreakPoint() failed", hr);
-		return CODE_UNEXPECTED_EXCEPTION;
-	}
-
-	CrossfireEvent onResumeEvent;
-	onResumeEvent.setName(EVENT_ONRESUME);
-	Value body;
-	body.setType(TYPE_OBJECT);
-	onResumeEvent.setBody(&body);
-	sendEvent(&onResumeEvent);
-
-	clearObjects();
-	*_responseBody = new Value();
-	(*_responseBody)->setType(TYPE_OBJECT);
-	m_running = true;
-	return CODE_OK;
-}
-
-int CrossfireContext::commandEvaluate(Value* arguments, Value** _responseBody, wchar_t** _message) {
-	if (m_running) {
-		*_message = _wcsdup(L"'evaluate' request is only valid when execution is suspended");
-		return CODE_INVALID_STATE;
-	}
-
-	unsigned int frame = 0;
-	Value* value_frame = arguments->getObjectValue(KEY_FRAMEINDEX);
-	if (value_frame) {
-		if (value_frame->getType() != TYPE_NUMBER || (unsigned int)value_frame->getNumberValue() < 0) {
-			*_message = _wcsdup(L"'evaluate' command has invalid 'frame' value");
-			return CODE_INVALID_ARGUMENT;
-		}
-		frame = (unsigned int)value_frame->getNumberValue();
-	}
-
-	Value* value_expression = arguments->getObjectValue(KEY_EXPRESSION);
-	if (!value_expression || value_expression->getType() != TYPE_STRING) {
-		*_message = _wcsdup(L"'evaluate' command does not have a valid 'expression' value");
-		return CODE_INVALID_ARGUMENT;
-	}
-
-	CComPtr<IRemoteDebugApplicationThread> applicationThread = NULL;
-	if (!getDebugApplicationThread(&applicationThread)) {
-		return CODE_UNEXPECTED_EXCEPTION;
-	}
-
-	CComPtr<IEnumDebugStackFrames> stackFrames = NULL;
-	HRESULT hr = applicationThread->EnumStackFrames(&stackFrames);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.commandEvaluate(): EnumStackFrames() failed", hr);
-		return CODE_UNEXPECTED_EXCEPTION;
-	}
-
-	if (frame > 0) {
-		hr = stackFrames->Skip(frame);
-		if (FAILED(hr)) {
-			Logger::error("CrossfireContext.commandEvaluate(): Skip() failed", hr);
-			return CODE_COMMAND_FAILED;
-		}
-	}
-
-	ULONG fetched = 0;
-	DebugStackFrameDescriptor stackFrameDescriptor;
-	hr = stackFrames->Next(1, &stackFrameDescriptor, &fetched);
-	if (FAILED(hr) || fetched == 0) {
-		Logger::error("CrossfireContext.commandEvaluate(): Next() failed", hr);
-		return CODE_COMMAND_FAILED;
-	}
-
-	IDebugStackFrame* stackFrame = stackFrameDescriptor.pdsf;
-	CComPtr<IDebugProperty> debugProperty = NULL;
-	if (!evaluate(
-		stackFrame,
-		(wchar_t *)value_expression->getStringValue()->c_str(),
-		DEBUG_TEXT_ISEXPRESSION | DEBUG_TEXT_RETURNVALUE | DEBUG_TEXT_ALLOWBREAKPOINTS | DEBUG_TEXT_ALLOWERRORREPORT,
-		&debugProperty)) {
-			return CODE_COMMAND_FAILED;
-	}
-
-	JSObject newObject;
-	newObject.debugProperty = debugProperty;
-	newObject.stackFrame = stackFrame;
-	Value* value_result = NULL;
-	if (!createValueForObject(&newObject, true, &value_result)) {
-		return CODE_UNEXPECTED_EXCEPTION;
-	}
-
-	Value* result = new Value();
-	result->addObjectValue(KEY_RESULT, value_result);
-	delete value_result;
-	*_responseBody = result;
-	return CODE_OK;
-}
-
-int CrossfireContext::commandFrame(Value* arguments, Value** _responseBody, wchar_t** _message) {
-	if (m_running) {
-		*_message = _wcsdup(L"'frame' request is only valid when execution is suspended");
-		return CODE_INVALID_STATE;
-	}
-
-	bool includeScopes = true;
-	Value* value_includeScopes = arguments->getObjectValue(KEY_INCLUDESCOPES);
-	if (value_includeScopes) {
-		if (value_includeScopes->getType() != TYPE_BOOLEAN) {
-			*_message = _wcsdup(L"'frame' command has an invalid 'includeScopes' value");
-			return CODE_INVALID_ARGUMENT;
-		}
-		includeScopes = value_includeScopes->getBooleanValue();
-	}
-
-	unsigned int index = 0;
-	Value* value_index = arguments->getObjectValue(KEY_INDEX);
-	if (value_index) {
-		if (value_index->getType() != TYPE_NUMBER || (unsigned int)value_index->getNumberValue() < 0) {
-			*_message = _wcsdup(L"'frame' command has an invalid 'index' value");
-			return CODE_INVALID_ARGUMENT;
-		}
-		index = (unsigned int)value_index->getNumberValue();
-	}
-
-	CComPtr<IRemoteDebugApplicationThread> applicationThread = NULL;
-	if (!getDebugApplicationThread(&applicationThread)) {
-		return false;
-	}
-
-	CComPtr<IEnumDebugStackFrames> stackFrames = NULL;
-	HRESULT hr = applicationThread->EnumStackFrames(&stackFrames);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.commandFrame(): EnumStackFrames() failed", hr);
-		return CODE_UNEXPECTED_EXCEPTION;
-	}
-
-	if (index > 0) {
-		hr = stackFrames->Skip(index);
-		if (FAILED(hr)) {
-			Logger::error("CrossfireContext.commandFrame(): Skip() failed", hr);
-			return CODE_COMMAND_FAILED;
-		}
-	}
-
-	ULONG fetched = 0;
-	DebugStackFrameDescriptor stackFrameDescriptor;
-	hr = stackFrames->Next(1, &stackFrameDescriptor, &fetched);
-	if (FAILED(hr) || fetched == 0) {
-		Logger::error("CrossfireContext.commandFrame(): Next() failed", hr);
-		return CODE_COMMAND_FAILED;
-	}
-
-	Value* frame = NULL;
-	if (!createValueForFrame(stackFrameDescriptor.pdsf, index, includeScopes, &frame)) {
-		return CODE_UNEXPECTED_EXCEPTION;
-	}
-
-	Value* result = new Value();
-	result->addObjectValue(KEY_FRAME, frame);
-	*_responseBody = result;
-	delete frame;
-	return CODE_OK;
-}
-
-int CrossfireContext::commandLookup(Value* arguments, Value** _responseBody, wchar_t** _message) {
-	if (m_running) {
-		*_message = _wcsdup(L"'lookup' request is only valid when execution is suspended");
-		return CODE_INVALID_STATE;
-	}
-
-	Value* value_handles = arguments->getObjectValue(KEY_HANDLES);
-	if (!value_handles || value_handles->getType() != TYPE_ARRAY) {
-		*_message = _wcsdup(L"'lookup' command does not have a valid 'handles' value");
-		return CODE_INVALID_ARGUMENT;
-	}
-
-	bool includeSource = false;
-	Value* value_includeSource = arguments->getObjectValue(KEY_INCLUDESOURCE);
-	if (value_includeSource) {
-		if (value_includeSource->getType() != TYPE_BOOLEAN) {
-			*_message = _wcsdup(L"'lookup' command has an invalid 'includeSource' value");
-			return CODE_INVALID_ARGUMENT;
-		}
-		includeSource = value_includeSource->getBooleanValue();
-	}
-
-	Value** handles = NULL;
-	value_handles->getArrayValues(&handles);
-	Value value_values;
-	value_values.setType(TYPE_ARRAY);
-	int index = 0;
-	Value* current = handles[index++];
-	while (current) {
-		if (current->getType() == TYPE_NUMBER && current->getNumberValue() > 0) {
-			unsigned int handle = (unsigned int)current->getNumberValue();
-			std::map<unsigned int, JSObject*>::iterator iterator = m_objects->find(handle);
-			if (iterator != m_objects->end()) {
-				JSObject* object = iterator->second;
-				Value* value_object = NULL;
-				if (createValueForObject(object, true, &value_object)) {
-					value_object->addObjectValue(KEY_HANDLE, current);
-					if (includeSource && !object->isObject) {
-						// TODO
-				//		GUID iid;
-				//		IIDFromString(OLESTR("{94E1E004-0672-423d-AD62-78783DEF1E76}"), &iid);
-				//		CComPtr<IDebugProperty3> documentContext = NULL;
-				//		HRESULT hr2 = object->debugProperty->QueryInterface(iid, (LPVOID*)&documentContext);
-				//		if (SUCCEEDED(hr2)) {
-				//			ULONG len = 0;
-				//			hr2 = documentContext->GetStringCharLength(&len);
-				//			if (SUCCEEDED(hr2)) {
-				//				Logger::error("maybe?");
-				//			}
-				//		}
-				//		VARIANT info;
-				//		object->debugProperty->GetExtendedInfo(1, &iid, &info); 
-				//		if (info.vt == VT_UNKNOWN) {
-				//			CComPtr<IDebugDocumentContext2> documentContext = NULL;
-				//			IIDFromString(OLESTR("{931516ad-b600-419c-88fc-dcf5183b5fa9}"), &iid);
-				//			HRESULT hr = info.punkVal->QueryInterface(/*IID_IDebugDocumentContext2*/iid, (LPVOID*)&documentContext);
-				//			if (FAILED(hr)) {
-				//				Logger::error("CrossfireContext.commandLookup(): QI(IDebugDocumentContext2) failed", hr);
-				//			} else {
-				//				TEXT_POSITION start, end;
-				//				hr = documentContext->GetSourceRange(&start, &end);
-				//				if (FAILED(hr)) {
-				//					Logger::error("CrossfireContext.commandLookup(): GetSourceRange() failed", hr);
-				//				}
-				//			}
-				//		}
-					}
-					value_values.addArrayValue(value_object);
-					delete value_object;
-				}
-			}
-		}
-		current = handles[index++];
-	}
-	delete[] handles;
-
-	Value* result = new Value();
-	result->addObjectValue(KEY_VALUES, &value_values);
-	*_responseBody = result;
-	return CODE_OK;
-}
-
-int CrossfireContext::commandScopes(Value* arguments, Value** _responseBody, wchar_t** _message) {
-	if (m_running) {
-		*_message = _wcsdup(L"'scopes' request is only valid when execution is suspended");
-		return CODE_INVALID_STATE;
-	}
-
-	// TODO
-	return CODE_COMMAND_NOT_IMPLEMENTED;
-}
-
-int CrossfireContext::commandScripts(Value* arguments, Value** _responseBody, wchar_t** _message) {
-	bool includeSource = false;
-	Value* value_includeSource = arguments->getObjectValue(KEY_INCLUDESOURCE);
-	if (value_includeSource) {
-		if (value_includeSource->getType() != TYPE_BOOLEAN) {
-			*_message = _wcsdup(L"'scripts' command has an invalid 'includeSource' value");
-			return CODE_INVALID_ARGUMENT;
-		}
-		includeSource = value_includeSource->getBooleanValue();
-	}
-
-	Value* value_ids = arguments->getObjectValue(KEY_URLS);
-	Value** ids = NULL;
-	if (value_ids) {
-		if (value_ids->getType() != TYPE_ARRAY) {
-			*_message = _wcsdup(L"'scripts' command has an invalid 'urls' value");
-			return CODE_INVALID_ARGUMENT;
-		}
-		value_ids->getArrayValues(&ids);
-	}
-
-	/*
-	 * If no scripts have attempted to register yet then this context may have been
-	 * created after its page had already loaded (eg.- before a connection to the
-	 * crossfire server was established).  If the application has a tree of scripts
-	 * then register them now, starting one level below the root.
-	 */
-	if (!m_scriptNodes) {
-		CComPtr<IRemoteDebugApplication> application = NULL;
-		if (getDebugApplication(&application)) {
-			CComPtr<IDebugApplicationNode> rootNode = NULL;
-			HRESULT hr = application->GetRootNode(&rootNode);
-			if (SUCCEEDED(hr)) {
-				CComPtr<IEnumDebugApplicationNodes> nodes = NULL;
-				hr = rootNode->EnumChildren(&nodes);
-				if (SUCCEEDED(hr)) {
-					IDebugApplicationNode* current = NULL;
-					ULONG count = 0;
-					hr = nodes->Next(1, &current, &count);
-					while (SUCCEEDED(hr) && count) {
-						registerScript(current, true);
-						current->Release();
-						hr = nodes->Next(1, &current, &count);
-					}
-				}
-			}
-		}
-	}
-
-	Value scriptsArray;
-	scriptsArray.setType(TYPE_ARRAY);
-	if (m_scriptNodes) {
-		std::map<std::wstring, IDebugApplicationNode*>::iterator iterator = m_scriptNodes->begin();
-		while (iterator != m_scriptNodes->end()) {
-			Value* value = NULL;
-			IDebugApplicationNode* node = iterator->second;
-			bool include = false;
-			if (!ids) {
-				include = true;
-			} else {
-				URL* url = NULL;
-				getScriptUrl(node, &url);
-				int index = 0;
-				Value* current = ids[index++];
-				while (current) {
-					if (current->getType() == TYPE_STRING) {
-						if (url->isEqual((wchar_t*)current->getStringValue()->c_str())) {
-							include = true;
-							break;
-						}
-					}
-					current = ids[index++];
-				}
-				delete url;
-			}
-			if (include && createValueForScript(node, includeSource, false, &value)) {
-				scriptsArray.addArrayValue(value);
-				delete value;
-			}
-			iterator++;
-		}
-	}
-
-	delete[] ids;
-	Value* result = new Value();
-	result->addObjectValue(KEY_SCRIPTS, &scriptsArray);
-	*_responseBody = result;
-	return CODE_OK;
-}
-
-int CrossfireContext::commandSuspend(Value* arguments, Value** _responseBody, wchar_t** _message) {
-	if (!m_running) {
-		*_message = _wcsdup(L"'suspend' request is not valid when execution is suspended");
-		return CODE_INVALID_STATE;
-	}
-
-	CComPtr<IRemoteDebugApplication> application = NULL;
-	if (!getDebugApplication(&application)) {
-		return CODE_UNEXPECTED_EXCEPTION;
-	}
-
-	HRESULT hr = application->CauseBreak();
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.commandSuspend(): CauseBreak() failed", hr);
-		return CODE_UNEXPECTED_EXCEPTION;
-	}
-
-	*_responseBody = new Value();
-	(*_responseBody)->setType(TYPE_OBJECT);
-	return CODE_OK;
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireContext.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireContext.h
deleted file mode 100644
index b8dc673..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireContext.h
+++ /dev/null
@@ -1,231 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include "activdbg.h"
-#include <vector>
-
-#include "CrossfireEvent.h"
-#include "CrossfireLineBreakpoint.h"
-#include "CrossfireRequest.h"
-#include "CrossfireResponse.h"
-#include "IBreakpointTarget.h"
-#include "IECrossfireServer.h"
-#include "JSEvalCallback.h"
-#include "Value.h"
-#include "Logger.h"
-
-class CrossfireContext; // forward declaration
-#include "PendingScriptLoad.h"
-#include "CrossfireServer.h"
-#include "IEDebugger.h"
-
-class CrossfireContext : IBreakpointTarget, IJSEvalHandler {
-
-public:
-	CrossfireContext(DWORD processId, DWORD threadId, wchar_t* url, CrossfireServer* server);
-	virtual ~CrossfireContext();
-	void breakpointHit(IRemoteDebugApplicationThread *pDebugAppThread, BREAKREASON br, IActiveScriptErrorDebug *pScriptErrorDebug);
-	bool getDebugApplication(IRemoteDebugApplication** _value);
-	IDebugApplicationNode* getLastInitializedScriptNode();
-	wchar_t* getName();
-	DWORD getProcessId();
-	wchar_t* getUrl();
-	void installBreakpoints(std::vector<Value*>* breakpoints);
-	bool performRequest(CrossfireRequest* request);
-	bool scriptInitialized(IDebugApplicationNode *applicationNode, bool isFromAnotherContext);
-	void scriptLoaded(IDebugApplicationNode *applicationNode, bool sendScriptLoadEvent);
-
-	/* IBreakpointTarget methods */
-	bool breakpointAttributeChanged(unsigned int handle, wchar_t* name, Value* value);
-	bool deleteBreakpoint(unsigned int handle);
-	CrossfireBreakpoint* getBreakpoint(unsigned int handle);
-	void getBreakpoints(CrossfireBreakpoint*** ___values);
-	bool setBreakpoint(CrossfireBreakpoint* breakpoint);
-
-	/* IJSEvalHandler methods */
-	void evalComplete(IDebugProperty* value, void* data);
-
-private:
-	struct JSObject {
-		std::map<std::wstring, unsigned int> children;
-		IDebugProperty* debugProperty;
-		bool isObject;
-		IDebugStackFrame* stackFrame;
-	};
-
-	void clearObjects();
-	bool createValueForFrame(IDebugStackFrame* stackFrame, unsigned int frameIndex, bool includeScopes, Value** _value);
-	bool createValueForObject(JSObject* object, bool resolveChildObjects, Value** _value);
-	bool createValueForScript(IDebugApplicationNode* node, bool includeSource, bool failIfEmpty, Value** _value);
-	bool evaluate(IDebugStackFrame* stackFrame, wchar_t* expression, int flags, IDebugProperty** _result);
-	bool evaluateAsync(IDebugStackFrame* stackFrame, wchar_t* expression, int flags, IJSEvalHandler* handler, void* data);
-	bool getDebugApplicationThread(IRemoteDebugApplicationThread** _value);
-	bool getScriptUrl(IDebugApplicationNode* node, URL** _value);
-	IDebugApplicationNode* getScriptNode(URL* url);
-	bool hookDebugger();
-	bool registerScript(IDebugApplicationNode* applicationNode, bool recurse);
-	bool resumeFromBreak(BREAKRESUMEACTION action);
-	void sendEvent(CrossfireEvent* eventObj);
-	bool setBreakpointEnabled(CrossfireBreakpoint* breakpoint, bool enabled);
-	bool unhookDebugger();
-
-	std::vector<JSEvalCallback*>* m_asyncEvals;
-	std::map<unsigned int, CrossfireBreakpoint*>* m_breakpoints;
-	DWORD m_cpcApplicationNodeEvents;
-	IDebugApplicationNode* m_currentScriptNode;
-	IRemoteDebugApplicationThread* m_debugApplicationThread;
-	IIEDebugger* m_debugger;
-	IDebugApplicationNode* m_lastInitializedScriptNode;
-	bool m_debuggerHooked;
-	wchar_t* m_name;
-	unsigned int m_nextObjectHandle;
-	std::map<unsigned int, JSObject*>* m_objects;
-	std::map<IDebugApplicationNode*, PendingScriptLoad*>* m_pendingScriptLoads;
-	DWORD m_processId;
-	bool m_running;
-	std::map<std::wstring, IDebugApplicationNode*>* m_scriptNodes;
-	CrossfireServer* m_server;
-	DWORD m_threadId;
-	wchar_t* m_url;
-
-	/* command: backtrace */
-	static const wchar_t* COMMAND_BACKTRACE;
-	static const wchar_t* KEY_FRAMES;
-	static const wchar_t* KEY_FROMFRAME;
-	static const wchar_t* KEY_TOFRAME;
-	static const wchar_t* KEY_TOTALFRAMES;
-	int commandBacktrace(Value* arguments, Value** _responseBody, wchar_t** _message);
-
-	/* command: continue */
-	static const wchar_t* COMMAND_CONTINUE;
-	int commandContinue(Value* arguments, Value** _responseBody, wchar_t** _message);
-
-	/* command: evaluate */
-	static const wchar_t* COMMAND_EVALUATE;
-	static const wchar_t* KEY_EXPRESSION;
-	static const wchar_t* KEY_RESULT;
-	int commandEvaluate(Value* arguments, Value** _responseBody, wchar_t** _message);
-
-	/* command: frame */
-	static const wchar_t* COMMAND_FRAME;
-	static const wchar_t* KEY_FRAME;
-	static const wchar_t* KEY_INDEX;
-	int commandFrame(Value* arguments, Value** _responseBody, wchar_t** _message);
-
-	/* command: inspect */
-	static const wchar_t* COMMAND_INSPECT;
-
-	/* command: lookup */
-	static const wchar_t* COMMAND_LOOKUP;
-	static const wchar_t* KEY_HANDLES;
-	static const wchar_t* KEY_VALUES;
-	int commandLookup(Value* arguments, Value** _responseBody, wchar_t** _message);
-
-	/* command: scopes */
-	static const wchar_t* COMMAND_SCOPES;
-	static const wchar_t* KEY_FROMSCOPE;
-	static const wchar_t* KEY_SCOPES;
-	static const wchar_t* KEY_TOSCOPE;
-	static const wchar_t* KEY_TOTALSCOPECOUNT;
-	int commandScopes(Value* arguments, Value** _responseBody, wchar_t** _message);
-
-	/* command: scripts */
-	static const wchar_t* COMMAND_SCRIPTS;
-	static const wchar_t* KEY_SCRIPTS;
-	static const wchar_t* KEY_URLS;
-	int commandScripts(Value* arguments, Value** _responseBody, wchar_t** _message);
-
-	/* command: suspend */
-	static const wchar_t* COMMAND_SUSPEND;
-	static const wchar_t* KEY_STEPACTION;
-	static const wchar_t* VALUE_IN;
-	static const wchar_t* VALUE_NEXT;
-	static const wchar_t* VALUE_OUT;
-	int commandSuspend(Value* arguments, Value** _responseBody, wchar_t** _message);
-
-	/* event: onBreak */
-	static const wchar_t* EVENT_ONBREAK;
-	static const wchar_t* KEY_CAUSE;
-	static const wchar_t* KEY_MESSAGE;
-	static const wchar_t* KEY_TITLE;
-
-	/* event: onResume */
-	static const wchar_t* EVENT_ONRESUME;
-
-	/* event: onScript */
-	static const wchar_t* EVENT_ONSCRIPT;
-	static const wchar_t* KEY_SCRIPT;
-
-	/* event: onToggleBreakpoint */
-	static const wchar_t* EVENT_ONTOGGLEBREAKPOINT;
-	static const wchar_t* KEY_SET;
-
-	/* shared */
-	static const wchar_t* KEY_BREAKPOINT;
-	static const wchar_t* KEY_CONTEXTID;
-	static const wchar_t* KEY_FRAMEINDEX;
-	static const wchar_t* KEY_HANDLE;
-	static const wchar_t* KEY_INCLUDESCOPES;
-	static const wchar_t* KEY_INCLUDESOURCE;
-	static const wchar_t* KEY_LINE;
-	static const wchar_t* KEY_LOCATION;
-	static const wchar_t* KEY_TYPE;
-	static const wchar_t* KEY_URL;
-
-	/* breakpoint objects */
-	static const wchar_t* BPTYPE_LINE;
-
-	/* frame objects */
-	static const wchar_t* KEY_FUNCTIONNAME;
-
-	/* object objects */
-	static const wchar_t* JSVALUE_BOOLEAN;
-	static const wchar_t* JSVALUE_FUNCTION;
-	static const wchar_t* JSVALUE_NUMBER;
-	static const wchar_t* JSVALUE_NULL;
-	static const wchar_t* JSVALUE_STRING;
-	static const wchar_t* JSVALUE_TRUE;
-	static const wchar_t* JSVALUE_UNDEFINED;
-	static const wchar_t* KEY_LOCALS;
-	static const wchar_t* KEY_THIS;
-	static const wchar_t* KEY_VALUE;
-	static const wchar_t* VALUE_BOOLEAN;
-	static const wchar_t* VALUE_FUNCTION;
-	static const wchar_t* VALUE_NUMBER;
-	static const wchar_t* VALUE_OBJECT;
-	static const wchar_t* VALUE_STRING;
-	static const wchar_t* VALUE_UNDEFINED;
-
-	/* script objects */
-	static const wchar_t* KEY_COLUMNOFFSET;
-	static const wchar_t* KEY_LINECOUNT;
-	static const wchar_t* KEY_LINEOFFSET;
-	static const wchar_t* KEY_SOURCE;
-	static const wchar_t* KEY_SOURCELENGTH;
-	static const wchar_t* VALUE_EVALCODE;
-	static const wchar_t* VALUE_EVALLEVEL;
-	static const wchar_t* VALUE_TOPLEVEL;
-
-	/* other */
-	static const wchar_t* ABOUT_BLANK;
-	static const wchar_t* ID_PREAMBLE;
-	static const wchar_t* NUMBER_INFINITY;
-	static const wchar_t* NUMBER_NaN;
-	static const wchar_t* NUMBER_NEGATIVEINFINITY;
-	static const wchar_t* PDM_DLL;
-	static const wchar_t* SCHEME_SCRIPT;
-	static const wchar_t* VALUE_INFINITY;
-	static const wchar_t* VALUE_NaN;
-	static const wchar_t* VALUE_NEGATIVEINFINITY;
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireEvent.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireEvent.cpp
deleted file mode 100644
index 21ce09d..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireEvent.cpp
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "StdAfx.h"
-#include "CrossfireEvent.h"
-
-CrossfireEvent::CrossfireEvent() : CrossfirePacket() {
-	m_body = NULL;
-}
-
-CrossfireEvent::~CrossfireEvent() {
-	if (m_body) {
-		delete m_body;
-	}
-}
-
-void CrossfireEvent::clone(CrossfirePacket** _value) {
-	CrossfireEvent* result = new CrossfireEvent();
-	result->setContextId(getContextId());
-	result->setBody(m_body);
-	result->setName(getName());
-	*_value = result;
-}
-
-Value* CrossfireEvent::getBody() {
-	return m_body;
-}
-
-int CrossfireEvent::getType() {
-	return TYPE_EVENT;
-}
-
-bool CrossfireEvent::setBody(Value* value) {
-	if (value && value->getType() != TYPE_OBJECT) {
-		return false;
-	}
-	if (m_body) {
-		delete m_body;
-		m_body = NULL;
-	}
-	if (value) {
-		value->clone(&m_body);
-	}
-	return true;
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireEvent.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireEvent.h
deleted file mode 100644
index 1c17004..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireEvent.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include "CrossfirePacket.h"
-#include "Value.h"
-
-class CrossfireEvent : public CrossfirePacket {
-
-public:
-	CrossfireEvent();
-	virtual ~CrossfireEvent();
-	void clone(CrossfirePacket** _value);
-	Value* getBody();
-	int getType();
-	bool setBody(Value* value);
-
-private:
-	Value* m_body;
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireLineBreakpoint.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireLineBreakpoint.cpp
deleted file mode 100644
index 0d810fb..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireLineBreakpoint.cpp
+++ /dev/null
@@ -1,218 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "StdAfx.h"
-#include "CrossfireLineBreakpoint.h"
-
-/* initialize constants */
-const wchar_t* CrossfireLineBreakpoint::BPTYPESTRING_LINE = L"line";
-const wchar_t* CrossfireLineBreakpoint::KEY_CONDITION = L"condition";
-const wchar_t* CrossfireLineBreakpoint::KEY_ENABLED = L"enabled";
-const wchar_t* CrossfireLineBreakpoint::KEY_HITCOUNT = L"hitCount";
-const wchar_t* CrossfireLineBreakpoint::KEY_LINE = L"line";
-const wchar_t* CrossfireLineBreakpoint::KEY_URL = L"url";
-const wchar_t* CrossfireLineBreakpoint::ATTRIBUTE_CONDITION = KEY_CONDITION;
-const wchar_t* CrossfireLineBreakpoint::ATTRIBUTE_ENABLED = KEY_ENABLED;
-const wchar_t* CrossfireLineBreakpoint::ATTRIBUTE_HITCOUNT = KEY_HITCOUNT;
-
-CrossfireLineBreakpoint::CrossfireLineBreakpoint() : CrossfireBreakpoint() {
-	m_hitCounter = 0;
-	m_line = -1;
-	m_url = NULL;
-}
-
-CrossfireLineBreakpoint::CrossfireLineBreakpoint(unsigned int handle) : CrossfireBreakpoint(handle) {
-	m_hitCounter = 0;
-	m_line = -1;
-	m_url = NULL;
-}
-
-CrossfireLineBreakpoint::~CrossfireLineBreakpoint() {
-	if (m_url) {
-		delete m_url;
-	}
-}
-
-bool CrossfireLineBreakpoint::CanHandleBPType(wchar_t* type) {
-	return wcscmp(type, BPTYPESTRING_LINE) == 0;
-}
-
-bool CrossfireLineBreakpoint::appliesToUrl(URL* url) {
-	if (!m_url) {
-		return false;
-	}
-	return m_url->isEqual(url);
-}
-
-bool CrossfireLineBreakpoint::attributeIsValid(wchar_t* name, Value* value) {
-	if (wcscmp(name, ATTRIBUTE_CONDITION) == 0) {
-		return (value->getType() & (TYPE_STRING | TYPE_NULL)) != 0;
-	}
-
-	if (wcscmp(name, ATTRIBUTE_ENABLED) == 0) {
-		return (value->getType() & (TYPE_BOOLEAN | TYPE_NULL)) != 0;
-	}
-
-	if (wcscmp(name, ATTRIBUTE_HITCOUNT) == 0) {
-		return value->getType() == TYPE_NULL || (value->getType() == TYPE_NUMBER && value->getNumberValue() >= 0);
-	}
-
-	/* unknown attribute */
-	return false;
-}
-
-void CrossfireLineBreakpoint::breakpointHit() {
-	m_hitCounter++;
-}
-
-void CrossfireLineBreakpoint::clone(CrossfireBreakpoint** _value) {
-	CrossfireLineBreakpoint* result = new CrossfireLineBreakpoint(getHandle());
-	result->setCondition((std::wstring*)getCondition());
-	result->setContextId((std::wstring*)getContextId());
-	result->setEnabled(isEnabled());
-	result->setHitCount(getHitCount());
-	result->setLine(getLine());
-	result->setTarget(getTarget());
-	result->setUrl((URL*)getUrl());
-	*_value = result;
-}
-
-const std::wstring* CrossfireLineBreakpoint::getCondition() {
-	Value* value = getAttribute((wchar_t*)ATTRIBUTE_CONDITION);
-	if (value) {
-		return value->getStringValue();
-	}
-	return NULL;
-}
-
-unsigned int CrossfireLineBreakpoint::getHitCount() {
-	Value* value = getAttribute((wchar_t*)ATTRIBUTE_HITCOUNT);
-	if (value) {
-		return (unsigned int)value->getNumberValue();
-	}
-	return 0;
-}
-
-unsigned int CrossfireLineBreakpoint::getLine() {
-	return m_line;
-}
-
-bool CrossfireLineBreakpoint::getLocationAsValue(Value** _value) {
-	if (!m_url || m_line < 0) {
-		return false;
-	}
-	Value* result = new Value();
-	result->setObjectValue(KEY_URL, &Value(m_url->getString()));
-	result->setObjectValue(KEY_LINE, &Value((double)m_line));
-	*_value = result;
-	return true;
-}
-
-int CrossfireLineBreakpoint::getType() {
-	return BPTYPE_LINE;
-}
-
-const wchar_t* CrossfireLineBreakpoint::getTypeString() {
-	return BPTYPESTRING_LINE;
-}
-
-const URL* CrossfireLineBreakpoint::getUrl() {
-	return m_url;
-}
-
-bool CrossfireLineBreakpoint::isEnabled() {
-	Value* value = getAttribute((wchar_t*)ATTRIBUTE_ENABLED);
-	if (value) {
-		return value->getBooleanValue();
-	}
-	return true;
-}
-
-bool CrossfireLineBreakpoint::matchesHitCount() {
-	unsigned int hitCount = getHitCount();
-	if (!hitCount) {
-		return true;
-	}
-	return hitCount == m_hitCounter;
-}
-
-bool CrossfireLineBreakpoint::matchesLocation(CrossfireBreakpoint* breakpoint) {
-	if (!m_url) {
-		return false;
-	}
-	if (breakpoint->getType() != BPTYPE_LINE) {
-		return false;
-	}
-	CrossfireLineBreakpoint* lineBp = (CrossfireLineBreakpoint*)breakpoint;
-	if (lineBp->getLine() != m_line) {
-		return false;
-	}
-	if (!m_url->isEqual((URL*)lineBp->getUrl())) {
-		return false;
-	}
-	return true;
-}
-
-void CrossfireLineBreakpoint::setCondition(std::wstring* value) {
-	if (!value) {
-		Value value_null;
-		value_null.setType(TYPE_NULL);
-		setAttribute((wchar_t*)ATTRIBUTE_CONDITION, &value_null);
-	} else {
-		setAttribute((wchar_t*)ATTRIBUTE_CONDITION, &Value(value));
-	}
-}
-
-void CrossfireLineBreakpoint::setEnabled(bool value) {
-	setAttribute((wchar_t*)ATTRIBUTE_ENABLED, &Value(value));
-}
-
-void CrossfireLineBreakpoint::setHitCount(unsigned int value) {
-	setAttribute((wchar_t*)ATTRIBUTE_HITCOUNT, &Value((double)value));
-}
-
-void CrossfireLineBreakpoint::setLine(unsigned int value) {
-	m_line = value;
-}
-
-bool CrossfireLineBreakpoint::setLocationFromValue(Value* value) {
-	Value* value_url = value->getObjectValue(KEY_URL);
-	if (!value_url || value_url->getType() != TYPE_STRING) {
-		return false;
-	}
-
-	Value* value_line = value->getObjectValue(KEY_LINE);
-	if (!value_line || value_line->getType() != TYPE_NUMBER || value_line->getNumberValue() < 1) {
-		return false;
-	}
-
-	std::wstring* url = value_url->getStringValue();
-	if (!setUrl(&URL((wchar_t*)url->c_str()))) {
-		return false;
-	}
-	setLine((unsigned int)value_line->getNumberValue());
-
-	return true;
-}
-
-bool CrossfireLineBreakpoint::setUrl(URL* value) {
-	if (!value) {
-		return false;
-	}
-
-	if (m_url) {
-		delete m_url;
-	}
-
-	m_url = new URL(value->getString());
-	return true;
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireLineBreakpoint.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireLineBreakpoint.h
deleted file mode 100644
index 617dad0..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireLineBreakpoint.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include "Logger.h"
-#include "URL.h"
-class CrossfireLineBreakpoint; // forward declaration
-#include "CrossfireBreakpoint.h"
-
-class CrossfireLineBreakpoint : public CrossfireBreakpoint {
-
-public:
-	CrossfireLineBreakpoint();
-	virtual ~CrossfireLineBreakpoint();
-	bool appliesToUrl(URL* url);
-	void breakpointHit();
-	void clone(CrossfireBreakpoint** _value);
-	const std::wstring* getCondition();
-	unsigned int getHitCount();
-	unsigned int getLine();
-	int getType();
-	const wchar_t* getTypeString();
-	const URL* getUrl();
-	bool isEnabled();
-	bool matchesHitCount();
-	bool matchesLocation(CrossfireBreakpoint* breakpoint);
-	void setCondition(std::wstring* value);
-	void setEnabled(bool value);
-	void setHitCount(unsigned int value);
-	void setLine(unsigned int value);
-	bool setLocationFromValue(Value* value);
-	bool setUrl(URL* value);
-
-	/* static methods */
-	static bool CanHandleBPType(wchar_t* type);
-
-	static const wchar_t* ATTRIBUTE_CONDITION;
-	static const wchar_t* ATTRIBUTE_ENABLED;
-	static const wchar_t* ATTRIBUTE_HITCOUNT;
-
-protected:
-	CrossfireLineBreakpoint(unsigned int handle);
-	bool attributeIsValid(wchar_t* name, Value* value);
-	bool getLocationAsValue(Value** _value);
-
-private:
-	unsigned int m_hitCounter;
-	unsigned int m_line;
-	URL* m_url;
-
-	static const wchar_t* BPTYPESTRING_LINE;
-	static const wchar_t* KEY_CONDITION;
-	static const wchar_t* KEY_ENABLED;
-	static const wchar_t* KEY_HITCOUNT;
-	static const wchar_t* KEY_LINE;
-	static const wchar_t* KEY_URL;
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfirePacket.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfirePacket.cpp
deleted file mode 100644
index ac7b12e..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfirePacket.cpp
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "stdafx.h"
-#include "CrossfirePacket.h"
-
-CrossfirePacket::CrossfirePacket() {
-	m_contextId = NULL;
-	m_name = NULL;
-	m_seq = -1;
-}
-
-CrossfirePacket::~CrossfirePacket() {
-	if (m_contextId) {
-		delete m_contextId;
-	}
-	if (m_name) {
-		free(m_name);
-	}
-}
-
-std::wstring* CrossfirePacket::getContextId() {
-	return m_contextId;
-}
-
-wchar_t* CrossfirePacket::getName() {
-	return m_name;
-}
-
-unsigned int CrossfirePacket::getSeq() {
-	return m_seq;
-}
-
-void CrossfirePacket::setContextId(std::wstring* value) {
-	if (m_contextId) {
-		delete m_contextId;
-		m_contextId = NULL;
-	}
-	if (value) {
-		m_contextId = new std::wstring;
-		m_contextId->assign(*value);
-	}
-}
-
-void CrossfirePacket::setName(const wchar_t* value) {
-	if (m_name) {
-		free(m_name);
-		m_name = NULL;
-	}
-	if (value) {
-		m_name = _wcsdup(value);
-	}
-}
-
-void CrossfirePacket::setSeq(unsigned int value) {
-	m_seq = value;
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfirePacket.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfirePacket.h
deleted file mode 100644
index ef6231d..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfirePacket.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include <string>
-
-class CrossfirePacket {
-
-public:
-	CrossfirePacket();
-	virtual ~CrossfirePacket();
-	virtual void clone(CrossfirePacket** _value) = 0;
-	std::wstring* getContextId();
-	wchar_t* getName();
-	unsigned int getSeq();
-	virtual int getType() = 0;
-	void setContextId(std::wstring* value);
-	void setName(const wchar_t* value);
-	void setSeq(unsigned int);
-
-	enum {
-		TYPE_REQUEST,
-		TYPE_RESPONSE,
-		TYPE_EVENT
-	};
-
-private:
-	std::wstring* m_contextId;
-	wchar_t* m_name;
-	unsigned int m_seq;
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireProcessor.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireProcessor.cpp
deleted file mode 100644
index 0350a2a..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireProcessor.cpp
+++ /dev/null
@@ -1,243 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "stdafx.h"
-#include "CrossfireProcessor.h"
-
-/* initialize constants */
-const wchar_t* CrossfireProcessor::HEADER_CONTENTLENGTH = L"Content-Length:";
-const wchar_t* CrossfireProcessor::LINEBREAK = L"\r\n";
-const size_t CrossfireProcessor::LINEBREAK_LENGTH = 2;
-const wchar_t* CrossfireProcessor::NAME_ARGUMENTS = L"arguments";
-const wchar_t* CrossfireProcessor::NAME_BODY = L"body";
-const wchar_t* CrossfireProcessor::NAME_CODE = L"code";
-const wchar_t* CrossfireProcessor::NAME_COMMAND = L"command";
-const wchar_t* CrossfireProcessor::NAME_CONTEXTID = L"contextId";
-const wchar_t* CrossfireProcessor::NAME_EVENT = L"event";
-const wchar_t* CrossfireProcessor::NAME_MESSAGE = L"message";
-const wchar_t* CrossfireProcessor::NAME_REQUESTSEQ = L"requestSeq";
-const wchar_t* CrossfireProcessor::NAME_RUNNING = L"running";
-const wchar_t* CrossfireProcessor::NAME_SEQ = L"seq";
-const wchar_t* CrossfireProcessor::NAME_STATUS = L"status";
-const wchar_t* CrossfireProcessor::NAME_TYPE = L"type";
-const wchar_t* CrossfireProcessor::VALUE_EVENT = L"event";
-const wchar_t* CrossfireProcessor::VALUE_REQUEST = L"request";
-const wchar_t* CrossfireProcessor::VALUE_RESPONSE = L"response";
-
-CrossfireProcessor::CrossfireProcessor() {
-	m_jsonParser = new JSONParser();
-	m_nextEventSeq = 0;
-}
-
-CrossfireProcessor::~CrossfireProcessor() {
-	delete m_jsonParser;
-}
-
-bool CrossfireProcessor::createEventPacket(CrossfireEvent* eventObj, std::wstring** _value) {
-	*_value = NULL;
-	Value value_packet;
-
-	/* packet type */
-	value_packet.addObjectValue(NAME_TYPE, &Value(VALUE_EVENT));
-
-	/* event type */
-	if (!eventObj->getName()) {
-		Logger::error("CrossfireProcessor.createEventPacket(): event does not have a name");
-		return false;
-	}
-	value_packet.addObjectValue(NAME_EVENT, &Value(eventObj->getName()));
-
-	/* context id */
-	if (eventObj->getContextId()) {
-		value_packet.addObjectValue(NAME_CONTEXTID, &Value(eventObj->getContextId()));
-	} else {
-		Value value_null;
-		value_null.setType(TYPE_NULL);
-		value_packet.addObjectValue(NAME_CONTEXTID, &value_null);
-	}
-
-	/* body */
-	Value* bodyValue = eventObj->getBody();
-	if (bodyValue) {
-		if (bodyValue->getType() != TYPE_OBJECT) {
-			Logger::error("CrossfireProcessor.createEventPacket(): event has body object of wrong type");
-			return false;
-		}
-		value_packet.addObjectValue(NAME_BODY, bodyValue);
-	}
-
-	/* seq */
-	value_packet.setObjectValue(NAME_SEQ, &Value((double)m_nextEventSeq++));
-
-	std::wstring* content = NULL;
-	m_jsonParser->stringify(&value_packet, &content);
-	wchar_t length[9];
-	_ltow_s((unsigned int)content->length() + LINEBREAK_LENGTH, length, 9, 10); /* trailing linebreak */
-	std::wstring* eventString = new std::wstring;
-	eventString->append(HEADER_CONTENTLENGTH);
-	eventString->append(length);
-	eventString->append(LINEBREAK);
-	eventString->append(LINEBREAK);
-	eventString->append(*content);
-	eventString->append(LINEBREAK);
-	delete content;
-
-	*_value = eventString;
-	return true;
-}
-
-bool CrossfireProcessor::createResponsePacket(CrossfireResponse *response, std::wstring **_value) {
-	static unsigned int s_nextResponseSeq = 0;
-	*_value = NULL;
-	Value value_packet;
-
-	/* packet type */
-	value_packet.addObjectValue(NAME_TYPE, &Value(VALUE_RESPONSE));
-
-	/* command */
-	if (!response->getName()) {
-		Logger::error("CrossfireProcessor.createResponsePacket(): response does not have a name");
-		return false;
-	}
-	value_packet.addObjectValue(NAME_COMMAND, &Value(response->getName()));
-
-	/* contextId */
-	if (response->getContextId()) {
-		value_packet.addObjectValue(NAME_CONTEXTID, &Value(response->getContextId()));
-	} else {
-		Value value_null;
-		value_null.setType(TYPE_NULL);
-		value_packet.addObjectValue(NAME_CONTEXTID, &value_null);
-	}
-
-	/* request seq */
-	if (response->getRequestSeq() < 0) {
-		Logger::error("CrossfireProcessor.createResponsePacket(): response does not have a request seq value");
-		return false;
-	}
-	value_packet.addObjectValue(NAME_REQUESTSEQ, &Value((double)response->getRequestSeq()));
-
-	/* status */
-	Value status;
-	status.addObjectValue(NAME_CODE, &Value((double)response->getCode()));
-	status.addObjectValue(NAME_RUNNING, &Value(response->getRunning()));
-	wchar_t* message = response->getMessage();
-	if (message) {
-		status.addObjectValue(NAME_MESSAGE, &Value(message));
-	}
-	value_packet.addObjectValue(NAME_STATUS, &status);
-
-	/* body */
-	Value* bodyValue = response->getBody();
-	if (!bodyValue || bodyValue->getType() != TYPE_OBJECT) {
-		Logger::error("CrossfireProcessor.createResponsePacket(): response does not have a body value of type object");
-		return false;
-	}
-	value_packet.addObjectValue(NAME_BODY, bodyValue);
-
-	/* seq */
-	value_packet.setObjectValue(NAME_SEQ, &Value((double)s_nextResponseSeq++));
-	std::wstring* content = NULL;
-	m_jsonParser->stringify(&value_packet, &content);
-	wchar_t length[9];
-	_ltow_s((unsigned int)content->length() + LINEBREAK_LENGTH, length, 9, 10); /* trailing linebreak */
-	std::wstring* responseString = new std::wstring;
-	responseString->append(HEADER_CONTENTLENGTH);
-	responseString->append(length);
-	responseString->append(LINEBREAK);
-	responseString->append(LINEBREAK);
-	responseString->append(*content);
-	responseString->append(LINEBREAK);
-	delete content;
-
-	*_value = responseString;
-	return true;
-}
-
-int CrossfireProcessor::parseRequestPacket(std::wstring* msg, CrossfireRequest** _value, wchar_t** _message) {
-	*_value = NULL;
-	*_message = NULL;
-
-	size_t startIndex = msg->find(L"\r\n\r\n") + 2 * LINEBREAK_LENGTH; /* header linebreak */
-	size_t msgLength = msg->length();
-
-	if (msg->at(msgLength - 2) != wchar_t('\r')) {
-		*_message = _wcsdup(L"Request packet does not contain terminating '\\r'");
-		return CODE_MALFORMED_PACKET;
-	}
-	if (msg->at(msgLength - 1) != wchar_t('\n')) {
-		*_message = _wcsdup(L"Request packet does not contain terminating '\\n'");
-		return CODE_MALFORMED_PACKET;
-	}
-
-	std::wstring content = msg->substr(startIndex, msgLength - startIndex - LINEBREAK_LENGTH); /* trailing linebreak */
-
-	Value* value_request = NULL;
-	m_jsonParser->parse(&content, &value_request);
-	if (!value_request) {
-		*_message = _wcsdup(L"Failure occurred while parsing Request packet content");
-		return CODE_MALFORMED_PACKET;
-	}
-
-	Value* value_type = value_request->getObjectValue(NAME_TYPE);
-	if (!value_type || value_type->getType() != TYPE_STRING || value_type->getStringValue()->compare(VALUE_REQUEST) != 0) {
-		*_message = _wcsdup(L"Request packet does not contain a 'type' value of \"request\"");
-		delete value_request;
-		return CODE_MALFORMED_REQUEST;
-	}
-
-	Value* value_seq = value_request->getObjectValue(NAME_SEQ);
-	if (!value_seq || value_seq->getType() != TYPE_NUMBER || value_seq->getNumberValue() < 0) {
-		*_message = _wcsdup(L"Request packet does not contain a 'seq' Number value >= 0");
-		delete value_request;
-		return CODE_MALFORMED_REQUEST;
-	}
-
-	Value* value_command = value_request->getObjectValue(NAME_COMMAND);
-	if (!value_command || value_command->getType() != TYPE_STRING) {
-		*_message = _wcsdup(L"Request packet does not contain a String 'command' value");
-		delete value_request;
-		return CODE_MALFORMED_REQUEST;
-	}
-
-	Value* value_contextId = value_request->getObjectValue(NAME_CONTEXTID);
-	if (value_contextId && value_contextId->getType() != TYPE_STRING) {
-		*_message = _wcsdup(L"Request packet contains a non-string 'context_id' value");
-		delete value_request;
-		return CODE_MALFORMED_REQUEST;
-	}
-
-	Value* value_arguments = value_request->getObjectValue(NAME_ARGUMENTS);
-	if (value_arguments && value_arguments->getType() != TYPE_OBJECT) {
-		*_message = _wcsdup(L"Request packet contains a non-object 'arguments' value");
-		delete value_request;
-		return CODE_MALFORMED_REQUEST;
-	}
-
-	CrossfireRequest* result = new CrossfireRequest();
-	result->setName((wchar_t*)value_command->getStringValue()->c_str());
-	result->setSeq((unsigned int)value_seq->getNumberValue());
-	if (value_contextId) {
-		result->setContextId(value_contextId->getStringValue());
-	}
-	if (value_arguments) {
-		result->setArguments(value_arguments);
-	} else {
-		Value value_empty;
-		value_empty.setType(TYPE_OBJECT);
-		result->setArguments(&value_empty);
-	}
-
-	*_value = result;
-	delete value_request;
-	return CODE_OK;
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireProcessor.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireProcessor.h
deleted file mode 100644
index 9f52e25..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireProcessor.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include <queue>
-
-#include "CrossfireEvent.h"
-#include "CrossfireRequest.h"
-#include "CrossfireResponse.h"
-#include "JSONParser.h"
-#include "Value.h"
-#include "Logger.h"
-
-class CrossfireProcessor {
-
-public:
-	CrossfireProcessor();
-	~CrossfireProcessor();
-	bool createEventPacket(CrossfireEvent* eventObj, std::wstring** _value);
-	bool createResponsePacket(CrossfireResponse* response, std::wstring** _value);
-	int parseRequestPacket(std::wstring* msg, CrossfireRequest** _value, wchar_t** _message);
-
-private:
-	JSONParser* m_jsonParser;
-	unsigned int m_nextEventSeq;
-
-	/* constants */
-	static const wchar_t* HEADER_CONTENTLENGTH;
-	static const wchar_t* LINEBREAK;
-	static const size_t LINEBREAK_LENGTH;
-	static const wchar_t* NAME_ARGUMENTS;
-	static const wchar_t* NAME_BODY;
-	static const wchar_t* NAME_CODE;
-	static const wchar_t* NAME_COMMAND;
-	static const wchar_t* NAME_CONTEXTID;
-	static const wchar_t* NAME_EVENT;
-	static const wchar_t* NAME_MESSAGE;
-	static const wchar_t* NAME_REQUESTSEQ;
-	static const wchar_t* NAME_RUNNING;
-	static const wchar_t* NAME_SEQ;
-	static const wchar_t* NAME_STATUS;
-	static const wchar_t* NAME_TYPE;
-	static const wchar_t* VALUE_EVENT;
-	static const wchar_t* VALUE_REQUEST;
-	static const wchar_t* VALUE_RESPONSE;
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireRequest.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireRequest.cpp
deleted file mode 100644
index b03cf31..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireRequest.cpp
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "stdafx.h"
-#include "CrossfireRequest.h"
-
-CrossfireRequest::CrossfireRequest() : CrossfirePacket() {
-	m_arguments = NULL;
-}
-
-CrossfireRequest::~CrossfireRequest() {
-	if (m_arguments) {
-		delete m_arguments;
-	}
-}
-
-void CrossfireRequest::clone(CrossfirePacket** _value) {
-	CrossfireRequest* result = new CrossfireRequest();
-	result->setArguments(m_arguments);
-	result->setContextId(getContextId());
-	result->setName(getName());
-	*_value = result;
-}
-
-Value* CrossfireRequest::getArguments() {
-	return m_arguments;
-}
-
-int CrossfireRequest::getType() {
-	return TYPE_REQUEST;
-}
-
-bool CrossfireRequest::setArguments(Value* value) {
-	if (value && value->getType() != TYPE_OBJECT) {
-		return false;
-	}
-	if (m_arguments) {
-		delete m_arguments;
-		m_arguments = NULL;
-	}
-	if (value) {
-		value->clone(&m_arguments);
-	}
-	return true;
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireRequest.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireRequest.h
deleted file mode 100644
index 394215b..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireRequest.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include "CrossfirePacket.h"
-#include "Value.h"
-
-class CrossfireRequest : public CrossfirePacket {
-
-public:
-	CrossfireRequest();
-	virtual ~CrossfireRequest();
-	void clone(CrossfirePacket** _value);
-	Value* getArguments();
-	int getType();
-	bool setArguments(Value* value);
-
-private:
-	Value* m_arguments;
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireResponse.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireResponse.cpp
deleted file mode 100644
index b45e663..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireResponse.cpp
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "stdafx.h"
-#include "CrossfireResponse.h"
-
-CrossfireResponse::CrossfireResponse() : CrossfirePacket() {
-	m_body = NULL;
-	m_code = CODE_OK;
-	m_message = NULL;
-	m_requestSeq = -1;
-	m_running = false;
-}
-
-CrossfireResponse::~CrossfireResponse() {
-	if (m_body) {
-		delete m_body;
-	}
-	if (m_message) {
-		free(m_message);
-	}
-}
-
-void CrossfireResponse::clone(CrossfirePacket** _value) {
-	CrossfireResponse* result = new CrossfireResponse();
-	result->setBody(m_body);
-	result->setCode(m_code);
-	result->setMessage(m_message);
-	result->setName(getName());
-	result->setRequestSeq(m_requestSeq);
-	result->setRunning(m_running);
-	*_value = result;
-}
-
-Value* CrossfireResponse::getBody() {
-	return m_body;
-}
-
-int CrossfireResponse::getCode() {
-	return m_code;
-}
-
-wchar_t* CrossfireResponse::getMessage() {
-	return m_message;
-}
-
-unsigned int CrossfireResponse::getRequestSeq() {
-	return m_requestSeq;
-}
-
-bool CrossfireResponse::getRunning() {
-	return m_running;
-}
-
-int CrossfireResponse::getType() {
-	return TYPE_RESPONSE;
-}
-
-bool CrossfireResponse::setBody(Value* value) {
-	if (value && value->getType() != TYPE_OBJECT) {
-		return false;
-	}
-	if (m_body) {
-		delete m_body;
-		m_body = NULL;
-	}
-	if (value) {
-		value->clone(&m_body);
-	}
-	return true;
-}
-
-void CrossfireResponse::setCode(int value) {
-	m_code = value;
-}
-
-void CrossfireResponse::setMessage(wchar_t* value) {
-	if (m_message) {
-		free(m_message);
-		m_message = NULL;
-	}
-	if (value) {
-		m_message = _wcsdup(value);
-	}
-}
-
-void CrossfireResponse::setRequestSeq(unsigned int value) {
-	m_requestSeq = value;
-}
-
-void CrossfireResponse::setRunning(bool value) {
-	m_running = value;
-}
-
-
-
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireResponse.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireResponse.h
deleted file mode 100644
index d6eeb14..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireResponse.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include "CrossfirePacket.h"
-#include "Value.h"
-
-enum {
-	CODE_OK = 0,
-	CODE_MALFORMED_PACKET,
-	CODE_MALFORMED_REQUEST,
-	CODE_COMMAND_NOT_IMPLEMENTED,
-	CODE_INVALID_ARGUMENT,
-	CODE_UNEXPECTED_EXCEPTION,
-	CODE_COMMAND_FAILED,
-	CODE_INVALID_STATE,
-};
-
-class CrossfireResponse : public CrossfirePacket {
-
-public:
-	CrossfireResponse();
-	virtual ~CrossfireResponse();
-	void clone(CrossfirePacket** _value);
-	Value* getBody();
-	int getCode();
-	wchar_t* getMessage();
-	unsigned int getRequestSeq();
-	bool getRunning();
-	int getType();
-	bool setBody(Value* value);
-	void setCode(int code);
-	void setMessage(wchar_t* value);
-	void setRequestSeq(unsigned int value);
-	void setRunning(bool value);
-
-private:
-	Value* m_body;
-	int m_code;
-	wchar_t* m_message;
-	unsigned int m_requestSeq;
-	bool m_running;
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServer.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServer.cpp
deleted file mode 100644
index 2277014..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServer.cpp
+++ /dev/null
@@ -1,937 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "stdafx.h"
-#include "CrossfireServer.h"
-
-/* initialize constants */
-const wchar_t* CrossfireServer::ABOUT_BLANK = L"about:blank";
-const UINT CrossfireServer::ServerStateChangeMsg = RegisterWindowMessage(L"IECrossfireServerStateChanged");
-const wchar_t* CrossfireServer::WindowClass = L"_IECrossfireServer";
-
-const wchar_t* CrossfireServer::HANDSHAKE = L"CrossfireHandshake\r\n";
-const wchar_t* CrossfireServer::HEADER_CONTENTLENGTH = L"Content-Length:";
-const wchar_t* CrossfireServer::LINEBREAK = L"\r\n";
-const size_t CrossfireServer::LINEBREAK_LENGTH = 2;
-
-const wchar_t* CrossfireServer::COMMAND_CHANGEBREAKPOINTS = L"changeBreakpoints";
-const wchar_t* CrossfireServer::COMMAND_DELETEBREAKPOINTS = L"deleteBreakpoints";
-const wchar_t* CrossfireServer::COMMAND_GETBREAKPOINTS = L"getBreakpoints";
-const wchar_t* CrossfireServer::COMMAND_SETBREAKPOINTS = L"setBreakpoints";
-
-/* command: createContext */
-const wchar_t* CrossfireServer::COMMAND_CREATECONTEXT = L"createContext";
-
-/* command: disableTools */
-const wchar_t* CrossfireServer::COMMAND_DISABLETOOLS = L"disableTools";
-
-/* command: enableTools */
-const wchar_t* CrossfireServer::COMMAND_ENABLETOOLS = L"enableTools";
-
-/* command: getTools */
-const wchar_t* CrossfireServer::COMMAND_GETTOOLS = L"getTools";
-
-/* command: listContexts */
-const wchar_t* CrossfireServer::COMMAND_LISTCONTEXTS = L"listContexts";
-const wchar_t* CrossfireServer::KEY_CONTEXTS = L"contexts";
-const wchar_t* CrossfireServer::KEY_CURRENT = L"current";
-
-/* command: version */
-const wchar_t* CrossfireServer::COMMAND_VERSION = L"version";
-const wchar_t* CrossfireServer::KEY_VERSION = L"version";
-const wchar_t* CrossfireServer::VERSION_STRING = L"0.3";
-
-/* event: closed */
-const wchar_t* CrossfireServer::EVENT_CLOSED = L"closed";
-
-/* event: onContextCreated */
-const wchar_t* CrossfireServer::EVENT_CONTEXTCREATED = L"onContextCreated";
-
-/* event: onContextDestroyed */
-const wchar_t* CrossfireServer::EVENT_CONTEXTDESTROYED = L"onContextDestroyed";
-
-/* event: onContextLoaded */
-const wchar_t* CrossfireServer::EVENT_CONTEXTLOADED = L"onContextLoaded";
-
-/* event: onContextSelected */
-const wchar_t* CrossfireServer::EVENT_CONTEXTSELECTED = L"onContextSelected";
-const wchar_t* CrossfireServer::KEY_OLDCONTEXTID = L"oldContextId";
-const wchar_t* CrossfireServer::KEY_OLDURL = L"oldUrl";
-
-/* shared */
-const wchar_t* CrossfireServer::KEY_CONTEXTID = L"contextId";
-const wchar_t* CrossfireServer::KEY_TOOLS = L"tools";
-const wchar_t* CrossfireServer::KEY_URL = L"url";
-
-
-CrossfireServer::CrossfireServer() {
-	m_bpManager = new CrossfireBPManager();
-	m_connection = NULL;
-	m_connectionWarningShown = false;
-	m_contexts = new std::map<DWORD, CrossfireContext*>;
-	m_currentContextPID = 0;
-	m_handshakeReceived = false;
-	m_inProgressPacket = new std::wstring;
-	m_lastRequestSeq = -1;
-	m_browsers = new std::map<DWORD, IBrowserContext*>;
-	m_pendingEvents = new std::vector<CrossfireEvent*>;
-	m_port = -1;
-	m_processingRequest = false;
-	m_processor = new CrossfireProcessor();
-	m_windowHandle = 0;
-
-	/* create a message-only window to help clients detect the server's presence */
-	HINSTANCE module = GetModuleHandle(NULL);
-	WNDCLASS ex;
-	ex.style = 0;
-	ex.lpfnWndProc = WndProc;
-	ex.cbClsExtra = 0;
-	ex.cbWndExtra = 0;
-	ex.hInstance = module;
-	ex.hIcon = NULL;
-	ex.hCursor = NULL;
-	ex.hbrBackground = NULL;
-	ex.lpszMenuName = NULL;
-	ex.lpszClassName = WindowClass;
-	RegisterClass(&ex);
-	m_messageWindow = CreateWindow(WindowClass, NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, module, NULL);
-}
-
-CrossfireServer::~CrossfireServer() {
-	delete m_bpManager;
-
-	std::map<DWORD,CrossfireContext*>::iterator iterator = m_contexts->begin();
-	while (iterator != m_contexts->end()) {
-		delete iterator->second;
-		iterator++;
-	}
-	delete m_contexts;
-
-	std::map<DWORD, IBrowserContext*>::iterator iterator2 = m_browsers->begin();
-	while (iterator2 != m_browsers->end()) {
-		iterator2->second->Release();
-		iterator2++;
-	}
-	delete m_browsers;
-
-	std::vector<CrossfireEvent*>::iterator iterator3 = m_pendingEvents->begin();
-	while (iterator3 != m_pendingEvents->end()) {
-		if (m_connection) {
-			sendEvent(*iterator3);
-		}
-		delete *iterator3;
-		iterator3++;
-	}
-	delete m_pendingEvents;
-
-	delete m_inProgressPacket;
-	delete m_processor;
-	if (m_connection) {
-		delete m_connection;
-	}
-
-	if (m_messageWindow) {
-		DestroyWindow(m_messageWindow);
-		UnregisterClass(WindowClass, GetModuleHandle(NULL));
-	}
-
-//	if (m_windowHandle) {
-		CComPtr<ICrossfireServerClass> serverClass = NULL;
-		HRESULT hr = CoGetClassObject(CLSID_CrossfireServer, CLSCTX_ALL, 0, IID_ICrossfireServerClass, (LPVOID*)&serverClass);
-		if (FAILED(hr)) {
-			Logger::error("~CrossfireServer: CoGetClassObject() failed", hr);
-			return;
-		}
-
-		hr = serverClass->RemoveServer(/*m_windowHandle*/ 0);
-		if (FAILED(hr)) {
-			Logger::error("~CrossfireServer: RemoveServer() failed", hr);
-			return;
-		}
-//	}
-}
-
-
-/* ICrossfireServer */
-
-HRESULT STDMETHODCALLTYPE CrossfireServer::contextCreated(DWORD processId, DWORD threadId, OLECHAR* url) {
-	if (!isConnected()) {
-		return S_FALSE;
-	}
-
-	/*
-	 * When navigating from one page to another, a script node is initialized for the
-	 * new page before notification of the navigation is received.  As a result this
-	 * first script node for the new page becomes associated with the context of the
-	 * old page.  The workaround for this is to detect the case of a page re-navigation
-	 * within a given process and copy the last initialized script node to the newly-
-	 * created context.
-	 */
-	IDebugApplicationNode* scriptNode = NULL;
-
-	/* If there's already a context for the specified processId then destroy it */
-	std::map<DWORD, CrossfireContext*>::iterator iterator = m_contexts->find(processId);
-	if (iterator != m_contexts->end()) {
-		scriptNode = iterator->second->getLastInitializedScriptNode();
-		if (scriptNode) {
-			scriptNode->AddRef();
-		}
-		contextDestroyed(processId);
-	}
-
-	CrossfireContext* context = new CrossfireContext(processId, threadId, url, this);
-	m_contexts->insert(std::pair<DWORD,CrossfireContext*> (processId, context));
-	if (scriptNode) {
-		context->scriptInitialized(scriptNode, true);
-		scriptNode->Release();
-	}
-	eventContextCreated(context);
-
-	/*
-	 * Attempt to detect the case of the user not launching IE as the Administrator user, and
-	 * display an error message if appropriate.  Do not show the error more than once, and do
-	 * not show it for the about:blank page, because IE's initial about:blank page fails to
-	 * provide a remote debug thread even when IE is launched as the Administrator user.
-	 */
-	if (!m_connectionWarningShown && wcscmp(url, ABOUT_BLANK) != 0) {
-		CComPtr<IRemoteDebugApplication> application = NULL;
-		if (!context->getDebugApplication(&application)) {
-			DWORD processId = context->getProcessId();
-			IBrowserContext* listener = m_browsers->at(processId);
-			if (!listener) {
-				Logger::error("CrossfireServer.contextCreated(): the specified processId is not listening to the server");
-			} else {
-				if (SUCCEEDED(listener->displayMessage(L"Crossfire Server for Internet Explorer failed to connect to the loaded page, so this page and possibly subsequent ones will not be debuggable.  A common cause of this problem is launching Internet Explorer as a user other than the Administrator."))) {
-					m_connectionWarningShown = true;
-				}
-			}
-		}
-	}
-
-	return S_OK;
-}
-
-HRESULT STDMETHODCALLTYPE CrossfireServer::contextDestroyed(DWORD processId) {
-	if (!isConnected()) {
-		return S_FALSE;
-	}
-
-	std::map<DWORD, CrossfireContext*>::iterator iterator = m_contexts->find(processId);
-	if (iterator == m_contexts->end()) {
-		Logger::log("CrossfireServer.contextDestroyed(): unknown context", processId);
-		return S_FALSE;
-	}
-	CrossfireContext* context = iterator->second;
-	eventContextDestroyed(context);
-	m_contexts->erase(iterator);
-	delete context;
-	return S_OK;
-}
-
-HRESULT STDMETHODCALLTYPE CrossfireServer::contextLoaded(DWORD processId) {
-	if (!isConnected()) {
-		return S_FALSE;
-	}
-
-	std::map<DWORD, CrossfireContext*>::iterator iterator = m_contexts->find(processId);
-	if (iterator == m_contexts->end()) {
-		Logger::log("CrossfireServer.contextLoaded(): unknown context", processId);
-		return S_FALSE;
-	}
-	CrossfireContext* context = iterator->second;
-	eventContextLoaded(context);
-	return S_OK;
-}
-
-HRESULT STDMETHODCALLTYPE CrossfireServer::getPort(unsigned int* value) {
-	*value = m_port;
-	return S_OK;
-}
-
-HRESULT STDMETHODCALLTYPE CrossfireServer::getState(int* value) {
-	if (m_connection == NULL) {
-		*value = STATE_DISCONNECTED;
-	} else {
-		*value = m_connection->isConnected() ? STATE_CONNECTED : STATE_LISTENING;
-	}
-	return S_OK;
-}
-
-HRESULT STDMETHODCALLTYPE CrossfireServer::registerBrowser(DWORD processId, IBrowserContext* browser) {
-	if (!isConnected()) {
-		return S_FALSE;
-	}
-
-	browser->AddRef();
-	m_browsers->insert(std::pair<DWORD,IBrowserContext*>(processId, browser));
-	return S_OK;
-}
-
-HRESULT STDMETHODCALLTYPE CrossfireServer::removeBrowser(DWORD processId) {
-	if (!isConnected()) {
-		return S_FALSE;
-	}
-
-	std::map<DWORD,IBrowserContext*>::iterator iterator = m_browsers->find(processId);
-	if (iterator == m_browsers->end()) {
-		Logger::error("CrossfireServer.removeBrowser(): browser not registered", processId);
-		return S_FALSE;
-	}
-	iterator->second->Release();
-	m_browsers->erase(iterator);
-	return S_OK;
-}
-
-HRESULT STDMETHODCALLTYPE CrossfireServer::setCurrentContext(DWORD processId) {
-	if (!isConnected()) {
-		return S_FALSE;
-	}
-
-	if (processId == m_currentContextPID) {
-		return S_OK; /* nothing to do */
-	}
-
-	std::map<DWORD, CrossfireContext*>::iterator iterator = m_contexts->find(processId);
-	if (iterator == m_contexts->end()) {
-		Logger::error("CrossfireServer.setCurrentContext(): unknown context", processId);
-		return S_FALSE;
-	}
-
-	if (m_currentContextPID) {
-		CrossfireContext* newContext = iterator->second;
-		iterator = m_contexts->find(m_currentContextPID);
-		if (iterator == m_contexts->end()) {
-			Logger::error("CrossfireServer.setCurrentContext(): unknown old context", m_currentContextPID);
-		} else {
-			CrossfireContext* oldContext = iterator->second;
-			eventContextSelected(newContext, oldContext);
-		}
-	}
-
-	m_currentContextPID = processId;
-	return S_OK;
-}
-
-HRESULT STDMETHODCALLTYPE CrossfireServer::start(unsigned int port, unsigned int debugPort) {
-	if (m_connection) {
-		return S_FALSE;
-	}
-
-	m_connection = new WindowsSocketConnection(this);
-	if (!m_connection->init(port)) {
-		delete m_connection;
-		return S_FALSE;
-	}
-	m_port = port;
-	if (m_connection->acceptConnection()) {
-		HWND current = FindWindowEx(HWND_MESSAGE, NULL, NULL, NULL);
-		while (current) {
-			PostMessage(current, ServerStateChangeMsg, STATE_LISTENING, m_port);
-			current = FindWindowEx(HWND_MESSAGE, current, NULL, NULL);
-		}
-	}
-	return S_OK;
-}
-
-HRESULT STDMETHODCALLTYPE CrossfireServer::stop() {
-	if (!m_connection) {
-		return S_FALSE;
-	}
-	if (m_connection->isConnected()) {
-		eventClosed();
-	}
-	reset();
-
-	HWND current = FindWindowEx(HWND_MESSAGE, NULL, NULL, NULL);
-	while (current) {
-		PostMessage(current, ServerStateChangeMsg, STATE_DISCONNECTED, 0);
-		current = FindWindowEx(HWND_MESSAGE, current, NULL, NULL);
-	}
-
-	return S_OK;
-}
-
-
-/* CrossfireServer */
-
-void CrossfireServer::connected() {
-	HWND current = FindWindowEx(HWND_MESSAGE, NULL, NULL, NULL);
-	while (current) {
-		PostMessage(current, ServerStateChangeMsg, STATE_CONNECTED, m_port);
-		current = FindWindowEx(HWND_MESSAGE, current, NULL, NULL);
-	}
-}
-
-void CrossfireServer::disconnected() {
-	reset();
-	HWND current = FindWindowEx(HWND_MESSAGE, NULL, NULL, NULL);
-	while (current) {
-		PostMessage(current, ServerStateChangeMsg, STATE_DISCONNECTED, 0);
-		current = FindWindowEx(HWND_MESSAGE, current, NULL, NULL);
-	}
-}
-
-CrossfireBPManager* CrossfireServer::getBreakpointManager() {
-	return m_bpManager;
-}
-
-CrossfireContext* CrossfireServer::getContext(wchar_t* contextId) {
-	std::map<DWORD,CrossfireContext*>::iterator iterator = m_contexts->begin();
-	while (iterator != m_contexts->end()) {
-		if (wcscmp(iterator->second->getName(), contextId) == 0) {
-			return iterator->second;
-		}
-		iterator++;
-	}
-	return NULL;
-}
-
-void CrossfireServer::getContextsArray(CrossfireContext*** _value) {
-	CrossfireContext** result = new CrossfireContext*[m_contexts->size() + 1];
-	int index = 0;
-	std::map<DWORD,CrossfireContext*>::iterator iterator = m_contexts->begin();
-	while (iterator != m_contexts->end()) {
-		result[index++] = iterator->second;
-		iterator++;
-	}
-	result[index] = NULL;
-	*_value = result;
-}
-
-CrossfireContext* CrossfireServer::getRequestContext(CrossfireRequest* request) {
-	std::wstring* contextId = request->getContextId();
-	if (!contextId) {
-		return NULL;
-	}
-
-	wchar_t* searchString = (wchar_t*)contextId->c_str();
-	return getContext(searchString);
-}
-
-bool CrossfireServer::isConnected() {
-	int state;
-	getState(&state);
-	return state == STATE_CONNECTED;
-}
-
-bool CrossfireServer::performRequest(CrossfireRequest* request) {
-	wchar_t* command = request->getName();
-	Value* arguments = request->getArguments();
-	Value* responseBody = NULL;
-	wchar_t* message = NULL;
-	int code = CODE_OK;
-
-	if (wcscmp(command, COMMAND_CREATECONTEXT) == 0) {
-		code = commandCreateContext(arguments, &responseBody, &message);
-	} else if (wcscmp(command, COMMAND_DISABLETOOLS) == 0) {
-		code = commandDisableTools(arguments, &responseBody, &message);
-	} else if (wcscmp(command, COMMAND_ENABLETOOLS) == 0) {
-		code = commandEnableTools(arguments, &responseBody, &message);
-	} else if (wcscmp(command, COMMAND_GETTOOLS) == 0) {
-		code = commandGetTools(arguments, &responseBody, &message);
-	} else if (wcscmp(command, COMMAND_LISTCONTEXTS) == 0) {
-		code = commandListContexts(arguments, &responseBody, &message);
-	} else if (wcscmp(command, COMMAND_VERSION) == 0) {
-		code = commandVersion(arguments, &responseBody, &message);
-	} else if (wcscmp(command, COMMAND_CHANGEBREAKPOINTS) == 0) {
-		CrossfireContext* context = getRequestContext(request);
-		CrossfireContext** contexts = NULL;
-		if (context) {
-			getContextsArray(&contexts);
-		}
-		code = m_bpManager->commandChangeBreakpoints(arguments, (IBreakpointTarget**)contexts, &responseBody, &message);
-		if (contexts) {
-			delete contexts;
-		}
-	} else if (wcscmp(command, COMMAND_DELETEBREAKPOINTS) == 0) {
-		CrossfireContext* context = getRequestContext(request);
-		CrossfireContext** contexts = NULL;
-		if (context) {
-			getContextsArray(&contexts);
-		}
-		code = m_bpManager->commandDeleteBreakpoints(arguments, (IBreakpointTarget**)contexts, &responseBody, &message);
-		if (contexts) {
-			delete contexts;
-		}
-	} else if (wcscmp(command, COMMAND_GETBREAKPOINTS) == 0) {
-		CrossfireContext* context = getRequestContext(request);
-		IBreakpointTarget* target = context ? (IBreakpointTarget*)context : (IBreakpointTarget*)m_bpManager;
-		code = m_bpManager->commandGetBreakpoints(arguments, target, &responseBody, &message);
-	} else if (wcscmp(command, COMMAND_SETBREAKPOINTS) == 0) {
-		CrossfireContext* context = getRequestContext(request);
-		CrossfireContext** contexts = NULL;
-		if (context) {
-			getContextsArray(&contexts);
-		}
-		code = m_bpManager->commandSetBreakpoints(arguments, (IBreakpointTarget**)contexts, &responseBody, &message);
-		if (contexts) {
-			delete contexts;
-		}
-	} else {
-		return false;	/* command not handled */
-	}
-
-	CrossfireResponse response;
-	response.setName(command);
-	response.setRequestSeq(request->getSeq());
-	response.setRunning(true);
-	response.setCode(code);
-	response.setMessage(message);
-	if (message) {
-		free(message);
-	}
-	if (code == CODE_OK) {
-		response.setBody(responseBody);
-	} else {
-		Value emptyBody;
-		emptyBody.setType(TYPE_OBJECT);
-		response.setBody(&emptyBody);
-	}
-	if (responseBody) {
-		delete responseBody;
-	}
-	sendResponse(&response);
-	return true;
-}
-
-bool CrossfireServer::processHandshake(wchar_t* msg) {
-	std::wstring string(msg);
-	size_t start = wcslen(HANDSHAKE);
-	size_t index = string.find_first_of(std::wstring(L"\r\n"), start);
-	if (index == std::wstring::npos) {
-		Logger::error("Invalid handshake packet, does not contain terminating '\\r\\n'");
-		return false;
-	}
-	if (index != string.length() - 2) {
-		Logger::error("Invalid handshake packet, length extends beyond terminating '\\r\\n'");
-		return false;
-	}
-
-	std::wstring tools = string.substr(start, index - start);
-	m_handshakeReceived = true;
-
-	std::wstring handshake(HANDSHAKE);
-	/* for now don't claim support for any tools */
-	handshake.append(std::wstring(L"\r\n"));
-	m_connection->send(handshake.c_str());
-
-	/*
-	* Some events may have been queued in the interval between the initial connection
-	* and the handshake.  These events can be sent now that the handshake is complete.
-	*/
-	sendPendingEvents();
-
-	return true;
-}
-
-void CrossfireServer::sendPendingEvents() {
-	if (m_pendingEvents->size() > 0) {
-		Sleep(500); // TODO HACK!
-		std::vector<CrossfireEvent*>::iterator iterator = m_pendingEvents->begin();
-		while (iterator != m_pendingEvents->end()) {
-			sendEvent(*iterator);
-			delete *iterator;
-			iterator++;
-		}
-		m_pendingEvents->clear();
-	}
-}
-
-void CrossfireServer::received(wchar_t* msg) {
-	if (!m_handshakeReceived) {
-		if (wcsncmp(msg, HANDSHAKE, wcslen(HANDSHAKE)) == 0) {
-			processHandshake(msg);
-			m_lastRequestSeq = -1;
-		} else {
-			Logger::error("Crossfire content received before handshake, not processing it");
-		}
-		return;
-	}
-
-	m_inProgressPacket->append(std::wstring(msg));
-	std::wstring packet;
-	do {
-		wchar_t* parseErrorMessage = NULL;
-		bool errorMessageRequiresFree = false;
-		int code = CODE_OK;
-		packet.clear();
-
-		if (m_inProgressPacket->find(HEADER_CONTENTLENGTH) != 0) {
-			code = CODE_MALFORMED_PACKET;
-			parseErrorMessage = L"request packet does not start with 'Content-Length:', not processing it";
-			m_inProgressPacket->clear();
-			break;
-		}
-
-		size_t endIndex = m_inProgressPacket->find(wchar_t('\r'));
-		if (endIndex == std::wstring::npos) {
-			code = CODE_MALFORMED_PACKET;
-			parseErrorMessage = L"request packet does not contain '\r', not processing it";
-			m_inProgressPacket->clear();
-			break;
-		}
-
-		size_t headerLength = wcslen(HEADER_CONTENTLENGTH);
-		std::wstring lengthString = m_inProgressPacket->substr(headerLength, endIndex - headerLength);
-		int lengthValue = _wtoi(lengthString.c_str());
-		if (!lengthValue) {
-			code = CODE_MALFORMED_PACKET;
-			parseErrorMessage = L"request packet does not have a valid 'Content-Length' value, not processing it";
-			m_inProgressPacket->clear();
-			break;
-		}
-
-		if (m_inProgressPacket->find(L"\r\n", endIndex) != endIndex) {
-			code = CODE_MALFORMED_PACKET;
-			parseErrorMessage = L"request packet does not follow initial '\\r' with '\\n', not processing it";
-			m_inProgressPacket->clear();
-			break;
-		}
-
-		// TODO for now just skip over "tool:" lines, though these should really be validated
-
-		size_t toolEnd = m_inProgressPacket->find(L"\r\n\r\n", endIndex);
-		if (toolEnd == std::wstring::npos) {
-			code = CODE_MALFORMED_PACKET;
-			parseErrorMessage = L"request packet does not contain '\\r\\n\\r\\n' to delimit its header, not processing it";
-			m_inProgressPacket->clear();
-			break;
-		}
-		size_t toolsLength = toolEnd - endIndex;
-		size_t targetLength = wcslen(HEADER_CONTENTLENGTH) + lengthString.length() + 3 * LINEBREAK_LENGTH + toolsLength + lengthValue;
-
-		if (targetLength <= m_inProgressPacket->length()) {
-			packet.assign(m_inProgressPacket->substr(0, targetLength));
-			m_inProgressPacket->erase(0, targetLength);
-		}
-
-		if (packet.length()) {
-			CrossfireRequest* request = NULL;
-			code = m_processor->parseRequestPacket(&packet, &request, &parseErrorMessage);
-			if (code != CODE_OK) {
-				errorMessageRequiresFree = true;
-			} else {
-				unsigned int seq = request->getSeq();
-				if (!(m_lastRequestSeq == -1 || seq == m_lastRequestSeq + 1)) {
-					// TODO handle out-of-order packets
-					Logger::log("packet received out of sequence, still processing it");
-				}
-				m_lastRequestSeq = seq;
-				m_processingRequest = true;
-				if (!performRequest(request)) {
-					/*
-					 * the request's command was not handled by the server,
-					 * so try to delegate to the specified context, if any
-					 */
-					CrossfireContext* context = getRequestContext(request);
-					if (!context) {
-						Logger::error("request command was unknown to the server and a valid context id was not provided, not processing it");
-					} else {
-						if (!context->performRequest(request)) {
-							Logger::error("request command was unknown to the server and to the specified context, not processing it");
-						}
-					}
-				}
-				m_processingRequest = false;
-				delete request;
-
-				/*
-				 * Debugger events may have been received in response to the request that was
-				 * just processed.  These events can be sent now that processing of the request
-				 * is complete.
-				 */
-				sendPendingEvents();
-			}
-		}
-
-		if (code) {
-			CrossfireResponse response;
-			response.setCode(CODE_MALFORMED_PACKET);
-			response.setMessage(parseErrorMessage);
-			if (errorMessageRequiresFree) {
-				free(parseErrorMessage);
-			}
-			Value emptyBody;
-			emptyBody.setType(TYPE_OBJECT);
-			response.setBody(&emptyBody);
-			sendResponse(&response);
-		}
-	} while (packet.length() > 0 && m_inProgressPacket->length() > 0);
-}
-
-void CrossfireServer::reset() {
-	m_connection->close();
-	delete m_connection;
-	m_connection = NULL;
-
-	std::map<DWORD,CrossfireContext*>::iterator iterator = m_contexts->begin();
-	while (iterator != m_contexts->end()) {
-		delete iterator->second;
-		iterator++;
-	}
-	m_contexts->clear();
-	m_currentContextPID = 0;
-	m_handshakeReceived = false;
-	m_inProgressPacket->clear();
-	m_lastRequestSeq = -1;
-	m_port = -1;
-}
-
-void CrossfireServer::sendEvent(CrossfireEvent* eventObj) {
-	/*
-	 * If a request is being processed, or if the client handshake has not
-	 * been received yet, then events to be sent to the client should be
-	 * queued and sent after these conditions have passed.
-	 */
-	if (m_processingRequest || !m_handshakeReceived) {
-		CrossfireEvent* copy = NULL;
-		eventObj->clone((CrossfirePacket**)&copy);
-		m_pendingEvents->push_back(copy);
-		return;
-	}
-
-	std::wstring* string = NULL;
-	if (!m_processor->createEventPacket(eventObj, &string)) {
-		Logger::error("CrossfireServer.sendEvent(): Invalid event packet, not sending it");
-		return;
-	}
-
-	m_connection->send(string->c_str());
-	delete string;
-}
-
-void CrossfireServer::sendResponse(CrossfireResponse* response) {
-	std::wstring* string = NULL;
-	if (!m_processor->createResponsePacket(response, &string)) {
-		Logger::error("CrossfireServer.sendResponse(): Invalid response packet, not sending it");
-		return;
-	}
-	m_connection->send(string->c_str());
-	delete string;
-}
-
-void CrossfireServer::setWindowHandle(unsigned long value) {
-	m_windowHandle = value;
-}
-
-LRESULT CALLBACK CrossfireServer::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
-	return DefWindowProc(hWnd, message, wParam, lParam);
-}
-
-/* commands */
-
-int CrossfireServer::commandCreateContext(Value* arguments, Value** _responseBody, wchar_t** _message) {
-	Value* value_url = arguments->getObjectValue(KEY_URL);
-	if (!value_url || value_url->getType() != TYPE_STRING) {
-		*_message = _wcsdup(L"'createContext' request does not have a valid 'url' value");
-		return CODE_INVALID_ARGUMENT;
-	}
-	std::wstring* url = value_url->getStringValue();
-
-	std::wstring* contextId = NULL;
-	Value* value_contextId = arguments->getObjectValue(KEY_CONTEXTID);
-	if (value_contextId) {
-		int type = value_contextId->getType();
-		if (type != TYPE_NULL) {
-			if (type != TYPE_STRING) {
-				*_message = _wcsdup(L"'createContext' request has an invalid 'contextId' value");
-				return CODE_INVALID_ARGUMENT;
-			}
-			contextId = value_contextId->getStringValue();
-		}
-	}
-
-	CrossfireContext* context = NULL;
-	if (contextId) {
-		context = getContext((wchar_t*)contextId->c_str());
-		if (!context) {
-			*_message = _wcsdup(L"'createContext' request specified an unknown 'contextId' value");
-			return CODE_COMMAND_FAILED;
-		}
-		DWORD processId = context->getProcessId();
-		IBrowserContext* listener = m_browsers->at(processId);
-		if (!listener) {
-			Logger::error("commandCreateContext(): the specified processId is not listening to the server");
-			return CODE_UNEXPECTED_EXCEPTION;
-		}
-		if (FAILED(listener->navigate((OLECHAR*)url->c_str(), false))) {
-			return CODE_COMMAND_FAILED;
-		}
-	} else {
-		/* go through the listeners to find one that can create the context in a new tab */
-
-		std::map<DWORD,IBrowserContext*>::iterator iterator = m_browsers->begin();
-		while (iterator != m_browsers->end()) {
-			IBrowserContext* listener = iterator->second;
-			if (SUCCEEDED(listener->navigate((OLECHAR*)url->c_str(), true))) {
-				break;
-			}
-		}
-		if (iterator == m_browsers->end()) {
-			/* none of the listeners could create the context successfully */
-			return CODE_COMMAND_FAILED;
-		}
-	}
-
-	Value* result = new Value();
-	result->setType(TYPE_OBJECT);
-	*_responseBody = result;
-	return CODE_OK;
-}
-
-int CrossfireServer::commandDisableTools(Value* arguments, Value** _responseBody, wchar_t** _message) {
-	Value* value_tools = arguments->getObjectValue(KEY_TOOLS);
-	if (!value_tools || value_tools->getType() != TYPE_ARRAY) {
-		*_message = _wcsdup(L"'disableTools' request does not have a valid 'tools' value");
-		return CODE_INVALID_ARGUMENT;
-	}
-
-	Value** values = NULL;
-	value_tools->getArrayValues(&values);
-	int index = 0;
-	Value* currentValue = values[index];
-	while (currentValue) {
-		if (currentValue->getType() != TYPE_STRING) {
-			*_message = _wcsdup(L"'disableTools' request contains an invalid 'tools' value");
-			delete[] values;
-			return CODE_INVALID_ARGUMENT;
-		}
-		// TODO do something here
-		currentValue = values[++index];
-	}
-	delete[] values;
-
-//	Value* result = new Value();
-//	*_responseBody = result;
-	return CODE_COMMAND_NOT_IMPLEMENTED; // TODO implement
-}
-
-int CrossfireServer::commandEnableTools(Value* arguments, Value** _responseBody, wchar_t** _message) {
-	Value* value_tools = arguments->getObjectValue(KEY_TOOLS);
-	if (!value_tools || value_tools->getType() != TYPE_ARRAY) {
-		*_message = _wcsdup(L"'enableTools' request does not have a valid 'tools' value");
-		return CODE_INVALID_ARGUMENT;
-	}
-
-	Value** values = NULL;
-	value_tools->getArrayValues(&values);
-	int index = 0;
-	Value* currentValue = values[index];
-	while (currentValue) {
-		if (currentValue->getType() != TYPE_STRING) {
-			*_message = _wcsdup(L"'enableTools' request contains an invalid 'tools' value");
-			delete[] values;
-			return CODE_INVALID_ARGUMENT;
-		}
-		// TODO do something here
-		currentValue = values[++index];
-	}
-	delete[] values;
-
-//	Value* result = new Value();
-//	result->addObjectValue(KEY_TOOLS, &toolsArray);
-//	*_responseBody = result;
-	return CODE_COMMAND_NOT_IMPLEMENTED; // TODO implement
-}
-
-int CrossfireServer::commandGetTools(Value* arguments, Value** _responseBody, wchar_t** _message) {
-	Value* value_tools = arguments->getObjectValue(KEY_TOOLS);
-	if (value_tools) {
-		if (value_tools->getType() != TYPE_ARRAY) {
-			*_message = _wcsdup(L"'getTools' request has an invalid 'tools' value");
-			return CODE_INVALID_ARGUMENT;
-		}
-	}
-
-	Value toolsArray;
-	toolsArray.setType(TYPE_ARRAY);
-	Value* result = new Value();
-	result->addObjectValue(KEY_TOOLS, &toolsArray);
-	*_responseBody = result;
-	return CODE_OK;
-}
-
-int CrossfireServer::commandListContexts(Value* arguments, Value** _responseBody, wchar_t** _message) {
-	Value contexts;
-	contexts.setType(TYPE_ARRAY);
-	std::map<DWORD,CrossfireContext*>::iterator iterator = m_contexts->begin();
-	while (iterator != m_contexts->end()) {
-		CrossfireContext* context = iterator->second;
-		Value value_context;
-		value_context.addObjectValue(KEY_CONTEXTID, &Value(context->getName()));
-		value_context.addObjectValue(KEY_URL, &Value(context->getUrl()));
-		value_context.addObjectValue(KEY_CURRENT, &Value((bool)(context->getProcessId() == m_currentContextPID)));
-		contexts.addArrayValue(&value_context);
-		iterator++;
-	}
-
-	Value* result = new Value();
-	result->addObjectValue(KEY_CONTEXTS, &contexts);
-	*_responseBody = result;
-	return CODE_OK;
-}
-
-int CrossfireServer::commandVersion(Value* arguments, Value** _responseBody, wchar_t** _message) {
-	Value* result = new Value();
-	result->addObjectValue(KEY_VERSION, &Value(VERSION_STRING));
-	*_responseBody = result;
-	return CODE_OK;
-}
-
-/* events */
-
-void CrossfireServer::eventClosed() {
-	CrossfireEvent eventObj;
-	eventObj.setName(EVENT_CLOSED);
-	sendEvent(&eventObj);
-}
-
-void CrossfireServer::eventContextCreated(CrossfireContext* context) {
-	CrossfireEvent eventObj;
-	eventObj.setName(EVENT_CONTEXTCREATED);
-	Value body;
-	body.addObjectValue(KEY_URL, &Value(&std::wstring(context->getUrl())));
-	body.addObjectValue(KEY_CONTEXTID, &Value(&std::wstring(context->getName())));
-	eventObj.setBody(&body);
-	sendEvent(&eventObj);
-}
-
-void CrossfireServer::eventContextDestroyed(CrossfireContext* context) {
-	CrossfireEvent eventObj;
-	eventObj.setName(EVENT_CONTEXTDESTROYED);
-	Value body;
-	body.addObjectValue(KEY_CONTEXTID, &Value(&std::wstring(context->getName())));
-	eventObj.setBody(&body);
-	sendEvent(&eventObj);
-}
-
-void CrossfireServer::eventContextLoaded(CrossfireContext* context) {
-	CrossfireEvent eventObj;
-	eventObj.setName(EVENT_CONTEXTLOADED);
-	Value body;
-	body.addObjectValue(KEY_URL, &Value(&std::wstring(context->getUrl())));
-	body.addObjectValue(KEY_CONTEXTID, &Value(&std::wstring(context->getName())));
-	eventObj.setBody(&body);
-	sendEvent(&eventObj);
-}
-
-void CrossfireServer::eventContextSelected(CrossfireContext* context, CrossfireContext* oldContext) {
-	CrossfireEvent eventObj;
-	eventObj.setName(EVENT_CONTEXTSELECTED);
-	Value body;
-	body.addObjectValue(KEY_OLDCONTEXTID, &Value(&std::wstring(oldContext->getName())));
-	body.addObjectValue(KEY_OLDURL, &Value(&std::wstring(oldContext->getUrl())));
-	body.addObjectValue(KEY_CONTEXTID, &Value(&std::wstring(context->getName())));
-	body.addObjectValue(KEY_URL, &Value(&std::wstring(context->getUrl())));
-	eventObj.setBody(&body);
-	sendEvent(&eventObj);
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServer.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServer.h
deleted file mode 100644
index 07a0c88..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServer.h
+++ /dev/null
@@ -1,176 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include "resource.h"
-#include <map>
-
-#include "CrossfireBPManager.h"
-#include "CrossfireContext.h"
-#include "CrossfireEvent.h"
-#include "CrossfireProcessor.h"
-#include "CrossfireResponse.h"
-#include "WindowsSocketConnection.h"
-
-enum {
-	STATE_DISCONNECTED,
-	STATE_LISTENING,
-	STATE_CONNECTED,
-};
-
-class ATL_NO_VTABLE CrossfireServer :
-	public CComObjectRootEx<CComSingleThreadModel>,
-	public CComCoClass<CrossfireServer, &CLSID_CrossfireServer>,
-	public IDispatchImpl<ICrossfireServer, &IID_ICrossfireServer, &LIBID_IECrossfireServerLib, 1, 0> {
-
-public:
-	DECLARE_REGISTRY_RESOURCEID(IDR_CROSSFIRESERVER)
-	DECLARE_NOT_AGGREGATABLE(CrossfireServer)
-	BEGIN_COM_MAP(CrossfireServer)
-		COM_INTERFACE_ENTRY(ICrossfireServer)
-		COM_INTERFACE_ENTRY(IDispatch)
-	END_COM_MAP()
-	DECLARE_PROTECT_FINAL_CONSTRUCT()
-
-	HRESULT FinalConstruct() {
-		return S_OK;
-	}
-
-	void FinalRelease() {
-	}
-
-public:
-	CrossfireServer();
-	virtual ~CrossfireServer();
-
-	/* ICrossfireServer */
-	HRESULT STDMETHODCALLTYPE contextCreated(DWORD processId, DWORD threadId, OLECHAR* url);
-	HRESULT STDMETHODCALLTYPE contextDestroyed(DWORD processId);
-	HRESULT STDMETHODCALLTYPE contextLoaded(DWORD processId);
-	HRESULT STDMETHODCALLTYPE getPort(unsigned int* value);
-	HRESULT STDMETHODCALLTYPE getState(int* value);
-	HRESULT STDMETHODCALLTYPE registerBrowser(DWORD processId, IBrowserContext* browser);
-	HRESULT STDMETHODCALLTYPE removeBrowser(DWORD processId);
-	HRESULT STDMETHODCALLTYPE setCurrentContext(DWORD processId);
-	HRESULT STDMETHODCALLTYPE start(unsigned int port, unsigned int debugPort);
-	HRESULT STDMETHODCALLTYPE stop();
-
-	/* CrossfireServer */
-	void connected();
-	void disconnected();
-	CrossfireBPManager* getBreakpointManager();
-	bool isConnected();
-	void received(wchar_t* msg);
-	void sendEvent(CrossfireEvent* eventObj);
-	void sendResponse(CrossfireResponse* response);
-	void setWindowHandle(unsigned long value);
-
-private:
-	CrossfireContext* getContext(wchar_t* contextId);
-	void getContextsArray(CrossfireContext*** _value);
-	CrossfireContext* getRequestContext(CrossfireRequest* request);
-	bool performRequest(CrossfireRequest* request);
-	bool processHandshake(wchar_t* msg);
-	void reset();
-	void sendPendingEvents();
-
-	CrossfireBPManager* m_bpManager;
-	std::map<DWORD, IBrowserContext*>* m_browsers;
-	WindowsSocketConnection* m_connection;
-	bool m_connectionWarningShown;
-	std::map<DWORD, CrossfireContext*>* m_contexts;
-	DWORD m_currentContextPID;
-	bool m_handshakeReceived;
-	std::wstring* m_inProgressPacket;
-	unsigned int m_lastRequestSeq;
-	HWND m_messageWindow;
-	std::vector<CrossfireEvent*>* m_pendingEvents;
-	unsigned int m_port;
-	bool m_processingRequest;
-	CrossfireProcessor* m_processor;
-	unsigned long m_windowHandle;
-
-	static const UINT ServerStateChangeMsg;
-	static const wchar_t* WindowClass;
-	static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
-
-	static const wchar_t* COMMAND_CHANGEBREAKPOINTS;
-	static const wchar_t* COMMAND_DELETEBREAKPOINTS;
-	static const wchar_t* COMMAND_GETBREAKPOINTS;
-	static const wchar_t* COMMAND_SETBREAKPOINTS;
-
-	/* command: createContext */
-	static const wchar_t* COMMAND_CREATECONTEXT;
-	int commandCreateContext(Value* arguments, Value** _responseBody, wchar_t** _message);
-
-	/* command: disableTools */
-	static const wchar_t* COMMAND_DISABLETOOLS;
-	int commandDisableTools(Value* arguments, Value** _responseBody, wchar_t** _message);
-
-	/* command: enableTools */
-	static const wchar_t* COMMAND_ENABLETOOLS;
-	int commandEnableTools(Value* arguments, Value** _responseBody, wchar_t** _message);
-
-	/* command: getTools */
-	static const wchar_t* COMMAND_GETTOOLS;
-	int commandGetTools(Value* arguments, Value** _responseBody, wchar_t** _message);
-
-	/* command: listContexts */
-	static const wchar_t* COMMAND_LISTCONTEXTS;
-	static const wchar_t* KEY_CONTEXTS;
-	static const wchar_t* KEY_CURRENT;
-	int commandListContexts(Value* arguments, Value** _responseBody, wchar_t** _message);
-
-	/* command: version */
-	static const wchar_t* COMMAND_VERSION;
-	static const wchar_t* KEY_VERSION;
-	static const wchar_t* VERSION_STRING;
-	int commandVersion(Value* arguments, Value** _responseBody, wchar_t** _message);
-
-	/* event: closed */
-	static const wchar_t* EVENT_CLOSED;
-	void eventClosed();
-
-	/* event: onContextCreated */
-	static const wchar_t* EVENT_CONTEXTCREATED;
-	void eventContextCreated(CrossfireContext* context);
-
-	/* event: onContextDestroyed */
-	static const wchar_t* EVENT_CONTEXTDESTROYED;
-	void eventContextDestroyed(CrossfireContext* context);
-
-	/* event: onContextLoaded */
-	static const wchar_t* EVENT_CONTEXTLOADED;
-	void eventContextLoaded(CrossfireContext* context);
-
-	/* event: onContextSelected */
-	static const wchar_t* EVENT_CONTEXTSELECTED;
-	static const wchar_t* KEY_OLDCONTEXTID;
-	static const wchar_t* KEY_OLDURL;
-	void eventContextSelected(CrossfireContext* context, CrossfireContext* oldContext);
-
-	/* shared */
-	static const wchar_t* KEY_CONTEXTID;
-	static const wchar_t* KEY_TOOLS;
-	static const wchar_t* KEY_URL;
-
-	/* constants */
-	static const wchar_t* ABOUT_BLANK;
-	static const wchar_t* CONTEXTID_PREAMBLE;
-	static const wchar_t* HANDSHAKE;
-	static const wchar_t* HEADER_CONTENTLENGTH;
-	static const wchar_t* LINEBREAK;
-	static const size_t LINEBREAK_LENGTH;
-};
-
-OBJECT_ENTRY_AUTO(__uuidof(CrossfireServer), CrossfireServer)
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServer1.rgs b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServer1.rgs
deleted file mode 100644
index ad7493b..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServer1.rgs
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-HKCR
-{
-	IECrossfireServer.CrossfireContr.1 = s 'CrossfireServer Class'
-	{
-		CLSID = s '{47836AF4-3E0C-4995-8029-FF931C5A43FC}'
-	}
-	IECrossfireServer.CrossfireControl = s 'CrossfireServer Class'
-	{
-		CLSID = s '{47836AF4-3E0C-4995-8029-FF931C5A43FC}'
-		CurVer = s 'IECrossfireServer.CrossfireServer.1'
-	}
-	NoRemove CLSID
-	{
-		ForceRemove {47836AF4-3E0C-4995-8029-FF931C5A43FC} = s 'CrossfireServer Class'
-		{
-			ProgID = s 'IECrossfireServer.CrossfireServer.1'
-			VersionIndependentProgID = s 'IECrossfireServer.CrossfireServer'
-			ForceRemove 'Programmable'
-			LocalServer32 = s '%MODULE%'
-			val AppID = s '%APPID%'
-			'TypeLib' = s '{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}'
-		}
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServerClass.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServerClass.cpp
deleted file mode 100644
index 9d44f59..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServerClass.cpp
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "stdafx.h"
-#include "CrossfireServerClass.h"
-
-CrossfireServerClass::CrossfireServerClass() {
-	m_servers = new std::map<unsigned long, ICrossfireServer*>;
-	lockCount = 0;
-}
-
-CrossfireServerClass::~CrossfireServerClass() {
-	std::map<unsigned long, ICrossfireServer*>::iterator iterator = m_servers->begin();
-	while (iterator != m_servers->end()) {
-		iterator->second->Release();
-		iterator++;
-	}
-	delete m_servers;
-}
-
-/* IClassFactory */
-
-HRESULT CrossfireServerClass::CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppvObject) {
-	/* ICrossfireServer instances must be created via GetServer() */
-	return E_NOTIMPL;
-}
-
-HRESULT CrossfireServerClass::LockServer(BOOL fLock) {
-	lockCount += fLock ? 1 : -1;
-	if (!lockCount && m_servers->empty()) {
-		PostQuitMessage(0);
-	}
-	return S_OK;
-}
-
-/* ICrossfireServerClass */
-
-STDMETHODIMP CrossfireServerClass::GetServer(/*unsigned long windowHandle,*/ ICrossfireServer** _value) {
-	*_value = NULL;
-
-	/*
-	 * TEMPORARY CODE: windowHandle is set to a consistent value so that the same
-	 * CrossfireServer is always returned.  If this is determined to be the correct
-	 * behavior then m_servers should be replaced with a singleton CrossfireServer.
-	 */
-	unsigned long windowHandle = 0;
-
-	std::map<unsigned long,ICrossfireServer*>::iterator iterator = m_servers->find(windowHandle);
-	if (iterator != m_servers->end()) {
-		*_value = iterator->second;
-		(*_value)->AddRef();
-	} else {
-		CComObject<CrossfireServer>* server = NULL;
-		HRESULT hr = CComObject<CrossfireServer>::CreateInstance(&server);
-		if (FAILED(hr)) {
-			Logger::error("CrossfireServerClass.GetServer(): CreateInstance() failed", hr);
-			return S_FALSE;
-		}
-
-		server->AddRef(); /* CComObject::CreateInstance gives initial ref count of 0 */
-		server->setWindowHandle(windowHandle);
-		m_servers->insert(std::pair<unsigned long,ICrossfireServer*>(windowHandle, server));
-		*_value = server;
-	}
-	return S_OK;
-}
-
-STDMETHODIMP CrossfireServerClass::RemoveServer(unsigned long windowHandle) {
-	/*
-	 * TEMPORARY CODE: windowHandle is set to a consistent value so that the same
-	 * CrossfireServer is always used.  If this is determined to be the correct
-	 * behavior then this method can be replaced with one that does not receive a
-	 * handle for identifying the specific server.
-	 */
-	windowHandle = 0;
-
-	std::map<unsigned long,ICrossfireServer*>::iterator iterator = m_servers->find(windowHandle);
-	if (iterator == m_servers->end()) {
-		Logger::error("CrossfireServerClass.RemoveServer(): unknown windowHandle");
-		return S_FALSE;
-	}
-	m_servers->erase(iterator);
-	if (!lockCount && m_servers->empty()) {
-		PostQuitMessage(0);
-	}
-	return S_OK;
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServerClass.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServerClass.h
deleted file mode 100644
index cc4c760..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServerClass.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include "resource.h"
-#include <map>
-
-#include "CrossfireServer.h"
-#include "IECrossfireServer.h"
-#include "Logger.h"
-
-class ATL_NO_VTABLE CrossfireServerClass :
-	public CComObjectRootEx<CComSingleThreadModel>,
-	public CComCoClass<CrossfireServerClass, &CLSID_CrossfireServerClass>,
-	public IClassFactory,
-	public IDispatchImpl<ICrossfireServerClass, &IID_ICrossfireServerClass, &LIBID_IECrossfireServerLib, 1, 0> {
-
-public:
-	DECLARE_REGISTRY_RESOURCEID(IDR_CROSSFIRESERVERCLASS)
-	DECLARE_NOT_AGGREGATABLE(CrossfireServerClass)
-	BEGIN_COM_MAP(CrossfireServerClass)
-		COM_INTERFACE_ENTRY(ICrossfireServerClass)
-		COM_INTERFACE_ENTRY(IClassFactory)
-		COM_INTERFACE_ENTRY(IDispatch)
-	END_COM_MAP()
-	DECLARE_PROTECT_FINAL_CONSTRUCT()
-
-	HRESULT FinalConstruct() {
-		return S_OK;
-	}
-
-	void FinalRelease() {
-	}
-
-public:
-	/* IClassFactory */
-	HRESULT STDMETHODCALLTYPE CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppvObject);
-	HRESULT STDMETHODCALLTYPE LockServer(BOOL fLock);
-
-	/* ICrossfireServerClass */
-	HRESULT STDMETHODCALLTYPE GetServer(/*unsigned long windowHandle,*/ ICrossfireServer** _value);
-	HRESULT STDMETHODCALLTYPE RemoveServer(unsigned long windowHandle);
-
-protected:
-	CrossfireServerClass();
-	virtual ~CrossfireServerClass();
-
-	int lockCount;
-
-private:
-	std::map<unsigned long, ICrossfireServer*>* m_servers;
-};
-
-OBJECT_ENTRY_AUTO(__uuidof(CrossfireServerClass), CrossfireServerClass)
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServerClass.rgs b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServerClass.rgs
deleted file mode 100644
index 2ea77a8..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServerClass.rgs
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-HKCR
-{
-	IECrossfireServer.CrossfireContr.1 = s 'CrossfireServerClass Class'
-	{
-		CLSID = s '{7C3C5D7A-AF4D-4F32-A3C9-462BFBAFDC25}'
-	}
-	IECrossfireServer.CrossfireControl = s 'CrossfireServerClass Class'
-	{
-		CLSID = s '{7C3C5D7A-AF4D-4F32-A3C9-462BFBAFDC25}'
-		CurVer = s 'IECrossfireServer.CrossfireContr.1'
-	}
-	NoRemove CLSID
-	{
-		ForceRemove {7C3C5D7A-AF4D-4F32-A3C9-462BFBAFDC25} = s 'CrossfireServerClass Class'
-		{
-			ProgID = s 'IECrossfireServer.CrossfireServer.1'
-			VersionIndependentProgID = s 'IECrossfireServer.CrossfireServer'
-			ForceRemove 'Programmable'
-			LocalServer32 = s '%MODULE%'
-			val AppID = s '%APPID%'
-			'TypeLib' = s '{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}'
-		}
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServerListener.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServerListener.h
deleted file mode 100644
index b9ae3fa..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServerListener.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include "resource.h"
-
-#include "IECrossfireServer.h"
-
-class ATL_NO_VTABLE CCrossfireServerListener :
-	public CComObjectRootEx<CComSingleThreadModel>,
-	public CComCoClass<CCrossfireServerListener, &CLSID_CrossfireServerListener>,
-	public ICrossfireServerListener {
-
-public:
-	DECLARE_REGISTRY_RESOURCEID(IDR_CROSSFIRESERVERLISTENER)
-	DECLARE_NOT_AGGREGATABLE(CCrossfireServerListener)
-	BEGIN_COM_MAP(CCrossfireServerListener)
-		COM_INTERFACE_ENTRY(ICrossfireServerListener)
-//		COM_INTERFACE_ENTRY(IUnknown)
-	END_COM_MAP()
-	DECLARE_PROTECT_FINAL_CONSTRUCT()
-
-	HRESULT FinalConstruct() {
-		return S_OK;
-	}
-
-	void FinalRelease() {
-	}
-
-public:
-	/* ICrossfireServerListener */
-	virtual HRESULT STDMETHODCALLTYPE ServerStateChanged(int state, unsigned int port) = 0;
-};
-
-OBJECT_ENTRY_AUTO(__uuidof(CrossfireServerListener), CCrossfireServerListener)
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IBreakpointTarget.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IBreakpointTarget.h
deleted file mode 100644
index e7a6244..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IBreakpointTarget.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include "Value.h"
-class IBreakpointTarget; // forward declaration
-#include "CrossfireBreakpoint.h"
-
-class IBreakpointTarget {
-
-public:
-	IBreakpointTarget() {
-	}
-
-	virtual ~IBreakpointTarget() {
-	}
-
-	virtual bool breakpointAttributeChanged(unsigned int handle, wchar_t* name, Value* value) = 0;
-	virtual bool deleteBreakpoint(unsigned int handle) = 0;
-	virtual CrossfireBreakpoint* getBreakpoint(unsigned int handle) = 0;
-	virtual void getBreakpoints(CrossfireBreakpoint*** ___values) = 0;
-	virtual bool setBreakpoint(CrossfireBreakpoint* breakpoint) = 0;
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.cpp
deleted file mode 100644
index aa6d3ec..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.cpp
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "stdafx.h"
-#include "resource.h"
-
-#include "CrossfireServerClass.h"
-#include "IECrossfireServer.h"
-#include "Logger.h"
-
-class CIECrossfireServerModule : public CAtlExeModuleT<CIECrossfireServerModule> {
-public :
-	DECLARE_LIBID(LIBID_IECrossfireServerLib)
-	DECLARE_REGISTRY_APPID_RESOURCEID(IDR_IECrossfireServer, "{1B6AA6D6-25AC-4994-9431-AC0DFC85654D}")
-};
-
-CIECrossfireServerModule _AtlModule;
-
-extern "C" int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd) {
-	if (wcscmp((const wchar_t*)lpCmdLine, L"/Embedding") != 0 && wcscmp((const wchar_t*)lpCmdLine, L"-Embedding") != 0) {
-		return _AtlModule.WinMain(nShowCmd);
-	}
-
-	CoInitialize(NULL);
-	CComObject<CrossfireServerClass>* serverClass = NULL;
-	HRESULT hr = CComObject<CrossfireServerClass>::CreateInstance(&serverClass);
-	if (FAILED(hr)) {
-		Logger::error("IECrossfireServer.main(): CreateInstance() failed", hr);
-		return 0;
-	}
-
-	/*
-	 * server is not AddRef'd here in spite of the use of CComObject::CreateInstance
-	 * because CoRegisterClassObject does an automatic AddRef()
-	 */
-
-	DWORD id = 0;
-	hr = CoRegisterClassObject(CLSID_CrossfireServer, (ICrossfireServerClass*)serverClass, CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE, &id);
-	if (FAILED(hr)) {
-		Logger::error("IECrossfireServer.main(): CoRegisterClassObject() failed", hr);
-		return 0;
-	}
-
-	BOOL ret;
-	MSG msg;
-	while ((ret = GetMessage(&msg, 0, 0, 0)) != 0) {
-		if (ret == -1) {
-			Logger::error("IECrossfireServer.main(): GetMessage() failed", GetLastError());
-		} else {
-			TranslateMessage(&msg);
-			DispatchMessage(&msg);
-		}
-	}
-
-	hr = CoRevokeClassObject(id);
-	if (FAILED(hr)) {
-		Logger::error("IECrossfireServer.main(): CoRevokeClassObject() failed", hr);
-		return 0;
-	}
-
-	CoUninitialize();
-	return 0;
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.idl b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.idl
deleted file mode 100644
index 6bd5345..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.idl
+++ /dev/null
@@ -1,145 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-import "oaidl.idl";
-import "ocidl.idl";
-
-[
-	object,
-	uuid(31DC44C3-7C98-4737-8D62-0E78FCCC503C),
-	helpstring("IJSEvalCallback Interface"),
-	pointer_default(unique)
-]
-interface IJSEvalCallback : IUnknown {
-};
-[
-	object,
-	uuid(0F9DDD31-746A-4EBC-873D-7A988B5EE088),
-	helpstring("IIEDebugger Interface"),
-	pointer_default(unique)
-]
-interface IIEDebugger : IUnknown {
-};
-[
-	object,
-	uuid(E4121804-5350-4DDD-BE57-9C5B2A13EA29),
-	oleautomation,
-	dual,
-	nonextensible,
-	helpstring("IBrowserContext Interface"),
-	pointer_default(unique)
-]
-interface IBrowserContext : IUnknown {
-	HRESULT displayMessage([in, string] OLECHAR* message);
-	HRESULT navigate([in, string] OLECHAR* url, [in] boolean openNewTab);
-};
-[
-	object,
-	uuid(031DB015-B1BE-4D39-84D2-D7F96D2ACBFE),
-	oleautomation,
-	dual,
-	nonextensible,
-	helpstring("ICrossfireServer Interface"),
-	pointer_default(unique)
-]
-interface ICrossfireServer : IDispatch {
-	HRESULT contextCreated([in] DWORD processId, [in] DWORD threadId, [in, string] OLECHAR* url);
-	HRESULT contextDestroyed([in] DWORD processId);
-	HRESULT contextLoaded([in] DWORD processId);
-	HRESULT getPort([out] unsigned int* value);
-	HRESULT getState([out] int* value);
-	HRESULT registerBrowser([in] DWORD processId, [in] IBrowserContext* browser);
-	HRESULT removeBrowser([in] DWORD processId);
-	HRESULT setCurrentContext([in] DWORD processId);
-	HRESULT start([in] unsigned int port, [in] unsigned int debugPort);
-	HRESULT stop();
-};
-[
-	object,
-	uuid(F48260BB-C061-4410-9CE1-4C5C7602690E),
-	oleautomation,
-	dual,
-	nonextensible,
-	helpstring("ICrossfireServerClass Interface"),
-	pointer_default(unique)
-]
-interface ICrossfireServerClass : IDispatch {
-//	HRESULT GetServer([in] unsigned long windowHandle, [out, retval] ICrossfireServer** _value);
-	HRESULT GetServer([out, retval] ICrossfireServer** _value);
-	HRESULT RemoveServer([in] unsigned long windowHandle);
-};
-[
-	object,
-	uuid(56C1AD62-3E69-46BA-BE6D-E1D2A0D88AB5),
-	dual,
-	nonextensible,
-	helpstring("IPendingScriptLoad Interface"),
-	pointer_default(unique)
-]
-interface IPendingScriptLoad : IDispatch {
-};
-[
-	uuid(A8FFC284-CE2C-40B5-98D1-D3112811E9D9),
-	version(1.0),
-	helpstring("IECrossfireServer 1.0 Type Library")
-]
-library IECrossfireServerLib {
-	importlib("stdole2.tlb");
-	[
-		uuid(4EC15DD3-9E2F-43A7-A686-3FA90E22ABB7),
-		helpstring("JSEvalCallback Class")
-	]
-	coclass JSEvalCallback
-	{
-		[default] interface IJSEvalCallback;
-	};
-	[
-		uuid(B63BD92F-6C66-4AB2-A243-D5AFCCF4B587),
-		helpstring("IEDebugger Class")
-	]
-	coclass IEDebugger
-	{
-		[default] interface IIEDebugger;
-	};
-	[
-		uuid(47836AF4-3E0C-4995-8029-FF931C5A43FC),
-		helpstring("CrossfireServer Class")
-	]
-	coclass CrossfireServer
-	{
-		[default] interface ICrossfireServer;
-	};
-	[
-		uuid(7C3C5D7A-AF4D-4F32-A3C9-462BFBAFDC25),
-		helpstring("CrossfireServerClass Class")
-	]
-	coclass CrossfireServerClass
-	{
-		[default] interface ICrossfireServerClass;
-	};
-	[
-		uuid(88E7C480-7B7A-47C5-8329-CE1FDF415527),
-		helpstring("PendingScriptLoad Class")
-	]
-	coclass PendingScriptLoad
-	{
-		[default] interface IPendingScriptLoad;
-	};
-	[
-		uuid(2FA65B09-5063-45FA-91F9-50EB7F4AF2C6),
-		helpstring("BrowserContext Class")
-	]
-	coclass BrowserContext
-	{
-		[default] interface IBrowserContext;
-	};
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.rc b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.rc
deleted file mode 100644
index febc4b6..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.rc
+++ /dev/null
@@ -1,140 +0,0 @@
-// Microsoft Visual C++ generated resource script.
-//
-#include "resource.h"
-
-#define APSTUDIO_READONLY_SYMBOLS
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 2 resource.
-//
-#include "winres.h"
-
-/////////////////////////////////////////////////////////////////////////////
-#undef APSTUDIO_READONLY_SYMBOLS
-
-/////////////////////////////////////////////////////////////////////////////
-// English (United States) resources
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
-LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
-#pragma code_page(1252)
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// REGISTRY
-//
-
-#endif    // English (United States) resources
-/////////////////////////////////////////////////////////////////////////////
-
-
-/////////////////////////////////////////////////////////////////////////////
-// English (Canada) resources
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENC)
-LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_CAN
-#pragma code_page(1252)
-
-#ifdef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// TEXTINCLUDE
-//
-
-1 TEXTINCLUDE 
-BEGIN
-    "resource.h\0"
-END
-
-2 TEXTINCLUDE 
-BEGIN
-    "#include ""winres.h""\r\n"
-    "\0"
-END
-
-3 TEXTINCLUDE 
-BEGIN
-    "1 TYPELIB ""IECrossfireServer.tlb""\r\n"
-    "\0"
-END
-
-#endif    // APSTUDIO_INVOKED
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Version
-//
-
-VS_VERSION_INFO VERSIONINFO
- FILEVERSION 1,0,0,1
- PRODUCTVERSION 1,0,0,1
- FILEFLAGSMASK 0x3fL
-#ifdef _DEBUG
- FILEFLAGS 0x1L
-#else
- FILEFLAGS 0x0L
-#endif
- FILEOS 0x4L
- FILETYPE 0x1L
- FILESUBTYPE 0x0L
-BEGIN
-    BLOCK "StringFileInfo"
-    BEGIN
-        BLOCK "040904e4"
-        BEGIN
-            VALUE "CompanyName", "Eclipse Foundation"
-            VALUE "FileDescription", "Crossfire Server for Internet Explorer"
-            VALUE "FileVersion", "1.0.0.0"
-            VALUE "LegalCopyright", "(c) Copyright Eclipse contributors and others, 2011.  All rights reserved.  Eclipse is a trademark of the Eclipse Foundation, Inc.  Internet Explorer is a registered trademark of Microsoft Corporation."
-            VALUE "InternalName", "IECrossfireServer"
-            VALUE "OriginalFilename", "IECrossfireServer.exe"
-            VALUE "ProductName", "Crossfire Server for Internet Explorer"
-            VALUE "ProductVersion", "0,0,0,0"
-        END
-    END
-    BLOCK "VarFileInfo"
-    BEGIN
-        VALUE "Translation", 0x409, 1252
-    END
-END
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// REGISTRY
-//
-
-IDR_IECrossfireServer   REGISTRY                "IECrossfireServer.rgs"
-IDR_JSEVALCALLBACK      REGISTRY                "JSEvalCallback.rgs"
-IDR_IEDEBUGGER          REGISTRY                "IEDebugger.rgs"
-IDR_CROSSFIRESERVER     REGISTRY                "CrossfireServer1.rgs"
-IDR_CROSSFIRESERVERCLASS REGISTRY                "CrossfireServerClass.rgs"
-IDR_PENDINGSCRIPTLOAD   REGISTRY                "PendingScriptLoad.rgs"
-IDR_BROWSERCONTEXT      REGISTRY                "BrowserContext.rgs"
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// String Table
-//
-
-STRINGTABLE
-BEGIN
-    IDS_PROJNAME            "IECrossfireServer"
-END
-
-#endif    // English (Canada) resources
-/////////////////////////////////////////////////////////////////////////////
-
-
-
-#ifndef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 3 resource.
-//
-1 TYPELIB "IECrossfireServer.tlb"
-
-/////////////////////////////////////////////////////////////////////////////
-#endif    // not APSTUDIO_INVOKED
-
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.rgs b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.rgs
deleted file mode 100644
index 2e7f3a0..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.rgs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-HKCR {
-	NoRemove AppID {
-		'%APPID%' = s 'IECrossfireServer'
-		'IECrossfireServer.EXE' {
-			val AppID = s '%APPID%'
-		}
-	}
-	NoRemove CLSID {
-		ForceRemove {47836AF4-3E0C-4995-8029-FF931C5A43FC} = s 'CrossfireServer Class' {
-			LocalServer32 = s '%MODULE%'
-		}
-	}
-	NoRemove Interface {
-		ForceRemove {031DB015-B1BE-4D39-84D2-D7F96D2ACBFE} = s 'CrossfireServer Interface' {
-			ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}'
-			TypeLib = s '{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}'
-		}
-	}
-	NoRemove Interface {
-		ForceRemove {F48260BB-C061-4410-9CE1-4C5C7602690E} = s 'CrossfireServerClass Interface' {
-			ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}'
-			TypeLib = s '{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}'
-		}
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.vcxproj b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.vcxproj
deleted file mode 100644
index 6dd3150..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.vcxproj
+++ /dev/null
@@ -1,221 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{2B73B89A-A1B4-479B-8751-A25B9036A9AF}</ProjectGuid>
-    <RootNamespace>IECrossfireServer</RootNamespace>
-    <Keyword>AtlProj</Keyword>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfAtl>Dynamic</UseOfAtl>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseOfAtl>Dynamic</UseOfAtl>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup>
-    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)\</IntDir>
-    <IgnoreImportLibrary Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</IgnoreImportLibrary>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)\</IntDir>
-    <IgnoreImportLibrary Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</IgnoreImportLibrary>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
-    <PostBuildEventUseInBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</PostBuildEventUseInBuild>
-    <PostBuildEventUseInBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</PostBuildEventUseInBuild>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <Midl>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>false</MkTypLibCompatible>
-      <TargetEnvironment>Win32</TargetEnvironment>
-      <GenerateStublessProxies>true</GenerateStublessProxies>
-      <TypeLibraryName>$(IntDir)IECrossfireServer.tlb</TypeLibraryName>
-      <HeaderFileName>IECrossfireServer.h</HeaderFileName>
-      <DllDataFileName>
-      </DllDataFileName>
-      <InterfaceIdentifierFileName>IECrossfireServer_i.c</InterfaceIdentifierFileName>
-      <ProxyFileName>IECrossfireServer_p.c</ProxyFileName>
-      <ValidateAllParameters>false</ValidateAllParameters>
-    </Midl>
-    <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MinimalRebuild>true</MinimalRebuild>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
-      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <PrecompiledHeader>Use</PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
-      <AdditionalIncludeDirectories>C:\activescripting;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <CompileAs>Default</CompileAs>
-    </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ResourceCompile>
-    <Link>
-      <AdditionalDependencies>WS2_32.lib;C:\activescripting\ad1.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Windows</SubSystem>
-      <TargetMachine>MachineX86</TargetMachine>
-      <RegisterOutput>false</RegisterOutput>
-      <PerUserRedirection>false</PerUserRedirection>
-    </Link>
-    <PostBuildEvent>
-      <Message>Performing registration</Message>
-      <Command>"$(TargetPath)" /RegServer</Command>
-    </PostBuildEvent>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <Midl>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>false</MkTypLibCompatible>
-      <TargetEnvironment>Win32</TargetEnvironment>
-      <GenerateStublessProxies>true</GenerateStublessProxies>
-      <TypeLibraryName>$(IntDir)IECrossfireServer.tlb</TypeLibraryName>
-      <HeaderFileName>IECrossfireServer.h</HeaderFileName>
-      <DllDataFileName>
-      </DllDataFileName>
-      <InterfaceIdentifierFileName>IECrossfireServer_i.c</InterfaceIdentifierFileName>
-      <ProxyFileName>IECrossfireServer_p.c</ProxyFileName>
-      <ValidateAllParameters>false</ValidateAllParameters>
-    </Midl>
-    <ClCompile>
-      <Optimization>MinSpace</Optimization>
-      <PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <PrecompiledHeader>Use</PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <AdditionalIncludeDirectories>C:\activescripting;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-    </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ResourceCompile>
-    <Link>
-      <AdditionalDependencies>WS2_32.lib;C:\activescripting\ad1.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Windows</SubSystem>
-      <OptimizeReferences>true</OptimizeReferences>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <TargetMachine>MachineX86</TargetMachine>
-    </Link>
-    <PostBuildEvent>
-      <Message>Performing registration</Message>
-      <Command>"$(TargetPath)" /RegServer</Command>
-    </PostBuildEvent>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClCompile Include="CrossfireBPManager.cpp" />
-    <ClCompile Include="CrossfireBreakpoint.cpp" />
-    <ClCompile Include="CrossfireContext.cpp" />
-    <ClCompile Include="CrossfireEvent.cpp" />
-    <ClCompile Include="CrossfireLineBreakpoint.cpp" />
-    <ClCompile Include="CrossfirePacket.cpp" />
-    <ClCompile Include="CrossfireProcessor.cpp" />
-    <ClCompile Include="CrossfireRequest.cpp" />
-    <ClCompile Include="CrossfireResponse.cpp" />
-    <ClCompile Include="CrossfireServer.cpp" />
-    <ClCompile Include="CrossfireServerClass.cpp" />
-    <ClCompile Include="IECrossfireServer.cpp" />
-    <ClCompile Include="IEDebugger.cpp" />
-    <ClCompile Include="JSEvalCallback.cpp" />
-    <ClCompile Include="JSONParser.cpp" />
-    <ClCompile Include="Logger.cpp" />
-    <ClCompile Include="PendingScriptLoad.cpp" />
-    <ClCompile Include="stdafx.cpp">
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
-    </ClCompile>
-    <ClCompile Include="URL.cpp" />
-    <ClCompile Include="Value.cpp" />
-    <ClCompile Include="WindowsSocketConnection.cpp" />
-    <ClCompile Include="IECrossfireServer_i.c">
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-      </PrecompiledHeader>
-      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-      </PrecompiledHeader>
-    </ClCompile>
-  </ItemGroup>
-  <ItemGroup>
-    <Midl Include="IECrossfireServer.idl">
-      <DllDataFileName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-      </DllDataFileName>
-      <InterfaceIdentifierFileName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">IECrossfireServer_i.c</InterfaceIdentifierFileName>
-    </Midl>
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="CrossfireBPManager.h" />
-    <ClInclude Include="CrossfireBreakpoint.h" />
-    <ClInclude Include="CrossfireContext.h" />
-    <ClInclude Include="CrossfireEvent.h" />
-    <ClInclude Include="CrossfireLineBreakpoint.h" />
-    <ClInclude Include="CrossfirePacket.h" />
-    <ClInclude Include="CrossfireProcessor.h" />
-    <ClInclude Include="CrossfireRequest.h" />
-    <ClInclude Include="CrossfireResponse.h" />
-    <ClInclude Include="CrossfireServer.h" />
-    <ClInclude Include="CrossfireServerClass.h" />
-    <ClInclude Include="IBreakpointTarget.h" />
-    <ClInclude Include="IEDebugger.h" />
-    <ClInclude Include="JSEvalCallback.h" />
-    <ClInclude Include="IJSEvalHandler.h" />
-    <ClInclude Include="JSONParser.h" />
-    <ClInclude Include="Logger.h" />
-    <ClInclude Include="PendingScriptLoad.h" />
-    <ClInclude Include="Resource.h" />
-    <ClInclude Include="stdafx.h" />
-    <ClInclude Include="URL.h" />
-    <ClInclude Include="Value.h" />
-    <ClInclude Include="WindowsSocketConnection.h" />
-    <ClInclude Include="IECrossfireServer.h" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="CrossfireServer1.rgs" />
-    <None Include="CrossfireServerClass.rgs" />
-    <None Include="BrowserContext.rgs" />
-    <None Include="IECrossfireServer.rgs" />
-    <None Include="IEDebugger.rgs" />
-    <None Include="JSEvalCallback.rgs">
-      <SubType>Designer</SubType>
-    </None>
-    <None Include="PendingScriptLoad.rgs" />
-    <None Include="registry.bin" />
-  </ItemGroup>
-  <ItemGroup>
-    <ResourceCompile Include="IECrossfireServer.rc" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.vcxproj.filters b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.vcxproj.filters
deleted file mode 100644
index f9c1288..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.vcxproj.filters
+++ /dev/null
@@ -1,199 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <Filter Include="Source Files">
-      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
-      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
-    </Filter>
-    <Filter Include="Header Files">
-      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
-      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
-    </Filter>
-    <Filter Include="Resource Files">
-      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
-      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
-    </Filter>
-    <Filter Include="Generated Files">
-      <UniqueIdentifier>{f6ab1c25-d431-489b-b82f-215c09375f9a}</UniqueIdentifier>
-      <SourceControlFiles>False</SourceControlFiles>
-    </Filter>
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="CrossfireBPManager.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="CrossfireBreakpoint.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="CrossfireContext.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="CrossfireEvent.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="CrossfireLineBreakpoint.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="CrossfirePacket.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="CrossfireProcessor.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="CrossfireRequest.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="CrossfireResponse.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="CrossfireServer.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="CrossfireServerClass.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="IECrossfireServer.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="IEDebugger.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="JSEvalCallback.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="JSONParser.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="Logger.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="PendingScriptLoad.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="stdafx.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="Value.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="WindowsSocketConnection.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="IECrossfireServer_i.c">
-      <Filter>Generated Files</Filter>
-    </ClCompile>
-    <ClCompile Include="URL.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-  </ItemGroup>
-  <ItemGroup>
-    <Midl Include="IECrossfireServer.idl">
-      <Filter>Source Files</Filter>
-    </Midl>
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="CrossfireBPManager.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="CrossfireBreakpoint.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="CrossfireContext.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="CrossfireEvent.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="CrossfireLineBreakpoint.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="CrossfirePacket.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="CrossfireProcessor.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="CrossfireRequest.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="CrossfireResponse.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="CrossfireServer.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="CrossfireServerClass.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="IBreakpointTarget.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="IEDebugger.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="JSEvalCallback.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="JSONParser.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="Logger.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="PendingScriptLoad.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="Resource.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="stdafx.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="Value.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="WindowsSocketConnection.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="IECrossfireServer.h">
-      <Filter>Generated Files</Filter>
-    </ClInclude>
-    <ClInclude Include="IJSEvalHandler.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="URL.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="CrossfireServer1.rgs">
-      <Filter>Resource Files</Filter>
-    </None>
-    <None Include="CrossfireServerClass.rgs">
-      <Filter>Resource Files</Filter>
-    </None>
-    <None Include="IECrossfireServer.rgs">
-      <Filter>Resource Files</Filter>
-    </None>
-    <None Include="IEDebugger.rgs">
-      <Filter>Resource Files</Filter>
-    </None>
-    <None Include="JSEvalCallback.rgs">
-      <Filter>Resource Files</Filter>
-    </None>
-    <None Include="PendingScriptLoad.rgs">
-      <Filter>Resource Files</Filter>
-    </None>
-    <None Include="BrowserContext.rgs">
-      <Filter>Resource Files</Filter>
-    </None>
-    <None Include="registry.bin">
-      <Filter>Resource Files</Filter>
-    </None>
-  </ItemGroup>
-  <ItemGroup>
-    <ResourceCompile Include="IECrossfireServer.rc">
-      <Filter>Resource Files</Filter>
-    </ResourceCompile>
-  </ItemGroup>
-</Project>
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServerPS.vcxproj b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServerPS.vcxproj
deleted file mode 100644
index 9085b79..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServerPS.vcxproj
+++ /dev/null
@@ -1,96 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{668D1F72-89E4-47B7-AB3C-6851CDD0073D}</ProjectGuid>
-    <RootNamespace>IECrossfireServerPS</RootNamespace>
-    <Keyword>AtlPSProj</Keyword>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-    <CharacterSet>Unicode</CharacterSet>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup>
-    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)PS\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)PS\</IntDir>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)PS\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)PS\</IntDir>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <PreBuildEvent>
-      <Message>Checking for required files</Message>
-      <Command>if exist dlldata.c goto :END
-echo Error: MIDL will not generate DLLDATA.C unless you have at least 1 interface in the main project.
-Exit 1
-:END
-</Command>
-    </PreBuildEvent>
-    <ClCompile>
-      <PreprocessorDefinitions>WIN32;_WIN32_WINNT=0x0500;REGISTER_PROXY_DLL;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-    </ClCompile>
-    <Link>
-      <RegisterOutput>true</RegisterOutput>
-      <AdditionalDependencies>kernel32.lib;rpcns4.lib;rpcrt4.lib;oleaut32.lib;uuid.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <ModuleDefinitionFile>IECrossfireServerPS.def</ModuleDefinitionFile>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <PreBuildEvent>
-      <Message>Checking for required files</Message>
-      <Command>if exist dlldata.c goto :END
-echo Error: MIDL will not generate DLLDATA.C unless you have at least 1 interface in the main project.
-Exit 1
-:END
-</Command>
-    </PreBuildEvent>
-    <ClCompile>
-      <Optimization>MaxSpeed</Optimization>
-      <PreprocessorDefinitions>WIN32;_WIN32_WINNT=0x0500;REGISTER_PROXY_DLL;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-    </ClCompile>
-    <Link>
-      <RegisterOutput>true</RegisterOutput>
-      <AdditionalDependencies>kernel32.lib;rpcns4.lib;rpcrt4.lib;oleaut32.lib;uuid.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <ModuleDefinitionFile>IECrossfireServerPS.def</ModuleDefinitionFile>
-      <OptimizeReferences>true</OptimizeReferences>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ClCompile Include="dlldata.c" />
-    <ClCompile Include="IECrossfireServer_i.c" />
-    <ClCompile Include="IECrossfireServer_p.c" />
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="IECrossfireServerps.def" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServerPS.vcxproj.filters b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServerPS.vcxproj.filters
deleted file mode 100644
index a8541de..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServerPS.vcxproj.filters
+++ /dev/null
@@ -1,26 +0,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <Filter Include="Source Files">
-      <UniqueIdentifier>{f04fb3ce-90f0-4544-a5b1-f643363d7619}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Generated Files">
-      <UniqueIdentifier>{c0c598fb-6827-4089-9ee9-dcebd15ca0b7}</UniqueIdentifier>
-      <SourceControlFiles>False</SourceControlFiles>
-    </Filter>
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="dlldata.c">
-      <Filter>Generated Files</Filter>
-    </ClCompile>
-    <ClCompile Include="IECrossfireServer_i.c">
-      <Filter>Generated Files</Filter>
-    </ClCompile>
-    <ClCompile Include="IECrossfireServer_p.c">
-      <Filter>Generated Files</Filter>
-    </ClCompile>
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="IECrossfireServerps.def" />
-  </ItemGroup>
-</Project>
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServerps.def b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServerps.def
deleted file mode 100644
index ae7ddbd..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServerps.def
+++ /dev/null
@@ -1,20 +0,0 @@
-; *******************************************************************************
-; * Copyright (c) 2011 IBM Corporation and others.
-; * All rights reserved. This program and the accompanying materials
-; * are made available under the terms of the Eclipse Public License v1.0
-; * which accompanies this distribution, and is available at
-; * http://www.eclipse.org/legal/epl-v10.html
-; *
-; * Contributors:
-; *     IBM Corporation - initial API and implementation
-; *******************************************************************************
-
-
-LIBRARY      "IECrossfireServerPS"
-
-EXPORTS
-	DllGetClassObject       PRIVATE
-	DllCanUnloadNow         PRIVATE
-	GetProxyDllInfo         PRIVATE
-	DllRegisterServer		PRIVATE
-	DllUnregisterServer		PRIVATE
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IEDebugger.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IEDebugger.cpp
deleted file mode 100644
index 031c5af..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IEDebugger.cpp
+++ /dev/null
@@ -1,248 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "stdafx.h"
-#include "IEDebugger.h"
-
-/* initialize constants */
-const wchar_t* IEDebugger::ABOUT_BLANK = L"about:blank";
-
-IEDebugger::IEDebugger() {
-	m_adviseCookies = new std::map<IDebugApplicationNode*, DWORD>;
-	m_context = NULL;
-	m_rootNode = NULL;
-}
-
-IEDebugger::~IEDebugger() {
-	delete m_adviseCookies;
-}
-
-/* IApplicationDebugger */
-
-STDMETHODIMP IEDebugger::QueryAlive(void) {
-	Logger::log("QueryAlive invoked");
-    return S_OK;
-}
-
-STDMETHODIMP IEDebugger::CreateInstanceAtDebugger(REFCLSID rclsid, IUnknown *pUnkOuter, DWORD dwClsContext, REFIID riid, IUnknown **ppvObject) {
-	Logger::log("CreateInstanceAtDebugger invoked");
-    return E_NOTIMPL;
-}
-
-STDMETHODIMP IEDebugger::onDebugOutput(LPCOLESTR pstr) {
-	Logger::log("onDebugOutput invoked");
-	return S_OK;
-}
-
-STDMETHODIMP IEDebugger::onHandleBreakPoint(IRemoteDebugApplicationThread *pDebugAppThread, BREAKREASON br, IActiveScriptErrorDebug *pScriptErrorDebug) {
-	if (m_context) {
-		m_context->breakpointHit(pDebugAppThread, br, pScriptErrorDebug);
-	} else {
-		// TODO should probably resume in this case?
-	}
-	return S_OK;
-}
-
-STDMETHODIMP IEDebugger::onClose(void) {
-	Logger::log("onClose invoked");
-	return E_NOTIMPL;
-}
-
-STDMETHODIMP IEDebugger::onDebuggerEvent(REFIID riid, IUnknown *punk) {
-	Logger::log("onDebuggerEvent invoked");
-    return E_NOTIMPL;
-}
-
-/* IApplicationDebuggerUI */
-
-STDMETHODIMP IEDebugger::BringDocumentToTop(IDebugDocumentText *pddt) {
-	Logger::log("BringDocumentToTop invoked");
-    return S_OK;
-}
-
-STDMETHODIMP IEDebugger::BringDocumentContextToTop(IDebugDocumentContext *pddc) {
-	Logger::log("BringDocumentContextToTop invoked");
-    return S_OK;
-}
-
-/* IDebugApplicationNodeEvents */
-
-STDMETHODIMP IEDebugger::onAddChild(IDebugApplicationNode *prddpChild) {
-	if (!m_context) {
-		return S_OK;
-	}
-
-	/* don't register about:blank as a script */
-	CComBSTR bstrUrl = NULL;
-	HRESULT hr = prddpChild->GetName(DOCUMENTNAMETYPE_TITLE, &bstrUrl);
-	if (FAILED(hr)) {
-		Logger::error("IEDebugger.onAddChild(): GetName() failed", hr);
-	} else {
-		if (wcscmp(bstrUrl, ABOUT_BLANK) != 0) {
-			m_context->scriptInitialized(prddpChild, false);
-		}
-	}
-
-	advise(prddpChild, false, false);
-	return S_OK;
-}
-
-STDMETHODIMP IEDebugger::onRemoveChild(IDebugApplicationNode *prddpChild) {
-	unadvise(prddpChild, false, false);
-	return S_OK;
-}
-
-STDMETHODIMP IEDebugger::onDetach(void) {
-    return S_OK;
-}
-
-STDMETHODIMP IEDebugger::onAttach(IDebugApplicationNode *prddpParent) {
-    return S_OK;
-}
-
-/* IDebugSessionProvider */
-
-STDMETHODIMP IEDebugger::StartDebugSession(IRemoteDebugApplication *pda) {
-	Logger::log("StartDebugSession invoked");
-    return S_OK;
-}
-
-/* IEDebugger */
-
-bool IEDebugger::advise(IDebugApplicationNode* node, bool isRoot, bool recurse) {
-	CComPtr<IConnectionPointContainer> connectionPointContainer = NULL;
-	HRESULT hr = node->QueryInterface(IID_IConnectionPointContainer, (void**)&connectionPointContainer);
-	if (FAILED(hr)) {
-		Logger::error("IEDebugger.advise(): QI(IID_IConnectionPointContainer) failed", hr);
-		return false;
-	}
-	CComPtr<IConnectionPoint> nodeConnectionPoint = NULL;
-	hr = connectionPointContainer->FindConnectionPoint(IID_IDebugApplicationNodeEvents, &nodeConnectionPoint);
-	if (FAILED(hr)) {
-		Logger::error("IEDebugger.advise(): FindConnectionPoint() failed", hr);
-		return false;
-	}
-
-	DWORD connectionPointCookie = 0;
-	hr = nodeConnectionPoint->Advise(static_cast<IIEDebugger*>(this), &connectionPointCookie);
-	if (FAILED(hr)) {
-		Logger::error("IEDebugger.advise(): Advise() failed", hr);
-		return false;
-	}
-
-	if (isRoot) {
-		m_rootCookie = connectionPointCookie;
-		m_rootNode = node;
-	} else {
-		m_adviseCookies->insert(std::pair<IDebugApplicationNode*,DWORD>(node, connectionPointCookie));
-	}
-	node->AddRef();
-
-	if (recurse) {
-		CComPtr<IEnumDebugApplicationNodes> nodes = NULL;
-		hr = node->EnumChildren(&nodes);
-		if (FAILED(hr)) {
-			Logger::error("IEDebugger.advise(): EnumChildren() failed", hr);
-		} else {
-			IDebugApplicationNode* current = NULL;
-			ULONG count = 0;
-			hr = nodes->Next(1, &current, &count);
-			while (SUCCEEDED(hr) && count) {
-				advise(current, false, true);
-				current->Release();
-				hr = nodes->Next(1, &current, &count);
-			}
-		}
-	}
-	return true;
-}
-
-void IEDebugger::setContext(CrossfireContext* value) {
-	if (m_context == value) {
-		return;
-	}
-	m_context = value;
-
-	if (m_rootNode) {
-		unadvise(m_rootNode, true, true);
-	}
-
-	if (value) {
-		CComPtr<IRemoteDebugApplication> application = NULL;
-		HRESULT hr = m_context->getDebugApplication(&application);
-		if (SUCCEEDED(hr)) {
-			CComPtr<IDebugApplicationNode> rootNode = NULL;
-			hr = application->GetRootNode(&rootNode);
-			if (FAILED(hr)) {
-				Logger::error("IEDebugger.setContext(): GetRootNode() failed", hr);
-				return;
-			}
-			advise(rootNode, true, true);
-		}
-	}
-}
-
-bool IEDebugger::unadvise(IDebugApplicationNode* node, bool isRoot, bool recurse) {
-	CComPtr<IConnectionPointContainer> connectionPointContainer = NULL;
-	HRESULT hr = node->QueryInterface(IID_IConnectionPointContainer, (void**)&connectionPointContainer);
-	if (FAILED(hr)) {
-		Logger::error("IEDebugger.unadvise(): QI(IID_IConnectionPointContainer) failed", hr);
-		return false;
-	}
-	CComPtr<IConnectionPoint> nodeConnectionPoint = NULL;
-	hr = connectionPointContainer->FindConnectionPoint(IID_IDebugApplicationNodeEvents, &nodeConnectionPoint);
-	if (FAILED(hr)) {
-		Logger::error("IEDebugger.unadvise(): FindConnectionPoint() failed", hr);
-		return false;
-	}
-
-	DWORD cookie = 0;
-	if (isRoot) {
-		cookie = m_rootCookie;
-		m_rootNode->Release();
-		m_rootNode = NULL;
-	} else {
-		std::map<IDebugApplicationNode*, DWORD>::iterator iterator = m_adviseCookies->find(node);
-		if (iterator != m_adviseCookies->end()) {
-			cookie = iterator->second;
-			iterator->first->Release();
-			m_adviseCookies->erase(iterator);
-		}
-	}
-
-	if (cookie) {
-		hr = nodeConnectionPoint->Unadvise(cookie);
-		if (FAILED(hr)) {
-			Logger::error("IEDebugger.unadvise(): Unadvise() failed", hr);
-		}
-	}
-
-	if (recurse) {
-		CComPtr<IEnumDebugApplicationNodes> nodes = NULL;
-		hr = node->EnumChildren(&nodes);
-		if (FAILED(hr)) {
-			Logger::error("IEDebugger.unadvise(): EnumChildren() failed", hr);
-		} else {
-			IDebugApplicationNode* current = NULL;
-			ULONG count = 0;
-			hr = nodes->Next(1, &current, &count);
-			while (SUCCEEDED(hr) && count) {
-				unadvise(current, false, true);
-				current->Release();
-				hr = nodes->Next(1, &current, &count);
-			}
-		}
-	}
-	return true;
-}
-
-
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IEDebugger.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IEDebugger.h
deleted file mode 100644
index c4d9f42..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IEDebugger.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include "activdbg.h"
-#include "CrossfireContext.h"
-#include "Logger.h"
-
-class ATL_NO_VTABLE IEDebugger :
-	public CComObjectRootEx<CComSingleThreadModel>,
-	public CComCoClass<IEDebugger, &CLSID_IEDebugger>,
-	public IApplicationDebugger,
-    public IApplicationDebuggerUI,
-    public IDebugApplicationNodeEvents,
-	public IDebugSessionProvider,
-	public IIEDebugger {
-
-public:
-	DECLARE_REGISTRY_RESOURCEID(IDR_IEDEBUGGER)
-	BEGIN_COM_MAP(IEDebugger)
-		COM_INTERFACE_ENTRY2(IUnknown, IApplicationDebugger)
-		COM_INTERFACE_ENTRY(IIEDebugger)
-		COM_INTERFACE_ENTRY(IApplicationDebugger)
-		COM_INTERFACE_ENTRY(IApplicationDebuggerUI)
-		COM_INTERFACE_ENTRY(IDebugApplicationNodeEvents)
-		COM_INTERFACE_ENTRY(IDebugSessionProvider)
-		COM_INTERFACE_ENTRY(IIEDebugger)
-	END_COM_MAP()
-	DECLARE_PROTECT_FINAL_CONSTRUCT()
-
-	HRESULT FinalConstruct() {
-		return S_OK;
-	}
-
-	void FinalRelease() {
-	}
-
-public:
-	IEDebugger();
-	virtual ~IEDebugger();
-
-	/* interface definitions from activdbg.h */
-
-    /* IApplicationDebugger */
-    HRESULT STDMETHODCALLTYPE QueryAlive();
-    HRESULT STDMETHODCALLTYPE CreateInstanceAtDebugger( 
-        /* [in] */ REFCLSID rclsid,
-        /* [in] */ IUnknown *pUnkOuter,
-        /* [in] */ DWORD dwClsContext,
-        /* [in] */ REFIID riid,
-        /* [iid_is][out] */ IUnknown **ppvObject);
-    HRESULT STDMETHODCALLTYPE onDebugOutput( 
-        /* [in] */ LPCOLESTR pstr);
-    HRESULT STDMETHODCALLTYPE onHandleBreakPoint( 
-        /* [in] */ IRemoteDebugApplicationThread *prpt,
-        /* [in] */ BREAKREASON br,
-        /* [in] */ IActiveScriptErrorDebug *pError);
-    HRESULT STDMETHODCALLTYPE onClose();
-    HRESULT STDMETHODCALLTYPE onDebuggerEvent( 
-        /* [in] */ REFIID riid,
-        /* [in] */ IUnknown *punk);
-
-    /* IApplicationDebuggerUI */
-    HRESULT STDMETHODCALLTYPE BringDocumentToTop( 
-        /* [in] */ IDebugDocumentText *pddt);
-    HRESULT STDMETHODCALLTYPE BringDocumentContextToTop( 
-        /* [in] */ IDebugDocumentContext *pddc);
-
-    /* IDebugApplicationNodeEvents */
-    HRESULT STDMETHODCALLTYPE onAddChild( 
-        /* [in] */ IDebugApplicationNode *prddpChild);
-    HRESULT STDMETHODCALLTYPE onRemoveChild( 
-        /* [in] */ IDebugApplicationNode *prddpChild);
-    HRESULT STDMETHODCALLTYPE onDetach();
-    HRESULT STDMETHODCALLTYPE onAttach( 
-        /* [in] */ IDebugApplicationNode *prddpParent);
-
-	/* IDebugSessionProvider */
-    HRESULT STDMETHODCALLTYPE StartDebugSession( 
-        /* [in] */ IRemoteDebugApplication *pda);
-
-	/* IEDebugger */
-	void setContext(CrossfireContext* value);
-
-private:
-	bool advise(IDebugApplicationNode* node, bool isRoot, bool recurse);
-	bool unadvise(IDebugApplicationNode* node, bool isRoot, bool recurse);
-
-	std::map<IDebugApplicationNode*, DWORD>* m_adviseCookies;
-	CrossfireContext* m_context;
-	DWORD m_rootCookie;
-	IDebugApplicationNode* m_rootNode;
-
-	/* constants */
-	static const wchar_t* ABOUT_BLANK;
-};
-
-OBJECT_ENTRY_AUTO(__uuidof(IEDebugger), IEDebugger)
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IEDebugger.rgs b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IEDebugger.rgs
deleted file mode 100644
index 8d61801..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IEDebugger.rgs
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-HKCR
-{
-	IECrossfireServer.IEDebugger.1 = s 'IEDebugger Class'
-	{
-		CLSID = s '{B63BD92F-6C66-4AB2-A243-D5AFCCF4B587}'
-	}
-	IECrossfireServer.IEDebugger = s 'IEDebugger Class'
-	{
-		CLSID = s '{B63BD92F-6C66-4AB2-A243-D5AFCCF4B587}'
-		CurVer = s 'IECrossfireServer.IEDebugger.1'
-	}
-	NoRemove CLSID
-	{
-		ForceRemove {B63BD92F-6C66-4AB2-A243-D5AFCCF4B587} = s 'IEDebugger Class'
-		{
-			ProgID = s 'IECrossfireServer.IEDebugger.1'
-			VersionIndependentProgID = s 'IECrossfireServer.IEDebugger'
-			LocalServer32 = s '%MODULE%'
-			val AppID = s '%APPID%'
-			'TypeLib' = s '{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}'
-		}
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IJSEvalHandler.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IJSEvalHandler.h
deleted file mode 100644
index 182b93f..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IJSEvalHandler.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include <activdbg.h>
-
-class IJSEvalHandler {
-
-public:
-	IJSEvalHandler() {
-	}
-
-	virtual ~IJSEvalHandler() {
-	}
-
-	virtual void evalComplete(IDebugProperty* value, void* data) = 0;
-};
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSEvalCallback.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSEvalCallback.cpp
deleted file mode 100644
index 781dd57..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSEvalCallback.cpp
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "stdafx.h"
-#include "JSEvalCallback.h"
-
-JSEvalCallback::JSEvalCallback() {
-	m_expression = NULL;
-}
-
-JSEvalCallback::~JSEvalCallback() {
-	if (m_expression) {
-		if (FAILED(m_expression->QueryIsComplete())) {
-			m_expression->Abort();
-		}
-		m_expression->Release();
-	}
-}
-
-/* IDebugExpressionCallBack */
-
-STDMETHODIMP JSEvalCallback::onComplete() {
-	HRESULT evalResult;
-	IDebugProperty* result = NULL;
-	HRESULT hr = m_expression->GetResultAsDebugProperty(&evalResult, &result);
-	if (FAILED(hr)) {
-		Logger::error("JSEvalCallback.onComplete(): GetResultAsDebugProperty() failed", hr);
-		return S_OK;
-	}
-	if (FAILED(evalResult)) {
-		Logger::error("JSEvalCallback.onComplete(): evaluation of GetResultAsDebugProperty() failed", evalResult);
-		return S_OK;
-	}
-	m_handler->evalComplete(result, m_data);
-	result->Release();
-	return S_OK;
-}
-
-/* JSEvalCallback */
-
-bool JSEvalCallback::start(IDebugExpression* expression, IJSEvalHandler* handler, void* data) {
-	HRESULT hr = expression->Start(this);
-	if (FAILED(hr)) {
-		Logger::error("JSEvalCallback.start(): Start() failed", hr);
-		return false;
-	}
-
-	if (m_expression) {
-		if (FAILED(m_expression->QueryIsComplete())) {
-			m_expression->Abort();
-		}
-		m_expression->Release();
-	}
-	m_expression = expression;
-	m_expression->AddRef();
-	m_data = data;
-	m_handler = handler;
-	return true;
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSEvalCallback.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSEvalCallback.h
deleted file mode 100644
index c79feea..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSEvalCallback.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include "activdbg.h"
-#include "resource.h"
-#include "IECrossfireServer.h"
-#include "IJSEvalHandler.h"
-#include "Logger.h"
-
-class ATL_NO_VTABLE JSEvalCallback :
-	public CComObjectRootEx<CComSingleThreadModel>,
-	public CComCoClass<JSEvalCallback, &CLSID_JSEvalCallback>,
-	public IDebugExpressionCallBack {
-
-public:
-	DECLARE_REGISTRY_RESOURCEID(IDR_JSEVALCALLBACK)
-	BEGIN_COM_MAP(JSEvalCallback)
-		COM_INTERFACE_ENTRY2(IUnknown, IDebugExpressionCallBack)
-		COM_INTERFACE_ENTRY(IDebugExpressionCallBack)
-	END_COM_MAP()
-	DECLARE_PROTECT_FINAL_CONSTRUCT()
-
-	HRESULT FinalConstruct() {
-		return S_OK;
-	}
-
-	void FinalRelease() {
-	}
-
-public:
-	JSEvalCallback();
-	virtual ~JSEvalCallback();
-
-	/* IDebugExpressionCallBack */
-	HRESULT STDMETHODCALLTYPE onComplete();
-
-	/* JSEvalCallback */
-	bool start(IDebugExpression* expression, IJSEvalHandler* handler, void* data);
-
-private:
-	IDebugExpression* m_expression;
-	IJSEvalHandler* m_handler;
-	void* m_data;
-};
-
-OBJECT_ENTRY_AUTO(__uuidof(JSEvalCallback), JSEvalCallback)
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSEvalCallback.rgs b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSEvalCallback.rgs
deleted file mode 100644
index 506e81e..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSEvalCallback.rgs
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-HKCR
-{
-	IECrossfireServer.JSEvalCallback.1 = s 'JSEvalCallback Class'
-	{
-		CLSID = s '{4EC15DD3-9E2F-43A7-A686-3FA90E22ABB7}'
-	}
-	IECrossfireServer.JSEvalCallback = s 'JSEvalCallback Class'
-	{
-		CLSID = s '{4EC15DD3-9E2F-43A7-A686-3FA90E22ABB7}'
-		CurVer = s 'IECrossfireServer.JSEvalCallback.1'
-	}
-	NoRemove CLSID
-	{
-		ForceRemove {4EC15DD3-9E2F-43A7-A686-3FA90E22ABB7} = s 'JSEvalCallback Class'
-		{
-			ProgID = s 'IECrossfireServer.JSEvalCallback.1'
-			VersionIndependentProgID = s 'IECrossfireServer.JSEvalCallback'
-			LocalServer32 = s '%MODULE%'
-			val AppID = s '%APPID%'
-			'TypeLib' = s '{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}'
-		}
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSONParser.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSONParser.cpp
deleted file mode 100644
index 067b88a..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSONParser.cpp
+++ /dev/null
@@ -1,501 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "StdAfx.h"
-#include "JSONParser.h"
-
-/* initialize constants */
-const wchar_t* JSONParser::VALUE_NULL = L"null";
-const wchar_t* JSONParser::VALUE_TRUE = L"true";
-const wchar_t* JSONParser::VALUE_FALSE = L"false";
-
-JSONParser::JSONParser(void) {
-}
-
-JSONParser::~JSONParser(void) {
-}
-
-void JSONParser::parse(std::wstring* jsonString, Value** _value) {
-	*_value = NULL;
-
-	std::wstringstream jsonStream(*jsonString);
-	parse(&jsonStream, _value);
-}
-
-void JSONParser::parse(std::wstringstream* jsonStream, Value** _value) {
-	*_value = NULL;
-
-	skipWhitespace(jsonStream);
-	wchar_t firstChar = jsonStream->peek();
-	if (firstChar == wchar_t('n')) {
-		size_t length = wcslen(VALUE_NULL);
-		wchar_t* streamChars = new wchar_t[length];
-		jsonStream->read(streamChars, (std::streamsize)length);
-		if (wcsncmp(VALUE_NULL, streamChars, length) == 0) {
-			*_value = new Value();
-			(*_value)->setType(TYPE_NULL);
-		} else {
-			Logger::error("JSON string has invalid value that starts with 'n' but is not \"null\"");
-		}
-		delete[] streamChars;
-		return;
-	}
-	if (firstChar == wchar_t('t')) {
-		size_t length = wcslen(VALUE_TRUE);
-		wchar_t* streamChars = new wchar_t[length];
-		jsonStream->read(streamChars, (std::streamsize)length);
-		if (wcsncmp(VALUE_TRUE, streamChars, length) == 0) {
-			Value* result = new Value(true);
-			*_value = result;
-		} else {
-			Logger::error("JSON string has invalid value that starts with 't' but is not \"true\"");
-		}
-		delete[] streamChars;
-		return;
-	}
-	if (firstChar == wchar_t('f')) {
-		size_t length = wcslen(VALUE_FALSE);
-		wchar_t* streamChars = new wchar_t[length];
-		jsonStream->read(streamChars, (std::streamsize)length);
-		if (wcsncmp(VALUE_FALSE, streamChars, length) == 0) {
-			Value* result = new Value(false);
-			*_value = result;
-		} else {
-			Logger::error("JSON string has invalid value that starts with 'f' but is not \"false\"");
-		}
-		delete[] streamChars;
-		return;
-	}
-	if (firstChar == wchar_t('\"')) {
-		std::wstring* stringValue = NULL;
-		parseString(jsonStream, &stringValue);
-		if (stringValue) {
-			Value* result = new Value(stringValue);
-			*_value = result;
-			delete stringValue;
-		} else {
-			/* parseString() already logs a detailed error message, so no error logged here */
-		}
-		return;
-	}
-
-	int index = 0;
-	switch (firstChar) {
-		case wchar_t('0'):
-		case wchar_t('1'):
-		case wchar_t('2'):
-		case wchar_t('3'):
-		case wchar_t('4'):
-		case wchar_t('5'):
-		case wchar_t('6'):
-		case wchar_t('7'):
-		case wchar_t('8'):
-		case wchar_t('9'):
-		case wchar_t('-'): {
-			double doubleValue = parseNumber(jsonStream);
-			if (doubleValue == -DBL_MAX) {
-				Logger::error("JSON string has a Number value with invalid character(s)");
-				return;
-			}
-			Value* result = new Value(doubleValue);
-			*_value = result;
-			return;
-		}
-	}
-	
-	if (firstChar == wchar_t('[')) {
-		parseArray(jsonStream, _value);
-		return;
-	}
-
-	if (firstChar == wchar_t('{')) {
-		parseObject(jsonStream, _value);
-		return;
-	}
-}
-
-void JSONParser::parseArray(std::wstringstream* jsonStream, Value** _value) {
-	*_value = NULL;
-
-	Value* result = new Value();
-	result->setType(TYPE_ARRAY);
-
-	jsonStream->ignore(1);
-	skipWhitespace(jsonStream);
-	if (jsonStream->peek() == wchar_t(']')) {
-		jsonStream->ignore(1);
-		*_value = result;
-		return;
-	}
-
-	while (true) {
-		Value* currentValue = NULL;
-		parse(jsonStream, &currentValue);
-		if (!currentValue) {
-			delete result;
-			return;
-		}
-		result->addArrayValue(currentValue);
-		delete currentValue;
-
-		skipWhitespace(jsonStream);
-		wchar_t nextChar = jsonStream->peek();
-		if (nextChar == wchar_t(',')) {
-			jsonStream->ignore(1);
-			skipWhitespace(jsonStream);
-			continue;
-		}
-		if (nextChar == wchar_t(']')) {
-			jsonStream->ignore(1);
-			*_value = result;
-		} else {
-			Logger::error("JSON string has an array without expected closing ']'");
-			delete result;
-		}
-		return;
-	}
-}
-
-double JSONParser::parseNumber(std::wstringstream* jsonStream) {
-	int count = 0;
-	bool looking = true;
-	bool nonZeroEncountered = false;
-	wchar_t currentChar = jsonStream->peek();
-	while (looking) {
-		if (jsonStream->eof()) {
-			looking = false;
-			break;
-		}
-		switch (currentChar) {
-			case wchar_t('1'):
-			case wchar_t('2'):
-			case wchar_t('3'):
-			case wchar_t('4'):
-			case wchar_t('5'):
-			case wchar_t('6'):
-			case wchar_t('7'):
-			case wchar_t('8'):
-			case wchar_t('9'):
-			case wchar_t('-'):
-			case wchar_t('+'):
-			case wchar_t('e'):
-			case wchar_t('E'): {
-				nonZeroEncountered = true;
-			}
-			// FALL THROUGH
-			case wchar_t('0'):
-			case wchar_t('.'): {
-				jsonStream->ignore(1);
-				count++;
-				break;
-			}
-			default: {
-				looking = false;
-				break;
-			}
-		}
-		currentChar = jsonStream->peek();
-	}
-	for (int i = 0; i < count; i++) {
-		jsonStream->unget();
-	}
-
-	wchar_t* numberChars = new wchar_t[count + 1];
-	jsonStream->read(numberChars, count);
-	numberChars[count] = wchar_t('\0');
-	wchar_t* endPoint;
-	double numberValue = wcstod(numberChars, &endPoint);
-	delete[] numberChars;
-	if (numberValue == 0 && nonZeroEncountered) {
-		return -DBL_MAX;
-	}
-	return numberValue;
-}
-
-void JSONParser::parseObject(std::wstringstream* jsonStream, Value** _value) {
-	*_value = NULL;
-
-	Value* result = new Value();
-	result->setType(TYPE_OBJECT);
-
-	jsonStream->ignore(1);
-	skipWhitespace(jsonStream);
-	if (jsonStream->peek() == wchar_t('}')) {
-		jsonStream->ignore(1);
-		*_value = result;
-		return;
-	}
-
-	while (true) {
-		if (jsonStream->peek() != wchar_t('\"')) {
-			Logger::error("JSON string has an object with a non-String key value");
-			delete result;
-			return;
-		}
-		std::wstring* key = NULL;
-		parseString(jsonStream, &key);
-		skipWhitespace(jsonStream);
-		if (jsonStream->get() != wchar_t(':')) {
-			Logger::error("JSON string has an object without a ':' separating a key from its _value");
-			delete key;
-			delete result;
-			return;
-		}
-		Value* assocValue = NULL;
-		skipWhitespace(jsonStream);
-		parse(jsonStream, &assocValue);
-		if (!assocValue) {
-			delete key;
-			delete result;
-			return;
-		}
-		bool success = result->addObjectValue(key, assocValue);
-		delete assocValue;
-		delete key;
-		if (!success) {
-			Logger::error("JSON string has an object with a duplicate key");
-			delete result;
-			return;
-		}
-
-		skipWhitespace(jsonStream);
-		wchar_t nextChar = jsonStream->peek();
-		if (nextChar == wchar_t(',')) {
-			jsonStream->ignore(1);
-			skipWhitespace(jsonStream);
-			continue;
-		}
-		if (nextChar == wchar_t('}')) {
-			jsonStream->ignore(1);
-			*_value = result;
-		} else {
-			Logger::error("JSON string has an object without an expected closing '}'");
-			delete result;
-		}
-		return;
-	}
-}
-
-void JSONParser::parseString(std::wstringstream* jsonStream, std::wstring** _value) {
-	*_value = NULL;
-
-	std::wstring* result = new std::wstring;
-	jsonStream->ignore(1);
-	const wchar_t charBackslash = wchar_t('\\');
-	wchar_t charQuote = wchar_t('\"');
-	wchar_t currentChar = NULL;
-	jsonStream->read(&currentChar, 1);
-	while (currentChar != charQuote) {
-		if (jsonStream->eof()) {
-			Logger::error("JSON string has string value that does not end");
-			return;
-		}
-		if (currentChar == charBackslash) {
-			jsonStream->read(&currentChar, 1);
-			if (jsonStream->eof()) {
-				Logger::error("JSON string has string value that does not end");
-				return;
-			}
-			switch (currentChar) {
-				case wchar_t('\"'):
-				case wchar_t('/'):
-				case charBackslash: {
-					result->push_back(currentChar);
-					break;
-				}
-				case wchar_t('b'): {
-					result->push_back(wchar_t('\b'));
-					break;
-				}
-				case wchar_t('f'): {
-					result->push_back(wchar_t('\f'));
-					break;
-				}
-				case wchar_t('n'): {
-					result->push_back(wchar_t('\n'));
-					break;
-				}
-				case wchar_t('r'): {
-					result->push_back(wchar_t('\r'));
-					break;
-				}
-				case wchar_t('t'): {
-					result->push_back(wchar_t('\t'));
-					break;
-				}
-				case wchar_t('u'): {
-					Logger::log("FYI: unicode value encountered, not parsed, still //TODO");
-					// TODO
-					break;
-				}
-				default: {
-					Logger::error("JSON string has string value with an invalid escape sequence");
-					return;
-				}
-			}
-		} else {
-			result->push_back(currentChar);
-		}
-		jsonStream->read(&currentChar, 1);
-	}
-
-	*_value = result;
-}
-
-void JSONParser::skipWhitespace(std::wstringstream* jsonStream) {
-	wchar_t current = jsonStream->peek();
-	while (current == wchar_t(' ') || current == wchar_t('\r') || current == wchar_t('\n') || current == wchar_t('\t')) {
-		jsonStream->ignore(1);
-		current = jsonStream->peek();
-	}
-}
-
-void JSONParser::stringify(Value* value, std::wstring** _jsonString) {
-	switch (value->getType()) {
-		case TYPE_NULL: {
-			std::wstring* result = new std::wstring;
-			result->assign(VALUE_NULL);
-			*_jsonString = result;
-			break;
-		}
-		case TYPE_BOOLEAN: {
-			std::wstring* result = new std::wstring;
-			result->assign(value->getBooleanValue() ? VALUE_TRUE : VALUE_FALSE);
-			*_jsonString = result;
-			break;
-		}
-		case TYPE_NUMBER: {
-			std::wstring* result = new std::wstring;
-			std::wstringstream stringStream;
-			stringStream << value->getNumberValue();
-			result->assign(stringStream.str());
-			*_jsonString = result;
-			break;
-		}
-		case TYPE_STRING: {
-			static const wchar_t char_quote('\"');
-			static const wchar_t char_backslash('\\');
-			static const wchar_t char_forwardslash('/');
-			static const wchar_t char_backspace('\b');
-			static const wchar_t char_formfeed('\f');
-			static const wchar_t char_newline('\n');
-			static const wchar_t char_cr('\r');
-			static const wchar_t char_tab('\t');
-
-			std::wstring* source = value->getStringValue();
-			size_t length = source->length();
-			wchar_t* chars = (wchar_t*)source->c_str();
-
-			std::wstringstream stringStream;
-			stringStream << char_quote;
-			for (size_t i = 0; i < length; i++) {
-				switch (chars[i]) {
-					case char_quote:
-					case char_backslash:
-					case char_forwardslash: {
-						stringStream << char_backslash;
-						stringStream << chars[i];
-						break;
-					}
-					case char_backspace: {
-						stringStream << "\\b";
-						break;
-					}
-					case char_formfeed: {
-						stringStream << "\\f";
-						break;
-					}
-					case char_newline: {
-						stringStream << "\\n";
-						break;
-					}
-					case char_cr: {
-						stringStream << "\\r";
-						break;
-					}
-  					case char_tab: {
-						stringStream << "\\t";
-						break;
-					}
-					default: {
-						stringStream << chars[i];
-						break;
-					}
-				}
-			}
-			stringStream << char_quote;
-
-			std::wstring* result = new std::wstring;
-			result->assign(stringStream.str());
-			*_jsonString = result;
-			break;
-		}
-		case TYPE_ARRAY: {
-			Value** arrayValues = NULL;
-			value->getArrayValues(&arrayValues);
-			std::wstring* result = new std::wstring;
-			result->push_back(wchar_t('['));
-			int index = 0;
-			Value* currentValue = arrayValues[index];
-			while (currentValue) {
-				std::wstring* serializedValue = NULL;
-				stringify(currentValue, &serializedValue);
-				result->append(*serializedValue);
-				result->push_back(wchar_t(','));
-				delete serializedValue;
-				currentValue = arrayValues[++index];
-			}
-			delete[] arrayValues;
-
-			if (index > 0) {
-				result->erase(result->end() - 1);
-			}
-			result->push_back(wchar_t(']'));
-			*_jsonString = result;
-			break;
-		}
-		case TYPE_OBJECT: {
-			std::wstring** objectKeys = NULL;
-			Value** objectValues = NULL;
-			value->getObjectValues(&objectKeys, &objectValues);
-			std::wstring* result = new std::wstring;
-			result->push_back(wchar_t('{'));
-			int index = 0;
-			std::wstring* currentKey = objectKeys[index];
-			while (currentKey) {
-				result->push_back(wchar_t('\"'));
-				result->append(*currentKey);
-				result->push_back(wchar_t('\"'));
-				result->push_back(wchar_t(':'));
-				std::wstring* serializedValue = NULL;
-				stringify(objectValues[index], &serializedValue);
-				result->append(*serializedValue);
-				result->push_back(wchar_t(','));
-				delete serializedValue;
-				currentKey = objectKeys[++index];
-			}
-			delete[] objectValues;
-			delete[] objectKeys;
-
-			if (index > 0) {
-				result->erase(result->end() - 1);
-			}
-			result->push_back(wchar_t('}'));
-			*_jsonString = result;
-			break;
-		}
-		default: {
-			*_jsonString = NULL;
-			break;
-		}
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSONParser.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSONParser.h
deleted file mode 100644
index 8fc7509..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSONParser.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include <float.h>
-
-#include "Value.h"
-#include "Logger.h"
-
-class JSONParser {
-
-public:
-	JSONParser();
-	~JSONParser();
-	void parse(std::wstring* jsonString, Value** _value);
-	void stringify(Value* value, std::wstring** _jsonString);
-
-private:
-	void parse(std::wstringstream* jsonStream, Value** _value);
-	void parseArray(std::wstringstream* jsonStream, Value** _value);
-	double parseNumber(std::wstringstream* jsonStream);
-	void parseObject(std::wstringstream* jsonStream, Value** _value);
-	void parseString(std::wstringstream* jsonStream, std::wstring** _value);
-	void skipWhitespace(std::wstringstream* jsonStream);
-
-	/* constants */
-	static const wchar_t* VALUE_NULL;
-	static const wchar_t* VALUE_TRUE;
-	static const wchar_t* VALUE_FALSE;
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSObject.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSObject.cpp
deleted file mode 100644
index 4cd0736..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSObject.cpp
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
- 
-#include "StdAfx.h"
-#include "JSObject.h"
-
-JSObject::JSObject(std::wstring* name, unsigned int parentHandle) {
-	m_name = new std::wstring;
-	m_name->assign(*name);
-	m_objects = new std::map<std::wstring*, unsigned int>;
-	m_parentHandle = parentHandle;
-}
-
-JSObject::~JSObject() {
-	delete m_name;
-	delete m_objects;
-}
-
-std::wstring JSObject::getAccessor() {
-	return NULL;
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSObject.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSObject.h
deleted file mode 100644
index 235beb6..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSObject.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include <string>
-#include <map>
-
-class JSObject {
-
-public:
-	JSObject(std::wstring* name, unsigned int parentHandle);
-	~JSObject();
-	std::wstring getAccessor();
-
-private:
-	std::wstring* m_name;
-	std::map<std::wstring*, unsigned int>* m_objects;
-	unsigned int m_parentHandle;
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/Logger.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/Logger.cpp
deleted file mode 100644
index 7dc8c44..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/Logger.cpp
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "StdAfx.h"
-#include "Logger.h"
-
-/* initialize constants */
-const char* Logger::PREAMBLE_LOG = "LOG::";
-const char* Logger::PREAMBLE_ERROR = "ERROR::";
-
-Logger::Logger() {
-}
-
-Logger::~Logger() {
-}
-
-void Logger::error(char* message) {
-	int length = strlen(PREAMBLE_ERROR) + strlen(message) + 1;
-	char* sendString = new char[length];
-	strcpy_s(sendString, length, PREAMBLE_ERROR);
-	strcat_s(sendString, length, message);
-	send(sendString);
-	delete[] sendString;
-}
-
-void Logger::error(char* message, int errorCode) {
-	std::string result;
-	std::stringstream stringStream;
-	stringStream << message;
-	stringStream << ": ";
-	stringStream << errorCode;
-	result.assign(stringStream.str());
-	error((char *)result.c_str());
-}
-
-void Logger::log(char* message) {
-	int length = strlen(PREAMBLE_LOG) + strlen(message) + 1;
-	char* sendString = new char[length];
-	strcpy_s(sendString, length, PREAMBLE_LOG);
-	strcat_s(sendString, length, message);
-	send(sendString);
-	delete[] sendString;
-}
-
-void Logger::log(char* message, int code) {
-	std::string result;
-	std::stringstream stringStream;
-	stringStream << message;
-	stringStream << ": ";
-	stringStream << code;
-	result.assign(stringStream.str());
-	log((char *)result.c_str());
-}
-
-void Logger::log(wchar_t* message) {
-	size_t newSize = 0;
-	wcstombs_s(&newSize, NULL, 0, message, 0);
-    char* chars = new char[newSize];
-    wcstombs_s(&newSize, chars, newSize, message, newSize);
-	log(chars);
-	delete[] chars;
-}
-
-void Logger::log(std::wstring* message) {
-	log((wchar_t*)message->c_str());
-}
-
-void Logger::send(char* message) {
-	SOCKET sock;
-	struct sockaddr_in server_addr;
-	struct hostent *host;
-	host = (struct hostent *)gethostbyname((char *)"127.0.0.1");
-	if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
-		return;
-	}
-	server_addr.sin_family = AF_INET;
-	server_addr.sin_port = htons(54124 /* debug port */); // TODO
-	server_addr.sin_addr = *((struct in_addr *)host->h_addr);
-    sendto(sock, message, (int)strlen(message), 0, (struct sockaddr *)&server_addr, sizeof(sockaddr_in));
-	closesocket(sock);
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/Logger.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/Logger.h
deleted file mode 100644
index 3f593c3..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/Logger.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include <sstream>
-#include <winsock2.h>
-
-class Logger {
-public:
-	static void error(char* message);
-	static void error(char* message, int errorCode);
-	static void log(char* message);
-	static void log(char* message, int code);
-	static void log(wchar_t* message);
-	static void log(std::wstring* message);
-
-protected:
-	Logger();
-	~Logger();
-
-private:
-	static void send(char* message);
-
-	/* constants */
-	static const char* PREAMBLE_ERROR;
-	static const char* PREAMBLE_LOG;
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/PendingScriptLoad.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/PendingScriptLoad.cpp
deleted file mode 100644
index 4f6dae7..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/PendingScriptLoad.cpp
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "stdafx.h"
-#include "PendingScriptLoad.h"
-
-PendingScriptLoad::PendingScriptLoad() {
-	m_applicationNode = NULL;
-	m_context = NULL;
-	m_cookie = 0;
-}
-
-PendingScriptLoad::~PendingScriptLoad() {
-	detach();
-}
-
-IDebugApplicationNode* PendingScriptLoad::getApplicationNode() {
-	return m_applicationNode;
-}
-
-/* IDebugDocumentTextEvents */
-
-STDMETHODIMP PendingScriptLoad::onDestroy() {
-	return S_OK;
-}
-
-STDMETHODIMP PendingScriptLoad::onInsertText(ULONG cCharacterPosition, ULONG cNumToInsert) {
-	if (m_context) {
-		m_context->scriptLoaded(m_applicationNode, cNumToInsert != 0);
-	}
-
-	return S_OK;
-}
-
-STDMETHODIMP PendingScriptLoad::onRemoveText(ULONG cCharacterPosition, ULONG cNumToRemove) {
-	return S_OK;
-}
-
-STDMETHODIMP PendingScriptLoad::onReplaceText(ULONG cCharacterPosition, ULONG cNumToReplace) {
-	return S_OK;
-}
-
-STDMETHODIMP PendingScriptLoad::onUpdateTextAttributes(ULONG cCharacterPosition, ULONG cNumToUpdate) {
-	return S_OK;
-}
-
-STDMETHODIMP PendingScriptLoad::onUpdateDocumentAttributes(TEXT_DOC_ATTR textdocattr) {
-	return S_OK;
-}
-
-/* PendingScriptLoad */
-
-bool PendingScriptLoad::attach(IDebugApplicationNode* applicationNode, CrossfireContext* context) {
-	CComPtr<IDebugDocument> document = NULL;
-	HRESULT hr = applicationNode->GetDocument(&document);
-	if (FAILED(hr)) {
-		Logger::error("PendingScriptLoad.attach(): GetDocument() failed", hr);
-		return false;
-	}
-
-	CComPtr<IConnectionPointContainer> connectionPointContainer = NULL;
-	hr = document->QueryInterface(IID_IConnectionPointContainer, (void**)&connectionPointContainer);
-	if (FAILED(hr)) {
-		/*
-		 * It is expected that this will fail for nodes that represent code evaluations
-		 * (eg.- anonymous code, eval code, script blocks).
-		 */
-		if (hr != E_NOINTERFACE) {
-			Logger::error("PendingScriptLoad.attach(): QI(IConnectionPointContainer) failed", hr);
-		}
-		return false;
-	}
-
-	CComPtr<IConnectionPoint> connectionPoint = NULL;
-	hr = connectionPointContainer->FindConnectionPoint(IID_IDebugDocumentTextEvents, &connectionPoint);
-	if (FAILED(hr)) {
-		Logger::error("PendingScriptLoad.attach(): FindConnectionPoint() failed", hr);
-		return false;
-	}
-
-	hr = connectionPoint->Advise(static_cast<IPendingScriptLoad*>(this), &m_cookie);
-	if (FAILED(hr)) {
-		Logger::error("PendingScriptLoad.attach(): Advise() failed", hr);
-		return false;
-	}
-
-	applicationNode->AddRef();
-	m_applicationNode = applicationNode;
-	m_context = context;
-	return true;
-}
-
-bool PendingScriptLoad::detach() {
-	if (!m_cookie) {
-		return true;
-	}
-
-	CComPtr<IDebugDocument> document = NULL;
-	HRESULT hr = m_applicationNode->GetDocument(&document);
-	if (FAILED(hr)) {
-		/* The node is already destroyed, so nothing to unadvise on */
-	} else {
-		CComPtr<IConnectionPointContainer> connectionPointContainer = NULL;
-		hr = document->QueryInterface(IID_IConnectionPointContainer, (void**)&connectionPointContainer);
-		if (FAILED(hr)) {
-			Logger::error("PendingScriptLoad.detach(): QI(IID_IConnectionPointContainer) failed", hr);
-		} else {
-			CComPtr<IConnectionPoint> connectionPoint = NULL;
-			hr = connectionPointContainer->FindConnectionPoint(IID_IDebugDocumentTextEvents,&connectionPoint);
-			if (FAILED(hr)) {
-				Logger::error("PendingScriptLoad.detach(): FindConnectionPoint() failed", hr);
-			} else {
-				hr = connectionPoint->Unadvise(m_cookie);
-				if (FAILED(hr)) {
-					Logger::error("PendingScriptLoad.detach(): Unadvise() failed", hr);
-				}
-			}
-		}
-	}
-
-	if (m_applicationNode) {
-		m_applicationNode->Release();
-		m_applicationNode = NULL;
-	}
-	m_context = NULL;
-	m_cookie = 0;
-	return true;
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/PendingScriptLoad.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/PendingScriptLoad.h
deleted file mode 100644
index da32284..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/PendingScriptLoad.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include "resource.h"
-#include "activdbg.h"
-
-#include "CrossfireContext.h"
-
-class ATL_NO_VTABLE PendingScriptLoad :
-	public CComObjectRootEx<CComSingleThreadModel>,
-	public CComCoClass<PendingScriptLoad, &CLSID_PendingScriptLoad>,
-	public IDispatchImpl<IPendingScriptLoad, &IID_IPendingScriptLoad, &LIBID_IECrossfireServerLib, 1, 0>,
-	public IDebugDocumentTextEvents {
-
-public:
-	DECLARE_REGISTRY_RESOURCEID(IDR_PENDINGSCRIPTLOAD)
-	DECLARE_NOT_AGGREGATABLE(PendingScriptLoad)
-	BEGIN_COM_MAP(PendingScriptLoad)
-		COM_INTERFACE_ENTRY(IPendingScriptLoad)
-		COM_INTERFACE_ENTRY(IDispatch)
-		COM_INTERFACE_ENTRY(IDebugDocumentTextEvents)
-	END_COM_MAP()
-	DECLARE_PROTECT_FINAL_CONSTRUCT()
-
-	HRESULT FinalConstruct() {
-		return S_OK;
-	}
-
-	void FinalRelease() {
-	}
-
-public:
-	PendingScriptLoad();
-	virtual ~PendingScriptLoad();
-
-	IDebugApplicationNode* getApplicationNode();
-
-	/* IDebugDocumentTextEvents */
-	HRESULT STDMETHODCALLTYPE onDestroy();
-	HRESULT STDMETHODCALLTYPE onInsertText(
-		/* [in] */ ULONG cCharacterPosition,
-		/* [in] */ ULONG cNumToInsert);
-	HRESULT STDMETHODCALLTYPE onRemoveText(
-		/* [in] */ ULONG cCharacterPosition,
-		/* [in] */ ULONG cNumToRemove);
-	HRESULT STDMETHODCALLTYPE onReplaceText(
-		/* [in] */ ULONG cCharacterPosition,
-		/* [in] */ ULONG cNumToReplace);
-	HRESULT STDMETHODCALLTYPE onUpdateTextAttributes(
-		/* [in] */ ULONG cCharacterPosition,
-		/* [in] */ ULONG cNumToUpdate);
-	HRESULT STDMETHODCALLTYPE onUpdateDocumentAttributes(
-		/* [in] */ TEXT_DOC_ATTR textdocattr);
-
-	/* PendingScriptLoad */
-	bool attach(IDebugApplicationNode* applicationNode, CrossfireContext* context);
-	bool detach();
-
-private:
-	IDebugApplicationNode* m_applicationNode;
-	CrossfireContext* m_context;
-	DWORD m_cookie;
-};
-
-OBJECT_ENTRY_AUTO(__uuidof(PendingScriptLoad), PendingScriptLoad)
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/PendingScriptLoad.rgs b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/PendingScriptLoad.rgs
deleted file mode 100644
index faad433..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/PendingScriptLoad.rgs
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-HKCR {
-	IECrossfireServer.PendingScriptLoad.1 = s 'PendingScriptLoad Class' {
-		CLSID = s '{88E7C480-7B7A-47C5-8329-CE1FDF415527}'
-	}
-	IECrossfireServer.PendingScriptLoad = s 'PendingScriptLoad Class' {
-		CLSID = s '{88E7C480-7B7A-47C5-8329-CE1FDF415527}'
-		CurVer = s 'IECrossfireServer.PendingScriptLoad.1'
-	}
-	NoRemove CLSID {
-		ForceRemove {88E7C480-7B7A-47C5-8329-CE1FDF415527} = s 'PendingScriptLoad Class' {
-			ProgID = s 'IECrossfireServer.PendingScriptLoad.1'
-			VersionIndependentProgID = s 'IECrossfireServer.PendingScriptLoad'
-			ForceRemove 'Programmable'
-			LocalServer32 = s '%MODULE%'
-			val AppID = s '%APPID%'
-			'TypeLib' = s '{A8FFC284-CE2C-40B5-98D1-D3112811E9D9}'
-		}
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/URL.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/URL.cpp
deleted file mode 100644
index 08de997..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/URL.cpp
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "StdAfx.h"
-#include "URL.h"
-
-URL::URL() {
-	m_value = NULL;
-}
-
-URL::URL(wchar_t* urlString) {
-	m_value = NULL;
-	setString(urlString);
-}
-
-URL::~URL() {
-	if (m_value) {
-		delete[] m_value;
-	}
-}
-
-wchar_t* URL::getString() {
-	return m_value;
-}
-
-bool URL::isEqual(URL* url) {
-	if (!url) {
-		return false;
-	}
-	if (!isValid()) {
-		return !url->isValid();
-	}
-	if (!url->isValid()) {
-		return false;
-	}
-	return wcscmp(m_value, url->getString()) == 0;
-}
-
-bool URL::isEqual(wchar_t* urlString) {
-	if (!urlString) {
-		return !isValid();
-	}
-
-	std::wstring string(urlString);
-	if (!standardize(&string)) {
-		return false;
-	}
-
-	return wcscmp(m_value, string.c_str()) == 0;
-}
-
-bool URL::isValid() {
-	return m_value != NULL;
-}
-
-bool URL::setString(wchar_t* value) {
-	if (m_value) {
-		delete[] m_value;
-		m_value = NULL;
-	}
-
-	if (value) {
-		std::wstring string(value);
-		if (!standardize(&string)) {
-			return false;
-		}
-		m_value = _wcsdup(string.c_str());
-	}
-	return true;
-}
-
-bool URL::standardize(std::wstring* url) {
-	size_t startIndex = url->find(L":/");
-	if (startIndex == std::wstring::npos) {
-		return false;
-	}
-
-	size_t endIndex = ++startIndex;
-	wchar_t current = url->at(++endIndex);
-	while (current == wchar_t('/')) {
-		current = url->at(++endIndex);
-	}
-
-	size_t diff = endIndex - startIndex;
-	if (diff == 1) {
-		url->insert(startIndex, 1, wchar_t('/'));
-	} else if (diff > 2) {
-		url->erase(startIndex, diff - 2);
-	}
-
-	return true;
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/URL.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/URL.h
deleted file mode 100644
index e4890a4..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/URL.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include <string>
-
-class URL {
-
-public:
-	URL();
-	URL(wchar_t* value);
-	~URL();
-	wchar_t* getString();
-	bool isEqual(wchar_t* urlString);
-	bool isEqual(URL* url);
-	bool isValid();
-	bool setString(wchar_t* value);
-
-private:
-	bool standardize(std::wstring* url);
-
-	wchar_t* m_value;
-};
-
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/Value.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/Value.cpp
deleted file mode 100644
index c4d18c8..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/Value.cpp
+++ /dev/null
@@ -1,405 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "stdafx.h"
-#include "Value.h"
-
-Value::Value() {
-	m_type = TYPE_UNDEFINED;
-	m_arrayValue = NULL;
-	m_numberValue = 0;
-	m_objectValue = NULL;
-	m_stringValue = NULL;
-}
-
-Value::Value(bool value) {
-	setValue(value);
-}
-
-Value::Value(double value) {
-	setValue(value);
-}
-
-Value::Value(const wchar_t* value) {
-	setValue(value);
-}
-
-Value::Value(std::wstring* value) {
-	setValue(value);
-}
-
-Value::~Value() {
-	clearCurrentValue();
-}
-
-void Value::clearCurrentValue() {
-	switch (m_type) {
-		case TYPE_STRING: {
-			delete m_stringValue;
-			break;
-		}
-		case TYPE_ARRAY: {
-			std::vector<Value*>::iterator iterator = m_arrayValue->begin();
-			std::vector<Value*>::iterator end = m_arrayValue->end();
-			while (iterator != end) {
-				delete *iterator;
-				iterator++;
-			}
-			delete m_arrayValue;
-			break;
-		}
-		case TYPE_OBJECT: {
-			std::map<std::wstring, Value*>::iterator it = m_objectValue->begin();
-			std::map<std::wstring, Value*>::iterator end = m_objectValue->end();
-			while (it != end) {
-				delete (*it).second;
-				it++;
-			}
-			delete m_objectValue;
-			break;
-		}
-	}
-	m_type = TYPE_UNDEFINED;
-}
-
-void Value::clone(Value** _value) {
-	switch (getType()) {
-		case TYPE_NULL: {
-			Value* result = new Value();
-			result->setType(TYPE_NULL);
-			*_value = result;
-			break;
-		}
-		case TYPE_BOOLEAN: {
-			Value* result = new Value();
-			result->setValue(getBooleanValue());
-			*_value = result;
-			break;
-		}
-		case TYPE_NUMBER: {
-			Value* result = new Value();
-			result->setValue(getNumberValue());
-			*_value = result;
-			break;
-		}
-		case TYPE_STRING: {
-			Value* result = new Value();
-			result->setValue(getStringValue());
-			*_value = result;
-			break;
-		}
-		case TYPE_ARRAY: {
-			Value** values = NULL;
-			getArrayValues(&values);
-			Value* result = new Value();
-			result->setType(TYPE_ARRAY);
-			int index = 0;
-			while (values[index]) {
-				result->addArrayValue(values[index++]);
-			}
-			delete[] values;
-
-			*_value = result;
-			break;
-		}
-		case TYPE_OBJECT: {
-			std::wstring** keys = NULL;
-			Value** values = NULL;
-			getObjectValues(&keys, &values);
-			Value* result = new Value();
-			result->setType(TYPE_OBJECT);
-			int index = 0;
-			while (keys[index]) {
-				std::wstring keyCopy(*keys[index]);
-				result->addObjectValue(&keyCopy, values[index++]);
-			}
-			delete[] values;
-			delete[] keys;
-
-			*_value = result;
-			break;
-
-		}
-		// TYPE_UNDEFINED
-		default: {
-			*_value = NULL;
-			break;
-		}
-	}
-}
-
-void Value::addArrayValue(Value *value) {
-	setType(TYPE_ARRAY);
-	Value* result = NULL;
-	value->clone(&result);
-	m_arrayValue->push_back(result);
-}
-
-bool Value::addObjectValue(const wchar_t* key, Value* value) {
-	return addObjectValue(&std::wstring(key), value);
-}
-
-bool Value::addObjectValue(std::wstring* key, Value* value) {
-	return setObjectValue(key, value, false);
-}
-
-//bool Value::clearObjectValue(const wchar_t* key) {
-//	return clearObjectValue(&std::wstring(key));
-//}
-
-//bool Value::clearObjectValue(std::wstring* key) {
-//	if (m_type != TYPE_OBJECT) {
-//		return false;
-//	}
-//
-//	std::map<std::wstring, Value*>::iterator iterator = m_objectValue->find(*key);
-//	if (iterator == m_objectValue->end()) {
-//		/* not found */
-//		return false;
-//	}
-//	delete (*iterator).second;
-//	m_objectValue->erase(iterator);
-//	return true;
-//}
-
-bool Value::equals(Value* value) {
-	if (!value || value->getType() != m_type) {
-		return false;
-	}
-
-	switch (m_type) {
-		case TYPE_UNDEFINED:
-		case TYPE_NULL: {
-			return true;
-		}
-		case TYPE_BOOLEAN: {
-			return value->getBooleanValue() == getBooleanValue();
-		}
-		case TYPE_NUMBER: {
-			return value->getNumberValue() == getNumberValue();
-		}
-		case TYPE_STRING: {
-			return value->getStringValue()->compare(*getStringValue()) == 0;
-		}
-		case TYPE_ARRAY: {
-			Value** selfItems = NULL;
-			getArrayValues(&selfItems);
-			Value** valueItems = NULL;
-			value->getArrayValues(&valueItems);
-			bool isEqual = true;
-			int index = 0;
-			while (selfItems[index]) {
-				if (!selfItems[index]->equals(valueItems[index])) {
-					isEqual = false;
-					break;
-				}
-				index++;
-			}
-			if (isEqual) {
-				isEqual = valueItems[index] == NULL;
-			}
-			delete[] valueItems;
-			delete[] selfItems;
-			return isEqual;
-		}
-		case TYPE_OBJECT: {
-			std::wstring** selfKeys = NULL;
-			Value** selfValues = NULL;
-			getObjectValues(&selfKeys, &selfValues);
-			bool isEqual = true;
-			int index = 0;
-			while (selfKeys[index]) {
-				Value* valueValue = value->getObjectValue(selfKeys[index]);
-				if (!valueValue || !selfValues[index]->equals(valueValue)) {
-					isEqual = false;
-					break;
-				}
-				index++;
-			}
-			delete[] selfKeys;
-			delete[] selfValues;
-			if (isEqual) {
-				/* ensure that value does not contain extra keys/values */
-				std::wstring** valueKeys = NULL;
-				Value** valueValues = NULL;
-				value->getObjectValues(&valueKeys, &valueValues);
-				int length = 0;
-				while (valueKeys[length++]);
-				isEqual = length == index;
-				delete[] valueKeys;
-				delete[] valueValues;
-			}
-			return isEqual;
-		}
-	}
-
-	return false;	/* should never happen */
-}
-
-void Value::getArrayValues(Value*** __values) {
-	if (m_type != TYPE_ARRAY) {
-		*__values = NULL;
-		return;
-	}
-	size_t size = m_arrayValue->size();
-	Value** result = new Value*[size + 1];
-	for (int i = 0; i < (int)size; i++) {
-		result[i] = m_arrayValue->at(i);
-	}
-	result[size] = NULL;
-	*__values = result;
-}
-
-bool Value::getBooleanValue() {
-	if (m_type != TYPE_BOOLEAN) {
-		return false;
-	}
-	return m_numberValue != 0;
-}
-
-double Value::getNumberValue() {
-	if (m_type != TYPE_NUMBER) {
-		return 0;
-	}
-	return m_numberValue;
-}
-
-Value* Value::getObjectValue(const wchar_t* key) {
-	return getObjectValue(&std::wstring(key));
-}
-
-Value* Value::getObjectValue(std::wstring* key) {
-	if (m_type != TYPE_OBJECT) {
-		return NULL;
-	}
-
-	std::map<std::wstring, Value*>::iterator result = m_objectValue->find(*key);
-	if (result == m_objectValue->end()) {
-		/* not found */
-		return NULL;
-	}
-	return result->second;
-}
-
-void Value::getObjectValues(std::wstring*** __keys, Value*** __values) {
-	if (m_type != TYPE_OBJECT) {
-		*__keys = NULL;
-		*__values = NULL;
-		return;
-	}
-	size_t size = m_objectValue->size();
-	std::wstring** keysResult = new std::wstring*[size + 1];
-	Value** valuesResult = new Value*[size + 1];
-
-	std::map<std::wstring, Value*>::iterator it = m_objectValue->begin();
-	std::map<std::wstring, Value*>::iterator end = m_objectValue->end();
-	int index = 0;
-	while (it != end) {
-		keysResult[index] = (std::wstring*)&(*it).first;
-		valuesResult[index++] = (*it).second;
-		it++;
-	}
-	keysResult[index] = NULL;
-	valuesResult[index] = NULL;
-
-	*__keys = keysResult;
-	*__values = valuesResult;
-}
-
-bool Value::setObjectValue(const wchar_t* key, Value* value) {
-	return setObjectValue(&std::wstring(key), value);
-}
-
-bool Value::setObjectValue(std::wstring* key, Value* value) {
-	return setObjectValue(key, value, true);
-}
-
-bool Value::setObjectValue(std::wstring* key, Value* value, bool overwrite) {
-	setType(TYPE_OBJECT);
-	std::map<std::wstring, Value*>::iterator it = m_objectValue->find(*key);
-	if (it != m_objectValue->end()) {
-		/* value with this key already exists in map */
-		if (!overwrite) {
-			return false;
-		}
-		delete (*it).second;
-		m_objectValue->erase(it);
-	}
-	Value* result = NULL;
-	value->clone(&result);
-	m_objectValue->insert(std::pair<std::wstring,Value*>(*key, result));
-	return true;
-}
-
-std::wstring* Value::getStringValue() {
-	if (m_type != TYPE_STRING) {
-		return NULL;
-	}
-	return m_stringValue;
-}
-
-int Value::getType() {
-	return m_type;
-}
-
-void Value::setValue(bool value) {
-	setType(TYPE_BOOLEAN);
-	if (value) {
-		m_numberValue = 1;
-	} else {
-		m_numberValue = 0;
-	}
-}
-
-void Value::setValue(double value) {
-	setType(TYPE_NUMBER);
-	m_numberValue = value;
-}
-
-void Value::setValue(const wchar_t* value) {
-	setType(TYPE_STRING);
-	m_stringValue = new std::wstring;
-	m_stringValue->assign(value);
-}
-
-void Value::setValue(std::wstring* value) {
-	setType(TYPE_STRING);
-	m_stringValue = new std::wstring;
-	m_stringValue->assign(*value);
-}
-
-void Value::setType(int value) {
-	if (m_type == value) {
-		/* nothing to do */
-		return;
-	}
-
-	clearCurrentValue();
-
-	if (value > TYPE_OBJECT) {
-		/* invalid value */
-		m_type = TYPE_UNDEFINED;
-		return;
-	}
-
-	m_type = value;
-	switch (m_type) {
-		case TYPE_ARRAY: {
-			m_arrayValue = new std::vector<Value*>;
-			break;
-		}
-		case TYPE_OBJECT: {
-			m_objectValue = new std::map<std::wstring, Value*>;
-			break;
-		}
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/Value.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/Value.h
deleted file mode 100644
index 7c77e31..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/Value.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include <iostream>
-#include <map>
-#include <sstream>
-#include <vector>
-
-enum {
-	TYPE_UNDEFINED = 0x0,
-	TYPE_NULL = 0x1,
-	TYPE_BOOLEAN = 0x2,
-	TYPE_NUMBER = 0x4,
-	TYPE_STRING = 0x8,
-	TYPE_ARRAY = 0x10,
-	TYPE_OBJECT = 0x20,
-};
-
-class Value {
-
-public:
-	Value();
-	Value(bool value);
-	Value(double value);
-	Value(const wchar_t* value);
-	Value(std::wstring* value);
-	~Value();
-	void addArrayValue(Value* value);
-	bool addObjectValue(const wchar_t* key, Value* value);
-	bool addObjectValue(std::wstring* key, Value* value);
-//	bool clearObjectValue(const wchar_t* key);
-//	bool clearObjectValue(std::wstring* key);
-	void clone(Value** _value);
-	bool equals(Value* value);
-	void getArrayValues(Value*** __values);
-	bool getBooleanValue();
-	double getNumberValue();
-	Value* getObjectValue(const wchar_t* key);
-	Value* getObjectValue(std::wstring* key);
-	void getObjectValues(std::wstring*** __keys, Value*** __values);
-	std::wstring* getStringValue();
-	int getType();
-	bool setObjectValue(const wchar_t* key, Value* value);
-	bool setObjectValue(std::wstring* key, Value* value);
-	void setType(int type);
-	void setValue(bool value);
-	void setValue(double value);
-	void setValue(const wchar_t* value);
-	void setValue(std::wstring* value);
-
-private:
-	void clearCurrentValue();
-	bool setObjectValue(std::wstring* key, Value* value, bool overwrite);
-
-	std::vector<Value*>* m_arrayValue;
-	double m_numberValue;
-	std::map<std::wstring, Value*>* m_objectValue;
-	std::wstring* m_stringValue;
-	int m_type;
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/WindowsSocketConnection.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/WindowsSocketConnection.cpp
deleted file mode 100644
index f594f0b..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/WindowsSocketConnection.cpp
+++ /dev/null
@@ -1,251 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#include "stdafx.h"
-#include "WindowsSocketConnection.h"
-
-/* initialize statics */
-std::map<HWND, WindowsSocketConnection*>* WindowsSocketConnection::s_connections = new std::map<HWND, WindowsSocketConnection*>; /* leaked */
-
-WindowsSocketConnection::WindowsSocketConnection(CrossfireServer* server) {
-	m_clientSocket = INVALID_SOCKET;
-	m_server = server;
-	m_hWnd = NULL;
-	m_listenSocket = INVALID_SOCKET;	
-}
-
-WindowsSocketConnection::~WindowsSocketConnection() {
-}
-
-bool WindowsSocketConnection::acceptConnection() {
-	int rc = WSAAsyncSelect(m_listenSocket, m_hWnd, EW_SOCKET_MSG, FD_ACCEPT);
-	if (rc != 0) {
-		Logger::error("WindowsSocketConnection.acceptConnection(): WSAAsyncSelect() failed", rc);
-		return false;
-	}
-	return true;
-}
-
-bool WindowsSocketConnection::close() {
-	deregisterConnection(m_hWnd);
-	closesocket(m_clientSocket);
-	closesocket(m_listenSocket);
-	m_clientSocket = m_listenSocket = INVALID_SOCKET;
-	return true;
-}
-
-void WindowsSocketConnection::handleSocketAccept() {
-	m_clientSocket = accept(m_listenSocket, NULL, NULL);
-	if (m_clientSocket == INVALID_SOCKET) {
-		Logger::error("WindowsSocketConnection.handleSocketAccept(): accept() failed", WSAGetLastError());
-		return;
-	}
-
-	int rc = WSAAsyncSelect(m_clientSocket, m_hWnd, EW_SOCKET_MSG, FD_READ | FD_CLOSE);
-	if (rc == SOCKET_ERROR) {
-		closesocket(m_clientSocket);
-		m_clientSocket = INVALID_SOCKET;
-		Logger::error("WindowsSocketConnection.handleSocketAccept(): WSAAsyncSelect() failed", WSAGetLastError());
-		return;
-	}
-
-	/* remove the listenSocket listener */
-	WSAAsyncSelect(m_listenSocket, m_hWnd, EW_SOCKET_MSG, 0);
-
-	m_server->connected();
-}
-
-void WindowsSocketConnection::handleSocketClose() {
-	m_server->disconnected();
-}
-
-void WindowsSocketConnection::handleSocketRead() {
-	const int LENGTH_BUFFER = 4096;
-	char buffer[LENGTH_BUFFER];
-	ZeroMemory(buffer, LENGTH_BUFFER);
-
-	int length = recv(m_clientSocket, buffer, LENGTH_BUFFER, 0);
-	if (length == SOCKET_ERROR) {
-		Logger::error("WindowsSocketConnection.handleSocketRead(): recv() failed", errno);
-		return;
-	}
-	if (length == 0) {
-		/* connection closed */
-		Logger::log("WindowsSocketConnection.handleSocketRead(): recv() length 0, implies socket closed");
-		PostQuitMessage(0);
-		return;
-	}
-
-	length = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)buffer, -1, NULL, 0);
-	wchar_t* content = new wchar_t[length];
-	MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)buffer, -1, content, length);
-//Logger::log("-----\nReceived:");
-//Logger::log(content);
-	m_server->received(content);
-	delete[] content;
-}
-
-bool WindowsSocketConnection::init(unsigned int port) {
-	WSADATA wsaData;
-	int rc = WSAStartup(MAKEWORD(2,2), &wsaData);
-	if (rc != 0) {
-		Logger::error("WindowsSocketConnection.init(): WSAStartup() failed", rc);
-		return false;
-	}
-
-	char portString[6];
-	ZeroMemory(portString, 6);
-	_ltoa_s(port, portString, 6, 10);
-	struct addrinfo hints;
-	ZeroMemory(&hints, sizeof(hints));
-	hints.ai_flags = AI_PASSIVE;
-	hints.ai_family = AF_INET;
-	hints.ai_socktype = SOCK_STREAM;
-	hints.ai_protocol = IPPROTO_TCP;
-	struct addrinfo* result = NULL;
-	rc = getaddrinfo(NULL, portString, &hints, &result);
-	if (rc != 0) {
-		WSACleanup();
-		Logger::error("WindowsSocketConnection.init(): getaddrinfo() failed", rc);
-		return false;
-	}
-
-	m_listenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
-	if (m_listenSocket == INVALID_SOCKET) {
-		freeaddrinfo(result);
-		WSACleanup();
-		Logger::error("WindowsSocketConnection.init(): socket() failed", WSAGetLastError());
-		return false;
-	}
-
-	if (bind(m_listenSocket, result->ai_addr, (int)result->ai_addrlen) == SOCKET_ERROR) {
-		closesocket(m_listenSocket);
-		m_listenSocket = INVALID_SOCKET;
-		freeaddrinfo(result);
-		WSACleanup();
-		Logger::error("WindowsSocketConnection.init(): bind() failed", WSAGetLastError());
-		return false;
-	}
-
-	rc = listen(m_listenSocket, SOMAXCONN); 
-	freeaddrinfo(result);
-	if (rc == SOCKET_ERROR) {
-		closesocket(m_listenSocket);
-		m_listenSocket = INVALID_SOCKET;
-		WSACleanup();
-		Logger::error("WindowsSocketConnection.init(): listen() failed", WSAGetLastError());
-		return false;
-	}
-
-	std::wstringstream stream;
-	stream << "Listening for a connection on localhost:";
-	stream << portString;
-	Logger::log((wchar_t*)stream.str().c_str());
-
-	static LPCWSTR s_windowClass = _T("CrossfireSocketConnection"); // TODO differentiate by port?
-	HINSTANCE module = GetModuleHandle(NULL);
-	WNDCLASS ex;
-	ex.style = 0;
-	ex.lpfnWndProc = WndProc;
-	ex.cbClsExtra = 0;
-	ex.cbWndExtra = 0;
-	ex.hInstance = module;
-	ex.hIcon = NULL;
-	ex.hCursor = NULL;
-	ex.hbrBackground = NULL;
-	ex.lpszMenuName = NULL;
-	ex.lpszClassName = s_windowClass;
-	RegisterClass(&ex);
-	m_hWnd = CreateWindow(s_windowClass, NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, module, NULL);
-	if (!m_hWnd) {
-		Logger::error("WindowsSocketConnection.init(): CreateWindow() failed", GetLastError());
-		return false;
-	}
-	WindowsSocketConnection::registerConnection(m_hWnd, this);
-	return true;
-}
-
-bool WindowsSocketConnection::isConnected() {
-	return m_clientSocket != INVALID_SOCKET;
-}
-
-bool WindowsSocketConnection::send(const wchar_t* msg) {
-//Logger::log("-----\nSent:");
-//Logger::log((wchar_t*)msg);
-	int length = WideCharToMultiByte(CP_UTF8, 0, msg, -1, NULL, 0, NULL, NULL);
-	char* content = new char[length];
-	WideCharToMultiByte(CP_UTF8, 0, msg, -1, content, length, NULL, NULL);
-	if (::send(m_clientSocket, content, length - 1, 0) == SOCKET_ERROR) { /* uses length - 1 to not send null terminator */
-		Logger::error("WindowsSocketConnection.send(): send() failed", errno);
-		return false;
-	}
-	return true;
-}
-
-bool WindowsSocketConnection::deregisterConnection(HWND hWnd) {
-	std::map<HWND, WindowsSocketConnection*>::iterator iterator = s_connections->find(hWnd);
-	if (iterator != s_connections->end()) {
-		s_connections->erase(iterator);
-		return true;
-	}
-
-	/* not found */
-	return false;
-}
-
-WindowsSocketConnection* WindowsSocketConnection::getConnection(HWND hWnd) {
-	std::map<HWND, WindowsSocketConnection*>::iterator iterator = s_connections->find(hWnd);
-	if (iterator == s_connections->end()) {
-		/* not found */
-		return NULL;
-	}
-	return iterator->second;
-}
-
-void WindowsSocketConnection::registerConnection(HWND hWnd, WindowsSocketConnection* connection) {
-	s_connections->insert(std::pair<HWND,WindowsSocketConnection*>(hWnd, connection));
-}
-
-LRESULT CALLBACK WindowsSocketConnection::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
-	switch (message) {
-		case EW_SOCKET_MSG: {
-			WindowsSocketConnection* instance = WindowsSocketConnection::getConnection(hWnd);
-			if (!instance) {
-				Logger::error("WindowsSocketConnection:WndProc(): received EW_SOCKET_MSG for unregistered hWnd");
-				break;
-			}
-			switch (WSAGETSELECTEVENT(lParam)) {
-				case FD_READ: {
-					instance->handleSocketRead();
-					break;
-				}
-				case FD_ACCEPT: {
-					instance->handleSocketAccept();
-					break;
-				}
-				case FD_CLOSE: {
-					instance->handleSocketClose();
-					break;
-				}
-				default: {
-					Logger::error("WindowsSocketConnection:WndProc(): received EW_SOCKET_MSG for unexpected event");
-					break;
-				}
-			}
-			break;
-		}
-		default: {
-			return DefWindowProc(hWnd, message, wParam, lParam);
-		}
-	}
-	return 0;
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/WindowsSocketConnection.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/WindowsSocketConnection.h
deleted file mode 100644
index 41763ee..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/WindowsSocketConnection.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-#pragma once
-
-#include <iostream>
-#include <winsock2.h>
-#include <ws2tcpip.h>
-
-#include "Logger.h"
-
-class WindowsSocketConnection; // forward declaration
-#include "CrossfireServer.h"
-
-class WindowsSocketConnection {
-
-public:
-	WindowsSocketConnection(CrossfireServer* server);
-	~WindowsSocketConnection();
-	bool acceptConnection();
-	bool close();
-	bool init(unsigned int port);
-	bool isConnected();
-	bool send(const wchar_t* msg);
-
-private:
-	void handleSocketAccept();
-	void handleSocketClose();
-	void handleSocketRead();
-
-	SOCKET m_clientSocket;
-	CrossfireServer* m_server;
-	HWND m_hWnd;
-	SOCKET m_listenSocket;
-
-	static bool deregisterConnection(HWND hWnd);
-	static WindowsSocketConnection* getConnection(HWND hWnd);
-	static void registerConnection(HWND hWnd, WindowsSocketConnection* connection);
-	static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
-
-	static std::map<HWND, WindowsSocketConnection*>* s_connections;
-
-	/* constants */
-	static const int EW_SOCKET_MSG = WM_APP + 1;
-};
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/dlldata.c b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/dlldata.c
deleted file mode 100644
index b254688..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/dlldata.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/*********************************************************
-   DllData file -- generated by MIDL compiler 
-
-        DO NOT ALTER THIS FILE
-
-   This file is regenerated by MIDL on every IDL file compile.
-
-   To completely reconstruct this file, delete it and rerun MIDL
-   on all the IDL files in this DLL, specifying this file for the
-   /dlldata command line option
-
-*********************************************************/
-
-#define PROXY_DELEGATION
-
-#include <rpcproxy.h>
-
-#ifdef __cplusplus
-extern "C"   {
-#endif
-
-EXTERN_PROXY_FILE( IECrossfireServer )
-
-
-PROXYFILE_LIST_START
-/* Start of list */
-  REFERENCE_PROXY_FILE( IECrossfireServer ),
-/* End of list */
-PROXYFILE_LIST_END
-
-
-DLLDATA_ROUTINES( aProxyFileList, GET_DLL_CLSID )
-
-#ifdef __cplusplus
-}  /*extern "C" */
-#endif
-
-/* end of generated dlldata file */
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/resource.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/resource.h
deleted file mode 100644
index 651d1eb..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/resource.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-//{{NO_DEPENDENCIES}}
-// Microsoft Visual C++ generated include file.
-// Used by IECrossfireServer.rc
-//
-#define IDS_PROJNAME                    100
-#define IDR_IECrossfireServer           101
-#define IDR_JSEVALCALLBACK              102
-#define IDR_CROSSFIRESERVER             103
-#define IDR_IEDEBUGGER                  104
-#define IDR_CROSSFIRESERVERCLASS        111
-#define IDR_PENDINGSCRIPTLOAD           113
-#define IDR_BROWSERCONTEXT     114
-
-// Next default values for new objects
-// 
-#ifdef APSTUDIO_INVOKED
-#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE        201
-#define _APS_NEXT_COMMAND_VALUE         32768
-#define _APS_NEXT_CONTROL_VALUE         201
-#define _APS_NEXT_SYMED_VALUE           115
-#endif
-#endif
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/stdafx.cpp b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/stdafx.cpp
deleted file mode 100644
index 33b7099..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/stdafx.cpp
+++ /dev/null
@@ -1,17 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-// stdafx.cpp : source file that includes just the standard includes
-// IECrossfireServer.pch will be the pre-compiled header
-// stdafx.obj will contain the pre-compiled type information
-
-#include "stdafx.h"
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/stdafx.h b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/stdafx.h
deleted file mode 100644
index bfd1557..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/stdafx.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-// stdafx.h : include file for standard system include files,
-// or project specific include files that are used frequently,
-// but are changed infrequently
-
-#pragma once
-
-#ifndef STRICT
-#define STRICT
-#endif
-
-// Modify the following defines if you have to target a platform prior to the ones specified below.
-// Refer to MSDN for the latest info on corresponding values for different platforms.
-#ifndef WINVER				// Allow use of features specific to Windows XP or later.
-#define WINVER 0x0501		// Change this to the appropriate value to target other versions of Windows.
-#endif
-
-#ifndef _WIN32_WINNT		// Allow use of features specific to Windows XP or later.                   
-#define _WIN32_WINNT 0x0501	// Change this to the appropriate value to target other versions of Windows.
-#endif						
-
-#ifndef _WIN32_WINDOWS		// Allow use of features specific to Windows 98 or later.
-#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
-#endif
-
-#ifndef _WIN32_IE			// Allow use of features specific to IE 6.0 or later.
-#define _WIN32_IE 0x0600	// Change this to the appropriate value to target other versions of IE.
-#endif
-
-#define _ATL_APARTMENT_THREADED
-#define _ATL_NO_AUTOMATIC_NAMESPACE
-
-#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS	// some CString constructors will be explicit
-
-
-#include "resource.h"
-#include <atlbase.h>
-#include <atlcom.h>
-
-using namespace ATL;
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.node/.classpath b/development/org.eclipse.wst.jsdt.debug.node/.classpath
deleted file mode 100644
index 2fbb7a2..0000000
--- a/development/org.eclipse.wst.jsdt.debug.node/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/development/org.eclipse.wst.jsdt.debug.node/.project b/development/org.eclipse.wst.jsdt.debug.node/.project
deleted file mode 100644
index 285cee8..0000000
--- a/development/org.eclipse.wst.jsdt.debug.node/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.jsdt.debug.node</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/development/org.eclipse.wst.jsdt.debug.node/.settings/org.eclipse.jdt.core.prefs b/development/org.eclipse.wst.jsdt.debug.node/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index de9eac3..0000000
--- a/development/org.eclipse.wst.jsdt.debug.node/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,90 +0,0 @@
-#Fri Apr 30 10:04:28 CDT 2010
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
-org.eclipse.jdt.core.compiler.problem.deadCode=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=error
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=error
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=error
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=error
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
diff --git a/development/org.eclipse.wst.jsdt.debug.node/META-INF/MANIFEST.MF b/development/org.eclipse.wst.jsdt.debug.node/META-INF/MANIFEST.MF
deleted file mode 100644
index a80a3ab..0000000
--- a/development/org.eclipse.wst.jsdt.debug.node/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,11 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Bundle-Name
-Bundle-SymbolicName: org.eclipse.wst.jsdt.debug.node;singleton:=true
-Bundle-Version: 1.0.0.qualifier
-Bundle-Activator: org.eclipse.wst.jsdt.debug.node.NodePlugin
-Bundle-Vendor: %Bundle-Vendor
-Require-Bundle: org.eclipse.core.runtime
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.wst.jsdt.debug.node
diff --git a/development/org.eclipse.wst.jsdt.debug.node/OSGI-INF/l10n/bundle.properties b/development/org.eclipse.wst.jsdt.debug.node/OSGI-INF/l10n/bundle.properties
deleted file mode 100644
index d7cefac..0000000
--- a/development/org.eclipse.wst.jsdt.debug.node/OSGI-INF/l10n/bundle.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2011 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-#Properties file for org.eclipse.wst.jsdt.debug.node
-Bundle-Vendor = Eclipse Web Tools Platform
-Bundle-Name = Node JavaScript Debug
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.node/build.properties b/development/org.eclipse.wst.jsdt.debug.node/build.properties
deleted file mode 100644
index 27bd3a1..0000000
--- a/development/org.eclipse.wst.jsdt.debug.node/build.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2011 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               OSGI-INF/l10n/bundle.properties,\
-               OSGI-INF/
diff --git a/development/org.eclipse.wst.jsdt.debug.node/src/org/eclipse/wst/jsdt/debug/node/NodePlugin.java b/development/org.eclipse.wst.jsdt.debug.node/src/org/eclipse/wst/jsdt/debug/node/NodePlugin.java
deleted file mode 100644
index 86ad724..0000000
--- a/development/org.eclipse.wst.jsdt.debug.node/src/org/eclipse/wst/jsdt/debug/node/NodePlugin.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.node;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.core.runtime.Status;
-import org.osgi.framework.BundleContext;
-
-/**
- * @since 1.0
- */
-public class NodePlugin extends Plugin {
-
-	public static final String PLUGIN_ID = "org.eclipse.wst.jsdt.debug.node"; //$NON-NLS-1$
-	/**
-	 * Status code indicating an unexpected internal error.
-	 */
-	public static final int INTERNAL_ERROR = 120;
-	
-	static NodePlugin plugin = null;
-
-	/**
-	 * Returns the singleton instance of {@link NodePlugin} or <code>null</code> if the bundle has not been started 
-	 * yet.
-	 * 
-	 * @return the instance of {@link NodePlugin} or <code>null</code>
-	 */
-	public static NodePlugin getDefault() {
-		return plugin;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext bundleContext) throws Exception {
-		super.start(bundleContext);
-		plugin = this;
-		configureTracing();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext bundleContext) throws Exception {
-		plugin = null;
-	}
-
-	/**
-	 * Logs the specified status with this plug-in's log.
-	 * 
-	 * @param status status to log
-	 */
-	public static void log(IStatus status) {
-		if (plugin != null) {
-			plugin.getLog().log(status);
-		}
-	}
-
-	/**
-	 * Logs the specified throwable with this plug-in's log.
-	 * 
-	 * @param t throwable to log 
-	 */
-	public static void log(Throwable t) {
-		log(newErrorStatus("Error logged from Node Debug: ", t)); //$NON-NLS-1$
-	}
-	
-	/**
-	 * Logs an internal error with the specified message.
-	 * 
-	 * @param message the error message to log
-	 */
-	public static void logErrorMessage(String message) {
-		log(newErrorStatus("Internal message logged from Node Debug: " + message, null)); //$NON-NLS-1$	
-	}
-	
-	/**
-	 * Returns a new error status for this plug-in with the given message
-	 * @param message the message to be included in the status
-	 * @param exception the exception to be included in the status or <code>null</code> if none
-	 * @return a new error status
-	 */
-	public static IStatus newErrorStatus(String message, Throwable exception) {
-		return new Status(IStatus.ERROR, PLUGIN_ID, INTERNAL_ERROR, message, exception);
-	}
-
-	/**
-	 * Turns on / off any tracing options
-	 */
-	public void configureTracing() {
-		
-	}
-}
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/.classpath b/development/org.eclipse.wst.jsdt.debug.opera/.classpath
deleted file mode 100644
index 50457c8..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/scope-sdk"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/.project b/development/org.eclipse.wst.jsdt.debug.opera/.project
deleted file mode 100644
index fc9fa50..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.jsdt.debug.opera</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/.settings/org.eclipse.jdt.core.prefs b/development/org.eclipse.wst.jsdt.debug.opera/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index de9eac3..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,90 +0,0 @@
-#Fri Apr 30 10:04:28 CDT 2010
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
-org.eclipse.jdt.core.compiler.problem.deadCode=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=error
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=error
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=error
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=error
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/META-INF/MANIFEST.MF b/development/org.eclipse.wst.jsdt.debug.opera/META-INF/MANIFEST.MF
deleted file mode 100644
index c819bc4..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,16 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: JSDT Opera Support
-Bundle-SymbolicName: org.eclipse.wst.jsdt.debug.opera;singleton:=true
-Bundle-Version: 0.1.0.qualifier
-Bundle-Activator: org.eclipse.wst.jsdt.debug.opera.OperaPlugin
-Bundle-Vendor: Eclipse.org
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.wst.jsdt.debug.core;bundle-version="2.0.100",
- org.eclipse.debug.core;bundle-version="3.7.0"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.wst.jsdt.debug.opera;uses:="org.osgi.framework",
- org.eclipse.wst.jsdt.debug.opera.internal.jsdi;x-internal:=true,
- org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request;x-internal:=true,
- org.eclipse.wst.jsdt.debug.opera.internal.launching;x-internal:=true
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/build.properties b/development/org.eclipse.wst.jsdt.debug.opera/build.properties
deleted file mode 100644
index f8d5672..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/build.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-output.. = bin/
-bin.includes = plugin.xml
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/plugin.xml b/development/org.eclipse.wst.jsdt.debug.opera/plugin.xml
deleted file mode 100644
index 17cc712..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/plugin.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-<plugin>
-   <extension
-         point="org.eclipse.wst.jsdt.debug.core.launchingConnectors">
-      <connector
-            class="org.eclipse.wst.jsdt.debug.opera.internal.launching.OperaListeningConnector"
-            id="org.eclipse.wst.jsdt.debug.opera.listening.connector">
-      </connector>
-   </extension>
-
-</plugin>
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/OperaPlugin.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/OperaPlugin.java
deleted file mode 100644
index 7c144df..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/OperaPlugin.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.eclipse.wst.jsdt.debug.opera;
-
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-
-public class OperaPlugin implements BundleActivator {
-
-	private static BundleContext context;
-
-	static BundleContext getContext() {
-		return context;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext bundleContext) throws Exception {
-		OperaPlugin.context = bundleContext;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext bundleContext) throws Exception {
-		OperaPlugin.context = null;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/BooleanValueImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/BooleanValueImpl.java
deleted file mode 100644
index 3b8014c..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/BooleanValueImpl.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.BooleanValue;
-
-/**
- * Default {@link BooleanValue} Opera implementation
- * 
- * @since 0.1
- */
-public class BooleanValueImpl extends PrimitiveValueImpl implements BooleanValue {
-
-	private boolean value = false;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param value
-	 */
-	public BooleanValueImpl(VirtualMachineImpl vm, boolean value) {
-		super(vm);
-		this.value = value;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#intValue()
-	 */
-	public int intValue() {
-		return (value ? 1 : 0);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#doubleValue()
-	 */
-	public double doubleValue() {
-		return intValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#booleanValue()
-	 */
-	public boolean booleanValue() {
-		return value;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#stringValue()
-	 */
-	public String stringValue() {
-		return Boolean.toString(value);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return stringValue();
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/EventQueueImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/EventQueueImpl.java
deleted file mode 100644
index 9a38792..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/EventQueueImpl.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet;
-
-/**
- * Default {@link EventQueue} implementation for Opera
- * @since 0.1
- */
-public class EventQueueImpl extends MirrorImpl implements EventQueue {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public EventQueueImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue#remove()
-	 */
-	public EventSet remove() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue#remove(int)
-	 */
-	public EventSet remove(int timeout) {
-		return null;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/LocationImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/LocationImpl.java
deleted file mode 100644
index 7fd2286..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/LocationImpl.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-
-/**
- * Default {@link Location} implementation for Opera
- * 
- * @since 0.1
- */
-public class LocationImpl extends MirrorImpl implements Location {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public LocationImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Location#scriptReference()
-	 */
-	public ScriptReference scriptReference() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Location#lineNumber()
-	 */
-	public int lineNumber() {
-		return 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Location#functionName()
-	 */
-	public String functionName() {
-		return null;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/Messages.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/Messages.java
deleted file mode 100644
index d0581e7..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/Messages.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.opera.internal.jsdi.messages"; //$NON-NLS-1$
-	public static String vm_desc;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/MirrorImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/MirrorImpl.java
deleted file mode 100644
index ba1d0bf..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/MirrorImpl.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Mirror;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Default {@link Mirror} object for Opera
- * 
- * @since 0.1
- */
-public class MirrorImpl implements Mirror {
-
-	private VirtualMachineImpl vm = null;
-	
-	/**
-	 * Constructor
-	 * <br><br>
-	 * This constructor is only to be used when the {@link Mirror} is in fact the {@link VirtualMachine} object
-	 * 
-	 * @noreference This constructor is not intended to be referenced by clients.
-	 */
-	public MirrorImpl() {
-		vm = (VirtualMachineImpl) this;
-	}
-	
-	/**
-	 * Constructor
-	 */
-	public MirrorImpl(VirtualMachineImpl vm) {
-		this.vm = vm;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Mirror#virtualMachine()
-	 */
-	public VirtualMachine virtualMachine() {
-		return this.vm;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/NullValueImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/NullValueImpl.java
deleted file mode 100644
index 49ff54f..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/NullValueImpl.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.NullValue;
-
-/**
- * Default {@link NullValue} Opera implementation
- * 
- * @since 0.1
- */
-public class NullValueImpl extends MirrorImpl implements NullValue {
-
-	public static String VALUE = "null"; //$NON-NLS-1$
-	
-	public NullValueImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return VALUE;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/NumberValueImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/NumberValueImpl.java
deleted file mode 100644
index 543a97d..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/NumberValueImpl.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue;
-import org.eclipse.wst.jsdt.debug.core.model.JavaScriptDebugModel;
-
-/**
- * Default {@link NumberValue} implementation for Opera
- * 
- * @since 0.1
- */
-public class NumberValueImpl extends PrimitiveValueImpl implements NumberValue {
-	
-	Number number = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param number
-	 */
-	public NumberValueImpl(VirtualMachineImpl vm, Number number) {
-		super(vm);
-		this.number = number;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#intValue()
-	 */
-	public int intValue() {
-		if(number == null) {
-			return -1;
-		}
-		return number.intValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#doubleValue()
-	 */
-	public double doubleValue() {
-		if(number == null) {
-			return -1;
-		}
-		return number.doubleValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#booleanValue()
-	 */
-	public boolean booleanValue() {
-		if(number == null) {
-			return false;
-		}
-		return number.intValue() > 0 ? true : false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#stringValue()
-	 */
-	public String stringValue() {
-		return JavaScriptDebugModel.numberToString(number);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return JavaScriptDebugModel.numberToString(number);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue#value()
-	 */
-	public Number value() {
-		return number;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue#isNaN()
-	 */
-	public boolean isNaN() {
-		return number == null;
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/PrimitiveValueImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/PrimitiveValueImpl.java
deleted file mode 100644
index 708f685..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/PrimitiveValueImpl.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue;
-
-/**
- * Default {@link PrimitiveValue} Opera implementation
- * 
- * @since 0.1
- */
-public abstract class PrimitiveValueImpl extends MirrorImpl implements PrimitiveValue {
-
-	public PrimitiveValueImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/RequestManagerImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/RequestManagerImpl.java
deleted file mode 100644
index 8739752..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/RequestManagerImpl.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.DebuggerStatementRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ResumeRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ScriptLoadRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.SuspendRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDeathRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDisconnectRequest;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request.BreakpointRequestImpl;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request.DebuggerStatementRequestImpl;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request.ExceptionRequestImpl;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request.ResumeRequestImpl;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request.ScriptLoadRequestImpl;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request.StepRequestImpl;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request.SuspendRequestImpl;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request.ThreadEnterRequestImpl;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request.ThreadExitRequestImpl;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request.VMDeathRequestImpl;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request.VMDisconnectRequestImpl;
-
-/**
- * Default {@link EventRequestManager} implementation for Opera
- * 
- * @since 0.1
- */
-public class RequestManagerImpl extends MirrorImpl implements EventRequestManager {
-
-	private final Map eventsMap = new HashMap();
-	private final List bpreqs = new ArrayList();
-	private final List exreqs = new ArrayList();
-	private final List dsreqs = new ArrayList();
-	private final List slreqs = new ArrayList();
-	private final List stepreqs = new ArrayList();
-	private final List susreqs = new ArrayList();
-	private final List resreqs = new ArrayList();
-	private final List tereqs = new ArrayList();
-	private final List texreqs = new ArrayList();
-	private final List vdetreqs = new ArrayList();
-	private final List vdisreqs = new ArrayList();
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public RequestManagerImpl(VirtualMachineImpl vm) {
-		super(vm);
-		eventsMap.put(BreakpointRequestImpl.class, bpreqs);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createBreakpointRequest(org.eclipse.wst.jsdt.debug.core.jsdi.Location)
-	 */
-	public BreakpointRequest createBreakpointRequest(Location location) {
-		BreakpointRequestImpl request = new BreakpointRequestImpl((VirtualMachineImpl)virtualMachine(), location);
-		bpreqs.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#breakpointRequests()
-	 */
-	public List breakpointRequests() {
-		return Collections.unmodifiableList(bpreqs);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createDebuggerStatementRequest()
-	 */
-	public DebuggerStatementRequest createDebuggerStatementRequest() {
-		DebuggerStatementRequestImpl request = new DebuggerStatementRequestImpl((VirtualMachineImpl) virtualMachine());
-		dsreqs.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#debuggerStatementRequests()
-	 */
-	public List debuggerStatementRequests() {
-		return Collections.unmodifiableList(dsreqs);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createExceptionRequest()
-	 */
-	public ExceptionRequest createExceptionRequest() {
-		ExceptionRequestImpl request = new ExceptionRequestImpl((VirtualMachineImpl) virtualMachine());
-		exreqs.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#exceptionRequests()
-	 */
-	public List exceptionRequests() {
-		return Collections.unmodifiableList(exreqs);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createScriptLoadRequest()
-	 */
-	public ScriptLoadRequest createScriptLoadRequest() {
-		ScriptLoadRequestImpl request = new ScriptLoadRequestImpl((VirtualMachineImpl) virtualMachine());
-		slreqs.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#scriptLoadRequests()
-	 */
-	public List scriptLoadRequests() {
-		return Collections.unmodifiableList(slreqs);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createStepRequest(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference, int)
-	 */
-	public StepRequest createStepRequest(ThreadReference thread, int step) {
-		StepRequestImpl request= new StepRequestImpl((VirtualMachineImpl) virtualMachine(), thread, step);
-		stepreqs.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#stepRequests()
-	 */
-	public List stepRequests() {
-		return Collections.unmodifiableList(stepreqs);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createSuspendRequest(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public SuspendRequest createSuspendRequest(ThreadReference thread) {
-		SuspendRequestImpl request = new SuspendRequestImpl((VirtualMachineImpl) virtualMachine(), thread);
-		susreqs.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#suspendRequests()
-	 */
-	public List suspendRequests() {
-		return Collections.unmodifiableList(susreqs);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createResumeRequest(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public ResumeRequest createResumeRequest(ThreadReference thread) {
-		ResumeRequestImpl request = new ResumeRequestImpl((VirtualMachineImpl) virtualMachine(), thread);
-		resreqs.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#resumeRequests()
-	 */
-	public List resumeRequests() {
-		return Collections.unmodifiableList(resreqs);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createThreadEnterRequest()
-	 */
-	public ThreadEnterRequest createThreadEnterRequest() {
-		ThreadEnterRequestImpl request = new ThreadEnterRequestImpl((VirtualMachineImpl) virtualMachine());
-		tereqs.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#threadEnterRequests()
-	 */
-	public List threadEnterRequests() {
-		return Collections.unmodifiableList(tereqs);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createThreadExitRequest()
-	 */
-	public ThreadExitRequest createThreadExitRequest() {
-		ThreadExitRequestImpl request = new ThreadExitRequestImpl((VirtualMachineImpl) virtualMachine());
-		texreqs.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#threadExitRequests()
-	 */
-	public List threadExitRequests() {
-		return Collections.unmodifiableList(texreqs);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#deleteEventRequest(org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest)
-	 */
-	public void deleteEventRequest(EventRequest eventRequest) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#deleteEventRequest(java.util.List)
-	 */
-	public void deleteEventRequest(List eventRequests) {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createVMDeathRequest()
-	 */
-	public VMDeathRequest createVMDeathRequest() {
-		VMDeathRequestImpl request = new VMDeathRequestImpl((VirtualMachineImpl) virtualMachine());
-		vdetreqs.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#vmDeathRequests()
-	 */
-	public List vmDeathRequests() {
-		return Collections.unmodifiableList(vdetreqs);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createVMDisconnectRequest()
-	 */
-	public VMDisconnectRequest createVMDisconnectRequest() {
-		VMDisconnectRequestImpl request = new VMDisconnectRequestImpl((VirtualMachineImpl) virtualMachine());
-		vdetreqs.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#vmDisconnectRequests()
-	 */
-	public List vmDisconnectRequests() {
-		return Collections.unmodifiableList(vdisreqs);
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/StringValueImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/StringValueImpl.java
deleted file mode 100644
index 19fedea..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/StringValueImpl.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.StringValue;
-
-/**
- * Default {@link StringValue} implementation for Opera
- * 
- *  @since 0.1
- */
-public class StringValueImpl extends MirrorImpl implements StringValue {
-
-	String value = null;
-	
-	/**
-	 * Constructor
-	 */
-	public StringValueImpl(VirtualMachineImpl vm, String value) {
-		super(vm);
-		this.value = value;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return value;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StringValue#value()
-	 */
-	public String value() {
-		return value;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/UndefinedImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/UndefinedImpl.java
deleted file mode 100644
index e1b5b5d..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/UndefinedImpl.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.UndefinedValue;
-
-/**
- * Default {@link UndefinedValue} Opera implementation
- * 
- * @since 0.1
- */
-public class UndefinedImpl extends MirrorImpl implements UndefinedValue {
-
-	public static String VALUE = "undefined"; //$NON-NLS-1$
-	
-	public UndefinedImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return VALUE;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/VirtualMachineImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/VirtualMachineImpl.java
deleted file mode 100644
index 4681137..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/VirtualMachineImpl.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.BooleanValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.NullValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.StringValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.UndefinedValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager;
-
-import com.google.protobuf.ByteString;
-import com.opera.core.scope.ESDebuggerCommand;
-import com.opera.core.scope.MessageCallback;
-import com.opera.core.scope.ProtocolFormat;
-import com.opera.core.scope.ScopeClient;
-import com.opera.core.scope.ScopeErrorException;
-import com.opera.core.systems.scope.protos.ScopeProtos;
-import com.opera.core.systems.scope.protos.UmsProtos.Command;
-
-/**
- * {@link VirtualMachine} for Opera support
- * 
- * @since 0.1
- */
-public class VirtualMachineImpl extends MirrorImpl implements VirtualMachine {
-
-	private static UndefinedValue undefinedmirror = null;
-	private static NullValue nullmirror = null;
-	private static Object rmilock = new Object();
-	private static Object eqlock = new Object();
-	
-	private ScopeClient client = null;
-	private String name = null;
-	private RequestManagerImpl rmi = null;
-	private EventQueueImpl eqi = null;
-	
-	/**
-	 * Constructor
-	 * @param client
-	 */
-	public VirtualMachineImpl(ScopeClient client) {
-		super();
-		this.client = client;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#resume()
-	 */
-	public void resume() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#suspend()
-	 */
-	public void suspend() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#terminate()
-	 */
-	public void terminate() {
-		client.getClientLock().release();
-		client.close();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#name()
-	 */
-	public synchronized String name() {
-		if(name == null) {
-			name = description();
-		}
-		return name;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#description()
-	 */
-	public String description() {
-		return Messages.vm_desc;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#version()
-	 */
-	public String version() {
-		StringBuffer buff = new StringBuffer("stp: "); //$NON-NLS-1$
-		ScopeProtos.HostInfo.Builder b = ScopeProtos.HostInfo.newBuilder(); 
-		buff.append(Integer.toString(b.getStpVersion())).append(" "); //$NON-NLS-1$
-		buff.append("core: ").append(b.getCoreVersion()); //$NON-NLS-1$
-		buff.append("agent: ").append(b.getUserAgent()); //$NON-NLS-1$
-		buff.append("plat: ").append(b.getPlatform()); //$NON-NLS-1$
-		buff.append("os: ").append(b.getOperatingSystem()); //$NON-NLS-1$
-		return buff.toString();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#allThreads()
-	 */
-	public List allThreads() {
-		//TODO send threads request
-		return Collections.EMPTY_LIST;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#allScripts()
-	 */
-	public List allScripts() {
-		MessageCallback callback = new MessageCallback() {
-			public void onMessageReceived(Object t) {
-				System.out.println("got runtimes"); //$NON-NLS-1$
-			}
-
-			public void onError(ScopeErrorException ex) {
-				System.err.println("got exception"); //$NON-NLS-1$
-			}
-		};
-		Command.Builder command = Command.newBuilder();
-		command.setCommandID(ESDebuggerCommand.LIST_RUNTIMES.getId());
-		command.setFormat(ProtocolFormat.JSON.getValue().intValue());
-		
-		command.setPayload(ByteString.EMPTY);
-		command.setService(ESDebuggerCommand.LIST_RUNTIMES.getName());
-        command.setTag(client.getNextTag());
-		client.sendCommand(command.build(), callback);
-		return Collections.EMPTY_LIST;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#dispose()
-	 */
-	public void dispose() {
-		client.close();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOfUndefined()
-	 */
-	public synchronized UndefinedValue mirrorOfUndefined() {
-		if(undefinedmirror == null) {
-			undefinedmirror = new UndefinedImpl(this);
-		}
-		return undefinedmirror;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOfNull()
-	 */
-	public synchronized NullValue mirrorOfNull() {
-		if(nullmirror == null) {
-			nullmirror = new NullValueImpl(this);
-		}
-		return nullmirror;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOf(boolean)
-	 */
-	public BooleanValue mirrorOf(boolean bool) {
-		return new BooleanValueImpl(this, bool);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOf(java.lang.Number)
-	 */
-	public NumberValue mirrorOf(Number number) {
-		return new NumberValueImpl(this, number);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOf(java.lang.String)
-	 */
-	public StringValue mirrorOf(String string) {
-		return new StringValueImpl(this, string);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#eventRequestManager()
-	 */
-	public EventRequestManager eventRequestManager() {
-		synchronized (rmilock) {
-			if(rmi == null) {
-				rmi = new RequestManagerImpl(this);
-			}
-		}
-		return rmi;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#eventQueue()
-	 */
-	public EventQueue eventQueue() {
-		synchronized (eqlock) {
-			if(eqi == null) {
-				eqi = new EventQueueImpl(this);
-			}
-		}
-		return eqi;
-	}
-}
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/messages.properties b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/messages.properties
deleted file mode 100644
index 3e917cd..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/messages.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-###############################################################################
-# Copyright (c) 2011 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-###############################################################################
-vm_desc=Opera VM
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/BreakpointRequestImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/BreakpointRequestImpl.java
deleted file mode 100644
index 2757ddf..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/BreakpointRequestImpl.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.VirtualMachineImpl;
-
-/**
- * Default {@link BreakpointRequest} implementation for Opera
- * 
- * @since 0.1
- */
-public class BreakpointRequestImpl extends LocatableRequestImpl implements BreakpointRequest {
-
-	ThreadReference thread = null;
-	String condition = null;
-	int hitcount = -1;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param location
-	 */
-	public BreakpointRequestImpl(VirtualMachineImpl vm, Location location) {
-		super(vm, location);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public void addThreadFilter(ThreadReference thread) {
-		this.thread = thread;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest#addConditionFilter(java.lang.String)
-	 */
-	public void addConditionFilter(String condition) {
-		this.condition = condition;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest#addHitCountFilter(int)
-	 */
-	public void addHitCountFilter(int hitcount) {
-		this.hitcount = hitcount;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/DebuggerStatementRequestImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/DebuggerStatementRequestImpl.java
deleted file mode 100644
index 15ef169..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/DebuggerStatementRequestImpl.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.DebuggerStatementRequest;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.VirtualMachineImpl;
-
-/**
- * Default {@link DebuggerStatementRequest} implementation for Opera
- * 
- * @since 0.1
- */
-public class DebuggerStatementRequestImpl extends EventRequestImpl implements DebuggerStatementRequest {
-
-	ThreadReference thread = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public DebuggerStatementRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.DebuggerStatementRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public void addThreadFilter(ThreadReference thread) {
-		this.thread = thread;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/EventRequestImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/EventRequestImpl.java
deleted file mode 100644
index c012196..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/EventRequestImpl.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.MirrorImpl;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.VirtualMachineImpl;
-
-/**
- * Default {@link EventRequest} implementation for Opera
- * 
- * @since 0.1
- */
-public class EventRequestImpl extends MirrorImpl implements EventRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public EventRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest#isEnabled()
-	 */
-	public boolean isEnabled() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest#setEnabled(boolean)
-	 */
-	public void setEnabled(boolean enabled) {
-	}
-
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/ExceptionRequestImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/ExceptionRequestImpl.java
deleted file mode 100644
index d0e8a67..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/ExceptionRequestImpl.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.VirtualMachineImpl;
-
-/**
- * Default {@link ExceptionRequest} implementation for Opera
- * 
- * @since 0.1
- */
-public class ExceptionRequestImpl extends EventRequestImpl implements ExceptionRequest {
-
-	ThreadReference thread = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public ExceptionRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public void addThreadFilter(ThreadReference thread) {
-		this.thread = thread;
-	}
-}
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/LocatableRequestImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/LocatableRequestImpl.java
deleted file mode 100644
index e26541c..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/LocatableRequestImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.VirtualMachineImpl;
-
-/**
- * Default implementation of a request that has a location
- * 
- * @since 0.1
- */
-public class LocatableRequestImpl extends EventRequestImpl {
-
-	Location location = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param location
-	 */
-	public LocatableRequestImpl(VirtualMachineImpl vm, Location location) {
-		super(vm);
-		this.location = location;
-	}
-
-	/**
-	 * @return the location
-	 */
-	public Location location() {
-		return location;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/ResumeRequestImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/ResumeRequestImpl.java
deleted file mode 100644
index 35d4d16..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/ResumeRequestImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ResumeRequest;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.VirtualMachineImpl;
-
-/**
- * Default {@link ResumeRequest} implementation for Opera
- * 
- * @since 0.1
- */
-public class ResumeRequestImpl extends EventRequestImpl implements	ResumeRequest {
-
-	ThreadReference thread = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public ResumeRequestImpl(VirtualMachineImpl vm, ThreadReference thread) {
-		super(vm);
-		this.thread = thread;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.ResumeRequest#thread()
-	 */
-	public ThreadReference thread() {
-		return thread;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/ScriptLoadRequestImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/ScriptLoadRequestImpl.java
deleted file mode 100644
index 113bbda..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/ScriptLoadRequestImpl.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ScriptLoadRequest;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.VirtualMachineImpl;
-
-/**
- * Default {@link ScriptLoadRequest} implementation for Opera
- * 
- * @since 0.1
- */
-public class ScriptLoadRequestImpl extends EventRequestImpl implements ScriptLoadRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public ScriptLoadRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/StepRequestImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/StepRequestImpl.java
deleted file mode 100644
index 6c860f6..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/StepRequestImpl.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.VirtualMachineImpl;
-
-/**
- * Default {@link StepRequest} implementation for Opera
- * 
- * @since 0.1
- */
-public class StepRequestImpl extends EventRequestImpl implements StepRequest {
-
-	ThreadReference thread = null;
-	int stepkind = -1;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public StepRequestImpl(VirtualMachineImpl vm, ThreadReference thread, int kind) {
-		super(vm);
-		this.thread = thread;
-		this.stepkind = kind;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest#step()
-	 */
-	public int step() {
-		return stepkind;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest#thread()
-	 */
-	public ThreadReference thread() {
-		return thread;
-	}
-}
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/SuspendRequestImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/SuspendRequestImpl.java
deleted file mode 100644
index 6505507..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/SuspendRequestImpl.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.SuspendRequest;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.VirtualMachineImpl;
-
-/**
- * Default {@link SuspendRequest} implementation for Opera
- * 
- * @since 0.1
- */
-public class SuspendRequestImpl extends EventRequestImpl implements SuspendRequest {
-
-	ThreadReference thread = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 */
-	public SuspendRequestImpl(VirtualMachineImpl vm, ThreadReference thread) {
-		super(vm);
-		this.thread = thread;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.SuspendRequest#thread()
-	 */
-	public ThreadReference thread() {
-		return thread;
-	}
-}
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/ThreadEnterRequestImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/ThreadEnterRequestImpl.java
deleted file mode 100644
index 7f66e51..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/ThreadEnterRequestImpl.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.VirtualMachineImpl;
-
-/**
- * Default {@link ThreadEnterRequest} implementation for Opera
- * 
- * @since 0.1
- */
-public class ThreadEnterRequestImpl extends EventRequestImpl implements	ThreadEnterRequest {
-
-	ThreadReference thread = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public ThreadEnterRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public void addThreadFilter(ThreadReference thread) {
-		this.thread = thread;
-	}
-}
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/ThreadExitRequestImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/ThreadExitRequestImpl.java
deleted file mode 100644
index 8bd8b84..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/ThreadExitRequestImpl.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.VirtualMachineImpl;
-
-/**
- * Default {@link ThreadExitRequest} implementation for Opera
- * 
- * @since 0.1
- */
-public class ThreadExitRequestImpl extends EventRequestImpl implements	ThreadExitRequest {
-
-	ThreadReference thread = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public ThreadExitRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public void addThreadFilter(ThreadReference thread) {
-		this.thread = thread;
-	}
-}
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/VMDeathRequestImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/VMDeathRequestImpl.java
deleted file mode 100644
index f62fdc1..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/VMDeathRequestImpl.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDeathRequest;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.VirtualMachineImpl;
-
-/**
- * Default {@link VMDeathRequest} implementation for Opera
- * 
- * @since 0.1
- */
-public class VMDeathRequestImpl extends EventRequestImpl implements	VMDeathRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public VMDeathRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-}
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/VMDisconnectRequestImpl.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/VMDisconnectRequestImpl.java
deleted file mode 100644
index 378612d..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/jsdi/request/VMDisconnectRequestImpl.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDisconnectRequest;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.VirtualMachineImpl;
-
-/**
- * Default {@link VMDisconnectRequest} implementation for Opera
- * 
- * @since 0.1
- */
-public class VMDisconnectRequestImpl extends EventRequestImpl implements VMDisconnectRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public VMDisconnectRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-}
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/launching/HostArgument.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/launching/HostArgument.java
deleted file mode 100644
index 6adbc08..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/launching/HostArgument.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.launching;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.StringArgument;
-
-/**
- * Implementation of a string argument that describes the host argument
- * 
- * @since 1.0
- */
-public class HostArgument implements StringArgument {
-
-	private static final long serialVersionUID = 3057403815318177030L;
-	private String host;
-
-	/**
-	 * Host attribute name
-	 */
-	public static final String HOST = "host"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 * 
-	 * @param host
-	 */
-	public HostArgument(String host) {
-		setValue(host);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#description()
-	 */
-	public String description() {
-		return "host"; //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.StringArgument#isValid(java.lang.String)
-	 */
-	public boolean isValid(String value) {
-		return value != null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#label()
-	 */
-	public String label() {
-		return "Host:"; //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#mustSpecify()
-	 */
-	public boolean mustSpecify() {
-		return true;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#name()
-	 */
-	public String name() {
-		return HOST;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#setValue(java.lang.String)
-	 */
-	public void setValue(String host) {
-		if(host == null) {
-			this.host = "localhost"; //$NON-NLS-1$
-		}
-		else {
-			if (!isValid(host)) {
-				throw new IllegalArgumentException();
-			}
-			this.host = host;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#value()
-	 */
-	public String value() {
-		return host;
-	}
-
-	/**
-	 * Returns if the given host is <code>localhost</code> or <code>127.0.0.1</code>
-	 * @param host
-	 * @return true if the given host it localhost (127.0.0.1) false otherwise
-	 */
-	public static boolean isLocalhost(String host) {
-		return host.equals("localhost") || host.equals("127.0.0.1"); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-}
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/launching/Messages.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/launching/Messages.java
deleted file mode 100644
index 559ea1d..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/launching/Messages.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.launching;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.opera.internal.launching.messages"; //$NON-NLS-1$
-	public static String connector_desc;
-	public static String connector_id;
-	public static String connector_name;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/launching/OperaListeningConnector.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/launching/OperaListeningConnector.java
deleted file mode 100644
index ecfcf7b..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/launching/OperaListeningConnector.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.launching;
-
-import java.beans.ExceptionListener;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.ListeningConnector;
-import org.eclipse.wst.jsdt.debug.opera.internal.jsdi.VirtualMachineImpl;
-
-import com.opera.core.DefaultListener;
-import com.opera.core.ScopeSDK;
-import com.opera.core.scope.ScopeClient;
-
-/**
- * Default listening connector
- */
-public class OperaListeningConnector implements ListeningConnector {
-
-	/**
-	 * Constructor
-	 */
-	public OperaListeningConnector() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#defaultArguments()
-	 */
-	public Map defaultArguments() {
-		HashMap args = new HashMap();
-		args.put(HostArgument.HOST, new HostArgument(null));
-		args.put(PortArgument.PORT, new PortArgument(7001));
-		return args;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#description()
-	 */
-	public String description() {
-		return Messages.connector_desc;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#name()
-	 */
-	public String name() {
-		return Messages.connector_name;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#id()
-	 */
-	public String id() {
-		return Messages.connector_id;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.ListeningConnector#accept(java.util.Map)
-	 */
-	public VirtualMachine accept(Map arguments) throws IOException {
-		DefaultListener listener = new DefaultListener();
-		ExceptionListener el = new ExceptionListener() {
-			public void exceptionThrown(Exception e) {
-				e.printStackTrace();
-			}
-		};
-		String host = (String) arguments.get(HostArgument.HOST);
-		String port = (String) arguments.get(PortArgument.PORT);
-		if(host == null || port == null) {
-			throw new IOException("The host or port arguments cannot be null"); //$NON-NLS-1$
-		}
-		int portnum = -1;
-		try {
-			portnum = Integer.parseInt(port);
-		}
-		catch(NumberFormatException nfe) {
-			throw new IOException("The given port was not an integer"); //$NON-NLS-1$
-		}
-		ScopeSDK scope = new ScopeSDK(listener, el, host, portnum, -1, null);
-		try {
-			scope.start();
-			ScopeClient client = listener.waitForClient(50000, TimeUnit.MILLISECONDS);
-			if(client != null) {
-				VirtualMachineImpl vm = new VirtualMachineImpl(client);
-				return vm;
-			}
-			throw new IOException("Could not start the ScopeSDK builder"); //$NON-NLS-1$
-		}
-		catch(IOException ioe) {
-			scope.stop();
-			throw ioe;
-		}
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/launching/PortArgument.java b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/launching/PortArgument.java
deleted file mode 100644
index f4e5db3..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/launching/PortArgument.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.jsdt.debug.opera.internal.launching;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument;
-
-/**
- * Implementation of an {@link IntegerArgument} that describes the port to try connecting to
- * 
- * @since 1.0
- */
-public class PortArgument implements IntegerArgument {
-
-	private static final long serialVersionUID = -1954469572907116388L;
-	private int port;
-
-	/**
-	 * The port attribute name
-	 */
-	public static final String PORT = "port"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 * 
-	 * @param port
-	 */
-	public PortArgument(int port) {
-		setValue(port);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#intValue()
-	 */
-	public int intValue() {
-		return port;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#isValid(int)
-	 */
-	public boolean isValid(int intValue) {
-		return intValue > 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#max()
-	 */
-	public int max() {
-		return Integer.MAX_VALUE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#min()
-	 */
-	public int min() {
-		return 1;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#setValue(int)
-	 */
-	public void setValue(int port) {
-		this.port = port;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#description()
-	 */
-	public String description() {
-		return "The local port to open"; //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#isValid(java.lang.String)
-	 */
-	public boolean isValid(String value) {
-		try {
-			int intValue = Integer.parseInt(value);
-			return isValid(intValue);
-		} catch (NumberFormatException e) {
-			return false;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#label()
-	 */
-	public String label() {
-		return "Port:"; //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#mustSpecify()
-	 */
-	public boolean mustSpecify() {
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#name()
-	 */
-	public String name() {
-		return PORT;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#setValue(java.lang.String)
-	 */
-	public void setValue(String value) {
-		try {
-			int intValue = Integer.parseInt(value);
-			setValue(intValue);
-		} catch (NumberFormatException nfe) {
-			// re-throw IllegalArgumentException
-			throw new IllegalArgumentException(nfe.getMessage());
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#value()
-	 */
-	public String value() {
-		return Integer.toString(port);
-	}
-}
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/launching/messages.properties b/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/launching/messages.properties
deleted file mode 100644
index 58d05a8..0000000
--- a/development/org.eclipse.wst.jsdt.debug.opera/src/org/eclipse/wst/jsdt/debug/opera/internal/launching/messages.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-connector_desc=Starts the Opera builder and listens for a browser to connect
-connector_id=org.eclipse.wst.jsdt.debug.opera.listening.connector
-connector_name=Opera - Listening Connector
