<?xml version="1.0" encoding="UTF-8"?>
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.2">
  <classes>
    <class id="Oauth2Client" _delta="define">
      <parent>cmdbAbstractObject</parent>
      <properties>
        <category>bizmodel,searchable</category>
        <abstract>true</abstract>
        <key_type>autoincrement</key_type>
        <db_table>priv_oauth2_client</db_table>
        <db_key_field>id</db_key_field>
        <db_final_class_field>finalclass</db_final_class_field>
        <naming>
          <format>%1$s</format>
          <attributes>
            <attribute id="name"/>
          </attributes>
        </naming>
        <display_template/>
        <icon>assets/img/itop-logo-square-64.png</icon>
        <reconciliation>
          <attributes>
            <attribute id="name"/>
            <attribute id="provider"/>
          </attributes>
        </reconciliation>
        <uniqueness_rules>
          <rule id="no_duplicate">
            <attributes>
              <attribute id="name"/>
              <attribute id="provider"/>
            </attributes>
          </rule>
        </uniqueness_rules>
      </properties>
      <fields>
        <field id="name" xsi:type="AttributeString">
          <sql>name</sql>
          <default_value/>
          <is_null_allowed>false</is_null_allowed>
        </field>
        <field id="description" xsi:type="AttributeText">
          <sql>description</sql>
          <default_value/>
          <is_null_allowed>true</is_null_allowed>
        </field>
        <field id="provider" xsi:type="AttributeString">
          <sql>provider</sql>
          <default_value/>
          <is_null_allowed>false</is_null_allowed>
        </field>
        <field id="client_id" xsi:type="AttributeString">
          <sql>client_id</sql>
          <default_value/>
          <is_null_allowed>false</is_null_allowed>
        </field>
        <field id="client_secret" xsi:type="AttributeEncryptedPassword">
          <sql>client_secret</sql>
          <default_value/>
          <is_null_allowed>false</is_null_allowed>
        </field>
        <field id="refresh_token" xsi:type="AttributeEncryptedPassword">
          <sql>refresh_token</sql>
          <default_value/>
          <is_null_allowed>true</is_null_allowed>
          <tracking_level>none</tracking_level>
        </field>
        <field id="refresh_token_expiration" xsi:type="AttributeDateTime">
          <sql>refresh_token_expiration</sql>
          <default_value/>
          <is_null_allowed>true</is_null_allowed>
          <tracking_level>none</tracking_level>
        </field>
        <field id="access_token" xsi:type="AttributeEncryptedPassword">
          <sql>access_token</sql>
          <default_value/>
          <is_null_allowed>true</is_null_allowed>
          <tracking_level>none</tracking_level>
        </field>
        <field id="access_token_expiration" xsi:type="AttributeDateTime">
          <sql>access_token_expiration</sql>
          <default_value/>
          <is_null_allowed>true</is_null_allowed>
          <tracking_level>none</tracking_level>
        </field>
        <field id="scope" xsi:type="AttributeString">
          <sql>scope</sql>
          <default_value/>
          <is_null_allowed>true</is_null_allowed>
        </field>
        <field id="authorization_state" xsi:type="AttributeString">
          <sql>authorization_state</sql>
          <default_value/>
          <is_null_allowed>true</is_null_allowed>
          <tracking_level>none</tracking_level>
        </field>
        <field id="token_type" xsi:type="AttributeString">
          <sql>token_type</sql>
          <default_value/>
          <is_null_allowed>true</is_null_allowed>
          <tracking_level>none</tracking_level>
        </field>
      </fields>
      <event_listeners>
        <event_listener id="EVENT_DB_BEFORE_WRITE">
          <event>EVENT_DB_BEFORE_WRITE</event>
          <callback>EvtBeforeWriteOauthClient2</callback>
          <rank>0</rank>
        </event_listener>
        <event_listener id="EVENT_DB_SET_ATTRIBUTES_FLAGS">
          <event>EVENT_DB_SET_ATTRIBUTES_FLAGS</event>
          <callback>EvtSetAttributeFlagsOauthClient2</callback>
          <rank>0</rank>
        </event_listener>
        <event_listener id="EVENT_DB_SET_INITIAL_ATTRIBUTES_FLAGS">
          <event>EVENT_DB_SET_INITIAL_ATTRIBUTES_FLAGS</event>
          <callback>EvtSetInitialAttributeFlagsOauthClient2</callback>
          <rank>0</rank>
        </event_listener>
      </event_listeners>
      <methods>
        <method id="GetHybridauthProvider">
          <static>false</static>
          <access>public</access>
          <type>Overload-DBObject</type>
          <code><![CDATA[
        public function GetHybridauthProvider() : string
        {
          return Combodo\iTop\Oauth2Client\Model\Oauth2ClientService::GetHybridauthProvider($this);
        }
]]></code>
        </method>
        <method id="PrefillCreationForm">
          <static>false</static>
          <access>public</access>
          <type>Overload-DBObject</type>
          <code><![CDATA[
	public function PrefillCreationForm(&$aContextParam)
	{
		$this->Set('provider', $this->GetHybridauthProvider());

		parent::PrefillCreationForm($aContextParam);
	}
]]></code>
        </method>
        <method id="EvtBeforeWriteOauthClient2">
          <comment>/**
            * Event Listener for EVENT_DB_BEFORE_WRITE
            * An object is about to be written into the database.
            * The object can be modified.
            *
            * @param Combodo\iTop\Service\Events\EventData $oEventData Event data object
            */
          </comment>
          <static>false</static>
          <access>public</access>
          <type>EventListener</type>
          <code><![CDATA[	public function EvtBeforeWriteOauthClient2(Combodo\iTop\Service\Events\EventData $oEventData)
          {
            if ($oEventData->Get('is_new')) {
							$this->Set('provider', $this->GetHybridauthProvider());
            }
          }]]></code>
        </method>
        <method id="EvtSetAttributeFlagsOauthClient2">
          <comment>/**
            *
            * @param Combodo\iTop\Service\Events\EventData $oEventData Event data object
            */
          </comment>
          <static>false</static>
          <access>public</access>
          <type>EventListener</type>
          <code><![CDATA[
	        public function EvtSetAttributeFlagsOauthClient2(Combodo\iTop\Service\Events\EventData $oEventData)
          {
                $this->AddAttributeFlags('access_token', OPT_ATT_HIDDEN);
                $this->AddAttributeFlags('authorization_state', OPT_ATT_HIDDEN);
                $this->AddAttributeFlags('refresh_token', OPT_ATT_HIDDEN);

                $this->AddAttributeFlags('access_token_expiration', OPT_ATT_READONLY);
                $this->AddAttributeFlags('refresh_token_expiration', OPT_ATT_READONLY);
                $this->AddAttributeFlags('token_type', OPT_ATT_READONLY);
                $this->AddAttributeFlags('provider', OPT_ATT_READONLY);
          }]]></code>
        </method>
        <method id="EvtSetInitialAttributeFlagsOauthClient2">
          <comment>/**
            *
            * @param Combodo\iTop\Service\Events\EventData $oEventData Event data object
            */
          </comment>
          <static>false</static>
          <access>public</access>
          <type>EventListener</type>
          <code><![CDATA[
	        public function EvtSetInitialAttributeFlagsOauthClient2(Combodo\iTop\Service\Events\EventData $oEventData)
          {
                $this->AddInitialAttributeFlags('access_token', OPT_ATT_HIDDEN);
                $this->AddInitialAttributeFlags('authorization_state', OPT_ATT_HIDDEN);
                $this->AddInitialAttributeFlags('refresh_token', OPT_ATT_HIDDEN);

                $this->AddInitialAttributeFlags('access_token_expiration', OPT_ATT_HIDDEN);
                $this->AddInitialAttributeFlags('refresh_token_expiration', OPT_ATT_HIDDEN);
                $this->AddInitialAttributeFlags('scope', OPT_ATT_HIDDEN);
                $this->AddInitialAttributeFlags('token_type', OPT_ATT_HIDDEN);
                $this->AddInitialAttributeFlags('provider', OPT_ATT_READONLY);

          }]]></code>
        </method>
        <method id="GetAccessTokenModelToHybridauthMapping">
          <static>false</static>
          <access>public</access>
          <type>Overload-DBObject</type>
          <code><![CDATA[

        /**
        * Provide the acces_token fields mapping between hybridauth and iTop model
        * @return array
        */
        public function GetTokenModelToHybridauthMapping() : array {
          return [
            'access_token' => 'access_token',
            'token_type' => 'token_type',
            'refresh_token' => 'refresh_token',
            'expires_at' => 'access_token_expiration',
          ];
        }
        ]]></code>
        </method>
        <method id="GetModelToHybridauthMapping">
          <static>false</static>
          <access>public</access>
          <type>Overload-DBObject</type>
          <code><![CDATA[

        /**
        * Provide the mapping between hybridauth and iTop model
        * @return array
        */
        public function GetModelToHybridauthMapping() : array {
          return [];
        }
        ]]></code>
        </method>
        <method id="DisplayBareHeader">
          <static>false</static>
          <access>public</access>
          <type>Overload-DBObject</type>
          <code><![CDATA[
  public function DisplayBareHeader(WebPage $oPage, $bEditMode = false)
  {
		$aHeaderBlocks = parent::DisplayBareHeader($oPage, $bEditMode);

    if ($this instanceof Oauth2Client) {
      $aOauthConnectButtons = Combodo\iTop\Oauth2Client\Controller\Oauth2ClientController::GetButtons($this, $oPage);

      // Add the buttons in the existing toolbar
      reset($aHeaderBlocks['toolbar']);
      $sToolbarContainerKey = key($aHeaderBlocks['toolbar']);
      foreach ($aHeaderBlocks['toolbar'][$sToolbarContainerKey]->GetSubBlocks() as $sSubBlockId => $oSubBlock) {
        if (!($oSubBlock instanceof Combodo\iTop\Application\UI\Base\Component\Toolbar\Toolbar)) {
          continue;
        }
        // Look for the actions menu toolbar by checking if its ID starts with the good prefix
        if (stripos($sSubBlockId, MenuBlock::ACTIONS_TOOLBAR_ID_PREFIX) === 0) {
          foreach($aOauthConnectButtons as $oOauthConnectButton) {
            $oSubBlock->PrependSubBlock($oOauthConnectButton);
          }
          break;
        }
      }
		}

		return $aHeaderBlocks;

   }
        ]]></code>
        </method>
      </methods>
      <presentation>
        <details>
          <items>
            <item id="col:col1">
              <rank>10</rank>
              <items>
                <item id="fieldset:OAuth2Client:baseinfo">
                  <rank>10</rank>
                  <items>
                    <item id="name">
                      <rank>10</rank>
                    </item>
                    <item id="description">
                      <rank>20</rank>
                    </item>
                    <item id="provider">
                      <rank>30</rank>
                    </item>
                  </items>
                </item>
              </items>
            </item>
            <item id="col:col2">
              <rank>10</rank>
              <items>
                <item id="fieldset:OAuth2Client:idp_info">
                  <rank>10</rank>
                  <items>
                    <item id="client_id">
                      <rank>40</rank>
                    </item>
                    <item id="client_secret">
                      <rank>50</rank>
                    </item>
                    <item id="scope">
                      <rank>60</rank>
                    </item>
                    <item id="access_token">
                      <rank>70</rank>
                    </item>
                    <item id="access_token_expiration">
                      <rank>80</rank>
                    </item>
                    <item id="refresh_token">
                      <rank>90</rank>
                    </item>
                    <item id="refresh_token_expiration">
                      <rank>100</rank>
                    </item>
                    <item id="token_type">
                      <rank>110</rank>
                    </item>
                    <item id="authorization_state">
                      <rank>120</rank>
                    </item>
                  </items>
                </item>
              </items>
            </item>
          </items>
        </details>
        <search>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="provider">
              <rank>20</rank>
            </item>
          </items>
        </search>
        <list>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="provider">
              <rank>20</rank>
            </item>
          </items>
        </list>
      </presentation>
    </class>
    <class id="GitHubOauth2Client" _delta="define">
      <parent>Oauth2Client</parent>
      <properties>
        <category>bizmodel,searchable</category>
        <abstract>false</abstract>
        <key_type>autoincrement</key_type>
        <db_table>priv_oauth2_client_github</db_table>
        <db_key_field>id</db_key_field>
        <db_final_class_field>finalclass</db_final_class_field>
        <naming>
          <format>%1$s</format>
          <attributes>
            <attribute id="name"/>
          </attributes>
        </naming>
        <display_template/>
        <icon>assets/img/itop-logo-square-64.png</icon>
        <reconciliation>
          <attributes>
            <attribute id="name"/>
            <attribute id="provider"/>
          </attributes>
        </reconciliation>
      </properties>
      <fields/>
      <methods/>
      <presentation/>
    </class>
    <class id="MicrosoftGraphOauth2Client" _delta="define">
      <parent>Oauth2Client</parent>
      <properties>
        <category>bizmodel,searchable</category>
        <abstract>false</abstract>
        <key_type>autoincrement</key_type>
        <db_table>priv_oauth2_client_microsoftgraph</db_table>
        <db_key_field>id</db_key_field>
        <db_final_class_field>finalclass</db_final_class_field>
        <naming>
          <format>%1$s</format>
          <attributes>
            <attribute id="name"/>
          </attributes>
        </naming>
        <display_template/>
        <icon>assets/img/itop-logo-square-64.png</icon>
        <reconciliation>
          <attributes>
            <attribute id="name"/>
            <attribute id="tenant"/>
            <attribute id="provider"/>
          </attributes>
        </reconciliation>
      </properties>
      <fields>
        <field id="tenant" xsi:type="AttributeString">
          <sql>tenant</sql>
          <default_value/>
          <is_null_allowed>true</is_null_allowed>
        </field>
      </fields>
      <event_listeners>
        <event_listener id="EVENT_DB_BEFORE_WRITE">
          <event>EVENT_DB_BEFORE_WRITE</event>
          <callback>EvtBeforeWriteMSGraph</callback>
          <rank>1</rank>
        </event_listener>
      </event_listeners>
      <methods>
        <method id="EvtBeforeWriteMSGraph">
          <comment>/**
            * Event Listener for EVENT_DB_BEFORE_WRITE
            * An object is about to be written into the database.
            * The object can be modified.
            *
            * @param Combodo\iTop\Service\Events\EventData $oEventData Event data object
            */
          </comment>
          <static>false</static>
          <access>public</access>
          <type>EventListener</type>
          <code><![CDATA[	public function EvtBeforeWriteMSGraph(Combodo\iTop\Service\Events\EventData $oEventData)
          {
            $sScope = $this->Get('scope');

            if (\utils::IsNullOrEmptyString($sScope)){
              //default value from hybridauth lib will be enforced (it contains offline_access already).
              return;
            }

            if (strpos($sScope, 'offline_access') ===false){
              $this->Set('scope', $sScope . ' offline_access');
            }
          }]]></code>
        </method>
        <method id="GetModelToHybridauthMapping">
          <static>false</static>
          <access>public</access>
          <type>Overload-DBObject</type>
          <code><![CDATA[

        /**
        * Provide the mapping between hybridauth and iTop model
        * @return array
        */
        public function GetModelToHybridauthMapping() : array {
          return ['tenant' => 'tenant' ];
        }
        ]]></code>
        </method>
      </methods>
      <presentation>
        <details>
          <items>
            <item id="col:col1">
              <rank>10</rank>
              <items>
                <item id="fieldset:OAuth2Client:baseinfo">
                  <rank>10</rank>
                  <items>
                    <item id="name">
                      <rank>10</rank>
                    </item>
                    <item id="description">
                      <rank>20</rank>
                    </item>
                    <item id="provider">
                      <rank>30</rank>
                    </item>
                  </items>
                </item>
              </items>
            </item>
            <item id="col:col2">
              <rank>10</rank>
              <items>
                <item id="fieldset:OAuth2Client:idp_info">
                  <rank>10</rank>
                  <items>
                    <item id="tenant">
                      <rank>10</rank>
                    </item>
                    <item id="client_id">
                      <rank>20</rank>
                    </item>
                    <item id="client_secret">
                      <rank>30</rank>
                    </item>
                    <item id="scope">
                      <rank>40</rank>
                    </item>
                    <item id="access_token">
                      <rank>50</rank>
                    </item>
                    <item id="access_token_expiration">
                      <rank>60</rank>
                    </item>
                    <item id="refresh_token">
                      <rank>70</rank>
                    </item>
                    <item id="refresh_token_expiration">
                      <rank>80</rank>
                    </item>
                    <item id="token_type">
                      <rank>90</rank>
                    </item>
                    <item id="authorization_state">
                      <rank>100</rank>
                    </item>
                  </items>
                </item>
              </items>
            </item>
          </items>
        </details>
        <search>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="tenant">
              <rank>15</rank>
            </item>
            <item id="provider">
              <rank>20</rank>
            </item>
          </items>
        </search>
        <list>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="tenant">
              <rank>15</rank>
            </item>
            <item id="provider">
              <rank>20</rank>
            </item>
          </items>
        </list>
      </presentation>
    </class>
    <class id="GoogleOauth2Client" _delta="define">
      <parent>Oauth2Client</parent>
      <properties>
        <category>bizmodel,searchable</category>
        <abstract>false</abstract>
        <key_type>autoincrement</key_type>
        <db_table>priv_oauth2_client_google</db_table>
        <db_key_field>id</db_key_field>
        <db_final_class_field>finalclass</db_final_class_field>
        <naming>
          <format>%1$s</format>
          <attributes>
            <attribute id="name"/>
          </attributes>
        </naming>
        <display_template/>
        <icon>assets/img/itop-logo-square-64.png</icon>
        <reconciliation>
          <attributes>
            <attribute id="name"/>
            <attribute id="provider"/>
          </attributes>
        </reconciliation>
      </properties>
      <fields/>
      <methods/>
      <presentation/>
    </class>
    <class id="HeadlessOauth2Client" _delta="define">
      <parent>Oauth2Client</parent>
      <properties>
        <category>bizmodel,searchable</category>
        <abstract>false</abstract>
        <key_type>autoincrement</key_type>
        <db_table>priv_oauth2_client_headless_itop</db_table>
        <db_key_field>id</db_key_field>
        <db_final_class_field>finalclass</db_final_class_field>
        <naming>
          <format>%1$s</format>
          <attributes>
            <attribute id="name"/>
          </attributes>
        </naming>
        <display_template/>
        <icon>assets/img/itop-logo-square-64.png</icon>
        <reconciliation>
          <attributes>
            <attribute id="name"/>
            <attribute id="provider"/>
          </attributes>
        </reconciliation>
      </properties>
      <fields>
        <field id="username" xsi:type="AttributeString">
          <sql>username</sql>
          <default_value/>
          <is_null_allowed>false</is_null_allowed>
        </field>
        <field id="password" xsi:type="AttributeEncryptedPassword">
          <sql>password</sql>
          <default_value/>
          <is_null_allowed>false</is_null_allowed>
        </field>
        <field id="base_url" xsi:type="AttributeString">
          <sql>base_url</sql>
          <default_value/>
          <is_null_allowed>false</is_null_allowed>
        </field>
        <field id="version" xsi:type="AttributeString">
          <sql>version</sql>
          <default_value>1.3</default_value>
          <is_null_allowed>true</is_null_allowed>
        </field>
      </fields>
      <methods>
        <method id="GetModelToHybridauthMapping">
          <static>false</static>
          <access>public</access>
          <type>Overload-DBObject</type>
          <code><![CDATA[

        /**
        * Provide the mapping between hybridauth and iTop model
        * @return array
        */
        public function GetModelToHybridauthMapping() : array {
          return [
            'username' => 'username',
            'password' => 'password',
            'version' => 'version',
            'url' => 'base_url',
          ];
        }
        ]]></code>
        </method>
      </methods>
      <presentation>
        <details>
          <items>
            <item id="col:col1">
              <rank>10</rank>
              <items>
                <item id="fieldset:OAuth2Client:baseinfo">
                  <rank>10</rank>
                  <items>
                    <item id="name">
                      <rank>10</rank>
                    </item>
                    <item id="description">
                      <rank>20</rank>
                    </item>
                    <item id="provider">
                      <rank>30</rank>
                    </item>
                  </items>
                </item>
              </items>
            </item>
            <item id="col:col2">
              <rank>10</rank>
              <items>
                <item id="fieldset:OAuth2Client:idp_info">
                  <rank>10</rank>
                  <items>
                  <item id="base_url">
                    <rank>10</rank>
                  </item>
                  <item id="username">
                    <rank>20</rank>
                  </item>
                  <item id="password">
                    <rank>30</rank>
                  </item>
                  <item id="client_id">
                    <rank>40</rank>
                  </item>
                  <item id="client_secret">
                    <rank>50</rank>
                  </item>
                  <item id="scope">
                    <rank>60</rank>
                  </item>
                  <item id="access_token">
                    <rank>70</rank>
                  </item>
                  <item id="access_token_expiration">
                    <rank>80</rank>
                  </item>
                  <item id="refresh_token">
                    <rank>90</rank>
                  </item>
                  <item id="refresh_token_expiration">
                    <rank>100</rank>
                  </item>
                  <item id="token_type">
                    <rank>110</rank>
                  </item>
                  <item id="authorization_state">
                    <rank>120</rank>
                  </item>
                  </items>
                </item>
              </items>
            </item>
          </items>
        </details>
        <search>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="provider">
              <rank>20</rank>
            </item>
          </items>
        </search>
        <list>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="provider">
              <rank>20</rank>
            </item>
          </items>
        </list>
      </presentation>
    </class>
    <class id="KeycloakOauth2Client" _delta="define">
      <parent>Oauth2Client</parent>
      <properties>
        <category>bizmodel,searchable</category>
        <abstract>false</abstract>
        <key_type>autoincrement</key_type>
        <db_table>priv_oauth2_client_keycloak</db_table>
        <db_key_field>id</db_key_field>
        <db_final_class_field>finalclass</db_final_class_field>
        <naming>
          <format>%1$s</format>
          <attributes>
            <attribute id="name"/>
          </attributes>
        </naming>
        <display_template/>
        <icon>assets/img/itop-logo-square-64.png</icon>
        <reconciliation>
          <attributes>
            <attribute id="name"/>
            <attribute id="url"/>
            <attribute id="realm"/>
            <attribute id="provider"/>
          </attributes>
        </reconciliation>
      </properties>
      <fields>
        <field id="url" xsi:type="AttributeString">
          <sql>url</sql>
          <default_value/>
          <is_null_allowed>false</is_null_allowed>
        </field>
        <field id="realm" xsi:type="AttributeString">
          <sql>realm</sql>
          <default_value/>
          <is_null_allowed>true</is_null_allowed>
        </field>
      </fields>
      <event_listeners/>
      <methods>
        <method id="GetModelToHybridauthMapping">
          <static>false</static>
          <access>public</access>
          <type>Overload-DBObject</type>
          <code><![CDATA[

        /**
        * Provide the mapping between hybridauth and iTop model
        * @return array
        */
        public function GetModelToHybridauthMapping() : array {
          return ['realm' => 'realm', 'url' => 'url' ];
        }
        ]]></code>
        </method>
      </methods>
      <presentation>
        <details>
          <items>
            <item id="col:col1">
              <rank>10</rank>
              <items>
                <item id="fieldset:OAuth2Client:baseinfo">
                  <rank>10</rank>
                  <items>
                    <item id="name">
                      <rank>10</rank>
                    </item>
                    <item id="description">
                      <rank>20</rank>
                    </item>
                    <item id="provider">
                      <rank>30</rank>
                    </item>
                  </items>
                </item>
              </items>
            </item>
            <item id="col:col2">
              <rank>10</rank>
              <items>
                <item id="fieldset:OAuth2Client:idp_info">
                  <rank>10</rank>
                  <items>
                    <item id="url">
                      <rank>10</rank>
                    </item>
                    <item id="realm">
                      <rank>20</rank>
                    </item>
                    <item id="client_id">
                      <rank>30</rank>
                    </item>
                    <item id="client_secret">
                      <rank>40</rank>
                    </item>
                    <item id="scope">
                      <rank>50</rank>
                    </item>
                    <item id="access_token">
                      <rank>60</rank>
                    </item>
                    <item id="access_token_expiration">
                      <rank>70</rank>
                    </item>
                    <item id="refresh_token">
                      <rank>80</rank>
                    </item>
                    <item id="refresh_token_expiration">
                      <rank>90</rank>
                    </item>
                    <item id="token_type">
                      <rank>100</rank>
                    </item>
                    <item id="authorization_state">
                      <rank>110</rank>
                    </item>
                  </items>
                </item>
              </items>
            </item>
          </items>
        </details>
        <search>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="url">
              <rank>12</rank>
            </item>
            <item id="realm">
              <rank>15</rank>
            </item>
            <item id="provider">
              <rank>20</rank>
            </item>
          </items>
        </search>
        <list>
          <items>
            <item id="name">
              <rank>10</rank>
            </item>
            <item id="url">
              <rank>12</rank>
            </item>
            <item id="realm">
              <rank>15</rank>
            </item>
            <item id="provider">
              <rank>20</rank>
            </item>
          </items>
        </list>
      </presentation>
    </class>
  </classes>
  <menus>
    <menu id="Oauth2Client" xsi:type="OQLMenuNode" _delta="define">
      <rank>100</rank>
      <parent>Integrations</parent>
      <oql><![CDATA[SELECT Oauth2Client]]></oql>
      <do_search>1</do_search>
      <enable_admin_only>0</enable_admin_only>
      <enable_class>Oauth2Client</enable_class>
      <enable_action>UR_ACTION_MODIFY</enable_action>
    </menu>
  </menus>
</itop_design>
