<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
          xmlns:xse="http://schemas.microsoft.com/wix/2005/XmlSchemaExtension"
         xmlns:html="http://www.w3.org/1999/xhtml"
    targetNamespace="http://schemas.microsoft.com/wix/2003/01/wi"
              xmlns="http://schemas.microsoft.com/wix/2003/01/wi">
    <xs:annotation>
        <xs:documentation>
            Copyright (c) Microsoft Corporation.  All rights reserved.
            
            The use and distribution terms for this software are covered by the
            Common Public License 1.0 (http://opensource.org/licenses/cpl.php)
            which can be found in the file CPL.TXT at the root of this distribution.
            By using this software in any fashion, you are agreeing to be bound by
            the terms of this license.
            
            You must not remove this notice, or any other, from this software.

            Schema for describing Windows Installer database files (.msi/.msm/.pcp).
        </xs:documentation>
    </xs:annotation>

    <xs:import namespace="http://www.w3.org/1999/xhtml" />

    <xs:element name="Wix">
        <xs:annotation><xs:documentation>
            This is the top-level container element for every wxs file.  Amongst the possible children,
            the Product, Module, and PatchCreation elements are analogous to the main function in a C program.
            There can only be one of these present when linking occurs.  Product compiles into an msi file,
            Module compiles into an msm file, PatchCreation compiles into a pcp file.  The Fragment element
            is an atomic unit which ultimately links into either a Product, Module, or PatchCreation.  The
            Fragment can either be completely included or excluded during linking.
        </xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="1">
                <xs:sequence>
                    <xs:choice minOccurs="0">
                        <xs:element ref="Product"/>
                        <xs:element ref="Module"/>
                    </xs:choice>
                    <xs:element ref="Fragment" minOccurs="0" maxOccurs="unbounded"/>
                </xs:sequence>
                <xs:element ref="PatchCreation"/>
            </xs:choice>
            <xs:attribute name="RequiredVersion" type="VersionType">
                <xs:annotation>
                    <xs:documentation>Required version of the WiX toolset to compile this input file.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="Include">
        <xs:annotation><xs:documentation>
            This is the top-level container element for every wxi file.
        </xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="AppId"/>
                <xs:element ref="Binary"/>
                <xs:element ref="Category"/>
                <xs:element ref="Class"/>
                <xs:element ref="ComplianceCheck"/>
                <xs:element ref="Condition"/>
                <xs:element ref="CopyFile"/>
                <xs:element ref="CreateFolder"/>
                <xs:element ref="CustomAction"/>
                <xs:element ref="CustomActionRef"/>
                <xs:element ref="CustomTable"/>
                <xs:element ref="Directory"/>
                <xs:element ref="DirectoryRef"/>
                <xs:element ref="EnsureTable"/>
                <xs:element ref="Environment"/>
                <xs:element ref="Extension"/>
                <xs:element ref="Feature"/>
                <xs:element ref="FeatureRef"/>
                <xs:element ref="File"/>
                <xs:element ref="IniFile"/>
                <xs:element ref="Interface"/>
                <xs:element ref="IsolateComponent"/>
                <xs:element ref="FragmentRef"/>
                <xs:element ref="Group"/>
                <xs:element ref="Icon"/>
                <xs:element ref="Media"/>
                <xs:element ref="ODBCDataSource"/>
                <xs:element ref="ODBCDriver"/>
                <xs:element ref="ODBCTranslator"/>
                <xs:element ref="ProgId"/>
                <xs:element ref="Property"/>
                <xs:element ref="PropertyRef"/>
                <xs:element ref="Registry"/>
                <xs:element ref="RemoveFile"/>
                <xs:element ref="RemoveFolder"/>
                <xs:element ref="ReserveCost"/>
                <xs:element ref="ServiceControl"/>
                <xs:element ref="ServiceInstall"/>
                <xs:element ref="SFPCatalog"/>
                <xs:element ref="Shortcut"/>
                <xs:element ref="SqlDatabase"/>
                <xs:element ref="TypeLib"/>
                <xs:element ref="Upgrade"/>
                <xs:element ref="UI"/>
                <xs:element ref="UIRef"/>
                <xs:element ref="User"/>
                <xs:element ref="WebApplication"/>
                <xs:element ref="WebAppPool"/>
                <xs:element ref="WebDirProperties"/>
                <xs:element ref="WebLog"/>
                <xs:element ref="WebSite"/>
                <!-- server elements -->
                <xs:element ref="Certificate"/>
                <xs:element ref="FileShare"/>
                <xs:element ref="ServiceConfig"/>
                <xs:element ref="SqlScript"/>
                <xs:element ref="SqlString"/>
                <xs:element ref="WebDir"/>
                <xs:element ref="WebFilter"/>
                <xs:element ref="WebProperty"/>
                <xs:element ref="WebServiceExtension"/>
                <xs:element ref="WebVirtualDir"/>
                <xs:sequence>
                    <xs:element ref="InstallExecuteSequence" minOccurs="0"/>
                    <xs:element ref="InstallUISequence" minOccurs="0"/>
                    <xs:element ref="AdminExecuteSequence" minOccurs="0"/>
                    <xs:element ref="AdminUISequence" minOccurs="0"/>
                    <xs:element ref="AdvertiseExecuteSequence" minOccurs="0"/>
                </xs:sequence>
            </xs:choice>
        </xs:complexType>
    </xs:element>

    <xs:element name="Product">
        <xs:annotation>
            <xs:documentation>
                The Product element is analogous to the main function in a C program.  When linking, only one Product section
                can be given to the linker to produce a successful result.  Using this element creates an msi file.
            </xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Package" minOccurs="1" />
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                    <xs:element ref="AppId"/>
                    <xs:element ref="Binary"/>
                    <xs:element ref="ComplianceCheck"/>
                    <xs:element ref="Condition"/>
                    <xs:element ref="CustomAction"/>
                    <xs:element ref="CustomActionRef"/>
                    <xs:element ref="CustomTable"/>
                    <xs:element ref="Directory"/>
                    <xs:element ref="DirectoryRef"/>
                    <xs:element ref="EnsureTable"/>
                    <xs:element ref="Feature"/>
                    <xs:element ref="FeatureRef"/>
                    <xs:element ref="FragmentRef"/>
                    <xs:element ref="Group"/>
                    <xs:element ref="Icon"/>
                    <xs:element ref="Media"/>
                    <xs:element ref="Property"/>
                    <xs:element ref="PropertyRef"/>
                    <xs:element ref="SFPCatalog"/>
                    <xs:element ref="SqlDatabase"/>
                    <xs:element ref="Upgrade"/>
                    <xs:element ref="UI"/>
                    <xs:element ref="UIRef"/>
                    <xs:element ref="User"/>
                    <xs:element ref="WebApplication"/>
                    <xs:element ref="WebAppPool"/>
                    <xs:element ref="WebDirProperties"/>
                    <xs:element ref="WebLog"/>
                    <xs:element ref="WebSite"/>
                    <xs:sequence>
                        <xs:element ref="InstallExecuteSequence" minOccurs="0"/>
                        <xs:element ref="InstallUISequence" minOccurs="0"/>
                        <xs:element ref="AdminExecuteSequence" minOccurs="0"/>
                        <xs:element ref="AdminUISequence" minOccurs="0"/>
                        <xs:element ref="AdvertiseExecuteSequence" minOccurs="0"/>
                    </xs:sequence>
                    <xs:any namespace="##other" processContents="lax">
                        <xs:annotation><xs:documentation>
                            Extensibility point in the WiX XML Schema.  Schema extensions can register additional
                            elements at this point in the schema.
                        </xs:documentation></xs:annotation>
                    </xs:any>
                </xs:choice>
            </xs:sequence>

            <xs:attribute name="Id" type="autogenuuid" use="required">
                <xs:annotation>
                    <xs:documentation>The product code GUID for the product.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Codepage" type="xs:integer">
                <xs:annotation>
                    <xs:documentation>The codepage for the resulting MSI.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Language" type="LocalizableInteger" use="required">
                <xs:annotation>
                    <xs:documentation>The decimal language ID (LCID) for the product.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Manufacturer" type="xs:string" use="required">
                <xs:annotation>
                    <xs:documentation>The manufacturer of the product.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Name" type="xs:string" use="required">
                <xs:annotation>
                    <xs:documentation>The descriptive name of the product.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="UpgradeCode" type="uuid">
                <xs:annotation>
                    <xs:documentation>The upgrade code GUID for the product.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Version" type="xs:string" use="required">
                <xs:annotation>
                    <xs:documentation>The product's version string.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:anyAttribute namespace="##other" processContents="lax">
                <xs:annotation><xs:documentation>
                    Extensibility point in the WiX XML Schema.  Schema extensions can register additional
                    attributes at this point in the schema.
                </xs:documentation></xs:annotation>
            </xs:anyAttribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="Module">
        <xs:annotation><xs:documentation>
            The Module element is analogous to the main function in a C program.  When linking, only
            one Module section can be given to the linker to produce a successful result.  Using this
            element creates an msm file.
        </xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Package" minOccurs="1"/>
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                    <xs:element ref="AppId"/>
                    <xs:element ref="Binary"/>
                    <xs:element ref="ComponentGroupRef"/>
                    <xs:element ref="ComponentRef"/>
                    <xs:element ref="Configuration"/>
                    <xs:element ref="CustomAction"/>
                    <xs:element ref="CustomActionRef"/>
                    <xs:element ref="CustomTable"/>
                    <xs:element ref="Dependency"/>
                    <xs:element ref="Directory"/>
                    <xs:element ref="DirectoryRef"/>
                    <xs:element ref="EnsureTable"/>
                    <xs:element ref="Exclusion"/>
                    <xs:element ref="FragmentRef"/>
                    <xs:element ref="Group"/>
                    <xs:element ref="Icon"/>
                    <xs:element ref="IgnoreModularization"/>
                    <xs:element ref="Property"/>
                    <xs:element ref="PropertyRef"/>
                    <xs:element ref="SFPCatalog"/>
                    <xs:element ref="SqlDatabase"/>
                    <xs:element ref="Substitution"/>
                    <xs:element ref="UI"/>
                    <xs:element ref="UIRef"/>
                    <xs:element ref="User"/>
                    <xs:element ref="WebApplication"/>
                    <xs:element ref="WebAppPool"/>
                    <xs:element ref="WebDirProperties"/>
                    <xs:element ref="WebLog"/>
                    <xs:element ref="WebSite"/>
                    <xs:sequence>
                        <xs:element ref="InstallExecuteSequence" minOccurs="0"/>
                        <xs:element ref="InstallUISequence" minOccurs="0"/>
                        <xs:element ref="AdminExecuteSequence" minOccurs="0"/>
                        <xs:element ref="AdminUISequence" minOccurs="0"/>
                        <xs:element ref="AdvertiseExecuteSequence" minOccurs="0"/>
                    </xs:sequence>
                    <xs:any namespace="##other" processContents="lax">
                        <xs:annotation><xs:documentation>
                            Extensibility point in the WiX XML Schema.  Schema extensions can register additional
                            elements at this point in the schema.
                        </xs:documentation></xs:annotation>
                    </xs:any>
                </xs:choice>
            </xs:sequence>

            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation>
                    <xs:documentation>The name of the merge module (not the file name).</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Codepage" type="xs:integer">
                <xs:annotation>
                    <xs:documentation>The codepage of the merge module.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Guid" type="uuid" use="required">
                <xs:annotation>
                    <xs:documentation>The product code GUID of the merge module.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Language" type="LocalizableInteger" use="required">
                <xs:annotation>
                    <xs:documentation>The decimal language ID (LCID) of the merge module.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Version" type="xs:string" use="required">
                <xs:annotation>
                    <xs:documentation>The product version string of the merge module.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="Dependency">
        <xs:annotation>
            <xs:documentation>Declares a dependency on another merge module.</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="RequiredId" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Identifier of the merge module required by the merge module.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="RequiredLanguage" type="xs:integer" use="required">
                <xs:annotation><xs:documentation>Numeric language ID of the merge module in RequiredID.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="RequiredVersion" type="xs:string">
                <xs:annotation><xs:documentation>Version of the merge module in RequiredID.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="Exclusion">
        <xs:annotation>
            <xs:documentation>Declares a merge module with which this merge module is incompatible.</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="ExcludedId" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Identifier of the merge module that is incompatible.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="ExcludeExceptLanguage" type="xs:integer">
                <xs:annotation><xs:documentation>Numeric language ID of the merge module in ExcludedID. All except this language will be excluded. Only one of ExcludeExceptLanguage and ExcludeLanguage may be specified.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="ExcludeLanguage" type="xs:integer">
                <xs:annotation><xs:documentation>Numeric language ID of the merge module in ExcludedID. The specified language will be excluded. Only one of ExcludeExceptLanguage and ExcludeLanguage may be specified.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="ExcludedMinVersion" type="xs:string">
                <xs:annotation><xs:documentation>Minimum version excluded from a range. If not set, all versions before max are excluded. If neither max nor min, no exclusion based on version.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="ExcludedMaxVersion" type="xs:string">
                <xs:annotation><xs:documentation>Maximum version excluded from a range. If not set, all versions after min are excluded. If neither max nor min, no exclusion based on version.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="Configuration">
        <xs:annotation>
            <xs:documentation>Defines the configurable attributes of merge module.</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Name" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Defines the name of the configurable item.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Format" use="required">
                <xs:annotation><xs:documentation>Specifies the format of the data being changed.</xs:documentation></xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="Text"/>
                        <xs:enumeration value="Key"/>
                        <xs:enumeration value="Integer"/>
                        <xs:enumeration value="Bitfield"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="Type" type="xs:string">
                <xs:annotation><xs:documentation>Specifies the type of the data being changed.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="ContextData" type="xs:string">
                <xs:annotation><xs:documentation>Specifies a semantic context for the requested data.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="DefaultValue" type="xs:string">
                <xs:annotation><xs:documentation>Specifies a default value for the item in this record if the merge tool declines to provide a value.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="KeyNoOrphan" type="YesNoType">
                <xs:annotation><xs:documentation>Does not merge rule according to rules in MSI SDK.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="NonNullable" type="YesNoType">
                <xs:annotation><xs:documentation>If yes, null is not a valid entry.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="DisplayName" type="xs:string">
                <xs:annotation><xs:documentation>Display name for authoring.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Description" type="xs:string">
                <xs:annotation><xs:documentation>Description for authoring.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="HelpLocation" type="xs:string">
                <xs:annotation><xs:documentation>Location of chm file for authoring.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="HelpKeyword" type="xs:string">
                <xs:annotation><xs:documentation>Keyword into chm file for authoring.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    
    <xs:element name="Substitution">
        <xs:annotation>
            <xs:documentation>Specifies the configurable fields of a module database and provides a template for the configuration of each field.</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Table" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Specifies the name of the table being modified in the module database.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Row" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Specifies the primary keys of the target row in the table named in the Table column. If multiple keys, separated by semicolons.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Column" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Specifies the target column in the row named in the Row column.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Value" type="xs:string">
                <xs:annotation><xs:documentation>Provides a formatting template for the data being substituted into the target field specified by Table, Row, and Column.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="Fragment">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="FragmentRef"/>
            </xs:appinfo>
            <xs:documentation>
                The Fragment element is the building block of creating an installer database in WiX.  Once defined,
                the Fragment becomes an immutable, atomic unit which can either be completely included or excluded
                from a product.  The contents of a Fragment element can be linked into a product by utilizing one
                of the many *Ref elements.  When linking in a Fragment, it will be necessary to link in all of its
                individual units.  For instance, if a given Fragment contains two Component elements, you must link
                both under features using ComponentRef for each linked Component.  Otherwise, you will get a linker
                warning and have a floating Component that does not appear under any Feature.
            </xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                    <xs:element ref="AppId"/>
                    <xs:element ref="Binary"/>
                    <xs:element ref="ComplianceCheck"/>
                    <xs:element ref="ComponentGroup"/>
                    <xs:element ref="Condition"/>
                    <xs:element ref="CustomAction"/>
                    <xs:element ref="CustomActionRef"/>
                    <xs:element ref="CustomTable"/>
                    <xs:element ref="Directory"/>
                    <xs:element ref="DirectoryRef"/>
                    <xs:element ref="EnsureTable"/>
                    <xs:element ref="Feature"/>
                    <xs:element ref="FeatureRef"/>
                    <xs:element ref="FragmentRef"/>
                    <xs:element ref="Group"/>
                    <xs:element ref="Icon"/>
                    <xs:element ref="IgnoreModularization"/>
                    <xs:element ref="Media"/>
                    <xs:element ref="Property"/>
                    <xs:element ref="PropertyRef"/>
                    <xs:element ref="SFPCatalog"/>
                    <xs:element ref="SqlDatabase"/>
                    <xs:element ref="UI"/>
                    <xs:element ref="UIRef"/>
                    <xs:element ref="Upgrade"/>
                    <xs:element ref="User"/>
                    <xs:element ref="WebApplication"/>
                    <xs:element ref="WebAppPool"/>
                    <xs:element ref="WebDirProperties"/>
                    <xs:element ref="WebLog"/>
                    <xs:element ref="WebSite"/>
                    <xs:sequence>
                        <xs:element ref="InstallExecuteSequence" minOccurs="0"/>
                        <xs:element ref="InstallUISequence" minOccurs="0"/>
                        <xs:element ref="AdminExecuteSequence" minOccurs="0"/>
                        <xs:element ref="AdminUISequence" minOccurs="0"/>
                        <xs:element ref="AdvertiseExecuteSequence" minOccurs="0"/>
                    </xs:sequence>
                    <xs:any namespace="##other" processContents="lax">
                        <xs:annotation><xs:documentation>
                            Extensibility point in the WiX XML Schema.  Schema extensions can register additional
                            elements at this point in the schema.
                        </xs:documentation></xs:annotation>
                    </xs:any>
                </xs:choice>
            </xs:sequence>

            <xs:attribute name="Id" type="xs:string">
                <xs:annotation><xs:documentation>
                    Optional identifier for a Fragment.  Should only be used if you plan to refer to this Fragment
                    via a FragmentRef element elsewhere.
                </xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="PatchCreation">
        <xs:annotation><xs:documentation>
            The PatchCreation element is analogous to the main function in a C program.  When linking, only one PatchCreation section
            can be given to the linker to produce a successful result.  Using this element creates a pcp file.
        </xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="PatchInformation" minOccurs="1" maxOccurs="1"/>
                <xs:element ref="PatchMetadata" minOccurs="0" maxOccurs="1"/>
                <xs:element ref="Family" minOccurs="1" maxOccurs="unbounded"/>
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                    <xs:element ref="PatchProperty"/>
                    <xs:element ref="PatchSequence"/>
                    <xs:element ref="ReplacePatch"/>
                    <xs:element ref="TargetProductCode"/>
                </xs:choice>
            </xs:sequence>
        
            <xs:attribute name="Id" type="uuid" use="required">
                <xs:annotation><xs:documentation>Guid for this patch.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Codepage" type="xs:integer">
                <xs:annotation>
                    <xs:documentation>The codepage for the resulting PCP.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="OutputPath" type="xs:string">
                <xs:annotation><xs:documentation>Output patch for patchwiz.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="WholeFilesOnly" type="YesNoType">
                <xs:annotation><xs:documentation>Changing files should be included in their entirety.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="SourceList" type="xs:string">
                <xs:annotation><xs:documentation>Used to locate the .msp file for the patch if the cached copy is unavailable.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="AllowProductCodeMismatches" type="YesNoType">
                <xs:annotation><xs:documentation>ProductCode property may differ between UpgradedImages table and TargetImages table.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="AllowMajorVersionMismatches" type="YesNoType">
                <xs:annotation><xs:documentation>True if ProductVersion property may differ by a major version.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="CleanWorkingFolder" type="YesNoType">
                <xs:annotation><xs:documentation>Whether patchwiz should clean the temp folder when finished.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="SymbolFlags" type="xs:int">
                <xs:annotation><xs:documentation>Symbol flags.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="PatchInformation">
        <xs:annotation>
            <xs:documentation>Properties about the patch to be placed in the Summary Information Stream.  These are visible from COM through the IStream interface, and these properties can be seen on the package in Explorer.</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Description" type="xs:string">
                <xs:annotation>
                    <xs:documentation>Product full name or description</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Platforms" type="xs:string">
                <xs:annotation>
                    <xs:documentation>List of platforms supported in package</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Languages" type="xs:string">
                <xs:annotation>
                    <xs:documentation>List of language IDs supported in package</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Manufacturer" type="xs:string">
                <xs:annotation>
                    <xs:documentation>Vendor releasing the package</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Keywords" type="xs:string">
                <xs:annotation>
                    <xs:documentation>Optional keywords for browsing</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Comments" type="xs:string">
                <xs:annotation>
                    <xs:documentation>Optional comments for browsing</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="ReadOnly" type="YesNoDefaultType">
                <xs:annotation>
                    <xs:documentation>
                        The value of this attribute conveys whether the package should be opened as read-only.
                        A database editing tool should not modify a read-only enforced database and should
                        issue a warning at attempts to modify a read-only recommended database.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="SummaryCodepage" type="LocalizableInteger">
                <xs:annotation>
                    <xs:documentation>The codepage for summary info strings only.  The language neutral codepage, zero, is not a valid value.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="ShortNames" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>Short filenames on source</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Compressed" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>Compressed files on source</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="AdminImage" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>Source is an admin image</xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="PatchMetadata">
        <xs:annotation>
            <xs:documentation>Properties about the patch to be placed in the PatchMetadata table.</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:choice>
                <xs:element ref="CustomProperty" minOccurs="0">
                    <xs:annotation><xs:documentation>A custom property that extends the standard set.</xs:documentation></xs:annotation>
                </xs:element>
            </xs:choice>

            <xs:attribute name="AllowRemoval" type="YesNoType" use="required">
                <xs:annotation>
                    <xs:documentation>Whether this is an uninstallable patch.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Classification" use="required">
                <xs:annotation>
                    <xs:documentation>Category of updates.</xs:documentation>
                </xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="Critical Update"/>
                        <xs:enumeration value="Hotfix"/>
                        <xs:enumeration value="Security Rollup"/>
                        <xs:enumeration value="Service Pack"/>
                        <xs:enumeration value="Update"/>
                        <xs:enumeration value="Update Rollup"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="CreationTimeUTC" type="xs:string">
                <xs:annotation>
                    <xs:documentation>Creation time of the .msp file in the form mm:dd:yy:HH:MM (month: day : year : hour : minute).</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Description" type="xs:string" use="required">
                <xs:annotation>
                    <xs:documentation>Description of the patch.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="DisplayName" type="xs:string" use="required">
                <xs:annotation>
                    <xs:documentation>A title for the patch that is suitable for public display. In Add/Remove Programs from XP SP2 on.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="ManufacturerName" type="xs:string" use="required">
                <xs:annotation>
                    <xs:documentation>Name of the manufacturer.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="MinorUpdateTargetRTM" type="xs:string">
                <xs:annotation><xs:documentation>
                    Indicates that the patch targets the RTM version of the product or the most recent major
                    upgrade patch.  Author this optional property in minor update patches that contain sequencing
                    information to indicate that the patch removes all patches up to the RTM version of the
                    product, or up to the most recent major upgrade patch.  This property is available beginning
                    with Windows Installer 3.1.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="MoreInfoURL" type="xs:string">
                <xs:annotation>
                    <xs:documentation>A URL that provides information specific to this patch.  In Add/Remove Programs from XP SP2 on.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="OptimizedInstallMode" type="YesNoType">
                <xs:annotation><xs:documentation>
                    If this attribute is set to 'yes' in all the patches to be applied in a transaction, the
                    application of the patch is optimized if possible.  Available beginning with Windows Installer 3.1.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="TargetProductName" type="xs:string" use="required">
                <xs:annotation>
                    <xs:documentation>Name of the application or target product suite.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="CustomProperty">
        <xs:annotation><xs:documentation>A custom property for the PatchMetadata table.</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:attribute name="Company" type="xs:string" use="required">
                <xs:annotation>
                    <xs:documentation>The name of the company.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Property" type="xs:string" use="required">
                <xs:annotation>
                    <xs:documentation>The name of the metadata property.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Value" type="xs:string" use="required">
                <xs:annotation>
                    <xs:documentation>Value of the metadata property.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="ReplacePatch">
        <xs:annotation><xs:documentation>A patch that is deprecated by this patch.</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" type="uuid" use="required">
                <xs:annotation>
                    <xs:documentation>Patch GUID to be unregistered if it exists on the machine targeted by this patch.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="TargetProductCode">
        <xs:annotation>
            <xs:documentation>
                A product code for a product that may receive this patch (or '*' for all products).
            </xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation>
                    <xs:documentation>
                        The product code for a product that can receive this patch (or '*' for all products).
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    
    <xs:element name="PatchProperty">
        <xs:annotation><xs:documentation>A property for this patch database.</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:attribute name="Name" type="xs:string" use="required">
                <xs:annotation>
                    <xs:documentation>Name of the patch creation property.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Value" type="xs:string" use="required">
                <xs:annotation>
                    <xs:documentation>Value of the patch creation property.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    
    <xs:element name="PatchSequence">
        <xs:annotation><xs:documentation>Sequence information for this patch database. Sequence information is generated automatically in most cases, and rarely needs to be set explicitly.</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:attribute name="PatchFamily" type="xs:string" use="required">
                <xs:annotation>
                    <xs:documentation>Identifier which indicates one of the sequence families to which this patch belongs.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Target" type="xs:string">
                <xs:annotation>
                    <xs:documentation>Used to determine the product code filtering for the patch family.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Sequence" type="xs:string">
                <xs:annotation>
                    <xs:documentation>Used to populate the sequence column of the MsiPatchSequence table in the final MSP file. Specified in x.x.x.x format. See documentation for Sequence column of MsiPatchSequence table in MSI SDK.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Supersede" type="xs:integer">
                <xs:annotation>
                    <xs:documentation>Non-NULL value indicates that this patch supersedes earlier patches in this family. See documentation for Attributes column of MsiPatchSequence table in MSI SDK.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="Family">
        <xs:annotation><xs:documentation>Group of one or more upgraded images of a product.</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="UpgradeImage" minOccurs="1" maxOccurs="unbounded"/>
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                    <xs:element ref="ExternalFile"/>
                    <xs:element ref="ProtectFile"/>
                </xs:choice>
            </xs:sequence>

            <xs:attribute name="DiskId" type="xs:int">
                <xs:annotation><xs:documentation>Entered into the DiskId field of the new Media table record.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="DiskPrompt" type="xs:string">
                <xs:annotation><xs:documentation>Value to display in the "[1]" of the DiskPrompt Property.  Using this attribute will require you to define a DiskPrompt Property.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="MediaSrcProp" type="xs:string">
                <xs:annotation><xs:documentation>Entered into the Source field of the new Media table entry of the upgraded image.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Name" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Identifier for the family.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="SequenceStart" type="xs:int">
                <xs:annotation><xs:documentation>Sequence number for the starting file.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="VolumeLabel" type="xs:string">
                <xs:annotation><xs:documentation>Entered into the VolumeLabel field of the new Media table record.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    
    <xs:element name="UpgradeImage">
        <xs:annotation><xs:documentation>Contains information about the upgraded images of the product.</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="TargetImage" minOccurs="1" maxOccurs="unbounded"/>
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                    <xs:element ref="SymbolPath"/>
                    <xs:element ref="UpgradeFile"/>
                </xs:choice>
            </xs:sequence>
            
            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Identifier to connect target images with upgraded image.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="SourceFile" type="xs:string">
                <xs:annotation><xs:documentation>Full path to location of msi file for upgraded image.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="src" type="xs:string">
                <xs:annotation>
                    <xs:appinfo>
                        <xse:deprecated ref="SourceFile" />
                    </xs:appinfo>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="SourcePatch" type="xs:string">
                <xs:annotation><xs:documentation>Modified copy of the upgraded installation database that contains additional authoring specific to patching.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="srcPatch" type="xs:string">
                <xs:annotation>
                    <xs:appinfo>
                        <xse:deprecated ref="SourcePatch" />
                    </xs:appinfo>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    
    <xs:element name="TargetImage">
        <xs:annotation><xs:documentation>Contains information about the target images of the product.</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="SymbolPath"/>
                <xs:element ref="TargetFile"/>
            </xs:choice>

            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Identifier for the target image.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="SourceFile" type="xs:string">
                <xs:annotation><xs:documentation>Full path to the location of the msi file for the target image.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="src" type="xs:string">
                <xs:annotation>
                    <xs:appinfo>
                        <xse:deprecated ref="SourceFile" />
                    </xs:appinfo>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Order" type="xs:int" use="required">
                <xs:annotation><xs:documentation>Relative order of the target image.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Validation" type="xs:string">
                <xs:annotation><xs:documentation>Product checking to avoid applying irrelevant transforms.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="IgnoreMissingFiles" type="YesNoType">
                <xs:annotation><xs:documentation>Files missing from the target image are ignored by the installer.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    
    <xs:element name="TargetFile">
        <xs:annotation><xs:documentation>Information about specific files in a target image.</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="SymbolPath" minOccurs="0" maxOccurs="1"/>
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                    <xs:element ref="IgnoreRange"/>
                    <xs:element ref="ProtectRange"/>
                </xs:choice>
            </xs:sequence>
            
            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Foreign key into the File table.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    
    <xs:element name="IgnoreRange">
        <xs:annotation><xs:documentation>Specifies part of a file that is to be ignored during patching.</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:attribute name="Offset" type="xs:int" use="required">
                <xs:annotation><xs:documentation>Offset of the start of the range.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Length" type="xs:int" use="required">
                <xs:annotation><xs:documentation>Length of the range.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="ProtectRange">
        <xs:annotation><xs:documentation>Specifies part of a file that cannot be overwritten during patching.</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:attribute name="Offset" type="xs:int" use="required">
                <xs:annotation><xs:documentation>Offset of the start of the range.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Length" type="xs:int" use="required">
                <xs:annotation><xs:documentation>Length of the range.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="ProtectFile">
        <xs:annotation><xs:documentation>Specifies a file to be protected.</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="ProtectRange"/>
            </xs:choice>

            <xs:attribute name="File" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Foreign key into the File table.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="ExternalFile">
        <xs:annotation><xs:documentation>Contains information about specific files that are not part of a regular target image.</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="ProtectRange" minOccurs="1" maxOccurs="unbounded"/>
                <xs:element ref="SymbolPath" minOccurs="1" maxOccurs="unbounded"/>
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                    <xs:element ref="IgnoreRange"/>
                </xs:choice>
            </xs:sequence>
            
            <xs:attribute name="File" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Foreign key into the File table.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Source" type="xs:string">
                <xs:annotation><xs:documentation>Full path of the external file.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="src" type="xs:string">
                <xs:annotation>
                    <xs:appinfo>
                        <xse:deprecated ref="Source" />
                    </xs:appinfo>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Order" type="xs:int" use="required">
                <xs:annotation><xs:documentation>Specifies the order of the external files to use when creating the patch.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="UpgradeFile">
        <xs:annotation><xs:documentation>Specifies files to either ignore or to specify optional data about a file.</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="SymbolPath"/>
            </xs:choice>
            
            <xs:attribute name="File" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Foreign key into the File table.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Ignore" type="YesNoType" use="required">
                <xs:annotation><xs:documentation>If yes, the file is ignored during patching, and the next two attributes are ignored.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="AllowIgnoreOnError" type="YesNoType">
                <xs:annotation><xs:documentation>Specifies whether patching this file is vital.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="WholeFile" type="YesNoType">
                <xs:annotation><xs:documentation>Whether the whole file should be installed, rather than creating a binary patch.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="SymbolPath">
        <xs:annotation><xs:documentation>A path to symbols.</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:attribute name="Path" type="xs:string" use="required">
                <xs:annotation><xs:documentation>The path.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="FragmentRef">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="Fragment"/>
            </xs:appinfo>
            <xs:documentation>
                Reference to a Fragment.  This will force the entire referenced Fragment's contents
                to be included in the installer database.
            </xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>The identifier of the Fragment to reference.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="Package">
        <xs:annotation><xs:documentation>
            Properties about the package to be placed in the Summary Information Stream.  These are
            visible from COM through the IStream interface, and these properties can be seen on the package in Explorer.
        </xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" type="autogenuuid" use="required">
                <xs:annotation>
                    <xs:documentation>Package code GUID for SKU.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="AdminImage" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>Set to 'yes' if the source is an admin image.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Comments" type="xs:string">
                <xs:annotation>
                    <xs:documentation>Optional comments for browsing.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Compressed" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>Set to 'yes' to have compressed files in the source.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Description" type="xs:string">
                <xs:annotation>
                    <xs:documentation>The product full name or description.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="InstallPrivileges">
                <xs:annotation>
                    <xs:documentation>Use this attribute to specify the priviliges required to install the package on Windows Vista and above.</xs:documentation>
                </xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="limited">
                            <xs:annotation>
                                <xs:documentation>
                                    Set this value to declare that the package does not require elevated privileges to install.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="elevated">
                            <xs:annotation>
                                <xs:documentation>
                                    Set this value to declare that the package requires elevated privileges to install.
                                    This is the default value.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="InstallerVersion" type="xs:integer">
                <xs:annotation>
                    <xs:documentation>The minimum installer version (major*100 + minor).</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Keywords" type="xs:string">
                <xs:annotation>
                    <xs:documentation>Optional keywords for browsing.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Languages" type="xs:string">
                <xs:annotation>
                    <xs:documentation>The list of language IDs (LCIDs) supported in the package.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Manufacturer" type="xs:string">
                <xs:annotation>
                    <xs:documentation>The vendor releasing the package.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Platforms" type="xs:string">
                <xs:annotation>
                    <xs:documentation>The list of platforms supported in the package.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="ReadOnly" type="YesNoDefaultType">
                <xs:annotation>
                    <xs:documentation>
                        The value of this attribute conveys whether the package should be opened as read-only.
                        A database editing tool should not modify a read-only enforced database and should
                        issue a warning at attempts to modify a read-only recommended database.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="ShortNames" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>Set to 'yes' to have short filenames in the source.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="SummaryCodepage" type="LocalizableInteger">
                <xs:annotation>
                    <xs:documentation>The codepage for summary info strings only.  The language neutral codepage, zero, is not a valid value.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="AssemblyName">
        <xs:annotation>
            <xs:documentation>
                The MsiAssemblyName table specifies the schema for the elements of a strong assembly cache name for a .NET Framework or Win32 assembly.
                Consider using the Assembly attribute on File element to have the toolset populate these entries automatically.
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="MsiAssemblyName" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" use="required" type="xs:string">
                <xs:annotation><xs:documentation>Name of the attribute associated with the value specified in the Value column.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Value" type="xs:string">
                <xs:annotation><xs:documentation>Value associated with the name specified in the Name column.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="DigitalCertificate">
        <xs:annotation>
            <xs:documentation>
                Adds a digital certificate
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="MsiDigitalCertificate" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Identifier for a certificate file.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="SourceFile" type="xs:string" use="required">
                <xs:annotation><xs:documentation>The path to the certificate file.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="DigitalSignature">
        <xs:annotation>
            <xs:documentation>
                Adds a digital signature
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="MsiDigitalSignature" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType mixed="true">
            <xs:annotation><xs:documentation>Element value can be hex-encoded hash value</xs:documentation></xs:annotation>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="DigitalCertificate"/>
            </xs:choice>

            <xs:attribute name="SourceFile" type="xs:string">
                <xs:annotation><xs:documentation>The path to signature's optional hash file.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="SFPCatalog">
        <xs:annotation>
            <xs:documentation>
                Adds a system file protection update catalog file
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="SFPCatalog" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType mixed="true">
            <xs:annotation><xs:documentation>Element value can be hex-encoded hash value</xs:documentation></xs:annotation>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="SFPCatalog" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element ref="SFPFile" minOccurs="0" maxOccurs="unbounded">
                    <xs:annotation><xs:documentation>Primary Key to File Table.</xs:documentation></xs:annotation>
                </xs:element>
            </xs:choice>

            <xs:attribute name="Name" type="xs:string">
                <xs:annotation><xs:documentation>Filename for catalog file when installed.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Dependency" type="xs:string">
                <xs:annotation><xs:documentation>Used to define dependency outside of the package.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="SourceFile" type="xs:string">
                <xs:annotation><xs:documentation>Path to catalog file in binary.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="SFPFile">
        <xs:annotation>
            <xs:documentation>
                Provides a many-to-many mapping from the SFPCatalog table to the File table
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="FileSFPCatalog" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" use="required" type="xs:string">
                <xs:annotation><xs:documentation>Primary Key to File Table.</xs:documentation></xs:annotation>
            </xs:attribute>
            </xs:complexType>
    </xs:element>

    <xs:element name="IniFile">
        <xs:annotation>
            <xs:documentation>
                Adds or removes .ini file entries.
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="IniFile" />
                <xse:msiRef table="RemoveIniFile" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" use="required" type="xs:string">
                <xs:annotation><xs:documentation>Identifier for ini file.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Action" use="required">
                <xs:annotation><xs:documentation>The type of modification to be made.</xs:documentation></xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="addLine">
                            <xs:annotation><xs:documentation>Creates or updates an .ini entry.</xs:documentation></xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="addTag">
                            <xs:annotation><xs:documentation>Creates a new entry or appends a new comma-separated value to an existing entry.</xs:documentation></xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="createLine">
                            <xs:annotation><xs:documentation>Creates an .ini entry only if the entry does no already exist.</xs:documentation></xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="removeLine">
                            <xs:annotation><xs:documentation>Removes an .ini entry.</xs:documentation></xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="removeTag">
                            <xs:annotation><xs:documentation>Removes a tag from an .ini entry.</xs:documentation></xs:annotation>
                        </xs:enumeration>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="Directory" type="xs:string">
                <xs:annotation><xs:documentation>Name of a property, the value of which is the full path of the folder containing the .ini file. Can be name of a directory in the Directory table, a property set by the AppSearch table, or any other property representing a full path.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Key" use="required" type="xs:string">
                <xs:annotation><xs:documentation>The localizable .ini file key within the section.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="LongName" type="LongFileNameType">
                <xs:annotation><xs:documentation>Long file name; set this attribute if preferred name is not in 8.3 format.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Name" type="ShortFileNameType" use="required">
                <xs:annotation><xs:documentation>File name of the file in 8.3 format, required for backwards compatibility.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Section" use="required" type="xs:string">
                <xs:annotation><xs:documentation>The localizable .ini file section.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Value" type="xs:string">
                <xs:annotation>
                    <xs:documentation>
                        The localizable value to be written or deleted.  This attribute must be set if
                        the Action attribute's value is "addLine", "addTag", or "createLine".
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="XmlFile">
        <xs:annotation>
            <xs:documentation>
                Adds or removes .xml file entries.  If you use the XmlFile element you must link with wixca.wixlib because it requires the XmlFile custom actions.
            </xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" use="required" type="xs:string">
                <xs:annotation><xs:documentation>Identifier for xml file modification.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="ElementPath" use="required" type="xs:string">
                <xs:annotation><xs:documentation>The XPath of the element to be modified.  Note that this is a formatted field and therefore, square brackets in the XPath must be escapted.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="File" use="required" type="xs:string">
                <xs:annotation><xs:documentation>Path of the .xml file to configure.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Name" type="xs:string">
                <xs:annotation><xs:documentation>Name of XML node to set/add to the specified element.  Not setting this attribute causes the element's text value to be set.  Otherwise this specified the attribute name that is set.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Value" type="xs:string">
                <xs:annotation><xs:documentation>The value to be written.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="CreateElement" use="optional" type="YesNoType">
                <xs:annotation><xs:documentation>Specifies whether or not to create an Element with the name specified in the Name attribute.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Action" use="required">
                <xs:annotation><xs:documentation>The type of modification to be made to the XML file when the component is installed.</xs:documentation></xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="createElement">
                            <xs:annotation><xs:documentation>Creates a new element under the element specified in ElementPath.  The Name attribute is required in this case and specifies the name of the new element.  The Value attribute is not necessary when createElement is specified as the action.  If the Value attribute is set, it will cause the new element's text value to be set.</xs:documentation></xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="deleteValue">
                            <xs:annotation><xs:documentation>Deletes a value from the element specified in the ElementPath.  If Name is specified, the attribute with that name is deleted.  If Name is not specified, the text value of the element specified in the ElementPath is deleted.  The Value attribute is ignored if deleteValue is the action specified.</xs:documentation></xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="setValue">
                            <xs:annotation><xs:documentation>Sets a value in the element specified in the ElementPath.  If Name is specified, and attribute with that name is set to the value specified in Value.  If Name is not specified, the text value of the element is set.  Value is a required attribute if setValue is the action specified.</xs:documentation></xs:annotation>
                        </xs:enumeration>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="Permanent" type="YesNoType">
                <xs:annotation><xs:documentation>Specifies whether or not the modification should be removed on uninstall.  This has no effect on uninstall if the action was deleteValue.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Sequence" use="optional" type="xs:integer">
                <xs:annotation><xs:documentation>Specifies the order in which the modification is to be attempted on the XML file.  It is important to ensure that new elements are created before you attempt to add an attribute to them.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="ODBCDataSource">
        <xs:annotation>
            <xs:documentation>
                ODBCDataSource for a Component
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="ODBCDataSource" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Property" minOccurs="0" maxOccurs="unbounded">
                    <xs:annotation><xs:documentation>Translates into ODBCSourceAttributes</xs:documentation></xs:annotation>
                </xs:element>
            </xs:sequence>

            <xs:attribute name="Id" use="required" type="xs:string">
                <xs:annotation><xs:documentation>Identifier of the data source.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Name" use="required" type="xs:string">
                <xs:annotation><xs:documentation>Name for the data source.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="DriverName" type="xs:string">
                <xs:annotation><xs:documentation>Required if not found as child of ODBCDriver element</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Registration" use="required">
                <xs:annotation><xs:documentation>Scope for which the data source should be registered.</xs:documentation></xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="machine"/>
                        <xs:enumeration value="user"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="KeyPath" type="YesNoType">
                <xs:annotation><xs:documentation>Set 'yes' to force this file to be key path for parent Component</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="ODBCDriver">
        <xs:annotation>
            <xs:documentation>
                ODBCDriver for a Component
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="ODBCDriver" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Property" minOccurs="0" maxOccurs="unbounded">
                    <xs:annotation><xs:documentation>Translates into ODBCSourceAttributes</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="ODBCDataSource" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>

            <xs:attribute name="Id" use="required" type="xs:string">
                <xs:annotation><xs:documentation>Identifier for the driver.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Name" use="required" type="xs:string">
                <xs:annotation><xs:documentation>Name for the driver.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="File" type="xs:string">
                <xs:annotation><xs:documentation>Required if not found as child of File element</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="SetupFile" type="xs:string">
                <xs:annotation><xs:documentation>Required if not found as child of File element or different from File attribute above</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="ODBCTranslator">
        <xs:annotation>
            <xs:documentation>
                ODBCTranslator for a Component
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="ODBCTranslator" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" use="required" type="xs:string">
                <xs:annotation><xs:documentation>Identifier for the translator.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Name" use="required" type="xs:string">
                <xs:annotation><xs:documentation>Name for the translator.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="File" type="xs:string">
                <xs:annotation><xs:documentation>Required if not found as child of File element</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="SetupFile" type="xs:string">
                <xs:annotation><xs:documentation>Required if not found as child of File element or different from File attribute above</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="FileSearch">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="ComponentSearch"/>
                <xse:seeAlso ref="DirectorySearch"/>
                <xse:seeAlso ref="DirectorySearchRef"/>
                <xse:seeAlso ref="FileSearchRef"/>
                <xse:seeAlso ref="IniFileSearch"/>
                <xse:seeAlso ref="RegistrySearch"/>
                <xse:msiRef table="DrLocator" />
                <xse:msiRef table="Signature" />
            </xs:appinfo>
            <xs:documentation>Searches for file and assigns to fullpath value of parent Property</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" type="xs:string">
                <xs:annotation><xs:documentation>Specify the Id when you want to find the path to a file.  Leave the Id absent if you want to find the parent directory of a file.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Name" type="ShortFileNameType">
                <xs:annotation><xs:documentation>
                    File name of the file in 8.3 format.  Please note that due to a Windows Installer bug,
                    this attribute is not required if the preferred file name is not in 8.3 format.  This
                    attribute should only be set if the file to find is in 8.3 format.  Either this attribute
                    or the LongName is required.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="LongName" type="LongFileNameType">
                <xs:annotation><xs:documentation>
                    Long file name; set this attribute if preferred name is not in 8.3 format.
                    Either this attribute or the Name attribute is required.
                    When using only the LongName attribute, ICE03 should be ignored for the Signature table's FileName column.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="MinSize" type="xs:int">
                <xs:annotation><xs:documentation>The minimum size of the file.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="MaxSize" type="xs:int">
                <xs:annotation><xs:documentation>The maximum size of the file.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="MinVersion" type="xs:string">
                <xs:annotation><xs:documentation>The minimum version of the file.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="MaxVersion" type="xs:string">
                <xs:annotation><xs:documentation>The maximum version of the file.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="MinDate" type="xs:dateTime">
                <xs:annotation><xs:documentation>The minimum modification date and time of the file. Formatted as YYYY-MM-DDTHH:mm:ss, where YYYY is the year, MM is month, DD is day, 'T' is literal, HH is hour, mm is minute and ss is second.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="MaxDate" type="xs:dateTime">
                <xs:annotation><xs:documentation>The maximum modification date and time of the file. Formatted as YYYY-MM-DDTHH:mm:ss, where YYYY is the year, MM is month, DD is day, 'T' is literal, HH is hour, mm is minute and ss is second.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Languages" type="xs:string">
                <xs:annotation><xs:documentation>The languages supported by the file.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="FileSearchRef">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="FileSearch"/>
            </xs:appinfo>
            <xs:documentation>References an existing FileSearch element.</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" use="required" type="xs:string">
                <xs:annotation><xs:documentation>Specify the Id to the FileSearch to reference.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="DirectorySearch">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="ComponentSearch"/>
                <xse:seeAlso ref="IniFileSearch"/>
                <xse:seeAlso ref="RegistrySearch"/>
                <xse:msiRef table="DrLocator" />
                <xse:msiRef table="Signature" />
            </xs:appinfo>
            <xs:documentation>Searches for directory and assigns to value of parent Property.</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:choice minOccurs="0">
                <xs:element ref="DirectorySearch"/>
                <xs:element ref="DirectorySearchRef"/>
                <xs:element ref="FileSearch"/>
                <xs:element ref="FileSearchRef"/>
            </xs:choice>

            <xs:attribute name="Id" use="required" type="xs:string">
                <xs:annotation><xs:documentation>External key into Signature table. If not in Signature table, search is for a directory defined with DirectorySearch elements.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Path" type="xs:string">
                <xs:annotation><xs:documentation>Path on the user's system. Either absolute, or relative to containing directories.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Depth" type="xs:integer">
                <xs:annotation><xs:documentation>Depth below the path that the installer searches for the file or directory specified by the search.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="DirectorySearchRef">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="ComponentSearch"/>
                <xse:seeAlso ref="IniFileSearch"/>
                <xse:seeAlso ref="RegistrySearch"/>
            </xs:appinfo>
            <xs:documentation>References an existing DirectorySearch element.</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:choice minOccurs="0">
                <xs:element ref="DirectorySearch"/>
                <xs:element ref="DirectorySearchRef"/>
                <xs:element ref="FileSearch"/>
                <xs:element ref="FileSearchRef"/>
            </xs:choice>

            <xs:attribute name="Id" use="required" type="xs:string">
                <xs:annotation><xs:documentation>Id of the search being referred to.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Parent" type="xs:string">
                <xs:annotation><xs:documentation>This attribute is the signature of the parent directory of the file or directory in the Signature_ column. If this field is null, and the Path column does not expand to a full path, then all the fixed drives of the user's system are searched by using the Path.  This field is a key into one of the following tables: the RegLocator, the IniLocator, the CompLocator, or the DrLocator tables.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Path" type="xs:string">
                <xs:annotation><xs:documentation>Path on the user's system. Either absolute, or relative to containing directories.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="ComponentSearch">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="IniFileSearch"/>
                <xse:seeAlso ref="RegistrySearch"/>
                <xse:msiRef table="CompLocator" />
                <xse:msiRef table="Signature" />
            </xs:appinfo>
            <xs:documentation>Searches for file or directory and assigns to value of parent Property.</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:choice minOccurs="0">
                <xs:element ref="DirectorySearch"/>
                <xs:element ref="DirectorySearchRef"/>
                <xs:element ref="FileSearch"/>
                <xs:element ref="FileSearchRef"/>
            </xs:choice>

            <xs:attribute name="Id" use="required" type="xs:string"/>
            <xs:attribute name="Guid" type="uuid">
                <xs:annotation><xs:documentation>The component ID of the component whose key path is to be used for the search.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Type">
                <xs:annotation><xs:documentation>Must be file if last child is FileSearch element and must be directory if last child is DirectorySearch element.</xs:documentation></xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="directory"/>
                        <xs:enumeration value="file"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="IniFileSearch">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="ComponentSearch"/>
                <xse:seeAlso ref="RegistrySearch"/>
                <xse:msiRef table="IniLocator" />
                <xse:msiRef table="Signature" />
            </xs:appinfo>
            <xs:documentation>Searches for file, directory or registry key and assigns to value of parent Property</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:choice minOccurs="0">
                <xs:element ref="DirectorySearch"/>
                <xs:element ref="DirectorySearchRef"/>
                <xs:element ref="FileSearch"/>
                <xs:element ref="FileSearchRef"/>
            </xs:choice>

            <xs:attribute name="Id" use="required" type="xs:string">
                <xs:annotation><xs:documentation>External key into the Signature table.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Field" type="xs:integer">
                <xs:annotation><xs:documentation>The field in the .ini line. If field is Null or 0, the entire line is read.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Key" use="required" type="xs:string">
                <xs:annotation><xs:documentation>The key value within the section.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="LongName" type="LongFileNameType">
                <xs:annotation><xs:documentation>Long file name; set this attribute if preferred name is not in 8.3 format.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Name" type="ShortFileNameType">
                <xs:annotation><xs:documentation>File name of the file in 8.3 format, required for backwards compatibility.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Section" use="required" type="xs:string">
                <xs:annotation><xs:documentation>The section name within the .ini file.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Type">
                <xs:annotation><xs:documentation>Must be file if last child is FileSearch element and must be directory if last child is DirectorySearch element.</xs:documentation></xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="directory">
                            <xs:annotation><xs:documentation>A directory location.</xs:documentation></xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="file">
                            <xs:annotation><xs:documentation>A file location.</xs:documentation></xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="raw">
                            <xs:annotation><xs:documentation>A raw .ini value.</xs:documentation></xs:annotation>
                        </xs:enumeration>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="RegistrySearch">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="ComponentSearch"/>
                <xse:seeAlso ref="IniFileSearch"/>
                <xse:msiRef table="RegLocator" />
                <xse:msiRef table="Signature" />
            </xs:appinfo>
            <xs:documentation>Searches for file, directory or registry key and assigns to value of parent Property</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:choice minOccurs="0">
                <xs:element ref="DirectorySearch"/>
                <xs:element ref="DirectorySearchRef"/>
                <xs:element ref="FileSearch"/>
                <xs:element ref="FileSearchRef"/>
            </xs:choice>

            <xs:attribute name="Id" use="required" type="xs:string">
                <xs:annotation><xs:documentation>Signature to be used for the file, directory or registry key being search for.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Root" use="required">
                <xs:annotation><xs:documentation>Root key for the registry value.</xs:documentation></xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="HKCR"/>
                        <xs:enumeration value="HKCU"/>
                        <xs:enumeration value="HKLM"/>
                        <xs:enumeration value="HKU"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="Key" use="required" type="xs:string">
                <xs:annotation><xs:documentation>Key for the registry value.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Name" type="xs:string">
                <xs:annotation><xs:documentation>Registry value name.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Type" use="required">
                <xs:annotation>
                    <xs:documentation>
                        The value must be 'file' if the last child is a FileSearch element and must be 'directory' if last child is a DirectorySearch element.
                    </xs:documentation>
                </xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="directory">
                            <xs:annotation>
                                <xs:documentation>
                                    Sets a directory path from the registry value.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="file">
                            <xs:annotation>
                                <xs:documentation>
                                    Sets a file path from the registry value.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="raw">
                            <xs:annotation>
                                <xs:documentation>
                                    Sets the raw value from the registry value.  Please note that this value will contain a prefix as follows:<html:br/>
                                    DWORD: Starts with '#' optionally followed by '+' or '-'.<html:br />
                                    REG_BINARY: Starts with '#x' and the installer converts and saves each hexadecimal digit (nibble) as an ASCII character prefixed by '#x'.<html:br/>
                                    REG_EXPAND_SZ: Starts with '#%'.<html:br/>
                                    REG_MULTI_SZ: Starts with '[~]' and ends with '[~]'.<html:br/>
                                    REG_SZ: No prefix, but if the first character of the registry value is '#', the installer escapes the character by prefixing it with another '#'.<html:br/>
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="Win64" type="YesNoType">
                <xs:annotation><xs:documentation>Instructs the search to look in the 64-bit registry when the value is 'yes'.  Default is 'no' and search looks in the 32-bit registry.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="RegistrySearchRef">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="RegistrySearch"/>
            </xs:appinfo>
            <xs:documentation>References an existing RegistrySearch element.</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Specify the Id of the RegistrySearch to reference.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="ComplianceDrive">
        <xs:annotation><xs:documentation>Sets the parent of a nested DirectorySearch element to CCP_DRIVE.</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:choice minOccurs="1" maxOccurs="1">
                <xs:element ref="DirectorySearch"/>
                <xs:element ref="DirectorySearchRef"/>
            </xs:choice>
        </xs:complexType>
    </xs:element>

    <xs:element name="ComplianceCheck">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="Property"/>
                <xse:msiRef table="CCPSearch" />
                <xse:msiRef table="Signature" />
            </xs:appinfo>
            <xs:documentation>Adds a row to the CCPSearch table.</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="ComplianceDrive" minOccurs="0">
                    <xs:annotation><xs:documentation>Starts searches from the CCP_DRIVE.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="ComponentSearch" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element ref="RegistrySearch" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element ref="IniFileSearch" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element ref="DirectorySearch" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element ref="FileSearch" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="Property">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="PropertyRef"/>
                <xse:msiRef table="Property" />
            </xs:appinfo>
            <xs:documentation>Property value for a Product or Module.</xs:documentation>
        </xs:annotation>
        <xs:complexType mixed="true">
            <xs:sequence>
                <xs:annotation><xs:documentation>If Property is determined by an AppSearch</xs:documentation></xs:annotation>
                <xs:element ref="ComplianceDrive" minOccurs="0">
                    <xs:annotation><xs:documentation>Starts searches from the CCP_DRIVE.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="ComponentSearch" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element ref="RegistrySearch" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element ref="RegistrySearchRef" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element ref="IniFileSearch" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element ref="DirectorySearch" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element ref="DirectorySearchRef" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element ref="FileSearch" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>

            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Unique identifier for Property.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Value" type="xs:string">
                <xs:annotation><xs:documentation>Sets a default value for the property.  The value will be overwritten if the Property is used for a search.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="ComplianceCheck" type="YesNoType">
                <xs:annotation><xs:documentation>Adds a row to the CCPSearch table.  This attribute is only valid when this Property contains a search element.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Admin" type="YesNoType">
                <xs:annotation><xs:documentation>Denotes that the Property is saved during <html:a href='http://msdn.microsoft.com/library/en-us/msi/setup/administrative_installation.asp'>admininistrative installation</html:a>. See the <html:a href='http://msdn.microsoft.com/library/en-us/msi/setup/adminproperties.asp'>AdminProperties Property</html:a> for more information.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Secure" type="YesNoType">
                <xs:annotation><xs:documentation>Denotes that the Property can be passed to the server side when doing a managed installation with elevated privileges. See the <html:a href='http://msdn.microsoft.com/library/en-us/msi/setup/securecustomproperties_property.asp'>SecureCustomProperties Property</html:a> for more information.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Hidden" type="YesNoType">
                <xs:annotation><xs:documentation>Denotes that the Property is not logged during installation. See the <html:a href='http://msdn.microsoft.com/library/en-us/msi/setup/msihiddenproperties_property.asp'>MsiHiddenProperties Property</html:a> for more information.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="PropertyRef">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="Property"/>
            </xs:appinfo>
            <xs:documentation>Reference to a Property value.</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Identifier of Property to reference.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="Shortcut">
        <xs:annotation>
            <xs:documentation>
                Shortcut, default target is parent File, CreateFolder, or Component's Directory
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="Shortcut" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Icon" minOccurs="0" maxOccurs="1" />
            </xs:sequence>

            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Unique identifier for the shortcut. This value will serve as the primary key for the row.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Directory" use="required" type="xs:string">
                <xs:annotation><xs:documentation>Identifier reference to Directory element where shortcut is to be created.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Name" type="ShortFileNameType" use="required">
                <xs:annotation><xs:documentation>Localizable short name for the shortcut. Must be an 8.3 file name.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="LongName" type="LongFileNameType">
                <xs:annotation><xs:documentation>Localizable long name for shortcut if a name longer than 8.3 format is desired.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Target" type="xs:string">
                <xs:annotation><xs:documentation>The target for a non-Advertised shortcut. This attribute is not valid for Advertised shortcuts.
                The value will be defaulted to the parent File when nested under a File element.  If you specify this value then use a formatted file 
                identifier, for example: [!TargetFileId].</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Description" type="xs:string">
                <xs:annotation><xs:documentation>The localizable description for the shortcut.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Arguments" type="xs:string">
                <xs:annotation><xs:documentation>The command-line arguments for the shortcut. Note that the resolution of properties 
                in the Arguments field is limited. A property formatted as [Property] in this field can only be resolved if the 
                property already has the intended value when the component owning the shortcut is installed. For example, for the 
                argument "[#MyDoc.doc]" to resolve to the correct value, the same process must be installing the file MyDoc.doc and 
                the component that owns the shortcut.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Hotkey" type="xs:integer">
                <xs:annotation><xs:documentation>The hotkey for the shortcut. The low-order byte contains the virtual-key code for 
                the key, and the high-order byte contains modifier flags. This must be a non-negative number. Authors of 
                installation packages are generally recommend not to set this option, because this can add duplicate hotkeys to a 
                users desktop. In addition, the practice of assigning hotkeys to shortcuts can be problematic for users using hotkeys 
                for accessibility.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Icon" type="xs:string">
                <xs:annotation><xs:documentation>Identifier reference to Icon element. The Icon identifier should have the same extension 
                as the file that it points at.  For example, a shortcut to an executable (e.g. "my.exe") should reference an Icon with identifier
                like "MyIcon.exe"</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="IconIndex" type="xs:integer">
                <xs:annotation><xs:documentation>Identifier reference to Icon element.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Show">
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="normal"/>
                        <xs:enumeration value="minimized"/>
                        <xs:enumeration value="maximized"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="WorkingDirectory" type="xs:string">
                <xs:annotation><xs:documentation>Directory identifier (or Property identifier that resolves to a directory) that resolves
                to the path of the working directory for the shortcut.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Advertise" type="YesNoType">
                <xs:annotation><xs:documentation>Specifies if the shortcut should be advertised or not. Note that advertised shortcuts 
                always point at a particular application, identified by a ProductCode, and should not be shared between applications. 
                Advertised shortcuts only work for the most recently installed application, and are removed when that application is 
                removed.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="DisplayResourceDll" type="xs:string">
                <xs:annotation>
                    <xs:documentation>
                        The Formatted string providing the full path to the language neutral file containing the MUI Manifest.   Generally 
                        authored using [#filekey] form.  When this attribute is specified, the DisplayResourceId attribute must also 
                        be provided.

                        This attribute is only used on Windows Vista and above.  If this attribute is not populated and the install 
                        is running on Vista and above, the value in the Name attribute is used.  If this attribute is populated and 
                        the install is running on Vista and above, the value in the Name attribute is ignored.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="DisplayResourceId" type="xs:integer">
                <xs:annotation>
                    <xs:documentation>
                        The display name index for the shortcut. This must be a non-negative number.  When this attribute is specified, the 
                        DisplayResourceDll attribute must also be proviced.

                        This attribute is only used on Windows Vista and above.  If this attribute is not specified and the install 
                        is running on Vista and above, the value in the Name attribute is used.  If this attribute is specified and 
                        the install is running on Vista and above, the value in the Name attribute is ignored.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="DescriptionResourceDll" type="xs:string">
                <xs:annotation>
                    <xs:documentation>
                        The Formatted string providing the full path to the language neutral file containing the MUI Manifest.   Generally 
                        authored using [#filekey] form.  When this attribute is specified, the DescriptionResourceId attribute must also 
                        be provided.

                        This attribute is only used on Windows Vista and above.  If this attribute is not specified and the install 
                        is running on Vista and above, the value in the Name attribute is used.  If this attribute is provided and 
                        the install is running on Vista and above, the value in the Name attribute is ignored.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="DescriptionResourceId" type="xs:integer">
                <xs:annotation>
                    <xs:documentation>
                        The description name index for the shortcut. This must be a non-negative number.  When this attribute is specified,
                        the DescriptionResourceDll attribute must also be populated.

                        This attribute is only used on Windows Vista and above.  If this attribute is not specified and the install 
                        is running on Vista and above, the value in the Name attribute is used.  If this attribute is populated and the
                        install is running on Vista and above, the value in the Name attribute is ignored.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="Permission">
        <xs:annotation>
            <xs:documentation>
                Sets ACLs on File, Registry, or CreateFolder.  When under a Registry element, this cannot be used
                if the Action attribute's value is remove or removeKeyOnInstall.  This element has no Id attribute.
                The table and key are taken from the parent element.
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="LockPermissions" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Domain" type="xs:string">
            </xs:attribute>
            <xs:attribute name="Extended" use="optional" type="YesNoType">
                <xs:annotation><xs:documentation>Specifies whether or not to use the LockPermissions table when the Permission element 
                is nested under a Registry, File, or CreateFolder element.  If Extended is set to 'yes' then the WiX SecureObject custom 
                action will be used to lock down the resource instead of the "legacy" LockPermissions table.  Specifying 'yes' for this 
                attribute will require you to link your MSI with the wixca.wixlib.  By using the SecureObject custom action you can apply
                permissions for many more well known user SIDs as well as for user accounts that are created as part of the install.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="User" use="required" type="xs:string">
            </xs:attribute>
            <!-- Common ACLs -->
            <xs:attribute name="Read" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="Delete" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="ReadPermission" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="ChangePermission" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="TakeOwnership" type="YesNoType">
            </xs:attribute>
            <!-- Folder and File ACLs -->
            <xs:attribute name="ReadAttributes" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="WriteAttributes" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="ReadExtendedAttributes" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="WriteExtendedAttributes" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="Synchronize" type="YesNoType">
            </xs:attribute>
            <!-- Folder only ACLs -->
            <xs:attribute name="CreateFile" type="YesNoType">
                <xs:annotation><xs:documentation>For a directory, the right to create a file in the directory.  Only valid under a 'CreateFolder' parent.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="CreateChild" type="YesNoType">
                <xs:annotation><xs:documentation>For a directory, the right to create a subdirectory.  Only valid under a 'CreateFolder' parent.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="DeleteChild" type="YesNoType">
                <xs:annotation><xs:documentation>For a directory, the right to delete a directory and all the files it contains, including read-only files.  Only valid under a 'CreateFolder' parent.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Traverse" type="YesNoType">
                <xs:annotation><xs:documentation>For a directory, the right to traverse the directory.  By default, users are assigned the BYPASS_TRAVERSE_CHECKING privilege, which ignores the FILE_TRAVERSE access right.  Only valid under a 'CreateFolder' parent.</xs:documentation></xs:annotation>
            </xs:attribute>
            <!-- File only ACLs -->
            <xs:attribute name="Append" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="Execute" type="YesNoType">
            </xs:attribute>
            <!-- File and Registry ACLs -->
            <xs:attribute name="Write" type="YesNoType">
            </xs:attribute>
            <!-- Registry only ACLs -->
            <xs:attribute name="CreateSubkeys" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="EnumerateSubkeys" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="Notify" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="CreateLink" type="YesNoType">
            </xs:attribute>
            <!-- Generic ACLs, mapped by system to appropriate permissions -->
            <xs:attribute name="GenericAll" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="GenericExecute" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="GenericWrite" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="GenericRead" type="YesNoType">
                <xs:annotation><xs:documentation>specifying this will fail to grant read access</xs:documentation></xs:annotation>
            </xs:attribute>
            <!-- Service only ACLs -->
            <xs:attribute name="ServiceQueryConfig" type="YesNoType">
                <xs:annotation><xs:documentation>Required to call the QueryServiceConfig and QueryServiceConfig2 functions to query the service configuration.  Only valid under a 'ServiceInstall' parent.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="ServiceChangeConfig" type="YesNoType">
                <xs:annotation><xs:documentation>Required to call the ChangeServiceConfig or ChangeServiceConfig2 function to change the service configuration.  Only valid under a 'ServiceInstall' parent.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="ServiceQueryStatus" type="YesNoType">
                <xs:annotation><xs:documentation>Required to call the QueryServiceStatus function to ask the service control manager about the status of the service.  Only valid under a 'ServiceInstall' parent.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="ServiceEnumerateDependents" type="YesNoType">
                <xs:annotation><xs:documentation>Required to call the EnumDependentServices function to enumerate all the services dependent on the service.  Only valid under a 'ServiceInstall' parent.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="ServiceStart" type="YesNoType">
                <xs:annotation><xs:documentation>Required to call the StartService function to start the service.  Only valid under a 'ServiceInstall' parent.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="ServiceStop" type="YesNoType">
                <xs:annotation><xs:documentation>Required to call the ControlService function to stop the service.  Only valid under a 'ServiceInstall' parent.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="ServicePauseContinue" type="YesNoType">
                <xs:annotation><xs:documentation>Required to call the ControlService function to pause or continue the service.  Only valid under a 'ServiceInstall' parent.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="ServiceInterrogate" type="YesNoType">
                <xs:annotation><xs:documentation>Required to call the ControlService function to ask the service to report its status immediately.  Only valid under a 'ServiceInstall' parent.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="ServiceUserDefinedControl" type="YesNoType">
                <xs:annotation><xs:documentation>Required to call the ControlService function to specify a user-defined control code.  Only valid under a 'ServiceInstall' parent.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="CopyFile">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="RemoveFile" />
                <xse:msiRef table="DuplicateFile" />
                <xse:msiRef table="MoveFile" />
            </xs:appinfo>
            <xs:documentation>
                Copy or move an existing file on the target machine, or copy a file that is being installed, to another destination.  When
                this element is nested under a File element, the parent file will be installed, then copied to the specified destination
                if the parent component of the file is selected for installation or removal.  When this element is nested under
                a Component element and no FileId attribute is specified, the file to copy or move must already be on the target machine.
                When this element is nested under a Component element and the FileId attribute is specified, the specified file is installed,
                then copied to the specified destination if the parent component is selected for installation or removal (use
                this option to control the copy of a file in a different component by the parent component's installation state).  If the 
                specified destination directory is the same as the directory containing the original file and the name for the proposed source
                file is the same as the original, then no action takes place.
            </xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Primary key used to identify this particular entry.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="FileId" type="xs:string">
                <xs:annotation><xs:documentation>
                    This attribute cannot be specified if the element is nested under a File element.  Set this attribute's value to the identifier
                    of a file from a different component to copy it based on the install state of the parent component.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="SourceDirectory" type="xs:string">
                <xs:annotation><xs:documentation>
                    This attribute cannot be specified if the element is nested under a File element or the FileId attribute is specified.  Set
                    this value to the source directory from which to copy or move an existing file on the target machine.  This Directory must
                    exist in the installer database at creation time.  This attribute cannot be specified in conjunction with SourceProperty.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="SourceProperty" type="xs:string">
                <xs:annotation><xs:documentation>
                    This attribute cannot be specified if the element is nested under a File element or the FileId attribute is specified.  Set
                    this value to a property that will have a value that resolves to the full path of the source directory (or full path
                    including file name if SourceName is not specified).  The property does not have to exist in the installer database at
                    creation time; it could be created at installation time by a custom action, on the command line, etc.  This attribute
                    cannot be specified in conjunction with SourceDirectory.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="SourceName" type="WildCardLongFileNameType">
                <xs:annotation><xs:documentation>
                    This attribute cannot be specified if the element is nested under a File element or the FileId attribute is specified.  Set
                    this value to the localizable name of the file(s) to be copied or moved.  All of the files that
                    match the wild card will be removed from the specified directory.  The value is a filename that may also
                    contain the wild card characters "?" for any single character or "*" for zero or more occurrences of any character.  If this
                    attribute is not specified (and this element is not nested under a File element or specify a FileId attribute) then the
                    SourceProperty attribute should be set to the name of a property that will resolve to the full path of the source filename.
                    If the value of this attribute contains a "*" wildcard and the DestinationName attribute is specified, all moved or copied
                    files retain the file names from their sources.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="DestinationDirectory" type="xs:string">
                <xs:annotation><xs:documentation>
                    Set this value to the destination directory where an existing file on the target machine should be moved or copied to.  This
                    Directory must exist in the installer database at creation time.  This attribute cannot be specified in conjunction with
                    DestinationProperty.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="DestinationProperty" type="xs:string">
                <xs:annotation><xs:documentation>
                    Set this value to a property that will have a value that resolves to the full path of the destination directory.  The property
                    does not have to exist in the installer database at creation time; it could be created at installation time by a custom
                    action, on the command line, etc.  This attribute cannot be specified in conjunction with DestinationDirectory.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="DestinationName" type="ShortFileNameType">
                <xs:annotation><xs:documentation>
                    Set this value to the localizable name to be given to the original file after it is moved or copied.  If this attribute is not
                    specified, then the destination file is given the same name as the source file.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="DestinationLongName" type="LongFileNameType">
                <xs:annotation><xs:documentation>
                    If the destination name of the file needs to be longer than 8.3 format, then this attribute should be specified
                    with the long file name (in addition to the Name attribute which is always required for target systems that might
                    not support long file names).
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Delete" type="YesNoType">
                <xs:annotation><xs:documentation>
                    This attribute cannot be specified if the element is nested under a File element or the FileId attribute is specified.  In other
                    cases, if the attribute is not specified, the default value is "no" and the file is copied, not moved.  Set the value to "yes"
                    in order to move the file (thus deleting the source file) instead of copying it.
                </xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="Patch">
        <xs:annotation>
            <xs:documentation>
                Patch information for parent File element
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="Patch" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Sequence" type="xs:integer">
                <xs:annotation><xs:documentation>may be defaulted if not in cabinet if build tools supply sequence</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="PatchSize" type="xs:integer">
                <xs:annotation><xs:documentation>may be defaulted if build tools supply actual size</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Header" use="required" type="xs:string">
                <xs:annotation><xs:documentation>stream in Binary table</xs:documentation></xs:annotation>
            </xs:attribute>
            <!-- 'Attributes' column integer value generated from XML attributes below -->
            <xs:attribute name="Vital" type="YesNoType">
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="File">
        <xs:annotation>
            <xs:documentation>
                File specification for File table, must be child node of Component
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="File" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="AssemblyName"/>
                <xs:element ref="Permission"/>
                <xs:element ref="CopyFile">
                    <xs:annotation><xs:documentation>to DuplicateFile table</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="Shortcut">
                    <xs:annotation><xs:documentation>Target is preset to this file</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="ODBCDriver"/>
                <xs:element ref="ODBCTranslator"/>
                <xs:element ref="Class"/>
                <xs:element ref="AppId"/>
                <xs:element ref="TypeLib"/>
                <xs:element ref="Patch">
                    <xs:annotation><xs:documentation>to Patch table</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="PerfCounter"/>
                <xs:any namespace="##other" processContents="lax">
                    <xs:annotation>
                        <xs:documentation>
                            Extensibility point in the WiX XML Schema.  Schema extensions can register additional
                            elements at this point in the schema.
                        </xs:documentation>
                    </xs:annotation>
                </xs:any>
            </xs:choice>

            <xs:attribute name="Id" type="xs:string" use="required"/>
            <xs:attribute name="CompanionFile" type="xs:string">
                <xs:annotation>
                    <xs:documentation>Set this attribute to make this file a companion child of another file.  The installation state of a companion file depends not on its own file versioning information, but on the versioning of its companion parent.  A file that is the key path for its component can not be a companion file (that means this attribute cannot be set if KeyPath="yes" for this file).  The Version attribute cannot be set along with this attribute since companion files are not installed based on their own version.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Name" type="ShortFileNameType" use="required">
                <xs:annotation>
                    <xs:documentation>File name of the file in 8.3 format, required for backwards compatibility.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="LongName" type="LongFileNameType">
                <xs:annotation><xs:documentation>Long file name; set this attribute if preferred name is not in 8.3 format.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="KeyPath" type="YesNoType">
                <xs:annotation><xs:documentation>Set yes to force this File to be key path for parent Component.</xs:documentation></xs:annotation>
            </xs:attribute>
            <!-- 'Attributes' column integer value generated from XML attributes below -->
            <xs:attribute name="ReadOnly" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>Set to yes in order to have the file's read-only attribute set when it is installed on the target machine.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Hidden" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>Set to yes in order to have the file's hidden attribute set when it is installed on the target machine.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="System" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>Set to yes in order to have the file's system attribute set when it is installed on the target machine.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Vital" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>If a file is vital, then installation cannot proceed unless the file is successfully installed.  The user will have no option to ignore an error installing this file.  If an error occurs, they can merely retry to install the file or abort the installation.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Checksum" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>This attribute should be set to "yes" for every executable file in the installation that has a valid checksum stored in the Portable Executable (PE) file header.  Only those files that have this attribute set will be verified for valid checksum during a reinstall.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Compressed" type="YesNoDefaultType">
                <xs:annotation>
                    <xs:documentation>Sets the file's source type compression.  A setting of "yes" or "no" will override the setting in the Word Count Summary Property.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="BindPath" type="xs:string">
                <xs:annotation><xs:documentation>generates BindImage table row, value my be empty string</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="SelfRegCost" type="xs:integer">
                <xs:annotation><xs:documentation>generates SelfReg table row</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="TrueType" type="YesNoType">
                <xs:annotation><xs:documentation>generates entries in Font table with no FontTitle</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="FontTitle" type="xs:string">
                <xs:annotation><xs:documentation>generates entries in Font table with the FontTitle</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="DefaultLanguage" type="xs:string">
                <xs:annotation><xs:documentation>This is the default language of this file.  The linker will replace this value from the value in the file if the suppress files option is not used.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="DefaultSize" type="xs:integer">
                <xs:annotation><xs:documentation>This is the default size of this file.  The linker will replace this value from the value in the file if the suppress files option is not used.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="DefaultVersion" type="xs:string">
                <xs:annotation><xs:documentation>This is the default version of this file.  The linker will replace this value from the value in the file if the suppress files option is not used.</xs:documentation></xs:annotation>
            </xs:attribute>
            <!-- assembly information -->
            <xs:attribute name="Assembly">
                <xs:annotation>
                    <xs:documentation>
                        Specifies if this File is a Win32 Assembly or .NET Assembly; the default is neither.
                        If the value is '.net' or 'win32', this file must also be the key path of the Component.
                    </xs:documentation>
                </xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value=".net"/>
                        <xs:enumeration value="no"/>
                        <xs:enumeration value="win32"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="AssemblyManifest" type="xs:string">
                <xs:annotation>
                    <xs:documentation>
                        Specifies the file identifier of the manifest file that describes this assembly.
                        The manifest file should be in the same component as the assembly it describes.
                        This attribute may only be specified if the Assembly attribute is set to '.net' or 'win32'.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="AssemblyApplication" type="xs:string">
                <xs:annotation>
                    <xs:documentation>
                        Specifies the file identifier of the application file.  This assembly will be isolated
                        to the same directory as the application file.
                        If this attribute is absent, the assembly will be installed to the Global Assembly Cache.
                        This attribute may only be specified if the Assembly attribute is set to '.net' or 'win32'.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="ProcessorArchitecture">
                <xs:annotation><xs:documentation>Specifies the architecture for this assembly. This attribute should only be used on .NET Assemblies for the CLR 2.0.</xs:documentation></xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="msil"/>
                        <xs:enumeration value="x86"/>
                        <xs:enumeration value="x64"/>
                        <xs:enumeration value="ia64"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="DiskId" type="xs:string">
                <xs:annotation><xs:documentation>Specifies the Media this File should be sourced on.  This attribute must be set on this File element or its parent Component.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Source" type="xs:string">
                <xs:annotation><xs:documentation>Specifies the path to the File in the build process.  This attribute must be set if no source information can be gathered from parent directories.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="src" type="xs:string">
                <xs:annotation>
                    <xs:appinfo>
                        <xse:deprecated ref="Source" />
                    </xs:appinfo>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="PatchGroup" type="xs:integer">
                <xs:annotation><xs:documentation>
                    This attribute must be set for patch-added files.  Each patch should be assigned a different patch group number.  Patch groups
                    numbers must be greater 0 and should be assigned consecutively.  For example, the first patch should use PatchGroup='1', the
                    second patch will have PatchGroup='2', etc...
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:anyAttribute namespace="##other" processContents="lax">
                <xs:annotation><xs:documentation>
                    Extensibility point in the WiX XML Schema.  Schema extensions can register additional
                    attributes at this point in the schema.
                </xs:documentation></xs:annotation>
            </xs:anyAttribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="FileShare">
        <xs:annotation>
            <xs:documentation>Creates a file share out of the component's directory.</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Permission" minOccurs="1" maxOccurs="unbounded">
                    <xs:annotation><xs:documentation>ACL permission</xs:documentation></xs:annotation>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Identifier for the file share (primary key).</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Name" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Name of the file share.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Description" type="xs:string">
                <xs:annotation><xs:documentation>Description of the file share.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="RegistryValue">
        <xs:annotation>
            <xs:documentation>
                Use several of these elements to specify each registry value in a multiString registry value.  This element
                cannot be used if the Value attribute is specified unless the Type attribute is set to 'multiString'.  The
                values should go in the text area of the RegistryValue element.
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="Registry" />
            </xs:appinfo>
        </xs:annotation>
    </xs:element>

    <xs:element name="Registry">
        <xs:annotation>
            <xs:documentation>
                This element allows you to add or remove registry keys (depending upon the value of the action attribute).  Please
                note that for removal, there are 4 options: you can remove a particular registry name, an entire registry key when
                the parent component is installed, an entire registry key when the parent component is uninstalled, or create a key
                when the parent component is installed, then remove it when the parent component is uninstalled.
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="Registry" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="Permission"/>
                <xs:element ref="RegistryValue"/>
                <xs:element ref="Registry"/>
            </xs:choice>
            <xs:attribute name="Id" type="xs:string">
                <xs:annotation><xs:documentation>
                    Primary key used to identify this particular entry.  If this attribute is not specified, an identifier will be
                    generated by hashing the parent Component identifier, Root, Key, and Name.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Action">
                <xs:annotation>
                    <xs:documentation>
                        This is the action that will be taken for this registry key.
                    </xs:documentation>
                </xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="append">
                            <xs:annotation>
                                <xs:documentation>
                                    Appends the specified value(s) to a multiString registry key.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="createKey">
                            <xs:annotation>
                                <xs:documentation>
                                    Creates the key, if absent, when the parent component is installed.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="createKeyAndRemoveKeyOnUninstall">
                            <xs:annotation>
                                <xs:documentation>
                                    Creates the key, if absent, when the parent component is installed then remove the key with all its values and subkeys when the parent component is uninstalled.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="prepend">
                            <xs:annotation>
                                <xs:documentation>
                                    Prepends the specified value(s) to a multiString registry key.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="remove">
                            <xs:annotation>
                                <xs:documentation>
                                    Removes a registry name when the parent component in installed.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="removeKeyOnInstall">
                            <xs:annotation>
                                <xs:documentation>
                                    Removes a key with all its values and subkeys when the parent component is installed.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="removeKeyOnUninstall">
                            <xs:annotation>
                                <xs:documentation>
                                    Removes a key with all its values and subkeys when the parent component is uninstalled.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="write">
                            <xs:annotation>
                                <xs:documentation>
                                    Writes a registry value.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="Key" type="xs:string">
                <xs:annotation><xs:documentation>The localizable key for the registry value.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="KeyPath" type="YesNoType">
                <xs:annotation><xs:documentation>
                    Set this attribute to 'yes' to make this registry key the KeyPath of the parent component.  Only one resource (registry,
                    file, etc) can be the KeyPath of a component.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Name" type="xs:string">
                <xs:annotation><xs:documentation>
                    The localizable registry value name.  If this attribute is not provided the default value for the registry key will 
                    be set instead.  The Windows Installer allows several special values to be set for this attribute.  You should not
                    use them in WiX.  Instead use appropriate values in the Action attribute to get the desired behavior.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Root">
                <xs:annotation>
                    <xs:documentation>
                        The predefined root key for the registry value.
                    </xs:documentation>
                </xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="HKMU">
                            <xs:annotation>
                                <xs:documentation>
                                    A per-user installation will make the operation occur under HKEY_CURRENT_USER.
                                    A per-machine installation will make the operation occur under HKEY_LOCAL_MACHINE.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="HKCR">
                            <xs:annotation>
                                <xs:documentation>
                                    Operation occurs under HKEY_CLASSES_ROOT.  When using Windows 2000 or later, the installer writes or removes the value 
                                    from the HKCU\Software\Classes hive during per-user installations.  When using Windows 2000 or later operating systems,
                                    the installer writes or removes the value from the HKLM\Software\Classes hive during per-machine installations.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="HKCU">
                            <xs:annotation>
                                <xs:documentation>
                                    Operation occurs under HKEY_CURRENT_USER.  It is recommended to set the KeyPath='yes' attribute when setting this value
                                    in order to ensure that the installer writes the necessary registry entries when there are multiple users on the same computer.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="HKLM">
                            <xs:annotation>
                                <xs:documentation>
                                    Operation occurs under HKEY_LOCAL_MACHINE.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="HKU">
                            <xs:annotation>
                                <xs:documentation>
                                    Operation occurs under HKEY_USERS.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="Type">
                <xs:annotation>
                    <xs:documentation>
                        Set this attribute to the type of the desired registry key.  This attribute must be specified whenever the Value
                        attribute or a child RegistryValue element is specified.    This attribute
                        should only be set when the value of the Action attribute does not include the word 'remove'.
                    </xs:documentation>
                </xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="string">
                            <xs:annotation>
                                <xs:documentation>
                                    The value is interpreted and stored as a string (REG_SZ).
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="integer">
                            <xs:annotation>
                                <xs:documentation>
                                    The value is interpreted and stored as an integer (REG_DWORD).
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="binary">
                            <xs:annotation>
                                <xs:documentation>
                                    The value is interpreted and stored as a hexadecimal value (REG_BINARY).
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="expandable">
                            <xs:annotation>
                                <xs:documentation>
                                    The value is interpreted and stored as an expandable string (REG_EXPAND_SZ).
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="multiString">
                            <xs:annotation>
                                <xs:documentation>
                                    The value is interpreted and stored as a multiple strings (REG_MULTI_SZ).
                                    Please note that this value will only result in a multi-string value if there is more than one registry value
                                    or the Action attribute's value is 'append' or 'prepend'.  Otherwise a string value will be created.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="Value" type="xs:string">
                <xs:annotation><xs:documentation>
                    Set this attribute to the localizable registry value.  This value is formatted.  The Windows Installer allows
                    several special values to be set for this attribute.  You should not use them in WiX.  Instead use appropriate
                    values in the Type attribute to get the desired behavior.  This attribute cannot be specified if the Action
                    attribute's value contains the word 'remove'.
                </xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="RemoveFile">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="CopyFile" />
                <xse:msiRef table="RemoveFile" />
            </xs:appinfo>
            <xs:documentation>
                Remove a file(s) if the parent component is selected for installation or removal.  Multiple files can be removed
                by specifying a wildcard for the value of the Name attribute.  By default, the source
                directory of the file is the directory of the parent component.  This can be overridden by specifying the
                Directory attribute with a value corresponding to the Id of the source directory, or by specifying the Property
                attribute with a value corresponding to a property that will have a value that resolves to the full path
                to the source directory.
            </xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Primary key used to identify this particular entry.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Directory" type="xs:string">
                <xs:annotation><xs:documentation>
                    Overrides the directory of the parent component with a specific Directory.  This Directory must exist in the
                    installer database at creation time.  This attribute cannot be specified in conjunction with the Property attribute.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Property" type="xs:string">
                <xs:annotation><xs:documentation>
                    Overrides the directory of the parent component with the value of the specified property.  The property
                    should have a value that resolves to the full path of the source directory.  The property does not have
                    to exist in the installer database at creation time; it could be created at installation time by a custom
                    action, on the command line, etc.  This attribute cannot be specified in conjunction with the Directory attribute.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Name" type="WildCardShortFileNameType">
                <xs:annotation><xs:documentation>
                    This value should be set to the localizable name of the file(s) to be removed.  All of the files that
                    match the wild card will be removed from the specified directory.  The value is a filename that may also
                    contain the wild card characters "?" for any single character or "*" for zero or more occurrences of any character.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="LongName" type="WildCardLongFileNameType">
                <xs:annotation><xs:documentation>
                    If the name of the file(s) to be removed need to be longer than 8.3 format, then this attribute should be specified
                    with the long file name (in addition to the Name attribute which is always required for target systems that might
                    not support long file names).  All of the files that
                    match the wild card will be removed from the specified directory.  The value is a filename that may also
                    contain the wild card characters "?" for any single character or "*" for zero or more occurrences of any character.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="On" use="required">
                <xs:annotation>
                    <xs:documentation>
                        This value determines the time at which the file(s) may be removed.
                    </xs:documentation>
                </xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="install">
                            <xs:annotation>
                                <xs:documentation>
                                    Removes the file only when the parent component is being installed (msiInstallStateLocal or msiInstallStateSource).
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="uninstall">
                            <xs:annotation>
                                <xs:documentation>
                                    Removes the file only when the parent component is being removed (msiInstallStateAbsent).
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="both">
                            <xs:annotation>
                                <xs:documentation>
                                    Removes the file when the parent component is being installed or removed.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    
    <xs:element name="RemoveFolder">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="CreateFolder" />
                <xse:msiRef table="RemoveFile" />
            </xs:appinfo>
            <xs:documentation>
                Remove an empty folder if the parent component is selected for installation or removal.  By default, the folder
                is the directory of the parent component.  This can be overridden by specifying the Directory attribute
                with a value corresponding to the Id of the directory, or by specifying the Property attribute with a value
                corresponding to a property that will have a value that resolves to the full path of the folder.
            </xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Primary key used to identify this particular entry.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Directory" type="xs:string">
                <xs:annotation><xs:documentation>
                    Overrides the directory of the parent component with a specific Directory.  This Directory must exist in the
                    installer database at creation time.  This attribute cannot be specified in conjunction with the Property attribute.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Property" type="xs:string">
                <xs:annotation><xs:documentation>
                    Overrides the directory of the parent component with the value of the specified property.  The property
                    should have a value that resolves to the full path of the source directory.  The property does not have
                    to exist in the installer database at creation time; it could be created at installation time by a custom
                    action, on the command line, etc.  This attribute cannot be specified in conjunction with the Directory attribute.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="On" use="required">
                <xs:annotation>
                    <xs:documentation>
                        This value determines the time at which the folder may be removed.
                    </xs:documentation>
                </xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="install">
                            <xs:annotation>
                                <xs:documentation>
                                    Removes the folder only when the parent component is being installed (msiInstallStateLocal or msiInstallStateSource).
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="uninstall">
                            <xs:annotation>
                                <xs:documentation>
                                    Removes the folder only when the parent component is being removed (msiInstallStateAbsent).
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="both">
                            <xs:annotation>
                                <xs:documentation>
                                    Removes the folder when the parent component is being installed or removed.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="CreateFolder">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="RemoveFolder" />
                <xse:msiRef table="CreateFolder" />
            </xs:appinfo>
            <xs:documentation>Create folder as part of parent Component.</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="Shortcut" minOccurs="0" maxOccurs="unbounded">
                    <xs:annotation><xs:documentation>Non-advertised shortcut to this folder, Shortcut Target is preset to the folder</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="Permission" minOccurs="0" maxOccurs="unbounded">
                    <xs:annotation><xs:documentation>ACL permission</xs:documentation></xs:annotation>
                </xs:element>
            </xs:choice>
            <xs:attribute name="Directory" type="xs:string">
                <xs:annotation><xs:documentation>Identifier of Directory to create.  Defaults to Directory of parent Component.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="AppData" type="xs:string">
        <xs:annotation><xs:documentation>Optional way for defining AppData, generally used for complex CDATA.</xs:documentation></xs:annotation>
    </xs:element>

    <xs:element name="Category">
        <xs:annotation>
            <xs:documentation>
                Qualified published component for parent Component
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="PublishComponent" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="AppData" />
            </xs:sequence>
            <xs:attribute name="Id" use="required" type="uuid">
                <xs:annotation><xs:documentation>A string GUID that represents the category of components being grouped together.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Qualifier" use="required" type="xs:string">
                <xs:annotation><xs:documentation>A text string that qualifies the value in the Id attribute.  A qualifier is used to distinguish multiple forms of the same Component, such as a Component that is implemented in multiple languages.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="AppData" type="xs:string">
                <xs:annotation><xs:documentation>An optional localizable text describing the category.  The string is commonly parsed by the application and can be displayed to the user.  It should describe the category.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Feature" type="xs:string">
                <xs:annotation><xs:documentation>Feature that controls the advertisement of the category.  Defaults to the primary Feature for the parent Component .</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="MIME">
        <xs:annotation>
            <xs:documentation>
                MIME content-type for an Extension
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="MIME" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="ContentType" type="xs:string" use="required">
                <xs:annotation><xs:documentation>This is the identifier for the MIME content.  It is commonly written in the form of type/format.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Class" type="uuid">
                <xs:annotation><xs:documentation>Class ID for the COM server that is to be associated with the MIME content.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Default" type="YesNoType">
                <xs:annotation><xs:documentation>If 'yes', become the content type for the parent Extension.  The default value is 'no'.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="Verb">
        <xs:annotation>
            <xs:documentation>
            Verb definition for an Extension.  When advertised, this element creates a row in the 
            <html:a href='http://msdn.microsoft.com/library/en-us/msi/setup/verb_table.asp'>Verb table</html:a>.
            When not advertised, this element creates the appropriate rows in <html:a href='http://msdn.microsoft.com/library/en-us/msi/setup/registry_table.asp'>Registry table</html:a>.
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="Verb" />
                <xse:msiRef table="Registry" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>The verb for the command.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Command" type="xs:string">
                <xs:annotation><xs:documentation>The localized text displayed on the context menu.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Argument" type="xs:string">
                <xs:annotation><xs:documentation>Value for the command arguments.  Note that the resolution of properties in the 
                Argument field is limited. A property formatted as [Property] in this field can only be resolved if the property 
                already has the intended value when the component owning the verb is installed. For example, for the argument 
                "[#MyDoc.doc]" to resolve to the correct value, the same process must be installing the file MyDoc.doc and the 
                component that owns the verb.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Sequence" type="xs:integer">
                <xs:annotation><xs:documentation>The sequence of the commands. Only verbs for which the Sequence is specified
                are used to prepare an ordered list for the default value of the shell key. The Verb with the lowest value in this 
                column becomes the default verb. Used only for Advertised verbs.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Target" type="xs:string">
                <xs:annotation><xs:documentation>Target file to be executed for the verb. The value should be a formatted Property to refer to the short path to the file, for example: [!TargetFileId]. Only valid for non-Advertised verbs.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="Extension">
        <xs:annotation>
            <xs:documentation>
                Extension for a Component
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="MIME" />
                <xse:msiRef table="Verb" />
                <xse:msiRef table="Registry" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:annotation><xs:documentation>MIME and Verbs can be associated with Extensions</xs:documentation></xs:annotation>
                <xs:element ref="MIME"/>
                <xs:element ref="Verb"/>
            </xs:choice>

            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>This is simply the file extension, like "doc" or "xml".  Do not include the preceding period.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="ContentType" type="xs:string">
                <xs:annotation><xs:documentation>The MIME type that is to be written.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Advertise" type="YesNoType">
                <xs:annotation><xs:documentation>Whether this extension is to be advertised. The default is "no".</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="TypeLib">
        <xs:annotation>
            <xs:documentation>
                Register a type library (TypeLib).  Please note that in order to properly use this
                non-advertised, you will need use this element with Advertise='no' and also author the
                appropriate child Interface elements by extracting them from the type library itself.
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="TypeLib" />
                <xse:msiRef table="Registry" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="AppId"/>
                <xs:element ref="Class"/>
                <xs:element ref="Interface"/>
            </xs:choice>

            <xs:attribute name="Id" type="uuid" use="required">
                <xs:annotation><xs:documentation>The GUID that identifes the type library.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Advertise" type="YesNoType">
                <xs:annotation><xs:documentation>
                    Value of 'yes' will create a row in the TypeLib table.
                    Value of 'no' will create rows in the Registry table.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Control" type="YesNoType">
                <xs:annotation><xs:documentation>
                    Value of 'yes' means the type library describes controls, and should not be displayed in type browsers intended for nonvisual objects.
                    This attribute can only be set if Advertise='no'.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Cost" type="xs:int">
                <xs:annotation><xs:documentation>
                    The cost associated with the registration of the type library in bytes.  This attribute cannot be set if Advertise='no'.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Description" type="xs:string">
                <xs:annotation><xs:documentation>The localizable description of the type library.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="HasDiskImage" type="YesNoType">
                <xs:annotation><xs:documentation>
                    Value of 'yes' means the type library exists in a persisted form on disk.  This attribute can only be set if Advertise='no'.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="HelpDirectory" type="xs:string">
                <xs:annotation><xs:documentation>The identifier of the Directory element for the help directory.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Hidden" type="YesNoType">
                <xs:annotation><xs:documentation>
                    Value of 'yes' means the type library should not be displayed to users, although its use is not restricted.
                    Should be used by controls.  Hosts should create a new type library that wraps the control with extended properties.
                    This attribute can only be set if Advertise='no'.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Language" use="required" type="xs:integer">
                <xs:annotation><xs:documentation>The language of the type library.  This must be a non-negative integer.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="MajorVersion" type="xs:string">
                <xs:annotation><xs:documentation>The major version of the type library.  The value should be an integer from 0 - 255.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="MinorVersion" type="xs:string">
                <xs:annotation><xs:documentation>The minor version of the type library.  The value should be an integer from 0 - 255.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="ResourceId" type="xs:integer">
                <xs:annotation><xs:documentation>The resource id of a typelib.  The value is appended to the end of the typelib path in the registry.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Restricted" type="YesNoType">
                <xs:annotation><xs:documentation>
                    Value of 'yes' means the type library is restricted, and should not be displayed to users.  This attribute can only be set if Advertise='no'.
                </xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="ProgId">
        <xs:annotation>
            <xs:documentation>
                ProgId registration for parent Component.  If ProgId has an associated Class, it must be a child of that element.
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="ProgId" />
                <xse:msiRef table="Class" />
                <xse:msiRef table="Registry" />
                <xse:msiRef table="Icon" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="ProgId" minOccurs="0">
                    <xs:annotation><xs:documentation>Version-independent ProgId must be child element of actual ProgId.  Nesting further ProgId elements within the Version-independent ProgId is disallowed.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="Extension" minOccurs="0" maxOccurs="unbounded">
                    <xs:annotation><xs:documentation>extensions that refer to this ProgId</xs:documentation></xs:annotation>
                </xs:element>
            </xs:sequence>

            <xs:attribute name="Id" type="xs:string" use="required"/>
            <xs:attribute name="Description" type="xs:string"/>
            <xs:attribute name="Icon" type="xs:string">
                <xs:annotation><xs:documentation>reference to Icon element</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="IconIndex" type="xs:integer"/>
            <xs:attribute name="Advertise" type="YesNoType"/>
            <xs:attribute name="NoOpen" type="xs:string">
                <xs:annotation><xs:documentation>Specifies that the associated ProgId should not be opened by users. The value is presented as a warning to users. An empty string is also valid for this attribute. See <html:a href='http://msdn.microsoft.com/library/en-us/dnwue/html/ch11c.asp'>the MSDN documentation</html:a> for more information.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="AppId">
        <xs:annotation>
            <xs:documentation>
                Application ID containing DCOM information for the associated application GUID.  
                If this element is nested under a Fragment, Module, or Product element, it must be
                advertised.
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="AppId" />
                <xse:msiRef table="Registry" />
                <xse:remarks>
                    When being used in unadvertised mode, the attributes in the AppId element correspond to registry keys
                    as follows (values that can be specified in authoring are in bold):
                    <html:dl>
                        <html:dt>Id</html:dt>
                        <html:dd>
                            <html:dl>
                                <html:dt>In General</html:dt>
                                <html:dd>
                                    [HKCR\AppID\{<html:b>Id</html:b>}]<html:br/>
                                </html:dd>
                                <html:dt>Specific Example</html:dt>
                                <html:dd>
                                    [HKCR\AppID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}]<html:br/>
                                </html:dd>
                            </html:dl>
                        </html:dd>
                        <html:dt>ActivateAtStorage</html:dt>
                        <html:dd>
                            <html:dl>
                                <html:dt>In General</html:dt>
                                <html:dd>
                                    [HKCR\AppID\{<html:b>Id</html:b>}]<html:br/>
                                    ActivateAtStorage="<html:b>ActivateAtStorage</html:b>"
                                </html:dd>
                                <html:dt>Specific Example</html:dt>
                                <html:dd>
                                    [HKCR\AppID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}]<html:br/>
                                    ActivateAtStorage="<html:b>Y</html:b>"
                                </html:dd>
                            </html:dl>
                        </html:dd>
                        <html:dt>Description</html:dt>
                        <html:dd>
                            <html:dl>
                                <html:dt>In General</html:dt>
                                <html:dd>
                                    [HKCR\AppID\{<html:b>Id</html:b>}]<html:br/>
                                    @="<html:b>Description</html:b>"
                                </html:dd>
                                <html:dt>Specific Example</html:dt>
                                <html:dd>
                                    [HKCR\AppID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}]<html:br/>
                                    @="<html:b>My AppId Description</html:b>"
                                </html:dd>
                            </html:dl>
                        </html:dd>
                        <html:dt>DllSurrogate</html:dt>
                        <html:dd>
                            <html:dl>
                                <html:dt>In General</html:dt>
                                <html:dd>
                                    [HKCR\AppID\{<html:b>Id</html:b>}]<html:br/>
                                    DllSurrogate="<html:b>DllSurrogate</html:b>"
                                </html:dd>
                                <html:dt>Specific Example</html:dt>
                                <html:dd>
                                    [HKCR\AppID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}]<html:br/>
                                    DllSurrogate="<html:b>C:\surrogate.exe</html:b>"
                                </html:dd>
                            </html:dl>
                        </html:dd>
                        <html:dt>LocalService</html:dt>
                        <html:dd>
                            <html:dl>
                                <html:dt>In General</html:dt>
                                <html:dd>
                                    [HKCR\AppID\{<html:b>Id</html:b>}]<html:br/>
                                    LocalService="<html:b>LocalService</html:b>"
                                </html:dd>
                                <html:dt>Specific Example</html:dt>
                                <html:dd>
                                    [HKCR\AppID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}]<html:br/>
                                    LocalService="<html:b>MyServiceName</html:b>"
                                </html:dd>
                            </html:dl>
                        </html:dd>
                        <html:dt>RemoteServerName</html:dt>
                        <html:dd>
                            <html:dl>
                                <html:dt>In General</html:dt>
                                <html:dd>
                                    [HKCR\AppID\{<html:b>Id</html:b>}]<html:br/>
                                    RemoteServerName="<html:b>RemoteServerName</html:b>"
                                </html:dd>
                                <html:dt>Specific Example</html:dt>
                                <html:dd>
                                    [HKCR\AppID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}]<html:br/>
                                    RemoteServerName="<html:b>MyRemoteServer</html:b>"
                                </html:dd>
                            </html:dl>
                        </html:dd>
                        <html:dt>RunAsInteractiveUser</html:dt>
                        <html:dd>
                            <html:dl>
                                <html:dt>In General</html:dt>
                                <html:dd>
                                    [HKCR\AppID\{<html:b>Id</html:b>}]<html:br/>
                                    RunAs="<html:b>RunAsInteractiveUser</html:b>"
                                </html:dd>
                                <html:dt>Specific Example</html:dt>
                                <html:dd>
                                    [HKCR\AppID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}]<html:br/>
                                    RunAs="<html:b>Interactive User</html:b>"
                                </html:dd>
                            </html:dl>
                        </html:dd>
                        <html:dt>ServiceParameters</html:dt>
                        <html:dd>
                            <html:dl>
                                <html:dt>In General</html:dt>
                                <html:dd>
                                    [HKCR\AppID\{<html:b>Id</html:b>}]<html:br/>
                                    ServiceParameters="<html:b>ServiceParameters</html:b>"
                                </html:dd>
                                <html:dt>Specific Example</html:dt>
                                <html:dd>
                                    [HKCR\AppID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}]<html:br/>
                                    ServiceParameters="<html:b>-param</html:b>"
                                </html:dd>
                            </html:dl>
                        </html:dd>
                    </html:dl>
                </xse:remarks>
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="Class"/>
            </xs:choice>

            <xs:attribute name="ActivateAtStorage" type="YesNoType">
                <xs:annotation><xs:documentation>
                    Set this value to 'yes' to configure the client to activate on the same system as persistent storage.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Advertise" type="YesNoType">
                <xs:annotation><xs:documentation>
                    Set this value to 'yes' in order to create a normal AppId table row.  Set this value to 'no' in order to
                    generate Registry rows that perform similar registration (without the often problematic Windows Installer
                    advertising behavior).
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Description" type="xs:string">
                <xs:annotation><xs:documentation>
                    Set this value to the description of the AppId.  It can only be specified when the AppId is not being advertised.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="DllSurrogate" type="xs:string">
                <xs:annotation><xs:documentation>
                    Set this value to specify that the class is a DLL that is to be activated in a surrogate EXE 
                    process, and the surrogate process to be used is the path of a surrogate EXE file specified by the value.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Id" type="uuid" use="required">
                <xs:annotation><xs:documentation>
                    Set this value to the AppID GUID that corresponds to the named executable.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="LocalService" type="xs:string">
                <xs:annotation><xs:documentation>
                    Set this value to the name of a service to allow the object to be installed as a Win32 service.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="RemoteServerName" type="xs:string">
                <xs:annotation><xs:documentation>
                    Set this value to the name of the remote server to configure the client to request the object
                    be run at a particular machine whenever an activation function is called for which a COSERVERINFO
                    structure is not specified.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="RunAsInteractiveUser" type="YesNoType">
                <xs:annotation><xs:documentation>
                    Set this value to 'yes' to configure a class to run under the identity of the user currently
                    logged on and connected to the interactive desktop when activated by a remote client without
                    being written as a Win32 service.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="ServiceParameters" type="xs:string">
                <xs:annotation><xs:documentation>
                    Set this value to the parameters to be passed to a LocalService on invocation.
                </xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="Class">
        <xs:annotation>
            <xs:documentation>COM Class registration for parent Component.</xs:documentation>
            <xs:appinfo>
                <xse:seeAlso ref="AppId"/>
                <xse:msiRef table="Class" />
                <xse:msiRef table="ProgId" />
                <xse:msiRef table="Registry" />
                <xse:msiRef table="AppId" />
                <xse:remarks>
                    When being used in unadvertised mode, the attributes in the Class element correspond to registry keys
                    as follows (values that can be specified in authoring are in bold):
                    <html:dl>
                        <html:dt>Id/Context/Server</html:dt>
                        <html:dd>
                            <html:dl>
                                <html:dt>In General</html:dt>
                                <html:dd>
                                    [HKCR\CLSID\{<html:b>Id</html:b>}\<html:b>Context1</html:b>]<html:br/>
                                    @="[!<html:b>Server</html:b>]"<html:br/>
                                    [HKCR\CLSID\{<html:b>Id</html:b>}\<html:b>Context2</html:b>]<html:br/>
                                    @="[!<html:b>Server</html:b>]"
                                </html:dd>
                                <html:dt>Specific Example</html:dt>
                                <html:dd>
                                    [HKCR\CLSID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}\<html:b>LocalServer</html:b>]<html:br/>
                                    @="[!<html:b>comserv.dll</html:b>]"<html:br/>
                                    [HKCR\CLSID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}\<html:b>LocalServer32</html:b>]<html:br/>
                                    @="[!<html:b>comserv.dll</html:b>]"
                                </html:dd>
                            </html:dl>
                        </html:dd>
                        <html:dt>AppId</html:dt>
                        <html:dd>
                            <html:dl>
                                <html:dt>In General</html:dt>
                                <html:dd>
                                    [HKCR\CLSID\{<html:b>Id</html:b>}]<html:br/>
                                    AppId="{<html:b>AppId</html:b>}"
                                </html:dd>
                                <html:dt>Specific Example</html:dt>
                                <html:dd>
                                    [HKCR\CLSID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}]<html:br/>
                                    AppId="{<html:b>00000000-89AB-0000-0123-000000000000</html:b>}"
                                </html:dd>
                            </html:dl>
                        </html:dd>
                        <html:dt>Argument</html:dt>
                        <html:dd>
                            <html:dl>
                                <html:dt>In General</html:dt>
                                <html:dd>
                                    [HKCR\CLSID\{<html:b>Id</html:b>}\<html:b>Context</html:b>]<html:br/>
                                    @="[!<html:b>Server</html:b>] <html:b>Argument</html:b>"
                                </html:dd>
                                <html:dt>Specific Example</html:dt>
                                <html:dd>
                                    [HKCR\CLSID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}\<html:b>LocalServer32</html:b>]<html:br/>
                                    @="[!<html:b>comserv.dll</html:b>] <html:b>/arg1 /arg2 /arg3</html:b>"<html:br/>
                                </html:dd>
                            </html:dl>
                        </html:dd>
                        <html:dt>Control</html:dt>
                        <html:dd>
                            <html:dl>
                                <html:dt>In General</html:dt>
                                <html:dd>
                                    Value "yes" specified:<html:br/>
                                    [HKCR\CLSID\{<html:b>Id</html:b>}\Control]
                                </html:dd>
                                <html:dt>Specific Example</html:dt>
                                <html:dd>
                                    [HKCR\CLSID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}\Control]
                                </html:dd>
                            </html:dl>
                        </html:dd>
                        <html:dt>Description</html:dt>
                        <html:dd>
                            <html:dl>
                                <html:dt>In General</html:dt>
                                <html:dd>
                                    [HKCR\CLSID\{<html:b>Id</html:b>}]<html:br/>
                                    @="<html:b>Description</html:b>"
                                </html:dd>
                                <html:dt>Specific Example</html:dt>
                                <html:dd>
                                    [HKCR\CLSID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}]<html:br/>
                                    @="<html:b>Description of Example COM Component</html:b>"
                                </html:dd>
                            </html:dl>
                        </html:dd>
                        <html:dt>Handler</html:dt>
                        <html:dd>
                            <html:dl>
                                <html:dt>In General</html:dt>
                                <html:dd>
                                    Value "1" specified:<html:br/>
                                    [HKCR\CLSID\{<html:b>Id</html:b>}\InprocHandler]<html:br/>
                                    @="ole.dll"<html:br/>
                                    Value "2" specified:<html:br/>
                                    [HKCR\CLSID\{<html:b>Id</html:b>}\InprocHandler32]<html:br/>
                                    @="ole32.dll"<html:br/>
                                    Value "3" specified:<html:br/>
                                    [HKCR\CLSID\{<html:b>Id</html:b>}\InprocHandler]<html:br/>
                                    @="ole.dll"<html:br/>
                                    [HKCR\CLSID\{<html:b>Id</html:b>}\InprocHandler32]<html:br/>
                                    @="ole32.dll"<html:br/>
                                    Other value specified:<html:br/>
                                    [HKCR\CLSID\{<html:b>Id</html:b>}\InprocHandler32]<html:br/>
                                    @="<html:b>Handler</html:b>"
                                </html:dd>
                                <html:dt>Specific Example (for other value)</html:dt>
                                <html:dd>
                                    [HKCR\CLSID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}\InprocHandler32]<html:br/>
                                    @="<html:b>handler.dll</html:b>"
                                </html:dd>
                            </html:dl>
                        </html:dd>
                        <html:dt>Icon/IconIndex</html:dt>
                        <html:dd>This is not currently handled properly.</html:dd>
                        <html:dt>Insertable</html:dt>
                        <html:dd>
                            <html:dl>
                                <html:dt>In General</html:dt>
                                <html:dd>
                                    Value "no" specified:<html:br/>
                                    [HKCR\CLSID\{<html:b>Id</html:b>}\NotInsertable]<html:br/>
                                    Value "yes" specified:<html:br/>
                                    [HKCR\CLSID\{<html:b>Id</html:b>}\Insertable]
                                </html:dd>
                                <html:dt>Specific Example</html:dt>
                                <html:dd>
                                    [HKCR\CLSID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}\Insertable]
                                </html:dd>
                            </html:dl>
                        </html:dd>
                        <html:dt>Programmable</html:dt>
                        <html:dd>
                            <html:dl>
                                <html:dt>In General</html:dt>
                                <html:dd>
                                    Value "yes" specified:<html:br/>
                                    [HKCR\CLSID\{<html:b>Id</html:b>}\Programmable]
                                </html:dd>
                                <html:dt>Specific Example</html:dt>
                                <html:dd>
                                    [HKCR\CLSID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}\Programmable]
                                </html:dd>
                            </html:dl>
                        </html:dd>
                        <html:dt>RelativePath</html:dt>
                        <html:dd>Unsupported.  Please contribute this back to WiX if you know.</html:dd>
                        <html:dt>SafeForInitializing</html:dt>
                        <html:dd>
                            <html:dl>
                                <html:dt>In General</html:dt>
                                <html:dd>
                                    Value "yes" specified:<html:br/>
                                    [HKCR\CLSID\{<html:b>Id</html:b>}\Implemented Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}]
                                </html:dd>
                                <html:dt>Specific Example</html:dt>
                                <html:dd>
                                    [HKCR\CLSID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}\Implemented Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}]
                                </html:dd>
                            </html:dl>
                        </html:dd>
                        <html:dt>SafeForScripting</html:dt>
                        <html:dd>
                            <html:dl>
                                <html:dt>In General</html:dt>
                                <html:dd>
                                    Value "yes" specified:<html:br/>
                                    [HKCR\CLSID\{<html:b>Id</html:b>}\Implemented Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}]
                                </html:dd>
                                <html:dt>Specific Example</html:dt>
                                <html:dd>
                                    [HKCR\CLSID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}\Implemented Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}]
                                </html:dd>
                            </html:dl>
                        </html:dd>
                        <html:dt>ThreadingModel</html:dt>
                        <html:dd>
                            <html:dl>
                                <html:dt>In General</html:dt>
                                <html:dd>
                                    [HKCR\CLSID\{<html:b>Id</html:b>}\<html:b>Context</html:b>]<html:br/>
                                    ThreadingModel="<html:b>ThreadingModel</html:b>"
                                </html:dd>
                                <html:dt>Specific Example</html:dt>
                                <html:dd>
                                    [HKCR\CLSID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}\<html:b>LocalServer32</html:b>]<html:br/>
                                    ThreadingModel="<html:b>Apartment</html:b>"
                                </html:dd>
                            </html:dl>
                        </html:dd>
                        <html:dt>TypeLibId (from parent TypeLib/@Id)</html:dt>
                        <html:dd>
                            <html:dl>
                                <html:dt>In General</html:dt>
                                <html:dd>
                                    [HKCR\CLSID\{<html:b>Id</html:b>}\TypeLib]<html:br/>
                                    @="{<html:b>TypeLibId</html:b>}"
                                </html:dd>
                                <html:dt>Specific Example</html:dt>
                                <html:dd>
                                    [HKCR\CLSID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}\TypeLib]<html:br/>
                                    @="{<html:b>11111111-89AB-1111-0123-111111111111</html:b>}"
                                </html:dd>
                            </html:dl>
                        </html:dd>
                        <html:dt>Version</html:dt>
                        <html:dd>
                            <html:dl>
                                <html:dt>In General</html:dt>
                                <html:dd>
                                    [HKCR\CLSID\{<html:b>Id</html:b>}\Version]<html:br/>
                                    @="<html:b>Version</html:b>"
                                </html:dd>
                                <html:dt>Specific Example</html:dt>
                                <html:dd>
                                    [HKCR\CLSID\{<html:b>01234567-89AB-CDEF-0123-456789ABCDEF</html:b>}\Version]<html:br/>
                                    @="<html:b>1.0.0.0</html:b>"
                                </html:dd>
                            </html:dl>
                        </html:dd>
                    </html:dl>
                </xse:remarks>
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="ProgId">
                    <xs:annotation><xs:documentation>A ProgId associated with Class must be a child element of the Class element</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="FileTypeMask"/>
                <xs:element ref="Interface">
                    <xs:annotation><xs:documentation>These Interfaces will be registered with the parent Class and TypeLib (if present).</xs:documentation></xs:annotation>
                </xs:element>
            </xs:choice>

            <xs:attribute name="Id" type="uuid" use="required">
                <xs:annotation><xs:documentation>The Class identifier (CLSID) of a COM server.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Context" use="required">
                <xs:annotation><xs:documentation>The server context(s) for this server.</xs:documentation></xs:annotation>
                <xs:simpleType>
                    <xs:list>
                        <xs:simpleType>
                            <xs:restriction base="xs:NMTOKEN">
                                <xs:enumeration value="LocalServer">
                                    <xs:annotation>
                                        <xs:documentation>
                                            A 16-bit local server application.
                                        </xs:documentation>
                                    </xs:annotation>
                                </xs:enumeration>
                                <xs:enumeration value="LocalServer32">
                                    <xs:annotation>
                                        <xs:documentation>
                                            A 32-bit local server application.
                                        </xs:documentation>
                                    </xs:annotation>
                                </xs:enumeration>
                                <xs:enumeration value="InprocServer">
                                    <xs:annotation>
                                        <xs:documentation>
                                            A 16-bit in-process server DLL.
                                        </xs:documentation>
                                    </xs:annotation>
                                </xs:enumeration>
                                <xs:enumeration value="InprocServer32">
                                    <xs:annotation>
                                        <xs:documentation>
                                            A 32-bit in-process server DLL.
                                        </xs:documentation>
                                    </xs:annotation>
                                </xs:enumeration>
                            </xs:restriction>
                        </xs:simpleType>
                    </xs:list>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="Description" type="xs:string">
                <xs:annotation><xs:documentation>Localized description associated with the Class ID and Program ID.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="AppId" type="uuid">
                <xs:annotation><xs:documentation>
                    This attribute is only allowed when a Class is advertised.  Using this attribute will reference an Application ID
                    containing DCOM information for the associated application GUID.  The value must correspond to an AppId/@Id of an
                    AppId element nested under a Fragment, Module, or Product element.  To associate an AppId with a non-advertised
                    class, nest the class within a parent AppId element.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Icon" type="xs:string">
                <xs:annotation><xs:documentation>
                    The file providing the icon associated with this CLSID.  Reference to an Icon element
                    (should match the Id attribute of an Icon element).  This is currently not supported if the
                    value of the Advertise attribute is "no".
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="IconIndex" type="xs:integer">
                <xs:annotation><xs:documentation>Icon index into the icon file.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Handler" type="xs:string">
                <xs:annotation><xs:documentation>
                    The default inproc handler.  May be optionally provided only for Context = LocalServer or
                    LocalServer32.  Value of "1" creates a 16-bit InprocHandler (appearing as the InprocHandler
                    value).  Value of "2" creates a 32-bit InprocHandler (appearing as the InprocHandler32 value).
                    Value of "3" creates 16-bit as well as 32-bit InprocHandlers.  A non-numeric value is treated
                    as a system file that serves as the 32-bit InprocHandler (appearing as the InprocHandler32 value).
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Argument" type="xs:string">
                <xs:annotation><xs:documentation>
                    This column is optional only when the Context column is set to "LocalServer"
                    or "LocalServer32" server context. The text is registered as the argument against
                    the OLE server and is used by OLE for invoking the server.  Note that the resolution
                    of properties in the Argument field is limited. A property formatted as [Property] in
                    this field can only be resolved if the property already has the intended value when
                    the component owning the class is installed.  For example, for the argument "[#MyDoc.doc]"
                    to resolve to the correct value, the same process must be installing the file MyDoc.doc and the
                    component that owns the class.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="RelativePath" type="YesNoType">
                <xs:annotation><xs:documentation>
                    When the value is "yes", the bare file name can be used for COM servers. The installer
                    registers the file name only instead of the complete path.  This enables the server in
                    the current directory to take precedence and allows multiple copies of the same component.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Advertise" type="YesNoType">
                <xs:annotation><xs:documentation>
                    Set this value to "yes" in order to create a normal Class table row.  Set this value to
                    "no" in order to generate Registry rows that perform similar registration (without the
                    often problematic Windows Installer advertising behavior).
                </xs:documentation></xs:annotation>
            </xs:attribute>

            <!-- Following attributes are not advertised, but add the appropriate rows to the Registry table -->
            <xs:attribute name="ThreadingModel">
                <xs:annotation><xs:documentation>
                    Threading model for the CLSID.
                </xs:documentation></xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="apartment"/>
                        <xs:enumeration value="free"/>
                        <xs:enumeration value="both"/>
                        <xs:enumeration value="neutral"/>
                        <xs:enumeration value="single"/>
                        <xs:enumeration value="rental"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="Version" type="xs:string">
                <xs:annotation><xs:documentation>
                    Version for the CLSID.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Insertable" type="YesNoType">
                <xs:annotation><xs:documentation>
                    Specifies the CLISD may be insertable.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Programmable" type="YesNoType">
                <xs:annotation><xs:documentation>
                    Specifies the CLSID may be programmable.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Server" type="xs:string">
                <xs:annotation><xs:documentation>
                    May only be specified if the value of the Advertise attribute is "no".  File Id of the
                    COM server file.  If this element is nested under a File element, this value defaults to
                    the value of the parent File/@Id.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="SafeForScripting" type="YesNoType">
                <xs:annotation><xs:documentation>
                    May only be specified if the value of the Advertise attribute is "no".
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="SafeForInitializing" type="YesNoType">
                <xs:annotation><xs:documentation>
                    May only be specified if the value of the Advertise attribute is "no".
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Control" type="YesNoType">
                <xs:annotation><xs:documentation>
                    Set this attribute's value to 'yes' to identify an object as an ActiveX Control.  The default value is 'no'.
                    See <html:a href='http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/htm/reg_2fn0.asp'>http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/htm/reg_2fn0.asp</html:a> for more information.
                </xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="Interface">
        <xs:annotation>
            <xs:documentation>COM Interface registration for parent Typelib.</xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="Registry" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" type="uuid" use="required">
                <xs:annotation><xs:documentation>GUID identifier for COM Interface.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Name" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Name for COM Interface.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="ProxyStubClassId" type="uuid">
                <xs:annotation><xs:documentation>GUID CLSID for proxy stub to COM Interface.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="ProxyStubClassId32" type="uuid">
                <xs:annotation><xs:documentation>GUID CLSID for 32-bit proxy stub to COM Interface.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="NumMethods" type="xs:integer">
                <xs:annotation><xs:documentation>Number of methods implemented on COM Interface.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Versioned" type="YesNoType">
                <xs:annotation><xs:documentation>Determines whether a Typelib version entry should be created with the other COM Interface registry keys.  Default is 'yes'.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="FileTypeMask">
        <xs:annotation><xs:documentation>FileType data for class Id registration.</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:attribute name="Offset" type="xs:integer" use="required">
                <xs:annotation><xs:documentation>Offset into file. If positive, offset is from the beginning; if negative, offset is from the end.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Mask" type="HexType" use="required">
                <xs:annotation><xs:documentation>Hex value that is AND'd against the bytes in the file at Offset.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Value" type="HexType" use="required">
                <xs:annotation><xs:documentation>If the result of the AND'ing of Mask with the bytes in the file is Value, the file is a match for this File Type.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="ServiceDependency">
        <xs:annotation>
            <xs:documentation>
                Service or group of services that must start before the parent service.
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="ServiceInstall" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation>
                    <xs:documentation>
                        The value of this attribute should be one of the following:
                        <html:ol>
                            <html:li>The name (not the display name) of a previously installed service.</html:li>
                            <html:li>A foreign key referring to another ServiceInstall/@Id.</html:li>
                            <html:li>A group of services (in which case the Group attribute should be set to 'yes').</html:li>
                        </html:ol>
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Group" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>
                        Set to 'yes' to indicate that the value in the Id attribute is the name of a group of services.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="ServiceConfig">
        <xs:annotation>
            <xs:documentation>Service configuration information for failure actions.</xs:documentation>
            <xs:appinfo>
                <xse:remarks>
                    <html:dl>
                        <html:dd>Nesting a ServiceConfig element under a ServiceInstall element will result in the service being installed to be configured.</html:dd>
                        <html:dd>Nesting a ServiceConfig element under a component element will result in an already installed service to be configured.  If the service does not exist prior to the install of the MSI package, the install will fail.</html:dd>
                    </html:dl>
                </xse:remarks>
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="ServiceName" type="xs:string">
                <xs:annotation><xs:documentation>Required if not under a ServiceInstall element.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="FirstFailureActionType" use="required">
                <xs:annotation><xs:documentation>Action to take on the first failure of the service.</xs:documentation></xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="none"/>
                        <xs:enumeration value="reboot"/>
                        <xs:enumeration value="restart"/>
                        <xs:enumeration value="runCommand"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="SecondFailureActionType" use="required">
                <xs:annotation><xs:documentation>Action to take on the second failure of the service.</xs:documentation></xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="none"/>
                        <xs:enumeration value="reboot"/>
                        <xs:enumeration value="restart"/>
                        <xs:enumeration value="runCommand"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="ThirdFailureActionType" use="required">
                <xs:annotation><xs:documentation>Action to take on the third failure of the service.</xs:documentation></xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="none"/>
                        <xs:enumeration value="reboot"/>
                        <xs:enumeration value="restart"/>
                        <xs:enumeration value="runCommand"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="ResetPeriodInDays" type="xs:integer">
                <xs:annotation><xs:documentation>Number of days after which to reset the failure count to zero if there are no failures.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="RestartServiceDelayInSeconds" type="xs:integer">
                <xs:annotation><xs:documentation>If any of the three *ActionType attributes is "restart", this specifies the number of seconds to wait before doing so.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="ProgramCommandLine" type="xs:string">
                <xs:annotation><xs:documentation>If any of the three *ActionType attributes is "runCommand", this specifies the command to run when doing so.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="RebootMessage" type="xs:string">
                <xs:annotation><xs:documentation>If any of the three *ActionType attributes is "reboot", this specifies the message to broadcast to server users before doing so.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="ServiceInstall">
        <xs:annotation>
            <xs:documentation>
                Adds and removes services for parent Component.
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="ServiceInstall" />
                <xse:remarks>
                    The service executable installed will point to the KeyPath for the Component.
                    Therefore, you must ensure that the correct executable is either the first child
                    File element under this Component or explicitly mark the appropriate File element
                    as KeyPath='yes'.
                </xse:remarks>
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Permission" minOccurs="0" maxOccurs="unbounded">
                    <xs:annotation><xs:documentation>Permissions for this service.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="ServiceConfig" minOccurs="0" maxOccurs="1">
                    <xs:annotation><xs:documentation>Service Config: failure actions for service</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="ServiceDependency" minOccurs="0" maxOccurs="unbounded">
                    <xs:annotation><xs:documentation>ordered list of dependencies when installing services</xs:documentation></xs:annotation>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Unique identifier for this service.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Name" type="xs:string" use="required">
                <xs:annotation><xs:documentation>This column is the string that gives the service name to install.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="DisplayName" type="xs:string">
                <xs:annotation><xs:documentation>This column is the localizable string that user interface programs use to identify the service.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Type" use="required">
                <xs:annotation><xs:documentation>The Windows Installer does not currently support kernelDriver or systemDriver</xs:documentation></xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="ownProcess"/>
                        <xs:enumeration value="shareProcess"/>
                        <xs:enumeration value="kernelDriver"/>
                        <xs:enumeration value="systemDriver"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="Interactive" type="YesNoType">
                <xs:annotation><xs:documentation>Whether or not the service interacts with the desktop.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Start" use="required">
                <xs:annotation><xs:documentation>Determines when the service should be started. The Windows Installer does not support boot or system.</xs:documentation></xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="auto"/>
                        <xs:enumeration value="demand"/>
                        <xs:enumeration value="disabled"/>
                        <xs:enumeration value="boot"/>
                        <xs:enumeration value="system"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="ErrorControl" use="required">
                <xs:annotation><xs:documentation>Determines what action should be taken on an error.</xs:documentation></xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="ignore"/>
                        <xs:enumeration value="normal"/>
                        <xs:enumeration value="critical"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="Vital" type="YesNoType">
                <xs:annotation><xs:documentation>The overall install should fail if this service fails to install.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="LoadOrderGroup" type="xs:string">
                <xs:annotation><xs:documentation>The load ordering group that this service should be a part of.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Account" type="xs:string">
                <xs:annotation><xs:documentation>The acount under which to start the service. Valid only when ServiceType is ownProcess.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Password" type="xs:string">
                <xs:annotation><xs:documentation>The password for the account. Valid only when the account has a password.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Arguments" type="xs:string">
                <xs:annotation><xs:documentation>Contains any command line arguments or properties required to run the service.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Description" type="xs:string">
                <xs:annotation><xs:documentation>Sets the description of the service.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="EraseDescription" type="YesNoType">
                <xs:annotation><xs:documentation>Determines whether the existing service description will be ignored. If 'yes', the service description will be null, even if the Description attribute is set.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="ServiceArgument" type="xs:string">
        <xs:annotation>
            <xs:documentation>
                Argument used in ServiceControl parent
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="ServiceControl" />
            </xs:appinfo>
        </xs:annotation>
    </xs:element>

    <xs:element name="ServiceControl">
        <xs:annotation>
            <xs:documentation>
                Starts, stops, and removes services for parent Component. This element is used to control the state 
                of a service installed by the MSI or MSM file by using the start, stop and remove attributes.
                For example, Start='install' Stop='both' Remove='uninstall' would mean: start the service on install, 
                remove the service when the product is uninstalled, and stop the service both on install and uninstall.
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="ServiceControl" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="ServiceArgument" minOccurs="0" maxOccurs="unbounded">
                    <xs:annotation><xs:documentation>Ordered list of arguments used when modifying services.</xs:documentation></xs:annotation>
                </xs:element>
            </xs:sequence>

            <xs:attribute name="Id" type="xs:string" use="required"/>
            <xs:attribute name="Name" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Name of the service.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Start">
                <xs:annotation><xs:documentation>Specifies whether the service should be started on install, uninstall or both.</xs:documentation></xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="install"/>
                        <xs:enumeration value="uninstall"/>
                        <xs:enumeration value="both"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="Stop">
                <xs:annotation><xs:documentation>Specifies whether the service should be stopped on install, uninstall or both.</xs:documentation></xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="install"/>
                        <xs:enumeration value="uninstall"/>
                        <xs:enumeration value="both"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="Remove">
                <xs:annotation><xs:documentation>Specifies whether the service should be removed on install, uninstall or both.</xs:documentation></xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="install"/>
                        <xs:enumeration value="uninstall"/>
                        <xs:enumeration value="both"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="Wait" type="YesNoType">
                <xs:annotation><xs:documentation>Specifies whether or not to wait for the service to complete before continuing.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="Environment">
        <xs:annotation>
            <xs:documentation>
                Environment variables added or removed for parent Component
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="Environment" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Unique identifier for environment entry.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Name" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Name of the environment variable.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Value" type="xs:string">
                <xs:annotation><xs:documentation>Value to set into the environment variable.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Separator" type="xs:string">
                <xs:annotation><xs:documentation>Optional attribute to change the separator used between values.  By default a semi-colon is used.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Action">
                <xs:annotation><xs:documentation>Specfies whether the environmental variable should be created, set or removed when the parent component is installed.</xs:documentation></xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="create">
                            <xs:annotation><xs:documentation>Creates the environment variable if it does not exist, then set it during installation. This has no effect on the value of the environment variable if it already exists.</xs:documentation></xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="set">
                            <xs:annotation><xs:documentation>Creates the environment variable if it does not exist, and then set it during installation. If the environment variable exists, set it during the installation.</xs:documentation></xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="remove">
                            <xs:annotation><xs:documentation>Removes the environment variable during an installation. The installer only removes an environment variable during an installation if the name and value of the variable match the entries in the Name and Value fields of the Environment table. If you want to remove an environment variable, regardless of its value, use the '!' syntax, and leave the Value field empty.</xs:documentation></xs:annotation>
                        </xs:enumeration>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="Part">
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="all">
                            <xs:annotation>
                                <xs:documentation>
                                    This value is the entire environmental variable.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="first">
                            <xs:annotation>
                                <xs:documentation>
                                    This value is prefixed.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="last">
                            <xs:annotation>
                                <xs:documentation>
                                    This value is appended.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="Permanent" type="YesNoType">
                <xs:annotation><xs:documentation>Specifies that the environment variable should not be removed on uninstall.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="System" type="YesNoType">
                <xs:annotation><xs:documentation>
                    Specifies that the environment variable should be added to the system environment space.  The default
                    is 'no' which indicates the environment variable is added to the user environment space.
                </xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="Condition">
        <xs:annotation>
            <xs:documentation>
                Conditions for components, controls, features, and products. The condition is specified in the inner text of the element.
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="Component" />
                <xse:msiRef table="ControlCondition" />
                <xse:msiRef table="Condition" />
                <xse:msiRef table="LaunchCondition" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:string">
                    <xs:annotation><xs:documentation>
                        Under a Component element, the condition becomes the condition of the component.  Under a Control element, 
                        the condition becomes a ControlCondition entry.  Under a Feature element, the condition becomes a Condition
                        entry.  Under a Fragment or Product element, the condition becomes a LaunchCondition entry.
                    </xs:documentation></xs:annotation>
                    <xs:attribute name="Action">
                        <xs:annotation><xs:documentation>
                            Used only under Control elements and is required.  Allows specific actions to be applied to a control based
                            on the result of this condition.
                        </xs:documentation></xs:annotation>
                        <xs:simpleType>
                            <xs:restriction base="xs:NMTOKEN">
                                <xs:enumeration value="default"/>
                                <xs:enumeration value="enable"/>
                                <xs:enumeration value="disable"/>
                                <xs:enumeration value="hide"/>
                                <xs:enumeration value="show"/>
                            </xs:restriction>
                        </xs:simpleType>
                    </xs:attribute>
                    <xs:attribute name="Level" type="xs:string">
                        <xs:annotation><xs:documentation>
                            Used only under Feature elements and is required.  Allows modifying the level of a Feature based on the
                            result of this condition.
                        </xs:documentation></xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="Message" type="xs:string">
                        <xs:annotation><xs:documentation>
                            Used only under Fragment or Product elements and is required.  Set the value to the text to display when the
                            condition fails and the installation must be terminated.
                        </xs:documentation></xs:annotation>
                    </xs:attribute>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>

    <xs:element name="IsolateComponent">
        <xs:annotation>
            <xs:documentation>
                Shared Component to be privately replicated in folder of parent Component
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="IsolateComponent" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Shared" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Shared Component for this application Component</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="ReserveCost">
        <xs:annotation>
            <xs:documentation>
                Disk cost to reserve in a folder for running locally and/or from source
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="ReserveCost" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" type="xs:string" use="required"/>
            <xs:attribute name="Directory" type="xs:string">
                <xs:annotation><xs:documentation>Defaults to Directory of parent Component.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="RunLocal" type="xs:integer" use="required">
                <xs:annotation><xs:documentation>The number of bytes of disk space to reserve if the component is installed to run locally.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="RunFromSource" type="xs:integer" use="required">
                <xs:annotation><xs:documentation>The number of bytes of disk space to reserve if the component is installed to run from source.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="Component">
        <xs:annotation>
            <xs:documentation>Component for parent Directory</xs:documentation>
            <xs:appinfo>
                <xse:seeAlso ref="ComponentRef"/>
                <xse:seeAlso ref="Media"/>
                <xse:msiRef table="Component" />
                <xse:msiRef table="Condition" />
                <xse:msiRef table="Directory" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="AppId"/>
                <xs:element ref="Category"/>
                <xs:element ref="Class"/>
                <xs:element ref="Condition"/>
                <xs:element ref="CopyFile"/>
                <xs:element ref="CreateFolder"/>
                <xs:element ref="Environment"/>
                <xs:element ref="Extension"/>
                <xs:element ref="File"/>
                <xs:element ref="IniFile"/>
                <xs:element ref="Interface"/>
                <xs:element ref="IsolateComponent"/>
                <xs:element ref="ODBCDataSource"/>
                <xs:element ref="ODBCDriver"/>
                <xs:element ref="ODBCTranslator"/>
                <xs:element ref="ProgId"/>
                <xs:element ref="Registry"/>
                <xs:element ref="RemoveFile"/>
                <xs:element ref="RemoveFolder"/>
                <xs:element ref="ReserveCost"/>
                <xs:element ref="ServiceControl"/>
                <xs:element ref="ServiceInstall"/>
                <xs:element ref="Shortcut"/>
                <xs:element ref="TypeLib"/>
                <!-- server elements -->
                <xs:element ref="Certificate"/>
                <xs:element ref="FileShare"/>
                <xs:element ref="ServiceConfig"/>
                <xs:element ref="SqlDatabase"/>
                <xs:element ref="SqlScript"/>
                <xs:element ref="SqlString"/>
                <xs:element ref="User"/>
                <xs:element ref="WebAppPool"/>
                <xs:element ref="WebDir"/>
                <xs:element ref="WebFilter"/>
                <xs:element ref="WebProperty"/>
                <xs:element ref="WebServiceExtension"/>
                <xs:element ref="WebSite"/>
                <xs:element ref="WebVirtualDir"/>
                <xs:element ref="XmlFile"/>
                <xs:any namespace="##other" processContents="lax">
                    <xs:annotation><xs:documentation>
                        Extensibility point in the WiX XML Schema.  Schema extensions can register additional
                        elements at this point in the schema.
                    </xs:documentation></xs:annotation>
                </xs:any>
            </xs:choice>

            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Component identifier; this is the primary key for identifying components.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="ComPlusFlags" type="xs:integer">
                <xs:annotation>
                    <xs:documentation>
                        Set this attribute to create a ComPlus entry.  The value should be the export flags used
                        during the generation of the .msi file.  For more information see the COM+ documentation
                        in the Platform SDK.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="DisableRegistryReflection" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>
                        Set this attribute to 'yes' in order to disable registry reflection on all existing and
                        new registry keys affected by this component.
                        When set to 'yes', the Windows Installer calls the RegDisableReflectionKey on each key
                        being accessed by the component.
                        This bit is available with Windows Installer version 4.0 and is ignored on 32-bit systems.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="DiskId" type="xs:string">
                <xs:annotation>
                    <xs:documentation>
                        This attribute must be set either on a Component element or all of its children File
                        elements.  The value of this attribute should correspond to the Id attribute of a
                        Media element authored elsewhere.  By creating this connection between a component (or
                        particular files), you set the packaging options to the values specified in the Media
                        element (values such as compression level, cab embedding, etc...).
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="DriverAddRemovePrograms" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>
                        Specifies that the DIFxApp CustomActions should add an entry in the Add/Remove Programs Control
                        Panel applet.  The default is 'yes'.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="DriverDeleteFiles" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>
                        If set to "yes", configures DIFxApp to delete binary files that were copied to the system from the driver
                        store when a driver package was installed. If this attribute is set to "no" or not present, DIFxApp does not
                        remove these files from a system. Note that configuring DIFxApp to delete these files is controlled by the
                        Flags entry value of the component that represents the driver package in the MsiDriverPackages custom table.
                        Setting DriverDeleteFiles to "yes" sets the corresponding bit in the Flags entry value. Setting DriverLegacy
                        to "no" clears the corresponding bit in the Flags entry value. If this attribute is not present, DIFxApp uses
                        a default value of "no".
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="DriverForceInstall" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>
                        Specifies that the DIFxApp CustomActions should force the installation of a new Plug and Play driver 
                        on a device, even if the currently installed driver on the device is a better match than the new driver.
                        Specifying 'no' is an excellent way to ensure the DIFxApp CustomActions recognize the Component contains
                        a driver for installation.  The default is null which means the Component does not install a driver via
                        DIFxApp CustomActions. See <html:a href='http://www.microsoft.com/whdc/driver/install/difxtools.mspx'>http://www.microsoft.com/whdc/driver/install/difxtools.mspx</html:a>
                        for more information.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="DriverLegacy" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>
                        If set to "yes", configures DIFxApp to install unsigned driver packages and driver packages with missing
                        files. For more information, see "Installing Unsigned Driver Packages in Legacy Mode" earlier in this paper.
                        If this attribute is set to "no" or not present, DIFxApp will install only signed driver packages. Note
                        that configuring DIFxApp to install unsigned drivers is controlled by the Flags entry value of the component
                        that represents the driver package in the MsiDriverPackages custom table. Setting DriverLegacy to "yes" sets
                        the corresponding bit in the Flags entry value. Setting DriverLegacy to "no" clears the bit in the Flags
                        entry value that configures DIFxApp to install unsigned driver packages. If this attribute is not present,
                        DIFxApp uses a default value of "no". 
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="DriverPlugAndPlayPrompt" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>
                        Specifies that the DIFxApp CustomActions should prompt the user to connect the Plug and Play
                        device if it is not connected.  The default is 'yes'.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="DriverSequence" type="xs:integer">
                <xs:annotation>
                    <xs:documentation>
                        Specifies an optional installation sequence number. DIFxApp CustomActions install the driver packages in
                        an installation package in the order of increasing sequence numbers. The same sequence number can be used
                        for more than one driver; however, the order in which packages with the same sequence number are actually
                        installed cannot be determined.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Guid" type="ComponentGuid" use="required">
                <xs:annotation>
                    <xs:documentation>
                        This value should be a guid that uniquely identifies this component's contents, language, platform, and version.
                        It's also possible to set the value to an empty string to specify an unmanaged component.
                        Unmanaged components are a security vulnerability because the component cannot be removed or repaired
                        by Windows Installer (it is essentially an unpatchable, permanent component).  Therefore, a guid should
                        always be specified for any component which contains resources that may need to be patched in the future.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="KeyPath" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>
                        If this attribute's value is set to 'yes', then the Directory of this Component is used
                        as the KeyPath.  To set a Registry key or File as the KeyPath of a component, set the
                        KeyPath attribute to 'yes' on one of those child elements.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Location">
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="local">
                            <xs:annotation>
                                <xs:documentation>
                                    Prevents the component from running from the source or the network (this is the default behavior if this attribute is not set).
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="source">
                            <xs:annotation>
                                <xs:documentation>
                                    Enforces that the component can only be run from the source (it cannot be run from the user's computer).
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="either">
                            <xs:annotation>
                                <xs:documentation>
                                    Allows the component to run from source or locally.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="NeverOverwrite" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>
                        If this attribute is set to 'yes', the installer does not install or reinstall the
                        component if a key path file or a key path registry entry for the component already
                        exists.  The application does register itself as a client of the component.  Use this
                        flag only for components that are being registered by the Registry table.  Do not use
                        this flag for components registered by the AppId, Class, Extension, ProgId, MIME, and
                        Verb tables.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Permanent" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>
                        If this attribute is set to 'yes', the installer does not remove the component during
                        an uninstall. The installer registers an extra system client for the component in
                        the Windows Installer registry settings (which basically just means that at least one
                        product is always referencing this component).  Note that this option differs from the
                        behavior of not setting a guid because although the component is permanent, it is still
                        patchable (because Windows Installer still tracks it), it's just not uninstallable.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="SharedDllRefCount" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>
                        If this attribute's value is set to 'yes', the installer increments the reference count
                        in the shared DLL registry of the component's key file.  If this bit is not set, the
                        installer increments the reference count only if the reference count already exists.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Transitive" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>
                        If this attribute is set to 'yes', the installer reevaluates the value of the statement
                        in the Condition upon a reinstall.  If the value was previously False and has changed to
                        True, the installer installs the component.  If the value was previously True and has
                        changed to False, the installer removes the component even if the component has other
                        products as clients.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Win64" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>
                        Set this attribute to 'yes' to mark this as a 64-bit component. This attribute facilitates
                        the installation of packages that include both 32-bit and 64-bit components.  If this bit
                        is not set, the component is registered as a 32-bit component.  If this is a 64-bit
                        component replacing a 32-bit component, set this bit and assign a new GUID in the Guid attribute.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:anyAttribute namespace="##other" processContents="lax">
                <xs:annotation><xs:documentation>
                    Extensibility point in the WiX XML Schema.  Schema extensions can register additional
                    attributes at this point in the schema.
                </xs:documentation></xs:annotation>
            </xs:anyAttribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="ComponentGroup">
        <xs:annotation>
            <xs:documentation>
                Groups together multiple components to be used in other locations.
            </xs:documentation>
            <xs:appinfo>
                <xse:seeAlso ref="ComponentGroupRef"/>
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:choice minOccurs="1" maxOccurs="unbounded">
                <xs:element ref="ComponentRef"/>
                <xs:any namespace="##other" processContents="lax">
                    <xs:annotation><xs:documentation>
                        Extensibility point in the WiX XML Schema.  Schema extensions can register additional
                        elements at this point in the schema.
                    </xs:documentation></xs:annotation>
                </xs:any>
            </xs:choice>
            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Identifier for the ComponentGroup.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:anyAttribute namespace="##other" processContents="lax">
                <xs:annotation><xs:documentation>
                    Extensibility point in the WiX XML Schema.  Schema extensions can register additional
                    attributes at this point in the schema.
                </xs:documentation></xs:annotation>
            </xs:anyAttribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="ComponentGroupRef">
        <xs:annotation>
            <xs:documentation>Create a reference to a ComponentGroup in another Fragment.</xs:documentation>
            <xs:appinfo>
                <xse:seeAlso ref="ComponentGroup"/>
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>The identifier of the ComponentGroup to reference.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Primary" type="YesNoType">
                <xs:annotation><xs:documentation>
                    Set this attribute to 'yes' in order to make the parent feature of this component
                    the primary feature for this component.  Components may belong to multiple features.
                    By designating a feature as the primary feature of a component, you ensure that
                    whenever a component is selected for install-on-demand (IOD), the primary feature
                    will be the one to install it.  This attribute should only be set if a component
                    actually nests under multiple features.  If a component nests under only one feature,
                    that feature is the primary feature for the component.  You cannot set more than one
                    feature as the primary feature of a given component.
                </xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="ComponentRef">
        <xs:annotation>
            <xs:documentation>Create a reference to a Feature element in another Fragment.</xs:documentation>
            <xs:appinfo>
                <xse:seeAlso ref="Component"/>
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>The identifier of the Component element to reference.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Primary" type="YesNoType">
                <xs:annotation><xs:documentation>
                    Set this attribute to 'yes' in order to make the parent feature of this component
                    the primary feature for this component.  Components may belong to multiple features.
                    By designating a feature as the primary feature of a component, you ensure that
                    whenever a component is selected for install-on-demand (IOD), the primary feature
                    will be the one to install it.  This attribute should only be set if a component
                    actually nests under multiple features.  If a component nests under only one feature,
                    that feature is the primary feature for the component.  You cannot set more than one
                    feature as the primary feature of a given component.
                </xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="Merge">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="MergeRef"/>
            </xs:appinfo>
            <xs:documentation>Merge directive to bring in a Merge Module to be redirected to parent Directory</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="ConfigurationData">
                    <xs:annotation><xs:documentation>Data to use as input to a configurable merge module.</xs:documentation></xs:annotation>
                </xs:element>
            </xs:choice>
            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>The unique identifier for the Merge element in the source code.  Referenced by the MergeRef/@Id.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="DiskId" type="xs:string" use="required">
                <xs:annotation><xs:documentation>The value of this attribute should correspond to the Id attribute of a
                    Media element authored elsewhere.  By creating this connection between the Merge Module and Media
                    element, you set the packaging options to the values specified in the Media
                    element (values such as compression level, cab embedding, etc...).</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="FileCompression" type="YesNoType"/>
            <xs:attribute name="Language" type="xs:integer" use="required">
                <xs:annotation><xs:documentation>Specifies the decimal LCID for the language to merge the Module in as.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="SourceFile" type="xs:string"/>
            <xs:attribute name="src" type="xs:string">
                <xs:annotation>
                    <xs:appinfo>
                        <xse:deprecated ref="SourceFile" />
                    </xs:appinfo>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="MergeRef">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="Merge"/>
            </xs:appinfo>
            <xs:documentation>Merge reference to connect a Merge Module to parent Feature</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>The unique identifier for the Merge element to be referenced.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Primary" type="YesNoType">
                <xs:annotation><xs:documentation>Specifies whether the feature containing this MergeRef is the primary feature for advertising the merge module's components.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="ConfigurationData">
        <xs:annotation><xs:documentation>Data to use as input to a configurable merge module.</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:attribute name="Name" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Key into the ModuleConfiguration table.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Value" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Value to be passed to configurable merge module.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="Directory">
        <xs:annotation>
            <xs:documentation>Directory layout for the product.  Also specifies the mappings between source and target directories.</xs:documentation>
            <xs:appinfo>
                <xse:seeAlso ref="DirectoryRef"/>
                <xse:msiRef table="Directory" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="Component"/>
                <xs:element ref="Directory"/>
                <xs:element ref="Merge"/>
            </xs:choice>

            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>This value is the unique identifier of the directory entry.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="FileSource" type="xs:string">
                <xs:annotation><xs:documentation>Used to set the file system source for this directory's child elements.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="LongName" type="LongFileNameType">
                <xs:annotation><xs:documentation>Set this value to the non-8.3 name for the directory.  This attribute cannot be specified unless the Name attribute is used to set the short name for this directory.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="LongSource" type="LongFileNameType">
                <xs:annotation><xs:documentation>Set this value to the non-8.3 name of the directory on the source media for systems supporting long names.  This attribute cannot be specified unless the SourceName attribute sets the short source name for this directory.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Name" type="xs:string"><!-- not always a valid short name because of the special SourceDir value -->
                <xs:annotation><xs:documentation>The 8.3 name of the directory.  Do not specify this attribute (or the LongName attribute) if this directory represents the same directory as the parent (see the Windows Installer SDK's <html:a href='http://msdn.microsoft.com/library/en-us/msi/setup/directory_table.asp'>Directory table</html:a> topic for more information about the "." operator).</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="SourceName" type="ShortFileNameType">
                <xs:annotation><xs:documentation>The 8.3 name of the directory on the source media.  If this attribute is note specified, the Windows Installer will default to the Name attribute.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="src" type="xs:string">
                <xs:annotation>
                    <xs:appinfo>
                        <xse:deprecated ref="FileSource" />
                    </xs:appinfo>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="DirectoryRef">
        <xs:annotation>
            <xs:documentation>Create a reference to a Directory element in another Fragment.</xs:documentation>
            <xs:appinfo>
                <xse:seeAlso ref="Directory"/>
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="Component"/>
                <xs:element ref="Directory"/>
                <xs:element ref="Merge"/>
            </xs:choice>

            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>The identifier of the Directory element to reference.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="FileSource" type="xs:string">
                <xs:annotation><xs:documentation>Used to set the file system source for this directory ref's child elements.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="src" type="xs:string">
                <xs:annotation>
                    <xs:appinfo>
                        <xse:deprecated ref="FileSource" />
                    </xs:appinfo>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="UpgradeVersion">
        <xs:annotation>
            <xs:appinfo>
                <xse:msiRef table="Upgrade" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:string">
                    <xs:attribute name="Minimum" type="xs:string">
                        <xs:annotation><xs:documentation>Specifies the lower bound on the range of product versions to be detected by FindRelatedProducts.</xs:documentation></xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="Maximum" type="xs:string">
                        <xs:annotation><xs:documentation>Specifies the upper boundary of the range of product versions detected by FindRelatedProducts.</xs:documentation></xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="Language" type="xs:string">
                        <xs:annotation><xs:documentation>Specifies the set of languages detected by FindRelatedProducts.  Enter a list of numeric language identifiers (LANGID) separated by commas (,).  Leave this value null to specify all languages.  Set ExcludeLanguages to "yes" in order detect all languages, excluding the languages listed in this value.</xs:documentation></xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="RemoveFeatures" type="xs:string">
                        <xs:annotation><xs:documentation>The installer sets the REMOVE property to features specified in this column.  The features to be removed can be determined at run time.  The Formatted string entered in this field must evaluate to a comma-delimited list of feature names.  For example: [Feature1],[Feature2],[Feature3].  No features are removed if the field contains formatted text that evaluates to an empty string.  The installer sets REMOVE=ALL only if the Remove field is empty.</xs:documentation></xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="Property" type="xs:string">
                        <xs:annotation><xs:documentation>When the FindRelatedProducts action detects a related product installed on the system, it appends the product code to the property specified in this field.  The property specified in this field must be a public property and the package author must add the property to the SecureCustomProperties Property.  Each UpgradeVersion must have a unique Property value.  After FindRelatedProducts the value of this property is a list product codes, separated by semicolons (;), detected on the system.</xs:documentation></xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="MigrateFeatures" type="YesNoType">
                        <xs:annotation><xs:documentation>Set to "yes" to migrate feature states from upgraded products by enabling the logic in the MigrateFeatureStates action.</xs:documentation></xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="OnlyDetect" type="YesNoType">
                        <xs:annotation><xs:documentation>Set to "yes" to detect products and applications but do not uninstall.</xs:documentation></xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="IgnoreRemoveFailure" type="YesNoType">
                        <xs:annotation><xs:documentation>Set to "yes" to continue installation upon failure to remove a product or application.</xs:documentation></xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="IncludeMinimum" type="YesNoType">
                        <xs:annotation><xs:documentation>Set to "yes" to make the range of versions detected include the value specified in Minimum.  This attribute is "yes" by default.</xs:documentation></xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="IncludeMaximum" type="YesNoType">
                        <xs:annotation><xs:documentation>Set to "yes" to make the range of versions detected include the value specified in Maximum.</xs:documentation></xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="ExcludeLanguages" type="YesNoType">
                        <xs:annotation><xs:documentation>Set to "yes" to detect all languages, excluding the languages listed in the Language attribute.</xs:documentation></xs:annotation>
                    </xs:attribute>
                    <xs:anyAttribute namespace="##other" processContents="lax">
                        <xs:annotation><xs:documentation>
                            Extensibility point in the WiX XML Schema.  Schema extensions can register additional
                            attributes at this point in the schema.
                        </xs:documentation></xs:annotation>
                    </xs:anyAttribute>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>

    <xs:element name="Upgrade">
        <xs:annotation>
            <xs:documentation>
                Upgrade info for a particular UpgradeCode
          </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="Upgrade" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="UpgradeVersion"/>
                <xs:element ref="Property">
                    <xs:annotation><xs:documentation>Property table entry for the ActionProperty column associated with this Upgrade row</xs:documentation></xs:annotation>
                </xs:element>
            </xs:choice>

            <xs:attribute name="Id" type="uuid" use="required">
                <xs:annotation><xs:documentation>This value specifies the upgrade code for the products that are to be detected by the FindRelatedProducts action.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="Feature">
        <xs:annotation>
            <xs:documentation>
                A feature for the Feature table.  Features are the smallest installable unit.  See msi.chm for more
                detailed information on the myriad installation options for a feature.
            </xs:documentation>
            <xs:appinfo>
                <xse:seeAlso ref="FeatureRef"/>
                <xse:msiRef table="Feature" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="ComponentGroupRef"/>
                <xs:element ref="ComponentRef"/>
                <xs:element ref="Condition"/>
                <xs:element ref="Feature"/>
                <xs:element ref="FeatureRef"/>
                <xs:element ref="MergeRef"/>
                <xs:any namespace="##other" processContents="lax">
                    <xs:annotation><xs:documentation>
                        Extensibility point in the WiX XML Schema.  Schema extensions can register additional
                        elements at this point in the schema.
                    </xs:documentation></xs:annotation>
                </xs:any>
            </xs:choice>

            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Unique identifier of the feature.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Absent">
                <xs:annotation>
                    <xs:documentation>
                        This attribute determines if a user will have the option to set a feature to absent in the user interface.
                    </xs:documentation>
                </xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="allow">
                            <xs:annotation>
                                <xs:documentation>
                                    Allows the user interface to display an option to change the feature state to Absent.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="disallow">
                            <xs:annotation>
                                <xs:documentation>
                                    Prevents the user interface from displaying an option to change the feature state
                                    to Absent by setting the msidbFeatureAttributesUIDisallowAbsent attribute.  This will force the feature
                                    to the installation state, whether or not the feature is visible in the UI.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="AllowAdvertise">
                <xs:annotation>
                    <xs:documentation>
                        This attribute determins the possible advertise states for this feature.
                    </xs:documentation>
                </xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="no">
                            <xs:annotation>
                                <xs:documentation>
                                    Prevents this feature from being advertised by settting the msidbFeatureAttributesDisallowAdvertise attribute.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="system">
                            <xs:annotation>
                                <xs:documentation>
                                    Prevents advertising for this feature if the operating system shell does not support Windows Installer
                                    descriptors by setting the msidbFeatureAttributesNoUnsupportedAdvertise attribute.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="yes">
                            <xs:annotation>
                                <xs:documentation>
                                    Allows the feature to be advertised.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="ConfigurableDirectory" type="xs:string">
                <xs:annotation><xs:documentation>
                    Specify the Id of a Directory that can be configured by the user at installation time.  This identifier
                    must be a public property and therefore completely uppercase.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Description" type="xs:string">
                <xs:annotation><xs:documentation>
                    Longer string of text describing the feature.  This localizable string is displayed by the
                    Text Control of the Selection Dialog.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Display" type="xs:string">
                <xs:annotation>
                    <xs:documentation>
                        Determines the initial display of this feature in the feature tree.
                        This attribute's value should be one of the following:
                        <html:dl>
                            <html:dt class="enumerationValue">
                                <html:dfn>collapse</html:dfn>
                            </html:dt>
                            <html:dd>Initially shows the feature collapsed.  This is the default value.</html:dd>
                            <html:dt class="enumerationValue">
                                <html:dfn>expand</html:dfn>
                            </html:dt>
                            <html:dd>Initially shows the feature expanded.</html:dd>
                            <html:dt class="enumerationValue">
                                <html:dfn>hidden</html:dfn>
                            </html:dt>
                            <html:dd>Prevents the feature from displaying in the user interface.</html:dd>
                            <html:dt class="enumerationValue">
                                <html:dfn>&lt;an explicit integer value&gt;</html:dfn>
                            </html:dt>
                            <html:dd>
                                For advanced users only, it is possible to directly set the integer value
                                of the display value that will appear in the Feature row.
                            </html:dd>
                        </html:dl>
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="InstallDefault">
                <xs:annotation>
                    <xs:documentation>
                        This attribute determines the default install/run location of a feature.  This attribute cannot be specified
                        if the value of the FollowParent attribute is 'yes' since that would ask the installer to force this feature
                        to follow the parent installation state and simultaneously favor a particular installation state just for this feature.
                    </xs:documentation>
                </xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="followParent">
                            <xs:annotation>
                                <xs:documentation>
                                    Forces the feature to follow the same installation state as its parent feature.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="local">
                            <xs:annotation>
                                <xs:documentation>
                                    Favors installing this feature locally by setting the msidbFeatureAttributesFavorLocal attribute.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="source">
                            <xs:annotation>
                                <xs:documentation>
                                    Favors running this feature from source by setting the msidbFeatureAttributesFavorSource attribute.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="Level" type="xs:integer" use="required">
                <xs:annotation><xs:documentation>
                    Sets the install level of this feature.  A value of 0 will disable the feature.  Processing the
                    Condition Table can modify the level value (this is set via the Condition child element).
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Title" type="xs:string">
                <xs:annotation><xs:documentation>
                    Short string of text identifying the feature.  This string is listed as an item by the
                    SelectionTree control of the Selection Dialog.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="TypicalDefault">
                <xs:annotation><xs:documentation>
                    This attribute determines the default advertise state of the feature.
                </xs:documentation></xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="advertise">
                            <xs:annotation>
                                <xs:documentation>
                                    Sets the feature to be advertised by setting the msidbFeatureAttributesFavorAdvertise attribute.
                                    This value cannot be set if the value of the AllowAdvertise attribute is 'no' since that would ask the installer to
                                    disallow the advertised state for this feature while at the same time favoring it.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="install">
                            <xs:annotation>
                                <xs:documentation>
                                    Sets the feature to the default non-advertised installation option.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:anyAttribute namespace="##other" processContents="lax">
                <xs:annotation><xs:documentation>
                    Extensibility point in the WiX XML Schema.  Schema extensions can register additional
                    attributes at this point in the schema.
                </xs:documentation></xs:annotation>
            </xs:anyAttribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="FeatureRef">
        <xs:annotation>
            <xs:documentation>Create a reference to a Feature element in another Fragment.</xs:documentation>
            <xs:appinfo>
                <xse:seeAlso ref="Feature"/>
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="ComponentGroupRef"/>
                <xs:element ref="ComponentRef"/>
                <xs:element ref="Feature"/>
                <xs:element ref="FeatureRef"/>
                <xs:element ref="MergeRef"/>
                <xs:any namespace="##other" processContents="lax">
                    <xs:annotation><xs:documentation>
                        Extensibility point in the WiX XML Schema.  Schema extensions can register additional
                        elements at this point in the schema.
                    </xs:documentation></xs:annotation>
                </xs:any>
            </xs:choice>

            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>The identifier of the Feature element to reference.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="PatchPackage">
        <xs:annotation>
            <xs:documentation>PatchPackage found on parent Media element</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="uuid">
                    <xs:annotation><xs:documentation>Element value is PatchId GUID.</xs:documentation></xs:annotation>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>

    <xs:element name="Media">
        <xs:annotation>
            <xs:documentation>Media element describes a disk that makes up the source media for the installation.</xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="Media" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="DigitalSignature" minOccurs="0"/>
                <xs:element ref="PatchPackage" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attribute name="Id" type="xs:integer" use="required">
                <xs:annotation><xs:documentation>Disk identifier for Media table. This number must be equal to or greater than 1.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Cabinet" type="xs:string">
                <xs:annotation><xs:documentation>The name of the cabinet if some or all of the files stored on the media are compressed into a cabinet file. If no cabinets are used, this attribute must be blank.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="CompressionLevel">
                <xs:annotation>
                    <xs:documentation>
                        Indicates the compression level for the Media's cabinet.  This attribute can 
                        only be used in conjunction with the Cabinet attribute.  The default is 'mszip'.
                    </xs:documentation>
                </xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="high"/>
                        <xs:enumeration value="low"/>
                        <xs:enumeration value="medium"/>
                        <xs:enumeration value="mszip"/>
                        <xs:enumeration value="none"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="DiskPrompt" type="xs:string">
                <xs:annotation><xs:documentation>The disk name, which is usually the visible text printed on the disk. This localizable text is used to prompt the user when this disk needs to be inserted. This value will be used in the "[1]" of the DiskPrompt Property. Using this attribute will require you to define a DiskPrompt Property.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="EmbedCab" type="YesNoType">
                <xs:annotation><xs:documentation>Instructs the binder to embed the cabinet in the product if 'yes'.  This attribute can only be specified in conjunction with the Cabinet attribute.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Layout" type="xs:string">
                <xs:annotation>
                    <xs:documentation>
                        This attribute specifies the root directory for the uncompressed files that
                        are a part of this Media element.  By default, the src will be the output
                        directory for the final image.  The default value ensures the binder generates
                        an installable image.  If a relative path is specified in the src attribute,
                        the value will be appended to the image's output directory.  If an absolute
                        path is provided, that path will be used without modification.  The latter two
                        options are provided to ease the layout of an image onto multiple medias (CDs/DVDs).
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="src" type="xs:string">
                <xs:annotation>
                    <xs:appinfo>
                        <xse:deprecated ref="Layout" />
                    </xs:appinfo>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="VolumeLabel" type="xs:string">
                <xs:annotation>
                    <xs:documentation>
                        The label attributed to the volume. This is the volume label returned 
                        by the GetVolumeInformation function. If the SourceDir property refers 
                        to a removable (floppy or CD-ROM) volume, then this volume label is 
                        used to verify that the proper disk is in the drive before attempting 
                        to install files. The entry in this column must match the volume label 
                        of the physical media. 
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="IgnoreModularization">
        <xs:annotation>
            <xs:documentation>
                Use this to Ignore Modularization of particular values.  This feature
                is intended to be used in very rare situations.  Before using this
                feature, contact your support alias to verify your use is supported.
            </xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Name" use="required" type="xs:string" />
            <xs:attribute name="Type">
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="Action" />
                        <xs:enumeration value="Property" />
                        <xs:enumeration value="Directory" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="CustomAction">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="Custom"/>
                <xse:seeAlso ref="CustomActionRef"/>
                <xse:msiRef table="CustomAction" />
            </xs:appinfo>
            <xs:documentation>
                Specifies a custom action to be added to the MSI CustomAction table. Various combinations of the attributes for this element
                correspond to different custom action types. For more information about custom actions see the MSDN documentation
                <html:a href="http://msdn.microsoft.com/library/en-us/msi/setup/summary_list_of_all_custom_action_types.asp">
                http://msdn.microsoft.com/library/en-us/msi/setup/summary_list_of_all_custom_action_types.asp</html:a>
                for a "Summary List of All Custom Action Types".
            </xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:string">
                    <xs:annotation><xs:documentation>
                        The text node is only valid if the Script attribute is specified.  In that case, the text node contains the script to embed.
                    </xs:documentation></xs:annotation>

                    <xs:attribute name="Id" type="xs:string">
                        <xs:annotation><xs:documentation>
                            The identifier of the custom action.
                        </xs:documentation></xs:annotation>
                    </xs:attribute>
                    <!-- CustomAction Source specification, sets source Attribute bits -->
                    <xs:attribute name="BinaryKey" type="xs:string">
                        <xs:annotation>
                            <xs:documentation>
                                This attribute is a reference to a Binary element with matching Id attribute.  That binary stream contains
                                the custom action for use during install.  The custom action will not be installed into a target directory.  This attribute is
                                typically used with the DllEntry attribute to specify the custom action DLL to use for a type 1 custom action, with the ExeCommand
                                attribute to specify a type 17 custom action that runs an embedded executable, or with the VBScriptCall or JScriptCall attributes 
                                to specify a type 5 or 6 custom action.
                            </xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="FileKey" type="xs:string">
                        <xs:annotation>
                            <xs:documentation>
                                This attribute specifies a reference to a File element with matching Id attribute that
                                will execute the custom action code in the file after the file is installed.  This 
                                attribute is typically used with the ExeCommand attribute to specify a type 18 custom action
                                that runs an installed executable, with the DllEntry attribute to specify an installed custom
                                action DLL to use for a type 17 custom action, or with the VBScriptCall or JScriptCall 
                                attributes to specify a type 21 or 22 custom action.
                            </xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="Property" type="xs:string">
                        <xs:annotation>
                            <xs:documentation>
                                This attribute specifies a reference to a Property element with matching Id attribute that specifies the Property
                                to be used or updated on execution of this custom action. This attribute is 
                                typically used with the Value attribute to create a type 51 custom action that parses 
                                the text in Value and places it into the specified Property.  This attribute is also used with 
                                the ExeCommand attribute to create a type 50 custom action that uses the value of the 
                                given property to specify the path to the executable. Type 51 custom actions are often useful to
                                pass values to a deferred custom action.
                                See <html:a href="http://msdn.microsoft.com/library/en-us/msi/setup/obtaining_context_information_for_deferred_execution_custom_actions.asp">
                                http://msdn.microsoft.com/library/en-us/msi/setup/obtaining_context_information_for_deferred_execution_custom_actions.asp</html:a>
                                for more information.
                            </xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="Directory" type="xs:string">
                        <xs:annotation>
                            <xs:documentation>
                                This attribute specifies a reference to a Directory element with matching Id attribute containing a directory path. 
                                This attribute is typically used with the ExeCommand attribute to specify the source executable for a type 34 
                                custom action, or with the Value attribute to specify a formatted string to place in the specified Directory 
                                table entry in a type 35 custom action.
                            </xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <!-- CustomAction Target specification, sets target Attribute bits -->
                    <xs:attribute name="DllEntry" type="xs:string">
                        <xs:annotation>
                            <xs:documentation>
                                This attribute specifies the name of a function in a custom action to execute.
                                This attribute is used with the BinaryKey attribute to create a type 1 custom 
                                action, or with the FileKey attribute to create a type 17 custom action.
                            </xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="ExeCommand" type="xs:string">
                        <xs:annotation>
                            <xs:documentation>
                                This attribute specifies the command line parameters to supply to an externally 
                                run executable. This attribute is typically used with the BinaryKey attribute for a type 2 custom action, 
                                the FileKey attribute for a type 18 custom action, the Property attribute for a type 50 custom action,
                                or the Directory attribute for a type 34 custom action that specify the executable to run. 
                            </xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="JScriptCall" type="xs:string">
                        <xs:annotation><xs:documentation>
                            This attribute specifies the name of the JScript function to execute in a script. The script must be
                            provided in a Binary element identified by the BinaryKey attribute described above. In other words, this
                            attribute must be specified in conjunction with the BinaryKey attribute.
                        </xs:documentation></xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="VBScriptCall" type="xs:string">
                        <xs:annotation><xs:documentation>
                            This attribute specifies the name of the VBScript Subroutine to execute in a script. The script must be
                            provided in a Binary element identified by the BinaryKey attribute described above. In other words, this
                            attribute must be specified in conjunction with the BinaryKey attribute.
                        </xs:documentation></xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="Script">
                        <xs:annotation><xs:documentation>
                            Creates a type 37 or 38 custom action.  The text of the element should contain the script to be embedded in the package.
                        </xs:documentation></xs:annotation>
                        <xs:simpleType>
                            <xs:restriction base="xs:NMTOKEN">
                                <xs:enumeration value="jscript"/>
                                <xs:enumeration value="vbscript"/>
                            </xs:restriction>
                        </xs:simpleType>
                    </xs:attribute>
                    <xs:attribute name="Value" type="xs:string">
                        <xs:annotation>
                            <xs:documentation>
                                This attribute specifies a string value to use in the custom action. This attribute
                                must be used with the Property attribute to set the property as part of a
                                type 51 custom action or with the Directory attribute to set a directory path in that
                                table in a type 35 custom action. The value can be a literal value or derived from a
                                Property element using the <html:a href='http://msdn.microsoft.com/library/en-us/msi/setup/formatted.asp'>Formatted</html:a>
                                syntax. 
                            </xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="Error" type="xs:string">
                        <xs:annotation>
                            <xs:documentation>
                                This attribute specifies an index in the MSI Error table to use as an error message for a 
                                type 19 custom action that displays the error message and aborts a product's installation.
                            </xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <!-- Other CustomAction type attributes -->
                    <xs:attribute name="Return">
                        <xs:annotation>
                            <xs:documentation>
                                Set this attribute to set the return behavior of the custom action.
                            </xs:documentation>
                        </xs:annotation>
                        <xs:simpleType>
                            <xs:restriction base="xs:NMTOKEN">
                                <xs:enumeration value="asyncNoWait">
                                    <xs:annotation>
                                        <xs:documentation>
                                            Indicates that the custom action will run asyncronously and execution may continue after the installer terminates.
                                        </xs:documentation>
                                    </xs:annotation>
                                </xs:enumeration>
                                <xs:enumeration value="asyncWait">
                                    <xs:annotation>
                                        <xs:documentation>
                                            Indicates that the custom action will run asynchronously but the installer will wait for the return code at sequence end.
                                        </xs:documentation>
                                    </xs:annotation>
                                </xs:enumeration>
                                <xs:enumeration value="check">
                                    <xs:annotation>
                                        <xs:documentation>
                                            Indicates that the custom action will run synchronously and the return code will be checked for success.  This is the default.
                                        </xs:documentation>
                                    </xs:annotation>
                                </xs:enumeration>
                                <xs:enumeration value="ignore">
                                    <xs:annotation>
                                        <xs:documentation>
                                            Indicates that the custom action will run synchronously and the return code will not be checked.
                                        </xs:documentation>
                                    </xs:annotation>
                                </xs:enumeration>
                            </xs:restriction>
                        </xs:simpleType>
                    </xs:attribute>
                    <xs:attribute name="Execute">
                        <xs:annotation>
                            <xs:documentation>
                                This attribute indicates the scheduling of the custom action.
                            </xs:documentation>
                        </xs:annotation>
                        <xs:simpleType>
                            <xs:restriction base="xs:NMTOKEN">
                                <xs:enumeration value="commit">
                                    <xs:annotation>
                                        <xs:documentation>
                                            Indicates that the custom action will run after successful completion of the installation script (at the end of the installation).
                                        </xs:documentation>
                                    </xs:annotation>
                                </xs:enumeration>
                                <xs:enumeration value="deferred">
                                    <xs:annotation>
                                        <xs:documentation>
                                            Indicates that the custom action runs in-script (possibly with elevated privileges).
                                        </xs:documentation>
                                    </xs:annotation>
                                </xs:enumeration>
                                <xs:enumeration value="firstSequence">
                                    <xs:annotation>
                                        <xs:documentation>
                                            Indicates that the custom action will only run in the first sequence that runs it.
                                        </xs:documentation>
                                    </xs:annotation>
                                </xs:enumeration>
                                <xs:enumeration value="immediate">
                                    <xs:annotation>
                                        <xs:documentation>
                                            Indicates that the custom action will run during normal processing time with user privileges.  This is the default.
                                        </xs:documentation>
                                    </xs:annotation>
                                </xs:enumeration>
                                <xs:enumeration value="oncePerProcess">
                                    <xs:annotation>
                                        <xs:documentation>
                                            Indicates that the custom action will only run in the first sequence that runs it in the same process.
                                        </xs:documentation>
                                    </xs:annotation>
                                </xs:enumeration>
                                <xs:enumeration value="rollback">
                                    <xs:annotation>
                                        <xs:documentation>
                                            Indicates that a custom action will run in the rollback sequence when a failure
                                            occurs during installation, usually to undo changes made by a deferred custom action.
                                        </xs:documentation>
                                    </xs:annotation>
                                </xs:enumeration>
                                <xs:enumeration value="secondSequence">
                                    <xs:annotation>
                                        <xs:documentation>
                                            Indicates that a custom action should be run a second time if it was previously run in an earlier sequence.
                                        </xs:documentation>
                                    </xs:annotation>
                                </xs:enumeration>
                            </xs:restriction>
                        </xs:simpleType>
                    </xs:attribute>
                    <xs:attribute name="Impersonate" type="YesNoType">
                        <xs:annotation>
                            <xs:documentation>
                                This attribute specifies whether the Windows Installer, which executes as LocalSystem, 
                                should impersonate the user context of the installing user when executing this custom action. 
                                Typically the value should be 'yes', except when the custom action needs elevated privileges
                                to apply changes to the machine.
                            </xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="Win64" type="YesNoType">
                        <xs:annotation>
                            <xs:documentation>
                                Specifies that a script custom action targets a 64-bit platform. Valid only when used with
                                the Script, VBScriptCall, and JScriptCall attributes.
                            </xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="TerminalServerAware" type="YesNoType">
                        <xs:annotation>
                            <xs:documentation>
                                This attribute specifies controls whether the custom action will impersonate the 
                                installing user during per-machine installs on Terminal Server machines.
                                Deferred execution custom actions that do not specify this attribute, or explicitly set it 'no',
                                will run with no user impersonation on Terminal Server machines during 
                                per-machine installations.  This attribute is only applicable when installing on the 
                                Windows Server 2003 family.
                            </xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="HideTarget" type="YesNoType">
                        <xs:annotation><xs:documentation>Ensures the installer does not log the CustomActionData for the deferred custom action.</xs:documentation></xs:annotation>
                    </xs:attribute>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>

    <xs:element name="CustomActionRef">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="CustomAction"/>
            </xs:appinfo>
            <xs:documentation>
                This will cause the entire contents of the Fragment containing the referenced CustomAction to be 
                included in the installer database.
            </xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>The identifier of the CustomAction to reference.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:anyAttribute namespace="##other" processContents="lax">
                <xs:annotation><xs:documentation>
                    Extensibility point in the WiX XML Schema.  Schema extensions can register additional
                    attributes at this point in the schema.
                </xs:documentation></xs:annotation>
            </xs:anyAttribute>
        </xs:complexType>
    </xs:element>

    <!-- - - - - - - - - - - Sequence Table Definitions - - - - - - - - - - - - - - -->
    <xs:element name="FindRelatedProducts" type="ActionSequenceType">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="Upgrade"/>
            </xs:appinfo>
            <xs:documentation>Runs through each record of the Upgrade table in sequence and compares the upgrade code, product version, and language in each row to products installed on the system.  When FindRelatedProducts detects a correspondence between the upgrade information and an installed product, it appends the product code to the property specified in the ActionProperty column of the UpgradeTable.  The FindRelatedProducts action only runs the first time the product is installed.  The FindRelatedProducts action does not run during maintenance mode or uninstallation.  FindRelatedProducts should be authored into the InstallUISequence table and InstallExecuteSequence tables.  The installer prevents FindRelated Products from running in InstallExecuteSequence if the action has already run in InstallUISequence.  The FindRelatedProducts action must come before the MigrateFeatureStates action and the RemoveExistingProducts action.  The condition for this action may be specified in the element's inner text.</xs:documentation>
        </xs:annotation>
    </xs:element>
    <xs:element name="ValidateProductID" type="ActionSequenceType">
        <xs:annotation>
            <xs:documentation>Sets the ProductID property to the full product identifier.  This action must be sequenced before the user interface wizard in the InstallUISequence table and before the RegisterUser action in the InstallExecuteSequence table.  If the product identifier has already been validated successfully, the ValidateProductID action does nothing.  The ValidateProductID action always returns a success, whether or not the product identifier is valid, so that the product identifier can be entered on the command line the first time the product is run.  The product identifier can be validated without having the user reenter this information by setting the PIDKEY property on the command line or by using a transform.  The display of the dialog box requesting the user to enter the product identifier can then be made conditional upon the presence of the ProductID property, which is set when the PIDKEY property is validated.  The condition for this action may be specified in the element's inner text.</xs:documentation>
        </xs:annotation>
    </xs:element>
    <xs:element name="CostInitialize" type="ActionSequenceType">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="FileCost"/>
                <xse:seeAlso ref="CostFinalize"/>
            </xs:appinfo>
            <xs:documentation>Initiates the internal installation costing process.  Any standard or custom actions that affect costing should be sequenced before the CostInitialize action.  Call the FileCost action immediately following the CostInitialize action.  Then call the CostFinalize action following the CostInitialize action to make all final cost calculations available to the installer through the Component table.  The condition for this action may be specified in the element's inner text.</xs:documentation>
        </xs:annotation>
    </xs:element>
    <xs:element name="FileCost" type="ActionSequenceType">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="CostInitialize"/>
                <xse:seeAlso ref="CostFinalize"/>
            </xs:appinfo>
            <xs:documentation>Initiates dynamic costing of standard installation actions.  Any standard or custom actions that affect costing should sequenced before the CostInitialize action.  Call the FileCost action immediately following the CostInitialize action.  Then call the CostFinalize action following the FileCost action to make all final cost calculations available to the installer through the Component table.  The CostInitialize action must be executed before the FileCost action.  The installer then determines the disk-space cost of every file in the File table, on a per-component basis, taking both volume clustering and the presence of existing files that may need to be overwritten into account.  All actions that consume or release disk space are also considered.  If an existing file is found, a file version check is performed to determine whether the new file actually needs to be installed or not.  If the existing file is of an equal or greater version number, the existing file is not overwritten and no disk-space cost is incurred.  In all cases, the installer uses the results of version number checking to set the installation state of each file.  The FileCost action initializes cost calculation with the installer.  Actual dynamic costing does not occur until the CostFinalize action is executed.  The condition for this action may be specified in the element's inner text.</xs:documentation>
        </xs:annotation>
    </xs:element>
    <xs:element name="IsolateComponents" type="ActionSequenceType">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="IsolateComponent"/>
            </xs:appinfo>
            <xs:documentation>Installs a copy of a component (commonly a shared DLL) into a private location for use by a specific application (typically an .exe).  This isolates the application from other copies of the component that may be installed to a shared location on the computer.  The action refers to each record of the IsolatedComponent table and associates the files of the component listed in the Component_Shared field with the component listed in the Component_Application field.  The installer installs the files of Component_Shared into the same directory as Component_Application.  The installer generates a file in this directory, zero bytes in length, having the short filename name of the key file for Component_Application (typically this is the same file name as the .exe) appended with .local.  The IsolatedComponent action does not affect the installation of Component_Application.  Uninstalling Component_Application also removes the Component_Shared files and the .local file from the directory.  The IsolateComponents action can be used only in the InstallUISequence table and the InstallExecuteSequence table.  This action must come after the CostInitialize action and before the CostFinalize action.  The condition for this action may be specified in the element's inner text.</xs:documentation>
        </xs:annotation>
    </xs:element>
    <xs:element name="CostFinalize" type="ActionSequenceType">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="CostInitialize"/>
                <xse:seeAlso ref="FileCost"/>
            </xs:appinfo>
            <xs:documentation>Ends the internal installation costing process begun by the CostInitialize action.  Any standard or custom actions that affect costing should be sequenced before the CostInitialize action.  Call the FileCost action immediately following the CostInitialize action and then call the CostFinalize action to make all final cost calculations available to the installer through the Component table.  The CostFinalize action must be executed before starting any user interface sequence which allows the user to view or modify Feature table selections or directories.  The CostFinalize action queries the Condition table to determine which features are scheduled to be installed.  Costing is done for each component in the Component table.  The CostFinalize action also verifies that all the target directories are writable before allowing the installation to continue.  The condition for this action may be specified in the element's inner text.</xs:documentation>
        </xs:annotation>
    </xs:element>
    <xs:element name="SetODBCFolders" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Checks for existing ODBC drivers and sets the target directory for each new driver to the location of an existing driver.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="MigrateFeatureStates" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Used for upgrading or installing over an existing application.  Reads feature states from existing application and sets these feature states for the pending installation.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="ExecuteAction" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Initiates the execution sequence.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="InstallValidate" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Verifies that all costed volumes have enough space for the installation.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="InstallInitialize" type="ActionSequenceType">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="InstallFinalize"/>
            </xs:appinfo>
            <xs:documentation>Marks the beginning of a sequence of actions that change the system.  The condition for this action may be specified in the element's inner text.</xs:documentation>
        </xs:annotation>
    </xs:element>
    <xs:element name="AllocateRegistrySpace" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Ensures the needed amount of space exists in the registry.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="ProcessComponents" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Registers and unregisters components, their key paths, and the component clients.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="UnpublishComponents" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Manages the unadvertisement of components listed in the PublishComponent table.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="MsiUnpublishAssemblies" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Manages the unadvertisement of CLR and Win32 assemblies that are being removed.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="UnpublishFeatures" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Removes selection-state and feature-component mapping information from the registry.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="StopServices" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Stops system services.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="DeleteServices" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Stops a service and removes its registration from the system.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="UnregisterComPlus" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Removes COM+ applications from the registry.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="SelfUnregModules" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Unregisters all modules listed in the SelfReg table that are scheduled to be uninstalled.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="UnregisterTypeLibraries" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Unregisters type libraries from the system.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="RemoveODBC" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Removes the data sources, translators, and drivers listed for removal during the installation.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="UnregisterFonts" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Removes registration information about installed fonts from the system.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="RemoveRegistryValues" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Removes a registry value that has been authored into the registry table if the associated component was installed locally or as run from source, and is now set to be uninstalled.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="UnregisterClassInfo" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Manages the removal of COM class information from the system registry.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="UnregisterExtensionInfo" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Manages the removal of extension-related information from the system registry.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="UnregisterProgIdInfo" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Manages the unregistration of OLE ProgId information with the system.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="UnregisterMIMEInfo" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Unregisters MIME-related registry information from the system.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="RemoveIniValues" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Removes .ini file information specified for removal in the RemoveIniFile table if the component is set to be installed locally or run from source.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="RemoveShortcuts" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Manages the removal of an advertised shortcut whose feature is selected for uninstallation or a nonadvertised shortcut whose component is selected for uninstallation.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="RemoveEnvironmentStrings" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Modifies the values of environment variables.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="RemoveDuplicateFiles" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Deletes files installed by the DuplicateFiles action.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="RemoveFiles" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Removes files previously installed by the InstallFiles action.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="RemoveFolders" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Removes any folders linked to components set to be removed or run from source.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="CreateFolders" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Creates empty folders for components that are set to be installed.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="MoveFiles" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Locates existing files on the system and moves or copies those files to a new location.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="InstallAdminPackage" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Copies the product database to the administrative installation point.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="InstallFiles" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Copies files specified in the File table from the source directory to the destination directory.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="DuplicateFiles" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Duplicates files installed by the InstallFiles action.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="PatchFiles" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Queries the Patch table to determine which patches are to be applied.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="BindImage" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Binds each executable or DLL that must be bound to the DLLs imported by it.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="CreateShortcuts" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Manages the creation of shortcuts.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="RegisterClassInfo" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Manages the registration of COM class information with the system.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="RegisterExtensionInfo" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Manages the registration of extension related information with the system.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="RegisterProgIdInfo" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Manages the registration of OLE ProgId information with the system.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="RegisterMIMEInfo" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Registers MIME-related registry information with the system.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="WriteRegistryValues" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Sets up an application's registry information.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="WriteIniValues" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Writes the .ini file information that the application needs written to its .ini files.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="WriteEnvironmentStrings" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Modifies the values of environment variables.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="RegisterFonts" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Registers installed fonts with the system.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="InstallODBC" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Installs the drivers, translators, and data sources in the ODBCDriver table, ODBCTranslator table, and ODBCDataSource table.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="RegisterTypeLibraries" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Registers type libraries with the system.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="SelfRegModules" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Processes all modules listed in the SelfReg table and registers all installed modules with the system.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="RegisterComPlus" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Registers COM+ applications.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="InstallServices" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Registers a service for the system.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="StartServices" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Starts system services.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="RegisterUser" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Registers the user information with the installer to identify the user of a product.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="RegisterProduct" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Registers the product information with the installer.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="PublishComponents" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Manages the advertisement of the components from the PublishComponent table.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="MsiPublishAssemblies" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Manages the advertisement of CLR and Win32 assemblies.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="PublishFeatures" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Writes each feature's state into the system registry.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="PublishProduct" type="ActionSequenceType">
        <xs:annotation><xs:documentation>Manages the advertisement of the product information with the system.  The condition for this action may be specified in the element's inner text.</xs:documentation></xs:annotation>
    </xs:element>
    <xs:element name="InstallFinalize" type="ActionSequenceType">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="InstallInitialize"/>
            </xs:appinfo>
            <xs:documentation>Marks the end of a sequence of actions that change the system.  The condition for this action may be specified in the element's inner text.</xs:documentation>
        </xs:annotation>
    </xs:element>

    <xs:element name="AppSearch" type="ActionModuleSequenceType">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="ComponentSearch"/>
                <xse:seeAlso ref="FileSearch"/>
                <xse:seeAlso ref="IniFileSearch"/>
                <xse:seeAlso ref="RegistrySearch"/>
            </xs:appinfo>
            <xs:documentation>Uses file signatures to search for existing versions of products.  The AppSearch action may use this information to determine where upgrades are to be installed.  The AppSearch action can also be used to set a property to the existing value of an registry or .ini file entry.  AppSearch should be authored into the InstallUISequence table and InstallExecuteSequence table.  The installer prevents The AppSearch action from running in the InstallExecuteSequence sequence if the action has already run in InstallUISequence sequence.  The AppSearch action searches for file signatures using the CompLocator table first, the RegLocator table next, then the IniLocator table, and finally the DrLocator table.  The condition for this action may be specified in the element's inner text.</xs:documentation>
        </xs:annotation>
    </xs:element>
    <xs:element name="CCPSearch" type="ActionModuleSequenceType">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="RMCCPSearch"/>
                <xse:seeAlso ref="ComplianceCheck"/>
            </xs:appinfo>
            <xs:documentation>Uses file signatures to validate that qualifying products are installed on a system before an upgrade installation is performed.  The CCPSearch action should be authored into the InstallUISequence table and InstallExecuteSequence table.  The installer prevents the CCPSearch action from running in the InstallExecuteSequence sequence if the action has already run in InstallUISequence sequence.  The CCPSearch action must come before the RMCCPSearch action.  The condition for this action may be specified in the element's inner text.</xs:documentation>
        </xs:annotation>
    </xs:element>
    <xs:element name="RMCCPSearch" type="ActionModuleSequenceType">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="CCPSearch"/>
                <xse:seeAlso ref="ComplianceCheck"/>
            </xs:appinfo>
            <xs:documentation>Uses file signatures to validate that qualifying products are installed on a system before an upgrade installation is performed.  The RMCCPSearch action should be authored into the InstallUISequence table and InstallExecuteSequence table.  The installer prevents RMCCPSearch from running in the InstallExecuteSequence sequence if the action has already run in InstallUISequence sequence.  The RMCCPSearch action requires the CCP_DRIVE property to be set to the root path on the removable volume that has the installation for any of the qualifying products.  The condition for this action may be specified in the element's inner text.</xs:documentation>
        </xs:annotation>
    </xs:element>
    <xs:element name="LaunchConditions" type="ActionModuleSequenceType">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="Condition"/>
            </xs:appinfo>
            <xs:documentation>Queries the LaunchCondition table and evaluates each conditional statement recorded there.  If any of these conditional statements fail, an error message is displayed to the user and the installation is terminated.  The LaunchConditions action is optional.  This action is normally the first in the sequence, but the AppSearch Action may be sequenced before the LaunchConditions action.  If there are launch conditions that do not apply to all installation modes, the appropriate installation mode property should be used in a conditional expression in the appropriate sequence table.  The condition for this action may be specified in the element's inner text.</xs:documentation>
        </xs:annotation>
    </xs:element>
    <xs:element name="InstallExecute" type="ActionModuleSequenceType">
        <xs:annotation>
            <xs:documentation>Runs a script containing all operations spooled since either the start of the installation or the last InstallExecute action, or InstallExecuteAgain action.  Special actions don't have a built-in sequence number and thus must appear relative to another action.  The suggested way to do this is by using the Before or After attribute.  InstallExecute and InstallExecuteAgain can optionally appear anywhere between InstallInitialize and InstallFinalize.</xs:documentation>
        </xs:annotation>
    </xs:element>
    <xs:element name="InstallExecuteAgain" type="ActionModuleSequenceType">
        <xs:annotation>
            <xs:documentation>Runs a script containing all operations spooled since either the start of the installation or the last InstallExecute action, or InstallExecuteAgain action.  Should only be used after InstallExecute.  Special actions don't have a built-in sequence number and thus must appear relative to another action.  The suggested way to do this is by using the Before or After attribute.  InstallExecute and InstallExecuteAgain can optionally appear anywhere between InstallInitialize and InstallFinalize.</xs:documentation>
        </xs:annotation>
    </xs:element>
    <xs:element name="DisableRollback" type="ActionModuleSequenceType">
        <xs:annotation>
            <xs:documentation>Disables rollback for the remainder of the installation.  Special actions don't have a built-in sequence number and thus must appear relative to another action.  The suggested way to do this is by using the Before or After attribute.  InstallExecute and InstallExecuteAgain can optionally appear anywhere between InstallInitialize and InstallFinalize.</xs:documentation>
        </xs:annotation>
    </xs:element>
    <xs:element name="RemoveExistingProducts" type="ActionModuleSequenceType">
        <xs:annotation>
            <xs:documentation>Goes through the product codes listed in the ActionProperty column of the Upgrade table and removes the products in sequence.  Special actions don't have a built-in sequence number and thus must appear relative to another action.  The suggested way to do this is by using the Before or After attribute.  InstallExecute and InstallExecuteAgain can optionally appear anywhere between InstallInitialize and InstallFinalize.</xs:documentation>
        </xs:annotation>
    </xs:element>
    <xs:element name="ScheduleReboot" type="ActionModuleSequenceType">
        <xs:annotation>
            <xs:documentation>Prompts the user to restart the system at the end of installation.  Special actions don't have a built-in sequence number and thus must appear relative to another action.  The suggested way to do this is by using the Before or After attribute.  InstallExecute and InstallExecuteAgain can optionally appear anywhere between InstallInitialize and InstallFinalize.</xs:documentation>
        </xs:annotation>
    </xs:element>
    <xs:element name="ForceReboot" type="ActionModuleSequenceType">
        <xs:annotation>
            <xs:documentation>Prompts the user for a restart of the system during the installation.  Special actions don't have a built-in sequence number and thus must appear relative to another action.  The suggested way to do this is by using the Before or After attribute.  InstallExecute and InstallExecuteAgain can optionally appear anywhere between InstallInitialize and InstallFinalize.</xs:documentation>
        </xs:annotation>
    </xs:element>
    <xs:element name="ResolveSource" type="ActionModuleSequenceType">
        <xs:annotation>
            <xs:documentation>Determines the location of the source and sets the SourceDir property if the source has not been resolved yet.  Special actions don't have a built-in sequence number and thus must appear relative to another action.  The suggested way to do this is by using the Before or After attribute.  InstallExecute and InstallExecuteAgain can optionally appear anywhere between InstallInitialize and InstallFinalize.</xs:documentation>
        </xs:annotation>
    </xs:element>
    <!-- CustomActions and Dialogs of course aren't built in and must be specified relative to another action -->
    <xs:element name="Custom">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="CustomAction"/> 
            </xs:appinfo>
            <xs:documentation>Use to sequence a custom action.</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:string">
                    <xs:annotation><xs:documentation>Text node specifies the condition of the action.</xs:documentation></xs:annotation>
                    <xs:attribute name="Action" type="xs:string" use="required"/>
                    <xs:attribute name="OnExit">
                        <xs:annotation><xs:documentation>mutually exclusive with Before, After, and Sequence attributes</xs:documentation></xs:annotation>
                        <xs:simpleType>
                            <xs:restriction base="xs:NMTOKEN">
                                <xs:enumeration value="success"/>
                                <xs:enumeration value="cancel"/>
                                <xs:enumeration value="error"/>
                                <xs:enumeration value="suspend"/>
                            </xs:restriction>
                        </xs:simpleType>
                    </xs:attribute>
                    <xs:attribute name="Before" type="xs:string"/>
                    <xs:attribute name="After" type="xs:string"/>
                    <xs:attribute name="Sequence" type="xs:integer"/>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>
    <xs:element name="Show">
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:string">
                    <xs:attribute name="Dialog" type="xs:string" use="required"/>
                    <xs:attribute name="OnExit">
                        <xs:annotation><xs:documentation>mutually exclusive with Before, After, and Sequence attributes</xs:documentation></xs:annotation>
                        <xs:simpleType>
                            <xs:restriction base="xs:NMTOKEN">
                                <xs:enumeration value="success"/>
                                <xs:enumeration value="cancel"/>
                                <xs:enumeration value="error"/>
                                <xs:enumeration value="suspend"/>
                            </xs:restriction>
                        </xs:simpleType>
                    </xs:attribute>
                    <xs:attribute name="Before" type="xs:string"/>
                    <xs:attribute name="After" type="xs:string"/>
                    <xs:attribute name="Sequence" type="xs:integer"/>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>

    <!-- standard sequence table compositions -->

    <xs:element name="InstallUISequence">
        <xs:complexType mixed="true">
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="Custom" minOccurs="0" maxOccurs="unbounded">
                    <xs:annotation><xs:documentation>Use to sequence a custom action.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="Show" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element ref="ScheduleReboot" minOccurs="0">
                    <xs:annotation><xs:documentation>Prompts the user to restart the system at the end of installation. Not fixed sequence.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="LaunchConditions" minOccurs="0">
                    <xs:annotation><xs:documentation>Queries the LaunchCondition table and evaluates each conditional statement recorded there.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="FindRelatedProducts" minOccurs="0">
                    <xs:annotation><xs:documentation>Runs through each record of the Upgrade table in sequence and compares the upgrade code, product version, and language in each row to products installed on the system.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="AppSearch" minOccurs="0">
                    <xs:annotation><xs:documentation>Uses file signatures to search for existing versions of products.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="CCPSearch" minOccurs="0">
                    <xs:annotation><xs:documentation>Uses file signatures to validate that qualifying products are installed on a system before an upgrade installation is performed.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="RMCCPSearch" minOccurs="0">
                    <xs:annotation><xs:documentation>Uses file signatures to validate that qualifying products are installed on a system before an upgrade installation is performed.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="ValidateProductID">
                    <xs:annotation><xs:documentation>Sets the ProductID property to the full product identifier.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="CostInitialize">
                    <xs:annotation><xs:documentation>Initiates the internal installation costing process.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="FileCost">
                    <xs:annotation><xs:documentation>Initiates dynamic costing of standard installation actions.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="IsolateComponents">
                    <xs:annotation><xs:documentation>Installs a copy of a component (commonly a shared DLL) into a private location for use by a specific application (typically an .exe).</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="ResolveSource" minOccurs="0">
                    <xs:annotation><xs:documentation>Determines the location of the source and sets the SourceDir property if the source has not been resolved yet.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="CostFinalize">
                    <xs:annotation><xs:documentation>Ends the internal installation costing process begun by the CostInitialize action.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="MigrateFeatureStates">
                    <xs:annotation><xs:documentation>Used for upgrading or installing over an existing application.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="ExecuteAction" minOccurs="0">
                    <xs:annotation><xs:documentation>Initiates the execution sequence.</xs:documentation></xs:annotation>
                </xs:element>
            </xs:choice>
        </xs:complexType>
    </xs:element>

    <xs:element name="InstallExecuteSequence">
        <xs:annotation>
            <xs:appinfo>
                <xse:msiRef table="InstallExecuteSequence" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <!-- used only to supply default op for child action elements -->
                <xs:element ref="Custom" minOccurs="0" maxOccurs="unbounded">
                    <xs:annotation><xs:documentation>Use to sequence a custom action.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="ScheduleReboot" minOccurs="0">
                    <xs:annotation><xs:documentation>Prompts the user to restart the system at the end of installation. Not fixed sequence.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="ForceReboot" minOccurs="0">
                    <xs:annotation><xs:documentation>Prompts the user for a restart of the system during the installation. Not fixed sequence.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="ResolveSource" minOccurs="0">
                    <xs:annotation><xs:documentation>Determines the location of the source and sets the SourceDir property if the source has not been resolved yet. Not fixed sequence.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="LaunchConditions" minOccurs="0">
                    <xs:annotation><xs:documentation>Queries the LaunchCondition table and evaluates each conditional statement recorded there.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="FindRelatedProducts" minOccurs="0">
                    <xs:annotation><xs:documentation>Runs through each record of the Upgrade table in sequence and compares the upgrade code, product version, and language in each row to products installed on the system.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="AppSearch" minOccurs="0">
                    <xs:annotation><xs:documentation>Uses file signatures to search for existing versions of products.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="CCPSearch">
                    <xs:annotation><xs:documentation>Uses file signatures to validate that qualifying products are installed on a system before an upgrade installation is performed.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="RMCCPSearch">
                    <xs:annotation><xs:documentation>Uses file signatures to validate that qualifying products are installed on a system before an upgrade installation is performed.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="ValidateProductID">
                    <xs:annotation><xs:documentation>Sets the ProductID property to the full product identifier.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="CostInitialize">
                    <xs:annotation><xs:documentation>Initiates the internal installation costing process.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="FileCost">
                    <xs:annotation><xs:documentation>Initiates dynamic costing of standard installation actions.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="IsolateComponents">
                    <xs:annotation><xs:documentation>Installs a copy of a component (commonly a shared DLL) into a private location for use by a specific application (typically an .exe).</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="CostFinalize">
                    <xs:annotation><xs:documentation>Ends the internal installation costing process begun by the CostInitialize action.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="SetODBCFolders">
                    <xs:annotation><xs:documentation>Checks for existing ODBC drivers and sets the target directory for each new driver to the location of an existing driver.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="MigrateFeatureStates">
                    <xs:annotation><xs:documentation>Used for upgrading or installing over an existing application.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="InstallValidate">
                    <xs:annotation><xs:documentation>Verifies that all costed volumes have enough space for the installation.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="InstallInitialize">
                    <xs:annotation><xs:documentation>Marks the beginning of a sequence of actions that change the system.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="AllocateRegistrySpace" minOccurs="0">
                    <xs:annotation><xs:documentation>Ensures the needed amount of space exists in the registry.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="ProcessComponents">
                    <xs:annotation><xs:documentation>Registers and unregisters components, their key paths, and the component clients.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="UnpublishComponents" minOccurs="0">
                    <xs:annotation><xs:documentation>Manages the unadvertisement of components listed in the PublishComponent table.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="UnpublishFeatures" minOccurs="0">
                    <xs:annotation><xs:documentation>Removes selection-state and feature-component mapping information from the registry.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="StopServices">
                    <xs:annotation><xs:documentation>Stops system services.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="DeleteServices">
                    <xs:annotation><xs:documentation>Stops a service and removes its registration from the system.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="UnregisterComPlus">
                    <xs:annotation><xs:documentation>Removes COM+ applications from the registry.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="SelfUnregModules" minOccurs="0">
                    <xs:annotation><xs:documentation>Unregisters all modules listed in the SelfReg table that are scheduled to be uninstalled.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="UnregisterTypeLibraries" minOccurs="0">
                    <xs:annotation><xs:documentation>Unregisters type libraries from the system.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="RemoveODBC">
                    <xs:annotation><xs:documentation>Removes the data sources, translators, and drivers listed for removal during the installation.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="UnregisterFonts">
                    <xs:annotation><xs:documentation>Removes registration information about installed fonts from the system.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="RemoveRegistryValues" minOccurs="0">
                    <xs:annotation><xs:documentation>Removes a registry value that has been authored into the registry table if the associated component was installed locally or as run from source, and is now set to be uninstalled.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="UnregisterClassInfo" minOccurs="0">
                    <xs:annotation><xs:documentation>Manages the removal of COM class information from the system registry.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="UnregisterExtensionInfo">
                    <xs:annotation><xs:documentation>Manages the removal of extension-related information from the system registry.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="UnregisterProgIdInfo" minOccurs="0">
                    <xs:annotation><xs:documentation>Manages the unregistration of OLE ProgId information with the system.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="UnregisterMIMEInfo">
                    <xs:annotation><xs:documentation>Unregisters MIME-related registry information from the system.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="RemoveIniValues">
                    <xs:annotation><xs:documentation>Removes .ini file information specified for removal in the RemoveIniFile table if the component is set to be installed locally or run from source.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="RemoveShortcuts" minOccurs="0">
                    <xs:annotation><xs:documentation>Manages the removal of an advertised shortcut whose feature is selected for uninstallation or a nonadvertised shortcut whose component is selected for uninstallation.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="RemoveEnvironmentStrings">
                    <xs:annotation><xs:documentation>Modifies the values of environment variables.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="RemoveDuplicateFiles">
                    <xs:annotation><xs:documentation>Deletes files installed by the DuplicateFiles action.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="RemoveFiles" minOccurs="0">
                    <xs:annotation><xs:documentation>Removes files previously installed by the InstallFiles action.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="RemoveFolders" minOccurs="0">
                    <xs:annotation><xs:documentation>Removes any folders linked to components set to be removed or run from source.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="CreateFolders" minOccurs="0">
                    <xs:annotation><xs:documentation>Creates empty folders for components that are set to be installed.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="MoveFiles">
                    <xs:annotation><xs:documentation>Locates existing files on the system and moves or copies those files to a new location.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="InstallFiles" minOccurs="0">
                    <xs:annotation><xs:documentation>Copies files specified in the File table from the source directory to the destination directory.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="DuplicateFiles">
                    <xs:annotation><xs:documentation>Duplicates files installed by the InstallFiles action.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="PatchFiles">
                    <xs:annotation><xs:documentation>Queries the Patch table to determine which patches are to be applied.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="BindImage" minOccurs="0">
                    <xs:annotation><xs:documentation>Binds each executable or DLL that must be bound to the DLLs imported by it.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="CreateShortcuts" minOccurs="0">
                    <xs:annotation><xs:documentation>Manages the creation of shortcuts.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="RegisterClassInfo" minOccurs="0">
                    <xs:annotation><xs:documentation>Manages the registration of COM class information with the system.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="RegisterExtensionInfo">
                    <xs:annotation><xs:documentation>Manages the registration of extension related information with the system.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="RegisterProgIdInfo" minOccurs="0">
                    <xs:annotation><xs:documentation>Manages the registration of OLE ProgId information with the system.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="RegisterMIMEInfo">
                    <xs:annotation><xs:documentation>Registers MIME-related registry information with the system.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="WriteRegistryValues" minOccurs="0">
                    <xs:annotation><xs:documentation>Sets up an application's registry information.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="WriteIniValues">
                    <xs:annotation><xs:documentation>Writes the .ini file information that the application needs written to its .ini files.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="WriteEnvironmentStrings">
                    <xs:annotation><xs:documentation>Modifies the values of environment variables.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="RegisterFonts">
                    <xs:annotation><xs:documentation>Registers installed fonts with the system.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="InstallODBC">
                    <xs:annotation><xs:documentation>Installs the drivers, translators, and data sources in the ODBCDriver table, ODBCTranslator table, and ODBCDataSource table.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="RegisterTypeLibraries" minOccurs="0">
                    <xs:annotation><xs:documentation>Registers type libraries with the system.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="SelfRegModules" minOccurs="0">
                    <xs:annotation><xs:documentation>Processes all modules listed in the SelfReg table and registers all installed modules with the system.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="RegisterComPlus">
                    <xs:annotation><xs:documentation>Registers COM+ applications.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="InstallServices">
                    <xs:annotation><xs:documentation>Registers a service for the system.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="StartServices">
                    <xs:annotation><xs:documentation>Starts system services.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="RegisterUser" minOccurs="0">
                    <xs:annotation><xs:documentation>Registers the user information with the installer to identify the user of a product.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="RegisterProduct" minOccurs="0">
                    <xs:annotation><xs:documentation>Registers the product information with the installer.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="PublishComponents" minOccurs="0">
                    <xs:annotation><xs:documentation>Manages the advertisement of the components from the PublishComponent table.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="PublishFeatures" minOccurs="0">
                    <xs:annotation><xs:documentation>Writes each feature's state into the system registry.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="PublishProduct" minOccurs="0">
                    <xs:annotation><xs:documentation>Manages the advertisement of the product information with the system.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="InstallFinalize">
                    <xs:annotation><xs:documentation>Marks the end of a sequence of actions that change the system.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="RemoveExistingProducts">
                    <xs:annotation><xs:documentation>Goes through the product codes listed in the ActionProperty column of the Upgrade table and removes the products in sequence.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="DisableRollback" minOccurs="0">
                    <xs:annotation><xs:documentation>Disables rollback for the remainder of the installation.</xs:documentation></xs:annotation>
                </xs:element>
                <!-- InstallExecute and InstallExecuteAgain can optionally appear anywhere between InstallInitialize and InstallFinalize -->
                <xs:element ref="InstallExecute" minOccurs="0">
                    <xs:annotation><xs:documentation>Runs a script containing all operations spooled since either the start of the installation or the last InstallExecute action, or InstallExecuteAgain action.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="InstallExecuteAgain" minOccurs="0">
                    <xs:annotation><xs:documentation>Runs a script containing all operations spooled since either the start of the installation or the last InstallExecute action, or InstallExecuteAgain action.</xs:documentation></xs:annotation>
                </xs:element>
                <!-- Windows Installer 1.5 actions -->
                <xs:element ref="MsiPublishAssemblies">
                    <xs:annotation><xs:documentation>Manages the advertisement of CLR and Win32 assemblies.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="MsiUnpublishAssemblies">
                    <xs:annotation><xs:documentation>Manages the unadvertisement of CLR and Win32 assemblies that are being removed.</xs:documentation></xs:annotation>
                </xs:element>
            </xs:choice>
        </xs:complexType>
    </xs:element>

    <xs:element name="AdminUISequence">
        <xs:annotation>
            <xs:appinfo>
                <xse:msiRef table="AdminUISequence" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType mixed="true">
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="Custom" minOccurs="0" maxOccurs="unbounded">
                    <xs:annotation><xs:documentation>Use to sequence a custom action.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="Show" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element ref="CostInitialize">
                    <xs:annotation><xs:documentation>Initiates the internal installation costing process.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="FileCost">
                    <xs:annotation><xs:documentation>Initiates dynamic costing of standard installation actions.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="CostFinalize">
                    <xs:annotation><xs:documentation>Ends the internal installation costing process begun by the CostInitialize action.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="ExecuteAction">
                    <xs:annotation><xs:documentation>Initiates the execution sequence.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="InstallValidate">
                    <xs:annotation><xs:documentation>Verifies that all costed volumes have enough space for the installation.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="InstallInitialize">
                    <xs:annotation><xs:documentation>Marks the beginning of a sequence of actions that change the system.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="InstallAdminPackage">
                    <xs:annotation><xs:documentation>Copies the product database to the administrative installation point.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="InstallFiles">
                    <xs:annotation><xs:documentation>Copies files specified in the File table from the source directory to the destination directory.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="InstallFinalize">
                    <xs:annotation><xs:documentation>Marks the end of a sequence of actions that change the system.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="LaunchConditions">
                    <xs:annotation><xs:documentation>Queries the LaunchCondition table and evaluates each conditional statement recorded there.</xs:documentation></xs:annotation>
                </xs:element>
            </xs:choice>
        </xs:complexType>
    </xs:element>

    <xs:element name="AdminExecuteSequence">
        <xs:annotation>
            <xs:appinfo>
                <xse:msiRef table="AdminExecuteSequence" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType mixed="true">
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="Custom" minOccurs="0" maxOccurs="unbounded">
                    <xs:annotation><xs:documentation>Use to sequence a custom action.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="CostInitialize">
                    <xs:annotation><xs:documentation>Initiates the internal installation costing process.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="FileCost">
                    <xs:annotation><xs:documentation>Initiates dynamic costing of standard installation actions.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="CostFinalize">
                    <xs:annotation><xs:documentation>Ends the internal installation costing process begun by the CostInitialize action.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="InstallValidate">
                    <xs:annotation><xs:documentation>Verifies that all costed volumes have enough space for the installation.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="InstallInitialize">
                    <xs:annotation><xs:documentation>Marks the beginning of a sequence of actions that change the system.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="InstallAdminPackage">
                    <xs:annotation><xs:documentation>Copies the product database to the administrative installation point.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="InstallFiles">
                    <xs:annotation><xs:documentation>Copies files specified in the File table from the source directory to the destination directory.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="InstallFinalize">
                    <xs:annotation><xs:documentation>Marks the end of a sequence of actions that change the system.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="LaunchConditions">
                    <xs:annotation><xs:documentation>Queries the LaunchCondition table and evaluates each conditional statement recorded there.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="ResolveSource" minOccurs="0">
                    <xs:annotation><xs:documentation>Determines the location of the source and sets the SourceDir property if the source has not been resolved yet.</xs:documentation></xs:annotation>
                </xs:element>
            </xs:choice>
        </xs:complexType>
    </xs:element>

    <xs:element name="AdvertiseExecuteSequence">
        <xs:annotation>
            <xs:appinfo>
                <xse:msiRef table="AdvtExecuteSequence" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType mixed="true">
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="CostInitialize">
                    <xs:annotation><xs:documentation>Initiates the internal installation costing process.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="CostFinalize">
                    <xs:annotation><xs:documentation>Ends the internal installation costing process begun by the CostInitialize action.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="Custom" minOccurs="0" maxOccurs="unbounded">
                    <xs:annotation><xs:documentation>Use to sequence a custom action.  The only custom actions that are allowed in the AdvtExecuteSequence are type 19 (0x013) type 35 (0x023) and type 51 (0x033).</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="InstallValidate">
                    <xs:annotation><xs:documentation>Verifies that all costed volumes have enough space for the installation.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="InstallInitialize">
                    <xs:annotation><xs:documentation>Marks the beginning of a sequence of actions that change the system.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="CreateShortcuts">
                    <xs:annotation><xs:documentation>Manages the creation of shortcuts.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="RegisterClassInfo">
                    <xs:annotation><xs:documentation>Manages the registration of COM class information with the system.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="RegisterExtensionInfo">
                    <xs:annotation><xs:documentation>Manages the registration of extension related information with the system.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="RegisterMIMEInfo">
                    <xs:annotation><xs:documentation>Registers MIME-related registry information with the system.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="RegisterProgIdInfo">
                    <xs:annotation><xs:documentation>Manages the registration of OLE ProgId information with the system.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="PublishComponents">
                    <xs:annotation><xs:documentation>Manages the advertisement of the components from the PublishComponent table.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="PublishFeatures">
                    <xs:annotation><xs:documentation>Writes each feature's state into the system registry.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="PublishProduct">
                    <xs:annotation><xs:documentation>Manages the advertisement of the product information with the system.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="InstallFinalize">
                    <xs:annotation><xs:documentation>Marks the end of a sequence of actions that change the system.</xs:documentation></xs:annotation>
                </xs:element>
                <!-- Windows Installer 1.5 actions -->
                <xs:element ref="MsiPublishAssemblies">
                    <xs:annotation><xs:documentation>Manages the advertisement of CLR and Win32 assemblies.</xs:documentation></xs:annotation>
                </xs:element>
            </xs:choice>
        </xs:complexType>
    </xs:element>
    <!-- - - - - - - - - - - Binary tables - - - - - - - - - - - - - -->
    <xs:element name="Binary">
        <xs:annotation>
            <xs:documentation>
                Binary data used for CustomAction elements and UI controls.
            </xs:documentation>
        <xs:appinfo>
                <xse:msiRef table="Binary" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>The Id cannot by longer than 55 characters.  In order to prevent errors in cases where the Id is modularized, it should not be longer than 18 characters.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="SourceFile" type="xs:string">
                <xs:annotation><xs:documentation>Path to the binary file.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="src" type="xs:string">
                <xs:annotation>
                    <xs:appinfo>
                        <xse:deprecated ref="SourceFile" />
                    </xs:appinfo>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="Icon">
        <xs:annotation>
            <xs:documentation>
                Icon used for Shortcut, ProgId, or Class elements (but not UI controls)
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="Icon" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>The Id cannot by longer than 55 characters.  In order to prevent errors in cases where the Id is modularized, it should not be longer than 18 characters.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="SourceFile" type="xs:string">
                <xs:annotation><xs:documentation>Path to the icon file.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="src" type="xs:string">
                <xs:annotation>
                    <xs:appinfo>
                        <xse:deprecated ref="SourceFile" />
                    </xs:appinfo>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <!-- - - - - - - - - - - UI Definitions - - - - - - - - - - - - - -->

    <xs:element name="Error">
        <xs:annotation>
            <xs:appinfo>
                <xse:msiRef table="Error" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:string">
                    <xs:annotation><xs:documentation>Element value is Message, use CDATA if message contains delimiter characters</xs:documentation></xs:annotation>
                    <xs:attribute name="Id" type="xs:integer">
                        <xs:annotation><xs:documentation>Number of the error for which a message is being provided. See MSI SDK for error definitions.</xs:documentation></xs:annotation>
                    </xs:attribute>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>

    <xs:element name="Publish">
        <xs:annotation>
            <xs:appinfo>
                <xse:msiRef table="ControlEvent" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:string">
                    <xs:annotation><xs:documentation>The element value is the optional Condition expression.</xs:documentation></xs:annotation>
                    <!-- Ordering of these elements is registered in the ControlEvent table -->
                    <xs:attribute name="Event" type="xs:string">
                        <xs:annotation>
                            <xs:documentation>
                                Set this attribute's value to one of the standard control events to trigger that event.
                                Either this attribute or the Property attribute must be set, but not both at the same time.
                            </xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="Property" type="xs:string">
                        <xs:annotation>
                            <xs:documentation>
                                Set this attribute's value to a property name to set that property.
                                Either this attribute or the Event attribute must be set, but not both at the same time.
                            </xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="Value" type="xs:string">
                        <xs:annotation>
                            <xs:documentation>
                                If the Property attribute is specified, set the value of this attribute to the new value for the property.
                                To set a property to null, do not set this attribute (the ControlEvent Argument column will be set to '{}').
                                Otherwise, this attribute's value should be the argument for the event specified in the Event attribute.
                            </xs:documentation>
                        </xs:annotation>
                    </xs:attribute>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>

    <xs:element name="Subscribe">
        <xs:annotation>
            <xs:documentation>
                Sets attributes for events in the EventMapping table
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="EventMapping" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Event" type="xs:string">
                <xs:annotation><xs:documentation>must be one of the standard control events'</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Attribute" type="xs:string">
                <xs:annotation><xs:documentation>if not present can only handle enable, disable, hide, unhide events</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="Text">
        <xs:annotation><xs:documentation>Alternative to Text attributes when CDATA is needed to escape XML delimiters.</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:string">
                    <xs:attribute name="SourceFile" type="xs:string">
                        <xs:annotation><xs:documentation>Instructs the text to be imported from a file instead of the element value during the binding process.</xs:documentation></xs:annotation>
                    </xs:attribute>
                    <xs:attribute name="src" type="xs:string">
                        <xs:annotation>
                            <xs:appinfo>
                                <xse:deprecated ref="SourceFile" />
                            </xs:appinfo>
                        </xs:annotation>
                    </xs:attribute>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>

    <xs:element name="Control">
        <xs:annotation>
            <xs:appinfo>
                <xse:msiRef table="Control" />
                <xse:msiRef table="ComboBox" />
                <xse:msiRef table="Dialog" />
                <xse:msiRef table="ListBox" />
                <xse:msiRef table="ListView" />
                <xse:msiRef table="RadioButton" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Text" minOccurs="0">
                    <xs:annotation><xs:documentation>alternative to Text attribute when CDATA is needed to escape XML delimiters</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="ComboBox" minOccurs="0">
                    <xs:annotation><xs:documentation>ComboBox table with ListItem children</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="ListBox" minOccurs="0">
                    <xs:annotation><xs:documentation>ListBox table with ListItem children</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="ListView" minOccurs="0">
                    <xs:annotation><xs:documentation>ListView table with ListItem children</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="RadioButtonGroup" minOccurs="0">
                    <xs:annotation><xs:documentation>RadioButton table with RadioButton children</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="Property" minOccurs="0">
                    <xs:annotation><xs:documentation>Property table entry for the Property table column associated with this control</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="Binary" minOccurs="0">
                    <xs:annotation><xs:documentation>Icon referenced in icon column of row</xs:documentation></xs:annotation>
                </xs:element>
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                    <xs:annotation><xs:documentation>child elements affecting operation of this control</xs:documentation></xs:annotation>
                    <xs:element ref="Condition">
                        <xs:annotation><xs:documentation>Condition to specify actions for this control based on the outcome of the condition.</xs:documentation></xs:annotation>
                    </xs:element>
                    <xs:element ref="Publish"/>
                    <xs:element ref="Subscribe"/>
                </xs:choice>
            </xs:sequence>
            <xs:attribute name="Id" use="required" type="xs:string"/>
            <xs:attribute name="Type" use="required" type="xs:string">
            </xs:attribute>
            <xs:attribute name="X" use="required" type="LocalizableInteger">
            </xs:attribute>
            <xs:attribute name="Y" use="required" type="LocalizableInteger">
            </xs:attribute>
            <xs:attribute name="Width" use="required" type="LocalizableInteger">
            </xs:attribute>
            <xs:attribute name="Height" use="required" type="LocalizableInteger">
            </xs:attribute>
            <xs:attribute name="Property" type="xs:string">
            </xs:attribute>
            <xs:attribute name="Text" type="xs:string">
            </xs:attribute>
            <xs:attribute name="Help" type="xs:string">
            </xs:attribute>
            <xs:attribute name="ToolTip" type="xs:string">
            </xs:attribute>
            <xs:attribute name="CheckBoxValue" type="xs:string">
                <xs:annotation><xs:documentation>Only for CheckBox control to set Property to a value on check</xs:documentation></xs:annotation>
            </xs:attribute>
            <!-- Control ordering - order of declaration in Dialog determines tab ordering -->
            <xs:attribute name="TabSkip" type="YesNoType">
                <xs:annotation><xs:documentation>yes if this control is skipped in the tab sequence</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Default" type="YesNoType">
                <xs:annotation><xs:documentation>yes if this control invoked by the return key</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Cancel" type="YesNoType">
                <xs:annotation><xs:documentation>yes if this is the control invoked on cancel of dialog</xs:documentation></xs:annotation>
            </xs:attribute>
            <!-- common Control attributes -->
            <xs:attribute name="Hidden" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="Disabled" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="Sunken" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="Indirect" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="Integer" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="RightToLeft" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="RightAligned" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="LeftScroll" type="YesNoType">
            </xs:attribute>
            <!-- attributes applied to specific Controls -->
            <xs:attribute name="Transparent" type="YesNoType">
                <xs:annotation><xs:documentation>only valid for Text Controls</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="NoPrefix" type="YesNoType">
                <xs:annotation><xs:documentation>only valid for Text Controls</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="NoWrap" type="YesNoType">
                <xs:annotation><xs:documentation>only valid for Text Controls</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="FormatSize" type="YesNoType">
                <xs:annotation><xs:documentation>only valid for Text Controls</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="UserLanguage" type="YesNoType">
                <xs:annotation><xs:documentation>only valid for Text Controls</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Multiline" type="YesNoType">
                <xs:annotation><xs:documentation>only valid for Edit Controls</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Password" type="YesNoType">
                <xs:annotation><xs:documentation>only valid for Edit Controls</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="ProgressBlocks" type="YesNoType">
                <xs:annotation><xs:documentation>only valid for ProgressBar Controls</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Removable" type="YesNoType">
                <xs:annotation><xs:documentation>only valid for Volume and Directory Controls</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Fixed" type="YesNoType">
                <xs:annotation><xs:documentation>only valid for Volume and Directory Controls</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Remote" type="YesNoType">
                <xs:annotation><xs:documentation>only valid for Volume and Directory Controls</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="CDROM" type="YesNoType">
                <xs:annotation><xs:documentation>only valid for Volume and Directory Controls</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="RAMDisk" type="YesNoType">
                <xs:annotation><xs:documentation>only valid for Volume and Directory Controls</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Floppy" type="YesNoType">
                <xs:annotation><xs:documentation>only valid for Volume and Directory Controls</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="ShowRollbackCost" type="YesNoType">
                <xs:annotation><xs:documentation>only valid for VolumeCostList Controls</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Sorted" type="YesNoType">
                <xs:annotation><xs:documentation>This attribute is only valid for Listbox, ListView, and ComboBox Controls. Set 
                the value of this attribute to "yes" to have entries appear in the order specified under the Control.
                If the attribute value is "no" or absent the entries in the control will appear in alphabetical order.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="ComboList" type="YesNoType">
                <xs:annotation><xs:documentation>only valid for ComboBox Controls</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Image" type="YesNoType">
                <xs:annotation><xs:documentation>only valid for RadioButton, PushButton, and Icon Controls</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="IconSize">
                <xs:annotation><xs:documentation>only valid for RadioButton, PushButton, and Icon Controls</xs:documentation></xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="16"/>
                        <xs:enumeration value="32"/>
                        <xs:enumeration value="48"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="FixedSize" type="YesNoType">
                <xs:annotation><xs:documentation>only valid for RadioButton, PushButton, and Icon Controls</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Icon" type="YesNoType">
                <xs:annotation><xs:documentation>only valid for RadioButton and PushButton Controls</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Bitmap" type="YesNoType">
                <xs:annotation><xs:documentation>only valid for RadioButton and PushButton Controls</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="PushLike" type="YesNoType">
                <xs:annotation><xs:documentation>only valid for RadioButton and Checkbox Controls</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="HasBorder" type="YesNoType">
                <xs:annotation><xs:documentation>only valid for RadioButton Controls</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="ElevationShield" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>
                        Only valid for PushButton controls.
                        This attribute adds the User Account Control (UAC) elevation icon (shield icon) to the PushButton control.
                        If this attribute's value is 'yes' and the installation is not yet running with elevated privileges,
                        the pushbutton control is created using the User Account Control (UAC) elevation icon (shield icon).
                        If this attribute's value is 'yes' and the installation is already running with elevated privileges,
                        the pushbutton control is created using the other icon attributes.
                        Otherwise, the pushbutton control is created using the other icon attributes.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="Billboard">
        <xs:annotation>
            <xs:documentation>
                Billboard to display during install of a Feature
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="Billboard" />
                <xse:msiRef table="BBControl" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Control" minOccurs='0' maxOccurs='unbounded'>
                    <xs:annotation><xs:documentation>Only controls of static type such as: Text, Bitmap, Icon, or custom control can be placed on a billboard.</xs:documentation></xs:annotation>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Unique identifier for the Billboard.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Feature" type="xs:string">
                <xs:annotation><xs:documentation>Feature whose state determines if the Billboard is shown.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="BillboardAction">
        <xs:annotation>
            <xs:documentation>
                Billboard action during which child Billboards are displayed
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="Billboard" />
                <xse:msiRef table="BBControl" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Billboard" maxOccurs="unbounded">
                    <xs:annotation><xs:documentation>Order of Billboard elements determines order of display</xs:documentation></xs:annotation>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Action name that determines when the Billboard should be shown.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="Dialog">
        <xs:annotation>
            <xs:appinfo>
                <xse:msiRef table="Control" />
                <xse:msiRef table="ComboBox" />
                <xse:msiRef table="Dialog" />
                <xse:msiRef table="ListBox" />
                <xse:msiRef table="ListView" />
                <xse:msiRef table="RadioButton" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Control" minOccurs="0" maxOccurs="unbounded">
                    <xs:annotation><xs:documentation>Control elements belonging to this dialog</xs:documentation></xs:annotation>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="Id" type="xs:string" use="required"/>
            <xs:attribute name="X" type="xs:integer">
                <xs:annotation><xs:documentation>in %, defaults to centered on screen (50)</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Y" type="xs:integer">
                <xs:annotation><xs:documentation>in %, defaults to centered on screen (50)</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Width" use="required" type="xs:integer">
                <xs:annotation><xs:documentation>in dialog units</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Height" use="required" type="xs:integer">
                <xs:annotation><xs:documentation>in dialog units</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Title" type="xs:string">
            </xs:attribute>
            <!-- 'Attributes' column integer value generated from XML attributes below -->
            <xs:attribute name="Hidden" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="Modeless" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="NoMinimize" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="SystemModal" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="KeepModeless" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="TrackDiskSpace" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="CustomPalette" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="RightToLeft" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="RightAligned" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="LeftScroll" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="ErrorDialog" type="YesNoType">
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="DialogRef">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="Dialog"/>
            </xs:appinfo>
            <xs:documentation>
                Reference to a Dialog.  This will cause the entire referenced section's contents
                to be included in the installer database.
            </xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>The identifier of the Dialog to reference.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="ProgressText">
        <xs:annotation>
            <xs:appinfo>
                <xse:msiRef table="ActionText" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:string">
                    <xs:annotation><xs:documentation>Element value is progress message text for action</xs:documentation></xs:annotation>
                    <xs:attribute name="Action" type="xs:string" use="required"/>
                    <xs:attribute name="Template" type="xs:string">
                        <xs:annotation><xs:documentation>used to format ActionData messages from action processing</xs:documentation></xs:annotation>
                    </xs:attribute>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>

    <xs:element name="TextStyle">
        <xs:annotation>
            <xs:appinfo>
                <xse:msiRef table="TextStyle" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" type="xs:string" use="required"/>
            <xs:attribute name="FaceName" use="required" type="xs:string"/>
            <xs:attribute name="Size" use="required" type="xs:integer"/>
            <xs:attribute name="Red" type="xs:integer">
                <xs:annotation><xs:documentation>0 to 255</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Green" type="xs:integer">
                <xs:annotation><xs:documentation>0 to 255</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Blue" type="xs:integer">
                <xs:annotation><xs:documentation>0 to 255</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Bold" type="YesNoType"/>
            <xs:attribute name="Italic" type="YesNoType"/>
            <xs:attribute name="Underline" type="YesNoType"/>
            <xs:attribute name="Strike" type="YesNoType"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="ListItem">
        <xs:annotation>
            <xs:documentation>
                Text and value associated with Property with Control set to ListBox, ListView, ComboBox
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="Control" />
                <xse:msiRef table="ComboBox" />
                <xse:msiRef table="Dialog" />
                <xse:msiRef table="ListBox" />
                <xse:msiRef table="ListView" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Text" minOccurs="0">
                    <xs:annotation><xs:documentation>Alternative to Text attribute when CDATA is needed to escape XML delimiters.</xs:documentation></xs:annotation>
                </xs:element>
            </xs:sequence>

            <xs:attribute name="Value" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Value assigned to the associated control Property.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Text" type="xs:string">
                <xs:annotation><xs:documentation>Defaults to ListItem's value</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Icon" type="xs:string">
                <xs:annotation><xs:documentation>Only valid in ListView Properties</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="ListBox">
        <xs:annotation>
            <xs:documentation>
                Set of items for a particular ListBox control tied to an install Property
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="Control" />
                <xse:msiRef table="Dialog" />
                <xse:msiRef table="ListView" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="ListItem" minOccurs="0" maxOccurs="unbounded">
                    <xs:annotation><xs:documentation>entry for ListBox table</xs:documentation></xs:annotation>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="Property" use="required" type="xs:string">
                <xs:annotation><xs:documentation>Property tied to this group</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="ComboBox">
        <xs:annotation>
            <xs:documentation>
                Set of items for a particular ComboBox control tied to an install Property
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="ComboBox" />
                <xse:msiRef table="Control" />
                <xse:msiRef table="Dialog" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="ListItem" minOccurs="0" maxOccurs="unbounded">
                    <xs:annotation><xs:documentation>entry for ComboBox table</xs:documentation></xs:annotation>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="Property" use="required" type="xs:string">
                <xs:annotation><xs:documentation>Property tied to this group</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="ListView">
        <xs:annotation>
            <xs:documentation>
                Set of items for a particular ListView control tied to an install Property
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="ListView" />
                <xse:msiRef table="Control" />
                <xse:msiRef table="Dialog" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="ListItem" minOccurs="0" maxOccurs="unbounded">
                    <xs:annotation><xs:documentation>entry for ListView table</xs:documentation></xs:annotation>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="Property" use="required" type="xs:string">
                <xs:annotation><xs:documentation>Property tied to this group</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="RadioButton">
        <xs:annotation>
            <xs:appinfo>
                <xse:seeAlso ref="RadioButtonGroup"/>
                <xse:msiRef table="RadioButton" />
                <xse:msiRef table="Control" />
                <xse:msiRef table="Dialog" />
            </xs:appinfo>
            <xs:documentation>Text or Icon plus Value that is assigned to the Property of the parent Control (RadioButtonGroup).</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Bitmap" type="xs:string">
                <xs:annotation><xs:documentation>
                    This attribute defines the bitmap displayed with the radio button.  The value of the attribute creates a reference
                    to a Binary element that represents the bitmap.  This attribute is mutually exclusive with the Icon and Text 
                    attributes.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Height" use="required" type="LocalizableInteger"/>
            <xs:attribute name="Help" type="xs:string"/>
            <xs:attribute name="Icon" type="xs:string">
                <xs:annotation><xs:documentation>
                    This attribute defines the icon displayed with the radio button.  The value of the attribute creates a reference
                    to a Binary element that represents the icon.  This attribute is mutually exclusive with the Bitmap and Text 
                    attributes.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Text" type="xs:string">
                <xs:annotation><xs:documentation>Text displayed with the radio button.  This attribute is mutually exclusive with the Bitmap and Icon attributes.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="ToolTip" type="xs:string"/>
            <xs:attribute name="Value" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Value assigned to the associated control Property when this radio button is selected.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Width" use="required" type="LocalizableInteger"/>
            <xs:attribute name="X" use="required" type="LocalizableInteger"/>
            <xs:attribute name="Y" use="required" type="LocalizableInteger"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="RadioButtonGroup">
        <xs:annotation>
            <xs:documentation>
                Set of radio buttons tied to the specified Property
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="RadioButton" />
                <xse:msiRef table="Control" />
                <xse:msiRef table="Dialog" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="RadioButton" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attribute name="Property" use="required" type="xs:string">
                <xs:annotation><xs:documentation>Property tied to this group.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="UIText">
        <xs:annotation>
            <xs:documentation>
                Text associated with certain controls
            </xs:documentation>
            <xs:appinfo>
                <xse:msiRef table="UIText" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:string">
                    <xs:annotation><xs:documentation>Element value is text, may use CDATA if needed to escape XML delimiters</xs:documentation></xs:annotation>
                    <xs:attribute name="Id" use="required" type="xs:string"/>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>

    <xs:element name="UIRef">
        <xs:annotation>
            <xs:documentation>
                Reference to a UI element.  This will force the entire referenced Fragment's contents
                to be included in the installer database.
            </xs:documentation>
            <xs:appinfo>
                <xse:seeAlso ref="UI" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" type="xs:string" use="required" />
        </xs:complexType>
    </xs:element>

    <xs:element name="UI">
        <xs:annotation>
            <xs:documentation>
                Enclosing element to compartmentalize UI specifications.
            </xs:documentation>
            <xs:appinfo>
                <xse:seeAlso ref="UIRef" />
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="Error">
                    <xs:annotation><xs:documentation>Error text associated with install error</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="ProgressText">
                    <xs:annotation><xs:documentation>ActionText entry associated with an action</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="BillboardAction">
                    <xs:annotation><xs:documentation>Billboard table item with child Controls</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="ComboBox">
                    <xs:annotation><xs:documentation>ComboBox table with ListItem children</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="ListBox">
                    <xs:annotation><xs:documentation>ListBox table with ListItem children</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="ListView">
                    <xs:annotation><xs:documentation>ListView table with ListItem children</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="RadioButtonGroup">
                    <xs:annotation><xs:documentation>RadioButton table with RadioButton children</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="TextStyle">
                    <xs:annotation><xs:documentation>TextStyle entry for use in control text</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="UIText">
                    <xs:annotation><xs:documentation>values for UIText property, not installer Property</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="Dialog">
                    <xs:annotation><xs:documentation>Dialog specification, called from Sequence</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="DialogRef">
                    <xs:annotation><xs:documentation>Reference to a Dialog specification.</xs:documentation></xs:annotation>
                </xs:element>
                <!-- elements with identical behavior as under Product key, solely to allow grouping with other UI elements -->
                <xs:element ref="Property"/>
                <xs:element ref="Binary"/>
                <xs:sequence>
                    <xs:element ref="AdminUISequence" minOccurs="0"/>
                    <xs:element ref="InstallUISequence" minOccurs="0"/>
                </xs:sequence>
            </xs:choice>
            <xs:attribute name="Id" type="xs:string" />
        </xs:complexType>
    </xs:element>

    <!-- custom table elements -->

    <xs:element name="CustomTable">
        <xs:annotation><xs:documentation>Defines a custom table for use from a custom action.</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Column" minOccurs="0" maxOccurs="unbounded">
                    <xs:annotation><xs:documentation>Column definition for the custom table.</xs:documentation></xs:annotation>
                </xs:element>
                <xs:element ref="Row" minOccurs="0" maxOccurs="unbounded">
                    <xs:annotation><xs:documentation>Row definition for the custom table.</xs:documentation></xs:annotation>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Identifier for the custom table.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="Column">
        <xs:annotation><xs:documentation>Column definition for a Custom Table</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Identifier for the column.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="PrimaryKey" type="YesNoType">
                <xs:annotation><xs:documentation>Whether this column is a primary key.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Type" use="required">
                <xs:annotation><xs:documentation>The type of this column.</xs:documentation></xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="binary"/>
                        <xs:enumeration value="int"/>
                        <xs:enumeration value="string"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="Width" type="xs:integer">
                <xs:annotation><xs:documentation>Width of this column.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Nullable" type="YesNoType">
                <xs:annotation><xs:documentation>Whether this column can be left null.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Localizable" type="YesNoType">
                <xs:annotation><xs:documentation>Whether this column can be localized.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="MinValue" type="xs:integer">
                <xs:annotation><xs:documentation>Minimum value for a numeric value, date or version in this column.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="MaxValue" type="xs:integer">
                <xs:annotation><xs:documentation>Maximum value for a numeric value, date or version in this column.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="KeyTable" type="xs:string">
                <xs:annotation><xs:documentation>Table in which this column is an external key. Can be semicolon delimited.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="KeyColumn" type="xs:integer">
                <xs:annotation><xs:documentation>Column in the table in KeyTable attribute.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Category">
                <xs:annotation><xs:documentation>Category of this column.</xs:documentation></xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="Text"/>
                        <xs:enumeration value="UpperCase"/>
                        <xs:enumeration value="LowerCase"/>
                        <xs:enumeration value="Integer"/>
                        <xs:enumeration value="DoubleInteger"/>
                        <xs:enumeration value="TimeDate"/>
                        <xs:enumeration value="Identifier"/>
                        <xs:enumeration value="Property"/>
                        <xs:enumeration value="Filename"/>
                        <xs:enumeration value="WildCardFilename"/>
                        <xs:enumeration value="Path"/>
                        <xs:enumeration value="Paths"/>
                        <xs:enumeration value="AnyPath"/>
                        <xs:enumeration value="DefaultDir"/>
                        <xs:enumeration value="RegPath"/>
                        <xs:enumeration value="Formatted"/>
                        <xs:enumeration value="Template"/>
                        <xs:enumeration value="Condition"/>
                        <xs:enumeration value="Guid"/>
                        <xs:enumeration value="Version"/>
                        <xs:enumeration value="Language"/>
                        <xs:enumeration value="Binary"/>
                        <xs:enumeration value="CustomSource"/>
                        <xs:enumeration value="Cabinet"/>
                        <xs:enumeration value="Shortcut"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="Set" type="xs:string">
                <xs:annotation><xs:documentation>Semicolon delimited list of permissible values.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Description" type="xs:string">
                <xs:annotation><xs:documentation>Description of this column.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Modularize" type="ModularizeType">
                <xs:annotation><xs:documentation>How this column should be modularized, if at all.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="Row">
        <xs:annotation><xs:documentation>Row data for a Custom Table</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Data" minOccurs="1" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="Data">
        <xs:annotation><xs:documentation>Data item for a row of a Custom Table</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:string">
                    <xs:annotation><xs:documentation>Element value is data the data value</xs:documentation></xs:annotation>
                    <xs:attribute name="Column" use="required" type="xs:string"/>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>
    
    <!-- EnsureTable element, for preserving empty tables -->

    <xs:element name="EnsureTable">
        <xs:annotation>
            <xs:documentation>
                Use this element to ensure that a table appears in the installer database, even if its empty.  
            </xs:documentation>
            <xs:appinfo>
                <xse:remarks>
                    This element is particularly useful for two problems that may occur while merging merge modules:
                    <html:ol>
                        <html:li>
                            The first likely problem is that in order to properly merge you need to have certain
                            tables present prior to merging.  Using this element is one way to ensure those tables
                            are present prior to the merging.
                        </html:li>
                        <html:li>
                            The other common problem is that a merge module has incorrect validation information
                            about some tables.  By ensuring these tables prior to merging, you can avoid this
                            problem because the correct validation information will go into the installer database
                            before the merge module has a chance to set it incorrectly.
                        </html:li>
                    </html:ol>
                </xse:remarks>
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" use="required" type="xs:string">
                <xs:annotation><xs:documentation>The name of the table.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <!-- WiX server elements -->

    <xs:element name="User">
        <xs:annotation>
            <xs:documentation>User for all kinds of things.  When it is not nested under a component it is included in the MSI so it can be referenced by other elements such as the User attribute in the AppPool element.  When it is nested under a Component element, the User will be created on install and can also be used for reference.</xs:documentation>
            <xs:appinfo>
                <xse:seeAlso ref="Group"/>
                <xse:seeAlso ref="GroupRef"/>
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="GroupRef" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attribute name="Id" type="xs:string" use="required"/>
            <xs:attribute name="Name" use="required" type="xs:string">
            </xs:attribute>
            <xs:attribute name="Domain" type="xs:string">
            </xs:attribute>
            <xs:attribute name="Password" type="xs:string">
                <xs:annotation><xs:documentation>Usually a Property that is passed in on the command-line to keep it more secure.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="PasswordNeverExpires" type="YesNoType"/>
            <xs:attribute name="CanNotChangePassword" type="YesNoType"/>
            <xs:attribute name="RemoveOnUninstall" type="YesNoType">
                <xs:annotation><xs:documentation>Indicates whether the user account should be left behind on uninstall.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="FailIfExists" type="YesNoType">
                <xs:annotation><xs:documentation>Indicates if the install should fail if the user already exists.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="UpdateIfExists" type="YesNoType">
                <xs:annotation><xs:documentation>Indicates if the user account properties should be updated if the user already exists.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name ="PasswordExpired" type="YesNoType">
                <xs:annotation><xs:documentation>Indicates whether the user must change their password on their first login.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Disabled" type="YesNoType"/>
            <xs:attribute name="CreateUser" type="YesNoType">
                <xs:annotation><xs:documentation>Indicates whether or not to create the user.  User creation can be skipped if all that is desired is to join a user to groups.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    
    <xs:element name="GroupRef">
        <xs:annotation>
            <xs:documentation>Used to join a user to a group</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" type="xs:string" use="required"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="Group">
        <xs:annotation>
            <xs:documentation>Group for all kinds of things</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" type="xs:string" use="required"/>
            <xs:attribute name="Name" type="xs:string" use="required"/>
            <xs:attribute name="Domain" type="xs:string"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="WebDirProperties">
        <xs:annotation>
            <xs:documentation>WebDirProperites used by one or more WebSites. Lists properties common to IIS web sites and vroots. Corresponding properties can be viewed through the IIS Manager snap-in. One property entry can be reused by multiple sites or vroots using the Id field as a reference, using WebVirtualDir.DirProperties, WebSite.DirProperties, or WebDir.DirProperties.
        </xs:documentation></xs:annotation>
        <xs:complexType>
                <xs:attribute name="Id" type="xs:string" use="required"/>
                <xs:attribute name="Read" type="YesNoType"/>
                <xs:attribute name="Write" type="YesNoType"/>
                <xs:attribute name="Script" type="YesNoType"/>
                <xs:attribute name="Execute" type="YesNoType"/>
                <xs:attribute name="AnonymousAccess" type="YesNoType">
                    <xs:annotation><xs:documentation>Sets the Enable Anonymous Access checkbox, which maps anonymous users to a Windows user account. When setting this to 'yes' you should also provide the user account using the AnonymousUser attribute, and determine what setting to use for the IIsControlledPassword attribute. Defaults to 'no.'</xs:documentation></xs:annotation>
                </xs:attribute>
                <xs:attribute name="AnonymousUser" type="xs:string">
                    <xs:annotation><xs:documentation>Reference to the Id attribute on the User element to be used as the anonymous user for the directory. See the User element for more information.</xs:documentation></xs:annotation>
                </xs:attribute>
                <xs:attribute name="IIsControlledPassword" type="YesNoType">
                    <xs:annotation><xs:documentation>Sets whether IIS should control the password used for the Windows account specified in the AnonymousUser attribute. Defaults to 'no.'</xs:documentation></xs:annotation>
                </xs:attribute>
                <xs:attribute name="WindowsAuthentication" type="YesNoType">
                    <xs:annotation><xs:documentation>Sets the Windows Authentication option, which enables integrated Windows authentication to be used on the site. Defaults to 'no.'</xs:documentation></xs:annotation>
                </xs:attribute>
                <xs:attribute name="DigestAuthentication" type="YesNoType">
                    <xs:annotation><xs:documentation>Sets the Digest Authentication option, which allows using digest authentication with domain user accounts. Defaults to 'no.'</xs:documentation></xs:annotation>
                </xs:attribute>
                <xs:attribute name="BasicAuthentication" type="YesNoType">
                    <xs:annotation><xs:documentation>Sets the Basic Authentication option, which allows clients to provide credentials in plaintext over the wire. Defaults to 'no.'</xs:documentation></xs:annotation>
                </xs:attribute>
                <xs:attribute name="PassportAuthentication" type="YesNoType">
                    <xs:annotation><xs:documentation>Sets the Passport Authentication option, which allows clients to provide credentials via a .Net Passport account. Defaults to 'no.'</xs:documentation></xs:annotation>
                </xs:attribute>
                <xs:attribute name="LogVisits" type="YesNoType">
                    <xs:annotation><xs:documentation>Sets whether visits to this site should be logged. Defaults to 'no.'</xs:documentation></xs:annotation>
                </xs:attribute>
                <xs:attribute name="Index" type="YesNoType">
                    <xs:annotation><xs:documentation>Sets the Index Resource option, which specifies whether this web directory should be indexed. Defaults to 'no.'</xs:documentation></xs:annotation>
                </xs:attribute>
                <xs:attribute name="DefaultDocuments" type="xs:string">
                    <xs:annotation><xs:documentation>The list of default documents to set for this web directory, in comma-delimited format.</xs:documentation></xs:annotation>
                </xs:attribute>
                <xs:attribute name="AspDetailedError" type="YesNoType">
                    <xs:annotation><xs:documentation>Sets the option for whether to send detailed ASP errors back to the client on script error. Default is 'no.'</xs:documentation></xs:annotation>
                </xs:attribute>
                <xs:attribute name="HttpExpires" type="xs:string">
                    <xs:annotation><xs:documentation>Value to set the HttpExpires attribute to for a Web Dir in the metabase.</xs:documentation></xs:annotation>
                </xs:attribute>
                <xs:attribute name="CacheControlMaxAge" type="xs:integer">
                    <xs:annotation><xs:documentation>Integer value specifying the cache control maximum age value.</xs:documentation></xs:annotation>
                </xs:attribute>
                <xs:attribute name="CacheControlCustom" type="xs:string">
                    <xs:annotation><xs:documentation>Custom HTTP 1.1 cache control directives.</xs:documentation></xs:annotation>
                </xs:attribute>
                <xs:attribute name="ClearCustomError" type="YesNoType">
                    <xs:annotation><xs:documentation>Specifies whether IIs will return custom errors for this directory.</xs:documentation></xs:annotation>
                </xs:attribute>
                <xs:attribute name="AccessSSL" type="YesNoType">
                    <xs:annotation><xs:documentation>A value of true indicates that file access requires SSL file permission processing, with or without a client certificate. This corresponds to AccessSSL flag for AccessSSLFlags IIS metabase property.</xs:documentation></xs:annotation>
                </xs:attribute>
                <xs:attribute name="AccessSSL128" type="YesNoType">
                    <xs:annotation><xs:documentation>A value of true indicates that file access requires SSL file permission processing with a minimum key size of 128 bits, with or without a client certificate. This corresponds to AccessSSL128 flag for AccessSSLFlags IIS metabase property.</xs:documentation></xs:annotation>
                </xs:attribute>
                <xs:attribute name="AccessSSLMapCert" type="YesNoType">
                    <xs:annotation><xs:documentation>This corresponds to AccessSSLMapCert flag for AccessSSLFlags IIS metabase property.</xs:documentation></xs:annotation>
                </xs:attribute>
                <xs:attribute name="AccessSSLNegotiateCert" type="YesNoType">
                    <xs:annotation><xs:documentation>This corresponds to AccessSSLNegotiateCert flag for AccessSSLFlags IIS metabase property.</xs:documentation></xs:annotation>
                </xs:attribute>
                <xs:attribute name="AccessSSLRequireCert" type="YesNoType">
                    <xs:annotation><xs:documentation>This corresponds to AccessSSLRequireCert flag for AccessSSLFlags IIS metabase property.</xs:documentation></xs:annotation>
                </xs:attribute>
                <xs:attribute name="AuthenticationProviders" type="xs:string">
                    <xs:annotation><xs:documentation>Comma delimited list, in order of precedence, of Windows authentication providers that IIS will attempt to use: NTLM, Kerberos, Negotiate, and others.</xs:documentation></xs:annotation>
                </xs:attribute>    
        </xs:complexType>
    </xs:element>

    <xs:element name="WebError">
        <xs:annotation>
            <xs:documentation>Custom Web Errors used by WebSites and Virtual Directories.</xs:documentation>
            <xs:appinfo>
                <xse:remarks>
                    You can only use error code and sub code combinations which are supported by IIS.  Attempting to set a custom error for
                    an error code and sub code combination that is not supported by IIS (in the default list of error codes) will result in
                    an installation failure.
                </xse:remarks>
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="ErrorCode" use="required" type="xs:integer">
                <xs:annotation><xs:documentation>HTTP 1.1 error code.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="SubCode" use="required" type="xs:integer">
                <xs:annotation><xs:documentation>Error sub code.  Set to 0 to get the wild card "*".</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="File" type="xs:string">
                <xs:annotation><xs:documentation>File to be sent to the client for this error code and sub code.  This can be formatted.  For example: [#FileId].</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="URL" type="xs:string">
                <xs:annotation><xs:documentation>URL to be sent to the client for this error code and sub code.  This can be formatted.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    
    <xs:element name="MimeMap">
        <xs:annotation><xs:documentation>MimeMap definition for IIS resources.</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" use="required" type="xs:string">
                <xs:annotation><xs:documentation>Id for the MimeMap.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Type" use="required" type="xs:string">
                <xs:annotation><xs:documentation>Mime-type covered by the MimeMap.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Extension" use="required" type="xs:string">
                <xs:annotation><xs:documentation>Extension covered by the MimeMap.  Must begin with a dot.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="WebFilter">
        <xs:annotation><xs:documentation>IIs Filter for a Component</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" use="required" type="xs:string">
                <xs:annotation><xs:documentation>The unique Id for the web filter.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Name" use="required" type="xs:string">
                <xs:annotation><xs:documentation>The name of the filter to be used in IIS.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Path" use="required" type="xs:string">
                <xs:annotation><xs:documentation>Usually a Property that resolves to short file name path</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="WebSite" type="xs:string">
                <xs:annotation><xs:documentation>Required if not found as child of WebSite element</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Description" type="xs:string">
                <xs:annotation><xs:documentation>Description of the filter.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Flags" type="xs:integer">
                <xs:annotation><xs:documentation>Sets the MD_FILTER_FLAGS metabase key for the filter. This must be an integer. See MSDN 'FilterFlags' documentation for more details.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="LoadOrder" type="xs:string">
                <xs:annotation><xs:documentation>Allowed values: "first", "last", number</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="WebApplicationExtension">
        <xs:annotation><xs:documentation>Extension for WebApplication</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:attribute name="Executable" use="required" type="xs:string">
            <xs:annotation><xs:documentation>usually a Property that resolves to short file name path</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Extension" type="xs:string">
                <xs:annotation><xs:documentation>Extension being registered. Do not prefix with a '.' (e.g. you should use "html", not ".html").  To register for all extensions, use Extension="*".  To register a wildcard application map (which handles all requests, even those for directories or files with no extension) omit the Extension attribute completely.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Verbs" type="xs:string">
            </xs:attribute>
            <xs:attribute name="Script" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="CheckPath" type="YesNoType">
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="WebAppPool">
        <xs:annotation><xs:documentation>IIS6 Application Pool</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="RecycleTime" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attribute name="Id" use="required" type="xs:string">
                <xs:annotation><xs:documentation>Id of the AppPool.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Name" use="required" type="xs:string">
                <xs:annotation><xs:documentation>Name of the AppPool to be shown in IIs.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="User" type="xs:string">
                <xs:annotation><xs:documentation>User account to run the AppPool as.  To use this, you must set the Identity attribute to 'other'.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="RecycleMinutes" type="xs:integer">
                <xs:annotation><xs:documentation>How often, in minutes, you want the AppPool to be recycled.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="RecycleRequests" type="xs:integer">
                <xs:annotation><xs:documentation>How often, in requests, you want the AppPool to be recycled.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="VirtualMemory" type="xs:integer">
                <xs:annotation><xs:documentation>Specifies the amount of virtual memory (in KB) that a worker process can use before the worker process recycles. The maximum value supported for this attribute is 4,294,967 KB.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="PrivateMemory" type="xs:integer">
                <xs:annotation><xs:documentation>Specifies the amount of private memory (in KB) that a worker process can use before the worker process recycles. The maximum value supported for this attribute is 4,294,967 KB.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="IdleTimeout" type="xs:integer">
                <xs:annotation><xs:documentation>Shutdown worker process after being idle for (time in minutes).</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="QueueLimit" type="xs:integer">
                <xs:annotation><xs:documentation>Limit the kernel request queue (number of requests).</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="MaxCpuUsage" type="PercentType">
                <xs:annotation><xs:documentation>Maximum CPU usage (percent).</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="RefreshCpu" type="xs:integer">
                <xs:annotation><xs:documentation>Refresh CPU usage numbers (in minutes).</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="CpuAction">
                <xs:annotation><xs:documentation>Action taken when CPU exceeds maximum CPU use (as defined with MaxCpuUsage and RefreshCpu).</xs:documentation></xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="none"/>
                        <xs:enumeration value="shutdown"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="MaxWorkerProcesses" type="xs:integer">
                <xs:annotation><xs:documentation>Maximum number of worker processes.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Identity">
                <xs:annotation><xs:documentation>Identity you want the AppPool to run under.  Use the 'other' value in conjunction with the User attribute to specify non-standard user.</xs:documentation></xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="networkService"/>
                        <xs:enumeration value="localService"/>
                        <xs:enumeration value="localSystem"/>
                        <xs:enumeration value="other"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="RecycleTime">
        <xs:annotation><xs:documentation>IIS6 Application Pool Recycle Times on 24 hour clock.</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:attribute name="Value" use="required">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:pattern value="\d{1,2}:\d{2}"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="PerfCounter">
        <xs:annotation><xs:documentation>Used to install Perfmon counters.</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:attribute name="Name" type="xs:string"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="Certificate">
        <xs:annotation>
            <xs:documentation>
                SSL Certificates.
            </xs:documentation>
            <xs:appinfo>
                <xse:seeAlso ref="CertificateRef"/>
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" use="required" type="xs:string"/>
            <xs:attribute name="StoreName" use="required">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="ca"/>
                        <xs:enumeration value="my"/>
                        <xs:enumeration value="request"/>
                        <xs:enumeration value="root"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="StoreLocation" use="required">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="currentUser"/>
                        <xs:enumeration value="localMachine"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="Overwrite" type="YesNoType"/>
            <xs:attribute name="Request" type="YesNoType"/>
            <xs:attribute name="BinaryKey" type="xs:string"/>
            <xs:attribute name="CertificatePath" type="xs:string"/>
            <xs:attribute name="PFXPassword" type="xs:string"/>
        </xs:complexType>
    </xs:element>
    
    <xs:element name="CertificateRef">
        <xs:annotation>
            <xs:documentation>
                Associates a certificate with the parent WebApplication.  The Certificate element must be
                in the same Component as the parent WebApplication.
            </xs:documentation>
            <xs:appinfo>
                <xse:seeAlso ref="Certificate"/>
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" use="required" type="xs:string">
                <xs:annotation>
                    <xs:documentation>
                        The identifier of the referenced Certificate.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Permissions" use="required" type="xs:integer">
                <xs:annotation>
                    <xs:documentation>
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="WebProperty">
        <xs:annotation>
            <xs:documentation>IIS Properties</xs:documentation>
            <xs:appinfo>
                <xse:remarks>
                    Here is an explanation of the acceptable values for each property and their meaning:
                    <html:ul>
                        <html:li>
                            For the Ids IIs5IsolationMode and LogInUTF8, no value should be specified since
                            the presence of this property indicates that the setting should be set.
                        </html:li>
                        <html:li>
                            For the MaxGlobalBandwidth Id, the value should be specified in kilobytes.  The
                            value should be a base 10 number.
                        </html:li>
                        <html:li>
                            ETagChangeNumber sets the machine-specific portion of ETag as a number. This value,
                            when synchronized across servers in a web farm, allows the web farm to return an
                            identical ETag for a given resource regardless of the server that handled the
                            request.  The value should be a base 10 number.
                        </html:li>
                    </html:ul>
                </xse:remarks>
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="ETagChangeNumber"/>
                        <xs:enumeration value="IIs5IsolationMode"/>
                        <xs:enumeration value="MaxGlobalBandwidth"/>
                        <xs:enumeration value="LogInUTF8"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="Value" type="xs:string">
                <xs:annotation>
                    <xs:documentation>
                    The value to be used for the WebProperty specified in the Id attribute.  See 
                    the remarks section for information on acceptable values for each Id.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="WebApplication">
        <xs:annotation><xs:documentation>Defines properties for a web application. These properties can be used for more than one application defined in a web site, directory, or vroot, by defining this element in a common location and referring to it by setting the WebApplication attribute of the WebSite, WebDir, and WebVirtualDir elements.</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="CertificateRef" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element ref="WebApplicationExtension" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attribute name="Id" use="required" type="xs:string"/>
            <xs:attribute name="Name" use="required" type="xs:string">
                <xs:annotation><xs:documentation>Sets the name of this application.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Isolation">
                <xs:annotation>
                    <xs:documentation>
                        Sets the application isolation level for this application for pre-IIS 6 applications.
                    </xs:documentation>
                </xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="low">
                            <xs:annotation>
                                <xs:documentation>
                                    Means the application executes within the IIS process.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="medium">
                            <xs:annotation>
                                <xs:documentation>
                                    Executes pooled in a separate process.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="high">
                            <xs:annotation>
                                <xs:documentation>
                                    Means execution alone in a separate process.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="AllowSessions" type="YesNoDefaultType">
                <xs:annotation><xs:documentation>Sets the Enable Session State option. When enabled, you can set the session timeout using the SessionTimeout attribute.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="SessionTimeout" type="xs:integer">
                <xs:annotation><xs:documentation>Sets the timeout value for sessions in minutes.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Buffer" type="YesNoDefaultType">
                <xs:annotation><xs:documentation>Sets the option that enables response buffering in the application, which allows ASP script to set response headers anywhere in the script.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="ParentPaths" type="YesNoDefaultType">
                <xs:annotation><xs:documentation>Sets the parent paths option, which allows a client to use relative paths to reach parent directories from this application.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="DefaultScript">
                <xs:annotation><xs:documentation>Sets the default script language for the site.</xs:documentation></xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="VBScript"/>
                        <xs:enumeration value="JScript"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="ScriptTimeout" type="xs:integer">
                <xs:annotation><xs:documentation>Sets the timeout value for executing ASP scripts.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="ServerDebugging" type="YesNoDefaultType">
                <xs:annotation><xs:documentation>Enable ASP server-side script debugging.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="ClientDebugging" type="YesNoDefaultType">
                <xs:annotation><xs:documentation>Enable ASP client-side script debugging.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="WebAppPool" type="xs:string">
                <xs:annotation><xs:documentation>References the Id attribute of a WebAppPool element to use as the application pool for this application in IIS 6 applications.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="WebAddress">
        <xs:annotation><xs:documentation>WebAddress for WebSite</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" use="required" type="xs:string"/>
            <xs:attribute name="IP" type="xs:string">
                <xs:annotation><xs:documentation>For IP address "All Unassigned", do not specify this attribute or specify its value as "*".</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Port" use="required" type="xs:string"/>
            <xs:attribute name="Header" type="xs:string"/>
            <xs:attribute name="Secure" type="YesNoType"/>
            <xs:attribute name="KeyPath" type="YesNoType"/>
        </xs:complexType>
    </xs:element>

    <xs:element name="WebVirtualDir">
        <xs:annotation><xs:documentation>Defines an IIS virtual directory. When this element is a child of WebSite element, the virtual directory is defined within that web site. Otherwise this virtual directory must reference a WebSite element via the WebSite attribute</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="WebApplication" minOccurs="0"/>
                <xs:element ref="WebError" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element ref="WebVirtualDir" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element ref="MimeMap" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attribute name="Id" use="required" type="xs:string"/>
            <xs:attribute name="WebSite" type="xs:string">
                <xs:annotation><xs:documentation>References the Id attribute for a WebSite in which this virtual directory belongs. Required when this element is not a child of WebSite element.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Alias" use="required" type="xs:string">
                <xs:annotation><xs:documentation>Sets the application name, which is the URL relative path used to access this virtual directory</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Directory" use="required" type="xs:string">
                <xs:annotation><xs:documentation>References the Id attribute for a Directory element that points to the content for this virtual directory.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="DirProperties" type="xs:string">
                <xs:annotation><xs:documentation>References the Id attribute for a WebDirProperties element that specifies the security and access properties for this virtual directory.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="WebApplication" type="xs:string">
                <xs:annotation><xs:documentation>References the Id attribute for a WebApplication element that specifies web application settings for this virtual directory.  If a WebApplication child is not specified, the virtual directory does not host web applications.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="WebDir">
        <xs:annotation><xs:documentation>Defines a subdirectory within an IIS web site. When this element is a child of WebSite, the web directory is defined within that web site. Otherwise the web directory must reference a WebSite element via the WebSite attribute.</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" use="required" type="xs:string"/>
            <xs:attribute name="WebSite" type="xs:string">
                <xs:annotation><xs:documentation>References the Id attribute for a WebSite element in which this directory belongs. Required when this element is not a child of a WebSite element.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Path" type="xs:string" use="required">
                <xs:annotation><xs:documentation>Specifies the name of this web directory.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="DirProperties" type="xs:string" use="required">
                <xs:annotation><xs:documentation>References the Id attribute for a WebDirProperties element that specifies the security and access properties for this web directory.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="WebSite">
        <xs:annotation>
            <xs:documentation>IIs Web Site</xs:documentation>
            <xs:appinfo>
                <xse:remarks>
                    <html:dl>
                        <html:dd>Nesting WebSite under a Component element will result in a WebSite being installed to the machine as the package is installed.</html:dd>
                        <html:dd>Nesting WebSite under Product, Fragment, or Module 
                        results in a web site "locator" record being created in 
                        the IIsWebSite table.  This means that the web site 
                        itself is neither installed nor uninstalled by the MSI 
                        package.  It does make the database available for referencing 
                        from a WebApplication, WebVirtualDir or WebDir record.  This allows an MSI to install 
                        WebApplications, WebVirtualDirs or WebDirs to already existing web sites on the machine.  
                        The install will fail if the web site does not exist in these cases.</html:dd>
                    </html:dl>
                </xse:remarks>
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="WebAddress" maxOccurs="unbounded"/>
                <xs:element ref="WebApplication" minOccurs="0"/>
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                    <xs:element ref="WebDir"/>
                    <xs:element ref="WebError"/>
                    <xs:element ref="WebFilter"/>
                    <xs:element ref="WebVirtualDir"/>
                </xs:choice>
            </xs:sequence>

            <xs:attribute name="Id" use="required" type="xs:string">
                <xs:annotation><xs:documentation>Identifier for the WebSite.  Used within the MSI package only.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="AutoStart" type="YesNoType">
                <xs:annotation><xs:documentation>Specifies whether to automatically start the web site.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="ConfigureIfExists" type="YesNoType">
                <xs:annotation><xs:documentation>Specifies whether to configure the web site if it already exists.  Note: This will not affect uninstall behavior.  If the web site exists on uninstall, it will be removed.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="ConnectionTimeout" type="xs:nonNegativeInteger">
                <xs:annotation><xs:documentation>Sets the timeout value for connections in seconds.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Description" use="required" type="xs:string">
                <xs:annotation><xs:documentation>This is the name of the web site that will show up in the IIS management console.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Directory" type="xs:string">
                <xs:annotation><xs:documentation>Root directory of the web site.  Resolved to a directory in the Directory table at install time by the server custom actions.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="DirProperties" type="xs:string">
                <xs:annotation><xs:documentation>Reference to WebDirProperties element.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Sequence" type="xs:integer">
                <xs:annotation><xs:documentation>Sequence that the web site is to be created in.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="StartOnInstall" type="YesNoType">
                <xs:annotation><xs:documentation>Specifies whether to start the web site on install.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="WebApplication" type="xs:string">
                <xs:annotation><xs:documentation>Reference to a WebApplication that is to be installed as part of this web site.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="WebLog" type="xs:string">
                <xs:annotation><xs:documentation>Reference to WebLog definition.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="WebLog">
        <xs:annotation><xs:documentation>WebLog definition.</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" use="required" type="xs:string">
                <xs:annotation><xs:documentation>Identifier for the WebLog.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Type" use="required">
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="IIS">
                            <xs:annotation>
                                <xs:documentation>
                                    Microsoft IIS Log File Format
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="NCSA">
                            <xs:annotation>
                                <xs:documentation>
                                    NCSA Common Log File Format
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="none">
                            <xs:annotation>
                                <xs:documentation>
                                    Disables logging.
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="ODBC">
                            <xs:annotation>
                                <xs:documentation>
                                    ODBC Logging
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="W3C">
                            <xs:annotation>
                                <xs:documentation>
                                    W3C Extended Log File Format
                                </xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="WebServiceExtension">
        <xs:annotation><xs:documentation>The WebServiceExtension property is used by the Web server to determine whether a Web service extension is permitted to run.</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" use="required" type="xs:string"/>
            <xs:attribute name="File" use="required" type="xs:string">
                <xs:annotation><xs:documentation>Usually a Property that resolves to short file name path</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Description" type="xs:string">
                <xs:annotation><xs:documentation>Description of the extension.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Group" type="xs:string">
                <xs:annotation><xs:documentation>String used to identify groups of extensions.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Allow" use="required" type="YesNoType">
                <xs:annotation><xs:documentation>Indicates if the extension is allowed or denied.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="UIDeletable" type="YesNoType">
                <xs:annotation><xs:documentation>Indicates if the UI is allowed to delete the extension from the list of not.  Default: Not deletable.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="SqlString">
        <xs:annotation><xs:documentation>SQL String</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" use="required" type="xs:string">
            </xs:attribute>
            <xs:attribute name="SQL" use="required" type="xs:string">
            </xs:attribute>
            <xs:attribute name="User" type="xs:string">
            </xs:attribute>
            <xs:attribute name="SqlDb" type="xs:string">
            </xs:attribute>
            <xs:attribute name="ExecuteOnInstall" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>Specifies to execute the string when the associated component is installed.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="ExecuteOnReInstall" type="YesNoType">
                <xs:annotation>
                    <xs:appinfo>
                        <xse:deprecated ref="ExecuteOnReinstall" />
                    </xs:appinfo>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="ExecuteOnReinstall" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>
                        Specifies whether to execute the string when the associated component is reinstalled.  Setting ExecuteOnInstall to yes does <html:b>not</html:b> imply ExecuteOnReinstall is set to yes.  ExecuteOnReinstall must be set in addition to ExecuteOnInstall for it to be executed during both install and reinstall.
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="ExecuteOnUninstall" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>Specifies to execute the string when the associated component is uninstalled.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="RollbackOnInstall" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>Specifies whether to execute the string on rollback if an attempt is made to install the associated component.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="RollbackOnReinstall" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>Specifies whether to execute the string on rollback if an attempt is made to reinstall the associated component.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="RollbackOnUninstall" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>Specifies whether to execute the string on rollback if an attempt is made to uninstall the associated component.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="ContinueOnError" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>Continue executing strings even if this one fails.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Sequence" type="xs:integer">
                <xs:annotation>
                    <xs:documentation>Specifes the order to run the SQL Strings.  It is recommended that rollback strings be scheduled before their complementary execution string.  This order is also relative across the SqlScript element.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="SqlScript">
        <xs:annotation><xs:documentation>SQL Script</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="Binary" minOccurs="0"/>
            </xs:sequence>
            <xs:attribute name="Id" use="required" type="xs:string"/>
            <xs:attribute name="SqlDb" type="xs:string">
                <xs:annotation>
                    <xs:documentation>Required when not child of SqlDatabase.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="User" type="xs:string">
            </xs:attribute>
            <xs:attribute name="BinaryKey" type="xs:string">
                <xs:annotation>
                    <xs:documentation>Reference to Binary stream that contains the SQL script to execute.  Only valid if no Binary child element.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="ExecuteOnInstall" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>Specifies to execute the script when the associated component is installed.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="ExecuteOnReInstall" type="YesNoType">
                <xs:annotation>
                    <xs:appinfo>
                        <xse:deprecated ref="ExecuteOnReinstall" />
                    </xs:appinfo>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="ExecuteOnReinstall" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>Specifies whether to execute the script when the associated component is reinstalled.  Setting ExecuteOnInstall to yes does <html:b>not</html:b> imply ExecuteOnReinstall is set to yes.  ExecuteOnReinstall must be set in addition to ExecuteOnInstall for it to be executed during both install and reinstall.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="ExecuteOnUninstall" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>Specifies to execute the script when the associated component is uninstalled.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="RollbackOnInstall" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>Specifies whether to execute the script on rollback if an attempt is made to install the associated component.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="RollbackOnReinstall" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>Specifies whether to execute the script on rollback if an attempt is made to reinstall the associated component.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="RollbackOnUninstall" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>Specifies whether to execute the script on rollback if an attempt is made to uninstall the associated component.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="ContinueOnError" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>Continue executing scripts even if this one fails.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
            <xs:attribute name="Sequence" type="xs:integer">
                <xs:annotation>
                    <xs:documentation>Specifes the order to run the SQL Scripts.  It is recommended that rollback scripts be scheduled before their complementary execution script.  This order is also relative across the SqlString element.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="SqlDatabase">
        <xs:annotation>
        <xs:documentation>SQL Database</xs:documentation>
            <xs:appinfo>
                <xse:remarks>
                    <html:dl>
                        <html:dd>Nesting SqlDatabase under a Component element will result in a SqlDatabase being installed to the machine as the package is installed.</html:dd>
                        <html:dd>Nesting SqlDatabase under Product, Fragment, or Module 
                        results in a database "locator" record being created in 
                        the SqlDatabase table.  This means that the database 
                        itself is neither installed nor uninstalled by the MSI 
                        package.  It does make the database available for referencing 
                        from a SqlString or SqlScript record.  This allows MSI to install 
                        SqlScripts or SqlStrings to already existing databases on the machine.  
                        The install will fail if the database does not exist in these cases.</html:dd>
                        <html:dd>The User attribute references cridentials specified in a User element.
                        If a user is not specified then Windows Authentication will be used by default
                        using the cridentials of the user performing the install to execute sql
                        strings, etc.</html:dd>
                    </html:dl>
                </xse:remarks>
                <xse:seeAlso ref="User"/>
            </xs:appinfo>
        </xs:annotation>
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element ref="SqlScript"/>
                <xs:element ref="SqlString"/>
                <xs:element ref="SqlFileSpec"/>
                <xs:element ref="SqlLogFileSpec"/>
            </xs:choice>
            <xs:attribute name="Id" use="required" type="xs:string"/>
            <xs:attribute name="Server" use="required" type="xs:string">
            </xs:attribute>
            <xs:attribute name="Instance" type="xs:string">
            </xs:attribute>
            <xs:attribute name="Database" use="required" type="xs:string">
                <xs:annotation><xs:documentation>The name of the database.  If the name does not follow the SQL server "Rules for Regular Identifiers" (see <html:a href="http://msdn.microsoft.com/library/en-us/acdata/ac_8_con_03_6e9e.asp">MSDN</html:a>) it must be surrounded by quotes or square brackets.  Since this value can be formatted text, this means that if you choose to use square brackets you must use the MSI method for escaping square brackets, for example: [\[]blah[\]].</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="User" type="xs:string">
            </xs:attribute>
            <xs:attribute name="CreateOnInstall" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="CreateOnReinstall" type="YesNoType">
                <xs:annotation><xs:documentation>Specifies whether to create the database when the associated component is reinstalled.  Setting CreateOnInstall to yes does <html:b>not</html:b> imply CreateOnReinstall is set to yes.  CreateOnReinstall must be set in addition to CreateOnInstall for it to be created during both install and reinstall.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="CreateOnUninstall" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="DropOnInstall" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="DropOnReinstall" type="YesNoType">
                <xs:annotation><xs:documentation>Specifies whether to drop the database when the associated component is reinstalled.  Setting DropOnInstall to yes does <html:b>not</html:b> imply DropOnReinstall is set to yes.  DropOnReinstall must be set in addition to DropOnInstall for it to be dropped during both install and reinstall.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="DropOnUninstall" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="ContinueOnError" type="YesNoType">
            </xs:attribute>
            <xs:attribute name="ConfirmOverwrite" type="YesNoType">
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="SqlFileSpec">
        <xs:annotation><xs:documentation>File specification for a Sql database.</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" use="required" type="xs:string">
                <xs:annotation><xs:documentation>ID of the file specification.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Name" type="xs:string">
                <xs:annotation><xs:documentation>Specifies the logical name for the database file.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Filename" use="required" type="xs:string">
                <xs:annotation><xs:documentation>Specifies the operating-system file name for the database file.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Size" type="xs:string">
                <xs:annotation><xs:documentation>Specifies the size of the database file. When a Size is not supplied for a database file, SQL Server 
                    uses the size of the primary file in the model database.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="MaxSize" type="xs:string">
                <xs:annotation><xs:documentation>Specifies the maximum size to which the database file can grow.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="GrowthSize" type="xs:string">
                <xs:annotation><xs:documentation>Specifies the growth increment of the database file. The GrowthSize setting for a file cannot exceed the MaxSize setting.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="SqlLogFileSpec">
        <xs:annotation><xs:documentation>File specification for a Sql database.</xs:documentation></xs:annotation>
        <xs:complexType>
            <xs:attribute name="Id" type="xs:string">
                <xs:annotation><xs:documentation>ID of the log file specification.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Name" type="xs:string">
                <xs:annotation><xs:documentation>Specifies the logical name for the log file.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Filename" type="xs:string">
                <xs:annotation><xs:documentation>Specifies the operating-system file name for the log file.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="Size" type="xs:string">
                <xs:annotation><xs:documentation>Specifies the size of the log file. When a Size parameter is not specified for a log file, SQL Server 
                    makes the file 1 MB.
                </xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="MaxSize" type="xs:string">
                <xs:annotation><xs:documentation>Specifies the maximum size to which the log file can grow.</xs:documentation></xs:annotation>
            </xs:attribute>
            <xs:attribute name="GrowthSize" type="xs:string">
                <xs:annotation><xs:documentation>Specifies the growth increment of the log file. The GrowthSize setting for a file cannot exceed the MaxSize setting.</xs:documentation></xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <!-- end WiX server elements -->

    <!-- - - - - - - - - - - Complex Type Definitions  - - - - - - - - - - - -->

    <xs:complexType name="ActionModuleSequenceType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:annotation><xs:documentation>Text node specifies the condition of the action.</xs:documentation></xs:annotation>
                <xs:attribute name="Before" type="xs:string">
                    <xs:annotation><xs:documentation>The name of an action that this action should come before.</xs:documentation></xs:annotation>
                </xs:attribute>
                <xs:attribute name="After" type="xs:string">
                    <xs:annotation><xs:documentation>The name of an action that this action should come after.</xs:documentation></xs:annotation>
                </xs:attribute>
                <xs:attribute name="Sequence" type="xs:integer">
                    <xs:annotation><xs:documentation>A value used to indicate the position of this action in a sequence.</xs:documentation></xs:annotation>
                </xs:attribute>
                <xs:attribute name="Suppress" type="YesNoType">
                    <xs:annotation><xs:documentation>If yes, this action will not occur.</xs:documentation></xs:annotation>
                </xs:attribute>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:complexType name="ActionSequenceType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="Sequence" type="xs:integer">
                    <xs:annotation><xs:documentation>A value used to indicate the position of this action in a sequence.</xs:documentation></xs:annotation>
                </xs:attribute>
                <xs:attribute name="Suppress" type="YesNoType">
                    <xs:annotation><xs:documentation>If yes, this action will not occur.</xs:documentation></xs:annotation>
                </xs:attribute>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <!-- - - - - - - - - - - Simple Type Definitions - - - - - - - - - - - - -->

    <xs:simpleType name="uuid">
        <xs:annotation><xs:documentation>Values of this type will look like: "01234567-89AB-CDEF-0123-456789ABCDEF" or "{01234567-89AB-CDEF-0123-456789ABCDEF}".</xs:documentation></xs:annotation>
        <xs:restriction base="xs:string">
            <xs:pattern value="[{(]?[0-9A-Fa-f]{8}\-?[0-9A-Fa-f]{4}\-?[0-9A-Fa-f]{4}\-?[0-9A-Fa-f]{4}\-?[0-9A-Fa-f]{12}[})]?"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="autogenuuid">
        <xs:annotation><xs:documentation>Values of this type will look like: "01234567-89AB-CDEF-0123-456789ABCDEF" or "{01234567-89AB-CDEF-0123-456789ABCDEF}". A GUID can be auto-generated by writing all question marks like this: "????????-????-????-????-????????????". Also allows "PUT-GUID-HERE" for use in examples.</xs:documentation></xs:annotation>
        <xs:restriction base="xs:string">
            <xs:pattern value="[{(]?[0-9A-Fa-f]{8}\-?[0-9A-Fa-f]{4}\-?[0-9A-Fa-f]{4}\-?[0-9A-Fa-f]{4}\-?[0-9A-Fa-f]{12}[})]?|[{(]?\?{8}\-\?{4}\-\?{4}\-\?{4}\-\?{12}[})]?|PUT\-GUID\-HERE"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="ComponentGuid">
        <xs:annotation><xs:documentation>Values of this type will look like: "01234567-89AB-CDEF-0123-456789ABCDEF" or "{01234567-89AB-CDEF-0123-456789ABCDEF}", but also allows "PUT-GUID-HERE" for use in examples.  It's also possible to have an empty value "".</xs:documentation></xs:annotation>
        <xs:restriction base="xs:string">
            <xs:pattern value="[{(]?[0-9A-Fa-f]{8}\-?[0-9A-Fa-f]{4}\-?[0-9A-Fa-f]{4}\-?[0-9A-Fa-f]{4}\-?[0-9A-Fa-f]{12}[})]?|PUT\-GUID\-HERE|"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="LocalizableInteger">
        <xs:annotation><xs:documentation>Values of this type must be an integer or the value can be a localization variable with the format $(loc.VARIABLE).</xs:documentation></xs:annotation>
        <xs:restriction base="xs:string">
            <xs:pattern value="[0-9][0-9]*|\$\(loc\.[_A-Za-z][0-9A-Za-z_]*\)"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="ShortFileNameType">
        <xs:annotation><xs:documentation>Values of this type will look like: "FileName.ext".  The following characters are not allowed: \ ? | > : / * " + , ; = [ ] less-than, or whitespace.  The name cannot be longer than 8 characters and the extension cannot exceed 3 characters.  The value could also be a localization variable with the format $(loc.VARIABLE).</xs:documentation></xs:annotation>
        <xs:restriction base="xs:string">
            <xs:pattern value="[^\\\?|&gt;&lt;:/\*&quot;\+,;=\[\] ]{1,8}(\.[^\\\?|&gt;&lt;:/\*&quot;\+,;=\[\] ]{0,3})?|\$\(loc\.[_A-Za-z][0-9A-Za-z_.]*\)"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="LongFileNameType">
        <xs:annotation><xs:documentation>Values of this type will look like: "Long File Name.extension".  The following characters are not allowed: \ ? | > : / * " or less-than.  The name must be shorter than 260 characters.  The value could also be a localization variable with the format $(loc.VARIABLE).</xs:documentation></xs:annotation>
        <xs:restriction base="xs:string">
            <xs:pattern value="[^\\\?|&gt;&lt;:/\*&quot;]{1,259}|\$\(loc\.[_A-Za-z][0-9A-Za-z_.]*\)"/>
        </xs:restriction>
    </xs:simpleType>
    
    <xs:simpleType name="VersionType">
        <xs:annotation><xs:documentation>Values of this type will look like: "x.x.x.x" where x is an integer from 0 to 65534.</xs:documentation></xs:annotation>
        <xs:restriction base="xs:string">
            <xs:pattern value="(\d{1,5}\.){3}\d{1,5}"/>
        </xs:restriction>
    </xs:simpleType>
    
    <xs:simpleType name="WildCardShortFileNameType">
        <xs:annotation><xs:documentation>Values of this type will look like: "File?.*".  The following characters are not allowed: \ | > : / " + , ; = [ ] less-than, or whitespace.  The name cannot be longer than 8 characters and the extension cannot exceed 3 characters.  The value could also be a localization variable with the format $(loc.VARIABLE).</xs:documentation></xs:annotation>
        <xs:restriction base="xs:string">
            <xs:pattern value="[^\\\|&gt;&lt;:/&quot;\+,;=\[\] ]{1,8}(\.[^\\\|&gt;&lt;:/&quot;\+,;=\[\] ]{0,3})?|\$\(loc\.[_A-Za-z][0-9A-Za-z_.]*\)"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="WildCardLongFileNameType">
        <xs:annotation><xs:documentation>Values of this type will look like: "Long File N?me.extension*".  The following characters are not allowed: \ | > : / " or less-than.  The name must be shorter than 260 characters.  The value could also be a localization variable with the format $(loc.VARIABLE).</xs:documentation></xs:annotation>
        <xs:restriction base="xs:string">
            <xs:pattern value="[^\\\|&gt;&lt;:/&quot;]{1,259}|\$\(loc\.[_A-Za-z][0-9A-Za-z_.]*\)"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="HexType">
        <xs:annotation><xs:documentation>This type supports any hexadecimal number.  Both upper and lower case is acceptable for letters appearing in the number.  This type also includes the empty string: "".</xs:documentation></xs:annotation>
        <xs:restriction base="xs:string">
            <xs:pattern value="[0-9A-Fa-f]*"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="YesNoType">
        <xs:annotation><xs:documentation>Values of this type will either be "yes" or "no".</xs:documentation></xs:annotation>
        <xs:restriction base='xs:NMTOKEN'>
            <xs:enumeration value="no"/>
            <xs:enumeration value="yes"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="YesNoDefaultType">
        <xs:annotation><xs:documentation>Values of this type will either be "default", "yes", or "no".</xs:documentation></xs:annotation>
        <xs:restriction base='xs:NMTOKEN'>
            <xs:enumeration value="default"/>
            <xs:enumeration value="no"/>
            <xs:enumeration value="yes"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="PercentType">
        <xs:annotation><xs:documentation>Values of this type are any integers between 0 and 100, inclusive.</xs:documentation></xs:annotation>
        <xs:restriction base="xs:nonNegativeInteger">
            <xs:maxInclusive value="100"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="ModularizeType">
        <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="None"/>
            <xs:enumeration value="Column"/>
            <xs:enumeration value="Property"/>
            <xs:enumeration value="Condition"/>
            <xs:enumeration value="CompanionFile"/>
            <xs:enumeration value="SemicolonDelimited"/>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>
