<?xml version="1.0"?>
<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://ns.adobe.com/air/application/51.1" 
    xmlns="http://ns.adobe.com/air/application/51.1" 
    elementFormDefault="qualified"
    xmlns:xml="http://www.w3.org/XML/1998/namespace"
>
  <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/>

  <xs:element name="application">
    <xs:complexType>
      <xs:all>
        <!-- About this application -->
        <xs:element name="id" type="IDType" />
        <xs:element name="publisherID" minOccurs="0">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:pattern value="[A-Fa-f0-9]{40}\.1" />
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        <xs:element name="name" type="LocalizableType" minOccurs="0" />
        <xs:element name="versionLabel" type="xs:string" minOccurs="0" />
        <xs:element name="versionNumber" type="VersionCode" />
        <xs:element name="filename">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <!-- name cannot begin with a ' ' (space), have any of these characters: *"/:<>?\|, and end with a . (dot) or ' ' (space) -->
              <xs:pattern value='[^\*"/:&gt;&lt;\?\\\|\. ]|[^\*"/:&gt;&lt;\?\\\| ][^\*"/:&gt;&lt;\?\\\|]*[^\*"/:&gt;&lt;\?\\\|\. ]'/>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        <xs:element name="description" type="LocalizableType" minOccurs="0" />
        <xs:element name="copyright" type="xs:string" minOccurs="0" />
        <xs:element name="icon" type="IconType" minOccurs="0" />
        <xs:element name="allowMultipleInstances" type="xs:boolean" minOccurs="0" />
        <xs:element name="stacktraces" minOccurs="0">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:enumeration value="none" />
              <xs:enumeration value="standard" />
              <xs:enumeration value="verbose" />
            </xs:restriction>
          </xs:simpleType>
        </xs:element>

        <!-- How to start this application -->
        <xs:element name="initialWindow">
          <xs:complexType>
            <xs:all>
              <xs:element name="content" type="xs:anyURI" minOccurs="1" />
              <xs:element name="title" type="xs:string" minOccurs="0" />

              <xs:element name="systemChrome" minOccurs="0">
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:enumeration value="none" />
                    <xs:enumeration value="standard" />
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
              <xs:element name="transparent" type="xs:boolean" minOccurs="0" />
              <xs:element name="visible" type="xs:boolean" minOccurs="0" />

              <xs:element name="minimizable" type="xs:boolean" minOccurs="0" />
              <xs:element name="maximizable" type="xs:boolean" minOccurs="0" />
              <xs:element name="resizable" type="xs:boolean" minOccurs="0" />
              <xs:element name="allowLowQuality" type="xs:boolean" minOccurs="0" />

              <xs:element name="x" type="xs:int" minOccurs="0" />
              <xs:element name="y" type="xs:int" minOccurs="0" />
              <xs:element name="width" type="xs:unsignedInt" minOccurs="0" />
              <xs:element name="height" type="xs:unsignedInt" minOccurs="0" />
              <xs:element name="minSize" type="BoundsSizeType" minOccurs="0" />
              <xs:element name="maxSize" type="BoundsSizeType" minOccurs="0" />

              <!-- default is 'pan'-->
              <xs:element name="softKeyboardBehavior" minOccurs="0"  >
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:enumeration value="pan" />
                    <xs:enumeration value="none"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>

              <!-- Mobile only -->
              <xs:element name="aspectRatio" minOccurs="0"  >
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:enumeration value="portrait" />
                    <xs:enumeration value="landscape"/>
                    <xs:enumeration value="any"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>

              <!-- Mobile only; default is false -->
              <xs:element name="autoOrients" type="xs:boolean" minOccurs="0" />

              <!-- Mobile only; default is standard -->
              <xs:element name="orientationAnimation" minOccurs="0"  >
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:enumeration value="standard" />
                    <xs:enumeration value="none"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>

              <!-- Mobile only; default is false -->
              <xs:element name="fullScreen"  type="xs:boolean" minOccurs="0" />

              <!-- Default is auto -->
              <xs:element name="renderMode" minOccurs="0"  >
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:enumeration value="auto" />
                    <xs:enumeration value="cpu"/>
                    <xs:enumeration value="gpu"/>
                    <xs:enumeration value="direct"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
              
              <!-- Default is false -->
              <xs:element name="depthAndStencil" type="xs:boolean" minOccurs="0" />

              <!-- OSX only -->
              <xs:element name="requestedDisplayResolution" minOccurs="0"  >
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:enumeration value="standard" />
                    <xs:enumeration value="high"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>

            </xs:all>
          </xs:complexType>
        </xs:element>

        <!-- About installing this application -->
        <xs:element name="supportedProfiles" minOccurs="0" maxOccurs="1">
          <xs:simpleType>
            <xs:restriction base="profileList">
              <xs:minLength value="1"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>

        <xs:element name="supportedLanguages" minOccurs="0" maxOccurs="1">
          <xs:simpleType>
            <xs:restriction base="languageList">
              <xs:minLength value="1"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>

        <xs:element name="installFolder" minOccurs="0" >
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <!-- installFolder cannot begin with a / (forward-slash) or a ' ' (space), have any of these characters: *":<>?\|, and end with a . (dot), ' ' (space), or / (forward slash) -->
              <xs:pattern value='[^\*"/:&gt;&lt;\?\\\|\. ]|[^\*"/:&gt;&lt;\?\\\| ][^\*":&gt;&lt;\?\\\|]*[^\*":&gt;&lt;\?\\\|\. /]'/>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        <xs:element name="programMenuFolder" minOccurs="0" >
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <!-- programMenuFolder cannot begin with a / (forward-slash) or a ' ' (space), have any of these characters: *":<>?\|, and end with a . (dot), ' ' (space), or / (forward slash) -->
              <xs:pattern value='[^\*"/:&gt;&lt;\?\\\|\. ]|[^\*"/:&gt;&lt;\?\\\| ][^\*":&gt;&lt;\?\\\|]*[^\*":&gt;&lt;\?\\\|\. /]'/>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>

        <!-- Features this application can opt in to -->
        <xs:element name="customUpdateUI" type="xs:boolean" minOccurs="0" />
        <xs:element name="allowBrowserInvocation" type="xs:boolean" minOccurs="0" />
        <xs:element name="fileTypes" minOccurs="0">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="fileType" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:all>
                    <xs:element name="name">
                      <xs:simpleType>
                        <xs:restriction base="xs:string">
                          <xs:pattern value='[A-Za-z]'/>
                          <xs:pattern value='[A-Za-z][A-Za-z0-9\.]{0,36}[A-Za-z]'/>
                        </xs:restriction>
                      </xs:simpleType>
                    </xs:element>
                    <xs:element name="extension">
                      <xs:simpleType>
                        <xs:restriction base="xs:string">
                          <xs:pattern value='[A-Za-z0-9]{1,38}'/>
                        </xs:restriction>
                      </xs:simpleType>
                    </xs:element>
                    <xs:element name="description" type="xs:string" minOccurs="0" />
                    <xs:element name="contentType">
                      <xs:simpleType>
                        <xs:restriction base="xs:string">
                          <!-- See RFC2045 for a more detailed grammar for valid content types -->
                          <xs:pattern value='.+'/>
                        </xs:restriction>
                      </xs:simpleType>
                    </xs:element>
                    <xs:element name="icon" type="IconType" minOccurs="0" />
                  </xs:all>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <!-- Flash Runtime Extension Support -->
        <xs:element name="extensions" minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="extensionID" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="IDType">
                      <xs:attribute name="delayLoad" type="xs:boolean"/>
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <!-- Encrypted Local Storage configuration -->
        <xs:element name="encryptedLocalStorage" minOccurs="0">
          <xs:complexType>
            <xs:all>
              <xs:element name="fallbackMode" minOccurs="0"  >
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:enumeration value="always" />
                    <xs:enumeration value="never"/>
                    <xs:enumeration value="once"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
              <xs:element name="storageMode" minOccurs="0"  >
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:enumeration value="os_store" />
                    <xs:enumeration value="file"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
            </xs:all>
          </xs:complexType>
        </xs:element>

        <!-- iPhone-specific capabilities -->
        <xs:element name="iPhone" minOccurs="0">
          <xs:complexType>
            <xs:all>
              <!-- A list of plist key/value pairs to be added to the application Info.plist -->
              <xs:element name="InfoAdditions" type="xs:string" minOccurs="0"/>
              <xs:element name="Entitlements" type="xs:string" minOccurs="0"/>

              <!-- Forcing CPU Render Mode for the mentioned devices -->
              <xs:element name="forceCPURenderModeForDevices" minOccurs="0" maxOccurs="1">
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:minLength value="1"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>

              <xs:element name="requestedDisplayResolution" minOccurs="0">
                <xs:complexType>
                  <xs:simpleContent>
                    <xs:extension base="xs:string">
                      <xs:attribute name="excludeDevices" type="xs:string"/>
                    </xs:extension>
                  </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              
              <!-- In standard packaging mode, this tag prevents external swfs to be packaged 
                   inside the application and outputs the stripped swfs to externalStrippedSwfs folder-->
              <xs:element name="externalSwfs" minOccurs="0" maxOccurs="1">
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:minLength value="1"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>

              <xs:element name="disableCustomKeyboard" type="xs:boolean" minOccurs="0" />
              <xs:element name="excludeDefaultUsageDescriptions" type="xs:boolean" minOccurs="0" />

            </xs:all>
          </xs:complexType>
        </xs:element>

        <!-- android-specific capabilities -->
        <xs:element name="android" minOccurs="0" maxOccurs="1">
          <xs:complexType>
            <xs:all>
              <xs:element name="manifestAdditions" type="xs:string" minOccurs="0" maxOccurs="1"/>
              <!-- Prior to AIR 3, 16-bit color is always used on Android.
              In AIR 3, 32-bit color is used by default.-->
               <xs:element name="colorDepth" minOccurs="0" maxOccurs="1">
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:enumeration value="16bit"/>
                    <xs:enumeration value="32bit"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>

              <xs:element name="displayCutoutMode" minOccurs="0"  >
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:enumeration value="default" />
                    <xs:enumeration value="always"/>
                    <xs:enumeration value="never"/>
                    <xs:enumeration value="shortEdges"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>

              <!-- default is false -->
              <xs:element name="containsVideo" type="xs:boolean" minOccurs="0"/>
              
              <!-- default is false -->
              <xs:element name="webContentsDebuggingEnabled" type="xs:boolean" minOccurs="0"/>

               <!-- default is false -->
              <xs:element name="disableMediaCodec" type="xs:boolean" minOccurs="0"/>

              <xs:element name="buildLegacyAPK" type="xs:boolean" minOccurs="0" />
              <xs:element name="newFontRenderingFromAPI" type="xs:unsignedInt" minOccurs="0" />
              <xs:element name="preventDeviceModelAccess" type="xs:boolean" minOccurs="0" />
              <xs:element name="webViewAllowFileAccess" type="xs:boolean" minOccurs="0" />
              <xs:element name="multidexVersion" type="VersionCode" minOccurs="0" />
              <xs:element name="androidGradlePluginVersion"  type="VersionCode" minOccurs="0" />
              <xs:element name="gradleVersion"  type="VersionCode" minOccurs="0" />
              <xs:element name="androidBuildToolsVersion"  type="VersionCode" minOccurs="0" />
              <xs:element name="androidCompileSdkVersion"  type="xs:unsignedInt" minOccurs="0" />
              <xs:element name="addAirToAppID" type="xs:boolean" minOccurs="0" />
              <xs:element name="createAppBundle" type="xs:boolean" minOccurs="0" />
              <xs:element name="buildArchitectures" type="xs:string" minOccurs="0" />
              <xs:element name="uncompressedExtensions" type="xs:string" minOccurs="0" />
              <xs:element name="disableSensorAccess" type="xs:boolean" minOccurs="0" />

              <!-- default is false -->
              <xs:element name="supportsAndroidTV" type="xs:boolean" minOccurs="0"/>
              <xs:element name="banner"        type="xs:anyURI" minOccurs="0" />
              <xs:element name="banner160x90"  type="xs:anyURI" minOccurs="0" />
              <xs:element name="banner240x135" type="xs:anyURI" minOccurs="0" />
              <xs:element name="banner320x180" type="xs:anyURI" minOccurs="0" />
              <xs:element name="banner480x270" type="xs:anyURI" minOccurs="0" />
              <xs:element name="banner640x360" type="xs:anyURI" minOccurs="0" />

              <!-- asset packs: list of assetPack entries each with 'id', 'delivery' and 'folder' attributes -->
              <xs:element name="assetPacks" minOccurs="0">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="assetPack" minOccurs="0" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:simpleContent>
                          <xs:extension base="xs:string">
                            <xs:attribute name="id" type="xs:string"/>
                            <xs:attribute name="delivery" type="xs:string"/>
                            <xs:attribute name="folder" type="xs:string"/>
                          </xs:extension>
                        </xs:simpleContent>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>

              <!-- manifestPlaceholders: list of manifestPlaceholder entries which are strings in name:'value' format -->
              <xs:element name="manifestPlaceholders" minOccurs="0">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="manifestPlaceholder" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>

            </xs:all>
          </xs:complexType>
        </xs:element>
        <xs:element name="resdir" type="xs:anyURI" minOccurs="0" />

        <!-- macOS-specific capabilities -->
        <xs:element name="macOS" minOccurs="0">
          <xs:complexType>
            <xs:all>
              <!-- A list of plist key/value pairs to be added to the application Info.plist -->
              <xs:element name="InfoAdditions" type="xs:string" minOccurs="0"/>
              <xs:element name="Entitlements" type="xs:string" minOccurs="0"/>
            </xs:all>
          </xs:complexType>
        </xs:element>

        <!-- Windows-specific capabilities -->
        <xs:element name="windows" minOccurs="0">
          <xs:complexType>
            <xs:all>
              <xs:element name="UseWebView2" minOccurs="0" maxOccurs="1">
                <xs:simpleType>
                  <xs:restriction base="webView2List">
                    <xs:minLength value="1"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
              <xs:element name="maxD3D" type="xs:unsignedInt" minOccurs="0" />
            </xs:all>
          </xs:complexType>
        </xs:element>

      </xs:all>

      <!-- About the runtime version required -->
      <xs:attribute name="minimumPatchLevel" type="xs:unsignedInt"/>
    </xs:complexType>
  </xs:element>

  <xs:simpleType name="profileList">
    <xs:list itemType="profileNameType"/>
  </xs:simpleType>

  <xs:simpleType name="profileNameType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="desktop"             />
      <xs:enumeration value="extendedDesktop"     />
      <xs:enumeration value="mobileDevice"        />
      <xs:enumeration value="extendedMobileDevice"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="languageList">
    <xs:list itemType="languageNameType"/>
  </xs:simpleType>

  <xs:simpleType name="languageNameType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="cs" />
      <xs:enumeration value="da" />
      <xs:enumeration value="de" />
      <xs:enumeration value="el" />
      <xs:enumeration value="en" />
      <xs:enumeration value="es" />
      <xs:enumeration value="fi" />
      <xs:enumeration value="fr" />
      <xs:enumeration value="in" />
      <xs:enumeration value="it" />
      <xs:enumeration value="iw" />
      <xs:enumeration value="ja" />
      <xs:enumeration value="ko" />
      <xs:enumeration value="ms" />
      <xs:enumeration value="nb" />
      <xs:enumeration value="nl" />
      <xs:enumeration value="pl" />
      <xs:enumeration value="pt" />
      <xs:enumeration value="ru" />
      <xs:enumeration value="sv" />
      <xs:enumeration value="th" />
      <xs:enumeration value="tr" />
      <xs:enumeration value="vi" />
      <xs:enumeration value="zh" />
    </xs:restriction>
  </xs:simpleType>

  <!-- Type definitions -->
  <xs:complexType name="IconType">
    <xs:all>
      <xs:element name="image16x16"       type="xs:anyURI" minOccurs="0" />
      <xs:element name="image29x29"       type="xs:anyURI" minOccurs="0" />
      <xs:element name="image32x32"       type="xs:anyURI" minOccurs="0" />
      <xs:element name="image36x36"       type="xs:anyURI" minOccurs="0" />
      <xs:element name="image40x40"       type="xs:anyURI" minOccurs="0" />
      <xs:element name="image44x44"       type="xs:anyURI" minOccurs="0" />
      <xs:element name="image48x48"       type="xs:anyURI" minOccurs="0" />
      <xs:element name="image50x50"       type="xs:anyURI" minOccurs="0" />
      <!-- 57x57 is never used by file icons -->
      <xs:element name="image57x57"       type="xs:anyURI" minOccurs="0" />
      <xs:element name="image58x58"       type="xs:anyURI" minOccurs="0" />
      <xs:element name="image60x60"       type="xs:anyURI" minOccurs="0" />
      <xs:element name="image66x66"       type="xs:anyURI" minOccurs="0" />
      <xs:element name="image72x72"       type="xs:anyURI" minOccurs="0" />
      <xs:element name="image75x75"       type="xs:anyURI" minOccurs="0" />
      <xs:element name="image76x76"       type="xs:anyURI" minOccurs="0" />
      <xs:element name="image80x80"       type="xs:anyURI" minOccurs="0" />
      <xs:element name="image87x87"       type="xs:anyURI" minOccurs="0" />
      <xs:element name="image96x96"       type="xs:anyURI" minOccurs="0" />
      <xs:element name="image100x100"     type="xs:anyURI" minOccurs="0" />
      <xs:element name="image114x114"     type="xs:anyURI" minOccurs="0" />
      <xs:element name="image120x120"     type="xs:anyURI" minOccurs="0" />
      <xs:element name="image128x128"     type="xs:anyURI" minOccurs="0" />
      <xs:element name="image144x144"     type="xs:anyURI" minOccurs="0" />
      <xs:element name="image152x152"     type="xs:anyURI" minOccurs="0" />
      <xs:element name="image160x160"     type="xs:anyURI" minOccurs="0" />
      <xs:element name="image167x167"     type="xs:anyURI" minOccurs="0" />
      <xs:element name="image180x180"     type="xs:anyURI" minOccurs="0" />
      <xs:element name="image192x192"     type="xs:anyURI" minOccurs="0" />
      <xs:element name="image240x240"     type="xs:anyURI" minOccurs="0" />
      <xs:element name="image256x256"     type="xs:anyURI" minOccurs="0" />
      <xs:element name="image320x320"     type="xs:anyURI" minOccurs="0" />
      <xs:element name="image512x512"     type="xs:anyURI" minOccurs="0" />
      <xs:element name="image732x412"     type="xs:anyURI" minOccurs="0" />
      <xs:element name="image1024x1024"   type="xs:anyURI" minOccurs="0" />
    </xs:all>
  </xs:complexType>
  <xs:simpleType name="UnsignedIntListType">
    <xs:list itemType="xs:unsignedInt" />
  </xs:simpleType>
  <xs:simpleType name="BoundsSizeType">
    <xs:restriction base="UnsignedIntListType">
      <xs:length value="2" />
    </xs:restriction>
  </xs:simpleType>
  <xs:complexType name="LocalizableType" mixed="true">
    <xs:sequence>
      <xs:element name="text" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:string">
              <xs:attribute ref="xml:lang" use="required"/>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  <xs:simpleType name="VersionCode">
    <xs:restriction base="xs:string">
      <xs:pattern value='[0-9]{1,3}(\.[0-9]{1,3}){0,2}'/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="IDType">
    <xs:restriction base="xs:string">
      <xs:pattern value="[A-Za-z0-9\-\.]{1,212}" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="webView2List">
    <xs:list itemType="webView2Options"/>
  </xs:simpleType>
  <xs:simpleType name="webView2Options">
    <xs:restriction base="xs:string">
      <xs:enumeration value="true"      />
      <xs:enumeration value="false"     />
      <xs:enumeration value="exclusive" />
    </xs:restriction>
  </xs:simpleType>

</xs:schema>
