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 7c72fd4..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.100.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.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 cab2989..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.ui/src/org/eclipse/wst/jsdt/debug/internal/ui/breakpoints/JavaScriptBreakpointUpdater.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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;
-		}
-		IFile file = (IFile) marker.getResource();
-		if(JavaScriptCore.isJavaScriptLikeFileName(file.getName())) {
-			IJavaScriptUnit unit = JavaScriptCore.createCompilationUnitFrom(file);
-			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 true;
-	}
-	
-	/**
-	 * 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 fc04976..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="3.1.0",
- 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 5902168..0000000
--- a/development/org.eclipse.wst.jsdt.debug.chrome/src/org/eclipse/wst/jsdt/debug/internal/chrome/jsdi/VMImpl.java
+++ /dev/null
@@ -1,371 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010, 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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.breakpoints.IJavaScriptBreakpoint;
-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;
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#canUpdateBreakpoints()
-	 */
-	public boolean canUpdateBreakpoints() {
-		return true;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#updateBreakpoint(org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint)
-	 */
-	public void updateBreakpoint(IJavaScriptBreakpoint breakpoint) {
-	}
-}
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 b180e16..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/ExplorerBar.cpp
+++ /dev/null
@@ -1,746 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 a513127..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/ExplorerBar.h
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 c09001c..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/ExplorerBar.rgs
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 3212c34..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireBHO.cpp
+++ /dev/null
@@ -1,499 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 d2373d6..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireBHO.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 39941f3..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireBHO.rgs
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 dd248fe..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 44a68f7..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.def
+++ /dev/null
@@ -1,21 +0,0 @@
-; *******************************************************************************
-; * Copyright (c) 2012 IBM Corporation and others.
-; * All rights reserved. This program and the accompanying materials
-; * are made available under the terms of the Eclipse Public License v1.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 97646a4..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.idl
+++ /dev/null
@@ -1,133 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 96d3414..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, 2012.  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 00096a5..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtension.rgs
+++ /dev/null
@@ -1,20 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 761be76..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/IECrossfireExtensionps.def
+++ /dev/null
@@ -1,20 +0,0 @@
-; *******************************************************************************
-; * Copyright (c) 2012 IBM Corporation and others.
-; * All rights reserved. This program and the accompanying materials
-; * are made available under the terms of the Eclipse Public License v1.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 f9be464..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/Logger.cpp
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 c164f59..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/Logger.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 7580b10..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/Util.cpp
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 ec6c264..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/Util.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 11c0261..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/resource.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 e827fc1..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/stdafx.cpp
+++ /dev/null
@@ -1,17 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 d6007fd..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireExtension/stdafx.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 be92c1b..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:_0769F9DE137E47D1BC8C88CEC122862E"
-        "OwnerKey" = "8:_68B2C602B4B448ADBFC58961A342D06B"
-        "MsmSig" = "8:_UNDEFINED"
-        }
-        "Entry"
-        {
-        "MsmKey" = "8:_0769F9DE137E47D1BC8C88CEC122862E"
-        "OwnerKey" = "8:_A558BCE26AC6426C9ABA48959A6EB3C6"
-        "MsmSig" = "8:_UNDEFINED"
-        }
-        "Entry"
-        {
-        "MsmKey" = "8:_08B68589E44940F8B6D40CA08C892114"
-        "OwnerKey" = "8:_UNDEFINED"
-        "MsmSig" = "8:_UNDEFINED"
-        }
-        "Entry"
-        {
-        "MsmKey" = "8:_68B2C602B4B448ADBFC58961A342D06B"
-        "OwnerKey" = "8:_UNDEFINED"
-        "MsmSig" = "8:_UNDEFINED"
-        }
-        "Entry"
-        {
-        "MsmKey" = "8:_770C3B8BDBA340C7BBE1104846E1F2DE"
-        "OwnerKey" = "8:_68B2C602B4B448ADBFC58961A342D06B"
-        "MsmSig" = "8:_UNDEFINED"
-        }
-        "Entry"
-        {
-        "MsmKey" = "8:_770C3B8BDBA340C7BBE1104846E1F2DE"
-        "OwnerKey" = "8:_A558BCE26AC6426C9ABA48959A6EB3C6"
-        "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:{D3550310-41A2-49E1-B9A2-6D49A2F67F6F}"
-        "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, 2012.  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, 2012.  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}:_0769F9DE137E47D1BC8C88CEC122862E"
-            {
-            "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}:_770C3B8BDBA340C7BBE1104846E1F2DE"
-            {
-            "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 b49959f..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/epl-v10.html b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/Release/epl-v10.html
deleted file mode 100644
index ed4b196..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/Release/epl-v10.html
+++ /dev/null
@@ -1,328 +0,0 @@
-<html xmlns:o="urn:schemas-microsoft-com:office:office"
-xmlns:w="urn:schemas-microsoft-com:office:word"
-xmlns="http://www.w3.org/TR/REC-html40">
-
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
-<meta name=ProgId content=Word.Document>
-<meta name=Generator content="Microsoft Word 9">
-<meta name=Originator content="Microsoft Word 9">
-<link rel=File-List
-href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
-<title>Eclipse Public License - Version 1.0</title>
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Revision>2</o:Revision>
-  <o:TotalTime>3</o:TotalTime>
-  <o:Created>2004-03-05T23:03:00Z</o:Created>
-  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
-  <o:Pages>4</o:Pages>
-  <o:Words>1626</o:Words>
-  <o:Characters>9270</o:Characters>
-   <o:Lines>77</o:Lines>
-  <o:Paragraphs>18</o:Paragraphs>
-  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
-  <o:Version>9.4402</o:Version>
- </o:DocumentProperties>
-</xml><![endif]--><!--[if gte mso 9]><xml>
- <w:WordDocument>
-  <w:TrackRevisions/>
- </w:WordDocument>
-</xml><![endif]-->
-<style>
-<!--
- /* Font Definitions */
-@font-face
-	{font-family:Tahoma;
-	panose-1:2 11 6 4 3 5 4 4 2 4;
-	mso-font-charset:0;
-	mso-generic-font-family:swiss;
-	mso-font-pitch:variable;
-	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
- /* Style Definitions */
-p.MsoNormal, li.MsoNormal, div.MsoNormal
-	{mso-style-parent:"";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p
-	{margin-right:0in;
-	mso-margin-top-alt:auto;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p.BalloonText, li.BalloonText, div.BalloonText
-	{mso-style-name:"Balloon Text";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:8.0pt;
-	font-family:Tahoma;
-	mso-fareast-font-family:"Times New Roman";}
-@page Section1
-	{size:8.5in 11.0in;
-	margin:1.0in 1.25in 1.0in 1.25in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;
-	mso-paper-source:0;}
-div.Section1
-	{page:Section1;}
--->
-</style>
-</head>
-
-<body lang=EN-US style='tab-interval:.5in'>
-
-<div class=Section1>
-
-<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
-</p>
-
-<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
-THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
-REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
-OF THIS AGREEMENT.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-in the case of the initial Contributor, the initial code and documentation
-distributed under this Agreement, and<br clear=left>
-b) in the case of each subsequent Contributor:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-changes to the Program, and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-additions to the Program;</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
-such changes and/or additions to the Program originate from and are distributed
-by that particular Contributor. A Contribution 'originates' from a Contributor
-if it was added to the Program by such Contributor itself or anyone acting on
-such Contributor's behalf. Contributions do not include additions to the
-Program which: (i) are separate modules of software distributed in conjunction
-with the Program under their own license agreement, and (ii) are not derivative
-works of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
-entity that distributes the Program.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
-claims licensable by a Contributor which are necessarily infringed by the use
-or sale of its Contribution alone or when combined with the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
-distributed in accordance with this Agreement.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
-receives the Program under this Agreement, including all Contributors.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-Subject to the terms of this Agreement, each Contributor hereby grants Recipient
-a non-exclusive, worldwide, royalty-free copyright license to<span
-style='color:red'> </span>reproduce, prepare derivative works of, publicly
-display, publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and object code
-form.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-Subject to the terms of this Agreement, each Contributor hereby grants
-Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
-patent license under Licensed Patents to make, use, sell, offer to sell, import
-and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination
-of the Contribution and the Program if, at the time the Contribution is added
-by the Contributor, such addition of the Contribution causes such combination
-to be covered by the Licensed Patents. The patent license shall not apply to
-any other combinations which include the Contribution. No hardware per se is
-licensed hereunder. </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
-Recipient understands that although each Contributor grants the licenses to its
-Contributions set forth herein, no assurances are provided by any Contributor
-that the Program does not infringe the patent or other intellectual property
-rights of any other entity. Each Contributor disclaims any liability to Recipient
-for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and
-licenses granted hereunder, each Recipient hereby assumes sole responsibility
-to secure any other intellectual property rights needed, if any. For example,
-if a third party patent license is required to allow Recipient to distribute
-the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
-Each Contributor represents that to its knowledge it has sufficient copyright
-rights in its Contribution, if any, to grant the copyright license set forth in
-this Agreement. </span></p>
-
-<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
-Program in object code form under its own license agreement, provided that:</span>
-</p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it complies with the terms and conditions of this Agreement; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-its license agreement:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-effectively disclaims on behalf of all Contributors all warranties and
-conditions, express and implied, including warranties or conditions of title
-and non-infringement, and implied warranties or conditions of merchantability
-and fitness for a particular purpose; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-effectively excludes on behalf of all Contributors all liability for damages,
-including direct, indirect, special, incidental and consequential damages, such
-as lost profits; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
-states that any provisions which differ from this Agreement are offered by that
-Contributor alone and not by any other party; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
-states that source code for the Program is available from such Contributor, and
-informs licensees how to obtain it in a reasonable manner on or through a
-medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
-
-<p><span style='font-size:10.0pt'>When the Program is made available in source
-code form:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it must be made available under this Agreement; and </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
-copy of this Agreement must be included with each copy of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
-copyright notices contained within the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
-originator of its Contribution, if any, in a manner that reasonably allows
-subsequent Recipients to identify the originator of the Contribution. </span></p>
-
-<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
-
-<p><span style='font-size:10.0pt'>Commercial distributors of software may
-accept certain responsibilities with respect to end users, business partners
-and the like. While this license is intended to facilitate the commercial use
-of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes the
-Program in a commercial product offering, such Contributor (&quot;Commercial
-Contributor&quot;) hereby agrees to defend and indemnify every other
-Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
-costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified Contributor to
-the extent caused by the acts or omissions of such Commercial Contributor in
-connection with its distribution of the Program in a commercial product
-offering. The obligations in this section do not apply to any claims or Losses
-relating to any actual or alleged intellectual property infringement. In order
-to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial Contributor
-to control, and cooperate with the Commercial Contributor in, the defense and
-any related settlement negotiations. The Indemnified Contributor may participate
-in any such claim at its own expense.</span> </p>
-
-<p><span style='font-size:10.0pt'>For example, a Contributor might include the
-Program in a commercial product offering, Product X. That Contributor is then a
-Commercial Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance claims and
-warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the
-other Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT
-WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
-WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
-MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
-responsible for determining the appropriateness of using and distributing the
-Program and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs or
-equipment, and unavailability or interruption of operations. </span></p>
-
-<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
-THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
-
-<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
-or unenforceable under applicable law, it shall not affect the validity or
-enforceability of the remainder of the terms of this Agreement, and without
-further action by the parties hereto, such provision shall be reformed to the
-minimum extent necessary to make such provision valid and enforceable.</span> </p>
-
-<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
-against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Program itself (excluding combinations of the Program with
-other software or hardware) infringes such Recipient's patent(s), then such
-Recipient's rights granted under Section 2(b) shall terminate as of the date
-such litigation is filed. </span></p>
-
-<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
-shall terminate if it fails to comply with any of the material terms or
-conditions of this Agreement and does not cure such failure in a reasonable
-period of time after becoming aware of such noncompliance. If all Recipient's
-rights under this Agreement terminate, Recipient agrees to cease use and
-distribution of the Program as soon as reasonably practicable. However,
-Recipient's obligations under this Agreement and any licenses granted by
-Recipient relating to the Program shall continue and survive. </span></p>
-
-<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
-copies of this Agreement, but in order to avoid inconsistency the Agreement is
-copyrighted and may only be modified in the following manner. The Agreement
-Steward reserves the right to publish new versions (including revisions) of
-this Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the initial
-Agreement Steward. The Eclipse Foundation may assign the responsibility to
-serve as the Agreement Steward to a suitable separate entity. Each new version
-of the Agreement will be given a distinguishing version number. The Program
-(including Contributions) may always be distributed subject to the version of
-the Agreement under which it was received. In addition, after a new version of
-the Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly stated
-in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
-the intellectual property of any Contributor under this Agreement, whether
-expressly, by implication, estoppel or otherwise. All rights in the Program not
-expressly granted under this Agreement are reserved.</span> </p>
-
-<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
-State of New York and the intellectual property laws of the United States of
-America. No party to this Agreement will bring a legal action under this
-Agreement more than one year after the cause of action arose. Each party waives
-its rights to a jury trial in any resulting litigation.</span> </p>
-
-<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
-
-</div>
-
-</body>
-
-</html>
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/Release/notice.html b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/Release/notice.html
deleted file mode 100644
index c184ca3..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/Release/notice.html
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!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>Eclipse Foundation Software User Agreement</title>
-</head>
-
-<body lang="EN-US">
-<h2>Eclipse Foundation Software User Agreement</h2>
-<p>April 14, 2010</p>
-
-<h3>Usage Of Content</h3>
-
-<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-
-<h3>Applicable Licenses</h3>
-
-<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation 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 provided with this Content and is also 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>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
-   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-
-<ul>
-       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-      and/or Fragments associated with that Feature.</li>
-       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>
-
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-       <li>The top-level (root) directory</li>
-       <li>Plug-in and Fragment directories</li>
-       <li>Inside Plug-ins and Fragments packaged as JARs</li>
-       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-       <li>Feature directories</li>
-</ul>
-
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.</p>
-
-<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
-
-<ul>
-       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-</ul>
-
-<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
-
-
-<h3>Use of Provisioning Technology</h3>
-
-<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
-   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
-   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
-   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
-       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
-   (&quot;Specification&quot;).</p>
-
-<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
-   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
-   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
-   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
-
-<ol>
-       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
-       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
-       product.</li>
-       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
-       accessed and copied to the Target Machine.</li>
-       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
-       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
-       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
-       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
-       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
-</ol>
-
-<h3>Cryptography</h3>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-
-<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
-</body>
-</html>
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 3b6fb6c..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/IECrossfireInstaller/binaries/IECrossfireInstaller.msi b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/binaries/IECrossfireInstaller.msi
deleted file mode 100644
index b49959f..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/binaries/IECrossfireInstaller.msi
+++ /dev/null
Binary files differ
diff --git a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/binaries/setup.exe b/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/binaries/setup.exe
deleted file mode 100644
index 3b6fb6c..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireInstaller/binaries/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 2a57854..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/BrowserContext.rgs
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 12c828f..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireBPManager.cpp
+++ /dev/null
@@ -1,425 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 3e89df0..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireBPManager.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 449cb44..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireBreakpoint.cpp
+++ /dev/null
@@ -1,191 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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* result = new Value();
-	result->addObjectValue(KEY_HANDLE, &Value((double)m_handle));
-	result->addObjectValue(KEY_TYPE, &Value(getTypeString()));
-	if (!m_contextId) {
-		Value value_null;
-		value_null.setType(TYPE_NULL);
-		result->addObjectValue(KEY_CONTEXTID, &value_null);
-	} else {
-		result->addObjectValue(KEY_CONTEXTID, &Value(m_contextId));
-	}
-
-	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 5a5aa77..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireBreakpoint.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 cfbb674..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireContext.cpp
+++ /dev/null
@@ -1,2290 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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: onError */
-const wchar_t* CrossfireContext::EVENT_ONERROR = L"onError";
-const wchar_t* CrossfireContext::KEY_CATEGORY = L"category";
-const wchar_t* CrossfireContext::KEY_COLUMNNUMBER = L"columnNumber";
-const wchar_t* CrossfireContext::KEY_ERROR = L"error";
-const wchar_t* CrossfireContext::KEY_FILENAME = L"fileName";
-const wchar_t* CrossfireContext::KEY_LINENUMBER = L"lineNumber";
-const wchar_t* CrossfireContext::VALUE_JS = L"js";
-
-/* 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::multimap<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 */
-
-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;
-}
-
-void CrossfireContext::executionBreak(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 break 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.executionBreak(): 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.executionBreak(): 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.executionBreak(): GetCodeContext() failed", hr);
-		resumeFromBreak(BREAKRESUMEACTION_STEP_OUT);
-		return;
-	}
-
-	CComPtr<IDebugDocumentContext> documentContext = NULL;
-	hr = codeContext->GetDocumentContext(&documentContext);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.executionBreak(): GetDocumentContext() failed", hr);
-		resumeFromBreak(BREAKRESUMEACTION_STEP_OUT);
-		return;
-	}
-
-	CComPtr<IDebugDocument> document = NULL;
-	hr = documentContext->GetDocument(&document);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.executionBreak(): 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.executionBreak(): QueryInterface() failed", hr);
-		resumeFromBreak(BREAKRESUMEACTION_STEP_OUT);
-		return;
-	}
-
-	ULONG position, numChars;
-	hr = documentText->GetPositionOfContext(documentContext, &position, &numChars);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.executionBreak(): GetPositionOfContext() failed", hr);
-		resumeFromBreak(BREAKRESUMEACTION_STEP_OUT);
-		return;
-	}
-
-	ULONG lineNumber, column;
-	hr = documentText->GetLineOfPosition(position, &lineNumber, &column);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.executionBreak(): GetLineOfContext() failed", hr);
-		resumeFromBreak(BREAKRESUMEACTION_STEP_OUT);
-		return;
-	}
-	lineNumber++;
-
-	CComBSTR bstrUrl;
-	hr = document->GetName(DOCUMENTNAMETYPE_TITLE, &bstrUrl);
-	if (FAILED(hr)) {
-		Logger::error("CrossfireContext.executionBreak(): 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 breakEvent;
-	if (br == BREAKREASON_ERROR) {
-		/* broken out separately because this event object differs from the others */
-		breakEvent.setName(EVENT_ONERROR);
-		Value body;
-		Value error;
-		EXCEPINFO excepInfo;
-		HRESULT hr = pScriptErrorDebug->GetExceptionInfo(&excepInfo);
-		if (FAILED(hr)) {
-			Logger::error("IEDebugger::executionBreak(): GetExceptionInfo() failed", hr);
-		} else {
-			if (excepInfo.bstrDescription) {
-				error.addObjectValue(KEY_MESSAGE, &Value(excepInfo.bstrDescription));
-			}
-		}
-		error.addObjectValue(KEY_LINENUMBER, &Value((double)lineNumber));
-		error.addObjectValue(KEY_COLUMNNUMBER, &Value((double)column));
-		error.addObjectValue(KEY_FILENAME, &Value(url.getString()));
-		error.addObjectValue(KEY_CATEGORY, &Value(VALUE_JS));
-		body.addObjectValue(KEY_ERROR, &error);
-		breakEvent.setBody(&body);
-
-		/*
-		 * The Crossfire spec does not specify that the server should be left in a
-		 * suspended state when a JS error occurs, so it must be resumed here,
-		 * otherwise it will appear hung to the client.
-		 */
-		resumeFromBreak(BREAKRESUMEACTION_CONTINUE);
-	} else {
-		breakEvent.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_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);
-		breakEvent.setBody(&body);
-	}
-	sendEvent(&breakEvent);
-}
-
-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::multimap<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::multimap<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 {
-		// the following is intentionally commented
-		///*
-		// * 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;
-
-		return false;
-	}
-
-	if (!url.isValid()) {
-		return false;
-	}
-
-	if (!m_scriptNodes) {
-		m_scriptNodes = new std::multimap<std::wstring, IDebugApplicationNode*>;
-	}
-
-	// the following is intentionally commented
-	///*
-	// * 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;
-	//}
-
-	applicationNode->AddRef();
-	m_scriptNodes->insert(std::pair<std::wstring, IDebugApplicationNode*>(url.getString(), applicationNode));
-
-	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_AbortCallAndReturnErrorToCaller);
-	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();
-	}
-
-	if (!registerScript(applicationNode, false)) {
-		return 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) {
-		/*
-		 * m_scriptNodes can contain multiple values with the same key (url), so
-		 * start by creating a map containing only one entry per url key.
-		 */
-		std::map<std::wstring, IDebugApplicationNode*> distinctUrls;
-		std::multimap<std::wstring, IDebugApplicationNode*>::iterator iterator = m_scriptNodes->begin();
-		while (iterator != m_scriptNodes->end()) {
-			distinctUrls.insert(std::pair<std::wstring, IDebugApplicationNode*>(iterator->first, iterator->second));
-			iterator++;
-		}
-
-		std::map<std::wstring, IDebugApplicationNode*>::iterator distinctIterator = distinctUrls.begin();
-		while (distinctIterator != distinctUrls.end()) {
-			Value* value = NULL;
-			IDebugApplicationNode* node = distinctIterator->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;
-			}
-			distinctIterator++;
-		}
-	}
-
-	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 204693e..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireContext.h
+++ /dev/null
@@ -1,240 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 executionBreak(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::multimap<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: onError */
-	static const wchar_t* EVENT_ONERROR;
-	static const wchar_t* KEY_CATEGORY;
-	static const wchar_t* KEY_COLUMNNUMBER;
-	static const wchar_t* KEY_ERROR;
-	static const wchar_t* KEY_FILENAME;
-	static const wchar_t* KEY_LINENUMBER;
-	static const wchar_t* VALUE_JS;
-
-	/* 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 f06d36f..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireEvent.cpp
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 01dfbed..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireEvent.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 482d58c..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireLineBreakpoint.cpp
+++ /dev/null
@@ -1,218 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 dd61c97..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireLineBreakpoint.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 da954b8..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfirePacket.cpp
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 164feb8..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfirePacket.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 40b253a..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireProcessor.cpp
+++ /dev/null
@@ -1,243 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 2b313e0..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireProcessor.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 db8e8c5..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireRequest.cpp
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 be28541..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireRequest.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 49987aa..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireResponse.cpp
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 c57ed97..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireResponse.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 e68cc38..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServer.cpp
+++ /dev/null
@@ -1,956 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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.3a10";
-
-/* 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() {
-	delete m_bpManager;
-	m_bpManager = new CrossfireBPManager();
-
-	std::map<DWORD, IBrowserContext*>::iterator iterator = m_browsers->begin();
-	while (iterator != m_browsers->end()) {
-		iterator->second->Release();
-		iterator++;
-	}
-	m_browsers->clear();
-
-	m_connection->close();
-	delete m_connection;
-	m_connection = NULL;
-
-	std::map<DWORD, CrossfireContext*>::iterator iterator2 = m_contexts->begin();
-	while (iterator2 != m_contexts->end()) {
-		delete iterator2->second;
-		iterator2++;
-	}
-	m_contexts->clear();
-
-	std::vector<CrossfireEvent*>::iterator iterator3 = m_pendingEvents->begin();
-	while (iterator3 != m_pendingEvents->end()) {
-		delete *iterator3;
-		iterator3++;
-	}
-	m_pendingEvents->clear();
-
-	m_currentContextPID = 0;
-	m_handshakeReceived = false;
-	m_inProgressPacket->clear();
-	m_lastRequestSeq = -1;
-	m_port = -1;
-	m_processingRequest = false;
-}
-
-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 68fc031..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServer.h
+++ /dev/null
@@ -1,176 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 d52195d..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServer1.rgs
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 7eb2355..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServerClass.cpp
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 0fc41d8..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServerClass.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 badac3b..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/CrossfireServerClass.rgs
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 c6ecc55..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IBreakpointTarget.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 772494a..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.cpp
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 4a74139..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.idl
+++ /dev/null
@@ -1,145 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 bbd75bf..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, 2012.  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 5be28a5..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServer.rgs
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 292d1e4..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IECrossfireServerps.def
+++ /dev/null
@@ -1,20 +0,0 @@
-; *******************************************************************************
-; * Copyright (c) 2012 IBM Corporation and others.
-; * All rights reserved. This program and the accompanying materials
-; * are made available under the terms of the Eclipse Public License v1.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 de1f917..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IEDebugger.cpp
+++ /dev/null
@@ -1,248 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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->executionBreak(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 3fb6849..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IEDebugger.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 77c257c..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IEDebugger.rgs
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 a191553..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/IJSEvalHandler.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 85ceae8..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSEvalCallback.cpp
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 2f207195..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSEvalCallback.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 8f8317a..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSEvalCallback.rgs
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 2da8ed0..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSONParser.cpp
+++ /dev/null
@@ -1,505 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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_FALSE = L"false";
-const wchar_t* JSONParser::VALUE_NULL = L"null";
-const wchar_t* JSONParser::VALUE_TRUE = L"true";
-const wchar_t* JSONParser::VALUE_UNDEFINED = L"\"undefined\"";
-
-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: {
-			/* TYPE_UNDEFINED */
-			std::wstring* result = new std::wstring;
-			result->assign(VALUE_UNDEFINED);
-			*_jsonString = result;
-			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 de47e84..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/JSONParser.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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_FALSE;
-	static const wchar_t* VALUE_NULL;
-	static const wchar_t* VALUE_TRUE;
-	static const wchar_t* VALUE_UNDEFINED;
-};
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 f9be464..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/Logger.cpp
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 c164f59..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/Logger.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 82808bd..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/PendingScriptLoad.cpp
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 bb3e0af..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/PendingScriptLoad.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 a483f43..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/PendingScriptLoad.rgs
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 0274177..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/URL.cpp
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 12f99a2..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/URL.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 2619d34..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/Value.cpp
+++ /dev/null
@@ -1,405 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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;
-		}
-		default: {
-			/* TYPE_UNDEFINED */
-			Value* result = new Value();
-			result->setType(TYPE_UNDEFINED);
-			*_value = result;
-		}
-	}
-}
-
-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 f5173cd..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/Value.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 c4164b4..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/WindowsSocketConnection.cpp
+++ /dev/null
@@ -1,251 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 b4bb007..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/WindowsSocketConnection.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 f875a8d..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/resource.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 b334099..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/stdafx.cpp
+++ /dev/null
@@ -1,17 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 d6007fd..0000000
--- a/development/org.eclipse.wst.jsdt.debug.ie/IECrossfireServer/stdafx.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.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 d96c6dc..0000000
--- a/development/org.eclipse.wst.jsdt.debug.node/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.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,
- org.eclipse.wst.jsdt.debug.core;bundle-version="3.1.0"
-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 f0303ec..0000000
--- a/development/org.eclipse.wst.jsdt.debug.node/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,\
-               OSGI-INF/,\
-               plugin.xml
diff --git a/development/org.eclipse.wst.jsdt.debug.node/plugin.xml b/development/org.eclipse.wst.jsdt.debug.node/plugin.xml
deleted file mode 100644
index 2d645a5..0000000
--- a/development/org.eclipse.wst.jsdt.debug.node/plugin.xml
+++ /dev/null
@@ -1,26 +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.node.internal.launching.NodeLaunchConnector"
-            id="org.eclipse.wst.jsdt.debug.node.launching.connector">
-      </connector>
-   </extension>
-   <extension
-         point="org.eclipse.wst.jsdt.debug.core.launchingConnectors">
-      <connector
-            class="org.eclipse.wst.jsdt.debug.node.internal.launching.NodeAttachConnector"
-            id="org.eclipse.wst.jsdt.debug.node.attaching.connector">
-      </connector>
-   </extension>
-   <extension
-         point="org.eclipse.wst.jsdt.debug.core.launchingConnectors">
-      <connector
-            class="org.eclipse.wst.jsdt.debug.node.internal.launching.NodeListenConnector"
-            id="org.eclipse.wst.jsdt.debug.node.listening.connector">
-      </connector>
-   </extension>
-
-</plugin>
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.node/src/org/eclipse/wst/jsdt/debug/node/internal/launching/Messages.java b/development/org.eclipse.wst.jsdt.debug.node/src/org/eclipse/wst/jsdt/debug/node/internal/launching/Messages.java
deleted file mode 100644
index ad3d55c..0000000
--- a/development/org.eclipse.wst.jsdt.debug.node/src/org/eclipse/wst/jsdt/debug/node/internal/launching/Messages.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and 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.internal.launching;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * 
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.node.internal.launching.messages"; //$NON-NLS-1$
-	public static String NodeAttachConnector_0;
-	public static String NodeAttachConnector_1;
-	public static String NodeLaunchConnector_0;
-	public static String NodeLaunchConnector_1;
-	public static String NodeListenConnector_0;
-	public static String NodeListenConnector_1;
-	public static String NodeListenConnector_2;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.node/src/org/eclipse/wst/jsdt/debug/node/internal/launching/NodeAttachConnector.java b/development/org.eclipse.wst.jsdt.debug.node/src/org/eclipse/wst/jsdt/debug/node/internal/launching/NodeAttachConnector.java
deleted file mode 100644
index 7c4be50..0000000
--- a/development/org.eclipse.wst.jsdt.debug.node/src/org/eclipse/wst/jsdt/debug/node/internal/launching/NodeAttachConnector.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and 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.internal.launching;
-
-import java.io.IOException;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.AttachingConnector;
-
-/**
- * {@link AttachingConnector} for Node
- */
-public class NodeAttachConnector implements AttachingConnector {
-
-	public static final String CONNECTOR_ID = "org.eclipse.wst.jsdt.debug.node.attaching.connector"; //$NON-NLS-1$
-	
-	/**
-	 * Constructor
-	 */
-	public NodeAttachConnector() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#defaultArguments()
-	 */
-	public Map defaultArguments() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#description()
-	 */
-	public String description() {
-		return Messages.NodeAttachConnector_0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#name()
-	 */
-	public String name() {
-		return Messages.NodeAttachConnector_1;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#id()
-	 */
-	public String id() {
-		return CONNECTOR_ID;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.AttachingConnector#attach(java.util.Map)
-	 */
-	public VirtualMachine attach(Map arguments) throws IOException {
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.node/src/org/eclipse/wst/jsdt/debug/node/internal/launching/NodeLaunchConnector.java b/development/org.eclipse.wst.jsdt.debug.node/src/org/eclipse/wst/jsdt/debug/node/internal/launching/NodeLaunchConnector.java
deleted file mode 100644
index 8df0c22..0000000
--- a/development/org.eclipse.wst.jsdt.debug.node/src/org/eclipse/wst/jsdt/debug/node/internal/launching/NodeLaunchConnector.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and 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.internal.launching;
-
-import java.io.IOException;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.LaunchingConnector;
-
-/**
- * {@link LaunchingConnector} for Node
- */
-public class NodeLaunchConnector implements LaunchingConnector {
-
-	public static final String CONNECTOR_ID = "org.eclipse.wst.jsdt.debug.node.launching.connector"; //$NON-NLS-1$
-	
-	/**
-	 * Constructor
-	 */
-	public NodeLaunchConnector() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#defaultArguments()
-	 */
-	public Map defaultArguments() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#description()
-	 */
-	public String description() {
-		return Messages.NodeLaunchConnector_0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#name()
-	 */
-	public String name() {
-		return Messages.NodeLaunchConnector_1;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#id()
-	 */
-	public String id() {
-		return CONNECTOR_ID;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.LaunchingConnector#launch(java.util.Map)
-	 */
-	public VirtualMachine launch(Map arguments) throws IOException {
-		return null;
-	}
-}
diff --git a/development/org.eclipse.wst.jsdt.debug.node/src/org/eclipse/wst/jsdt/debug/node/internal/launching/NodeListenConnector.java b/development/org.eclipse.wst.jsdt.debug.node/src/org/eclipse/wst/jsdt/debug/node/internal/launching/NodeListenConnector.java
deleted file mode 100644
index 5201d1a..0000000
--- a/development/org.eclipse.wst.jsdt.debug.node/src/org/eclipse/wst/jsdt/debug/node/internal/launching/NodeListenConnector.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and 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.internal.launching;
-
-import java.io.IOException;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.ListeningConnector;
-
-/**
- * {@link ListeningConnector} for Node.js
- */
-public class NodeListenConnector implements ListeningConnector {
-
-	public static final String CONNECTOR_ID = "org.eclipse.wst.jsdt.debug.node.listening.connector"; //$NON-NLS-1$
-	
-	/**
-	 * Constructor
-	 */
-	public NodeListenConnector() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#defaultArguments()
-	 */
-	public Map defaultArguments() {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#description()
-	 */
-	public String description() {
-		return Messages.NodeListenConnector_1;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#name()
-	 */
-	public String name() {
-		return Messages.NodeListenConnector_2;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#id()
-	 */
-	public String id() {
-		return 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 {
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/development/org.eclipse.wst.jsdt.debug.node/src/org/eclipse/wst/jsdt/debug/node/internal/launching/messages.properties b/development/org.eclipse.wst.jsdt.debug.node/src/org/eclipse/wst/jsdt/debug/node/internal/launching/messages.properties
deleted file mode 100644
index 04a2ffd..0000000
--- a/development/org.eclipse.wst.jsdt.debug.node/src/org/eclipse/wst/jsdt/debug/node/internal/launching/messages.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-NodeAttachConnector_0=Attach to a remote Node.js runtime
-NodeAttachConnector_1=Node.js Attach
-NodeLaunchConnector_0=Launch Node.js
-NodeLaunchConnector_1=Node.js Launch
-NodeListenConnector_1=Listen for a connection from a Node.js runtime
-NodeListenConnector_2=Node.js Listen
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
