Server Configuration File Schema

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="configuration" type="configuration"/>

  <xs:complexType name="configuration">
    <xs:sequence>
      <xs:element name="settings" type="settings" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="settings">
    <xs:sequence>
      <xs:element name="setting" type="setting" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="setting">
    <xs:all>
      <xs:element name="name" type="xs:string"/>
      <xs:choice>
        <xs:element name="encryptedPassword" type="encryptedPassword"/>
        <xs:element name="portRanges" type="portRanges"/>
        <xs:element name="rule" type="rule"/>
        <xs:element name="socketSettings" type="socketSettings"/>
        <xs:element name="socks5.gssapimethod.protectionLevels" type="socks5.gssapimethod.protectionLevels"/>
        <xs:element name="socks5.methods" type="socks5.methods"/>
        <xs:element name="socks5.userpassmethod.userRepository" type="socks5.userpassmethod.userRepository"/>
        <xs:element name="value" type="xs:string"/>
        <xs:element name="values" type="values"/>
      </xs:choice>
      <xs:element name="doc" type="xs:string" minOccurs="0"/>
    </xs:all>
  </xs:complexType>

  <xs:complexType name="encryptedPassword">
    <xs:complexContent>
      <xs:extension base="value">
        <xs:all>
          <xs:element name="typeName" type="xs:string"/>
          <xs:element name="encryptedPasswordValue" type="xs:string"/>
        </xs:all>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="value" abstract="true">
    <xs:sequence/>
  </xs:complexType>

  <xs:complexType name="portRanges">
    <xs:complexContent>
      <xs:extension base="value">
        <xs:sequence>
          <xs:element name="portRange" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="rule">
    <xs:complexContent>
      <xs:extension base="value">
        <xs:all>
          <xs:element name="ruleConditions" type="ruleConditions" minOccurs="0"/>
          <xs:element name="ruleResults" type="ruleResults" minOccurs="0"/>
        </xs:all>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="ruleConditions">
    <xs:sequence>
      <xs:element name="ruleCondition" type="ruleCondition" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="ruleCondition">
    <xs:all>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="value" type="xs:string"/>
    </xs:all>
  </xs:complexType>

  <xs:complexType name="ruleResults">
    <xs:sequence>
      <xs:element name="ruleResult" type="ruleResult" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="ruleResult">
    <xs:all>
      <xs:element name="name" type="xs:string"/>
      <xs:choice>
        <xs:element name="socketSetting" type="socketSetting"/>
        <xs:element name="value" type="xs:string"/>
      </xs:choice>
    </xs:all>
  </xs:complexType>

  <xs:complexType name="socketSetting">
    <xs:complexContent>
      <xs:extension base="value">
        <xs:all>
          <xs:element name="name" type="xs:string"/>
          <xs:element name="value" type="xs:string"/>
          <xs:element name="doc" type="xs:string" minOccurs="0"/>
        </xs:all>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="socketSettings">
    <xs:complexContent>
      <xs:extension base="value">
        <xs:sequence>
          <xs:element name="socketSetting" type="socketSetting" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="socks5.gssapimethod.protectionLevels">
    <xs:complexContent>
      <xs:extension base="value">
        <xs:sequence>
          <xs:element name="socks5.gssapimethod.protectionLevel" type="xs:string" maxOccurs="unbounded"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="socks5.methods">
    <xs:complexContent>
      <xs:extension base="value">
        <xs:sequence>
          <xs:element name="socks5.method" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="socks5.userpassmethod.userRepository">
    <xs:complexContent>
      <xs:extension base="value">
        <xs:all>
          <xs:element name="typeName" type="xs:string"/>
          <xs:element name="initializationString" type="xs:string"/>
        </xs:all>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="values">
    <xs:complexContent>
      <xs:extension base="value">
        <xs:sequence>
          <xs:element name="value" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
</xs:schema>